功能

  • 不要忘記在下次重新載入定義函式的指令碼時允許 Vim 覆蓋該函式的爆炸。
  • 自定義函式必須以大寫字元(全域性函式)或 s:(指令碼本地函式)開頭,或者它們必須以與自動載入外掛關聯的名稱作為字首(例如,在 {&rtp}/autoload/foo/bar.vim 中我們可以定義 foo#bar#functionname())。
  • 為了能夠使用函式中的引數,請使用 a:parameter_name。變數函式可以用省略號 ... 定義,訪問引數使用 a:000(所有引數列表),或 a:0(引數數量等於 len(a:000)),a:1 第一個未命名的引數,依此類推。
  • 函式可以這樣呼叫::call MyFunction(param1, param2)
  • 函式中的每一行都隱含地以:開頭,因此所有命令都是冒號命令
  • 為防止函式在發生錯誤時繼續執行,最好使用 abort 註釋函式簽名

function! MyFunction(foo, bar, ... ) abort
    return a:foo . a:bar . (a:0 > 0 ? a:1 : '')
endfunction

指令碼功能

如果你只打算在定義它的檔案中使用你的函式(或者因為你在較小的部分中破壞了更大的函式,或者因為你將在命令,對映中使用它,…),你可以使用字首使用 s:,避免使用無用的內部函式亂丟你的全域性名稱空間:

function! s:my_private_function() " note we don't need to capitalize the first letter this time
    echo "Hi!"
endfunction

使用 s:對映函式

如果要在對映中使用指令碼本地函式,則需要使用特殊的 <SID> 字首來引用它:

nnoremap <your-mapping-key> :call <SID>my_private_function()<CR>

:help user-functions

但請注意,自 Vim 7 以來,最佳做法是在(ft)外掛中定義對映縮寫,命令和選單,以及在自動載入外掛中定義函式 - 除了外掛在載入時需要使用的功能。這意味著現在需要從對映中呼叫指令碼本地函式並不像以前那樣具有相關性。