2014-09-30 104 views
0

請看下面我寫在我的/.gvimrc文件中的vim函數。 用於從「start_line」和「end_line」指定的行範圍內刪除每行中「n」個最後字符數的函數標識。這個簡單的vim函數有什麼問題?

function RLNC (n, start_line, end_line) 
    execute . a:start_line . "," . a:end_line . "s/.\{" . a:n . "}$//" 
endfunction 

但是當我做出同樣的功能,並調用它的VIM

:call RLNC(3, 128, 203) 

這是我在這裏做

:start_line,end_lines/.\{n}$// 

這在實際操作中也不過是

:128,203s/.\{3}$// 

請幫忙我找到出了什麼問題..?

它是給錯誤

回答

3

的錯誤是:

E15: Invalid expression: . a:start_line . "," . a:end_line . "s/.\{" . a:n . "}$//" 

所以,第一個時期是犯罪嫌疑人。 :execute命令採用(一個或多個)表達式。通過.字符串連接只能在字符串之間完成,而不是在開頭。

剛剛離開過第一.

execute a:start_line . "," . a:end_line . "s/.\{" . a:n . "}$//" 

手動拼接是乏味的。更好地利用printf()

execute printf("%d,%ds/.\{%d}$//", a:start_line, a:end_line, a:n) 

接下來的問題是,雙引號中的反斜槓必須進行轉義(加倍)。更好地使用單引號:

execute printf('%d,%ds/.\{%d}$//', a:start_line, a:end_line, a:n) 

最後,Vim有一個特殊的語法將範圍傳遞給函數。請參閱:help function-range-example。你並不需要使用這個,但它使調用更自然:

:128,203call RLNC(3) 

不過,我可能會繼續前進,定義自定義命令包裝的功能。

:command! -range -nargs=1 RLNC call RLNC(<args>, <line1>, <line2>) 

如果你的函數實際上不是更復雜,我們現在可以內嵌此,擺脫完全的功能:

:command! -range -nargs=1 RLNC execute printf('%d,%ds/.\{%d}$//', <line1>, <line2>, <args>) 

(注意,如果沒有的功能,最後的搜索模式被打一頓)

0

感謝您的回覆,我對vim函數和所有新手都很感興趣。所以我對「:command!」以及所有的東西都不太瞭解。所以,我把它作爲函數的/.gvimrc文件象下面這樣:

function RLNC (start_line, end_line, n) 
    if (a:start_line <= a:end_line) 
    execute printf(':%d,%ds/.\{%d}$//', a:start_line, a:end_line, a:n) 
    else 
    execute printf('Start line %d is more than End line %d ', a:start_line, a:end_line) 
    endif 
endfunction 

及其工作正常,當我在gvim的文件使用:call RLNC(128, 203, 3)

謝謝你