Spec-Zone.ru › Elisp

Список буферов

Список буферов — это список всех существующих буферов. Порядок буферов в этом списке определяется главным образом тем, насколько недавно каждый буфер отображался в окне. Этот порядок используют несколько функций, в частности other-buffer. Список буферов, отображаемый для пользователя, также следует этому порядку.

При создании буфера он добавляется в конец списка буферов, а при уничтожении — удаляется из списка. Буфер перемещается в начало списка каждый раз, когда выбирается для отображения в окне (см. Переключение на буфер в окне) или выбирается окно, в котором он отображается (см. Выбор окон). Буфер перемещается в конец списка, когда он откладывается (см. bury-buffer ниже). Для программистов на Lisp нет функций, напрямую изменяющих список буферов.

Помимо описанного выше основного списка буферов, Emacs поддерживает локальный список буферов для каждого фрейма, в котором буферы, отображавшиеся в этом фрейме (или окна которых выбирались), располагаются в начале. (Этот порядок записывается в параметре фрейма buffer-list; см. Параметры буферов.) Буферы, никогда не отображавшиеся в этом фрейме, располагаются после них в порядке основного списка буферов.

Функция: buffer-list &optional frame

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

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

(buffer-list)
     ⇒ (#<buffer buffers.texi>
         #<buffer  *Minibuf-1*> #<buffer buffer.c>
         #<buffer *Help*> #<buffer TAGS>)
;; Note that the name of the minibuffer
;;   begins with a space!
(mapcar #'buffer-name (buffer-list))
    ⇒ ("buffers.texi" " *Minibuf-1*"
        "buffer.c" "*Help*" "TAGS")

Список, возвращаемый buffer-list, создаётся специально; это не внутренняя структура данных Emacs, и его изменение не влияет на порядок буферов. Если вы хотите изменить порядок буферов в основном списке, можно сделать это следующим простым способом:

(defun reorder-buffer-list (new-list)
  (while new-list
    (bury-buffer (car new-list))
    (setq new-list (cdr new-list))))

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

Чтобы изменить порядок или значение списка буферов определённого фрейма, задайте параметр этого фрейма buffer-list с помощью modify-frame-parameters (см. Доступ к параметрам фрейма).

Функция: other-buffer &optional buffer visible-ok frame

Эта функция возвращает первый буфер в списке буферов, кроме buffer. Обычно это буфер, отображающийся в окне, которое было выбрано последним (во фрейме frame или, если он не указан, в выбранном фрейме; см. Фокус ввода), за исключением buffer. Буферы, имена которых начинаются с пробела, вообще не рассматриваются.

Если buffer не указан (или не является действующим буфером), other-buffer возвращает первый буфер в локальном списке буферов выбранного фрейма. (Если frame не равен nil, вместо этого возвращается первый буфер в локальном списке буферов фрейма frame.)

Если у frame есть параметр buffer-predicate, отличный от nil, то other-buffer использует этот предикат, чтобы определить, какие буферы следует рассматривать. Предикат вызывается один раз для каждого буфера; если результат равен nil, буфер игнорируется. См. Параметры буферов.

Если visible-ok равен nil, other-buffer старается не возвращать буфер, видимый в каком-либо окне любого видимого фрейма, и делает это только в крайнем случае. Если visible-ok не равен nil, не имеет значения, отображается ли буфер где-либо.

Если подходящего буфера нет, возвращается буфер *scratch* (при необходимости он создаётся).

Функция: last-buffer &optional buffer visible-ok frame

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

Аргумент visible-ok обрабатывается так же, как в other-buffer, см. выше. Если подходящий буфер не найден, возвращается буфер *scratch*.

Команда: bury-buffer &optional buffer-or-name

Эта команда помещает buffer-or-name в конец списка буферов, не меняя порядок остальных буферов в списке. Поэтому этот буфер становится наименее предпочтительным кандидатом для возврата функцией other-buffer. В качестве аргумента можно указать сам буфер или его имя.

Эта функция изменяет параметр buffer-list каждого фрейма, а также основной список буферов; поэтому отложенный буфер окажется последним в значении (buffer-list frame) и в значении (buffer-list). Кроме того, если буфер отображается в выбранном окне, функция помещает его в конец списка буферов этого окна (см. История окна).

Если buffer-or-name равен nil или не указан, откладывается текущий буфер. Кроме того, если текущий буфер отображается в выбранном окне (см. Выбор окон), функция гарантирует, что окно либо будет удалено, либо в нём будет показан другой буфер. Точнее, если выбранное окно является выделенным (см. Выделенные окна) и в его фрейме есть другие окна, это окно удаляется. Если это единственное окно фрейма, а сам фрейм не является единственным фреймом на своём терминале, фрейм закрывается вызовом функции, заданной в frame-auto-hide-function (см. Закрытие окон). В противном случае функция вызывает switch-to-prev-buffer (см. История окна), чтобы показать в этом окне другой буфер. Если buffer-or-name отображается в каком-либо другом окне, он остаётся там.

Чтобы заменить буфер во всех окнах, где он отображается, используйте replace-buffer-in-windows. См. Буферы и окна.

Команда: unbury-buffer

Эта команда переключается на последний буфер в локальном списке буферов выбранного фрейма. Точнее, она вызывает функцию switch-to-buffer (см. Переключение на буфер в окне), чтобы отобразить в выбранном окне буфер, возвращённый функцией last-buffer (см. выше).

Переменная: buffer-list-update-hook

Это обычный хук, который запускается при каждом изменении списка буферов. Функции, неявно запускающие этот хук: get-buffer-create (см. Создание буферов), rename-buffer (см. Имена буферов), kill-buffer (см. Уничтожение буферов), bury-buffer (см. выше) и select-window (см. Выбор окон). Этот хук не запускается для внутренних или временных буферов, создаваемых функциями get-buffer-create или generate-new-buffer с аргументом inhibit-buffer-hooks, отличным от nil.

Функциям, запускаемым этим хуком, следует избегать вызова select-window с аргументом norecord, равным nil, поскольку это может привести к бесконечной рекурсии.

Функция: buffer-match-p condition buffer-or-name &rest args

Эта функция проверяет, удовлетворяет ли буфер, указанный с помощью buffer-or-name, заданному условию condition. Необязательные аргументы args передаются функции-предикату, указанной в condition. Допустимое значение condition может быть одним из следующих:

  • Строка, интерпретируемая как регулярное выражение. Буфер удовлетворяет условию, если регулярное выражение соответствует имени буфера.
  • Функция-предикат, которая должна возвращать значение, отличное от nil, если буфер соответствует условию. Она вызывается с buffer-or-name в качестве первого аргумента, за которым следуют args.
  • Ячейка cons (oper . expr), где oper — одно из следующих значений:
    (not cond)

    Условие выполнено, если cond не удовлетворяет buffer-match-p для того же буфера и args.

    (or conds…)

    Условие выполнено, если buffer-match-p удовлетворяет хотя бы одно условие из conds для того же буфера и args.

    (and conds…)

    Условие выполнено, если buffer-match-p удовлетворяют все условия из conds для того же буфера и args.

    derived-mode

    Условие выполнено, если родительский режим буфера является производным от expr. Значением expr может быть как один символ режима, так и список символов режимов, допустимый для функции provided-mode-derived-p (см. Определение производных режимов). Обратите внимание: это условие может не обнаружить соответствие, если buffer-match-p вызвана до того, как для буфера был установлен основной режим.

    major-mode

    Условие выполнено, если основной режим буфера равен expr. Если подходит любой из вариантов, предпочтительно использовать derived-mode. Обратите внимание: это условие может не обнаружить соответствие, если buffer-match-p вызвана до того, как для буфера был установлен основной режим.

    category

    Это условие имеет значение только тогда, когда данная функция вызывается функцией display-buffer (см. Списки действий для отображения буфера); оно выполнено, если список действий, с которым была вызвана display-buffer, содержит (category . expr) в значении аргумента action. См. Списки действий для отображения буфера.

    this-command

    Это условие также имеет значение только тогда, когда данная функция вызывается функцией display-buffer (см. Списки действий для отображения буфера); оно выполнено, если выполняемая в данный момент команда равна expr или, если expr — список, выполняемая команда входит в этот список.

  • t Условие выполняется для любого буфера. Удобная альтернатива "" (пустая строка) или (and) (пустая конъюнкция).
Функция: match-buffers condition &optional buffer-list &rest args

Эта функция возвращает список всех буферов, удовлетворяющих условию condition. Если ни один буфер не соответствует условию, функция возвращает nil. Аргумент condition определён так же, как в buffer-match-p выше. По умолчанию рассматриваются все буферы, но их набор можно ограничить необязательным аргументом buffer-list, который должен быть списком рассматриваемых буферов. Оставшиеся аргументы args передаются в condition так же, как это делает buffer-match-p.

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-List.html

Spec-Zone.ru

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