28.8 缓冲区列表

缓冲区列表(buffer list)是所有活动缓冲区的列表。列表中缓冲区的顺序 主要依据各缓冲区最近在窗口中显示的时间先后决定。多个函数(尤其是 other-buffer)都会使用这一顺序。展示给用户的缓冲区列表也遵循该顺序。

创建缓冲区会将其添加到缓冲区列表末尾,杀死缓冲区 则会将其从列表中移除。每当一个缓冲区被选中在窗口中显示时 (see 在窗口中切换到缓冲区),或显示它的窗口被选中时 (see 选中窗口),该缓冲区就会移至列表前端。 当缓冲区被隐藏时(见下方 bury-buffer),会移至列表末尾。 Lisp 程序员没有可直接操作缓冲区列表的函数。

除了上述基础缓冲区列表外,Emacs 还为每个框架维护一个局部缓冲区列表, 其中在该框架中显示过(或其窗口被选中过)的缓冲区排在前面。 (该顺序保存在框架的 buffer-list 框架参数中;参见 缓冲区参数。) 未在该框架中显示过的缓冲区排在其后,顺序遵循基础缓冲区列表。

Function: buffer-list &optional frame

该函数返回缓冲区列表,包含所有缓冲区,即使名称以空格开头的缓冲区也不例外。 列表元素是实际的缓冲区对象,而非缓冲区名称。

frame 为一个框架,则返回该框架的局部缓冲区列表。 若 framenil 或省略,则使用基础缓冲区列表: 缓冲区按最近显示或选中的顺序排列,与所在框架无关。

(buffer-list)
     ⇒ (#<buffer buffers.texi>
         #<buffer  *Minibuf-1*> #<buffer buffer.c>
         #<buffer *Help*> #<buffer TAGS>)

;; 注意迷你缓冲区的名称以空格开头!
(mapcar #'buffer-name (buffer-list))
    ⇒ ("buffers.texi" " *Minibuf-1*"
        "buffer.c" "*Help*" "TAGS")

buffer-list 返回的列表是专门构造的结果, 并非 Emacs 内部数据结构,修改它不会影响缓冲区的实际顺序。 若想改变基础缓冲区列表中缓冲区的顺序,可使用以下简单方法:

(defun reorder-buffer-list (new-list)
  (while new-list
    (bury-buffer (car new-list))
    (setq new-list (cdr new-list))))

通过这种方式你可以为列表指定任意顺序,且不会 出现丢失缓冲区或加入非有效活动缓冲区的风险。

若要修改特定框架缓冲区列表的顺序或值, 可使用 modify-frame-parameters 设置该框架的 buffer-list 参数(see 框架参数访问)。

Function: other-buffer &optional buffer visible-ok frame

该函数返回缓冲区列表中除 buffer 之外的第一个缓冲区。 通常情况下,它是最近选中窗口中显示的缓冲区(在框架 frame 或当前选中框架,see 输入焦点),排除 buffer 本身。 名称以空格开头的缓冲区会被直接忽略。

若未提供 buffer(或其不是活动缓冲区), 则 other-buffer 返回选中框架局部缓冲区列表的第一个缓冲区。 (若 framenil,则返回该框架局部缓冲区列表的第一个缓冲区。)

frame 拥有非 nilbuffer-predicate 参数, 则 other-buffer 会使用该谓词判断哪些缓冲区可被纳入选择。 它会对每个缓冲区调用一次谓词,若返回 nil 则忽略该缓冲区。See 缓冲区参数

visible-oknilother-buffer 会尽量避免 返回在任何可见框架的窗口中已显示的缓冲区,除非别无选择。 若 visible-oknil,则缓冲区是否已显示无关紧要。

若无合适缓冲区,返回 *scratch* 缓冲区(必要时会创建)。

Function: last-buffer &optional buffer visible-ok frame

该函数返回 frame 的缓冲区列表中除 buffer 之外的最后一个缓冲区。 若 frame 省略或为 nil,则使用选中框架的缓冲区列表。

参数 visible-ok 的处理方式与 other-buffer 相同,见上文。 若无合适缓冲区,返回 *scratch* 缓冲区。

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

该命令将 buffer-or-name 移至缓冲区列表末尾, 不改变列表中其他缓冲区的顺序。 这样该缓冲区就会成为 other-buffer 最不可能返回的候选。 参数可以是缓冲区对象或缓冲区名称。

该函数会同时作用于每个框架的 buffer-list 参数以及基础缓冲区列表; 因此,被隐藏的缓冲区会在 (buffer-list frame)(buffer-list) 的结果中都排在最后。此外,如果该缓冲区显示在选中窗口中, 它也会被移至选中窗口的缓冲区列表末尾(see 窗口历史)。

buffer-or-namenil 或省略,则表示隐藏当前缓冲区。 此外,如果当前缓冲区显示在选中窗口中(see 选中窗口), 该函数会确保窗口被删除或切换显示其他缓冲区。 更精确地说:若选中窗口为专用窗口(see 专用窗口) 且其框架上还有其他窗口,则删除该窗口。 若它是框架上唯一窗口,且该框架不是终端上唯一框架, 则通过调用 frame-auto-hide-function 指定的函数隐藏框架(see 退出窗口)。 其他情况下,调用 switch-to-prev-buffer(see 窗口历史) 在该窗口中显示其他缓冲区。若 buffer-or-name 在其他窗口中显示,则保持不变。

如需替换所有显示该缓冲区的窗口中的内容, 请使用 replace-buffer-in-windows,See 缓冲区与窗口

Command: unbury-buffer

该命令切换到选中框架局部缓冲区列表中的最后一个缓冲区。 更精确地说,它调用 switch-to-buffer(see 在窗口中切换到缓冲区), 在选中窗口中显示 last-buffer 返回的缓冲区(见上文)。

Variable: buffer-list-update-hook

这是一个常规钩子,每当缓冲区列表发生变化时运行。 隐式运行该钩子的函数包括 get-buffer-create(see 创建缓冲区)、 rename-buffer(see 缓冲区名称)、 kill-buffer(see 杀死缓冲区)、 bury-buffer(见上文)以及 select-window(see 选中窗口)。 由 get-buffer-creategenerate-new-buffer 使用非 nil 参数 inhibit-buffer-hooks 创建的内部或临时缓冲区,不会运行该钩子。

该钩子运行的函数应避免使用 nil 作为 norecord 参数调用 select-window, 否则可能导致无限递归。

Function: buffer-match-p condition buffer-or-name &rest args

该函数检查由 buffer-or-name 指定的缓冲区是否满足给定的 condition。 可选参数 args 会传递给 condition 中的谓词函数。 合法的 condition 可以是以下之一:

  • 字符串,被解释为正则表达式。若正则表达式与缓冲区名称匹配,则缓冲区满足条件。
  • 谓词函数,若缓冲区匹配则返回非 nil。调用时第一个参数为 buffer-or-name,后续为 args
  • 序对 (oper . expr),其中 oper 为以下之一:
    (not cond)

    cond 在相同缓冲区和 args 下不满足 buffer-match-p 时成立。

    (or conds…)

    conds 中任意条件在相同缓冲区和 args 下满足 buffer-match-p 时成立。

    (and conds…)

    conds 中所有条件在相同缓冲区和 args 下满足 buffer-match-p 时成立。

    derived-mode

    当缓冲区主模式派生自 expr 时成立。 注意:若在缓冲区主模式确立前调用 buffer-match-p,该条件可能无法正确匹配。

    major-mode

    当缓冲区主模式等于 expr 时成立。两者均可使用时优先选择 derived-mode。 注意:若在缓冲区主模式确立前调用 buffer-match-p,该条件可能无法正确匹配。

    category

    仅当该函数由 display-buffer 调用时有效(see 缓冲区显示动作关联列表), 若调用 display-buffer 时的动作 alist 的 action 参数中包含 (category . expr),则条件成立。See 缓冲区显示动作关联列表

  • t 对任意缓冲区均成立。是 ""(空字符串)或 (and)(空合取式)的便捷替代。
Function: match-buffers condition &optional buffer-list &rest args

该函数返回所有满足 condition 的缓冲区列表。 若无匹配缓冲区,返回 nil。 参数 condition 与上文 buffer-match-p 定义一致。 默认会检查所有缓冲区,但可通过可选参数 buffer-list 限制范围, 该参数应为待检查的缓冲区列表。剩余参数 args 会以与 buffer-match-p 相同的方式传递给 condition