GNU/Linux >> Linux Esercitazione >  >> Linux

Usa le macro Vim per automatizzare le attività frequenti

In Vim, una macro è una funzionalità che ti consente di registrare una sequenza di comandi che usi per eseguire un determinato compito. Quindi esegui quella macro molte volte per ripetere lo stesso lavoro in modo automatico.

Le macro rendono gestibili attività noiose e ripetibili eseguendo l'attività una sola volta, quindi utilizzando la potenza di Vim per automatizzarla. Le macro migliorano il tuo flusso di lavoro e ti fanno risparmiare molto tempo.

In questo articolo esploreremo il concetto di macro Vim applicandolo a un esempio pratico.

Il problema

Si supponga di ricevere un file CSV contenente un elenco di host nella rete da un ipotetico sistema di monitoraggio. Vuoi convertirlo in /etc/hosts format per abilitare la risoluzione dei nomi locali per gli host.

Il file originale è questo:

$ 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

L'output previsto è questo:

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

Per ottenere l'output previsto, è necessario modificare l'input invertendo la posizione di alcuni campi, eliminando le virgolette e inserendo caratteri di tabulazione o di commento (# ) appropriatamente. Usiamo le macro di Vim per gestire questa attività.

Risolvi il problema e registra la macro

Il flusso di lavoro di base di una macro Vim consiste nel registrare i comandi e le sequenze di tasti durante l'esecuzione delle modifiche necessarie per risolvere il problema sulla prima riga, nel salvare la sequenza di comandi in un registro e quindi nel riprodurre la macro per eseguire lo stesso sulle righe rimanenti.

Per registrare una macro e salvarla in un registro, digita il tasto q seguito da una lettera di a a z che rappresenta il registro per salvare la macro, seguito da tutti i comandi che vuoi registrare, quindi digita il tasto q di nuovo per interrompere la registrazione.

q<register><commands>q

Ad esempio, per registrare una macro di base che inserisce una nuova riga e salvarla per registrare a , usa questa sequenza:

qao<ESC>q

Sebbene questa macro non sia utile, esemplifica la sequenza richiesta per registrare qualsiasi altra macro.

La registrazione di macro in Vim è un esercizio di logica e l'uso appropriato dei comandi Vim. Tieni presente che vuoi che questa macro sia ripetibile su altre righe, anche se l'input varia leggermente. Ad esempio, è meglio usare il comando dw per eliminare una parola anziché ripetere il comando x per rimuovere i caratteri, perché il numero di caratteri nella parola potrebbe variare da riga a riga.

Ora, registriamo una macro che converte la prima riga del nostro file CSV nel formato richiesto e la salviamo sul registro h . Inizia posizionando il cursore in un punto qualsiasi della prima riga che vogliamo modificare nel file:

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

Quindi, inizia a registrare la macro premendo q e h per salvarlo per registrare h :

qh

Durante la registrazione della macro, la riga di stato in basso mostra questo messaggio:

recording @h

Successivamente, è buona norma spostare il personaggio in una posizione nota, in modo che la macro funzioni allo stesso modo indipendentemente da dove si trovava il cursore all'inizio della macro. Usiamo l'inizio della riga come punto di partenza premendo 0 :

0

Questo primo campo è la descrizione, che diventa il commento alla fine della riga nell'output. Mentre sei lì, sostituisci le virgolette " carattere con il carattere di commento # , quindi non è necessario farlo quando spostiamo questo campo alla fine della riga in un secondo momento:

r#

Quindi, elimina la virgoletta successiva spostando il cursore su di essa utilizzando la f comando e premendo x per rimuoverlo:

f"x

A questo punto, la tua prima riga si presenta così:

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

Quindi, sposta il cursore di una posizione a destra utilizzando l , ed elimina l'intero nome host fino alla virgola successiva:

ldf,

Ricorda, quando elimini il testo in Vim, lo copi anche. Ora, incolliamolo alla fine della riga. Inserisci il testo alla fine utilizzando A e inserendo una virgola, quindi premere p per incollare il nome host:

A,<ESC>p

Ora i campi sono quasi nell'ordine desiderato. Spostiamo il commento alla fine della riga. A tale scopo, riporta il cursore all'inizio con 0 , ed eliminando l'intero commento alla virgola successiva con df, :

0df,

Quindi, sposta il cursore alla fine della riga con $ , incolla il testo con p ed elimina la virgola finale con x :

$px

Tutti i campi sono ora nella posizione desiderata e la tua linea è simile a questa:

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

Infine, sostituisci tutte le virgole con un carattere Tab utilizzando le s comando:

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

La riga corrisponde all'output desiderato:

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

Termina la tua macro spostando il cursore sulla riga successiva premendo j così puoi usare ripetutamente la macro. Infine, interrompi la registrazione premendo q :

jq

Hai registrato una macro ed è pronta per l'uso. Vediamo come puoi verificarlo dopo.

Visualizza e carica le macro

Poiché le macro vengono salvate nei registri Vim, puoi visualizzare le macro salvate utilizzando il comando :reg per vedere il contenuto di tutti i registri:

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

Puoi anche controllare il registro specifico, nel nostro caso registrare h, fornendolo come parametro al :reg comando:

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

Utilizzando entrambi i metodi, puoi vedere il contenuto del registro h corrisponde alla macro che abbiamo registrato prima. Nota che i caratteri speciali come ESC e INVIO sono stati sostituiti con la rappresentazione Vim ^[ e ^M rispettivamente.

Puoi anche caricare le macro nei registri. Innanzitutto, copia il contenuto della macro e incollalo su una riga vuota nel buffer. Quindi sostituisci i caratteri speciali con la loro rappresentazione Vim usando Ctrl+v+ e Ctrl+v+ in modalità di inserimento. Quindi copia il contenuto della macro nel registro desiderato, ad esempio registra h con questo comando:

"hy$

Quindi, riproduciamo la macro per aggiornare le righe rimanenti nel file.

Riproduci macro

Dopo aver registrato la macro e averne verificato il contenuto, utilizza la macro per eseguire le stesse modifiche sulle righe rimanenti.

Per riprodurre la macro una volta, sposta il cursore sulla riga successiva e premi @h dove h rappresenta il registro su cui hai salvato la macro.

Si noti che la macro sposta automaticamente il cursore sulla riga successiva come richiesto. Ciò consente di ripeterne l'esecuzione. Per ripetere l'esecuzione della macro, premi @@ .

Infine, puoi ripetere la macro su tutte le righe rimanenti usando Vim number sintassi. Ad esempio, per eseguire la macro sulle cinque righe rimanenti, premi 5@@ o 5@h .

Funziona bene se sai esattamente quante volte vuoi eseguire la macro. Se invece vuoi eseguire la macro in tutte le righe fino alla fine del file, indipendentemente da quante righe esistono, usa questa sintassi:

:%:normal @h

Tutte le righe nel file ora corrispondono all'output previsto. Per completare le modifiche, elimina la riga del titolo all'inizio.

Cosa c'è dopo?

Le macro di Vim sono una potente risorsa che ti consente di estendere le funzionalità di Vim ed eseguire rapidamente attività complesse.

Puoi vedere i vantaggi dell'esecuzione di una macro in un file con otto righe. Immagina se ti venisse richiesto di fare qualcosa di simile in un file con centinaia o migliaia di voci. Puoi anche verificarlo copiando queste otto righe e incollandole centinaia di volte e quindi applicando nuovamente la macro.

Se stai utilizzando macro su un file con migliaia di righe, dai un'occhiata a set lazyredraw comando per migliorare le prestazioni. Questa impostazione impedisce a Vim di ridisegnare lo schermo per ogni iterazione della macro.

La creazione di macro Vim richiede di pensare ed eseguire attività in modo ottimizzato. È un buon esercizio quando si utilizza Vim pensare a come eseguire le attività in un modo che le renda ripetibili e ti permetta di convertirle in macro quando necessario.

In questo modo, diventi più esperto con Vim e, in cambio, benefici di funzionalità più avanzate per migliorare il tuo flusso di lavoro e risparmiare tempo.

[ Vuoi di più su Vim? Scarica questo cheat sheet gratuito di Vim. ]


Linux
  1. Come utilizzare lo strumento da riga di comando sipcalc Linux

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

  3. Scopri host live su una rete sotto Linux

  4. Come utilizzare il tipo di file in Vim?

  5. come usare pylint in vim

Come automatizzare le attività su Debian 11

Come usare Ansible per configurare Vim

Come automatizzare le attività con cron Jobs in Linux

Risolvere l'indirizzo Mac dall'indirizzo IP in Linux?

Schemi di colori in Vim:come cambiarli e usarli

Risoluzione dell'indirizzo MAC dall'indirizzo IP in Linux