29.11 缓冲区与窗口

本节描述用于查看和设置窗口内容的底层函数。关于在窗口中显示指定缓冲区的高层函数,参见 see 在窗口中切换到缓冲区

Function: window-buffer &optional window

该函数返回 window 正在显示的缓冲区。如果 window 被省略或为 nil,则默认为选中窗口。如果 window 是内部窗口,该函数返回 nil

Function: set-window-buffer window buffer-or-name &optional keep-margins

该函数让 window 显示 buffer-or-namewindow 必须是活动窗口;若为 nil,则默认为选中窗口。buffer-or-name 可以是一个缓冲区,或是某个已有缓冲区的名称。该函数不会改变当前选中的窗口,也不会直接改变当前缓冲区(see 当前缓冲区)。返回值为 nil

如果 window 被**强专用**于某个缓冲区,而 buffer-or-name 并非该缓冲区,该函数会抛出错误。See 专用窗口

默认情况下,该函数会根据指定缓冲区中的局部变量,重置 window 的位置、显示边距、 fringe 宽度和滚动条设置。但如果可选参数 keep-margins 为非 nil,则会保留 window 的显示边距、fringe 和滚动条设置不变。

在编写应用程序时,通常应使用 display-buffer(see 为显示缓冲区选择窗口)或 在窗口中切换到缓冲区 中描述的高层函数,而非直接调用 set-window-buffer

该函数会运行 window-scroll-functions,随后运行 window-configuration-change-hook。See 窗口滚动与变更的钩子函数

Variable: buffer-display-count

这个缓冲区局部变量记录一个缓冲区被显示在窗口中的次数。每次对该缓冲区调用 set-window-buffer 时,该值都会加一。

Variable: buffer-display-time

这个缓冲区局部变量记录一个缓冲区最后一次被显示在窗口中的时间。如果该缓冲区从未被显示过,值为 nil。每次对该缓冲区调用 set-window-buffer 时,都会用 current-time(see 时刻)的返回值更新该变量。

Function: get-buffer-window &optional buffer-or-name all-frames

该函数从选中窗口开始,按窗口循环顺序返回第一个显示 buffer-or-name 的窗口(see 窗口循环顺序)。如果不存在这样的窗口,返回值为 nil

buffer-or-name 可以是缓冲区或缓冲区名称;若被省略或为 nil,则默认为当前缓冲区。可选参数 all-frames 指定要考虑的窗口范围:

  • t 表示考虑所有已存在框架上的窗口。
  • visible 表示考虑所有可见框架上的窗口。
  • 0 表示考虑所有可见或已图标化的框架上的窗口。
  • 一个框架 表示只考虑该框架上的窗口。
  • 其他任意值 表示只考虑选中框架上的窗口。

注意,这些含义与 next-windowall-frames 参数略有不同(see 窗口循环顺序)。该函数可能在 Emacs 未来版本中被修改以消除这一差异。

Function: get-buffer-window-list &optional buffer-or-name minibuf all-frames

该函数返回当前显示 buffer-or-name 的所有窗口组成的列表。buffer-or-name 可以是缓冲区或已有缓冲区的名称。若被省略或为 nil,则默认为当前缓冲区。如果当前选中窗口正在显示 buffer-or-name,它会出现在该函数返回列表的首位。

参数 minibufall-frames 的含义与函数 next-window 相同(see 窗口循环顺序)。注意,all-frames 参数的行为与 get-buffer-window 中的**并不完全一致**。

Command: replace-buffer-in-windows &optional buffer-or-name

该命令在所有显示 buffer-or-name 的窗口中,将其替换为其他缓冲区。buffer-or-name 可以是缓冲区或已有缓冲区的名称;若被省略或为 nil,则默认为当前缓冲区。

每个窗口中的替换缓冲区通过 switch-to-prev-buffer 选择(see 窗口历史)。除侧边窗口外(see 侧边窗口),任何显示 buffer-or-name 的专用窗口都会被尽可能删除(see 专用窗口)。如果该窗口是其框架上的唯一窗口,且同一终端上还有其他框架,则该框架也会被删除。如果该专用窗口是其终端上唯一框架中的唯一窗口,则仍会替换缓冲区。