Il recente articolo Usa le macro di Vim per automatizzare le attività frequenti di Ricardo Gerardi ha esplorato cos'è una macro e i vantaggi dell'utilizzo delle macro per automatizzare le attività ripetitive. In questo articolo, farai un ulteriore passo avanti ed esplorerai quali macro ricorsive sono alcuni esempi in cui potrebbero essere utili e alcune insidie in cui potresti imbatterti.
Il flusso di lavoro delle macro di base è costituito da registrazione, riproduzione e profitto. Durante la registrazione, selezionare in quale registro lo farà. Ci sono registri da a
a z
disponibile.
[ Potrebbe piacerti anche: Come utilizzare Ansible per configurare Vim ]
Una volta aperto Vim, per registrare una macro, inizia premendo q
e specificare il registro in cui salvarlo. Quindi digita una sequenza di comandi da eseguire e q
per terminare e salvare la registrazione. Dopodiché, riproduci di nuovo la macro premendo @ e il registro.
Ad esempio, registra una macro come qaA - suffixESCjq
, quindi riproducilo premendo @a
quante volte sono necessarie. Per semplificare la riproduzione della macro, dopo averla eseguita una volta, digita @@
per riprodurlo.
Ulteriori informazioni su come funziona la macro
Scavare un po' di più nelle macro ed esplorare alcuni dei suoi interni. Una macro interromperà l'esecuzione nel caso in cui non sia in grado di eseguire uno dei suoi comandi. Ad esempio, se f
( (che significa trova ( e posizionarci sopra il cursore ) non può essere eseguito, la riproduzione della macro si interromperà immediatamente. Potresti pensare che questo sia un problema, ma in realtà si tratta di una funzionalità e puoi utilizzarla a tuo favore.
Durante la registrazione di una macro, viene immessa una sequenza di comandi. Ciò significa che puoi utilizzare qualsiasi comando, incluso quello di esecuzione della macro (@
A questo punto, puoi semplicemente iniziare a registrare e riprodurre alcune macro ricorsive. Ma prima di farlo, guarda un'altra cosa prima di saltarci dentro. Quando si registra una macro, i comandi digitati vengono eseguiti durante la registrazione. Quindi, se riproduci una macro come parte della registrazione e il relativo registro ha qualcosa già registrato, verrà eseguito e probabilmente porterà risultati inaspettati.
Ecco il primo consiglio:assicurati che il registro sia vuoto prima di registrare una macro ricorsiva. Cancella un registro eseguendo q
q
, che equivale a iniziare una registrazione su
Con tutto ciò, è finalmente giunto il momento di esplorare alcuni scenari in cui le macro ricorsive ti faranno risparmiare tempo di modifica aggiuntivo.
Registrazione e riproduzione di macro ricorsive
Per cominciare, prendiamo il problema risolto nell'articolo precedente:convertire il seguente file CSV prodotto da un ipotetico sistema di monitoraggio in un /etc/hosts
formato file.
$ 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
Ecco l'output previsto:
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 che è stata registrata per aiutare a convertire il formato del file è la seguente:
0r#f"xldf,A,<ESC>p0df,$px:s/,/\t/g<ENTER>j
Supponendo che tu abbia appena aperto Vim e che la macro sopra non sia ancora registrata, hai alcune opzioni per popolare qualsiasi registro con il contenuto della macro:
1) Registra la macro e digita tutti i comandi
Inizia premendo q
quindi q
.
2) Imposta il registro
Puoi impostare un registro utilizzando il seguente comando :let
@Esc
e Enter
. Per aggirare il problema, usa il :execute
comando. Consente di inserire i tasti speciali come sequenze di escape. In modalità normale, digita :
quindi incolla la seguente riga e premi Enter
:
execute "let @h='0r#f\"xldf,A,\<Esc>p0df,$px:s/,/\\t/g\<Enter>j'"
Assicurati di registrare h
i contenuti sono stati impostati correttamente. Questo può essere fatto eseguendo :reg
reg h
in questo caso:
:reg h
--- Registers ---
"h 0r#f"xldf,A,^[p0df,$px:s/,/\t/g^Mj
Il contenuto del registro è leggermente diverso da quanto impostato dal :execute
comando. Questo perché :execute
convertito \^[
e ^M
rispettivamente. Questi sono ciò che Vim usa internamente per "premere" effettivamente i tasti.
A questo punto, il registro h
contiene la stessa identica macro registrata nell'articolo Usa le macro di Vim per automatizzare le attività frequenti. Il prossimo passo è renderlo ricorsivo. In questo modo, puoi attivarlo una volta e si ripete in modo ricorsivo fino a raggiungere la fine del file.
C'è un piccolo trucco per modificare la macro già registrata e renderla ricorsiva. Puoi anche usarlo per aggiungere comandi mancanti e apportare modifiche senza registrare l'intera macro.
Inizia con :let @h='
, quindi Ctrl-r
Ctrl-r h
, digita @h'
alla fine, e infine premi Enter
. Ctrl-r Ctrl-r
:reg h
.
Per verificare se hai tutto, esegui :reg
:reg h
--- Registers ---
"h 0r#f"xldf,A,^[p0df,$px:s/,/\t/g^Mj@h
Con questo in atto, vai alla seconda riga su hosts.csv
e riproduci la macro @@h
in questo esempio. Continuerà fino alla fine del file aggiornando tutte le righe. È stato possibile perché la macro aveva 0
all'inizio e j
prima di riprodursi ricorsivamente. Ciò ha fatto scendere una riga in basso e, durante l'esecuzione di nuovo della macro, ha posizionato il cursore all'inizio della riga.
Inoltre, osserva che la macro è andata fino alla fine del file e si è fermata perché non sarà più in grado di scendere con j
questa era la nostra condizione di rottura per l'esecuzione ricorsiva.
[ Cerchi ulteriori informazioni sull'automazione dei sistemi? Inizia con The Automated Enterprise, un libro gratuito di Red Hat. ]
Concludi
È stato un lungo viaggio, ma ora hai a disposizione un altro strumento per automatizzare le attività ripetitive, anche se quell'attività ripetitiva sta ripetendo una macro più e più volte.
Hai anche esplorato la modifica di una macro, quindi a questo punto potresti avere familiarità con la registrazione di una macro da zero. Se stai registrando invece di modificare una macro, assicurati di svuotare il registro di destinazione prima di iniziare e di avere @j
lo farà.
Un altro vantaggio di una macro ricorsiva è che se qualcosa va storto, può essere annullato utilizzando un singolo annulla .