About me

Wednesday, 2 March 2016

ctags&Taglist

  • Introduction
有用過一些IDE來寫程式的人,應該都很熟悉像source insight (如下圖)這樣子的介面,
左邊有變數, 常數, 宣告和函數的導覽,右邊則是主程式視窗,
然後看到想追的code就可以看誰呼叫他的還是函數原型 ,
其實這些vim+Plugin也可以做的到,但是也許沒有像這些IDE那麼強大,但是有些功能用習慣以後,其實也很方便。

List

~~~~~~~~~~~~~~~~~以下正文~~~~~~~~~~~~~~~~~



  • 安裝 Ctags
兩個方式安裝ctag
apt-get
sudo apt-get install exuberant-ctags

tar-ball
http://ctags.sourceforge.net/ 下載,像是目前(2016.03.02)最新版本是ctags-5.8.tar.gz
以下老梗四步驟(不清楚的話就請看INSTALL檔):

  • 解壓縮
  • tar -zvxf ctags-5.8.tar.gz
  • cd ctags-5.8

  • 組態設定
  • ../configure 

  • 編譯
  • make

  • 安裝
  • sudo make install

  • 安裝taglist
網站位於http://www.vim.org/scripts/script.php?script_id=273,上面有說要怎麼安裝,
目前最新的版本是taglist_46.zip

  • 解壓縮
  • unzip taglist_46.zip

  • 複製檔案
  • cp ./plugin/taglist.vim ~/.vim
  • cp ./doc/taglist.txt ~/.vim 

  • 設定vimrc
我們想要有個快捷鍵,一按就可以開啟taglist的介面,
所以需要修改vimrc設定檔:
(以下設定都是以local user為主,如果想要用root去安裝請自行修改成/etc/vim/vimrc,而不是~/.vimrc)
  • vim ~/.vimrc
加入底下這一行
  • map <f9> :Tlist<CR>

  • 產生ctag檔
要查字典,總要先把字典準備好吧!
假設我現在要修改一支driver檔案。

所以我必須先要準備linux kernel的ctag,
到kernel的根目錄下,然後下指令(會等一陣子):
  • ctags -R *

然後你就會發現有個檔案「tags」出現了:

  • 實際使用
我們來嘗試編輯一個hid mouse driver看看:
  • vim drivers/hid/usbhid/usbmouse.c

讀取catgs file
一般來說,進入vim 的command mode以後,輸入:
  • :set tags=./tags
就會把tags檔案給讀進來了,又或者你有兩個以上的tag,用逗號隔開就好,如下:
  • :set tags=./tags,./TAGS,tags,TAGS

但是因為我們剛剛有設定快捷鍵,所以只要按F9就好了,ctag如果在一樣的路徑就會自己讀進來了,畫面就會如下

其實這樣子的畫面呈現就是利用本身vim的split語法,將畫面給切割成兩邊,有興趣的可以參考這一篇「

兩邊視窗切換


兩邊要切換有兩種方式
1.  Ctrl + w 然後在按w,就會切換到另一邊。
2. Ctrl + w然後在按左右鍵,看你要切換哪一邊。

假設你現在要到某個函數去,假設要到「usb_mouse_irq」去,就把游標移到左邊視窗的「usb_mouse_irq」處,然後按Enter就好,你就會發現右邊的source code已經到相對應的地方了。

察看函數定義
假設現在我們對usb_mouse_irq這個funciton有興趣,我們要看他的定義跟source code,我們把游標移到右邊的函數名稱去,然後按下「Ctrl + ]」 ,如果ctags有順利讀取進來的話,也沒什麼太大問題的話,你就會發現視窗已經到函數定義那邊去了,如下。

又或者你可以直接在command mode輸入以下:
  • :ta input_report_key
他也會直接跳到函數定義去,但是我想,直接按兩個鍵還是比較方便吧,所以這個就參考就好了。

跳回原本函數
函數察看完了,我想要在跳回剛剛的usb_mouse_irq怎麼辦?簡單,只要按下「Ctrl + t」他就會自己跳回去了


目前有幾個函數?

如果直接在左邊taglist的function上按空白鍵,就會看到底下會有訊息說,
目前這份檔案有多少個函數,如下:

然後如果直接在函數名稱上按空白鍵,底下會出現函數原型(prototype):

不只一個函數定義
有時候遇到函數名稱重複時,那要怎麼去查看哪個才是自己需要的呢?
這就要用到指令ts了,假設我們有個函數叫作「mch_delay」:
  • :ts mch_delay
然後會出現如下訊息:
清楚看到3個函數定義在不同的檔案裡,所以這時選擇1~3在按下Enter就好。

那有沒有辦法直接快速的直接這3個定義直接上一個下一個的切換呢?答案是有:

Jump to next matching tag
  • :tn
Jump to previous matching tag
  • :tp


這東西也真是博大精深,
如果想要在了解更多的細節的話,請查閱:
  • :help tagstack

  • ref

No comments:

Post a Comment