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 должен быть активным окном; если nil, он по умолчанию равен выбранному окну.

Если 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.

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

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

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

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

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

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

Эта функция помечает window как окно, использованное наиболее недавно. Это может быть полезно при написании определённых pop-to-buffer сценариев (см. Переключение буферов). window должен быть активным окном и по умолчанию равен выбранному окну.

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

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

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

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

Copyright © 1990-1996, 1998-2022 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