Допустим, у меня есть такой код ( |
представляет позицию курсора ):
func1(x|, func2(), y);
Я хотел бы получить:
func1(x|);
Есть ли способ удалить код из позиции курсора в позицию, предшествующую правому концу текущего внутреннего блока ?
Я знаю, что могу пойти, dt).
но мне интересно, есть ли способ смешать это с тем, что di)
делает.
cursor-movement
cursor-motions
Матеуш Пиотровский
источник
источник
C);
в этом конкретном случае.%
движение может сделать то, что вы ищете (то естьd%
).Ответы:
я хотел бы использовать
что означает удаление (
d
) к следующему непревзойденному ')' (])
).См
:help ])
.источник
Движения идут только в одном направлении, тогда как текстовые объекты движутся только в двух направлениях.
Это означает, что у вас не может быть половины текстового объекта, если вы не создадите пользовательский оператор в ожидании движения, который использует этот текстовый объект под капотом или имитирует его поведение.
В вашем примере текст, покрываемый
i)
довольно легко визуализировать:но как бы вы сказали Vim работать от курсора до конца этого текста? Нужно было бы создать пользовательские операторы вроде
obi)
иoei)
(полуслучайные примеры).источник
ib
,imb
вправо иiMb
влево и т. д. (автоматически).Для этого конкретного случая я бы
dfy
Для общего случая:
dT(
удалить от курсора до начала блокаvib
выберите остальную часть внутреннего блокаp
замените внутренний блок на то, что вы только что удалилиВы могли бы превратить это в отображение.
источник
Все остальные существующие ответы зависят от определения vim и обнаружения блока. Моя стратегия удаления такого рода состоит в том, чтобы использовать
c
команду в сочетании сf
движением и реальным символом, чтобы остановиться на этом. Затем он фактически удалит символ остановки, но, поскольку он также был последней нажатой клавишей, повторяя его дважды, он будет стоить почти равным нулю, и это будет вставлять его снова послеc
перехода в режим вставки.Чтобы объяснить с примерами, для
команда
c2f))
дасткоторый на первый взгляд может показаться менее элегантным, чем некоторые другие ответы, однако обратите внимание, что эта стратегия универсальна и не зависит от какого-либо определения блока.
Например, с
команда
cf>>
дастИли при редактировании CSV-файлов, таких как
команда
cf,,
дастЧасто я использую это, чтобы удалить остаток строки, из
в
с
cf\\
или из
в
с
cf""
.Это меняет текущую позицию на место, немного отличное от запрашиваемого, а также переключается в режим вставки. Но я хотел бы поделиться своим подходом к удалению всего остального.
источник
cf
решением заключается в том, что мне нужно указать символ, на котором я хочу остановить удаление. В вопросе спрашивается, что делать, если вы не можете просто сделать,cf)
потому что есть еще один,)
прежде чем)
вы на самом деле хотите достичь (например, когда вы хотите перейтиfunc(x|, g(x, x), x, x, g(x, x))
наfunc(x)
). По сути, я хотел знать, смогу ли я избежать нажатия.
послеcf)
.t
вместоf
удаления до, но не включая данный символ, поэтому для вашего первого примера (func1(x|, func2(), y);
) вы можете просто использоватьd2t)
. Как упоминает @MateuszPiotrowski, это не общее решение и требует, чтобы вы знали, какой символ вы хотите удалить. Как вы обычно знаете, какой символ заканчивает блок, в котором вы находитесь для данного языка, это не так уж плохо.ВИМ-ниндзя-ноги плагин может быть то , что вы ищете. Из того, что я понимаю, это делает
d[
иd]
в «удалить от курсора до начала / окончания текстового объекта», поэтомуd]i)
не должно быть «удалить до конца окружающих скобок».источник