* image-mode.el (image-mode): Add image-after-revert-hook to after-revert-hook.
[bpt/emacs.git] / lisp / menu-bar.el
index 0338653..d831744 100644 (file)
@@ -1,7 +1,7 @@
 ;;; menu-bar.el --- define a default menu bar
 
-;; Copyright (C) 1993, 1994, 1995, 2000, 2001, 2002, 2003, 2004,
-;;   2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+;; Copyright (C) 1993, 1994, 1995, 2000, 2001, 2002, 2003, 2004, 2005,
+;;   2006, 2007, 2008, 2009, 2010  Free Software Foundation, Inc.
 
 ;; Author: RMS
 ;; Maintainer: FSF
 ;; help key.
 (setq menu-bar-final-items '(help-menu))
 
-(define-key global-map [menu-bar help-menu] (cons "Help" menu-bar-help-menu))
+(define-key global-map [menu-bar help-menu] (cons (purecopy "Help") menu-bar-help-menu))
 (defvar menu-bar-tools-menu (make-sparse-keymap "Tools"))
-(define-key global-map [menu-bar tools] (cons "Tools" menu-bar-tools-menu))
+(define-key global-map [menu-bar tools] (cons (purecopy "Tools") menu-bar-tools-menu))
 ;; This definition is just to show what this looks like.
 ;; It gets modified in place when menu-bar-update-buffers is called.
 (defvar global-buffers-menu-map (make-sparse-keymap "Buffers"))
 (define-key global-map [menu-bar buffer]
-  (cons "Buffers" global-buffers-menu-map))
+  (cons (purecopy "Buffers") global-buffers-menu-map))
 (defvar menu-bar-options-menu (make-sparse-keymap "Options"))
 (define-key global-map [menu-bar options]
-  (cons "Options" menu-bar-options-menu))
+  (cons (purecopy "Options") menu-bar-options-menu))
 (defvar menu-bar-edit-menu (make-sparse-keymap "Edit"))
-(define-key global-map [menu-bar edit] (cons "Edit" menu-bar-edit-menu))
+(define-key global-map [menu-bar edit] (cons (purecopy "Edit") menu-bar-edit-menu))
 (defvar menu-bar-file-menu (make-sparse-keymap "File"))
-(define-key global-map [menu-bar file] (cons "File" menu-bar-file-menu))
+(define-key global-map [menu-bar file] (cons (purecopy "File") menu-bar-file-menu))
 
 ;; This alias is for compatibility with 19.28 and before.
 (defvar menu-bar-files-menu menu-bar-file-menu)
@@ -61,6 +61,9 @@
 ;; This is referenced by some code below; it is defined in uniquify.el
 (defvar uniquify-buffer-name-style)
 
+;; From emulation/cua-base.el; used below
+(defvar cua-enable-cua-keys)
+
 \f
 ;; The "File" menu items
 (define-key menu-bar-file-menu [exit-emacs]
@@ -68,7 +71,7 @@
              :help ,(purecopy "Save unsaved buffers, then exit")))
 
 (define-key menu-bar-file-menu [separator-exit]
-  (purecopy "--"))
+  menu-bar-separator)
 
 ;; Don't use delete-frame as event name because that is a special
 ;; event.
              :help ,(purecopy "Split selected window in two windows")))
 
 (define-key menu-bar-file-menu [separator-window]
-  `(menu-item ,(purecopy "--")))
+  menu-bar-separator)
 
 (define-key menu-bar-file-menu [ps-print-region]
   `(menu-item ,(purecopy "Postscript Print Region (B+W)") ps-print-region
              :help ,(purecopy "Print current buffer with page headings")))
 
 (define-key menu-bar-file-menu [separator-print]
-  `(menu-item ,(purecopy "--")))
+  menu-bar-separator)
 
 (define-key menu-bar-file-menu [recover-session]
   `(menu-item ,(purecopy "Recover Crashed Session") recover-session
              :help ,(purecopy "Save current buffer to its file")))
 
 (define-key menu-bar-file-menu [separator-save]
-  `(menu-item ,(purecopy "--")))
+  menu-bar-separator)
 
 (defun menu-find-file-existing ()
   "Edit the existing file FILENAME."
              :help ,(purecopy "Search forward for a string as you type it")))
 
 (define-key menu-bar-search-menu [i-search]
-  `(menu-item ,(purecopy "Incremental Search") menu-bar-i-search-menu))
+  `(menu-item ,(purecopy "Incremental Search") ,menu-bar-i-search-menu))
 (define-key menu-bar-search-menu [separator-tag-isearch]
-  `(menu-item ,(purecopy "--")))
+  menu-bar-separator)
 
 (define-key menu-bar-search-menu [tags-continue]
   `(menu-item ,(purecopy "Continue Tags Search") tags-loop-continue
   `(menu-item ,(purecopy "Search Tagged Files...") tags-search
              :help ,(purecopy "Search for a regexp in all tagged files")))
 (define-key menu-bar-search-menu [separator-tag-search]
-  `(menu-item ,(purecopy "--")))
+  menu-bar-separator)
 
 (define-key menu-bar-search-menu [repeat-search-back]
   `(menu-item ,(purecopy "Repeat Backwards") nonincremental-repeat-search-backward
                               regexp-search-ring))
              :help ,(purecopy "Repeat last search forward")))
 (define-key menu-bar-search-menu [separator-repeat-search]
-  `(menu-item ,(purecopy "--")))
+  menu-bar-separator)
 
 (define-key menu-bar-search-menu [re-search-backward]
   `(menu-item ,(purecopy "Regexp Backwards...") nonincremental-re-search-backward
   `(menu-item ,(purecopy "Replace in Tagged Files...") tags-query-replace
              :help ,(purecopy "Interactively replace a regexp in all tagged files")))
 (define-key menu-bar-replace-menu [separator-replace-tags]
-  `(menu-item ,(purecopy "--")))
+  menu-bar-separator)
 
 (define-key menu-bar-replace-menu [query-replace-regexp]
   `(menu-item ,(purecopy "Replace Regexp...") query-replace-regexp
              ,(purecopy "Fill text in region to fit between left and right margin")))
 
 (define-key menu-bar-edit-menu [separator-bookmark]
-  `(menu-item ,(purecopy "--")))
+  menu-bar-separator)
 
 (define-key menu-bar-edit-menu [bookmark]
   `(menu-item ,(purecopy "Bookmarks") menu-bar-bookmark-map))
              :help ,(purecopy "Tell Tags commands which tag table file to use")))
 
 (define-key menu-bar-goto-menu [separator-tag-file]
-  `(menu-item ,(purecopy "--")))
+  menu-bar-separator)
 
 (define-key menu-bar-goto-menu [apropos-tags]
   `(menu-item ,(purecopy "Tags Apropos...") tags-apropos
              :help ,(purecopy "Find definition of function or variable")))
 
 (define-key menu-bar-goto-menu [separator-tags]
-  `(menu-item ,(purecopy "--")))
+  menu-bar-separator)
 
 (define-key menu-bar-goto-menu [end-of-buf]
   `(menu-item ,(purecopy "Goto End of Buffer") end-of-buffer))
              :help ,(purecopy "Read a line number and go to that line")))
 
 (define-key menu-bar-edit-menu [goto]
-  `(menu-item ,(purecopy "Go To") menu-bar-goto-menu))
+  `(menu-item ,(purecopy "Go To") ,menu-bar-goto-menu))
 
 (define-key menu-bar-edit-menu [replace]
-  `(menu-item ,(purecopy "Replace") menu-bar-replace-menu))
+  `(menu-item ,(purecopy "Replace") ,menu-bar-replace-menu))
 
 (define-key menu-bar-edit-menu [search]
-  `(menu-item ,(purecopy "Search") menu-bar-search-menu))
+  `(menu-item ,(purecopy "Search") ,menu-bar-search-menu))
 
 (define-key menu-bar-edit-menu [separator-search]
-  `(menu-item ,(purecopy "--")))
+  menu-bar-separator)
 
 (define-key menu-bar-edit-menu [mark-whole-buffer]
   `(menu-item ,(purecopy "Select All") mark-whole-buffer
                           (not (mouse-region-match)))
              :help
              ,(purecopy "Delete the text in region between mark and current position")))
-(defvar yank-menu (cons "Select Yank" nil))
+(defvar yank-menu (cons (purecopy "Select Yank") nil))
 (fset 'yank-menu (cons 'keymap yank-menu))
 (define-key menu-bar-edit-menu [paste-from-menu]
   `(menu-item ,(purecopy "Paste from Kill Menu") yank-menu
   `(menu-item ,(purecopy "Copy") menu-bar-kill-ring-save
              :enable mark-active
              :help ,(purecopy "Copy text in region between mark and current position")
-             :keys "\\[kill-ring-save]"))
+             :keys ,(purecopy "\\[kill-ring-save]")))
 (define-key menu-bar-edit-menu [cut]
   `(menu-item ,(purecopy "Cut") kill-region
              :enable (and mark-active (not buffer-read-only))
@@ -561,7 +564,7 @@ Do the same for the keys of the same name."
   `(menu-item ,(purecopy "Settings Matching Regexp...") customize-apropos
              :help ,(purecopy "Browse customizable settings whose names match regexp")))
 (define-key menu-bar-custom-menu [separator-1]
-  '("--"))
+  menu-bar-separator)
 (define-key menu-bar-custom-menu [customize-group]
   `(menu-item ,(purecopy "Specific Group...") customize-group
              :help ,(purecopy "Customize settings of specific group")))
@@ -572,7 +575,7 @@ Do the same for the keys of the same name."
   `(menu-item ,(purecopy "Specific Option...") customize-option
              :help ,(purecopy "Customize value of specific option")))
 (define-key menu-bar-custom-menu [separator-2]
-  '("--"))
+  menu-bar-separator)
 (define-key menu-bar-custom-menu [customize-changed-options]
   `(menu-item ,(purecopy "New Options...") customize-changed-options
              :help ,(purecopy "Options added or changed in recent Emacs versions")))
@@ -580,7 +583,7 @@ Do the same for the keys of the same name."
   `(menu-item ,(purecopy "Saved Options") customize-saved
              :help ,(purecopy "Customize previously saved options")))
 (define-key menu-bar-custom-menu [separator-3]
-  '("--"))
+  menu-bar-separator)
 (define-key menu-bar-custom-menu [customize-browse]
   `(menu-item ,(purecopy "Browse Customization Groups") customize-browse
              :help ,(purecopy "Browse all customization groups")))
@@ -596,11 +599,11 @@ FNAME is the minor mode's name (variable and function).
 DOC is the text to use for the menu entry.
 HELP is the text to use for the tooltip.
 PROPS are additional properties."
-  `'(menu-item ,(purecopy doc) ,fname
-     ,@props
-     :help ,(purecopy help)
-     :button (:toggle . (and (default-boundp ',fname)
-                            (default-value ',fname)))))
+  `(list 'menu-item  (purecopy ,doc) ',fname
+        ,@(mapcar (lambda (p) (list 'quote p)) props)
+        :help (purecopy ,help)
+        :button '(:toggle . (and (default-boundp ',fname)
+                                 (default-value ',fname)))))
 
 (defmacro menu-bar-make-toggle (name variable doc message help &rest body)
   `(progn
@@ -623,10 +626,10 @@ by \"Save Options\" in Custom buffers.")
        ;; a candidate for "Save Options", and we do not want to save options
        ;; the user have already set explicitly in his init file.
        (if interactively (customize-mark-as-set ',variable)))
-     '(menu-item ,(purecopy doc) ,name
-                :help ,(purecopy help)
-                 :button (:toggle . (and (default-boundp ',variable)
-                                        (default-value ',variable))))))
+     (list 'menu-item (purecopy ,doc) ',name
+          :help (purecopy ,help)
+          :button '(:toggle . (and (default-boundp ',variable)
+                                   (default-value ',variable))))))
 
 ;; Function for setting/saving default font.
 
@@ -657,9 +660,11 @@ by \"Save Options\" in Custom buffers.")
       (custom-push-theme 'theme-face 'default 'user 'set spec)
       (put 'default 'face-modified nil))))
 
+
+
 ;;; Assemble all the top-level items of the "Options" menu
 (define-key menu-bar-options-menu [customize]
-  `(menu-item ,(purecopy "Customize Emacs") menu-bar-custom-menu))
+  `(menu-item ,(purecopy "Customize Emacs") ,menu-bar-custom-menu))
 
 (defun menu-bar-options-save ()
   "Save current values of Options menu items using Custom."
@@ -678,7 +683,7 @@ by \"Save Options\" in Custom buffers.")
                   tooltip-mode menu-bar-mode tool-bar-mode
                   save-place uniquify-buffer-name-style fringe-mode
                   indicate-empty-lines indicate-buffer-boundaries
-                  case-fold-search
+                  case-fold-search font-use-system-font
                   current-language-environment default-input-method
                   ;; Saving `text-mode-hook' is somewhat questionable,
                   ;; as we might get more than we bargain for, if
@@ -703,13 +708,21 @@ by \"Save Options\" in Custom buffers.")
              :help ,(purecopy "Save options set from the menu above")))
 
 (define-key menu-bar-options-menu [custom-separator]
-  '("--"))
+  menu-bar-separator)
 
 (define-key menu-bar-options-menu [menu-set-font]
   `(menu-item ,(purecopy "Set Default Font...") menu-set-font
              :visible (display-multi-font-p)
              :help ,(purecopy "Select a default font")))
 
+(if (featurep 'system-font-setting)
+    (define-key menu-bar-options-menu [menu-system-font]
+      (menu-bar-make-toggle toggle-use-system-font font-use-system-font
+                           "Use system font"
+                           "Use system font: %s"
+                           "Use the monospaced font defined by the system")))
+
+
 ;; The "Show/Hide" submenu of menu "Options"
 
 (defvar menu-bar-showhide-menu (make-sparse-keymap "Show/Hide"))
@@ -730,7 +743,7 @@ by \"Save Options\" in Custom buffers.")
                           "Show the size of the buffer in the mode line"))
 
 (define-key menu-bar-showhide-menu [linecolumn-separator]
-  '("--"))
+  menu-bar-separator)
 
 (define-key menu-bar-showhide-menu [showhide-battery]
   (menu-bar-make-mm-toggle display-battery-mode
@@ -744,7 +757,7 @@ by \"Save Options\" in Custom buffers.")
 mail status in mode line"))
 
 (define-key menu-bar-showhide-menu [datetime-separator]
-  '("--"))
+  menu-bar-separator)
 
 (define-key menu-bar-showhide-menu [showhide-speedbar]
   `(menu-item ,(purecopy "Speedbar") speedbar-frame-mode
@@ -836,9 +849,9 @@ mail status in mode line"))
              :button (:radio . (eq indicate-buffer-boundaries nil))))
 
 (define-key menu-bar-showhide-fringe-menu [showhide-fringe-ind]
-  `(menu-item ,(purecopy "Buffer Boundaries") menu-bar-showhide-fringe-ind-menu
-             :visible `(display-graphic-p)
-       :help ,(purecopy "Indicate buffer boundaries in fringe")))
+  `(menu-item ,(purecopy "Buffer Boundaries") ,menu-bar-showhide-fringe-ind-menu
+             :visible (display-graphic-p)
+             :help ,(purecopy "Indicate buffer boundaries in fringe")))
 
 (define-key menu-bar-showhide-fringe-menu [indicate-empty-lines]
   (menu-bar-make-toggle toggle-indicate-empty-lines indicate-empty-lines
@@ -904,8 +917,8 @@ mail status in mode line"))
              :button (:radio . (eq fringe-mode 0))))
 
 (define-key menu-bar-showhide-menu [showhide-fringe]
-  `(menu-item ,(purecopy "Fringe") menu-bar-showhide-fringe-menu
-       :visible `(display-graphic-p)))
+  `(menu-item ,(purecopy "Fringe") ,menu-bar-showhide-fringe-menu
+             :visible (display-graphic-p)))
 
 (defvar menu-bar-showhide-scroll-bar-menu (make-sparse-keymap "Scroll-bar"))
 
@@ -948,14 +961,14 @@ mail status in mode line"))
   (customize-set-variable 'scroll-bar-mode nil))
 
 (define-key menu-bar-showhide-menu [showhide-scroll-bar]
-  `(menu-item ,(purecopy "Scroll-bar") menu-bar-showhide-scroll-bar-menu
-       :visible `(display-graphic-p)))
+  `(menu-item ,(purecopy "Scroll-bar") ,menu-bar-showhide-scroll-bar-menu
+             :visible (display-graphic-p)))
 
 (define-key menu-bar-showhide-menu [showhide-tooltip-mode]
-  `(menu-item ,(purecopy "Tooltips") 'tooltip-mode
-       :help ,(purecopy "Turn tooltips on/off")
-       :visible  `(and (display-graphic-p) (fboundp 'x-show-tip))
-       :button `(:toggle . tooltip-mode)))
+  `(menu-item ,(purecopy "Tooltips") tooltip-mode
+             :help ,(purecopy "Turn tooltips on/off")
+             :visible (and (display-graphic-p) (fboundp 'x-show-tip))
+             :button (:toggle . tooltip-mode)))
 
 (define-key menu-bar-showhide-menu [menu-bar-mode]
   `(menu-item ,(purecopy "Menu-bar") toggle-menu-bar-mode-from-frame
@@ -963,33 +976,33 @@ mail status in mode line"))
              :button (:toggle . (> (frame-parameter nil 'menu-bar-lines) 0))))
 
 (define-key menu-bar-showhide-menu [showhide-tool-bar]
-  `(menu-item ,(purecopy "Tool-bar") 'toggle-tool-bar-mode-from-frame
-       :help ,(purecopy "Turn tool-bar on/off")
-       :visible `(display-graphic-p)
-       :button `(:toggle . (> (frame-parameter nil 'tool-bar-lines) 0))))
+  `(menu-item ,(purecopy "Tool-bar") toggle-tool-bar-mode-from-frame
+             :help ,(purecopy "Turn tool-bar on/off")
+             :visible (display-graphic-p)
+             :button (:toggle . (> (frame-parameter nil 'tool-bar-lines) 0))))
 
 (define-key menu-bar-options-menu [showhide]
-  `(menu-item ,(purecopy "Show/Hide") menu-bar-showhide-menu))
+  `(menu-item ,(purecopy "Show/Hide") ,menu-bar-showhide-menu))
 
 (define-key menu-bar-options-menu [showhide-separator]
-  '("--"))
+  menu-bar-separator)
 
 (define-key menu-bar-options-menu [mule]
   ;; It is better not to use backquote here,
   ;; because that makes a bootstrapping problem
   ;; if you need to recompile all the Lisp files using interpreted code.
-  `(menu-item ,(purecopy "Mule (Multilingual Environment)") mule-menu-keymap
+  `(menu-item ,(purecopy "Mule (Multilingual Environment)") ,mule-menu-keymap
 ;; Most of the MULE menu actually does make sense in unibyte mode,
 ;; e.g. language selection.
 ;;;    :visible '(default-value 'enable-multibyte-characters)
        ))
 ;(setq menu-bar-final-items (cons 'mule menu-bar-final-items))
 ;(define-key menu-bar-options-menu [preferences]
-;  `(menu-item ,(purecopy "Preferences") menu-bar-preferences-menu
-;      :help ,(purecopy "Toggle important global options")))
+;  `(menu-item ,(purecopy "Preferences") ,menu-bar-preferences-menu
+;            :help ,(purecopy "Toggle important global options")))
 
 (define-key menu-bar-options-menu [mule-separator]
-  '("--"))
+   menu-bar-separator)
 
 (define-key menu-bar-options-menu [debug-on-quit]
   (menu-bar-make-toggle toggle-debug-on-quit debug-on-quit
@@ -1000,14 +1013,14 @@ mail status in mode line"))
                        "Enter Debugger on Error" "Debug on Error %s"
                        "Enter Lisp debugger when an error is signaled"))
 (define-key menu-bar-options-menu [debugger-separator]
-  '("--"))
+  menu-bar-separator)
 
 (define-key menu-bar-options-menu [blink-cursor-mode]
   (menu-bar-make-mm-toggle blink-cursor-mode
                           "Blinking Cursor"
                           "Whether the cursor blinks (Blink Cursor mode)"))
 (define-key menu-bar-options-menu [cursor-separator]
-  '("--"))
+  menu-bar-separator)
 
 (define-key menu-bar-options-menu [save-place]
   (menu-bar-make-toggle toggle-save-place-globally save-place
@@ -1031,7 +1044,7 @@ mail status in mode line"))
                                  'forward))))
 
 (define-key menu-bar-options-menu [edit-options-separator]
-  '("--"))
+  menu-bar-separator)
 (define-key menu-bar-options-menu [cua-mode]
   (menu-bar-make-mm-toggle cua-mode
                           "C-x/C-c/C-v Cut and Paste (CUA)"
@@ -1077,7 +1090,7 @@ mail status in mode line"))
                (interactive)
                (unless visual-line-mode
                  (visual-line-mode 1))
-               (message "Visual-Line mode enabled"))
+               (message ,(purecopy "Visual-Line mode enabled")))
              :help ,(purecopy "Wrap long lines at word boundaries")
              :button (:radio . (and (null truncate-lines)
                                     (not (truncated-partial-width-window-p))
@@ -1111,11 +1124,11 @@ mail status in mode line"))
              :enable (not (truncated-partial-width-window-p))))
 
 (define-key menu-bar-options-menu [line-wrapping]
-  `(menu-item ,(purecopy "Line Wrapping in this Buffer") menu-bar-line-wrapping-menu))
+  `(menu-item ,(purecopy "Line Wrapping in this Buffer") ,menu-bar-line-wrapping-menu))
 
 
 (define-key menu-bar-options-menu [highlight-separator]
-  '("--"))
+  menu-bar-separator)
 (define-key menu-bar-options-menu [highlight-paren-mode]
   (menu-bar-make-mm-toggle show-paren-mode
                           "Paren Match Highlighting"
@@ -1152,10 +1165,10 @@ mail status in mode line"))
 (defvar menu-bar-games-menu (make-sparse-keymap "Games"))
 
 (define-key menu-bar-tools-menu [games]
-  `(menu-item ,(purecopy "Games") menu-bar-games-menu))
+  `(menu-item ,(purecopy "Games") ,menu-bar-games-menu))
 
 (define-key menu-bar-tools-menu [separator-games]
-  '("--"))
+  menu-bar-separator)
 
 (define-key menu-bar-games-menu [zone]
   `(menu-item ,(purecopy "Zone Out")  zone
@@ -1201,10 +1214,10 @@ mail status in mode line"))
   (make-sparse-keymap "Encryption/Decryption"))
 
 (define-key menu-bar-tools-menu [encryption-decryption]
-  `(menu-item ,(purecopy "Encryption/Decryption") menu-bar-encryption-decryption-menu))
+  `(menu-item ,(purecopy "Encryption/Decryption") ,menu-bar-encryption-decryption-menu))
 
 (define-key menu-bar-tools-menu [separator-encryption-decryption]
-  '("--"))
+  menu-bar-separator)
 
 (define-key menu-bar-encryption-decryption-menu [insert-keys]
   `(menu-item ,(purecopy "Insert Keys") epa-insert-keys
@@ -1227,7 +1240,7 @@ mail status in mode line"))
              :help ,(purecopy "Browse your public keyring")))
 
 (define-key menu-bar-encryption-decryption-menu [separator-keys]
-  '("--"))
+  menu-bar-separator)
 
 (define-key menu-bar-encryption-decryption-menu [sign-region]
   `(menu-item ,(purecopy "Sign Region") epa-sign-region
@@ -1246,7 +1259,7 @@ mail status in mode line"))
              :help ,(purecopy "Decrypt the current region")))
 
 (define-key menu-bar-encryption-decryption-menu [separator-file]
-  '("--"))
+  menu-bar-separator)
 
 (define-key menu-bar-encryption-decryption-menu [sign-file]
   `(menu-item ,(purecopy "Sign File...") epa-sign-file
@@ -1275,22 +1288,20 @@ mail status in mode line"))
              :help ,(purecopy "Invoke the Emacs built-in calendar")))
 
 (define-key menu-bar-tools-menu [separator-net]
-  '("--"))
+  menu-bar-separator)
 
 (define-key menu-bar-tools-menu [directory-search]
   `(menu-item ,(purecopy "Directory Search") eudc-tools-menu))
 (define-key menu-bar-tools-menu [compose-mail]
-  `(list
-   'menu-item `(format "Send Mail (with %s)" (send-mail-item-name))
-   'compose-mail
-   :visible `(and mail-user-agent (not (eq mail-user-agent 'ignore)))
-   :help ,(purecopy "Send a mail message")))
+  `(menu-item (format "Send Mail (with %s)" (send-mail-item-name)) compose-mail
+             :visible (and mail-user-agent (not (eq mail-user-agent 'ignore)))
+             :help ,(purecopy "Send a mail message")))
 (define-key menu-bar-tools-menu [rmail]
-  `(list
-   'menu-item `(format "Read Mail (with %s)" (read-mail-item-name))
-   'menu-bar-read-mail
-   :visible `(and read-mail-command (not (eq read-mail-command 'ignore)))
-   :help ,(purecopy "Read your mail and reply to it")))
+  `(menu-item (format "Read Mail (with %s)" (read-mail-item-name))
+              menu-bar-read-mail
+             :visible (and read-mail-command
+                            (not (eq read-mail-command 'ignore)))
+             :help ,(purecopy "Read your mail and reply to it")))
 
 (defun menu-bar-read-mail ()
   "Read mail using `read-mail-command'."
@@ -1302,17 +1313,15 @@ mail status in mode line"))
              :help ,(purecopy "Read network news groups")))
 
 (define-key menu-bar-tools-menu [separator-vc]
-  '("--"))
+  menu-bar-separator)
 
 (define-key menu-bar-tools-menu [pcl-cvs]
   `(menu-item ,(purecopy "PCL-CVS") cvs-global-menu))
 (define-key menu-bar-tools-menu [vc] nil) ;Create the place for the VC menu.
 
 (define-key menu-bar-tools-menu [separator-compare]
-  '("--"))
+  menu-bar-separator)
 
-(define-key menu-bar-tools-menu [ediff-misc]
-  `(menu-item ,(purecopy "Ediff Miscellanea") menu-bar-ediff-misc-menu))
 (define-key menu-bar-tools-menu [epatch]
   `(menu-item ,(purecopy "Apply Patch") menu-bar-epatch-menu))
 (define-key menu-bar-tools-menu [ediff-merge]
@@ -1321,13 +1330,25 @@ mail status in mode line"))
   `(menu-item ,(purecopy "Compare (Ediff)") menu-bar-ediff-menu))
 
 (define-key menu-bar-tools-menu [separator-spell]
-  '("--"))
+  menu-bar-separator)
 
 (define-key menu-bar-tools-menu [spell]
   `(menu-item ,(purecopy "Spell Checking") ispell-menu-map))
 
 (define-key menu-bar-tools-menu [separator-prog]
-  '("--"))
+  menu-bar-separator)
+
+(define-key menu-bar-tools-menu [semantic]
+  `(menu-item ,(purecopy "Source Code Parsers (Semantic)")
+             semantic-mode
+             :help ,(purecopy "Toggle automatic parsing in source code buffers (Semantic mode)")
+             :button (:toggle . (bound-and-true-p semantic-mode))))
+
+(define-key menu-bar-tools-menu [ede]
+  `(menu-item ,(purecopy "Project support (EDE)")
+             global-ede-mode
+             :help ,(purecopy "Toggle the Emacs Development Environment (Global EDE mode)")
+             :button (:toggle . (bound-and-true-p global-ede-mode))))
 
 (define-key menu-bar-tools-menu [gdb]
   `(menu-item ,(purecopy "Debugger (GDB)...") gdb
@@ -1368,10 +1389,10 @@ mail status in mode line"))
              :help ,(purecopy "Keyboard layout for specific input method")))
 (define-key menu-bar-describe-menu [describe-language-environment]
   `(menu-item ,(purecopy "Describe Language Environment")
-       describe-language-environment-map))
+             ,describe-language-environment-map))
 
 (define-key menu-bar-describe-menu [separator-desc-mule]
-  '("--"))
+  menu-bar-separator)
 
 (define-key menu-bar-describe-menu [list-keybindings]
   `(menu-item ,(purecopy "List Key Bindings") describe-bindings
@@ -1443,7 +1464,7 @@ key, a click, or a menu-item")))
   `(menu-item ,(purecopy "Find Commands by Name...") apropos-command
              :help ,(purecopy "Find commands whose names match a regexp")))
 (define-key menu-bar-search-documentation-menu [sep1]
-  '("--"))
+  menu-bar-separator)
 (define-key menu-bar-search-documentation-menu [lookup-command-in-manual]
   `(menu-item ,(purecopy "Look Up Command in User Manual...") Info-goto-emacs-command-node
              :help ,(purecopy "Display manual section that describes a command")))
@@ -1466,7 +1487,7 @@ key, a click, or a menu-item")))
   `(menu-item ,(purecopy "Read Man Page...") manual-entry
              :help ,(purecopy "Man-page docs for external commands and libraries")))
 (define-key menu-bar-manuals-menu [sep2]
-  '("--"))
+  menu-bar-separator)
 (define-key menu-bar-manuals-menu [order-emacs-manuals]
   `(menu-item ,(purecopy "Ordering Manuals") view-order-manuals
              :help ,(purecopy "How to order manuals from the Free Software Foundation")))
@@ -1479,7 +1500,7 @@ key, a click, or a menu-item")))
 (define-key menu-bar-manuals-menu [emacs-lisp-reference]
   `(menu-item ,(purecopy "Emacs Lisp Reference") menu-bar-read-lispref
              :help ,(purecopy "Read the Emacs Lisp Reference manual")))
-(define-key menu-bar-manuals-menu [emac-lisp-intro]
+(define-key menu-bar-manuals-menu [emacs-lisp-intro]
   `(menu-item ,(purecopy "Introduction to Emacs Lisp") menu-bar-read-lispintro
              :help ,(purecopy "Read the Introduction to Emacs Lisp Programming")))
 
@@ -1490,7 +1511,7 @@ key, a click, or a menu-item")))
   `(menu-item ,(purecopy "About Emacs") about-emacs
              :help ,(purecopy "Display version number, copyright info, and basic help")))
 (define-key menu-bar-help-menu [sep4]
-  '("--"))
+  menu-bar-separator)
 (define-key menu-bar-help-menu [describe-no-warranty]
   `(menu-item ,(purecopy "(Non)Warranty") describe-no-warranty
              :help ,(purecopy "Explain that Emacs has NO WARRANTY")))
@@ -1508,7 +1529,7 @@ key, a click, or a menu-item")))
                                 data-directory))
     (goto-address-mode 1)))
 (define-key menu-bar-help-menu [sep2]
-  '("--"))
+  menu-bar-separator)
 (define-key menu-bar-help-menu [external-packages]
   `(menu-item ,(purecopy "External Packages") menu-bar-help-extra-packages
              :help ,(purecopy "Lisp packages distributed separately for use in Emacs")))
@@ -1516,16 +1537,16 @@ key, a click, or a menu-item")))
   `(menu-item ,(purecopy "Find Emacs Packages") finder-by-keyword
              :help ,(purecopy "Find packages and features by keyword")))
 (define-key menu-bar-help-menu [more-manuals]
-  `(menu-item ,(purecopy "More Manuals") menu-bar-manuals-menu))
+  `(menu-item ,(purecopy "More Manuals") ,menu-bar-manuals-menu))
 (define-key menu-bar-help-menu [emacs-manual]
   `(menu-item ,(purecopy "Read the Emacs Manual") info-emacs-manual
              :help ,(purecopy "Full documentation of Emacs features")))
 (define-key menu-bar-help-menu [describe]
-  `(menu-item ,(purecopy "Describe") menu-bar-describe-menu))
+  `(menu-item ,(purecopy "Describe") ,menu-bar-describe-menu))
 (define-key menu-bar-help-menu [search-documentation]
-  `(menu-item ,(purecopy "Search Documentation") menu-bar-search-documentation-menu))
+  `(menu-item ,(purecopy "Search Documentation") ,menu-bar-search-documentation-menu))
 (define-key menu-bar-help-menu [sep1]
-  '("--"))
+  menu-bar-separator)
 (define-key menu-bar-help-menu [emacs-psychotherapist]
   `(menu-item ,(purecopy "Emacs Psychotherapist") doctor
              :help ,(purecopy "Our doctor will help you feel better")))
@@ -1691,7 +1712,9 @@ Buffers menu is regenerated."
   :type 'boolean
   :group 'menu)
 
-(defvar list-buffers-directory nil)
+(defvar list-buffers-directory nil
+  "String to display in buffer listings for buffers not visiting a file.")
+(make-variable-buffer-local 'list-buffers-directory)
 
 (defun menu-bar-select-buffer ()
   (interactive)
@@ -1846,8 +1869,7 @@ Buffers menu is regenerated."
 ;;nil means the buffer shouldn't be listed.  You can redefine this."
 ;;  (if (string-match "\\` " (buffer-name buffer))
 ;;      nil
-;;    (save-excursion
-;;     (set-buffer buffer)
+;;    (with-current-buffer buffer
 ;;     (let ((size (buffer-size)))
 ;;       (format "%s%s %-19s %6s %-15s %s"
 ;;            (if (buffer-modified-p) "*" " ")
@@ -1864,39 +1886,39 @@ Buffers menu is regenerated."
                   ;; bug in keymap.c that I don't understand yet.  -stef
                   minibuffer-local-completion-map))
   (define-key map [menu-bar minibuf]
-    (cons "Minibuf" (make-sparse-keymap "Minibuf"))))
+    (cons (purecopy "Minibuf") (make-sparse-keymap "Minibuf"))))
 
 (let ((map minibuffer-local-completion-map))
   (define-key map [menu-bar minibuf ?\?]
-    `(menu-item ,(purecopy "List Completions") 'minibuffer-completion-help
-         :help ,(purecopy "Display all possible completions")))
+    `(menu-item ,(purecopy "List Completions") minibuffer-completion-help
+               :help ,(purecopy "Display all possible completions")))
   (define-key map [menu-bar minibuf space]
-    `(menu-item ,(purecopy "Complete Word") 'minibuffer-complete-word
-         :help ,(purecopy "Complete at most one word")))
+    `(menu-item ,(purecopy "Complete Word") minibuffer-complete-word
+               :help ,(purecopy "Complete at most one word")))
   (define-key map [menu-bar minibuf tab]
-    `(menu-item ,(purecopy "Complete") 'minibuffer-complete
-         :help ,(purecopy "Complete as far as possible"))))
+    `(menu-item ,(purecopy "Complete") minibuffer-complete
+               :help ,(purecopy "Complete as far as possible"))))
 
 (let ((map minibuffer-local-map))
   (define-key map [menu-bar minibuf quit]
-    `(menu-item ,(purecopy "Quit") 'abort-recursive-edit
-         :help ,(purecopy "Abort input and exit minibuffer")))
+    `(menu-item ,(purecopy "Quit") abort-recursive-edit
+               :help ,(purecopy "Abort input and exit minibuffer")))
   (define-key map [menu-bar minibuf return]
-    `(menu-item ,(purecopy "Enter") 'exit-minibuffer
-          :key-sequence "\r"
-         :help ,(purecopy "Terminate input and exit minibuffer")))
+    `(menu-item ,(purecopy "Enter") exit-minibuffer
+               :key-sequence ,(purecopy "\r")
+               :help ,(purecopy "Terminate input and exit minibuffer")))
   (define-key map [menu-bar minibuf isearch-forward]
-    `(menu-item ,(purecopy "Isearch History Forward") 'isearch-forward
-         :help ,(purecopy "Incrementally search minibuffer history forward")))
+    `(menu-item ,(purecopy "Isearch History Forward") isearch-forward
+               :help ,(purecopy "Incrementally search minibuffer history forward")))
   (define-key map [menu-bar minibuf isearch-backward]
-    `(menu-item ,(purecopy "Isearch History Backward") 'isearch-backward
-         :help ,(purecopy "Incrementally search minibuffer history backward")))
+    `(menu-item ,(purecopy "Isearch History Backward") isearch-backward
+               :help ,(purecopy "Incrementally search minibuffer history backward")))
   (define-key map [menu-bar minibuf next]
-    `(menu-item ,(purecopy "Next History Item") 'next-history-element
-         :help ,(purecopy "Put next minibuffer history element in the minibuffer")))
+    `(menu-item ,(purecopy "Next History Item") next-history-element
+               :help ,(purecopy "Put next minibuffer history element in the minibuffer")))
   (define-key map [menu-bar minibuf previous]
-    `(menu-item ,(purecopy "Previous History Item") 'previous-history-element
-         :help ,(purecopy "Put previous minibuffer history element in the minibuffer"))))
+    `(menu-item ,(purecopy "Previous History Item") previous-history-element
+               :help ,(purecopy "Put previous minibuffer history element in the minibuffer"))))
 \f
 ;;;###autoload
 ;; This comment is taken from tool-bar.el near
@@ -1924,7 +1946,7 @@ turn on menu bars; otherwise, turn off menu bars."
   ;; Make the message appear when Emacs is idle.  We can not call message
   ;; directly.  The minor-mode message "Menu-bar mode disabled" comes
   ;; after this function returns, overwriting any message we do here.
-  (when (and (interactive-p) (not menu-bar-mode))
+  (when (and (called-interactively-p 'interactive) (not menu-bar-mode))
     (run-with-idle-timer 0 nil 'message
                         "Menu-bar mode disabled.  Use M-x menu-bar-mode to make the menu bar appear."))
   menu-bar-mode)