#vim #macros #replace
#vim #макросы #заменить
Вопрос:
Я хотел бы вставить в конце каждой строки количество буквенных символов в этой строке. Сделать это в одной строке легко. Я выполняю поиск с использованием :s/a//gn
и получаю вхождение буквенных символов в командной строке, а затем A
пробел и ввод числа.
Моя проблема возникает, когда у меня так много строк, что это становится чрезвычайно утомительным. Я пытаюсь создать макрос, но мне трудно получить вывод из командной строки. Есть ли способ сделать это, не прибегая к командам * nix? У меня есть доступ к * nix-окну, но не все время.
Итак, если бы мой файл имел следующее содержимое:
abc2d4s
jd4a5ag
jdf7fjf
abdd5ff
Я бы хотел, чтобы выходные данные выглядели так:
abc2d4s 5
jd4a5ag 5
jdf7fjf 6
abdd5ff 6
Я думал, есть ли способ каким-то образом передать вывод replace в регистр, но не могу понять, как это сделать, но, возможно, есть лучший способ.
Ответ №1:
Вы можете записать выходные :s///gn
данные команды с :redir
помощью , но в этом случае я бы предпочел реализовать подсчет через substitute()
и :help sub-replace-expression
:
:%s/.*/=submatch(0) . ' ' . len(substitute(submatch(0), 'A', '', 'g'))/
Это соответствует всей строке ( .*
), затем удаляет все не алфавитные символы ( A
) и добавляет длину результата. Примечание: работает только для символов ASCII (но a
в любом случае охватывает только их)!
Комментарии:
1. @Kent: Спасибо, я думаю, я сэкономил немного ввода, используя обратное
A
.
Ответ №2:
этот cmd должен выдать вам этот вывод:
%s/.*/=submatch(0).' '.(len(submatch(0))-len(substitute(submatch(0),'a','','g')))
Ответ №3:
Один из способов сделать это — использовать простой макрос:
:%norm A <C-v><C-r>=col('.')-2<C-v><CR>
который должен выглядеть так:
:%norm A ^R=col('.')-2^M
где мы вводим режим вставки в конце каждой строки и вставляем пробел, за которым следует номер столбца последнего символа.
Вариант:
:%norm A^R=" ".len(getline('.'))^M