2010-05-27 6 views
12

Wie kann ich den Suchbereich in Vim auf die Funktion/Klasse/Codebaustein beschränken, in der sich der Cursor gerade befindet, ohne die Zeilennummern ermitteln zu müssen? Die Möglichkeit, in der visuellen Auswahl zu suchen, würde auch ausreichen, da es Methoden zum Auswählen des aktuellen Codeblocks gibt.Suchbereich für Code in Vim einschränken

(ähnlich this Frage, aber allgemeineren)

Antwort

12

Ich werde einfach kopieren und den gesamten Inhalt "Searching with/and ?" (within a visual selection) from the Vim Tips Wiki einfügen.

im visuellen Modus, / und ? aktualisiert die visuelle Auswahl wie jeder andere Cursor-Bewegung Befehl (dass ist, wenn im visuellen Modus Suche wird die Auswahl erweitern).

Um innerhalb der visuelle Auswahl, um tatsächlich zu suchen, müssen Sie das \%V Atom, oder verwenden Sie die Marker verwenden definiert durch die visuelle Auswahl mit den \%>'< und \%<'> Atome. Dies ist am besten durch Verlassen der visuellen Auswahl mit Esc vor der Eingabe Ihre Suche. Sie können eine Zuordnung betrachten, um automatisch visuelle Auswahl zu verlassen und die entsprechenden Atome einzugeben. Zum Beispiel: - /, um automatisch in einem "Bereich" für Ihre Suche zu füllen wie einen Ex-Befehl mit : mit

:vnoremap <M-/> <Esc>/\%V 

diese Zuordnung verwenden, können Sie Alt drücken. Um zu verwenden, gehen Sie in die erste Zeile von Interesse und drücken V, um zeilenweise visuelle Auswahl zu starten. Nach unten gehen (drücken Sie j für eine Linie oder } für einen Absatz, usw.). Wenn Sie den Bereich ausgewählt haben, den Sie durchsuchen möchten, drücken Sie drücken Alt - /. Die visuelle Auswahl wird entfernt und ein Suchbefehl wird starten. Sie werden sehen:

/\%V 

hinzufügen, was Sie suchen möchten, drücken Sie dann Geben Sie. Zum Beispiel können Sie grün eingeben und sehen:

/\%Vgreen 

Wenn Sie die Taste Geben Sie, jedes Vorkommen „grüner“ wird hervorgehoben, aber nur in dem Bereich, den Sie hatte zuvor ausgewählt.

Hier sind zwei weitere Beispiele, die keine visuelle Auswahl verwenden. Der erste Befehl sucht nur in den Zeilen 10 bis 20 inklusive. Die zweite sucht nur zwischen Marken a und b.

/\%>9l\%<21lgreen 
/\%>'a\%<'bgreen 
+0

Ich sollte das gefunden habe. * facepalm * – Walter

1

Zur Kürze:

" tldr; 
v i { <ESC> /\%Vsearch-term 

" Search for search-term within the current code block (defined by curly braces {}). 
" Begin in normal mode, then enter the following: 

" enter visual mode 
v 

" look for stuff in-between the current... 
i 

" curly braces enclosure 
{ 

" (now the enclosure should be highlighted) 

" exit visual mode 
<ESC> 

" search the last visual mode selection for search-term 
/\%Vsearch-term 

" note: to search within other enclosures, you can substitute curly braces for: 
" - parenthesis, 
" - square brackets, 
" - or other enclosure pair characters