Удалить из конца строк с помощью выбора блока в vim

Я получаю необычное поведение, когда пытаюсь удалить из конца строки, используя выбор блока в vim.

Итак, скажем, у меня есть текст как таковой:

delete this char:x
and this:x
also this:x
and then this:x
lastly this:x

Если я хочу добавить y к каждой строке, я могу:

  • выбор начального блока с помощью C-v
  • выберите все строки с помощью 4j
  • перейти к концам строк с помощью $
  • начать добавление с помощью A
  • введите текст y

чтобы получить:

delete this char:xy
and this:xy
also this:xy
and then this:xy
lastly this:xy

но если я попытаюсь удалить x на последнем шаге вместо добавления, я бы ожидал получить:

delete this char:
and this:
also this:
and then this:
lastly this:

хотя я в конечном итоге:

delete this char:
and this:x:
also this:x:
and then this:x:
lastly this:x:

Насколько я понимаю, он добавляет последний char в первую строку ко всем другим строкам (в данном случае :), а не удаляет недостающие (в данном случае x).

Я могу сделать это с помощью макросов или заменителей, но я не совсем понимаю обоснование такого поведения. Есть ли способ сделать это с выбором блока?

Ответ 1

Вы пробовали :{range}normal? Это должно работать:

:'<,'>normal $x

(бит '<,'> заполняется для вас при вводе :.)

Ответ 2

$ C-v 4j x

  • перейти к концу строки с помощью $
  • переключить визуальный блок C-v
  • спуститесь (в вашем случае 4x) 4j
  • удалите этот материал с помощью x

Изменить: (реакция на комментарий для произвольного отступа)

Это можно сделать с помощью простого макроса. Макросы не так сложны, как вы думаете:

  • начните запись макроса, назовем его "a", поэтому qa
  • перейти к концу строки $
  • удалить один символ x
  • спуститесь на одну строку с помощью j
  • завершите наш макрос q

Теперь примените наш макрос: [email protected] - сделает то же самое, что и во время записи макроса, 20x.

Ответ 3

Если у меня небольшое количество строк, я обычно делаю A backspace esc. Затем несколько раз выполните j ., пока не закончите. Не самый быстрый способ, но легко запоминающийся.

Для большого количества строк я обычно визуально выбираю строки с помощью V, затем выполняю замену или обычную команду в диапазоне.

:'<,'>s/.$//
:'<,'>norm $x

Примечание: вам не нужно печатать '<,'>. Он будет вставлен автоматически при запуске команды при визуальном выделении текста.

Команда замещения довольно проста, соответствует последнему символу (.$), а затем заменяет его ничем.

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

Для получения дополнительной помощи см.:

:h range
:h :s
:h :norm

Ответ 4

как вы сказали сами, чтобы достичь своей цели, есть и другие способы, на самом деле лучшие способы. :s или q(macro) или :g/.../norm $x. :s/.$//g довольно просто.

Ctrl-V не подходит для этого задания. Что касается его имени: Visual BLOCK. Вы хотите удалить последний x, и они (только x) не находятся в блоке.

Однако, если вы действительно хотите придерживаться ctrl-v, вам нужно сделать дополнительную работу, чтобы сделать эти "x" в блоке. Если у вас установлен плагин Align, вы можете:

Выберите (V) все строки, которые вы хотите сделать,

<leader>t:

то ваш текст выглядит следующим образом:

delete this char : x
and this         : x
also this        : x
and then this    : x
lastly this      : x

Ctrl-V, чтобы удалить x, вы должны знать, как это сделать.

то

:%s/ *:/:/g

для удаления пробелов перед ':'

Однако я не думаю, что это хороший способ пойти.