vim Suche um Zeilenumbrüche

12

Wenn ich ein LaTeX-Dokument in vim bearbeite, möchte ich häufig nach einer Phrase suchen. Da ich LaTeX zum Zeilenumbruch eingerichtet habe, befindet sich manchmal die Hälfte der Phrase in einer Zeile, während sich die andere Hälfte in der nächsten befindet. In einem solchen Fall findet die Suche nicht das, wonach ich suche. Also zum Beispiel

blah blah blah hello
world blah blah blah

Bei der Suche mit /hello worldfinde ich nicht, wonach ich suche. Gibt es eine schnelle und einfache Möglichkeit, diese Suche zu ändern, um mich dahin zu bringen, wo ich sein möchte? Oder noch besser, eine Möglichkeit, vim anzuweisen, Leerzeichen (Leerzeichen, Tabulatorzeichen, neue Zeile) mit Leerzeichen in der Suchzeichenfolge abzugleichen?

Bryan Ward
quelle

Antworten:

14

Nach mehr Suche sieht es so aus, als ob der einfachste Weg dies zu tun ist \_s. Also zum Beispiel:

/hello\_sworld
Bryan Ward
quelle
4
Vielleicht möchten Sie, hello\_s\+worlddass mehr als ein Leerzeichen dazwischen steht.
Wodin
5

Dieses Problem wurde unter http://vim.wikia.com/wiki/Search_across_multiple_lines behoben . Enthalten ist eine Funktion, die das kann, was ich brauche.

function! SearchMultiLine(bang, ...)
  if a:0 > 0
    let sep = (a:bang) ? '\_W\+' : '\_s\+'
    let @/ = join(a:000, sep)
  endif
endfunction
command! -bang -nargs=* -complete=tag S call SearchMultiLine(<bang>0, <f-args>)|normal! /<C-R>/<CR>

Dann können Sie eine mehrzeilige Suche mit durchführen :S hello worldund diese in konvertieren hello\s\+worldund danach suchen. Ein weiteres nettes Feature ist, dass dadurch auch diese neue Suche zum Suchverlauf hinzugefügt wird. Auf diese Weise können Sie zurückgehen und die Suche q/bei Bedarf mit ändern . Es kann auch zum Ersetzen mit verwendet werden :%s//new thing/g. Der Nachteil ist, dass es nicht verwendet wird, incsearchwenn Sie es aktiviert haben.

Bryan Ward
quelle
3

Die Art, wie ich sie kenne, ist nicht schwer, aber ein bisschen langweilig. Ersetzen Sie jedes Leerzeichen in Ihrer Suchanfrage durch Folgendes:

[ \t\n]\+

(Beachten Sie das Leerzeichen nach dem [.) Dies ist die Übereinstimmungssyntax für reguläre Ausdrücke. Aufgeschlüsselt bedeutet es:

  • [...] bedeutet, dass ein beliebiges Zeichen aus der Liste der Zeichen in den Klammern gefunden wird.
  • \t ist Tab
  • \n ist Newline
  • ...\+ bedeutet Übereinstimmung mit einem oder mehreren der vorhergehenden.

Für weitere Informationen zu regulären Ausdrücken können Sie vim fragen:

:help regexp
:help usr_27
Jander
quelle
1

Ich persönlich würde [ \t\n]*anstelle von Leerzeichen verwenden. Dies wird auf null oder mehr von '', tab und newline passen. Wenn sich eine Instanz Ihres Suchmusters über einen Zeilenumbruch erstreckt, eine andere jedoch nicht, werden beide gefunden.

Alesplin
quelle