2013-12-14 2 views
2

Я пытаюсь настроить панель инструментов Emacs своими собственными изображениями и командами. У меня есть два изображения для каждой кнопки, «отключено» и «включено» изображение. К сожалению, elisp предоставляет только tool-bar-add-item, что позволяет указать одно изображение. Однако расширенный синтаксис элемента меню для панели инструментов имеет свойство :image, которое может быть установлено как одно изображение, так и вектор из четырех изображений для всех комбинаций включенных/отключенных и выбранных/отмененных. Я храню мои два изображения в «filename.xpm» и «имя файла-disabled.xpm», и я определил вспомогательную функцию, чтобы позволить мне легко определить новые элементы панели инструментов в этом формате:Изменение панели инструментов в Emacs Lisp

(defun wk-add-toolbar-button (display-name icon definition &rest properties) 
    "Add an item to the toolbar 
Automatically look for ICON.xpm and ICON-disabled.xpm" 
    (let ((images 
     `((,(concat icon ".xpm") xpm nil) 
      (,(concat icon ".xpm") xpm nil) 
      (,(concat icon "-disabled.xpm") xpm nil) 
      (,(concat icon "-disabled.xpm") xpm nil)))) 
    (define-key 
     global-map 
     (vector 'tool-bar (make-symbol display-name)) 
     `(menu-item 
     ,display-name 
     ,(make-symbol display-name) 
     ,definition 
     :image ,(vconcat (mapcar (lambda (xs) (apply 'create-image xs)) images)) 
     ,@properties)))) 

Но когда я называю эту функцию, например:

(setq tool-bar-map (make-sparse-keymap)) 
(wk-add-toolbar-button "Build" "c:/Users/William/Desktop/emacs-icons/build" 'smart-compile) 

моя панель инструментов остается пустой.

Добавление изображения вручную, например:

(define-key global-map [tool-bar build] 
    `(menu-item ,(symbol-name 'build) ,'smart-compile :image [ 
    ,(create-image "c:/Users/William/Desktop/emacs-icons/build.xpm" 'xpm nil) 
    ,(create-image "c:/Users/William/Desktop/emacs-icons/build.xpm" 'xpm nil) 
    ,(create-image "c:/Users/William/Desktop/emacs-icons/build-disabled.xpm" 'xpm nil) 
    ,(create-image "c:/Users/William/Desktop/emacs-icons/build-disabled.xpm" 'xpm nil)])) 

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

Как исправить это поведение?

ответ

1

Эта часть неисправна:

`(menu-item 
    ,display-name 
    ,(make-symbol display-name) ; <=========== GET RID OF THIS 
    ,definition 

Избавиться от make-symbol части, и вы получите то, что вы использовали вручную. Иконка появляется на панели инструментов.

Вы можете увидеть, что это неправильно, если распечатать результат вызова wk-add-toolbar-button:

(menu-item "Build" Build smart-compile :image 
      [(image :type xpm :file "c:/Users/William/Desktop/emacs-icons/build.xpm") 
      (image :type xpm :file "c:/Users/William/Desktop/emacs-icons/build.xpm") 
      (image :type xpm :file "c:/Users/William/Desktop/emacs-icons/build-disabled.xpm") 
      (image :type xpm :file "c:/Users/William/Desktop/emacs-icons/build-disabled.xpm")]) 

Это Build символ является extaneous. Вы хотите только строку "Build" и символ smart-compile.

+0

Ах, я неправильно понял документацию и думал, что должно быть имя строки и идентификатор символа. Однако, как и при создании ручного элемента, элемент меню не является постоянным; он исчезает через несколько секунд. Вы знаете, что вызывает это? –

+1

Нет, извините. Вам нужно будет исследовать дальше. Возможно, начните с проверки того, что элемент меню по-прежнему существует, даже если значок теперь отображается. Проверьте запись 'tool-bar' на глобальной карте и т. Д. – Drew

+1

Кстати, вы должны просто определить ключ' [Build] 'в' tool-bar-map' вместо определения ключа '[toolbar Build]' в 'глобального map'. (Не то, что это что-то меняет.) – Drew

Смежные вопросы