29.12 Переключение на буфер в окне

Этот раздел описывает высокоуровневые функции для переключения на заданный буфер в некотором окне. В общем случае «переключение на буфер» означает (1) показ этого буфера в некотором окне, (2) сделать это окно выбранным (а его фрейм — выбранным фреймом) и (3) сделать этот буфер текущим.

Не используйте эти функции, чтобы сделать буфер временно текущим только для того, чтобы программа на Lisp могла получить к нему доступ или изменить его. Они имеют побочные эффекты, такие как изменение истории окон (см. История окон), которые удивят пользователя при таком использовании. Если вы хотите сделать буфер текущим, чтобы изменить его в Lisp, используйте with-current-buffer, save-current-buffer или set-buffer. См. Текущий буфер.

Команда: switch-to-buffer buffer-or-name &optional norecord force-same-window

Эта команда пытается отобразить buffer-or-name в выбранном окне и сделать его текущим буфером. Она часто используется интерактивно (как привязка C-x b), а также в программах на Lisp. Возвращаемое значение — буфер, на который выполнено переключение.

Если buffer-or-name равен nil, по умолчанию используется буфер, возвращаемый other-buffer (см. Список буферов). Если buffer-or-name — это строка, не являющаяся именем какого-либо существующего буфера, эта функция создаёт новый буфер с таким именем; основной режим нового буфера определяется переменной major-mode (см. Основные режимы).

Обычно заданный буфер помещается в начало списка буферов — как глобального списка буферов, так и списка буферов выбранного фрейма (см. Список буферов). Однако этого не происходит, если необязательный аргумент norecord не равен nil.

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

Если необязательный аргумент force-same-window не равен nil, а выбранное окно не подходит для отображения буфера, эта функция всегда вызывает ошибку при неинтерактивном вызове. При интерактивном использовании, если выбранное окно является окном минибуфера, эта функция попытается использовать другое окно. Если выбранное окно строго выделено для своего буфера, можно использовать опцию switch-to-buffer-in-dedicated-window, описанную далее.

Пользовательская опция: switch-to-buffer-in-dedicated-window

Эта опция, если не равна nil, позволяет switch-to-buffer продолжить выполнение при интерактивном вызове, если выбранное окно строго выделено для своего буфера.

Поддерживаются следующие значения:

nil

Запрещает переключение и вызывает ошибку, как при неинтерактивном использовании.

prompt

Запрашивает у пользователя разрешение на переключение.

pop

Вызывает pop-to-buffer для продолжения.

t

Помечает выбранное окно как невыделенное и продолжает выполнение.

Эта опция не влияет на неинтерактивные вызовы switch-to-buffer.

По умолчанию switch-to-buffer пытается сохранить window-point. Это поведение можно настроить с помощью следующей опции.

Пользовательская опция: switch-to-buffer-preserve-window-point

Если эта переменная равна nil, switch-to-buffer отображает буфер, заданный buffer-or-name, в позиции point этого буфера. Если эта переменная равна already-displayed, она пытается отобразить буфер в его предыдущей позиции в выбранном окне при условии, что буфер в данный момент отображается в некотором другом окне на любом видимом или свёрнутом в значок фрейме. Если эта переменная равна t, switch-to-buffer безусловно пытается отобразить буфер в его предыдущей позиции в выбранном окне.

Эта переменная игнорируется, если буфер уже отображается в выбранном окне или никогда не отображался в нём ранее, или если switch-to-buffer вызывает pop-to-buffer для отображения буфера.

Пользовательская опция: switch-to-buffer-obey-display-actions

Если эта переменная не равна nil, switch-to-buffer учитывает действия отображения, задаваемые display-buffer-overriding-action, display-buffer-alist и другими переменными, связанными с отображением.

Следующие две команды аналогичны switch-to-buffer, за исключением описанных особенностей.

Команда: switch-to-buffer-other-window buffer-or-name &optional norecord

Эта функция отображает буфер, заданный buffer-or-name, в некотором окне, отличном от выбранного. Внутренне она использует функцию pop-to-buffer (см. ниже).

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

Аргументы buffer-or-name и norecord имеют те же значения, что и в switch-to-buffer.

Команда: switch-to-buffer-other-frame buffer-or-name &optional norecord

Эта функция отображает буфер, заданный buffer-or-name, в новом фрейме. Внутренне она использует функцию pop-to-buffer (см. ниже).

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

Аргументы buffer-or-name и norecord имеют те же значения, что и в switch-to-buffer.

Вышеуказанные команды используют функцию pop-to-buffer, которая гибко отображает буфер в некотором окне и выбирает это окно для редактирования. В свою очередь, pop-to-buffer использует display-buffer для отображения буфера. Следовательно, все переменные, влияющие на display-buffer, будут влиять и на неё. См. Выбор окна для отображения буфера за документацией по display-buffer.

Команда: pop-to-buffer buffer-or-name &optional action norecord

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

Если buffer-or-name равен nil, по умолчанию используется буфер, возвращаемый other-buffer (см. Список буферов). Если buffer-or-name — это строка, не являющаяся именем какого-либо существующего буфера, эта функция создаёт новый буфер с таким именем; основной режим нового буфера определяется переменной major-mode (см. Основные режимы). В любом случае этот буфер делается текущим и возвращается, даже если не найдено подходящего окна для его отображения.

Если action не равен nil, он должен быть действием отображения, передаваемым в display-buffer (см. Выбор окна для отображения буфера). Альтернативно, не равное nil, но не являющееся списком значение означает переключиться в окно, отличное от выбранного — даже если буфер уже отображается в выбранном окне.

Как и switch-to-buffer, эта функция обновляет список буферов, если только norecord не равен nil.