gpt4 book ai didi

vim - 获取函数调用的回溯

转载 作者:行者123 更新时间:2023-12-04 23:18:46 25 4
gpt4 key购买 nike

使<Fn>键更可定制,我使用一个脚本(我称之为 fkeys.vim )创建映射抛出函数的调用(我们称之为 Map() ):对这个函数的调用取代了 :map 的使用我的许多脚本中的命令。

它很舒服,因为它让我可以轻松地在我的个人映射周围添加一些不错的功能,但它给我带来了一个新问题:当我想知道某个映射是从哪里定义的时,如下所示:

:verbose map ...

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

一种解决方案是在我的 Map() 中添加一个参数。函数,其中将传递实际脚本的文件名(为了存储此信息并在我需要时将其取回):
function! Map(lhs, rhs, [some other args...], caller)

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

更好的是能够 获取函数调用的回溯 , 喜欢 debug_backtrace()在 php 中。

Vim 可以吗?

最佳答案

获得真正的回溯是不可能的,但如果你保持干净,你可能能够摆脱解析 <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']

关于vim - 获取函数调用的回溯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33087376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com