Chinaunix首页 | 论坛 | 博客
  • 博客访问: 148734
  • 博文数量: 54
  • 博客积分: 1732
  • 博客等级: 上尉
  • 技术积分: 520
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-23 23:29
文章分类

全部博文(54)

文章存档

2011年(3)

2010年(26)

2009年(25)

分类: C/C++

2009-11-14 00:14:56

昨天使用vim实践计数排序算法时,遇到一个及其不爽的问题:

写代码免不了要调试,而当我敲完第一遍code之后在正常模式下键入:make后,窗口下部出现quickfix窗口,提示出错信息,到这里是正常的。一般情况下,此时键入任意键都应当使quickfix窗口消失,然后光标跳到第一个错误处。但是我敲入任意键却使vim新建了一个叫In file included from src/main.cc的空白缓冲区,昨天因为集中注意力在计数排序上,捣腾了一会无果后只能暂时忍受,今天花了一天时间终于搞定这个诡异的问题。

首先当然是回忆这几天都对vim作了什么改动,印象中最近的改动就是添加了针对c++的自动补全,所以首先就怀疑这个东西上了,于是将~/.vimrc中关于c++自动补全的部分全注释掉,但是问题依旧,于是乎将~/.vimrc/tags/整体移除(c++自动补全功能用到里面的tag文件)还是没有解决,看来不是这个原因。
仔细检查~/.vimrc文件中其他部分,都很久没改动过了,应该没什么问题,而且~/.vim/文件夹下其他项目的修改日期最晚也是5天前了,而且还是doc/里面,其他更早,看来不是配置问题。
难道是系统中其他软件冲突?好像前两天系统提示过一次升级,当时看都没看就全选了,如果是这个原因的话还真不好办,还是先想想其他招吧,要不先试试把vim卸载后重新安装好了。
说干就干,apt-get还是很方便的(我在旧电脑上用源码装过一次,vim是装好了,但是折腾了半天也没搞定GTK的图形前端,不知道是不是因为需要下载单独的源码,当时发懒没弄了,反正那台电脑上也用不上图形前端,而在这台电脑上图形前端对我还是比较重要的,貌似vim与gnome桌面终端某些快捷键冲突,因此需要一个单独的vim图形前端),但是卸载重装之后问题依旧。
到这里的时候,我重装系统的心都有了,反正升级到9.10的时候老是连不到正确的网络,也没去深查原因,想着要不趁这个机会体验一把新系统好了,但是懒惰阻止了我,因为上次装系统的时候这个该死的本子折腾了我一个晚上,我菜鸟一只,又不会系统备份,还是算了,想想其他办法吧。

下午上班的时候一直在想这个问题,回忆这两天都干了啥,还好咱也有灵光一闪的时候,突然想起会不会是gcc4.5的原因,gcc升级之后貌似只写过几个很简单的程序……
下班吃过晚饭后,又开始折腾,首先就将makefile中指定编译器的变量改了,使其指向原来的版本(还好没卸载),果然问题消失了,改回新版本之后问题复现,小开心了一下,终于把问题定位了
于是翻出Easwy写的《使用VIM开发软件项目》,记得里面好像提到了一些quickfix的设置,但是看完相应章节之后还是没找到想要的答案
于是开始在shell里分别make:
make >gcc4.3.3.log 2>gcc4.3.3.log
make >gcc4.5.0.log 2>gcc4.5.0.log
然后使用vimdiff查看两个文件,结果一目了然:

4.3.3版本的输出结果为:
In file included from src/main.cc:41:
include/expression.h:29: 错误: ‘duble’没有命名一个类型
src/main.cc: In function ‘int main(int, char**)’:
src/main.cc:62: 错误: ‘expr’在此作用域中尚未声明
make: *** [main.o] 错误 1

4.5.0版本输出结果为:
In file included from src/main.cc:41:0:
include/expression.h:29:1: 错误:‘duble’ does not name a type
src/main.cc: 在函数‘int main(int, char**)’中:
src/main.cc:62:26: 错误:‘expr’在此作用域中尚未声明
make: *** [main.o] 错误 1
显然新版本错误信息中多了一个数字,使用:cl可以看出该数字指示错误所在的列

怎么解决?当时第一想法是发到vim的maillist中求助,但是就我这英文水平,还不知道能不能把问题描述清除呢,自己老老实实看help吧,反正装了中文文档的,不过从来没看过而已
输入:help quickfix,快速的扫完了前6节,讲的似乎都是怎样在错误列表中跳转之类的东西,一直到第7节错误格式,似乎才有那么一点关联,看了一遍之后明白了一点,于是开始照猫画虎:
首先检查现有errorformat:
:set efm?
得到结果是
  errorformat=%*[^"]"%f"%*\D%l: %m,"%f"%*\D%l: %m,%-G%f:%l: (Each undeclared identifier is reported only once,%-G%f:%l: for each function it appears in.),%f:
%l:%c:%m,%f(%l):%m,%f:%l:%m,"%f"\, line %l%*\D%c%*[^ ] %m,%D%*\a[%*\d]: Entering directory `%f',%X%*\a[%*\d]: Leaving directory `%f',%D%*\a: Entering directo
ry `%f',%X%*\a: Leaving directory `%f',%DMaking %*\a in %f,%f|%l| %m
没看出来哪个模式是对应gcc的,直接按照gcc4.5.0直接设一个errorformat值添加到现有值后:
set efm+=%f%l:\ %m,In\ file\ included\ from\ %f:%l:%c:,%f:%l:%c:\ %m
但不幸的是并没有解决问题,难道这个值设置不对?不甘心……
把+号去掉:
set efm=%f%l:\ %m,In\ file\ included\ from\ %f:%l:%c:,%f:%l:%c:\ %m
问题解决……

但还有个问题,万一哪天我想学个别的语言玩玩呢?那岂不是又读不了正确的格式了?怎样才能把我自己写的模式添加到errorformat已有值的前面?
尝试了以下方法:
set efmtmp=efm
set efm=%f%l:\ %m,In\ file\ included\ from\ %f:%l:%c:,%f:%l:%c:\ %m
set efm+=efmtmp
可惜这样是不符合vimrc的语法规则滴……

最后还是"灵光一闪"拯救了我,为什么只对特定的文件类型修改errorformat值呢?至于具体怎么改,好像我的.vimrc文件里面就有好几个来着,于是最后的结果是:
auto FileType c,cpp set efm=%f%l:\ %m,In\ file\ included\ from\ %f:%l:%c:,%f:%l:%c:\ %m
完美解决……
可以在编辑普通文件与编辑c/c++文件时分别用:set efm?查看

阅读(763) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~