Удалить до правого конца текущего внутреннего блока

21

Допустим, у меня есть такой код ( |представляет позицию курсора ):

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

Я хотел бы получить:

func1(x|);

Есть ли способ удалить код из позиции курсора в позицию, предшествующую правому концу текущего внутреннего блока ?

Я знаю, что могу пойти, dt).но мне интересно, есть ли способ смешать это с тем, что di)делает.

Матеуш Пиотровский
источник
1
Мне интересно знать, есть ли простой способ «удалить левую / правую половину внутреннего / внешнего блока», как вы и просили. Но, как примечание, я бы, вероятно, сделал C);в этом конкретном случае.
Шахбаз
1
Иногда %движение может сделать то, что вы ищете (то есть d%).
alxndr

Ответы:

29

я хотел бы использовать

d])

что означает удаление ( d) к следующему непревзойденному ')' ( ])).

См :help ]).

ryuichiro
источник
5

Движения идут только в одном направлении, тогда как текстовые объекты движутся только в двух направлениях.

Это означает, что у вас не может быть половины текстового объекта, если вы не создадите пользовательский оператор в ожидании движения, который использует этот текстовый объект под капотом или имитирует его поведение.

В вашем примере текст, покрываемый i)довольно легко визуализировать:

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

но как бы вы сказали Vim работать от курсора до конца этого текста? Нужно было бы создать пользовательские операторы вроде obi)и oei)(полуслучайные примеры).

" ()
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
источник
4
Было бы интересно создать общее движение, которое повторно использует все уже определенные текстовые объекты в сочетании с текущей позицией курсора; например, вместо ib, imbвправо и iMbвлево и т. д. (автоматически).
VanLaser
3

Для этого конкретного случая я бы dfy

Для общего случая:

  • dT( удалить от курсора до начала блока
  • vib выберите остальную часть внутреннего блока
  • p замените внутренний блок на то, что вы только что удалили

Вы могли бы превратить это в отображение.

 :map K dt(vibp
Натан Уилсон
источник
3

Все остальные существующие ответы зависят от определения vim и обнаружения блока. Моя стратегия удаления такого рода состоит в том, чтобы использовать cкоманду в сочетании с fдвижением и реальным символом, чтобы остановиться на этом. Затем он фактически удалит символ остановки, но, поскольку он также был последней нажатой клавишей, повторяя его дважды, он будет стоить почти равным нулю, и это будет вставлять его снова после cперехода в режим вставки.


Чтобы объяснить с примерами, для

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

команда c2f))даст

func1(x)|;

который на первый взгляд может показаться менее элегантным, чем некоторые другие ответы, однако обратите внимание, что эта стратегия универсальна и не зависит от какого-либо определения блока.


Например, с

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

команда cf>>даст

<div>|text</div>

Или при редактировании CSV-файлов, таких как

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

команда cf,,даст

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

Часто я использую это, чтобы удалить остаток строки, из

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

в

printf("Hello world\|n");

с cf\\

или из

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

в

print("Hello world"|);

с cf"".


Это меняет текущую позицию на место, немного отличное от запрашиваемого, а также переключается в режим вставки. Но я хотел бы поделиться своим подходом к удалению всего остального.

hlovdal
источник
1
Проблема с cfрешением заключается в том, что мне нужно указать символ, на котором я хочу остановить удаление. В вопросе спрашивается, что делать, если вы не можете просто сделать, cf)потому что есть еще один, )прежде чем )вы на самом деле хотите достичь (например, когда вы хотите перейти func(x|, g(x, x), x, x, g(x, x))на func(x)). По сути, я хотел знать, смогу ли я избежать нажатия .после cf).
Матеуш Пиотровски
Обратите внимание, что вы также можете использовать tвместо fудаления до, но не включая данный символ, поэтому для вашего первого примера ( func1(x|, func2(), y);) вы можете просто использовать d2t). Как упоминает @MateuszPiotrowski, это не общее решение и требует, чтобы вы знали, какой символ вы хотите удалить. Как вы обычно знаете, какой символ заканчивает блок, в котором вы находитесь для данного языка, это не так уж плохо.
Хаегин
3

ВИМ-ниндзя-ноги плагин может быть то , что вы ищете. Из того, что я понимаю, это делает d[и d]в «удалить от курсора до начала / окончания текстового объекта», поэтому d]i)не должно быть «удалить до конца окружающих скобок».

Caagr98
источник