获取函数调用的回溯

时间:2015-10-12 17:57:43

标签: vim

为了使<Fn>键更具可定制性,我使用了一个脚本(我称之为fkeys.vim),它创建了一个函数调用的映射(让我们调用它{{1} }):对此函数的调用取代了我的许多脚本中Map()命令的使用。

它非常舒服,因为它可以让我轻松添加一些不错的功能,但是它给我带来了一个新问题:当我想知道某个映射的定义位置时,就像这样:

:map

,然后vim总是说映射最后在:verbose map ... 脚本中定义,而不是在fkeys.vim被称为的真实脚本中。这是合乎逻辑的,但非常令人沮丧,因为Map()命令非常有用,并且是我知道快速查找映射定义的唯一方法。

一个解决方案是向我的:verbose map函数添加一个参数,其中将传递实际脚本的文件名(为了存储此信息并在需要时将其恢复):

Map()

但它会污染我的脚本可读性,而且它看起来并不优雅。

更好的方法是能够获取函数调用的回溯,例如php中的function! Map(lhs, rhs, [some other args...], caller)

Vim可以吗?

1 个答案:

答案 0 :(得分:7)

无法获得 true 回溯,但如果你保持清洁,你可以解析<sfile>。根据手册:

              When executing a function, is replaced with:
              "function {function-name}[{lnum}]"
              function call nesting is indicated like this:
              "function {function-name1}[{lnum}]..{function-name2}[{lnum}]"

因此这样的事情应该做:

function! Backtrace(trace)
    return map(split(substitute(a:trace, '^function ', '', ''), '\.\.'), 'substitute(v:val, ''\m\[\d\+\]$'', "", "")')[:-2]
endfunction

你需要这样称呼它:

let callers = Backtrace(expand('<sfile>'))

示例:

function! F1()
    call Fn()
endfunction

function! F2()
    call F1()
endfunction

function! F3()
    call F2()
endfunction

function! Fn()
    echomsg expand('<sfile>')
    echomsg string(Backtrace(expand('<sfile>')))
endfunction

call F3()

输出:

function F3[1]..F2[1]..F1[1]..Fn
['F3', 'F2', 'F1']