comparison lisp/menu-bar.el @ 88155:d7ddb3e565de

sync with trunk
author Henrik Enberg <henrik.enberg@telia.com>
date Mon, 16 Jan 2006 00:03:54 +0000
parents e88404e8f2cf
children
comparison
equal deleted inserted replaced
88154:8ce476d3ba36 88155:d7ddb3e565de
1 ;;; menu-bar.el --- define a default menu bar 1 ;;; menu-bar.el --- define a default menu bar
2 2
3 ;; Copyright (C) 1993, 1994, 1995, 2000, 2001, 2002 Free Software Foundation, Inc. 3 ;; Copyright (C) 1993, 1994, 1995, 2000, 2001, 2002, 2003, 2004,
4 ;; 2005 Free Software Foundation, Inc.
4 5
5 ;; Author: RMS 6 ;; Author: RMS
6 ;; Maintainer: FSF 7 ;; Maintainer: FSF
7 ;; Keywords: internal, mouse 8 ;; Keywords: internal, mouse
8 9
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 ;; GNU General Public License for more details. 20 ;; GNU General Public License for more details.
20 21
21 ;; You should have received a copy of the GNU General Public License 22 ;; You should have received a copy of the GNU General Public License
22 ;; along with GNU Emacs; see the file COPYING. If not, write to the 23 ;; along with GNU Emacs; see the file COPYING. If not, write to the
23 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, 24 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
24 ;; Boston, MA 02111-1307, USA. 25 ;; Boston, MA 02110-1301, USA.
25 26
26 ;; Avishai Yacobi suggested some menu rearrangements. 27 ;; Avishai Yacobi suggested some menu rearrangements.
27 28
28 ;;; Commentary: 29 ;;; Commentary:
29 30
61 (defvar menu-bar-options-menu (make-sparse-keymap "Options")) 62 (defvar menu-bar-options-menu (make-sparse-keymap "Options"))
62 (define-key global-map [menu-bar options] 63 (define-key global-map [menu-bar options]
63 (cons "Options" menu-bar-options-menu)) 64 (cons "Options" menu-bar-options-menu))
64 (defvar menu-bar-edit-menu (make-sparse-keymap "Edit")) 65 (defvar menu-bar-edit-menu (make-sparse-keymap "Edit"))
65 (define-key global-map [menu-bar edit] (cons "Edit" menu-bar-edit-menu)) 66 (define-key global-map [menu-bar edit] (cons "Edit" menu-bar-edit-menu))
66 (defvar menu-bar-files-menu (make-sparse-keymap "File")) 67 (defvar menu-bar-file-menu (make-sparse-keymap "File"))
67 (define-key global-map [menu-bar files] (cons "File" menu-bar-files-menu)) 68 (define-key global-map [menu-bar file] (cons "File" menu-bar-file-menu))
68 69
69 ;; This alias is for compatibility with 19.28 and before. 70 ;; This alias is for compatibility with 19.28 and before.
70 (defvar menu-bar-file-menu menu-bar-files-menu) 71 (defvar menu-bar-files-menu menu-bar-file-menu)
71 72
72 ;; This is referenced by some code below; it is defined in uniquify.el 73 ;; This is referenced by some code below; it is defined in uniquify.el
73 (defvar uniquify-buffer-name-style) 74 (defvar uniquify-buffer-name-style)
74 75
75 76
76 ;; The "File" menu items 77 ;; The "File" menu items
77 (define-key menu-bar-files-menu [exit-emacs] 78 (define-key menu-bar-file-menu [exit-emacs]
78 '(menu-item "Exit Emacs" save-buffers-kill-emacs 79 '(menu-item "Exit Emacs" save-buffers-kill-emacs
79 :help "Save unsaved buffers, then exit")) 80 :help "Save unsaved buffers, then exit"))
80 81
81 (define-key menu-bar-files-menu [separator-exit] 82 (define-key menu-bar-file-menu [separator-exit]
82 '("--")) 83 '("--"))
83 84
84 ;; Don't use delete-frame as event name because that is a special 85 ;; Don't use delete-frame as event name because that is a special
85 ;; event. 86 ;; event.
86 (define-key menu-bar-files-menu [delete-this-frame] 87 (define-key menu-bar-file-menu [delete-this-frame]
87 '(menu-item "Delete Frame" delete-frame 88 '(menu-item "Delete Frame" delete-frame
88 :visible (fboundp 'delete-frame) 89 :visible (fboundp 'delete-frame)
89 :enable (delete-frame-enabled-p) 90 :enable (delete-frame-enabled-p)
90 :help "Delete currently selected frame")) 91 :help "Delete currently selected frame"))
91 (define-key menu-bar-files-menu [make-frame-on-display] 92 (define-key menu-bar-file-menu [make-frame-on-display]
92 '(menu-item "New Frame on Display..." make-frame-on-display 93 '(menu-item "New Frame on Display..." make-frame-on-display
93 :visible (fboundp 'make-frame-on-display) 94 :visible (fboundp 'make-frame-on-display)
94 :help "Open a new frame on another display")) 95 :help "Open a new frame on another display"))
95 (define-key menu-bar-files-menu [make-frame] 96 (define-key menu-bar-file-menu [make-frame]
96 '(menu-item "New Frame" make-frame-command 97 '(menu-item "New Frame" make-frame-command
97 :visible (fboundp 'make-frame-command) 98 :visible (fboundp 'make-frame-command)
98 :help "Open a new frame")) 99 :help "Open a new frame"))
99 100
100 (define-key menu-bar-files-menu [one-window] 101 (define-key menu-bar-file-menu [one-window]
101 '(menu-item "Unsplit Windows" delete-other-windows 102 '(menu-item "Remove Splits" delete-other-windows
102 :enable (not (one-window-p t nil)) 103 :enable (not (one-window-p t nil))
103 :help "Make selected window fill its frame")) 104 :help "Selected window grows to fill the whole frame"))
104 105
105 (define-key menu-bar-files-menu [split-window] 106 (define-key menu-bar-file-menu [split-window]
106 '(menu-item "Split Window" split-window-vertically 107 '(menu-item "Split Window" split-window-vertically
107 :help "Split selected window in two")) 108 :enable (and (menu-bar-menu-frame-live-and-visible-p)
108 109 (menu-bar-non-minibuffer-window-p))
109 (define-key menu-bar-files-menu [separator-window] 110 :help "Split selected window in two windows"))
111
112 (define-key menu-bar-file-menu [separator-window]
110 '(menu-item "--")) 113 '(menu-item "--"))
111 114
112 (define-key menu-bar-files-menu [ps-print-region] 115 (define-key menu-bar-file-menu [ps-print-region]
113 '(menu-item "Postscript Print Region (B+W)" ps-print-region 116 '(menu-item "Postscript Print Region (B+W)" ps-print-region
114 :enable mark-active 117 :enable mark-active
115 :help "Pretty-print marked region in black and white to PostScript printer")) 118 :help "Pretty-print marked region in black and white to PostScript printer"))
116 (define-key menu-bar-files-menu [ps-print-buffer] 119 (define-key menu-bar-file-menu [ps-print-buffer]
117 '(menu-item "Postscript Print Buffer (B+W)" ps-print-buffer 120 '(menu-item "Postscript Print Buffer (B+W)" ps-print-buffer
121 :enable (menu-bar-menu-frame-live-and-visible-p)
118 :help "Pretty-print current buffer in black and white to PostScript printer")) 122 :help "Pretty-print current buffer in black and white to PostScript printer"))
119 (define-key menu-bar-files-menu [ps-print-region-faces] 123 (define-key menu-bar-file-menu [ps-print-region-faces]
120 '(menu-item "Postscript Print Region" ps-print-region-with-faces 124 '(menu-item "Postscript Print Region" ps-print-region-with-faces
121 :enable mark-active 125 :enable mark-active
122 :help "Pretty-print marked region to PostScript printer")) 126 :help "Pretty-print marked region to PostScript printer"))
123 (define-key menu-bar-files-menu [ps-print-buffer-faces] 127 (define-key menu-bar-file-menu [ps-print-buffer-faces]
124 '(menu-item "Postscript Print Buffer" ps-print-buffer-with-faces 128 '(menu-item "Postscript Print Buffer" ps-print-buffer-with-faces
129 :enable (menu-bar-menu-frame-live-and-visible-p)
125 :help "Pretty-print current buffer to PostScript printer")) 130 :help "Pretty-print current buffer to PostScript printer"))
126 (define-key menu-bar-files-menu [print-region] 131 (define-key menu-bar-file-menu [print-region]
127 '(menu-item "Print Region" print-region 132 '(menu-item "Print Region" print-region
128 :enable mark-active 133 :enable mark-active
129 :help "Print region between mark and current position")) 134 :help "Print region between mark and current position"))
130 (define-key menu-bar-files-menu [print-buffer] 135 (define-key menu-bar-file-menu [print-buffer]
131 '(menu-item "Print Buffer" print-buffer 136 '(menu-item "Print Buffer" print-buffer
137 :enable (menu-bar-menu-frame-live-and-visible-p)
132 :help "Print current buffer with page headings")) 138 :help "Print current buffer with page headings"))
133 139
134 (define-key menu-bar-files-menu [separator-print] 140 (define-key menu-bar-file-menu [separator-print]
135 '(menu-item "--")) 141 '(menu-item "--"))
136 142
137 (define-key menu-bar-files-menu [recover-session] 143 (define-key menu-bar-file-menu [recover-session]
138 '(menu-item "Recover Crashed Session..." recover-session 144 '(menu-item "Recover Crashed Session" recover-session
139 :enable (and auto-save-list-file-prefix 145 :enable (and auto-save-list-file-prefix
140 (file-directory-p 146 (file-directory-p
141 (file-name-directory auto-save-list-file-prefix)) 147 (file-name-directory auto-save-list-file-prefix))
142 (directory-files 148 (directory-files
143 (file-name-directory auto-save-list-file-prefix) 149 (file-name-directory auto-save-list-file-prefix)
146 (regexp-quote 152 (regexp-quote
147 (file-name-nondirectory 153 (file-name-nondirectory
148 auto-save-list-file-prefix))) 154 auto-save-list-file-prefix)))
149 t)) 155 t))
150 :help "Recover edits from a crashed session")) 156 :help "Recover edits from a crashed session"))
151 (define-key menu-bar-files-menu [revert-buffer] 157 (define-key menu-bar-file-menu [revert-buffer]
152 '(menu-item "Revert Buffer" revert-buffer 158 '(menu-item "Revert Buffer" revert-buffer
153 :enable (or revert-buffer-function 159 :enable (or revert-buffer-function
154 revert-buffer-insert-file-contents-function 160 revert-buffer-insert-file-contents-function
155 (and (buffer-file-name) 161 (and buffer-file-number
156 (or (buffer-modified-p) 162 (or (buffer-modified-p)
157 (not (verify-visited-file-modtime 163 (not (verify-visited-file-modtime
158 (current-buffer)))))) 164 (current-buffer))))))
159 :help "Re-read current buffer from its file")) 165 :help "Re-read current buffer from its file"))
160 (define-key menu-bar-files-menu [write-file] 166 (define-key menu-bar-file-menu [write-file]
161 '(menu-item "Save Buffer As..." write-file 167 '(menu-item "Save As..." write-file
162 :enable (not (window-minibuffer-p 168 :enable (and (menu-bar-menu-frame-live-and-visible-p)
163 (frame-selected-window menu-updating-frame))) 169 (menu-bar-non-minibuffer-window-p))
164 :help "Write current buffer to another file")) 170 :help "Write current buffer to another file"))
165 (define-key menu-bar-files-menu [save-buffer] 171 (define-key menu-bar-file-menu [save-buffer]
166 '(menu-item "Save (current buffer)" save-buffer 172 '(menu-item "Save" save-buffer
167 :enable (and (buffer-modified-p) 173 :enable (and (buffer-modified-p)
168 (buffer-file-name) 174 (buffer-file-name)
169 (not (window-minibuffer-p 175 (menu-bar-non-minibuffer-window-p))
170 (frame-selected-window menu-updating-frame))))
171 :help "Save current buffer to its file")) 176 :help "Save current buffer to its file"))
172 177
173 (define-key menu-bar-files-menu [separator-save] 178 (define-key menu-bar-file-menu [separator-save]
174 '(menu-item "--")) 179 '(menu-item "--"))
175 180
176 (define-key menu-bar-files-menu [kill-buffer] 181 (defun menu-find-file-existing ()
177 '(menu-item "Close (current buffer)" kill-this-buffer 182 "Edit the existing file FILENAME."
183 (interactive)
184 (let* ((mustmatch (not (and (fboundp 'x-uses-old-gtk-dialog)
185 (x-uses-old-gtk-dialog))))
186 (filename (car (find-file-read-args "Find file: " mustmatch))))
187 (if mustmatch
188 (find-file-existing filename)
189 (find-file filename))))
190
191
192 (define-key menu-bar-file-menu [kill-buffer]
193 '(menu-item "Close" kill-this-buffer
178 :enable (kill-this-buffer-enabled-p) 194 :enable (kill-this-buffer-enabled-p)
179 :help "Discard current buffer")) 195 :help "Discard (kill) current buffer"))
180 (define-key menu-bar-files-menu [insert-file] 196 (define-key menu-bar-file-menu [insert-file]
181 '(menu-item "Insert File..." insert-file 197 '(menu-item "Insert File..." insert-file
182 :enable (not (window-minibuffer-p 198 :enable (menu-bar-non-minibuffer-window-p)
183 (frame-selected-window menu-updating-frame)))
184 :help "Insert another file into current buffer")) 199 :help "Insert another file into current buffer"))
185 (define-key menu-bar-files-menu [dired] 200 (define-key menu-bar-file-menu [dired]
186 '(menu-item "Open Directory..." dired 201 '(menu-item "Open Directory..." dired
187 :help "Read a directory, operate on its files")) 202 :enable (menu-bar-non-minibuffer-window-p)
188 (define-key menu-bar-files-menu [open-file] 203 :help "Read a directory, to operate on its files"))
189 '(menu-item "Open File..." find-file 204 (define-key menu-bar-file-menu [open-file]
190 :enable (not (window-minibuffer-p 205 '(menu-item "Open File..." menu-find-file-existing
191 (frame-selected-window menu-updating-frame))) 206 :enable (menu-bar-non-minibuffer-window-p)
192 :help "Read a file into an Emacs buffer")) 207 :help "Read an existing file into an Emacs buffer"))
208 (define-key menu-bar-file-menu [new-file]
209 '(menu-item "Visit New File..." find-file
210 :enable (menu-bar-non-minibuffer-window-p)
211 :help "Specify a new file's name, to edit the file"))
193 212
194 213
195 ;; The "Edit" menu items 214 ;; The "Edit" menu items
196 215
197 ;; The "Edit->Search" submenu 216 ;; The "Edit->Search" submenu
288 307
289 (define-key menu-bar-search-menu [tags-continue] 308 (define-key menu-bar-search-menu [tags-continue]
290 '(menu-item "Continue Tags Search" tags-loop-continue 309 '(menu-item "Continue Tags Search" tags-loop-continue
291 :help "Continue last tags search operation")) 310 :help "Continue last tags search operation"))
292 (define-key menu-bar-search-menu [tags-srch] 311 (define-key menu-bar-search-menu [tags-srch]
293 '(menu-item "Search tagged files" tags-search 312 '(menu-item "Search tagged files..." tags-search
294 :help "Search for a regexp in all tagged files")) 313 :help "Search for a regexp in all tagged files"))
295 (define-key menu-bar-search-menu [separator-tag-search] 314 (define-key menu-bar-search-menu [separator-tag-search]
296 '(menu-item "--")) 315 '(menu-item "--"))
297 316
298 (define-key menu-bar-search-menu [repeat-search-back] 317 (define-key menu-bar-search-menu [repeat-search-back]
332 351
333 (define-key menu-bar-replace-menu [tags-repl-continue] 352 (define-key menu-bar-replace-menu [tags-repl-continue]
334 '(menu-item "Continue Replace" tags-loop-continue 353 '(menu-item "Continue Replace" tags-loop-continue
335 :help "Continue last tags replace operation")) 354 :help "Continue last tags replace operation"))
336 (define-key menu-bar-replace-menu [tags-repl] 355 (define-key menu-bar-replace-menu [tags-repl]
337 '(menu-item "Replace in tagged files" tags-query-replace 356 '(menu-item "Replace in tagged files..." tags-query-replace
338 :help "Interactively replace a regexp in all tagged files")) 357 :help "Interactively replace a regexp in all tagged files"))
339 (define-key menu-bar-replace-menu [separator-replace-tags] 358 (define-key menu-bar-replace-menu [separator-replace-tags]
340 '(menu-item "--")) 359 '(menu-item "--"))
341 360
342 (define-key menu-bar-replace-menu [query-replace-regexp] 361 (define-key menu-bar-replace-menu [query-replace-regexp]
367 :help "Record positions and jump between them")) 386 :help "Record positions and jump between them"))
368 387
369 (defvar menu-bar-goto-menu (make-sparse-keymap "Go To")) 388 (defvar menu-bar-goto-menu (make-sparse-keymap "Go To"))
370 389
371 (define-key menu-bar-goto-menu [set-tags-name] 390 (define-key menu-bar-goto-menu [set-tags-name]
372 '(menu-item "Set Tags File Name" visit-tags-table 391 '(menu-item "Set Tags File Name..." visit-tags-table
373 :help "Tell Tags commands which tag table file to use")) 392 :help "Tell Tags commands which tag table file to use"))
374 393
375 (define-key menu-bar-goto-menu [separator-tag-file] 394 (define-key menu-bar-goto-menu [separator-tag-file]
376 '(menu-item "--")) 395 '(menu-item "--"))
377 396
378 (define-key menu-bar-goto-menu [apropos-tags] 397 (define-key menu-bar-goto-menu [apropos-tags]
379 '(menu-item "Tags Apropos" tags-apropos 398 '(menu-item "Tags Apropos..." tags-apropos
380 :help "Find function/variables whose names match regexp")) 399 :help "Find function/variables whose names match regexp"))
381 (define-key menu-bar-goto-menu [next-tag-otherw] 400 (define-key menu-bar-goto-menu [next-tag-otherw]
382 '(menu-item "Next Tag in Other Window" 401 '(menu-item "Next Tag in Other Window"
383 menu-bar-next-tag-other-window 402 menu-bar-next-tag-other-window
384 :enable (and (boundp 'tags-location-ring) 403 :enable (and (boundp 'tags-location-ring)
471 (define-key menu-bar-edit-menu [undo] 490 (define-key menu-bar-edit-menu [undo]
472 '(menu-item "Undo" undo 491 '(menu-item "Undo" undo
473 :enable (and (not buffer-read-only) 492 :enable (and (not buffer-read-only)
474 (not (eq t buffer-undo-list)) 493 (not (eq t buffer-undo-list))
475 (if (eq last-command 'undo) 494 (if (eq last-command 'undo)
476 pending-undo-list 495 (listp pending-undo-list)
477 (consp buffer-undo-list))) 496 (consp buffer-undo-list)))
478 :help "Undo last operation")) 497 :help "Undo last operation"))
479 498
480 499
481 (defun menu-bar-kill-ring-save (beg end) 500 (defun menu-bar-kill-ring-save (beg end)
482 (interactive "r") 501 (interactive "r")
483 (if (mouse-region-match) 502 (if (mouse-region-match)
484 (message "Selecting a region with the mouse does `copy' automatically") 503 (message "Selecting a region with the mouse does `copy' automatically")
485 (kill-ring-save beg end))) 504 (kill-ring-save beg end)))
486
487 (autoload 'ispell-menu-map "ispell" nil t 'keymap)
488 505
489 ;; These are alternative definitions for the cut, paste and copy 506 ;; These are alternative definitions for the cut, paste and copy
490 ;; menu items. Use them if your system expects these to use the clipboard. 507 ;; menu items. Use them if your system expects these to use the clipboard.
491 508
492 (put 'clipboard-kill-region 'menu-enable 'mark-active) 509 (put 'clipboard-kill-region 'menu-enable 'mark-active)
526 'clipboard-kill-ring-save))) 543 'clipboard-kill-ring-save)))
527 (define-key menu-bar-edit-menu [cut] 544 (define-key menu-bar-edit-menu [cut]
528 (cons "Cut" (cons "Delete text in region and copy it to the clipboard" 545 (cons "Cut" (cons "Delete text in region and copy it to the clipboard"
529 'clipboard-kill-region))) 546 'clipboard-kill-region)))
530 547
548 ;; These are Sun server keysyms for the Cut, Copy and Paste keys
549 ;; (also for XFree86 on Sun keyboard):
531 (define-key global-map [f20] 'clipboard-kill-region) 550 (define-key global-map [f20] 'clipboard-kill-region)
532 (define-key global-map [f16] 'clipboard-kill-ring-save) 551 (define-key global-map [f16] 'clipboard-kill-ring-save)
533 (define-key global-map [f18] 'clipboard-yank) 552 (define-key global-map [f18] 'clipboard-yank)
534 ;; X11R6 versions 553 ;; X11R6 versions:
535 (define-key global-map [cut] 'clipboard-kill-region) 554 (define-key global-map [cut] 'clipboard-kill-region)
536 (define-key global-map [copy] 'clipboard-kill-ring-save) 555 (define-key global-map [copy] 'clipboard-kill-ring-save)
537 (define-key global-map [paste] 'clipboard-yank)) 556 (define-key global-map [paste] 'clipboard-yank))
538 557
539 ;; The "Options" menu items 558 ;; The "Options" menu items
583 ;(defvar menu-bar-preferences-menu (make-sparse-keymap "Preferences")) 602 ;(defvar menu-bar-preferences-menu (make-sparse-keymap "Preferences"))
584 603
585 (defmacro menu-bar-make-mm-toggle (fname doc help &optional props) 604 (defmacro menu-bar-make-mm-toggle (fname doc help &optional props)
586 "Make a menu-item for a global minor mode toggle. 605 "Make a menu-item for a global minor mode toggle.
587 FNAME is the minor mode's name (variable and function). 606 FNAME is the minor mode's name (variable and function).
588 DOC is the text to use the menu entry. 607 DOC is the text to use for the menu entry.
589 HELP is the text to use for the tooltip. 608 HELP is the text to use for the tooltip.
590 PROPS are additional properties." 609 PROPS are additional properties."
591 `'(menu-item ,doc ,fname 610 `'(menu-item ,doc ,fname
592 ,@(if props props) 611 ,@props
593 :help ,help 612 :help ,help
594 :button (:toggle . (and (default-boundp ',fname) 613 :button (:toggle . (and (default-boundp ',fname)
595 (default-value ',fname))))) 614 (default-value ',fname)))))
596 615
597 (defmacro menu-bar-make-toggle (name variable doc message help &rest body) 616 (defmacro menu-bar-make-toggle (name variable doc message help &rest body)
598 `(progn 617 `(progn
599 (defun ,name () 618 (defun ,name (&optional interactively)
600 ,(concat "Toggle whether to " (downcase (substring help 0 1)) 619 ,(concat "Toggle whether to " (downcase (substring help 0 1))
601 (substring help 1) ".") 620 (substring help 1) ".
602 (interactive) 621 In an interactive call, record this option as a candidate for saving
622 by \"Save Options\" in Custom buffers.")
623 (interactive "p")
603 (if ,(if body `(progn . ,body) 624 (if ,(if body `(progn . ,body)
604 `(progn 625 `(progn
605 (custom-load-symbol ',variable) 626 (custom-load-symbol ',variable)
606 (let ((set (or (get ',variable 'custom-set) 'set-default)) 627 (let ((set (or (get ',variable 'custom-set) 'set-default))
607 (get (or (get ',variable 'custom-get) 'default-value))) 628 (get (or (get ',variable 'custom-get) 'default-value)))
610 (message ,message "disabled")) 631 (message ,message "disabled"))
611 ;; The function `customize-mark-as-set' must only be called when 632 ;; The function `customize-mark-as-set' must only be called when
612 ;; a variable is set interactively, as the purpose is to mark it as 633 ;; a variable is set interactively, as the purpose is to mark it as
613 ;; a candidate for "Save Options", and we do not want to save options 634 ;; a candidate for "Save Options", and we do not want to save options
614 ;; the user have already set explicitly in his init file. 635 ;; the user have already set explicitly in his init file.
615 (if (interactive-p) (customize-mark-as-set ',variable))) 636 (if interactively (customize-mark-as-set ',variable)))
616 '(menu-item ,doc ,name 637 '(menu-item ,doc ,name
617 :help ,help 638 :help ,help
618 :button (:toggle . (and (default-boundp ',variable) 639 :button (:toggle . (and (default-boundp ',variable)
619 (default-value ',variable)))))) 640 (default-value ',variable))))))
620 641
625 646
626 (defun menu-bar-options-save () 647 (defun menu-bar-options-save ()
627 "Save current values of Options menu items using Custom." 648 "Save current values of Options menu items using Custom."
628 (interactive) 649 (interactive)
629 (let ((need-save nil)) 650 (let ((need-save nil))
651 ;; These are set with menu-bar-make-mm-toggle, which does not
652 ;; put on a customized-value property.
653 (dolist (elt '(line-number-mode column-number-mode size-indication-mode
654 cua-mode show-paren-mode transient-mark-mode
655 blink-cursor-mode display-time-mode display-battery-mode))
656 (and (customize-mark-to-save elt)
657 (setq need-save t)))
630 ;; These are set with `customize-set-variable'. 658 ;; These are set with `customize-set-variable'.
631 (dolist (elt '(line-number-mode column-number-mode scroll-bar-mode 659 (dolist (elt '(scroll-bar-mode
632 debug-on-quit debug-on-error menu-bar-mode tool-bar-mode 660 debug-on-quit debug-on-error
661 tooltip-mode menu-bar-mode tool-bar-mode
633 save-place uniquify-buffer-name-style fringe-mode 662 save-place uniquify-buffer-name-style fringe-mode
634 case-fold-search cua-mode show-paren-mode 663 indicate-empty-lines indicate-buffer-boundaries
635 transient-mark-mode global-font-lock-mode 664 case-fold-search
636 display-time-mode auto-compression-mode
637 current-language-environment default-input-method 665 current-language-environment default-input-method
638 ;; Saving `text-mode-hook' is somewhat questionable, 666 ;; Saving `text-mode-hook' is somewhat questionable,
639 ;; as we might get more than we bargain for, if 667 ;; as we might get more than we bargain for, if
640 ;; other code may has added hooks as well. 668 ;; other code may has added hooks as well.
641 ;; Nonetheless, not saving it would like be confuse 669 ;; Nonetheless, not saving it would like be confuse
654 :help "Save options set from the menu above")) 682 :help "Save options set from the menu above"))
655 683
656 (define-key menu-bar-options-menu [custom-separator] 684 (define-key menu-bar-options-menu [custom-separator]
657 '("--")) 685 '("--"))
658 686
687 (define-key menu-bar-options-menu [mouse-set-font]
688 '(menu-item "Set Font/Fontset..." mouse-set-font
689 :visible (display-multi-font-p)
690 :help "Select a font from list of known fonts/fontsets"))
691
659 ;; The "Show/Hide" submenu of menu "Options" 692 ;; The "Show/Hide" submenu of menu "Options"
660 693
661 (defvar menu-bar-showhide-menu (make-sparse-keymap "Show/Hide")) 694 (defvar menu-bar-showhide-menu (make-sparse-keymap "Show/Hide"))
662 695
663 (define-key menu-bar-showhide-menu [column-number-mode] 696 (define-key menu-bar-showhide-menu [column-number-mode]
664 (menu-bar-make-mm-toggle column-number-mode 697 (menu-bar-make-mm-toggle column-number-mode
665 "Show Column Numbers" 698 "Column Numbers"
666 "Show the current column number in the mode line")) 699 "Show the current column number in the mode line"))
667 700
668 (define-key menu-bar-showhide-menu [line-number-mode] 701 (define-key menu-bar-showhide-menu [line-number-mode]
669 (menu-bar-make-mm-toggle line-number-mode 702 (menu-bar-make-mm-toggle line-number-mode
670 "Show Line Numbers" 703 "Line Numbers"
671 "Show the current line number in the mode line")) 704 "Show the current line number in the mode line"))
672 705
706 (define-key menu-bar-showhide-menu [size-indication-mode]
707 (menu-bar-make-mm-toggle size-indication-mode
708 "Size Indication"
709 "Show the size of the buffer in the mode line"))
710
673 (define-key menu-bar-showhide-menu [linecolumn-separator] 711 (define-key menu-bar-showhide-menu [linecolumn-separator]
674 '("--")) 712 '("--"))
675 713
676 (defun showhide-date-time () 714 (define-key menu-bar-showhide-menu [showhide-battery]
677 "Toggle whether to show date and time in the mode-line." 715 (menu-bar-make-mm-toggle display-battery-mode
678 (interactive) 716 "Battery Status"
679 (if (display-time-mode) 717 "Display battery status information in mode line"))
680 (message "Display-time mode enabled.")
681 (message "Display-time mode disabled."))
682 (customize-mark-as-set 'display-time-mode))
683 718
684 (define-key menu-bar-showhide-menu [showhide-date-time] 719 (define-key menu-bar-showhide-menu [showhide-date-time]
685 '(menu-item "Date and Time" showhide-date-time 720 (menu-bar-make-mm-toggle display-time-mode
686 :help "Display date and time in the mode line" 721 "Time, Load and Mail"
687 :button (:toggle . display-time-mode))) 722 "Display time, system load averages and \
723 mail status in mode line"))
688 724
689 (define-key menu-bar-showhide-menu [datetime-separator] 725 (define-key menu-bar-showhide-menu [datetime-separator]
690 '("--")) 726 '("--"))
691 727
692 (define-key menu-bar-showhide-menu [showhide-speedbar] 728 (define-key menu-bar-showhide-menu [showhide-speedbar]
698 (frame-visible-p 734 (frame-visible-p
699 (symbol-value 'speedbar-frame)))))) 735 (symbol-value 'speedbar-frame))))))
700 736
701 (defvar menu-bar-showhide-fringe-menu (make-sparse-keymap "Fringe")) 737 (defvar menu-bar-showhide-fringe-menu (make-sparse-keymap "Fringe"))
702 738
739 (defvar menu-bar-showhide-fringe-ind-menu
740 (make-sparse-keymap "Buffer boundaries"))
741
742 (defun menu-bar-showhide-fringe-ind-customize ()
743 "Show customization buffer for `indicate-buffer-boundaries'."
744 (interactive)
745 (customize-variable 'indicate-buffer-boundaries))
746
747 (define-key menu-bar-showhide-fringe-ind-menu [customize]
748 '(menu-item "Other (Customize)"
749 menu-bar-showhide-fringe-ind-customize
750 :help "Additional choices available through Custom buffer"
751 :visible (display-graphic-p)))
752
753 (defun menu-bar-showhide-fringe-ind-mixed ()
754 "Display top and bottom indicators in opposite fringes, arrows in right."
755 (interactive)
756 (customize-set-variable 'indicate-buffer-boundaries
757 '((t . right) (top . left))))
758
759 (define-key menu-bar-showhide-fringe-ind-menu [mixed]
760 '(menu-item "Opposite, Arrows Right" menu-bar-showhide-fringe-ind-mixed
761 :help
762 "Show top/bottom indicators in opposite fringes, arrows in right"
763 :visible (display-graphic-p)
764 :button (:radio . (eq indicate-buffer-boundaries
765 '((t . right) (top . left))))))
766
767 (defun menu-bar-showhide-fringe-ind-box ()
768 "Display top and bottom indicators in opposite fringes."
769 (interactive)
770 (customize-set-variable 'indicate-buffer-boundaries
771 '((top . left) (bottom . right))))
772
773 (define-key menu-bar-showhide-fringe-ind-menu [box]
774 '(menu-item "Opposite, No Arrows" menu-bar-showhide-fringe-ind-box
775 :help "Show top/bottom indicators in opposite fringes, no arrows"
776 :visible (display-graphic-p)
777 :button (:radio . (eq indicate-buffer-boundaries
778 '((top . left) (bottom . right))))))
779
780 (defun menu-bar-showhide-fringe-ind-right ()
781 "Display buffer boundaries and arrows in the right fringe."
782 (interactive)
783 (customize-set-variable 'indicate-buffer-boundaries 'right))
784
785 (define-key menu-bar-showhide-fringe-ind-menu [right]
786 '(menu-item "In Right Fringe" menu-bar-showhide-fringe-ind-right
787 :help "Show buffer boundaries and arrows in right fringe"
788 :visible (display-graphic-p)
789 :button (:radio . (eq indicate-buffer-boundaries 'right))))
790
791 (defun menu-bar-showhide-fringe-ind-left ()
792 "Display buffer boundaries and arrows in the left fringe."
793 (interactive)
794 (customize-set-variable 'indicate-buffer-boundaries 'left))
795
796 (define-key menu-bar-showhide-fringe-ind-menu [left]
797 '(menu-item "In Left Fringe" menu-bar-showhide-fringe-ind-left
798 :help "Show buffer boundaries and arrows in left fringe"
799 :visible (display-graphic-p)
800 :button (:radio . (eq indicate-buffer-boundaries 'left))))
801
802 (defun menu-bar-showhide-fringe-ind-none ()
803 "Do not display any buffer boundary indicators."
804 (interactive)
805 (customize-set-variable 'indicate-buffer-boundaries nil))
806
807 (define-key menu-bar-showhide-fringe-ind-menu [none]
808 '(menu-item "No Indicators" menu-bar-showhide-fringe-ind-none
809 :help "Hide all buffer boundary indicators and arrows"
810 :visible (display-graphic-p)
811 :button (:radio . (eq indicate-buffer-boundaries nil))))
812
813 (define-key menu-bar-showhide-fringe-menu [showhide-fringe-ind]
814 (list 'menu-item "Buffer Boundaries" menu-bar-showhide-fringe-ind-menu
815 :visible `(display-graphic-p)
816 :help "Indicate buffer boundaries in fringe"))
817
818 (define-key menu-bar-showhide-fringe-menu [indicate-empty-lines]
819 (menu-bar-make-toggle toggle-indicate-empty-lines indicate-empty-lines
820 "Empty Line Indicators"
821 "Indicating of empty lines %s"
822 "Indicate trailing empty lines in fringe"))
823
703 (defun menu-bar-showhide-fringe-menu-customize () 824 (defun menu-bar-showhide-fringe-menu-customize ()
704 "Show customization buffer for `fringe-mode'." 825 "Show customization buffer for `fringe-mode'."
705 (interactive) 826 (interactive)
706 (customize-variable 'fringe-mode)) 827 (customize-variable 'fringe-mode))
707 828
708 (define-key menu-bar-showhide-fringe-menu [customize] 829 (define-key menu-bar-showhide-fringe-menu [customize]
709 '(menu-item "Customize" menu-bar-showhide-fringe-menu-customize 830 '(menu-item "Customize Fringe" menu-bar-showhide-fringe-menu-customize
710 :help "Detailed customization of fringe" 831 :help "Detailed customization of fringe"
711 :visible (display-graphic-p))) 832 :visible (display-graphic-p)))
712 833
713 (defun menu-bar-showhide-fringe-menu-customize-reset () 834 (defun menu-bar-showhide-fringe-menu-customize-reset ()
714 "Reset the fringe mode: display fringes on both sides of a window." 835 "Reset the fringe mode: display fringes on both sides of a window."
715 (interactive) 836 (interactive)
716 (customize-set-variable 'fringe-mode nil)) 837 (customize-set-variable 'fringe-mode nil))
717
718 ;; The real definition is in fringe.el.
719 ;; This is to prevent errors in the :radio conditions below.
720 (setq fringe-mode nil)
721 838
722 (define-key menu-bar-showhide-fringe-menu [default] 839 (define-key menu-bar-showhide-fringe-menu [default]
723 '(menu-item "Default" menu-bar-showhide-fringe-menu-customize-reset 840 '(menu-item "Default" menu-bar-showhide-fringe-menu-customize-reset
724 :help "Default width fringe on both left and right side" 841 :help "Default width fringe on both left and right side"
725 :visible (display-graphic-p) 842 :visible (display-graphic-p)
726 :button (:radio . (eq fringe-mode nil)))) 843 :button (:radio . (eq fringe-mode nil))))
727 844
845 (defun menu-bar-showhide-fringe-menu-customize-right ()
846 "Display fringes only on the right of each window."
847 (interactive)
848 (require 'fringe)
849 (customize-set-variable 'fringe-mode '(0 . nil)))
850
851 (define-key menu-bar-showhide-fringe-menu [right]
852 '(menu-item "On the Right" menu-bar-showhide-fringe-menu-customize-right
853 :help "Fringe only on the right side"
854 :visible (display-graphic-p)
855 :button (:radio . (equal fringe-mode '(0 . nil)))))
856
728 (defun menu-bar-showhide-fringe-menu-customize-left () 857 (defun menu-bar-showhide-fringe-menu-customize-left ()
729 "Display fringes only on the left of each window." 858 "Display fringes only on the left of each window."
730 (interactive) 859 (interactive)
731 (require 'fringe) 860 (require 'fringe)
732 (customize-set-variable 'fringe-mode '(nil . 0))) 861 (customize-set-variable 'fringe-mode '(nil . 0)))
734 (define-key menu-bar-showhide-fringe-menu [left] 863 (define-key menu-bar-showhide-fringe-menu [left]
735 '(menu-item "On the Left" menu-bar-showhide-fringe-menu-customize-left 864 '(menu-item "On the Left" menu-bar-showhide-fringe-menu-customize-left
736 :help "Fringe only on the left side" 865 :help "Fringe only on the left side"
737 :visible (display-graphic-p) 866 :visible (display-graphic-p)
738 :button (:radio . (equal fringe-mode '(nil . 0))))) 867 :button (:radio . (equal fringe-mode '(nil . 0)))))
739
740 (defun menu-bar-showhide-fringe-menu-customize-right ()
741 "Display fringes only on the right of each window."
742 (interactive)
743 (require 'fringe)
744 (customize-set-variable 'fringe-mode '(0 . nil)))
745
746 (define-key menu-bar-showhide-fringe-menu [right]
747 '(menu-item "On the Right" menu-bar-showhide-fringe-menu-customize-right
748 :help "Fringe only on the right side"
749 :visible (display-graphic-p)
750 :button (:radio . (equal fringe-mode '(0 . nil)))))
751 868
752 (defun menu-bar-showhide-fringe-menu-customize-disable () 869 (defun menu-bar-showhide-fringe-menu-customize-disable ()
753 "Do not display window fringes." 870 "Do not display window fringes."
754 (interactive) 871 (interactive)
755 (require 'fringe) 872 (require 'fringe)
808 925
809 (define-key menu-bar-showhide-menu [showhide-scroll-bar] 926 (define-key menu-bar-showhide-menu [showhide-scroll-bar]
810 (list 'menu-item "Scroll-bar" menu-bar-showhide-scroll-bar-menu 927 (list 'menu-item "Scroll-bar" menu-bar-showhide-scroll-bar-menu
811 :visible `(display-graphic-p) 928 :visible `(display-graphic-p)
812 :help "Select scroll-bar mode")) 929 :help "Select scroll-bar mode"))
930
931 (define-key menu-bar-showhide-menu [showhide-tooltip-mode]
932 (list 'menu-item "Tooltips" 'tooltip-mode
933 :help "Toggle tooltips on/off"
934 :visible `(and (display-graphic-p) (fboundp 'x-show-tip))
935 :button `(:toggle . tooltip-mode)))
813 936
814 (define-key menu-bar-showhide-menu [menu-bar-mode] 937 (define-key menu-bar-showhide-menu [menu-bar-mode]
815 '(menu-item "Menu-bar" menu-bar-mode 938 '(menu-item "Menu-bar" menu-bar-mode
816 :help "Toggle menu-bar on/off" 939 :help "Toggle menu-bar on/off"
817 :button (:toggle . menu-bar-mode))) 940 :button (:toggle . menu-bar-mode)))
854 (menu-bar-make-toggle toggle-debug-on-error debug-on-error 977 (menu-bar-make-toggle toggle-debug-on-error debug-on-error
855 "Enter Debugger on Error" "Debug on Error %s" 978 "Enter Debugger on Error" "Debug on Error %s"
856 "Enter Lisp debugger when an error is signaled")) 979 "Enter Lisp debugger when an error is signaled"))
857 (define-key menu-bar-options-menu [debugger-separator] 980 (define-key menu-bar-options-menu [debugger-separator]
858 '("--")) 981 '("--"))
859 (define-key menu-bar-options-menu [toggle-auto-compression] 982
860 '(menu-item "Automatic File De/compression" 983 (define-key menu-bar-options-menu [blink-cursor-mode]
861 auto-compression-mode 984 (menu-bar-make-mm-toggle blink-cursor-mode
862 :help "Transparently decompress compressed files" 985 "Blinking Cursor"
863 :button (:toggle . (rassq 'jka-compr-handler 986 "Whether the cursor blinks (Blink Cursor mode)"))
864 file-name-handler-alist)))) 987 (define-key menu-bar-options-menu [cursor-separator]
988 '("--"))
865 989
866 (define-key menu-bar-options-menu [save-place] 990 (define-key menu-bar-options-menu [save-place]
867 (menu-bar-make-toggle toggle-save-place-globally save-place 991 (menu-bar-make-toggle toggle-save-place-globally save-place
868 "Save Place in Files between Sessions" 992 "Save Place in Files between Sessions"
869 "Saving place in files %s" 993 "Saving place in files %s"
870 "Visit files of previous session when restarting Emacs")) 994 "Visit files of previous session when restarting Emacs"
995 (require 'saveplace)
996 ;; Do it by name, to avoid a free-variable
997 ;; warning during byte compilation.
998 (set-default
999 'save-place (not (symbol-value 'save-place)))))
871 1000
872 (define-key menu-bar-options-menu [uniquify] 1001 (define-key menu-bar-options-menu [uniquify]
873 (menu-bar-make-toggle toggle-uniquify-buffer-names uniquify-buffer-name-style 1002 (menu-bar-make-toggle toggle-uniquify-buffer-names uniquify-buffer-name-style
874 "Use Directory Names in Buffer Names" 1003 "Use Directory Names in Buffer Names"
875 "Directory name in buffer names (uniquify) %s" 1004 "Directory name in buffer names (uniquify) %s"
880 'forward)))) 1009 'forward))))
881 1010
882 (define-key menu-bar-options-menu [edit-options-separator] 1011 (define-key menu-bar-options-menu [edit-options-separator]
883 '("--")) 1012 '("--"))
884 (define-key menu-bar-options-menu [cua-mode] 1013 (define-key menu-bar-options-menu [cua-mode]
885 '(menu-item "CUA-style cut and paste" 1014 (menu-bar-make-mm-toggle cua-mode
886 menu-bar-toggle-cua-mode 1015 "C-x/C-c/C-v Cut and Paste (CUA)"
887 :help "Use C-z/C-x/C-c/C-v keys for undo/cut/copy/paste" 1016 "Use C-z/C-x/C-c/C-v keys for undo/cut/copy/paste"
888 :button (:toggle . cua-mode))) 1017 (:visible (or (not (boundp 'cua-enable-cua-keys))
889 1018 cua-enable-cua-keys))))
890 (defun menu-bar-toggle-cua-mode () 1019
891 "Toggle CUA key-binding mode. 1020 (define-key menu-bar-options-menu [cua-emulation-mode]
892 When enabled, using shifted movement keys will activate the region (and 1021 (menu-bar-make-mm-toggle cua-mode
893 highlight the region using `transient-mark-mode'), and typed text replaces 1022 "Shift movement mark region (CUA)"
894 the active selection. C-z, C-x, C-c, and C-v will undo, cut, copy, and 1023 "Use shifted movement keys to set and extend the region."
895 paste (in addition to the normal Emacs bindings)." 1024 (:visible (and (boundp 'cua-enable-cua-keys)
896 (interactive) 1025 (not cua-enable-cua-keys)))))
897 (cua-mode nil)
898 (customize-mark-as-set 'cua-mode)
899 (message "CUA-style cut and paste %s"
900 (if cua-mode "enabled" "disabled")))
901 1026
902 (define-key menu-bar-options-menu [case-fold-search] 1027 (define-key menu-bar-options-menu [case-fold-search]
903 (menu-bar-make-toggle toggle-case-fold-search case-fold-search 1028 (menu-bar-make-toggle toggle-case-fold-search case-fold-search
904 "Case-Insensitive Search" 1029 "Case-Insensitive Search"
905 "Case-Insensitive Search %s" 1030 "Case-Insensitive Search %s"
922 (eq 'turn-on-auto-fill text-mode-hook))))) 1047 (eq 'turn-on-auto-fill text-mode-hook)))))
923 (define-key menu-bar-options-menu [truncate-lines] 1048 (define-key menu-bar-options-menu [truncate-lines]
924 '(menu-item "Truncate Long Lines in this Buffer" 1049 '(menu-item "Truncate Long Lines in this Buffer"
925 toggle-truncate-lines 1050 toggle-truncate-lines
926 :help "Truncate long lines on the screen" 1051 :help "Truncate long lines on the screen"
927 :button (:toggle . truncate-lines))) 1052 :button (:toggle . truncate-lines)
1053 :enable (menu-bar-menu-frame-live-and-visible-p)))
928 1054
929 (define-key menu-bar-options-menu [highlight-separator] 1055 (define-key menu-bar-options-menu [highlight-separator]
930 '("--")) 1056 '("--"))
931 (define-key menu-bar-options-menu [highlight-paren-mode] 1057 (define-key menu-bar-options-menu [highlight-paren-mode]
932 (menu-bar-make-mm-toggle show-paren-mode 1058 (menu-bar-make-mm-toggle show-paren-mode
935 (define-key menu-bar-options-menu [transient-mark-mode] 1061 (define-key menu-bar-options-menu [transient-mark-mode]
936 (menu-bar-make-mm-toggle transient-mark-mode 1062 (menu-bar-make-mm-toggle transient-mark-mode
937 "Active Region Highlighting" 1063 "Active Region Highlighting"
938 "Make text in active region stand out in color (Transient Mark mode)" 1064 "Make text in active region stand out in color (Transient Mark mode)"
939 (:enable (not cua-mode)))) 1065 (:enable (not cua-mode))))
940 (define-key menu-bar-options-menu [toggle-global-lazy-font-lock-mode]
941 (menu-bar-make-mm-toggle global-font-lock-mode
942 "Syntax Highlighting"
943 "Colorize text based on language syntax (Global Font Lock mode)"))
944 1066
945 1067
946 ;; The "Tools" menu items 1068 ;; The "Tools" menu items
947 1069
948 (defun send-mail-item-name () 1070 (defun send-mail-item-name ()
986 (define-key menu-bar-games-menu [snake] 1108 (define-key menu-bar-games-menu [snake]
987 '(menu-item "Snake" snake 1109 '(menu-item "Snake" snake
988 :help "Move snake around avoiding collisions")) 1110 :help "Move snake around avoiding collisions"))
989 (define-key menu-bar-games-menu [mult] 1111 (define-key menu-bar-games-menu [mult]
990 '(menu-item "Multiplication Puzzle" mpuz 1112 '(menu-item "Multiplication Puzzle" mpuz
991 :help "Excercise brain with multiplication")) 1113 :help "Exercise brain with multiplication"))
992 (define-key menu-bar-games-menu [life] 1114 (define-key menu-bar-games-menu [life]
993 '(menu-item "Life" life 1115 '(menu-item "Life" life
994 :help "Watch how John Conway's cellular automaton evolves")) 1116 :help "Watch how John Conway's cellular automaton evolves"))
995 (define-key menu-bar-games-menu [hanoi] 1117 (define-key menu-bar-games-menu [hanoi]
996 '(menu-item "Towers of Hanoi" hanoi 1118 '(menu-item "Towers of Hanoi" hanoi
1048 (define-key menu-bar-tools-menu [separator-vc] 1170 (define-key menu-bar-tools-menu [separator-vc]
1049 '("--")) 1171 '("--"))
1050 1172
1051 (defvar vc-menu-map (make-sparse-keymap "Version Control")) 1173 (defvar vc-menu-map (make-sparse-keymap "Version Control"))
1052 (define-key menu-bar-tools-menu [pcl-cvs] 1174 (define-key menu-bar-tools-menu [pcl-cvs]
1053 `(menu-item "PCL-CVS" ,cvs-global-menu 1175 '(menu-item "PCL-CVS" cvs-global-menu
1054 :help "Module-level interface to CVS")) 1176 :help "Module-level interface to CVS"))
1055 (define-key menu-bar-tools-menu [vc] 1177 (define-key menu-bar-tools-menu [vc]
1056 (list 'menu-item "Version Control" vc-menu-map 1178 (list 'menu-item "Version Control" vc-menu-map
1057 :help "Interface to RCS, CVS, SCCS")) 1179 :help "Interface to RCS, CVS, SCCS"))
1058 1180
1059 (define-key menu-bar-tools-menu [separator-compare] 1181 (define-key menu-bar-tools-menu [separator-compare]
1093 :help "Invoke a shell command and catch its output")) 1215 :help "Invoke a shell command and catch its output"))
1094 (define-key menu-bar-tools-menu [compile] 1216 (define-key menu-bar-tools-menu [compile]
1095 '(menu-item "Compile..." compile 1217 '(menu-item "Compile..." compile
1096 :help "Invoke compiler or Make, view compilation errors")) 1218 :help "Invoke compiler or Make, view compilation errors"))
1097 (define-key menu-bar-tools-menu [grep] 1219 (define-key menu-bar-tools-menu [grep]
1098 '(menu-item "Search Files (Grep)..." grep 1220 '(menu-item "Search Files (with grep)..." grep
1099 :help "Search files for strings or regexps (with Grep)")) 1221 :help "Search files for strings or regexps (with grep)"))
1100 1222
1101 1223
1102 ;; The "Help" menu items 1224 ;; The "Help" menu items
1103 1225
1104 (defvar menu-bar-describe-menu (make-sparse-keymap "Describe")) 1226 (defvar menu-bar-describe-menu (make-sparse-keymap "Describe"))
1126 (define-key menu-bar-describe-menu [separator-desc-mule] 1248 (define-key menu-bar-describe-menu [separator-desc-mule]
1127 '("--")) 1249 '("--"))
1128 1250
1129 (define-key menu-bar-describe-menu [list-keybindings] 1251 (define-key menu-bar-describe-menu [list-keybindings]
1130 '(menu-item "List Key Bindings" describe-bindings 1252 '(menu-item "List Key Bindings" describe-bindings
1131 :help "Display a list of all current keybindings")) 1253 :help "Display all current keybindings (keyboard shortcuts)"))
1132 (define-key menu-bar-describe-menu [describe-current-display-table] 1254 (define-key menu-bar-describe-menu [describe-current-display-table]
1133 '(menu-item "Describe Display Table" describe-current-display-table 1255 '(menu-item "Describe Display Table" describe-current-display-table
1134 :help "Describe the current display table")) 1256 :help "Describe the current display table"))
1135 (define-key menu-bar-describe-menu [describe-face] 1257 (define-key menu-bar-describe-menu [describe-face]
1136 '(menu-item "Describe Face..." describe-face 1258 '(menu-item "Describe Face..." describe-face
1140 :help "Display documentation of variable/option")) 1262 :help "Display documentation of variable/option"))
1141 (define-key menu-bar-describe-menu [describe-function] 1263 (define-key menu-bar-describe-menu [describe-function]
1142 '(menu-item "Describe Function..." describe-function 1264 '(menu-item "Describe Function..." describe-function
1143 :help "Display documentation of function/command")) 1265 :help "Display documentation of function/command"))
1144 (define-key menu-bar-describe-menu [describe-key-1] 1266 (define-key menu-bar-describe-menu [describe-key-1]
1145 '(menu-item "Describe Key..." describe-key 1267 '(menu-item "Describe Key or Mouse Operation..." describe-key
1146 ;; Users typically don't identify keys and menu items... 1268 ;; Users typically don't identify keys and menu items...
1147 :help "Display documentation of command bound to a \ 1269 :help "Display documentation of command bound to a \
1148 key (or menu-item)")) 1270 key, a click, or a menu-item"))
1149 (define-key menu-bar-describe-menu [describe-key]
1150 '(menu-item "What's This? " describe-key
1151 ;; Users typically don't identify keys and menu items...
1152 :help "Display documentation of command bound to a \
1153 key (or menu-item)"))
1154 (define-key menu-bar-describe-menu [describe-mode] 1271 (define-key menu-bar-describe-menu [describe-mode]
1155 '(menu-item "Describe Buffer Modes" describe-mode 1272 '(menu-item "Describe Buffer Modes" describe-mode
1156 :help "Describe this buffer's major and minor mode")) 1273 :help "Describe this buffer's major and minor mode"))
1157 1274
1158 (defvar menu-bar-apropos-menu (make-sparse-keymap "Apropos")) 1275 (defvar menu-bar-apropos-menu (make-sparse-keymap "Apropos"))
1231 '(menu-item "Introduction to Emacs Lisp" menu-bar-read-lispintro 1348 '(menu-item "Introduction to Emacs Lisp" menu-bar-read-lispintro
1232 :help "Read the Introduction to Emacs Lisp Programming")) 1349 :help "Read the Introduction to Emacs Lisp Programming"))
1233 (define-key menu-bar-manuals-menu [sep3] 1350 (define-key menu-bar-manuals-menu [sep3]
1234 '("--")) 1351 '("--"))
1235 (define-key menu-bar-manuals-menu [command] 1352 (define-key menu-bar-manuals-menu [command]
1236 '(menu-item "Find Command in Manual" Info-goto-emacs-command-node 1353 '(menu-item "Find Command in Manual..." Info-goto-emacs-command-node
1237 :help "Display manual section that describes a command")) 1354 :help "Display manual section that describes a command"))
1238 (define-key menu-bar-manuals-menu [key] 1355 (define-key menu-bar-manuals-menu [key]
1239 '(menu-item "Find Key in Manual" Info-goto-emacs-key-command-node 1356 '(menu-item "Find Key in Manual..." Info-goto-emacs-key-command-node
1240 :help "Display manual section that describes a key")) 1357 :help "Display manual section that describes a key"))
1241 1358
1242 (define-key menu-bar-help-menu [eliza] 1359 (define-key menu-bar-help-menu [eliza]
1243 '(menu-item "Emacs Psychiatrist" doctor 1360 '(menu-item "Emacs Psychotherapist" doctor
1244 :help "Our doctor will help you feel better")) 1361 :help "Our doctor will help you feel better"))
1245 (define-key menu-bar-help-menu [sep4] 1362 (define-key menu-bar-help-menu [sep4]
1246 '("--")) 1363 '("--"))
1247 (define-key menu-bar-help-menu [describe-no-warranty] 1364 (define-key menu-bar-help-menu [describe-no-warranty]
1248 '(menu-item "(Non)Warranty" describe-no-warranty 1365 '(menu-item "(Non)Warranty" describe-no-warranty
1252 :help "Show the Emacs license (GPL)")) 1369 :help "Show the Emacs license (GPL)"))
1253 (define-key menu-bar-help-menu [describe-distribution] 1370 (define-key menu-bar-help-menu [describe-distribution]
1254 '(menu-item "Getting New Versions" describe-distribution 1371 '(menu-item "Getting New Versions" describe-distribution
1255 :help "How to get latest versions of Emacs")) 1372 :help "How to get latest versions of Emacs"))
1256 (define-key menu-bar-help-menu [more] 1373 (define-key menu-bar-help-menu [more]
1257 '(menu-item "Find Extra Packages" 1374 '(menu-item "External Packages" menu-bar-help-extra-packages
1258 menu-bar-help-extra-packages 1375 :help "Lisp packages distributed separately for use in Emacs"))
1259 :help "Where to find some extra packages and possible updates"))
1260 (defun menu-bar-help-extra-packages () 1376 (defun menu-bar-help-extra-packages ()
1261 "Display help about some additional packages available for Emacs." 1377 "Display help about some additional packages available for Emacs."
1262 (interactive) 1378 (interactive)
1263 (let (enable-local-variables) 1379 (let (enable-local-variables)
1264 (view-file (expand-file-name "MORE.STUFF" 1380 (view-file (expand-file-name "MORE.STUFF"
1268 '(menu-item "About Emacs" display-splash-screen 1384 '(menu-item "About Emacs" display-splash-screen
1269 :help "Display version number, copyright info, and basic help")) 1385 :help "Display version number, copyright info, and basic help"))
1270 (define-key menu-bar-help-menu [sep2] 1386 (define-key menu-bar-help-menu [sep2]
1271 '("--")) 1387 '("--"))
1272 (define-key menu-bar-help-menu [finder-by-keyword] 1388 (define-key menu-bar-help-menu [finder-by-keyword]
1273 '(menu-item "Find Emacs Packages..." finder-by-keyword 1389 '(menu-item "Find Emacs Packages" finder-by-keyword
1274 :help "Find packages and features by keyword")) 1390 :help "Find packages and features by keyword"))
1275 (define-key menu-bar-help-menu [manuals] 1391 (define-key menu-bar-help-menu [manuals]
1276 (list 'menu-item "More Manuals" menu-bar-manuals-menu 1392 (list 'menu-item "More Manuals" menu-bar-manuals-menu
1277 :help "Search and browse on-line manuals")) 1393 :help "Search and browse on-line manuals"))
1278 (define-key menu-bar-help-menu [emacs-manual] 1394 (define-key menu-bar-help-menu [emacs-manual]
1308 :help "Learn how to use Emacs (choose a language)")) 1424 :help "Learn how to use Emacs (choose a language)"))
1309 (define-key menu-bar-help-menu [emacs-tutorial] 1425 (define-key menu-bar-help-menu [emacs-tutorial]
1310 '(menu-item "Emacs Tutorial" help-with-tutorial 1426 '(menu-item "Emacs Tutorial" help-with-tutorial
1311 :help "Learn how to use Emacs")) 1427 :help "Learn how to use Emacs"))
1312 1428
1313 (defun kill-this-buffer () ; for the menubar 1429 (defun menu-bar-menu-frame-live-and-visible-p ()
1430 "Return non-nil if the menu frame is alive and visible.
1431 The menu frame is the frame for which we are updating the menu."
1432 (let ((menu-frame (or menu-updating-frame (selected-frame))))
1433 (and (frame-live-p menu-frame)
1434 (frame-visible-p menu-frame))))
1435
1436 (defun menu-bar-non-minibuffer-window-p ()
1437 "Return non-nil if selected window of the menu frame is not a minibuf window.
1438
1439 See the documentation of `menu-bar-menu-frame-live-and-visible-p'
1440 for the definition of the menu frame."
1441 (let ((menu-frame (or menu-updating-frame (selected-frame))))
1442 (not (window-minibuffer-p (frame-selected-window menu-frame)))))
1443
1444 (defun kill-this-buffer () ; for the menu bar
1314 "Kill the current buffer." 1445 "Kill the current buffer."
1315 (interactive) 1446 (interactive)
1316 (kill-buffer (current-buffer))) 1447 (kill-buffer (current-buffer)))
1317 1448
1318 (defun kill-this-buffer-enabled-p () 1449 (defun kill-this-buffer-enabled-p ()
1320 (buffers (buffer-list))) 1451 (buffers (buffer-list)))
1321 (while buffers 1452 (while buffers
1322 (or (string-match "^ " (buffer-name (car buffers))) 1453 (or (string-match "^ " (buffer-name (car buffers)))
1323 (setq count (1+ count))) 1454 (setq count (1+ count)))
1324 (setq buffers (cdr buffers))) 1455 (setq buffers (cdr buffers)))
1325 (and (not (window-minibuffer-p (frame-selected-window menu-updating-frame))) 1456 (and (menu-bar-non-minibuffer-window-p)
1326 (> count 1)))) 1457 (> count 1))))
1327 1458
1328 (put 'dired 'menu-enable 1459 (put 'dired 'menu-enable '(menu-bar-non-minibuffer-window-p))
1329 '(not (window-minibuffer-p (frame-selected-window menu-updating-frame))))
1330 1460
1331 ;; Permit deleting frame if it would leave a visible or iconified frame. 1461 ;; Permit deleting frame if it would leave a visible or iconified frame.
1332 (defun delete-frame-enabled-p () 1462 (defun delete-frame-enabled-p ()
1333 "Return non-nil if `delete-frame' should be enabled in the menu bar." 1463 "Return non-nil if `delete-frame' should be enabled in the menu bar."
1334 (let ((frames (frame-list)) 1464 (let ((frames (frame-list))
1418 (interactive) 1548 (interactive)
1419 (let (frame) 1549 (let (frame)
1420 (dolist (f (frame-list)) 1550 (dolist (f (frame-list))
1421 (when (equal last-command-event (frame-parameter f 'name)) 1551 (when (equal last-command-event (frame-parameter f 'name))
1422 (setq frame f))) 1552 (setq frame f)))
1423 (make-frame-visible frame) 1553 ;; FRAME can be nil when user specifies the selected frame.
1424 (raise-frame frame) 1554 (setq frame (or frame (selected-frame)))
1425 (select-frame frame))) 1555 (make-frame-visible frame)
1556 (raise-frame frame)
1557 (select-frame frame)))
1426 1558
1427 (defun menu-bar-update-buffers-1 (elt) 1559 (defun menu-bar-update-buffers-1 (elt)
1428 (let* ((buf (car elt)) 1560 (let* ((buf (car elt))
1429 (file 1561 (file
1430 (and (if (eq buffers-menu-show-directories 'unless-uniquify) 1562 (and (if (eq buffers-menu-show-directories 'unless-uniquify)
1537 (list 'next-buffer 1669 (list 'next-buffer
1538 'menu-item 1670 'menu-item
1539 "Next Buffer" 1671 "Next Buffer"
1540 'next-buffer 1672 'next-buffer
1541 :help "Switch to the \"next\" buffer in a cyclic order") 1673 :help "Switch to the \"next\" buffer in a cyclic order")
1542 (list 'prev-buffer 1674 (list 'previous-buffer
1543 'menu-item 1675 'menu-item
1544 "Previous Buffer" 1676 "Previous Buffer"
1545 'prev-buffer 1677 'previous-buffer
1546 :help "Switch to the \"previous\" buffer in a cyclic order") 1678 :help "Switch to the \"previous\" buffer in a cyclic order")
1547 (list 'select-named-buffer 1679 (list 'select-named-buffer
1548 'menu-item 1680 'menu-item
1549 "Select Named Buffer..." 1681 "Select Named Buffer..."
1550 'switch-to-buffer 1682 'switch-to-buffer
1558 (setq buffers-menu 1690 (setq buffers-menu
1559 (nconc buffers-menu menu-bar-buffers-menu-command-entries)) 1691 (nconc buffers-menu menu-bar-buffers-menu-command-entries))
1560 1692
1561 (setq buffers-menu (cons 'keymap (cons "Select Buffer" buffers-menu))) 1693 (setq buffers-menu (cons 'keymap (cons "Select Buffer" buffers-menu)))
1562 (define-key (current-global-map) [menu-bar buffer] 1694 (define-key (current-global-map) [menu-bar buffer]
1563 (cons "Buffers" buffers-menu))))) 1695 ;; Call copy-sequence so the string is not pure.
1696 (cons (copy-sequence "Buffers") buffers-menu)))))
1564 1697
1565 (add-hook 'menu-bar-update-hook 'menu-bar-update-buffers) 1698 (add-hook 'menu-bar-update-hook 'menu-bar-update-buffers)
1566 1699
1567 (menu-bar-update-buffers) 1700 (menu-bar-update-buffers)
1568 1701
1609 :help "Abort input and exit minibuffer")) 1742 :help "Abort input and exit minibuffer"))
1610 (define-key map [menu-bar minibuf return] 1743 (define-key map [menu-bar minibuf return]
1611 (list 'menu-item "Enter" 'exit-minibuffer 1744 (list 'menu-item "Enter" 'exit-minibuffer
1612 :help "Terminate input and exit minibuffer"))) 1745 :help "Terminate input and exit minibuffer")))
1613 1746
1614 (defcustom menu-bar-mode t 1747 ;;;###autoload
1615 "Toggle display of a menu bar on each frame. 1748 ;; This comment is taken from tool-bar.el near
1616 Setting this variable directly does not take effect; 1749 ;; (put 'tool-bar-mode ...)
1617 use either \\[customize] or the function `menu-bar-mode'." 1750 ;; We want to pretend the menu bar by standard is on, as this will make
1618 :set (lambda (symbol value) 1751 ;; customize consider disabling the menu bar a customization, and save
1619 (menu-bar-mode (or value 0))) 1752 ;; that. We could do this for real by setting :init-value below, but
1620 :initialize 'custom-initialize-default 1753 ;; that would overwrite disabling the tool bar from X resources.
1621 :type 'boolean 1754 (put 'menu-bar-mode 'standard-value '(t))
1622 :group 'frames) 1755
1623 1756 ;;;###autoload
1624 (defun menu-bar-mode (&optional flag) 1757 (define-minor-mode menu-bar-mode
1625 "Toggle display of a menu bar on each frame. 1758 "Toggle display of a menu bar on each frame.
1626 This command applies to all frames that exist and frames to be 1759 This command applies to all frames that exist and frames to be
1627 created in the future. 1760 created in the future.
1628 With a numeric argument, if the argument is positive, 1761 With a numeric argument, if the argument is positive,
1629 turn on menu bars; otherwise, turn off menu bars." 1762 turn on menu bars; otherwise, turn off menu bars."
1630 (interactive "P") 1763 :init-value nil
1631 1764 :global t
1765 :group 'frames
1632 ;; Make menu-bar-mode and default-frame-alist consistent. 1766 ;; Make menu-bar-mode and default-frame-alist consistent.
1633 (let ((default (assq 'menu-bar-lines default-frame-alist))) 1767 (let ((lines (if menu-bar-mode 1 0)))
1634 (if default 1768 ;; Alter existing frames...
1635 (setq menu-bar-mode (not (eq (cdr default) 0))) 1769 (mapc (lambda (frame)
1636 (setq default-frame-alist 1770 (modify-frame-parameters frame
1637 (cons (cons 'menu-bar-lines (if menu-bar-mode 1 0)) 1771 (list (cons 'menu-bar-lines lines))))
1638 default-frame-alist)))) 1772 (frame-list))
1639 1773 ;; ...and future ones.
1640 ;; Toggle or set the mode, according to FLAG. 1774 (let ((elt (assq 'menu-bar-lines default-frame-alist)))
1641 (setq menu-bar-mode (if (null flag) (not menu-bar-mode) 1775 (if elt
1642 (> (prefix-numeric-value flag) 0))) 1776 (setcdr elt lines)
1643 1777 (add-to-list 'default-frame-alist (cons 'menu-bar-lines lines)))))
1644 ;; Apply it to default-frame-alist. 1778
1645 (let ((parameter (assq 'menu-bar-lines default-frame-alist))) 1779 ;; Make the message appear when Emacs is idle. We can not call message
1646 (if (consp parameter) 1780 ;; directly. The minor-mode message "Menu-bar mode disabled" comes
1647 (setcdr parameter (if menu-bar-mode 1 0)) 1781 ;; after this function returns, overwriting any message we do here.
1648 (setq default-frame-alist 1782 (when (and (interactive-p) (not menu-bar-mode))
1649 (cons (cons 'menu-bar-lines (if menu-bar-mode 1 0)) 1783 (run-with-idle-timer 0 nil 'message
1650 default-frame-alist)))) 1784 "Menu-bar mode disabled. Use M-x menu-bar-mode to make the menu bar appear."))
1651
1652 ;; Apply it to existing frames.
1653 (let ((frames (frame-list)))
1654 (while frames
1655 (let ((height (cdr (assq 'height (frame-parameters (car frames))))))
1656 (modify-frame-parameters (car frames)
1657 (list (cons 'menu-bar-lines
1658 (if menu-bar-mode 1 0))))
1659 (modify-frame-parameters (car frames)
1660 (list (cons 'height height))))
1661 (setq frames (cdr frames))))
1662
1663 (when (interactive-p)
1664 (if menu-bar-mode
1665 (message "Menu-bar mode enabled.")
1666 (message "Menu-bar mode disabled. Use M-x menu-bar-mode to make the menu bar appear."))
1667 (customize-mark-as-set 'menu-bar-mode))
1668
1669 menu-bar-mode) 1785 menu-bar-mode)
1670 1786
1671 (provide 'menu-bar) 1787 (provide 'menu-bar)
1672 1788
1789 ;;; arch-tag: 6e6a3c22-4ec4-4d3d-8190-583f8ef94ced
1673 ;;; menu-bar.el ends here 1790 ;;; menu-bar.el ends here