Vim <;SID>;用foldexpr

Vim <;SID>;用foldexpr,vim,Vim,我正在阅读并在做将折叠函数转换为脚本本地函数的练习时遇到了一些让我困惑的问题 我试着这样做: setlocal foldexpr=<SID>GetPotionFold(v:lnum) setlocal foldexpr=GetPotionFold(v:lnum) 并将所有函数重命名为以s: 令我惊讶的是,这不起作用,每行的折叠级别都是0?如果我将GetPotionFold放入全局范围,它就会工作。将函数分配给选项时,是否必须使用全局作用域函数?为什么?可以在映射或菜单中使用,不幸

我正在阅读并在做将折叠函数转换为脚本本地函数的练习时遇到了一些让我困惑的问题

我试着这样做:

setlocal foldexpr=<SID>GetPotionFold(v:lnum)
setlocal foldexpr=GetPotionFold(v:lnum)
并将所有函数重命名为以
s:

令我惊讶的是,这不起作用,每行的折叠级别都是0?如果我将
GetPotionFold
放入全局范围,它就会工作。将函数分配给选项时,是否必须使用全局作用域函数?为什么?

可以在映射或菜单中使用
,不幸的是,不能在选项中使用。(这是实施中的一个缺点。)

您必须将其转换为实际的
NNN\uu
前缀(在
:help
中有一个
s:SID()
示例函数),或者使用从定义函数的脚本外部可访问的不同范围。值得称赞的是,您希望避免对全局函数名称空间的冲击,因为这很容易发生名称冲突

一个很好的技巧是使用自动加载函数前缀;它不仅可以在自动加载脚本中工作,还可以在其他地方使用,例如在插件脚本中。只需在脚本名称前面加上前缀,就可以从任何地方调用一个函数,但作用域为脚本名称:

:function! MyScriptName#GetPotionFold(lnum)
    ...
:setlocal foldexpr=MyScriptName#GetPotionFold(v:lnum)

除了前面的答案之外,您还可以定义函数
s:SID()
,以确定帮助文档中的脚本编号,然后使用
execute
设置折叠表达式,如下所示:


exe“setlocal foldexpr=”。s:SID()。“_GetPotionFold(v:lnum)”

史蒂夫·洛什随意写道,可惜这是一项不可能完成的任务。啊,太好了,我担心我错过了书中的某些内容!谢谢大家!@Lerp这是一个很好的例子,说明VimL中没有本地函数。(如果你在这里提到匿名函数,我可以说,在我的分支被合并之前,它们只是具有奇怪名称的全局函数,如
123