2012-08-17 64 views
0

我在我的.vimrc中定義了以下功能。對於一個給定的文件,這應該改變從第3行開始的每行的起始行號。如何在vimscript中使用提供的模式使用「substitute」命令?

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」。

回答

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 

,或者如果你想保留原來的功能,這更是succint:

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 
+0

我喜歡你的答案。然而,我希望我的函數接受一個參數的原因是因爲我想通過一次調用完成所有3個步驟。我現在正在做的是你所建議的,首先用數字在開頭創建文件,然後用「chr」替換開頭,但對於不同的文件,「chr」將會不同。 – Sam 2012-08-20 18:00:38

+0

感謝您的編輯! – Sam 2012-08-20 18:01:18

+0

@Sam我的答案解決了你的問題嗎?有其他方法可以幫助嗎? – Conner 2012-08-20 20:14:49

相關問題