28.10 杀死缓冲区

杀死缓冲区(Killing a buffer)会使其名称对 Emacs 不可见, 并将其占用的内存空间释放以供其他用途使用。

只要仍有对象引用已杀死的缓冲区,其缓冲区对象就会继续存在, 但会被特殊标记,从而无法将其设为当前缓冲区或显示。 不过,已杀死的缓冲区仍保留自身标识;即使两个缓冲区均已失效, 通过 eq 判断它们依然是不同的对象。

若杀死的是当前缓冲区或在窗口中显示的缓冲区, Emacs 会自动选择或显示其他缓冲区。这意味着杀死缓冲区可能改变当前缓冲区。 因此,杀死缓冲区时应采取与切换当前缓冲区相同的预防措施 (除非你确定被杀死的缓冲区并非当前缓冲区)。See 当前缓冲区

若杀死的缓冲区是一个或多个间接 buffers (see 间接缓冲区), 的基础缓冲区,则这些间接缓冲区也会被自动杀死。

缓冲区的 buffer-namenil,当且仅当该缓冲区已被杀死。 未被杀死的缓冲区称为 活动(live)缓冲区。 可使用函数 buffer-live-p 判断缓冲区是否为活动状态(见下文)。

Command: kill-buffer &optional buffer-or-name

该函数杀死缓冲区 buffer-or-name,释放其全部内存 以供其他用途或归还操作系统。若 buffer-or-namenil 或省略, 则杀死当前缓冲区。

所有以该缓冲区为 process-buffer 的进程会收到 SIGHUP (挂断)信号,通常会导致进程终止。See 向进程发送信号

若缓冲区访问文件且包含未保存修改, kill-buffer 在杀死缓冲区前会要求用户确认。 即使非交互式调用也会如此。若要避免确认提示, 可在调用 kill-buffer 前清除修改标记。See 缓冲区修改.

该函数会调用 replace-buffer-in-windows, 清理所有当前显示待杀死缓冲区的窗口。

杀死已失效的缓冲区无任何效果。

若实际杀死了缓冲区,函数返回 t。 若用户拒绝确认或 buffer-or-name 已失效,则返回 nil

(kill-buffer "foo.unchanged")
     ⇒ t
(kill-buffer "foo.changed")

---------- Buffer: Minibuffer ----------
Buffer foo.changed modified; kill anyway? (yes or no) yes
---------- Buffer: Minibuffer ----------

     ⇒ t
Variable: kill-buffer-query-functions

在确认未保存修改前,kill-buffer 会按顺序依次调用 列表 kill-buffer-query-functions 中的函数,且不传入参数。 调用时,待杀死的缓冲区为当前缓冲区。该机制的用途是让这些函数向用户请求确认。 若任意函数返回 nilkill-buffer 则放弃杀死该缓冲区。

get-buffer-creategenerate-new-buffer 使用非 nil 参数 inhibit-buffer-hooks 创建的 内部或临时缓冲区不会运行该钩子。

Variable: kill-buffer-hook

这是一个常规钩子,由 kill-buffer 在完成所有确认询问后、 实际杀死缓冲区前运行。钩子函数运行时,待杀死缓冲区为当前缓冲区。 See 钩子。该变量为永久局部变量,因此切换主模式不会清除其局部绑定。

get-buffer-creategenerate-new-buffer 使用非 nil 参数 inhibit-buffer-hooks 创建的 内部或临时缓冲区不会运行该钩子。

User Option: buffer-offer-save

若某缓冲区中该变量非 nil,则告知 save-buffers-kill-emacs 主动提示保存该缓冲区,就像对待访问文件的缓冲区一样。 若 save-some-buffers 第二个可选参数设为 t, 同样会提示保存该缓冲区。此外,若该变量设为符号 always, 则 save-buffers-kill-emacssave-some-buffers 均会始终提示保存。See Definition of save-some-buffers。 无论因何原因设置,变量 buffer-offer-save 都会自动变为缓冲区局部变量。 See 缓冲区局部变量

Variable: buffer-save-without-query

若某缓冲区中该变量非 nil,则告知 save-buffers-kill-emacssave-some-buffers 直接保存该缓冲区(若已修改),无需询问用户。 无论因何原因设置,该变量都会自动变为缓冲区局部变量。

Function: buffer-live-p object

object 为活动缓冲区(未被杀死的缓冲区),函数返回 t, 否则返回 nil