使用vim来编译项目
环境配置
1.makeprg变量,可以用它来设置编译的命令,简单的命令赋值给它既可,用set语法
2.执行:make命令就能实现编译命令的执行。
3.更好的选择是使用makefile,只要你编写了makefile,不用配置vim就能通过:make命令找到makefile并执行。
使用errorformat来过滤编译错误生成quickfix
set efm+=%f(%l\\,%c):\ error\ %m
注意语法的细节,逗号需要两个反斜杠来转义,空格需要反斜杠转义,efm的语法类似c语言的scanf,
对于固定格式的单行报错信息还算简单。
这里包含了编译所需要的一些链接库,创建链接,或者复制过来,否则编译时就会报错缺少相关库程序。
sudo ln -s /Applications/Unity/MonoDevelop.app/Contents/Frameworks/Mono.framework /Library/Frameworks/Mono.framework
这里包含了所有mdtool的工具程序,添加到路径后执行命令行编译才能找到相关执行程序,例如mono.exe本身
export PATH="/Applications/Unity/MonoDevelop.app/Contents/Frameworks/Mono.framework/Commands:$PATH"
makefile:
sln:
/Applications/Unity/MonoDevelop.app/Contents/MacOS/mdtool \
-v build "--configuration:Debug|osx" \
$$CLIENT_PATH/product/build/hex3d-april-client.sln
注意:makefile中对shell变量的引用需要$$而不是原来的$,为啥,我的理解是这就是设计的缺陷
导致不得不使用这种蹩脚的方式来补救
makefile可以理解为支持额外依赖关系定义的shell脚本,编译动作的执行是支持shell内建和外部命令的,例如
我就用 | grep error来过滤了冗余的信息,减少了编译的log输出,帮quickfix过滤一部分内容。
makefile其实也很好理解,就是调用了monodevelop的build机制,mdtool是一个脚本,进行编译配置和执行编译,选项的意思也很直接,调试模式编译osx平台目标,后面是项目的solution文件位置,之所以使用$CLIENT_PATH是因为项目是纳入svn版本管理的,每个人的仓库位置不同,所以各自定义环境变量后,所有的配置脚本就可以保持统一就能执行了。
编译完成后生成quick fix,可以使用:cw来打开错误列表。
:cn跳转到下一个, :cp跳转到上一个,不需查看面板,依次遍历改错,即可实现编译错误的遍历解决。
:cp 跳到上一个错误 ( :help :cp )
:cn 跳到下一个错误 ( :help :cn )
:cl 列出所有错误 ( :help :cl )
vim可以同时记住最新的10个错误列表,你还可以根据以下命令查看本次错误列表、以及前几次的错误列表,进行比较差错
:cl 列出所有错误 ( :help :cl )
:cw 如果有错误列表,则打开quickfix窗口 ( :help :cw )
:col 到前一个旧的错误列表 ( :help :col )
:cnew 到后一个较新的错误列表 ( :help :cnew )
自定义脚本
当前项目的编译目标dll复制脚本在vim下不能运行,
TODO:
尝试让makefile完成编译结果的复制工作,
或者建立机制手动调用复制脚本
或者在mono中重新编译,因为编译成功后一定会调试代码,在mono中重新编译耗时很短,也算是二次检查了
vim的pwd变化问题
每当切换buffer时,vim的pwd就会变成buffer文件所在的目录,