NeoVim tu IDE para Python

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>:
    • ctrlp
  • La búsqueda dentro de ficheros, con previsualización, dentro del proyecto con la  combinación fg
    • find-in-files

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:

autoimport

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: hint

Aquí podemos ver la firma del método find: hint

Aquí podemos ver información relativa al objeto uuid1 de la librería uuid: hint

Errores y Avisos

Aquí podemos ver un aviso de una variable que no se usa: unused

Aquí podemos ver un error debido a un import que nos falta: import-error

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: menu

Conclusiones

¡Espero que esta entrada os haya aportado algo de valor y que os animéis a darle una oportunidad!

!Un saludo!