W vimie szukaj wstecz pasujących nawiasów klamrowych / parens

10

Jak zapewne większość z was wie, można użyć %do wyszukiwania do przodu w linii, aby znaleźć następny sparowany nawias klamrowy / wspornik / paren i przejść do odpowiedniego partnera:

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

Mam nadzieję, że istnieje podobny klucz, który wyszukuje wstecz w wierszu, np .:

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

Większość poleceń vima ma zarówno wstecz, jak i do przodu, więc wydaje się, że tak powinno być. Czy to nie ma partnera? Jeśli tak, jest to, że ponieważ raz to na połączonemu charakterze będą działać tak samo?

Kevin
źródło
Należy zauważyć, że %nie tylko szuka sparowanego nawiasu w tym samym wierszu, ale również w dalszej części pliku. Podoba mi się to szczególnie w przypadku pętli itp. W dowolnym języku programowania.
Bernhard
1
@Bernhard Tak, ale tylko wtedy, gdy znajdzie jeden z nawiasów klamrowych na linii.
Kevin
Jeśli nie sprzeciwiasz się skryptom dodatków, matchit addon udostępnia g%polecenie, które wydaje się podobne do tego, czego szukasz.
jw013,
Głupie, ale twoje pytanie mówi, że chcesz wiedzieć, dlaczego nie ma partnera. Masz na myśli „czy jest jakiś partner, o którym nie wiem?” :)
rjewell
@ rjewell OK, podzieliłem to, więc technicznie to już nie pyta.
Kevin

Odpowiedzi:

4

Jeśli naprawdę chcesz szukać wstecz pasujących znaków, możesz użyć jednego z następujących vimpoleceń:

  • [(... (przejdź do poprzedniej niedopasowanej (postaci)
  • [{... (przejdź do poprzedniej niedopasowanej {postaci)

Te dwa polecenia mają pasujących partnerów przekazywania:

  • ])... (przejdź do następnej niedopasowanej )postaci)
  • ]}... (przejdź do następnej niedopasowanej }postaci)

Istnieją inne podobne polecenia dla #ifdefi dla komentarzy C.

Możesz znaleźć więcej vimza pomocą polecenia :help %.

Mei
źródło
Wiem o tym, problem polega na tym, że znajdują niedopasowane pary, muszę znaleźć dopasowane pary.
Kevin
@Kevin: Źle zrozumiałem dokumenty (westchnienie). Oczywiście, gdy już użyjesz, %to idzie w obie strony - znalezienie dopasowanego partnera. Ponadto, jeśli wewnątrz bloku, powyższe polecenia znajdą odpowiednie dopasowanie.
Mei
4

% znaleźć pasujący nawias. Więc jeśli jesteś włączony (lub {rozpocznie wyszukiwanie do przodu.

Jeśli jesteś na} lub), przeszuka wstecz.

% nie jest kierunkowe, po prostu znajduje pasujący nawias.

Richard Holloway
źródło
Jeśli jestem za jedną stroną pary,% znajdzie partnera. Jeśli jestem na końcu linii, nie znajdzie pary wcześniej na linii.
Kevin
Czy nie należy wybrać tej właściwej odpowiedzi?
Jack
2

Właśnie próbowałem :map ^] ^%%(z ^]= Ctrl+ v Ctrl+ 5tutaj, jako analogia z %= Shift+ 5).

Działa w określonym przypadku, ale ponieważ nie wyszukuje wstecz od kursora, zawsze wybierze pierwszy otwarty nawias w wierszu i pozostawi kursor na początku wiersza, jeśli nie znajdzie żadnego dopasowania .


To lepsze rozwiązanie; jest brzydka i prawdopodobnie jest dużo miejsca do uproszczenia, ale myślę, że semantyka jest dokładnie poprawna (nie porusza kursorem, jeśli nie ma otwartych paren i przechodzi do pierwszego otwartego paren przed bieżącą kolumną).

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

dla

  • ^]= Ctrl+ v Ctrl+5
  • ^[= Ctrl+v Esc
  • ^M= Ctrl+v Return
Nieprzydatny
źródło
Nie będzie tak samo, jeśli na linii znajdują się dwie nie zagnieżdżone pary, ale na pewno jest to najlepsza jak dotąd sugestia, dzięki.
Kevin
Działa to tylko w obrębie bloku, prawda? Jeśli tak, to [(działałoby równie dobrze i nie wymaga map.
Mei
Nie musiałby być blokiem poczynając od bieżącego wiersza, tak. Znalazłem jednak bardziej kompletne rozwiązanie, edycja nadchodzi ...
Bezużyteczne