以下大致是我在 vim 中尝试做的事情
:let g:ID = 1
:%s/^/\= g:ID | let g:ID = g:ID * 1.2/
现在,看起来 vim 忽略了栏后面的所有内容(这是let g:ID = g:ID * 1.2
部分)。
我当然可以编写一个函数,将 g:ID 与 1.2 乘以并返回 g:ID 的值,但我想放弃这一点。
谢谢 Rene
编辑为了清楚起见:
在 vim-script 中,我可以在一如果我使用竖线 (|) 将它们连接起来,
let g:ID = 20
let g:ID = g:ID * 1.2
let g:ID = g:ID * 1.2
我也可以写
let g:ID = 20 | let g:ID = g:ID * 1.2 | let g:ID = g:ID * 1.2
现在\=thingy 允许我用 vim 脚本表达式替换正则表达式。例如,我可以这样做
:%s/ABC/\=line(".")/
它将用找到 ABC 的行号替换当前缓冲区中出现的每个 ABC 。
同样地
:%s/^/\=g:ID/
会将 g:ID 的当前值写入缓冲区中每行的开头。
这一切都很好,但我希望在替换部分中有多个表达式,并且想知道我是否可以通过将此类表达式与 bar 链接起来来实现这一点。就我而言,我希望在每次替换调用后操作 g:ID,因此
:let g:ID=20
:s/^/\=g:ID|let g:ID=g:ID * 1.2/
将导致在我的缓冲区中第一行的开头写入 20,在我的缓冲区中第二行的开头写入 24,在我的缓冲区中第三行的开头写入 28.8,等等。
我希望我现在表达得更清楚了。
答案1
您可以使用它:global
,因为其命令对每一行都执行。
:let g:ID = 1
:g//s//\=g:ID/ | let g:ID = g:ID + 1
如果要限制替换,可以使用模式限制:global
,或使用:global
范围前缀,或两者兼而有之。
:10,20g/foo/s/^/\=g:ID/ | let g:ID = g:ID + 1
这应该为从第 10 行到第 20 行(含)g:ID
的每一行匹配的内容添加增量。foo
答案2
您可能需要定义一个函数:
function! Accu(varname, mult)
let old = {a:varname}
let {a:varname} = {a:varname} * a:mult
return old
endfunction
并以如下方式使用:
:let g:ID = 1
:%s/^/\=Accu('g:ID', 1.2)/
答案3
尝试<bar>
而不是|
看看:http://vim.wikia.com/wiki/Best_Vim_Tips