2009-10-11 4 views
31

In vim, Ich möchte oft auf eine Zeichenfolge mit kniffligen Zeichen suchen, die Flucht erfordern. Gibt es eine Möglichkeit, dass ich die Bedeutung aller Sonderzeichen abschalten kann, etwa wie Regex-Off Modus in weniger, oder fgrep?Exakte Zeichenfolge Übereinstimmung in Vim? (Wie 'Regex-off' Modus in weniger.)

Ich beschäftige mich mit besonders haarigen Saiten; Hier ist ein Beispiel:

Nicht alle Zeichen zu entkommen, um eine Suche in Vim zu tun wäre ein großer Zeitspan.

\ V in Vim hilft mit einigen Metazeichen, aber nicht kritisch/oder \.


Vielen Dank! Am Ende habe ich das mein .vimrc hinzugefügt:

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

In 'less' können Sie regex mit'/'' Ctrl-R' ausschalten. – blubb

Antwort

18

an Ihrem spezifischen Beispiel Sehen, wahrscheinlich der einfachste Weg, diese (da \ V wird hier nicht helfen) zu tun ist, ? zu verwenden, anstatt /: dann werden Sie nicht die / s entkommen müssen:

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

Dies wird rückwärts statt vorwärts suchen, aber Sie können immer 'N' statt 'n' tun, um nach dem ersten Schritt vorwärts zu suchen.Oder Sie können / drücken, gefolgt von der Pfeiltaste nach oben, um die Vorwärtsstriche automatisch zu entfernen.

Es gibt jedoch nichts, was Sie leicht tun können, wenn Sie Backslashes umgehen. Ich denke, man könnte tun:

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

und dann n verwenden, um zu suchen, aber es ist wahrscheinlich nicht viel einfacher. Das Beste, was ich mit oben kommen kann ist:

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

Dann tun:

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

Große Antworten, aber die Eingabe zu entkommen ist wahrscheinlich die nächste, die ich zu No-Regex bekommen werde. Keine Suche während der Eingabe, aber auch nicht "weniger"! – jogloran

+0

: g # ((N/N)/(N/N))/N ##! funktioniert für Ihr Beispiel. Für such-wie-Sie-Typ funktioniert auch? ((N/N)/(N/N))/N, sucht aber rückwärts. – Teajay

27

auf der genauen Zeichenfolge Je Sie suchen, der \V Präfix wird wahrscheinlich den Trick.
Siehe :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' 

Also, wenn ich einen String hello.*$world habe, kann ich /\V.*$ den Befehl nur .*$ zu finden - die nur einen Teil der Zeichenfolge die Flucht sollte brauchen eine andere Backslash ist, aber Sie kann immer noch gruppieren usw., indem Sie das Sonderzeichen umgehen.


Ein weiterer Befehl, den Sie verwenden können, um "zu vermeiden" Slashes ist:

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

Der :g Befehl eine globale Suche ist, stellt fest, dass:

:[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. 

Also wo ich eine # Sie könnten ein ?, @ oder ein anderes Zeichen verwenden, das die obige Bedingung erfüllt. Der Catch mit diesem :g Befehl ist, dass es einen Befehl am Ende erwartet, also, wenn Sie kein abschließendes Leerzeichen hinter dem letzten Zeichen haben, führt es die Suche nicht wie erwartet aus. Und auch wenn Sie \V verwenden, müssen Sie immer noch Backslashes umgehen.

Wenn die noch nicht schneiden für Dich hat this Nabble post einen Vorschlag, der eine Zeichenkette mit eingebetteten Schrägstrichen und anderen speziellen Vim Zeichen nimmt und behauptet, es ohne ein Problem zu suchen; aber es erfordert das Erstellen einer Vim-Funktion, die in Ihrer Umgebung möglicherweise nicht in Ordnung ist.

+0

Danke! Aber ich versuche, Strings zu finden, die wahrscheinlich speziell dafür gebaut wurden, Vims Flucht zu vereiteln. Ich habe die Frage mit einem Beispiel bearbeitet. Sind Sie sich bewusst, wie Sie die Bedeutung von _all_ speziellen Metazeichen loswerden können, einschließlich \ und /, genau wie/usr/bin/less mit no-regex (Strg + R)? – jogloran

5

Vielleicht so etwas wie folgt aus:

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

Es wird Ihnen eine / prompt und verhalten sich ansonsten wie die integrierte Suche, aber es wird nicht suchen-wie-du-Typ oder andere solche Leckereien tun.

+0

(Dies verwendet ': /', was zeilenbasiert funktioniert, so dass der Cursor an den Anfang der Match-Zeile gesetzt wird; im Gegensatz zu '/', das zur Position des Matches innerhalb seiner Linie springt.)) –

+0

Das zweite '' '' 'in' escape (..., '\\ /') 'ist überflüssig, weil der zweite Parameter von 'escape()' eine Liste von Zeichen ist und einfache Anführungszeichen ein ['' ... '' Literal angeben Zeichenfolge] (http://vimdoc.sourceforge.net/htmldoc/eval.html#literal-string), in der keine Escape-Sequenzen interpretiert werden. (Ich schlage vor, "/ \" zu schreiben, um es visuell sichtbar zu machen, dass das '' '' 'nicht' '' '' –

Verwandte Themen