在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來解決,官網:
下載後把autoload
, plugin
, doc
都拷貝到~/.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的強大:進階技巧