每个窗口都会用一个列表记录它之前显示过的缓冲区,以及这些缓冲区被移出该窗口的顺序。这一历史会被 replace-buffer-in-windows(see 缓冲区与窗口)以及退出窗口时(see 退出窗口)等场景使用。该列表由 Emacs 自动维护,但你可以使用下面的函数显式查看或修改它:
该函数返回一个列表,描述 window 之前显示的内容。可选参数 window 必须是活动窗口,默认为当前选中窗口。
列表中每个元素的格式为 (buffer window-start window-pos),其中 buffer 是该窗口之前显示的缓冲区,window-start 是该缓冲区最后一次显示时的窗口起始位置(see 窗口起始与结束位置),window-pos 是该缓冲区最后一次在 window 中显示时的光标位置(see 窗口(window)与点(Point))。
列表按时间排序,靠前的元素对应最近显示过的缓冲区,第一个元素通常对应最近被移出该窗口的缓冲区。
该函数将 window 的历史缓冲区列表设为 prev-buffers。参数 window 必须是活动窗口,默认为选中窗口。参数 prev-buffers 应为与 window-prev-buffers 返回格式相同的列表。
此外,每个窗口还维护一个后续缓冲区(next buffer)列表,用于记录由 switch-to-prev-buffer(见下文)重新显示的缓冲区。该列表主要供 switch-to-prev-buffer 和 switch-to-next-buffer 选择要切换的缓冲区。
该函数返回 window 中最近通过 switch-to-prev-buffer 重新显示的缓冲区列表。参数 window 必须是活动窗口或 nil(表示选中窗口)。
该函数将 window 的后续缓冲区列表设为 next-buffers。参数 window 应为活动窗口或 nil(表示选中窗口)。参数 next-buffers 应为一个缓冲区列表。
下面的命令可用于在全局缓冲区列表中循环切换,用法类似 bury-buffer 和 unbury-buffer。但它们依据指定窗口的历史列表切换,而非全局缓冲区列表。此外,它们会恢复对应窗口特有的起始位置与光标位置,即使某个缓冲区已在其他窗口显示,也可能再次显示它。switch-to-prev-buffer 命令尤其会被 replace-buffer-in-windows、bury-buffer 和 quit-window 使用,用于为窗口寻找替代缓冲区。
该命令在 window 中显示上一个缓冲区。参数 window 应为活动窗口或 nil(表示选中窗口)。如果可选参数 bury-or-kill 为非 nil,表示当前在 window 中显示的缓冲区即将被隐藏或关闭,后续调用此命令时不应再切换回它。
上一个缓冲区通常是当前缓冲区显示之前该窗口显示的缓冲区。但已被隐藏、关闭,或近期已由 switch-to-prev-buffer 显示过的缓冲区,不会被视为上一个缓冲区。
如果重复调用该命令已遍历完 window 之前显示的所有缓冲区,后续调用将从 window 所在框架的缓冲区列表中选取缓冲区显示(see 缓冲区列表)。
下文介绍的 switch-to-prev-buffer-skip 选项可用于禁止切换到某些缓冲区,例如已在其他窗口显示的缓冲区。此外,如果 window 所在框架设有 buffer-predicate 参数(see 缓冲区参数),该判断函数也可能禁止切换到某些缓冲区。
该命令在 window 中切换到下一个缓冲区,撤销上一次在该窗口执行 switch-to-prev-buffer 的效果。参数 window 必须是活动窗口,默认为选中窗口。
如果没有可撤销的最近 switch-to-prev-buffer 调用,该函数会尝试从 window 所在框架的缓冲区列表中显示缓冲区(see 缓冲区列表)。
switch-to-prev-buffer-skip 选项以及 window 所在框架的 buffer-predicate(see 缓冲区参数)对该命令的影响与对 switch-to-prev-buffer 相同。
默认情况下,switch-to-prev-buffer 和 switch-to-next-buffer 可以切换到已在其他窗口显示的缓冲区。下面的选项可用于覆盖这一行为。
如果该变量为 nil,switch-to-prev-buffer 可以切换到任意缓冲区,包括已在其他窗口显示的缓冲区。
如果该变量为非 nil,switch-to-prev-buffer 将避免切换到某些缓冲区。可用取值如下:
this 表示不切换到正在 switch-to-prev-buffer 操作窗口所在框架上显示的缓冲区。
visible 表示不切换到任何可见框架上显示的缓冲区。
t 表示不切换到任何活动框架上显示的缓冲区。
switch-to-prev-buffer 的 window 参数、计划切换到的缓冲区、以及 switch-to-prev-buffer 的 bury-or-kill 参数。如果该函数返回非 nil,switch-to-prev-buffer 将不会切换到第二个参数指定的缓冲区。
switch-to-next-buffer 命令同样遵守该选项。如果该选项指定为函数,switch-to-next-buffer 调用该函数时第三个参数始终为 nil。
注意,由于 bury-buffer、replace-buffer-in-windows 和 quit-restore-window 也会调用 switch-to-prev-buffer,自定义该选项也可能影响 Emacs 在退出窗口、隐藏或关闭缓冲区时的行为。
还要注意,在某些情况下 switch-to-prev-buffer 和 switch-to-next-buffer 可能忽略该选项,例如只剩下一个可切换的缓冲区时。
该用户选项应为一个正则表达式或正则表达式列表。名称匹配其中任一正则表达式的缓冲区,会被 switch-to-prev-buffer 和 switch-to-next-buffer 忽略(没有其他可切换缓冲区时除外)。