Функции-действия для отображения буфера
Функция-действие — это функция, которую вызывает display-buffer для выбора окна, в котором следует отобразить буфер. Функции-действия принимают два аргумента: buffer — буфер для отображения и alist — список ассоциаций действия (см. Списки ассоциаций действий для отображения буфера). Предполагается, что в случае успеха они возвращают окно, отображающее buffer, а в случае неудачи — nil.
В Emacs определены следующие основные функции-действия.
- Функция: display-buffer-same-window buffer alist
Эта функция пытается отобразить buffer в выбранном окне. Она завершается неудачей, если выбранное окно является окном минибуфера или закреплено за другим буфером (см. Закреплённые окна). Она также завершается неудачей, если alist содержит запись
nilinhibit-same-window.
- Функция: display-buffer-reuse-window buffer alist
-
Эта функция пытается отобразить buffer, найдя окно, в котором он уже отображается. Окна выбранного кадра имеют приоритет перед окнами других кадров.
Если alist содержит запись
nilinhibit-same-window, выбранное окно нельзя использовать повторно. Набор кадров, в которых следует искать окно, уже отображающее buffer, можно указать с помощью записи списка ассоциаций действияreusable-frames. Если alist не содержит записиreusable-frames, эта функция выполняет поиск только в выбранном кадре.Если эта функция выбирает окно в другом кадре, она делает этот кадр видимым и, если alist не содержит записи
inhibit-switch-frame, при необходимости поднимает его.Если alist содержит запись
nilreuse-indirect, а окно, отображающее buffer, не найдено, эта функция пытается найти окно, косвенно связанное с buffer — окно, для которогоwindow-indirect-buffer-p(см. Буферы и окна) при передаче окна и buffer в качестве аргументов возвращаетnil. Если такое окно найдено и CDR записиreuse-indirectравен символуbuffer, функция не заменяет буфер этого окна на buffer, а возвращает окно с прежним буфером. В противном случае она помещает buffer в это окно и возвращает его.
- Функция: display-buffer-reuse-mode-window buffer alist
-
Эта функция пытается отобразить buffer, найдя окно, в котором отображается буфер в заданном режиме.
Если alist содержит запись
mode, её значение задаёт основной режим (символ) или список основных режимов. Если alist не содержит записиmode, вместо неё используется текущий основной режим buffer. Кандидатом считается окно, отображающее буфер в режиме, производном от одного из указанных таким образом режимов.Поведение также определяется записями alist для
inhibit-same-window,reusable-framesиinhibit-switch-frame, как и в случаеdisplay-buffer-reuse-window.
- Функция: display-buffer-pop-up-window buffer alist
-
Эта функция пытается отобразить buffer, разделив самое большое или наименее недавно использовавшееся окно (обычно расположенное в выбранном кадре). Для разделения она вызывает функцию, заданную с помощью
split-window-preferred-function(см. Дополнительные параметры отображения буферов).Размер нового окна можно настроить, добавив в alist записи
window-heightиwindow-width. Если alist содержит записьpreserve-size, Emacs также попытается сохранить размер нового окна при последующих операциях изменения размера (см. Сохранение размеров окон).Эта функция завершается неудачей, если разделить окно невозможно. Чаще всего это происходит потому, что ни одно окно не имеет размера, достаточного для разделения. В этом случае может помочь установка
split-height-thresholdилиsplit-width-thresholdв меньшее значение. Разделение также завершается неудачей, если у выбранного кадра есть параметр кадраunsplittable; см. Параметры буфера.
- Функция: display-buffer-in-previous-window buffer alist
-
Эта функция пытается отобразить buffer в окне, в котором он отображался ранее.
Если alist содержит запись
nilinhibit-same-window, выбранное окно нельзя использовать. Закреплённое окно можно использовать, только если в нём уже отображается buffer. Если alist содержит записьprevious-window, указанное в ней окно можно использовать, даже если в нём раньше никогда не отображался buffer.Если alist содержит запись
reusable-frames(см. Списки ассоциаций действий для отображения буфера), её значение определяет, в каких кадрах искать подходящее окно. Если alist не содержит записиreusable-frames, эта функция ищет только в выбранном кадре, еслиdisplay-buffer-reuse-framesиpop-up-framesравныnil; если хотя бы одна из этих переменных не равнаnil, она ищет во всех кадрах на текущем терминале.Если по этим правилам пригодны несколько окон, функция выбирает их в следующем порядке предпочтения:
- Окно, заданное любой записью
previous-windowв alist, если это не выбранное окно. - Окно, в котором ранее отображался buffer, если это не выбранное окно.
- Выбранное окно, если оно задано записью
previous-windowв alist или в нём ранее отображался buffer.
- Окно, заданное любой записью
- Функция: display-buffer-use-some-window buffer alist
-
Эта функция пытается отобразить buffer, выбрав существующее окно и выведя буфер в нём. Сначала она пытается найти давно не использовавшееся окно (см. Циклический порядок окон) в любом кадре, заданном записью
lru-framesв alist; если такой записи нет, используется выбранный кадр. Она также отдаёт предпочтение окнам, удовлетворяющим ограничениям, заданным записямиwindow-min-widthиwindow-min-heightв alist; если записьwindow-min-widthотсутствует, предпочтение отдаётся окнам на всю ширину. Наконец, функция не возвращает окно, время использования которого больше значения, заданного любой записьюlru-timeв alist.Если окно, использовавшееся давно, не найдено, эта функция попытается использовать какое-нибудь другое окно, предпочтительно большое окно в одном из видимых кадров. Она может завершиться неудачей, если все окна закреплены за другими буферами (см. Закреплённые окна).
Описанное выше поведение соответствует случаю, когда запись
some-windowв alist имеет значениеlruилиnil, установленное по умолчанию. Ещё одно возможное значение —mru. Например, если дляdisplay-buffer-base-actionзадано значение(nil . ((some-window . mru))), эта функция будет отдавать предпочтение окну, использовавшемуся последним. Тогда несколько буферов, отображаемых при последовательных вызовахdisplay-buffer, будут появляться в одном и том же окне. Рассмотрим конфигурацию из трёх или более окон, в которой пользователь хочет последовательно просматривать в невыбранном окне результаты запроса, распределённые по нескольким буферам. При стратегииlruEmacs может постоянно выбирать другое окно, поскольку наименее недавно использовавшееся окно меняется при каждом вызовеdisplay-buffer-use-some-window. При стратегииmruвыбранное окно всегда оставалось бы одним и тем же, обеспечивая предсказуемое поведение для пользователя.
- Функция: display-buffer-use-least-recent-window buffer alist
-
Эта функция похожа на
display-buffer-use-some-window, но старается ещё усерднее не использовать недавно использовавшееся окно. В частности, она не использует выбранное окно. Кроме того, сначала она пытается повторно использовать окно, в котором уже отображается buffer, принимает решение об использовании окна с другим буфером, основываясь только на времени использования этого окна, и открывает новое окно, если подходящее окно не найдено.Наконец, эта функция увеличивает время использования (см. Выбор окон) каждого возвращаемого ею окна, чтобы последующие вызовы не использовали это окно для отображения другого буфера. Приложение, которому нужно отобразить несколько буферов подряд, может помочь этой функции, добавив запись
lru-timeв alist и изначально задав ей значение времени использования выбранного окна. Каждый вызов этой функции будет увеличивать время использования возвращаемого окна до значения, превышающего это значение, и при последующем вызове функция не будет использовать ранее возвращённое ею окно.
- Функция: display-buffer-in-direction buffer alist
-
Эта функция пытается отобразить buffer в месте, заданном alist. Для этого alist должен содержать запись
direction, значением которой является одно из следующих:left,above(илиup),rightиbelow(илиdown). Другие значения обычно интерпретируются какbelow.Если alist также содержит запись
window, её значение задаёт опорное окно. Это значение может быть специальным символом, напримерmain, обозначающим главное окно выбранного кадра (см. Параметры и функции боковых окон), илиroot, обозначающим корневое окно выбранного кадра (см. Окна и кадры). Также можно указать любое допустимое окно. Любое другое значение (или отсутствие записиwindow) означает, что в качестве опорного окна используется выбранное окно.Сначала эта функция пытается повторно использовать окно в заданном направлении, в котором уже отображается buffer. Если такого окна нет, она пытается разделить опорное окно, чтобы создать новое окно в заданном направлении. Если и это не удаётся, она пытается отобразить buffer в существующем окне в заданном направлении. В обоих случаях выбранное окно появится с той стороны опорного окна, которая указана записью
direction, и будет иметь с опорным окном хотя бы одну общую границу.Если опорное окно является активным, граница выбранного окна, общая с ним, всегда противоположна границе, заданной записью
direction. Например, если значение записиdirectionравноleft, координата правой границы выбранного окна (см. Координаты и окна) будет совпадать с координатой левой границы опорного окна.Если опорное окно является внутренним, повторно используемое окно должно иметь с ним общую границу, заданную записью
direction. Поэтому, например, если опорное окно — корневое окно кадра, а значение записиdirectionравноleft, повторно используемое окно должно находиться слева от кадра. Это означает, что координаты левых границ выбранного и опорного окон совпадают.Однако новое окно будет создано путём разделения опорного окна так, чтобы выбранное окно имело с ним общую противоположную границу. В нашем примере будет создано новое корневое окно с новым активным окном и опорным окном в качестве дочерних. Тогда координата правой границы выбранного окна будет совпадать с координатой левой границы опорного окна. Координата его левой границы будет совпадать с координатой левой границы нового корневого окна кадра.
Четыре специальных значения записей
directionпозволяют неявно указать главное окно выбранного кадра в качестве опорного:leftmost,top,rightmostиbottom. Это означает, что вместо, например,(direction . left) (window . main)можно просто указать(direction . leftmost). В таких случаях имеющаяся записьwindowв alist игнорируется.
- Функция: display-buffer-below-selected buffer alist
-
Эта функция пытается отобразить buffer в окне под выбранным окном. Если под выбранным окном есть окно, в котором уже отображается buffer, она повторно использует это окно.
Если такого окна нет, эта функция пытается создать новое окно, разделив выбранное, и отображает там buffer. Она также попытается изменить размер этого окна, если alist содержит подходящую запись
window-heightилиwindow-width, см. выше.Если разделить выбранное окно не удаётся и под выбранным окном есть незакреплённое окно, в котором отображается какой-либо другой буфер, эта функция пытается использовать это окно для отображения buffer.
Если alist содержит запись
window-min-height, эта функция гарантирует, что используемое окно имеет или может получить как минимум высоту, указанную значением этой записи. Обратите внимание, что это лишь гарантия. Чтобы фактически изменить размер используемого окна, alist должна также содержать подходящую записьwindow-height.
- Функция: display-buffer-at-bottom buffer alist
-
Эта функция пытается отобразить buffer в окне в нижней части выбранного кадра.
Она пытается либо разделить окно в нижней части кадра или его главного окна, либо повторно использовать существующее окно в нижней части выбранного кадра.
- Функция: display-buffer-pop-up-frame buffer alist
Эта функция создаёт новый кадр и отображает буфер в окне этого кадра. Фактически кадр создаётся вызовом функции, указанной в
pop-up-frame-function(см. Дополнительные параметры отображения буферов). Если alist содержит записьpop-up-frame-parameters, соответствующее значение добавляется к параметрам вновь созданного кадра.
- Функция: display-buffer-full-frame buffer alist
Эта функция отображает буфер в текущем кадре, удаляя все остальные окна, чтобы буфер занимал весь кадр.
- Функция: display-buffer-in-child-frame buffer alist
-
Эта функция пытается отобразить buffer во вложенном кадре (см. Вложенные кадры) выбранного кадра, повторно используя существующий вложенный кадр или создавая новый. Если alist содержит запись
nil, отличную отchild-frame-parameters, соответствующее значение представляет собой список параметров кадра, передаваемых новому кадру. По умолчанию задаётся параметрparent-frame, указывающий на выбранный кадр. Если вложенный кадр должен стать дочерним кадром другого кадра, в alist необходимо добавить соответствующую запись.Внешний вид вложенных кадров во многом зависит от параметров, переданных через alist. Рекомендуется как минимум задать размеры вложенного кадра с помощью коэффициентов (см. Параметры размера) и его положение (см. Параметры положения), а также добавить параметр
keep-ratio(см. Параметры взаимодействия кадров), чтобы гарантировать, что вложенный кадр останется видимым. Сведения о других параметрах, которые следует учитывать, см. в разделе Вложенные кадры.
- Функция: display-buffer-use-some-frame buffer alist
-
Эта функция пытается отобразить buffer, найдя кадр, соответствующий предикату (по умолчанию подойдёт любой кадр, кроме выбранного).
Если эта функция выбирает окно в другом кадре, она делает этот кадр видимым и, если alist не содержит записи
inhibit-switch-frame, при необходимости выводит этот кадр на передний план.Если alist содержит запись
nil, отличную отframe-predicate, её значением является функция, принимающая один аргумент (кадр) и возвращающаяnil, если кадр подходит; эта функция заменяет предикат по умолчанию.Если alist содержит запись
nil, отличную отinhibit-same-window, выбранное окно не используется; поэтому, если в выбранном кадре только одно окно, оно не используется.
- Функция: display-buffer-in-new-tab buffer alist
-
Эта функция пытается отобразить buffer в новой вкладке.
Если alist содержит запись
nil, отличную отtab-name(её значением может быть строка или функция), буфер отображается в новой вкладке с указанным именем. Если записьtab-nameсодержит функцию, она вызывается с двумя аргументами (buffer и alist) и должна возвращать имя вкладки.Если запись
tab-nameотсутствует или имеет значениеnil, новая вкладка создаётся без явного имени.Если alist содержит запись
nil, отличную отtab-group, она задаёт группу вкладки, переопределяя пользовательский параметрtab-bar-new-tab-group. Значением этой записи также может быть строка или функция, которая вызывается так же, какtab-name.
- Функция: display-buffer-in-tab buffer alist
-
Эта функция пытается отобразить buffer в новой или существующей вкладке.
Если alist содержит запись
nil, отличную отreusable-frames, то в кадрах, указанных её значением, ищется существующая вкладка, в которой уже отображается буфер. Возможные значенияreusable-frames:-
tозначает рассматривать все существующие кадры. -
visibleозначает рассматривать все видимые кадры. - 0 означает рассматривать все кадры на текущем терминале.
- Кадр означает рассматривать только этот кадр.
- Любое другое значение, отличное от
nil, означает рассматривать выбранный кадр. -
nilозначает не искать кадры (равносильно отсутствию этой записи). Обратите внимание, что это отличается от обычного значенияnilдля записиreusable-framesв списке действий отображения буфера.
Если alist содержит запись
nil, отличную отignore-current-tab, то при поиске повторно используемой вкладки текущая вкладка пропускается. В противном случае текущая вкладка используется в первую очередь, если в ней уже отображается буфер.Если окно с отображаемым буфером находится в какой-либо повторно используемой вкладке, выбираются эта вкладка и это окно.
Если такое окно не найдено, буфер отображается в новой или существующей вкладке в соответствии с записью alist
tab-name(её значением может быть строка или функция). Если вкладка с таким именем уже существует, она выбирается; в противном случае создаётся новая вкладка с этим именем. Если записьtab-nameсодержит функцию, она вызывается с двумя аргументами (buffer и alist) и должна возвращать имя вкладки. Если записьtab-nameотсутствует или имеет значениеnil, новая вкладка создаётся без явного имени.Если создаётся новая вкладка и alist содержит запись
nil, отличную отtab-group, она задаёт группу вкладки, переопределяя пользовательский параметрtab-bar-new-tab-group. Значением этой записи также может быть строка или функция, которая вызывается так же, какtab-name. -
- Функция: display-buffer-no-window buffer alist
-
Если alist содержит запись
nil, отличную отallow-no-window, эта функция не отображает buffer и возвращает символfail. Это единственное исключение из соглашения, согласно которому функция действия возвращает либоnil, либо окно, отображающее buffer. Если alist не содержит такой записиallow-no-window, функция возвращаетnil.Если эта функция возвращает
fail, функцияdisplay-bufferпропускает выполнение всех последующих действий отображения и немедленно возвращаетnil. Если эта функция возвращаетnil, функцияdisplay-bufferпродолжает выполнение следующего действия отображения, если оно есть.Предполагается, что вызывающий
display-bufferкод, указывающий записьnil, отличную отallow-no-window, также может обработать возвращаемое значениеnil.
Ещё две функции действий описаны в соответствующих разделах: display-buffer-in-side-window (см. Отображение буферов в боковых окнах) и display-buffer-in-atom-window (см. Атомарные окна).
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/Buffer-Display-Action-Functions.html