29.10 Циклический порядок окон

Когда вы используете команду C-x o (other-window) для выбора какого-либо другого окна, она перемещается по живым окнам в определённом порядке. Для любой заданной конфигурации окон этот порядок никогда не меняется. Он называется циклическим порядком окон.

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

Функция: next-window &optional window minibuf all-frames

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

Необязательный аргумент minibuf указывает, должны ли окна минибуфера включаться в циклический порядок. Обычно, когда minibuf равен nil, окно минибуфера включается, только если оно в данный момент активно; это соответствует поведению C-x o. (Обратите внимание, что окно минибуфера активно, пока используется его минибуфер; см. Минибуферы).

Если minibuf равен t, циклический порядок включает все окна минибуфера. Если minibuf не равен ни t, ни nil, окна минибуфера не включаются, даже если они активны.

Необязательный аргумент all-frames указывает, какие кадры рассматривать:

  • nil означает рассматривать окна на кадре window. Если окно минибуфера рассматривается (как указано аргументом minibuf), то также рассматриваются кадры, которые используют это окно минибуфера.
  • t означает рассматривать окна на всех существующих кадрах.
  • visible означает рассматривать окна на всех видимых кадрах.
  • 0 означает рассматривать окна на всех видимых или свёрнутых в иконку кадрах.
  • Кадр означает рассматривать окна только на этом конкретном кадре.
  • Что-либо ещё означает рассматривать окна на кадре window и никакие другие.

Если рассматривается более одного кадра, циклический порядок получается путём добавления порядков для этих кадров в том же порядке, что и список всех живых кадров (см. Поиск всех кадров).

Функция: previous-window &optional window minibuf all-frames

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

Команда: other-window count &optional all-frames

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

Необязательный аргумент all-frames имеет тот же смысл, что и в next-window, как если бы аргумент minibuf для next-window был равен nil. При интерактивном вызове all-frames всегда равен nil, поэтому могут быть выбраны только окна на выбранном кадре.

Эта команда не выбирает окно, у которого параметр окна no-other-window не равен nil (см. Параметры окон), при условии, что ignore-window-parameters равен nil.

Если параметр other-window выбранного окна является функцией, и ignore-window-parameters равен nil, то эта функция будет вызвана с аргументами count и all-frames вместо обычного поведения этой команды.

Функция: walk-windows fun &optional minibuf all-frames

Эта функция вызывает функцию fun один раз для каждого живого окна, передавая окно в качестве аргумента.

Она следует циклическому порядку окон. Необязательные аргументы minibuf и all-frames задают набор окон, включаемых в обход; они имеют те же значения, что и в next-window. Если all-frames указывает кадр, первым обходимым окном является первое окно на этом кадре (то, которое возвращается frame-first-window), а не обязательно выбранное окно.

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

Функция: one-window-p &optional no-mini all-frames

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

Если окно минибуфера активно, оно обычно учитывается (так что эта функция возвращает nil). Однако если необязательный аргумент no-mini не равен nil, окно минибуфера игнорируется, даже если оно активно. Необязательный аргумент all-frames имеет тот же смысл, что и для next-window.

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

Функция: get-lru-window &optional all-frames dedicated not-selected no-other

Эта функция возвращает живое окно, которое эвристически является наименее недавно использовавшимся. Наименее недавно использовавшееся окно — это окно, которое было выбрано наименее недавно, то есть окно, время использования которого меньше, чем время использования всех остальных живых окон (см. Выбор окон). Необязательный аргумент all-frames имеет тот же смысл, что и в next-window.

Если присутствуют какие-либо полноширинные окна, рассматриваются только эти окна. Окно минибуфера никогда не является кандидатом. Выделенное окно (см. Выделенные окна) никогда не является кандидатом, если только необязательный аргумент dedicated не равен nil. Выбранное окно никогда не возвращается, если только оно не является единственным кандидатом. Однако если необязательный аргумент not-selected не равен nil, эта функция возвращает nil в таком случае. Необязательный аргумент no-other, если не равен nil, означает никогда не возвращать окно, у которого параметр no-other-window не равен nil.

Функция: get-mru-window &optional all-frames dedicated not-selected no-other

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

Поскольку на практике наиболее недавно использовавшееся окно всегда является выбранным, обычно имеет смысл вызывать эту функцию только с не равным nil аргументом not-selected.

Функция: get-largest-window &optional all-frames dedicated not-selected no-other

Эта функция возвращает окно с наибольшей площадью (высота, умноженная на ширину). Если два окна-кандидата имеют одинаковый размер, она предпочитает то, которое идёт первым в циклическом порядке окон, начиная с выбранного окна. Смысл аргументов тот же, что и для get-lru-window.

Функция: get-window-with-predicate predicate &optional minibuf all-frames default

Эта функция вызывает функцию predicate для каждого из окон в циклическом порядке по очереди, передавая ей окно в качестве аргумента. Если предикат возвращает не nil для какого-либо окна, эта функция останавливается и возвращает это окно. Если такое окно не найдено, возвращаемым значением является default (по умолчанию nil).

Необязательные аргументы minibuf и all-frames задают окна для поиска и имеют те же значения, что и в next-window.