Si alguna vez has querido utilizar Neovim para el desarrollo de PHP y Laravel, esta guía debería ayudarte a empezar. Si utilizas VSCode, entonces echa un vistazo a este post.
En este post, voy a utilizar Neovim con LazyVim. LazyVim es una fantástica Neovim configuración con muchas características y herramientas fuera de la caja. He pasado más tiempo del que me gustaría admitir configurando Vim y Neovim. LazyVim elimina casi todo ese tiempo. Cuando empieces a sentirte cómodo configurando LazyVim, puedes considerar la posibilidad de crear tu propia configuración desde cero.
Instalación
Este post asume que estás usando la última versión de Neovim (v0.10.0 en el momento de la publicación). Si necesitas instalarla, puedes conseguirla para tu sistema operativo aquí.
Una vez que tengas Neovim instalado, vamos a utilizar LazyVim. Puedes usar tu configuración si prefieres no usar LazyVim, pero esa configuración es mucho más compleja para este post.
Para instalar LazyVim, tendrás que clonar el repositorio y moverlo a tu carpeta de configuración de Neovim, (~/.config/nvim
en MacOS/Linux).
git clone https://github.com/LazyVim/starter ~/.config/nvim
Una vez clonado, puedes eliminar la carpeta .git
ya que no la necesitarás ahora y puede que quieras controlar la versión de tus cambios de configuración.
rm -rf ~/.config/nvim/.git
Si usas Windows, puedes seguir las instrucciones de instalación aquí.
Una vez hecho esto, puedes ejecutar Neovim, y te mostrará todos los plugins y dependencias para LazyVim
Desde el principio, LazyVim ofrece un bonito menú por el que navegar según necesites.
LazyVim PHP Extras
LazyVim ha añadido recientemente una actualización para añadir rápidamente soporte PHP. Sólo tiene que hacer clic en x
desde la pantalla de inicio para llegar al menú de extras o escribir :LazyExtras
.
Desde el menú, puede buscar PHP escribiendo primero una barra, luego php
, así /php
. El /
inicia la búsqueda en Neovim.
Con el cursor en la línea lang.php
, pulsa x
para activar el extra. A continuación, reinicia Neovim. Ahora, Neovim soportará la sintaxis PHP e instalará el Phpactor LSP.
Para probar el LSP, he creado un nuevo proyecto Laravel con Laravel Breeze. Desde el directorio del proyecto, abra Neovim y abra el ProfileController
usando <leader>ff
. En Neovim, muchos comandos de teclado tienen como prefijo la tecla <leader>
, que por defecto está configurada como espacio
. Para buscar un archivo, escriba espacio + f + f
. Entonces, puedes simplemente buscar usando el buscador difuso.
Cuando se carga el controlador por primera vez, Phpactor comenzará a indexar tu base de código, típicamente desde la raíz Git del proyecto.
También verás muchos errores y otros diagnósticos. Estos son proporcionados por el LSP junto con la finalización de código, ir a la definición, refactorización, y muchas otras características.
Si desea modificar el controlador de base, puede navegar a Controller
y haga clic en gd
para Goto Definition.
Después de Goto Definition, puede volver a la definición de la clase y haga clic en gr
para Goto References para la clase Controller
. A continuación, puedes usar ctrl+o
para volver a las ubicaciones anteriores.
Por favor, no dudes en seguir usando Phpactor si te funciona. Lucha con algunos de los tipos mágicos y faltantes en Laravel pero es completamente gratis y de código abierto. Puedes mejorar esto usando algo como Laravel IDE Helper que genera stubs para modelos, facades, y otras características del framework para dar un mejor autocompletado.
Personalmente, he tenido una mejor experiencia usando el Intelephense LSP, con el que probablemente estés familiarizado si vienes de VSCode. Desafortunadamente, se pierden algunas características de Phpactor sin la versión premium de Intelephense, por lo que recomiendo la compra si utiliza Intelephense. Una única licencia funciona con VSCode, Neovim, y cualquier otro editor que soporte LSPs.
Para configurar Intelephense, necesitarás modificar la configuración de LazyVim. En la carpeta ~/.config/nvim
, abre options.lua
y añade la siguiente línea:
vim.g.lazyvim_php_lsp = "intelephense"
Esto le dice a LazyVim que configure Intelephense. Es posible que tenga que quitar Phpactor, sin embargo. Para lograrlo, puede escribir <leader>cm
que abre Mason. Mason es una herramienta para instalar varios formateadores, linters y LSPs. Desde el menú de Mason, busca Phpactor y desinstálalo usando X
.
Instalar Laravel Pint Formatting
Desde que instalamos los Lazy Extras para PHP, Laravel Pint y PHP-CS-Fixer han sido instalados. Sin embargo, PHP-CS-Fixer está configurado por defecto. Para cambiar esto, podemos crear un nuevo archivo en la configuración de Neovim: ~/.config/nvim/lua/plugins/php.lua
. Puedes nombrar este archivo como quieras, pero para este post, lo usaremos para toda nuestra configuración relacionada con PHP/Laravel.
En el archivo, puedes incluir lo siguiente:
return {
{
"stevearc/conform.nvim",
optional = true,
opts = {
formatters_by_ft = {
php = { { "pint", "php_cs_fixer" } },
},
},
},
}
Esto hace que Pint sea el formateador por defecto, y volverá a PHP-CS-Fixer si no se encuentra. Con este cambio, puedo volver al ProfileController
y añadir una importación sin usar y desordenar la sangría, y al guardar se activará un formateador.
Otro cambio opcional que puedes hacer es eliminar phpcs si no lo usas. En el archivo php.lua
, simplemente añade otro bloque como el siguiente:
return {
{
-- Establece Laravel Pint como el formateador PHP por defecto con PHP CS Fixer como alternativa.
"stevearc/conform.nvim",
optional = true,
opts = {
formatters_by_ft = {
php = { { "pint", "php_cs_fixer" } },
},
},
},
{
-- Elimina phpcs linter.
"mfussenegger/nvim-lint",
optional = true,
opts = {
linters_by_ft = {
php = {},
},
},
},
}
Estas configuraciones las he sacado directamente de los documentos de LazyVim.
Pruebas
A continuación, configuraremos Neatest para poder ejecutar pruebas desde Neovim. Este es otro extra de LazyVim que se puede añadir escribiendo :LazyExtras
y luego buscando “test.core” y activándolo con X
.
A continuación, tenemos que instalar el plugin Neotest Pest. Añade el siguiente bloque a la configuración php.lua
.
return {
{
...
},
{
-- Añade el plugin neotest-pest para ejecutar pruebas PHP.
-- También hay disponible un paquete para PHPUnit si es necesario.
"nvim-neotest/neotest",
dependencies = { "V13Axel/neotest-pest" },
opts = { adapters = { "neotest-pest" } },
}
}
Con la configuración de pruebas en su lugar, cargar un archivo de prueba, y puede ejecutar pruebas individuales con <leader>tr
o todo el archivo con <leader>tt
.
Use <leader>to
para mostrar un resumen de los resultados de la prueba.
Sintaxis de Blade
Añadir soporte para Laravel Blade es un poco más complicado. LazyVim tiene Treesitter configuración para apoyar el resaltado de sintaxis para la mayoría de los idiomas. Sin embargo, Blade no está instalado por defecto, así que tenemos que añadirlo.
return {
{
...
},
{
-- Añadir un analizador Treesitter para Laravel Blade para proporcionar Blade resaltado de sintaxis.
"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,
},
}
Extendemos la configuración por defecto Treesitter para establecer un nuevo tipo de archivo y tire hacia abajo el analizador Blade.
Una vez que reiniciemos Neovim, puedes ejecutar :TSInstall blade
para descargar el analizador.
A continuación, tenemos que añadir algunas consultas Treesitter para un mejor soporte de código. Para conseguirlo, tenemos que crear algunos archivos nuevos desde dentro de Neovim.
Blade Injections
Tipo :TSEditQuery injections blade
y añade los siguientes contenidos:
((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
Escriba :TSEditQuery resalta hoja
y añada:
(directive) @tag
(directive_start) @tag
(directive_end) @tag
(comment) @comment
Plegados de hoja
Escriba :TSEditQuery pliega hoja
y añada:
((directive_start) @start
(directive_end) @end.after
(#set! role block))
((bracket_start) @start
(bracket_end) @end
(#set! role block))
Inyecciones HTML
Por último, añadiremos algunas consultas de inyección para el soporte Alpine. Escribe :TSEditQuery
y añade:
;; 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"))))
Ahora, después de añadir todo, guardar y reiniciar, ¡ya deberías tener resaltado de sintaxis para los archivos Blade!
Para más información e instrucciones de instalación, visite el repo para el analizador Blade Treesitter.
Snippets
LazyVim viene con un plugin para crear snippets fácilmente. Para crear fragmentos de PHP, puede crear un nuevo archivo: ~/.config/nvim/snippets/php.json
similar al ejemplo siguiente:
{
"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",
"",
"});"
]
}
}
Puedes añadir cualquier otro snippets que desees a este archivo, o crear archivos para otros lenguajes para añadir snippets.
Complementos Adicionales
Laravel.nvim
Este plugin puede ser usado para ejecutar rápidamente comandos Artisan con una gran característica de búsqueda usando <leader>la
. O puedes listar todas las rutas en tu aplicación usando <leader>lr
.
return {
{
...
},
{
-- Añade el plugin Laravel.nvim que da la habilidad de ejecutar comandos Artisan
-- desde 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
Añade la posibilidad de utilizar Goto File en vistas Blade para saltar a componentes y otras vistas utilizando gf
.
return {
{
...
},
{
-- Añade el plugin blade-nav.nvim que proporciona capacidades Goto File
-- para archivos Blade.
"ricardoramirezr/blade-nav.nvim",
dependencies = {
"hrsh7th/nvim-cmp",
},
ft = { "blade", "php" },
},
}
Consejos Adicionales
Una gran ventaja de LazyVim es la documentación. Si hay algo que estás acostumbrado a hacer en VSCode y quieres hacerlo en Neovim, es posible que LazyVim ya lo tenga incorporado. Te recomiendo que repases cada sección de LazyVim para aprender más sobre ella.
Probablemente una de las secciones más importantes es la de los mapas de teclado. LazyVim utiliza which-key.nvim para ayudarle a recordar las teclas configuradas mientras está en el editor, pero para obtener una lista completa, haga clic aquí.
¿Desea soporte Git? LazyVim lo tiene cubierto con LazyGit que es una interfaz de terminal realmente agradable para Git. Usa <leader>gg
para abrirlo. Puedes incluso instalar LazyGit directamente usando algo como Homebrew para ejecutarlo directamente en la línea de comandos usando lazygit
.
¿Necesitas herramientas adicionales como PHPStan o Psalm? Utilice <leader>cm
o :Mason
para abrir el menú de Mason y buscar lo que necesita. Dispone de muchos linters y formateadores populares para instalar.
Recursos adicionales
LazyVim Docs
Como he mencionado anteriormente, LazyVim proporciona una documentación asombrosa y definitivamente vale la pena leerla.
Neovim as a PHP and JavaScript IDE
Jess Archer tiene un fantástico curso para configurar Neovim en Laracasts. Si no estás suscrito a Laracasts, no puedo recomendártelo lo suficiente. Yo soy usuario de por vida desde 2017. Si es algo que te interesa, utiliza mi enlace de referencia.
Omakub
DHH (el creador de Ruby on Rails) creó el paquete Omakub como una forma rápida de configurar un entorno de desarrollo en Ubuntu Linux. Incluso si no usas Ubuntu, merece la pena echar un vistazo al repositorio de Omakub, ya que tiene un montón de buenas configuraciones y herramientas, una de las cuales es Neovim con LazyVim.
Kickstart.nvim
Si quieres algo un poco más minimalista que LazyVim, entonces Kickstart.nvim es un buen comienzo. Puedes ver este vídeo de TJ DeVries sobre cómo empezar. Incluso si quieres seguir usando LazyVim, este es un buen recurso para aprender a configurar Neovim.
Resumen
Espero que esto te ayude a empezar tu viaje con Neovim. Es un potente editor que es infinitamente configurable. Aunque no es tan potente como PhpStorm, puede acercarte bastante a él de forma gratuita y requiere menos recursos de CPU.
Incluso si no planeas usar Neovim como tu editor principal, creo que puede ser beneficioso aprender las combinaciones de teclas. Yo suelo dividir mi tiempo entre Neovim y PhpStorm e intento que mis combinaciones de teclas sean lo más parecidas posible. Por suerte, el plugin IdeaVim para JetBrains IDEs hace esto simple.
Para su referencia, he creado un repo con todos los archivos que hemos creado en este post.
Por favor, hágamelo saber si usted tiene alguna otra pregunta acerca de la configuración o cualquier característica adicional que podría haber omitido.
¡Gracias por leer!