*usr_27.txt* Per Vim version 6.2. Ultima modifica: 2003 Ott 28 VIM USER MANUAL - di Bram Moolenaar Traduzione di questo capitolo: Stefano Palmeri Comandi di ricerca e modelli Nel capitolo 3 sono stati menzionati pochi semplici modelli di ricerca |03.9|. Vim può eseguire delle ricerche molto più complesse. Questo capitolo spiega quelle usate più spesso. Una dettagliata spiegazione può essere trovata qui: |pattern| |27.1| Ignorare le differenze tra i caratteri maiuscoli e minuscoli |27.2| Aggirare (nella ricerca) la fine del file |27.3| Scostamento |27.4| Effettuare più volte la ricerca |27.5| Alternative |27.6| Intervalli di caratteri |27.7| Classi di caratteri |27.8| Ricerca di interruzioni di linea |27.9| Esempi Capitolo seguente: |usr_28| La piegatura Capitolo precedente: |usr_26| Ripetizione Indice: |usr_toc|
*27.1* Ignorare le differenze tra i caratteri maiuscoli e minuscoli Di default, le ricerche di Vim rispettano le differenze tra caratteri maiuscoli e minuscoli. Quindi, "include", "INCLUDE" e "Include" sono tre parole differenti ed una ricerca ne troverà solo una. Adesso abilitate l'opzione 'ignorecase':
:set ignorecase
Cercate di nuovo "include" e ora corrisponderà a "Include", "INCLUDE" e "InClUDe". (Impostate l'opzione 'hlsearch' per vedere velocemente dove un modello corrisponda.) Potete disabilitarla di nuovo con :
:set noignorecase
Lasciamola però impostata e cerchiamo "INCLUDE". Troverà esattamente lo stesso testo che "include" aveva trovato . Adesso impostiamo l'opzione 'smartcase' :
:set ignorecase smartcase
Se avete un modello con almeno un carattere maiuscolo, la ricerca rispetterà le differenze tra i caratteri maiuscoli e minuscoli. L'idea è che voi non eravate obbligati a scrivere quel carattere maiuscolo, quindi dovete averlo fatto perché volevate cercare una maiuscola. Questo è intelligente! Con queste due opzioni impostate troverete le seguenti corrispondenze:
modello corrispondenze
word word, Word, WORD, WoRd, etc. Word Word WORD WORD WoRd WoRd CARATTERI MAIUSCOLI E MINUSCOLI IN UN SOLO MODELLO Se volete ignorare le differenze tra i caratteri maiuscoli e minuscoli per uno specifico modello, potete farlo anteponendo la stringa "\c". Usare "\C" fa sì che il modello rispetti le differenze. Tutto ciò sovrascrive le opzioni 'ignorecase' e 'smartcase'; quando "\c" o "\C" vengono usate i loro valori non contano.modello corrispondenze
\Cword word \CWord Word \cword word, Word, WORD, WoRd, etc. \cWord word, Word, WORD, WoRd, etc. Un grande vantaggio nell'usare "\c" e "\C" è che esse rimangono col modello. Così se voi ripetete un modello dalla cronologia delle ricerche, succederà la stessa cosa, senza che abbia importanza se 'ignorecase' o 'smartcase' siano state cambiate.Note:
L'uso di argomenti "\" nei modelli di ricerca dipende dall'opzione 'magic'. In questo capitolo noi assumiamo che 'magic' sia attiva, poichè questa è l'impostazione standard e raccomandata. Se voleste cambiare 'magic', molti modelli di ricerca all'improvviso diventerebbero non validi.Note:
Se la vostra ricerca richiede più tempo di quanto vi aspettaste, potete interromperla conCTRL-C
in Unix eCTRL-Break
in MS-DOS e MS-Windows.
*27.2* Aggirare (nella ricerca) la fine del file Di default, una ricerca in avanti inizia a cercare la stringa data dalla posizione corrente del cursore. Essa poi continua fino alla fine del file. Se fino ad allora non ha trovato la stringa, comincia da principio e cerca dall'inizio del file fino alla posizione del cursore. Tenete a mente che ripetendo il comando "n" per cercare la corrispondenza successiva, potreste eventualmente tornare alla prima corrispondenza. Se non vi accorgete di questo, cercherete all'infinito! Per darvi un consiglio, Vim mostra questo messaggio:search hit BOTTOM, continuing at TOP
Se usate il comando "?", per cercare nell'altra direzione, ricevete questo messaggio:search hit TOP, continuing at BOTTOM
Tuttavia, voi non sapete quando siete tornati alla prima corrispondenza. Un modo per saperlo è quello di attivare l'opzione 'ruler':
:set ruler
Vim mostrerà la posizione del cursore nell'angolo in basso a destra della finestra (nella linea di stato, se ce n'è una). Appare così:
101,29 84%
Il primo numero è il numero di linea del cursore. Ricordate il numero di linea dal quale siete partiti, affinché possiate controllare se avete passato di nuovo questa posizione. NON AGGIRARE LA FINE DEL FILE Per disabilitare l'aggiramento della fine del file in una ricerca , usate il seguente comando:
:set nowrapscan
Adesso quando la ricerca raggiunge la fine del file, un messaggio d'errore dice:
E385: search hit BOTTOM without match for: forever
Così potete trovare tutte le corrispondenze andando all'inizio del file con "gg" e continuando a cercare fino a che non vedete questo messaggio. Se cercate nell'altra direzione, usando "?", voi ricevete:E384: search hit TOP without match for: forever
*27.3* Scostamento Di default, il comando di ricerca lascia il cursore posizionato all'inizio del modello. Potete dire a Vim di lasciarlo in qualche altro posto specificando uno scostamento. Per il comando di ricerca in avanti "/", lo scostamento è specificato aggiungendo uno slash (/) e lo scostamento:
/comportamento/2
Questo comando cerca il modello "comportamento" e poi sposta il cursore all'inizio della seconda linea dopo il modello. Usando questo comando per il paragrafo sopra, Vim trova la parola "comportamento" nella prima linea. Poi il cursore è spostato due linee più sotto e si posa su "uno scostamento". Se lo scostamento è un semplice numero, il cursore sarà posizionato all'inizio della linea che dista quel numero di linee dalla corrispondenza. Lo scostamento numerico può essere positivo o negativo. Se è positivo, il cursore si sposta in basso di quel numero di linee; se è negativo si sposta verso l'alto. SCOSTAMENTO DEI CARATTERI Lo scostamento "e" indica uno scostamento dalla fine della corrispondenza. Esso sposta il cursore sull'ultimo carattere della corrispondenza. Il comando:
/const/e
mette il cursore sulla "t" di "const". Da quella posizione, aggiungendo un numero si sposta in avanti di quel numero di caratteri. Questo comando muove il cursore sul carattere proprio dopo la corrispondenza:
/const/e+1
Un numero positivo sposta il cursore verso destra, uno negativo lo sposta verso sinistra. Ad esempio:
/const/e-1
posiziona il cursore sulla "s" di "const". Se lo scostamento comincia con "b", il cursore si sposta all'inizio del modello. Questo non è molto utile, dal momento che lasciar fuori la "b" fa la stessa cosa. Diventa utile quando si aggiunge o si sottrae un numero. Il cursore dopo va avanti o indietro di quel numero di caratteri. Per esempio:
/const/b+2
Posiziona il cursore all'inizio della corrispondenza e poi due caratteri verso destra. Così si posa sulla "n". RIPETIZIONE Per ripetere una ricerca del precedente modello, ma con un diverso scostamento, lasciate fuori il modello:
/that
//e
E' uguale a:
/that/e
Per ripetere con lo stesso scostamento:
/
"n" fa la stessa cosa. Per ripetere mentre si rimuove un offset usato in precedenza:
//
CERCARE ALL'INDIETRO Il comando "?" usa gli offset nello stesso modo, ma dovete usare "?" per separare l'offset dal modello, anziché "/":
?const?e-2
La "b" e la "e" mantengono il loro significato; essi non cambiano direzione se si usa "?". POSIZIONE DI PARTENZA Quando si comincia una ricerca, essa normalmente inizia dalla posizione del cursore. Quando voi specificate uno scostamento di linea, ciò può causare dei problemi. Ad esempio:
/const/-2
Questo trova la successiva parola "const" e quindi sposta il cursore due linee verso l'alto. Se usate "n" per cercare di nuovo, Vim potrebbe iniziare dalla posizione corrente e trovare la stessa corrispondenza "const". Allora, usando di nuovo lo scostamento, potreste tornare da dove eravate partiti. Dovreste esservi bloccati! Potrebbe essere peggio: supponete che ci sia un'altra corrispondenza con "const" nella linea successiva. In questo caso ripetendo la ricerca in avanti trovereste questa corrispondenza e spostereste il cursore due linee insù. Così in realtà spostereste il cursore indietro! Quando voi specificate uno scostamento di carattere, Vim terrà conto di ciò. In questo modo la ricerca inizia pochi caratteri avanti o indietro, cosicché la stessa corrispondenza non verrà trovata di nuovo.
*27.4* Effettuare più volte la ricerca L'argomento "*" specifica che l'argomento che lo precede può corrispondere un qualsiasi numero di volte. Così:
/a*
corrisponde ad "a", "aa", "aaa", etc. Ma anche a "" (la stringa vuota), poichè le zero volte sono incluse. Il segno "*" influisce solo sull'argomento direttamente prima di esso. Quindi "ab*" corrisponde ad "a", "ab", "abb", "abbb", etc. Per far sì che di un'intera stringa si trovino corrispondenze multiple, essa deve essere raggruppata in un unico argomento. Questo si fa mettendo "\(" prima della stringa e "\)" dopo di essa. Così questo comando:
/\(ab\)*
corrisponde a: "ab", "abab", "ababab", etc. Corrisponde anche a "". Per evitare di trovare le corrispondenze con le stringhe vuote, usate "\+". Questo fa sì che l'argomento precedente abbia una o più corrispondenze:
/ab\+
Corrisponde ad "ab", "abb", "abbb", etc. Non corrisponde ad "a" quando questa non è seguita da una "b". Per trovare le corrispondenze con un argomento con diverse opzioni, usate "\=". Esempio:
/folders\=
corrisponde a "folder" e "folders". CONTEGGI SPECIFICI Per trovare uno specifico numero di corrispondenze degli argomenti usate il formato "\
{n,m}
". "n" e "m" sono numeri. L'argomento che lo precede corrisponderà da "n" a "m" volte (incluse |inclusive|). Esempio:
/ab\
{3,5}
corrisponde ad "abbb", "abbbb" and "abbbbb". Quando "n" è omesso, esso assume il valore di zero. Quando "m" è omesso, esso assume il valore di infinito. Quando ",m" è omesso, esso troverà corrispondenze esattamente "n" volte. Esempi:
modello conteggio corrispondenze
\{,4}
0, 1, 2, 3 o 4 \{3,}
3, 4, 5, etc. \{0,1}
0 o 1, lo stesso che \= \{0,}
0 o più, lo stesso che * \{1,}
1 o più, lo stesso che \+ \{3}
3 CERCARE IL MENO POSSIBILE Fin qui gli argomenti cercano corrispondenze nel maggior numero possibile di caratteri che possono trovare. Per cercare un numero minore di corrispondenze, usate "\{-n,m}
". Funziona allo stesso modo di "\{n,m}
", eccetto per il fatto che ne viene usata la minore quantità possibile. Per esempio, usate:
/ab\
{-1,3}
Troverà "ab" in "abbb". In realtà, esso non troverà mai più di una "b", perché non c'è ragione di cercare oltre. Richiede qualcos'altro per forzare la ricerca di corrispondenze oltre il limite più basso. Le stesse regole si applicano rimuovendo "n" e "m". E' anche possibile rimuoverle entrambe, risultando in "\
{-}
". Questo trova l'argomento prima di esso zero o più volte, il meno possibile. L'argomento in sé stesso corrisponde sempre zero volte. E' utile quando è combinato con qualcos'altro. Esempio:
/a.\
{-}
bQuesto trova le corrispondenze "axb" in "axbxb". Se fosse usato questo modello:
/a.*b
Esso cercherebbe di trovare corrispondenza con il maggior numero possibile di caratteri con ".*", così troverebbe "axbxb" come un tutt'uno.
*27.5* Alternative L'operatore "or" in un modello è "\|". Esempio:
/foo\|bar
Questo trova "foo" o "bar". Più alternative possono venire concatenate:
/one\|
two\
|threeCerca "one", "two" e "three". Per ricercare più volte, tutto deve essere posto tra "\(" e "\)":
/\(foo\|bar\)\+
Questo trova "foo", "foobar", "foofoo", "barfoobar", etc. Un altro esempio:
/end\(if\|
while\
|for\)Questo trova "endif", "endwhile" e "endfor". Un argomento correlato è "\&". Questo richiede che entrambe le alternative corrispondano nello stesso posto. La ricerca risultante usa l'ultima alternativa. Esempio:
/forever\&...
Questo trova "for" in "forever". Non troverà la corrispondenza in "fortuin", per esempio.
*27.6* Intervalli di caratteri Per cercare "a", "b" o "c" potete usare "/a\|b\
|c". Quando voleste cercare tutte le corrispondenze di tutte le lettere dalla "a" alla "z", ciò richiederebbe molto tempo. C'è un metodo più breve:
/[a-z]
Il costrutto [] trova un singolo carattere. All'interno specificate quali caratteri cercare. Potete includere una lista di caratteri, come questa:
/[0123456789abcdef]
Questo troverà le corrispondenze di ogni carattere incluso. Per i caratteri consecutivi potete specificare l'intervallo. "0-3" è uguale a "0123". "w-z" sta per "wxyz". Così lo stesso comando appena visto sopra può essere abbreviato in:
/[0-9a-f]
Per trovare proprio il carattere "-" fate in modo che sia il primo o l'ultimo dell'intervallo. Questi caratteri speciali sono accettati per rendere più facile usarli dentro un intervallo [] (essi in realtà possono essere usati dovunque nel modello di ricerca): \e
<Esc>
\t<Tab>
\r<CR>
\b<BS>
Ci sono alcune situazioni speciali riguardo agli intervalli []; vedete |/[]| per l'intera storia. INTERVALLI COMPLEMENTARI Per escludere la ricerca di uno specifico carattere, usate "^" all'inizio di un intervallo. L'argomento di [] quindi cerca tutte le corrispondenze tranne i caratteri inclusi. Esempio:
/"[^"]*"
" le virgolette [^"] qualsiasi carattere che non siano virgolette * il maggior numero possibile " di nuovo le virgolette Questo corrisponde a "foo" e "3!x", virgolette incluse. INTERVALLI PREDEFINITI Un certo numero di intervalli sono usati molto spesso. Vim offre una scorciatoia per questi. Per esempio:
/\a
Cerca caratteri alfabetici. Questo equivale a usare "/[a-zA-Z]". Qui di seguito ci sono alcune di queste scorciatoie:
argomento corrispondenze equivale a
\d numeri [0-9] \D non-numeri [^0-9] \x numeri esadecimali [0-9a-fA-F] \X numeri non-esadecimali [^0-9a-fA-F] \s spazio bianco [ ] (<Tab>
and<Space>
) \S caratteri non-bianchi [^ ] (not<Tab>
and<Space>
) \l caratteri alfab. [a-z] \L non-lowercase alpha [^a-z] \u uppercase alpha [A-Z] \U non-uppercase alpha [^A-Z]Note:
Usare questi intervalli predefiniti funziona molto più velocemente che non gli intervalli di caratteri equivalenti. Questi argomenti non possono essere usati all'interno di []. Quindi "[\d\l]" NON trova le corrispondenze di un numero o di lettera minuscola. Usate invece "\(\d\|\l\)". Vedete |/\s| per avere l'intera lista di questi intervalli.
*27.7* Classi di caratteri L'intervallo di caratteri trova le corrispondenze con una serie prefissata di caratteri. Una classe di caratteri è simile, ma con una differenza essenziale: la serie di caratteri può essere ridefinita senza cambiare il modello di ricerca. Ad esempio, cercate questo modello:
/\f\+
L'argomento "\f" sta per caratteri di nomi di file. Quindi corrisponde a sequenze di caratteri che possono essere il nome di un file. Quali caratteri possono far parte del nome di un file dipende dal sistema operativo che voi state usando. In MS-Windows, la backslash è inclusa, in Unix non lo è. Questo è specificato con l'opzione 'isfname'. Il valore di default per Unix è:
:set isfname
isfname=@,48-57,/,.,-,_,+,,,#,$,%,~,=
Per altri sistemi il valore di default è diverso. Quindi potete creare un modello di ricerca con "\f" per trovare il nome di un file ed esso automaticamente si adatterà al sistema nel quale lo state usando.
Note:
In realtà, Unix permette di usare qualsiasi carattere nel nome di un file, spazi bianchi inclusi. Includere questi caratteri in 'isfname' sarebbe teoricamente corretto, ma renderebbe impossibile trovare la fine del nome del file nel testo. Quindi il valore predefinito di 'isfname' è un compromesso. Le classi di caratteri sono:argomento corrispondenze opzioni
\i caratteri di identificativi 'isident' \I come \i, escludendo i numeri \k caratteri di parole chiave 'iskeyword' \K come \k, escludendo i numeri \p caratteri stampabili 'isprint' \P come \p, escludendo i numeri \f caratteri di nomi di file 'isfname' \F come \f, escludendo i numeri
*27.8* Ricerca di interruzioni di linea Vim può trovare un modello che includa una interruzione di linea. Dovete specificare dov'è l'interruzione, poichè tutti gli argomenti menzionati fin qui non cercano le interruzioni di linea. Per verificare una interruzione di linea in una posizione specifica, usate l'argomento "\n" :
/the\nword
Questo corrisponderà a una linea che finisca con "the" seguita da una linea che inizi con "word". Per trovare "the word" così com'è, dovete trovare una interruzione o uno spazio bianco. L'argomento da usare per far questo è "\_s":
/the\_sword
Per permettere qualsiasi numero di spazi bianchi:
/the\_s\+word
Questo trova le corrispondenze anche quando "the " è alla fine di una linea e " word" si trova all'inizio della successiva. "\s" trova lo spazio bianco, "\_s" trova lo spazio bianco o una interruzione di linea. Similarmente, "\a" corrisponde a un carattere alfabetico e "\_a" corrisponde ad un carattere alfabetico o a una interruzione di linea. Le altre classi o intervalli di caratteri possono essere modificati nello stesso modo inserendo un "_". Molti altri argomenti possono essere creati per trovare una interruzione di linea anteponendo "\_". Ad esempio: "\_." corrisponde ad ogni carattere od interruzione di linea.
Note:
"\_.*" trova qualsiasi cosa fino alla fine del file. State attenti con questo, poichè può rendere un comando di ricerca molto lento. Un altro esempio è "\_[]", un intervallo di caratteri che includa una interruzione di linea:
/"\_[^"]*"
Questo trova un testo tra virgolette che può essere distribuito in diverse linee.
*27.9* Esempi Ecco alcuni modelli di ricerca che voi potreste trovare utili. Mostrano come possono essere combinati gli argomenti menzionati sopra. TROVARE UNA TARGA AUTOMOBILISTICA DELLA CALIFORNIA Un semplice numero di targa è "1MGU103". Esso ha un numero, tre lettere maiuscole e tre numeri. Mettiamo questo direttamente in un modello di ricerca:
/\d\u\u\u\d\d\d
Un altro metodo è quello di specificare che ci sono tre numeri e lettere con un conteggio:
/\d\u\
{3}
\d\{3}
Usando gli intervalli [] invece:
/[0-9][A-Z]\
{3}
[0-9]\{3}
Quali tra questi potreste usare? Quello che vi ricordate. Il metodo semplice che riuscite a ricordare è molto più veloce del metodo stravagante che non riuscite a ricordare. Se riuscite a ricordarli tutti, evitate l'ultimo, poiché è sia più lungo da battere, sia più lento da eseguire. TROVARE UN IDENTIFICATIVO Nei programmi in C (e in molti altri linguaggi del computer), un identificativo inizia con una lettera e più oltre è composto da lettere e numeri. Anche gli underscore possono essere usati. Questi possono essere trovati con:
/\
<\h\w*\>
"\
<" e "\>
" sono usati per trovare solo parole intere. "\h" equivale a "[A-Za-z_]" e "\w" sta per "[0-9A-Za-z_]".Note:
"\<" e "\>
" dipendono dall'opzione 'iskeyword'. Se essa include "-", per esempio, poi "ident-" non è trovato. In questa situazione usate:
/\w\@<!\h\w*\w\@!
Questo controlla se "\w" non trova corrispondenze prima o dopo l'identificativo. Vedete |/\@<!| e |/\@!|.
Capitolo seguente: |usr_28| La piegatura Copyright: vedere |manual-copyright| vim:tw=78:ts=8:ft=help:norl: Segnalare refusi a Bartolomeo Ravera - E-mail: barrav at libero.it
Generated by vim2html on Thu Jun 17 12:17:02 CEST 2004