Move ns-win.el's rather wacky menu adjustments to menu-bar.el.
[bpt/emacs.git] / lisp / menu-bar.el
index 362613b..9d8e474 100644 (file)
@@ -1,11 +1,12 @@
 ;;; 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
 ;; Keywords: internal, mouse
+;; Package: emacs
 
 ;; This file is part of GNU Emacs.
 
 ;; 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 +62,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 +72,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."
 (define-key menu-bar-search-menu [i-search]
   `(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
 (define-key menu-bar-edit-menu [props]
   `(menu-item ,(purecopy "Text Properties") facemenu-menu))
 
+;; ns-win.el said: Add spell for platorm consistency.
+(if (featurep 'ns)
+    (define-key menu-bar-edit-menu [spell]
+      `(menu-item ,(purecopy "Spell") ispell-menu-map)))
+
 (define-key menu-bar-edit-menu [fill]
   `(menu-item ,(purecopy "Fill") fill-region
              :enable (and mark-active (not buffer-read-only))
              ,(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))
   `(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
+;; The ns differences here seem silly.
+(define-key menu-bar-edit-menu (if (featurep 'ns) [select-paste]
+                                 [paste-from-menu])
+  ;; ns-win.el said: Change text to be more consistent with
+  ;; surrounding menu items `paste', etc."
+  `(menu-item ,(purecopy (if (featurep 'ns) "Select and Paste"
+                           "Paste from Kill Menu")) yank-menu
              :enable (and (cdr yank-menu) (not buffer-read-only))
              :help ,(purecopy "Choose a string from the kill ring and paste it")))
 (define-key menu-bar-edit-menu [paste]
   `(menu-item ,(purecopy "Paste") yank
              :enable (and (or
-                           ;; Emacs compiled --without-x doesn't have
-                           ;; x-selection-exists-p.
+                           ;; Emacs compiled --without-x (or --with-ns)
+                           ;; doesn't have x-selection-exists-p.
                            (and (fboundp 'x-selection-exists-p)
-                                (x-selection-exists-p))
-                           kill-ring)
+                                (x-selection-exists-p 'CLIPBOARD))
+                           (if (featurep 'ns) ; like paste-from-menu
+                               (cdr yank-menu)
+                             kill-ring))
                           (not buffer-read-only))
              :help ,(purecopy "Paste (yank) text most recently cut/copied")))
 (define-key menu-bar-edit-menu [copy]
-  `(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]"))
+  ;; ns-win.el said: Substitute a Copy function that works better
+  ;; under X (for GNUstep).
+  `(menu-item ,(purecopy "Copy") ,(if (featurep 'ns)
+                                      'ns-copy-including-secondary
+                                    'menu-bar-kill-ring-save)
+              :enable mark-active
+              :help ,(purecopy "Copy text in region between mark and current position")
+              :keys ,(purecopy (if (featurep 'ns)
+                                   "\\[ns-copy-including-secondary]"
+                                 "\\[kill-ring-save]"))))
 (define-key menu-bar-edit-menu [cut]
   `(menu-item ,(purecopy "Cut") kill-region
              :enable (and mark-active (not buffer-read-only))
              :help
              ,(purecopy "Cut (kill) text in region between mark and current position")))
+;; ns-win.el said: Separate undo from cut/paste section.
+(if (featurep 'ns)
+    (define-key menu-bar-edit-menu [separator-undo] `(,(purecopy "--"))))
 (define-key menu-bar-edit-menu [undo]
   `(menu-item ,(purecopy "Undo") undo
              :enable (and (not buffer-read-only)
                             (consp buffer-undo-list)))
              :help ,(purecopy "Undo last operation")))
 
-
 (defun menu-bar-kill-ring-save (beg end)
   (interactive "r")
   (if (mouse-region-match)
   "Make CUT, PASTE and COPY (keys and menu bar items) use the clipboard.
 Do the same for the keys of the same name."
   (interactive)
-  ;; We can't use constant list structure here because it becomes pure,
-  ;; and because it gets modified with cache data.
-  (define-key menu-bar-edit-menu [paste]
-    (cons "Paste" (cons "Paste text from clipboard" 'clipboard-yank)))
-  (define-key menu-bar-edit-menu [copy]
-    (cons "Copy" (cons "Copy text in region to the clipboard"
-                      'clipboard-kill-ring-save)))
-  (define-key menu-bar-edit-menu [cut]
-    (cons "Cut" (cons "Delete text in region and copy it to the clipboard"
-                     'clipboard-kill-region)))
-
   ;; These are Sun server keysyms for the Cut, Copy and Paste keys
   ;; (also for XFree86 on Sun keyboard):
   (define-key global-map [f20] 'clipboard-kill-region)
@@ -561,7 +574,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 +585,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 +593,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 +609,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 +636,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,6 +670,8 @@ 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))
@@ -669,16 +684,26 @@ by \"Save Options\" in Custom buffers.")
     ;; put on a customized-value property.
     (dolist (elt '(line-number-mode column-number-mode size-indication-mode
                   cua-mode show-paren-mode transient-mark-mode
-                  blink-cursor-mode display-time-mode display-battery-mode))
+                  blink-cursor-mode display-time-mode display-battery-mode
+                  ;; These are set by other functions that don't set
+                  ;; the customized state.  Having them here has the
+                  ;; side-effect that turning them off via X
+                  ;; resources acts like having customized them, but
+                  ;; that seems harmless.
+                  menu-bar-mode tool-bar-mode))
+      ;; FIXME ? It's a little annoying that running this command
+      ;; always loads cua-base, paren, time, and battery, even if they
+      ;; have not been customized in any way.  (Due to custom-load-symbol.)
       (and (customize-mark-to-save elt)
           (setq need-save t)))
     ;; These are set with `customize-set-variable'.
     (dolist (elt '(scroll-bar-mode
                   debug-on-quit debug-on-error
-                  tooltip-mode menu-bar-mode tool-bar-mode
+                  ;; Somehow this works, when tool-bar and menu-bar don't.
+                  tooltip-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
@@ -686,7 +711,7 @@ by \"Save Options\" in Custom buffers.")
                   ;; Nonetheless, not saving it would like be confuse
                   ;; more often.
                   ;; -- Per Abrahamsen <abraham@dina.kvl.dk> 2002-02-11.
-                  text-mode-hook))
+                  text-mode-hook tool-bar-position))
       (and (get elt 'customized-value)
           (customize-mark-to-save elt)
           (setq need-save t)))
@@ -698,18 +723,30 @@ by \"Save Options\" in Custom buffers.")
     (when need-save
       (custom-save-all))))
 
+(define-key menu-bar-options-menu [package]
+  '(menu-item "Manage Emacs Packages" package-list-packages
+             :help "Install or uninstall additional Emacs packages"))
+
 (define-key menu-bar-options-menu [save]
   `(menu-item ,(purecopy "Save Options") menu-bar-options-save
              :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 +767,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 +781,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
@@ -962,17 +999,99 @@ mail status in mode line"))
              :help ,(purecopy "Turn menu-bar on/off")
              :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))))
+(defun menu-bar-set-tool-bar-position (position)
+  (customize-set-variable 'tool-bar-mode t)
+  (customize-set-variable 'tool-bar-position position))
+(defun menu-bar-showhide-tool-bar-menu-customize-disable ()
+  "Do not display tool bars."
+  (interactive)
+  (customize-set-variable 'tool-bar-mode nil))
+(defun menu-bar-showhide-tool-bar-menu-customize-enable-left ()
+  "Display tool bars on the left side."
+  (interactive)
+  (menu-bar-set-tool-bar-position 'left))
+(defun menu-bar-showhide-tool-bar-menu-customize-enable-right ()
+  "Display tool bars on the right side."
+  (interactive)
+  (menu-bar-set-tool-bar-position 'right))
+(defun menu-bar-showhide-tool-bar-menu-customize-enable-top ()
+  "Display tool bars on the top side."
+  (interactive)
+  (menu-bar-set-tool-bar-position 'top))
+(defun menu-bar-showhide-tool-bar-menu-customize-enable-bottom ()
+  "Display tool bars on the bottom side."
+  (interactive)
+  (menu-bar-set-tool-bar-position 'bottom))
+
+(if (featurep 'move-toolbar)
+    (progn
+      (defvar menu-bar-showhide-tool-bar-menu (make-sparse-keymap "Tool-bar"))
+
+      (define-key menu-bar-showhide-tool-bar-menu [showhide-tool-bar-left]
+       `(menu-item ,(purecopy "On the left") 
+                   menu-bar-showhide-tool-bar-menu-customize-enable-left
+                   :help ,(purecopy "Tool-bar at the left side")
+                   :visible (display-graphic-p)
+                   :button 
+                   (:radio . (and tool-bar-mode 
+                                  (eq (frame-parameter nil 'tool-bar-position)
+                                      'left)))))
+
+      (define-key menu-bar-showhide-tool-bar-menu [showhide-tool-bar-right]
+       `(menu-item ,(purecopy "On the right") 
+                   menu-bar-showhide-tool-bar-menu-customize-enable-right
+                   :help ,(purecopy "Tool-bar at the right side")
+                   :visible (display-graphic-p)
+                   :button
+                   (:radio . (and tool-bar-mode 
+                                  (eq (frame-parameter nil 'tool-bar-position)
+                                      'right)))))
+
+      (define-key menu-bar-showhide-tool-bar-menu [showhide-tool-bar-bottom]
+       `(menu-item ,(purecopy "On the bottom") 
+                   menu-bar-showhide-tool-bar-menu-customize-enable-bottom
+                   :help ,(purecopy "Tool-bar at the bottom")
+                   :visible (display-graphic-p)
+                   :button
+                   (:radio . (and tool-bar-mode 
+                                  (eq (frame-parameter nil 'tool-bar-position)
+                                      'bottom)))))
+
+      (define-key menu-bar-showhide-tool-bar-menu [showhide-tool-bar-top]
+       `(menu-item ,(purecopy "On the top") 
+                   menu-bar-showhide-tool-bar-menu-customize-enable-top
+                   :help ,(purecopy "Tool-bar at the top")
+                   :visible (display-graphic-p)
+                   :button
+                   (:radio . (and tool-bar-mode 
+                                  (eq (frame-parameter nil 'tool-bar-position)
+                                      'top)))))
+
+      (define-key menu-bar-showhide-tool-bar-menu [showhide-tool-bar-none]
+       `(menu-item ,(purecopy "None") 
+                   menu-bar-showhide-tool-bar-menu-customize-disable
+                   :help ,(purecopy "Turn tool-bar off")
+                   :visible (display-graphic-p)
+                   :button (:radio . (eq tool-bar-mode nil))))
+
+      (define-key menu-bar-showhide-menu [showhide-tool-bar]
+       `(menu-item ,(purecopy "Tool-bar") ,menu-bar-showhide-tool-bar-menu
+                   :visible (display-graphic-p)))
+
+      )
+  ;; else not tool bar that can move.
+  (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))))
+)
 
 (define-key menu-bar-options-menu [showhide]
   `(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,
@@ -989,7 +1108,7 @@ mail status in mode line"))
 ;            :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 +1119,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 +1150,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)"
@@ -1042,7 +1161,7 @@ mail status in mode line"))
 (define-key menu-bar-options-menu [cua-emulation-mode]
   (menu-bar-make-mm-toggle cua-mode
                           "Shift movement mark region (CUA)"
-                          "Use shifted movement keys to set and extend the region."
+                          "Use shifted movement keys to set and extend the region"
                           (:visible (and (boundp 'cua-enable-cua-keys)
                                          (not cua-enable-cua-keys)))))
 
@@ -1077,7 +1196,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))
@@ -1115,7 +1234,7 @@ mail status in mode line"))
 
 
 (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"
@@ -1155,7 +1274,7 @@ mail status in mode line"))
   `(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
@@ -1178,6 +1297,9 @@ mail status in mode line"))
 (define-key menu-bar-games-menu [life]
   `(menu-item ,(purecopy "Life")  life
              :help ,(purecopy "Watch how John Conway's cellular automaton evolves")))
+(define-key menu-bar-games-menu [land]
+  `(menu-item ,(purecopy "Landmark") landmark
+             :help ,(purecopy "Watch a neural-network robot learn landmarks")))
 (define-key menu-bar-games-menu [hanoi]
   `(menu-item ,(purecopy "Towers of Hanoi") hanoi
              :help ,(purecopy "Watch Towers-of-Hanoi puzzle solved by Emacs")))
@@ -1204,7 +1326,7 @@ mail status in mode line"))
   `(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 +1349,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 +1368,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,7 +1397,7 @@ 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))
@@ -1284,8 +1406,10 @@ mail status in mode line"))
              :visible (and mail-user-agent (not (eq mail-user-agent 'ignore)))
              :help ,(purecopy "Send a mail message")))
 (define-key menu-bar-tools-menu [rmail]
-  `(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)))
+  `(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 ()
@@ -1298,17 +1422,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]
@@ -1317,13 +1439,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
@@ -1367,7 +1501,7 @@ mail status in mode line"))
              ,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
@@ -1375,6 +1509,9 @@ mail status in mode line"))
 (define-key menu-bar-describe-menu [describe-current-display-table]
   `(menu-item ,(purecopy "Describe Display Table") describe-current-display-table
              :help ,(purecopy "Describe the current display table")))
+(define-key menu-bar-describe-menu [describe-package]
+  `(menu-item ,(purecopy "Describe Package...") describe-package
+              :help ,(purecopy "Display documentation of a Lisp package")))
 (define-key menu-bar-describe-menu [describe-face]
   `(menu-item ,(purecopy "Describe Face...") describe-face
               :help ,(purecopy "Display the properties of a face")))
@@ -1439,7 +1576,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")))
@@ -1462,7 +1599,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")))
@@ -1475,7 +1612,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")))
 
@@ -1486,7 +1623,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")))
@@ -1504,13 +1641,13 @@ 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
+  `(menu-item ,(purecopy "Finding Extra Packages") menu-bar-help-extra-packages
              :help ,(purecopy "Lisp packages distributed separately for use in Emacs")))
 (define-key menu-bar-help-menu [find-emacs-packages]
-  `(menu-item ,(purecopy "Find Emacs Packages") finder-by-keyword
-             :help ,(purecopy "Find packages and features by keyword")))
+  `(menu-item ,(purecopy "Search Built-in Packages") finder-by-keyword
+             :help ,(purecopy "Find built-in packages and features by keyword")))
 (define-key menu-bar-help-menu [more-manuals]
   `(menu-item ,(purecopy "More Manuals") ,menu-bar-manuals-menu))
 (define-key menu-bar-help-menu [emacs-manual]
@@ -1521,7 +1658,7 @@ key, a click, or a menu-item")))
 (define-key menu-bar-help-menu [search-documentation]
   `(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")))
@@ -1844,8 +1981,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) "*" " ")
@@ -1862,7 +1998,7 @@ 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 ?\?]
@@ -1881,7 +2017,7 @@ Buffers menu is regenerated."
                :help ,(purecopy "Abort input and exit minibuffer")))
   (define-key map [menu-bar minibuf return]
     `(menu-item ,(purecopy "Enter") exit-minibuffer
-               :key-sequence "\r"
+               :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
@@ -1896,36 +2032,43 @@ Buffers menu is regenerated."
     `(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
-;; (put 'tool-bar-mode ...)
-;; We want to pretend the menu bar by standard is on, as this will make
-;; customize consider disabling the menu bar a customization, and save
-;; that.  We could do this for real by setting :init-value below, but
-;; that would overwrite disabling the tool bar from X resources.
-(put 'menu-bar-mode 'standard-value '(t))
-
 (define-minor-mode menu-bar-mode
   "Toggle display of a menu bar on each frame.
 This command applies to all frames that exist and frames to be
 created in the future.
 With a numeric argument, if the argument is positive,
 turn on menu bars; otherwise, turn off menu bars."
-  :init-value nil
+  :init-value t
   :global t
   :group 'frames
 
-  ;; Make menu-bar-mode and default-frame-alist consistent.
-  (modify-all-frames-parameters (list (cons 'menu-bar-lines
-                                           (if menu-bar-mode 1 0))))
-
+  ;; Turn the menu-bars on all frames on or off.
+  (let ((val (if menu-bar-mode 1 0)))
+    (dolist (frame (frame-list))
+      (set-frame-parameter frame 'menu-bar-lines val))
+    ;; If the user has given `default-frame-alist' a `menu-bar-lines'
+    ;; parameter, replace it.
+    (if (assq 'menu-bar-lines default-frame-alist)
+       (setq default-frame-alist
+             (cons (cons 'menu-bar-lines val)
+                   (assq-delete-all 'menu-bar-lines
+                                    default-frame-alist)))))
   ;; 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)
+                        "Menu-bar mode disabled.  Use M-x menu-bar-mode to make the menu bar appear.")))
+
+;;;###autoload
+;; (This does not work right unless it comes after the above definition.)
+;; This comment is taken from tool-bar.el near
+;; (put 'tool-bar-mode ...)
+;; We want to pretend the menu bar by standard is on, as this will make
+;; customize consider disabling the menu bar a customization, and save
+;; that.  We could do this for real by setting :init-value above, but
+;; that would overwrite disabling the menu bar from X resources.
+(put 'menu-bar-mode 'standard-value '(t))
 
 (defun toggle-menu-bar-mode-from-frame (&optional arg)
   "Toggle menu bar on or off, based on the status of the current frame.
@@ -1959,5 +2102,4 @@ If FRAME is nil or not given, use the selected frame."
 
 (provide 'menu-bar)
 
-;; arch-tag: 6e6a3c22-4ec4-4d3d-8190-583f8ef94ced
 ;;; menu-bar.el ends here