28.7 只读缓冲区

如果一个缓冲区是只读(read-onl)的,那么你无法修改其内容, 尽管你可以通过滚动和缩进来改变查看内容的视角。

只读缓冲区主要用于两类场景:

Variable: buffer-read-only

该缓冲区局部变量用于指定缓冲区是否为只读。 若此变量非 nil,则缓冲区为只读。但是, 带有 inhibit-read-only 文本属性的字符仍然可以被修改。See inhibit-read-only.

Variable: inhibit-read-only

若此变量非 nil,则只读缓冲区以及(根据实际取值) 部分或全部只读字符可以被修改。缓冲区中的只读字符是指 带有非 nilread-only 文本属性的字符。有关文本属性的更多信息, 参见 See 具有特殊含义的文本属性

inhibit-read-onlyt,则所有 read-only 字符属性均失效。 若 inhibit-read-only 为一个列表,则属于该列表成员的 read-only 字符属性失效 (比较使用 eq)。

Command: read-only-mode &optional arg

这是只读次要模式的模式命令,属于缓冲区局部次要模式。 启用该模式时,缓冲区中 buffer-read-only 为非 nil; 禁用时,缓冲区中 buffer-read-onlynil。 调用规则与其他次要模式命令一致(see 编写次要模式的规范)。

该次要模式主要作为 buffer-read-only 的包装; 与大多数次要模式不同,它没有独立的 read-only-mode 变量。 即使只读模式已禁用,带有非 nilread-only 文本属性的字符仍保持只读。 如需临时忽略所有只读状态,请按上文所述绑定 inhibit-read-only

启用只读模式时,如果选项 view-read-onlynil, 该模式命令还会同时启用查看模式。See Miscellaneous Buffer Operations in The GNU Emacs Manual. 禁用只读模式时,如果查看模式处于启用状态,则会一并关闭。

Function: barf-if-buffer-read-only &optional position

如果当前缓冲区为只读,此函数会抛出 buffer-read-only 错误。 若 position 位置(默认为光标位置)的文本设置了 inhibit-read-only 文本属性, 则不会触发该错误。

如需在当前缓冲区只读时报错的另一种方式,参见 See 使用 interactive