42.7 选择性显示

选择性显示(selective display) 指的是一组相关功能,用于在屏幕上隐藏特定行。

第一种形式,显式选择性显示,设计用于 Lisp 程序:它通过修改文本来控制哪些行被隐藏。这类隐藏方式现已过时且不推荐使用;你应当改用 invisible 属性(see 不可见文本)实现相同效果。

第二种形式中,需要隐藏的行根据缩进自动选择。该形式设计为面向用户的功能。

控制显式选择性显示的方式是将换行符(control-j)替换为回车符(control-m)。原本位于该换行符之后的行文本会被隐藏。严格来说,这些文本暂时不再构成独立行,因为只有换行符才能分隔行;它们现在属于上一行的一部分。

选择性显示不会直接影响编辑命令。例如,C-fforward-char)会毫无阻碍地将光标移入隐藏文本。不过,将换行符替换为回车符会影响部分编辑命令。例如,next-line 会跳过隐藏行,因为它只搜索换行符。使用选择性显示的模式也可以定义能识别换行符、或控制文本哪些部分被隐藏的命令。

当你将启用选择性显示的缓冲区写入文件时,所有 control-m 都会以换行符输出。这意味着下次读取文件时内容显示正常,无任何隐藏。选择性显示的效果仅在 Emacs 内部生效。

Variable: selective-display

该缓冲区局部变量用于启用选择性显示。这意味着行或行的部分内容可能被隐藏。

  • selective-display 的值为 t,则字符 control-m 标记隐藏文本的开始;该 control-m 及其后的整行内容不会显示。此为显式选择性显示。
  • selective-display 的值为正整数,则缩进列数超过该数值的行不会显示。

当缓冲区某部分被隐藏时,垂直移动命令会视该部分不存在,单次 next-line 命令可跳过任意数量的隐藏行。 但字符移动命令(如 forward-char)不会跳过隐藏部分,并且可以(虽有技巧性)在隐藏区域插入或删除文本。

下面示例展示缓冲区 foo显示外观selective-display 取值变化的情况。缓冲区的 实际内容并未改变。

(setq selective-display nil)
     ⇒ nil

---------- Buffer: foo ----------
1 on this column
 2on this column
  3n this column
  3n this column
 2on this column
1 on this column
---------- Buffer: foo ----------

(setq selective-display 2)
     ⇒ 2

---------- Buffer: foo ----------
1 on this column
 2on this column
 2on this column
1 on this column
---------- Buffer: foo ----------
User Option: selective-display-ellipses

若该缓冲区局部变量非 nil,Emacs 会在后跟隐藏文本的行尾显示 ‘’。 本示例承接上例。

(setq selective-display-ellipses t)
     ⇒ t

---------- Buffer: foo ----------
1 on this column
 2on this column ...
 2on this column
1 on this column
---------- Buffer: foo ----------

你可以使用显示表替换省略号 ‘’ 的显示文本。See 显示表