本节描述用于在某个窗口中切换到指定缓冲区的高层函数。一般来说,“切换到缓冲区(switching to a buffer)”意味着: (1) 在某个窗口中显示该缓冲区; (2) 将该窗口设为选中窗口(并将其框架设为选中框架); (3) 将该缓冲区设为当前缓冲区。
不要 为了让 Lisp 程序临时访问或修改某个缓冲区,就使用这些函数将其设为当前缓冲区。它们会产生副作用,例如修改窗口历史(see 窗口历史),这样使用会让用户感到意外。如果你只想在 Lisp 中修改某个缓冲区,应使用 with-current-buffer、save-current-buffer 或 set-buffer。See 当前缓冲区。
该命令尝试在选中窗口中显示 buffer-or-name,并将其设为当前缓冲区。它常用于交互式调用(绑定到 C-x b)以及 Lisp 程序中。返回值为切换到的缓冲区。
如果 buffer-or-name 为 nil,则默认为 other-buffer 返回的缓冲区(see 缓冲区列表)。如果 buffer-or-name 是一个字符串,但不是任何已有缓冲区的名称,该函数会以该名称创建一个新缓冲区;新缓冲区的主模式由变量 major-mode 决定(see 主模式)。
通常,指定的缓冲区会被放到缓冲区列表的头部——包括全局缓冲区列表和选中框架的缓冲区列表(see 缓冲区列表)。但如果可选参数 norecord 为非 nil,则不会执行这一操作。
有时,选中窗口可能不适合显示该缓冲区。例如选中窗口是迷你缓冲区窗口,或选中窗口被强专用到其缓冲区(see 专用窗口)。在这种情况下,该命令通常会通过调用 pop-to-buffer(见下文),尝试在其他窗口中显示缓冲区。
如果可选参数 force-same-window 为非 nil,且选中窗口不适合显示该缓冲区,那么在非交互式调用时该函数总会抛出错误。在交互式使用中,如果选中窗口是迷你缓冲区窗口,该函数会尝试使用其他窗口。如果选中窗口被强专用到其缓冲区,可以使用下文描述的 switch-to-buffer-in-dedicated-window 选项继续执行。
如果该选项为非 nil,则允许在交互式调用 switch-to-buffer、且选中窗口被强专用到其缓冲区时继续执行。
支持以下取值:
nil不允许切换,并像非交互式调用一样抛出错误。
prompt提示用户是否允许切换。
pop调用 pop-to-buffer 继续执行。
t将选中窗口标记为非专用并继续。
该选项不影响非交互式调用 switch-to-buffer。
默认情况下,switch-to-buffer 会尝试保留 window-point。可以通过以下选项调整这一行为。
如果该变量为 nil,switch-to-buffer 会在该缓冲区自身的 point 位置显示 buffer-or-name。如果该变量为 already-displayed,则会尝试在选中窗口中该缓冲区上一次显示的位置显示,前提是该缓冲区当前已在其他可见或图标化框架的窗口中显示。如果该变量为 t,switch-to-buffer 会无条件地在选中窗口中该缓冲区上一次的位置显示。
如果缓冲区已经在选中窗口中显示,或从未在其中出现过,或 switch-to-buffer 调用了 pop-to-buffer 来显示缓冲区,则该变量会被忽略。
如果该变量为非 nil,switch-to-buffer 会遵守由 display-buffer-overriding-action、display-buffer-alist 及其他显示相关变量指定的显示动作。
下面两个命令与 switch-to-buffer 类似,仅在所述特性上有所不同。
该函数在 非 选中窗口的其他窗口中显示 buffer-or-name 指定的缓冲区。它内部使用函数 pop-to-buffer(见下文)。
如果选中窗口已经在显示该缓冲区,它会继续显示,但仍会找到另一个窗口来同时显示它。
参数 buffer-or-name 和 norecord 的含义与 switch-to-buffer 相同。
该函数在新框架中显示 buffer-or-name 指定的缓冲区。它内部使用函数 pop-to-buffer(见下文)。
如果指定缓冲区已经在当前终端任意框架的其他窗口中显示,则会切换到该窗口,而非新建框架。但绝不会使用当前选中窗口。
参数 buffer-or-name 和 norecord 的含义与 switch-to-buffer 相同。
上述命令均使用 pop-to-buffer 函数,该函数可以灵活地在某个窗口中显示缓冲区并选中该窗口进行编辑。而 pop-to-buffer 又使用 display-buffer 来显示缓冲区。因此,所有影响 display-buffer 的变量也会对它生效。关于 display-buffer 的说明,参见 see 为显示缓冲区选择窗口。
该函数将 buffer-or-name 设为当前缓冲区,并在某个窗口中显示它,优先选择非当前选中的窗口。然后选中该显示窗口。如果该窗口位于不同的图形框架上,会尽可能为该框架赋予输入焦点(see 输入焦点)。
如果 buffer-or-name 为 nil,则默认为 other-buffer 返回的缓冲区(see 缓冲区列表)。如果 buffer-or-name 是一个字符串,但不是任何已有缓冲区的名称,该函数会以该名称创建一个新缓冲区;新缓冲区的主模式由变量 major-mode 决定(see 主模式)。无论如何,该缓冲区都会被设为当前缓冲区并返回,即使没有找到合适的窗口显示它。
如果 action 为非 nil,它应该是一个要传递给 display-buffer 的显示动作(see 为显示缓冲区选择窗口)。另外,非 nil 且非列表的值表示切换到非选中窗口——即便缓冲区已经在选中窗口中显示。
与 switch-to-buffer 类似,除非 norecord 为非 nil,否则该函数会更新缓冲区列表。