elisp:使用easy-menu创建动态菜单,并在创建过程中评估部分代码,而不是在调用时

时间:2013-09-02 15:17:38

标签: elisp dynamic-code

我正在尝试为自己的编译插件创建一个动态菜单,但我已经碰壁了。这是我目前的代码:

(defun mme-tools-create-menu ()
  (easy-menu-define mme-tools-menu erlang-mode-map "MME-Tools-Menu" 
    '("MME-Tools"
      ("Current Subsystem"
       ["Run gmake" mme-tools-build]
       ["Build beams" mme-tools-build-beam]
       ["Run Posttest" mme-tools-build-posttest]
       ["Run Move" mme-tools-build-move])
      ("Build Subsystem")))
  (dolist (path mmepaths)
    (if (string-match "code" path)
        (let* ((ss (file-name-base path))
               (uss (upcase ss)))
          (easy-menu-add-item mme-tools-menu '("Build Subsystem") 
                              [uss (mme-tools-build-path-subsystem " -j10 beam" (getenv ss))])))))

我想要的代码是创建一个名为“Build Subsystem”的子菜单,并用条目填充它。但是没有创建条目。任何帮助,将不胜感激。

2 个答案:

答案 0 :(得分:1)

我建议你做点什么

(easy-menu-define mme-tools-menu erlang-mode-map "MME-Tools-Menu"
  `("MME-Tools"
    ("Current Subsystem"
     ["Run gmake" mme-tools-build]
     ["Build beams" mme-tools-build-beam]
     ["Run Posttest" mme-tools-build-posttest]
     ["Run Move" mme-tools-build-move])
    ("Build Subsystem"
     ,@(mapcar (lambda (path)
                 (when (string-match "code" path)
                   (let* ((ss (file-name-base path))
                          (uss (upcase ss)))
                     (vector uss `(mme-tools-build-path-subsystem " -j10 beam" (getenv ',ss))))))))))

答案 1 :(得分:0)

我怀疑你可能正在寻找这样的东西,但是如果没有看到更多的代码就很难知道。您应该能够使用macroexpand等自己进行调试,直到获得一组适当的参数传递给easy-menu-define

Wrt Stefan的代码,如你所提到的,这会添加缺少的mapcar秒arg,它会在(mme-tools-build-path-subsystem...)之前删除反引号(只是猜测)。

(easy-menu-define
    mme-tools-menu
    erlang-mode-map "MME-Tools-Menu"
    `("MME-Tools"
      ("Current Subsystem"
       ["Run gmake" mme-tools-build]
       ["Build beams" mme-tools-build-beam]
       ["Run Posttest" mme-tools-build-posttest]
       ["Run Move" mme-tools-build-move])
      ("Build Subsystem"
       ,@(mapcar (lambda (path)
                   (when (string-match "code" path)
                     (let* ((ss (file-name-base path))
                            (uss (upcase ss)))
                       (vector uss
                               (mme-tools-build-path-subsystem
                                 " -j10 beam" (getenv ',ss))))))
                 mmepaths))))