1. 程式人生 > >Linux 下閱讀原始碼工具(Vim + ctags+Cscope)

Linux 下閱讀原始碼工具(Vim + ctags+Cscope)

0. 寫在前面的廢話

開發環境遷移到了Ubuntu下,所有windows下好用的工具都要找個替代品。

windows下一直用 souce Insight 來閱讀原始碼,需要在Ubuntu下找個替代品。

上網看了看,貌似Vim + Ctags + Cscope不錯,安裝來試試 o(∩∩)o

1. 安裝

在我用的ubuntu中,這三個軟體都不是自帶的,需要手動安裝,很簡單用apt-get命令安裝就好了

$ sudo apt-get install vim

$ sudo apt-get install ctags

$ sudo apt-get install cscope

如下圖:

2. 使用

2.1 建立索引

在能自由搜尋之前,需要在你想要檢視原始碼的根目錄下建立索引,也就是執行兩條命令:

$ ctags -R

$ cscope-indexer -r

2.2 在vim 中使用ctag

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_ 這裡,'^'表示開頭,同理,'$'表示末尾。多個同名的識別符號

2.3 在vim中使用csope

好吧,貌似應該叫在csope中使用vim,前提條件還是要先建立索引(cscope-indexer -r),然後在原始碼根目錄執行csope命令

$ csope   ,效果如下圖

若干種查詢方式,隨便輸入點查詢內容,如i2c,按回車鍵,效果如下:

選擇想要開啟的檔案,輸入前面序號即可在vim中開啟它,之後就可以在vim中使用ctags快速的在函式間跳來跳去的了^_^

 上圖中 cscope 兩面板切換: tab

cscope退出: ctrl + d

//====================================================

補充如下操作,

全域性變數或者函式
1)將游標停留在一個函式或變數上,"ctrl+]",將直接跳轉到定義該函式的地方。

2)區域性變數跳轉
按gd 跳轉到定義出
ctrl+o 返回跳轉前的位置

3)有的時候 用vim 編輯檔案, 不小心按了 ctrl+z, 也就是除錯到後臺工作, 這時候要再切換回去 

可以這樣操作 : 直接輸入fg . 就可以切換回去.. 4) vim顯示行號:

     第一種是,手動顯示:在vim命令列模式下輸入  :set nu

      取消顯示:在vim命令列模式下輸入:  set nonu

      第二種是,永久自動顯示:我們修改一個配置檔案。

      找到.vimrc檔案,在最後增加set nu即可

5) ViM介面執行Shell命令 方法

vim中執行shell命令,有以下幾種形式

  1):!command

  不退出vim,並執行shell命令command,將命令輸出顯示在vim的命令區域,不會改變當前編輯的檔案的內容

  例如

  :!ls -l

  特別的可以執行:!bash來啟動一個bash shell並執行命令,不需要退出vim

  2):r !command

  將shell命令command的結果插入到當前行的下一行

  例如

  :r !date,讀取系統時間並插入到當前行的下一行。

  3):起始行號,結束行號 !command

  將起始行號和結束行號指定的範圍中的內容輸入到shell命令command處理,並將處理結果替換起始行號和結束行號指定的範圍中的內容

  例如

  :62,72 !sort,將62行到72行的內容進行排序

  可以只指定起始行,例如:62 !tr [a-z] [A-Z],將62行的小寫字母轉為大寫字母

  當前游標所在行,除可以指定行號外,也可以用.表示,例如:. !tr [a-z] [A-Z],將當前行的小寫轉為大寫

  4):起始行號,結束行號 w !command

  將起始行號和結束行號所指定的範圍的內容作為命令command的輸入。不會改變當前編輯的檔案的內容

  例如

  :62,72 w !sort,將62行到72行的內容進行排序,但排序的結果並不會直接輸出到當前編輯的檔案中,而是顯示在vim敲命令的區域

  特殊的可以下面這麼用

  :62 w !bash,將會把第62行的內容作為bash命令來執行並顯示結果,而且不會改變當前編輯的檔案的內容

  同樣的:. w !bash,將當前行的內容作為bash命令來執行

  例如52行內容為ls -l

  那麼輸入:52 w !bash就跟執行!ls -l是一樣的效果,如果你用的shell是bash shell

  如果輸入的是:52 !bash,那麼會把第52行的內容也就是ls -l作為命令執行,同時命令的輸出結果會替換第52行的內容,注意其中的區別。

6)Vim 中文亂碼問題

需要修改vim的配置,可以修改/etc/vim/vimrc,也可以修改~/.vimrc,加入如下內容:

  1. set fencs=utf-8,GB18030,ucs-bom,default,latin1
  2. 注意,對vimrc檔案的修改,當修改/etc/vim/vimrc檔案是對所有使用者有效,修改~/.vimrc只對當前使用者有效

7)

在vi的編輯模式下通過Ctrl+n,ctrl+p,可以實現單詞(給查單詞的部分字元)的自動補全和輸入提示的功能。

8) vi 歷史命令

q: 進入命令歷史編輯。
類似的還有 q/ 可以進入搜尋歷史編輯。
注意 q 後面如果跟隨其它字母,是進入命令記錄。

可以像編輯緩衝區一樣編輯某個命令,然後回車執行。
也可以用 ctrl-c 退出歷史編輯,但此時歷史編輯視窗不關閉,可以參照之前的命令再自己輸入。
用 :x 關閉歷史編輯並放棄編輯結果,也可以在空命令上回車相當於退出。
8)Vim中一般模式下輸入shift+# 能夠實現快速查詢