获取 Vim 脚本的 <SNR>

7

我想在一个引用的Vim脚本中调用一个使用脚本范围(s:)声明的函数,而不需要在call <SNR>%d_function()中硬编码%d,也不需要通过修改插件文件本身来将该函数暴露到全局命名空间。如何以编程方式检索其父脚本的<SNR>或脚本编号?

2个回答

11

您可以通过解析: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")))

2
还有一个 Vim 插件 scriptease,它提供了一个命令 :Scriptnames 来在 quickfix 窗口中按加载顺序显示所有已加载的脚本。 脚本号是脚本路径后面的整数。这样很容易找到你想要的脚本。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接