如何在vimscript中使用提供的模式使用“替换”命令?

时间:2012-08-17 17:15:40

标签: vim

我在.vimrc中定义了以下功能。对于给定的文件,这应该使用行号从第3行开始更改每行的开头。

function Foo()
   3,$ s/^/      /g
   3
   let i=1 | ,$ g/^/ s//\=i/ | let i+=1
   1
endfunction

但是,我想更改函数,以便接受一个参数。它将插入该单词,以便该函数看起来如下:

function Foo(chr)
   3,$ s/^/      /g
   3
   let i=1 | ,$ g/^/ s//\=i/ | let i+=1
   1
   3,$ s/^/chr        /g
endfunction

编辑:提供一个例子。

我的输入文件如下所示:

some text1
some text 2
0000
0000
0001
0002

我想让文件看起来如下:

sm1     1        0000
sm1     2        0000
sm1     3        0001
.
.

所以我希望能够将“sm1”作为函数的参数,以便对于另一个文件,我可能想要“sm2”而不是“sm1”。

1 个答案:

答案 0 :(得分:2)

您可能不需要函数

:3,$s/^/chr        /

应该有效。但是,如果你想为此制作一个command,你可以这样做:

command! -nargs=1 Example 3,$s/^/<args>        /

这样您就可以使用:Example chr在第3行及以上的开头插入chr

另外,您说您的原始功能会插入“行号”,但它会在第3行插入1,依此类推。我确定您知道可以使用:set nu启用行号,但如果您想在每行3行及以上插入行号,您可以执行以下操作:

fun! Foo()
   3,$s/^/\=line('.')."      "
endfun

或者如果你想保留以前的功能,这就更加简洁了:

fun! Foo()
   3,$s/^/\=(line('.')-2)."      "
endfun

如果您想将所有这些组合成一个命令,您可以

com! -nargs=1 Example 3,$s/^/\="<args>     ".(line('.')-2)."        "

这将为您提供:Example <argument>命令。所以现在你可以像你想要的那样做:Example sm1

如果您希望按原样保留您的功能,为了使其正常工作,您应该使用a:chr,如下所示:

function Foo(chr)
   3,$ s/^/      /g
   3
   let i=1 | ,$ g/^/ s//\=i/ | let i+=1
   1
   exe "3,$s/^/".a:chr."        /g"
endfunction