转储匿名函数的源代码

时间:2010-04-12 23:40:43

标签: debugging vim

原创(更新如下)

我正在使用许多匿名函数,即声明为字典一部分的函数,即“方法”。调试变得非常痛苦,因为我无法分辨出错误发生在哪个函数。

Vim的回溯看起来像这样:

Error detected while processing function NamedFunction..2111..2105:
line    1:
E730: using List as a String

此跟踪显示错误发生在堆栈的第三级,在匿名函数#2105的第一行。 IE NamedFunction称为匿名函数#2111,它调用匿名函数#2105。 NamedFunction是通过正常的function NamedFunction() ... endfunction语法声明的;使用function dict.func() ... endfunction等代码声明其他人。

所以显然我想知道哪个函数的编号为2105。

假设它仍然在范围内,那么可能通过转储可能包含该引用的所有字典变量来找出哪些Dictionary条目引用它。这有点尴尬,很难系统化,虽然我想我可以编写一个函数来搜索所有已加载的字典以获取对该函数的引用,注意循环引用。虽然要非常彻底,但它不仅要搜索脚本本地和全局字典,还要搜索缓冲区本地字典;有没有办法访问另一个缓冲区的局部变量?

无论如何,我想知道是否可以转储匿名函数的源代码。这将更容易,也可能更可靠。

更新

我在vim_use邮件列表上回来了asking about this一段时间。 Bram Moolenar,又名vim的BDFL,回应说“你不应该使用功能号码。”但是,截至2010年9月初,尚未提出适用于此功能的替代方案。还没有明确提及此功能是否会在后续vim版本中继续有效。在最近发布的vim 7.3中,我没有尝试过(或其他任何事情)。

2 个答案:

答案 0 :(得分:1)

:function命令试图阻止您指定编号的函数(它们的名称只是一个数字)但您可以使用{...}动态函数名称功能欺骗它,抛出一些{{1你有一个胜利者:

:verbose

这在帮助文档中并不明显。

答案 1 :(得分:0)

我使用以下解决方法:我有一个插件可以执行一些操作,例如创建命令,其他插件的全局函数。它还注册了所有插件,所以我有一个很大的字典,里面有很多与插件相关的东西。如果我看到错误,我会使用函数findnr搜索产生它的函数:

"{{{3 stuf.findf:
function s:F.stuf.findf(nr, pos, d)
    if type(a:d)==2 && string(a:d)=~#"'".a:nr."'"
        return a:pos
    elseif type(a:d)==type({})
        for [key, Value] in items(a:d)
            let pos=s:F.stuf.findf(a:nr, a:pos."/".key, Value)
            unlet Value
            if type(pos)==type("")
                return pos
            endif
        endfor
    endif
    return 0
endfunction
"{{{3 stuf.findr:
function s:F.stuf.findnr(nr)
    for [key, value] in items(s:g.reg.registered)+[["load", {"F": s:F}]]
        let pos=s:F.stuf.findf(a:nr, "/".key, value.F)
        if type(pos)==type("")
            return pos
        endif
    endfor
    return 0
endfunction

这里我在s:g。{key}词典和s:g.reg.registered [plugname] .F字典下的其他插件函数中有这个插件函数。