Spec-Zone.ru › Elisp

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

Панель инструментов — это ряд значков, по которым можно щёлкать, в верхней части рамки, сразу под строкой меню. См. Панели инструментов в Руководстве 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 "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 (см. Формат строки режима).

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/Tool-Bar.html

Spec-Zone.ru

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