GNU/Linux >> Tutoriales Linux >  >> Linux

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 esa macro muchas 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 ahorran mucho tiempo.

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

El problema

Suponga que recibe un archivo CSV que contiene una lista de hosts en su red de un sistema de monitoreo hipotético. Quiere convertirlo a /etc/hosts formato para habilitar la resolución de nombres locales para los 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 editar la entrada cambiando la posición de algunos campos, eliminando las comillas e insertando tabuladores 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 consiste en grabar sus comandos y pulsaciones de teclas mientras realiza las ediciones necesarias para resolver el problema en la primera línea, guarda la secuencia de comandos en un registro y luego reproduce la macro para hacer lo mismo en las líneas restantes.

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

q<register><commands>q

Por ejemplo, para grabar una macro básica que inserta una nueva línea y guardarla para registrar a , usa esta secuencia:

qao<ESC>q

Si bien esta macro no es útil, ejemplifica la secuencia requerida para grabar cualquier otra macro.

La grabación de macros en Vim es un ejercicio de lógica y el 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 para 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 para guardarlo para registrar h :

qh

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

recording @h

A continuación, es una buena práctica mover a su personaje a una posición conocida, de modo que la macro funcione de la misma manera, independientemente de dónde se encontraba el cursor cuando se inició la macro. Usemos el comienzo de la línea como punto de inicio 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é allí, reemplace las comillas " carácter con el carácter de comentario # , por lo que no necesitamos hacer esto cuando movemos este campo al final de la línea más adelante:

r#

A continuación, elimine la siguiente comilla moviendo el cursor hacia ella con la 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

A continuación, mueva el cursor una posición a la derecha usando l y elimine todo el nombre de host hasta la siguiente coma:

ldf,

Recuerde, cuando elimina texto en Vim, también lo copia. Ahora, vamos a pegarlo al final de la línea. Inserta texto al final usando A e insertando una coma, luego presione p para pegar el nombre de host:

A,<ESC>p

Ahora los campos están casi en el orden deseado. Vamos a mover el comentario al final de la línea. Haga esto moviendo el cursor de regreso 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 $ , pega el texto con p y elimine la coma final 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 las s comando:

:s/,/\t/g<ENTER>

La línea coincide con 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 repetidamente la macro. Finalmente, detenga la grabación presionando q :

jq

Grabó una macro y está lista para usar. Veamos cómo puedes comprobarlo a continuación.

Ver y cargar macros

Debido a que las macros se guardan en los registros de Vim, puede ver las macros guardadas usando el comando :reg 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 caso registro h, proporcionándolo como un parámetro para :reg comando:

: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 antes. Tenga en cuenta que los caracteres especiales como ESC y ENTRAR fueron 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 línea vacía en el búfer. Luego reemplace los caracteres especiales con su representación de Vim usando Ctrl+v+ y Ctrl+v+ en el modo Insertar. Luego copie el contenido de la macro en el 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

Después de grabar la macro y verificar su contenido, use la macro para realizar las mismas ediciones en las líneas restantes.

Para reproducir la macro una vez, mueva el cursor a la siguiente línea y presione @h donde h representa el registro en el que guardó la macro.

Observe 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 number sintaxis. Por ejemplo, para ejecutar la macro en las cinco líneas restantes, presione 5@@ o 5@h .

Esto funciona bien si sabe exactamente cuántas veces desea ejecutar la macro. Si 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.

¿Qué sigue?

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

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

Si está utilizando macros en un archivo con miles de líneas, eche un vistazo a set 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 requiere que piense y ejecute tareas de forma 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 cuando sea necesario.

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

[ ¿Quieres más información sobre Vim? Descargue esta hoja de referencia gratuita de Vim. ]


Linux
  1. Macros recursivas de Vim:un paso más hacia la automatización de tareas repetitivas

  2. Descubra hosts en vivo en una red bajo Linux

  3. ¿Cómo usar `cuál` en un comando con alias?

  4. ¿Es posible crear y usar menús en Vim (basado en terminal)?

  5. ¿Cómo usar el tipo de archivo en Vim?

Cómo automatizar tareas en Debian 11

Cómo usar Ansible para configurar Vim

Cómo automatizar tareas con trabajos cron en Linux

¿Resolver la dirección Mac desde la dirección IP en Linux?

Esquemas de color en Vim:cómo cambiarlos y usarlos

Resolución de la dirección MAC desde la dirección IP en Linux