Vim para el desarrollo de Python

Vim es un potente editor de texto que pertenece a uno de los componentes predeterminados en todas las distribuciones de Linux, así como en Mac OSX. Vim sigue su propio concepto de usa...

¿Qué es Vim?

Vim es un potente editor de texto que pertenece a uno de los componentes predeterminados en todas las distribuciones de Linux, así como en Mac OSX. Vim sigue su propio concepto de uso, lo que hace que la comunidad se divida en fuertes partidarios y vehementes opositores que están a favor de otros editores como Emacs. (Por cierto, eso es muy bueno en invierno para ver a los dos equipos entusiastas tener una extensa pelea de bolas de nieve juntos).

Vim se puede personalizar y ampliar mediante complementos adicionales para ajustar la herramienta a sus necesidades específicas. En este artículo destacamos una selección de extensiones y discutimos una configuración útil para mejorar el desarrollo de software con Python.

Autocompletar

Vim ya está equipado con una función de finalización automática. Esto funciona bien, pero se limita a las palabras que ya existen en el búfer de texto actual. En el modo de inserción, usando la combinación de teclas CTRL+N obtienes la siguiente palabra en el búfer actual y CTRL+P la última. De cualquier manera, aparece un menú con palabras desde el que elige la palabra que se pegará en el texto en la posición actual del cursor del documento.

Una selección de palabras para elegir{.img-responsive}

Esto ya mola bastante. Afortunadamente, la misma característica existe para líneas enteras de texto. En el modo de inserción, presione CTRL+X primero, seguido de CTRL+L. Aparece un menú con líneas similares en las que puede elegir la línea que le gustaría pegar en el texto en la posición actual del cursor del documento.

Una selección de líneas a elegir{.img-responsive}

Para desarrollarse efectivamente en Python, Vim contiene un módulo estándar llamado pythoncompleto (Python Omni Completion). Para activar este complemento, agregue las siguientes dos líneas a su archivo de configuración de Vim .vimrc:

1
2
filetype plugin on
set omnifunc=syntaxcomplete#Complete

Luego, en la ventana del editor de Vim, la finalización funciona en modo de inserción en función de la combinación de teclas CTRL+X seguida de CTRL+O. Aparece un submenú que le ofrece funciones de Python y palabras clave para usar. Las entradas del menú se basan en las descripciones de los módulos de Python ("docstrings"). El siguiente ejemplo muestra la función abs() con ayuda adicional en la parte superior de la pantalla del editor vim.

Una selección de palabras clave para elegir{.img-responsive}

El siguiente complemento del que me gustaría hablar se llama Jedi-Vim. Conecta a Vim con la biblioteca de autocompletado jedi.

Habiendo instalado el paquete correspondiente en su sistema Debian GNU/Linux, necesita un paso adicional para que Jedi-Vim funcione. El complemento debe activarse utilizando el administrador de complementos Vim de la siguiente manera:

1
2
3
4
5
$ vim-addons install python-jedi
Info: installing removed addon 'python-jedi' to /home/frank/.vim
Info: Rebuilding tags since documentation has been modified ...
Processing /home/frank/.vim/doc/
Info: done.

A continuación, verifique el estado del complemento:

1
2
3
$ vim-addons status python-jedi
# Name                     User Status  System Status 
python-jedi                 installed     removed

Ahora el complemento está activado y puede usarlo en Vim mientras programa. Tan pronto como escriba un punto o presione CTRL+Espacio, el menú se abre y le muestra los nombres de métodos y operadores que podrían encajar. La siguiente imagen muestra las entradas correspondientes del módulo csv. Tan pronto como elija un elemento del menú, se pegará en su código fuente.

Jedi-Vim in action{.img-responsive}

Un plugin interactivo es tu me completas. Se describe a sí mismo como "un motor rápido de finalización de código de búsqueda difusa a medida que se escribe para Vim". Para Python 2 y 3, la finalización automática también se basa en Jedi. Entre otros lenguajes de programación, también es compatible con C#, Go, Rust y Java.

Provisto en un repositorio de Git, la configuración requiere pasos adicionales para poder usarlo. El paquete en Debian GNU/Linux viene con una versión compilada, y después de instalar el paquete a través de apt-get los [siguientes pasos](https://val.markovic.io/articles/youcompleteme-a-fast-as- you-type-fuzzy-search-code-completion-engine-for-vim) [hazlo funcionar](https://stackoverflow.com/questions/33982603/vim-youcompleteme-not-working-in-debian-jessie/ 34032417). Primero, habilite el paquete usando Vim Addon Manager (vam) o el comando vim-addons:

1
2
3
4
5
$ vim-addons install youcompleteme
Info: installing removed addon 'youcompleteme' to /home/frank/.vim
Info: Rebuilding tags since documentation has been modified ...
Processing /home/frank/.vim/doc/
Info: done.

A continuación, verifique el estado del complemento. El siguiente resultado muestra que el complemento se instaló correctamente para usted como usuario habitual:

1
2
3
$ vim-addons status youcompleteme
# Name                     User Status  System Status 
youcompleteme              installed    removed

Tercero, copie el archivo predeterminado ycm_extra_conf.py del directorio de ejemplos a su carpeta ~/.vim/ de la siguiente manera:

1
2
$ cp -v /usr/share/doc/vim-youcompleteme/examples/ycm_extra_conf.py .ycm_extra_conf.py
"/usr/share/doc/vim-youcompleteme/examples/ycm_extra_conf.py" -> ".ycm_extra_conf.py"

El paso final es agregar las siguientes dos líneas a su archivo .vimrc:

1
2
" youcompleteme
let g:ycm_global_ycm_extra_conf = "~/.vim/.ycm_extra_conf.py"

La primera línea es un comentario que podría omitirse, y la segunda línea define el archivo de configuración para el complemento youcompleteme. Y listo, ahora Vim acepta la finalización automática del código. Cuando vea que se ofrece una cadena de finalización útil, presione la tecla TAB para aceptarla. Esto inserta la cadena de finalización en la posición actual. Las pulsaciones repetidas de la tecla ‘TAB’ recorren las finalizaciones ofrecidas.

El complemento que me completas en acción{.img-responsive}

Resaltado de sintaxis

Vim ya viene con resaltado de sintaxis para una gran cantidad de lenguajes de programación que incluyen Python. Hay tres complementos que ayudan a mejorarlo: uno se llama sintaxis de Python, el otro es [modo python](https://vimawesome .com/plugin/python-mode), y el tercero es python.vim.

Entre otras, el sitio del proyecto python-syntax enumera una gran cantidad de mejoras, como el resaltado de excepciones, pruebas de documentos, errores y constantes. Una buena característica es el cambio entre el resaltado de sintaxis para Python 2 y 3 basado en un comando Vim adicional: :Python2Syntax y :Python3Syntax. Esto ayuda a identificar posibles cambios necesarios para ejecutar su secuencia de comandos con ambas versiones.

Cambiando entre Python 2 y 3{.img-responsive}

Combinación de Vim con el sistema de control de revisiones Git

El control de revisión es bastante esencial para los desarrolladores, y Git es probablemente el mejor sistema para eso. Al compilar el código de Python, el intérprete crea una serie de archivos temporales como __pycache__ y *.pyc. No es necesario realizar un seguimiento de los cambios de estos archivos en Git. Para ignorarlos, Git ofrece la característica de un archivo llamado .gitignore. Cree este archivo en su rama de desarrollo administrada por Git con el siguiente contenido:

1
2
*.pyc
__pycache__

Además, agregue un archivo README para que su proyecto documente de qué se trata. No importa cuán pequeño sea su proyecto, el archivo README lo ayuda a usted (y a otros) a recordar qué debe hacer el código. Escribir este archivo en formato Markdown es especialmente útil si sincroniza su código de Python con su repositorio en GitHub. El archivo README se procesa automáticamente en HTML que se puede ver fácilmente en su navegador web, entonces.

Vim puede colaborar con Git directamente usando complementos especiales. Entre otros están vim-fugitivo, gv.vim y vimagit. Todos ellos están disponibles en Github y, en su mayoría, como paquete para Debian GNU/Linux.

Habiendo descargado vim-fugitive a través de apt-get, debe activarse de manera similar a como se hizo antes con los otros complementos:

1
2
3
4
5
$ vim-addons install fugitive 
Info: installing removed addon 'fugitive' to /home/frank/.vim
Info: Rebuilding tags since documentation has been modified ...
Processing /home/frank/.vim/doc/
Info: done

Este complemento funciona solo con archivos que se rastrean con Git. Una gran cantidad de comandos adicionales de Vim están disponibles, como :Gedit, :Gdiff, :Gstatus, :Ggrep y :Glog. Como se indica en el sitio web del proyecto, estos comandos de Vim se corresponden con los siguientes comandos y acciones de Git:

  • :Gedit: edite un archivo en el índice y escríbalo para organizar los cambios
  • :Gread (git checkout -- filename): carga el contenido del archivo en el búfer actual
  • :Gwrite (git add): agrega el archivo a la lista de archivos rastreados actualmente
  • :Gdiff (git diff): muestre la versión preparada del archivo junto con la versión del árbol de trabajo y use las capacidades de manejo de diferencias de Vim para preparar un subconjunto de los cambios del archivo
  • :Gmove (git mv): Mover un archivo a una nueva ubicación
  • :Gstatus (git status): muestra el estado actual de su directorio Git
  • :Gcommit (git commit): confirma tus cambios
  • :Ggrep (git grep): busca el patrón dado en el repositorio de Git
  • :Glog (git log): carga todas las revisiones anteriores de un archivo en la lista de arreglos rápidos para que pueda iterar sobre ellas y ver cómo evoluciona el archivo.
  • :Gblame (git Blame): muestra quién hizo los últimos cambios en un archivo

Descubrir quién cambió qué línea de código usando \`:Gblame\`{.img-responsive}

Trabajar con esqueletos

Los archivos de esqueleto (o plantillas) son una buena característica de Vim que ayuda a mejorar su productividad al agregar texto predeterminado a un archivo cuando se crea uno nuevo. Por ejemplo, en muchos archivos de Python tendrá el asunto, la licencia, la cadena de documentación y la información del autor al principio del archivo. . Sería una molestia tener que escribir o incluso copiar esta información en cada archivo. En su lugar, puede usar archivos de esqueleto para agregar este texto predeterminado por usted.

Digamos, por ejemplo, que desea que todos los archivos nuevos de Python comiencen con el siguiente texto:

1
2
3
4
5
6
7
#!/user/bin/env python3
"""
[Add module documentation here]

Author: Frank
Date: [Add date here]
"""

Crearía un archivo con este contenido y lo llamaría algo así como "skeleton.py", y luego lo movería al directorio ~/.vim/skeleton.py. Para decirle a Vim qué archivo se debe usar como el archivo de esqueleto para Python, agregue lo siguiente a su archivo .vimrc:

1
au BufNewFile *.py 0r ~/.vim/skeleton.py

Esto le dice a Vim que use el archivo esqueleto especificado para todos los archivos nuevos que coincidan con el nombre de archivo "*.py".

Notas sobre el uso de complementos

Por lo general, Vim es bastante rápido. Cuantos más complementos active, más tiempo llevará. El inicio de Vim se retrasa y lleva mucho más tiempo que antes. Además, es común que los paquetes de Debian/Ubuntu funcionen de forma inmediata, y los scripts de instalación incluyen todos los pasos para configurar el complemento correctamente. Me di cuenta de que este no es el caso y, a veces, se requieren pasos adicionales.

Más recursos

Hay una serie de cursos y publicaciones de blog que cubren varias configuraciones de Vim para el uso diario como desarrollador de Python, que recomiendo consultar.

El siguiente curso tiene como objetivo que domines Vim en cualquier sistema operativo, ayudándote a obtener un nivel de conocimiento y comodidad con el editor que es difícil de lograr solo leyendo artículos:

El resto son excelentes recursos de toda la web que también hemos encontrado muy útiles:

Estos artículos ayudan a ampliar sus conocimientos. Disfrutar :)

Agradecimientos

El autor desea agradecer a Zoleka Hatitongwe por su ayuda y comentarios críticos mientras preparaba el artículo.