Vim, il ritorno – Parte II

Premessa storica

Nella prima parte si è fatto cenno alla modifica dell’aspetto grafico dello storico editor (versione IMproved) che equipaggia da sempre le distribuzioni GNU/Linux e ancora prima – dal 1976 anno del suo primo rilascio –  i sistemi UNIX in generale. Ma se miglioriamo l’aspetto grafico dell’editor ma poi non si è capaci di utilizzarlo la prima parte non serve praticamente a niente! Per tale motivo questo secondo appuntamento vuole coprire alcune delle funzioni di base, funzioni che permettono un inizio proficuo con questo storico e, per certi versi, incredibile editor.

Prima di iniziare è opportuno ricordare il contesto storico della nascita del suo predecessore Vi, contesto storico che farà apparire più chiaro il perché delle scelte di un editor modale con funzioni raggiungibili solo ed esclusivamente da tastiera: oggi chi utilizza Vim può di fatto dimenticare l’uso del mouse! Nell’anno del primo rilascio di Vi (1976) ad opera di William Nelson Joy i computer erano una sorta di “combo” contenenti il monitor CRT (Cathode-Ray Tube, Tubo a Raggi Catodici) e la tastiera, una classica QWERTY simil macchina da scrivere senza i tasti cursore e con eventuale tastierino numerico solo collegabile esternamente.

Un Lear Siegler ADM-3 con in esecuzione una RaspBerry Pi – Fonte “Hackaday”: https://hackaday.com/2014/02/08/raspi-powered-adm-3a-dumb-terminal/

Un esempio di tali “combo” è Lear Siegler ADM-3A visibile nell’immagine in alto. Notare l’assenza di  (primordiali) mouse così come  dei tasti funzione, cursore e del tastierino numerico. Quest’ultimo, unitamente ai tasti cursore, verrà implementato solo in seguito con il modello Lear Siegler ADM-5 visibile nell’immagine in basso.

Un Lear Siegler ADM-5 con in esecuzione GNU/Linux – Fonte “nIGHTFALLCREW”: https://www.nightfallcrew.com/11/02/2015/lear-siegler-lsi-adm-5/?lang=it

Accennato al contesto storico della nascita di Vim è ora possibile riprendere il filo del discorso. È stato già detto che ci troviamo di fronte ad un editor modale. Quando lo si lancia, per la creazione o nell’apertura di un file, si apre in modalità comando.

Schema di principio delle modalità di Vim

Occorre osservare che una delle potenzialità di Vim vede la non necessità di avere un ambiente grafico attivo. In altre parole può essere utilizzato senza alcun problema anche quando si avvia una distribuzione in modalità testo (e.g. per manutenzione) e quindi, per lo stesso motivo, può essere proficuamente utilizzato su macchine server per ordinaria configurazione, straordinaria manutenzione ecc. Se però non sappiamo come “muoverci” una volta lanciato è praticamente impossibile operare correttamente.

Nella modalità comando, nella quale Vim entra appena lanciato, è possibile compiere solo un certo numero e tipo di operazioni: ad esempio spostamenti del cursore e altre come cancellazione, ricerca e incollare del testo.

Iniziamo ad aprire un file qualsiasi (nell’esempio che segue su un file C) utilizzando il comando:

vim /percorso/file

Premendo Invio si aprirà Vim che oramai sappiamo già essere in modalità comando. A partire da questo momento dimentichiamoci dell’esistenza del mouse poiché per interagire con Vim si dovrà utilizzare solo la tastiera.

Modalità comando

Movimenti base del cursore

L’operazione più semplice vede lo spostamento del cursore utilizzando i tasti:

  • h – spostamento cursore a sinistra di 1 carattere;
  • j – spostamento cursore in basso di 1 carattere;
  • k – spostamento cursore in alto di 1 carattere;
  • l – spostamento del cursore a destra di 1 carattere.

Per questi spostamenti è possibile utilizzare anche i tasti freccia – l’effetto è lo stesso – ma, almeno per coloro che utilizzano la “scrittura cieca” (digitare senza guardare la tastiera), comporterebbe un rallentamento nell’uso perché significherebbe spostare la mano destra.

Ai tasti precedenti è possibile associare un prefisso numerico che indica il numero di spostamenti che dovrà compiere il cursore. Allora, in modalità comando, digitare 7h significa spostare il cursore di 7 caratteri a sinistra così come 3k lo sposta in alto di 3 linee, 5j lo sposta di 5 linee in basso o 9l lo sposta di 9 caratteri a destra. NOTA: durante la digitazione del numero e del comando di spostamento nulla apparirà a schermo.

Quelli riportati non sono gli unici metodi per lo spostamento del cursore nella zona di interesse, ne esistono di più rapidi e mirati:

  • w – porta il cursore all’inizio della parola successiva rispetto all’attuale posizione;
  • b – porta il cursore all’inizio della parola successiva precedente all’attuale posizione;
  • e – porta il cursore alla fine della parola successiva rispetto all’attuale posizione;

Anche in questo caso sono possibili prefissi numerici, ad esempio 3w salta di 3 parole ponendo il cursore alla terza successiva rispetto all’attuale posizione. Medesime considerazioni per il tasti b e e. Dei suddetti comandi ne esiste anche la versione in maiuscolo (shift+tasto) quindi  W, B e E con le medesime funzioni dei corrispondenti minuscoli solo che in questo caso il separatore delle parole è il carattere spazio.

Tra i movimenti di base del cursore oltre allo spostamento per parola è possibile anche lo spostamento per frase (shift+tasto o alt gr+tasto, e.g. per la parentesi graffa in apertura alt gr+7 e per la parentesi graffa di chiusura alt gr+0):

  • ( – sposta il cursore all’inizio della frase;
  • ) – sposta il cursore alla fine della frase (pone il cursore sul primo carattere utile in presenza ddel carattere . nella frase);
  • { – sposta il cursore all’inizio del paragrafo (funzione o blocco in caso di editing di file di codice);
  • } – sposta il cursore alla fine del paragrafo (funzione o blocco in caso di editing di file di codice);

Ulteriori spostamenti sono possibili con i tasti:

  • 0 – sposta il cursore dalla posizione attuale all’inizio della riga;
  • $ – sposta il cursore dalla posizione attuale alla fine della riga;

I movimenti base del cursore prevedono altre specifiche funzioni, ad esempio:

  • ^ – sposta il cursore al primo carattere non spazio della riga attuale;
  • + – sposta il cursore al primo carattere non spazio della riga successiva;
  • – sposta il cursore al primo carattere non spazio della riga precedente;
  • % – cerca la successiva coppia di parentesi tonde, quadre o graffe, commenti (in stile /* */) e define (tipiche del linguaggio C) a partire dalla posizione attuale del cursore sulla stessa riga o quella inferiore.

Da ricordare infine l’opzione n| dove n indica un numero e il carattere “|” è la pipe, pertanto 8| sposterà il cursore sulla ottava colonna della riga corrente. Le funzioni supportate da Vim per i movimenti del cursore non terminano qui, ma al momento sono più che sufficienti per operazioni di base o poco più.

Modalità inserimento

Se si vuole spostare il cursore in un dato punto del file è perché si vuole modificare in qualche modo il file in quel punto, ad esempio per inserire del testo. Per effettuare una tale operazione occorre entrare in modalità inserimento e per farlo si può optare per uno dei seguenti tasti con annessa funzione:

  • i – porta Vim in modalità inserimento permettendo la digitazione di testo prima della posizione attuale del cursore;
  • a – porta Vim in modalità inserimento permettendo la digitazione di testo dopo la posizione attuale del cursore;
  • I – porta Vim in modalità inserimento permettendo la digitazione di testo all’inizio della riga corrente;
  • A – porta Vim in modalità inserimento permettendo la digitazione di testo alla fine della riga corrente;
  • o – porta Vim in modalità inserimento inserendo una riga sotto la riga corrente;
  • O – porta Vim in modalità inserimento inserendo una riga sopra la riga corrente.

È chiaro come nella modalità inserimento risulti possibile inserire, nel file che si sta editando, dal singolo carattere fino a intere linee, ma non ci si può muovere con il cursore. Per avere nuovamente la possibilità di spostarsi con il cursore occorre commutare Vim dalla modalità inserimento alla modalità spostamento premendo il tasto Esc per poi entrare nuovamente nella modalità inserimento nel punto desiderato.

Ulteriori funzioni supportate da Vim e che permettono di inserire testo/codice oltre le operazioni di base precedentemente descritte sono:

  • gI – porta Vim in modalità inserimento permettendo l’inserimento a partire dalla prima colonna della riga corrente;
  • notesto ESC – porta Vim in modalità inserimento, inserisce n volte (quindi n è un numero) il testo digitato a partire dal punto corrente e riporta Vim in modalità spostamento;
  • :r file INVIO – porta Vim in modalità inserimento, inserisce il contenuto di file all’interno del documento a partire dal punto corrente e riporta Vim in modalità spostamento. Ad esempio :r /etc/group INVIO inserisce nel documento che si sta editando il contenuto del file group presente in /etc e esce dalla modalità inserimento.
  • :r! comando INVIO – porta Vim in modalità inserimento, esegue il comando riportato come argomento inserendolo a partire dal punto corrente e riporta Vim in modalità spostamento. Ad esempio :r! ps -aux INVIO inserisce nel documento corrente l’output del comando ps -aux.

Cancellazione del testo

Per cancellare del testo/codice dal documento che si sta editando occorre essere in modalità spostamento. Infatti, da un punto di vista logico, non si può pensare di cancellare il singolo carattere o intere linee di testo in modalità inserimento poiché qualsiasi tasto digitato verrebbe riportato nel documento! Pertanto, dopo essersi assicurati di essere in modalità spostamento (eventualmente pigiando prima il tasto Esc) possiamo procedere alla cancellazione del contenuto in uno dei seguenti modi:

  • x – cancella il carattere sotto il cursore;
  • X – cancella il carattere prima del cursore;
  • nx – con prefisso di ripetizione n (quindi n è un numero), cancellerà n caratteri che capitano di volta in volta sotto il cursore;
  • nX – con prefisso di ripetizione n (quindi n è un numero), cancellerà n caratteri che capitano di volta in volta prima del cursore;
  • dw – cancella la parola sotto il cursore e pone quest’ultimo all’inizio della parola successiva;
  • ndw – con prefisso di ripetizione n (quindi n è un numero), cancellerà le n parole successive;
  • d$ – cancella tutta la riga a partire dalla posizione attuale del cursore. La stessa funzione può essere ottenuta con D.
  • dd – cancella tutta la riga dove è posizionato il cursore;
  • ndd – con prefisso di ripetizione n (quindi n è un numero), cancellerà le n righe successive a partire da quella corrente;
  • d} – cancella tutto il testo fino alla fine del paragrafo attuale;
  • dG – cancella tutto il testo fino alla fine del file.

E il copia e incolla?

Quanto cancellato con i comandi visti nel paragrafo precedente non viene rimosso definitivamente, invero viene memorizzato all’interno di un registro (buffer) con la possibilità di essere utilizzato più volte. Va da se che per queste funzioni occorre portare l’editor in modalità comando pigiando il tasto Esc qualora, ad esempio, fosse in modalità inserimento.

  • :reg INVIO – mostra il contenuto, se presente, dei registri (buffer).

I buffer sono elencati con le lettere dalla a fino alla z, si può visualizzare il contenuto individuale con:

  • :reg m INVIO – mostra il contenuto, se presente, del registro m.

È possibile utilizzare un preciso buffer, ad esempio il c, per operazioni di copia o cancellazione con “c.
Il contenuto di buffer (registro) rimane tale fino a quando non si esce dall’editor o lo si sovrascrive.

Le operazioni di cancellazione precedentemente viste non sono le uniche a memorizzare dati nei registri ma vi sono, naturalmente, anche le operazioni di copia. Le modalità di cancellazione a comandi multipli viste per le operazioni di cancellazione si riflettono anche sulle funzioni di copia.

Per copiare una sezione di testo senza cancellarla si usa il tasto y (acronimo dell’operazione detta di yank, da cui l’utilizzo del tasto y), o meglio y{spostamento} dove spostamento all’interno delle parentesi graffe indicano specifiche combinazioni di tasti già analizzati fino ad ora.

  • y$ – copia nel buffer l’intera riga ad esclusione del carattere di newline al termine della linea;
  • yy – come y$ ed include il carattere di newline: la stessa operazione può essere ottenuta con Y;
  • nyy – con prefisso di ripetizione n (quindi n è un numero), copia nel registro n righe, ad esempio 2yy copia la riga attuale e la successiva;
  • yn) – con prefisso di ripetizione n (quindi n è un numero), copia nel buffer n frasi, ad esempio y3) copia le successive 3 frasi nel buffer. Se n=1, ovvero in caso di comando y), verrà copiata la singola frase.
  • yiw – copia la parola sotto il cursore ad esclusione degli spazi bianchi ai suoi estremi;
  • yaw – come yiw ed include gli spazi bianchi.

Più in generale, senza volerli elencare tutti, il comando yX, dove X è un qualunque comando di spostamento, copia il testo dalla posizione attuale a quella indicata dallo spostamento.

Il testo da copiare è possibile memorizzarlo in un buffer a scelta tra quelli liberi o tra quelli che già contengono del testo ricordando che in quest’ultimo caso si va a cancellare quanto precedente memorizzato.

I comandi per incollare i contenuti copiati vedono:

  • p – incolla il contenuto del registro prima del cursore;
  • P – incolla il contenuto del registro dopo del cursore;
  • gp – come p ma porta il cursore dopo il testo incollato;
  • gP – come P ma porta il cursore dopo il testo incollato.

Volendo utilizzare il buffer r per copiarvi la riga corrente comprensiva del carattere di newline, è sufficiente impartire “ryy.

Se ora si vuole utilizzare il contenuto del registro r per riportarlo (incollarlo) dopo il cursore per poi portarlo alla fine del testo incollato, è sufficiente il comando “rgP.

Gestione file e uscita

Modificato il file, per il salvataggio e/o l’uscita dall’editor è necessaria la conoscenza dei comandi fondamentali per i quali occorre essere in modalità comando. Sostanzialmente vedono:

  • :w INVIO – salva le modifiche apportate al documento;
  • :w nome_file INVIO – salva il documento con il nome nome_file;
  • :x INVIO

    esce dall’editor salvando il documento corrente. La stessa funzione è ottenibile con :wq INVIO o con ZZ (Shift e due volte il tasto z).

  • :q INVIO – esce dall’editor senza salvare il documento corrente. La stessa funzione è ottenibile con ZQ (Shift seguito dai tasti z e q) . Non esce dall’editor in caso di modifiche non salvate.
  • :q! INVIO – esce dall’editor forzatamente anche in caso di modifiche non salvate;
  • :qa INVIO – esce dall’editor chiudendo tutti i file aperti. Non esce dall’editor in presenza di modifiche non salvate.
  • :qa! INVIO – esce dall’editor forzatamente anche in caso di modifiche non salvate.

Si hanno, a questo punto, un numero sufficiente di elementi per iniziare a fare un po’ di pratica con qualsiasi file (sulle copie, mai sugli originali!).

Potrebbero interessarti anche...