28.9 创建缓冲区

本节介绍用于创建缓冲区的两个原语函数。 get-buffer-create 在未找到指定名称的现有缓冲区时会创建一个新缓冲区; generate-new-buffer 则始终创建新缓冲区并为其分配唯一名称。

两个函数均接受可选参数 inhibit-buffer-hooks。 若该参数非 nil,则它们创建的缓冲区不会运行钩子 kill-buffer-hookkill-buffer-query-functions (see 杀死缓冲区)以及 buffer-list-update-hook (see 缓冲区列表)。这可以避免那些从不展示给用户或传递给其他程序的 内部或临时缓冲区出现性能下降。

其他可用于创建缓冲区的函数包括 with-output-to-temp-buffer(see 临时显示) 和 create-file-buffer(see 访问文件)。 启动子进程同样可以创建缓冲区(see 进程)。

Function: get-buffer-create buffer-or-name &optional inhibit-buffer-hooks

该函数返回名为 buffer-or-name 的缓冲区。 返回的缓冲区不会成为当前缓冲区——此函数不会改变当前缓冲区。

buffer-or-name 必须是字符串或已存在的缓冲区。 若为字符串且同名的活动缓冲区已存在,get-buffer-create 会返回该缓冲区。若不存在,则创建新缓冲区。 若 buffer-or-name 是缓冲区而非字符串,则直接返回该对象,即使它已失效。

(get-buffer-create "foo")
     ⇒ #<buffer foo>

新建缓冲区的主模式会被设为基本模式。 (变量 major-mode 的默认值在更上层处理;参见 Emacs 如何选择主模式。) 若缓冲区名称以空格开头,则初始会禁用撤销信息记录(see 撤销)。

Function: generate-new-buffer name &optional inhibit-buffer-hooks

该函数返回一个新建的空缓冲区,但不会将其设为当前缓冲区。 缓冲区名称通过将 name 传入函数 generate-new-buffer-name 生成(see 缓冲区名称)。因此,若不存在名为 name 的缓冲区, 则直接使用该名称;若名称已被占用,则在 name 后追加形如 ‘<n>’ 的后缀,其中 n 为整数。

name 不是字符串,会抛出错误。

(generate-new-buffer "bar")
     ⇒ #<buffer bar>
(generate-new-buffer "bar")
     ⇒ #<buffer bar<2>>
(generate-new-buffer "bar")
     ⇒ #<buffer bar<3>>

新建缓冲区的主模式设为基本模式。变量 major-mode 的默认值在更上层处理。 See Emacs 如何选择主模式