我想在一个引用的Vim脚本中调用一个使用脚本范围(s:
)声明的函数,而不需要在call <SNR>%d_function()
中硬编码%d
,也不需要通过修改插件文件本身来将该函数暴露到全局命名空间。如何以编程方式检索其父脚本的<SNR>
或脚本编号?
我想在一个引用的Vim脚本中调用一个使用脚本范围(s:
)声明的函数,而不需要在call <SNR>%d_function()
中硬编码%d
,也不需要通过修改插件文件本身来将该函数暴露到全局命名空间。如何以编程方式检索其父脚本的<SNR>
或脚本编号?
您可以通过解析:scriptnames
的输出来检索脚本的<SNR>
。以下函数将为脚本的完整文件名或其片段(只要它能唯一地标识您想要的那个)执行此操作。
func! GetScriptNumber(script_name)
" Return the <SNR> of a script.
"
" Args:
" script_name : (str) The name of a sourced script.
"
" Return:
" (int) The <SNR> of the script; if the script isn't found, -1.
redir => scriptnames
silent! scriptnames
redir END
for script in split(l:scriptnames, "\n")
if l:script =~ a:script_name
return str2nr(split(l:script, ":")[0])
endif
endfor
return -1
endfunc
如果您需要在名为bar.vim
的脚本中调用使用s:
定义的函数foo
,您可以使用以下命令:
call eval(printf("<SNR>%d_foo()", GetScriptNumber("bar.vim")))
:Scriptnames
来在 quickfix 窗口中按加载顺序显示所有已加载的脚本。 脚本号是脚本路径后面的整数。这样很容易找到你想要的脚本。