2010-04-12 69 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字典。