# HG changeset patch # User Stefan Monnier # Date 1212000968 0 # Node ID eba56dbc7193e8d40d137722ee38b0551cad3fb2 # Parent fafc513e04bce253f92a600a93b8fd3fe5f24325 (easy-menu-convert-item, easy-menu-convert-item-1): Move the duplicate-generation outside of the caching so it also works for identical entries. diff -r fafc513e04bc -r eba56dbc7193 lisp/ChangeLog --- a/lisp/ChangeLog Wed May 28 17:43:58 2008 +0000 +++ b/lisp/ChangeLog Wed May 28 18:56:08 2008 +0000 @@ -1,5 +1,9 @@ 2008-05-28 Stefan Monnier + * emacs-lisp/easymenu.el (easy-menu-convert-item) + (easy-menu-convert-item-1): Move the duplicate-generation outside of + the caching so it also works for identical entries. + * tar-mode.el (tar-summarize-buffer): Fix reporter initialization. (tar-mode): Use write-region-annotate-functions rather than write-contents-functions. diff -r fafc513e04bc -r eba56dbc7193 lisp/emacs-lisp/easymenu.el --- a/lisp/emacs-lisp/easymenu.el Wed May 28 17:43:58 2008 +0000 +++ b/lisp/emacs-lisp/easymenu.el Wed May 28 18:56:08 2008 +0000 @@ -277,9 +277,25 @@ This also helps when the NAME of the entry is recreated each time: since the menu is built and traversed separately, the lookup would always fail because the key is `equal' but not `eq'." - (or (gethash item easy-menu-converted-items-table) - (puthash item (easy-menu-convert-item-1 item) - easy-menu-converted-items-table))) + (let* ((cache (gethash item easy-menu-converted-items-table)) + (result (or cache (easy-menu-convert-item-1 item))) + (key (car-safe result))) + (when (and (listp easy-menu-avoid-duplicate-keys) (symbolp key)) + ;; Merging multiple entries with the same name is sometimes what we + ;; want, but not when the entries are actually different (e.g. same + ;; name but different :suffix as seen in cal-menu.el) and appear in + ;; the same menu. So we try to detect and resolve conflicts. + (while (memq key easy-menu-avoid-duplicate-keys) + ;; We need to use some distinct object, ideally a symbol, ideally + ;; related to the `name'. Uninterned symbols do not work (they + ;; are apparently turned into strings and re-interned later on). + (setq key (intern (format "%s-%d" (symbol-name key) + (length easy-menu-avoid-duplicate-keys)))) + (setq result (cons key (cdr result)))) + (push key easy-menu-avoid-duplicate-keys)) + + (unless cache (puthash item result easy-menu-converted-items-table)) + result)) (defun easy-menu-convert-item-1 (item) "Parse an item description and convert it to a menu keymap element. @@ -376,20 +392,6 @@ ;; It also makes it easier/possible to lookup/change menu bindings ;; via keymap functions. (let ((key (easy-menu-intern name))) - (when (listp easy-menu-avoid-duplicate-keys) - ;; Merging multiple entries with the same name is sometimes what we - ;; want, but not when the entries are actually different (e.g. same - ;; name but different :suffix as seen in cal-menu.el) and appear in - ;; the same menu. So we try to detect and resolve conflicts. - (while (and (stringp name) - (memq key easy-menu-avoid-duplicate-keys)) - ;; We need to use some distinct object, ideally a symbol, ideally - ;; related to the `name'. Uninterned symbols do not work (they - ;; are apparently turned into strings and re-interned later on). - (setq key (intern (format "%s (%d)" (symbol-name key) - (length easy-menu-avoid-duplicate-keys))))) - (push key easy-menu-avoid-duplicate-keys)) - (cons key (and (not remove) (cons 'menu-item