探索Emacs SpeedBar

做者: Jolly Wing(jiqingwu@gmail.com)
生成: 2014-05-16 週五
轉載請保留做者信息

簡介

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

M-x speedbar 會打開一個窄而高的導航窗口,裏面顯示的是文件列表,點擊每一個文件前的 +,能展開文件內的索引。
有的索引項還可以進一步展開,點擊不能在展開的索引項,就能跳轉到文件內對應的位置。
用鼠標用 speedbar 仍是很方便的。c++

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

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

要想讓speedbar隨Emacs一塊兒啓動,在啓動文件里加上函數

(speedbar 1)

speedbar的顯示模式

speedbar有多種模式,能夠顯示以樹形結構顯示文件和目錄,也能夠顯示當前活躍的buffer。
你能夠在speedbar窗口點右鍵進入 Display的子菜單進行模式切換。工具

在顯示文件模式下,speedbar能夠做爲文件管理器使用。快捷鍵以下:fetch

  • U 進入上層目錄
  • C 拷貝文件
  • D 刪除文件
  • R 重命名

在顯示緩衝區的模式時,也能夠管理buffer。
k 刪除buffer,r 從新從硬盤讀取內容到buffer。ui

針對特別的緩衝區,speedbar會進入特別的模式。
好比你在查看emacs手冊,speedbar會進入info模式,列出全部手冊的節點和子節點,方便你閱讀手冊。code

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

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的主窗口中。

相關文章
相關標籤/搜索