1. 程式人生 > >vim環境搭建:安裝vimgdb、使用ctags

vim環境搭建:安裝vimgdb、使用ctags

1.安裝vimgdb
vim中無法使用gdb除錯,安裝vimgdb(vim的gdb補丁版),可以直接在vim中用gdb除錯,參考 vi/vim使用進階: 在VIM中使用GDB除錯 – 使用vimgdb

2.使用Vundle管理外掛
vim很多功能需要使用外掛,使用Vundle方便管理外掛
安裝Vundle:建立 目錄~/.vim/bundle,以後Vundle自動下載的外掛都儲存在這裡。然後,進入 Bundle 目錄,使用 git clone 命令:git clone http://github.com/gmarik/vundle.git ~/.vim/bundle/vundle 下載Vundle,最後在~/.vimrc中新增如下配置:

  1 #using vundle need filetype off, and set nocompatible
  2 filetype off
  3 set nocompatible
  4 set rtp+=~/.vim/bundle/vundle
  5 call vundle#rc()
  6 
  7 Bundle 'gmarik/vundle'
  8 
  9 "my bundles here
 10 Bundle 'altercation/vim-colors-solarized'
 11 Bundle 'taglist.vim'
 12 Bundle 'The-NERD-TREE'
 13 Bundle 'minibufexpl.vim'
 14 Bundle 'OmniCppComplete'
 15 "
bundles end

vundle常用命令:
+ BundleInstall -安裝列表中全部外掛
+ BundleInstall! -更新列表中全部外掛
+ BundleClean -清除列表中沒有的外掛
+ BundleSearch foo -查詢foo外掛
+ BundleSearch -列出所有可用的外掛,可以在列表中搜索、安裝
+ BundleList -列舉出列表中(.vimrc中)配置的所有外掛

3.使用ctags
ctags可以對程式碼中的函式,全域性變數,巨集定義,結構體(類)建立關鍵字索引,以實現快速查詢。使用時,需要先在原始碼目錄下生成tags檔案,然後把tags檔案路徑加到vim的tags變數裡set tags=~/path/tags

[[email protected] src]$ ctags -R --c-kinds=+px --fields=+iaS --extra=+q  *.c *.h

vim中執行,set tags=~/path/tags或者寫在.vimrc檔案裡

另外,為了檢視系統函式需要生成系統函式的tags,命令如下:

ctags -I  __THROW -I __attribute_pure__ -I __nonnull -I __attribute__ -I __attribute_malloc__ -I __wur --file-scope=yes --langmap=c:+.h --languages=c,c++ --links=yes --c-kinds=+p --c++-kinds=+p --f    ields=+iaS --extra=+q  -f ~/.vim/systags /usr/include/* /usr/include/sys/* /usr/include/bits/*  /usr/include/netinet/* /usr/include/arpa/*

生成的tag檔案~/.vim/systags,然後新增到tag路徑
設定好tag後,就可以使用ctrl+]來跳轉了.

tags有一個小技巧,在vimrc檔案中set tags=tags; (注意有分號),在vi中使用定位快捷鍵時會先在當前目錄中查詢tags檔案,找不到的話,就會到父目錄中找,依次類推.

ctags常用快捷鍵和命令:

命令 用途
ctrl+] 跳轉到游標所在關鍵字的第一處標籤
g ctrl+] 如果有多個標籤會列出來供選擇,如果只有一個,則直接跳轉
:tag {keyword} 跳轉到keyword的第一處標籤
:tjump {keyword} 如果有多個標籤會列出來供選擇,如果只有一個,則直接跳轉
:pop 或者只ctrl+t 反向遍歷標籤位置
:tag 正向遍歷標籤位置
:tnext 跳到下一個匹配的標籤
:tprev 跳到上一個匹配的標籤
:tfirst 跳到第一個匹配的標籤
:tlast 跳到最後一個匹配的標籤
:tselect 列出標籤列表

4.外掛taglist
taglist用於顯示開啟的檔案中定義的全域性變數、巨集、函式命令,
常用命令:

  • :TlistOpen 開啟taglist視窗
  • :TlistClose 關閉taglist視窗
  • :TlistToggle 在開啟和關閉間切換,可以定義快捷鍵,如map <C-F12> :TlistToggle<cr>

taglist視窗中的快捷鍵:

  • : 跳到游標下tag所定義的位置
  • +開啟一個摺疊,同zo
  • - 將tag摺疊起來,同zc
  • *開啟所有的摺疊,同zR
  • =將所有tag摺疊起來,同zM
  • o 在新視窗下開啟tag所在的位置
  • 在視窗底部顯示游標下tag的原型定義
  • [[跳到前一個檔案的tag處
  • ]]跳到後一個檔案的tag處

在.vimrc中配置let Tlist_Use_Right_Window = 1可以使taglist視窗顯示在右側

5.外掛The-NERD-tree

  • P 跳到根結點
  • p 跳到父結點
  • 展開或者合攏目錄、或者跳到當前檔案
  • o 在已有視窗中開啟檔案、目錄或書籤,並跳到該視窗
  • go 在已有視窗 中開啟檔案、目錄或書籤,但不跳到該視窗
  • i split 一個新視窗開啟選中檔案,並跳到該視窗
  • gi split 一個新視窗開啟選中檔案,但不跳到該視窗
  • s vsplit 一個新視窗開啟選中檔案,並跳到該視窗
  • gs vsplit 一個新 視窗開啟選中檔案,但不跳到該視窗
  • x 合攏選中結點的父目錄
  • X 合攏選中結點下的所有目錄

6.外掛mimibufferexplore
mimibufferexplore會在其視窗中顯示buf中的檔案列表,
.vimrc中的配置如下:

$HOME/.vimrc 中新增如下配置
let g:miniBufExplMapWindowNavVim = 1 
let g:miniBufExplMapWindowNavArrows = 1 
let g:miniBufExplMapCTabSwitchBufs = 1 
let g:miniBufExplModSelTarget = 1

命令:
+ :bn 開啟下一個buf
+ :bp 開啟前一個buf
+ :b n是數字,第n個buf

7.外掛OmniCppComplete

8.外掛supertab

9.使用cscope
ctags只能跳轉到函式的定義處,cscope可以查詢函式被呼叫的地方;

  • 安裝.
    如果沒有安裝cscope,需要先安裝,下載原始碼Cscope的主頁,三步安裝。

  • 生成索引資料庫
    在要程式碼目錄下執行cscope -Rbq,會生成三個檔案:cscope.out, cscope.in.out, cscope.po.out;cscope在生成資料庫時,在專案目錄中未找到的標頭檔案,會自動到/usr/include目錄中查詢。如果你想阻止它這樣做,使用”-k“選項。
    cscope預設只解析C檔案(.c和.h)、lex檔案(.l)和yacc檔案(.y),如果需要為其它檔案生成索引,需要把所有需要解析的檔案新增到cscope.files中,當cscope發現在當前目錄中存在cscope.files時,就會為cscope.files中列出的所有檔案生成索引資料庫,注意cscope.files需要儲存檔案的完整路徑,防止在其它檔案路徑失效。
    下表中列出了cscope的常用選項:
    -R: 在生成索引檔案時,搜尋子目錄樹中的程式碼
    -b: 只生成索引檔案,不進入cscope的介面
    -q: 生成cscope.in.out和cscope.po.out檔案,加快cscope的索引速度
    -k: 在生成索引檔案時,不搜尋/usr/include目錄
    -i: 如果儲存檔案列表的檔名不是cscope.files時,需要加此選項告訴cscope到哪兒去找原始檔列表。可以使用”–“,表示由標準輸入獲得檔案列表。

  • 使用
    首先在vim中新增資料庫cs add cscope.out;
    :cs show可以顯示cscope的連線的資料庫,:cs kill num斷開編號為num的連線;
    查詢命令:
    :cs find {querytype} {name}
    其中,{querytype} 取如下值:
    s —— 查詢這個C符號
    g —— 查詢這個定義
    d —— 查詢被這個函式呼叫的函式(們)
    c —— 查詢呼叫這個函式的函式(們)
    t —— 查詢這個字串
    e —— 查詢這個egrep匹配模式
    f —— 查詢這個檔案
    i —— 查詢#include這個檔案的檔案(們)

  • 選項設定

    • csprg(cscopecscopeprg)選項用於設定cscope程式的位置。
    • cscopecscopequickfix設定是否使用quickfix視窗來顯示cscope的結果,
      執行set cscopequickfix=s-,c-,d-,i-,t-,e-後,可以使用quickfix的Ctrl-n / Ctrl-P 跳轉到後一項和前一項紀錄,詳情請”:help cscopequickfix“;
    • cst(cscopecscopetag),如果你想vim同時搜尋tag檔案以及cscope資料庫;
    • csto(cscopecscopetagorder)選項決定是先查詢tag檔案還是先查詢cscope資料庫。設定為0則先查詢cscope資料庫,設定為1先查詢tag檔案。我通常設定為1,因為在tag檔案中查詢到的結果,會把最佳匹配列在第一位。
      可以在 .vimrc中增加如下設定:
" cscope setting
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
if has("cscope")
  set csprg=/usr/bin/cscope
  set csto=1
  set cst
  set nocsverb
  " add any database in current directory
  if filereadable("cscope.out")
      cs add cscope.out
  endif
  set csverb
endif