Запись выходных данных из командной строки в файл в vim

#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