作者yoco315 (眠月)
看板Editor
标题Re: [转录][问题] VIM 编译与执行
时间Wed Sep 29 09:15:57 2010
建议是写一个 Makefile,因为当你在 vim :make 的时候,
vim 会根据 make 的结果,parse 程式有错的地方,存入 quicklist,
且会预设直接跳到第一个错误点,你就可以马上修正那个编译错误。
这边列出常用的、跟 make 有关的几个指令:
:make
在目前路径下执行 make
[1],
并且会根据 make 的结果
[2]产生 quicklist。
而编辑位置会自动跳到第一个编译错误的点,方便马上修改。
敝人用
map <F7> :make<CR> 直接编译。
且用
map <F5> :make<CR>:!./a.out<CR> 编译加执行
[3]。
:cn
跳到下一个 quicklist 的位置。
敝人用
map <C-N> :cn<CR> 就可以按住 <C-N> 快速巡览错误。
:cp
跳到前一个 quicklist 的位置。
敝人用
map <C-P> :cp<CR> 配合 <C-N> 跑来跑去 XD
:make!
很类似
:make,但是不会自动跳到第一个错误点。
:cl
列出所有的编译错误,这些被列出来的是经过过滤的
[2],
一般的讯息会被过滤掉,只有编译错误或是警告会被列出。
:cl!
类似
:cl,但是不会过滤编译的结果,
有的时候你的编译错误发生到好几层 #include 底下,
你希望可以看到 include 的 back-trace,
这种时候
:cl! 就很好用了。
这样在 vim 里面就是「编辑 → <F5>编译、执行 → 编辑」的快速 loop,
也不用再跳到外面了,基本上在里面就可以做完大部分的事情,
vim 已经提供了编译程式的良好支援,可以让人作起事来像是用 IDE 一样,
唯一缺少的就是 debugger 整合,这部分可以使用 vimgdb/clewn
[4]!
透过 vimgdb/clewn 跟 gdb 的整合,就可以在 vim 里面直接 debug 了。
[1] 其实不一定是执行 make,预设是 make,但是可以设定,
透过
:set makeprg xxx 设定你真正想要呼叫的指令,
比方说我用的 build system 是 scons,我就
:set makeprg scons
前面也有板友分享设定成使用 gcc 编译目前档案,当然也是一种用法!
但是你在 vim 里面一律都是
:make 这样去执行建置的。
[2] vim 是怎麽判定编译有没有错误的呢?
他是用一个 regex 去核对编译器的输出,如果有符合的话,就会被抓出来,
预设的格式是 gcc 的错误讯息,如果你使用别的编译器,
请使用
:set errorformat 设定你的 regex。
[3] 细心的人可能已经发现「编译→执行」这中间不一定顺利,
因为编译有可能有错误,这个时候,我就不希望
!./a.out 被执行。
所以实际上我不是这样 map,而是
:map <F5> :call BuildAndRun()<CR>。
BuildAndRun() 是我自己写的一个函数,
他会先
make,然後检查 quicklist,如果没错,就
!./a.out,
如果有错,他就停住了。
後来我觉得好像可以用
make && ./a.out 还是啥之类的作掉这件事,
但是我没试过,有人有心得的话请分享给我知道 XD
收到来信问这个函数要怎麽写,於是来补充一下...
function! HasError(qflist)
for i in a:qflist
if i.valid == 1
return 1
endif
endfor
return 0
endfunction
function! MakeAndRun()
make
if HasError( getqflist() )
cl
else
!a.out
endif
endfunction
map <F5> :call MakeAndRun()<CR>
[4] 官方网站
http://clewn.sourceforge.net/
别人的 blog 教学
http://tinyurl.com/y9p3wwc
--
To iterate is human, to recurse, divine.
递回只应天上有, 凡人该当用回圈. L. Peter Deutsch
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.160.107.136
※ 编辑: yoco315 来自: 203.160.254.105 (11/05 14:34)
1F:→ tingyun60426:递回跟回圈不是一样? 02/07 16:02
2F:→ benqm300:递回用的让人家看得懂的话,程式倒是蛮简洁有力的 03/25 21:05
3F:→ yoco315:补充一下有人寄信问我的问题 <C-N> 就是 Ctrl + N 的意思 07/14 17:35
4F:→ firejox:map 里有说明:D 07/14 17:44
5F:→ angleevil:其实我有猜到C就是ctrl.只是我笨笨的用n.才会去发问 07/14 17:46
6F:→ angleevil:sorry 07/14 17:46