Spec-Zone.ru › Elisp

Выбор окон

В каждом кадре в любой момент ровно одно окно Emacs считается выбранным в кадре. В выбранном кадре это окно называется выбранным окном — в нём выполняется большая часть редактирования и отображается курсор выбранных окон (см. Параметры курсора). Ввод с клавиатуры, который вставляет или удаляет текст, также обычно направляется в это окно. Буфер выбранного окна обычно также является текущим буфером, за исключением случаев, когда использовался set-buffer (см. Текущий буфер). Что касается невыбранных кадров, окно, выбранное в кадре, становится выбранным окном, если этот кадр когда-либо будет выбран.

Функция: selected-window

Эта функция возвращает выбранное окно (которое всегда является действующим окном).

Следующая функция явно выбирает окно и его кадр.

Функция: select-window window &optional norecord

Эта функция делает window выбранным окном и окном, выбранным в его кадре, а также выбирает этот кадр. Кроме того, она делает буфер window (см. Буферы и окна) текущим и устанавливает значение point этого буфера равным значению window-point в window (см. Окна и точка). window должно быть действующим окном. Возвращаемое значение — window.

По умолчанию эта функция также перемещает буфер window в начало списка буферов (см. Список буферов) и делает window окном, выбранным последним. Если необязательный аргумент norecord не равен nil, эти дополнительные действия не выполняются.

Кроме того, по умолчанию эта функция также сообщает механизму отображения, что нужно обновить отображение window при следующем перерисовывании его кадра. Если norecord не равен nil, такие обновления обычно не выполняются. Однако если norecord равен специальному символу mark-for-redisplay, дополнительные действия, упомянутые выше, не выполняются, но отображение window всё же обновляется.

Обратите внимание, что иногда выбора окна недостаточно, чтобы показать его или вывести его кадр на передний план: может потребоваться также поднять кадр или убедиться, что фокус ввода направлен на него. См. Фокус ввода.

По историческим причинам Emacs не запускает отдельный хук при каждом выборе окна. Приложения и внутренние процедуры часто временно выбирают окно, чтобы выполнить над ним несколько действий. Они делают это либо для упрощения кода — поскольку многие функции по умолчанию работают с выбранным окном, если аргумент window не указан, — либо потому, что некоторые функции не принимали (и до сих пор не принимают) окно в качестве аргумента и всегда работали (и работают) с выбранным окном. Запускать хук каждый раз при кратковременном выборе окна, а затем ещё раз при восстановлении ранее выбранного окна было бы бесполезно.

Однако, когда аргумент norecord равен nil, select-window обновляет список буферов и тем самым косвенно запускает обычный хук buffer-list-update-hook (см. Список буферов). Следовательно, этот хук позволяет запускать функцию каждый раз, когда окно выбирается более «постоянно».

Поскольку buffer-list-update-hook также запускается функциями, не связанными с управлением окнами, обычно имеет смысл сохранить где-либо значение выбранного окна и сравнить его со значением selected-window при выполнении этого хука. Кроме того, чтобы избежать ложных срабатываний при использовании buffer-list-update-hook, рекомендуется, чтобы каждый вызов select-window, предназначенный для временного выбора окна, передавал ненулевой аргумент norecord nil. По возможности в таких случаях следует использовать макрос with-selected-window (см. ниже).

Emacs также запускает хук window-selection-change-functions каждый раз, когда процедура перерисовки обнаруживает, что с момента последней перерисовки было выбрано другое окно. Подробное объяснение см. в разделе Хуки прокрутки и изменений окон. window-state-change-functions (описанный в том же разделе) — ещё один аномальный хук, запускаемый после выбора другого окна, но он также срабатывает при других изменениях окон.

Последовательность вызовов select-window с ненулевым аргументом norecord nil определяет порядок окон по времени их выбора или использования (см. ниже). Например, функцию get-lru-window можно использовать для получения окна, выбранного давнее всего (см. Циклический порядок окон).

Функция: frame-selected-window &optional frame

Эта функция возвращает окно в frame, выбранное в этом кадре. frame должен быть действующим кадром; если аргумент опущен или равен nil, по умолчанию используется выбранный кадр.

Функция: set-frame-selected-window frame window &optional norecord

Эта функция делает window окном, выбранным в кадре frame. frame должен быть действующим кадром; если он равен nil, по умолчанию используется выбранный кадр. window должно обозначать действующее окно.

Если frame является выбранным кадром, эта функция делает window выбранным окном.

Если необязательный аргумент norecord не равен nil, эта функция не изменяет порядок окон, выбранных последними, и список буферов.

Следующие макросы полезны для временного выбора окна без изменения порядка недавно выбранных окон или списка буферов.

Макрос: save-selected-window forms…

Этот макрос запоминает выбранный кадр, а также выбранное окно каждого кадра, последовательно выполняет forms, а затем восстанавливает ранее выбранные кадр и окна. Он также сохраняет и восстанавливает текущий буфер. Макрос возвращает значение последней формы в forms.

Этот макрос не сохраняет и не восстанавливает размеры, расположение или содержимое окон; поэтому, если forms изменят их, изменения сохранятся. Если ранее выбранное окно какого-либо кадра к моменту завершения forms уже не является действующим, выбранное окно этого кадра остаётся без изменений. Если ранее выбранное окно больше не является действующим, выбранным остаётся окно, выбранное в конце выполнения forms. Текущий буфер восстанавливается только в том случае, если при выходе из forms он всё ещё является действующим.

Этот макрос не изменяет ни порядок недавно выбранных окон, ни список буферов.

Макрос: with-selected-window window forms…

Этот макрос выбирает window, последовательно выполняет forms, а затем восстанавливает ранее выбранное окно и текущий буфер. Порядок недавно выбранных окон и список буферов остаются неизменными, если только вы намеренно не измените их внутри forms, например вызвав select-window с аргументом norecord nil. Поэтому этот макрос предпочтителен для временной работы с window в качестве выбранного окна без ненужного запуска buffer-list-update-hook.

Обратите внимание, что этот макрос временно переводит код управления окнами в нестабильное состояние. В частности, окно, использовавшееся последним (см. ниже), не обязательно будет совпадать с выбранным окном. Поэтому такие функции, как get-lru-window и get-mru-window, при вызове из тела этого макроса могут возвращать неожиданные результаты.

Макрос: with-selected-frame frame forms…

Этот макрос выполняет forms, используя frame в качестве выбранного кадра. Возвращается значение последней формы в forms. Этот макрос сохраняет и восстанавливает выбранный кадр, не изменяя ни порядок недавно выбранных окон, ни порядок буферов в списке буферов.

Функция: window-use-time &optional window

Эта функция возвращает время использования окна window. window должно быть действующим окном; по умолчанию используется выбранное окно.

Время использования окна на самом деле не является значением времени, а представляет собой целое число, монотонно увеличивающееся при каждом вызове select-window с ненулевым аргументом norecord nil. Окно с наименьшим временем использования обычно называют окном, которое использовалось давнее всего. Окно с наибольшим временем использования называют окном, которое использовалось последним (см. Циклический порядок окон); обычно это выбранное окно, если не использовался with-selected-window.

Функция: window-bump-use-time &optional window

Эта функция помечает window как окно, использовавшееся вторым последним (после выбранного окна). Она ничего не делает, если window является выбранным окном или выбранное окно не имеет наибольшего времени использования среди всех окон, что может происходить в области действия with-selected-window.

Иногда несколько окон совместно и согласованно отображают буфер, например под управлением режима Follow (см. (emacs)Режим Follow), когда вместе окна показывают большую часть буфера, чем одно окно могло бы показать самостоятельно. Часто удобно рассматривать такую группу окон как единое целое. Несколько функций, например window-group-start (см. Начальная и конечная позиции окна), позволяют это сделать: в качестве аргумента передайте одно из окон, представляющее всю группу.

Функция: selected-window-group

Если выбранное окно входит в группу окон, эта функция возвращает список окон группы, упорядоченный так, что первое окно в списке отображает самую раннюю часть буфера и так далее. В противном случае функция возвращает список, содержащий только выбранное окно.

Выбранное окно считается частью группы, если локальная переменная буфера selected-window-group-function содержит функцию. В этом случае selected-window-group вызывает её без аргументов и возвращает результат (который должен быть списком окон группы).

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/Selecting-Windows.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API