设置Vim的errorformat以支持mxmlc编译器

Vim调用Ant编译swf并自动调试一文中,我介绍了使用Vim来编译swf的方法,这半年来,我一直都用Vim+Ant+FlexSDK做AS开发,感觉总体效率上比Flash Builder要高许多。

不好的地方,其实也有许多。最大的不便就是没有代码提示,对于不熟悉的方法,必须要去查看Language Reference。还有个附带的不便就是必须自己手动导入包。不过这两个不便之处,又让我远离了Flash Builder中的哪些错误的代码提示(我被误导过好多次),以及让我更熟悉AS3的包结构。

今天说的不是这些,好了,进入正题把!

在Vim中,有许多为程序员着想的地方。比如碰到编译错误后会自动打开第一个出错的文件并跳转到出错行。改完这个错误后可以用 :cn 命令跳转到下一个出错处继续修改。这个特性降低了程序员在调试过程中对鼠标的依赖,提高了效率。

不过,在使用Vim+Ant+FlexSDK来编译AS的时候,虽然能够看到编译的出错信息,但是Vim会自动打开一个不存在的文件,无法使用上面的功能。

要了解出现这个问题原因,首先要知道Vim获取编译错误的原理。 Vim通过分析编译器输出的错误信息文本,来得到自己能识别的出错信息,从而实现正确的跳转。 但不同的编译器的输出信息千奇百怪,Vim默认的分析程序不能正确解析 Ant+mxmlc 编译器的输出信息,造成了无法正确跳转到错误文件。让我们看张图:

quickfix列表

可以看出,Vim将错误文件路径前面的[mxmlc]前缀也当作了路径的一部分,然后打开这个不存在的文件,导致无法正常进行修改。

再看一张详细一点的错误信息:

详细的quickfix列表

那么,只要我们将错误信息的解析程序设置正确,就能正确解析这些信息了!

执行下面的代码,然后编译,如果有编译错误,就能正常的跳转到错误文件的对应位置:

1:set errorformat=%E\ \ \ \ [mxmlc]%f(%l):\ :\ %c\ %m

需要注意一点的是,在ex模式或者在命令行模式中输入errorformat属性值的时候,必须对空格用反斜杠转义,否则Vim会不接受这些参数值。网上找的很多例子可能都忽略了这点。上面的例子中,已经进行了转义。

**为什么例子中有个中文?**因为编译器自动识别了我的语言,因此输出的错误信息是中文的,我也必须用中文来分析。如果编译器输出信息为英文,那么这里的 应为 col

由于使用了中文,如果将这段代码写在vimrc中的话,就必须进行编码转换:

1let &errorformat=iconv("%E\ \ \ \ [mxmlc]%f(%l):\ 列:\ %c\ %m", 'utf8', &enc)

至于语法的详细含义和用法,这里写的很清楚::help errorformat