探索Emacs SpeedBar

浏览: 151 发布日期: 2016-08-17 分类: emacs
作者: 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的主窗口中。

返回顶部