Debugging 转储匿名函数的源代码 原件(更新如下)

Debugging 转储匿名函数的源代码 原件(更新如下),debugging,vim,Debugging,Vim,我正在处理许多匿名函数,即作为字典的一部分声明的函数,也称为“方法”。调试变得非常痛苦,因为我无法判断错误发生在哪个函数中 Vim的回溯轨迹如下所示: Error detected while processing function NamedFunction..2111..2105: line 1: E730: using List as a String 此跟踪显示错误发生在堆栈的第三层,即匿名函数#2105的第一行。IE NamedFunction称为匿名函数2111,后者称为匿名

我正在处理许多匿名函数,即作为字典的一部分声明的函数,也称为“方法”。调试变得非常痛苦,因为我无法判断错误发生在哪个函数中

Vim的回溯轨迹如下所示:

Error detected while processing function NamedFunction..2111..2105:
line    1:
E730: using List as a String
此跟踪显示错误发生在堆栈的第三层,即匿名函数#2105的第一行。IE NamedFunction称为匿名函数2111,后者称为匿名函数2105。NamedFunction是通过普通的
函数NamedFunction()声明的函数。。。endfunction
语法;其他的是使用类似于
函数dict.func()的代码声明的。。。endfunction

显然,我想知道哪个函数的编号是2105

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

无论如何,我想知道是否有可能转储匿名函数的源代码。这会容易得多,而且可能更可靠

更新
我回到了vim_use邮件列表。Bram Moolenar,又名vim的,回应说“你不应该使用函数号。”然而,截至2010年9月初,还没有为该功能提出合适的替代方案。也没有明确提到该功能是否会在后续的vim版本中继续工作。在最近发布的vim 7.3中,我没有尝试过这样做(或者做任何其他事情)。

我使用了以下解决方法:我有一个插件,可以为其他插件创建命令、全局函数等。它还注册了所有插件,所以我有一本大字典,里面有很多与插件相关的东西。如果我看到一个错误,我将使用函数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:F.{key}字典中有这个插件函数,在s:g.reg.registered[plugname].F字典下有其他插件函数。

使用
:function
命令试图阻止您指定编号函数(它们的名称只是一个数字),但您可以使用
{…
动态函数名功能来欺骗它,加入一些
:verbose
,你就有了赢家:

:verbose function {43}
  function 43()
      Last set from /home/peter/test.vim
1   throw "I am an exception"
  endfunction

这在帮助文档中一点也不明显。

Beauty。是的,维姆的文件是。不完全一致。你是通过反复试验才发现这一点的,还是有记录在案的呢?反复试验,我不得不把几部分放在一起。这个解决方案可能只是利用了
:function
命令中的一个bug。我想我应该已经阅读了vim的源代码。我有时会忘记这件事。