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?


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 %.


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.


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.