作者: Jolly Wing([email protected])
生成: 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的主窗口中。