Este es uno de los capítulos del tutorial Vim, un editor atemporal. Encontrarás los enlaces a todos los de capítulos, al final de este artículo.
En ocasiones te enfrentas a un archivo que necesitas modificar, pero además necesitas repetir la misma modificación varias veces. Aquí tienes dos opciones. La primera de las opciones es repetir lo mismo una y otra vez, los mismos atajos de teclado, combinaciones de tecla, suprimir, etc. La segunda es crear macros en Vim. Esto que de primeras te puede sonar realmente complejo, no lo es, ni mucho menos. Es mucho mas sencillo de lo que te puedas imaginar.
Y es que, crear tus propias macros en Vim es casi tan sencillo como grabar tus pasos. ¿Que digo como grabar? Realmente se trata de grabar tus pasos, lo que haces, en la primera ocasión, para luego repetirlo tantas veces como lo necesites. Eso si, lo tienes que hacer con conocimiento, porque de otra forma no conseguirás lo que persigues.
Macros en Vim
Un ejemplo
Para que sea mas claro lo que busco habitualmente en las macros quiero mostrártelo con un ejemplo. Si te fijas, cada uno de los artículos, tutoriales o podcast, viene acompañado de una imagen. Estas imágenes las obtengo de Unsplash, y siempre, a menos que se me olvide, cito el autor.
En Unsplash, al descargar la imagen, te da la opción de que copies la cita, que es como te muestro a continuación,
Photo by <a href="https://unsplash.com/@patrickj95?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Patrick Jansen</a> on <a href="https://unsplash.com/?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
Sin embargo a mi me gusta personalizarlo, y por supuesto, ponerlo en formato markdown que es como yo preparo todo esto. Así que lo anterior, yo lo convierto en lo siguiente,
Imagen de portada de [Patrick Jansen](https://unsplash.com/@patrickj95) en [Unsplash](https://unsplash.com)
Como ves esto no tiene gran cosa, sin embargo, me da mucha pereza tener que hacerlo en cada ocasión. Así que lo he resuelto utilizando las macros de Vim.
Como te decía en la introducción, no pienses que esto de crear las macros de Vim es complicado. Simplemente tienes que grabar los pasos que realizas en la primera ocasión, para luego repetirlo en tantas ocasiones como quieras.
Grabar macros en Vim
Seguro que te ha pasado en mas de una ocasión que, sin querer, has empezado a grabar una macro, incluso, en tus inicios con Vim, no sabías lo que estaba sucediendo. Simplemente veías que en la parte inferior izquierda de Vim aparecía un @w
, u otra letra después de @
.
Si, para grabar tu primera macro, no tienes mas que pulsar q
seguido de la letra que quieras, en el modo normal, y es que las macros se guardan en los registros de Vim. Respecto a los registros de Vim, puedes leer mas en los registros de Vim o sus 48 portapapeles.
Para dejar de grabar tu macro tienes que volver a pulsar q
. Mientras que para poner en marcha la macro utilizarás @<letra>
, donde <letra>
es la letra que utilizaste para el comienzo de la grabación. Y por último, si lo que quieres es repetir la última macro que ejecutaste tienes que utilizar @@
. Así resumiendo,
q<letra>
inicia la grabación y lo guarda en el registro<letra>
.q
detiene la grabación@<letra>
comienza la ejecución de la macro guardada en el registro<letra>
@@
repite la última macro ejecutada.<numero>@<letra>
ejecuta la macro guardada en el registro<letra>
tantas veces como hayas indicado con el número<numero>
.
Recuperar y guardar macros
Para ver todas las macros utilizadas en la sesión actual tienes que hacerlo como cuando ves los registros, es decir, utilizando :registers
o :reg
.
Como ya has adivinado, esto de las macros es algo efímero, en el sentido de que terminada la sesión en la que te encuentres trabajando se pierden las macros. A menos que lo tengas establecido utilizando viminfo
.
Otra opción mucho mas interesante es guardar el contenido del registro para utilizarlo en futuras ocasiones. Para ello, en tu archivo vimrc
, tienes que añadir la siguiente línea,
let @<letra> = 'contenido'
Para poner el contenido del registro <letra>
, tienes que utilizar la combinación de teclas Ctrl+r Ctrl+r <letra>
.
¿Como hago esto? En mi caso yo abro en una ventana lateral con :vs ~/.vim/vimrc
.Me voy al final de mi archivo de configuración y pego el contenido del registro utilizando la combinación de teclas anterior.
Añadir mas comandos a una macro
Si tienes una macro guardada, por ejemplo en la letra a
y quieres añadir mas operaciones al final de esa macro, simplemente tienes que volver a grabar, pero en esta ocasión utilizando la misma letra pero en mayúscula A
. De esta forma todo lo que grabes se añadirá a la macro.
Editar una macro
También es posible editar una macro. Para esto desde el modo normal tienes que escribir :let @<letra> = '
, reemplazando <letra>
por el registro que quieras utilizar. A continuación pulsas la combinación de teclas Ctrl+r Ctrl+r
, que te mencioné anteriormente, y editas lo que quieras…. con mucho cuidado.
Sobre grabar una macro
Para grabar una macro tienes que tener en pensar en que el texto sobre el que vas a aplicar la macro será, sensiblemente distinto en cada ocasión. De esta manera, tienes que apoyarte en movimientos que no estén comprometidos por ese contenido. Es decir, si sabes, que siempre tienes que borrar el contenido que hay entre la primera <
y la siguiente >
, por ejemplo, el primer paso es moverte al principio de la línea desde el modo normal, utilizando _
y el siguiente paso es buscar <
, con f<
.
Otra cuestión es que para iniciar la macro, no la hagas desde el inicio de la línea que quieres modificar. Piensa, que cuando inicies la macro, puedes estar en cualquier posición de la línea. Así, lo mejor es como primer paso desplazarte al inicio de la línea y a partir de ahí comenzar a moverte.
Básicamente se trata de que cuando grabes la macro pienses en que esta sea repetible.
Algunas macros interesantes
Hacer una lista secuencial
Para hacer una lista secuencial, empezando por ejemplo por el 1
es tan sencillo como,
- moverte a la línea donde está el
1
o el número por el que quieres que empiece la lista. - Copiar esa línea con
yy
. - Pegar la línea con
p
- Incrementar utilizando
Ctrl+a
let @a='yyp^A'
Añadir un texto al inicio o fin de cada línea
Esto también es realmente sencillo, simplemente tienes que grabar esta operación utilizando los comando indicados anteriormente y ejecutarlo.
let @a='_y$$a Esta es la línea ýapj'
Convertir un archivo CSV a JSON
Mas o menos, esto podría ser una interesante opción. Imagina lo siguiente,
uno,1
dos,2
Y lo quieres convertir a,
"uno": "1",
"dos": "2",
La macro sería algo como,
let @a='_i"ýawea"ýawXi: "ýawa",ýaj'
Los créditos de la imagen
Por último, en el caso de querer añadir los créditos de una imagen, tal y como te he comentado anteriormente, al inicio de este capítulo, tienes que utilizar,
let @a='_iImagen de portada de ýa2f>lyt<f<;F<;;i[ýapa](ýaldf"f?df"i)ýali en [Unsplash](ýaldf"f?c$)ýas'
Conclusión
Como ves, las posibilidades que te ofrecen las macros para automatizar tareas repetitivas son verdaderamente interesantes. La ventaja es que no te tienes que preocupar de aprender un nuevo lenguaje para programar estas macros, simplemente tienes que grabar lo que quieres hacer, con un poco de conocimiento, para que sea repetitivo y lanzarte a utilizarlo una y otra vez.
Eso si, te tienes que acordar que tienes a tu disposición esta potente herramienta, porque de lo contrario, te encontrarás repitiendo una y otra vez lo mismo.
Más información,
Imagen de portada de Thais Do Rio en Unsplash