2011-06-25 30 views
1

我在menu.vim中創建了很多函數。vim中的子函數

我注意到在許多函數中使用了相同的代碼,這就是爲什麼我決定使用 子函數清理我的文件。

體育課,這是什麼樣的代碼往往返回我的功能:

let zoek = @/  
if a:type == "'<,'>"  
let r = substitute(zoek, '\\%V', '', 'g')  
elseif a:type == "%"  
let r = zoek  
endif  

let a = substitute(r, '\', '', 'g')  

if matchstr(d, '>') == '>' || matchstr(d, '<') == '<'  
let e = substitute(d, '\zs>\(\d\+\)%<\ze', '\1-', 'g')  
endif 

我怎樣才能從中創建一個子功能?我怎樣才能調用它?
Vim有子功能嗎?

回答

4

您可以在字典中定義它們有«地方»功能:在下面的代碼

function MyFunc() 
    let d={} 
    function d.function() 
     echo "Foo" 
    endfunction 
    call d.function() 
endfunction 

功能d.function只能訪問內部S:MYFUNC和s之後被破壞:MYFUNC退出。我把«local»放在引號中,因爲d.function真的是全球函數名爲42(或其他數字,沒關係)。 不能在沒有引用它的情況下調用它,並且創建引用的唯一方法是使用function dict.key()(創建後可能會複製引用,但不能使用調用function()創建引用,儘管MyFuncfunction("MyFunc"))。請注意,每次創建函數時,編號(在本例中爲42)都會增加,並且我不知道最大編號是多少,也不知道在達到最大編號時會發生什麼。我個人使用的字典功能,因爲他們有另外兩個優勢:

  1. 詞典功能的腳本的本地詞典中定義沒有一個調試器或明確的傳遞函數引用(可能作爲容器的一部分)的地方不能達到。
  2. 如果多於一個函數被定義在一個字典中以清除它們,你需要的是解開這個字典。用於重新加載插件。
+0

謝謝,是否也可以使用g:變量從子函數中導入一個值,並在函數結束時將它解開,或者是否無法解開g:變量? – Reman

+0

@Remonn。是的,但爲什麼你不能只返回需要導入的值? //即使不能,也不要污染全局範圍,請使用':variable'。///還有一個提示:在函數內部有一個包含所有函數局部變量的'l:'字典。您可以將其傳遞給子功能,並以某種方式修改。 – ZyX

+0

你可以舉例說明如何將列表作爲l:list傳遞給子函數(這是實際函數的外部),以及如何在函數中再次導入它?我在許多函數中使用列表「listlines」,但沒有g:在它不起作用之前。 – Reman

2

Vimscript中只有一種類型的函數,但我不確定這是否是您在menu.vim中已經使用的。用戶定義的函數是這樣定義:

function! MyNewFunction() 
     " your code here 
    endfunction 

然後,您可以在其他地方在你的腳本中使用

call MyNewFunction() 

調用此函數(和其他函數中)或設置變量等於返回值使用

let my_variable = MyNewFunction() 

你的函數當然,這是一個令人難以置信的簡單概述,因爲你說你已經在使用的功能。更多的信息,包括使用變量,在這裏:

help user-functions 

道歉,如果我還沒有回答你的問題。