Панель инструментов — это ряд кликабельных значков в верхней части фрейма, непосредственно под строкой меню. См. Панели инструментов в Руководстве по GNU Emacs. Обычно Emacs показывает панель инструментов на графических дисплеях.
Для каждого фрейма параметр фрейма tool-bar-lines управляет тем, сколько строк высоты зарезервировано под панель инструментов. Нулевое значение отключает панель инструментов. Если значение ненулевое и auto-resize-tool-bars не равно nil, панель инструментов автоматически расширяется и сжимается по мере необходимости для размещения указанного содержимого. Если значение равно grow-only, панель инструментов автоматически расширяется, но автоматически не сжимается.
Содержимое панели инструментов управляется клавиатурной картой меню, привязанной к фиктивной клавише TOOL-BAR (почти так же, как управляется строка меню). Таким образом, вы определяете элемент панели инструментов с помощью define-key, например:
(define-key global-map [tool-bar key] item)
где key — это фиктивная клавиша, позволяющая отличить этот элемент от других, а item — это привязка элемента меню (см. Расширенные элементы меню), которая определяет, как отображать этот элемент и как он ведёт себя.
Обычные свойства элементов клавиатурной карты меню — :visible, :enable, :button и :filter — полезны в привязках панели инструментов и имеют обычное значение. real-binding в элементе должна быть командой, а не клавиатурной картой; иными словами, нельзя определить значок панели инструментов как префиксную клавишу.
Свойство :help задаёт строку help-echo, которая отображается при наведении мыши на этот элемент. Она отображается так же, как текстовые свойства help-echo (см. Отображение подсказок).
Кроме того, следует использовать свойство :image; именно так вы задаёте изображение для отображения на панели инструментов:
:image imageimage — это либо одно описание изображения (см. Изображения), либо вектор из четырёх описаний изображений. Если вы используете вектор из четырёх, одно из них используется в зависимости от обстоятельств:
Используется, когда элемент включён и выбран.
Используется, когда элемент включён и не выбран.
Используется, когда элемент отключён и выбран.
Используется, когда элемент отключён и не выбран.
Версии Emacs для GTK+ и NS игнорируют элементы с 1 по 3, поскольку изображения для отключённого и/или невыбранного состояния автоматически вычисляются на основе элемента 0.
Если image — это одно описание изображения, Emacs рисует кнопку панели инструментов в отключённом состоянии, применяя к изображению алгоритм обнаружения границ.
Свойство :rtl задаёт альтернативное изображение для использования в языках с письмом справа налево. В настоящее время это поддерживается только версией Emacs для GTK+.
Некоторые наборы инструментов отображают на панели инструментов как изображение, так и текст. Если вы хотите принудительно использовать только изображение, используйте свойство :vert-only со значением, не равным nil.
Как и строка меню, панель инструментов может отображать разделители (см. Разделители меню). Однако разделители панели инструментов являются вертикальными, а не горизонтальными, и поддерживается только один стиль. Они представлены в клавиатурной карте панели инструментов записями (menu-item "--"); свойства типа :visible для разделителей панели инструментов не поддерживаются. Разделители отображаются с использованием собственных средств в панелях инструментов GTK+ и Nextstep; в остальных случаях они отображаются с использованием изображения вертикальной линии.
Панель инструментов по умолчанию определена так, что элементы, специфичные для редактирования, не отображаются для основных режимов, у которых символ команды имеет свойство mode-class со значением special (см. Соглашения об основных режимах). Основные режимы могут добавлять элементы на глобальную панель, связывая [tool-bar foo] в своей локальной карте. Некоторым основным режимам имеет смысл полностью заменить элементы панели инструментов по умолчанию, поскольку удобно разместить можно не так много элементов, а привязки по умолчанию упрощают эту задачу, используя косвенную адресацию через tool-bar-map.
По умолчанию глобальная карта связывает [tool-bar] следующим образом:
(keymap-global-set "<tool-bar>"
`(menu-item ,(purecopy "tool bar") ignore
:filter tool-bar-make-keymap))
Функция tool-bar-make-keymap, в свою очередь, динамически формирует актуальную клавиатурную карту панели инструментов на основе значения переменной tool-bar-map. Таким образом, обычно вам следует настраивать глобальную панель инструментов, изменяя эту карту. Некоторые основные режимы, например режим Info, полностью заменяют глобальную панель инструментов, делая tool-bar-map буферно-локальной и устанавливая в неё другую клавиатурную карту.
Существуют две удобные функции для определения элементов панели инструментов:
Эта функция добавляет элемент на панель инструментов, изменяя tool-bar-map. Используемое изображение определяется icon, который является базовым именем файла изображения XPM, XBM или PBM, который будет найден с помощью find-image. Например, для значения ‘"exit"’ файлы exit.xpm, exit.pbm и exit.xbm будут искаться в указанном порядке на цветном дисплее. На монохромном дисплее порядок поиска: ‘.pbm’, ‘.xbm’ и ‘.xpm’. Используемая привязка — это команда def, а key — это символ фиктивной клавиши в префиксной клавиатурной карте. Остальные аргументы props — это дополнительные элементы списка свойств, добавляемые к спецификации элемента меню.
Чтобы определить элементы в некоторой локальной карте, свяжите tool-bar-map с помощью let вокруг вызовов этой функции:
(defvar foo-tool-bar-map
(let ((tool-bar-map (make-sparse-keymap)))
(tool-bar-add-item …)
…
tool-bar-map))
Эта функция является удобным средством для определения элементов панели инструментов, согласованных с существующими привязками строки меню. Привязка command ищется в строке меню в map (по умолчанию global-map) и изменяется для добавления спецификации изображения для icon, который находится так же, как и в tool-bar-add-item. Полученная привязка затем помещается в tool-bar-map, поэтому используйте эту функцию только для глобальных элементов панели инструментов.
map должна содержать соответствующую клавиатурную карту, привязанную к [menu-bar]. Остальные аргументы props — это дополнительные элементы списка свойств, добавляемые к спецификации элемента меню.
Эта функция используется для создания неглобальных элементов панели инструментов. Используйте её как tool-bar-add-item-from-menu, за исключением того, что in-map задаёт локальную карту, в которой должно быть сделано определение. Аргумент from-map аналогичен аргументу map функции tool-bar-add-item-from-menu.
В дополнение к элементам панели инструментов, определённым в tool-bar-map, Emacs также поддерживает отображение дополнительной строки «вторичных» элементов панели инструментов, заданных в клавиатурной карте secondary-tool-bar-map. Обычно эти элементы отображаются ниже элементов, определённых в tool-bar-map, если панель инструментов расположена в верхней части фрейма, но отображаются выше них, если панель инструментов расположена внизу (см. Параметры компоновки). Они не отображаются, если панель инструментов расположена слева или справа от фрейма.
Если эта переменная не равна nil, панель инструментов автоматически изменяет размер для отображения всех определённых элементов панели инструментов — но не более чем на четверть высоты фрейма.
Если значение равно grow-only, панель инструментов автоматически расширяется, но автоматически не сжимается. Чтобы сжать панель инструментов, пользователь должен перерисовать фрейм, нажав C-l.
Если Emacs собран с GTK+ или Nextstep, панель инструментов может отображать только одну строку, поэтому эта переменная не действует.
Если эта переменная не равна nil, элементы панели инструментов отображаются в приподнятом виде, когда мышь наводится на них.
Эта переменная задаёт дополнительный отступ вокруг элементов панели инструментов. Значение — целое число пикселей. По умолчанию 4.
Эта переменная задаёт ширину тени для элементов панели инструментов. Значение — целое число пикселей. По умолчанию 1.
Эта переменная задаёт высоту рамки, рисуемой под областью панели инструментов. Целое число задаёт высоту в пикселях. Если значение равно internal-border-width (по умолчанию) или border-width, высота рамки панели инструментов соответствует соответствующему параметру фрейма.
Вы можете определить особое действие при щелчке по элементу панели инструментов с модификаторами shift, control, meta и т. д. Для этого вы создаёте дополнительные элементы, связанные с исходным элементом через фиктивные клавиши. В частности, дополнительные элементы должны использовать модифицированные версии той же фиктивной клавиши, которая использовалась для именования исходного элемента.
Таким образом, если исходный элемент был определён так:
(define-key global-map [tool-bar shell]
'(menu-item "Shell" shell
:image (image :type xpm :file "shell.xpm")))
то вот как можно определить щелчок по тому же изображению на панели инструментов с модификатором shift:
(define-key global-map [tool-bar S-shell] 'some-command)
См. Функциональные клавиши для получения дополнительной информации о том, как добавлять модификаторы к функциональным клавишам.
Если у вас есть функции, которые изменяют состояние элемента панели инструментов (включён или отключён), этот статус не обязательно визуально обновляется немедленно. Чтобы принудительно пересчитать панель инструментов, вызовите force-mode-line-update (см. Формат строки режима).