作者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)
→ tingyun60426:遞迴跟迴圈不是一樣? 02/07 16:02
→ benqm300:遞迴用的讓人家看得懂的話,程式倒是蠻簡潔有力的 03/25 21:05
→ yoco315:補充一下有人寄信問我的問題 <C-N> 就是 Ctrl + N 的意思 07/14 17:35
→ firejox:map 裡有說明:D 07/14 17:44
→ angleevil:其實我有猜到C就是ctrl.只是我笨笨的用n.才會去發問 07/14 17:46
→ angleevil:sorry 07/14 17:46