【问题标题】:Changing the toolbar in Emacs Lisp更改 Emacs Lisp 中的工具栏
【发布时间】:2013-12-15 09:37:00
【问题描述】:

我正在尝试使用我自己的图像和命令自定义 Emacs 工具栏。每个按钮我有两个图像,一个“禁用”和一个“启用”图像。不幸的是,elisp 只提供tool-bar-add-item,它允许您指定单个图像。但是,工具栏的扩展菜单项语法具有:image 属性,对于启用/禁用和选择/取消选择的所有组合,可以将其设置为单个图像或四个图像的矢量。我将我的两个图像存储在“filename.xpm”和“filename-disabled.xpm”中,并且我定义了一个帮助函数,让我可以轻松地以这种格式定义新的工具栏项:

(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)]))

导致菜单项出现,但随后很快消失,没有明显的触发。

如何纠正这种行为?

【问题讨论】:

    标签: emacs elisp


    【解决方案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 符号是无关紧要的。您只需要 "Build" 字符串和 smart-compile 符号。

    【讨论】:

    • 啊,我误解了文档,并认为这是一个字符串名称和符号标识符。但是,与手动创建项一样,菜单项不是持久的;它会在几秒钟后消失。你知道是什么原因造成的吗?
    • 不,抱歉。您需要进一步调查。也许首先检查菜单项本身是否仍然存在,即使现在显示了图标。检查全局地图等中的tool-bar条目。
    • 顺便说一句,您应该可以只在tool-bar-map 中定义键[Build],而不是在global-map 中定义键[toolbar Build]。 (并不是说这会改变任何事情。)
    • 实际上,它可能会改变一些东西。似乎关闭 tool-bar-mode 并重新打开会重置 tool-bar-map,除非它已定义。至少尝试一下,似乎在tool-bar-map 中定义密钥可以将其保留在那里,即使在切换模式之后也是如此。
    • 在 tool-bar-map 中定义它会使更改永久化!谢谢!
    猜你喜欢
    • 2016-06-03
    • 2017-02-27
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    相关资源
    最近更新 更多