如何優雅的使用 Vim(二):外掛介紹

NO IMAGE
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

如何優雅的使用 Vim(二):外掛介紹

外掛使用 Vundle 管理,雖然據說 Vim 8 已經引入內建的包管理機制,暫時還沒有試用過。

" 使用 Vundle 前,先關閉檔案型別檢測
filetype off

" 指定路徑,開始
set rtp =~/.vim/bundle/Vundle.vim
call vundle#begin()

" 讓 Vundle 管理自己(主要是更新)
Plugin 'VundleVim/Vundle.vim'

" 在此新增其他外掛...

" 外掛到此結束
call vundle#end()

" Vundle 結束後,再啟用檔案型別檢測
filetype plugin indent on

下面來看看有哪些外掛。

配色方案

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

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

目前用的是 gruvbox,算是比較完善的一個配色,和狀態列外掛 airline 整合得也不錯。

狀態列

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

Plugin 'vim-airline/vim-airline'
" 主題,因為 gruvbox 對 airline 的支援不錯,暫時就不需要了。
" Plugin 'vim-airline/vim-airline-themes'

縮排標線

目前使用 indentLine 外掛,顧名思義,就是給縮排畫線,讓程式碼塊更明顯。
對 Python 這種以縮排組織程式碼塊的語言來說,猶如神助。

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

程式碼對齊

目前使用 tabular

Plugin 'godlygeek/tabular'

假如有一段 JS:

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 似乎也是個不錯的選擇。暫時還未嘗試。

檔案管理器

樹形結構的檔案管理器,目前使用 nerdtree
操作並不侷限於瀏覽,刪除、重新命名等也可以支援(雖然我很少使用)。

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

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

體驗跟 nerdtree 比還是有不少差距的。

程式碼提綱

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

不要安裝 Linux 系統自帶的 ctags,一般為 exuberant-ctags,最後更新於 2009 年,很久沒有維護了。
Universal-ctags 源自 exuberant-ctags,做了不少更新和改進。

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

JS 的 tagbar 擴充套件:hushicai/tagbar-javascript.vim
其他還有 Markdown / CSS 等擴充套件,可能需要依賴外部程式,我自己是用不到的。

註釋

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

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

其實,EnhancedCommentify 讓我不爽的是,下面這種多行註釋無法對齊:

    // 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();
    // }
Plugin 'tomtom/tcomment_vim'

彩虹括號

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

" Parentheses enhancements.
Plugin '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

語法高亮

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

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

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

分別舉幾個例子。

基於關鍵字和模式:

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

基於 libclang:

Plugin 'jeaye/color_coded'

基於 ctags:

Plugin 'vim-scripts/TagHighlight'

Plugin 'xolox/vim-misc'
Plugin 'xolox/vim-easytags'

分別看一下效果。

vim-cpp-enhanced-highlight:

TagHighlight:

color_coded:

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

Python 高亮增強

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

簡單補全

幾個簡單補全外掛,不需要安裝外部程式。

補全括號

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

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

補全 HTML/XML 標籤

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

程式碼檢測(Lint)

首推 ALE (Async Lint Engine)。
Syntastic 也不錯,但是 Vim 8 之後,因為非同步介面的引入,ALE 逐漸佔了上風。

Plugin 'w0rp/ale'

ALE 的特點是非同步呼叫,不影響主介面。
ALE 跟其他外掛比如 airline 整合得比較好。
ALE 依賴於大量的外部工具(cpplint, eslint, etc.),這些工具才是幕後的功臣。

ALE 作用於 C 程式碼的效果:

結語

這裡列舉的外掛,只是冰山一角。
諸如 YCM 這種級別的外掛,其程式碼補全的水平幾乎可以與重量級 IDE 相匹敵了。
但是,編輯器畢竟只是編輯器,用 Vim 做它最擅長的事就可以了,硬是要跟什麼什麼做比較,沒必要。

有時候我不禁自問:到底是外掛幫我節省的時間多,還是我尋找、配置外掛的時間多?
也許我並不在乎答案。

<全文完>

相關文章

軟體開發工具 最新文章