GNU/Linux >> Tutoriales Linux >  >> Linux

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

El artículo reciente Usar macros de Vim para automatizar tareas frecuentes de Ricardo Gerardi exploró qué es una macro y los beneficios de usar macros para automatizar tareas repetitivas. En este artículo, dará un paso más y explorará qué macros recursivas son algunos ejemplos en los que podrían ser útiles y algunos escollos con los que podría encontrarse.

El flujo de trabajo básico de las macros consta de registro, reproducción y beneficio. Al grabar, seleccione en qué registro lo hará. Hay registros de a a z disponible.

[ También te puede interesar: Cómo usar Ansible para configurar Vim ]

Una vez que haya abierto Vim, para grabar una macro, comience presionando q y especifique el registro para guardarlo. Luego escriba una secuencia de comandos para ejecutar y q para finalizar y guardar la grabación. Después de eso, reproduce la macro presionando @ y el registro.

Por ejemplo, grabe una macro como qaA - suffixESCjq , luego reprodúzcalo presionando @a cuantas veces se necesita. Para que sea más fácil reproducir la macro, después de ejecutarla una vez, escriba @@ para reproducirlo.

Más información sobre cómo funcionan las macros

Profundizando un poco más en las macros y explorando algunas de sus partes internas. Una macro dejará de ejecutarse en caso de que no pueda ejecutar uno de sus comandos. Por ejemplo, si f ( (lo que significa encontrar ( y coloque el cursor encima de él ) no se puede ejecutar, la reproducción de la macro se detendrá inmediatamente. Podrías pensar que esto es un problema, pero en realidad es una función y puedes usarla a tu favor.

Al grabar una macro, se ingresa una secuencia de comandos. Eso significa que puede usar cualquier comando, incluido el de ejecutar macro (@ ). Esta es la esencia de las macros recursivas, llamándose a sí mismas cuando se ejecutan.

En este punto, podría comenzar a grabar y reproducir algunas macros recursivas. Pero antes de hacer eso, mira una cosa más antes de saltar directamente a ella. Al grabar una macro, los comandos escritos se ejecutan a medida que avanza la grabación. Por lo tanto, si reproduce una macro como parte de la grabación y el registro relacionado tiene algo ya grabado, se ejecuta y probablemente generará resultados inesperados.

Aquí viene el primer consejo:asegúrese de que el registro esté vacío antes de grabar una macro recursiva. Limpiar un registro ejecutando q q , que es lo mismo que iniciar una grabación en , sin ejecutar nada y finalizando la grabación.

Con todo eso, finalmente es hora de explorar algunos escenarios en los que las macros recursivas te ahorrarán tiempo de edición adicional.

Grabar y reproducir macros recursivas

Para empezar, tomemos el problema resuelto en el artículo anterior:Convierta el siguiente archivo CSV producido por un sistema de monitoreo hipotético en un /etc/hosts formato de archivo.

$ 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

Aquí está el resultado esperado:

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

La macro que se grabó para ayudar a convertir el formato de archivo es la siguiente:

0r#f"xldf,A,<ESC>p0df,$px:s/,/\t/g<ENTER>j

Suponiendo que acaba de abrir Vim y la macro anterior aún no está grabada, tiene algunas opciones para completar cualquier registro con el contenido de la macro:

1) Grabe la macro y escriba todos los comandos

Comience presionando q luego el , escriba todos los comandos anteriores y finalice presionando q .

2) Establecer el registro

Puede configurar un registro usando el siguiente comando :let @='' y luego usarlo como una repetición de macro. En este caso, no puede ejecutar ese comando directamente ya que la macro tiene algunas teclas especiales como Esc y Enter . Para evitarlo, use :execute dominio. Permite ingresar las teclas especiales como secuencias de escape. En modo normal, escriba : y luego pegue la siguiente línea y presione Enter :

execute "let @h='0r#f\"xldf,A,\<Esc>p0df,$px:s/,/\\t/g\<Enter>j'"

Asegúrese de que el registro h el contenido se configuró correctamente. Eso se puede hacer ejecutando :reg o : reg h en este caso:

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

El contenido del registro es ligeramente diferente de lo establecido por :execute dominio. Esto se debe a que :execute convertido \ y \ a su código clave ^[ y ^M respectivamente. Esos son los que Vim usa internamente para "pulsar" las teclas.

En este punto, el registro h contiene exactamente la misma macro registrada en el artículo Usar macros de Vim para automatizar tareas frecuentes. El siguiente paso es hacerlo recursivo. De esta forma, puede activarlo una vez y se repite recursivamente hasta que llega al final del archivo.

Hay un pequeño truco para editar la macro ya grabada y hacerla recursiva. También puede usarlo para agregar comandos faltantes y realizar cambios sin grabar toda la macro.

Comience por :let @h=' , luego Ctrl-r Ctrl-r h , escribe @h' al final, y finalmente presione Enter . Ctrl-r Ctrl-r inserta literalmente el contenido del registro. Este es el mismo contenido que se muestra al inspeccionar :reg h .

Para verificar si tiene todo, ejecute :reg y comprobar el contenido. Debería tener el siguiente aspecto:

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

Con eso en su lugar, vaya a la segunda línea en hosts.csv y reproducir la macro @ o @h en este ejemplo. Continuará hasta el final del archivo actualizando todas las líneas. Fue posible porque la macro tenía 0 al principio y j antes de reproducirse recursivamente. Eso hizo que bajara una línea y, al volver a ejecutar la macro, colocó el cursor al principio de la línea.

Además, observe que la macro fue hasta el final del archivo y se detuvo porque ya no podrá bajar con j esa fue nuestra condición de ruptura para la ejecución recursiva.

[ ¿Busca más información sobre la automatización de sistemas? Comience con The Automated Enterprise, un libro gratuito de Red Hat. ] 

Resumir

Este fue un viaje largo, pero ahora tiene otra herramienta disponible para ayudar a automatizar tareas repetitivas, incluso si esa tarea repetitiva está repitiendo una macro una y otra vez.

También exploró la edición de una macro, por lo que en este punto, puede estar familiarizado con la grabación de una desde cero. Si está grabando en lugar de editar una macro, asegúrese de vaciar el registro de destino antes de comenzar y tenga @ como tu último mandato. Además, piense en un punto de interrupción para su macro. Si está editando hasta el final del archivo, use j lo hará.

Otro beneficio de una macro recursiva es que si algo sale mal, se puede revertir usando un solo deshacer .


Linux
  1. ¿Analizar un campo de una matriz Json en una matriz Bash?

  2. ¿Concatenar archivos específicos en un solo archivo?

  3. ¿Cómo asignar un comando Vim para ejecutar comandos Bash según el sistema operativo?

  4. MultiCD:un script de Shell para combinar múltiples ISO de arranque en un solo CD

  5. ¿Cómo dividir un archivo de texto en varios archivos *.txt?

Cómo unir varias líneas en una en un archivo en Linux

Cómo combinar varios archivos PDF en un solo PDF en Linux

Cómo unir/combinar varios archivos de audio en uno solo en Linux

3 poderosos mosqueteros de Vim Editor:macro, marca y mapa

Combinar/convertir múltiples archivos PDF en un solo PDF

¿Cómo fusionar dos bibliotecas estáticas ar en una?