vim substitute函数使用的疑问

Vim、Emacs配置和使用
回复
cao627
帖子: 992
注册时间: 2007-12-05 10:57
系统: ubuntu14.04
来自: 金山

vim substitute函数使用的疑问

#1

帖子 cao627 » 2012-04-23 22:05

以下这个宏命令脚本能在文本中插入行号

下面这个疑问是网上的,我也同问

代码: 全选

"------------------------------------------
:%s/^/  /
:$
:let end=line(".")
:1
"------------------------------------------
:let num=1
:while num<=end
:let line=getline(".")
:let temp=substitute(line,$,num,"")
:call setline(".",temp)
:+
:let num=num+1
:endwhile
"------------------------------------------ 
其中substitute(line, $, num, ""),我觉得应该是在每行的末尾加上行号,但结果恰恰相反,确实是在每行的开头加了行号。我试过把$
换成^,但这样会报错。
这里,实在是不太明白,望能指点迷津,谢谢。
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: vim substitute函数使用的疑问

#2

帖子 aerofox » 2012-04-23 22:18

我觉得这只是碰巧对了。
执行

代码: 全选

:echo $
可以看出,什么都没有显示。本来 $ 后应该跟一个名字的,现在什么都没有,就显示空了,在文档中没有找到这种用法,也许是一个未入文档的功能,也许是我没找到。
准确点的做法是:

代码: 全选

:let temp=substitute(line,"",num,"")
或者

代码: 全选

:let temp=substitute(line,"^",num,"")
如果要回到行尾,应该是

代码: 全选

:let temp=substitute(line,"$",num,"")
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: vim substitute函数使用的疑问

#3

帖子 lilydjwg » 2012-04-23 22:20

这个命令太太太太太太太太太太太太长了。这种事情不一两搞定还真拿不出手。
cao627
帖子: 992
注册时间: 2007-12-05 10:57
系统: ubuntu14.04
来自: 金山

Re: vim substitute函数使用的疑问

#4

帖子 cao627 » 2012-04-23 22:25

代码: 全选

:let temp=substitute(line,"^",num,"")
逻辑上因该这么写,而且试过对

代码: 全选

:let temp=substitute(line,"$",num,"")
能在行尾加上行号
我觉得这只是碰巧对了。
很可能
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: vim substitute函数使用的疑问

#5

帖子 aerofox » 2012-04-23 22:45

cao627 写了:

代码: 全选

:let temp=substitute(line,"^",num,"")
逻辑上因该这么写,而且试过对
逻辑上那个没有 ^ 的例子应该也是对的。因为空串 "" 可以匹配任何一个位置,而不加任何标志时,只匹配一次,那么它事实上就是只匹配行首位置。
头像
Fermat618
帖子: 728
注册时间: 2008-12-28 16:01

Re: vim substitute函数使用的疑问

#6

帖子 Fermat618 » 2012-04-24 3:24

加入行号用nl命令不错

代码: 全选

:<line1>,<line2>!nl
爱因斯坦会弹钢琴
爱因斯坦会拉小提琴
爱因斯坦会骑自行车
回复