📄 quickfix.cnx
字号:
5.3 用 :grep 浏览源代码使用 Vim 保存的错误列表,你可以查找某些函数或是其调用的其它函数。举个例子,如果你要对read_file 函数添加一个参数,可以输入下面的命令: > :grep read_file *.c你可以用 ":cn" 在一系列匹配中跳转,然后加上所需要的参数。在某个地方,你需要从上层函数 msg() 得到这个新的参数,并要对它做出修改: > :grep msg *.c在修改 msg() 函数的同时,你又找到另一个需要从上层函数中获得该参数的函数。你可以用 ":grep" 命令找到这些函数。当完成一个函数后,你可以用: > :colder来跳转到上一个函数。这就像浏览一个树一样,":grep" 每深入一层,就创建新的分支。":colder" 跳转到上一层。你可以混和使用 ":grep" 和 ":colder" ,以树型方式来浏览所有的位置。如果经常这么做,你不需写一个 "todo" 列表就能找到所有的位置。=============================================================================6. 选择编译器 *compiler-select* *:comp* *:compiler*:comp[iler] {name} 为 {name} 编译器设定相关选项。 {如编译时没指定 |+eval|,则此命令不可用}这个命令实际上做的是:- 删除 "current_compiler" 变量 *current_compiler*- 执行 ":runtime! compiler/{name}.vim"如要编写编译器插件,请参考 |write-compiler-plugin|。MANX AZTEC C *quickfix-manx* *compiler-manx*要使 Vim 和 Amiga 上的 Manx Aztec C 编译器工作,需要以下步骤:- 设定 CCEDIT 环境变量: > mset "CCEDIT=vim -q"- 用 -qf 选项编译。如果编译器发现任何错误,Vim 被启动,光标定位在首个错误处。 错误信息会在最后一行显示。你可以用上面提到的命令跳转到其它的错误,对其修定并 存盘。- 如果正常退出 Vim,编译器会再次编译相同文件。如果用 :cq 命令退出,编译器就会 终止。如果不能修定错误或是需要先编译其它的文件,你可以这样做。在 Amiga 系统上,QuickFix 模式会有某些限止。编译器只能在错误文件中写入前 25 个错误(Manx 的文档没有说明怎样才能写入更多)。如果想查找其它的错误,你需要首先修定一些错误并退出编译器。重新编译后,剩下的错误 (最多 25 个)就会找到。如果 Vim 是在编译器中启动的,:sh 和 一些 :! 命令不能工作,因为 Vim 是和编译器在同一个进程中运行而 stdin (标准输入 )也不在交互状态。PYUNIT 编 译 器 *compiler-pyunit*这其实不是一个编译器,而是一个为 Python 语言而设的单元测试工具。从版本 2.0 起,它就在标准的 Python 发布中。对老版本,你可以在这里获得:http://pyunit.sourceforge.net 。当你运行测试时,Vim 会解析错误并进入到 quick-fix 模式。不幸的是,没有一个运行测试的标准方法。一般都会用使用 alltest.py。有关 'makeprg' 选项就可以这样设定: setlocal makeprg=./alltests.py " Run a testsuite setlocal makeprg=python % " Run a single testcase另外,参考 http://vim.sourceforge.net/tip_view.php?tip_id=280.TEX 编 译 器 *compiler-tex*Vim 发布版本中的 Tex 编译器 ($VIMRUNTIME/compiler/tex.vim) 可以处理各种风格的TeX 格式。如果变量 b:tex_flavor 或 g:tex_flavor 存在,它将为 :make (即为所要运行的命令)定义 TeX 风格;如果这两个变量都不存在,将会使用省缺的 "latex"。比如,要编辑从 AMS-TeX 上 mypaper.tex \input-ed 而来的 chapter2.tex: > :let b:tex_flavor = 'amstex' :compiler tex< [editing...] > :make mypaper注意,你须要将所处理文件的文件名作为参数(以在编辑 \input-ed 或 \include-ed文件时能处理正确的文件)。这不是 make 的语义,但你可以指定不含扩展名 ".tex" 的文件名。使用到的变量:b:tex_ignore_makefile 或 g:tex_ignore_makefile 通常,如果当前目录存在 'Makefile' 或 'makefile' ,这将被视作用户想要用 make 处理 *TeX 文件的信号。如果你不想这样,可以在运行 :compiler tex 前设定上面的 两个变量之一。b:tex_flavor 或 g:tex_flavor 省缺的,编译器会认为你使用 LaTeX 并用 "latex" 运行它。如果你的情况不是这样, 可以将 b:tex_flavor 或 g:tex_flavor 设定为你所要运行的命令名。Note: latex 命令行格式对 MikTeX 和 teTeX 都适用。要使 :help errorformat-LaTeX上的建议对不同 shell 不同 OS 都适用太过复杂,因此不允许使用其它的 TeX 的选项。如果你的 TeX 不支持 "-interaction=nonstopmode",请在命令行中用其它的方式表示\nonstopmode。=============================================================================7. 错误格式 *error-file-format* *errorformat* *E372* *E373* *E374* *E375* *E376* *E377* *E378*'errorformat' 选项指定可识别出的一系列格式。首个匹配的格式会被使用。你可以为编译器产生的不同信息添加不同格式,或是为多个编译器添加项目。参见 |efm-entries|。'errorformat' 里的每一项类似 scanf 的格式字符串。首先,你需要了解 scanf 是如何工作的。请查看你的 C 编译器文档。下面你可以看到,Vim 理解 % 条目。其它的则无效。'errorformat' 中的特殊字符是逗号和反斜杠,参见 |efm-entries|。注意实际字符 '%'用 "%%" 来匹配,而不用反斜杠来转义。Note: 省缺忽略大小写差别。如果要匹配大小写,在模式中加入 "\C",参见 |/\C|。基 本 条 目 %f 文件名 (字符串) %l 行号 (数字) %c 列号 (代表错误中字符列的数字,(一个 <tab> 等于一个 字符列)) %v 实际列号 (代表错误中屏幕列的数字,(一个 <tab> 等于 8 个屏幕列)) %t 错误类型 (单个字符) %n 错误号 (数字) %m 错误信息 (字符串) %r 匹配"余下的"的单行文件信息 %O/P/Q %p 指针行 ('-', '.' 或是 ' ' 的序列,用长度作为列号) %*{conv} 任何 scanf 非指定转换 %% 单个 '%' 字符"%f" 转换倚赖于当前 'isfname' 的设定。"%f" 和 "%m" 转换需要识别字符串结尾。它们后面可跟一个不能在字符串中出现的字符,在此之前的所有字符都包括在字符串中。但当下一个字符是 '%' 或是反斜杠,"%f"会查找任何 'isfname' 字符,而 "%m" 则查找任意。如果 "%f" 或 "%m" 在结尾,则行中此前的所有字符都被包括。在 MS-DOS, MS-Windows 和 OS/2 系统上,"C:" 会加到 "%f" 开头中,即使使用"%f:"。这就是说单字符(字母表中)文件名别将不被识别。"%p" 转换一般后跟 "^"。这是为了编译器产生的这种输出: > ^or > ---------^以指定错误所在列。这被用在一个多行错误信息中。一个有用的列子,参见|errorformat-javac|。改 变 目 录下面的大写转换指定特殊格式化字符串的类型。它们大多作为以逗号分隔的单个格式的前缀。一些编译器产生含有目录名的信息,这些目录名需要加在 %f 读入文件名的前面 (比如GNU make)。下面的的代码可用于扫描这些目录名;它们将被保存在内部的目录栈中。 *E379* %D "进入目录" 格式字符串;期待后跟 %f 以找到目录名 %X "离开目录" 格式字符串;期待后跟 %f当定义 "进入目录" 或是 "离开目录" 格式时,"%D" 或是 "%X" 需要在字符串的开头。Vim 跟踪记录变化并把当前目录加在错误文件的相对目录中。有关细节,参见|quickfix-directory-stack|。 多 行 信 息 *errorformat-multi-line*可以读入程序输出的多行信息,比如,错误字符超过一行。有关前缀有: %E 错误信息开始 %W 警告信息开始 %I 一般信息开始 %A 多行信息开始 (未指定类型) %C 多行信息继续 %Z 多行信息结束这些可同 '+' 和 '-' 一起使用,参见下面的 |efm-ignore|。例子: 你的编译器以下面格式输出 (开头的行号并不是实际输出): 1 Error 275 2 line 42 3 column 3 4 ' ' expected after '--'正确的错误格式串应如下: > :set efm=%EError\ %n,%Cline\ %l,%Ccolumn\ %c,%Z%m这样, |:clist| 产生的出错信息为: 1:42 col 3 error 275: ' ' expected after '--'另一个例子: Python 解释器产生下面的错误信息 (行号不是实际输出): 1 ============================================================== 2 FAIL: testGetTypeIdCachesResult (dbfacadeTest.DjsDBFacadeTest) 3 -------------------------------------------------------------- 4 Traceback (most recent call last): 5 File "unittests/dbfacadeTest.py", line 89, in testFoo 6 self.assertEquals(34, dtid) 7 File "/usr/lib/python2.2/unittest.py", line 286, in 8 failUnlessEqual 9 raise self.failureException, \ 10 AssertionError: 34 != 33 11 12 -------------------------------------------------------------- 13 Ran 27 tests in 0.063s假使你想让 |:clist| 输出这样的相关信息: 5 unittests/dbfacadeTest.py:89: AssertionError: 34 != 33错误格式字符串可这样定义: > :set efm=%C\ %.%#,%A\ \ File\ \"%f\"\\,\ line\ %l%.%#,%Z%[%^\ ]%\\@=%m注意 %C 字符串在 %A 前指定: 因为 ' %.%#' 表达式(表示正则表达式 ' .*')匹配每一个以空格开头后接任何字符的行,这样就包括可以单独产生错误信息的第 7 行。错误格式字符串总是一个模式接一个模式的分析,直到找到首个匹配。单 独 文 件 名 *errorformat-separate-filename*如果编译器输出只给定一次文件名而有多个信息指向这个文件,下面的前缀就很有用: %O 单行文件信息: 再次读入匹配部分。 %P 单行文件信息: 将 %f 入栈 %Q 单行文件信息: 将最后一个文件名出栈例子: 编译器产生以下出错日志 (不含开头的行号): 1 [a1.tt] 2 (1,17) error: ';' missing 3 (21,2) warning: variable 'z' not defined 4 (67,3) error: end of file found before string ended 5 6 [a2.tt] 7 8 [a3.tt] 9 NEW compiler v1.1 10 (2,2) warning: variable 'x' not defined 11 (67,3) warning: 's' already defined这个文件对每个在 [...] 中包括的文件列出了多个信息。我们可以这样设定格式: > :set efm=%+P[%f],(%l\\,%c)%*[\ ]%t%*[^:]:\ %m,%-Q|:clist| 会正确的显示它们的文件名: 2 a1.tt:1 col 17 error: ';' missing 3 a1.tt:21 col 2 warning: variable 'z' not defined 4 a1.tt:67 col 3 error: end of file found before string ended 8 a3.tt:2 col 2 warning: variable 'x' not defined 9 a3.tt:67 col 3 warning: 's' already defined和其它匹配整行的前缀不同,%P, %Q 和 %O 可以匹配同一行中的多个模式。这样就可以对像下面这样套嵌的文件解析: {"file1" {"file2" error1} error2 {"file3" error3 {"file4" error4 error5}}}%O 解析不含 入栈/出栈 信息的字符串。更深入的例子,参见 |errorformat-LaTeX|。 忽 略 和 使 用 整 个 信 息 *efm-ignore*'+' 和 '-' 可与上面的大写代码接合;这种情况下,它们要在字母的前面,比如 '%+A'或 '%-G'。 %- 不在任何输出中包含相匹配的多行 %+ 在 %m 错误串中包含真个匹配行%G 只在和 '+' 和 '-' 接合使用时才有用。它会解析编译器版本等可被忽略的字符串。 %-G 忽略此信息 %+G 通用信息模 式 匹 配
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -