Powiedzmy, że mam taki kod ( |
reprezentuje pozycję kursora ):
func1(x|, func2(), y);
Chciałbym dostać:
func1(x|);
Czy istnieje sposób na usunięcie kodu z pozycji kursora do pozycji poprzedzającej prawy koniec bieżącego bloku wewnętrznego ?
Wiem, że mogę iść z tym, dt).
ale zastanawiam się, czy istnieje sposób, aby połączyć to z tym, co di)
robi.
cursor-movement
cursor-motions
Mateusz Piotrowski
źródło
źródło
C);
to w tym konkretnym przypadku.%
ruch może zrobić to, czego szukasz (tjd%
.).Odpowiedzi:
użyłbym
co oznacza delete (
d
) do następnego niedopasowanego „)” (])
).Zobaczyć
:help ])
.źródło
Ruchy idą tylko w jednym kierunku, a obiekty tekstowe tylko w dwóch kierunkach.
Oznacza to, że nie możesz mieć połowy obiektu tekstowego, dopóki nie utworzysz niestandardowego operatora oczekującego ruchu, który używa tego obiektu tekstowego pod maską lub naśladuje jego zachowanie.
W twoim przykładzie tekst objęty
i)
jest dość łatwy do wizualizacji:ale jak powiedziałbyś Vimowi, aby działał od kursora do końca tego tekstu? Trzeba by stworzyć niestandardowe operatory, takie jak
obi)
ioei)
(przykłady pół losowe).źródło
ib
,imb
na prawo iiMb
na lewo, i tak dalej (automatycznie).W tym konkretnym przypadku zrobiłbym to
dfy
W ogólnym przypadku:
dT(
usuń z kursora na początek blokuvib
wybierz resztę wewnętrznego blokup
zamień wewnętrzny blok na właśnie usuniętyMożesz zrobić z niego mapowanie.
źródło
Pozostałe istniejące odpowiedzi zależą od definicji i wykrycia bloku przez vima. Moją strategią dla tego rodzaju usuwania jest użycie
c
polecenia w połączeniu zf
ruchem i rzeczywistą postacią, aby zatrzymać. Spowoduje to wówczas usunięcie znaku stop, ale ponieważ był to również ostatni klawisz, który nacisnąłeś, powtórzenie go dwa razy ma prawie zerowy koszt, i to wstawi go ponownie od czasuc
zmiany trybu wstawiania.Aby wyjaśnić za pomocą przykładów, dla
polecenie
c2f))
daktóre z początku mogą wydawać się mniej eleganckie niż niektóre inne odpowiedzi, zauważ jednak, że ta strategia jest uniwersalna i nie zależy od żadnej definicji bloku.
Na przykład z
polecenie
cf>>
daLub podczas edycji plików csv, takich jak
polecenie
cf,,
daCzęsto używam tego, aby usunąć resztę ciągu z
do
z
cf\\
lub z
do
z
cf""
.Spowoduje to zmianę bieżącej pozycji na nieco inne miejsce niż wymagane, a także przejście do trybu wstawiania. Chciałem jednak udostępnić moje rozwiązanie polegające na usunięciu reszty czegokolwiek.
źródło
cf
rozwiązaniem polega na tym, że muszę określić znak, w którym chcę zatrzymać usuwanie. Pytania pyta, co zrobić, jeśli nie można po prostu zrobićcf)
, bo nie ma innego)
, zanim)
rzeczywiście chcesz osiągnąć (na przykład gdy chcesz zmienićfunc(x|, g(x, x), x, x, g(x, x))
nafunc(x)
). Zasadniczo chciałem wiedzieć, czy mogę uniknąć naciskania.
pocf)
.t
zamiastf
usuwać do określonego znaku, ale go nie uwzględniać, więc na pierwszy przykład (func1(x|, func2(), y);
) możesz po prostu użyćd2t)
. Jak jednak wspomniał @MateuszPiotrowski, nie jest to ogólne rozwiązanie i wymaga znajomości, do której postaci chcesz usunąć. Ponieważ ogólnie wiesz, w której postaci kończy się blok dla danego języka, nie jest tak źle.Vim-ninja-feet może być plugin co szukasz. Z tego, co rozumiem, tworzy
d[
id]
„usuwa z kursora na początek / koniec obiektu tekstowego”, więcd]i)
powinno być „usuń do końca otaczających nawiasów”.źródło