代码之家  ›  专栏  ›  技术社区  ›  intuited

正在转储匿名函数的源代码

  •  4
  • intuited  · 技术社区  · 14 年前

    原件(更新如下)

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

    Vim的回溯如下:

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

    此跟踪显示错误发生在堆栈的第三层,即匿名函数2105的第一行。IE名称函数调用了匿名函数2111,后者调用了匿名函数2105。NamedFunction是通过Normal声明的函数 function NamedFunction() ... endfunction 语法;其他的使用类似代码声明 function dict.func() ... endfunction .

    很明显,我想知道哪个函数的编号是2105。

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

    不管怎样,我想知道是否可以为匿名函数转储源代码。这会容易得多,而且可能更可靠。

    更新

    我结束了 asking about this 一段时间后在Vim上使用邮件列表。Bram Moolenar,又名Vim's BDFL ,回答说“您不应该使用函数号”。但是,截至2010年9月初,还没有建议对此功能使用合适的替代方法。还没有明确提到这个功能是否会在随后的VIM版本中继续工作。在最近发布的VIM 7.3中,我没有尝试过这样做(或者其他任何事情)。

    2 回复  |  直到 14 年前
        1
  •  1
  •   too much php    14 年前

    这个 :function 命令试图阻止您指定带编号的函数(它们的名称只是一个数字),但您可以使用 {...} 动态函数名特性,抛出一些 :verbose 你有一个赢家:

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

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

        2
  •  0
  •   ZyX    14 年前

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