Blade in Neovim

Blade ist Laravels hauseigene Template-Sprache. Sie wird von Neovim nicht ohne Weiteres unterstützt. Besonders frustrierend: Wenn man die entsprechenden Dateien öffnet, bleibt Syntax-Highlighting ausgeschaltet. Nicht nur für Blade selbst - auch für PHP und HTML.

Die Arbeit ohne farbliche Hervorhebungen ist heutzeutage unzumutbar, deshalb wollen wir zunächst das Syntax-Highlighting zum Laufen bringen. Im Anschluss daran wird (gewissermaßen als Bonus) gezeigt, wie sich Blade-Code mithilfe von conform.nvim formatieren lässt.

Ich folge hier zwei Anleitungen, die sich im Grunde leicht finden lassen, aber bei denen man vielleicht leicht etwas übersieht. Für die Tree-sitter-Grammatik ein GitHub-Issue und für die Autoformatierung @jogarcias Anleitung.

Tree-sitter für Blade

Viele Features von Neovim stützen sich auf Parsing durch Tree-sitter. Blade ist leider nicht Teil der Sprachen, die sich einfach durch TSInstall X installieren lassen. @EmranMR hat jedoch eine Grammatik geschrieben, die wir Tree-sitter manuell hinzufügen können. Dazu müssen wir mehrere Dinge tun.

  1. Zunächst müssen wir der Tree-sitter-Konfiguration die Grammatik hinzufügen. Vermutlich haben die meisten Nutzer bereits eine require'nvim-treesitter.configs'.setup{...}-Konfiguration; neue Grammatiken werden mit require "nvim-treesitter.parsers".get_parser_configs() hinzugefügt.
require'nvim-treesitter.configs'.setup{...}

local parser_config = require "nvim-treesitter.parsers".get_parser_configs()
parser_config.blade = {
  install_info = {
    url = "https://github.com/EmranMR/tree-sitter-blade",
    files = {"src/parser.c"},
    branch = "main",
  },
  filetype = "blade"
}

-- Set the *.blade.php file to be filetype of blade
vim.filetype.add({
    pattern = {
        [".*%.blade%.php"] = "blade",
    },
})

Nun muss die Grammatik noch installiert werden:

TSInstall blade
  1. Um Syntax-Highlighting zu ermöglichen, muss ~/.config/nvim/after/queries/blade/highlights.scm mit folgendem Inhalt erstellt werden:
(directive) @function
(directive_start) @function
(directive_end) @function
(comment) @comment
((parameter) @include (#set! "priority" 110)) 
((php_only) @include (#set! "priority" 110)) 
((bracket_start) @function (#set! "priority" 120)) 
((bracket_end) @function (#set! "priority" 120)) 
(keyword) @function
  1. Durch Tree-sitters Language Injection-Feature wird festgelegt, dass auch der PHP-Code in den gleichen Dateien berücksichtigt wird. Ansonsten würden nur Blades eigenen Symbole und Directives eingefärbt. Dazu wird ~/.config/nvim/after/queries/blade/injections.scm mit folgendem Inhalt erstellt:1
((text) @injection.content
    (#not-has-ancestor? @injection.content "envoy")
    (#set! injection.combined)
    (#set! injection.language php))

Code-Formatting

Blade-formatter dient der automatischen Formatierung. Um es (global) zu installieren, kann NPM genutzt werden:

sudo npm install -g blade-formatter

Um das Tool für die Formatierung anzuwenden, wird es der Conform-Konfiguration hinzugefügt:

require("conform").setup({
  formatters_by_ft = {
    blade = { "blade-formatter" }, -- run `sudo npm install -g blade-formatter`
  },
})
  1. In der entsprechenden Datei auf GitHub finden sich weitere Injections. Diese könnten in einigen Fällen notwendig sein.