vim最簡約配置

提供一個可以方便的在linux下查看源碼,並且學習成本低,使用複雜度低的vim配置。

不用插件的配置

如果你不想使用任何插件,那麼下面的配置基本上夠用。

” 環境

set nocompatible

” 通用

set background=dark
syntax on
filetype off
set autochdir

” UI

set cursorline
set linespace=0
set number
set showmatch
set incsearch
set hlsearch
set ignorecase
set smartcase

” 編碼

set encoding=utf-8

” 格式

set autoindent
set shiftwidth=4
set expandtab
set tabstop=4
set softtabstop=4
set cindent
set smartindent

加上通用插件的配置

基本上是所有linux都自帶的,不需要額外安裝的插件,也就是說只需要在.vimrc裏面配置幾行參數就可以直接使用。

ctags

ctags 在使用vim編程和瀏覽代碼是非常有用,可以用CTRL+]和CTRL+t 來回跳轉關鍵字。
先生成自己工作目錄的tags,最簡單粗暴用法:

cd yourworkdir
ctags -R *

這樣會生成一個tags文件。不過,這種有個問題,成員變量沒有包含在裏面。所以自動完成對象的成員時沒有提示。解決辦法:

ctags -R --fields=+iaS --extra=+q * 
–fields=[+|-]flags

–fields指定tags的可用擴展域(extension fields),以包含到tags入口。
i:繼承信息Inheritance information
a:類成員的訪問控制信息 Access (or export) of class members
S: 常規簽名信息,如原型或參數表 Signature of routine(e.g. prototype or parameter list)

–extra=[+|-]flags

–extra指定是否包含某種擴展信息到tags入口。
q:包含類成員信息(如c++,java,Eiffel)。
但就算是C 語言的結構,也需要這兩個參數設置才能獲取成員信息,這樣就能自動完成結構和類的成員了。

手動指定tags文件

在vim命令行中輸入或者修改.vimrc文件 。

如果經常在不同工程裏查閱代碼,那麼可以在~/.vimrc中添加:
set autochdir
需要使用當前編輯文件所在文件夾裏的tags文件。
set tags=./tags("./" 的意思是,vim解析時,碰到 "./" 會被替換成當前編輯文件所在的文件夾。)
set tags=./tags;(tags後面有一個分號,代表 “向上搜索”,你需要搜索tag的時候,它會首先在你當前文件所在的文件夾(不是當前文件夾)裏面搜索名爲 tags的文件,沒有的話,往上一級目錄,再沒有的話,再往上一級目錄,直到搜索到根目錄爲止。
如果要引用多個不同目錄的tags文件。
set tags=path1, path2...(可以用逗號隔開)
set tags+=path1(添加+號)
set tags+=path2
需要應用vim工作目錄裏的tags文件。
set tags=tags(代表在 “當前文件夾”,也就是打開vim時的工作目錄。linux每個程序運行時都會綁定一個所謂的工作路徑)

跳轉到指定函數

在變量或函數處 ctrl+] 來跳轉到變量或者函數定義的地方。ctrl+t返回到跳轉前的位置。或者使用命令:tag func_nameshi 來跳轉到變量或者函數定義的地方。ctags不會生成局部變量的索引。:tags會列出查找/跳轉過程。

ctags的侷限性

tags文件只能查看函數,類或變量的定義,而沒有被調用信息。如果要知道一個函數在什麼地方被使用,需要使用cscope工具。添加的tags最好是source code的索引,對於include頭文件索引沒有效果。

配置

用戶vim配置文件~/.vimrc添加tags文件路徑:
set tags=./tags;,tags

cscope

cscope是一個類似ctags的工具。ctags利用tag文件,跳轉到標籤定義的地方。但如果想查找函數在哪裏被調用,或者標籤在哪些地方出現過,ctags就無能爲力了,這時需要使用更爲強大的cscope。

用法

cscope的用法很簡單,首先需要爲你的代碼生成一個cscope數據庫。在你的項目根目錄運行下面的命令:

cscope -Rbq 

這些選項的含義見後面。這個命令會生成三個文件:cscope.out, cscope.in.out, cscope.po.out。其中cscope.out是基本的符號索引,後兩個文件是使用”-q“選項生成的,可以加快cscope的索引速度。在缺省情況下,cscope在生成數據庫後就會進入它自己的查詢界面,我們一般不用這個界面,所以使用了”-b“選項。如果你已經進入了這個界面,按CTRL-D退出。cscope在生成數據庫中,在你的項目目錄中未找到的頭文件,會自動到/usr/include目錄中查找。如果你想阻止它這樣做,使用”-k“選項。

cscope缺省只解析C文件(.c和.h)、lex文件(.l)和yacc文件(.y),雖然它也可以支持C++以及Java,但它在掃描目錄時會跳過C++及Java後綴的文件。如果你希望cscope解析C++或Java文件,需要把這些文件的名字和路徑保存在一個名爲cscope.files的文件。當cscope發現在當前目錄中存在cscope.files時,就會爲cscope.files中列出的所有文件生成索引數據庫。通常我們使用find來生成cscope.files文件。

find . -name "*.h" -o -name "*.c" -o -name "*.cpp" -o -name "*.cc" > cscope.files
cscope -bkq -i cscope.files

上面的cscope命令並沒有使用”-R“參數遞歸查找子目錄,因爲在cscope.files中已經包含了子目錄中的文件。

注1:find命令輸出的文件以相對路徑表示,所以cscope.out的索引也相對於當前路徑。如果你要在其它路徑中使用當前的cscope.out,需要使用下面介紹的-P選項。
注2:cscope只在第一次解析時掃描全部文件,以後再調用cscope,它只掃描那些改動過的文件,這大大提高了cscope生成索引的速度。

常用選項

-R: 在生成索引文件時,搜索子目錄樹中的代碼
-b: 只生成索引文件,不進入cscope的界面
-q: 生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度
-k: 在生成索引文件時,不搜索/usr/include目錄
-i: 如果保存文件列表的文件名不是cscope.files時,需要加此選項告訴cscope到哪兒去找源文件列表。可以使用”–“,表示由標準輸入獲得文件列表。
-I dir: 在-I選項指出的目錄中查找頭文件
-u: 掃描所有文件,重新生成交叉索引文件
-C: 在搜索時忽略大小寫
-P path: 在以相對路徑表示的文件前加上的path,這樣,你不用切換到你數據庫文件所在的目錄也可以使用它了。

在vim中使用cscope非常簡單,首先調用”cscope add“命令添加一個cscope數據庫,然後就可以調用”cscope find“命令進行查找了。

8種查詢功能

s: 查找C語言符號,即查找函數名、宏、枚舉值等出現的地方
g: 查找函數、宏、枚舉等定義的位置,類似ctags所提供的功能
d: 查找本函數調用的函數
c: 查找調用本函數的函數
t: 查找指定的字符串
e: 查找egrep模式,相當於egrep功能,但查找速度快多了
f: 查找並打開文件,類似vim的find功能
i: 查找包含本文件的文件

源代碼中查找調用test()函數的函數,我們可以輸入:”:cs find c test“,回車後發現沒有找到匹配的功能,可能並沒有函數調用test()。我們再輸入”:cs find s test“,查找這個C符號出現的位置,現在vim列出了這個符號出現的所有位置。我們還可以進行字符串查找,它會雙引號或單引號括起來的內容中查找。還可以輸入一個正則表達式,這類似於egrep程序的功能,但它是在交叉索引數據庫中查找,速度要快得多。

注3:現在版本linux上的vim默認都支持cscope,在/etc/vimrc可以看到有如下配置:

if has("cscope") && filereadable("/usr/bin/cscope")
    set csprg=/usr/bin/cscope
    set csto=0
    set cst
    set nocsverb
    " add any database in current directory
    if filereadable("cscope.out")
        cs add cscope.out
    " else add database pointed to by environment
    elseif $CSCOPE_DB != ""
        cs add $CSCOPE_DB
    endif
    set csverb
endif

配置

用戶vim配置文件~/.vimrc添加快捷鍵映射:

nmap <C-@>s :cs find s <C-R>=expand("<cword>")<CR><CR>
nmap <C-@>g :cs find g <C-R>=expand("<cword>")<CR><CR>
nmap <C-@>c :cs find c <C-R>=expand("<cword>")<CR><CR>
nmap <C-@>t :cs find t <C-R>=expand("<cword>")<CR><CR>
nmap <C-@>e :cs find e <C-R>=expand("<cword>")<CR><CR>
nmap <C-@>f :cs find f <C-R>=expand("<cfile>")<CR><CR>
nmap <C-@>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>
nmap <C-@>d :cs find d <C-R>=expand("<cword>")<CR><CR>

加上其他插件的配置

下面這幾個插件也是看代碼必須的,非常有用,但是需要額外安裝,安裝方法十分簡單。先安裝bundle,這個教程網上到處都有。然後基於bundle就可以輕鬆安裝taglist和nertree了。到此爲止就算配完了,非常簡單。

bundle

用來進行插件管理的插件,安裝後可以方便的安裝下面taglist和nertree等插件。

taglist

基於ctags,在vim代碼窗口旁以分割窗口形式顯示當前的代碼結構概覽。

nerdtree

能夠在vim下瀏覽文件系統的所有文件,並能夠打開文件。

總結

基本上有了上述插件,看自己開發目錄的項目源碼是不成問題了。而且整個配置下來也不復雜,比較容易理解和掌握。有的配置雖然用起來很方便,但是複雜度不是一點半點,反倒適得其反。

vim看代碼經驗

  • 不要把系統相關的源碼或者龐大的第三方庫源碼也用ctags或者cscope處理帶進源碼閱讀,干擾視聽,保持查看代碼的最小化。
  • linux編程常用函數可以通過shift+k去進行查看,凡是通過man命令可以看的都可以通過shift+k跳轉。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章