Emacs представляет каждый терминал как тип данных объект терминала (см. Тип терминала). В системах GNU и Unix Emacs может использовать несколько терминалов одновременно в рамках одного сеанса. В других системах он может использовать только один терминал. Каждый объект терминала имеет следующие атрибуты:
terminal-live-p (т.е. x,
t, w32, ns, pc, haiku, pgtk,
или android). См. Кадры.
Примитива для создания объектов терминала не существует. Emacs создаёт
их по мере необходимости, например, когда вы вызываете make-frame-on-display
(описано ниже).
Эта функция возвращает имя файла устройства, используемого
terminal. Если terminal опущен или равен nil, то по
умолчанию используется терминал выбранного кадра. terminal также может быть
кадром, что означает терминал этого кадра.
Эта функция возвращает список всех активных объектов терминалов.
Эта функция возвращает терминал, имя устройства которого задаётся
device. Если device является строкой, это может быть либо имя
файла устройства терминала, либо имя X-дисплея вида
«host:server.screen». Если device является
кадром, эта функция возвращает терминал этого кадра; nil означает
выбранный кадр. Наконец, если device является объектом терминала,
представляющим активный терминал, возвращается этот терминал. Функция
выдаёт ошибку, если её аргумент не относится ни к одному из перечисленных случаев.
Эта функция удаляет все кадры на terminal и освобождает
ресурсы, используемые им. Она запускает ненормальный хук
delete-terminal-functions, передавая terminal в качестве
аргумента каждой функции.
Если terminal опущен или равен nil, по умолчанию используется
терминал выбранного кадра. terminal также может быть кадром,
что означает терминал этого кадра.
Обычно эта функция выдает ошибку, если вы пытаетесь удалить
единственный активный терминал, но если force не равен nil, это
разрешается. Emacs автоматически вызывает эту функцию, когда
последний кадр на терминале удаляется (см. Удаление кадров).
Ненормальный хук, запускаемый delete-terminal. Каждая функция
получает один аргумент — аргумент terminal, переданный в
delete-terminal. В силу технических деталей функции могут
вызываться либо непосредственно перед удалением терминала, либо
сразу после.
Некоторые переменные Lisp являются локальными для терминала; то есть они имеют
отдельную привязку для каждого терминала. Привязка, действующая в любой момент времени,
— это привязка для терминала, которому принадлежит текущий выбранный кадр.
Эти переменные включают default-minibuffer-frame,
defining-kbd-macro, last-kbd-macro и
system-key-alist. Они всегда локальны для терминала и
никогда не могут быть локальными для буфера (см. Переменные, локальные для буфера).
В системах GNU и Unix каждый X-дисплей является отдельным графическим
терминалом. Когда Emacs запускается из оконной системы X, он
использует X-дисплей, заданный переменной окружения DISPLAY
или опцией «--display» (см. Начальные опции в Руководстве GNU Emacs). Emacs может подключаться к другим X-дисплеям
через команду make-frame-on-display. Каждый X-дисплей имеет свой
собственный выбранный кадр и свои собственные окна минибуфера; однако только один
из этих кадров является тем выбранным кадром в любой момент времени
(см. Фокус ввода). Emacs может даже подключаться к другим текстовым
терминалам, взаимодействуя с программой emacsclient.
См. Сервер Emacs в Руководстве GNU Emacs.
Один X-сервер может обслуживать более одного дисплея. Каждый X-дисплей имеет трёхчастное имя: «hostname:displaynumber.screennumber». Первая часть, hostname, задаёт имя машины, к которой физически подключён дисплей. Вторая часть, displaynumber — это номер (начиная с нуля), идентифицирующий один или несколько мониторов, подключённых к этой машине и имеющих общую клавиатуру и указательное устройство (мышь, планшет и т.п.). Третья часть, screennumber, идентифицирует номер экрана (начиная с нуля) (отдельный монитор), входящий в состав одного набора мониторов на этом X-сервере. Когда вы используете два или более экранов, принадлежащих одному серверу, Emacs по сходству их имён знает, что они используют одну клавиатуру.
Системы, не использующие оконную систему X, такие как MS-Windows, не поддерживают понятие X-дисплеев и имеют только один дисплей на каждом хосте. Имя дисплея в этих системах не соответствует приведённому трёхчастному формату; например, имя дисплея в системах MS-Windows — это постоянная строка «w32», и существует для совместимости, чтобы вы могли передавать его функциям, ожидающим имя дисплея.
Эта функция создаёт и возвращает новый кадр на display, принимая остальные параметры кадра из ассоциативного списка parameters. display должно быть именем X-дисплея (строкой).
Перед созданием кадра эта функция гарантирует, что Emacs настроен
на отображение графики. Например, если Emacs не обрабатывал X-ресурсы
(например, если он был запущен на текстовом терминале), он делает это в
данный момент. Во всех остальных отношениях эта функция ведёт себя как
make-frame (см. Создание кадров).
Эта функция возвращает список, указывающий, к каким X-дисплеям Emacs имеет подключение. Элементами списка являются строки, и каждая из них — это имя дисплея.
Эта функция открывает подключение к X-дисплею display
без создания кадра на этом дисплее. Обычно программам на Emacs Lisp
не нужно вызывать эту функцию, так как make-frame-on-display
вызывает её автоматически. Единственная причина для её вызова — проверить,
можно ли установить связь с заданным X-дисплеем.
Необязательный аргумент xrm-string, если не равен nil, является строкой
имён ресурсов и их значений в том же формате, который используется в
файле .Xresources. См. X-ресурсы в Руководстве
GNU Emacs. Эти значения применяются ко всем кадрам Emacs, созданным на
этом дисплее, переопределяя значения ресурсов, зарегистрированные в X-сервере.
Вот пример того, как может выглядеть эта строка:
"*BorderWidth: 3\n*InternalBorder: 2\n"
Если must-succeed не равен nil, то сбой при открытии подключения
завершает Emacs. В противном случае это обычная ошибка Lisp.
Эта функция закрывает подключение к дисплею display. Перед этим вы должны сначала удалить все кадры, которые были открыты на этом дисплее (см. Удаление кадров).
В некоторых конфигурациях с несколькими мониторами один X-дисплей выводит
изображение на более чем один физический монитор. Вы можете использовать функции
display-monitor-attributes-list и frame-monitor-attributes
для получения информации о таких конфигурациях.
Эта функция возвращает список атрибутов физических мониторов на
display, которым может быть имя дисплея (строка), терминал или
кадр; если аргумент опущен или равен nil, по умолчанию используется дисплей
выбранного кадра. Каждый элемент списка является ассоциативным списком,
представляющим атрибуты физического монитора. Первый элемент
соответствует основному монитору. Ключи и значения атрибутов:
Положение верхнего левого угла экрана монитора и его размер в пикселях в виде «(x y width height)». Обратите внимание, что если монитор не является основным, некоторые координаты могут быть отрицательными.
Положение верхнего левого угла и размер рабочей области (используемого пространства) в пикселях в виде «(x y width height)». Это может отличаться от «geometry» тем, что пространство, занимаемое различными элементами оконного менеджера (доками, панелями задач и т.п.), может быть исключено из рабочей области. Зависят ли такие элементы фактически от размера рабочей области, зависит от платформы и окружения. Опять же, если монитор не является основным, некоторые координаты могут быть отрицательными.
Ширина и высота в миллиметрах в виде «(width height)»
Список кадров, для которых этот физический монитор является доминирующим (см. ниже).
Имя физического монитора в виде string.
Источник информации о нескольких мониторах в виде string; в X это может быть «XRandR 1.5», «XRandr», «Xinerama», «Gdk» или «fallback». Последнее значение «source» означает, что Emacs был собран без GTK и без расширений XRandR или Xinerama, в этом случае информация о нескольких физических мониторах будет предоставлена так, как если бы все они вместе образовывали один монитор.
x, y, width и height являются целыми числами. «name» и «source» могут отсутствовать.
Кадр доминируется физическим монитором, когда либо наибольшая область кадра находится на этом мониторе, либо (если кадр не пересекается ни с одним физическим монитором) этот монитор является ближайшим к кадру. Каждый (не являющийся всплывающей подсказкой) кадр (видимый или нет) на графическом дисплее в каждый момент времени доминируется ровно одним физическим монитором, хотя кадр может охватывать несколько (или ни одного) физических мониторов.
Вот пример данных, возвращаемых этой функцией для дисплея с двумя мониторами:
(display-monitor-attributes-list) ⇒ (((geometry 0 0 1920 1080) ;; Левый, основной монитор (workarea 0 0 1920 1050) ;; Панель задач занимает часть высоты (mm-size 677 381) (name . "DISPLAY1") (frames #<frame emacs@host *Messages* 0x11578c0> #<frame emacs@host *scratch* 0x114b838>)) ((geometry 1920 0 1680 1050) ;; Правый монитор (workarea 1920 0 1680 1050) ;; Весь экран может быть использован (mm-size 593 370) (name . "DISPLAY2") (frames)))
Эта функция возвращает атрибуты физического монитора, доминирующего (см. выше) над frame, который по умолчанию равен выбранному кадру.
На дисплеях с несколькими мониторами можно использовать команду
make-frame-on-monitor для создания кадров на указанном мониторе.
Эта функция создаёт и возвращает новый кадр на monitor, расположенном
на display, принимая остальные параметры кадра из ассоциативного списка
parameters. monitor должно быть именем физического
монитора — той же строкой, которая возвращается функцией
display-monitor-attributes-list в атрибуте name.
display должно быть именем X-дисплея (строкой).
Эта переменная является ненормальным хуком, который запускается при изменении
конфигурации мониторов, что может произойти, если монитор повёрнут, перемещён,
добавлен или удалён в конфигурации с несколькими мониторами, если изменён
основной монитор или если изменено разрешение монитора. Хук вызывается с одним
аргументом — терминалом, на котором изменилась конфигурация мониторов.
Программы должны вызывать display-monitor-attributes-list
с этим терминалом в качестве аргумента, чтобы получить новую конфигурацию
мониторов на этом терминале.