Usuń do prawego końca bieżącego bloku wewnętrznego

21

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.

Mateusz Piotrowski
źródło
1
Chcę wiedzieć, czy istnieje prosty sposób na „usunięcie lewej / prawej połowy bloku wewnętrznego / zewnętrznego”, tak jak prosiłeś. Ale na marginesie, prawdopodobnie zrobiłbym C);to w tym konkretnym przypadku.
Shahbaz
1
Czasami %ruch może zrobić to, czego szukasz (tj d%.).
alxndr

Odpowiedzi:

29

użyłbym

d])

co oznacza delete ( d) do następnego niedopasowanego „)” ( ])).

Zobaczyć :help ]).

ryuichiro
źródło
5

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:

func1(x, func2(), y);
      ^^^^^^^^^^^^^

ale jak powiedziałbyś Vimowi, aby działał od kursora do końca tego tekstu? Trzeba by stworzyć niestandardowe operatory, takie jak obi)i oei)(przykłady pół losowe).

" ()
onoremap oei) :normal! vi)o``<CR>
onoremap obi) :normal! vi)``<CR>

" []
onoremap oei] :normal! vi]o``<CR>
onoremap obi] :normal! vi]``<CR>

" {}
onoremap oei} :normal! vi}o``<CR>
onoremap obi} :normal! vi}``<CR>

" ""
onoremap oei" :normal! vi"o``<CR>
onoremap obi" :normal! vi"``<CR>

" ''
onoremap oei" :normal! vi'o``<CR>
onoremap obi" :normal! vi'``<CR>
romainl
źródło
4
Byłoby interesujące stworzyć ogólny ruch, który ponownie wykorzystuje wszystkie już zdefiniowane obiekty tekstowe, w połączeniu z bieżącą pozycją kursora; Na przykład, zamiast ib, imbna prawo i iMbna lewo, i tak dalej (automatycznie).
VanLaser,
3

W tym konkretnym przypadku zrobiłbym to dfy

W ogólnym przypadku:

  • dT( usuń z kursora na początek bloku
  • vib wybierz resztę wewnętrznego bloku
  • p zamień wewnętrzny blok na właśnie usunięty

Możesz zrobić z niego mapowanie.

 :map K dt(vibp
Nathan Wilson
źródło
3

Pozostałe istniejące odpowiedzi zależą od definicji i wykrycia bloku przez vima. Moją strategią dla tego rodzaju usuwania jest użycie cpolecenia w połączeniu z fruchem 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 czasu czmiany trybu wstawiania.


Aby wyjaśnić za pomocą przykładów, dla

func1(x|, func2(), y); 

polecenie c2f))da

func1(x)|;

któ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

<div| class="some-class">text</div>

polecenie cf>>da

<div>|text</div>

Lub podczas edycji plików csv, takich jak

2016-11-29,question,vi|.stackexchange.com,10435

polecenie cf,,da

2016-11-29,question,vi,|10435

Często używam tego, aby usunąć resztę ciągu z

printf("Hello world| - a boring example\n");

do

printf("Hello world\|n");

z cf\\

lub z

print("Hello world| - a boring example");

do

print("Hello world"|);

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.

hlovdal
źródło
1
Problem z cfrozwią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))na func(x)). Zasadniczo chciałem wiedzieć, czy mogę uniknąć naciskania .po cf).
Mateusz Piotrowski
Zauważ, że możesz także użyć tzamiast fusuwać 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.
Haegin,
3

Vim-ninja-feet może być plugin co szukasz. Z tego, co rozumiem, tworzy d[i d]„usuwa z kursora na początek / koniec obiektu tekstowego”, więc d]i)powinno być „usuń do końca otaczających nawiasów”.

Caagr98
źródło