Als je ooit Neovim hebt willen gebruiken voor de ontwikkeling van PHP en Laravel, dan kan deze handleiding je op weg helpen. Als je VSCode gebruikt, bekijk dan deze post.
In deze post gebruik ik Neovim met LazyVim. LazyVim is een fantastische Neovim setup met veel mogelijkheden en gereedschappen uit de doos. Ik heb meer tijd besteed aan het configureren van Vim en Neovim dan ik zou willen toegeven. LazyVim bespaart je bijna al die tijd. Naarmate je LazyVim beter begint te configureren, kun je overwegen om je eigen configuratie helemaal opnieuw te maken.
Installatie
In deze post wordt ervan uitgegaan dat je de nieuwste versie van Neovim gebruikt (v0.10.0 ten tijde van publicatie). Als je het moet installeren, kun je het voor jouw OS hier downloaden.
Als je Neovim hebt geïnstalleerd, gaan we LazyVim gebruiken. Je kunt je eigen configuratie gebruiken als je liever geen LazyVim gebruikt, maar die installatie is veel complexer voor deze post.
Om LazyVim te installeren, moet je de repo klonen en verplaatsen naar je Neovim configuratiemap (~/.config/nvim
op MacOS/Linux).
git clone https://github.com/LazyVim/starter ~/.config/nvim
Eénmaal gekloond, kun je de .git
map verwijderen, omdat je die nu niet nodig hebt en misschien je configuratiewijzigingen wilt beheren.
rm -rf ~/.config/nvim/.git
Als je Windows gebruikt, kun je de installatie-instructies hier volgen.
Als dat is gebeurd, kun je Neovim starten, waarna het alle plugins en afhankelijkheden voor LazyVim ophaalt
Uit de doos geeft LazyVim een mooi menu waarmee je naar behoefte kunt navigeren.
LazyVim PHP Extras
LazyVim heeft onlangs een update toegevoegd om snel PHP-ondersteuning toe te voegen. Je hoeft alleen maar op x
te klikken in het beginscherm om naar het menu Extra’s te gaan of :LazyExtras
in te typen.
In het menu kun je zoeken naar PHP door eerst een schuine streep te typen en dan php
, dus /php
. De /
begint met zoeken in Neovim.
Met je cursor op de regel lang.php
druk je op x
om de extra te wisselen. Start Neovim vervolgens opnieuw op. Neovim ondersteunt nu de PHP-syntaxis en installeert de Phpactor LSP.
Om de LSP te testen, heb ik een nieuw Laravel-project gemaakt met Laravel Breeze. Open vanuit de projectmap Neovim en open de ProfileController
met <leader>ff
. In Neovim worden veel toetsenbordcommando’s voorafgegaan door de <leader>
toets, die standaard is ingesteld op space
. Dus om een bestand te vinden, typ je space + f + f
. Daarna kun je gewoon zoeken met de fuzzy finder.
Wanneer je de controller voor de eerste keer laadt, zal Phpactor beginnen met het indexeren van je codebase, meestal vanaf de Git root van het project.
Je ziet ook veel fouten en andere diagnoses. Deze worden geleverd door het LSP, samen met code voltooiing, ga naar definitie, refactoring en vele andere functies.
Als je de basiscontroller wilt wijzigen, kun je navigeren naar Controller
en klikken op gd
voor Goto Definition.
Na Goto Definition kun je teruggaan naar de klassedefinitie en klikken op gr
voor Goto References voor de klasse Controller
. Vervolgens kun je ctrl+o
gebruiken om terug te springen naar je vorige locaties.
Gebruik Phpactor gerust als het voor jou werkt. Het worstelt met sommige van de magische en ontbrekende types in Laravel, maar het is volledig gratis en open source. Je kunt dit verbeteren door iets als Laravel IDE Helper te gebruiken, dat stubs genereert voor modellen, facades en andere frameworkfuncties om een betere auto-aanvulling te geven.
Persoonlijk heb ik een betere ervaring met het Intelephense LSP, waarmee je waarschijnlijk bekend bent als je van VSCode komt. Helaas mis je een aantal functies van Phpactor zonder de premium versie van Intelephense, dus ik raad de aankoop aan als je Intelephense gebruikt. Een enkele licentie werkt voor VSCode, Neovim en alle andere editors die LSP’s ondersteunen.
Om Intelephense in te stellen, moet je de LazyVim-configuratie aanpassen. Open ~/.config/nvim
in de map options.lua
en voeg de volgende regel toe:
vim.g.lazyvim_php_lsp = "intelephense"
Dit vertelt LazyVim om Intelephense in te stellen. Het kan echter nodig zijn om Phpactor te verwijderen. Om dat te doen, kun je <leader>cm
typen, wat Mason opent. Mason is een hulpprogramma voor het installeren van verschillende formatteerders, linters en LSP’s. Zoek in het Mason-menu naar Phpactor en verwijder dit met X
.
Laravel Pint-opmaak instellen
Sinds we de Lazy Extras voor PHP hebben geïnstalleerd, zijn Laravel Pint en PHP-CS-Fixer geïnstalleerd. PHP-CS-Fixer is echter standaard ingesteld. Om dit te veranderen, kunnen we een nieuw bestand aanmaken in de Neovim config: ~/.config/nvim/lua/plugins/php.lua
. Je kunt dit bestand de naam geven die je wilt, maar voor deze post gebruiken we het voor al onze PHP/Laravel-gerelateerde configuraties.
In het bestand kun je het volgende opnemen:
return {
{
"stevearc/conform.nvim",
optional = true,
opts = {
formatters_by_ft = {
php = { { "pint", "php_cs_fixer" } },
},
},
},
}
Dit maakt van Pint de standaard formatteerder en valt terug op PHP-CS-Fixer als het niet wordt gevonden. Met deze wijziging kan ik teruggaan naar de ProfileController
en een ongebruikte import toevoegen en de inspringing verknoeien, en het opslaan zal een opmaak activeren.
Een andere optionele wijziging die je kunt maken, is het verwijderen van phpcs als je het niet gebruikt. Voeg in het bestand php.lua
nog een blok toe zoals het volgende:
return {
{
-- Stel Laravel Pint in als standaard PHP formatteerder met PHP CS Fixer als noodoplossing.
"stevearc/conform.nvim",
optional = true,
opts = {
formatters_by_ft = {
php = { { "pint", "php_cs_fixer" } },
},
},
},
{
-- Verwijder phpcs linter.
"mfussenegger/nvim-lint",
optional = true,
opts = {
linters_by_ft = {
php = {},
},
},
},
}
Ik haal deze configuraties rechtstreeks uit de LazyVim docs.
Testen
Vervolgens gaan we Neatest instellen zodat we tests kunnen uitvoeren vanuit Neovim. Dit is nog een LazyVim extra die kan worden toegevoegd door :LazyExtras
in te typen en dan te zoeken naar “test.core” en te wisselen met X
.
Dan moeten we de Neotest Pest plugin installeren. Voeg het volgende blok toe aan de php.lua
configuratie.
return {
{
...
},
{
-- Voeg neotest-pest plugin toe voor het uitvoeren van PHP-tests.
-- Indien nodig is er ook een pakket beschikbaar voor PHPUnit.
"nvim-neotest/neotest",
dependencies = { "V13Axel/neotest-pest" },
opts = { adapters = { "neotest-pest" } },
}
}
Met de testconfiguratie op zijn plaats laadt u een testbestand en kunt u afzonderlijke tests uitvoeren met <leader>tr
of het hele bestand met <leader>tt
.
Gebruik <leader>to
om te wisselen tussen een samenvatting van de testresultaten.
Blade Syntax
Het toevoegen van ondersteuning voor Laravel Blade is iets ingewikkelder. LazyVim heeft Treesitter ingesteld om syntax highlighting voor de meeste talen te ondersteunen. Blade is echter niet standaard geïnstalleerd, dus we moeten het toevoegen.
return {
{
...
},
{
--Een Treesitter-parser toevoegen voor Laravel Blade om Blade-syntax highlighting te bieden.
"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,
},
}
We breiden de standaardconfiguratie van Treesitter uit om een nieuw bestandstype in te stellen en de Blade-parser op te halen.
Als we Neovim opnieuw opstarten, kunt u :TSInstall blade
uitvoeren om de parser te downloaden.
Na dit punt moeten we enkele Treesitter-query’s toevoegen voor een betere ondersteuning van de code. Hiervoor moeten we enkele nieuwe bestanden maken in Neovim.
Blade Injections
Type :TSEditQuery injections blade
en voeg de volgende inhoud toe:
((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
Type :TSEditQuery highlights blade
en voeg toe:
(directive) @tag
(directive_start) @tag
(directive_end) @tag
(comment) @comment
Blade Folds
Type :TSEditQuery folds blade
en voeg toe:
((directive_start) @start
(directive_end) @end.after
(#set! role block))
((bracket_start) @start
(bracket_end) @end
(#set! role block))
HTML Injections
Tot slot voegen we enkele injectiequery’s toe voor Alpine-ondersteuning. Typ :TSEditQuery
en voeg toe:
;; 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"))))
Nu, na alles te hebben toegevoegd, opgeslagen en opnieuw opgestart, zou je nu syntax highlighting voor Blade-bestanden moeten hebben!
Bezoek voor meer informatie en installatie-instructies de repo voor de Blade Treesitter parser.
Snippets
LazyVim wordt geleverd met een plugin om eenvoudig snippets te maken. Om PHP-snippets te maken, kun je een nieuw bestand maken: ~/.config/nvim/snippets/php.json
zoals in het onderstaande voorbeeld:
{
"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",
"",
"});"
]
}
}
U kunt aan dit bestand andere snippets toevoegen of bestanden maken voor andere talen om snippets toe te voegen.
Extra plugins
Laravel.nvim
Met deze plugin kun je snel Artisan-commando’s uitvoeren met een geweldige zoekfunctie met <leader>la
. Of je kunt een lijst maken van alle routes in je applicatie met <leader>lr
.
return {
{
...
},
{
--De Laravel.nvim plugin toevoegen die de mogelijkheid biedt om Artisan commando's uit te voeren
-- vanuit Neovim.
"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
Voegt de mogelijkheid toe om Goto File te gebruiken in Blade-weergaven om naar componenten en andere weergaven te springen met behulp van gf
.
return {
{
...
},
{
-- Voeg de blade-nav.nvim-plugin toe die Goto File-mogelijkheden biedt
--voor Blade-bestanden.
"ricardoramirezr/blade-nav.nvim",
dependencies = {
"hrsh7th/nvim-cmp",
},
ft = { "blade", "php" },
},
}
Toegevoegde tips
Een groot voordeel van LazyVim is de documentatie. Als er iets is dat je gewend bent te doen in VSCode en je wilt het in Neovim, dan is er een kans dat LazyVim dat al ingebouwd heeft. Ik raad aan om elke sectie in LazyVim door te nemen om er meer over te leren.
Een van de belangrijkste secties is waarschijnlijk de keymaps. LazyVim gebruikt which-key.nvim om u te helpen de geconfigureerde keycaps te onthouden terwijl u in de editor bent, maar voor een complete lijst, klik hier.
Wilt u Git ondersteuning? LazyVim heeft dat ondervangen met LazyGit wat een hele mooie terminal UI is voor Git. Gebruik <leader>gg
om het te openen. Je kunt zelfs LazyGit direct installeren met iets als Homebrew om het direct op de commandoregel te draaien met lazygit
.
Heb je extra tooling nodig zoals PHPStan of Psalm? Gebruik <leader>cm
of :Mason
om het Mason menu te openen en te zoeken naar wat je nodig hebt. Er zijn veel populaire linters en formatteerders beschikbaar om te installeren.
Toegevoegde bronnen
LazyVim Docs
Zoals ik hierboven al aangaf, biedt LazyVim geweldige documentatie die zeker het lezen waard is.
Neovim als PHP en JavaScript IDE
Jess Archer heeft een fantastische cursus voor het instellen van Neovim op Laracasts. Als je nog niet geabonneerd bent op Laracasts, kan ik het niet genoeg aanbevelen. Ik ben een levenslange gebruiker sinds 2017. Als het iets voor je is, gebruik dan mijn verwijslink.
Omakub
DHH (de maker van Ruby on Rails) heeft het Omakub-pakket gemaakt als een snelle manier om een ontwikkelomgeving op Ubuntu Linux op te zetten. Zelfs als je Ubuntu niet gebruikt, is de repo voor Omakub de moeite waard om te bekijken, omdat deze veel leuke configuraties en tools bevat, waaronder Neovim met LazyVim.
Kickstart.nvim
Als je iets minimalers wilt dan LazyVim, dan is Kickstart.nvim een goed begin. Je kunt deze video van TJ DeVries bekijken over hoe je aan de slag gaat. Zelfs als je LazyVim wilt blijven gebruiken, is dit nog steeds een goede bron om meer te leren over het configureren van Neovim.
Samenvatting
Ik hoop dat dit je op weg helpt met Neovim. Het is een krachtige editor die oneindig configureerbaar is. Hoewel het niet zo krachtig is als PhpStorm, kun je er gratis mee werken en het vereist minder CPU-bronnen.
Zelfs als je niet van plan bent om Neovim als je primaire editor te gebruiken, denk ik dat het nog steeds nuttig kan zijn om de keybindings te leren. Ik verdeel mijn tijd tussen Neovim en PhpStorm en probeer mijn keybindings zo gelijk mogelijk te houden. Gelukkig maakt de IdeaVim-plugin voor JetBrains IDE’s dit eenvoudig.
Voor referentie heb ik een repo gemaakt met alle bestanden die we in deze post hebben gemaakt.
Laat het me weten als je nog vragen hebt over de installatie of over extra functies die ik misschien heb gemist.
Dank voor het lezen!