杀死缓冲区(Killing a buffer)会使其名称对 Emacs 不可见, 并将其占用的内存空间释放以供其他用途使用。
只要仍有对象引用已杀死的缓冲区,其缓冲区对象就会继续存在,
但会被特殊标记,从而无法将其设为当前缓冲区或显示。
不过,已杀死的缓冲区仍保留自身标识;即使两个缓冲区均已失效,
通过 eq 判断它们依然是不同的对象。
若杀死的是当前缓冲区或在窗口中显示的缓冲区, Emacs 会自动选择或显示其他缓冲区。这意味着杀死缓冲区可能改变当前缓冲区。 因此,杀死缓冲区时应采取与切换当前缓冲区相同的预防措施 (除非你确定被杀死的缓冲区并非当前缓冲区)。See 当前缓冲区。
若杀死的缓冲区是一个或多个间接 buffers (see 间接缓冲区), 的基础缓冲区,则这些间接缓冲区也会被自动杀死。
缓冲区的 buffer-name 为 nil,当且仅当该缓冲区已被杀死。
未被杀死的缓冲区称为 活动(live)缓冲区。
可使用函数 buffer-live-p 判断缓冲区是否为活动状态(见下文)。
该函数杀死缓冲区 buffer-or-name,释放其全部内存
以供其他用途或归还操作系统。若 buffer-or-name 为 nil 或省略,
则杀死当前缓冲区。
所有以该缓冲区为 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
在确认未保存修改前,kill-buffer 会按顺序依次调用
列表 kill-buffer-query-functions 中的函数,且不传入参数。
调用时,待杀死的缓冲区为当前缓冲区。该机制的用途是让这些函数向用户请求确认。
若任意函数返回 nil,kill-buffer 则放弃杀死该缓冲区。
由 get-buffer-create 或 generate-new-buffer
使用非 nil 参数 inhibit-buffer-hooks 创建的
内部或临时缓冲区不会运行该钩子。
这是一个常规钩子,由 kill-buffer 在完成所有确认询问后、
实际杀死缓冲区前运行。钩子函数运行时,待杀死缓冲区为当前缓冲区。
See 钩子。该变量为永久局部变量,因此切换主模式不会清除其局部绑定。
由 get-buffer-create 或 generate-new-buffer
使用非 nil 参数 inhibit-buffer-hooks 创建的
内部或临时缓冲区不会运行该钩子。
若某缓冲区中该变量非 nil,则告知 save-buffers-kill-emacs
主动提示保存该缓冲区,就像对待访问文件的缓冲区一样。
若 save-some-buffers 第二个可选参数设为 t,
同样会提示保存该缓冲区。此外,若该变量设为符号 always,
则 save-buffers-kill-emacs 和 save-some-buffers
均会始终提示保存。See Definition of save-some-buffers。
无论因何原因设置,变量 buffer-offer-save 都会自动变为缓冲区局部变量。
See 缓冲区局部变量。
若某缓冲区中该变量非 nil,则告知 save-buffers-kill-emacs
和 save-some-buffers 直接保存该缓冲区(若已修改),无需询问用户。
无论因何原因设置,该变量都会自动变为缓冲区局部变量。
若 object 为活动缓冲区(未被杀死的缓冲区),函数返回 t,
否则返回 nil。