1. 程式人生 > >Ubuntu16.04下vim8配置

Ubuntu16.04下vim8配置

Ubuntu16.04下vim8配置


1. 準備工作

# 解除安裝老舊發黴的exuberant-ctags
sudo apt-get --purge remove exuberant-ctags
# 解除安裝舊版vim及其相關元件
sudo apt-get --purge remove vim*
# 自動解除安裝無用依賴軟體
sudo apt-get --purge autoremove
# 清理無用軟體包
sudo apt-get autoclean
# 更新軟體源
sudo apt-get update
# 安裝checkinstall
sudo apt-get install
checkinstall # 安裝pyton庫 sudo apt-get -f install python-dev sudo apt-get -f install python3-dev # 安裝介面相關庫 sudo apt-get install libncurses5-dev # 安裝編譯工具集 sudo apt-get install cmake build-essential # 安裝自動配置工具 sudo apt-get install autoconf pkg-config # 安裝cscope和global sudo apt-get install cscope sudo apt-get
install global # 安裝powerline字型 sudo apt-get install fonts-powerline

說明:

  • exuberant-ctags 已經8年沒更新,拋棄它,使用基於它之上的universal-ctags替代。
  • 由於YCM外掛需要python支援,所以要解除安裝apt方式安裝的vim,自行使用原始碼編譯安裝的最新vim。
  • make install安裝軟體會在/usr/local/下的各個子目錄分別生成軟體相關檔案,這會導致如果想解除安裝軟體很麻煩,需要從一個個目錄中找出要解除安裝的軟體相關的所有檔案,然後一一刪除。當然也可以在configure的時候為軟體指定好單獨的安裝目錄(例如:/opt/xxx , /usr/local/xxx 等等),這個做法的好處是解除安裝軟體只需要刪除指定的那個目錄就行了,但是這樣做安裝完後shell找不到軟體在哪裡,還需要修改環境變數PATH增加新安裝的軟體路徑才能正常使用,如果安裝的軟體太多,那麼PATH就會特別長而且很亂,所以這種方式也不太好。checkinstall是一個原始碼安裝工具,它收集安裝資訊,並且生成deb軟體包,這使得所安裝的軟體可以用dpkg 來管理,dpkg -l xxx查詢,dpkg -P xxx解除安裝乾淨。
  • python 庫是必需的,很多外掛需要python。
  • ncurses 是獨立於終端基於文字的使用者介面庫,很多軟體需要呼叫它提供的api(比如:make menuconfig)。
  • build-essential 是編譯工具集,編譯原始碼基本少不了它。
  • cmake 是一個基於軟體原始碼自動生成Makefile的工具。
  • autoconf 是一個自動配置原始碼的工具,編譯universal-ctags時需要。
  • cscope 配合vim實現程式碼查詢跳轉軟體,這個不用說了,用vim的應該都知道。
  • global(gnu-global內部包含gtags、global、gtags-cscope)功能和cscope差不多,可以生成gtags資料庫,比cscope強的地方在於資料庫增量更新非常快,比ctags強的地方在於不僅能查詢定義還能查詢引用。
  • fonts-powerline 基於終端的字型,vim狀態列外掛ariline需要它(不然箭頭圖示等顯示不正確)。

2. 安裝vim8

vim8新增了非同步處理任務的特性,這使很多外掛任務執行時vim還可以正常編輯,不會卡頓。由於gutentags外掛需要vim8.0以上的版本才能工作,還有vim7更新GTAGS和cscope資料庫時也會導致vim卡住不動,及其影響編輯體驗,所以有必要安裝最新的vim8。

ubuntu16.04的官方軟體源目前沒有vim8的deb,ubuntu18.04雖然支援apt直接安裝vim8.0,但是預設安裝不支援python,所以建議使用原始碼安裝。

安裝步驟:

# 從github克隆最新vim原始碼
git clone https://github.com/vim/vim.git
# 進入原始碼目錄
cd vim
# 配置生成Makefile
./configure --with-features=huge \
            --enable-pythoninterp=yes \
            --with-python-config-dir=/usr/lib/python2.7/config-x86_64-linux-gnu/ \
            --enable-python3interp=yes \
            --with-python3-config-dir=/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu/ \
            --enable-rubyinterp=yes \
            --enable-luainterp=yes \
            --enable-perlinterp=yes \
            --enable-tclinterp=yes \
            --enable-multibyte \
            --enable-cscope \
            --enable-gui=gtk2
# 編譯
make -j8
# 安裝(輸入軟體說明一路回車)
sudo checkinstall
# 完成後刪除原始碼
cd ..
sudo rm -rf vim
# 使用dpkg檢視
dpkg -l vim
# 設定vim為預設編輯器(vi和editor預設呼叫vim)
sudo update-alternatives --install /usr/bin/editor editor /usr/local/bin/vim 50
sudo update-alternatives --set editor /usr/local/bin/vim
sudo update-alternatives --install /usr/bin/vi vi /usr/local/bin/vim 50
sudo update-alternatives --set vi /usr/local/bin/vim

vim

3. 安裝universal-ctags

# 從github克隆最新universal-ctags原始碼
git clone https://github.com/universal-ctags/ctags.git
# 進入原始碼目錄
cd ctags
# 執行自動配置指令碼
./autogen.sh
# 配置生成Makefile
./configure
# 編譯
make -j8
# 安裝(輸入軟體說明一路回車)
# checkinstall的時候版本號不能為空(可以填0.0.0)
sudo checkinstall
# 完成後刪除原始碼
cd ..
sudo rm -rf ctags
# 使用dpkg檢視
dpkg -l ctags

ctags

4. 安裝gnu-global

# 下載gnu-global原始碼
wget http://tamacom.com/global/global-6.6.2.tar.gz
# 解壓
tar xvf global-6.6.2.tar.gz
# 進入原始碼目錄
cd global-6.6.2
# 配置生成Makefile
./configure
# 編譯
make -j8
# 安裝(輸入軟體說明一路回車)
sudo checkinstall
# 完成後刪除原始碼
cd ..
sudo rm -rf global-6.6.2*
# 使用dpkg檢視
dpkg -l global

global

5. 安裝fonts-powerline

安裝

# 從github克隆最新powerline/fonts原始碼
git clone https://github.com/powerline/fonts.git --depth=1
# 進入原始碼目錄
cd fonts
# 執行安裝指令碼
./install.sh
# 完成後刪除原始碼
cd ..
rm -rf fonts

設定終端字型

  • ubuntu終端標題欄選擇 Edit >> ProfilePreference >> General >> Custom font
  • 選擇原來的字型替換成帶Powerline的同名字型 :
    powerline

6. 安裝vim-plug外掛管理器

vim-plug是一個類似於Vundle的vim外掛管理器,比Vundle更強大的地方在於支援全非同步併發安裝更新載入外掛,還有支援外掛按指定條件載入和延遲載入。

# 備份原來的vim配置
tar czvf vimbak.tar.gz ~/.vim ~/.vimrc
# 刪除vim配置檔案
rm -rf ~/.vim*
# 下載安裝vim-plug外掛
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

關於vim-plug怎麼使用這裡由於篇幅原因不細說,請參考一下連結:
https://vim.ink/vim-plug.html
https://www.jianshu.com/p/f4fb7877829f

7. 新增vimrc配置

需要的外掛

  • vim中文幫助手冊:yianwillis/vimcdoc
  • C++語法高亮增強:octol/vim-cpp-enhanced-highlight
  • 最近開啟的檔案維護外掛:vim-scripts/mru.vim
  • 狀態列外掛:
    vim-airline/vim-airline
    vim-airline/vim-airline-themes
  • Taglist外掛:vim-scripts/taglist.vim
  • 樹形目錄外掛:scrooloose/nerdtree
  • 通用函式外掛:vim-scripts/genutils
  • 查詢檔案外掛(依賴於genutils):vim-scripts/lookupfile
  • 自動更新tags外掛:ludovicchabant/vim-gutentags
  • 自動載入切換gtags資料庫:skywind3000/gutentags_plus
  • 預覽 quickfix 視窗 ctrl-w z 關閉:skywind3000/vim-preview
  • 程式碼補齊外掛:
    MarcWeber/vim-addon-mw-utils
    tomtom/tlib_vim
    garbas/vim-snipmate
  • 程式碼補齊模板:honza/vim-snippets
  • 自動補全外掛YCM:Valloric/YouCompleteMe
  • 非同步靜態程式碼檢查:w0rp/ale
  • 主題配色:
    morhetz/gruvbox
    mhinz/vim-janah
    nanotech/jellybeans.vim
    tomasr/molokai
    jpo/vim-railscasts-theme
    tpope/vim-vividchalk
    joshdick/onedark.vim

我的vimrc

" =============================================================================
" vim-plug外掛管理
" =============================================================================
call plug#begin('~/.vim/plug')

" vim中文幫助手冊
Plug 'yianwillis/vimcdoc'
" C++語法高亮增強
Plug 'octol/vim-cpp-enhanced-highlight'
" 最近開啟的檔案維護外掛
Plug 'vim-scripts/mru.vim'
" 狀態列外掛
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'

" Taglist外掛
Plug 'vim-scripts/taglist.vim', { 'on': 'TlistToggle' }
" 樹形目錄外掛
Plug 'scrooloose/nerdtree', { 'on':  'NERDTreeToggle' }

" 通用函式外掛
Plug 'vim-scripts/genutils'
" 查詢檔案外掛(依賴於genutils)
Plug 'vim-scripts/lookupfile'

" 自動更新tags外掛
Plug 'ludovicchabant/vim-gutentags'
" 自動載入切換gtags資料庫
Plug 'skywind3000/gutentags_plus', { 'on': 'GscopeKill' }
" 預覽 quickfix 視窗 ctrl-w z 關閉
Plug 'skywind3000/vim-preview', { 'on': 'GscopeKill' }

" 程式碼補齊外掛
Plug 'MarcWeber/vim-addon-mw-utils'
Plug 'tomtom/tlib_vim'
Plug 'garbas/vim-snipmate'
" 程式碼補齊模板
Plug 'honza/vim-snippets'

" 自動補全外掛YCM
Plug 'Valloric/YouCompleteMe', { 'do': './install.py --clang-completer',
            \ 'for': ['s', 'S', 'c', 'h', 'C', 'cpp', 'cc', 'cxx', 'py', 'go', 'java', 'js', 'php', 'sh'] }

" 非同步靜態程式碼檢查
Plug 'w0rp/ale', { 'for': ['s', 'S', 'c', 'h', 'C', 'cpp', 'cc', 'cxx', 'py', 'go', 'java', 'js', 'php', 'sh'] }

" 主題配色
Plug 'morhetz/gruvbox'
Plug 'mhinz/vim-janah'
Plug 'nanotech/jellybeans.vim'
Plug 'tomasr/molokai'
Plug 'jpo/vim-railscasts-theme'
Plug 'tpope/vim-vividchalk'
Plug 'joshdick/onedark.vim'

call plug#end() 

" =============================================================================
" 編碼相關
" =============================================================================
set termencoding=utf-8  " 設定終端顯示編碼
set encoding=utf-8      " 設定vim內部編碼
" 選單顯示編碼
set langmenu=zh_CN.UTF-8
" 設定可識別檔案編碼列表
set fileencodings=utf-8,gb2312,gbk,gb18030,cp936,utf-16,big5,latin1   

" =============================================================================
" 基本配置
" =============================================================================
" 開啟檔案型別檢查,根據不同的檔案型別載入不同的外掛採用不同的縮排
filetype plugin indent on
syntax on               " 開啟語法高亮
set t_Co=256            " 啟用256色
set nocompatible        " 不與vi相容(採用vim自己的操作命令) 
set background=dark     " 設定背景色
set cursorline          " 高亮游標所在行
" 高亮行顏色
highlight CursorLine cterm=Bold ctermbg=Black ctermfg=NONE guibg=Black guifg=NONE
"設定主題配色
"colorscheme gruvbox
"colorscheme janah
"colorscheme jellybeans
colorscheme molokai
"colorscheme railscasts
"colorscheme vividchalk
"colorscheme onedark
"colorscheme desert
"colorscheme torte
"colorscheme ron
set number              " 顯示行號
set laststatus=2        " 是否顯示狀態列(0,1,2)
set ruler               " 在狀態列顯示當前游標座標
set showmode            " 底行顯示當前處於哪種模式
set showcmd             " 命令模式下,在底行顯示鍵入的指令
set mouse=v             " 滑鼠模式(n,v,i,c,h,a,r,A)
set scrolloff=7         " 垂直滾動時游標距離頂部/底部的行數
set sidescrolloff=7     " 水平滾動時游標距離邊緣的字元數
set showmatch           " 游標遇到括號時自動高亮對應的另一個括號
set nobackup            " 不建立備份檔案
set noerrorbells        " 出錯時不要發出聲音
"set visualbell          " 出錯時發出視覺提示(通常時螢幕閃爍)
set history=1024        " 記錄歷史操作的數量
set autoread            " 開啟檔案監視,如果在編輯中的檔案被外部修改則提示
set autowrite           " 跳轉時自動儲存
" 檔案換行符檢測列表
set fileformats=unix,dos,mac
set foldenable          " 預設摺疊
set foldmethod=marker   " 摺疊方式
set guioptions-=T       " gvim不包含工具欄
set guioptions-=m       " gvim不使用選單欄
set guioptions-=r       " gvim不顯示右邊滾動條
set guioptions-=l       " gvim不顯示左邊滾動條
set helpheight=10       " 幫助視窗的最小高度
set helplang=cn,en      " 幫助手冊語言
set hidden              " 允許在有未儲存的修改時切換緩衝區
set nowrap              " 不自動折行
set helplang=cn         " 中文幫助優先
"自動向上遞迴查詢tags檔案
set tags=./tags;

" =============================================================================
" 編輯相關
" =============================================================================
set tabstop=4           " 製表符寬度(Tab空格數)
set softtabstop=4       " 軟製表符寬度(按Tab鍵和Backspace鍵時游標跳轉的空格數)
set shiftwidth=4        " 縮排寬度(空格數)
set expandtab           " 製表符替換為空格
set autoindent          " 自動縮排
set cindent             " 特別針對C語言的自動縮排
set cinoptions=:0       " 自動縮排方案
set smartindent         " 插入新行時自動縮排
" 啟用退格鍵刪除功能
set backspace=indent,eol,start
set whichwrap=h,l       "使用指定的左右移動游標鍵可以移到前一行和後一行
" 自動補全模式
set complete=.,w,b,u,t,i,d
" 自動補全選項
set completeopt=longest,menuone
set pumheight=10        " 自動補全選單顯示的最多專案數
" 檔案和目錄名補全忽略的檔案
set wildignore=*.bak,*.o,*.e,*~
set wildmenu            " 命令模式下,按Tab鍵補全命令
" 命令補全模式
set wildmode=longest:list,full
set hlsearch            " 查詢時高亮顯示匹配結果
set incsearch           " 查詢輸入時,每輸入一個字元,自動跳轉到第一個匹配結果
set ignorecase          " 查詢時忽略大小寫
set smartcase           " 針對只有首字母時大寫的查詢詞不忽略大小寫

" =============================================================================
" 自動命令
" =============================================================================
" 開啟檔案游標自動跳轉到上次關閉時的位置
autocmd BufReadPost *
    \ if line("'\"") > 0 && line("'\"") <= line("$") |
    \     exe "normal g'\"" |
    \ endif

" =============================================================================
" 快捷鍵
" =============================================================================
" Leader鍵設定
let mapleader=' '

" 使用分號進入命令模式
nnoremap ; :
vnoremap ; :

" 視窗切換快捷鍵
nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l
inoremap <C-h> <Esc><C-w>h
inoremap <C-j> <Esc><C-w>j
inoremap <C-k> <Esc><C-w>k
inoremap <C-l> <Esc><C-w>l

" 視窗大小調整
nnoremap + :resize +1<cr>
nnoremap _ :resize -1<cr>
nnoremap > :vertical resize +1<cr>
nnoremap < :vertical resize -1<cr>
 
" shell命令呼叫函式
function! RunShell(Msg, Shell)
	echo a:Msg . '...'
	call system(a:Shell)
	echon 'done'
endfunction

" vimgrep查詢字串
nmap <F6> :vimgrep /<C-R>=expand("<cword>")<cr>/ **/*.c **/*.h<cr><C-o>:cw<cr>
" 生成GTAGS資料庫檔案快捷鍵F8
nmap <F8> :call RunShell("Generate GTAGS.*", 'find . -name "*.[chsS]" -o -name "*.cpp" -o -name "*.cc" -o -name "*.C", -o -name "*.cxx"> gtags.files && gtags')<cr>
" 生成tags檔案快捷鍵F9 
nmap <F9> :call RunShell("Generate tags", "ctags -R --c-kinds=+lpxzL --c++-kinds=+lpxzLANU --fields=+niazS --extras=+q --output-format=e-ctags")<cr>
" 生成cscope資料庫檔案快捷鍵F10 
nmap <F10> :call RunShell("Generate cscope.*", 'find `pwd` -name "*.[chsS]" -o -name "*.cpp" -o -name "*.cc" -o -name "*.C", -o -name "*.cxx"> cscope.files && cscope -bkq')<cr>

" =============================================================================
" 外掛配置
" =============================================================================
" lookupfile.vim
" -----------------------------------------------------------------------------
" 生存filename.tags快捷鍵F7
nmap <F7> :call RunShell("Generate filename.tags", "genftag")<cr>
" 對映LookupFile快捷鍵
nmap <Leader>lt :LUTags<cr>
" 對映LUBufs快捷鍵
nmap <Leader>lb :LUBufs<cr>
" 對映LUWalk快捷鍵
nmap <Leader>lw :LUWalk<cr>  
" 最少輸入2個字元才開始查詢
let g:LookupFile_MinPatLength=2
" 不儲存上次查詢的字串
let g:LookupFile_PreserveLastPattern=0
" 儲存查詢歷史
let g:LookupFile_PreservePatternHistory=1
" 回車開啟第一個匹配專案
let g:LookupFile_AlwaysAcceptFirst=1
" 不允許建立不存在的檔案
let g:LookupFile_AllowNewFiles=0
" 關閉對搜尋結果的字母排序
let g:LookupFile_SortMethod=""
" 向上遞迴查詢tags檔案
let g:filename_tags=findfile("filename.tags", ".;")
" 設定tags檔案
if filereadable(g:filename_tags)
    let g:LookupFile_TagExpr='"'.g:filename_tags.'"'
endif
" 查詢忽略大小寫
function! LookupFile_IgnoreCaseFunc(pattern)
    let _tags = &tags
    try
        let &tags = eval(g:LookupFile_TagExpr)
        let newpattern = '\c' . a:pattern
        let tags = taglist(newpattern)
    catch
        echohl ErrorMsg | echo "Exception: " . v:exception | echohl NONE
        return ""
    finally
        let &tags = _tags
    endtry

    " Show the matches for what is typed so far.
    let files = map(tags, 'v:val["filename"]')
    return files
endfunction
let g:LookupFile_LookupFunc = 'LookupFile_IgnoreCaseFunc'

" mru.vim
" -----------------------------------------------------------------------------
" 開啟mru快捷鍵F4
nmap  <F4> :MRU<cr>

" man.vim
" -----------------------------------------------------------------------------
" 啟動man外掛
source $VIMRUNTIME/ftplugin/man.vim
" man 游標定位的函式
nmap <Leader>mm :Man <C-R>=expand("<cword>")<cr><cr>
" man 2 游標定位的函式
nmap <Leader>m2 :Man 2 <C-R>=expand("<cword>")<cr><cr>
" man 3 游標定位的函式
nmap <Leader>m3 :Man 3 <C-R>=expand("<cword>")<cr><cr>

" taglist.vim
" -----------------------------------------------------------------------------
" 設定開啟關閉快捷鍵F2
nmap  <F2> :TlistToggle<cr>
" 自動更新tags列表
let g:Tlist_Auto_Update=1
" 始終解析檔案中的tag,不管taglist視窗有沒有開啟
let g:Tlist_Process_File_Always=1
" 當taglist視窗是最後一個視窗時退出vim
let g:Tlist_Exit_OnlyWindow=1
" 只顯示一個檔案的tags
let g:Tlist_Show_One_File=1
" 視窗寬度
let g:Tlist_WinWidth=30
" 只顯示當前檔案的tags
let g:Tlist_Enable_Fold_Column=0
" 高亮顯示當前tag
let g:Tlist_Auto_Highlight_Tag=1
" 設定視窗顯示在右側
"let g:Tlist_Use_Right_Window=1
" 開啟時游標定位於taglist視窗
let g:Tlist_GainFocus_On_ToggleOpen=1

" NERDTree.vim
" -----------------------------------------------------------------------------
" 設定開啟關閉快捷鍵F3 
nmap  <F3> :NERDTreeToggle<cr>
" 視窗美化
let NERDChristmasTree=1
" 自動調整游標到視窗中心
let NERDTreeAutoCenter=1
" 指定滑鼠模式(1.雙擊開啟;2.單目錄雙檔案;3.單擊開啟)
let NERDTreeMouseMode=2
" 預設顯示檔案
let NERDTreeShowFiles=1
" 預設顯示隱藏檔案
let NERDTreeShowHidden=1
" 視窗位置('left' or 'right')
let g:NERDTreeWinPos="right"
" 視窗寬度
let g:NERDTreeWinSize=30
" 顯示行號
let g:NERDTreeShowLineNumbers=1
" 開啟檔案後關閉NERDTree視窗
let g:NERDTreeQuitOnOpen=1
" 高亮顯示當前行目錄或檔案
let NERDTreeHightCursorline=1

" cscope配置
" -----------------------------------------------------------------------------
" 更新cscope資料庫函式
function! UpdateCsdb(path)
    if (a:path != '') 
        execute "cd " . a:path
    endif
    call job_start("cscope -bkq")
    if (a:path != '') 
        execute "cd -"
    endif
    execute "silent cs reset"
endfunction

" 更新GTAGS資料庫函式
function! UpdateGtags(f)
    let g:dir = fnamemodify(a:f, ':p:h')
    execute "cd " . g:dir
    call job_start("global -u")
	execute "cd -"
endfunction

if executable('cscope')
    " 獲取GTAGS目錄
    let s:gtfile = system('global -pq')
	" 向上遞迴尋找cscope.files
    let g:csfile = findfile("cscope.out", ".;")

	" 如果存在cscope.out則獲取目錄
    if filereadable(g:csfile)
        " 設定cscope模式標誌
        let g:csflag = 0
        " 獲取cscope.out目錄
        let s:pathlen = strridx(g:csfile, "cscope.out")
		let g:cspath = strpart(g:csfile, 0, s:pathlen)
	" 如果存在cscope.out則獲取目錄
    elseif s:gtfile != ""
        " 設定cscope模式標誌
        let g:csflag = 1
        " 獲取GTAGS目錄
		let g:gtpath = strpart(s:gtfile, 0, strlen(s:gtfile) - 1)
    " 使用gutentags_plus
    else
        " 設定cscope模式標誌
        let g:csflag = 2
	endif

    " cscope程式位置
	if !exists("g:cspath") && executable('gtags-cscope')
        " 設定cscope對映的程式
        set csprg=/usr/local/bin/gtags-cscope
        if g:csflag == 1
            " 載入GTAGS
            execute 'silent cs add ' . g:gtpath . '/GTAGS'
            " 儲存檔案後自動更新GTAGS
            autocmd BufWritePost * call UpdateGtags(expand('<afile>'))
        else
            execute 'silent GscopeKill'
        endif
    else
        " 設定cscope對映的程式
        set csprg=/usr/bin/cscope
        " 自動命令查詢結果不使用quickfix視窗
        " autocmd BufReadPost * set cscopequickfix=""
        " 儲存檔案後自動更新GTAGS
        autocmd BufWritePost * call UpdateCsdb(g:cspath)
        " 載入cscope.out
    	set nocsverb
		execute 'cs add ' . g:csfile
    endif

    " 顯示新增資料庫結果
    set csverb
    " 使用cstag命令代替tag命令 
    set cst
    " 優先搜尋tags,失敗再搜尋cscope.out
    set csto=0
    " 顯示檔案路徑全名 
    set cspc=0
endif

" cscope當前視窗直接跳轉快捷鍵
nnoremap <Leader>fs :cs find s <C-R>=expand("<cword>")<cr><cr>
nnoremap <Leader>fg :cs find g <C-R>=expand("<cword>")<cr><cr>
nnoremap <Leader>fd :cs find d <C-R>=expand("<cword>")<cr><cr>
nnoremap <Leader>fc :cs find c <C-R>=expand("<cword>")<cr><cr>
nnoremap <Leader>ft :cs find t <C-R>=expand("<cword>")<cr><cr>
nnoremap <Leader>fe :cs find e <C-R>=expand("<cword>")<cr><cr>
nnoremap <Leader>ff :cs find f <C-R>=expand("<cfile>")<cr><cr>
nnoremap <Leader>fi :cs find i <C-R>=expand("<cfile>")<cr><cr>
nnoremap <Leader>fa :cs find a <C-R>=expand("<cword>")<cr><cr>

" cscope跳轉同時新建水平分割視窗快捷鍵
nnoremap <Leader>ss :scs find s <C-R>=expand("<cword>")<cr><cr>
nnoremap <Leader>sg :scs find g <C-R>=expand("<cword>")<cr><cr>
nnoremap <Leader>sd :scs find d <C-R>=expand("<cword>")<cr><cr>
nnoremap <Leader>sc :scs find c <C-R>=expand("<cword>")<cr><cr>
nnoremap <Leader>st :scs find t <C-R>=expand("<cword>")<cr><cr>
nnoremap <Leader>se :scs find e <C-R>=expand("<cword>")<cr><cr>
nnoremap <Leader>sf :scs find f <C-R>=expand("<cfile>")<cr><cr>
nnoremap <Leader>si :scs find i <C-R>=expand("<cfile>")<cr><cr>
nnoremap <Leader>sa :scs find a <C-R>=expand("<cword>")<cr><cr>

" cscope跳轉同時新建垂直分割視窗快捷鍵
nnoremap <Leader>vs :vert scs find s <C-R>=expand("<cword>")<cr><cr>
nnoremap <Leader>vg :vert scs find g <C-R>=expand("<cword>")<cr><cr>
nnoremap <Leader>vd :vert scs find d <C-R>=expand("<cword>")<cr><cr>
nnoremap <Leader>vc :vert scs find c <C-R>=expand("<cword>")<cr><cr>
nnoremap <Leader>vt :vert scs find t <C-R>=expand("<cword>")<cr><cr>
nnoremap <Leader>ve :vert scs find e <C-R>=expand("<cword>")<cr><cr>
nnoremap <Leader>vf :vert scs find f <C-R>=expand("<cfile>")<cr><cr>
nnoremap <Leader>vi :vert scs find i <C-R>=expand("<cfile>")<cr><cr>
nnoremap <Leader>va :vert scs find a <C-R>=expand("<cword>")<cr><cr>

" gutentags.vim && gutentags_plus.vim
" -----------------------------------------------------------------------------
" 搜尋工程目錄的標誌,碰到這些檔案/目錄名就停止向上一級目錄遞迴 "
let g:gutentags_project_root = ['.root', '.svn', '.git', '.project', 'workspace', 'cscope.out', 'GTAGS', 'tags', 'filename.tags']
" 所生成的資料檔案的名稱 "
let g:gutentags_ctags_tagfile = '.tags'
" tags模式設定
let g:gutentags_modules = []
if executable('ctags')
	let g:gutentags_modules += ['ctags']
endif
if g:csflag == 2 && executable('gtags-cscope')
	let g:gutentags_modules += ['gtags_cscope']
    " 游標定位於quickfix視窗
    let g:gutentags_plus_switch = 1
endif
" 將自動生成的 tags 檔案全部放入 ~/.cache/tags 目錄中,避免汙染工程目錄 "
let s:vim_tags = expand('~/.cache/tags')
let g:gutentags_cache_dir = s:vim_tags
" 檢測 ~/.cache/tags 不存在就新建 "
if !isdirectory(s:vim_tags)
   silent! call mkdir(s:vim_tags, 'p')
endif
" 配置ctags的引數 "
let g:gutentags_ctags_extra_args = ['--fields=+niazS', '--extras=+q']
let g:gutentags_ctags_extra_args += ['--c++-kinds=+lpxzLANU']
let g:gutentags_ctags_extra_args += ['--c-kinds=+lpxzL']
" 如果使用universal ctags需要增加下面一行
let g:gutentags_ctags_extra_args += ['--output-format=e-ctags']
" 禁用 gutentags 自動載入 gtags 資料庫的行為
" 避免多個專案資料庫相互干擾
" 使用plus外掛解決問題
let g:gutentags_auto_add_gtags_cscope = 0

" vim-preview.vim
if g:csflag == 2 && executable('gtags-cscope')
    " 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

" YouCompleteMe.vim
" -----------------------------------------------------------------------------
" 補全配置指令碼 
let g:ycm_global_ycm_extra_conf='~/.vim/.ycm_extra_conf.py'

" 彈出列表時選擇第1項的快捷鍵(預設為<TAB>和<Down>)
let g:ycm_key_list_select_completion = ['<C-n>', '<Down>']
" 彈出列表時選擇前1項的快捷鍵(預設為<S-TAB>和<UP>)
let g:ycm_key_list_previous_completion = ['<C-p>', '<Up>']
" 主動補全, 預設為<C-Space>
let g:ycm_key_invoke_completion = '<C-x>'
" 停止顯示補全列表(防止列表影響視野),可以按<C-Space>重新彈出
let g:ycm_key_list_stop_completion = ['<C-y>']

" 停止提示是否載入本地ycm_extra_conf檔案
let g:ycm_confirm_extra_conf = 0
" 語法關鍵字補全
let g:ycm_seed_identifiers_with_syntax = 1
" 開啟YCM 基於標籤引擎
let g:ycm_collect_identifiers_from_tags_files = 1
" 從第2個鍵入字元就開始羅列匹配項
let g:ycm_min_num_of_chars_for_completion = 2
" 開啟輸入註釋時補全
let g:ycm_complete_in_comments = 1
" 開啟輸入字串時補全
let g:ycm_complete_in_strings = 1
" 開啟註釋和字串中收集補全
let g:ycm_collect_identifiers_from_comments_and_strings = 1
" 關閉函式預覽
let g:ycm_add_preview_to_completeopt = 0
" 關閉程式碼診斷
let g:ycm_show_diagnostics_ui = 0
" 設定識別符號補全最小字元數
let g:ycm_min_num_identifier_candidate_chars = 2
" 設定以下語言自動彈出語義補全(預設需要輸入'.->::'或者按主動補全組合鍵)
let g:ycm_semantic_triggers =  {
			\ 'c,cpp,python,java,go,erlang,perl': ['re!\w{2}'],
			\ 'cs,lua,javascript': ['re!\w{2}'],
			\ }
" 白名單(以外的檔案型別不分析補全)
let g:ycm_filetype_whitelist = { 
			\ "s":1,
			\ "S":1,
			\ "c":1,
			\ "C":1,
			\ "cc":1,
			\ "cxx":1,
			\ "cpp":1,
			\ "py":1,
			\ "go":1,
			\ "java":1, 
			\ "objc":1,
			\ "sh":1,
			\ "zsh":1,
			\ "zimbu":1,
			\ }

" ALE.vim
" -----------------------------------------------------------------------------
"普通模式下警告跳轉快捷鍵
nmap <silent> <Leader>p <Plug>(ale_previous_wrap)
nmap <silent> <Leader>n <Plug>(ale_next_wrap)
"<Leader>x觸發/關閉語法檢查
nmap <Leader>x :ALEToggle<CR>
"<Leader>y檢視錯誤或警告的詳細資訊
nmap <Leader>y :ALEDetail<CR>
"始終開啟標誌列
"let g:ale_sign_column_always = 1
" 錯誤警告訊息格式
let g:ale_echo_msg_error_str = 'E'
let g:ale_echo_msg_warning_str = 'W'
let g:ale_echo_msg_format = '[%linter%] %s [%severity%]'
" 檔案開啟時不進行檢查
"let g:ale_lint_on_enter = 0
" 檔案修改時不進行檢查
let g:ale_lint_on_text_changed = 'never'
" 檔案儲存時進行檢查(預設)
"let g:ale_lint_on_save = 1
" 指定對應語言的檢查工具
"let g:ale_linters = {
"            \   'c++': ['clang'],
"            \   'c': ['clang'],
"            \   'python': ['pylint'],
"            \   'go': ['gofmt', 'golint'],
"            \}
" 關閉補全功能
let g:ale_completion_enabled = 0
" 使能airline狀態列擴充套件
let g:airline#extensions#ale#enabled = 1
" 禁用高亮顯示
"let g:ale_set_highlights = 0
" 自定義error和warning標誌
"let g:ale_sign_error = '✗'
"let g:ale_sign_warning = '⚡'

" airline.vim
" -----------------------------------------------------------------------------
" 設定主題
let g:airline_theme='bubblegum'
" 這個是安裝字型後必須設定此項"
let g:airline_powerline_fonts = 1
" 開啟標籤欄
let g:airline#extensions#tabline#enabled = 1
" 顯示緩衝區編號
let g:airline#extensions#tabline#buffer_nr_show = 1
" tabline中當前buffer兩端的分隔字元
"let g:airline#extensions#tabline#left_sep = ' '
" tabline中未啟用buffer兩端的分隔字元
"let g:airline#extensions#tabline#left_alt_sep = '|'
" 緩衝區切換快捷鍵
nnoremap <Leader>. :bn<cr>
nnoremap <Leader>, :bp<cr>
" 關閉狀態顯示空白符號計數"
let g:airline#extensions#whitespace#enabled = 0
" 狀態列顯示設定
if !exists('g:airline_symbols')
    let g:airline_symbols = {}
endif
" powerline symbols
let g:airline_left_sep = ''
let g:airline_left_alt_sep = ''
let g:airline_right_sep = ''
let g:airline_right_alt_sep = ''
let g:airline_symbols.branch = ''
let g:airline_symbols.readonly = ''
let g:airline_symbols.linenr = '☰'
let g:airline_symbols.maxlinenr = ''

說明:

  • 拷貝上文vimrc寫入新建的~/.vimrc,然後開啟vim,輸入命令 :PlugInstall 即可自動安裝外掛。
  • 由於YCM外掛有接近400M大小,下載很慢所以建議先註釋掉Plug ‘Valloric/YouCompleteMe’,等安裝完其餘外掛後再取消註釋單獨安裝YCM。
  • YCM下載需要等待一段時間,下載完成可進入~/.vim/plug/YouCompleteMe下執行:git submodule update --init --recursive檢查完整性
  • 使用 :PlugInstall 安裝YCM,會自動下載自動執行./inshall.py --clang-completer編譯,編譯過程中會自動下載libclang7.0,不需要系統手動安裝libclang,不過下載可能失敗,如果自動編譯不成功,需要進入:~/.vim/plug/YouCompleteMe目錄下手動執行:./inshall.py --clang-completer進行編譯。
  • 最後8行符號需要powerline字型才能顯示,可以參考.vim/plug/vim-airline/doc/airline.txt第300行左右的配置。
  • 安裝完成後效果:
    在這裡插入圖片描述

8. 使用

以下只介紹上文vimrc配置的功能如何使用,vim本身自帶的功能和操作不討論,有需要的同學請自行google。

快捷鍵

  • F2: 啟動左側Taglist視窗
  • F3: 開啟右側NerdTree視窗
  • F4: 開啟mru視窗顯示最近開啟過的檔案,選擇檔案回車開啟
  • F5: 視窗上方開啟LookupFile搜尋視窗,輸入檔名或者目錄名查詢檔案,Ctrl-N、Ctrl-P選擇,回車開啟
  • F6: 開啟vimgrep,輸入任意字元進行搜尋(相當於shell的grep命令)
  • F7: 在當前目錄下生成filename.tags檔案,LookupFile使用該檔案進行查詢,生成過程中vim不允許操作
  • F8: 在當前目錄下生成GTAGS資料庫相關檔案,gtags-cscope使用該資料庫進行程式碼查詢和跳轉
  • F9: 在當前目錄下生成tags檔案,供ctags使用
  • F10: 在當前目錄下生成cscope資料庫相關檔案,cscope基於cscope.out進行程式碼搜尋和跳轉
  • ; : 進入底行命令模式
  • Ctrl - h: 從當前視窗切換到左側視窗
  • Ctrl - l: 從當前視窗切換到右側視窗
  • Ctrl - k: 從當前視窗切換到上側視窗
  • Ctrl - j: 從當前視窗切換到下側視窗
  • Ctrl - x: 主動補全
  • Ctrl - y: 關閉補全列表
  • Ctrl - n: 補全列表向下選擇
  • Ctrl - p: 補全列表向上選擇
  • Shift - =: “+” 增加當前視窗高度
  • Shift - -: “_” 減小當前視窗高度
  • Shift - ,: “<” 減小當前視窗寬度
  • Shift - .: “>” 增加當前視窗寬度
  • 空格 lt: 開啟LookupFile按tags搜尋檔案
  • 空格 lb: 開啟LookupFile按vim緩衝區搜尋檔案
  • 空格 lw: 開啟LookupFile按目錄搜尋檔案
  • 空格 mm: man查詢當前游標所在函式
  • 空格 m2: man 2查詢當前游標所在函式(系統呼叫)
  • 空格 m3: man 3查詢當前游標所在函式(庫函式)
  • 空格 fs: 查詢並跳轉到當前游標所在識別符號出現的地方
  • 空格 fg: 查詢並跳轉到當前游標所在識別符號的定義處
  • 空格 fd: 查詢並跳轉到被當前游標所在函式呼叫的函式
  • 空格 fc: 查詢並跳轉到呼叫當前游標所在函式的地方
  • 空格 ft: 查詢並跳轉到當前游標所在的字串
  • 空格 fe: egrep模式查詢並跳轉到當前游標所在的字串
  • 空格 ff: 查詢並跳轉到當前游標所在的檔名
  • 空格 fi: 查詢並跳轉到當前檔案所包含的檔案
  • 空格 fa: 查詢並跳轉到當前游標所在的識別符號被賦值的地方
  • 空格 ss: 查詢並水平分割視窗跳轉到當前游標所在識別符號出現的地方
  • 空格 sg: 查詢並水平分割視窗跳轉到當前游標所在識別符號的定義處
  • 空格 sd: 查詢並水平分割視窗跳轉到被當前游標所在函式呼叫的函式
  • 空格 sc: 查詢並水平分割視窗跳轉到呼叫當前游標所在函式的地方
  • 空格 st: 查詢並水平分割視窗跳轉到當前游標所在的字串
  • 空格 se: egrep模式查詢並水平分割視窗跳轉到當前游標所在的字串
  • 空格 sf: 查詢並水平分割視窗跳轉到當前游標所在的檔名
  • 空格 si: 查詢並水平分割視窗跳轉到當前檔案所包含的檔案
  • 空格 sa: 查詢並水平分割視窗跳轉到當前游標所在的識別符號被賦值的地方
  • 空格 vs: 查詢並垂直分割視窗跳轉到當前游標所在識別符號出現的地方
  • 空格 vg: 查詢並垂直分割視窗跳轉到當前游標所在識別符號的定義處
  • 空格 vd: 查詢並垂直分割視窗跳轉到被當前游標所在函式呼叫的函式
  • 空格 vc: 查詢並垂直分割視窗跳轉到呼叫當前游標所在函式的地方
  • 空格 vt: 查詢並垂直分割視窗跳轉到當前游標所在的字串
  • 空格 ve: egrep模式查詢並垂直分割視窗跳轉到當前游標所在的字串
  • 空格 vf: 查詢並垂直分割視窗跳轉到當前游標所在的檔名
  • 空格 vi: 查詢並垂直分割視窗跳轉到當前檔案所包含的檔案
  • 空格 va: 查詢並垂直分割視窗跳轉到當前游標所在的識別符號被賦值的地方
  • p: 在gutentags_plus外掛啟動gtags-cscope跳轉快捷鍵換出qucikfix視窗是顯示游標所在行的預覽視窗
  • P: 在gutentags_plus外掛啟動gtags-cscope跳轉快捷鍵換出qucikfix視窗是關閉游標所在行的預覽視窗
  • 空格 u: quickfix視窗預覽視窗向上滾動
  • 空格 d: quickfix視窗預覽視窗向下滾動
  • 空格 x: 開啟/關閉語法檢查
  • 空格 y: 顯示語法錯誤或警告詳細資訊
  • 空格 p: 跳轉到上一處錯誤或警告
  • 空格 n: 跳轉到下一處錯誤或警告
  • 空格 .: 切換到下一個緩衝區(標籤欄下一個)
  • 空格 ,: 切換到下一個緩衝區(標籤欄上一個)

genftag指令碼

由於Lookupfile外掛預設基於ctags產生的索引進行查詢檔案,ctags本身除了檔案資訊還有大量的程式碼識別符號等其他資訊,這會使得Lookupfile查詢速度很慢,所以一般都是專門為Lookupfile建立一個只有檔案索引的tags檔案。為了方便使用,把建立Lookupfile專用tags檔案寫成一個shell指令碼放到~/.local/bin目錄下,命名為genftag,這樣只需要在專案根目錄下執行:./genftag 命令就可以生成filename.tags供Lookupfile使用了。

#!/bin/sh                                                                                                                                                                              
# generate filename tags for lookupfile plugin
(echo "!_TAG_FILE_SORTED        2       /2=foldcase/";
(find . -not -name '*.o' -not -wholename '*.svn*' -not -wholename '*.git*' -not -regex '.*\.\(png\|gif\)' -type f -printf "%f\t%p\t1\n" | \
sort -f)) > filename.tags

在~/.local/bin目錄下新建名為genftag的檔案,然後把上面的指令碼內容拷貝進去,儲存,然後執行:source ~/.profile 或者退出當前使用者重新登入系統,就可以在任意目錄下使用genftag命令了。

ctags的使用

在專案根目錄執行:ctags -R即可生成tags檔案,使用vim開啟專案目錄下的任何檔案都會自動向上遞迴尋找tags檔案然後載入。可以在vim裡輸入 :set tags 檢視當前載入的tags檔案路徑。

  • ctags在vim的操作:
    ctags -R :在當前目錄遞迴遍歷所有子目錄生成的tags檔案
    Ctrl - ] :跳轉到識別符號定義處
    Ctrl - T:跳轉返回
    vim -t tag:在tags目錄下直接用vim開啟tag變數或函式定義的地方
    :ts :列出所有tag列表
    :tn :跳轉到下一個tag處
    :tp :跳轉到上一個tag處

由於預設ctags -R命令會把所有檔案都包好進來,有很多是不需要的非程式碼檔案,這不但會導致tags檔案過大,而且還會影響生成tags的速度,同時影響查詢跳轉的效率,因為多了很多無關資訊。所以建議使用如下命令生成tags檔案:

ctags -R --c-kinds=+lpxzL --c++-kinds=+lpxzLANU --fields=+niazS --extras=+q --output-format=e-ctags

因為我們使用了universal-ctags,所以要加上 --output-format=e-ctags ,該選項表示生成相容exuberant-ctags格式的tags檔案。

gutentags外掛

  • 上一節手動生成tags的方式有一個巨大的不足,就是當你修改了某個檔案內容,tags檔案是不會自動更新的,必須返回tags目錄下手動更新tags,並且tags不支援增量更新,所以相當於重新生成一遍,速度很慢。
  • 為了解決這個問題,就引進了gutentags外掛,它支援修改儲存檔案的時候非同步自動更新tags,該外掛必需在vim8以上版本才能正常執行。
  • gutentags會從當前開啟檔案的目錄向上遞迴查詢專案根目錄,找到了就會在~/.cache/tags下生成對應專案的tags檔案,並且當使用vim開啟專案下的檔案時自動載入對應的tags,並且當修改儲存檔案時自動更新tags,而且是非同步完成更新,也就是更新過程中還可以正常使用vim,不會卡住不動。
  • gutentags查詢專案根目錄的依據是尋找特殊檔案,找到就認為該目錄是專案根目錄,這些特殊檔案可以自定義,參考上文vimrc配置裡面的gutentags外掛配置部分,以下是我的vimrc使用的特殊檔案列表:
    .root、.svn、.git、.project、workspace、cscope.out、GTAGS、tags、filename.tags
  • 所以如果想讓gutentags自動建立自動載入自動更新tags,就需要在工程目錄下存在以上特殊檔案,沒有的話直接touch一個.root空檔案就可以了

cscope和gtags-cscope

這兩個傢伙功能基本一致,使用方法也一樣,參考上面快捷鍵。關於cscope和gtags的介紹請自行google,本文不做詳細介紹。cscope使用方法可以在vim命令下輸入 :cscope help 獲得,配置項詳情可以通過 :help cscope 檢視,上文的vimrc已經配置好了中文vim幫助手冊,檢視任何配置項詳細介紹只需要在vim命令列輸入 :help xxx 即可。
上文vimrc實現了自動檢測cscope和gtags資料庫,並且自動載入,由於這兩者使用的快捷鍵一樣(空格 f、空格 s、空格v 三組快捷鍵),所以只能二選一,參考我的vimrc配置中關於cscope部分的詳細內容,規則如下:

  • 使用vim開啟檔案自動向上遞迴查詢cscope.out資料庫檔案
  • 如果找到,則設定cscopegprg = /usr/bin/cscope,自動載入cscope.out,不再載入GTAGS
  • 如果沒找到cscope.out,則設定cscopegprg = /usr/local/bin/gtags-cscope,並且從當前檔案目錄自動向上遞迴查詢GTAGS資料庫檔案
  • 如果找到,自動載入GTAGS
  • 如果沒找到GTAGS,則啟動gutentags_plus外掛,該外掛自動載入在~/.cache/tags/“工程目錄名”/ 下面的GTAGS資料庫,如果沒有該工程目錄,則gutentags外掛會依據生成tags的同樣規則(參考上一節)自動生成當前工程的GTAGS資料庫檔案
  • 如果gutentags沒有找到特殊檔案,從而沒法確定專案根目錄,則認為該檔案不屬於工程檔案,不載入GTAGS
    通過上述規則,vim可以自動判斷並加裝cscope和gtags,而且是優先是用cscope。

另外還有一點,如果啟用了gutentags_plus外掛,查詢跳轉快捷鍵不再是原來自定義的三組快捷鍵了(空格 f、空格 s、空格v 三組快捷鍵),因為gutentags_plus外掛本身定義了自己的快捷鍵,並且使用quickfix視窗來顯示查詢結果,而且可以按p預覽,P關閉預覽。啟用了gutentags_plus外掛的快捷鍵如下:

  • 空格 cs: 查詢當前游標所在識別符號出現的地方
  • 空格 cg: 查詢當前游標所在識別符號的定義處
  • 空格 cd: 查詢被當前游標所在函式呼叫的函式
  • 空格 cc: 查詢呼叫當前游標所在函式的地方
  • 空格 ct: 查詢當前游標所在的字串
  • 空格 ce: egrep模式當前游標所在的字串
  • 空格 cf: 查詢當前游標所在的檔名
  • 空格 ci: 查詢當前檔案所包含的檔案
  • 空格 ca: 查詢當前游標所在的識別符號被賦值的地方

預設不直接跳轉,而是開啟quickfix視窗顯示查詢結果,可以選擇某個結果按回車跳轉,也可以按p預覽。

最後

以上只大概介紹了本文的vim配置的部分功能,實際使用中的一些細節無法詳細描述,比如還有狀態列主題更換,ALE靜態程式碼檢查等等,需要自己親自體驗之後修改vimrc對應部分的配置來實現個性化。本文提供的vimrc基本上每部分都有註釋說明,各個配置詳細說明還可以通過vim中文幫助 :help xxx 來檢視。大家可根據自己需要自行修改。

關於tags、cscope.*、GTAGS、filename.tags等檔案的生成和刪除,個人建議在~/.bashrc下對映幾個常用命令:

# 建立tags檔案
alias genctag='ctags -R --c-kinds=+lpxzL --c++-kinds=+lpxzLANU --fields=+niazS --extras=+q --output-format=e-ctags'
# 建立cscope資料庫
alias gencsdb='find . -name "*.[ch]" -o -name "*.cpp" -o -name "*.cc" -o -name "*.C", -o -name "*.cxx"> cscope.files && cscope -bkq'
# 建立GTAGS資料庫
alias gengtag='find . -name "*.[ch]" -o -name "*.cpp" -o -name "*.cc" -o -name "*.C", -o -name "*.cxx"> gtags.files && gtags'
# 刪除tags檔案
alias clnctag='rm -rf tags'
# 刪除filename.tags檔案
alias clnftag='rm -rf filename.tags'
# 刪除GTAGS資料庫相關檔案
alias clngtag='rm -rf GTAGS GRTAGS GPATH gtags.files'
# 刪除cscope資料庫相關檔案
alias clncsdb='rm -rf cscope.*' 

設定好之後執行:source ~/.bashrc 或者退出終端重新登入即可在任意目錄下使用以上命令了。

vim還有無數本文沒介紹的各種功能外掛,有需要的同學請自行新增配置。