我想在源Vim脚本中调用用脚本范围(s:
)声明的函数,而不对%d
中的call <SNR>%d_function()
进行硬编码或将函数暴露给通过修改插件文件本身来实现全局命名空间。如何以编程方式检索其父脚本的<SNR>
或脚本编号?
答案 0 :(得分:9)
您可以通过解析<SNR>
的输出来检索脚本的:scriptnames
。以下函数将对脚本的完整文件名或其片段执行此操作(只要它唯一标识您想要的文件名)。
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
例如,如果您需要在名为foo
的脚本中调用s:
定义的函数bar.vim
,则可以使用:
call eval(printf("<SNR>%d_foo()", GetScriptNumber("bar.vim")))
答案 1 :(得分:1)
还有一个Vim插件scriptease,该插件提供了一个命令:Scriptnames
,以在快速修复窗口中按加载顺序显示所有已加载的脚本。很容易找到想要的脚本。