После того как команда использует display-buffer для вывода буфера на экран, пользователь может решить скрыть его и вернуться к предыдущей конфигурации дисплея Emacs. Мы называем это завершением работы с окном. Способ сделать это — вызвать quit-window, пока окно, использованное display-buffer, является выбранным окном.
Правильный способ восстановить предыдущую конфигурацию дисплея зависит от того, что было сделано с окном, в котором теперь отображается буфер. Может быть правильным удалить это окно, удалить его фрейм или просто отобразить другой буфер в этом окне. Одно из усложнений заключается в том, что пользователь мог изменить конфигурацию окон после отображения этого буфера, и было бы нежелательно отменять явно запрошенные пользователем изменения.
Чтобы quit-window мог сделать правильный выбор, display-buffer сохраняет информацию о том, что он сделал, в параметре quit-restore окна (см. Параметры окон).
Эта команда завершает работу с window и прячет его буфер. Аргумент window должен быть живым окном и по умолчанию равен выбранному. С префиксным аргументом kill, не равным nil, она убивает буфер вместо того, чтобы прятать его.
Функция quit-window сначала запускает quit-window-hook. Затем она вызывает функцию quit-restore-window, описанную далее, которая выполняет основную работу.
Вы можете получить больше контроля, вызвав quit-restore-window вместо этого.
Эта функция обрабатывает window и его буфер после завершения работы. Необязательный аргумент window должен быть живым окном и по умолчанию равен выбранному. Функция учитывает параметр quit-restore окна window.
Необязательный аргумент bury-or-kill определяет, как поступить с буфером окна window. Имеют смысл следующие значения:
nilЭто означает не обрабатывать буфер каким-либо особым образом. Как следствие, если window не удалено, вызов switch-to-prev-buffer обычно снова покажет этот буфер.
appendЭто означает, что если window не удалено, его буфер перемещается в конец списка предыдущих буферов окна window (см. История окон), поэтому будущие вызовы switch-to-prev-buffer с меньшей вероятностью переключатся на него. Также он перемещает буфер в конец списка буферов фрейма (см. Список буферов).
buryЭто означает, что если window не удалено, его буфер удаляется из списка предыдущих буферов окна window. Также он перемещает буфер в конец списка буферов фрейма. Это самый надёжный способ предотвратить переключение switch-to-prev-buffer на этот буфер снова, если не убивать буфер.
killЭто означает убить буфер окна window.
Аргумент bury-or-kill также определяет, что делать с фреймом окна window, когда window должно быть удалено, если это единственное окно в его фрейме и на терминале этого фрейма есть другие фреймы. Если bury-or-kill равен kill, это означает удалить фрейм. В противном случае судьба фрейма определяется вызовом frame-auto-hide-function (см. ниже) с этим фреймом в качестве единственного аргумента.
Эта функция всегда устанавливает параметр quit-restore окна window в nil, если только она не удаляет окно.
Параметр quit-restore окна window (см. Параметры окон) должен быть nil или списком из четырёх элементов:
(method obuffer owindow this-buffer)
Первый элемент, method, является одним из четырёх символов window, frame, same и other. frame и window управляют тем, как удалять window, в то время как same и other управляют отображением некоторого другого буфера в нём.
В частности, window означает, что окно было специально создано display-buffer; frame означает, что был создан отдельный фрейм; same — что окно всегда отображало только этот буфер; other — что окно ранее показывало другой буфер.
Второй элемент, obuffer, является либо одним из символов window или frame, либо списком вида
(prev-buffer prev-window-start prev-window-point height)
который указывает, какой буфер показывался в window ранее, позиции начала окна (см. Позиции начала и конца окна) и точки окна (см. Окна и точка) для этого буфера в то время, а также высоту window в то время. Если prev-buffer всё ещё жив при завершении работы с window, завершение работы с окном может повторно использовать window для отображения prev-buffer.
Третий элемент, owindow, — это окно, которое было выбрано непосредственно перед выполнением отображения. Если при завершении работы window удаляется, оно пытается выбрать owindow.
Четвёртый элемент, this-buffer, — это буфер, отображение которого установило параметр quit-restore. Завершение работы с window может удалить это окно, только если оно всё ещё показывает этот буфер.
Завершение работы с window пытается удалить его тогда и только тогда, когда (1) method равен либо window, либо frame, (2) окно не имеет истории ранее отображавшихся буферов и (3) this-buffer равен буферу, который в данный момент отображается в window. Если window является частью атомарного окна (см. Атомарные окна), завершение работы попытается удалить корень этого атомарного окна вместо него. В любом случае оно старается избежать сигнала об ошибке, если window не может быть удалено.
Если obuffer является списком и prev-buffer всё ещё жив, завершение работы отображает prev-buffer в window в соответствии с остальными элементами obuffer. Это включает изменение размера окна до height, если оно было временно изменено для отображения this-buffer.
В противном случае, если window ранее использовалось для отображения других буферов (см. История окон), будет отображён самый последний буфер из этой истории.
Следующая опция определяет функцию, которая выполняет правильные действия с фреймом, содержащим одно окно, при завершении работы с этим окном.
Функция, заданная этой опцией, вызывается для автоматического скрытия фреймов. Эта функция вызывается с одним аргументом — фреймом.
Функция, указанная здесь, вызывается bury-buffer (см. Список буферов), когда выбранное окно является закреплённым и показывает буфер, который нужно спрятать. Она также вызывается quit-restore-window (см. выше), когда фрейм окна, с которым завершается работа, был специально создан для отображения буфера этого окна, и буфер не убит.
По умолчанию вызывается iconify-frame (см. Видимость фреймов). В качестве альтернативы вы можете указать delete-frame (см. Удаление фреймов), чтобы удалить фрейм с его дисплея, make-frame-invisible, чтобы сделать фрейм невидимым, ignore, чтобы оставить фрейм без изменений, или любую другую функцию, которая может принимать фрейм в качестве единственного аргумента.
Обратите внимание, что функция, указанная этой опцией, вызывается только в том случае, если указанный фрейм содержит только одно живое окно и на том же терминале есть по крайней мере ещё один фрейм.
Для конкретного фрейма значение, указанное здесь, может быть переопределено параметром фрейма auto-hide-function (см. Параметры взаимодействия фреймов).