Se avete sempre desiderato utilizzare Neovim per lo sviluppo in PHP e Laravel, questa guida dovrebbe aiutarvi a iniziare. Se utilizzate VSCode, date un’occhiata a questo post.
In questo post, utilizzerò Neovim con LazyVim. LazyVim è una fantastica configurazione di Neovim con molte funzionalità e strumenti già pronti. Ho passato più tempo di quanto vorrei ammettere a configurare Vim e Neovim. LazyVim riduce quasi del tutto questo tempo. Quando inizierete a prendere confidenza con la configurazione di LazyVim, potrete pensare di creare la vostra configurazione da zero.
Installazione
Questo post presuppone che stiate usando l’ultima versione di Neovim (v0.10.0 al momento della pubblicazione). Se avete bisogno di installarlo, potete scaricarlo per il vostro sistema operativo qui.
Una volta installato Neovim, useremo LazyVim. Potete usare la vostra configurazione se preferite non usare LazyVim, ma questa configurazione è molto più complessa per questo post.
Per installare LazyVim, dovete clonare il repo e spostarlo nella cartella di configurazione di Neovim (~/.config/nvim
su MacOS/Linux).
git clone https://github.com/LazyVim/starter ~/.config/nvim
Una volta clonato, si può rimuovere la cartella .git
, poiché ora non serve più e si vuole controllare la versione delle modifiche alla configurazione.
rm -rf ~/.config/nvim/.git
Se stai utilizzando Windows, puoi seguire le istruzioni per l’installazione qui.
Una volta completato, puoi eseguire Neovim e questo scaricherà tutti i plugin e le dipendenze per LazyVim
Pronto all’uso, LazyVim offre un menu utile per navigare come necessario.
LazyVim PHP Extras
LazyVim ha recentemente aggiunto un aggiornamento per aggiungere rapidamente il supporto PHP. Devi solo cliccare su x
dalla schermata principale per accedere al menu extras o digitare :LazyExtras
.
Dal menu, puoi cercare PHP digitando prima una barra, poi php
, quindi /php
. Il /
avvia le ricerche in Neovim.
Con il cursore sulla riga lang.php
, premi x
per attivare l’extra. Poi riavvia Neovim. Ora, Neovim supporterà la sintassi PHP e installerà il Phpactor LSP.
Per testare l’LSP, ho creato un nuovo progetto Laravel con Laravel Breeze. Dalla directory del progetto, apri Neovim e apri il ProfileController
usando <leader>ff
. In Neovim, molti comandi da tastiera sono preceduti dal tasto <leader>
, che è impostato su space
per impostazione predefinita. Quindi, per trovare un file, digita space + f + f
. Poi, puoi semplicemente cercare usando il fuzzy finder.
Quando carichi il controller per la prima volta, Phpactor inizierà a indicizzare il tuo codice sorgente, tipicamente dalla radice Git del progetto.
Vedrai anche molti errori e altri diagnostici. Questi sono forniti dal LSP insieme al completamento del codice, alla navigazione alla definizione, al refactoring e a molte altre funzionalità.
Se vuoi modificare il controller base, puoi navigare su Controller
e cliccare gd
per Andare alla Definizione.
Dopo Andare alla Definizione, puoi tornare alla definizione della classe e cliccare gr
per Andare ai Riferimenti per la classe Controller
. Poi, puoi usare ctrl+o
per tornare alle posizioni precedenti.
Non esitare a continuare a usare Phpactor se funziona per te. Ha difficoltà con alcuni degli aspetti magici e i tipi mancanti in Laravel, ma è completamente gratuito e open source. Puoi migliorare questo utilizzando qualcosa come Laravel IDE Helper che genera stub per modelli, facciate e altre funzionalità del framework per offrire un migliore completamento automatico.
Personalmente, ho avuto un’esperienza migliore usando il LSP Intelephense, con cui probabilmente sei familiare se vieni da VSCode. Sfortunatamente, ti mancano alcune funzionalità di Phpactor senza la versione premium di Intelephense, quindi consiglio l’acquisto se usi Intelephense. Una singola licenza funziona con VSCode, Neovim e qualsiasi altro editor che supporta gli LSP.
Per configurare Intelephense, dovrai modificare la configurazione di LazyVim. Nella cartella ~/.config/nvim
, apri options.lua
e aggiungi la seguente riga:
vim.g.lazyvim_php_lsp = "intelephense"
Questo indica a LazyVim di impostare Intelephense. Potrebbe però essere necessario rimuovere Phpactor. Per farlo, si può digitare <leader>cm
che apre Mason. Mason è uno strumento per installare vari formattatori, linters e LSP. Dal menu di Mason, trovare Phpactor e disinstallarlo usando X
.
Impostare la formattazione di Laravel Pint
Da quando abbiamo installato i Lazy Extras per PHP, Laravel Pint e PHP-CS-Fixer sono stati installati. Tuttavia, PHP-CS-Fixer è impostato come predefinito. Per modificarlo, possiamo creare un nuovo file nella configurazione di Neovim: ~/.config/nvim/lua/plugins/php.lua
. Si può dare a questo file il nome che si vuole, ma per questo post lo useremo per tutte le configurazioni relative a PHP/Laravel.
Nel file si può includere quanto segue:
return {
{
"stevearc/conform.nvim",
optional = true,
opts = {
formatters_by_ft = {
php = { { "pint", "php_cs_fixer" } },
},
},
},
}
Questo rende Pint il formattatore predefinito e, se non viene trovato, si ripiega su PHP-CS-Fixer. Con questa modifica, posso tornare al ProfileController
e aggiungere un’importazione inutilizzata e incasinare l’indentazione, e il salvataggio attiverà un formattatore.
Un’altra modifica opzionale che si può fare è rimuovere phpcs se non lo si usa. Nel file php.lua
, basta aggiungere un altro blocco come il seguente:
return {
{
-- Impostare Laravel Pint come formattatore PHP predefinito con PHP CS Fixer come ripiego.
"stevearc/conform.nvim",
optional = true,
opts = {
formatters_by_ft = {
php = { { "pint", "php_cs_fixer" } },
},
},
},
{
-- Rimuovere phpcs linter.
"mfussenegger/nvim-lint",
optional = true,
opts = {
linters_by_ft = {
php = {},
},
},
},
}
Ho preso queste configurazioni direttamente dai documenti di LazyVim.
Testing
Successivamente, configureremo Neatest in modo da poter eseguire i test direttamente in Neovim. Questo è un altro extra di LazyVim che può essere aggiunto digitando :LazyExtras
e poi cercando “test.core” e attivandolo con X
.
Poi, dobbiamo installare il plugin Neotest Pest. Aggiungere il seguente blocco alla configurazione php.lua
.
return {
{
...
},
{
-- Aggiungere il plugin neotest-pest per l'esecuzione dei test PHP.
-- È disponibile anche un pacchetto per PHPUnit, se necessario.
"nvim-neotest/neotest",
dependencies = { "V13Axel/neotest-pest" },
opts = { adapters = { "neotest-pest" } },
}
}
Con la configurazione dei test a posto, caricare un file di test e si possono eseguire singoli test con <leader>tr
o l’intero file con <leader>tt
.
Utilizzare <leader>to
per attivare un riepilogo dei risultati dei test.
Sintassi di Blade
L’aggiunta del supporto per Laravel Blade è un po’ più complessa. LazyVim ha impostato Treesitter per supportare l’evidenziazione della sintassi per la maggior parte dei linguaggi. Tuttavia, Blade non è installato per impostazione predefinita, quindi dobbiamo aggiungerlo.
return {
{
...
},
{
-- Aggiungiamo un parser Treesitter per Laravel Blade per fornire l'evidenziazione della sintassi di Blade.
"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,
},
}
Estendiamo la configurazione predefinita di Treesitter per impostare un nuovo tipo di file e per richiamare il parser di Blade.
Una volta riavviato Neovim, è possibile eseguire :TSInstall blade
per scaricare il parser.
Poi, dobbiamo aggiungere alcune query di Treesitter per un migliore supporto del codice. Per farlo, dobbiamo creare alcuni nuovi file all’interno di Neovim.
Iniezioni di Blade
Tipo :TSEditQuery injections blade
e aggiungere i seguenti contenuti:
((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
Digitare :TSEditQuery evidenzia lama e aggiungere:
(directive) @tag
(directive_start) @tag
(directive_end) @tag
(comment) @comment
Piega lama
Digitare :TSEditQuery piega lama e aggiungere:
((directive_start) @start
(directive_end) @end.after
(#set! role block))
((bracket_start) @start
(bracket_end) @end
(#set! role block))
Iniezioni HTML
Infine, aggiungeremo alcune query di iniezione per il supporto Alpine. Digitare :TSEditQuery
e aggiungere:
;; 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"))))
Ora, dopo aver aggiunto tutto, salvato e riavviato, si dovrebbe avere l’evidenziazione della sintassi per i file Blade!
Per ulteriori informazioni e istruzioni per l’installazione, visitate il repo del parser Blade Treesitter.
Snippets
LazyVim è dotato di un plugin per creare facilmente snippets. Per creare snippet PHP, si può creare un nuovo file: ~/.config/nvim/snippets/php.json
simile all’esempio seguente:
{
"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",
"",
"});"
]
}
}
A questo file si possono aggiungere altri snippet o creare file per altre lingue per aggiungere snippet.
Plugin aggiuntivi
Laravel.nvim
Questo plugin può essere usato per eseguire rapidamente i comandi di Artisan con un’ottima funzione di ricerca usando <leader>la
. Oppure potete elencare tutte le rotte della vostra applicazione usando <leader>lr
.
return {
{
...
},
{
-- Aggiungete il plugin Laravel.nvim che dà la possibilità di eseguire i comandi Artisan
-- da 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
Aggiunge la possibilità di usare Goto File sulle viste di Blade per saltare ai componenti e ad altre viste usando gf
.
return {
{
...
},
{
-- Aggiunge il plugin blade-nav.nvim che fornisce funzionalità di Goto File
-- per i file di Blade.
"ricardoramirezr/blade-nav.nvim",
dependencies = {
"hrsh7th/nvim-cmp",
},
ft = { "blade", "php" },
},
}
Consigli aggiuntivi
Un enorme vantaggio di LazyVim è la documentazione. Se c’è qualcosa che siete abituati a fare in VSCode e che volete fare in Neovim, è possibile che LazyVim lo abbia già incorporato. Consiglio di esaminare ogni sezione di LazyVim per saperne di più.
Probabilmente una delle sezioni più importanti è quella delle mappe dei tasti. LazyVim usa which-key.nvim per aiutarvi a ricordare i tasti configurati mentre siete nell’editor, ma per un elenco completo, fate clic su qui.
Volete il supporto Git? LazyVim lo offre con LazyGit che è un’interfaccia terminale molto bella per Git. Usate <leader>gg
per aprirla. Si può anche installare LazyGit direttamente usando qualcosa come Homebrew per eseguirlo direttamente sulla riga di comando usando lazygit
.
Si ha bisogno di strumenti aggiuntivi come PHPStan o Psalm? Usate <leader>cm
o :Mason
per richiamare il menu di Mason e cercare ciò che vi serve. Sono disponibili molti linters e formattatori da installare.
Risorse aggiuntive
Documenti di LazyVim
Come ho già detto, LazyVim fornisce una documentazione straordinaria che vale sicuramente la pena di leggere.
Neovim come IDE PHP e JavaScript
Jess Archer ha un fantastico corso per la configurazione di Neovim su Laracasts. Se non siete iscritti a Laracasts, non ve lo consiglierò mai abbastanza. Sono un utente a vita dal 2017. Se vi interessa, usate il mio collegamento di riferimento.
Omakub
DHH (il creatore di Ruby on Rails) ha creato il pacchetto Omakub come modo rapido per impostare un ambiente di sviluppo su Ubuntu Linux. Anche se non si usa Ubuntu, vale la pena controllare il repo di Omakub, che contiene molte configurazioni e strumenti interessanti, tra cui Neovim con LazyVim.
Kickstart.nvim
Se si vuole qualcosa di più minimale di LazyVim, Kickstart.nvim è un buon inizio. Potete guardare questo video di TJ DeVries su come iniziare. Anche se si vuole continuare a usare LazyVim, questa è comunque un’ottima risorsa per saperne di più sulla configurazione di Neovim.
Sintesi
Spero che questo vi aiuti a iniziare il vostro viaggio in Neovim. È un editor potente e infinitamente configurabile. Anche se non è potente come PhpStorm, ci si può avvicinare molto gratuitamente e richiede meno risorse di CPU.
Anche se non avete intenzione di usare Neovim come editor principale, credo che possa essere utile imparare i keybindings. Di solito divido il mio tempo tra Neovim e PhpStorm e cerco di mantenere le mie combinazioni di tasti il più possibile simili. Fortunatamente, il plugin IdeaVim per gli IDE JetBrains rende tutto questo semplice.
Per riferimento, ho creato un repo con tutti i file che abbiamo creato in questo post.
Per favore fatemi sapere se avete altre domande sulla configurazione o su altre caratteristiche che potrei aver tralasciato.
Grazie per aver letto!