探索Emacs SpeedBar

jollywing發表於2014-05-16
作者: Jolly Wing(jiqingwu@gmail.com)
生成: 2014-05-16 週五
轉載請保留作者資訊

簡介

從Emacs 23.2開始,Speedbar也變成了Emacs自帶的元件。
imenu類似,
它也能顯示檔案內容的索引,但比imenu更強大一些。

M-x speedbar 會開啟一個窄而高的導航視窗,裡面顯示的是檔案列表,點選每個檔案前的 +,能展開檔案內的索引。
有的索引項還能夠進一步展開,點選不能在展開的索引項,就能跳轉到檔案內對應的位置。
用滑鼠用 speedbar 還是很方便的。

再次 M-x speedbar 會關閉speedbar視窗。在speedbar視窗按 q也會關閉speedbar視窗。

至於怎麼使用,在speedbar視窗點右鍵,彈出的選單已經夠詳細了。

要想讓speedbar隨Emacs一起啟動,在啟動檔案里加上

(speedbar 1)

speedbar的顯示模式

speedbar有多種模式,可以顯示以樹形結構顯示檔案和目錄,也可以顯示當前活躍的buffer。
你可以在speedbar視窗點右鍵進入 Display的子選單進行模式切換。

在顯示檔案模式下,speedbar可以作為檔案管理器使用。快捷鍵如下:

  • U 進入上層目錄
  • C 拷貝檔案
  • D 刪除檔案
  • R 重新命名

在顯示緩衝區的模式時,也可以管理buffer。
k 刪除buffer,r 重新從硬碟讀取內容到buffer。

針對特別的緩衝區,speedbar會進入特別的模式。
比如你在檢視emacs手冊,speedbar會進入info模式,列出所有手冊的節點和子節點,方便你閱讀手冊。

以上說的都是皮毛,下面講點實在的,主要講講speedbar的工作原理。

speedbar和imenu

speedbar使用什麼資料生成的索引呢?
它不僅使用imenu的分析結果,也使用 etags (Emacs自帶的生成tags的工具) 和 semantic (Emacs自帶的用elisp實現的分析語法的工具)的分析結果。

預設情況下,speedbar使用的是imenu分析的結果。

我們可以通過檢視 speedbar-supported-extension-expressions 變數的值,
(C-h v speedbar-supported-extension-expressions RET)
看看 speedbar 能分析哪些型別的檔案。

speedbar和etags

怎樣讓speedbar使用etags分析檔案內容?
有一個變數 speedbar-use-imenu-flag 控制 speedbar 使用imenu還是etags分析原始檔。
預設情況下這個變數的值是 t,即使用 imenu 的分析結果。
將這個變數值設為 nil,speedbar會使用etags分析檔案。

(setq speedbar-use-imenu-flag nil)

其實etags的分析結果好不到哪去。而且etags支援的檔案型別很少。
C-h v speedbar-fetch-etags-parse-list RET檢視一下
speedbar-fetch-etags-parse-list 的值, 結果如下:

(("\.\([cChH]\|c\+\+\|cpp\|cc\|hh\|java\|cxx\|hxx\)\`" . speedbar-parse-c-or-c++tag)
 ("^\.emacs$\|.\(el\|l\|lsp\)\`" . "def[^i]+\s-+\(\(\w\|[-_]\)+\)\s-*")
 ("\.tex\`" . speedbar-parse-tex-string)
 ("\.p\`" . "\(\(FUNCTION\|function\|PROCEDURE\|procedure\)\s-+\([a-zA-Z0-9_.:]+\)\)\s-*(?^?"))

看以看到,etags分析支援的檔案只有 c/c++, java, lisp(elisp), tex, pascal幾種。

speedbar和semantic

真正強悍的是speedbar和semantic的結合。
怎麼讓speedbar使用semantic的分析結果?

  1. 啟動semantic,M-x semantic-mode
  2. 執行 (require `semantic/sb),讓speedbar使用semantic的分析結果。

再開啟一個c/c++的原始檔看看,speedbar中的索引細緻多了。
用imenu和etags分析的索引只有類和函式。類的成員函式都分析不出來。
現在類的成員,全域性變數和函式(包括函式的返回值和引數)都顯示出來了。

而且,結合speedbar和semantic,我們在寫程式碼的時候,speedbar還能提示程式碼的補全呢。
具體怎麼做,等到寫 semantic 專題的時候再講解吧。

speedbar的配置和擴充套件

最後談談speedbar的配置和擴充套件。
speedbar的選項挺多,但需要配置的並不多。
授人以魚,不如授人以漁。這裡講配置方法,不講配置。

首先,我們看看speedbar有哪些變數可以配置。
M-x describe-variable RET speedbar TAB,會列出speedbar的所有變數。
選擇你感興趣的研究一番吧。

類似的,
M-x describe-function RET speedbar TAB,會列出speedbar的所有函式,
有些是改變speedbar行為的,自己研究吧。

其它的emacs元件也可以用類似的方法研究。

至於擴充套件,有一個叫 sr-speedbar 的,會把 speedbar嵌入到emacs的主視窗中。