2011-08-24 9 views
16

Say mam ten wiersz tekstu w vim:Usuń od kursora do końca nawias (itd.) W vim

(foo bar (baz) qux) 
    ^

i mój kursor znajduje się na przestrzeni pomiędzy foo i bar jak wskazano. Często stwierdzam, że w sytuacjach takich jak to, chcę usunąć całą prawą stronę zewnętrznego wyrażenia parenthesized (to jest, na prawo od mojego kursora), pozostawiając nienaruszoną lewą stronę. Oznacza to, że chciałbym skończyć z:

(foo) 

Zwykle bym tego dokonać z dt) („usuwać aż )”), ale dodanie zagnieżdżonego nawiasach komplikuje rzeczy: że komenda odejdzie ja z (foo) qux). Mogłabym też użyć d2t), ale wolałbym nie ręcznie numerować zagnieżdżonych nawiasów. Mogłabym też użyć di), ale to usunie wewnątrz nawiasów cały, zostawiając mnie z ().

Czy istnieje ruch vim ze świadomością równowagi i- and a-modified motions, ale czy jest on względny w stosunku do bieżącej pozycji kursora?

Odpowiedz

14

Możesz użyć ruchu ]) z d.

d]) 
+0

Nie wiedziałem o '])'; to na pewno prostsze rozwiązanie niż moje (ale moje nadal powinno działać dla wersji vi). –

+0

@Keith Thompson: Twoje rozwiązanie jest z pewnością kompatybilne z Vi, co jest miłe.Mój strach z twoim rozwiązaniem polega na tym, że jest zależne od 'F (' znajdowania odpowiedniego '' '' 'jump to." Myślę, że wolałbym zrobić 'df)' i powtórzyć w/'.', a następnie' a) ' . Lub 'mxF (' następnie powtórz ruch 'F' z', 'aż do poprawnego' ('zostanie znalezione następnie' '% d'x'' –

+0

Tak, właśnie pomyślałem o przypadku, w którym moje rozwiązanie nie zadziała:' ((przed) foo^(po)) '.' 'F (' lub '? (' znajdzie lewe okienko poprzedzające 'przed ', a nie najbliższe zamykające pozycję kursora. (pamiętam': set seplp 'polecenie od wielu lat temu Widzę, że vim nadal to ma.Jak to robi? Tak, powinienem RTFM.) –

3
mxF(%d`x 

złamanie go:

mx 

Ustaw znak x (pick list cokolwiek chcesz)

F(

Znajdź poprzednia ( bohater

% 

Skocz do dopasowania )

d`x 

Usuń stąd oznaczyć x

który działa dla konkretnego przypadku; Nie jestem pewien, jaki to jest ogólny. Jeśli poprzedni numer ( nie znajduje się w bieżącej linii, należy użyć ?(<return> zamiast F(.

EDIT:
nie wspominając d]) bo nie wiedzą o tym.

Moje rozwiązanie nie zadziała w tym przypadku:

((before) foo (after)) 
      ^

ponieważ przeskakuje z powrotem do najbliższego (, a nie najbliższy załączając(.

Powiązane problemy