Закрытие окон
После того как команда использует display-buffer для отображения буфера на экране, пользователь может решить скрыть его и вернуться к предыдущей конфигурации отображения Emacs. Это называется закрытием окна. Для этого нужно вызвать quit-window, когда окно, использованное display-buffer, является выбранным окном.
Правильный способ восстановить предыдущую конфигурацию отображения зависит от того, что было сделано с окном, в котором теперь отображается буфер. Возможно, будет правильным удалить это окно, удалить его фрейм или просто отобразить в этом окне другой буфер. Осложнение состоит в том, что пользователь мог изменить конфигурацию окон после отображения этого буфера, и отменять явно запрошенные пользователем изменения нежелательно.
Чтобы quit-window могла поступать правильно, display-buffer сохраняет информацию о выполненных действиях в параметре quit-restore окна (см. Параметры окон).
- Команда: quit-window &optional kill window
-
Эта команда закрывает window и скрывает его буфер. (Она также может завершить работу с буфером, с учетом
quit-window-kill-buffer; см. ниже.) Аргумент window должен быть действующим окном; по умолчанию используется выбранное окно. Если префиксный аргумент kill не равенnil, команда завершает работу с буфером, а не скрывает его.Функция
quit-windowсначала выполняетquit-window-hook. Затем она вызывает функциюquit-restore-window, описанную ниже, которая выполняет основную работу.
Следующий параметр указывает quit-window, следует ли завершить работу с буфером window или скрыть его, когда аргумент kill равен nil.
- Пользовательский параметр: quit-window-kill-buffer
Эта переменная определяет, завершает ли
quit-windowработу с буфером, переданным в качестве аргумента window. Если значение равноnil(значение по умолчанию),quit-windowзавершает работу с буфером window только в том случае, если аргумент kill не равенnil. Если значение равноt,quit-windowпопытается завершить работу с буфером window независимо от значения аргумента kill. В противном случае значением должен быть список основных режимов;quit-windowзавершит работу с буфером window независимо от значения kill, если основной режим этого буфера входит в данный список или является производным от одного из режимов в списке. Во всех остальных случаяхquit-windowзавершит работу с буфером, только если kill не равенnil, а иначе скроет его.
Для большего контроля можно вызвать quit-restore-window вместо quit-window.
- Функция: quit-restore-window &optional window bury-or-kill
-
Эта функция обрабатывает 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.
killing-
Обрабатывается так же, как
kill, но предполагается, что работа с буфером window завершается где-то еще. Это значение используютreplace-buffer-in-windowsиquit-windows-on. buryingОбрабатывается так же, как
bury, но предполагается, что буфер window скрывается где-то еще. Это значение используетquit-windows-on.
Аргумент bury-or-kill также задает, что делать с фреймом окна window, если окно window следует удалить, оно является единственным окном во фрейме, а на том же терминале, что и этот фрейм, есть другие фреймы. Если bury-or-kill равен
kill, это означает, что фрейм нужно удалить. В противном случае судьба фрейма определяется вызовомframe-auto-hide-function(см. ниже) с этим фреймом в качестве единственного аргумента.
Параметры quit-restore и quit-restore-prev окна (см. Параметры окон) направляют quit-restore-window в процессе обработки аргумента window. Если такой параметр отсутствует или равен nil, это обычно означает, что окно создано командой наподобие split-window-below или split-window-right (см. Разделение окна в Руководстве GNU Emacs), и 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 может быть использовано повторно.
Третий элемент, owindow, — это окно, выбранное непосредственно перед отображением буфера. Если при закрытии окна window оно удаляется, выполняется попытка выбрать owindow.
Четвертый элемент, this-buffer, — это буфер, отображение которого установило параметр quit-restore. При закрытии окна window информация, сохраненная этим параметром, используется только в том случае, если в окне все еще отображается этот буфер.
quit-restore-window пытается удалить свое окно window, если (1) method равен window или frame, (2) в истории окна нет ранее отображавшихся буферов и (3) this-buffer совпадает с буфером, отображаемым в окне window в данный момент. Если window является частью атомарного окна (см. Атомарные окна), вместо этого функция попытается удалить корень этого атомарного окна. В обоих случаях она старается не сигнализировать об ошибке, если окно window нельзя удалить.
Если obuffer — это список и prev-buffer все еще активен, при закрытии окна в нем отображается prev-buffer согласно остальным элементам obuffer. Это включает изменение размера окна до height, если его временно изменили для отображения this-buffer.
В противном случае, если окно window ранее использовалось для отображения других буферов (см. История окон), в нем отображается самый последний буфер из этой истории.
Концептуально параметр quit-restore используется для отмены первой операции отображения буфера в конкретном окне. Параметр quit-restore-prev используется для отмены последней операции отображения буфера в последовательности таких операций для конкретного окна. Любая операция отображения буфера в этом окне, выполненная между ними, отменяется путем отображения буфера, который ранее показывался в этом окне.
display-buffer настраивает параметр quit-restore любого используемого им окна, если это окно было создано самой функцией или не имеет параметра quit-restore, отличного от nil. Если у окна уже есть параметр quit-restore, display-buffer добавляет параметр quit-restore-prev, элемент method которого равен same или other. В обоих случаях, если у окна уже есть параметр quit-restore-prev или quit-restore, содержимое этого параметра может быть обновлено.
quit-restore-window сначала пытается найти подходящий параметр quit-restore-prev для своего окна, указывающий, какой буфер следует показать вместо текущего. Если такой параметр не найден, функция ищет подходящий параметр quit-restore, чтобы удалить окно или показать в нем другой буфер.
После использования одного из этих параметров quit-restore-window сбрасывает его в nil. Неиспользованные параметры остаются без изменений. Эти параметры также сбрасываются функцией replace-buffer-in-windows (см. Буферы и окна), если они ссылаются на буфер, работа с которым вскоре будет завершена, — либо на буфер, указанный в prev-buffer, либо на буфер, указанный в this-buffer.
Предполагается, что все операции с этими параметрами сохраняют следующий инвариант: если у окна есть параметр quit-restore-prev, отличный от nil, у него также есть параметр quit-restore, отличный от nil.
Следующий параметр позволяет quit-restore-window более решительно удалять свое окно.
- Пользовательский параметр: quit-restore-window-no-switch
-
Если значение этого параметра равно
nil,quit-restore-windowвсегда вызываетswitch-to-prev-buffer, если только окно не было создано функциейdisplay-buffer. Если значение равноt,quit-restore-windowбудет стараться переключаться только на буферы, ранее отображавшиеся в этом окне. Если значение — символskip-first, переключение на предыдущий буфер произойдет только в том случае, если у окна есть как минимум два предыдущих буфера.В обоих случаях, если
quit-restore-windowне переключается на предыдущий буфер, она вместо этого попытается удалить окно (и, возможно, его фрейм). Также обратите внимание, что если окно закреплено,quit-restore-windowобычно не переключается в нем на предыдущий буфер.
Следующий параметр задает функцию, которая должна правильно обработать фрейм с одним окном при закрытии этого окна.
- Пользовательский параметр: frame-auto-hide-function
-
Функция, заданная этим параметром, вызывается для автоматического скрытия фреймов. Эта функция вызывается с одним аргументом — фреймом.
Указанная здесь функция вызывается функцией
bury-buffer(см. Список буферов), когда выбранное окно закреплено и в нем отображается буфер, который нужно скрыть. Она также вызывается функциейquit-restore-window(см. выше), если фрейм закрываемого окна был специально создан для отображения буфера этого окна и работа с буфером не завершается.По умолчанию вызывается
iconify-frame(см. Видимость фреймов). Также можно указатьdelete-frame(см. Удаление фреймов), чтобы убрать фрейм с экрана,make-frame-invisible, чтобы сделать фрейм невидимым,ignore, чтобы оставить фрейм без изменений, или любую другую функцию, принимающую фрейм в качестве единственного аргумента.Обратите внимание, что функция, заданная этим параметром, вызывается только в том случае, если указанный фрейм содержит лишь одно действующее окно и на том же терминале есть хотя бы один другой фрейм.
Для конкретного фрейма значение, указанное здесь, может быть переопределено параметром фрейма
auto-hide-function(см. Параметры взаимодействия фрейма).
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Quitting-Windows.html