使用Vim+Ctags+Cscope閱讀源代碼

由於全部設計思想、內部機制都是
以代碼的形式實現,全部的資料也都是爲了更好的詮釋代碼。那麼一個好的閱讀工具,能
夠提升閱讀的效率和效果。
• "Cscope"[4]爲終端下的代碼閱讀工具,資源消耗少,對那些忠於命令行的行操做的人
,使用起來更加方便、靈活。這也是這篇文章推薦使用的一個重要緣由。也有人把
Cscope和Emasc綁定閱讀源碼。固然工具的選取,也取決於我的習慣。 php

Vim+Ctags+Cscope 正則表達式

cscope的工做須要vim、ctags的配合,它們都是基於命令行的。
下面只是給出了三種工具的經常使用方法,更多功能可查看man手冊,或者官方文檔。 數據庫

1、Vim
參考:http://oss.lzu.edu.cn/modules/lifetype/index.php?op=ViewArticle&articleId=1014&blogId=1 vim

2、Ctags
安裝: 函數

aptitude install ctags
在源代碼根目錄下執行 ctags -r 命令用來爲程序源代碼生成標籤文件,其-r選項表示遞
歸操做,同時爲子目錄也生成標籤文件。vim利用生成的標籤文件,能夠進行相應檢索、並
在不一樣的文件C語言元素之間來回切換。 工具

在vim中ctags的簡單使用
1) 跳轉到指定的函數進入vim後,用 「:tag func_name「 跳到函數func_name處。使用tag
命令時,可使用TAB鍵進行匹配查找,繼續按TAB鍵向下切換。
某個函數有多個定義時 this

:tag
跳到第一個定義處,優先跳轉到當前文件
:tnext
跳到第一個
:tfirst
跳到前count個
:[count]tprevious
跳到後count個
:[count]tnext
跳到最後一個
:tlast
你也能夠在全部tagname中選擇:
:tselect tagname spa

若是想跳到包含block的標識符:「tag /block」 而後用TAB鍵來選擇。這裏'/'就是告訴vim
'block'是一個語句塊標籤。
2)用「CTRL + ]「快捷鍵,跳轉到光標所在函數標識符的定義處。
3)使用「CTRL + T」退回上層。若是想在以write_開頭的標識符中選擇一下, :tselect /^
write_ 這裏,'^'表示開頭,同理,'$'表示末尾。多個同名的標識符 命令行

3、debian默認沒有安裝cscope 設計


1、安裝:atp-get install cscope


運行cscope命令,出現兩個面板,上方是一個查找結果的顯示面板,下方是一個查找條件
指定面板。使用TAB鍵在兩個面板間切換,也可以使用上下左右方向件和翻頁鍵在同一面板內
貼換位置。選中顯示面板的某個項,回車便可進入該文件,這是調用vim打開文件,這時就
能夠結合ctags使用了。固然也能夠直接使用vim打開文件,結合ctags閱讀源碼。
使用前,必須現使用「cscope-indexer -r」命令遞歸生成索引信息文件。特殊狀況下,還需
要用戶使用find命令,主動生成索引信息文件,並指定給cscope工具。 cscope提供了以下
九種查詢方式:

Find this C symbol:
#查找指定的C符號
Find this global definition:
#查找指定的全局定義
Find functions called by this function:
#查找指定函數調用的函數
Find functions calling this function:
#查找調用指定函數的函數
Find this text string:
#查找字符串
Change this text string:
#修改指定字符串
Find this egrep pattern:
#查找匹配字符
Find this file:
#查找指定文件
Find files #including this file:
#指定引用頭文件進行查找

在對應某一項中輸入查找條件,回車便可進行查詢,並將結果顯示在顯示面板。

 K跳轉到函數的man頁

  gg=G 按indent縮進格式化整個文件
== 格式化整行
=a{格式化當前{}程序塊

  gf 查找文件,在.vimrc中用set path=/u/infdev/**/**/** 來設置搜索路徑

  /* 折行功能能夠將一節濃縮爲一行, 只顯示其大概. */
zo 打開折行
zc 關閉摺疊

  在編輯模式下用ctrl+o能夠暫時進行命令模式

  [{ 命令跳轉到當前代碼塊的開頭,
]} 會跳轉到當前代碼塊的末尾.
[[ 向前查找一個函數的開始
]] 向後查找一個函數的開始
][ 向前查找一個函數的結尾,
[] 向後查找一個函數的結尾,
{   到前一個空行上
}   到下一個空行上
#   到與當前單詞相同的上一個單詞上
*   到與當前單詞相同的下一個單詞上
%   可讓光標從它當前所在的括號跳轉到與它相匹配的括號上去,

  CTRL+] 跳轉tags定義的地方=        ctrl+t返回調用tag的地方

  gD 查詢變量,只在本文件中
gd 查詢變量, 只在本函數中
       
[i        查詢變量的定義
[<Tab>    跳到變量定義的地方

  set makeprg=nmake  後面nmake可本身定義,通常不用定義
:make   編譯程序
:cnext 跳到下一個編譯錯誤
:cc   看完整的錯誤信息
:clist 看全部錯誤信息

  :e b<tab>在命令行用tab能夠補全  按ctrl+d列出全部匹配
q: 列出命令窗口
       
Vim有一種記錄宏的機制。你鍵入"qa"開始把一段宏記錄入寄存器變量`a'中。按下來你能夠象日常同樣鍵入你要的操做, 只是這些操做都會被Vim記錄進它命名爲`a'的宏中, 再次再下"q"鍵, 就結束了宏`a'的錄製。當你要重複執行你剛纔記錄的那些操做時只要使用"@a"命令。共有26個可用的寄存器供你記錄宏。


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

若是不是c代碼,使用:

$ find ./ -name "*.c" -or -name "*.h" -or -name "*.cpp" -or -name "*.S" | cscope -Rbq
這個命令會生成三個文件:cscope.out, cscope.in.out, cscope.po.out。其中cscope.out是基本的符號索引,後兩個文件是使用"-q"選項生成的,能夠加快cscope的索引速度。
具體的參數的含義能夠經過:man cscope 獲得。-R: 在生成索引文件時,搜索子目錄樹中的代碼

-b: 只生成索引文件,不進入cscope的界面

-q: 生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度

-k: 在生成索引文件時,不搜索/usr/include目錄

-i: 若是保存文件列表的文件名不是cscope.files時,須要加此選項告訴cscope到哪兒去找源文件列表。可使用「-」,表示由標準輸入得到文件列表。

-I dir: 在-I選項指出的目錄中查找頭文件

-u: 掃描全部文件,從新生成交叉索引文件


三在VIM中使用cscope
1 、用vim編輯的時候:
vim FILENAME.c
2 把生成的cscope文件導入到vim中來
:cs add /路徑/cscope.out 代碼所在目錄
我習慣現切換到代碼所在目錄再操做,因此直接使用:
:cs add cscope.out 就能夠了。

3 查看是否已經鏈接到對應數據庫
:cs s


4 cs f s xxxx 查找xxxx出現的地方,它能詳細列出哪些文件的哪行的哪一個函數引用,以及該行的內容.
,首先調用「cscope add」命令添加一個cscope數據庫,而後就能夠調用「cscope find」命令進行查找了。VIM支持8種cscope的查詢功能,以下:例如,咱們想在代碼中查找調用work()函數的函數,咱們能夠輸入:「:cs find c work」,回車後發現沒有找到匹配的功能,可能並無函數調用work()。咱們再輸入「:cs find s work」,查找這個符號出現的位置,如今vim列出了這個符號出現的全部位置。咱們還能夠進行字符串查找,它會雙引號或單引號括起來的內容中查找。還可 以輸入一個正則表達式,這相似於egrep程序的功能。

s: 查找C語言符號,即查找函數名、宏、枚舉值等出現的地方

g: 查找函數、宏、枚舉等定義的位置。
cs f g main 光標跳到main函數的位置

d: 查找本函數調用的函數
cs f d main 列出main函數調用的函數,輸入函數所對應的數字,就能夠調到相應掉用的函數

c: 查找調用本函數的函數
cs f c main 會輸出找到沒有匹配的結果,由於沒有函數調用main函數

t: 查找指定的字符串
cs f t STRING

f: 查找並打開文件

相關文章
相關標籤/搜索