2018 更新下vim 插件

@(linux 編程)[工具使用]

周末網上晃蕩看到一些關于 vim8 異步和插件的文章,覺得有些新功能挺實用的,所以花了點時間升級下自己的 vim 配置。
本文介紹一些使用到的實用插件以及參考配置。

on ubuntu 18


插件管理

vim-plug

之前使用的插件管理工具是 vundle, 沒感覺啥問題,但是當看到 vim-plug 以下特點:

  • 安裝方便,直接把 vim-plug.vim 丟 .vim/autoload 下就好了
  • 支持全異步插件安裝、升級
  • 延遲加載,提高 vim 啟動速度

我就果斷拋棄 vundle,把插件管理工具改為她了。
安裝配置和使用詳細參考 git 主頁,使用方式和 bundlue 類似 :PlugInstall,:PlugUpgrade等。

vimrc 中 配置類似:

call plug#begin('~/.vim/plugged') "開始,指定插件安裝目錄
Plug 'junegunn/vim-easy-align'  
Plug 'scrooloose/nerdtree', { 'on':  'NERDTreeToggle' }  "觸發時才加載
Plug 'tpope/vim-fireplace', { 'for': 'clojure' }        "打開對應文件才加載
Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' }  "選擇插件分支
Plug 'fatih/vim-go', { 'do': ':GoInstallBinaries' }  "安裝插件時執行命令
"....
call plug#end()  "結束

符號索引

看源碼的時候經常需要跳轉,查看函數定義、被哪些地方調用,在 windows 下可以使用 source insight 等工具查看;
linux 下,之前用 vim 一直靠 ctags + cscope 看 c/c++,插件 jedi 查看 python 代碼,其他語言沒有,而且每次代碼修改,都需要手動重新生成索引,感覺挺麻煩的。

在知乎看到這篇 <Vim8中C/C++符號索引:GTags 篇 >,vim8 支持異步模式后,自動符號索引簡直太方便,直接打開工程文件,就可以隨便查查查。

安裝配置詳細參考文章,大概基本步驟如下:

  • 重新安裝 ctags,使用 Universal CTags (默認的軟件源都是Exuberant Ctags,版本太舊了)
"正確設置vimrc,讀取tags(當前目錄,否則向上級目錄查找添加 .tags)
set tags=./.tags;,.tags
  • 安裝 gtags (系統軟件源一般版本比較低,建議自己編譯安裝)
    gtags 原生支持 6 種語言(C,C++,Java,PHP4,Yacc,匯編), 通過安裝 pygments擴展支持 50+ 種語言(包括 go/rust/scala 等,基本覆蓋所有主流語言。
pip install pygments
"vimrc 中設置環境變量啟用 pygments
let $GTAGSLABEL = 'native-pygments'
let $GTAGSCONF = '/usr/local/share/gtags/gtags.conf' " 此路徑根據實際設置(find一下)
  • 安裝三個插件 : vim-gutentags 索引自動管理 + 索引數據庫切換 + 索引預覽
    按下面 vimrc 配置后打開 vim 執行:PlugInstall 完成插件安裝,然后就可以開心使用了。
    預設快捷鍵如下
    • <leader>cg - 查看光標下符號的定義
    • <leader>cs - 查看光標下符號的引用
    • <leader>cc - 查看有哪些函數調用了該函數
    • <leader>cf- 查找光標下的文件
    • <leader>ci- 查找哪些文件 include 了本文件
      查找到索引后跳到彈出的 quikfix 窗口,停留在想查看索引行上,按 小P直接打開預覽窗口,大P關閉預覽,\d\u 向上向下滾動預覽窗口。

vimrc 配置如下:

"自動載入ctags gtags
if version >= 800
    Plug 'ludovicchabant/vim-gutentags'
    Plug 'skywind3000/gutentags_plus'

    let $GTAGSLABEL = 'native-pygments'
    let $GTAGSCONF = '/usr/local/share/gtags/gtags.conf'

    " gutentags 搜索工程目錄的標志,當前文件路徑向上遞歸直到碰到這些文件/目錄名
    let g:gutentags_project_root = ['.root', '.svn', '.git', '.hg', '.project']

    " 所生成的數據文件的名稱
    let g:gutentags_ctags_tagfile = '.tags'

    " 同時開啟 ctags 和 gtags 支持:
    let g:gutentags_modules = []
    if executable('ctags')
        let g:gutentags_modules += ['ctags']
    endif
    if executable('gtags-cscope') && executable('gtags')
        let g:gutentags_modules += ['gtags_cscope']
    endif

    " 將自動生成的 ctags/gtags 文件全部放入 ~/.cache/tags 目錄中,避免污染工程目錄
    let g:gutentags_cache_dir = expand('~/.cache/tags')

    " 配置 ctags 的參數
    let g:gutentags_ctags_extra_args = ['--fields=+niazS', '--extra=+q']
    let g:gutentags_ctags_extra_args += ['--c++-kinds=+px']
    let g:gutentags_ctags_extra_args += ['--c-kinds=+px']

    " 如果使用 universal ctags 需要增加下面一行
    let g:gutentags_ctags_extra_args += ['--output-format=e-ctags']

    " 禁用 gutentags 自動加載 gtags 數據庫的行為
    " 避免多個項目數據庫相互干擾
    " 使用plus插件解決問題
    let g:gutentags_auto_add_gtags_cscope = 0

    "預覽 quickfix 窗口 ctrl-w z 關閉
    Plug 'skywind3000/vim-preview'
    "P 預覽 大p關閉
    autocmd FileType qf nnoremap <silent><buffer> p :PreviewQuickfix<cr>
    autocmd FileType qf nnoremap <silent><buffer> P :PreviewClose<cr>
    noremap <Leader>u :PreviewScroll -1<cr> " 往上滾動預覽窗口
    noremap <leader>d :PreviewScroll +1<cr> "  往下滾動預覽窗口
endif

有個地方需要注意,配置中定義了項目標志文件為 .git, .svn, .root, .project, .hg.., 讓 gutentags 可以確定當前文件所屬項目的根目錄,我們在當前目錄打開文件后 guntentags 開始向父目錄遞歸查找,直到找到這些標志文件時停止,對于沒有 .git 之類標志文件的工程,可以在自己認為的根目錄新建 .root 之類的文件作為標志。

效果圖如下:


1534853129638.png

動態檢查

靜態代碼檢查是個很實用的東西,能在編寫代碼的過程中及時發現存在的錯誤,之前一直使用的插件是 syntastic, vim8 支持異步后可以升級實時 linting 工具 ALE

使用配置如下:

  Plug 'w0rp/ale'
" 對應語言需要安裝相應的檢查工具
" https://github.com/w0rp/ale
"    let g:ale_linters_explicit = 1 "除g:ale_linters指定,其他不可用
"    let g:ale_linters = {
"\   'cpp': ['cppcheck','clang','gcc'],
"\   'c': ['cppcheck','clang', 'gcc'],
"\   'python': ['pylint'],
"\   'bash': ['shellcheck'],
"\   'go': ['golint'],
"\}
"
    let g:ale_sign_column_always = 1
    let g:ale_completion_delay = 500
    let g:ale_echo_delay = 20
    let g:ale_lint_delay = 500
    let g:ale_echo_msg_format = '[%linter%] %code: %%s'
    let g:ale_lint_on_text_changed = 'normal'
    let g:ale_lint_on_insert_leave = 1
    let g:airline#extensions#ale#enabled = 1
    "let g:ale_set_quickfix = 1
    "let g:ale_open_list = 1"打開quitfix對話框

    let g:ale_c_gcc_options = '-Wall -O2 -std=c99'
    let g:ale_cpp_gcc_options = '-Wall -O2 -std=c++14'
    let g:ale_c_cppcheck_options = ''
    let g:ale_cpp_cppcheck_options = ''

    let g:ale_sign_error = ">>"
    let g:ale_sign_warning = "--"
    map <F7> ::ALEToggle<CR>

ALE 支持多種語言的代碼檢查,前提是系統已經安裝了對應的工具(git 主頁可見語言及對應工具),諸如 clang cppcheck pylint shellcheck golint等。
安裝插件后打開 vim 編輯文件,可以看到檢查效果了,可以設置多個檢查工具檢查不同維度錯誤,多個工具是并發進行檢查的。

cppcheck 檢查出指針泄漏,提出編碼建議


1534853264187.png

暫時關閉代碼檢查:ALEDisable, 上述配置設置了快捷鍵 F7,:ALEDetail查看纖細描述等;

自動補全

vim 本身自帶有補全功能,但是比較弱雞,所以還是推薦百年老字號 YCM,最新版本 YCM 已經全異步化,彈出語義補全毫不卡頓。
安裝過程需要編譯 ycm_core 庫,所以有點久。
參考配置

Plug 'Valloric/YouCompleteMe', {'do':'./install.py --clang-completer --go-completer --java-completer'}
set completeopt=menu,menuone "關閉自動彈出的窗口
let g:ycm_add_preview_to_completeopt = 0
let g:ycm_show_diagnostics_ui = 0
let g:ycm_server_log_level = 'info'
let g:ycm_min_num_identifier_candidate_chars = 2
let g:ycm_collect_identifiers_from_comments_and_strings = 1
let g:ycm_complete_in_strings=1
let g:ycm_key_invoke_completion = '<c-y>'
set completeopt=menu,menuone
noremap <c-y> <NOP>
let g:ycm_semantic_triggers =  {
            \ 'c,cpp,python,java,go,erlang,perl': ['re!\w{2}'],
            \ 'cs,lua,javascript': ['re!\w{2}'],
            \ }
let g:ycm_global_ycm_extra_conf= '~/.vim/.ycm_extra_conf.py'

"附送 括號自動補全
Plug 'jiangmiao/auto-pairs'

以上配置 參考

Plug 插件管理安裝 YCM 后執行腳本 build.py 編譯 ycm_core 庫,指定了支持的語言系,如果有其他語言需求需要在安裝編譯時對應添加語義 flag。

對于 C-family 工程,ycm 需要配置文件 .ycm_extra_conf.py 才能進行語義補全提示(include 庫之類的路徑)
在上述配置中,最后設置 :
let g:ycm_global_ycm_extra_conf= '~/.vim/.ycm_extra_conf.py'
ycm 嘗試從當前目錄往上查找讀取 .ycm_extra_conf.py 文件導入,最后如果沒有找到就使用這個默認配置文件(參考插件例子 ~/.vim/plugged/YouCompleteMe/third_party/ycmd/examples/.ycm_extra_conf.py)。
如果自己工程編譯參數,include 不同,可以拷貝默認配置文件修改 flags 后直接放在工程目錄下。也可以使用 ycm 提供的 配置文件生成工具

默認的 ycm_extra_conf 文件定義編譯 flags 如下

1534906709765.png

語義補全效果(文件前面沒有寫過的符號):
類方法


1534859936746.png

庫函數


1534859969396.png

python


1534861412348.png

查找

leaderF 用于快速模糊查找文件或者函數
簡單配置如下

Plug 'Yggdroot/LeaderF', { 'do': './install.sh' }
" Ctrl + p 打開文件搜索
let g:Lf_ShortcutF = '<c-p>'    
"\p 打開函數列表
noremap <Leader>p :LeaderfFunction<cr>

快捷鍵

  • <ctrl-p>: 查找文件
  • \p: 查找函數
  • <Ctrl-J>, 向下, <Ctrl-K>, 向上
  • <Ctrl-X> : open in horizontal split window.
  • <Ctrl-]> : open in vertical split window.
  • <Ctrl-T> : open in new tabpage.

使用效果 :
搜索文件 : ctrl-p


1534866470448.png

搜索函數 : \p


1534866419863.png

目錄列表

左 nerdtree 右 taglist,老插件了。


1534914065501.png
**
"當打開vim且沒有文件時自動打開NERDTree
autocmd vimenter * if !argc() | NERDTree | endif
" 只剩 NERDTree時自動關閉
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") && b:NERDTreeType == "primary") | q | endif
let NERDTreeShowLineNumbers=1
let NERDTreeAutoCenter=1
let NERDTreeShowHidden=1
let NERDTreeIgnore=['\.pyc','\~$','\.swp','\.git']

map <silent><F3> :NERDTreeToggle<CR>
imap <F3> <ESC> :NERDTreeToggle<CR>
  • Taglist
    taglist依賴于ctags,所以要先裝ctags;
    此插件顯示打開文件的符號,命名空間,類名等。
"默認打開Taglist
let Tlist_Sort_Type = "name"    " 按照名稱排序
let Tlist_Auto_Open=0
let Tlist_Ctags_Cmd = '/usr/local/bin/ctags'
let Tlist_File_Fold_Auto_Close = 1
let Tlist_Exit_OnlyWindow = 1 "如果taglist窗口是最后一個窗口,則退出vim
let Tlist_Use_Right_Window = 1 "在右側窗口中顯示taglist窗口
let Tlist_Compart_Format = 1    " 壓縮方式
let Tlist_Exist_OnlyWindow = 1  " 如果只有一個buffer,kill窗口也kill掉buffer
let Tlist_Show_One_File=1            "不同時顯示多個文件的tag,只顯示當前文件的

其他插件

  • vim-signify 修改標記
    通過 signify 這個插件,對于打開有版本控制的文件,可以在文件側邊實時顯示文件的修改情況。
    :SignifyDiff 可以直接打開新 tab 對比版本差異,常用可以設置快捷鍵觸發
    1534865414540.png
  • python換行格式化
    換行的時候,自動格式化下 python ,詳見鏈接。

  • ConqueTerm terminal
    在 vim 中直接打開一個 bash ,效果如下:
    :ConqueTermSplit bash

    1534865781881.png

另外一個在vim中打開終端的插件 python-repl


以上插件,你可以在終端直接執行(Ubuntu18)

wget -qO- https://raw.githubusercontent.com/orientlu/vim/master/setup.sh | sh -x

安裝配置好的vim,需要手動升級ctags和gtags,參考 install_tags.md


參考

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容