Czy możesz przechwytywać lub usuwać między nawiasami w vi / vim?

128

Biorąc pod uwagę ten wiersz kodu w C:

printf("%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32)));

Czy istnieje sposób na usunięcie lub szarpnięcie z pierwszego pogrubionego nawiasu do odpowiadającego mu nawiasu? Myślałem o df) , ale to doprowadzi Cię dopiero tuż po 9.0.

Czy jest podobny sposób, aby vim przechwytywał wszystko pomiędzy pasującymi nawiasami klamrowymi, niezależnie od nowych linii?

romandy
źródło

Odpowiedzi:

167

Różne ruchy:%

%Polecenie przeskakuje do meczu elementu pod kursorem. Ustaw kursor na otwierającym (lub zamykającym) okienku i używaj go y%do szarpania lub d%usuwania wszystkiego, od kursora do pasującego paska.

Działa, ponieważ %jest "poleceniem ruchu", więc może być użyte wszędzie tam, gdzie vim oczekuje takiej komendy. Od :help y:

["x]y{motion}       Yank {motion} text [into register x].  When no
                    characters are to be yanked (e.g., "y0" in column 1),
                    this is an error when 'cpoptions' includes the 'E'
                    flag.

Domyślnie „pozycja” zawiera nawiasy, nawiasy klamrowe, pareny, komentarze w stylu C i różne instrukcje prekompilatora ( #ifdefitd.).

Jest wtyczka do "rozszerzonego% dopasowania", którą możesz znaleźć na stronie domowej Vima .

Możesz przeczytać dokumentację %i powiązane polecenia ruchu, wchodząc :help various-motionsw tryb poleceń.

wybór obiektu

Istnieje inny zestaw poleceń ruchu, których można używać w trybie wizualnym do wybierania różnych obiektów tekstowych.

Aby rozwiązać konkretny problem, wykonaj następujące czynności:

printf("%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32)));
                                   ^

Powiedzmy, że kursor jest ustawiony na ^. Wprowadź następującą sekwencję, aby wybrać część, której szukasz:

v2a)

Najpierw vwchodzi w tryb wizualny, a następnie określasz, że chcesz 2zwiększyć poziomy parametrów. Na koniec a)wybiera „blok”. Następnie możesz użyć dlub xusunąć itp.

Jeśli nie chcesz dołączać zewnętrznych par, możesz zamiast tego użyć „wewnętrznego bloku”:

v2i)

Zobacz :help object-selectpełną listę powiązanych poleceń.


źródło
Dzięki! Wiedziałem o% przełączania się między pasującymi przedmiotami; nie wiedział, że jest przydatny również w poleceniach. +1 i zaakceptowane.
romandas
5
Co ciekawe, zawsze myślałem a, że chodziło o „wokół” zamiast „a”. Poczuj się, jakby lepiej uzupełniał „wewnętrzny”. Wydaje się, że nie ma dnia, żeby nie dowiedzieć się czegoś nowego o Vimie.
Andrew Marshall,
217

A co z diblub di(.

Spowoduje to usunięcie wewnętrznego (...) bloku, w którym znajduje się kursor.

Uwielbiam ruchy obiektów tekstowych i zaznaczenia!

CMS
źródło
10
Na szczęście to pytanie jest pierwszym trafem, kiedy wyszukuję go w Google - nie wiem, ile razy ta odpowiedź mnie uratowała. I zawsze o tym zapominam… :-(
Konrad Rudolph
16
Czy można usunąć, w tym nawiasy? (tak, mam odpowiedzi na moje własne pytanie: dab=> Usuń z bloku (w tym jego nawiasach)
bantic
5
Głosuję za. Dodatkowo, jeśli chcesz poprawić słowo w nawiasach, zrób ciw .
Deweloper Marius Žilėnas
5
+1! Byłem oszołomiony, kiedy ostatnio odkryłem ruchy obiektów tekstowych! koniec z próbami umieszczania kursora we właściwym miejscu, aby szarpać tekst: D
verboze
36

Aby usunąć wszystko, co znajduje się w nawiasach, zawsze możesz wydać di(i jego pochodne.

Uwaga :

Jak zasugerował @porglezomb w swoim komentarzu, możesz użyć a(„wraz z”) zamiast i(„wewnątrz”), aby uwzględnić nawiasy. Tak więc, stosując da(Usuwa wszystko wewnątrz (i )tym (i ).

Usuwanie tekstu w bezpośredniej zewnętrznej parze nawiasów:

Tak więc dla tej linii kodu

printf("%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32)));
                                ^       ^
                                |       |
                                 \_______\___---> Cursor range

zakładając, że kursor znajduje się w wyżej wymienionym zakresie kursora, możesz wydać następujące polecenia:

di(   --> Deletes '5.0/9.0'
ci(   --> Substitutes '5.0/9.0'
yi(   --> Yanks '5.0/9.0'

Usuwanie tekstu wewnątrz n-tej zewnętrznej pary nawiasów:

Aby pobrać wszystko z n-tej zewnętrznej pary nawiasów, po prostu dodaj nprzed powyższym poleceniem. Tak więc przy tej samej pozycji kursora co powyżej

2di(   --> Deletes '(5.0/9.0) * (fahr-32)'
2ci(   --> Substitutes '(5.0/9.0) * (fahr-32)'
2yi(   --> Yanks '(5.0/9.0) * (fahr-32)'

3di(   --> Deletes '"%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32))'
3ci(   --> Substitutes '"%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32))'
3yi(   --> Yanks '"%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32))'
Kevin
źródło
3
Powinieneś dodać notatkę, o której mówisz ajako odpowiednik i, ponieważ może to pomóc wielu ludziom.
porglezomp
@romandy to powinno być zaakceptowane pytanie. Szukałem dzisiaj dokładnie tego samego problemu, a @Kevin jest jedynym, który udziela właściwej odpowiedzi. Oczywiście mógłbym „niewłaściwie wykorzystać” %ten problem, ale zajmuje to więcej czasu i moim zdaniem powinno być używane tylko w bardziej złożonych scenariuszach. Usunięcie czegoś w określonym zakresie jest dokładnie tym, do czego służy di.
daniel451
19

Możesz użyć d%do usuwania i y%szarpania.

ahy1
źródło
3
% jest specyfikatorem ruchu dla „dopasowanego nawiasu, nawiasu lub nawiasu klamrowego”. Każda specyfikacja ruchu może być sparowana z d i y (i wieloma innymi rzeczami).
chaos
10

Umieść kursor w pierwszym nawiasie, a następnie naciśnij v%ylub v%d.

David Norman
źródło
3
Wspaniały! % przeskakuje do pasującego arkusza. Możesz więc nawet użyć d% i y%.
1
Zauważ też, że 'd%' może zaczynać się na początku nazwy funkcji i usunie całe wywołanie funkcji. Działa również dla par „{}”, „[]”, a nawet „<>”.
Jonathan Leffler
@Leffler, Dzięki za wskazówki! Dobrze jest wiedzieć, że% działa również w trybie wizualnym.
strager
3

Wypróbuj ci [block-surrounder]

W twoim przypadku umieść kursor w dowolnym miejscu między dwoma nawiasami, które zaznaczyłeś i wypróbuj klawisze: ci (

Justin Nguyen
źródło
Prawie. Testując to, wygląda na to, że kursor musi znajdować się w pierwszym nawiasie, a nie między, a „c” to polecenie zmiany. Gdy kursor znajduje się w nawiasie otwierającym, 'di (' usuwa się do odpowiedniego nawiasu zamykającego, a 'yi (' yanks.
Richard Neish
ci pracuje dla mnie cały czas. Wszystko, co muszę zrobić, to upewnić się, że kursor znajduje się między nawiasami otaczającymi blok tekstu, który muszę usunąć.
Justin Nguyen
2

Jako odpowiedź David Norman mówi:

Umieść kursor w pierwszym nawiasie, a następnie naciśnij v%ylub v%d.

Wyjaśnienie z http://vimdoc.sourceforge.net/htmldoc/vimindex.html :

tag char note action w trybie normalnym        
-------------------------------------------------- ----------------------------
| v | v Uruchom tryb wizualny znakami
|% | % 1 znajduje następny nawias klamrowy / kwadratowy
                                       tę linię i przejdź do jej dopasowania lub przejdź do
                                       pasujący nawias komentarza lub przejdź do dopasowania
| d | ["x] d {ruch} 2 usuń tekst Nmove [do bufora x]

Oznacza to, że wybierze wszystko pomiędzy i łącznie z dwoma nawiasami kwadratowymi ( %), pokazując Ci zaznaczenie wizualnie ( v), a następnie szarpnij / skopiuj ylub usunie / wytnij d. (Do domyślnego bufora.)

Możesz umieścić / wkleić za pomocą p.

Podałem tę odpowiedź, aby „nauczyć się łowić” .

n611x007
źródło
uwaga: vimdoc.sourceforge.net jest powiązany z vim.org, która jest oficjalną stroną vim od 2015 roku.
n611x007