缓冲区列表(buffer list)是所有活动缓冲区的列表。列表中缓冲区的顺序
主要依据各缓冲区最近在窗口中显示的时间先后决定。多个函数(尤其是
other-buffer)都会使用这一顺序。展示给用户的缓冲区列表也遵循该顺序。
创建缓冲区会将其添加到缓冲区列表末尾,杀死缓冲区
则会将其从列表中移除。每当一个缓冲区被选中在窗口中显示时
(see 在窗口中切换到缓冲区),或显示它的窗口被选中时
(see 选中窗口),该缓冲区就会移至列表前端。
当缓冲区被隐藏时(见下方 bury-buffer),会移至列表末尾。
Lisp 程序员没有可直接操作缓冲区列表的函数。
除了上述基础缓冲区列表外,Emacs 还为每个框架维护一个局部缓冲区列表,
其中在该框架中显示过(或其窗口被选中过)的缓冲区排在前面。
(该顺序保存在框架的 buffer-list 框架参数中;参见 缓冲区参数。)
未在该框架中显示过的缓冲区排在其后,顺序遵循基础缓冲区列表。
该函数返回缓冲区列表,包含所有缓冲区,即使名称以空格开头的缓冲区也不例外。 列表元素是实际的缓冲区对象,而非缓冲区名称。
若 frame 为一个框架,则返回该框架的局部缓冲区列表。
若 frame 为 nil 或省略,则使用基础缓冲区列表:
缓冲区按最近显示或选中的顺序排列,与所在框架无关。
(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 框架参数访问)。
该函数返回缓冲区列表中除 buffer 之外的第一个缓冲区。 通常情况下,它是最近选中窗口中显示的缓冲区(在框架 frame 或当前选中框架,see 输入焦点),排除 buffer 本身。 名称以空格开头的缓冲区会被直接忽略。
若未提供 buffer(或其不是活动缓冲区),
则 other-buffer 返回选中框架局部缓冲区列表的第一个缓冲区。
(若 frame 非 nil,则返回该框架局部缓冲区列表的第一个缓冲区。)
若 frame 拥有非 nil 的 buffer-predicate 参数,
则 other-buffer 会使用该谓词判断哪些缓冲区可被纳入选择。
它会对每个缓冲区调用一次谓词,若返回 nil 则忽略该缓冲区。See 缓冲区参数。
若 visible-ok 为 nil,other-buffer 会尽量避免
返回在任何可见框架的窗口中已显示的缓冲区,除非别无选择。
若 visible-ok 非 nil,则缓冲区是否已显示无关紧要。
若无合适缓冲区,返回 *scratch* 缓冲区(必要时会创建)。
该函数返回 frame 的缓冲区列表中除 buffer 之外的最后一个缓冲区。
若 frame 省略或为 nil,则使用选中框架的缓冲区列表。
参数 visible-ok 的处理方式与 other-buffer 相同,见上文。
若无合适缓冲区,返回 *scratch* 缓冲区。
该命令将 buffer-or-name 移至缓冲区列表末尾,
不改变列表中其他缓冲区的顺序。
这样该缓冲区就会成为 other-buffer 最不可能返回的候选。
参数可以是缓冲区对象或缓冲区名称。
该函数会同时作用于每个框架的 buffer-list 参数以及基础缓冲区列表;
因此,被隐藏的缓冲区会在 (buffer-list frame)
和 (buffer-list) 的结果中都排在最后。此外,如果该缓冲区显示在选中窗口中,
它也会被移至选中窗口的缓冲区列表末尾(see 窗口历史)。
若 buffer-or-name 为 nil 或省略,则表示隐藏当前缓冲区。
此外,如果当前缓冲区显示在选中窗口中(see 选中窗口),
该函数会确保窗口被删除或切换显示其他缓冲区。
更精确地说:若选中窗口为专用窗口(see 专用窗口)
且其框架上还有其他窗口,则删除该窗口。
若它是框架上唯一窗口,且该框架不是终端上唯一框架,
则通过调用 frame-auto-hide-function 指定的函数隐藏框架(see 退出窗口)。
其他情况下,调用 switch-to-prev-buffer(see 窗口历史)
在该窗口中显示其他缓冲区。若 buffer-or-name 在其他窗口中显示,则保持不变。
如需替换所有显示该缓冲区的窗口中的内容,
请使用 replace-buffer-in-windows,See 缓冲区与窗口。
该命令切换到选中框架局部缓冲区列表中的最后一个缓冲区。
更精确地说,它调用 switch-to-buffer(see 在窗口中切换到缓冲区),
在选中窗口中显示 last-buffer 返回的缓冲区(见上文)。
这是一个常规钩子,每当缓冲区列表发生变化时运行。
隐式运行该钩子的函数包括 get-buffer-create(see 创建缓冲区)、
rename-buffer(see 缓冲区名称)、
kill-buffer(see 杀死缓冲区)、
bury-buffer(见上文)以及 select-window(see 选中窗口)。
由 get-buffer-create 或 generate-new-buffer
使用非 nil 参数 inhibit-buffer-hooks 创建的内部或临时缓冲区,不会运行该钩子。
该钩子运行的函数应避免使用 nil 作为 norecord 参数调用 select-window,
否则可能导致无限递归。
该函数检查由 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 缓冲区显示动作关联列表。
""(空字符串)或 (and)(空合取式)的便捷替代。
该函数返回所有满足 condition 的缓冲区列表。
若无匹配缓冲区,返回 nil。
参数 condition 与上文 buffer-match-p 定义一致。
默认会检查所有缓冲区,但可通过可选参数 buffer-list 限制范围,
该参数应为待检查的缓冲区列表。剩余参数 args 会以与 buffer-match-p 相同的方式传递给 condition。