28.11 间接缓冲区

间接缓冲区(indirect buffer)会共享另一个缓冲区的文本, 该缓冲区被称为该间接缓冲区的基础缓冲区(base buffer)。 在某些方面,它类似于文件系统中的符号链接,只是作用于缓冲区。 基础缓冲区本身不能是间接缓冲区。

间接缓冲区的文本始终与其基础缓冲区完全一致; 编辑任意一方所做的修改会立即在另一方中显现。 这既包括字符本身,也包括文本属性。

在其他所有方面,间接缓冲区与其基础缓冲区都是完全独立的。 它们拥有不同的名称、独立的光标位置、独立的缩进范围、 独立的标记和覆盖层(尽管在任一缓冲区中插入或删除文本 都会重新定位双方的标记和覆盖层)、独立的主模式, 以及独立的缓冲区局部变量绑定。

间接缓冲区不能访问文件,但其基础缓冲区可以。 如果你尝试保存间接缓冲区,实际保存的是基础缓冲区。

杀死间接缓冲区对其基础缓冲区没有影响。 杀死基础缓冲区会使间接缓冲区实效, 因为它将再也无法成为当前缓冲区。

Command: make-indirect-buffer base-buffer name &optional clone inhibit-buffer-hooks

该函数创建并返回一个名为 name 的间接缓冲区, 其基础缓冲区为 base-buffer。 参数 base-buffer 可以是一个活动缓冲区, 也可以是已有缓冲区的名称(字符串)。 如果 name 是已有缓冲区的名称,则会抛出错误。

如果clonenil, 则间接缓冲区初始会继承 base-buffer 的状态, 包括主模式、次要模式、缓冲区局部变量等。 如果 clone 被省略或为 nil, 则间接缓冲区的状态会被设为新建缓冲区的默认状态。

如果 base-buffer 本身是间接缓冲区, 则使用它的基础缓冲区作为新缓冲区的基础。 此外,如果 clonenil, 初始状态会从实际的基础缓冲区复制,而非从 base-buffer 复制。

关于 inhibit-buffer-hooks 的含义,See 创建缓冲区

Command: clone-indirect-buffer newname display-flag &optional norecord

该函数创建并返回一个新的间接缓冲区, 它共享当前缓冲区的基础缓冲区, 并复制当前缓冲区的其余属性。 (如果当前缓冲区不是间接缓冲区,则它自身作为基础缓冲区。)

如果display-flagnil(交互式调用时总是如此), 则表示通过调用 pop-to-buffer 显示新缓冲区。 如果 norecordnil, 则表示不将新缓冲区移至缓冲区列表前端。

Function: buffer-base-buffer &optional buffer

该函数返回buffer的基础缓冲区, buffer 默认为当前缓冲区。 如果 buffer 不是间接缓冲区,则返回 nil。 否则返回另一个缓冲区,且该缓冲区永远不会是间接缓冲区。