Wenn Sie schon immer Neovim für die PHP- und Laravel-Entwicklung verwenden wollten, sollte Ihnen diese Anleitung den Einstieg erleichtern. Wenn Sie VSCode verwenden, dann schauen Sie sich diesen Post an.
In diesem Post werde ich Neovim mit LazyVim verwenden. LazyVim ist ein fantastisches Neovim-Setup mit vielen Funktionen und Werkzeugen, die sofort einsatzbereit sind. Ich habe mehr Zeit damit verbracht, Vim und Neovim zu konfigurieren, als ich zugeben möchte. LazyVim spart fast diese ganze Zeit. Wenn Sie anfangen, sich mit der Konfiguration von LazyVim vertraut zu machen, können Sie in Betracht ziehen, Ihre eigene Konfiguration von Grund auf zu erstellen.
Installation
Dieser Beitrag geht davon aus, dass Sie die neueste Version von Neovim verwenden (v0.10.0 zum Zeitpunkt der Veröffentlichung). Wenn du es installieren musst, kannst du es für dein Betriebssystem hier herunterladen.
Wenn du Neovim installiert hast, werden wir LazyVim verwenden. Sie können gerne Ihre Konfiguration verwenden, wenn Sie LazyVim nicht verwenden möchten, aber das Setup ist für diesen Beitrag viel komplexer.
Um LazyVim zu installieren, müssen Sie das Repo klonen und es in Ihren Neovim-Konfigurationsordner verschieben (~/.config/nvim
auf MacOS/Linux).
git clone https://github.com/LazyVim/starter ~/.config/nvim
Nach dem Klonen können Sie den .git
-Ordner entfernen, da Sie ihn jetzt nicht mehr benötigen und vielleicht Ihre Konfigurationsänderungen versionieren möchten.
rm -rf ~/.config/nvim/.git
Wenn Sie Windows benutzen, können Sie den Installationsanweisungen hier folgen.
Nachdem das erledigt ist, können Sie Neovim starten, und es wird alle Plugins und Abhängigkeiten für LazyVim auflisten
Out of the box, LazyVim bietet ein nettes Menü, um nach Bedarf zu navigieren.
LazyVim PHP Extras
LazyVim hat kürzlich ein Update hinzugefügt, um schnell PHP-Unterstützung hinzuzufügen. Sie müssen nur auf x
auf dem Startbildschirm klicken, um zum Extras-Menü zu gelangen, oder :LazyExtras
eingeben.
Vom Menü aus können Sie nach PHP suchen, indem Sie zuerst einen Schrägstrich und dann php
eingeben, also /php
. Mit /
beginnt die Suche in Neovim.
Wenn Sie den Cursor auf der Zeile lang.php
haben, drücken Sie x
, um das Extra zu aktivieren. Starten Sie dann Neovim neu. Jetzt unterstützt Neovim die PHP-Syntax und installiert den Phpactor LSP.
Um den LSP zu testen, habe ich ein neues Laravel-Projekt mit Laravel Breeze erstellt. Im Projektverzeichnis öffne ich Neovim und öffne den ProfileController
mit <leader>ff
. In Neovim wird vielen Tastaturbefehlen die Taste <leader>
vorangestellt, die standardmäßig auf Leertaste
eingestellt ist. Um eine Datei zu finden, geben Sie also Leertaste + f + f
ein. Dann können Sie einfach mit dem Fuzzy-Finder suchen.
Wenn Sie den Controller zum ersten Mal laden, beginnt Phpactor mit der Indizierung Ihrer Codebasis, typischerweise vom Git-Root des Projekts.
Sie werden auch viele Fehler und andere Diagnosen sehen. Diese werden von der LSP zusammen mit Code-Vervollständigung, Gehe zur Definition, Refactoring und vielen anderen Funktionen bereitgestellt.
Wenn Sie den Basis-Controller ändern möchten, können Sie zu Controller
navigieren und auf gd
für Gehe zur Definition klicken.
Nach Gehe zur Definition können Sie zurück zur Klassendefinition gehen und auf gr
für Gehe zu Referenzen für die Klasse Controller
klicken. Anschließend können Sie mit ctrl+o
zu den vorherigen Stellen zurückspringen.
Bitte zögern Sie nicht, Phpactor weiter zu verwenden, wenn es für Sie funktioniert. Es kämpft mit einigen der magischen und fehlenden Typen in Laravel, aber es ist komplett kostenlos und Open Source. Sie können dies verbessern, indem Sie etwas wie Laravel IDE Helper verwenden, das Stubs für Models, Facades und andere Framework-Features generiert, um eine bessere Autovervollständigung zu erreichen.
Persönlich habe ich bessere Erfahrungen mit der Intelephense LSP gemacht, die Ihnen wahrscheinlich vertraut ist, wenn Sie von VSCode kommen. Leider fehlen Ihnen ohne die Premium-Version von Intelephense einige Funktionen von Phpactor, so dass ich den Kauf empfehle, wenn Sie Intelephense verwenden. Eine einzige Lizenz funktioniert mit VSCode, Neovim und allen anderen Editoren, die LSPs unterstützen.
Um Intelephense einzurichten, müssen Sie die LazyVim-Konfiguration ändern. Öffnen Sie im Ordner ~/.config/nvim
die Datei options.lua
und fügen Sie die folgende Zeile ein:
vim.g.lazyvim_php_lsp = "intelephense"
Dies weist LazyVim an, Intelephense einzurichten. Möglicherweise müssen Sie jedoch Phpactor entfernen. Um das zu erreichen, können Sie <leader>cm
eingeben, was Mason öffnet. Mason ist ein Werkzeug zum Installieren verschiedener Formatierer, Linters und LSPs. Suchen Sie im Mason-Menü nach Phpactor und deinstallieren Sie es mit X
.
Laravel Pint Formatierung einrichten
Seit wir die Lazy Extras für PHP installiert haben, sind auch Laravel Pint und PHP-CS-Fixer installiert. Allerdings ist PHP-CS-Fixer als Standard eingestellt. Um dies zu ändern, können wir eine neue Datei in der Neovim-Konfiguration erstellen: ~/.config/nvim/lua/plugins/php.lua
. Sie können diese Datei benennen, wie Sie wollen, aber für diesen Beitrag werden wir sie für alle unsere PHP/Laravel-bezogenen Konfigurationen verwenden.
In die Datei können Sie Folgendes einfügen:
return {
{
"stevearc/conform.nvim",
optional = true,
opts = {
formatters_by_ft = {
php = { { "pint", "php_cs_fixer" } },
},
},
},
}
Dadurch wird Pint zum Standardformatierer, und es wird auf PHP-CS-Fixer zurückgreifen, wenn es nicht gefunden wird. Mit dieser Änderung kann ich zum ProfileController
zurückgehen und einen unbenutzten Import hinzufügen und die Einrückung durcheinander bringen, und das Speichern wird eine Formatierung auslösen.
Eine weitere optionale Änderung, die Sie vornehmen können, ist phpcs zu entfernen, wenn Sie es nicht benutzen. In der php.lua
Datei, fügen Sie einfach einen weiteren Block wie den folgenden hinzu:
return {
{
-- Setzen Sie Laravel Pint als Standard-PHP-Formatierer mit PHP CS Fixer als Fallback.
"stevearc/conform.nvim",
optional = true,
opts = {
formatters_by_ft = {
php = { { "pint", "php_cs_fixer" } },
},
},
},
{
-- Entfernen Sie phpcs linter.
"mfussenegger/nvim-lint",
optional = true,
opts = {
linters_by_ft = {
php = {},
},
},
},
}
Ich habe diese Konfigurationen direkt aus den LazyVim docs übernommen.
Testen
Als nächstes werden wir Neatest einrichten, damit wir Tests direkt in Neovim ausführen können. Dies ist ein weiteres LazyVim-Extra, das durch Eingabe von :LazyExtras
und anschließender Suche nach „test.core“ und Umschalten mit X
hinzugefügt werden kann.
Dann müssen wir das Neotest Pest Plugin installieren. Fügen Sie den folgenden Block zur php.lua
-Konfiguration hinzu.
return {
{
...
},
{
-- Fügen Sie das Plugin neotest-pest für die Ausführung von PHP-Tests hinzu.
-- Ein Paket ist auch für PHPUnit verfügbar, falls erforderlich.
"nvim-neotest/neotest",
dependencies = { "V13Axel/neotest-pest" },
opts = { adapters = { "neotest-pest" } },
}
}
Wenn die Testkonfiguration vorhanden ist, laden Sie eine Testdatei, und Sie können einzelne Tests mit <leader>tr
oder die gesamte Datei mit <leader>tt
ausführen.
Mit <leader>to
lässt sich eine Zusammenfassung der Testergebnisse einblenden.
Blade-Syntax
Das Hinzufügen von Unterstützung für Laravel Blade ist etwas aufwendiger. LazyVim hat Treesitter so eingestellt, dass es Syntax-Highlighting für die meisten Sprachen unterstützt. Allerdings ist Blade nicht standardmäßig installiert, so dass wir es hinzufügen müssen.
return {
{
...
},
{
-- Fügen Sie einen Treesitter-Parser für Laravel Blade hinzu, um Blade-Syntax-Highlighting bereitzustellen.
"nvim-treesitter/nvim-treesitter",
opts = function(_, opts)
vim.list_extend(opts.ensure_installed, {
"blade",
"php_only",
})
end,
config = function(_, opts)
vim.filetype.add({
pattern = {
[".*%.blade%.php"] = "blade",
},
})
require("nvim-treesitter.configs").setup(opts)
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",
}
end,
},
}
Wir erweitern die Standardkonfiguration von Treesitter, um einen neuen Dateityp zu setzen und den Blade-Parser herunterzuladen.
Nach dem Neustart von Neovim können Sie :TSInstall blade
ausführen, um den Parser herunterzuladen.
Als nächstes müssen wir einige Treesitter-Abfragen für eine bessere Code-Unterstützung hinzufügen. Um dies zu erreichen, müssen wir einige neue Dateien innerhalb von Neovim erstellen.
Blade Injections
Type :TSEditQuery injections blade
und fügen Sie die folgenden Inhalte hinzu:
((text) @injection.content
(#not-has-ancestor? @injection.content "envoy")
(#set! injection.combined)
(#set! injection.language php))
; tree-sitter-comment injection
; if available
((comment) @injection.content
(#set! injection.language "comment"))
; could be bash or zsh
; or whatever tree-sitter grammar you have.
((text) @injection.content
(#has-ancestor? @injection.content "envoy")
(#set! injection.combined)
(#set! injection.language bash))
((php_only) @injection.content
(#set! injection.language php_only))
((parameter) @injection.content
(#set! injection.include-children) ; You may need this, depending on your editor e.g Helix
(#set! injection.language "php-only"))
Blade Highlights
Tippen Sie :TSEditQuery highlights blade
und fügen Sie hinzu:
(directive) @tag
(directive_start) @tag
(directive_end) @tag
(comment) @comment
Blade Folds
Tippen Sie :TSEditQuery folds blade
und fügen Sie hinzu:
((directive_start) @start
(directive_end) @end.after
(#set! role block))
((bracket_start) @start
(bracket_end) @end
(#set! role block))
HTML Injections
Zuletzt fügen wir noch einige Injection Queries für die Alpine-Unterstützung hinzu. Geben Sie :TSEditQuery
ein und fügen Sie hinzu:
;; extends
; AlpineJS attributes
(attribute
(attribute_name) @_attr
(#lua-match? @_attr "^x%-%l")
(quoted_attribute_value
(attribute_value) @injection.content)
(#set! injection.language "javascript"))
; Blade escaped JS attributes
; <x-foo ::bar="baz" />
(element
(_
(tag_name) @_tag
(#lua-match? @_tag "^x%-%l")
(attribute
(attribute_name) @_attr
(#lua-match? @_attr "^::%l")
(quoted_attribute_value
(attribute_value) @injection.content)
(#set! injection.language "javascript"))))
; Blade PHP attributes
; <x-foo :bar="$baz" />
(element
(_
(tag_name) @_tag
(#lua-match? @_tag "^x%-%l")
(attribute
(attribute_name) @_attr
(#lua-match? @_attr "^:%l")
(quoted_attribute_value
(attribute_value) @injection.content)
(#set! injection.language "php_only"))))
Nun, nachdem Sie alles hinzugefügt, gespeichert und neu gestartet haben, sollten Sie nun Syntaxhervorhebung für Blade-Dateien haben!
Für weitere Informationen und Installationsanweisungen, besuchen Sie die repo für den Blade Treesitter Parser.
Snippets
LazyVim kommt mit einem Plugin, um einfach Snippets zu erstellen. Um PHP-Snippets zu erstellen, kann man eine neue Datei erstellen: ~/.config/nvim/snippets/php.json
ähnlich dem folgenden Beispiel:
{
"strict types": {
"prefix": "strict",
"description": "Add strict types declaration",
"body": [
"declare(strict_types=1);"
]
},
"inv": {
"prefix": "inv",
"description": "Create PHP __invoke method",
"body": [
"public function __invoke(${1}): ${2:void}",
"{",
" ${3}",
"}",
""
]
},
"public method": {
"prefix": "pubf",
"description": "Create a public method",
"body": [
"public function ${1}(${2}): ${3:void}",
"{",
" ${0}",
"}",
""
]
},
"protected method": {
"prefix": "prof",
"description": "Create a protected method",
"body": [
"protected function ${1}(${2}): ${3:void}",
"{",
" ${0}",
"}",
""
]
},
"private method": {
"prefix": "prif",
"description": "Create a private method",
"body": [
"private function ${1}(${2}): ${3:void}",
"{",
" ${0}",
"}",
""
]
},
"public static method": {
"prefix": "pubsf",
"description": "Create a public static method",
"body": [
"public static function ${1}(${2}): ${3:void}",
"{",
" ${0}",
"}",
""
]
},
"pest test (it) method": {
"prefix": "it",
"description": "Create a pest test",
"body": [
"it('${1}', function () {",
" // Arrange",
" ${0}",
"",
" // Act",
"",
" // Assert",
"",
"});"
]
}
}
Sie können dieser Datei beliebige andere Snippets hinzufügen oder Dateien für andere Sprachen erstellen, um Snippets hinzuzufügen.
Zusätzliche Plugins
Laravel.nvim
Dieses Plugin kann verwendet werden, um schnell Artisan-Befehle mit einer großartigen Suchfunktion mit <leader>la
auszuführen. Oder Sie können alle Routen in Ihrer Anwendung mit <leader>lr
auflisten.
return {
{
...
},
{
-- Fügen Sie das Laravel.nvim-Plugin hinzu, das die Möglichkeit bietet, Artisan-Befehle
-- aus Neovim auszuführen.
"adalessa/laravel.nvim",
dependencies = {
"nvim-telescope/telescope.nvim",
"tpope/vim-dotenv",
"MunifTanjim/nui.nvim",
"nvimtools/none-ls.nvim",
},
cmd = { "Sail", "Artisan", "Composer", "Npm", "Yarn", "Laravel" },
keys = {
{ "la", ":Laravel artisan" },
{ "lr", ":Laravel routes" },
{ "lm", ":Laravel related" },
},
event = { "VeryLazy" },
config = true,
opts = {
lsp_server = "intelephense",
features = { null_ls = { enable = false } },
},
},
}
Blade-Nav.nvim
Fügt die Fähigkeit hinzu, Goto File auf Blade-Ansichten zu benutzen, um zu Komponenten und anderen Ansichten zu springen, indem man gf
benutzt.
return {
{
...
},
{
-- Fügt das blade-nav.nvim-Plugin hinzu, das Goto File-Fähigkeiten
-- für Blade-Dateien bietet.
"ricardoramirezr/blade-nav.nvim",
dependencies = {
"hrsh7th/nvim-cmp",
},
ft = { "blade", "php" },
},
}
Zusätzliche Tipps
Ein großer Vorteil von LazyVim ist die Dokumentation. Wenn es etwas gibt, das Sie in VSCode zu tun gewohnt sind und das Sie in Neovim haben wollen, besteht die Möglichkeit, dass LazyVim das bereits eingebaut hat. Ich empfehle, einfach jeden Abschnitt in LazyVim durchzugehen, um mehr darüber zu lernen.
Wahrscheinlich ist einer der wichtigsten Abschnitte die Tastaturbelegung. LazyVim benutzt which-key.nvim, um Ihnen zu helfen, sich an die konfigurierten Tastenkombinationen zu erinnern, während Sie im Editor sind, aber für eine komplette Liste klicken Sie hier.
Wollen Sie Git Unterstützung? LazyVim hat das mit LazyGit abgedeckt, was eine wirklich schöne Terminal-UI für Git ist. Benutze <leader>gg
um es zu öffnen. Du kannst sogar LazyGit direkt installieren, indem du etwas wie Homebrew benutzt, um es direkt auf der Kommandozeile mit lazygit
zu starten.
Brauchst du zusätzliche Werkzeuge wie PHPStan oder Psalm? Verwenden Sie <leader>cm
oder :Mason
, um das Mason-Menü aufzurufen und nach dem zu suchen, was Sie brauchen. Es gibt viele gängige Linters und Formatierer, die Sie installieren können.
Weitere Ressourcen
LazyVim Docs
Wie ich bereits oben erwähnt habe, bietet LazyVim eine erstaunliche Dokumentation, die es auf jeden Fall wert ist, gelesen zu werden.
Neovim als PHP- und JavaScript-IDE
Jess Archer hat einen fantastischen Kurs zur Einrichtung von Neovim auf Laracasts. Wenn Sie Laracasts noch nicht abonniert haben, kann ich es nicht genug empfehlen. Ich bin seit 2017 ein Nutzer auf Lebenszeit. Wenn Sie daran interessiert sind, nutzen Sie bitte meinen Empfehlungslink.
Omakub
DHH (der Schöpfer von Ruby on Rails) hat das Omakub-Paket als schnelle Möglichkeit zum Einrichten einer Entwicklungsumgebung auf Ubuntu Linux erstellt. Auch wenn Sie kein Ubuntu verwenden, lohnt es sich, das Omakub-Paket zu besuchen, da es viele nette Konfigurationen und Werkzeuge enthält, darunter Neovim mit LazyVim.
Kickstart.nvim
Wenn Sie etwas Minimalistischeres als LazyVim wollen, dann ist Kickstart.nvim ein guter Anfang. Sie können sich dieses Video von TJ DeVries ansehen, wie man anfängt. Auch wenn Sie LazyVim weiter benutzen wollen, ist dies eine gute Quelle, um mehr über die Konfiguration von Neovim zu erfahren.
Zusammenfassung
Ich hoffe, dies hilft Ihnen, Ihre Reise mit Neovim zu beginnen. Es ist ein leistungsstarker Editor, der unendlich konfigurierbar ist. Obwohl er nicht so mächtig ist wie PhpStorm, kommt er dem ziemlich nahe und benötigt weniger CPU-Ressourcen.
Selbst wenn Sie nicht vorhaben, Neovim als primären Editor zu verwenden, denke ich, dass es trotzdem von Vorteil sein kann, die Tastaturbelegungen zu lernen. Normalerweise teile ich meine Zeit zwischen Neovim und PhpStorm auf und versuche, meine Tastenkombinationen so ähnlich wie möglich zu halten. Glücklicherweise macht das IdeaVim-Plugin für JetBrains-IDEs dies einfach.
Für Ihre Referenz habe ich eine Repo mit allen Dateien, die wir in diesem Beitrag erstellt haben, erstellt.
Bitte lassen Sie mich wissen, wenn Sie weitere Fragen zur Einrichtung haben oder zusätzliche Funktionen, die ich vielleicht übersehen habe.
Danke fürs Lesen!