Ответ 1
Вы пробовали :{range}normal
? Это должно работать:
:'<,'>normal $x
(бит '<,'>
заполняется для вас при вводе :.)
Я получаю необычное поведение, когда пытаюсь удалить из конца строки, используя выбор блока в vim.
Итак, скажем, у меня есть текст как таковой:
delete this char:x
and this:x
also this:x
and then this:x
lastly this:x
Если я хочу добавить y
к каждой строке, я могу:
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
).
Я могу сделать это с помощью макросов или заменителей, но я не совсем понимаю обоснование такого поведения. Есть ли способ сделать это с выбором блока?
Вы пробовали :{range}normal
? Это должно работать:
:'<,'>normal $x
(бит '<,'>
заполняется для вас при вводе :.)
$
C-v
4j
x
$
C-v
4j
x
Изменить: (реакция на комментарий для произвольного отступа)
Это можно сделать с помощью простого макроса. Макросы не так сложны, как вы думаете:
qa
$
x
j
q
Теперь примените наш макрос: [email protected]
- сделает то же самое, что и во время записи макроса, 20x.
Если у меня небольшое количество строк, я обычно делаю A backspace esc. Затем несколько раз выполните j ., пока не закончите. Не самый быстрый способ, но легко запоминающийся.
Для большого количества строк я обычно визуально выбираю строки с помощью V, затем выполняю замену или обычную команду в диапазоне.
:'<,'>s/.$//
:'<,'>norm $x
Примечание: вам не нужно печатать '<,'>
. Он будет вставлен автоматически при запуске команды при визуальном выделении текста.
Команда замещения довольно проста, соответствует последнему символу (.$
), а затем заменяет его ничем.
Обычная команда - это то, как вы удалили бы последний символ в обычном режиме с помощью $ x для одной строки, за исключением того, что она будет применена к каждой строке в диапазоне.
Для получения дополнительной помощи см.:
:h range
:h :s
:h :norm
как вы сказали сами, чтобы достичь своей цели, есть и другие способы, на самом деле лучшие способы. :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
для удаления пробелов перед ':'
Однако я не думаю, что это хороший способ пойти.