Hace tiempo publiqué un post sobre como refactorizar Python usando Vim, hoy quiero ir un paso más allá y contaros como convertir a NeoVim en un IDE si usas Python.
Que es un IDE para mi
Si esperas encontrar aquí un remplazo absoluto a otros IDEs como VSCode o Intellij siento decirte que este post no es para ti.
Lo primero de todo es definir que es para mi un IDE, ya que el concepto puede diferir mucho en función de a quien preguntes. En mi opinión un IDE debería tener al menos las siguientes características:
- Búsqueda de ficheros.
- Búsqueda de texto dentro de los ficheros.
- Información de métodos, tipos y variables.
- Autoimportado.
- Autocompletado.
- Errores y avisos.
- Ir a la definición.
Una vez definido lo que sería el MVP de un IDE vamos a ver como lograr que NeoVim tenga todas estas nuevas características.
Desde hace unas semanas tengo toda mi configuración migrada a un lenguaje llamado Lua (no es relevante para este post), ya que la integración con NeoVim es muy buena respecto al pasado VimScript.
Los principales actores que vamos a pasar a conocer son:
- Telescope.
- Será el plug-in encargado de la búsqueda tanto de los ficheros como de palabras dentro de los mismos.
- Nvim-CMP
- Será el plug-in encargado del autocompletado de nuestro código haciendo uso del protocolo LSP.
- Pyright
- LSP esta disponible en multitud de lenguajes y Pyright es el necesario para trabajar con Python.
- Será capaz de entender nuestro código hasta el punto de incluir los imports automáticamente o detectar errores en el mismo.
Toda la configuración de NeoVim esta disponible aquí por si quieres verla con calma.
Telescope
Este plug-in es bastante nuevo para mí, ya que siempre había usado Ctrl-P + FZF
en
lo que a la búsqueda se refería, pero es que como veréis a continuación
Telescope juega en otra liga. Además tiene una gran cantidad de opciones para
configurarlo, desde el layout hasta realizar mapeaos de algunas acciones.
Su instalación es tan sencilla como instalar los siguientes plug-ins con nuestro gestor de paquetes en NeoVim (ya sea Vim-Plug o Packer):
Plug 'nvim-lua/plenary.nvim'
Plug 'nvim-telescope/telescope.nvim', { 'tag': '0.1.0' }
---------------------------------------------------------
use {
'nvim-telescope/telescope.nvim', tag = '0.1.0',
requires = { {'nvim-lua/plenary.nvim'} }
}
Los dos principales usos que yo le doy son:
- La búsqueda de ficheros, con previsualización, dentro del proyecto con la
combinación
<control-P>
: - La búsqueda dentro de ficheros, con previsualización, dentro del proyecto con la
combinación
fg
Cómo podéis ver visualmente es una pasada lo claro y conciso que se ve todo.
LSP (Language Server Protocol)
LSP es un protocolo de comunicación utilizado entre los IDEs y unos servidores instalados en nuestras máquinas e independientes por cada lenguaje de programación, que permite a los IDEs tener capacidades superpotentes como puede ser el autocompletado o la detección de errores.
Este protocolo será la base sobre la que se sustentara todo lo que veremos a continuación.
Pyright
Una vez hablado del protocolo LSP necesitamos un servidor que lo implemente para nuestro lenguaje de programación que en nuestro caso será Python.
Su instalación es supersencilla y bastaría con teclear en nuestra terminal pip install pyright
Nvim-CMP
Y ya por último la pieza intermedia de nuestro puzzle encargada de poner en comunicación nuestro IDE con Pyright.
Aquí es donde entra en juego Nvim-CMP, un plug-in de NeoVim escrito en Lua que nos va a permitir configurar entre otras muchas cosas:
- Los servidores que queremos usar en NeoVim (recuerda que cada lenguaje tiene el suyo propio)
- Los mapeos para las funciones más habituales como abrir o seleccionar del autocompletado.
- Configurar los snippets.
Su instalación y configuración es muy sencilla y la podéis ver aquí
Usando Neovim como IDE
Después de toda esta introducción/preparación vamos a comenzar con lo realmente interesante, que es usar Neovim en un proyecto de Python real y ver como se comporta.
Autoimport
Una de las cosas que más echaba en falta programando con Vim era el autoimportado cuando escribías un tipo, esto con CMP ya no te volverá a pasar. Como podemos ver en la imagen el plug-in es lo suficientemente inteligente para detectar que el import no existe, localizarlo y sugerir su import:
Ver informacion sobre las variables, clases o metodos
Otra feature que tiene CMP y que me gusta mucho es poder ver información relativa a los tipos de nuestras variables o métodos:
Aquí podemos ver el tipo de la variable weathers
:
Aquí podemos ver la firma del método find
:
Aquí podemos ver información relativa al objeto uuid1
de la librería uuid
:
Errores y Avisos
Aquí podemos ver un aviso de una variable que no se usa:
Aquí podemos ver un error debido a un import que nos falta:
Autocomplete
Y por último la joya de la corona, el autocompletado.
CMP es capaz de entender nuestro código y mostrarnos autocompletado acorde a cada situación (no es lo mismo una lista que un diccionario ni que un objeto dominio de nuestra aplicación).
Aquí podemos ver el menú de autocompletado para una clase custom de nuestra aplicación:
Conclusiones
¡Espero que esta entrada os haya aportado algo de valor y que os animéis a darle una oportunidad!
!Un saludo!