2009-10-11 10 views
31

In vim, spesso voglio cercare su una stringa con caratteri schizzinosi che hanno bisogno di scappare. C'è un modo in cui posso disattivare il significato di tutti i caratteri speciali, un po 'come regex-off in modalità in meno, o fgrep?Corrispondenza esatta stringa in vim? (Come la modalità 'regex-off' in meno.)

Mi occupo di archi particolarmente pelosi; Ecco un esempio:

((N/N)/(N/N))/N 

Non dover sfuggire a qualsiasi personaggio per effettuare una ricerca in Vim sarebbe un notevole risparmio di tempo.

\ V in Vim aiuta con alcuni metacaratteri, ma non criticamente/o \.


Grazie a tutti! Alla fine, ho aggiunto questo al mio Vimrc:

command! -nargs=1 S let @/ = escape('<args>', '\') 
nmap <Leader>S :execute(":S " . input('Regex-off: /'))<CR> 
+1

In 'less', è possibile disattivare regex con'/'' Ctrl-R'. – blubb

risposta

18

Guardando il tuo esempio specifico, probabilmente il modo più semplice per farlo (poiché \ V non aiuterà qui) è quello di utilizzare ? invece di /: allora non dovrete sfuggire alle / s:

?((N/N)/(N/N))/N 

Questo cercherà all'indietro anziché in avanti, ma puoi sempre fare 'N' invece di 'n' per cercare in avanti dopo il primo andare.Oppure puoi premere / seguito dal tasto cursore su per uscire automaticamente dalle barre.

Tuttavia, non c'è nulla che si possa fare facilmente per eseguire il backslash di escape. Credo che si potrebbe fare:

:let @/ = escape(pattern, '\') 

e quindi utilizzare n per la ricerca, ma non è probabilmente molto più facile. Il meglio che posso venire in mente è:

:command! -nargs=1 S let @/ = escape('<args>', '\') 

Poi fare:

:S (N)/(N+1)\(N) 
n 
+0

Ottime risposte, ma sfuggire l'input è probabilmente il più vicino possibile a No-regex. Nessuna ricerca mentre scrivi, ma di nuovo non fa "meno"! – jogloran

+0

: g # ((N/N)/(N/N))/N ##! funziona per il tuo esempio. Per ricerca-come-tu-type, anche ((N/N)/(N/N))/N funziona, ma cerca all'indietro. – Teajay

27

seconda della stringa esatta che stai cercando, il prefisso \V probabilmente fare il trucco.
Vedi :help \V:

after: \v  \m  \M  \V   matches ~ 
       'magic' 'nomagic'  
      $  $  $  \$   matches end-of-line 
      .  .  \.  \.   matches any character 
      *  *  \*  \*   any number of the previous atom 
     ()  \(\)  \(\)  \(\)  grouping into an atom 
      |  \|  \|  \|   separating alternatives 
      \a  \a  \a  \a   alphabetic character 
      \\  \\  \\  \\   literal backslash 
      \.  \.  .  .   literal dot 
      \{  {  {  {   literal '{' 
      a  a  a  a   literal 'a' 

Quindi, se ho una stringa hello.*$world, posso usare il comando /\V.*$ per trovare solo .*$ - l'unica parte della stringache dovrebbe avere bisogno di fuga è un altro backslash, ma si può ancora fare raggruppamenti, ecc., sfuggendo al simbolo speciale.


Un altro comando è possibile utilizzare per "evitare" slash è:

:g #\V((N/N)/(N/N))/N# 

Il comando :g è una ricerca globale, notando che:

:[range]g[lobal]/{pattern}/[cmd] 
         Execute the Ex command [cmd] (default ":p") on the 
         lines within [range] where {pattern} matches. 

Instead of the '/' which surrounds the {pattern}, you can use any other 
single byte character, but not an alphanumeric character, '\', '"' or '|'. 
This is useful if you want to include a '/' in the search pattern or 
replacement string. 

Allora, dove ho usato un # , è possibile utilizzare uno ?, @ o qualsiasi altro carattere che soddisfa la condizione di cui sopra. Il problema con il comando :g è che si aspetta un comando alla fine, quindi se non si dispone di uno spazio finale dopo il carattere finale, non eseguirà la ricerca come ci si aspetterebbe. E ancora, anche se stai utilizzando \V, dovrai comunque evitare i backslash.

Se questo ancora non taglia per voi, this Nabble post ha un suggerimento che prende una stringa letterale con backslash incorporati e altri caratteri speciali Vim, e sostiene di cercare senza un problema; ma richiede la creazione di una funzione Vim, che può o meno essere a posto nel tuo ambiente.

+0

Grazie Marco! Ma sto cercando di abbinare stringhe che sono probabilmente costruite appositamente per frustrare la fuga di Vim. Ho modificato la domanda con un esempio. Sei a conoscenza di un modo per eliminare il significato di tutti i metacaratteri speciali, inclusi \ e /, proprio come/usr/bin/less con no-regex (Ctrl + R) fa? – jogloran

5

Forse qualcosa di simile:

nmap <Leader>s :execute '/\V' . escape(input('/'), '\\/')<CR> 

E ti do un / pronta e si comportano come altrimenti la ricerca integrata, ma non farà ricerca-come-tu-tipo o altre cose del genere.

+0

(Questo usa ': /', che funziona in base alla riga, in modo che metta il cursore all'inizio della linea della corrispondenza; (a differenza di '/', che salta alla posizione della corrispondenza all'interno della sua linea.) –

+0

secondo '' \ '' in 'escape (..., '\\ /')' è ridondante, perché il secondo parametro di 'escape()' è una lista di caratteri, e le virgolette singole indicano un [''...'' letterale string] (http://vimdoc.sourceforge.net/htmldoc/eval.html#literal-string) in cui nessuna sequenza di escape viene interpretata. (Suggerisco di scrivere ''/ \'' per renderlo visivamente evidente che il '' \ '' non sfugge a '/'.) –

Problemi correlati