some awesome vim plugins

Mi fichero de configuración de Vim siempre está cambiando. Vim es tan flexible y potente, y los autores de plugins tan productivos, que de vez en cuando dedico un par de horas a añadir nuevos plugins y trucos a mi fichero de configuración. En este artículo voy a comentar algunos de los mejores plugins que uso e intentaré explicar porque los considero tan buenos.

(Nota: pincha en las imágenes para verlas a tamaño completo)

CtrlP

Si, como yo, normalmente trabajas con proyectos con muchos ficheros fuente distintos y sueles terminar con muchos buffers abiertos este plugin te dará un incremento brutal de productividad. Una vez que has asignado los atajos a las diferentes funciones serás capaz de buscar distintas de forma incremental y en tiempo real (según vamos escribiendo va elimiando resultados) entre:

  • Ficheros en el directorio raíz o cualquier subdirectorio
  • Buffers abiertos
  • Ficheros recientemente usados
  • Etiquetas

Tal y como se describe, no parece gran cosa, pero es increíble el tiempo que este plugin te ahorra con respecto a los viejos métodos de buscar ficheros con el explorador (dentro o fuera de Vim) o buscar en la lista de buffers y cambiar a uno específico seleccionándolo con el teclado o un número. Yo uso mucho las sesiones de Vim para guardar las listas de ficheros abiertos, pero al final es muy común tener que abrir algún fichero más, buscarlo por el árbol de directorios, etc. Con CtrlP, sólo tienes que pulsar el atajo, empezar a escribir parte del nombre del fichero o buffer que quieres abrir, y con unas pocas pulsaciones lo tendrás seleccionado. Hay que probarlo. Y combinado con el plugin “Project” que comentaré en el siguiente punto, que puede usarse para abrir el resto de ficheros que no estén en a lista de buffers abiertos o ficheros recientes, el incremento de productividad es absurdo.

Hay otro plugin parecido para Vim llamado Command-T, pero necesita un Vim compilado con Ruby; CtrlP está implentado en puro vimscript por lo que va a funcionar con cualquier versión de Vim (como las que suele haber en servidores o los paquetes instalables de Windows).

Los modos de CtrlP que uso con más frecuencia son “MRU” (ficheros recientes) que se saca con el comando “:CtrlPMRUFiles” y “Buffers” (:CtrlPBuffer). El modo “ficheros” (:CtrlP) es útil si todos los ficheros con los que estás trabajando tienen un directorio raíz común, lo cual suele ser el caso con mis proyectos personales pero no con mis proyectos en el trabajo porque generalmente tengo abiertos ficheros de distintos módulos que están en distintos directorios. A veces también uso el :CtrlBufTagAll (necesitas tener el exhuberant-ctags instalado) que te permite buscar entre los símbolos (clases, funciones, etc) de todos los buffers abiertos.

El modo de búsqueda MRU a veces puede ser lento cuando la lista de ficheros recientes (configurable) es grande. Yo arreglé este problema activando unas opciones de cacheo que CtrlP.

En resumen, CtrlP ha sustituído en mi .vimrc ha varios plugins que usaba anteriormente (pero eran peores) para las funcionalidades de ficheros recientes, buffers y ficheros. Por la facilidad de cambiar entre buffers también he usado prácticamente de usar pestañas salvo cuando quiero ver dos buffers lado a lado.

Project

Si has usado algún IDE gráfico tipo Visual Studio o Eclipse seguramente has visto la típica barra lateral de “proyecto” con un árbol de nodos extensibles representando directorios y ficheros. Estas barras laterales son muy útiles cuando se quieren tener los ficheros del proyecto lógicamente agrupados y a un click o dos de poder abrir cualquiera de ellos. Nosotros, los usuarios [superiores y condescendientes ;)] de Vim, no clickeamos, pero eso no quiere decir que no podamos encontrar algunas ideas de los IDEs interesantes.

El plugin Project proporciona exactamente eso, una barra lateral donde podemos ver todos los ficheros fuente de uno o más proyectos agrupados en folds extensibles que se corresponderan con los subdirectorios de cada proyecto, de modo que sólo tengamos que poner el cursor sobre el fichero (o buscar con “/") y pulsar intro para abrirlo en un buffer nuevo.

Tras leer la sección anterior se podría pensar que con un pugin como CtrlP este tipo de barras laterales quedan obsoletas, pero aunque es cierto que el atajo para sacar la barra de Project lo he estado usando mucho menos desde que uso CtrlP, aún es muy útil porque te permite abrir todos los ficheros de un proecto o parte del mismo rápidamente cuando estás empezando a trabajar (usando “\l” sobre el fold) o hacer búsquedas entre los ficheros de un proyecto ("\G"). También, dado que se pueden meter en la barra todos los proyectos que queramos a la vez, es muy útil cuando queremos abrir varios ficheros de distintos proyectos.

Project.vim tiene muchas funcionalidades, de modo que recomiendo darle un vistazo rápido a la documentación para aprender a usarlo bien.

TagBar

TagBar proporciona otra típica funcionalidad de los IDEs gráficos los cuales suelen tener una barra lateral donde se pueden ver todos los símbolos del fichero actual (clases, métodos, funciones, variables, etc). Esto no sólo es útil para saltar a un símbolo rápidamente, sino que también permite ver rápidamente la estructura lógica interna del fichero fuente.

TagBar proporciona exactamente eso, una lista navegable de los símbolos del buffer actual a los que se puede saltar moviendo el cursor y pulsando intro. Como sucede con otros plugins, CtrlP ha reducido el número de veces que uso este plugin porque ahora uso el atajo de :CtrlPbufTagAll para buscar en tiempo real entre los símbolos de todos los buffers abiertos y saltar a un tag particular, pero a veces está bien ver todos los símbolos del buffer de forma estructurada (especialmetne si no somos el autor o lo somos pero hace mucho que lo escribimos) y recordar algún nombre de símbolo que se nos ha ido de la cabeza (ahí CtrlP no nos puede ayudar).

SnipMate

SnipMate proporciona una funcionalidad tomada del editor de texto TextMate. La idea es simple, escribes un pequeño fragmento de texto predeterminado, pulsas la tecla Tab y el editor autocompleta ese fragmento a una plantilla completa.

Por ejemplo, para obtener una plantilla de clase en Python, escribiríamos “cl”, pulsaríamos Tab y se autocompletaría a:

class ClassName(object):
    """docstring for ClassName"""
    def __init__(self, arg):
        super(ClassName, self).__init__()
        self.arg = arg

Ahora, pulsando de nuevo Tab hará que el cursor se mueva a tres partes “variables” de la plantilla de modo que podamos completarlas; en el ejemplo de la clase Python las partes serían “ClassName” para el nombre de la clase, “object” para la clase padre, “docstring…” para la documentación de la clase, los argumentos de __init__ y la llamada a super(). Además si cambiamos los argumentos de init veremos como también se actualiza el contenido del método para poner un “self.arg = arg” por cada “arg” que pongamos, una operación muy común en Python para inicializar datos miembro en el constructor. Después, lógicamente, podremos cambiar el código de la clase como queramos.

SnipMate incluye varias plantillas para distintos lenguajes de programación y algunas comunes a todos (como “date” para escribir la fecha actual). Es muy fácil aprender a definir nuevas plantillas simplemente viendo el código de las existentes.

Powerline

Powerline mejora la barra de estado inferior de Vim (la que pone el modo, fichero, tipo, codificación, número de línea, columna y demás) haciendo que cambie de color y formato dependiendo del modo de edición que esté activo (y además tiene formatos y colores especiales cuando estamos usando CtrlP o TagBar) y también reorganiza la información de una forma más clara e intuitiva. También, si se parchean las fuentes que usa Vim con un script incluído en el plugin, usará algunos carácteres pseudográficos para hacer una distinción más clara (y agradable a la vista) entre las distintas partes de la barra (pincha en la captura para verlo mejor). Por desgracia el script de parcheado de fuentes sólo parece funcionar en Linux y Mac (si me equivoco dímelo en los comentarios).

Nerd Commenter

Nerd Commenter te permite comentar o descomentar líneas o secciones de código (previamente seleccionadas en modo visual). Esto no parece muy notable, pero la cosa está en que Nerd Commenter entiende muchísimos lenguajes de programación distintos y la forma en la que el código se comenta en cada uno de ellos. Con algunos lenguajes donde es un poco peñazo comentar como HTML, XML, o templates de Django, esto ahorra bastante tiempo.

YankRing

Este plugin mejora el sistema de copiar y pegar de Vim (llamado yanking) con un “portapapeles” fácil de usar y persistente entre distintas sesiones donde se puede seleccionar con facilidad el registro que queremos activar para pegar de los previamente copiados o cortados. Dado que Vim pone automáticamente todo texto que borremos en la lista de registros, a veces es complicado dar con el registro que queremos; con este plugin eso ya no pasa. Es como una versión en esteroides del comando “:registers” de Vim.

Contents