使用foldexpr <SID>

Ler*_*erp 5 vim

我正在阅读以艰难的方式学习Vim脚本,并在进行练习时将一些困惑我的东西转换为将折叠功能转换为脚本本地脚本.

我试着这样做:

setlocal foldexpr=<SID>GetPotionFold(v:lnum)
Run Code Online (Sandbox Code Playgroud)

并重命名了所有要开始的功能 s:

令我惊讶的是,这不起作用,每一行的折叠级别为0?如果我GetPotionFold进入全球范围,它就有效.在将其分配给选项时,是否必须使用全局范围的功能?为什么?

Ing*_*kat 6

<SID> 可以用于映射或菜单中使用,遗憾的是没有一个选项.(这是实施中的一个缺点.)

您必须将其转换为实际<SNR>NNN_前缀(有一个s:SID()示例函数:help <SID>),或者使用可从定义函数的脚本外部访问的其他范围.值得称道的是,您希望避免破坏全局函数名称空间,因为这很容易发生名称冲突.

一个很好的技巧是使用自动加载功能前缀; 它不仅适用于自动加载脚本,还可以在其他地方使用,例如在插件脚本中.只需添加脚本的名称,您将拥有一个可以从任何地方调用的函数,但是作用于脚本的名称:

:function! MyScriptName#GetPotionFold(lnum)
    ...
:setlocal foldexpr=MyScriptName#GetPotionFold(v:lnum)
Run Code Online (Sandbox Code Playgroud)