next up previous

Next: Varie Up: Tutorial sull'editor VI Previous: Comandi operativi

Comandi per il controllo dei file



  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