作者: 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的分析結果?
- 啟動semantic,
M-x semantic-mode
- 執行
(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的主視窗中。