📄 quickfix.cnx
字号:
scanf() 类 "%*[]" 记法仍被支持,以和老版本兼容。但你可以在格式化字符串中指定Vim 支持的(几乎)任何正则表达式。元字符本身可能为匹配字符串或文件名的一部分(因此需要被转义),它们开头都加上一个 '%': %\ 单个 '\' 字符。注意在 ":set errorformat=" 定义中需要 用 "%\\" 来转义。 %. 单个 '.' 字符。 %# 单个 '*'(!) 字符。 %^ 单个 '^' 字符。 %$ 单个 '$' 字符。 %[ 单个 '[' 字符 (指定一个 [] 字符范围)。 %~ 单个 '~' 字符。当在表达式中使用字符类(参见 |/\i|)时,含有 "\+" 数量符的串可以使用 scanf()的 "%*" 形式。比如: "%\\d%\\+" ("\d\+", "任意数字") 和 "%*\\d" 相同。Note: 子匹配 \(...\) 不能用于格式指定中,因为它被留作内部变换使用。'errorformat' 中 的 多 个 选 项 *efm-entries*为能识别从不同编译器产生的输出,可在 'errorformat' 中指定多个格式模式,用逗号将它们分隔 (note: 逗号后的空格被忽略)。第一个完全匹配的模式被使用。如果没有匹配,则使用最后一个模式中匹配的部分,虽然文件名被删除并且错误信息被设定为整个信息。如果有模式可以匹配多个编译器产生的输出(但不是正确的方式),将它放到一个更严格的模式的后面。要在模式中包括逗号,在它前面加一个反斜杠(如果是在 ":set" 命令中,要加两个)。要包括反斜杠本身,则使用两个反斜杠(在 ":set" 命令中使用四个)。":set" 命令中,在空格前也要加一个反斜杠。有 效 匹 配 *quickfix-valid*如果某行不能完全匹配 'errorformat' 中的项目,则此行被放入到错误信息中并标记为"无效"。这些行会被 ":cn" 和 ":cp" 命令忽略(除非没有任何有效行存在)。你可以用 ":cl!" 来显示所有的出错信息。如果出错格式不含文件名,Vim 不能跳转到正确的文件。你需要手动跳转。例子Aimga 上的 Aztec 编译器产生的错误文件格式是: filename>linenumber:columnnumber:errortype:errornumber:errormessage filename 错误所在文件的文件名 linenumber 错误所在行号 columnnumber 错误所在列号 errortype 错误类型,一般为 'E' 或 'W' errornumber 错误号 errormessage 错误描述可以用这个 'errorformat' 项目来匹配: %f>%l:%c:%t:%n:%m"一些对产生单行错误输出的编译器的例子:%f:%l:\ %t%*[^0123456789]%n:\ %m Manx/Aztec C 出错信息 (scanf() 不能理解 [0-9])%f\ %l\ %t%*[^0-9]%n:\ %m SAS C\"%f\"\\,%*[^0-9]%l:\ %m 一般 C 编译器%f:%l:\ %m GCC%f:%l:\ %m,%Dgmake[%*\\d]:\ Entering\ directory\ `%f',%Dgmake[%*\\d]:\ Leaving\ directory\ `%f' 与 gmake 接合的 GCC (同一行)%f(%l)\ :\ %*[^:]:\ %m 旧的 SCO C 编译器 (pre-OS5)%f(%l)\ :\ %t%*[^0-9]%n:\ %m 同上,增加错误类型和错误号%f:%l:\ %m,In\ file\ included\ from\ %f:%l:,\^I\^Ifrom\ %f:%l%m GCC,一些附加信息对多行信息处理更深入的例子,参见 |errorformat-Jikes| 和 |errorformat-LaTeX|.注意在空格和引号前的反斜杠。这对 :set 命令是必须的。在逗号前有两个反斜杠,一个是为 :set 命令须要,一个是为避免将逗号视为出错格式的分隔符。过 滤 信 息如果编译器产生的错误信息和格式串不适合,你可以写一个程序将出错信息转化为适合格式。通过设定 'makeprg' 选项,你可以用 ":make" 命令运行它。比如: > :set mp=make\ \\\|&\ error_filter管道符前的那些反斜杠是为了避免将其视作命令分隔符。每个空格前的反斜杠是 :set命令所必须的。=============================================================================8. 目录栈 *quickfix-directory-stack*Quickfix 根据 make 输出,维护一个保存所有使用过的目录的栈。对 GNU-make 来讲,这非常简单,因为它总是输出绝对路径,即使是通过 makefile 中的一个 'cd' 命令或以"-C dir" (在读入 makefile 之前进入到指定目录) 参数运行。'-w' 选项可用来强制GNU-make 在处理前后输出当前目录。如果你使用的不是 GNU-make,那目录栈的维护就会复杂得多。比如 AIX-make 从不输出有关当前目录的任何信息。这样你就需要在 makefile 上多花些功夫。lesstiff 的makefile 中有一个命令可以显示 "Making {target} in {dir}"。这里的问题是它并不在离开目录时输出信息,而且它不输出绝对路径。为解决相对路径和缺少 "leave direcotry" 信息问题,Vim 使用下面的算法:1) 检查给定目录是否为当前目录的子目录。如是,则将其存为当前目录。2) 如果不是,则检查它是否为上级目录的子目录。3) 如果目录仍没找到,则假定为它为 Vim 当前目录的子目录。例外,每一个文件都被检查,看其是否存在于识别出的目录中。如果不存在,则在目录栈(不是目录树)的其它目录中查找。如果仍没找到,则假定它在 Vim 当前目录中。此算法仍有限制。本例假定 make 在进入到一个目录时输出类似 "Making all in dir"的信息。1) 假定你有以下目录和文件: ./dir1 ./dir1/file1.c ./file1.c 如果 make 在处理当前目录前处理 "./dir1" 目录,而在 文件 "./file1.c" 中存在 一处错误,Vim 会载入文件 "./dir1/file.c"。 这只能靠 "leave direcotry" 信息解决。2) 假定你有以下目录和文件: ./dir1 ./dir1/dir2 ./dir2 你得到如下结果: Make 输出 Vim 理解的目录 ------------------------ ---------------------------- Making all in dir1 ./dir1 Making all in dir2 ./dir1/dir2 Making all in dir2 ./dir1/dir2 这可以通过在 "enter directory" 信息中输出绝对路径或是输出 "leave direcotry" 信息的方法解决。为避免这些问题,要确保输出绝对路径和 "leave directory" 信息。Makefiles 例子:Unix: libs: for dn in $(LIBDIRS); do \ (cd $$dn; echo "Entering dir '$$(pwd)'"; make); \ echo "Leaving dir"; \ done并将 %DEntering\ dir\ '%f',%XLeaving\ dir加到 'errorformat' 选项中以处理上面的输出注意 Vim 并不检查 "leave directory" 信息中的目录是否为当前目录。因此你可使用"Leaving dir" 信息。=============================================================================9. 特定错误格式 *errorformats* *errorformat-Jikes*Jikes(TM), IBM Research 发布的一个 source-to-bytecode Java 编译器提供简单的多行信息。一个和产生的信息相匹配的格式字符如下所示。这面这几行可加到用户的 |vimrc| 以覆盖 Vim 识别的省缺模式。或者,你可以参考|:set+=| 将这个模式加入到省缺中。 > :set efm=%A%f:%l:%c:%*\\d:%*\\d:, \%C%*\\s%trror:%m, \%+C%*[^:]%trror:%m, \%C%*\\s%tarning:%m, \%C%m<以 "+E" 选项启动时,Jikes(TM) 产生一个单行信息。对此,可以这样匹配: > :set efm=%f:%l:%v:%*\\d:%*\\d:%*\\s%m< *errorformat-javac*'errorformat' 可以很好的和 javac 工作,javac 的输出中用 "^" 表示错误所在列: > :set efm=%A%f:%l:\ %m,%-Z%p^,%-C%.%#或者: > :set efm=%A%f:%l:\ %m,%+Z%p^,%+C%.%#,%-G%.%#< *errorformat-ant*ant (http://jakarta.apache.org/) 输出的每个行首都为 [javac],这样我们可将上面的格式修改如下: > :set efm=%A\ %#[javac]\ %f:%l:\ %m,%-Z\ %#[javac]\ %p^,%-C%.%#'errorformat' 还可以处理 ant 和 javac 或是 jikes 的接合。如使用 jikes, 你需要告诉 ant 使用 jikes 的 +E 选项以使 jikes 产生单行错误信息。(一个 build.xml 文件的)第二行如下所示: <property name = "build.compiler" value = "jikes"/> <property name = "build.compiler.emacs" value = "true"/>'errorformat' 同时处理 ant 与 javac 和 jikes: > :set efm=\ %#[javac]\ %#%f:%l:%c:%*\\d:%*\\d:\ %t%[%^:]%#:%m, \%A\ %#[javac]\ %f:%l:\ %m,%-Z\ %#[javac]\ %p^,%-C%.%#< *errorformat-jade*解析 jade (see http://www.jclark.com/) 错误十分简单: > :set efm=jade:%f:%l:%c:%t:%m< *errorformat-LaTeX*下面是 'errorformat' 处理 (La)Tex 产生的多行错误输出的例子。":clist" 和 ":cc"等命令将多行错误信息显示在一行,开头的空格被删除。将 LaTeX 的错误格式运用于其它产生多行错误信息的编译器就很简单了。命令可被加到 |vimrc| 或是其它 Vim 脚本,比如一个在编辑 LaTeX 源文件时载入的含有 LaTeX 相关东西的脚本。确定将例子中的所有行都拷贝,然后可删除注释行。对一些行中开头的 '\',参考|line-continuation|. 首先设定 'makeprg' 使 LaTeX 可以报多行错;且在首个错误发生时 不停止: > :set makeprg=latex\ \\\\nonstopmode\ \\\\input\\{$*}< 多行错误信息开始: > :set efm=%E!\ LaTeX\ %trror:\ %m, \%E!\ %m,< 多行警告信息开始;开始的两个包含行号。一些正则表达式的意义: - "%.%#" (".*") 匹配一个可为空的字符串 - "%*\\d" ("\d\+") 匹配一个数字 > \%+WLaTeX\ %.%#Warning:\ %.%#line\ %l%.%#, \%+W%.%#\ at\ lines\ %l--%*\\d, \%WLaTeX\ %.%#Warning:\ %m,< 错误/警告信息继续;首个含有行号: > \%Cl.%l\ %m, \%+C\ \ %m., \%+C%.%#-%.%#, \%+C%.%#[]%.%#, \%+C[]%.%#, \%+C%.%#%[{}\\]%.%#, \%+C<%.%#>%.%#, \%C\ \ %m,< 匹配下面模式的行不含有任何重要的信息;将其忽略: > \%-GSee\ the\ LaTeX%m, \%-GType\ \ H\ <return>%m, \%-G\ ...%.%#, \%-G%.%#\ (C)\ %.%#, \%-G(see\ the\ transcript%.%#),< 删除所有空白行: > \%-G\\s%#,< LaTeX 输出并不在每一行中都指定出错的文件名;而只在括号中指定 一次。 下面的模式试图匹配这些文件名并将它们保存到内部栈中。这些模式 可能扫描相同行(一个接一个的),结尾的 "%r" 表示 行中 "余下" 的部分,以在下轮被解析,直到行尾。 再次读入 '('...')' 包含的文件名;这并不将其入栈,因为此文件 不含有任何错误: > \%+O(%f)%r,< 将 '(' 后的文件名入栈: > \%+P(%f%r, \%+P\ %\\=(%f%r, \%+P%*[^()](%f%r, \%+P[%\\d%[^()]%#(%f%r,< 当扫描到 ')', 将最后一个文件名出栈: > \%+Q)%r, \%+Q%*[^()])%r, \%+Q[%\\d%*[^()])%r注意某些情况下,LaTeX 输出中的文件名不能正确解析。解析会被不成对的括号打乱。上面的例子只试图捕获最普通的情况。你可以根据你的需要而修改有关设定,比如,所有烦人的 "Overfull ..." 警告可不被视为出错。除了过滤 LaTeX 的输出信息外你还可以直接读入 [La]TeX 编译器生成的 *.log 文件。这包括其它的一些由错误引起的有用信息。但要解析这么复杂的文件,你需要使用外部过滤器。参考上面关于 Vim 过滤器的描述。 *errorformat-Perl*在 $VIMRUNTIME/tools 中,你可以找到 efm_perl.pl 脚本。它将 Perl 出错信息过滤为 quickfix 模式的可懂格式。关于怎样使用它,查看该文件的开头部分。 vim:tw=78:ts=8:ft=help:norl:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -