是否可以在 vim 中组合 :%s/ \= 和 |?

是否可以在 vim 中组合 :%s/ \= 和 |?

以下大致是我在 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_Tip​​s

相关内容