Mercurial > emacs
changeset 95371:eba56dbc7193
(easy-menu-convert-item, easy-menu-convert-item-1):
Move the duplicate-generation outside of the caching so it also works
for identical entries.
author | Stefan Monnier <monnier@iro.umontreal.ca> |
---|---|
date | Wed, 28 May 2008 18:56:08 +0000 |
parents | fafc513e04bc |
children | ffc05d56ac32 |
files | lisp/ChangeLog lisp/emacs-lisp/easymenu.el |
diffstat | 2 files changed, 23 insertions(+), 17 deletions(-) [+] |
line wrap: on
line diff
--- 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 <monnier@iro.umontreal.ca> + * 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.
--- 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