Las macros en Vim son una gran herramienta para ahorrarnos tiempo en tareas repetitivas

Con las macros podremos guardar una serie de comandos que nosotros introducimos y que se vuelven a repetir cuando los necesitemos.
Veamos cómo utilizar las macros en Vim para ahorrarnos un trabajo tedioso. En este caso, voy a poner un ejemplo propio de cómo las macros me han hecho «el trabajo sucio».
Este artículo es una nueva entrega del curso “improVIMsado” que desde hace meses vengo publicando en mi blog sobre el editor Vim y que puedes seguir en estos enlaces:
Y para aprender Vim (de la manera más inteligente) aquí tienes esta útil guía:
Las macros en Vim nos sirven para almacenar una serie de comandos que realizan una acción y después poder ejecutar la misma secuencia de comandos una y otra vez sin necesidad de tenerlos que escribir todas las veces lo mismo.
Os aconsejo leer el capítulo relacionado con las macros de la Guía para aprender Vim de la manera más inteligente:
Voy a poner un caso en concreto. Tenía un archivo con un montón de enlaces en formato html que tenían este aspecto:
<li><a href="https://victorhckinthefreeworld.com/2017/06/14/como-salir-del-editor-vim/">Cómo salir del editor Vim</a></li>
<li><a href="https://victorhckinthefreeworld.com/2018/09/20/mejora-tu-experiencia-usando-el-editor-vim/">Mejora tu experiencia usando el editor Vim</a></li>
<li><a href="https://victorhckinthefreeworld.com/2019/03/05/vim-gitgutter-plugin-vim-git/">vim-gitgutter es el plugin que necesitas si usas el editor Vim para trabajar con Git</a></li>
<li><a href="https://victorhckinthefreeworld.com/2019/03/13/dando-mis-primeros-pasos-con-el-editor-vim/">Dando mis primeros pasos con el editor Vim</a></li>
<li><a href="https://victorhckinthefreeworld.com/2019/03/14/usando-el-editor-vim-para-manejar-listas-todo-de-tareas/">Usando Vim para manejar listas .todo de tareas</a></li>
<li><a href="https://victorhckinthefreeworld.com/2019/03/28/el-editor-kate-de-kde-en-modo-vim/">El editor Kate de KDE en modo Vim</a></li>
<li><a href="https://victorhckinthefreeworld.com/2019/04/02/usando-abreviaturas-en-el-editor-vim/">Usando abreviaturas en el editor Vim</a></li>
<li><a href="https://victorhckinthefreeworld.com/2019/04/10/utilizar-pestanas-en-el-editor-vim/">Utilizar pestañas en el editor Vim</a></li>
<li><a href="https://victorhckinthefreeworld.com/2019/04/17/atajos-de-teclado-de-vim-terminal-gnu-linux/">Atajos de teclado de Vim en nuestra terminal de GNU/Linux</a></li>
Y como esos, una buena lista de muchos otros enlaces más. Y quería convertir esos enlaces en una lista de enlaces pero con formato Markdown. Para que tengan este aspecto:
* [Cómo salir del editor Vim](https://victorhckinthefreeworld.com/2017/06/14/como-salir-del-editor-vim/)
* [Mejora tu experiencia usando el editor Vim](https://victorhckinthefreeworld.com/2018/09/20/mejora-tu-experiencia-usando-el-editor-vim/)
* [vim-gitgutter es el plugin que necesitas si usas el editor Vim para trabajar con Git](https://victorhckinthefreeworld.com/2019/03/05/vim-gitgutter-plugin-vim-git/)
* [Dando mis primeros pasos con el editor Vim](https://victorhckinthefreeworld.com/2019/03/13/dando-mis-primeros-pasos-con-el-editor-vim/)
* [Usando Vim para manejar listas .todo de tareas](https://victorhckinthefreeworld.com/2019/03/14/usando-el-editor-vim-para-manejar-listas-todo-de-tareas/)
* [El editor Kate de KDE en modo Vim](https://victorhckinthefreeworld.com/2019/03/28/el-editor-kate-de-kde-en-modo-vim/)
* [Usando abreviaturas en el editor Vim](https://victorhckinthefreeworld.com/2019/04/02/usando-abreviaturas-en-el-editor-vim/)
* [Utilizar pestañas en el editor Vim](https://victorhckinthefreeworld.com/2019/04/10/utilizar-pestanas-en-el-editor-vim/)
* [Atajos de teclado de Vim en nuestra terminal de GNU/Linux](https://victorhckinthefreeworld.com/2019/04/17/atajos-de-teclado-de-vim-terminal-gnu-linux/)
Claro, editar una línea o cinco, no sería mucho trabajo, pero si ya son 30 o más, eso se puede hacer muy pesado. Menos mal que las macros de Vim, nos permiten hacerlo una vez (y hacerlo bien) y poder replicarlo una, diez o cien veces.
Cómo grabar y ejecutar una macro
Las macros se guardan en registros que son las letras del alfabeto. Es decir, tienes la posibilidad de grabar una macro desde la «a» a la «z».
Para grabar una macro en Vim, estando en modo normal, pulsamos la letra q para empezar a grabar la macro y una letra, por ejemplo la a para que se grabe la macro en ese registro. Algo así:
q a
Verás que en la parte inferior derecha de la pantalla aparecerá el texto:
grabando @a
Ahora es la hora de empezar a ejecutar las ordenes que queramos/necesitemos y todas esas acciones se quedarán guardadas en el registro de la macro.
Finalizamos la grabación de la macro volviendo a pulsar la letra q. Cuando hayamos terminado, podremos volver a ejecutar la macro con:
@a
En este caso la a porque hemos utilizado este registro para guardar la macro, si has utilizado otro, sería otra letra.
También podremos ejecutar @@ y nos ejecutará la última macro ejecutada (en este caso de nuevo ejecutará la macro a)
Si al ejecutar la macro, vemos que ha realizado la acción correctamente, podremos ya desplegarla para que la haga las veces que quiera, por ejemplo podremos ejecutar la macro 30 veces mediante:
30 @ a
La macro se ejecutará 30 veces o se parará antes si encuentra un error, eso es útil para que la macro se detenga cuando la acción que ejecuta no es la esperada.
Si la acción que ejecuta no es lo que esperamos, podremos volver a grabarla de nuevo, ejecutando esta vez los comandos correctos, en el mismo registro.
Modificar una macro
En vez de volver a escribir de nuevo la macro y guardarla en el mismo registro, podremos depurar las partes que no funcionan de la macro editándola y añadiendo acciones o modificando las partes que deseemos.
Podremos añadir acciones al final de la macro mediante, para eso en vez de utilizar la letra minúscula (en nuestro ejemplo la a) utilizaremos la misma letra pero en mayúscula (en nuestro ejemplo la A).
Simplemente escribiremos qA y los nuevos comandos que queramos que se añadan al final de la macro.
Pero también podremos modificar una macro, no solo añadiendo comandos al final de la macro, si no, modificar partes intermedias de la macro. Cabe resaltar, que deberemos conocer ciertos comandos internos de Vim a la hora de ver cómo se ejcutan internamente comandos como Esc u otros.
- pegamos el contenido de la macro (en nuestro caso la a) con: put a
- Veremos el contenido de la macro
- Modificamos las partes que deseamos
- Guardamos el contenido de la nueva macro, situándonos al inicio de la línea y ejecutando: «ay$
Ahora al ejecutar la macro a, debería realizar nuevas funciones, según lo que hayamos modificado. Podemos ver el contenido de una macro ejecutando el comando
:reg a
Ejemplo práctico
En mi caso, como he dicho, quería cambiar todos los enlaces de html a markdown. Para ello he ejectuado comandos de Vim, he ejecutado complementos de Vim, etc. Veamos cómo:
- Lo primero, llevo el cursor al inicio de la línea (0)
- Quito el sangrado de la línea (<<)
- Elimino la etiqueta
<li> </li>
con el complemento surround (dst) - Copio el texto del enlace que hay entre las comillas (yi»)
- Borro la etiqueta a href y me queda solo el texto del texto del enlace
- Encierro ese texto con corchetes (yss])
- Inserto un asterisco al inicio de la línea (I *)
- Añado al final de la línea una apertura de paréntesis y vuelvo al modo normal (A(Esc)
- Pego el texto del enlace que había copiado en el paso 4 (p)
- Añado un cierre de paréntesis (A))
- Bajo una línes (j)
Y vuelvo a pulsar q para finalizarla grabación de la macro. Ahora ejecuto @a y veo que funciona correctamente en la línea siguiente. Es hora de ver cómo Vim realiza el trabajo el solo en todo el texto y ejecuto 99@a
No quiere decir que vaya a ejecutar 99 veces la macro. Como he dicho antes, la ejecución de la macro se detiene cuando ocurre un error, y en este caso cuando encuentre una línea en la que no haya un enlace el proceso se detiene.
Cuando finaliza, veremos que todos los enlaces en formato html se han convertido correctamente a markdown, sin necesedidad de picar texto una y otra vez.
Espero que este ejemplo, te haya servido para descubrir la potencia de las macros y de aprender a utilizarlas cuando sea necesario ahorrándote tiempo y esfuerzo.
