1. 程式人生 > >在VIM下寫C++能有多爽?

在VIM下寫C++能有多爽?

我是堅定的Vim黨,因為和命令列的整合如此之好,Vim可以解決任何問題。 然而在這個世界上,即便是最好用的工具也是需要配置的。本文就來打造一個適合寫C++的Vim編輯器!

基礎設定

稍微熟悉Vim的小夥伴都會知道這個檔案~/.vimrc,如同絕大多數的Unix軟體,Vim也是用基於文字的配置檔案。 當前使用者的Vim配置便儲存在這個檔案當中,該檔案的每一行便是一個配置項(function除外)。

配置檔案中的所有語句都會在開啟Vim時,在Ex模式下執行。例如,我們在Vim中開啟行號:

:set number

我們便可以在配置檔案中加入:

" ~/.vim
set number

同樣重要的配置還有:

  • 開啟語法高亮:syntax on
  • Tab大小:set tabstop=4
  • 縮排大小:set shiftwidth=4

Vim是一個典型的Unix程式,上述命令都有縮寫啦:number(nu), tabstop(ts), shiftwidth(sw), etc.

更多關於基礎配置項的資訊,請參考我的另一篇部落格: vim 的配置與使用

自動補全

自動補全恐怕是程式碼編輯器最重要的特性了,我們暫且不提它毀了多少人的面試之路。

由於Vim外掛的風格、使用方式太過多樣化,多語言的自動補全一直存在各種衝突,需要大量精力才能調通。 然而Github的出現給Vim外掛帶來了新的活力,現在我們通過基於Github的Vundle來安裝外掛,而不需要手動去vim.ort上找外掛了。

YouCompleteMe功能很全:

  • 自動補全,在你寫一個名稱的過程中,會出現提示列表,同時給出每一項的函式簽名(函式形參列表)。
  • 語法錯誤、警告的提示。比如變數未使用、函式未定義等等,很多編譯warning都會直接提示出來,特別神奇。

配置很容易,但需要先安裝Vundlevundle(如果你沒有的話)。另外,如果你是MacOS使用者,確保你的Vim升級到了7.4. 如何使用HomeBrew本文就不嘮叨了。

括號/引號匹配

括號和引號的自動補全和智慧匹配。例如:

  • 輸入前大括號補全後大括號
  • 在一對括號之間回車,自動分為3行並調整縮排
  • 輸入前引號自動補全後引號

凡此種種。。。我覺的第二條是最實用的功能,尤其是寫函式和類的時候。

上述的各種括號、引號匹配都可以用delimitMate來解決,官網:

下載後把autoloadplugindoc都拷貝到~/.vim/下即可。

Formatter

格式化程式對於我們懶人和強迫症使用者來講是非常需要的。Vim的預設配置中提供了格式化功能, 但顯然我們要的更多!比如我希望:

  • 前大括號不換行,而後大括號換行
  • 所有運算子兩邊都有空格
  • 一鍵格式化當前檔案
  • 儲存時自動格式化
  • ...

這裡推薦的外掛叫做vim-autoformat,上述的需求都能完美地解決。參照文件安裝就好了。

如果你希望自定義程式碼風格,可以在.vimrc中添加個性化的formatter:

let g:formatdef_harttle = '"astyle --style=attach --pad-oper"'
let g:formatters_cpp = ['harttle']
let g:formatters_java = ['harttle']

比如我安裝了astyle,這裡定義一個formatter叫做harttle。然後,把它設定成cpp和java的formatter。 至於astyle --style=attach --pad-oper為什麼這樣寫,這是一個Bash命令,這些引數你可以去檢視Astyle 的文件。 來一個快捷鍵F3格式化當前檔案:

" file: ~/.vimrc
noremap <F3> :Autoformat<CR>

看圖!

註釋

註釋、反註釋是程式碼編輯器的常用操作,我們也可以方便地在Vim中設定快捷鍵。 然而因為不同語言的註釋風格不同,我們可能需要在ftplugin下寫多個配置檔案,總之很煩人。 可以引入一個稱為NERD Commenter的外掛:

這是一個在社群很火的外掛,O(∩_∩)O~。下載後直接複製到~/.vim下面即可。 如果你希望看到它的文件,只需要更新VIM DOC:

:helptags ~/.vim/doc

此後,按下\cc即可註釋,\cu反註釋。前面可以加一個行數~

編譯/執行

如果你已經能熟練地定義Vim快捷鍵,就不必往下看了。

下面三行分別設定了執行、編譯、除錯的快捷鍵,n表示該快捷鍵在normal模式下起作用; nore表示該定義不會遞迴地傳遞;<CR>是回車(carriage return),!表示執行Shell命令。

nnoremap <F5>   <Esc>:w<CR>:!g++ -std=c++11 % -o /tmp/a.out && /tmp/a.out<CR>
nnoremap <F7>   <Esc>:w<CR>:!g++ -std=c++11 %<CR>
nnoremap <C-F5> <Esc>:w<CR>:!g++ -std=c++11 -g % -o /tmp/a.out && gdb /tmp/a.out<CR>

當然,如果你把上述程式碼直接新增到~/.vimrc中,所有型別的檔案都會擁有上述三個快捷鍵。 這可能是我們不希望的結果,我們希望每種檔案型別的<F5>執行自己的執行命令。

這需要進行檔案型別識別和定義檔案型別外掛,請參考我的另一篇文章:感受Vim的強大:進階技巧