2010-04-12 71 views
4

原(更新如下)

我用了很多匿名函数声明为一本字典,又名“方法”的一部分,即功能工作。它变得相当痛苦的调试,因为我不知道什么功能的错误都发生在倾销的源代码匿名函数

Vim的回溯这个样子:

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

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

所以很明显,我想找出哪个函数数2105

假设它仍然在范围,这是可能找出字典项引用这所倾倒所有的字典变量的那可能包含该参考。这是有点尴尬,很难有系统的,但我想我可以编写一个函数来搜索所有加载的字典,以引用该函数,注意循环引用。虽然要非常彻底,但它不仅要搜索脚本本地和全球字典,还要搜索缓冲区本地字典;有没有办法访问另一个缓冲区的局部变量?

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

更新

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

回答

1

:function命令尝试从指定编号的功能,阻止你(他们的名字仅仅是一个数字),但你可以使用{...}动态函数名功能绝招吧,在一些:verbose扔,你有一个赢家:

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

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

+0

美女。是的,vim的文档是。 。 。不完全一致。你是通过反复试验来弄清楚的,还是记录在某处? – intuited 2010-06-30 04:44:16

+0

试错,我不得不把几块放在一起。这个解决方案可能只是利用':function'命令中的一个错误。 – 2010-06-30 06:15:33

+0

我想我可以阅读vim的源代码。我有时会忘记。 – intuited 2010-06-30 17:23:12

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这个插件功能:下的F {}键字典和其他插件功能:g.reg .registered [插件名] .F字典。