23.18.6 Панели инструментов

Панель инструментов — это ряд кликабельных значков в верхней части фрейма, непосредственно под строкой меню. См. Панели инструментов в Руководстве по 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 image

image — это либо одно описание изображения (см. Изображения), либо вектор из четырёх описаний изображений. Если вы используете вектор из четырёх, одно из них используется в зависимости от обстоятельств:

элемент 0

Используется, когда элемент включён и выбран.

элемент 1

Используется, когда элемент включён и не выбран.

элемент 2

Используется, когда элемент отключён и выбран.

элемент 3

Используется, когда элемент отключён и не выбран.

Версии 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-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-add-item icon def key &rest props

Эта функция добавляет элемент на панель инструментов, изменяя 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))
Функция: tool-bar-add-item-from-menu command icon &optional map &rest props

Эта функция является удобным средством для определения элементов панели инструментов, согласованных с существующими привязками строки меню. Привязка command ищется в строке меню в map (по умолчанию global-map) и изменяется для добавления спецификации изображения для icon, который находится так же, как и в tool-bar-add-item. Полученная привязка затем помещается в tool-bar-map, поэтому используйте эту функцию только для глобальных элементов панели инструментов.

map должна содержать соответствующую клавиатурную карту, привязанную к [menu-bar]. Остальные аргументы props — это дополнительные элементы списка свойств, добавляемые к спецификации элемента меню.

Функция: tool-bar-local-item-from-menu command icon in-map &optional from-map &rest 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, если панель инструментов расположена в верхней части фрейма, но отображаются выше них, если панель инструментов расположена внизу (см. Параметры компоновки). Они не отображаются, если панель инструментов расположена слева или справа от фрейма.

Переменная: auto-resize-tool-bars

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

Если значение равно grow-only, панель инструментов автоматически расширяется, но автоматически не сжимается. Чтобы сжать панель инструментов, пользователь должен перерисовать фрейм, нажав C-l.

Если Emacs собран с GTK+ или Nextstep, панель инструментов может отображать только одну строку, поэтому эта переменная не действует.

Переменная: auto-raise-tool-bar-buttons

Если эта переменная не равна nil, элементы панели инструментов отображаются в приподнятом виде, когда мышь наводится на них.

Переменная: tool-bar-button-margin

Эта переменная задаёт дополнительный отступ вокруг элементов панели инструментов. Значение — целое число пикселей. По умолчанию 4.

Переменная: tool-bar-button-relief

Эта переменная задаёт ширину тени для элементов панели инструментов. Значение — целое число пикселей. По умолчанию 1.

Переменная: tool-bar-border

Эта переменная задаёт высоту рамки, рисуемой под областью панели инструментов. Целое число задаёт высоту в пикселях. Если значение равно 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 (см. Формат строки режима).