修补菜单,获取"哇,间接键盘输入"错误

时间:2014-07-01 13:56:06

标签: emacs elisp menuitem menubar keymapping

Gnu Emacs 24.4在Windows上进行预测试。我想动态修改nxml-mode的菜单栏菜单,附加已知XML文件的森林结构(由xi:包含任何被编辑的XML文件组成)。除菜单修补外,工作正常。这实际上也适用于单个文件,但一旦它成为一个层次结构(嵌套的键盘映射),访问菜单会给我邪恶的"哇,间接键映射条目"错误,此时它退出Emacs的时间是因为事情变得严重受挫(当Alt-Tab停止工作时它会令人不安)。幽默地,我看到有人曾经提交过一份错误报告,要求提供更容易理解的错误文本,但是被拒绝了。

我在修补它之前和之后转储了菜单结构,我无法看到修补版本的错误。转储是非常繁琐的阅读,但不如修补它的代码,我估计,这可能只会引起恐怖的喘息,而不会引出解决方案。这是菜单栏相关部分的之前状态:

((Show\ Outline\ Only menu-item "Show Outline Only" nxml-hide-all-text-content) 
 (Show\ Everything menu-item "Show Everything" nxml-show-all)
 (nil menu-item "---")
 (Validation menu-item "Validation" rng-validate-mode :button (:toggle . rng-validate-mode))
 (nil-4 menu-item "---")
 (Set\ Schema menu-item "Set Schema" (keymap "Set Schema" (Automatically menu-item "Automatically" rng-auto-set-schema) (For\ Document\ Type menu-item "For Document Type" nil :filter #[257 "ÂÁ!À\"" ["For Document Type" (lambda (menu) (mapcar (lambda (type-id) (vector type-id (list (quote rng-set-document-type) type-id))) (rng-possible-type-ids))) easy-menu-filter-return] 4 " (fn MENU)"]) (Any\ Well-Formed\ XML menu-item "Any Well-Formed XML" rng-set-vacuous-schema) (File\.\.\. menu-item "File..." rng-set-schema-file)))
 (Show\ Schema\ Location menu-item "Show Schema Location" rng-what-schema)
 (Save\ Schema\ Location menu-item "Save Schema Location" rng-save-schema-location :help "Save the location of the schema currently being used for this buffer")
 (nil-8 menu-item "---")
 (First\ Error menu-item "First Error" rng-first-error :enable rng-validate-mode) 
 (Next\ Error menu-item "Next Error" rng-next-error :enable rng-validate-mode)
 (nil-11 menu-item "---")
 (Customize\ nXML menu-item "Customize nXML" menu-function-7 :key-sequence nil))

在将菜单内容添加到最后之后,这是州的状态:

((Show\ Outline\ Only menu-item "Show Outline Only" nxml-hide-all-text-content)
 (Show\ Everything menu-item "Show Everything" nxml-show-all)
 (nil menu-item "---")
 (Validation menu-item "Validation" rng-validate-mode :button (:toggle . rng-validate-mode))
 (nil-4 menu-item "---")
 (Set\ Schema menu-item "Set Schema" (keymap "Set Schema" (Automatically menu-item "Automatically" rng-auto-set-schema) (For\ Document\ Type menu-item "For Document Type" nil :filter #[257 "ÂÁ!À\"" ["For Document Type" (lambda (menu) (mapcar (lambda (type-id) (vector type-id (list (quote rng-set-document-type) type-id))) (rng-possible-type-ids))) easy-menu-filter-return] 4 " (fn MENU)"]) (Any\ Well-Formed\ XML menu-item "Any Well-Formed XML" rng-set-vacuous-schema) (File\.\.\. menu-item "File..." rng-set-schema-file)))
 (Show\ Schema\ Location menu-item "Show Schema Location" rng-what-schema)
 (Save\ Schema\ Location menu-item "Save Schema Location" rng-save-schema-location :help "Save the location of the schema currently being used for this buffer")
 (nil-8 menu-item "---")
 (First\ Error menu-item "First Error" rng-first-error :enable rng-validate-mode) 
 (Next\ Error menu-item "Next Error" rng-next-error :enable rng-validate-mode)
 (nil-11 menu-item "---")
 (Customize\ nXML menu-item "Customize nXML" menu-function-7 :key-sequence nil)
 (ppop-event-0 "intro.xml" (keymap "intro.xml" (ppop-event-4 menu-item "introswan.xml" nil) (ppop-event-3 menu-item "introgame.xml" nil) (ppop-event-2 menu-item "introclark.xml" nil) (ppop-event-1 menu-item "introroots.xml" nil))))

为清楚起见,这个sexp被添加到列表中,就在最后一个列表元素(Customize\ nXML ...之后:

 (ppop-event-0
  "intro.xml"
  (keymap "intro.xml"
          (ppop-event-4 menu-item "introswan.xml" nil)
          (ppop-event-3 menu-item "introgame.xml" nil)
          (ppop-event-2 menu-item "introclark.xml" nil)
          (ppop-event-1 menu-item "introroots.xml" nil)))

意图是现有的下拉列表最后会有一个新的条目,其中包含文本" intro.xml"应该生成另一个菜单,其中包含条目" introswan.xml"," introclark.xml"," introroots.xml"和" introgame.xml"。为简洁起见,我已将所有添加项的回调函数设置为nil;将实际功能放入其中并不能避免错误。

我的子层次结构看起来与同一下拉列表中另一个子层次结构的结构相同(参见keymap" Set Schema"),这当然有效。我无法看到错误或如何将结构解释为间接键映射。它似乎适用于不需要嵌套键映射的单个文件的情况。我的事情已经不多了......

发出消息的相关来源位于C中,见{I 3}}

2 个答案:

答案 0 :(得分:1)

请参阅Emacs bug #14248,Emacs Dev已选择不调查和修复。但也许如果你提交另一个错误,用你的食谱重现问题,他们会重新考虑。 M-x report-emacs-bug

特别是,如果您可以跟踪软件Emacs 到此错误,那么我们希望他们会更认真地考虑问题。 (我的错误报告(14248)只是关于错误信息无益。)

FWIW:Elisp手册中没有提到“间接键映射”,除了关于节点where-is-internalScanning Keymaps的这句话:

 If NOINDIRECT is non-`nil', `where-is-internal' doesn't follow
 indirect keymap bindings.  This makes it possible to search for an
 indirect definition itself.

答案 1 :(得分:1)

我认为问题是您的ppop-event-0绑定在其menu-item“名称”之前缺少"intro.xml"符号。最终结果是你的绑定最终看起来像AFAIK在任何地方都不再使用的旧格式(但是很难弄明白,因此如果/当我们碰到这样的事情时,我会在那里添加一个令人讨厌的错误,所以至于尝试确保我们听到用户的声音。)

我认为这个错误消息已经存在了很长时间,以至于我们可以肯定地说这些间接绑定不再被使用了,我们可以放弃对它的支持(因此相应的错误,最终结果可能会对你没有多大帮助)。