Vim:打造Linux程序員的編輯利器(ctags+cscope+taglist+code_complete)

http://smilejay.com/2012/10/vim-for-linux-programmer/


在2年前,寫過一篇文章“Vim:打造Linux C/C++程序員的編輯器”,先在根據這兩年的Vim使用經驗對其進行一些補充和完善,以便在使用Vim時(偶爾忘記配置或快捷鍵)作爲參考。經過適當的配置,配合一些快捷鍵,VIM會成爲Linux上一個代碼閱讀、編輯的強大工具。

所謂“工欲善其事,必先利其器”,所謂“磨刀不誤砍柴工“。
在Linux下,vim是一種最常見的編輯器,很多linux的發行版就自帶了(不過 Ubuntu目前時需要自己安裝的,默認只帶了vi)。今天搞了半天了Vim,通過幾個插件來武裝我的vim,使其能向傳說中的一樣成爲C/C++程序員的利器。
通過配置和插件,實現的功能有:語法高亮+自動縮進+函數自動補全+變量/函數的跟蹤+列出源代碼中的函數/變量等
用到的工具有:Vim+.vimrc配置文件+code_complete+ctags+taglist+cscope
使用效果:http://files.myopera.com/mbbill/files/code_complete.gif (亦在本文末尾處)
PS:這個效果非常炫的!~
這裏不詳細介紹Vim的各個插件的快捷鍵使用,只是列舉一下自己的常用用法,也算個筆記吧。後面會有轉載幾篇文章詳細描述各個插件的詳細情況(太多了,其實我也記不住)。

vim 下載地址:http://www.vim.org
code_complete.vim插件http://www.vim.org/scripts/script.php?script_id=1764
ctags 一般安裝完vim後都會有,ubuntu中好像是沒附帶安裝,需要下載:http://www.vim.org/scripts/script.php?script_id=610
taglist 下載:http://www.vim.org/scripts/script.php?script_id=273
cscope 到其主頁下載:http://cscope.sourceforge.net/
Ubuntu下安裝這些包的命令爲:

$sudo apt-get install vim
$sudo apt-get install ctags  (exuberant-ctags)
$sudo apt-get install cscope

一. vim 基本配置

1、配置文件的位置

在目錄 /etc/vim/ 下面,有個名爲vimrc的文件,這是系統中公共的vim配置文件,對所有用戶都有效。而在每個用戶的主目錄($HOME)下,都可以自己建立私有的配置文件(僅對這個用戶有效),命名爲:“.vimrc”。例如,/root目錄下,通常已經存在一個.vimrc文件。我就是在自己的$HOME目錄下新建了了.vimrc文件來配置的。

2、設置語法高亮顯示

1) 打開.vimrc,添加以下語句來使得語法高亮顯示:
syntax on
2) 如果此時語法還是沒有高亮顯示,那麼在/etc目錄下的profile文件中添加以下語句:
export TERM=xterm-color

3、設置C/C++自動縮進(添加以下set語句到.vimrc中)

1)不討論製表符寬度爲8還是爲4個空格較好,這裏設置(軟)製表符寬度爲8(Linus在規定Linux kernel中C代碼的風格):
set tabstop=8
set softtabstop=8
2)設置縮進的空格數爲8
set shiftwidth=8
另外,“set expandtab”選項會將TAB展開(被替換)爲對應個數的空格,我一般不推薦設置這個選項。
3)設置自動縮進:即每行的縮進值與上一行相等;使用 noautoindent 取消設置:
set autoindent
4)設置使用 C/C++ 語言的自動縮進方式:
set cindent
5)設置C/C++語言的具體縮進方式(如下設置,僅作參考):
set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s
6)如果想在左側顯示文本的行號,可以用以下語句:
set nu
PS:自動縮進有兩個選項:”set autoindent” 與 “set cindent”.
autoindent 就是自動縮進的意思,當你在輸入狀態用回車鍵插入一個新行,或者在 normal 狀態用 o 或者 O 插入一個新行時,autoindent 會自動地將當前行的縮進拷貝到新行,也就是“自動對齊”,當然了,如果你在新行沒有輸入任何字符,那麼這個縮進將自動刪除。
cindent 就不同了,它會按照 C 語言的語法,自動地調整縮進的長度,比如,當你輸入了半條語句然後回車時,縮進會自動增加一個 TABSTOP 值,當你鍵入了一個右花括號時,會自動減少一個 TABSTOP 值。

二. code_complete 配置

把下載的code_complete.vim拷貝到plugin目錄下,一般都在(我的是)/usr/share/vim/vim72/plugin下 (不同的vim版本vim72可能時其他,我的目前時7.2版本)
在vim中使用<Tab> 鍵就可以觸發補全函數原型,插入代碼片段等。具體補全的快捷鍵的定義(如in代表#include ” “),見:code_complete.vim文件中的定義。

三. ctags的使用

用ctags命令生成tags文件,ctags -R –-C-kinds=+p –-fields=+S /usr/include 應該算是建立索引表(默認會在當前目錄生成tags文件),然後把生成的tags文件拷貝到你編程的目錄。
注意:ctags -R 後面不加上絕對路徑,就時建立當前目錄的下所有文件的索引,那麼建立的索引文件中都是寫的相對路徑,你將tags文件拷貝到其他目錄去用時,它就會找不到相應的函數/變量等。
注意:運行vim的時候,必須在”tags”文件所在的目錄下運行。否則,運行vim的時候還要用”:set tags=”命令設定”tags”文件的路徑,這樣vim才能找到”tags”文件。
-R”表示遞歸創建,也就包括源代碼根目錄下的所有子目錄下的源程序。
“tags”文件中包括這些對象的列表:
用#define定義的宏
枚舉型變量的值
函數的定義、原型和聲明
名字空間(namespace)
類型定義(typedefs)
變量(包括定義和聲明)
類(class)、結構(struct)、枚舉類型(enum)和聯合(union)
類、結構和聯合中成員變量或函數

VIM用這個”tags”文件來定位上面這些做了標記的對象,下面介紹一下定位這些對象的方法:
1) 用命令行。在運行vim的時候加上”-t”參數,例如:
[/home/admin/src]$ vim -t foo_bar
這個命令將打開定義”foo_bar”(變量或函數或其它)的文件,並把光標定位到這一行。
2) 在vim編輯器內用”:ta”命令(是”tag”命令的縮寫),例如:
:ta foo_bar
3) 最方便的方法是把光標移到變量名或函數名上,然後按下”Ctrl-]”。用”Ctrl-o”退回原來的地方。
在Vim中運行“:help tags”可以查詢到ctags的用法。

四. cscope的配置與使用

可以用$ sudo apt-get install cscope命令來安裝;
也可以從http://cscope.sourceforge.net/下載最新的cscope源碼,對其進行編譯和安裝是比較簡單的,如下所示。

[root@linux cscope-15.8a]# ./configure
[root@linux cscope-15.8a]# make
[root@linux cscope-15.8a]# make install
[root@linux cscope-15.8a]# /usr/local/bin/cscope --version
/usr/local/bin/cscope: version 15.8a

也許在“make”編譯是可能會報一些語法的錯誤,比如curses.h文件沒找到,就需要安裝“ncurese-dev”這個軟件包。
在需要建立cscope索引的源碼目錄下,運行“cscope -Rbq . ”(我常用的)命令即可生成cscope索引。
然後用Vim打開一個c源程序文件,在vim中運行命令“:cs add cscope.out”來加載索引文件(如果運行Vim時所在目錄中就有cscope.out,則Vim會自動加載cscope索引)。使用“cs”開頭的命令(如常見的“:cs fine XX YY)就可以使用強大的cscope功能了。
對於“cs find”支持的查詢命令簡單描述如下:

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

例如:”:cscope find s kvm_assign_device”、”:cs f g kvm_assign_device”、”:cs f d kvm_assign_device”等等(注:cscope命令縮寫爲cs,而fine縮寫爲f)。

在~/.vimrc中添加set cscopequickfix=s-,c-,d-,i-,t-,e-
這樣通過:cs find xxx查找某個符號後,會立即跳轉到第一個找到該符號出現的位置;

另外,可以在vim命令行下鍵入“:copen”來打開quickfix窗口,來顯示所有出現的位置(即 查找結果)。

在vim中,執行“:cs help”命令可以顯示cscope的命令幫助手冊。

ctags和cscope在Linux世界中是非常流行的,在Linux kernel中的Makefile就專門定義了“tags”和“cscope”這兩個目標的,可以直接“make tags”生成tags文件,可以直接“make cscope”生成cscope索引文件,如下所示。

[root@linux linux.git]# make help | grep -E '(tags|cscope)'
  tags/TAGS       - Generate tags file for editors
  cscope          - Generate cscope index
  gtags           - Generate GNU GLOBAL index
[root@linux linux.git]# make tags
  GEN     tags
[root@linux linux.git]# ll tags
-rw-r--r-- 1 root root 138602743 Oct 19 14:10 tags
[root@linux linux.git]# make cscope
  GEN     cscope
[root@linux linux.git]# ll cscope.*
-rw-r--r-- 1 root root    652930 Oct 19 14:10 cscope.files
-rw-r--r-- 1 root root 267625646 Oct 19 14:11 cscope.out
-rw-r--r-- 1 root root  53239808 Oct 19 14:11 cscope.out.in
-rw-r--r-- 1 root root 384600480 Oct 19 14:11 cscope.out.po

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,這樣你不用切換到你數據庫文件的目錄也可以使用它了。

五. taglist的配置和使用

下載taglist壓縮包,並解壓,

$sudo cp plugin/taglist.vim /usr/share/vim/vim72/plugin/ 
$sudo cp doc/taglist.txt /usr/share/vim/vim72/doc/

當然,如果僅對當前用戶有效,則可以複製上面的文件到 $HOME/.vim/ 目錄下。

打開vim,用 “:helptags .”來配置好幫助文件;重啓vim,用“:TlistToggle”來打開和關閉 taglist窗口。

也可以用“:TlistOpen”命令打開並將輸入焦點至於標籤列表窗口,“:TlistClose”命令 關閉 tag列表窗口;

可以用“:help taglist”來獲得更多幫助信息。

另外,在左側打開了標籤列表窗口,可以用“ctrl-W + W”來進行源碼窗口和標籤窗口之間切換(其本質也是一個Vim的普通窗口)。

下圖演示了一下VIM強大的C/C++程序代碼編輯能力,動心了嗎?馬上開始使用VIM吧。
a powerful VIM editor



vim插件管理工具

vim插件管理工具——vim-addons

通過vim-addons,我們可以管理vim插件。我們在$ sudo apt-get install vim vim-scripts vim-doc時,一般會自動安裝上vim-addons。若未安裝可通過$ sudo apt-get install vim-scripts vim-doc vim-addon-manager手動安裝。安裝完成後,就可以用vim-addons管理vim插件了。

可以通過命令行下運行$ vim-addons status查看系統中已有的vim-scripts中包含的插件及其狀態(這裏似乎不會包含手動安裝的插件):

jeremy@ENVY:~$ vim-addons status
# Name                     User Status  System Status
align                       removed       removed     
alternate                   removed       removed     
bufexplorer                 removed       removed     
calendar                    removed       removed     
closetag                    removed       removed     
colors sampler pack         removed       removed     
cvsmenu                     removed       removed     
debPlugin                   removed       removed     
detectindent                removed       removed     
doxygen-toolkit             removed       removed     
editexisting                removed       removed     
enhanced-commentify         removed       removed     
gnupg                       removed       removed     
info                        removed       removed     
justify                     removed       removed     
lbdbq                       removed       removed     
markdown-syntax             removed       removed     
matchit                     removed       removed     
minibufexplorer             installed     removed     
nerd-commenter              removed       removed     
omnicppcomplete             installed     removed     
po                          removed       removed     
project                     installed     removed     
python-indent               removed       removed     
secure-modelines            removed       removed     
snippetsEmu                 removed       removed     
sokoban                     removed       removed     
supertab                    removed       removed     
surround                    removed       removed     
taglist                     installed     removed     
tetris                      removed       removed     
utl                         removed       removed     
vcscommand                  removed       removed     
vimplate                    removed       removed     
whatdomain                  removed       removed     
winmanager                  removed       removed     
xmledit                     removed       removed

此時,我們要安裝vim官方插件,即可通過下面的命令(xxxx代碼上面列出來的插件名稱):

$sudo vim-addons install xxxx

關於vim-addons命令的詳細用法,可以通過“man vim-addons”查看其幫助文檔。



參考資料:

http://blog.chinaunix.net/u2/74761/showart_1096872.html
http://www.linuxsir.org/bbs/showthread.php?p=2095747#post2095747 (vim很強大功能的介紹)
http://linux.chinaunix.net/bbs/thread-1036769-1-1.html
http://blog.chinaunix.net/u/553/showart_288387.html
http://zhwen.org/?p=articles/cscope-tags
http://blog.xuyu.org/?p=1147 (關於taglist)
將Vim改造爲強大的IDE — Vim集成Ctags/Taglist/Cscope/Winmanager/NERDTree/OmniCppComplete(有圖有真相)

發佈了49 篇原創文章 · 獲贊 24 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章