📄 quickfix.cnx
字号:
*quickfix.txt* For Vim version 6.2. 最近更新:2004年6月 VIM REFERENCE MANUAL by Bram Moolenaar (本章译者: wandys http://vimcdoc.sf.net)本主题曾在用户手册的 |30.1| 节有所介绍。1. 使用 QuickFix 命令 |quickfix|2. 出错窗口 |quickfix-window|3. 使用多个错误列表 |quickfix-error-lists|4. 使用 :make |:make_makeprg|5. 使用 :grep |grep|6. 选择编译器 |compiler-select|7. 错误格式 |error-file-format|8. 目录栈 |quickfix-directory-stack|9. 特定错误格式 |errorformats|{Vi 没有这些命令}如编译时没有指定 |+quickfix| 则无法使用 quickfix 相关命令。=============================================================================1. 使用 QuickFix 命令 *quickfix* *Quickfix* *E42*Vim 有一个特殊的模式用来加快 编辑-编译-编辑 循环。这是受到 Amiga 系统上 Manx的 Aztec C 编译器的 quickfix 选项的启发。它会将编译器产生的出错信息保存到一个文件中并用 Vim 跳转到各个错误。无需记住所有的出错信息,你可以检查每一个错误并对其修正。如果你是在 Amiga 系统上使用 Manx 的 Aztec C 编译器,参考 |quickfix-manx| 以配合 Vim 使用。如果使用其它的编译器,你需要将出错信息保存到一个文件中然后用"Vim -q filename" 启动 Vim。一个简便的方法是使用 |:make| 命令(见下)。设定 'errorformat',使其和编译器产生的出错信息格式一致(见 |errorformat|)。以下 quickfix 命令可供使用: *:cc*:cc[!] [nr] 显示错误 [nr]。如果不指定 [nr],将再次显示相同的错误。 若 'hidden' 和 'autowrite' 选项没被设定并且当前缓冲只 有一个窗口且被修改,如果不指定 [!],则无法跳转到另一 个缓冲。指定 [!] 跳转到另一个缓冲时,当前缓冲的修改则 会丢失,除非指定 'hidden' 或该缓冲还有其它窗口。当跳转 到另一个缓冲时,会受到 'switchbuf' 有关设定的影响。 *:cn* *:cnext* *E553*:[count]cn[ext][!]d 显示含有文件名的列表中的下 [count] 个错误。如果没有文 件名,则跳转到下 [count] 个错误。有关 [!] 和 'switchbuf',参见 |:cc|。:[count]cN[ext][!] *:cp* *:cprevious* *:cN* *:cNext*:[count]cp[revious][!] 显示含有文件名的列表中的前 [count] 个错误。如果没有文 件名,则跳转到前 [count] 个错误。有关 [!] 和 'switchbuf',参见 |:cc|。 *:cnf* *:cnfile*:[count]cnf[ile][!] 显示含有文件名列表中下 [count] 个文件中的首个错误。如 果没有文件名或是列表中没有下一个文件,则跳转到下 [count] 个错误。有关 [!] 和 'switchbuf',参见 |:cc|。 *:crewind* *:cr*:cr[ewind][!] [nr] 显示错误 [nr]。如果没指定 [nr],则显示首个错误。参见 |:cc|。 *:cfirst* *:cfir*:cfir[st][!] [nr] 和 ":crewind" 相同。 *:clast* *:cla*:cla[st][!] [nr] 显示错误 [nr]。如果没指定[nr],则显示最后一个错误。参 见 |:cc|。 *:cq* *:cquit*:cq[uit] 以错误码退出 Vim。这样编译器就不会再次编译相同文件。 *:cf* *:cfile*:cf[ile][!] [errorfile] 读入错误文件并跳转到首个错误。以 -q 选项启动 Vim 时会 自动这样处理。你可以在编译的同时使用这个命令。如果你指 定错误文件名,那么 'errorfile' 选择将被设定为 [errorfile]。有关 [!],参见 |:cc|。 *:cg* *:cgetfile*:cg[etfile][!] [errorfile] 读入错误文件。和 ":cfile" 类似,只是不跳转到首个错误。 *:cl* *:clist*:cl[ist] [from] [, [to]] 显示所有有效的错误(参见 |quickfix-valid)。 如果 [from] 和/或 [to] 被指定,则显示指定范围内的错误。 负数从最后一个错误向前算起,-1 为最后一个错误。当跳转 到另一个缓冲时,会受到 'switchbuf' 有关设定的影响。:cl[ist]! [from] [, [to]] 显示所有的错误。如果你插入或删除行,大部分错误仍能被正确的找到,因为隐藏标记会被使用。有时,当标记由于某种原因被删除,"line changed" 信息会显示以警告你出错位置可能有误。如果你退出并重新运行 Vim,标记会丢失,而出错位置也可能不再正确。=============================================================================2. 出错窗口 *quickfix-window* *:cope* *:copen*:cope[n] [height] 打开一个窗口显示当前列表中的错误。如果指定 [height], 窗口则为指定高度,否则窗口为 10 行高。 该窗口还有一个特殊的缓冲,'buftype' 为 "quickfix",不 要修改此选项。 如果已有了一个 quickfix 窗口,它将成为 当前窗口。 不可能再打开第二个 quickfix 窗口。 *:ccl* *:cclose*:ccl[ose] 关闭 quickfix 窗口. *:cw* *:cwindow*:cw[indow] [height] 当有识别出的错误时,打开窗口。如果该窗口已经打开且没有 识别出的错误,则将此窗口关闭。quickfix 窗口一般会在屏幕的底端。如果有垂直分割, 它会在最右边窗口的底端。要使其获得最大宽度: > :botright cwindow你可以用 |windows-moving| 命令来移动窗口。比如,将它移动到顶端: CTRL-W K'winfixheight' 选项会被设定,也就是说窗口会尽可能的保持它原来的高度,而忽略'winheight' 和 'equalalways' 选项。你可以手动改变其高度(例如,用鼠标拖动其上的状态线)。在 quickfix 窗口中,每一行是一个错误。行号和错误号相等。你可以用 ":.cc" 跳转到当前光标处的错误,按 <CR> 键或是双击鼠标有同样的效果。在 quickfix 窗口上方会开一窗口显示含有错误的文件。如果已有窗口为该文件打开,则用此窗口。如果已打开窗口的缓冲已被修改,而错误出在另一个文件中,则不能完成向出错处的跳转。你需要首先确定窗口含有一个可被废除的缓冲.当 quickfix 窗口充满时,将会触发两个自动命令事件。首先,'filetype' 选项会被设为 "qf",这会触发 FileType 事件。然后 BufReadPost 事件会被触发。这可以用来完成在列出错误上的相同操作。比如: > au BufReadPost quickfix silent g/^/s//\=line(".")." "/这会在每行首添加行号。 注意 ":s" 命令中 "\=" 的使用,它是为了计算表达式。Note: 在 quickfix 窗口中作更改对出错列表不起作用。'modifiable' 选项关闭以免作出更改。如果你删除或是插入了行,文本和错误号的关系就会混乱。如果真的想这么做,你可以将 quickfix 窗口的内容保存到一个文件中然后用 ":cfile" 命令将其解析并指定其作为新的错误列表。=============================================================================3. 使用多个错误列表 *quickfix-error-lists*到目前为止,我们都假定只有一个错误列表。实际上最近使用的 10 个错误列表都会被记住。当开始一个新的列表,前面的列表会被自动保存。有两个命令可以用来访问旧的错误列表。它们会将已经使用的错误列表指定为当前列表。 *:colder* *:col* *E380*:col[der] [count] 到前一个旧的错误列表。如果指定 [count],则执行 [count] 次。如果已经到达最旧的列表,则报错。 *:cnewer* *:cnew* *E381*:cnew[er] [count] 到下一个新的错误列表。如果指定 [count],则执行 [count] 次。如果已经到达最新的列表,则报错。当增加一个错误列表,它会成为当前列表。如果使用 ":colder" 后又使用 ":make" 或 ":grep" 来增加一个错误列表,那么原来的一个较新列表会被覆盖。这在使用 ":grep" (见 |grep|)时相当有用。如果你想保留最近的错误列表,先要使用 ":cnewer 99" 命令。=============================================================================4. 使用 :make *:make_makeprg* *:mak* *:make*:mak[e][!] [arguments] 1. 如果设定 'autowrite',则写入所有修改过的缓冲。 2. 错误文件名为 'makeef' 设定的值。如果 'makeef' 值不 包含 "##" 且此文件已存在,则该文件会被先删除。 3. 'makeprg' 选项指定的程序 (省缺为 "make")被启动, [arguments] 为其参数。其输出被储存到错误文件名(如 是 Unix,也会在屏幕上显示)。 4. 错误文件以 'errorformat' 格式读入。 5. 如果没指定 [!],则跳转到首个错误。 6. 错误文件被删除。 7. 你现在可以用 |:cnext|,|:cprevious| 等命令在错误间 移动。 本命令不接受注释,所有的 " 将被视为参数的一部分。":make" 命令执行 'makeprg' 选项指定的程序。这会通过将命令传递给 'shell' 指定的shell 完成。就像输入下面的命令一样: ":!{makeprg} [arguments] {shellpipe} {errorfile}".{makeprg} 是 'makeprg' 选项指定的值。并非只是 "make",所有的命令都可被使用。'%' 和 '#' 会像在命令行中一样被展开。你可以用 "%<" 表示不含扩展名的当前文件名,用 "#<" 表示不含扩展名的备选文件名。例如: > :set makeprg=make\ #<.o[arguments] 为 ":make" 之后输入的所有字符。{shellpipe} 是 'shellpipe' 选项值。{errorfile} 是 'makeef' 选项值( ## 会被一个唯一字符串取代)。在设定 {makeprog} 时,"$*" 可用来指代 [arguments]。比如: > :set makeprg=latex\ \\\\nonstopmode\ \\\\input\\{$*}或更简单些: > :let &mp = 'latex \\nonstopmode \\input\{$*}'"$*" 可被使用多次: > :set makeprg=gcc\ -o\ $*\ $*'shellpipe' 在 Amiga, MS-DOS 以及 Win32 系统上省缺为 ">"。这就是说编译器的输出会保存在一个文件中而不在屏幕中直接显示。在 Unix 系统上, 会用到 "| tee" 。输出在被保存在文件中的同时也会显示在屏幕上。取决于所使用的 shell,"|& tee" 或是"2>&1| tee" 为省缺值,这样 stderr 输出也被包括。如果 'shellpipe' 为空,{errorfile} 将被忽略。这对那些自身将输出写入文件的编译器很有用(比如,Manx 的 Aztec C)。==============================================================================5. 使用 :grep *grep* *lid*Vim 可以和 "grep" 或类似 grep 的程序(比如 GNU id-utils)交互,其方式和与编译器交互方式类似。[Unix 小常识: Unix 上 "grep" 命令的名字来源与 ":g/re/p",其中 "re" 是正则表达式 (Regular Expression) 的意思。] *:gr* *:grep*:gr[ep][!] [arguments] 和 ":make" 类似,但以 'grepprg' 替代 'makeprg',以 'grepformat' 替代 'errorformat'。 *:grepa* *:grepadd*:grepa[dd][!] [arguments] 和 ":grep" 类似,但不另建一个新的错误列表,只是将匹配 附加到当前列表中。 比如: > :grep nothing % :bufdo grepadd! something %< 第一个命令新建一个空的错误列表。第二个命令对每个列出的 缓冲执行 "grepadd"。注意 ! 的使用是避免 ":grepadd" 跳 转到首个错误。5.1 设定 grep如果你已安装了一个标准的 "grep" 程序,:grep 命令会以省缺方式运行。格式和标准命令很类似: > :grep foo *.c会对每个 .c 文件搜索字符串 "foo"。:grep 的参数直接传递给 "grep" 程序,这样你就可以使用 "grep" 支持的任何选项。省缺状态下,:grep 会以 -n 参数启动 grep (显示文件和行号)。你可以通过设定'grepprg' 对此改变。你需要设定 'grepprg',如果:a) 你在使用一个不叫 "grep" 的程序。b) 你需要以绝对路径启动 grep。c) 你想自动传递某些参数(比如,忽略大小写)。 "grep" 执行后,Vim 会用 'grepformat' 选项解析其结果。该选项和 'errorformat' 的工作方式相同。如果你的 grep 输出不是标准格式或是你使用具有特定格式的程序,你可以通过设定 'errorformat' 来改变省缺值。解析完结果,Vim 会载入第一个含有匹配的文件并跳转到相应行,与在 |quickfix| 模式中跳转到一个编译错误的方式相同。你可以使用 |:cnext|,|:clist| 等命令来查看其它的匹配。5.2 配合 id-utils 使用 :grep你可以设定 :grep 来使用 GNU id-utils: > :set grepprg=lid\ -Rgrep\ -s :set grepformat=%f:%l:%m然后: > :grep (regexp)就像你所期望的那样。(只要你记得首先 mkid :)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -