LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1362|回复: 4

请教用Linux gcc,vi编程时的一些小问题

[复制链接]
发表于 2004-9-17 21:46:38 | 显示全部楼层 |阅读模式
1.有时候程序错误比较多的时候用gcc编译后错误很多,但只能看到后面的一些,有没有类似 | more这样可以滚动屏幕慢慢看的办法呀?

2.使用vi编辑器编程的时候有没有办法让它在每行前面叫上行号呀?

3.在控制台下,程序运行时,有时候是多进程的,其中一个进程是通过while(0)一直循环等待其他进程的一些操作.那么在我运行了进程1进入循环等待的时候,我需要启动另外的进程该怎么办呢?

非常感谢!
发表于 2004-9-18 11:08:40 | 显示全部楼层
1.可以重定向到一个文件中慢慢看。
2.不要偷懒,google一下就出来了。http://www.linuxaid.com.cn/tips/1/0/1052402172.shtml
3.能说具体点吗?
发表于 2004-9-18 19:16:49 | 显示全部楼层
如果1的功能都没有,vi还怎么会有人用!
如果程序有makefile,请直接在vi中输入(ESC):make 回车,会出现编译错误信息,再输入:cprev或:cnext即可以依次查看错误信息。:cfirst  :clast分别是第一个错误和最后一个错误。
如果没有makefile,自己写一个就行了。
发表于 2004-9-23 16:35:15 | 显示全部楼层
第一个问题我刚才就遇到了,我是这样解决的,使用>重定向,加上参数2,表示把程序错误输出到指定的文件,sample,g++ -o sample /root/sample.cxx 2>/root/1.txt,运行后,用gedit打开/root/1.txt即可看见所有错误输出。
发表于 2004-9-23 19:03:27 | 显示全部楼层
:help quickfix

  1. QUICKFIX

  2. *quickfix.txt*  For Vim version 6.2.  最近更新:2004年6月


  3.                   VIM REFERENCE MANUAL    by Bram Moolenaar

  4.                   (本章译者: wandys [url]http://vimcdoc.sf.net[/url])


  5. 本主题曾在用户手册的 |30.1| 节有所介绍。

  6. 1. 使用 QuickFix 命令                       |quickfix|
  7. 2. 出错窗口                         |quickfix-window|
  8. 3. 使用多个错误列表                     |quickfix-error-lists|
  9. 4. 使用 :make                         |:make_makeprg|
  10. 5. 使用 :grep                         |grep|
  11. 6. 选择编译器                              |compiler-select|
  12. 7. 错误格式                         |error-file-format|
  13. 8. 目录栈                            |quickfix-directory-stack|
  14. 9. 特定错误格式                           |errorformats|

  15. {Vi 没有这些命令}

  16. 如编译时没有指定 |+quickfix| 则无法使用 quickfix 相关命令。


  17. 1. 使用 QuickFix 命令                       *quickfix* *Quickfix* *E42*

  18. Vim 有一个特殊的模式用来加快 编辑-编译-编辑 循环。这是受到 Amiga 系统上 Manx
  19. 的 Aztec C 编译器的 quickfix 选项的启发。它会将编译器产生的出错信息保存到一个
  20. 文件中并用 Vim 跳转到各个错误。无需记住所有的出错信息,你可以检查每一个错误并
  21. 对其修正。

  22. 如果你是在 Amiga 系统上使用 Manx 的 Aztec C 编译器,参考 |quickfix-manx| 以配
  23. 合 Vim 使用。如果使用其它的编译器,你需要将出错信息保存到一个文件中然后用
  24. "Vim -q filename" 启动 Vim。一个简便的方法是使用 |:make| 命令(见下)。
  25. 设定 'errorformat',使其和编译器产生的出错信息格式一致(见 |errorformat|)。

  26. 以下 quickfix 命令可供使用:

  27.                                                         *:cc*
  28. :cc[!] [nr]             显示错误 [nr]。如果不指定 [nr],将再次显示相同的错误。
  29.                         若 'hidden' 和 'autowrite' 选项没被设定并且当前缓冲只
  30.                         有一个窗口且被修改,如果不指定 [!],则无法跳转到另一
  31.                         个缓冲。指定 [!] 跳转到另一个缓冲时,当前缓冲的修改则
  32.                         会丢失,除非指定 'hidden' 或该缓冲还有其它窗口。当跳转
  33.                         到另一个缓冲时,会受到 'switchbuf' 有关设定的影响。

  34.                                                         *:cn* *:cnext* *E553*
  35. :[count]cn[ext][!]d     显示含有文件名的列表中的下 [count] 个错误。如果没有文
  36.                         件名,则跳转到下 [count] 个错误。有关 [!] 和
  37.                         'switchbuf',参见 |:cc|。

  38. :[count]cN[ext][!]                      *:cp* *:cprevious* *:cN* *:cNext*
  39. :[count]cp[revious][!]  显示含有文件名的列表中的前 [count] 个错误。如果没有文
  40.                         件名,则跳转到前 [count] 个错误。有关 [!] 和
  41.                         'switchbuf',参见 |:cc|。

  42.                                                         *:cnf* *:cnfile*
  43. :[count]cnf[ile][!]     显示含有文件名列表中下 [count] 个文件中的首个错误。如
  44.                         果没有文件名或是列表中没有下一个文件,则跳转到下
  45.                         [count] 个错误。有关 [!] 和 'switchbuf',参见 |:cc|。

  46.                                                         *:crewind* *:cr*
  47. :cr[ewind][!] [nr]      显示错误 [nr]。如果没指定 [nr],则显示首个错误。参见
  48.                         |:cc|。

  49.                                                         *:cfirst* *:cfir*
  50. :cfir[st][!] [nr]       和 ":crewind" 相同。

  51.                                                         *:clast* *:cla*
  52. :cla[st][!] [nr]        显示错误 [nr]。如果没指定[nr],则显示最后一个错误。参
  53.                         见 |:cc|。

  54.                                                         *:cq* *:cquit*
  55. :cq[uit]                以错误码退出 Vim。这样编译器就不会再次编译相同文件。

  56.                                                         *:cf* *:cfile*
  57. :cf[ile][!] [errorfile] 读入错误文件并跳转到首个错误。以 -q 选项启动 Vim 时会
  58.                         自动这样处理。你可以在编译的同时使用这个命令。如果你指
  59.                         定错误文件名,那么 'errorfile' 选择将被设定为
  60.                         [errorfile]。有关 [!],参见 |:cc|。

  61.                                                         *:cg* *:cgetfile*
  62. :cg[etfile][!] [errorfile]
  63.                         读入错误文件。和 ":cfile" 类似,只是不跳转到首个错误。

  64.                                                         *:cl* *:clist*
  65. :cl[ist] [from] [, [to]]
  66.                         显示所有有效的错误(参见 |quickfix-valid)。
  67.                         如果 [from] 和/或 [to] 被指定,则显示指定范围内的错误。
  68.                         负数从最后一个错误向前算起,-1 为最后一个错误。当跳转
  69.                         到另一个缓冲时,会受到 'switchbuf' 有关设定的影响。

  70. :cl[ist]! [from] [, [to]]
  71.                         显示所有的错误。

  72. 如果你插入或删除行,大部分错误仍能被正确的找到,因为隐藏标记会被使用。有时,
  73. 当标记由于某种原因被删除,"line changed" 信息会显示以警告你出错位置可能有误。
  74. 如果你退出并重新运行 Vim,标记会丢失,而出错位置也可能不再正确。


  75. 2. 出错窗口                                 *quickfix-window*

  76.                                                         *:cope* *:copen*
  77. :cope[n] [height]       打开一个窗口显示当前列表中的错误。如果指定 [height],
  78.                         窗口则为指定高度,否则窗口为 10 行高。
  79.                         该窗口还有一个特殊的缓冲,'buftype' 为 "quickfix",不
  80.                         要修改此选项。 如果已有了一个 quickfix 窗口,它将成为
  81.                         当前窗口。 不可能再打开第二个 quickfix 窗口。

  82.                                                         *:ccl* *:cclose*
  83. :ccl[ose]               关闭 quickfix 窗口.

  84.                                                         *:cw* *:cwindow*
  85. :cw[indow] [height]     当有识别出的错误时,打开窗口。如果该窗口已经打开且没有
  86.                         识别出的错误,则将此窗口关闭。


  87. quickfix 窗口一般会在屏幕的底端。如果有垂直分割, 它会在最右边窗口的底端。
  88. 要使其获得最大宽度:
  89.         :botright cwindow
  90. 你可以用 |windows-moving| 命令来移动窗口。
  91. 比如,将它移动到顶端: CTRL-W K
  92. 'winfixheight' 选项会被设定,也就是说窗口会尽可能的保持它原来的高度,而忽略
  93. 'winheight' 和 'equalalways' 选项。你可以手动改变其高度(例如,用鼠标拖动其上
  94. 的状态线)。

  95. 在 quickfix 窗口中,每一行是一个错误。行号和错误号相等。你可以用 ":.cc" 跳转到
  96. 当前光标处的错误,按 <CR> 键或是双击鼠标有同样的效果。在 quickfix 窗口上方会开
  97. 一窗口显示含有错误的文件。如果已有窗口为该文件打开,则用此窗口。如果已打开窗口
  98. 的缓冲已被修改,而错误出在另一个文件中,则不能完成向出错处的跳转。你需要首先确
  99. 定窗口含有一个可被废除的缓冲.

  100. 当 quickfix 窗口充满时,将会触发两个自动命令事件。首先,'filetype' 选项会被设
  101. 为 "qf",这会触发 FileType 事件。然后 BufReadPost 事件会被触发。这可以用来完成
  102. 在列出错误上的相同操作。比如:
  103.         au BufReadPost quickfix  silent g/^/s//\=line(".")." "/
  104. 这会在每行首添加行号。 注意 ":s" 命令中 "\=" 的使用,它是为了计算表达式。

  105. Note: 在 quickfix 窗口中作更改对出错列表不起作用。'modifiable' 选项关闭以免作
  106. 出更改。如果你删除或是插入了行,文本和错误号的关系就会混乱。如果真的想这么做,
  107. 你可以将 quickfix 窗口的内容保存到一个文件中然后用 ":cfile" 命令将其解析并指定
  108. 其作为新的错误列表。


  109. 3. 使用多个错误列表                             *quickfix-error-lists*

  110. 到目前为止,我们都假定只有一个错误列表。实际上最近使用的 10 个错误列表都会被
  111. 记住。当开始一个新的列表,前面的列表会被自动保存。有两个命令可以用来访问旧的
  112. 错误列表。它们会将已经使用的错误列表指定为当前列表。

  113.                                                 *:colder* *:col* *E380*
  114. :col[der] [count]       到前一个旧的错误列表。如果指定 [count],则执行 [count]
  115.                         次。如果已经到达最旧的列表,则报错。

  116.                                                 *:cnewer* *:cnew* *E381*
  117. :cnew[er] [count]       到下一个新的错误列表。如果指定 [count],则执行 [count]
  118.                         次。如果已经到达最新的列表,则报错。

  119. 当增加一个错误列表,它会成为当前列表。

  120. 如果使用 ":colder" 后又使用 ":make" 或 ":grep" 来增加一个错误列表,那么原来的
  121. 一个较新列表会被覆盖。这在使用 ":grep" (见 |grep|)时相当有用。如果你想保留最
  122. 近的错误列表,先要使用 ":cnewer 99" 命令。


  123. 4. 使用 :make                                         *:make_makeprg*

  124.                                                         *:mak* *:make*
  125. :mak[e][!] [arguments]  1. 如果设定 'autowrite',则写入所有修改过的缓冲。
  126.                         2. 错误文件名为 'makeef' 设定的值。如果 'makeef' 值不
  127.                            包含 "##" 且此文件已存在,则该文件会被先删除。
  128.                         3. 'makeprg' 选项指定的程序 (省缺为 "make")被启动,
  129.                            [arguments] 为其参数。其输出被储存到错误文件名(如
  130.                            是 Unix,也会在屏幕上显示)。
  131.                         4. 错误文件以 'errorformat' 格式读入。
  132.                         5. 如果没指定 [!],则跳转到首个错误。
  133.                         6. 错误文件被删除。
  134.                         7. 你现在可以用 |:cnext|,|:cprevious| 等命令在错误间
  135.                            移动。
  136.                         本命令不接受注释,所有的 " 将被视为参数的一部分。

  137. ":make" 命令执行 'makeprg' 选项指定的程序。这会通过将命令传递给 'shell' 指定的
  138. shell 完成。就像输入下面的命令一样:

  139.         ":!{makeprg} [arguments] {shellpipe} {errorfile}".

  140. {makeprg} 是 'makeprg' 选项指定的值。并非只是 "make",所有的命令都可被使用。
  141. '%' 和 '#' 会像在命令行中一样被展开。你可以用 "%<" 表示不含扩展名的当前文件
  142. 名,用 "#<" 表示不含扩展名的备选文件名。例如:
  143.    :set makeprg=make\ #<.o

  144. [arguments] 为 ":make" 之后输入的所有字符。
  145. {shellpipe} 是 'shellpipe' 选项值。
  146. {errorfile} 是 'makeef' 选项值( ## 会被一个唯一字符串取代)。

  147. 在设定 {makeprog} 时,"$*" 可用来指代 [arguments]。比如:
  148.    :set makeprg=latex\ \\\\nonstopmode\ \\\\input\\{$*}
  149. 或更简单些:
  150.    :let &mp = 'latex \\nonstopmode \\input\{$*}'
  151. "$*" 可被使用多次:
  152.    :set makeprg=gcc\ -o\ $*\ $*

  153. 'shellpipe' 在 Amiga, MS-DOS 以及 Win32 系统上省缺为 ">"。这就是说编译器的输出
  154. 会保存在一个文件中而不在屏幕中直接显示。在 Unix 系统上, 会用到 "| tee" 。输出
  155. 在被保存在文件中的同时也会显示在屏幕上。取决于所使用的 shell,"|& tee" 或是
  156. "2>&1| tee" 为省缺值,这样 stderr 输出也被包括。

  157. 如果 'shellpipe' 为空,{errorfile} 将被忽略。这对那些自身将输出写入文件的编译
  158. 器很有用(比如,Manx 的 Aztec C)。


  159. 5. 使用 :grep                                         *grep* *lid*

  160. Vim 可以和 "grep" 或类似 grep 的程序(比如 GNU id-utils)交互,其方式和与编译器
  161. 交互方式类似。

  162. [Unix 小常识: Unix 上 "grep" 命令的名字来源与 ":g/re/p",其中 "re" 是正则表达
  163. 式 (Regular Expression) 的意思。]

  164.                                                             *:gr* *:grep*
  165. :gr[ep][!] [arguments]  和 ":make" 类似,但以 'grepprg' 替代 'makeprg',以
  166.                         'grepformat' 替代 'errorformat'。
  167.                                                         *:grepa* *:grepadd*
  168. :grepa[dd][!] [arguments]
  169.                         和 ":grep" 类似,但不另建一个新的错误列表,只是将匹配
  170.                         附加到当前列表中。
  171.                         比如:
  172.                                 :grep nothing %
  173.                                 :bufdo grepadd! something %
  174.                        第一个命令新建一个空的错误列表。第二个命令对每个列出的
  175.                         缓冲执行 "grepadd"。注意 ! 的使用是避免 ":grepadd" 跳
  176.                         转到首个错误。

  177. 5.1 设定 grep

  178. 如果你已安装了一个标准的 "grep" 程序,:grep 命令会以省缺方式运行。格式和标准命
  179. 令很类似:

  180.         :grep foo *.c

  181. 会对每个 .c 文件搜索字符串 "foo"。:grep 的参数直接传递给 "grep" 程序,这样你就
  182. 可以使用 "grep" 支持的任何选项。

  183. 省缺状态下,:grep 会以 -n 参数启动 grep (显示文件和行号)。你可以通过设定
  184. 'grepprg' 对此改变。你需要设定 'grepprg',如果:

  185. a)      你在使用一个不叫 "grep" 的程序。
  186. b)      你需要以绝对路径启动 grep。
  187. c)      你想自动传递某些参数(比如,忽略大小写)。

  188. "grep" 执行后,Vim 会用 'grepformat' 选项解析其结果。该选项和 'errorformat' 的
  189. 工作方式相同。如果你的 grep 输出不是标准格式或是你使用具有特定格式的程序,你可
  190. 以通过设定 'errorformat' 来改变省缺值。

  191. 解析完结果,Vim 会载入第一个含有匹配的文件并跳转到相应行,与在 |quickfix| 模式
  192. 中跳转到一个编译错误的方式相同。你可以使用 |:cnext|,|:clist| 等命令来查看其
  193. 它的匹配。


  194. 5.2 配合 id-utils 使用 :grep

  195. 你可以设定 :grep 来使用 GNU id-utils:

  196.         :set grepprg=lid\ -Rgrep\ -s
  197.         :set grepformat=%f:%l:%m

  198. 然后:
  199.         :grep (regexp)

  200. 就像你所期望的那样。
  201. (只要你记得首先 mkid :)


  202. 5.3 用 :grep 浏览源代码

  203. 使用 Vim 保存的错误列表,你可以查找某些函数或是其调用的其它函数。举个例子,如
  204. 果你要对read_file 函数添加一个参数,可以输入下面的命令:

  205.         :grep read_file *.c

  206. 你可以用 ":cn" 在一系列匹配中跳转,然后加上所需要的参数。在某个地方,你需要从
  207. 上层函数 msg() 得到这个新的参数,并要对它做出修改:
  208.         :grep msg *.c

  209. 在修改 msg() 函数的同时,你又找到另一个需要从上层函数中获得该参数的函数。你可
  210. 以用 ":grep" 命令找到这些函数。当完成一个函数后,你可以用:

  211.         :colder

  212. 来跳转到上一个函数。

  213. 这就像浏览一个树一样,":grep" 每深入一层,就创建新的分支。":colder" 跳转到上
  214. 一层。你可以混和使用 ":grep" 和 ":colder" ,以树型方式来浏览所有的位置。如果
  215. 经常这么做,你不需写一个 "todo" 列表就能找到所有的位置。


  216. 6. 选择编译器                                              *compiler-select*

  217.                                                         *:comp* *:compiler*
  218. :comp[iler] {name}              为 {name} 编译器设定相关选项。
  219.                                 {如编译时没指定 |+eval|,则此命令不可用}


  220. 这个命令实际上做的是:
  221. - 删除 "current_compiler" 变量                              *current_compiler*
  222. - 执行 ":runtime! compiler/{name}.vim"

  223. 如要编写编译器插件,请参考 |write-compiler-plugin|。


  224. MANX AZTEC C                            *quickfix-manx* *compiler-manx*

  225. 要使 Vim 和 Amiga 上的 Manx Aztec C 编译器工作,需要以下步骤:
  226. - 设定 CCEDIT 环境变量:
  227.         mset "CCEDIT=vim -q"
  228. - 用 -qf 选项编译。如果编译器发现任何错误,Vim 被启动,光标定位在首个错误处。
  229.   错误信息会在最后一行显示。你可以用上面提到的命令跳转到其它的错误,对其修定并
  230.   存盘。
  231. - 如果正常退出 Vim,编译器会再次编译相同文件。如果用 :cq 命令退出,编译器就会
  232.   终止。如果不能修定错误或是需要先编译其它的文件,你可以这样做。

  233. 在 Amiga 系统上,QuickFix 模式会有某些限止。编译器只能在错误文件中写入前 25 个
  234. 错误(Manx 的文档没有说明怎样才能写入更多)。如果想查找其它的错误,你需要首先
  235. 修定一些错误并退出编译器。重新编译后,剩下的错误 (最多 25 个)就会找到。

  236. 如果 Vim 是在编译器中启动的,:sh 和 一些 :! 命令不能工作,因为 Vim 是和编译器
  237. 在同一个进程中运行而 stdin (标准输入 )也不在交互状态。


  238. PYUNIT 编 译 器                                              *compiler-pyunit*

  239. 这其实不是一个编译器,而是一个为 Python 语言而设的单元测试工具。
  240. 从版本 2.0 起,它就在标准的 Python 发布中。对老版本,你可以在这里获得:
  241. [url]http://pyunit.sourceforge.net[/url] 。

  242. 当你运行测试时,Vim 会解析错误并进入到 quick-fix 模式。

  243. 不幸的是,没有一个运行测试的标准方法。
  244. 一般都会用使用 alltest.py。
  245. 有关 'makeprg' 选项就可以这样设定:
  246. setlocal makeprg=./alltests.py " Run a testsuite
  247. setlocal makeprg=python %      " Run a single testcase

  248. 另外,参考 [url]http://vim.sourceforge.net/tip_view.php?tip_id=280.[/url]


  249. TEX 编 译 器                                         *compiler-tex*

  250. Vim 发布版本中的 Tex 编译器 ($VIMRUNTIME/compiler/tex.vim) 可以处理各种风格的
  251. TeX 格式。如果变量 b:tex_flavor 或 g:tex_flavor 存在,它将为 :make (即为所要
  252. 运行的命令)定义 TeX 风格;如果这两个变量都不存在,将会使用省缺的 "latex"。
  253. 比如,要编辑从 AMS-TeX 上 mypaper.tex \input-ed 而来的 chapter2.tex:

  254.         :let b:tex_flavor = 'amstex'
  255.         :compiler tex
  256. <       [editing...]
  257.         :make mypaper

  258. 注意,你须要将所处理文件的文件名作为参数(以在编辑 \input-ed 或 \include-ed
  259. 文件时能处理正确的文件)。这不是 make 的语义,但你可以指定不含扩展名 ".tex" 的
  260. 文件名。

  261. 使用到的变量:
  262. b:tex_ignore_makefile 或 g:tex_ignore_makefile
  263.   通常,如果当前目录存在 'Makefile' 或 'makefile' ,这将被视作用户想要用 make
  264.   处理 *TeX 文件的信号。如果你不想这样,可以在运行 :compiler tex 前设定上面的
  265.   两个变量之一。
  266. b:tex_flavor 或 g:tex_flavor
  267.   省缺的,编译器会认为你使用 LaTeX 并用 "latex" 运行它。如果你的情况不是这样,
  268.   可以将 b:tex_flavor 或 g:tex_flavor 设定为你所要运行的命令名。

  269. Note: latex 命令行格式对 MikTeX 和 teTeX 都适用。要使 :help errorformat-LaTeX
  270. 上的建议对不同 shell 不同 OS 都适用太过复杂,因此不允许使用其它的 TeX 的选项。
  271. 如果你的 TeX 不支持 "-interaction=nonstopmode",请在命令行中用其它的方式表示
  272. \nonstopmode。


  273. 7. 错误格式                                         *error-file-format*

  274.                                         *errorformat* *E372* *E373* *E374*
  275.                                                 *E375* *E376* *E377* *E378*
  276. 'errorformat' 选项指定可识别出的一系列格式。首个匹配的格式会被使用。你可以为编
  277. 译器产生的不同信息添加不同格式,或是为多个编译器添加项目。参见 |efm-entries|。

  278. 'errorformat' 里的每一项类似 scanf 的格式字符串。首先,你需要了解 scanf 是如何
  279. 工作的。请查看你的 C 编译器文档。下面你可以看到,Vim 理解 % 条目。其它的则无效。

  280. 'errorformat' 中的特殊字符是逗号和反斜杠,参见 |efm-entries|。注意实际字符 '%'
  281. 用 "%%" 来匹配,而不用反斜杠来转义。

  282. Note: 省缺忽略大小写差别。如果要匹配大小写,在模式中加入 "\C",参见 |/\C|。


  283. 基 本 条 目

  284.         %f              文件名 (字符串)
  285.         %l              行号 (数字)
  286.         %c              列号 (代表错误中字符列的数字,(一个 <tab> 等于一个
  287.                         字符列))
  288.         %v              实际列号 (代表错误中屏幕列的数字,(一个 <tab> 等于
  289.                         8 个屏幕列))
  290.         %t              错误类型 (单个字符)
  291.         %n              错误号 (数字)
  292.         %m              错误信息 (字符串)
  293.         %r              匹配"余下的"的单行文件信息 %O/P/Q
  294.         %p              指针行 ('-', '.' 或是 ' ' 的序列,用长度作为列号)
  295.         %*{conv}        任何 scanf 非指定转换
  296.         %%              单个 '%' 字符

  297. "%f" 转换倚赖于当前 'isfname' 的设定。

  298. "%f" 和 "%m" 转换需要识别字符串结尾。它们后面可跟一个不能在字符串中出现的字
  299. 符,在此之前的所有字符都包括在字符串中。但当下一个字符是 '%' 或是反斜杠,"%f"
  300. 会查找任何 'isfname' 字符,而 "%m" 则查找任意。如果 "%f" 或 "%m" 在结尾,则行
  301. 中此前的所有字符都被包括。

  302. 在 MS-DOS, MS-Windows 和 OS/2 系统上,"C:" 会加到 "%f" 开头中,即使使用
  303. "%f:"。这就是说单字符(字母表中)文件名别将不被识别。

  304. "%p" 转换一般后跟 "^"。这是为了编译器产生的这种输出:
  305.             ^
  306. or
  307.    ---------^
  308. 以指定错误所在列。这被用在一个多行错误信息中。一个有用的列子,参见
  309. |errorformat-javac|。


  310. 改 变 目 录

  311. 下面的大写转换指定特殊格式化字符串的类型。它们大多作为以逗号分隔的单个格式的
  312. 前缀。
  313. 一些编译器产生含有目录名的信息,这些目录名需要加在 %f 读入文件名的前面 (比如
  314. GNU make)。下面的的代码可用于扫描这些目录名;它们将被保存在内部的目录栈中。
  315.                                                                 *E379*
  316.         %D              "进入目录" 格式字符串;期待后跟 %f 以找到目录名
  317.         %X              "离开目录" 格式字符串;期待后跟 %f

  318. 当定义 "进入目录" 或是 "离开目录" 格式时,"%D" 或是 "%X" 需要在字符串的开头。
  319. Vim 跟踪记录变化并把当前目录加在错误文件的相对目录中。有关细节,参见
  320. |quickfix-directory-stack|。


  321. 多 行 信 息                                 *errorformat-multi-line*

  322. 可以读入程序输出的多行信息,比如,错误字符超过一行。有关前缀有:
  323.         %E              错误信息开始
  324.         %W              警告信息开始
  325.         %I              一般信息开始
  326.         %A              多行信息开始 (未指定类型)
  327.         %C              多行信息继续
  328.         %Z              多行信息结束
  329. 这些可同 '+' 和 '-' 一起使用,参见下面的 |efm-ignore|。

  330. 例子: 你的编译器以下面格式输出 (开头的行号并不是实际输出):

  331.      1  Error 275
  332.      2  line 42
  333.      3  column 3
  334.      4  ' ' expected after '--'

  335. 正确的错误格式串应如下:
  336.    :set efm=%EError\ %n,%Cline\ %l,%Ccolumn\ %c,%Z%m

  337. 这样, |:clist| 产生的出错信息为:

  338. 1:42 col 3 error 275:  ' ' expected after '--'

  339. 另一个例子: Python 解释器产生下面的错误信息 (行号不是实际输出):

  340.      1  ==============================================================
  341.      2  FAIL: testGetTypeIdCachesResult (dbfacadeTest.DjsDBFacadeTest)
  342.      3  --------------------------------------------------------------
  343.      4  Traceback (most recent call last):
  344.      5    File "unittests/dbfacadeTest.py", line 89, in testFoo
  345.      6      self.assertEquals(34, dtid)
  346.      7    File "/usr/lib/python2.2/unittest.py", line 286, in
  347.      8   failUnlessEqual
  348.      9      raise self.failureException, \
  349.     10  AssertionError: 34 != 33
  350.     11
  351.     12  --------------------------------------------------------------
  352.     13  Ran 27 tests in 0.063s

  353. 假使你想让 |:clist| 输出这样的相关信息:
  354. 5 unittests/dbfacadeTest.py:89:  AssertionError: 34 != 33

  355. 错误格式字符串可这样定义:
  356.   :set efm=%C\ %.%#,%A\ \ File\ "%f"\\,\ line\ %l%.%#,%Z%[%^\ ]%\\@=%m

  357. 注意 %C 字符串在 %A 前指定: 因为 ' %.%#' 表达式(表示正则表达式 ' .*')匹配每
  358. 一个以空格开头后接任何字符的行,这样就包括可以单独产生错误信息的第 7 行。错误
  359. 格式字符串总是一个模式接一个模式的分析,直到找到首个匹配。


  360. 单 独 文 件 名                             *errorformat-separate-filename*

  361. 如果编译器输出只给定一次文件名而有多个信息指向这个文件,下面的前缀就很有用:
  362.         %O              单行文件信息: 再次读入匹配部分。
  363.         %P              单行文件信息: 将 %f 入栈
  364.         %Q              单行文件信息: 将最后一个文件名出栈

  365. 例子: 编译器产生以下出错日志 (不含开头的行号):

  366.      1  [a1.tt]
  367.      2  (1,17)  error: ';' missing
  368.      3  (21,2)  warning: variable 'z' not defined
  369.      4  (67,3)  error: end of file found before string ended
  370.      5
  371.      6  [a2.tt]
  372.      7
  373.      8  [a3.tt]
  374.      9  NEW compiler v1.1
  375.     10  (2,2)   warning: variable 'x' not defined
  376.     11  (67,3)  warning: 's' already defined

  377. 这个文件对每个在 [...] 中包括的文件列出了多个信息。我们可以这样设定格式:
  378.   :set efm=%+P[%f],(%l\\,%c)%*[\ ]%t%*[^:]:\ %m,%-Q

  379. |:clist| 会正确的显示它们的文件名:

  380.   2 a1.tt:1 col 17 error: ';' missing
  381.   3 a1.tt:21 col 2 warning: variable 'z' not defined
  382.   4 a1.tt:67 col 3 error: end of file found before string ended
  383.   8 a3.tt:2 col 2 warning: variable 'x' not defined
  384.   9 a3.tt:67 col 3 warning: 's' already defined

  385. 和其它匹配整行的前缀不同,%P, %Q 和 %O 可以匹配同一行中的多个模式。这样就可以
  386. 对像下面这样套嵌的文件解析:
  387.   {"file1" {"file2" error1} error2 {"file3" error3 {"file4" error4 error5}}}
  388. %O 解析不含 入栈/出栈 信息的字符串。更深入的例子,参见 |errorformat-LaTeX|。


  389. 忽 略 和 使 用 整 个 信 息                             *efm-ignore*

  390. '+' 和 '-' 可与上面的大写代码接合;这种情况下,它们要在字母的前面,比如 '%+A'
  391. 或 '%-G'。
  392.         %-              不在任何输出中包含相匹配的多行
  393.         %+              在 %m 错误串中包含真个匹配行

  394. %G 只在和 '+' 和 '-' 接合使用时才有用。它会解析编译器版本等可被忽略的字符串。
  395.         %-G             忽略此信息
  396.         %+G             通用信息


  397. 模 式 匹 配

  398. scanf() 类 "%*[]" 记法仍被支持,以和老版本兼容。但你可以在格式化字符串中指定
  399. Vim 支持的(几乎)任何正则表达式。元字符本身可能为匹配字符串或文件名的一部分
  400. (因此需要被转义),它们开头都加上一个 '%':
  401.         %\              单个 '\' 字符。注意在 ":set errorformat=" 定义中需要
  402.                         用 "%\" 来转义。
  403.         %.              单个 '.' 字符。
  404.         %#              单个 '*'(!) 字符。
  405.         %^              单个 '^' 字符。
  406.         %$              单个 '$' 字符。
  407.         %[              单个 '[' 字符 (指定一个 [] 字符范围)。
  408.         %~              单个 '~' 字符。
  409. 当在表达式中使用字符类(参见 |/\i|)时,含有 "\+" 数量符的串可以使用 scanf()
  410. 的 "%*" 形式。比如: "%\\d%\\+" ("\d\+", "任意数字") 和 "%*\\d" 相同。
  411. Note: 子匹配 \(...\) 不能用于格式指定中,因为它被留作内部变换使用。


  412. 'errorformat' 中 的 多 个 选 项                   *efm-entries*

  413. 为能识别从不同编译器产生的输出,可在 'errorformat' 中指定多个格式模式,用逗号
  414. 将它们分隔 (note: 逗号后的空格被忽略)。第一个完全匹配的模式被使用。如果没有匹
  415. 配,则使用最后一个模式中匹配的部分,虽然文件名被删除并且错误信息被设定为整个信
  416. 息。如果有模式可以匹配多个编译器产生的输出(但不是正确的方式),将它放到一个更
  417. 严格的模式的后面。

  418. 要在模式中包括逗号,在它前面加一个反斜杠(如果是在 ":set" 命令中,要加两个)。
  419. 要包括反斜杠本身,则使用两个反斜杠(在 ":set" 命令中使用四个)。":set" 命令中,
  420. 在空格前也要加一个反斜杠。


  421. 有 效 匹 配                                         *quickfix-valid*

  422. 如果某行不能完全匹配 'errorformat' 中的项目,则此行被放入到错误信息中并标记为
  423. "无效"。这些行会被 ":cn" 和 ":cp" 命令忽略(除非没有任何有效行存在)。你可以
  424. 用 ":cl!" 来显示所有的出错信息。

  425. 如果出错格式不含文件名,Vim 不能跳转到正确的文件。你需要手动跳转。


  426. 例子

  427. Aimga 上的 Aztec 编译器产生的错误文件格式是:

  428.         filename>linenumber:columnnumber:errortype:errornumber:errormessage

  429.         filename        错误所在文件的文件名
  430.         linenumber      错误所在行号
  431.         columnnumber    错误所在列号
  432.         errortype       错误类型,一般为 'E' 或 'W'
  433.         errornumber     错误号
  434.         errormessage    错误描述

  435. 可以用这个 'errorformat' 项目来匹配:
  436.         %f>%l:%c:%t:%n:%m"

  437. 一些对产生单行错误输出的编译器的例子:
  438. %f:%l:\ %t%*[^0123456789]%n:\ %m        Manx/Aztec C 出错信息
  439.                                         (scanf() 不能理解 [0-9])
  440. %f\ %l\ %t%*[^0-9]%n:\ %m               SAS C
  441. "%f"\\,%*[^0-9]%l:\ %m                一般 C 编译器
  442. %f:%l:\ %m                              GCC
  443. %f:%l:\ %m,%Dgmake[%*\\d]:\ Entering\ directory\ `%f',
  444. %Dgmake[%*\\d]:\ Leaving\ directory\ `%f'
  445.                                         与 gmake 接合的 GCC (同一行)
  446. %f(%l)\ :\ %*[^:]:\ %m                  旧的 SCO C 编译器 (pre-OS5)
  447. %f(%l)\ :\ %t%*[^0-9]%n:\ %m            同上,增加错误类型和错误号
  448. %f:%l:\ %m,In\ file\ included\ from\ %f:%l:,\^I\^Ifrom\ %f:%l%m
  449.                                         GCC,一些附加信息

  450. 对多行信息处理更深入的例子,参见 |errorformat-Jikes| 和 |errorformat-LaTeX|.

  451. 注意在空格和引号前的反斜杠。这对 :set 命令是必须的。在逗号前有两个反斜杠,一个
  452. 是为 :set 命令须要,一个是为避免将逗号视为出错格式的分隔符。


  453. 过 滤 信 息

  454. 如果编译器产生的错误信息和格式串不适合,你可以写一个程序将出错信息转化为适合格
  455. 式。通过设定 'makeprg' 选项,你可以用 ":make" 命令运行它。比如:
  456.    :set mp=make\ \\\|&\ error_filter
  457. 管道符前的那些反斜杠是为了避免将其视作命令分隔符。每个空格前的反斜杠是 :set
  458. 命令所必须的。


  459. 8. 目录栈                                    *quickfix-directory-stack*

  460. Quickfix 根据 make 输出,维护一个保存所有使用过的目录的栈。对 GNU-make 来讲,
  461. 这非常简单,因为它总是输出绝对路径,即使是通过 makefile 中的一个 'cd' 命令或以
  462. "-C dir" (在读入 makefile 之前进入到指定目录) 参数运行。'-w' 选项可用来强制
  463. GNU-make 在处理前后输出当前目录。

  464. 如果你使用的不是 GNU-make,那目录栈的维护就会复杂得多。比如 AIX-make 从不输出
  465. 有关当前目录的任何信息。这样你就需要在 makefile 上多花些功夫。lesstiff 的
  466. makefile 中有一个命令可以显示 "Making {target} in {dir}"。这里的问题是它并不在
  467. 离开目录时输出信息,而且它不输出绝对路径。

  468. 为解决相对路径和缺少 "leave direcotry" 信息问题,Vim 使用下面的算法:

  469. 1) 检查给定目录是否为当前目录的子目录。如是,则将其存为当前目录。
  470. 2) 如果不是,则检查它是否为上级目录的子目录。
  471. 3) 如果目录仍没找到,则假定为它为 Vim 当前目录的子目录。

  472. 例外,每一个文件都被检查,看其是否存在于识别出的目录中。如果不存在,则在目录栈
  473. (不是目录树)的其它目录中查找。如果仍没找到,则假定它在 Vim 当前目录中。

  474. 此算法仍有限制。本例假定 make 在进入到一个目录时输出类似 "Making all in dir"
  475. 的信息。

  476. 1) 假定你有以下目录和文件:
  477.    ./dir1
  478.    ./dir1/file1.c
  479.    ./file1.c

  480.    如果 make 在处理当前目录前处理 "./dir1" 目录,而在 文件 "./file1.c" 中存在
  481.    一处错误,Vim 会载入文件 "./dir1/file.c"。

  482.    这只能靠 "leave direcotry" 信息解决。

  483. 2) 假定你有以下目录和文件:
  484.    ./dir1
  485.    ./dir1/dir2
  486.    ./dir2

  487.    你得到如下结果:

  488.    Make 输出                    Vim 理解的目录
  489.    ------------------------       ----------------------------
  490.    Making all in dir1             ./dir1
  491.    Making all in dir2             ./dir1/dir2
  492.    Making all in dir2             ./dir1/dir2

  493.    这可以通过在 "enter directory" 信息中输出绝对路径或是输出 "leave direcotry"
  494.    信息的方法解决。

  495. 为避免这些问题,要确保输出绝对路径和 "leave directory" 信息。

  496. Makefiles 例子:

  497. Unix:
  498.     libs:
  499.             for dn in $(LIBDIRS); do                            \
  500.                 (cd $$dn; echo "Entering dir '$$(pwd)'"; make); \
  501.                 echo "Leaving dir";                             \
  502.             done

  503. 并将
  504.     %DEntering\ dir\ '%f',%XLeaving\ dir
  505. 加到 'errorformat' 选项中以处理上面的输出

  506. 注意 Vim 并不检查 "leave directory" 信息中的目录是否为当前目录。因此你可使用
  507. "Leaving dir" 信息。


  508. 9. 特定错误格式                                   *errorformats*

  509.                                                 *errorformat-Jikes*
  510. Jikes(TM), IBM Research 发布的一个 source-to-bytecode Java 编译器提供简单的多
  511. 行信息。

  512. 一个和产生的信息相匹配的格式字符如下所示。
  513. 这面这几行可加到用户的 |vimrc| 以覆盖 Vim 识别的省缺模式。或者,你可以参考
  514. |:set+=| 将这个模式加入到省缺中。

  515.   :set efm=%A%f:%l:%c:%*\\d:%*\\d:,
  516.         \%C%*\\s%trror:%m,
  517.         \%+C%*[^:]%trror:%m,
  518.         \%C%*\\s%tarning:%m,
  519.         \%C%m

  520. 以 "+E" 选项启动时,Jikes(TM) 产生一个单行信息。对此,可以这样匹配:

  521.   :set efm=%f:%l:%v:%*\\d:%*\\d:%*\\s%m

  522.                                                 *errorformat-javac*
  523. 'errorformat' 可以很好的和 javac 工作,javac 的输出中用 "^" 表示错误所在列:
  524.   :set efm=%A%f:%l:\ %m,%-Z%p^,%-C%.%#
  525. 或者:
  526.   :set efm=%A%f:%l:\ %m,%+Z%p^,%+C%.%#,%-G%.%#

  527.                                                 *errorformat-ant*
  528. ant ([url]http://jakarta.apache.org/[/url]) 输出的每个行首都为 [javac],这样我们可将上面
  529. 的格式修改如下:
  530.   :set efm=%A\ %#[javac]\ %f:%l:\ %m,%-Z\ %#[javac]\ %p^,%-C%.%#

  531. 'errorformat' 还可以处理 ant 和 javac 或是 jikes 的接合。如使用 jikes, 你需要
  532. 告诉 ant 使用 jikes 的 +E 选项以使 jikes 产生单行错误信息。
  533. (一个 build.xml 文件的)第二行如下所示:
  534.   <property name = "build.compiler"       value = "jikes"/>
  535.   <property name = "build.compiler.emacs" value = "true"/>

  536. 'errorformat' 同时处理 ant 与 javac 和 jikes:
  537.   :set efm=\ %#[javac]\ %#%f:%l:%c:%*\\d:%*\\d:\ %t%[%^:]%#:%m,
  538.            \%A\ %#[javac]\ %f:%l:\ %m,%-Z\ %#[javac]\ %p^,%-C%.%#

  539.                                                 *errorformat-jade*
  540. 解析 jade (see [url]http://www.jclark.com/[/url]) 错误十分简单:
  541.   :set efm=jade:%f:%l:%c:%t:%m

  542.                                                 *errorformat-LaTeX*
  543. 下面是 'errorformat' 处理 (La)Tex 产生的多行错误输出的例子。":clist" 和 ":cc"
  544. 等命令将多行错误信息显示在一行,开头的空格被删除。
  545. 将 LaTeX 的错误格式运用于其它产生多行错误信息的编译器就很简单了。

  546. 命令可被加到 |vimrc| 或是其它 Vim 脚本,比如一个在编辑 LaTeX 源文件时载入的
  547. 含有 LaTeX 相关东西的脚本。
  548. 确定将例子中的所有行都拷贝,然后可删除注释行。对一些行中开头的 '\',参考
  549. |line-continuation|.

  550.                 首先设定 'makeprg' 使 LaTeX 可以报多行错;且在首个错误发生时
  551.                 不停止:
  552. :set makeprg=latex\ \\\\nonstopmode\ \\\\input\\{$*}

  553.                 多行错误信息开始:
  554. :set efm=%E!\ LaTeX\ %trror:\ %m,
  555.         \%E!\ %m,
  556.                多行警告信息开始;开始的两个包含行号。一些正则表达式的意义:
  557.                   - "%.%#"  (".*")   匹配一个可为空的字符串
  558.                   - "%*\\d" ("\d\+") 匹配一个数字
  559.         \%+WLaTeX\ %.%#Warning:\ %.%#line\ %l%.%#,
  560.         \%+W%.%#\ at\ lines\ %l--%*\\d,
  561.         \%WLaTeX\ %.%#Warning:\ %m,
  562. <               错误/警告信息继续;首个含有行号:
  563.         \%Cl.%l\ %m,
  564.         \%+C\ \ %m.,
  565.         \%+C%.%#-%.%#,
  566.         \%+C%.%#[]%.%#,
  567.         \%+C[]%.%#,
  568.         \%+C%.%#%[{}\\]%.%#,
  569.         \%+C<%.%#>%.%#,
  570.         \%C\ \ %m,
  571. <               匹配下面模式的行不含有任何重要的信息;将其忽略:
  572.         \%-GSee\ the\ LaTeX%m,
  573.         \%-GType\ \ H\ <return>%m,
  574.         \%-G\ ...%.%#,
  575.         \%-G%.%#\ (C)\ %.%#,
  576.         \%-G(see\ the\ transcript%.%#),
  577. <               删除所有空白行:
  578.         \%-G\\s%#,
  579.                LaTeX 输出并不在每一行中都指定出错的文件名;而只在括号中指定
  580.                 一次。
  581.                 下面的模式试图匹配这些文件名并将它们保存到内部栈中。这些模式
  582.                 可能扫描相同行(一个接一个的),结尾的 "%r" 表示 行中 "余下"
  583.                 的部分,以在下轮被解析,直到行尾。

  584.                 再次读入 '('...')' 包含的文件名;这并不将其入栈,因为此文件
  585.                 不含有任何错误:
  586.         \%+O(%f)%r,
  587. <               将 '(' 后的文件名入栈:
  588.         \%+P(%f%r,
  589.         \%+P\ %\\=(%f%r,
  590.         \%+P%*[^()](%f%r,
  591.         \%+P[%\\d%[^()]%#(%f%r,
  592. <               当扫描到 ')', 将最后一个文件名出栈:
  593.         \%+Q)%r,
  594.         \%+Q%*[^()])%r,
  595.         \%+Q[%\\d%*[^()])%r

  596. 注意某些情况下,LaTeX 输出中的文件名不能正确解析。解析会被不成对的括号打乱。
  597. 上面的例子只试图捕获最普通的情况。你可以根据你的需要而修改有关设定,比如,
  598. 所有烦人的 "Overfull ..." 警告可不被视为出错。
  599. 除了过滤 LaTeX 的输出信息外你还可以直接读入 [La]TeX 编译器生成的 *.log 文件。
  600. 这包括其它的一些由错误引起的有用信息。但要解析这么复杂的文件,你需要使用外部
  601. 过滤器。参考上面关于 Vim 过滤器的描述。

  602.                                                 *errorformat-Perl*
  603. 在 $VIMRUNTIME/tools 中,你可以找到 efm_perl.pl 脚本。它将 Perl 出错信息过滤
  604. 为 quickfix 模式的可懂格式。关于怎样使用它,查看该文件的开头部分。



  605. vim:tw=78:ts=8:ft=help:norl:

  606. Generated by vim2html on Wed Jun 23 16:04:39 IST 2004
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表