如何动态定义菜单项 - 方括号中的东西是什么?

时间:2012-04-01 16:56:29

标签: emacs elisp

这里不清楚一些基本语法。 define-key接受一组输入,其中一个输入在方括号内。这个结构是什么?如何动态生成方括号内的内容?

在简单的情况下,我可以显示如下的单项菜单:

(flet ((ok (&optional p1 &rest args) t))
  (setq menu-1 (make-sparse-keymap "Title"))
  (define-key menu-1 [menu-1-ok-event]
    `(menu-item "OK"
                ok 
                :keys ""
                :visible t
                :enable t))
  (x-popup-menu t menu-1))

我可以插入其他菜单项:

(flet ((ok (&optional p1 &rest args) t))
  (setq menu-1 (make-sparse-keymap "Title"))
  (define-key menu-1 [menu-1-event-ok]
    `(menu-item "OK"
                ok 
                :keys ""
                :visible t
                :enable t))
  (define-key menu-1 [menu-1-event-1]
    `(menu-item "This is line 1"
                nil
                :keys ""
                :visible t
                :enable t))
  (x-popup-menu t menu-1))

但是,如果我想动态生成方括号内的东西怎么办?如果我想要这样的东西怎么办:

  (while (< n 5)
   (define-key menu-1 [(dynamic-thing n)]
    `(menu-item (format "This is line %d" n)
                nil
                :keys ""
                :visible t
                :enable t)))

我试过

   (define-key menu-1 [(intern (format "menu-1-event-%d" n))]
      ...

..但是没有用。结果总是“实习生”。 ???

方括号是什么?语法对我来说并不熟悉。

1 个答案:

答案 0 :(得分:4)

这些是vectors[foo bar](quote (vector foo bar))的语法糖;这是一个文字。要构造一个需要评估元素的向量,请明确使用vector内置函数;它就像list

(define-key menu-1 (vector (format "menu-1-event-%d" n)) …

关于menu keymaps的章节也可能有所帮助。