TL; DR

当我有兴趣解决实际问题而不仅仅是删除错误的插件时,如何找到确切的vimnvim错误从哪里开始(哪个文件?)?还有什么比strace和guesswork更好的方法来找到错误源?

问题

我经常在我的vimnvim配置中添加一个插件,最终在钩子(Hook)上出现错误(缓冲区打开,关闭,写入):

"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知道它在哪里出现。

    10-01 00:39