2011-04-29

Copia di righe con vim l'editor

Vi o nella versione "improved" vim, va ammesso che può risultare un po' ostico. Ho usato un eufemismo? Ebbene si! Vediamo oggi come si possono copiare una serie di righe da un punto ad un altro di un file di testo con vim (l'ostico).

Supponiamo di voler prendere le righe nell'intervallo da 12 a 18 e copiarle dopo la linea 30.
I modi per poter eseguire la copia in vim sono molteplici, provo ad elencarli sperando di non risultare troppo noioso, premessa: tutte le modalità vanno eseguite partendo dalla modalità COMANDO, nel dubbio premete il tasto <ESC>

  1. Posizionarsi alla riga 12 ( scendendo con le frecce oppure digitando 12G), digitate il numero 7 e poi la Y ( y maiuscola ), posizionarsi alla riga 30 e digitare la lettera p ( p minuscola ).
  2. In qualunque posizione nel file digitare: :12,18t30<INVIO>
  3. Posizionarsi alla riga 30 e digitare: :12,18t.<INVIO>
  4. Posizionarsi alla riga 18 e digitare: :12,.t30<INVIO>
  5. Posizionarsi alla riga 12 e digitare: :.,+7t30<INVIO>
  6. Posizionarsi alla riga 18 e digitare: :-7,.t30<INVIO>
  7. Posizionarsi alla riga 12, digitare mi, posizionarsi alla riga 18, digitare mf, posizionarsi alla riga 30 e digitare: :'i,'ft.<INVIO>

Per poter ricordare i comandi di vim può essere di aiuto capirne la logica invece di memorizzarli tali e quali, per evitare di non annoiare troppo rischio di non spiegare a sufficienza, se lo ritenete necessario chiedete chiarimenti. Nel primo modo il comando Y prefissato dal numero 7 copia in memoria le righe ( tutti i comandi che iniziano per y ( yank=strappare/strattone ) si occupano di copiare testo in memoria, Y ( maiuscola ) è un'abbreviazione di yy che copia la riga corrente) il numero prima di un comando intende che il comando va ripetuto quel numero di volte e nel caso della Y lo esegue per quel numero di righe a partire dalla corrente. Il comando p ( paste=incollare ) copia le righe appena copiate in memoria di seguito alla riga corrente. Il secondo modo utilizza la capacità di vim di interpretare comandi ereditati dal vecchio programma ed, : entra nella modalità di comandi di linea, 12,18 specifica la serie di linee alle quali applicare il comando t ( transfer=trasferire oppure duplicate=duplicare ) dopo la linea 30.  Dal terzo al settimo modo sono versioni molto simili al secondo le differenze sono dovute ai vari metodi usilizzabili per fornire un numero di riga: quando un comando di linea si aspetta un numero di riga si può fornire, chiaramente, il numero di riga oppure . ( punto ) per indicare la riga corrente, un numero con il segno + ( più ) o - ( meno ) come prefisso per indicare la posizione relativa alla riga corrente. Un altro modo per indicare una riga può essere quello di fare riferimento con ' ( apice singolo ) seguito da una lettera ad una marcatura ( come fosse un segnalibro ) posizionata precedentemente con il comando m seguito dalla lettera che la identificherà; nell'esempio le lettere utilizzate sono i come inizio e f come fine in modo da renderle associabili all'inizio e fine dell'intervallo di righe.

La scelta del modo dipende dalla situazione, è pur vero che il modo che ritenete più semplice sarà quello più facile da ricordare ma posso garantire che ognuno dei modi elencati ha la sua utilità particolare e se utilizzate frequentemente vim e fate lo sforzo di memorizzarne qualcuno vi tornerà utile.

L'elenco non è di certo esaustivo, esistono tanti altri modi per copiare e ne esistono anche per copiare parti di testo non corrispondenti a righe intere ma saranno argomento di post futuri.

A propostito della difficoltà che può presentare il primo apprendimento di uso di vi posso citare un tweet che ho letto proprio oggi:
Q: How to generate a random string? A: Put a fresh student in front of vi and tell him to quit.
Traduco per chi con l'inglese fosse messo peggio di me:
D: Come generare una stringa casuale? R: Metti uno studente fresco davanti a vi e digli di chiuderlo.
Effettivamente si può vedere di tutto dentro vi dopo l'utilizzo da parte di un neofita.

Nessun commento:

Posta un commento