如何调试 `vim` 和 `nvim` 中的 `Error while processing function`?
How to debug `Error while processing function` in `vim` and `nvim`?
TL;DR
当我有兴趣解决实际问题而不只是删除错误的插件时,如何找到 vim
或 nvim
错误开始的确切位置(哪个文件?)?有什么比 strace
和猜测更能找到错误来源的吗?
问题
我经常在我的 vim
或 nvim
配置中添加一个插件,并最终在挂钩上出现错误(缓冲区打开、关闭、写入):
"test.py" [New] 0L, 0C written
Error detected while processing function 343[12]..272:
line 8:
E716: Key not present in Dictionary: _exec
E116: Invalid arguments for function get(a:args, 'exec', a:1['_exec'])
E15: Invalid expression: get(a:args, 'exec', a:1['_exec'])
问题是,我不知道这些是从哪里来的,只得到一些未知文件的行号,我知道这不是我的 vim
/nvim
配置文件。
在某个地方,你有一个插件,它用 anonymous-functions
定义了一个字典(检查与这个标签相关的帮助)。
对于好奇的人,它是这样完成的:
let d = {}
function! d.whatever() abort
throw "blah"
endfunction
当您执行此函数时,您会遇到当前观察到的那种错误。这就是为什么我停止以这种方式工作而更喜欢:
let d = {}
function s:whatever() abort
throw "blah"
endfunction
let d.whatever = function('s:whatever') " a workaround is required for older versions of vim
" At least this way I'll get a `<SNR>42_whatever` in the exception throwpoint, and thus a scriptname.
这就是原因。现在,回到你的问题,AFAIK,你唯一能知道的是被调用的两个函数:
- 在
:function {343}
的第 12 行,你 调用了
:function {272}
第 8 行包含错误。
感谢这两个命令(可能是:verbose
前缀,我记不太清了),你会得到这两个函数的源码,应该可以按顺序使用grep 你的插件以了解它出现的位置。
TL;DR
当我有兴趣解决实际问题而不只是删除错误的插件时,如何找到 vim
或 nvim
错误开始的确切位置(哪个文件?)?有什么比 strace
和猜测更能找到错误来源的吗?
问题
我经常在我的 vim
或 nvim
配置中添加一个插件,并最终在挂钩上出现错误(缓冲区打开、关闭、写入):
"test.py" [New] 0L, 0C written
Error detected while processing function 343[12]..272:
line 8:
E716: Key not present in Dictionary: _exec
E116: Invalid arguments for function get(a:args, 'exec', a:1['_exec'])
E15: Invalid expression: get(a:args, 'exec', a:1['_exec'])
问题是,我不知道这些是从哪里来的,只得到一些未知文件的行号,我知道这不是我的 vim
/nvim
配置文件。
在某个地方,你有一个插件,它用 anonymous-functions
定义了一个字典(检查与这个标签相关的帮助)。
对于好奇的人,它是这样完成的:
let d = {}
function! d.whatever() abort
throw "blah"
endfunction
当您执行此函数时,您会遇到当前观察到的那种错误。这就是为什么我停止以这种方式工作而更喜欢:
let d = {}
function s:whatever() abort
throw "blah"
endfunction
let d.whatever = function('s:whatever') " a workaround is required for older versions of vim
" At least this way I'll get a `<SNR>42_whatever` in the exception throwpoint, and thus a scriptname.
这就是原因。现在,回到你的问题,AFAIK,你唯一能知道的是被调用的两个函数:
- 在
:function {343}
的第 12 行,你 调用了 :function {272}
第 8 行包含错误。
感谢这两个命令(可能是:verbose
前缀,我记不太清了),你会得到这两个函数的源码,应该可以按顺序使用grep 你的插件以了解它出现的位置。