Suchen Sie in vim rückwärts nach passenden Zahnspangen

9

Wie die meisten von Ihnen wahrscheinlich wissen, können Sie %in der Zeile nach vorne suchen, um die nächste gepaarte Klammer / Klammer / Paren zu finden und zu ihrem passenden Partner zu wechseln:

|a|rray[index] = value;
" |e| is the cursor; hit %:
array[index|]| = value;

Ich hoffe, dass es einen ähnlichen Schlüssel gibt, der in der Zeile rückwärts sucht, z.

array[index] = value|;|
" |;| is the cursor again, hit the key I'm looking for:
array|[|index] = value;

Die meisten vim-Befehle haben sowohl ein Rückwärts- als auch ein Vorwärts-Befehl, daher sollte dies der Fall sein. Hat es keinen Partner? Wenn ja, ist das so, weil sie, sobald es sich um einen gepaarten Charakter handelt, dasselbe tun würden?

Kevin
quelle
Es ist zu beachten, dass %nicht nur in derselben Zeile nach der gepaarten Klammer gesucht wird, sondern weiter unten in der Datei. Ich mag es besonders für Loops usw. in jeder Programmsprache der Wahl.
Bernhard
1
@Bernhard Ja, aber nur, wenn es eine der Klammern in der Linie findet.
Kevin
Wenn Sie nicht gegen Addon-Skripte sind, bietet das Matchit-Addon einen g%Befehl, der dem zu ähneln scheint, wonach Sie suchen.
jw013
Dumm, aber Ihre Frage besagt, dass Sie wissen möchten, warum es keinen Partner gibt. Meinst du "gibt es einen Partner, von dem ich nichts weiß?" :)
rjewell
@rjewell OK, ich habe es aufgeteilt, damit es technisch nicht mehr gefragt wird.
Kevin

Antworten:

4

Wenn Sie wirklich rückwärts nach häufig übereinstimmenden Zeichen suchen möchten, können Sie einen dieser vimspezifischen Befehle verwenden:

  • [(... (gehe zum vorherigen unübertroffenen (Charakter)
  • [{... (gehe zum vorherigen unübertroffenen {Charakter)

Diese beiden Befehle haben übereinstimmende Vorwärtspartner:

  • ])... (gehe zum nächsten unübertroffenen )Charakter)
  • ]}... (gehe zum nächsten unübertroffenen }Charakter)

Es gibt andere ähnliche Befehle für #ifdefund für C-Kommentare.

Weitere Informationen finden Sie vimmit dem Befehl :help %.

Mei
quelle
Ich weiß von ihnen, das Problem ist , finden sie nicht angepasste Paare, ich brauche zu finden abgestimmte Paare.
Kevin
@ Kevin: Ich habe die Dokumente falsch verstanden (seufz). Sobald Sie es verwendet %haben, geht es natürlich in beide Richtungen - den passenden Partner zu finden. Wenn Sie sich innerhalb eines Blocks befinden, finden die obigen Befehle die entsprechende Übereinstimmung.
Mei
3

% finden die passende Klammer. Wenn Sie also eingeschaltet sind (oder {, wird vorwärts gesucht.

Wenn Sie sich auf einem} oder) befinden, wird rückwärts gesucht.

% ist nicht gerichtet, sondern findet nur die passende Klammer.

Richard Holloway
quelle
Wenn ich hinter einer Seite eines Paares stehe, findet% seinen Partner. Wenn ich am Ende einer Zeile bin, wird das Paar nicht früher in der Zeile gefunden.
Kevin
Sollte dies nicht die richtige Antwort sein?
Jack
2

Ich habe es gerade versucht :map ^] ^%%(mit ^]= Ctrl+ v Ctrl+ 5hier als Analogie zu %= Shift+ 5).

Es funktioniert für den angegebenen speziellen Fall, aber da es vom Cursor nicht rückwärts sucht, wählt es immer die erste offene Klammer in der Zeile aus und lässt den Cursor am Anfang der Zeile, wenn keine Übereinstimmung gefunden wird .


Dies ist eine bessere Lösung; Es ist hässlich und es gibt wahrscheinlich viel Raum zum Vereinfachen, aber ich denke, die Semantik ist genau richtig (bewegt den Cursor nicht, wenn kein offener Paren vorhanden ist, und bewegt sich zum ersten offenen Paren vor der aktuellen Spalte).

:map ^] ^[:call search("[({[]", "bes", line("."))^M

zum

  • ^]= Ctrl+ v Ctrl+5
  • ^[= Ctrl+v Esc
  • ^M= Ctrl+v Return
Nutzlos
quelle
Dies ist nicht ganz dasselbe, wenn sich zwei nicht verschachtelte Paare in einer Zeile befinden, aber es ist sicherlich der bisher beste Vorschlag, danke.
Kevin
Das funktioniert nur innerhalb eines Blocks, oder? Wenn ja, dann [(würde es genauso gut funktionieren und erfordert keine map.
Mei
Es müsste einen Block geben, der in der aktuellen Zeile beginnt , ja. Ich habe jedoch eine vollständigere Lösung gefunden, die Bearbeitung kommt ...
Nutzlos