VIM – Editor de Texto

Introducción

Parece ser que el editor de texto más famoso hoy en dia es Visual Code Studio. Personalmente no me gusta, me parece que se siente innecesariamente pesado. Creo que no fue una buena decisión por parte de los desarrolladores el usar electron, no se si se necesite todo un navegador para un editor de texto. Existen otras alternativas, una de la que más me gusta es Sublime Text, pero es de pago. De las Open Source, no veo ninguna que me parezca suficientemente satisfactoria.

Vim tiene como ventaja que se puede usar directamente desde la terminal, por lo que se puede usar directamente desde servidores remotos de manera muy fácil, es minimalista, tiene muchísimos plugins y es ligero. Por eso elijo el editor de Bram Moolenaar sobre cualquier otra alternativa. Además es interesante su licencia de charityware

MacVim

Vim es un editor de texto que tradicionalmente se utiliza dentro de una termina. Sin embargo, existen alternativas que permiten ejecutarlo como una aplicación independiente, con su propia ventana gráfica, sin necesidad de abrir antes una terminal. MacVim es una de las más populares en macOS: conserva intacto el motor y el comportamiento de Vim, pero lo envuelve en una interfaz nativa del sistema.

Me gusta MacVim precisamente por esa integración con el entorno gráfico. Puedo abrir archivos directamente desde el Finder haciendo doble clic o arrastrándolos sobre el icono de la aplicación, asociar ciertos tipos de archivo para que se abran con él por defecto, y aprovechar comodidades propias del sistema, como los menús, el portapapeles compartido o el desplazamiento con el ratón, sin renunciar a los atajos y modos de edición que hacen a Vim tan eficiente.

Es cierto que también podría conseguir un comportamiento parecido desde la terminal mediante un pequeño script que lanzara Vim con el archivo deseado. Aun así, prefiero tener las aplicaciones bien separadas: la terminal para sus tareas y el editor en su propia ventana. Esta separación me aporta más orden, hace el flujo de trabajo más claro y me permite tratar cada herramienta según su propósito, sin mezclar contextos.

Temas

En Vim, los temas se aplican mediante el comando colorscheme. Un colorscheme es un conjunto de definiciones que establece los colores del texto, el fondo y el resaltado sintáctico de los distintos elementos. Para listar los esquemas disponibles actualmente en Vim, escribe lo siguiente en el modo de línea de comandos:

:echo globpath(&rtp, "colors/*.vim")

Instalar temas

Para instalar un tema, basta con copiar su archivo en la carpeta .vim/colors. Cada tema es un archivo de texto con extensión .vim. En este momento estoy usando el tema paper, que obtuve de este repositorio.

Una vez copiado el archivo, puedes activar el tema de forma temporal con:

:colorscheme paper

Para que el cambio sea permanente, añade ese mismo comando a tu archivo .vimrc.

Plugins

Vim carga los plugins basándose en una variable llamada runtimepath (abreviada rtp), que no es más que una lista de directorios donde el editor busca scripts de configuración, plugins, documentación, sintaxis y demás. Al arrancar, Vim recorre cada uno de esos directorios y carga automáticamente ciertos archivos según una estructura de carpetas estándar dentro de ~/.vim/:

~/.vim/
├── plugin/        ← scripts que se cargan siempre al inicio
├── autoload/      ← funciones que se cargan solo cuando se invocan
├── ftplugin/      ← scripts según el tipo de archivo (filetype)
├── syntax/        ← reglas de resaltado de sintaxis
├── doc/           ← documentación de ayuda
└── colors/        ← esquemas de color

Cualquier archivo .vim que se coloque en ~/.vim/plugin/, por ejemplo, se ejecutará automáticamente cada vez que se abra el editor. Ese es el mecanismo base, y es el mismo que hace funcionar a los temas descritos en la sección anterior.

Instalación manual

Para instalar un plugin de forma manual hay que copiar los archivos en las carpetas correspondientes dentro de ~/.vim/. Si un plugin trae un archivo en plugin/, otro en autoload/ y otro en doc/, hay que poner cada parte en su carpeta. Esto produce que con muchos plugins instalados, archivos de diferentes plugins se mezclan en los mismos directorios, provocande que actualizar o desinstalar sea una tarea tediosa.

El sistema nativo de paquetes

Desde Vim 8 existe un sistema nativo de paquetes que ya no necesita ningún gestor externo. Funciona con esta estructura:

~/.vim/pack/cualquier-nombre/
├── start/      ← plugins que se cargan automáticamente al inicio
│   ├── nerdtree/
│   └── vim-fugitive/
└── opt/        ← plugins que se cargan bajo demanda con :packadd
    └── algun-plugin/

Aquí cada plugin vive en su propia carpeta, normalmente clonada con git, lo que resuelve el problema de los archivos mezclados. Instalar un plugin es tan sencillo como clonarlo dentro de start:

cd ~/.vim/pack/mis-plugins/start
git clone https://github.com/preservim/nerdtree

Desinstalarlo es solo borrar esa carpeta, y para actualizarlo basta con hacer git pull dentro de ella.

vim-plug

vim-plug es uno de los gestores más populares, es un único archivo de script (plug.vim), muy ligero, que instala los plugins en paralelo y permite cargarlos de forma perezosa solo cuando se necesitan, mejorando el tiempo de arranque.

Con vim-plug, los plugins se declaran en el archivo .vimrc dentro de un bloque, en lugar de gestionarlos a mano:

call plug#begin('~/.vim/plugged')

Plug 'tpope/vim-fugitive'
Plug 'preservim/nerdtree'

call plug#end()

Lo que hace call plug#end() es registrar cada plugin y añadir su carpeta al runtimepath, de modo que Vim sepa que existen; no los descarga, pues para ello hay que ejecutar :PlugInstall y que los archivos estén ya en ~/.vim/plugged/. Tal como está escrito, todos los plugins se registran durante el arranque, sin carga perezosa.

La directiva Plug admite, sin embargo, varias maneras de controlar cuándo se carga cada plugin. En su forma más simple solo recibe el repositorio, pero acepta opciones adicionales entre llaves:

" Forma básica: se registra al iniciar Vim
Plug 'tpope/vim-fugitive'

" Carga diferida hasta usar un comando concreto
Plug 'preservim/nerdtree', { 'on': 'NERDTreeToggle' }

" Carga diferida hasta abrir cierto tipo de archivo
Plug 'fatih/vim-go', { 'for': 'go' }

" Fijar una rama, etiqueta o commit del repositorio
Plug 'nsf/gocode', { 'branch': 'master' }
Plug 'fatih/vim-go', { 'tag': '*' }

También es posible apuntar a un directorio local en lugar de a un repositorio remoto:

" Instalar desde un directorio local en lugar de un repositorio remoto
Plug '~/mis-plugins/plugin-propio'

Este último caso merece una aclaración, cuando se pasa una ruta local a Plug, el plugin no se copia ni se clona en ningún sitio: vim-plug se limita a añadir ese directorio tal cual al runtimepath, de modo que el plugin se usa directamente desde la carpeta donde ya está. Por eso :PlugInstall y :PlugUpdate lo ignoran, pues no hay nada que descargar ni actualizar desde un repositorio remoto. Esta forma resulta especialmente útil al desarrollar un plugin propio: basta con editar los archivos en el directorio de trabajo y reiniciar Vim para probar los cambios, sin pasos intermedios de instalación. Conviene distinguirla de la forma habitual Plug 'usuario/repo', donde el repositorio remoto sí se clona dentro de ~/.vim/plugged/ como una copia que gestiona vim-plug, mientras que la ruta local deja intacta la carpeta original.

Además, desde el modo de linea de comandos de Vim, se tienen las siguientes instrucciones:

  • :PlugInstall instala los plugins de la lista
  • :PlugUpdate los actualiza todos a la vez
  • :PlugClean elimina los que ya no figuran en la lista
  • :PlugStatus muestra su estado En resumen, sin gestor uno mismo hace el trabajo de git y de ordenar las carpetas; con vim-plug basta con declarar la lista de plugins en la configuración y el gestor se ocupa de lo demás. Es un buen ejemplo del espíritu de Vim: una base minimalista que se puede usar tal cual o ampliar tanto como uno quiera.

Plugin que tengo en mi editor

A continuación una tabla con los plugins que uso

Plugin Descripción Link Repositorio
preservim/nerdtree Explorador de archivos Link
KabbAmine/vCoolor.vim Selector de Colores Link