在閱讀源碼的時候一個好的工具能使效率提高很多。在這,關於工具我就不多說了,vim+ctags+cscope,我這裡主要想介紹一下,這個組合工具的一些提示,這裡有從網上找到了(在此,謝謝那些前輩們的辛勞),也有自己積累的,總之,記錄下來吧。 cscope的工作需要vim、ctags的配合,它們都是基於命令列的。 下面只是給出了三種工具的常用方法,更多功能可查看man手冊,或者官方文檔。 一、Vim 參考:http://oss.lzu.edu.cn/modules/lifetype/index.php?op=ViewArticle&articleId=1014&blogId=1 二、Ctags 安裝: aptitude install ctags 在原始碼根目錄下執行 ctags -r 命令用來為程式原始碼產生標籤檔案,其-r選項表示遞 歸操作,同時為子目錄也產生標籤檔案。vim利用產生的標籤檔案,可以進行相應檢索、並 在不同的檔案C語言元素之間來回切換。 在vim中ctags的簡單使用 1) 跳轉到指定的函數進入vim後,用 “:tag func_name“ 跳到函數func_name處。使用tag 命令時,可以使用TAB鍵進行匹配尋找,繼續按TAB鍵向下切換。 某個函數有多個定義時 :tag 跳到第一個定義處,優先跳轉到當前檔案 :tnext 跳到第一個 :tfirst 跳到前count個 :[count]tprevious 跳到後count個 :[count]tnext 跳到最後一個 :tlast 你也可以在所有tagname中選擇: :tselect tagname 如果想跳到包含block的標識符:“tag /block” 然後用TAB鍵來選擇。這裡'/'就是告訴vim 'block'是一個語句塊標籤。 2)用“CTRL + ]“快速鍵,跳轉到游標所在函數標識符的定義處。 3)使用“CTRL + T”退回上層。如果想在以write_開頭的標識符中選擇一下, :tselect /^ write_ 這裡,'^'表示開頭,同理,'$'表示末尾。多個同名的標識符 三、debian預設沒有安裝cscope 一、安裝: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個可用的寄存器供你記錄宏。 二為代碼產生資料庫 2、首先需要為你的代碼產生一個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資料庫,然後就可以調用“cscopefind”命令進行尋找了。VIM支援8種cscope的查詢功能,如下:例如,我們想在代碼中尋找調用work()函數的函數,我們可以輸入:“:csfind c work”,斷行符號後發現沒有找到匹配的功能,可能並沒有函數調用work()。我們再輸入“:cs find swork”,尋找這個符號出現的位置,現在vim列出了這個符號出現的所有位置。我們還可以進行字串尋找,它會雙引號或單引號括起來的內容中尋找。還可以輸入一個Regex,這類似於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: 尋找並開啟檔案
還有在.vimrc下面加上了鍵盤對應 map <F8> :Tlist<CR> 這樣就可以使用快速鍵F8直接進入tlist模式了。這裡注意<F8>和 : 之間有空格的。 在.vimrc下加入一下兩行 set tags=tags; set autochdir 這樣使用tags時可以首先在目前的目錄下尋找tags檔案,如果沒有則轉到父目錄尋找。依次向上。 |