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