将命令行的输出写入vim中的文件

时间:2014-06-20 12:23:18

标签: vim macros replace

我想在每一行的末尾插入该行的字母字符数。要在一条线上这样做很容易。我使用:s/\a//gn进行搜索并在命令行中出现字母字符,然后A和空格并输入数字。

当我有这么多行时,问题就出现了,这样做变得非常繁琐。我正在尝试创建一个宏,但很难获得命令行输出。有没有办法在不使用* nix命令的情况下执行此操作?我可以访问* nix框,但不是所有时间。

因此,如果我的文件包含以下内容:

abc2d4s
jd4a5ag
jdf7fjf
abdd5ff

我希望输出看起来像这样:

abc2d4s 5
jd4a5ag 5
jdf7fjf 6
abdd5ff 6

我在想是否有办法让替换输出以某种方式通过管道进入寄存器,但无法弄清楚如何做到这一点,但也许有更好的方法。

3 个答案:

答案 0 :(得分:4)

您可以使用:s///gn捕获:redir命令的输出,但在这种情况下,我宁愿通过substitute():help sub-replace-expression实现计数:

:%s/.*/\=submatch(0) . ' ' . len(substitute(submatch(0), '\A', '', 'g'))/

这匹配整行(.*),然后删除所有非字母字符(\A),并追加结果的长度。注意:仅适用于ASCII字符(但\a仅涵盖那些字符)!

答案 1 :(得分:2)

这样做的一种方法是使用一个简单的宏:

:%norm A <C-v><C-r>=col('.')-2<C-v><CR>

应该是这样的:

:%norm A ^R=col('.')-2^M

我们在每行的末尾输入插入模式并插入一个空格,后跟最后一个字符的列号。

变体:

:%norm A^R=" ".len(getline('.'))^M

答案 2 :(得分:2)

这个cmd应该给你输出:

%s/.*/\=submatch(0).' '.(len(submatch(0))-len(substitute(submatch(0),'\a','','g')))