Aprendiendo Vim

Hubo un momento en mi carrera profesional en la que un compañero me dió a conocer Vim, el editor de código. Me pareció una herramienta arcaica, básica. Línea de comandos, nada de modo gráfico. ¿Pero dónde estaba? ¿En los años 80?. Pero la pasión con la que hablaba del editor mi picaba la curiosidad.

Luego, en años venideros, he visto y usado muchos editores de texto, de código e incluso IDEs. Nunca me había atrevido a usar Vim, pero de vez en cuando escuchaba (de la forma que se escucha en internet: twitter, blogs, …) algunas campanadas de que Vim era un súper editor.

Pero nunca me decidía a darle una oportunidad, hasta…

Hasta que cayó un post de Pablo Bernardo en mi lector RSS: Asi que quieres aprender a usar Vim.

En este post, Pablo detalla toda una serie de recursos disponibles en la nube y no sé porqué, pero me tocó la fibra sensible. Y decidí empezar por uno de los videos.

El video en cuestión, es un hangout de LinuxIO, de Desarrollo Web, y que se titula “El mítico editor Vim”. Este video fue el detonante de que decidiera darle una oportunidad a Vim, una oportunidad seria. Así que decidí comenzar a aprenderlo.

La idea es que este post no se acabe aquí, si no que vaya creciendo con el tiempo, que vaya actualizandolo según voy consumiendo los recursos que indica Pablo, y los que me encuentre por el camino. Para cada uno de ellos me gustaría ir describiendo qué es lo que he aprendido de él.

De esta forma, según vaya pasando el tiempo, aquí tendré el camino recorrido, y así otros podrán saber cómo lo recorrí para aprender Vim.

Recursos para aprender

El mítico editor Vim, #linuxIO

Miguel Luis González y Pablo nos presentan El mítico editor Vim. Miguel pone tanta pasión, tanto conocimiento, que impresiona. Este es el video que me convenció. Y éste es un resumen de lo que aprendí de él (y estoy poniendo en práctica escribiendo este post :D ).

(12-10-2014) Vim sobre Linux, comandos avanzados y plugins

Miguel y Pablo siguen hablando de Vim, de comandos avanzados y plugins, temas más avanzados que en el anterior vídeo, pero con el mismo tono alegre y pasión. Esto es lo que aprendí en él:

Plugin NERDTree. Con CTRL + w se entra en un modo para poder moverse por las ventanas (windows). Se pueden utilizar las teclas de movimiento h, j, k, l para moverse por los ficheros que muestra el plugin en forma de árbol.

Se puede utiliar Vim como una herramienta para comparar ficheros. El comando unix vimdiff abre Vim con dos ficheros para compararlos.

Toda la configuración de Vim se guarda en el directorio ~/.vim. Los plugins se guardan en ~/.vim/plugin y los ficheros de ayuda en ~/.vim/doc. Configuraciones de teclas, colores, indentación y otras se guardan en el fichero ~/.vimrc.

Plugin Command-T. Para abrir ficheros con las teclas CTRL + t. Parecido a la misma funcionalidad de TextMate o Sublime. Al parecer necesita Ruby, así que la instalación quizá no sea muy sencilla.

(12-10-2014) Derek Wyatt: Basic movements II

El primer video de Derek decidí saltármelo, ya que todos los comandos estarían cubiertos con los videos de #LinuxIO. En el de Movimientos básicos II aprendí lo siguiente:

(12-10-2014) Derek Wyatt: Basic movements III

En el video de Movimientos básicos III ya no podían quedar muchos más movimientos que aprender, y la verdad es que los que aquí aparecen son ya movimientos un poco más extraños, aunque no por eso dejan de ser útiles.

El plugin matchit amplía la funcionalidad del comando % (que movía el cursor hasta el siguiente carácter complementario: de ( a ), de [ a ], …).

:help marks para conocer acerca de marcadores. No los suelo utilizar en mi día a día, pero no está de más saber que existen.

(13-10-2014) Derek Wyatt: basic editing I

No es que aprendiera mucho en el video de Edición básica de Derek, pero la mayoría de comandos ya estaban cubiertos con los videos de #LinuxIO.

El comando :set cpoptions+=$ configura una funcionalidad adicional para el comando c (cambiar). Lo que hace es que aparezca el carácter $ al final del texto que se va a cambiar.

(13-10-2104) Derek Wyatt: basic editing II

No hay gran cosa que destacar en el video de Edición básica II.

(13-10-2014) Derek Wyatt: working with many files I

En el episodio de Múltiples ficheros I aprendí un manejo básico de buffers, es decir, manejar varios ficheros a la vez.

(13-10-2014) Derek Wyatt: working with many files II

El episodio de Múltiples ficheros II sigue enseñándome a manejar varios buffers o ficheros a la vez.

Todos estos comandos son potentes si se usa una sola sesión de Vim, y son inútiles si tienes abiertos N Vims con N ficheros. Así que recuerda: una sola sesión de Vim.

(13-10-2014) Derek Wyatt: working with many files III

En el último episodio sobre múltiples ficheros hay más y más comandos que aprender, a cual más útil.

(14-10-2014) Derek Wyatt: how to use the help system

Para aprender acerca de cómo usar la ayuda este video es lo mejor, aquí va un resumen:

(23-10-2014) Derek Wyatt: Vim runtime y el fichero .vimrc

Sigo aprendiendo Vim con este tío, esta vez sobre el fichero de configuración .vimrc y el runtime:

(24-10-2014) Derek Wyatt: Vim modes introduction

Los modos es la característica que diferencia a Vim (sobre todo de emacs, su eterno enemigo), y ya iba siendo hora de apreder sobre ellos. Los modos de Vim son: normal, visual, inserción, comando y ¿¡ejecución!?, así que aquí va una introducción a los modos de Vim:

(28-10-2014) Derek Wyatt: Insert mode

En este video Derek profundiza en uno de los modos importantes de Vim, el modo de inserción, en el cual podemos usar autocompletado, indentar líneas y muchas cosas más.

(02-11-2014) Derek Wyatt: One Vim… just one

Es cortito video acerca de mantener una y solo una sesión de Vim se enfoca en solamente un comando de la shell:

gvim --remote-silent

Este sencillo comando nos permite abrir varios ficheros en una única sesión gráfica de vim.

Tal y como dicen los comentarios del vídeo, este comando solamente funciona por defecto en la interfaz gráfica de Vim, no en la versión de Vim que se ejecuta en la línea de comandos.

(02-11-2014) Derek Wyatt: Destruction is good

En este video Derek muestra cómo utilizar comandos destructivos para editar el contenido que queremos.

Comandos utilizados:

(24-11-2014) Derek Wyatt: Using a Vim macro to edit many files

Y después de un tiempo sin ver nada nuevo de Vim, hoy toca ver cómo se puede utilizar una macro para editar varios ficheros, del cual, se pueden sacar los siguientes macros y consejos:

(08-01-2015) Derek Wyatt: Vim macros and global commands

Sigo aprendiendo cosas sobre Vim, esta vez sigo con macros en Vim y comandos globales. Estos son los comandos y nuevos consejos que aprendí:

(08-01-2015) Derek Wyatt: Vim expression register

Una vez acabados los vídeos de nivel intermedio, toca comenzar con los de nivel avanzado. Comienzo con el registro de expresiones. ¿Qué es? ¿Para qué sirve? En el vídeo lo descubro:

(18-01-2015) Derek Wyatt: Vim autocomands

Siguiendo con vídeos de nivel avanzado, esta vez toca auto comandos. Parece una funcionalidad super útil de Vim. Es una funcionalidad donde puedes configurar Vim para que realice los comandos que quieras cuando ocurra algún evento: por ejemplo, cuando se guarda un fichero en disco, o cuando se mueva el cursor. El vídeo está disponible en Autocomandos, y es muy cortito, que no te de pereza.

(18-01-2015) Derek Wyatt: Find command and the path

El vídeo anterior era realmente corto, y solamente saqué en claro un comando para Vim, :autocmd, pero para su uso es necesario de tener funciones u otros comandos para que realmente haga algo.

Así pues, el siguiente es Find command and the Path para aprender a buscar ficheros y cargarlos para su edición.

(Marzo 2015) Comando set statusline

Esta vez no tengo nada de ningún video, pero es igualmente interesante. Mediante el comando set statusline se puede configurar la apariencia de la barra de estado de Vim. Existen muchos símbolos (por llamarlos de alguna manera) que a modo de función printf pueden ser sustituidos por diversos campos dentro del editor: nombre del fichero, número de línea, codificación del fichero,…

A partir de esta pregunta en Stack Overflow encontré el fichero de configuración de sk1418 en el cual me basé para crearme mi propia configuarción de la barra de estado:

set laststatus =2 " always show status bar
set statusline=%<%f%h%m%r%=%b\ 0x%B\ \ %l,%c%V\ %p\ %P

La cual me muestra:

(Mayo 2015) Why, oh why, do those #?@! nutheads use vi?

Después de un cierto tiempo, tropecé con éste post, del cual extraje algún que otro comando que no conocía todavía. Y no solo comandos, sino secuencias de ellos que me permiten realizar tareas muy comunes en el desarrollo de software.

Extraer una variable

if (!entry.used && equivalent(entry.key(), qk.key) && (curcontext & entry.contexts)) {
    // do something
}

Situar el cursor al principio de equivalent y teclear el comando c%:

if (!entry.used && <cursor will be here> && (curcontext & entry.contexts)) {
    // do something
}

Resulta que eso corta el texto equivalent(entry.key(), qk.key) y entra en modo edición. Luego puedo escribir el nombre de la variable, cambiar a modo normal y pulsar O para insertar una línea arriba:

<cursor here>
if (!entry.used && equiv && (curcontext & entry.contexts)) {
    // do something
}

Luego, puedo declarar la variable, y pegar lo que hay en el portapapeles con CTRL + R:

bool equiv = equivalent(entry.key(), qk.key);
if (!entry.used && equiv && (curcontext & entry.contexts)) {
    // do something
}

(Junio 2015) A casual introduction to Vim on Windows

Por casualidad encontré este vídeo de Roy Osherove, donde habla acerca de Vim (en Windows, aunque el sistema operativo tiene poca influencia para el nivel que Roy nos cuenta). No aprendí ningún comando nuevo, porque Roy habla de comandos básicos, para comenzar a usar Vim, pero creo que el vídeo es un recurso esencial para el aprendizaje de Vim, por lo que lo enlazo aquí.

(Julio 2015) Contar palabras

De repente, escribiendo un post para este blog, me pregunté: ¿Será muy largo el post?, ¿Cuántas palabras habrá?. Tampoco tengo claro cuantas palabras hacen que un post sea largo, pero bueno, tenía curiosidad por saber cuántas palabras había en el post.

El problema es que escribí el post en Windows. Si hubiera estado en Linux, las hubiera contado con wc -w. Estaba en Vim, y decidí buscar algún plugin que contara las palabras por mí. En lugar de eso, encontré un comando:

(Julio 2015) Mastering the Vim language, Chris Toomey

Algunos plugins

Text objects personalizados

(Agosto 2015) Let Vim do the typing, by George Brocklehurst

(29-08-2015) Derek Wyatt: Globals, commands and functions

El último vídeo de Derek, de su lista de vídeos para aprender Vim. Este vídeo se titula Globals, commands and functions, y estas son las notas que tomé mientras lo estuve viendo:

(Septiembre 2015) My first Vim plugin, de Chris Toomey

En la charla My first Vim plugin aprenderemos a crear plugins para Vim. No te asustes, no es para tanto. También aprenderemos a crear funciones que se puedan llamar desde la línea de comandos de Vim, éste es el inicio de cualquier plugin.

nnoremap <leader>sp :normal! mm]s1z=`m<cr>
# no olvidar <cr> al final, es como pulsar <enter>

Lo que hace es asignar la sequencia de comandos <leader>sp para que ejecute el comando que hemos estado hablando. Y qué tecla es <leader>? Dice que normalemente es \, pero que él la tiene mapeada a <spacebar>. Otra gente la suele tener mapeada a la coma.

Ahora, lo englobamos en una función:

function! FixLastSpellingError() {
    normal! mm]s1z=`m
}
nnoremap <leader>sp :call FixLastSpellingError

Plugins