Language

Friday, October 12, 2012

Emacs etags 簡介


這也是筆者多年前發表在 NNTP news 上的文章,留存備份。

etags 簡介 -*- Outline -*-

* 前言
  有許多的 IDE(Integrated Development Environment) 都提供了函數名稱的
  自動完成功能( 亦即,輸入前面幾個字元之後,編輯器可以自動幫你完成後面
  的函數名稱)。Vi 裡面有 ctags 可以做到這件事,那麼 Emacs 呢?答案是
  etags. 在這篇文章裡,我會簡短的介紹如何使用 etags.

* etags 使用方法
** 建立函數及關鍵字列表
   在使用之前,你必須先在你的發展環境目錄底下建立列表; 假設你的發展環
   境目錄名稱叫做 /path/to/developer/, 建立列表的方法如下:

   % cd /path/to/developer/
   % etags *.h *.c

   這樣就建立完成了,根據 etags/ctags 的手冊, etags/ctags 可以處理的語
   言有 C, Objective C, C++, Java, Fortran, Ada, Cobol, Erlang, LaTeX,
   Emacs Lisp/Common Lisp, makefiles, Pascal, Perl, Postscript,
   Python,  Prolog, Scheme  and most assembler-like  syntaxes.
   預設的列表檔名是 TAGS.

** 把函數及關鍵字列表讀進 Emacs
   開始用 Emacs 編輯檔案, 比如說你正在編輯 foo.c, 你先用 C-x C-f 把
   foo.c 讀進來之後,你需要使用 etags 的功能,那麼你就執行
   M-x visit-tags-table /path/to/developer/TAGS
   把 /path/to/developer/TAGS 檔案讀進來。註: 表示 Return 鍵,或
   是在鍵盤上通常標示為 Enter.

** 在 Emacs 中搜尋函數內容
   有的時候我們會想要直接跳到某個函數裡面去修改他的內容,你可以使用
   M-. (沒錯,就是 Meta 跟一個句點) 然後輸入函數名稱就會跳到該函數的
   code 那裡去; 如果你按 M-. 的時候游標指著一個函數名稱,你可以在輸入
   函數名稱的時候直接按 即可跳到該函數源碼的地方。跳過去之後,如
   果你想要回來原來地方,你可以用 M-* 來做到。

   如果你想要在另一個視窗內看到該函數源碼,而不是你現在的這個視窗(對照
   方便), 那麼你可以用 C-x 4 . TAG 來達成這件事。

   如果你要搜尋某些函數與關鍵字,你可以用 M-x tags-search 的功能,這個
   可以用 regular expression 來搜尋。當你用 M-x tags-search
   REGEXP 之後,你可以用 M-, (Meta 逗點), 找下一個搜尋到的函數名
   或關鍵字。

** 函數及關鍵字自動完成
   etags 並沒有提供函數及關鍵字自動完成(auto-completion)的功能, 但是
   Emacs 有提供一個功能可以達成這件事,叫做 dynamic abbreviation
   expansion. 這個功能事實上是把去找在開啟的 buffer 裡面有那些字串是你
   輸入字串的完整字串,而 TAGS 列表就在一個 buffer 裡面,所以可以達成
   函數及關鍵字自動列表。當你輸入一個函數名稱或是一個變數名稱的前面幾
   個字母,比如說: foo-, 然後按 M-/, 這時候 Emacs 會把所有可能的字串找
   到,並把第一個可能的字串直接完成,所以你按了一次 M-/ 之後可能會變成
   foo-bar-function, 你繼續按 M-/ 可以變換成其他可能的字串,直到沒有為
   止。或者是你也可以按 C-M-/, 這時候 Emacs 會像其他時候的
   auto-completion 的行為一樣,跳出一個視窗把所有的可能列表列出來給你
   選擇。

* 結語
  當我開始使用 etags 的功能之後,我就沒有辦法不用這個功能了,因為實在
  是太方便了。etags 也可以幫你自動完成標準函式庫裡的名稱,只要你在
  etags 的時候把 /usr/include 裡的表頭檔案也包含進來就可以了。etags 還
  有其他比較進階的功能,我沒有一一列出來,有興趣的人可以去看看 M-x
  info 裡的 Emacs 手冊。最後我做一個這次提到的功能列表,供讀者參考用。

* 按鍵列表
  M-x visit-tags-table TAGS-file
      把 TAGS-file 檔案讀進 Emacs
  M-. TAG 尋找函數或關鍵字定義的源碼
  C-x 4 . TAG 在另一個視窗尋找函數或關鍵字定義
  M-* 回到尋找關鍵字定義之前的地方
  M-x tags-search REGEXP 用正規表示式搜尋函數或關鍵字定義
  M-, 找下一個搜尋到的函數或關鍵字
  M-/ 自動完成可能的函數或關鍵字
  C-M-/ 列出所有函數或關鍵字名稱的自動完成列表

No comments: