Anche se non posso negare di aver lottato troppo con vi all'inizio, penso che si possa sostenere che vi sia in realtà molto semplice da imparare. (Quando ho iniziato a usare Unix la scelta era o vi o emacs, quindi al momento ho scelto ed, essendo un editor di linee molto semplice, che avevo già imparato leggendo i primi libri di testo di Unix.) Uso vi ogni giorno, ma probabilmente usa solo un sottoinsieme molto piccolo delle sue caratteristiche.
Ecco prima un argomento per usare vi: vi esiste su tutti i sistemi, usa pochissime risorse e può essere utilizzabile su connessioni instabili e lente, dove altri editor potrebbero non funzionare o essere lenti e inutilizzabili. O in situazioni in cui il sistema è rotto, quindi i tasti freccia non vengono interpretati correttamente (ad esempio impostazioni errate di terminfo). Quindi vi può essere usato per correggere i file di configurazione che portano al problema, senza essere interessati dal problema.
Ed ecco come imparare un utile sottoinsieme di vi: Primo: smetti di pensare a vi come un "editor" interattivo, con GUI terminale, e guardalo come un linguaggio di programmazione per manipolare i file di testo. All'inizio "vi" stava per VIsual mode, e vi ha una controparte non visuale ex, che è un buon punto di partenza. Digita ex al prompt della shell (userò ¬ per rappresentare return):
$ ex¬
Entering Ex mode. Type "visual" to go to Normal mode.
:
Ora premi invio.
:¬
E749: empty buffer
:
Quindi, mettici qualcosa dentro. Digita "a¬" e digita una riga di testo, quindi un punto su una riga da solo:
:a¬
Hello World¬
.¬
:
Quello era il comando append. Facile, corto e mnemonico. Ma sarebbe bello vedere cosa c'è nel buffer:
:%p¬
Hello World
:
Questo era il comando di stampa, p, ovviamente. % È una scorciatoia per l'intervallo di righe. Ogni comando può essere preceduto da un numero di riga o un intervallo a cui il comando deve essere applicato. % significa "tutte le linee". $ indica l'ultima riga e un punto indica la riga corrente. Un numero indica quella particolare riga. Un intervallo è scritto n, m e un numero può essere aggiunto o sottratto, quindi. + 1, $ - 1 media dalla riga successiva all'ultima riga. Un comando costituito da un solo numero di riga va a quella riga. Ecco il piccolo sottoinsieme rimanente di comandi che uso:
:1i¬
this text is inserted before line 1.¬
.¬
:
:w /tmp/filename¬
"/tmp/filename" [New] 2L, 49C written
:
w scrive tutte (o l'intervallo di) scelto in un file.
:1d¬
elimina la riga 1.
:.s/Hello/Hello,/¬
Hello, World
:.s/$/!/¬
Hello, World!
s sostituisce un'espressione regolare. È bello conoscere le espressioni regolari!
:q¬
E37: No write since last change (add ! to override)
q si chiude. wq scrive ed esce. q! esce senza scrivere, e in modo simile, w! forza una scrittura su un file, se possibile.
Ora bello:
:p
Hello, World!
:.!tr a-z A-Z
:p
HELLO, WORLD!
! come comando filtra le linee in un comando shell.
E infine:
:vi¬
entra in modalità VISUAL. Non farti ingannare. Sembra un editor, ma è ancora solo una shell di programmazione interattiva. Basta dare un'occhiata al buffer per tutto il tempo e qualche altro comando. In modalità visiva a: mostra il prompt: dalla modalità ex. I tasti freccia (se funzionano) si muovono, e se non lo fanno, allora hjkl lo fa! h sinistra, j giù, k su el destra. 0 si sposta sul primo carattere e ^ (pensa regex qui!) Al primo carattere non spaziale sulla linea. $ (regex di nuovo!) si sposta alla fine della riga. Digitando: 999¬ va alla linea 999, naturalmente, proprio come in modalità ex.
"i" entra nella modalità di inserimento, che ora inserisce i caratteri anziché le righe e termina premendo Esc anziché ".¬". "I" inserisce all'inizio, "a" dopo il carattere sotto il cursore e "A" dopo la fine della riga corrente. Premere sempre Esc quando si digita il testo. "x" cancella il carattere sotto il cursore e "D" cancella dal cursore alla fine della riga. "Y" strappa (copia) la linea corrente e "P" la incolla indietro. ": pu" fa lo stesso, ma può essere preceduto da un numero di riga. ": ya" è l'ex equivalente di "Y" e, di nuovo, utile da applicare a un intervallo di linee. Penso che ci sia anche un comando mark, ma ammetterò di non ricordarlo. Non mi manca
Quanto sopra è quello che uso, e so che probabilmente non sono un utente vi molto "efficiente". D'altro canto, utilizzo la versatilità di ex, ad esempio per modificare i file di configurazione degli script. Devi cambiare il tuo hostname foo.bar.com in www.foobar.com in un numero di file conf?
for file in conf/*
do (echo "%s/foo.bar.com/www.foobar.com/" ; echo "wq") |ex $file ; done
Quello che sto cercando di dire è che penso che il problema con vi sia che la gente lo considera un editor difficile. Tutto ciò che serve è cambiare un po 'la tua mentalità e vederlo come un linguaggio di programmazione interattiva molto semplice ma anche molto potente. Così potente che anche con un sottoinsieme dei comandi disponibili, puoi usarlo con grande efficacia - non solo come editor ma come strumento generale, programmabile e ben integrato con il resto di Unix. Dubito che nano farebbe tutto questo - emacs ... forse.