Skip to navigation
Logo Penaz's Area

cat /dev/random > penaz

Impariamo VI (Improved): Le Macro


In questa puntata: Macro. Come far fare al computer operazioni noiose e ripetitive con la pressione di pochi pulsanti. Tutto grazie a VI!

Speravate non capitasse mai, ma è successo. La fatidica frase del capo: "Tirami fuori una tabella html da questo log testuale" e di colpo una bella giornata finisce nel baratro e se ne vanno giorni di lavoro solo per riuscire a intabellare un log. Tutto questo succede se non usate VI. Con questo fantastico editor potrete registrare le operazioni da fare su ogni riga e fargliele ripetere all'infinito mentre voi riposate.

Iniziamo, abbiamo il nostro log; in questo caso è il log di un vecchio script che ho creato tanto tempo fa:

Tue Sep 11 11:04:50 2012 - UU Started
Tue Sep 11 11:04:50 2012 - Sync Started
Tue Sep 11 11:07:38 2012 - Fetch Started
Tue Sep 11 11:09:14 2012 - Make Started
Tue Sep 11 11:09:32 2012 - Keyboard Interrupt detected, closing UU

Intabellare una cosa del genere potrebbe risultare molto noiosa, soprattutto quando il log non è lungo solo 5 righe, ma ben 291 (questa è la dimensione attuale del mio log).

Il nostro obiettivo è modificare la prima riga in modo che abbia la struttura che vogliamo per poi far ripetere il tutto a VI. Vediamo come:

Iniziamo posizionandoci sulla prima riga e premiamo:

[q][a]

Questo comando dirà a VI di registrare ciò che accadrà d'ora in poi nel "Registro a", ovviamente VI risponderà prontamente nella barra di stato:

recording

ora iniziamo a modificare il file così:

[i]
<tr><td>

In modo da inserire i tag di riga e dato, ora:

[ESC]
/ [ENTER]

Attenzione: Dopo il "forward slash" c'è uno spazio, effettivamente stiamo proprio cercando uno spazio

Ora premiamo

[n]

Tante volte quante sono necessarie per arrivare allo spazio dopo la fine della colonna cercata, nel mio caso devo premerlo 2 volte, poi diamo:

[x][i]
</td><td>

Con [x] cancelliamo lo spazio per poi entrare in modalità inserimento e chiudere una colonna ed aprirne un'altra, il risultato finora è questo:

<tr><td>Tue Sep 11</td><td>11:04:50 2012 - UU Started

Continuiamo con:

[ESC]
[n]

Per passare allo spazio successivo, nel mio caso questo basta per arrivare dopo l'ora registrata nel log, perciò:

[x][i]
</td><td>

Proseguiamo con:

[ESC]
[n]

Per arrivare allo spazio successivo all'anno, io premerò 3 volte

[x]

Per cancellare i due spazi e il trattino, poi proseguo con:

[i]
</td><td>

poi per finire:

[ESC]
[FINE]
[a]
</td></tr>
[ESC]
[Freccia Giù]
[Inizio]

Con questi comandi: dopo esserci portati alla fine della riga e aver scritto i tag di chiusura html ci portiamo all'inizio della riga successiva; questo è importante per l'esecuzione, così lo script andrà da solo ad operare nella riga successiva.

Possiamo terminare la registrazione con:

[q]

Facciamo un prova richiamando lo script con:

[@][a]

Se la seconda riga si modifica come previsto possiamo eseguire lo script fino alla fine con:

[9][9][9][9][@][a]

In realtà questo comando esegue semplicemente lo script 9999 volte, ma se le righe sono meno, si ferma.

Il risultato sarà:

<tr><td>Tue Sep 11</td><td>11:04:50</td><td>2012</td><td>UU Started</td></tr>
<tr><td>Tue Sep 11</td><td>11:04:50</td><td>2012</td><td>Sync Started</td></tr>
<tr><td>Tue Sep 11</td><td>11:07:38</td><td>2012</td><td>Fetch Started</td></tr>
<tr><td>Tue Sep 11</td><td>11:09:14</td><td>2012</td><td>Make Started</td></tr>
<tr><td>Tue Sep 11</td><td>11:09:32</td><td>2012</td><td>Keyboard Interrupt detected, closing UU</td></tr>

Ora basta inserire i tag:

<html>
<body>
<table border=1>

All'inizio del documento e i tag:

</table>
</body>
</html>

E avrete la vostra tabella in html bella che pronta in soli 5 minuti!

Saluti e al prossimo post!

Penaz.