如何優雅的使用 Vim(二):插件介紹

如何優雅的使用 Vim(二):插件介紹

插件使用 vim-plug 管理。很長一段時間,我都在用 Vundle,切換到 vim-plug 並不是徹底必要。javascript

" 插件定義開始
call plug#begin('~/.vim/plugged')

" 在此添加插件...

" 插件到此結束
call plug#end()

不得不認可,vim-plug 用起來確實比 Vundle 簡單。php

下面來看看有哪些插件。html

配色方案

做爲一個編輯器,顏值比什麼都重要,Vim 也不例外。
Vim 自帶的配色方案(Color Scheme),我用得最多的就是 desertron
最近,發掘了下面幾個:java

Plug 'morhetz/gruvbox'
Plug 'ayu-theme/ayu-vim'
Plug 'drewtempelmeyer/palenight.vim' " 基於 Onedark,效果差很少
Plug 'joshdick/onedark.vim' " Atom Onedark 的復刻

目前用的是 gruvbox,算是比較完善的一個配色,和狀態欄插件 airline 整合得也不錯。python

狀態欄

vim_airline

狀態欄是一個大有做爲的地方。
airline 是大名鼎鼎的 powerline 的輕量版,我沒用過 powerline,從介紹來看,顯示效果更好,也稍爲笨重,依賴於 Python。git

Plug 'vim-airline/vim-airline'
" 主題,由於 gruvbox 對 airline 的支持不錯,暫時就不須要了。
" Plug 'vim-airline/vim-airline-themes'

縮進標線

vim_indent_line

目前使用 indentLine 插件,顧名思義,就是給縮進畫線,讓代碼塊更明顯。
對 Python 這種以縮進組織代碼塊的語言來講,猶如神助。github

Plug 'Yggdroot/indentLine'
let g:indentLine_noConcealCursor = 1
let g:indentLine_color_term = 0
let g:indentLine_char = '|'

代碼對齊

目前使用 tabularvim

Plug 'godlygeek/tabular'

假若有一段 JS:session

var video = {
    metadata: {
        title: "Aligning assignments"
        h264Src: "/media/alignment.mov",
        oggSrc: "/media/alignment.ogv"
        posterSrc: "/media/alignment.png"
        duration: 320,
    }
}

選中要對齊的行,執行 :Tab/:,結果以下:異步

var video = {
    metadata: {
        title     : "Aligning assignments"
        h264Src   : "/media/alignment.mov",
        oggSrc    : "/media/alignment.ogv"
        posterSrc : "/media/alignment.png"
        duration  : 320,
    }
}

此外,junegunn/vim-easy-align 彷佛也是個不錯的選擇。暫時還何嘗試。

文件管理器

vim_nerdtree

樹形結構的文件管理器,目前使用 nerdtree
操做並不侷限於瀏覽,刪除、重命名等操做也支持,雖然我不多使用。

Plug 'scrooloose/nerdtree'
" F2 快速切換
nmap <F2> :NERDTreeToggle<CR>

Vim 自帶的 netrw 也不錯,命令爲 :Vex,效果以下:

vim_netrw

體驗跟 nerdtree 比仍是有很多差距的。

代碼提綱

vim_tagbar

之前用 taglist,如今用 tagbar
它們都基於 ctags,目前比較好用的 ctags 是 universal-ctags,在 Linux 上很容易編譯安裝。

不要安裝 Linux 系統自帶的 ctags,通常爲 exuberant-ctags,最後更新於 2009 年,好久沒有維護了。
Universal-ctags 源自 exuberant-ctags,作了很多更新和改進。

Plug 'majutsushi/tagbar'
nmap <F8> :TagbarToggle<CR>

JS 的 tagbar 擴展:hushicai/tagbar-javascript.vim
其餘還有 Markdown / CSS 等擴展,可能須要依賴外部程序,我本身用不到,就再也不贅述了。

註釋

Vim 優秀的註釋插件不止一個,目前在用 EnhancedCommentify
快捷鍵嘛,通常 <leader>x 就夠了。

Plug 'hrp/EnhancedCommentify'
let g:EnhCommentifyRespectIndent = 'Yes'
let g:EnhCommentifyPretty = 'Yes'

可是也有不爽的地方,好比下面這種多行註釋沒法對齊:

// if (!ec) {
      // HttpSessionPtr session{
        // new HttpSession(std::move(socket), GetRequestHandler())
      // };
      // session->Start();
    // }

因此就在剛剛,我試了一下 tcomment,效果不錯:

// if (!ec) {
    //   HttpSessionPtr session{
    //     new HttpSession(std::move(socket), GetRequestHandler())
    //   };
    //   session->Start();
    // }
Plug 'tomtom/tcomment_vim'

然而 tcomment 的快捷鍵是硬傷,一時半會很難適應。

彩虹括號

當括號嵌套時,很難辨識。彩虹括號就是爲了解決這個問題。
不一樣層次的括號顏色不同,以下圖:

vim_rainbow

" Parentheses enhancements.
Plug 'kien/rainbow_parentheses.vim'
let g:rbpt_colorpairs = [
    \ ['brown', 'RoyalBlue3'],
    \ ['Darkblue', 'SeaGreen3'],
    \ ['darkgray', 'DarkOrchid3'],
    \ ['darkgreen', 'firebrick3'],
    \ ['darkcyan', 'RoyalBlue3'],
    \ ['darkred', 'SeaGreen3'],
    \ ['darkmagenta', 'DarkOrchid3'],
    \ ['brown', 'firebrick3'],
    \ ['gray', 'RoyalBlue3'],
    \ ['black', 'SeaGreen3'],
    \ ['darkmagenta', 'DarkOrchid3'],
    \ ['Darkblue', 'firebrick3'],
    \ ['darkgreen', 'RoyalBlue3'],
    \ ['darkcyan', 'SeaGreen3'],
    \ ['darkred', 'DarkOrchid3'],
    \ ['red', 'firebrick3'],
    \ ]
let g:rbpt_max = 8
let g:rbpt_loadcmd_toggle = 0
au VimEnter * RainbowParenthesesToggle
au Syntax * RainbowParenthesesLoadRound
au Syntax * RainbowParenthesesLoadSquare
au Syntax * RainbowParenthesesLoadBraces
au Syntax * RainbowParenthesesLoadChevrons

另見:luochen1990/rainbow

然而這些彩虹括號插件,都免不了與 CMake 衝突——會使 CMake 語法高亮失效,只好放棄了。

語法高亮

不得不說,基於關鍵字和模式匹配的語法高亮已經落後於時代了。

Vim 的語法高亮,有這樣幾種方式:

  • 基於關鍵字和模式匹配,效率高,可是對語義瞭解甚少。
  • 基於 libclang 這種現代編譯器提供的豐富語義,效率差,每每難以讓人接受。
  • 基於 ctags 索引出的符號,效率介於以上二者之間,配置較麻煩。

分別舉幾個例子。

基於關鍵字和模式:

Plug 'justinmk/vim-syntax-extra'
Plug 'octol/vim-cpp-enhanced-highlight'

基於 libclang:

Plug 'jeaye/color_coded'

基於 ctags:

Plug 'vim-scripts/TagHighlight'

Plug 'xolox/vim-misc'
Plug 'xolox/vim-easytags'

分別看一下效果。

vim-cpp-enhanced-highlight:
vim_hl_kw

TagHighlight:
vim_hl_tags

color_coded:
vim_hl_clang

目前,我比較傾向於第一種,簡單高效,效果雖然不怎麼完美,可是能夠接受。
固然,vim-cpp-enhanced-highlight 只針對 C/C++,其餘語言就不行了。

Python 高亮加強

Plug 'hdima/python-syntax'
let python_highlight_all = 1

簡單補全

幾個簡單補全插件,不須要安裝外部程序。

補全括號

輸入左括號時,自動補全右括號。

Plug 'Raimondi/delimitMate'
" For Python docstring.
au FileType python let b:delimitMate_nesting_quotes = ['"']

補全 HTML/XML 標籤

Plug 'docunext/closetag.vim'
let g:closetag_html_style=1

代碼檢測(Lint)

首推 ALE (Async Lint Engine)。
Syntastic 也不錯,可是 Vim 8 以後,由於異步接口的引入,ALE 逐漸佔了上風。

Plug 'w0rp/ale'

ALE 的特色是異步調用,不影響主界面。
ALE 跟其餘插件好比 airline 整合得比較好。
ALE 依賴於大量的外部工具(cpplint, eslint, etc.),這些工具纔是幕後的功臣。

ALE 做用於 C++ 代碼的效果:
vim_ale_cpp

結語

這裏列舉的插件,只是冰山一角。
諸如 YCM 這種級別的插件,其代碼補全的水平幾乎能夠與重量級 IDE 相匹敵了。
可是,編輯器畢竟只是編輯器,用 Vim 作它最擅長的事就能夠了,硬是要跟什麼什麼作比較,不必。

有時候我不由自問:究竟是插件幫我節省的時間多,仍是我尋找、配置插件的時間多?
也許我並不在意答案。

<全文完>

相關文章
相關標籤/搜索