当某个命令使用 display-buffer 将缓冲区显示在屏幕上后,用户可能希望隐藏它并回到之前的 Emacs 显示布局。我们称之为退出窗口(quitting the window)。实现方式是在由 display-buffer 使用的窗口为选中窗口时,调用 quit-window。
恢复之前显示布局的正确方式,取决于当前显示缓冲区的窗口被如何修改。可能需要删除该窗口、删除其所在框架,或仅在该窗口中显示另一个缓冲区。一个复杂点在于:用户可能在显示该缓冲区后手动修改了窗口布局,此时撤销用户明确操作是不合适的。
为了让 quit-window 正确工作,display-buffer 会在窗口的 quit-restore 参数中保存相关操作信息(see 窗口参数)。
该命令退出 window 并隐藏其缓冲区。参数 window 必须是活动窗口,默认为选中窗口。带前缀参数 kill 且非 nil 时,会关闭而非隐藏缓冲区。
quit-window 首先运行 quit-window-hook,然后调用下文介绍的 quit-restore-window 完成实际工作。
你可以直接调用 quit-restore-window 获得更精细的控制。
该函数处理退出后的 window 及其缓冲区。可选参数 window 必须是活动窗口,默认为选中窗口。函数会参考 window 的 quit-restore 参数。
可选参数 bury-or-kill 指定如何处理 window 的缓冲区,可用值如下:
ni不对缓冲区做特殊处理。因此,如果 window 未被删除,后续调用 switch-to-prev-buffer 通常会再次显示该缓冲区。
append如果 window 未被删除,将其缓冲区移到该窗口历史缓冲区列表末尾(see 窗口历史),降低后续 switch-to-prev-buffer 切回的概率。同时将缓冲区移到框架缓冲区列表末尾(see 缓冲区列表)。
bury如果 window 未被删除,将其缓冲区从窗口历史列表中移除,并移到框架缓冲区列表末尾。这是不关闭缓冲区的前提下,防止 switch-to-prev-buffer 再次切回的最可靠方式。
kill关闭 window 中的缓冲区。
当 window 是其框架上的唯一窗口、且同一终端还有其他框架、需要删除该窗口时,bury-or-kill 还指定如何处理其框架。若值为 kill,则删除框架;否则通过调用 frame-auto-hide-function(见下文)处理框架。
除非删除窗口,否则该函数总会将 window 的 quit-restore 参数设为 nil。
窗口 window 的 quit-restore 参数(see 窗口参数)应为 nil 或包含四个元素的列表:
(method obuffer owindow this-buffer)
第一个元素 method 是四个符号之一:window、frame、same、other。frame 和 window 控制如何删除窗口,same 和 other 控制在其中显示其他缓冲区。
具体来说:window 表示该窗口由 display-buffer 专门创建;frame 表示专门创建了独立框架;same 表示该窗口只显示过当前缓冲区;other 表示该窗口之前显示过其他缓冲区。
第二个元素 obuffer 是符号 window 或 frame,或是如下格式的列表:
(prev-buffer prev-window-start prev-window-point height)
表示该窗口之前显示的缓冲区、当时的窗口起始位置(see 窗口起始与结束位置)、光标位置(see 窗口(window)与点(Point))以及当时的窗口高度。退出窗口时如果 prev-buffer 仍然存活,可能会复用 window 重新显示它。
第三个元素 owindow 是显示操作执行前刚刚被选中的窗口。如果退出操作删除了 window,会尝试选中 owindow。
第四个元素 this-buffer 是设置该 quit-restore 参数的那个缓冲区。只有当窗口仍显示该缓冲区时,退出操作才可能删除它。
退出 window 会尝试删除它,当且仅当:(1) method 为 window 或 frame;(2) 该窗口没有历史显示缓冲区;(3) this-buffer 与当前显示缓冲区一致。如果 window 属于原子窗口(see 原子窗口),退出会尝试删除该原子窗口的根窗口。无论哪种情况,都会尽量避免因无法删除窗口而报错。
如果 obuffer 是列表且 prev-buffer 存活,退出操作会根据 obuffer 其余元素在 window 中显示 prev-buffer,包括将窗口恢复到之前的高度(如果为显示 this-buffer 被临时调整过)。
否则,如果 window 之前显示过其他缓冲区(see 窗口历史),则显示历史中最近的缓冲区。
下面选项指定一个函数,用于在退出仅含单个窗口的框架时进行合适处理。
该选项指定的函数用于自动隐藏框架,调用时接收一个框架作为参数。
当选中窗口为专用窗口且显示即将被隐藏的缓冲区时,bury-buffer(see 缓冲区列表)会调用该函数。当退出窗口的框架是专门为显示该缓冲区创建、且缓冲区未被关闭时,quit-restore-window(见上文)也会调用它。
默认调用 iconify-frame(see 框架的可见性)。你也可以指定 delete-frame(see 删除框架)删除框架、make-frame-invisible 隐藏框架、ignore 不做处理,或其他可接收单个框架参数的函数。
注意,只有当指定框架只包含一个活动窗口、且同一终端至少还有一个其他框架时,才会调用该函数。
对特定框架,此处设置可能被该框架的 auto-hide-function 参数覆盖(see 框架交互参数)。