窗口配置(window configuration) 会记录单个框架的完整布局:
所有窗口、它们的大小、装饰、所显示的缓冲区、滚动状态、窗口点(window-point),
同时也包含 minibuffer-scroll-window 的值。
唯一特殊的例外是:窗口配置**不会记录**当前缓冲区在选中窗口中的点(point)值。
通过恢复之前保存的窗口配置,你可以还原整个框架的布局。 如果你想记录所有框架而非单个框架的布局,应使用**框架配置**而非窗口配置。 See 框架配置。
该函数返回一个新对象,代表 frame 当前的窗口配置。
frame 默认为当前选中框架。
变量 window-persistent-parameters 规定了该函数会保存哪些窗口参数(如果有)。
See 窗口参数。
该函数会根据 configuration 所指定的内容,恢复其创建时对应 框架 的窗口和缓冲区配置,无论该 框架 是否处于选中状态。参数 configuration 必须是此前针对该 框架 调用 current-window-configuration 所返回的值。默认情况下,该函数还会选中配置中记录的 框架;但如果 dont-set-frame 的值非 nil,则会保留函数执行之初已选中的 框架。
默认情况下,该函数会恢复已保存的迷你缓冲区(若有);但如果 dont-set-miniwindow 的值非 nil,则函数执行之初的迷你缓冲区(若有)会保留在迷你窗口中。
如果保存 configuration 时对应的 框架 已失效,该函数仅会恢复变量 minibuffer-scroll-window 的值,并调整 minibuffer-selected-window 返回的值。这种情况下,函数会返回 nil;否则返回 t。
当该函数尝试恢复某个窗口(其缓冲区在 configuration 记录后被删除)时,会参考变量 window-restore-killed-buffer-windows(见下文)。
以下是使用该函数实现与 save-window-excursion 相同效果的方式:
(let ((config (current-window-configuration)))
(unwind-protect
(progn (split-window-below nil)
...)
(set-window-configuration config)))
该宏会记录选中 框架 的窗口配置,依次执行 forms,然后恢复之前的窗口配置。其返回值为 forms 中最后一个形式的执行结果。
大多数 Lisp 代码不应使用该宏;save-selected-window 通常已能满足需求。具体而言,该宏无法可靠阻止 forms 中的代码打开新窗口,因为新窗口可能会在其他 框架 中打开(see 为显示缓冲区选择窗口),而 save-window-excursion 仅保存和恢复当前 框架 的窗口配置。
若 object 是一个窗口配置,该函数返回 t。
该函数用于判断两个窗口配置是否具有相同的窗口布局,但会忽略光标位置(point)和已保存的滚动位置的值——即便这些方面存在差异,函数仍可能返回 t。
该函数返回生成窗口配置 config 所对应的 框架。
理论上,还可以实现其他用于查看窗口配置内部信息的原语,但由于我们暂未需要这些功能,因此尚未实现。可参考文件 winner.el,其中包含更多针对窗口配置的操作。
current-window-configuration 返回的对象会随 Emacs 进程的终止而失效。若要将窗口配置存储到磁盘,并在另一个 Emacs 会话中读取恢复,可使用接下来介绍的函数。这些函数也可用于将一个 框架 的状态克隆到任意活跃窗口中(set-window-configuration 实际上仅能将某个 框架 的窗口克隆到该 框架 自身的根窗口中)。
该函数以 Lisp 对象的形式返回 window 的状态。参数 window 必须是有效的窗口,默认值为选中 框架 的根窗口。
若可选参数 writable 的值非 nil,表示在获取 window-point 或 window-start 等位置信息时不使用标记(marker)。当需要将状态写入磁盘并在另一个会话中读取时,该参数应设为非 nil。
参数 writable 与变量 window-persistent-parameters 共同决定了该函数会保存哪些窗口参数。See 窗口参数。
window-state-get 返回的值可在同一会话中用于在另一个窗口克隆目标窗口的状态,也可写入磁盘并在另一个会话中读取。无论哪种场景,均可通过以下函数恢复窗口状态。
该函数将窗口状态 state 应用到 window 中。参数 state 应为此前调用 window-state-get 返回的窗口状态(见上文)。可选参数 window 可以是活跃窗口或内部窗口(see 窗口与框架)。若 window 不是活跃窗口,函数会先在同一 框架 中创建一个新的活跃窗口,再将 state 应用到该新窗口中。若 window 为 nil,则会将窗口状态应用到一个新创建的窗口中。
当该函数尝试恢复某个窗口(其缓冲区在 state 记录后被删除)时,会参考变量 window-restore-killed-buffer-windows(见下文)。
若可选参数 ignore 的值非 nil,表示忽略窗口最小尺寸限制和固定尺寸限制。若 ignore 的值为 safe,表示窗口可缩小至仅 1 行和/或 2 列。
默认情况下,当 set-window-configuration 和 window-state-put 发现待恢复配置中的某个窗口对应的缓冲区已被删除(自配置/状态记录后),可能会将该窗口从恢复的配置中移除。可通过接下来介绍的变量微调此行为。
该变量指定 set-window-configuration 和 window-state-put 应如何处理「其缓冲区自对应配置/状态记录后已被删除」的窗口。此类窗口在调用这些函数时,可能仍处于活跃状态(此时显示的是其他缓冲区),也可能已失效。通常,set-window-configuration 会保留仍活跃的窗口,而 window-state-put 会删除该窗口。
可通过以下值覆盖默认行为:对于 set-window-configuration,覆盖的是失效窗口的处理逻辑;对于 window-state-put,覆盖的是失效和活跃窗口的处理逻辑。
t该值表示无条件恢复窗口,并在其中显示其他缓冲区。
delete该值表示无条件尝试删除窗口。
dedicated该值表示仅当窗口专用于其原缓冲区时,才尝试删除该窗口。
nil这是默认值,表示 set-window-configuration 仅在窗口专用于其原缓冲区时尝试删除该窗口,而 window-state-put 会无条件尝试删除该窗口。
该值表示恢复窗口并在其中显示其他缓冲区(与值为 t 时的行为一致),同时将该窗口的条目添加到一个列表中,后续该列表会作为第二个参数传递给该函数。
若窗口无法被删除(通常因为它是其所属 框架 中的最后一个窗口),set-window-configuration 和 window-state-put 会在该窗口中显示另一个缓冲区。
若该变量的值是一个函数,该函数应接收三个参数:第一个参数指定已完成窗口恢复的 框架;第三个参数为符号 configuration(若窗口通过 set-window-configuration 恢复)或符号 state(若窗口通过 window-state-put 恢复)。
第二个参数是一个条目列表,包含 所有 在 set-window-configuration 或 window-state-put 尝试恢复时发现原缓冲区已失效的窗口(迷你缓冲区窗口除外)。这意味着该函数也可能删除 set-window-configuration 判定为活跃的窗口。
传递给该函数的第二个参数(条目列表)中,每个条目本身是一个包含六个值的列表:原缓冲区失效的窗口、已失效的缓冲区(或其名称)、该缓冲区在该窗口中的 window-start(see 窗口起始与结束位置)和 window-point(see 窗口(window)与点(Point))位置、window-dedicated-p 此前报告的窗口专用状态、以及一个标记(若 set-window-configuration 判定该窗口活跃则为 t,否则为 nil)。
函数 window-state-get 和 window-state-put 也可用于交换两个活跃窗口的内容。以下函数专门实现此功能:
该命令交换两个活跃窗口 window-1 和 window-2 的状态。window-1 必须指定一个活跃窗口,默认值为选中的窗口。window-2 必须指定一个活跃窗口,默认值为窗口循环顺序中 window-1 的下一个窗口(排除迷你缓冲区窗口,包含所有可见 框架 上的活跃窗口)。
可选参数 size 非 nil 表示同时尝试交换 window-1 和 window-2 的尺寸。值为 height 表示仅交换高度,值为 width 表示仅交换宽度,而值为 t 表示尽可能同时交换宽度和高度。该函数不会调整 框架 的大小。