Si tratta di un approfondimento dei comandi dati da DIRECTIVE MODE (":"). Nota: se in fondo al video compare un prompt ":" e non si riesce a lavorare con vi, può significare che si è entrati nell'editor di linea "ed". Digitare 'vi' al prompt per rientrare in editor "vi" (è possibile invece confermare l'entrata in "ed" digitando ^$). :#,#<command>[!][filenm] formato generale; gli '#' rappresentano comandi di movimento, oppure numeri di linea per indicare le posizioni da/a. Uno dei '#' può essere: +# #sotto -# #sopra . linea corrente $ ultima linea :s/<search>/<replace>/[#gc] SUBSTITUTE: sostituisce <search> con <replace> una volta in una linea, se è specificato 'g' allora sostituisce tutto all'interno della linea. 'c' serve per la conferma, '#' serve per sostituire in "#" linee. Vedere <SEARCH> e <REPLACE> per maggiori informazioni su questi comandi <SEARCH> <SEARCH> può avere sub-espressioni, \(exp1\)[junk]\(exp2\) definite con una coppia di "\(" e "\(" (fino a 9 espressioni) <REPLACE> <REPLACE> può avere descrittori \# junk \# \# junk delle espressioni, definite da un "\#", dove '#' è un numero 1 - 9 Esempio: s/\(.*\)=\(.*\)/\2 = \1/ scambia LHS con RHS di un segno 'uguale a' in una linea con il formato: [something] = [something] :#1,#2g/<search>/<ex command> questo comando cercherà ogni occorrenza di <search> compresa tra le linee #1 e #2 ed eseguirà il comando <ex command>. L' "ex command": s//<replace>/[gc] cercherà <search> (// significa l'ultima ricerca) e lo sostituirà con <replace>. Utilizzare altri comandi come elencato sotto, quali "p" o "d". #1,#2 c <text><.> CHANGE: cambia le linee da #1 a #2 con <text>; per uscire da questa modalità, digitare un '.' (period) da solo all'inizio di una linea. :#1,#2 co #3 COPY: copia linee nello stesso modo descritto sopra :#1,#2 t #3 comando corrispondente a 'co' :#1,#2 d DELETE: cancella le linee da #1 a #2 Esempio: :'a,'bd cancella le linee dal mark 'a' fino a 'b' :#1,#2 y "<alpha> esegue lo YANK di linee nel buffer con nome <alpha>; se viene utilizzato l'alfabeto maiuscolo, allora yank aggiungerà al buffer :e[!] [filename] esegue l'EDIT del file corrente("!" indica una forzatura, per editare 'filename' se viene specificato); nel caso in cui non sia presente la forzatura, se si vuole editare un nuovo file e quello corrente non è stato salvato, viene rilasciato un avvertimento ed il nuovo edit non viene eseguito (sarà quindi necessario salvare, oppure editare con la forzatura; in quest'ultimo caso vengono persi i cambiamenti fatti nel file corrente) :e# esegue l'EDIT alternativamente di due file (è necessario editare un altro file, e poi usare l'"e#" per editare nuovamente il primo file) :e # esegue l'EDIT del file alternato e riprende all'ultima posizione del cursore :#1,#2 m #3 MOVE: sposta le linee tra #1 e #2 e le posiziona a #3 Esempi: :10,15m25 sposta 5 linee (comprese tra la 10 e la 15) alla linea 25 :1,.m $ sposta alla fine del file le linee comprese tra la linea 1 e quella corrente :#1,#2 p PRINT: stampa le linee indicate (senza fare alcun cambiamento al file) :#1r[!] [filename] READ: legge il file corrente (applicando le opzioni sopra descritte); se sono specificati il "filename" e "#1", allora inserisce il file alla posizione "#1" (l'inizio del file è la linea 0, e la fine è $) Esempio: :r pippo carica il file 'pippo' nella posizione in cui si trova attualmente il cursore :r !UNIX-CMD READ: legge l'output del comando UNIX 'UNIX-CMD' come input al file, caricandolo nel buffer :n[filenames][!] NEXT: edita il file successivo nella lista degli argomenti; se viene messa la forzatura '!', non aggiorna il file corrente. Nel caso in cui sia stato specificato un elenco di file da editare, vi edita i file uno alla volta Esempio: :n a.c b.c c.c d.c edita 4 file, cominciando con a.c e successivamente: :n e.c f.c aggiunge i file e.c ed f.c alla lista, andando in editing di e.c Nota: con vi è possibile editare molteplici file già con il comando di lancio dell'editor Esempio: vi *.c :args mostra i file che 'vi' stà attualmente editando; dopo il comando ":n" sopra riportato nell'esempio, digitando ":args" comparirà [a.c] b.c c.c d.c dove le parentesi [] includono il file corrente :rew [!] REWIND: ricomincia ad editare i file a partire dal primo file della lista; vedere il comando ":n" :st[op] STOP: blocca il 'vi' ed esce alla shell; per rientrare in 'vi', digitare "fg" al prompt di UNIX :sh lancia una shell (solitamente una bourne shell); si ritorna nell'editor con ^d :!<command> esegue un comando UNIX, indicato con 'command', all'esterno del 'vi' Esempio: :1,10 w !lpr invia le prime 10 linee alla stampante senza che sia necessario creare un altro file (cioè utilizza il file senza causarne variazioni) :!! ripete l'ultimo comando ':!<command>' #!!<command> esegue il comando shell indicato con 'command' e sostituisce il numero di linee specificato con '#' con l'output del comando; se non viene specificato '#', il default e' 1. Se il comando UNIX si aspetta uno standard input, allora le linee specificate verranno usate come input Esempio: 10!!sort sorta le 10 linee successive !$lt;lines><command> funziona come il precedente comando '#!!<command>', tranne che per il fatto che 'lines' è un indirizzo di linea, o delimitatore, necessario per poter eseguire il comando. Esempio: !Gsort sorta le rimanenti linee del file Il testo compreso tra la posizione corrente del cursore ed il delimitatore 'lines' è dato in input a 'command' (ad esempio, sort) e viene poi sostituito con l'output del processo 'command' lanciato. Delimitatori validi possono essere, ad esempio, ')' o '}' per dare in input a 'command' una frase o un paragrafo. Si noti che solo quando viene digitato il delimitatore (che può essere anche un secondo punto esclamativo) il cursore si posiziona sulla linea delle direttive, visualizzando '!' & esegue solamente l'ultima ricerca- sostituzione % corrisponde a "1,$", cioè: :%s/a/b/ sostituirà la prima occorrenza di 'a' con 'b' attraverso tutto il file Alcuni simboli speciali includono: & propriamente, la parola chiave ricercata Esempio: :s/tr/&ace sostituisce 'tr' con 'trace' \U trasforma in lettere maiuscole ciò che lo segue Esempio: :s/case/\U&/ cambia 'case' in 'CASE' \u trasforma in maiuscolo solamente il primo carattere \L converte in lettere minuscole \l converte in minuscolo solamente il primo carattere ESEMPI DI RICERCHE GLOBALI Con i comandi EX abbiamo già visto come sia possibile effettuare delle ricerche globali, che agiscono sull'intero file editato. :g/bad/d cancella tutte le linee che contengono la stringa 'bad' :g/bad/p stampa tutte le linee che contengono la stringa 'bad' :g/bad/co $ copia tutte le linee che contengono la stringa 'bad' alla fine del file (per invertire il comando, e quindi aggiungerle all'inizio del file, lanciare il comando con '1' invece di '$') :g/hello/ y"A esegue uno YANK di tutte le occorrenze di 'hello' nel buffer con nome 'a'. È importante notare la lettera maiuscola nel nome del buffer; se viene utilizzata la lettera minuscola, dopo aver eseguito il comando nel buffer esisterà solamente l'ultima occorrenza della parola