前言
回想一下,上一次使用 vim 寫程式要編譯時,你是怎麼做的
大多人數會將 terminal 切成兩塊,一塊是 vim,一塊是 bash 用來編譯 (如下圖),編譯有錯誤,則移動到 vim 更改。若編譯錯誤可能上百個,使用該方式,每條錯誤都需要找到該檔案,並且來回修改即編譯,會相當沒效率。
本文以 C 語言專案為例,聊聊強大的 vim 在這種情境下有什麼好的解決方案。
強大的 :make
內建 :make
此次範例就拿 neovim 原始碼,根據官方文件的編譯方法 make CMAKE_BUILD_TYPE=Release
,所以我在 vim 裡進行編譯 :make CMAKE_BUILD_TYPE=Release
沒錯,在 vim 裡是可以用
:make
執行 Makefile
編譯完後,可以看到下圖,出現許多錯誤,案 Enter 後則回到平常。
這時可以使用 :cl
指令將這些錯誤列出來。
使用 :cn
或 cnext
跳到下一個錯誤位置
使用 :cp
或 :cprevious
跳到上一個錯誤位置
看上圖,可以觀察到每一條錯誤前面都有一個數字,可以使用 :cc [number]
跳轉到想要的錯誤,舉例:跳轉到第一個錯誤就用 :cc 12
,跳轉到第三個錯誤就用 :cc 19
。
火力展示如下圖
總結指令:
:make
: 執行 makefile:cl
: 列出所有錯誤:cn
: 跳到下個錯誤:cp
: 跳到上個錯誤:cc [number]
: 跳轉到特定錯誤
如虎添翼的 quickfix-window
使用 :clist
可以快速的列出結果,案下 <enter>
則會關閉,並且開始執行跳轉的動做。
但這還不夠方便,當 :clist
列出來的結果很多條可能超過螢幕,並且每次想重新查詢一次都得在打一次指令,而且不能在這些文字進行字串搜尋。
另一種查看錯誤的方式則是用
:copen
打開 quickfix window (如下圖),:clist
和:copen
列出的結果會是一模一樣的,只是提供了另一種顯示方式。
我們可以將游標放到 quickfix window 裡的錯誤上按下 <enter>
即可跳轉,用法直覺,而且不需要每次重新開啟列表,也可以在此視窗裡查詢字串。
而且剛剛提到的跳轉指令:cn
:cp
:cc [number]
也都可以配合使用。
Note: 詳見 :help quickfix-window
讓你飛起來的 vim-dispatch
使用 vim 內建的 :make
指令,在編譯時會卡住整個 vim,並且什麼都不能做,只能看著它編譯,因此 vim-dispatch 外掛完美解決了這個問題。
使用 vim-plug 安裝:
Plug 'tpope/vim-dispatch'
vim-dispath 的用法相當簡單,只要記住兩個指令即可
:Make
: 意義和:make
一樣,只是不會卡住 vim:Copen
:意義和:copen
一樣會打開 quickfix window
當然最一開始所說的跳轉指令,也能使用。此外掛跟 vim 內建的使用方式幾乎完全相同,只是指令稍微有差異。
:Make
編譯展示,可以看到下方在編譯,同時上方在移動游標:
Q & A
vim 使用 :make
指令,那是不是只有 Makefile 才能用?
當然不是,其他語言的社群為了也會提供一樣的功能,讓使用者在能無痛使用這個功能
- rust.vim: 原本 rust 編譯方式是
cargo build
,使用此外掛之後,在 vim 裡使用:make build
就好,以此類推:make run
就是cargo run
Reference
- Re: [轉錄][問題] VIM 編譯與執行
:help quickfix