19

调试/跟踪 vim 插件的更可取的通用方法是什么?假设我有一个相当复杂的插件 Foo,它在按下一个键时会F9打开带有文件浏览器的新窗口并提供选择文件的可能性,然后将文件名复制到主窗口中。我想看看当我按下F9键时调用了什么,某种调用跟踪。

4

3 回答 3

18

我发现最好的方法是-V在启动 (g)vim 时使用标志。N您可以为写入的日志指定跟踪级别和文件名:

$ vim -V[N]{filename}

然后将为每个来源的文件提供跟踪消息。(有关:help -V更多信息,请参阅。)

浏览生成的日志文件可能会很痛苦,但通常信息量很大。我发现最好在触发事件之前和之后查看日志文件(<F9>在您的情况下按下)以了解何时发生。

于 2012-03-12T14:09:00.343 回答
7

如果您已经打开了 vim,请尝试在 VIM 的内置调试器下手动执行该命令。

1)找出当你按键时vim做了什么

:map <F-9>

2)在调试器下手动运行映射命令

:debug _mapped_command_

3)现在你应该进入调试器,所以

set verbose=20

4)最后按n回车键继续运行脚本

此时,您应该在屏幕上看到一大堆输出。您可以按 Space 滚动屏幕,按 j/k 逐行移动。

任何以 "Line #:" 开头的输出都是当时 vim 正在执行的行。

于 2015-04-11T03:26:00.113 回答
1

对于复杂的插件,通常命令行调试或跟踪是不够的。

您可以使用BreakPts在 vi​​m中进行可视化调试。

它是基于远程调试的,所以你需要调试一个vim的服务器实例。

基本上:

1号航站楼:

$ vim --servername Foo
...
set breakpoint on any Foo function
do whatever operation which trigger Foo logic
...

2号航站楼:

$ vim
:BreakPts
:BPRemoteServ FOO
:BPDWhere locate (actual debug execution point)
:BPDNext or F12 (next execution line)
:BPDStep or F11 (step inside functions, dictionary functions)
:BPDEvaluate or F8 (if pressed on visual selection evaluates that)
:BPDCont or F5 (continue execution)

看到一些插件是动态加载的,所以你需要在设置断点之前对它们进行操作。

加载后,您可以从连接的 vim 设置断点:

:BPFunctions (Show debuggeable fuctions on RemoteServer)
:BPScripts (Show debuggeable scripts on RemoteServer)
:BPPoints (Show defined breakpoints on RemoteServer)

多亏了这个很棒的插件,我修复/调整/进化了很多 vim 插件。

于 2015-07-05T21:46:22.900 回答