Use macros de Vim para automatizar tareas frecuentes

En Vim, una macro es una función que le permite grabar una secuencia de comandos que utiliza para realizar una tarea determinada. Luego ejecuta esta macro varias veces para repetir el mismo trabajo de forma automática.

Las macros hacen que las tareas tediosas y repetibles sean manejables al ejecutar la tarea solo una vez y luego usar el poder de Vim para automatizarla. Las macros mejoran su flujo de trabajo y le ahorran mucho tiempo.

En este artículo, exploraremos el concepto de macros de Vim aplicándolo a un ejemplo práctico.

Índice

El problema

Suponga que recibe un archivo CSV que contiene una lista de hosts en su red de un sistema de vigilancia hipotético. Quiere convertirlo en /etc/hosts formato para habilitar la resolución de nombres locales para hosts.

El archivo original es este:

$ cat hosts.csv 
Description,Hostname,IPAddress,FQDN
"OCP Master Node 1",ocpmaster01,192.168.0.20,ocpmaster01.home.ca
"OCP Master Node 2",ocpmaster02,192.168.0.21,ocpmaster02.home.ca
"OCP Master Node 3",ocpmaster03,192.168.0.22,ocpmaster03.home.ca
"OCP Worker Node 1",ocpnode01,192.168.0.30,ocpnode01.home.ca
"OCP Worker Node 2",ocpnode02,192.168.0.31,ocpnode02.home.ca
"OCP Worker Node 3",ocpnode03,192.168.0.32,ocpnode03.home.ca
"Ansible Host 1",ansibleh01,192.168.0.144,ansibleh01.home.ca
"Ansible Host 2",ansibleh02,192.168.0.145,ansibleh02.home.ca

El resultado esperado es este:

192.168.0.20    ocpmaster01.home.ca    ocpmaster01    #OCP Master Node 1
192.168.0.21    ocpmaster02.home.ca    ocpmaster02    #OCP Master Node 2
192.168.0.22    ocpmaster03.home.ca    ocpmaster03    #OCP Master Node 3
192.168.0.30    ocpnode01.home.ca    ocpnode01    #OCP Worker Node 1
192.168.0.31    ocpnode02.home.ca    ocpnode02    #OCP Worker Node 2
192.168.0.32    ocpnode03.home.ca    ocpnode03    #OCP Worker Node 3
192.168.0.144    ansibleh01.home.ca    ansibleh01    #Ansible Host 1
192.168.0.145    ansibleh02.home.ca    ansibleh02    #Ansible Host 2

Para obtener el resultado esperado, debe modificar la entrada cambiando la posición de algunos campos, eliminando comillas e insertando tabulaciones o caracteres de comentario (#) adecuadamente. Usemos macros de Vim para manejar esta tarea.

Resuelve el problema y graba la macro.

El flujo de trabajo básico de una macro de Vim es grabar sus comandos y pulsaciones de teclas mientras realiza los cambios necesarios para solucionar el problema en la primera línea, graba la secuencia de comandos en un registro y luego reproduce la macro para hacer esto. líneas restantes.

Para grabar una macro y guardarla en un registro, escriba la clave q seguida de una carta de a en z que representa el registro para grabar la macro, seguido de todos los comandos que desea grabar, luego escriba la clave q de nuevo para detener la grabación.

q<register><commands>q

Por ejemplo, para grabar una macro básica que inserta una nueva fila y grabarla para grabar a, usa esta secuencia:

qao<ESC>q

Aunque esta macro no es útil, ilustra la secuencia requerida para grabar otras macros.

Grabar macros en Vim es un ejercicio de lógica y uso adecuado de los comandos de Vim. Tenga en cuenta que desea que esta macro se pueda repetir en otras líneas, incluso si la entrada varía un poco. Por ejemplo, es mejor usar el comando dw eliminar una palabra en lugar de repetir el comando X para eliminar caracteres, ya que el número de caracteres de la palabra puede variar de una línea a otra.

Ahora grabemos una macro que convierta la primera línea de nuestro archivo CSV al formato requerido y guárdelo en el registro h. Comience colocando el cursor en cualquier lugar de la primera línea que queremos cambiar en el archivo:

"OCP Master Node 1",ocpmaster01,192.168.0.20,ocpmaster01.home.ca

Luego comience a grabar la macro presionando q y h registrarse registrarse h:

qh

Mientras graba la macro, la línea de estado en la parte inferior muestra este mensaje:

recording @h

Entonces, es una buena práctica mover tu personaje a una posición conocida, para que la macro funcione igual sin importar dónde estaba el cursor cuando se inició la macro. Usemos el inicio de la línea como punto de partida presionando 0:

0

Este primer campo es la descripción, que se convierte en el comentario al final de la línea en la salida. Mientras estás en eso, reemplaza las comillas " carácter con carácter de comentario #, por lo que no necesitamos hacer eso cuando movemos este campo al final de la línea más tarde:

r#

Luego elimine las siguientes comillas moviendo el cursor sobre ellas usando el F Comando y presionando X para eliminarlo:

f"x

En este punto, su primera línea se ve así:

#OCP Master Node 1,ocpmaster01,192.168.0.20,ocpmaster01.home.ca

Luego mueva el cursor una posición a la derecha usando Iy elimine todo el nombre de host hasta la siguiente coma:

ldf,

Recuerda que cuando eliminas texto en Vim, también lo estás copiando. Ahora vamos a pegarlo al final de la línea. Insertar texto al final usando A e insertando una coma, luego presione pags para pegar el nombre de host:

A,<ESC>p

Ahora los campos están casi en el orden que desea. Vamos a mover el comentario al final de la línea. Para hacer esto, mueva el cursor al principio con 0, y eliminando todo el comentario hasta la siguiente coma con df,:

0df,

Luego mueva el cursor al final de la línea con PS, pega el texto con pags, y elimine la última coma con X:

$px

Todos los campos están ahora en la posición deseada, y su línea se ve así:

192.168.0.20,ocpmaster01.home.ca,ocpmaster01,#OCP Master Node 1

Finalmente, reemplace todas las comas con un carácter de tabulación usando el s pedido:

:s/,/t/g<ENTER>

La línea corresponde a la salida deseada:

192.168.0.20    ocpmaster01.home.ca     ocpmaster01     #OCP Master Node 1

Termina tu macro moviendo el cursor a la siguiente línea presionando j para que pueda usar la macro repetidamente. Finalmente, detenga la grabación presionando q:

jq

Ha grabado una macro y está lista para ser utilizada. Veamos cómo puedes comprobarlo a continuación.

Ver y cargar macros

Dado que las macros se guardan en los registros de Vim, puede ver las macros guardadas usando el comando : registro para ver el contenido de todos los registros:

:reg
--- Registers ---
""   ,
"h   0r#f"xldf,A,^[p0df,$px:s/,/t/g^Mj
"-   ,
...

También puede consultar el registro específico, en nuestro registro de casos h, al proporcionarlo como un parámetro para el : registro pedido:

:reg h
--- Registers ---
"h   0r#f"xldf,A,^[p0df,$px:s/,/t/g^Mj

Usando ambos métodos, puede ver el contenido del registro h coincide con la macro que grabamos anteriormente. Tenga en cuenta que los caracteres especiales como ESC y ENTRAR han sido reemplazados por la representación de Vim ^[[[[ y ^ M respectivamente.

También puede cargar macros en registros. Primero, copie el contenido de la macro y péguelo en una fila en blanco del búfer. Luego reemplace los caracteres especiales con su representación Vim usando Ctrl+v+ y Ctrl+v+ en el modo Insertar. Luego copie el contenido de la macro al registro deseado, por ejemplo, registre h con este comando:

"hy$

A continuación, reproduzcamos la macro para actualizar las líneas restantes en el archivo.

Reproducir macros

Una vez que haya grabado la macro y verificado su contenido, utilícela para realizar los mismos cambios en las filas restantes.

Para reproducir la macro una vez, mueva el cursor a la siguiente línea y presione @h o h representa el registro donde grabaste la macro.

Tenga en cuenta que la macro mueve automáticamente el cursor a la siguiente línea según sea necesario. Esto le permite repetir su ejecución. Para repetir la ejecución de la macro, presione @@.

Finalmente, puede repetir la macro en todas las líneas restantes usando Vim número sintaxis. Por ejemplo, para ejecutar la macro en las cinco filas restantes, presione 5 @@ Donde 5 @ h.

Funciona bien si sabe exactamente cuántas veces desea ejecutar la macro. Si, en cambio, desea ejecutar la macro en todas las líneas hasta el final del archivo, independientemente de cuántas líneas existan, use esta sintaxis:

:%:normal @h

Todas las líneas del archivo ahora coinciden con el resultado esperado. Para completar los cambios, elimine la línea de título al principio.

¿Y después?

Las macros de Vim son un recurso poderoso que le permite ampliar la funcionalidad de Vim y realizar tareas complejas rápidamente.

Puede ver los beneficios de ejecutar una macro en un archivo de ocho líneas. Imagínese si tuviera que hacer algo similar a un archivo con cientos o miles de entradas. Incluso puede probar esto copiando esas ocho líneas y pegándolas cientos de veces, luego volviendo a aplicar la macro.

Si está utilizando macros en un archivo con miles de líneas, eche un vistazo a la definir lazyredraw comando para mejorar el rendimiento. Esta configuración evita que Vim vuelva a dibujar la pantalla para cada iteración de la macro.

La creación de macros de Vim lo obliga a pensar y realizar tareas de manera optimizada. Es un buen ejercicio al usar Vim para pensar en cómo realizar tareas de una manera que las haga repetibles y le permita convertirlas en macros si es necesario.

Al hacer esto, se vuelve más competente con Vim y, a cambio, obtiene funciones más avanzadas para mejorar su flujo de trabajo y ahorrar tiempo.

Artículos de interés

Subir