为了使<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可以吗?
答案 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']