Ответ 1
Вы можете использовать движение ])
с d
.
d])
Скажем, у меня есть эта строка текста в vim:
(foo bar (baz) qux)
^
и мой курсор находится на промежутке между foo
и bar
, как указано. Я часто нахожу, что в подобных ситуациях я хочу удалить всю правую часть внешнего выражения в скобках (то есть справа от моего курсора), оставив левую сторону неповрежденной. То есть, я бы хотел в итоге:
(foo)
Обычно, я бы выполнил это с помощью dt)
( "delete до )
" ), но добавление вложенной вставки вставки усложняет вещи: эта команда оставит меня с (foo) qux)
. Я мог бы также использовать d2t)
, но я бы предпочел не вручную подсчитывать количество вложенных круглых скобок. Я мог бы также использовать di)
, но это удаляет всю внутреннюю часть круглых скобок, оставляя меня с ()
.
Существует ли движение vim с балансировкой значений i
- и a
-модифицированных движений, но это относительно текущая позиция курсора?
Вы можете использовать движение ])
с d
.
d])
mxF(%d`x
Разрушение:
mx
Установите отметку x
(выберите любую понравившуюся вам букву)
F(
Найти предыдущий символ (
%
Переход к совпадению )
d`x
Удалить здесь, чтобы отметить x
Это работает для вашего конкретного случая; Я не уверен, насколько это вообще. Если предыдущий (
не находится в текущей строке, используйте ?(<return>
, а не F(
.
ИЗМЕНИТЬ:
Я не упоминал d])
, потому что не знал об этом.
Мое решение не будет работать для этого случая:
( (before) foo (after) )
^
потому что он возвращается к ближайшему (
, а не к ближайшему окружению (
.