前言

回想一下,上一次使用 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 指令將這些錯誤列出來。

使用 :cncnext 跳到下一個錯誤位置

使用 :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