大纲模式

优质
小牛编辑
133浏览
2023-12-01

Emacs 的大纲模式(Outline mode),是一个十分有用的模式。如果工程规模比较大,你应该用大纲来组织它。

大纲模式通常作为辅模式使用,M-x outline-minor-mode启用。

大纲模式可以根据代码的语法对结构进行识别,但是这种自动模式工作的不是很好,而且不够灵活

另一种工作方式是查找特定的字串,来组织文档的结构。这种工作方式是可控制的,不过需要手动加入这些作为结构标识的字串。似乎有点麻烦,但是对于严谨的构思来说,你是需要列一个提纲的

大纲模式默认以行首的 * 作为结构标识,每多一个 * 就是下一级分支。

大纲模式默认的键绑定太过复杂,在配置文件中添加以下语句,将所有大纲模式操作的前缀键改为 Ctrl+o

(setq outline-minor-mode-prefix [(control o)])

试着在文档中随便加入几个这样的标识

*主干一
**分支一
**分支二
*主干二	    

进行一些简单的操作

C-o C-a全部显示
C-o C-t显示主干
C-o C-q全部隐藏
C-o C-i显示下一级分支
C-o C-k显示分支
C-o C-e显示节点
C-o C-d隐藏分支

定制结构标识

为了不影响代码的功能,通常要把结构标识放到注释中,这样作有可能会带来不便,例如在 XML 环境中就要像这样使用:

<!--
*结构标识
-->	    

这样会给你的工作制造出一些混乱,并且大纲模式是以行为单位进行识别的,也就是说<!--属于上一个分支

好在大纲模式可以通过正则表达式来定义结构标识,你可以把结构标识定义为下面这种形式

<!--*结构标识-->	    

通过设置outline-regexp定制标识:

setq outline-regexp "<!\\1-2\\-\\*+3

1

Elisp 语法中,\ 有特殊意义,所以脱字符要用\\表示

2

正则表达式中 - 有特殊意义,所以前面要加脱字符

3

*+ 表示一个或多个*

配置

完整的配置:

例 25.2. emacs 大纲模式

(setq outline-minor-mode-prefix [(control o)])1
(require 'docbook-xml-mode)2
(add-hook 'docbook-xml-mode-hook3
	  (function (lambda () (setq outline-regexp "<!\\-\\-\\*+4")
		(outline-minor-mode)5
		(hide-body)6			)))    

1

更改大纲模式前缀键

1

加载 docbook-xml-mode

3

添加 docbook-xml-mode 钩子,运行下面代码[47]

4

<!--*识别为标识

5

启动大纲模式作为辅模式

6

隐藏所有内容,只显示主干

操作列表

显示、隐藏

 全部显示显示分支隐藏
全局show-allC-o C-ahide-bodyC-o C-thide-sublevelsC-o C-q1
分支show-subtreeC-o C-shide-leavesC-o C-lhide-subtreeC-o C-d
show-branchesC-o C-k
show-childrenC-o C-i
节点show-entryC-o C-e  hide-entryC-o C-c
其它分支    hide-otherC-o C-o

1

可以带数字参数,如M-2 C-o C-q显示第2层子结构

移动

 向前向后
全局outline-next-visible-headingC-o C-noutline-previous-visible-headingC-o C-p
同级outline-forward-same-levelC-o C-foutline-backward-same-levelC-o C-b
返回上一级outline-up-headingC-o C-u


[47] docbook-xml-mode.el中定义 docbook-xml-mode-hook,模式启动时运行钩子代码