GNU/Linux >> Linux Esercitazione >  >> Linux

Macro ricorsive di Vim:un ulteriore passo avanti nell'automazione delle attività ripetitive

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 (@ ). Questa è l'essenza delle macro ricorsive, che si autodefiniscono quando vengono eseguite.

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 , non eseguire nulla e terminare la registrazione.

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 , digita tutti i comandi sopra e termina premendo q .

2) Imposta il registro

Puoi impostare un registro utilizzando il seguente comando :let @='' e successivamente utilizzare come riproduzione macro. In questo caso, non puoi eseguire quel comando direttamente poiché la macro ha alcuni tasti speciali come 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 o : 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 \ al loro codice chiave ^[ 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 inserisce letteralmente il contenuto del registro. Questo è lo stesso contenuto visualizzato durante l'ispezione di :reg h .

Per verificare se hai tutto, esegui :reg e controlla il contenuto. Dovrebbe essere simile al seguente:

: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 @ o @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 @ come tuo ultimo comando. Inoltre, pensa a un punto di interruzione per la tua macro. Se stai modificando il file fino alla fine, utilizza j lo farà.

Un altro vantaggio di una macro ricorsiva è che se qualcosa va storto, può essere annullato utilizzando un singolo annulla .


Linux
  1. Analizzare un campo da un array Json in un array Bash?

  2. Tutorial sulle macro di Vi e Vim:come registrare e riprodurre

  3. Gatto ricorsivo tutti i file in un singolo file

  4. Esiste un equivalente Linux di Programmer's Notepad o Notepad++

  5. Come gzippare più file in un unico file gz?

Come unire più righe in una in un file in Linux

Come unire più file PDF in un unico PDF in Linux

Come unire/unire più file audio in uno in Linux

3 potenti moschettieri di Vim Editor:Macro, Mark e Map

Come unire due librerie statiche ar in una?

Come dividere un file di testo in più file *.txt?