功能

  • 不要忘记在下次重新加载定义函数的脚本时允许 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)插件中定义映射缩写,命令和菜单,以及在自动加载插件中定义函数 - 除了插件在加载时需要使用的功能。这意味着现在需要从映射中调用脚本本地函数并不像以前那样具有相关性。