我正在阅读Learn Vim Script the Hard Way,并在进行练习时将一些让我感到困惑的东西将折叠函数转换为脚本函数。
我试着这样做:
setlocal foldexpr=<SID>GetPotionFold(v:lnum)
并将所有功能重命名为s:
令我惊讶的是,这不起作用,每一行的折叠级别为0?如果我将GetPotionFold
放入全局范围,它就可以工作。在将其分配给选项时,是否必须使用全局范围的功能?为什么呢?
答案 0 :(得分:6)
<SID>
可用于映射或菜单,遗憾的是不在选项中。 (这是实施中的一个缺点。)
您必须将其转换为实际的<SNR>NNN_
前缀(s:SID()
处有:help <SID>
示例函数),或使用可从脚本外部访问的其他范围定义功能。值得称道的是,您希望避免破坏全局函数名称空间,因为这很容易发生名称冲突。
一个很好的技巧是使用 autoload 函数前缀;它不仅适用于自动加载脚本,还可以在其他地方使用,例如在插件脚本中。只需添加脚本的名称,您将拥有一个可以从任何地方调用的函数,但是作用于脚本的名称:
:function! MyScriptName#GetPotionFold(lnum)
...
:setlocal foldexpr=MyScriptName#GetPotionFold(v:lnum)
答案 1 :(得分:0)
添加到上一个答案,您可以定义函数s:SID()
以确定脚本编号,如帮助文档中所示,然后使用execute
将折叠表达式设置如下:
exe "setlocal foldexpr=<SNR>" . s:SID() . "_GetPotionFold(v:lnum)"