2014-06-20 76 views
2

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

我的问题出现时,我有这么多的行,它变得非常繁琐,这样做。我正在尝试创建一个宏,但是难以获得命令行输出。有没有办法做到这一点,而不诉诸于* nix命令?我可以访问一个* nix框,但不是所有的时间。

所以,如果我的文件有以下内容:

abc2d4s 
jd4a5ag 
jdf7fjf 
abdd5ff 

我想输出看起来像这样:

abc2d4s 5 
jd4a5ag 5 
jdf7fjf 6 
abdd5ff 6 

我就在想,如果有一种方式来获得替换输出以某种方式传送到寄存器,但无法弄清楚如何去做,但也许有更好的方法。要做到这一点

回答

4

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

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

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

+0

+1,同样的想法,但比我好。 – Kent

+0

@Kent:谢谢,我想我保存了一些使用相反的'\ A'键入。 –

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

这CMD应该给你输出:

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