vim脚本的调试

1412阅读 0评论2010-08-21 bailiangcn
分类:LINUX

5. 调试脚本 **


除了在自己的脚本里提示明显的消息,Vim 提供了调试模式来让你了解自己的代码在做什
么。你可以单步执行脚本文件和函数和设置断点。

注意: 调试模式远未完善。调试程序会对 Vim 的工作产生副作用。你不能用它调试一
切细节。例如,调试信息会弄乱屏幕的显示。
{Vi 没有调试模式}

另外一个办法是设置 'verbose' 选项。设置一个比较大的数字,你会得到 Vim 在做什么
的更详尽的信息。


启 动 调 试 模 式 **

以下方法可以进入调试模式:
1. 用 || 参数启动 Vim:
vim -D file.txt
调试会在执行第一个 vimrc 文件的时候开始。这有助于了解 Vim 启动的时候干了些
什么。一个副作用是 Vim 会在初始化完成之前切换终端模式,这会有意想不到的后
果。
对只用 GUI 的版本 (Windows、Macintosh) 调试会在 GUI 窗口打开的一刻开始。要
提早进入调试,在 vimrc 文件里加上 ":gui" 命令。
**
2. 执行命令前加上 ":debug" 前缀。这样,调试只对这个命令进行。这对调试某一个特
定的脚本和用户函数,或者 autocommands 用到的脚本和函数有用。例如:
:debug edit test.txt.gz

3. 在一个执行的文件和用户函数里设置断点。你可以在命令行里这么做:
vim -c "breakadd file */explorer.vim" .
这会启动 Vim 并在 "explorer.vim" 脚本的第一行停下。进入调试模式后也可以设置
断点。

在调试模式里,每个命令都会在执行前被显示。注释行、空行和其他不执行的行会被跳
过。如果一行里有两个 "|" 分隔的命令,它们被分别显示。


调 试 模 式

进入调试模式以后,可以使用通常的 Ex 命令。比如,要检查某变量的值:
echo idx
在一个用户函数里,这会显示局域变量 "idx" 的值。在变量前加上 "g:" 可以得到全局
变量的值:
echo g:idx
所有的命令都在当前函数或脚本的上下文下执行。你可以设置选项,比如设置或者重设
'verbose' 来显示当前发生的事情,但是你需要在执行你感兴趣的行之前设置它们:
:set verbose=20

要避免更新屏幕的命令,因为直到退出调试模式之前,无法看到它们的效果。例如,帮助
命令:
:help
不会很有帮助。

调试模式有自己的命令行历史。

函数行的行号是相对于函数开始的地方的。如果你要知道你在哪里,在另外一个 Vim 里
编辑包含这个函数的文件,先找到函数的开始处,然后用 "99j",其中的 "99" 用实际的
行号代替。

另外,可以使用如下的命令:
**
cont 继续执行到下一个断点。
**
quit 终止执行。这和 CTRL-C 类似,但是还是有要执行的东西,并
不是所有的都中止。在遇到断点时还是会停下来。
**
next 执行一个命令,并在它结束时返回调试模式。步过用户函数
调用和被执行的脚本。
**
step 执行一个命令,并在它结束时返回调试模式。步入用户函数
调用和被执行的脚本。
**
interrupt 类似于 CTRL-C,但不同于 ">quit",这会在执行下个命令前
返回到调试模式。它有助于测试 || 和 ||
对中断例外的处理。
**
finish 结束当前的脚本或者用户函数,并在调用该脚本或函数的行的
下一行之前返回到调试模式。

关于调试模式下的附加命令:
- 没有它们的命令行自动补全。补全只对一般的 Ex 命令有效。
- 可以用一个字符来简写,即: "c"、"n"、"s" 和 "f"。
- 按 会重复上一个调试命令。在执行另一个命令之后,这个功能会被关掉 (因为不
知道你要重复什么)。
- 如果你想调用相同的名字的 Ex 命令,在前面附加一个冒号: ":cont"、":next"、
":finish" (或者它们的缩写)。


定 义 断 点
** **
:breaka[dd] func [lnum] {name}
在函数上设置断点。例如:
:breakadd func Explore
它不会检查函数名的合法性。这样,断点可以在函数定义之前设置。

:breaka[dd] file [lnum] {name}
在一个脚本文件上设置断点。例如:
:breakadd file 43 .vimrc

:breaka[dd] here
在当前文件的当前行上设置断点。类似于:
:breakadd file
注意 只能用于执行此文件时会执行的命令,不适用于该文件此处定义
的函数。

其中 [lnum] 是断点所在的行号。Vim 会在它或它之后的行上停止。如果省略,就用行号
1。

**
{name} 是用来匹配文件名或者函数名的模式。这和 autocommands 所有的模式类似。它
必须是一个完整匹配 (如同它以 "^" 开头和 "$" 结尾一样)。"*" 匹配任何字符序列。
它不用 'ignorecase' 选项,但是模式里可以用 "\c" 来忽略大小写 ||。不要给函数
名加上 ()!

对脚本文件的匹配给予它的完整文件名。例如:
breakadd file explorer
不会匹配。因为没有给出路径。
breakadd file *explorer.vim
匹配 ".../plugin/explorer.vim" 和 ".../plugin/iexplorer.vim"。
breakadd file */explorer.vim
只匹配 ".../plugin/explorer.vim"。

对函数名的匹配基于 ":function" 输出结果里它的显示方式。对于局部函数,这意味着
函数名前会附加上类似 "99_" 的字符串。

注意函数先被载入然后再执行。载入时,检查 "file" 断点,而执行时检查 "func" 断
点。


删 除 断 点
** ** **
:breakd[el] {nr}
删除断点 {nr}。用 || 可以看到每个断点的编号 {nr}

:breakd[el] *
删除所有断点。

:breakd[el] func [lnum] {name}
删除函数断点。

:breakd[el] file [lnum] {name}
删除脚本断点。

:breakd[el] here
删除当前文件的当前行上的断点。

如果 [lnum] 省略,删除该函数或者文件的第一个断点。
{name} 必须和 ":breakadd" 所匹配的名字完全相同。"explorer"、"*explorer.vim" 和
"**" 是不一样的。


列 出 断 点
** **
:breakl[ist]
列出所有的断点。


不 常 用 的

** **
:debugg[reedy]
从正常的输入流而不是直接从用户输入里读取调试模式命令。这只对测
试脚本有用。例如:
echo 'q^Mq' | vim -e -s -c debuggreedy -c 'breakadd file script.vim' -S script.vim

:0debugg[reedy]
撤销 ":debuggreedy": 从用户那里直接读取调试模式命令,而不为调
试命令预读取。


上一篇:[转载]Ubuntu/Debian包管理命令大全(apt & dpkg)
下一篇:vim的正则表达式