Se você sempre quis usar o Neovim para desenvolvimento PHP e Laravel, este guia deve ajudá-lo a começar. Se você usa o VSCode, confira este post.
Neste post, usarei o Neovim com o LazyVim. O LazyVim é uma configuração fantástica do Neovim com muitos recursos e ferramentas prontas para uso. Já gastei mais tempo do que gostaria de admitir configurando o Vim e o Neovim. O LazyVim elimina quase todo esse tempo. Quando começar a sentir-se confortável a configurar o LazyVim, pode considerar criar a sua própria configuração a partir do zero.
Instalação
Este post assume que está a usar a última versão do Neovim (v0.10.0 na altura da publicação). Se você precisa instalá-lo, você pode obtê-lo para o seu sistema operacional aqui.
Uma vez que você tenha o Neovim instalado, nós vamos usar o LazyVim. Você pode usar a sua configuração se preferir não usar o LazyVim, mas essa configuração é muito mais complexa para este post.
Para instalar o LazyVim, você vai querer clonar o repo e movê-lo para a sua pasta de configuração do Neovim, (~/.config/nvim
no MacOS/Linux).
git clone https://github.com/LazyVim/starter ~/.config/nvim
Uma vez clonado, você pode remover a pasta .git
já que você não vai precisar dela agora e pode querer controlar a versão das suas mudanças de configuração.
rm -rf ~/.config/nvim/.git
Se você estiver usando o Windows, você pode seguir as instruções de instalação aqui.
Uma vez feito isso, você pode rodar o Neovim, e ele irá puxar todos os plugins e dependências para o LazyVim
Ao sair da caixa, o LazyVim oferece um bom menu para navegar conforme necessário.
LazyVim PHP Extras
O LazyVim adicionou recentemente uma atualização para adicionar rapidamente o suporte a PHP. Você só precisa clicar x
na tela inicial para chegar ao menu de extras ou digitar :LazyExtras
.
No menu, você pode procurar por PHP digitando primeiro uma barra, depois php
, então /php
. O /
inicia as pesquisas no Neovim.
Com o cursor na linha lang.php
, pressione x
para alternar o extra. Em seguida, reinicie o Neovim. Agora, o Neovim suportará a sintaxe PHP e instalará o Phpactor LSP.
Para testar o LSP, criei um novo projeto Laravel com o Laravel Breeze. A partir do diretório do projeto, abra o Neovim e abra o ProfileController
usando <leader>ff
. No Neovim, muitos comandos do teclado são prefixados com a tecla <leader>
, que é definida como space
por padrão. Assim, para encontrar um arquivo, digite espaço + f + f
. Então, você pode simplesmente procurar usando o localizador fuzzy.
Ao carregar o controlador pela primeira vez, o Phpactor começará a indexar sua base de código, tipicamente a partir da raiz Git do projeto.
Você também verá muitos erros e outros diagnósticos. Eles estão sendo fornecidos pelo LSP juntamente com o autocompletar de código, ir para a definição, refatoração e muitos outros recursos.
Se quiser modificar o controlador base, você pode navegar para Controller
e clicar em gd
para Ir para a definição.
Depois de Ir para a definição, você pode voltar para a definição da classe e clicar em gr
para Ir para as referências da classe Controller
. Em seguida, você pode usar ctrl+o
para voltar aos locais anteriores.
Por favor, não hesite em continuar usando o Phpactor se ele funcionar para você. Ele luta com alguns dos tipos mágicos e ausentes no Laravel, mas é completamente gratuito e de código aberto. Você pode melhorar isso usando algo como o Laravel IDE Helper, que gera stubs para modelos, fachadas e outros recursos do framework para fornecer um melhor preenchimento automático.
Pessoalmente, tive uma experiência melhor usando o Intelephense LSP, com o qual você provavelmente está familiarizado se vier do VSCode. Infelizmente, você perde alguns recursos do Phpactor sem a versão premium do Intelephense, então eu recomendo a compra se você usa o Intelephense. Uma única licença funciona com o VSCode, Neovim e quaisquer outros editores que suportem LSPs.
Para configurar o Intelephense, será necessário modificar a configuração do LazyVim. Na pasta ~/.config/nvim
, abra options.lua
e adicione a seguinte linha:
vim.g.lazyvim_php_lsp = "intelephense"
Isso diz ao LazyVim para configurar o Intelephense. Pode ser necessário remover o Phpactor, no entanto. Para conseguir isso, você pode digitar <leader>cm
que abre o Mason. O Mason é uma ferramenta para instalar vários formatadores, linters e LSPs. No menu Mason, encontre o Phpactor e desinstale-o usando X
.
Configurar formatação do Laravel Pint
Desde que instalamos o Lazy Extras for PHP, o Laravel Pint e o PHP-CS-Fixer foram instalados. No entanto, o PHP-CS-Fixer está definido como padrão. Para alterar isso, podemos criar um novo arquivo no config do Neovim: ~/.config/nvim/lua/plugins/php.lua
. Você pode dar a esse arquivo o nome que quiser, mas para este post, vamos usá-lo para todas as nossas configurações relacionadas a PHP/Laravel.
No arquivo, você pode incluir o seguinte:
return {
{
"stevearc/conform.nvim",
optional = true,
opts = {
formatters_by_ft = {
php = { { "pint", "php_cs_fixer" } },
},
},
},
}
Isso torna o Pint o formatador padrão, e ele voltará para o PHP-CS-Fixer se não for encontrado. Com essa mudança, eu posso voltar ao ProfileController
e adicionar uma importação não utilizada e bagunçar a indentação, e salvar irá disparar uma formatação.
Outra mudança opcional que você pode fazer é remover o phpcs se você não o usa. No arquivo php.lua
, apenas adicione outro bloco como o seguinte:
return {
{
-- Defina o Laravel Pint como o formatador PHP padrão com o PHP CS Fixer como uma alternativa.
"stevearc/conform.nvim",
optional = true,
opts = {
formatters_by_ft = {
php = { { "pint", "php_cs_fixer" } },
},
},
},
{
-- Remova o phpcs linter.
"mfussenegger/nvim-lint",
optional = true,
opts = {
linters_by_ft = {
php = {},
},
},
},
}
Eu estou pegando essas configurações direto dos documentos do LazyVim.
Testando
Em seguida, vamos configurar o Neatest para que possamos executar testes diretamente no Neovim. Este é outro extra do LazyVim que pode ser adicionado digitando :LazyExtras
e então procurando por “test.core” e alternando com X
.
Então, precisamos instalar o plugin Neotest Pest. Adicione o seguinte bloco à configuração php.lua
.
return {
{
...
},
{
-- Adicione o plugin neotest-pest para executar testes PHP.
-- Um pacote também está disponível para o PHPUnit, se necessário.
"nvim-neotest/neotest",
dependencies = { "V13Axel/neotest-pest" },
opts = { adapters = { "neotest-pest" } },
}
}
–Com a configuração de teste no lugar, carregue um arquivo de teste, e você pode executar testes individuais com <leader>tr
ou o arquivo inteiro com <leader>tt
.
Use <leader>to
para alternar um resumo dos resultados do teste.
Sintaxe do Blade
Adicionar suporte para o Laravel Blade é um pouco mais complicado. O LazyVim tem a configuração do Treesitter para suportar o realce de sintaxe para a maioria das linguagens. No entanto, o Blade não é instalado por padrão, por isso precisamos adicioná-lo.
return {
{
...
},
{
-- Adicionar um analisador Treesitter para Laravel Blade para fornecer destaque de sintaxe 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,
},
}
Estendemos a configuração padrão do Treesitter para definir um novo tipo de arquivo e puxar o analisador Blade.
Após reiniciarmos o Neovim, é possível executar :TSInstall blade
para baixar o analisador.
Em seguida, precisamos adicionar algumas consultas do Treesitter para melhor suporte ao código. Para isso, temos que criar alguns novos arquivos dentro do Neovim.
Blade Injections
Tipo :TSEditQuery injections blade
e adicione o seguinte conteúdo:
((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
Digite :TSEditQuery highlights blade
e adicione:
(directive) @tag
(directive_start) @tag
(directive_end) @tag
(comment) @comment
Blade Folds
Tipo :TSEditQuery folds blade
e adicione:
((directive_start) @start
(directive_end) @end.after
(#set! role block))
((bracket_start) @start
(bracket_end) @end
(#set! role block))
HTML Injections
Finalmente, adicionaremos algumas consultas de injeção para suporte ao Alpine. Digite :TSEditQuery
e adicione:
;; 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"))))
Agora, depois de adicionar tudo, salvar e reiniciar, você deve ter destaque de sintaxe para arquivos Blade!
Para obter mais informações e instruções de instalação, visite o repo do analisador Blade Treesitter.
Snippets
O LazyVim vem com um plugin para criar snippets facilmente. Para criar snippets PHP, pode-se criar um novo arquivo: ~/.config/nvim/snippets/php.json
semelhante ao exemplo abaixo:
{
"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",
"",
"});"
]
}
}
Você pode adicionar quaisquer outros snippets que desejar a este arquivo, ou criar arquivos para outras linguagens para adicionar snippets.
Plugins Adicionais
Laravel.nvim
Este plugin pode ser usado para executar rapidamente comandos do Artisan com uma grande funcionalidade de pesquisa usando <leader>la
. Ou pode listar todas as rotas na sua aplicação usando <leader>lr
.
return {
{
...
},
{
-- Adicionar o plugin Laravel.nvim que dá a capacidade de executar comandos Artisan
-- do 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
Adiciona a capacidade de usar o Goto File nas views do Blade para saltar para componentes e outras views usando gf
.
return {
{
...
},
{
-- Adiciona o plugin blade-nav.nvim que fornece recursos de Goto File
-- para arquivos do Blade.
"ricardoramirezr/blade-nav.nvim",
dependencies = {
"hrsh7th/nvim-cmp",
},
ft = { "blade", "php" },
},
}
Dicas Adicionais
Um benefício gigante do LazyVim é a documentação. Se há algo que você está acostumado a fazer no VSCode e você quer no Neovim, há uma chance do LazyVim já ter isso embutido. Eu recomendo apenas passar por cada seção do LazyVim para aprender mais sobre ele.
Provavelmente uma das seções mais importantes são os mapas de teclas. O LazyVim usa o which-key.nvim para ajudá-lo a lembrar os keycaps configurados enquanto você está no editor, mas para uma lista completa, clique aqui.
Quer suporte ao Git? O LazyVim tem isso coberto com o LazyGit que é uma interface de terminal muito boa para o Git. Use <leader>gg
para abri-lo. Você pode até instalar o LazyGit diretamente usando algo como o Homebrew para rodar direto na linha de comando usando lazygit
.
Precisa de ferramentas adicionais como PHPStan ou Psalm? Use <leader>cm
ou :Mason
para abrir o menu Mason e procurar o que você precisa. Ele tem muitos linters e formatadores populares disponíveis para instalação.
Recursos Adicionais
Docs do LazyVim
Como mencionei acima, o LazyVim fornece uma documentação incrível e definitivamente vale a pena lê-la.
Neovim como uma IDE PHP e JavaScript
Jess Archer tem um fantástico curso para configurar o Neovim no Laracasts. Se você não está inscrito no Laracasts, não posso recomendar o suficiente. Eu sou um usuário vitalício desde 2017. Se é algo em que você está interessado, por favor, use meu link de referência.
Omakub
DHH (o criador do Ruby on Rails) criou o pacote Omakub como uma maneira rápida de configurar um ambiente de desenvolvimento no Ubuntu Linux. Mesmo se não estiver usando Ubuntu, vale a pena conferir o repositório do Omakub, pois ele tem muitas configurações e ferramentas legais, uma das quais é o Neovim com LazyVim.
Kickstart.nvim
Se quiser algo um pouco mais minimalista que o LazyVim, então o Kickstart.nvim é um bom começo. Você pode assistir a este vídeo de TJ DeVries sobre como começar. Mesmo que você queira continuar usando o LazyVim, este ainda é um ótimo recurso para aprender mais sobre a configuração do Neovim.
Resumo
Espero que isto o ajude a iniciar a sua viagem no Neovim. É um editor poderoso que é infinitamente configurável. Apesar de não ser tão poderoso quanto algo como o PhpStorm, ele pode chegar bem perto gratuitamente e requer menos recursos de CPU.
Mesmo que você não planeje usar o Neovim como seu editor principal, acho que ainda pode ser benéfico aprender os atalhos de teclado. Eu normalmente divido meu tempo entre o Neovim e o PhpStorm e tento manter meus atalhos de teclado o mais parecido possível. Felizmente, o plugin IdeaVim para IDEs JetBrains torna isso simples.
Para sua referência, criei um repo com todos os arquivos que criamos neste post.
Por favor, deixe-me saber se você tiver outras perguntas sobre a configuração ou quaisquer recursos adicionais que eu possa ter perdido.
Obrigado pela leitura!