mm-util.el (mm-ucs-to-char): Use eval-and-compile.
[bpt/emacs.git] / lisp / menu-bar.el
CommitLineData
55535639 1;;; menu-bar.el --- define a default menu bar
235aa29b 2
497f0cdd 3;; Copyright (C) 1993, 1994, 1995, 2000, 2001, 2002, 2003, 2004, 2005,
114f9c96 4;; 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
b578f267 5
235aa29b 6;; Author: RMS
e4874521 7;; Maintainer: FSF
dbcee71a 8;; Keywords: internal, mouse
bd78fa1d 9;; Package: emacs
235aa29b 10
1db87953
RS
11;; This file is part of GNU Emacs.
12
eb3fa2cf 13;; GNU Emacs is free software: you can redistribute it and/or modify
1db87953 14;; it under the terms of the GNU General Public License as published by
eb3fa2cf
GM
15;; the Free Software Foundation, either version 3 of the License, or
16;; (at your option) any later version.
1db87953
RS
17
18;; GNU Emacs is distributed in the hope that it will be useful,
19;; but WITHOUT ANY WARRANTY; without even the implied warranty of
20;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21;; GNU General Public License for more details.
22
23;; You should have received a copy of the GNU General Public License
eb3fa2cf 24;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
1db87953 25
260130bb
KH
26;; Avishai Yacobi suggested some menu rearrangements.
27
55535639
PJ
28;;; Commentary:
29
b578f267
EN
30;;; Code:
31
b132f2b1
RM
32;; Don't clobber an existing menu-bar keymap, to preserve any menu-bar key
33;; definitions made in loaddefs.el.
34(or (lookup-key global-map [menu-bar])
35 (define-key global-map [menu-bar] (make-sparse-keymap "menu-bar")))
22390f50 36(defvar menu-bar-help-menu (make-sparse-keymap "Help"))
ffbdd83d 37
b3edb781
GM
38(if (not (featurep 'ns))
39 ;; Force Help item to come last, after the major mode's own items.
40 ;; The symbol used to be called `help', but that gets confused with the
41 ;; help key.
42 (setq menu-bar-final-items '(help-menu))
43 (if (eq system-type 'darwin)
44 (setq menu-bar-final-items '(buffer services help-menu))
45 (setq menu-bar-final-items '(buffer services hide-app quit))
46 ;; Add standard top-level items to GNUstep menu.
47 (define-key global-map [menu-bar quit]
48 `(menu-item ,(purecopy "Quit") save-buffers-kill-emacs
49 :help ,(purecopy "Save unsaved buffers, then exit")))
50 (define-key global-map [menu-bar hide-app]
51 `(menu-item ,(purecopy "Hide") ns-do-hide-emacs
52 :help ,(purecopy "Hide Emacs"))))
53 (define-key global-map [menu-bar services] ; set-up in ns-win
54 (cons (purecopy "Services") (make-sparse-keymap "Services"))))
55
56;; If running under GNUstep, "Help" is moved and renamed "Info" (see below).
57(or (and (featurep 'ns)
58 (not (eq system-type 'darwin)))
59 (define-key global-map [menu-bar help-menu]
60 (cons (purecopy "Help") menu-bar-help-menu)))
ffbdd83d 61
ffbdd83d 62(defvar menu-bar-tools-menu (make-sparse-keymap "Tools"))
b3edb781
GM
63(define-key global-map [menu-bar tools]
64 (cons (purecopy "Tools") menu-bar-tools-menu))
7f315c7c 65;; This definition is just to show what this looks like.
bf902855
SM
66;; It gets modified in place when menu-bar-update-buffers is called.
67(defvar global-buffers-menu-map (make-sparse-keymap "Buffers"))
7f315c7c 68(define-key global-map [menu-bar buffer]
8f43cbf3 69 (cons (purecopy "Buffers") global-buffers-menu-map))
7f315c7c
EZ
70(defvar menu-bar-options-menu (make-sparse-keymap "Options"))
71(define-key global-map [menu-bar options]
8f43cbf3 72 (cons (purecopy "Options") menu-bar-options-menu))
7f315c7c 73(defvar menu-bar-edit-menu (make-sparse-keymap "Edit"))
b3edb781
GM
74(define-key global-map [menu-bar edit]
75 (cons (purecopy "Edit") menu-bar-edit-menu))
b23b6fec 76(defvar menu-bar-file-menu (make-sparse-keymap "File"))
b3edb781
GM
77(define-key global-map [menu-bar file]
78 (cons (purecopy "File") menu-bar-file-menu))
79
80;; Put "Help" menu at the front, called "Info".
81(and (featurep 'ns)
82 (not (eq system-type 'darwin))
83 (define-key global-map [menu-bar help-menu]
84 (cons (purecopy "Info") menu-bar-help-menu)))
1b009b97 85
aab705a2
GM
86;; Only declared obsolete (and only made a proper alias) in 23.3.
87(define-obsolete-variable-alias 'menu-bar-files-menu 'menu-bar-file-menu "22.1")
68703c11
MB
88
89;; This is referenced by some code below; it is defined in uniquify.el
90(defvar uniquify-buffer-name-style)
91
1becddbb
JB
92;; From emulation/cua-base.el; used below
93(defvar cua-enable-cua-keys)
94
9bb8e471 95\f
7f315c7c 96;; The "File" menu items
b23b6fec 97(define-key menu-bar-file-menu [exit-emacs]
72033dbe
DN
98 `(menu-item ,(purecopy "Quit") save-buffers-kill-terminal
99 :help ,(purecopy "Save unsaved buffers, then exit")))
ffbdd83d 100
b23b6fec 101(define-key menu-bar-file-menu [separator-exit]
a3c20c83 102 menu-bar-separator)
ffbdd83d 103
7f315c7c
EZ
104;; Don't use delete-frame as event name because that is a special
105;; event.
b23b6fec 106(define-key menu-bar-file-menu [delete-this-frame]
72033dbe 107 `(menu-item ,(purecopy "Delete Frame") delete-frame
7f315c7c
EZ
108 :visible (fboundp 'delete-frame)
109 :enable (delete-frame-enabled-p)
72033dbe 110 :help ,(purecopy "Delete currently selected frame")))
b23b6fec 111(define-key menu-bar-file-menu [make-frame-on-display]
72033dbe 112 `(menu-item ,(purecopy "New Frame on Display...") make-frame-on-display
7f315c7c 113 :visible (fboundp 'make-frame-on-display)
72033dbe 114 :help ,(purecopy "Open a new frame on another display")))
b23b6fec 115(define-key menu-bar-file-menu [make-frame]
72033dbe 116 `(menu-item ,(purecopy "New Frame") make-frame-command
7f315c7c 117 :visible (fboundp 'make-frame-command)
72033dbe 118 :help ,(purecopy "Open a new frame")))
7f315c7c 119
b23b6fec 120(define-key menu-bar-file-menu [one-window]
72033dbe 121 `(menu-item ,(purecopy "Remove Splits") delete-other-windows
7f315c7c 122 :enable (not (one-window-p t nil))
72033dbe 123 :help ,(purecopy "Selected window grows to fill the whole frame")))
ffbdd83d 124
b23b6fec 125(define-key menu-bar-file-menu [split-window]
72033dbe 126 `(menu-item ,(purecopy "Split Window") split-window-vertically
92752c3a
EZ
127 :enable (and (menu-bar-menu-frame-live-and-visible-p)
128 (menu-bar-non-minibuffer-window-p))
72033dbe 129 :help ,(purecopy "Split selected window in two windows")))
7f315c7c 130
b23b6fec 131(define-key menu-bar-file-menu [separator-window]
a3c20c83 132 menu-bar-separator)
7f315c7c 133
b23b6fec 134(define-key menu-bar-file-menu [ps-print-region]
72033dbe 135 `(menu-item ,(purecopy "Postscript Print Region (B+W)") ps-print-region
438c2df0 136 :enable mark-active
72033dbe 137 :help ,(purecopy "Pretty-print marked region in black and white to PostScript printer")))
b23b6fec 138(define-key menu-bar-file-menu [ps-print-buffer]
72033dbe 139 `(menu-item ,(purecopy "Postscript Print Buffer (B+W)") ps-print-buffer
92752c3a 140 :enable (menu-bar-menu-frame-live-and-visible-p)
72033dbe 141 :help ,(purecopy "Pretty-print current buffer in black and white to PostScript printer")))
b23b6fec 142(define-key menu-bar-file-menu [ps-print-region-faces]
72033dbe 143 `(menu-item ,(purecopy "Postscript Print Region") ps-print-region-with-faces
7f315c7c 144 :enable mark-active
72033dbe 145 :help ,(purecopy "Pretty-print marked region to PostScript printer")))
b23b6fec 146(define-key menu-bar-file-menu [ps-print-buffer-faces]
72033dbe 147 `(menu-item ,(purecopy "Postscript Print Buffer") ps-print-buffer-with-faces
92752c3a 148 :enable (menu-bar-menu-frame-live-and-visible-p)
72033dbe 149 :help ,(purecopy "Pretty-print current buffer to PostScript printer")))
b23b6fec 150(define-key menu-bar-file-menu [print-region]
72033dbe 151 `(menu-item ,(purecopy "Print Region") print-region
7f315c7c 152 :enable mark-active
72033dbe 153 :help ,(purecopy "Print region between mark and current position")))
b23b6fec 154(define-key menu-bar-file-menu [print-buffer]
72033dbe 155 `(menu-item ,(purecopy "Print Buffer") print-buffer
92752c3a 156 :enable (menu-bar-menu-frame-live-and-visible-p)
72033dbe 157 :help ,(purecopy "Print current buffer with page headings")))
7f315c7c 158
b23b6fec 159(define-key menu-bar-file-menu [separator-print]
a3c20c83 160 menu-bar-separator)
9bb8e471 161
b23b6fec 162(define-key menu-bar-file-menu [recover-session]
72033dbe 163 `(menu-item ,(purecopy "Recover Crashed Session") recover-session
7f315c7c 164 :enable (and auto-save-list-file-prefix
db3ca487
NF
165 (file-directory-p
166 (file-name-directory auto-save-list-file-prefix))
167 (directory-files
7f315c7c
EZ
168 (file-name-directory auto-save-list-file-prefix)
169 nil
170 (concat "\\`"
171 (regexp-quote
172 (file-name-nondirectory
173 auto-save-list-file-prefix)))
174 t))
72033dbe 175 :help ,(purecopy "Recover edits from a crashed session")))
b23b6fec 176(define-key menu-bar-file-menu [revert-buffer]
72033dbe 177 `(menu-item ,(purecopy "Revert Buffer") revert-buffer
7f315c7c
EZ
178 :enable (or revert-buffer-function
179 revert-buffer-insert-file-contents-function
59dac63b 180 (and buffer-file-number
7f315c7c
EZ
181 (or (buffer-modified-p)
182 (not (verify-visited-file-modtime
183 (current-buffer))))))
72033dbe 184 :help ,(purecopy "Re-read current buffer from its file")))
b23b6fec 185(define-key menu-bar-file-menu [write-file]
72033dbe 186 `(menu-item ,(purecopy "Save As...") write-file
92752c3a
EZ
187 :enable (and (menu-bar-menu-frame-live-and-visible-p)
188 (menu-bar-non-minibuffer-window-p))
72033dbe 189 :help ,(purecopy "Write current buffer to another file")))
b23b6fec 190(define-key menu-bar-file-menu [save-buffer]
72033dbe 191 `(menu-item ,(purecopy "Save") save-buffer
7f315c7c 192 :enable (and (buffer-modified-p)
7a98d821 193 (buffer-file-name)
92752c3a 194 (menu-bar-non-minibuffer-window-p))
72033dbe 195 :help ,(purecopy "Save current buffer to its file")))
7f315c7c 196
b23b6fec 197(define-key menu-bar-file-menu [separator-save]
a3c20c83 198 menu-bar-separator)
7f315c7c 199
7b5836c7
JD
200(defun menu-find-file-existing ()
201 "Edit the existing file FILENAME."
202 (interactive)
203 (let* ((mustmatch (not (and (fboundp 'x-uses-old-gtk-dialog)
204 (x-uses-old-gtk-dialog))))
205 (filename (car (find-file-read-args "Find file: " mustmatch))))
206 (if mustmatch
207 (find-file-existing filename)
208 (find-file filename))))
209
210
b23b6fec 211(define-key menu-bar-file-menu [kill-buffer]
72033dbe 212 `(menu-item ,(purecopy "Close") kill-this-buffer
7f315c7c 213 :enable (kill-this-buffer-enabled-p)
72033dbe 214 :help ,(purecopy "Discard (kill) current buffer")))
b23b6fec 215(define-key menu-bar-file-menu [insert-file]
72033dbe 216 `(menu-item ,(purecopy "Insert File...") insert-file
92752c3a 217 :enable (menu-bar-non-minibuffer-window-p)
72033dbe 218 :help ,(purecopy "Insert another file into current buffer")))
b23b6fec 219(define-key menu-bar-file-menu [dired]
72033dbe 220 `(menu-item ,(purecopy "Open Directory...") dired
92752c3a 221 :enable (menu-bar-non-minibuffer-window-p)
72033dbe 222 :help ,(purecopy "Read a directory, to operate on its files")))
b23b6fec 223(define-key menu-bar-file-menu [open-file]
72033dbe 224 `(menu-item ,(purecopy "Open File...") menu-find-file-existing
92752c3a 225 :enable (menu-bar-non-minibuffer-window-p)
72033dbe 226 :help ,(purecopy "Read an existing file into an Emacs buffer")))
b23b6fec 227(define-key menu-bar-file-menu [new-file]
72033dbe 228 `(menu-item ,(purecopy "Visit New File...") find-file
92752c3a 229 :enable (menu-bar-non-minibuffer-window-p)
72033dbe 230 :help ,(purecopy "Specify a new file's name, to edit the file")))
7f315c7c 231
9bb8e471 232\f
7f315c7c 233;; The "Edit" menu items
bac6e4e2
KS
234
235;; The "Edit->Search" submenu
236(defvar menu-bar-last-search-type nil
237 "Type of last non-incremental search command called from the menu.")
238
239(defun nonincremental-repeat-search-forward ()
240 "Search forward for the previous search string or regexp."
241 (interactive)
242 (cond
243 ((and (eq menu-bar-last-search-type 'string)
244 search-ring)
245 (search-forward (car search-ring)))
246 ((and (eq menu-bar-last-search-type 'regexp)
247 regexp-search-ring)
248 (re-search-forward (car regexp-search-ring)))
249 (t
250 (error "No previous search"))))
251
252(defun nonincremental-repeat-search-backward ()
253 "Search backward for the previous search string or regexp."
254 (interactive)
255 (cond
256 ((and (eq menu-bar-last-search-type 'string)
257 search-ring)
258 (search-backward (car search-ring)))
259 ((and (eq menu-bar-last-search-type 'regexp)
260 regexp-search-ring)
261 (re-search-backward (car regexp-search-ring)))
262 (t
263 (error "No previous search"))))
264
ffbdd83d
RS
265(defun nonincremental-search-forward (string)
266 "Read a string and search for it nonincrementally."
267 (interactive "sSearch for string: ")
bac6e4e2 268 (setq menu-bar-last-search-type 'string)
ffbdd83d
RS
269 (if (equal string "")
270 (search-forward (car search-ring))
271 (isearch-update-ring string nil)
272 (search-forward string)))
273
274(defun nonincremental-search-backward (string)
275 "Read a string and search backward for it nonincrementally."
276 (interactive "sSearch for string: ")
bac6e4e2 277 (setq menu-bar-last-search-type 'string)
ffbdd83d
RS
278 (if (equal string "")
279 (search-backward (car search-ring))
280 (isearch-update-ring string nil)
281 (search-backward string)))
282
283(defun nonincremental-re-search-forward (string)
284 "Read a regular expression and search for it nonincrementally."
285 (interactive "sSearch for regexp: ")
bac6e4e2 286 (setq menu-bar-last-search-type 'regexp)
ffbdd83d
RS
287 (if (equal string "")
288 (re-search-forward (car regexp-search-ring))
289 (isearch-update-ring string t)
290 (re-search-forward string)))
291
292(defun nonincremental-re-search-backward (string)
293 "Read a regular expression and search backward for it nonincrementally."
294 (interactive "sSearch for regexp: ")
bac6e4e2 295 (setq menu-bar-last-search-type 'regexp)
ffbdd83d
RS
296 (if (equal string "")
297 (re-search-backward (car regexp-search-ring))
298 (isearch-update-ring string t)
299 (re-search-backward string)))
300
bac6e4e2 301(defvar menu-bar-search-menu (make-sparse-keymap "Search"))
ffbdd83d 302
bac6e4e2
KS
303;; The Edit->Search->Incremental Search menu
304(defvar menu-bar-i-search-menu
305 (make-sparse-keymap "Incremental Search"))
306
307(define-key menu-bar-i-search-menu [isearch-backward-regexp]
72033dbe
DN
308 `(menu-item ,(purecopy "Backward Regexp...") isearch-backward-regexp
309 :help ,(purecopy "Search backwards for a regular expression as you type it")))
bac6e4e2 310(define-key menu-bar-i-search-menu [isearch-forward-regexp]
72033dbe
DN
311 `(menu-item ,(purecopy "Forward Regexp...") isearch-forward-regexp
312 :help ,(purecopy "Search forward for a regular expression as you type it")))
bac6e4e2 313(define-key menu-bar-i-search-menu [isearch-backward]
72033dbe
DN
314 `(menu-item ,(purecopy "Backward String...") isearch-backward
315 :help ,(purecopy "Search backwards for a string as you type it")))
bac6e4e2 316(define-key menu-bar-i-search-menu [isearch-forward]
72033dbe
DN
317 `(menu-item ,(purecopy "Forward String...") isearch-forward
318 :help ,(purecopy "Search forward for a string as you type it")))
7f315c7c 319
bac6e4e2 320(define-key menu-bar-search-menu [i-search]
98b9bf40 321 `(menu-item ,(purecopy "Incremental Search") ,menu-bar-i-search-menu))
bac6e4e2 322(define-key menu-bar-search-menu [separator-tag-isearch]
a3c20c83 323 menu-bar-separator)
7f315c7c 324
bac6e4e2 325(define-key menu-bar-search-menu [tags-continue]
72033dbe
DN
326 `(menu-item ,(purecopy "Continue Tags Search") tags-loop-continue
327 :help ,(purecopy "Continue last tags search operation")))
bac6e4e2 328(define-key menu-bar-search-menu [tags-srch]
72033dbe
DN
329 `(menu-item ,(purecopy "Search Tagged Files...") tags-search
330 :help ,(purecopy "Search for a regexp in all tagged files")))
bac6e4e2 331(define-key menu-bar-search-menu [separator-tag-search]
a3c20c83 332 menu-bar-separator)
ffbdd83d 333
fe74180c 334(define-key menu-bar-search-menu [repeat-search-back]
72033dbe 335 `(menu-item ,(purecopy "Repeat Backwards") nonincremental-repeat-search-backward
bac6e4e2
KS
336 :enable (or (and (eq menu-bar-last-search-type 'string)
337 search-ring)
338 (and (eq menu-bar-last-search-type 'regexp)
339 regexp-search-ring))
72033dbe 340 :help ,(purecopy "Repeat last search backwards")))
fe74180c 341(define-key menu-bar-search-menu [repeat-search-fwd]
72033dbe 342 `(menu-item ,(purecopy "Repeat Forward") nonincremental-repeat-search-forward
bac6e4e2
KS
343 :enable (or (and (eq menu-bar-last-search-type 'string)
344 search-ring)
345 (and (eq menu-bar-last-search-type 'regexp)
346 regexp-search-ring))
72033dbe 347 :help ,(purecopy "Repeat last search forward")))
bac6e4e2 348(define-key menu-bar-search-menu [separator-repeat-search]
a3c20c83 349 menu-bar-separator)
bac6e4e2
KS
350
351(define-key menu-bar-search-menu [re-search-backward]
72033dbe
DN
352 `(menu-item ,(purecopy "Regexp Backwards...") nonincremental-re-search-backward
353 :help ,(purecopy "Search backwards for a regular expression")))
bac6e4e2 354(define-key menu-bar-search-menu [re-search-forward]
72033dbe
DN
355 `(menu-item ,(purecopy "Regexp Forward...") nonincremental-re-search-forward
356 :help ,(purecopy "Search forward for a regular expression")))
bac6e4e2 357
fe74180c 358(define-key menu-bar-search-menu [search-backward]
72033dbe
DN
359 `(menu-item ,(purecopy "String Backwards...") nonincremental-search-backward
360 :help ,(purecopy "Search backwards for a string")))
fe74180c 361(define-key menu-bar-search-menu [search-forward]
72033dbe
DN
362 `(menu-item ,(purecopy "String Forward...") nonincremental-search-forward
363 :help ,(purecopy "Search forward for a string")))
9bb8e471 364
bac6e4e2
KS
365;; The Edit->Replace submenu
366
367(defvar menu-bar-replace-menu (make-sparse-keymap "Replace"))
368
369(define-key menu-bar-replace-menu [tags-repl-continue]
72033dbe
DN
370 `(menu-item ,(purecopy "Continue Replace") tags-loop-continue
371 :help ,(purecopy "Continue last tags replace operation")))
bac6e4e2 372(define-key menu-bar-replace-menu [tags-repl]
72033dbe
DN
373 `(menu-item ,(purecopy "Replace in Tagged Files...") tags-query-replace
374 :help ,(purecopy "Interactively replace a regexp in all tagged files")))
bac6e4e2 375(define-key menu-bar-replace-menu [separator-replace-tags]
a3c20c83 376 menu-bar-separator)
bac6e4e2
KS
377
378(define-key menu-bar-replace-menu [query-replace-regexp]
72033dbe 379 `(menu-item ,(purecopy "Replace Regexp...") query-replace-regexp
bac6e4e2 380 :enable (not buffer-read-only)
72033dbe 381 :help ,(purecopy "Replace regular expression interactively, ask about each occurrence")))
bac6e4e2 382(define-key menu-bar-replace-menu [query-replace]
72033dbe 383 `(menu-item ,(purecopy "Replace String...") query-replace
bac6e4e2 384 :enable (not buffer-read-only)
72033dbe 385 :help ,(purecopy "Replace string interactively, ask about each occurrence")))
bac6e4e2 386
7f315c7c
EZ
387;;; Assemble the top-level Edit menu items.
388(define-key menu-bar-edit-menu [props]
72033dbe 389 `(menu-item ,(purecopy "Text Properties") facemenu-menu))
3dd92899 390
6a5c2175
GM
391;; ns-win.el said: Add spell for platorm consistency.
392(if (featurep 'ns)
393 (define-key menu-bar-edit-menu [spell]
394 `(menu-item ,(purecopy "Spell") ispell-menu-map)))
395
2eef02ab 396(define-key menu-bar-edit-menu [fill]
72033dbe 397 `(menu-item ,(purecopy "Fill") fill-region
2eef02ab
EZ
398 :enable (and mark-active (not buffer-read-only))
399 :help
72033dbe 400 ,(purecopy "Fill text in region to fit between left and right margin")))
2eef02ab
EZ
401
402(define-key menu-bar-edit-menu [separator-bookmark]
a3c20c83 403 menu-bar-separator)
7f315c7c
EZ
404
405(define-key menu-bar-edit-menu [bookmark]
72033dbe 406 `(menu-item ,(purecopy "Bookmarks") menu-bar-bookmark-map))
7f315c7c 407
7f315c7c
EZ
408(defvar menu-bar-goto-menu (make-sparse-keymap "Go To"))
409
410(define-key menu-bar-goto-menu [set-tags-name]
72033dbe
DN
411 `(menu-item ,(purecopy "Set Tags File Name...") visit-tags-table
412 :help ,(purecopy "Tell Tags commands which tag table file to use")))
7f315c7c
EZ
413
414(define-key menu-bar-goto-menu [separator-tag-file]
a3c20c83 415 menu-bar-separator)
7f315c7c
EZ
416
417(define-key menu-bar-goto-menu [apropos-tags]
72033dbe
DN
418 `(menu-item ,(purecopy "Tags Apropos...") tags-apropos
419 :help ,(purecopy "Find function/variables whose names match regexp")))
7f315c7c 420(define-key menu-bar-goto-menu [next-tag-otherw]
72033dbe 421 `(menu-item ,(purecopy "Next Tag in Other Window")
277e0f9d 422 menu-bar-next-tag-other-window
0ae27881
EZ
423 :enable (and (boundp 'tags-location-ring)
424 (not (ring-empty-p tags-location-ring)))
72033dbe 425 :help ,(purecopy "Find next function/variable matching last tag name in another window")))
277e0f9d
RS
426
427(defun menu-bar-next-tag-other-window ()
428 "Find the next definition of the tag already specified."
429 (interactive)
430 (find-tag-other-window nil t))
431
432(defun menu-bar-next-tag ()
433 "Find the next definition of the tag already specified."
434 (interactive)
435 (find-tag nil t))
436
7f315c7c 437(define-key menu-bar-goto-menu [next-tag]
72033dbe 438 `(menu-item ,(purecopy "Find Next Tag")
277e0f9d 439 menu-bar-next-tag
0ae27881
EZ
440 :enable (and (boundp 'tags-location-ring)
441 (not (ring-empty-p tags-location-ring)))
72033dbe 442 :help ,(purecopy "Find next function/variable matching last tag name")))
7f315c7c 443(define-key menu-bar-goto-menu [find-tag-otherw]
72033dbe
DN
444 `(menu-item ,(purecopy "Find Tag in Other Window...") find-tag-other-window
445 :help ,(purecopy "Find function/variable definition in another window")))
7f315c7c 446(define-key menu-bar-goto-menu [find-tag]
72033dbe
DN
447 `(menu-item ,(purecopy "Find Tag...") find-tag
448 :help ,(purecopy "Find definition of function or variable")))
7f315c7c
EZ
449
450(define-key menu-bar-goto-menu [separator-tags]
a3c20c83 451 menu-bar-separator)
7f315c7c
EZ
452
453(define-key menu-bar-goto-menu [end-of-buf]
72033dbe 454 `(menu-item ,(purecopy "Goto End of Buffer") end-of-buffer))
7f315c7c 455(define-key menu-bar-goto-menu [beg-of-buf]
72033dbe 456 `(menu-item ,(purecopy "Goto Beginning of Buffer") beginning-of-buffer))
7f315c7c 457(define-key menu-bar-goto-menu [go-to-pos]
72033dbe
DN
458 `(menu-item ,(purecopy "Goto Buffer Position...") goto-char
459 :help ,(purecopy "Read a number N and go to buffer position N")))
7f315c7c 460(define-key menu-bar-goto-menu [go-to-line]
72033dbe
DN
461 `(menu-item ,(purecopy "Goto Line...") goto-line
462 :help ,(purecopy "Read a line number and go to that line")))
7f315c7c
EZ
463
464(define-key menu-bar-edit-menu [goto]
98b9bf40 465 `(menu-item ,(purecopy "Go To") ,menu-bar-goto-menu))
7f315c7c 466
bac6e4e2 467(define-key menu-bar-edit-menu [replace]
98b9bf40 468 `(menu-item ,(purecopy "Replace") ,menu-bar-replace-menu))
bac6e4e2 469
7f315c7c 470(define-key menu-bar-edit-menu [search]
98b9bf40 471 `(menu-item ,(purecopy "Search") ,menu-bar-search-menu))
7f315c7c 472
2eef02ab 473(define-key menu-bar-edit-menu [separator-search]
a3c20c83 474 menu-bar-separator)
2eef02ab 475
496b7491 476(define-key menu-bar-edit-menu [mark-whole-buffer]
72033dbe
DN
477 `(menu-item ,(purecopy "Select All") mark-whole-buffer
478 :help ,(purecopy "Mark the whole buffer for a subsequent cut/copy")))
7f315c7c 479(define-key menu-bar-edit-menu [clear]
72033dbe 480 `(menu-item ,(purecopy "Clear") delete-region
7f315c7c
EZ
481 :enable (and mark-active
482 (not buffer-read-only)
483 (not (mouse-region-match)))
484 :help
72033dbe 485 ,(purecopy "Delete the text in region between mark and current position")))
8f43cbf3 486(defvar yank-menu (cons (purecopy "Select Yank") nil))
3dd92899 487(fset 'yank-menu (cons 'keymap yank-menu))
6a5c2175
GM
488(define-key menu-bar-edit-menu (if (featurep 'ns) [select-paste]
489 [paste-from-menu])
490 ;; ns-win.el said: Change text to be more consistent with
491 ;; surrounding menu items `paste', etc."
492 `(menu-item ,(purecopy (if (featurep 'ns) "Select and Paste"
493 "Paste from Kill Menu")) yank-menu
b36e96c8 494 :enable (and (cdr yank-menu) (not buffer-read-only))
72033dbe 495 :help ,(purecopy "Choose a string from the kill ring and paste it")))
7f315c7c 496(define-key menu-bar-edit-menu [paste]
72033dbe 497 `(menu-item ,(purecopy "Paste") yank
a728dc59 498 :enable (and (or
6a5c2175
GM
499 ;; Emacs compiled --without-x (or --with-ns)
500 ;; doesn't have x-selection-exists-p.
a728dc59 501 (and (fboundp 'x-selection-exists-p)
42b6a73b 502 (x-selection-exists-p 'CLIPBOARD))
6a5c2175
GM
503 (if (featurep 'ns) ; like paste-from-menu
504 (cdr yank-menu)
505 kill-ring))
a728dc59 506 (not buffer-read-only))
72033dbe 507 :help ,(purecopy "Paste (yank) text most recently cut/copied")))
7f315c7c 508(define-key menu-bar-edit-menu [copy]
6a5c2175
GM
509 ;; ns-win.el said: Substitute a Copy function that works better
510 ;; under X (for GNUstep).
511 `(menu-item ,(purecopy "Copy") ,(if (featurep 'ns)
512 'ns-copy-including-secondary
513 'menu-bar-kill-ring-save)
514 :enable mark-active
515 :help ,(purecopy "Copy text in region between mark and current position")
516 :keys ,(purecopy (if (featurep 'ns)
517 "\\[ns-copy-including-secondary]"
518 "\\[kill-ring-save]"))))
7f315c7c 519(define-key menu-bar-edit-menu [cut]
72033dbe 520 `(menu-item ,(purecopy "Cut") kill-region
7f315c7c 521 :enable (and mark-active (not buffer-read-only))
ae65cd84 522 :help
72033dbe 523 ,(purecopy "Cut (kill) text in region between mark and current position")))
6a5c2175
GM
524;; ns-win.el said: Separate undo from cut/paste section.
525(if (featurep 'ns)
526 (define-key menu-bar-edit-menu [separator-undo] `(,(purecopy "--"))))
7f315c7c 527(define-key menu-bar-edit-menu [undo]
72033dbe 528 `(menu-item ,(purecopy "Undo") undo
7f315c7c
EZ
529 :enable (and (not buffer-read-only)
530 (not (eq t buffer-undo-list))
531 (if (eq last-command 'undo)
37fec9be 532 (listp pending-undo-list)
7f315c7c 533 (consp buffer-undo-list)))
72033dbe 534 :help ,(purecopy "Undo last operation")))
7f315c7c 535
4c0317b1
RS
536(defun menu-bar-kill-ring-save (beg end)
537 (interactive "r")
538 (if (mouse-region-match)
b1a4cc61 539 (message "Selecting a region with the mouse does `copy' automatically")
4c0317b1
RS
540 (kill-ring-save beg end)))
541
f9cf0be2 542;; These are alternative definitions for the cut, paste and copy
4c0317b1 543;; menu items. Use them if your system expects these to use the clipboard.
f9cf0be2 544
c3283990
MR
545(put 'clipboard-kill-region 'menu-enable
546 '(and mark-active (not buffer-read-only)))
f9cf0be2
RS
547(put 'clipboard-kill-ring-save 'menu-enable 'mark-active)
548(put 'clipboard-yank 'menu-enable
a728dc59
DR
549 '(and (or (not (fboundp 'x-selection-exists-p))
550 (x-selection-exists-p)
c3283990 551 (x-selection-exists-p 'CLIPBOARD))
a728dc59 552 (not buffer-read-only)))
f9cf0be2
RS
553
554(defun clipboard-yank ()
ee497664 555 "Insert the clipboard contents, or the last stretch of killed text."
1d45e02e 556 (interactive "*")
f9cf0be2
RS
557 (let ((x-select-enable-clipboard t))
558 (yank)))
559
560(defun clipboard-kill-ring-save (beg end)
561 "Copy region to kill ring, and save in the X clipboard."
562 (interactive "r")
563 (let ((x-select-enable-clipboard t))
564 (kill-ring-save beg end)))
565
566(defun clipboard-kill-region (beg end)
567 "Kill the region, and save it in the X clipboard."
568 (interactive "r")
569 (let ((x-select-enable-clipboard t))
570 (kill-region beg end)))
571
572(defun menu-bar-enable-clipboard ()
5cbdeb30
RS
573 "Make CUT, PASTE and COPY (keys and menu bar items) use the clipboard.
574Do the same for the keys of the same name."
f9cf0be2 575 (interactive)
e3fa3057
DL
576 ;; These are Sun server keysyms for the Cut, Copy and Paste keys
577 ;; (also for XFree86 on Sun keyboard):
5cbdeb30
RS
578 (define-key global-map [f20] 'clipboard-kill-region)
579 (define-key global-map [f16] 'clipboard-kill-ring-save)
580 (define-key global-map [f18] 'clipboard-yank)
e3fa3057 581 ;; X11R6 versions:
5cbdeb30
RS
582 (define-key global-map [cut] 'clipboard-kill-region)
583 (define-key global-map [copy] 'clipboard-kill-ring-save)
584 (define-key global-map [paste] 'clipboard-yank))
f9cf0be2 585\f
7f315c7c 586;; The "Options" menu items
a9f53ffb
RS
587
588(defvar menu-bar-custom-menu (make-sparse-keymap "Customize"))
589
b0f661de 590(define-key menu-bar-custom-menu [customize-apropos-groups]
72033dbe
DN
591 `(menu-item ,(purecopy "Groups Matching Regexp...") customize-apropos-groups
592 :help ,(purecopy "Browse groups whose names match regexp")))
b0f661de 593(define-key menu-bar-custom-menu [customize-apropos-faces]
72033dbe
DN
594 `(menu-item ,(purecopy "Faces Matching Regexp...") customize-apropos-faces
595 :help ,(purecopy "Browse faces whose names match regexp")))
b0f661de 596(define-key menu-bar-custom-menu [customize-apropos-options]
72033dbe
DN
597 `(menu-item ,(purecopy "Options Matching Regexp...") customize-apropos-options
598 :help ,(purecopy "Browse options whose names match regexp")))
a9f53ffb 599(define-key menu-bar-custom-menu [customize-apropos]
72033dbe
DN
600 `(menu-item ,(purecopy "Settings Matching Regexp...") customize-apropos
601 :help ,(purecopy "Browse customizable settings whose names match regexp")))
6e0fbd65 602(define-key menu-bar-custom-menu [separator-1]
a3c20c83 603 menu-bar-separator)
c9a86e71 604(define-key menu-bar-custom-menu [customize-group]
72033dbe
DN
605 `(menu-item ,(purecopy "Specific Group...") customize-group
606 :help ,(purecopy "Customize settings of specific group")))
a9f53ffb 607(define-key menu-bar-custom-menu [customize-face]
72033dbe
DN
608 `(menu-item ,(purecopy "Specific Face...") customize-face
609 :help ,(purecopy "Customize attributes of specific face")))
b0f661de 610(define-key menu-bar-custom-menu [customize-option]
72033dbe
DN
611 `(menu-item ,(purecopy "Specific Option...") customize-option
612 :help ,(purecopy "Customize value of specific option")))
6e0fbd65 613(define-key menu-bar-custom-menu [separator-2]
a3c20c83 614 menu-bar-separator)
6fe9c658 615(define-key menu-bar-custom-menu [customize-changed-options]
72033dbe
DN
616 `(menu-item ,(purecopy "New Options...") customize-changed-options
617 :help ,(purecopy "Options added or changed in recent Emacs versions")))
6e0fbd65 618(define-key menu-bar-custom-menu [customize-saved]
72033dbe
DN
619 `(menu-item ,(purecopy "Saved Options") customize-saved
620 :help ,(purecopy "Customize previously saved options")))
b0f661de 621(define-key menu-bar-custom-menu [separator-3]
a3c20c83 622 menu-bar-separator)
e6354b3e 623(define-key menu-bar-custom-menu [customize-browse]
72033dbe
DN
624 `(menu-item ,(purecopy "Browse Customization Groups") customize-browse
625 :help ,(purecopy "Browse all customization groups")))
b0f661de 626(define-key menu-bar-custom-menu [customize]
72033dbe
DN
627 `(menu-item ,(purecopy "Top-level Customization Group") customize
628 :help ,(purecopy "The master group called `Emacs'")))
a9f53ffb 629
7f315c7c 630;(defvar menu-bar-preferences-menu (make-sparse-keymap "Preferences"))
bacb2d12 631
09bfa5ca
SM
632(defmacro menu-bar-make-mm-toggle (fname doc help &optional props)
633 "Make a menu-item for a global minor mode toggle.
634FNAME is the minor mode's name (variable and function).
7faa9d02 635DOC is the text to use for the menu entry.
09bfa5ca
SM
636HELP is the text to use for the tooltip.
637PROPS are additional properties."
8f43cbf3 638 `(list 'menu-item (purecopy ,doc) ',fname
e24f42ab 639 ,@(mapcar (lambda (p) (list 'quote p)) props)
cf4aaa59
JL
640 :help (purecopy ,help)
641 :button '(:toggle . (and (default-boundp ',fname)
642 (default-value ',fname)))))
09bfa5ca 643
a9d96061 644(defmacro menu-bar-make-toggle (name variable doc message help &rest body)
bacb2d12 645 `(progn
da67fa9a 646 (defun ,name (&optional interactively)
e8dd28e7 647 ,(concat "Toggle whether to " (downcase (substring help 0 1))
d02c57d3 648 (substring help 1) ".
da67fa9a
RS
649In an interactive call, record this option as a candidate for saving
650by \"Save Options\" in Custom buffers.")
651 (interactive "p")
bacb2d12 652 (if ,(if body `(progn . ,body)
bc6f3791 653 `(progn
4f9b9060
PA
654 (custom-load-symbol ',variable)
655 (let ((set (or (get ',variable 'custom-set) 'set-default))
656 (get (or (get ',variable 'custom-get) 'default-value)))
657 (funcall set ',variable (not (funcall get ',variable))))))
b36e96c8
RS
658 (message ,message "enabled globally")
659 (message ,message "disabled globally"))
a9d96061
SM
660 ;; The function `customize-mark-as-set' must only be called when
661 ;; a variable is set interactively, as the purpose is to mark it as
662 ;; a candidate for "Save Options", and we do not want to save options
663 ;; the user have already set explicitly in his init file.
da67fa9a 664 (if interactively (customize-mark-as-set ',variable)))
8f43cbf3 665 (list 'menu-item (purecopy ,doc) ',name
cf4aaa59
JL
666 :help (purecopy ,help)
667 :button '(:toggle . (and (default-boundp ',variable)
668 (default-value ',variable))))))
7f315c7c 669
ba858bf9
CY
670;; Function for setting/saving default font.
671
672(defun menu-set-font ()
673 "Interactively select a font and make it the default."
674 (interactive)
2c09b70c 675 (let ((font (if (fboundp 'x-select-font)
a81a17c5 676 (x-select-font)
ba858bf9
CY
677 (mouse-select-font)))
678 spec)
679 (when font
bb712f90
CY
680 ;; Be careful here: when set-face-attribute is called for the
681 ;; :font attribute, Emacs tries to guess the best matching font
682 ;; by examining the other face attributes (Bug#2476).
683 (set-face-attribute 'default (selected-frame)
684 :width 'normal
685 :weight 'normal
686 :slant 'normal
687 :font font)
431709cb
CY
688 (let ((font-object (face-attribute 'default :font)))
689 (dolist (f (frame-list))
690 (and (not (eq f (selected-frame)))
691 (display-graphic-p f)
692 (set-face-attribute 'default f :font font-object)))
693 (set-face-attribute 'default t :font font-object))
ba858bf9
CY
694 (setq spec (list (list t (face-attr-construct 'default))))
695 (put 'default 'customized-face spec)
696 (custom-push-theme 'theme-face 'default 'user 'set spec)
697 (put 'default 'face-modified nil))))
698
637fa988
JD
699
700
7f315c7c
EZ
701;;; Assemble all the top-level items of the "Options" menu
702(define-key menu-bar-options-menu [customize]
98b9bf40 703 `(menu-item ,(purecopy "Customize Emacs") ,menu-bar-custom-menu))
10013d74
DL
704
705(defun menu-bar-options-save ()
706 "Save current values of Options menu items using Custom."
707 (interactive)
414fd702 708 (let ((need-save nil))
5373d675
RS
709 ;; These are set with menu-bar-make-mm-toggle, which does not
710 ;; put on a customized-value property.
e1573595
LK
711 (dolist (elt '(line-number-mode column-number-mode size-indication-mode
712 cua-mode show-paren-mode transient-mark-mode
639b9d87
GM
713 blink-cursor-mode display-time-mode display-battery-mode
714 ;; These are set by other functions that don't set
715 ;; the customized state. Having them here has the
716 ;; side-effect that turning them off via X
717 ;; resources acts like having customized them, but
718 ;; that seems harmless.
719 menu-bar-mode tool-bar-mode))
720 ;; FIXME ? It's a little annoying that running this command
721 ;; always loads cua-base, paren, time, and battery, even if they
722 ;; have not been customized in any way. (Due to custom-load-symbol.)
5373d675
RS
723 (and (customize-mark-to-save elt)
724 (setq need-save t)))
4f9b9060 725 ;; These are set with `customize-set-variable'.
5373d675 726 (dolist (elt '(scroll-bar-mode
73ae229c 727 debug-on-quit debug-on-error
639b9d87
GM
728 ;; Somehow this works, when tool-bar and menu-bar don't.
729 tooltip-mode
8cfa1cd5 730 save-place uniquify-buffer-name-style fringe-mode
622a8785 731 indicate-empty-lines indicate-buffer-boundaries
ad413b35 732 case-fold-search font-use-system-font
f4990970 733 current-language-environment default-input-method
4f9b9060
PA
734 ;; Saving `text-mode-hook' is somewhat questionable,
735 ;; as we might get more than we bargain for, if
736 ;; other code may has added hooks as well.
737 ;; Nonetheless, not saving it would like be confuse
738 ;; more often.
739 ;; -- Per Abrahamsen <abraham@dina.kvl.dk> 2002-02-11.
36a1b6db 740 text-mode-hook tool-bar-position))
4f9b9060
PA
741 (and (get elt 'customized-value)
742 (customize-mark-to-save elt)
743 (setq need-save t)))
e34b0c60
CY
744 (when (get 'default 'customized-face)
745 (put 'default 'saved-face (get 'default 'customized-face))
746 (put 'default 'customized-face nil)
747 (setq need-save t))
414fd702
PA
748 ;; Save if we changed anything.
749 (when need-save
750 (custom-save-all))))
10013d74 751
cced7584
CY
752(define-key menu-bar-options-menu [package]
753 '(menu-item "Manage Emacs Packages" package-list-packages
754 :help "Install or uninstall additional Emacs packages"))
755
10013d74 756(define-key menu-bar-options-menu [save]
72033dbe
DN
757 `(menu-item ,(purecopy "Save Options") menu-bar-options-save
758 :help ,(purecopy "Save options set from the menu above")))
10013d74
DL
759
760(define-key menu-bar-options-menu [custom-separator]
a3c20c83 761 menu-bar-separator)
10013d74 762
ba858bf9 763(define-key menu-bar-options-menu [menu-set-font]
72033dbe 764 `(menu-item ,(purecopy "Set Default Font...") menu-set-font
ba858bf9 765 :visible (display-multi-font-p)
72033dbe 766 :help ,(purecopy "Select a default font")))
3f9f1c1f 767
637fa988
JD
768(if (featurep 'system-font-setting)
769 (define-key menu-bar-options-menu [menu-system-font]
770 (menu-bar-make-toggle toggle-use-system-font font-use-system-font
771 "Use system font"
772 "Use system font: %s"
773 "Use the monospaced font defined by the system")))
774
775
c2ca4bab
PJ
776;; The "Show/Hide" submenu of menu "Options"
777
778(defvar menu-bar-showhide-menu (make-sparse-keymap "Show/Hide"))
40189bd6 779
d0e1c755 780(define-key menu-bar-showhide-menu [column-number-mode]
a9d96061 781 (menu-bar-make-mm-toggle column-number-mode
e3fa3057 782 "Column Numbers"
a9d96061 783 "Show the current column number in the mode line"))
d0e1c755
PJ
784
785(define-key menu-bar-showhide-menu [line-number-mode]
a9d96061 786 (menu-bar-make-mm-toggle line-number-mode
e3fa3057 787 "Line Numbers"
a9d96061 788 "Show the current line number in the mode line"))
d0e1c755 789
e1573595
LK
790(define-key menu-bar-showhide-menu [size-indication-mode]
791 (menu-bar-make-mm-toggle size-indication-mode
792 "Size Indication"
793 "Show the size of the buffer in the mode line"))
794
d0e1c755 795(define-key menu-bar-showhide-menu [linecolumn-separator]
a3c20c83 796 menu-bar-separator)
d0e1c755 797
87737bc2
JL
798(define-key menu-bar-showhide-menu [showhide-battery]
799 (menu-bar-make-mm-toggle display-battery-mode
1f742f74 800 "Battery Status"
87737bc2
JL
801 "Display battery status information in mode line"))
802
40189bd6 803(define-key menu-bar-showhide-menu [showhide-date-time]
4a4a82d6 804 (menu-bar-make-mm-toggle display-time-mode
704c78e9
LT
805 "Time, Load and Mail"
806 "Display time, system load averages and \
807mail status in mode line"))
40189bd6
PJ
808
809(define-key menu-bar-showhide-menu [datetime-separator]
a3c20c83 810 menu-bar-separator)
40189bd6 811
a9c6d330 812(define-key menu-bar-showhide-menu [showhide-speedbar]
72033dbe
DN
813 `(menu-item ,(purecopy "Speedbar") speedbar-frame-mode
814 :help ,(purecopy "Display a Speedbar quick-navigation frame")
a9c6d330
PA
815 :button (:toggle
816 . (and (boundp 'speedbar-frame)
817 (frame-live-p (symbol-value 'speedbar-frame))
bc6f3791 818 (frame-visible-p
a9c6d330
PA
819 (symbol-value 'speedbar-frame))))))
820
622a8785 821(defvar menu-bar-showhide-fringe-menu (make-sparse-keymap "Fringe"))
f7481749 822
622a8785
LT
823(defvar menu-bar-showhide-fringe-ind-menu
824 (make-sparse-keymap "Buffer boundaries"))
f7481749 825
622a8785
LT
826(defun menu-bar-showhide-fringe-ind-customize ()
827 "Show customization buffer for `indicate-buffer-boundaries'."
f7481749 828 (interactive)
622a8785 829 (customize-variable 'indicate-buffer-boundaries))
f7481749 830
622a8785 831(define-key menu-bar-showhide-fringe-ind-menu [customize]
72033dbe 832 `(menu-item ,(purecopy "Other (Customize)")
622a8785 833 menu-bar-showhide-fringe-ind-customize
72033dbe 834 :help ,(purecopy "Additional choices available through Custom buffer")
3a5b5d14
AS
835 :visible (display-graphic-p)
836 :button (:radio . (not (member indicate-buffer-boundaries
837 '(nil left right
838 ((top . left) (bottom . right))
839 ((t . right) (top . left))))))))
f7481749
KS
840
841(defun menu-bar-showhide-fringe-ind-mixed ()
622a8785 842 "Display top and bottom indicators in opposite fringes, arrows in right."
f7481749 843 (interactive)
622a8785
LT
844 (customize-set-variable 'indicate-buffer-boundaries
845 '((t . right) (top . left))))
f7481749
KS
846
847(define-key menu-bar-showhide-fringe-ind-menu [mixed]
72033dbe 848 `(menu-item ,(purecopy "Opposite, Arrows Right") menu-bar-showhide-fringe-ind-mixed
622a8785 849 :help
72033dbe 850 ,(purecopy "Show top/bottom indicators in opposite fringes, arrows in right")
f7481749 851 :visible (display-graphic-p)
a08404b7
AS
852 :button (:radio . (equal indicate-buffer-boundaries
853 '((t . right) (top . left))))))
f7481749
KS
854
855(defun menu-bar-showhide-fringe-ind-box ()
856 "Display top and bottom indicators in opposite fringes."
857 (interactive)
622a8785
LT
858 (customize-set-variable 'indicate-buffer-boundaries
859 '((top . left) (bottom . right))))
f7481749
KS
860
861(define-key menu-bar-showhide-fringe-ind-menu [box]
72033dbe
DN
862 `(menu-item ,(purecopy "Opposite, No Arrows") menu-bar-showhide-fringe-ind-box
863 :help ,(purecopy "Show top/bottom indicators in opposite fringes, no arrows")
f7481749 864 :visible (display-graphic-p)
a08404b7
AS
865 :button (:radio . (equal indicate-buffer-boundaries
866 '((top . left) (bottom . right))))))
f7481749
KS
867
868(defun menu-bar-showhide-fringe-ind-right ()
622a8785 869 "Display buffer boundaries and arrows in the right fringe."
f7481749 870 (interactive)
622a8785 871 (customize-set-variable 'indicate-buffer-boundaries 'right))
f7481749
KS
872
873(define-key menu-bar-showhide-fringe-ind-menu [right]
72033dbe
DN
874 `(menu-item ,(purecopy "In Right Fringe") menu-bar-showhide-fringe-ind-right
875 :help ,(purecopy "Show buffer boundaries and arrows in right fringe")
f7481749 876 :visible (display-graphic-p)
622a8785 877 :button (:radio . (eq indicate-buffer-boundaries 'right))))
f7481749
KS
878
879(defun menu-bar-showhide-fringe-ind-left ()
622a8785 880 "Display buffer boundaries and arrows in the left fringe."
f7481749 881 (interactive)
622a8785 882 (customize-set-variable 'indicate-buffer-boundaries 'left))
f7481749
KS
883
884(define-key menu-bar-showhide-fringe-ind-menu [left]
72033dbe
DN
885 `(menu-item ,(purecopy "In Left Fringe") menu-bar-showhide-fringe-ind-left
886 :help ,(purecopy "Show buffer boundaries and arrows in left fringe")
f7481749 887 :visible (display-graphic-p)
622a8785 888 :button (:radio . (eq indicate-buffer-boundaries 'left))))
f7481749
KS
889
890(defun menu-bar-showhide-fringe-ind-none ()
622a8785 891 "Do not display any buffer boundary indicators."
f7481749 892 (interactive)
622a8785 893 (customize-set-variable 'indicate-buffer-boundaries nil))
f7481749
KS
894
895(define-key menu-bar-showhide-fringe-ind-menu [none]
72033dbe
DN
896 `(menu-item ,(purecopy "No Indicators") menu-bar-showhide-fringe-ind-none
897 :help ,(purecopy "Hide all buffer boundary indicators and arrows")
f7481749 898 :visible (display-graphic-p)
622a8785 899 :button (:radio . (eq indicate-buffer-boundaries nil))))
f7481749 900
622a8785 901(define-key menu-bar-showhide-fringe-menu [showhide-fringe-ind]
98b9bf40
JL
902 `(menu-item ,(purecopy "Buffer Boundaries") ,menu-bar-showhide-fringe-ind-menu
903 :visible (display-graphic-p)
904 :help ,(purecopy "Indicate buffer boundaries in fringe")))
f7481749 905
622a8785
LT
906(define-key menu-bar-showhide-fringe-menu [indicate-empty-lines]
907 (menu-bar-make-toggle toggle-indicate-empty-lines indicate-empty-lines
1f742f74 908 "Empty Line Indicators"
622a8785 909 "Indicating of empty lines %s"
b36e96c8 910 "Indicate trailing empty lines in fringe, globally"))
8cfa1cd5
SJ
911
912(defun menu-bar-showhide-fringe-menu-customize ()
913 "Show customization buffer for `fringe-mode'."
914 (interactive)
915 (customize-variable 'fringe-mode))
916
917(define-key menu-bar-showhide-fringe-menu [customize]
72033dbe
DN
918 `(menu-item ,(purecopy "Customize Fringe") menu-bar-showhide-fringe-menu-customize
919 :help ,(purecopy "Detailed customization of fringe")
8cfa1cd5
SJ
920 :visible (display-graphic-p)))
921
922(defun menu-bar-showhide-fringe-menu-customize-reset ()
277e0f9d 923 "Reset the fringe mode: display fringes on both sides of a window."
8cfa1cd5
SJ
924 (interactive)
925 (customize-set-variable 'fringe-mode nil))
926
927(define-key menu-bar-showhide-fringe-menu [default]
72033dbe
DN
928 `(menu-item ,(purecopy "Default") menu-bar-showhide-fringe-menu-customize-reset
929 :help ,(purecopy "Default width fringe on both left and right side")
8cfa1cd5 930 :visible (display-graphic-p)
277e0f9d 931 :button (:radio . (eq fringe-mode nil))))
8cfa1cd5 932
8cfa1cd5 933(defun menu-bar-showhide-fringe-menu-customize-right ()
277e0f9d 934 "Display fringes only on the right of each window."
8cfa1cd5 935 (interactive)
00cb70dc
MB
936 (require 'fringe)
937 (customize-set-variable 'fringe-mode '(0 . nil)))
8cfa1cd5
SJ
938
939(define-key menu-bar-showhide-fringe-menu [right]
72033dbe
DN
940 `(menu-item ,(purecopy "On the Right") menu-bar-showhide-fringe-menu-customize-right
941 :help ,(purecopy "Fringe only on the right side")
8cfa1cd5 942 :visible (display-graphic-p)
277e0f9d 943 :button (:radio . (equal fringe-mode '(0 . nil)))))
8cfa1cd5 944
4c0252a5
JD
945(defun menu-bar-showhide-fringe-menu-customize-left ()
946 "Display fringes only on the left of each window."
947 (interactive)
948 (require 'fringe)
949 (customize-set-variable 'fringe-mode '(nil . 0)))
950
951(define-key menu-bar-showhide-fringe-menu [left]
72033dbe
DN
952 `(menu-item ,(purecopy "On the Left") menu-bar-showhide-fringe-menu-customize-left
953 :help ,(purecopy "Fringe only on the left side")
4c0252a5
JD
954 :visible (display-graphic-p)
955 :button (:radio . (equal fringe-mode '(nil . 0)))))
956
8cfa1cd5 957(defun menu-bar-showhide-fringe-menu-customize-disable ()
277e0f9d 958 "Do not display window fringes."
8cfa1cd5 959 (interactive)
00cb70dc
MB
960 (require 'fringe)
961 (customize-set-variable 'fringe-mode 0))
8cfa1cd5
SJ
962
963(define-key menu-bar-showhide-fringe-menu [none]
72033dbe
DN
964 `(menu-item ,(purecopy "None") menu-bar-showhide-fringe-menu-customize-disable
965 :help ,(purecopy "Turn off fringe")
8cfa1cd5 966 :visible (display-graphic-p)
277e0f9d 967 :button (:radio . (eq fringe-mode 0))))
8cfa1cd5
SJ
968
969(define-key menu-bar-showhide-menu [showhide-fringe]
98b9bf40
JL
970 `(menu-item ,(purecopy "Fringe") ,menu-bar-showhide-fringe-menu
971 :visible (display-graphic-p)))
8cfa1cd5 972
c2ca4bab
PJ
973(defvar menu-bar-showhide-scroll-bar-menu (make-sparse-keymap "Scroll-bar"))
974
c2ca4bab 975(define-key menu-bar-showhide-scroll-bar-menu [right]
72033dbe 976 `(menu-item ,(purecopy "On the Right")
277e0f9d 977 menu-bar-right-scroll-bar
72033dbe 978 :help ,(purecopy "Scroll-bar on the right side")
5f7b6438 979 :visible (display-graphic-p)
4f9b9060
PA
980 :button (:radio . (eq (cdr (assq 'vertical-scroll-bars
981 (frame-parameters))) 'right))))
277e0f9d
RS
982(defun menu-bar-right-scroll-bar ()
983 "Display scroll bars on the right of each window."
984 (interactive)
985 (customize-set-variable 'scroll-bar-mode 'right))
c2ca4bab
PJ
986
987(define-key menu-bar-showhide-scroll-bar-menu [left]
72033dbe 988 `(menu-item ,(purecopy "On the Left")
277e0f9d 989 menu-bar-left-scroll-bar
72033dbe 990 :help ,(purecopy "Scroll-bar on the left side")
5f7b6438 991 :visible (display-graphic-p)
4f9b9060
PA
992 :button (:radio . (eq (cdr (assq 'vertical-scroll-bars
993 (frame-parameters))) 'left))))
c2ca4bab 994
277e0f9d
RS
995(defun menu-bar-left-scroll-bar ()
996 "Display scroll bars on the left of each window."
997 (interactive)
0e5ddee1 998 (customize-set-variable 'scroll-bar-mode 'left))
277e0f9d 999
c2ca4bab 1000(define-key menu-bar-showhide-scroll-bar-menu [none]
72033dbe 1001 `(menu-item ,(purecopy "None")
277e0f9d 1002 menu-bar-no-scroll-bar
72033dbe 1003 :help ,(purecopy "Turn off scroll-bar")
5f7b6438 1004 :visible (display-graphic-p)
4f9b9060
PA
1005 :button (:radio . (eq (cdr (assq 'vertical-scroll-bars
1006 (frame-parameters))) nil))))
c2ca4bab 1007
277e0f9d
RS
1008(defun menu-bar-no-scroll-bar ()
1009 "Turn off scroll bars."
1010 (interactive)
1011 (customize-set-variable 'scroll-bar-mode nil))
1012
c2ca4bab 1013(define-key menu-bar-showhide-menu [showhide-scroll-bar]
98b9bf40
JL
1014 `(menu-item ,(purecopy "Scroll-bar") ,menu-bar-showhide-scroll-bar-menu
1015 :visible (display-graphic-p)))
c2ca4bab 1016
73ae229c 1017(define-key menu-bar-showhide-menu [showhide-tooltip-mode]
98b9bf40
JL
1018 `(menu-item ,(purecopy "Tooltips") tooltip-mode
1019 :help ,(purecopy "Turn tooltips on/off")
1020 :visible (and (display-graphic-p) (fboundp 'x-show-tip))
1021 :button (:toggle . tooltip-mode)))
73ae229c 1022
09bfa5ca 1023(define-key menu-bar-showhide-menu [menu-bar-mode]
72033dbe
DN
1024 `(menu-item ,(purecopy "Menu-bar") toggle-menu-bar-mode-from-frame
1025 :help ,(purecopy "Turn menu-bar on/off")
6a5af08f 1026 :button (:toggle . (> (frame-parameter nil 'menu-bar-lines) 0))))
c2ca4bab 1027
2b4e6277
J
1028(defun menu-bar-set-tool-bar-position (position)
1029 (customize-set-variable 'tool-bar-mode t)
36a1b6db 1030 (customize-set-variable 'tool-bar-position position))
bfeabdc3
JD
1031(defun menu-bar-showhide-tool-bar-menu-customize-disable ()
1032 "Do not display tool bars."
1033 (interactive)
1034 (customize-set-variable 'tool-bar-mode nil))
1035(defun menu-bar-showhide-tool-bar-menu-customize-enable-left ()
1036 "Display tool bars on the left side."
1037 (interactive)
2b4e6277 1038 (menu-bar-set-tool-bar-position 'left))
bfeabdc3
JD
1039(defun menu-bar-showhide-tool-bar-menu-customize-enable-right ()
1040 "Display tool bars on the right side."
1041 (interactive)
2b4e6277 1042 (menu-bar-set-tool-bar-position 'right))
bfeabdc3
JD
1043(defun menu-bar-showhide-tool-bar-menu-customize-enable-top ()
1044 "Display tool bars on the top side."
1045 (interactive)
2b4e6277 1046 (menu-bar-set-tool-bar-position 'top))
bfeabdc3
JD
1047(defun menu-bar-showhide-tool-bar-menu-customize-enable-bottom ()
1048 "Display tool bars on the bottom side."
1049 (interactive)
2b4e6277 1050 (menu-bar-set-tool-bar-position 'bottom))
bfeabdc3
JD
1051
1052(if (featurep 'move-toolbar)
1053 (progn
1054 (defvar menu-bar-showhide-tool-bar-menu (make-sparse-keymap "Tool-bar"))
1055
1056 (define-key menu-bar-showhide-tool-bar-menu [showhide-tool-bar-left]
b3edb781 1057 `(menu-item ,(purecopy "On the left")
bfeabdc3
JD
1058 menu-bar-showhide-tool-bar-menu-customize-enable-left
1059 :help ,(purecopy "Tool-bar at the left side")
1060 :visible (display-graphic-p)
b3edb781
GM
1061 :button
1062 (:radio . (and tool-bar-mode
bfeabdc3
JD
1063 (eq (frame-parameter nil 'tool-bar-position)
1064 'left)))))
1065
1066 (define-key menu-bar-showhide-tool-bar-menu [showhide-tool-bar-right]
b3edb781 1067 `(menu-item ,(purecopy "On the right")
bfeabdc3
JD
1068 menu-bar-showhide-tool-bar-menu-customize-enable-right
1069 :help ,(purecopy "Tool-bar at the right side")
1070 :visible (display-graphic-p)
1071 :button
b3edb781 1072 (:radio . (and tool-bar-mode
bfeabdc3
JD
1073 (eq (frame-parameter nil 'tool-bar-position)
1074 'right)))))
1075
1076 (define-key menu-bar-showhide-tool-bar-menu [showhide-tool-bar-bottom]
b3edb781 1077 `(menu-item ,(purecopy "On the bottom")
bfeabdc3
JD
1078 menu-bar-showhide-tool-bar-menu-customize-enable-bottom
1079 :help ,(purecopy "Tool-bar at the bottom")
1080 :visible (display-graphic-p)
1081 :button
b3edb781 1082 (:radio . (and tool-bar-mode
bfeabdc3
JD
1083 (eq (frame-parameter nil 'tool-bar-position)
1084 'bottom)))))
1085
1086 (define-key menu-bar-showhide-tool-bar-menu [showhide-tool-bar-top]
b3edb781 1087 `(menu-item ,(purecopy "On the top")
bfeabdc3
JD
1088 menu-bar-showhide-tool-bar-menu-customize-enable-top
1089 :help ,(purecopy "Tool-bar at the top")
1090 :visible (display-graphic-p)
1091 :button
b3edb781 1092 (:radio . (and tool-bar-mode
bfeabdc3
JD
1093 (eq (frame-parameter nil 'tool-bar-position)
1094 'top)))))
1095
1096 (define-key menu-bar-showhide-tool-bar-menu [showhide-tool-bar-none]
b3edb781 1097 `(menu-item ,(purecopy "None")
bfeabdc3
JD
1098 menu-bar-showhide-tool-bar-menu-customize-disable
1099 :help ,(purecopy "Turn tool-bar off")
1100 :visible (display-graphic-p)
1101 :button (:radio . (eq tool-bar-mode nil))))
1102
1103 (define-key menu-bar-showhide-menu [showhide-tool-bar]
1104 `(menu-item ,(purecopy "Tool-bar") ,menu-bar-showhide-tool-bar-menu
1105 :visible (display-graphic-p)))
1106
1107 )
1108 ;; else not tool bar that can move.
1109 (define-key menu-bar-showhide-menu [showhide-tool-bar]
1110 `(menu-item ,(purecopy "Tool-bar") toggle-tool-bar-mode-from-frame
1111 :help ,(purecopy "Turn tool-bar on/off")
1112 :visible (display-graphic-p)
1113 :button (:toggle . (> (frame-parameter nil 'tool-bar-lines) 0))))
1114)
c2ca4bab
PJ
1115
1116(define-key menu-bar-options-menu [showhide]
98b9bf40 1117 `(menu-item ,(purecopy "Show/Hide") ,menu-bar-showhide-menu))
c2ca4bab
PJ
1118
1119(define-key menu-bar-options-menu [showhide-separator]
a3c20c83 1120 menu-bar-separator)
c2ca4bab 1121
7f315c7c
EZ
1122(define-key menu-bar-options-menu [mule]
1123 ;; It is better not to use backquote here,
1124 ;; because that makes a bootstrapping problem
1125 ;; if you need to recompile all the Lisp files using interpreted code.
98b9bf40 1126 `(menu-item ,(purecopy "Mule (Multilingual Environment)") ,mule-menu-keymap
506c6d61
DL
1127;; Most of the MULE menu actually does make sense in unibyte mode,
1128;; e.g. language selection.
597e2240 1129;;; :visible '(default-value 'enable-multibyte-characters)
ad9f6125 1130 ))
7f315c7c
EZ
1131;(setq menu-bar-final-items (cons 'mule menu-bar-final-items))
1132;(define-key menu-bar-options-menu [preferences]
98b9bf40
JL
1133; `(menu-item ,(purecopy "Preferences") ,menu-bar-preferences-menu
1134; :help ,(purecopy "Toggle important global options")))
7f315c7c
EZ
1135
1136(define-key menu-bar-options-menu [mule-separator]
a3c20c83 1137 menu-bar-separator)
bacb2d12
RS
1138
1139(define-key menu-bar-options-menu [debug-on-quit]
1140 (menu-bar-make-toggle toggle-debug-on-quit debug-on-quit
e8dd28e7 1141 "Enter Debugger on Quit/C-g" "Debug on Quit %s"
7f315c7c 1142 "Enter Lisp debugger when C-g is pressed"))
bacb2d12
RS
1143(define-key menu-bar-options-menu [debug-on-error]
1144 (menu-bar-make-toggle toggle-debug-on-error debug-on-error
e8dd28e7
RS
1145 "Enter Debugger on Error" "Debug on Error %s"
1146 "Enter Lisp debugger when an error is signaled"))
7f315c7c 1147(define-key menu-bar-options-menu [debugger-separator]
a3c20c83 1148 menu-bar-separator)
7faa9d02
LT
1149
1150(define-key menu-bar-options-menu [blink-cursor-mode]
1151 (menu-bar-make-mm-toggle blink-cursor-mode
1152 "Blinking Cursor"
1153 "Whether the cursor blinks (Blink Cursor mode)"))
1154(define-key menu-bar-options-menu [cursor-separator]
a3c20c83 1155 menu-bar-separator)
7faa9d02 1156
bacb2d12
RS
1157(define-key menu-bar-options-menu [save-place]
1158 (menu-bar-make-toggle toggle-save-place-globally save-place
89f1709f 1159 "Save Place in Files between Sessions"
bacb2d12 1160 "Saving place in files %s"
aef1a2e6
KF
1161 "Visit files of previous session when restarting Emacs"
1162 (require 'saveplace)
1163 ;; Do it by name, to avoid a free-variable
1164 ;; warning during byte compilation.
1165 (set-default
1166 'save-place (not (symbol-value 'save-place)))))
4f9b9060 1167
bacb2d12
RS
1168(define-key menu-bar-options-menu [uniquify]
1169 (menu-bar-make-toggle toggle-uniquify-buffer-names uniquify-buffer-name-style
89f1709f 1170 "Use Directory Names in Buffer Names"
bacb2d12 1171 "Directory name in buffer names (uniquify) %s"
e8dd28e7 1172 "Uniquify buffer names by adding parent directory names"
bacb2d12
RS
1173 (require 'uniquify)
1174 (setq uniquify-buffer-name-style
1175 (if (not uniquify-buffer-name-style)
1176 'forward))))
4f9b9060 1177
7f315c7c 1178(define-key menu-bar-options-menu [edit-options-separator]
a3c20c83 1179 menu-bar-separator)
06753468 1180(define-key menu-bar-options-menu [cua-mode]
c960446b 1181 (menu-bar-make-mm-toggle cua-mode
1f742f74 1182 "C-x/C-c/C-v Cut and Paste (CUA)"
899481b7 1183 "Use C-z/C-x/C-c/C-v keys for undo/cut/copy/paste"
e24f42ab
JL
1184 (:visible (or (not (boundp 'cua-enable-cua-keys))
1185 cua-enable-cua-keys))))
899481b7
KS
1186
1187(define-key menu-bar-options-menu [cua-emulation-mode]
1188 (menu-bar-make-mm-toggle cua-mode
1189 "Shift movement mark region (CUA)"
69582fcd 1190 "Use shifted movement keys to set and extend the region"
e24f42ab
JL
1191 (:visible (and (boundp 'cua-enable-cua-keys)
1192 (not cua-enable-cua-keys)))))
277e0f9d 1193
3f51f129
RS
1194(define-key menu-bar-options-menu [case-fold-search]
1195 (menu-bar-make-toggle toggle-case-fold-search case-fold-search
f5be22a2 1196 "Case-Insensitive Search"
b36e96c8 1197 "Case-Insensitive Search %s"
2a6c4d75 1198 "Ignore letter-case in search commands"))
277e0f9d
RS
1199
1200(defun menu-bar-text-mode-auto-fill ()
1201 (interactive)
1202 (toggle-text-mode-auto-fill)
1203 ;; This is somewhat questionable, as `text-mode-hook'
1204 ;; might have changed outside customize.
1205 ;; -- Per Abrahamsen <abraham@dina.kvl.dk> 2002-02-11.
1206 (customize-mark-as-set 'text-mode-hook))
1207
7f315c7c 1208(define-key menu-bar-options-menu [auto-fill-mode]
72033dbe 1209 `(menu-item ,(purecopy "Auto Fill in Text Modes")
277e0f9d 1210 menu-bar-text-mode-auto-fill
72033dbe 1211 :help ,(purecopy "Automatically fill text while typing (Auto Fill mode)")
e51c889c
RS
1212 :button (:toggle . (if (listp text-mode-hook)
1213 (member 'turn-on-auto-fill text-mode-hook)
1214 (eq 'turn-on-auto-fill text-mode-hook)))))
2a6c4d75 1215
81577689
CY
1216
1217(defvar menu-bar-line-wrapping-menu (make-sparse-keymap "Line Wrapping"))
1218
81577689 1219(define-key menu-bar-line-wrapping-menu [word-wrap]
72033dbe 1220 `(menu-item ,(purecopy "Word Wrap (Visual Line mode)")
ad456027
CY
1221 (lambda ()
1222 (interactive)
1223 (unless visual-line-mode
1224 (visual-line-mode 1))
a3c20c83 1225 (message ,(purecopy "Visual-Line mode enabled")))
72033dbe 1226 :help ,(purecopy "Wrap long lines at word boundaries")
81577689
CY
1227 :button (:radio . (and (null truncate-lines)
1228 (not (truncated-partial-width-window-p))
1229 word-wrap))
ad456027
CY
1230 :visible (menu-bar-menu-frame-live-and-visible-p)))
1231
1232(define-key menu-bar-line-wrapping-menu [truncate]
72033dbe 1233 `(menu-item ,(purecopy "Truncate Long Lines")
ad456027
CY
1234 (lambda ()
1235 (interactive)
1236 (if visual-line-mode (visual-line-mode 0))
1237 (setq word-wrap nil)
1238 (toggle-truncate-lines 1))
72033dbe 1239 :help ,(purecopy "Truncate long lines at window edge")
ad456027
CY
1240 :button (:radio . (or truncate-lines
1241 (truncated-partial-width-window-p)))
81577689
CY
1242 :visible (menu-bar-menu-frame-live-and-visible-p)
1243 :enable (not (truncated-partial-width-window-p))))
1244
1245(define-key menu-bar-line-wrapping-menu [window-wrap]
72033dbe 1246 `(menu-item ,(purecopy "Wrap at Window Edge")
ad456027
CY
1247 (lambda () (interactive)
1248 (if visual-line-mode (visual-line-mode 0))
1249 (setq word-wrap nil)
1250 (if truncate-lines (toggle-truncate-lines -1)))
72033dbe 1251 :help ,(purecopy "Wrap long lines at window edge")
81577689
CY
1252 :button (:radio . (and (null truncate-lines)
1253 (not (truncated-partial-width-window-p))
1254 (not word-wrap)))
1255 :visible (menu-bar-menu-frame-live-and-visible-p)
1256 :enable (not (truncated-partial-width-window-p))))
1257
1258(define-key menu-bar-options-menu [line-wrapping]
98b9bf40 1259 `(menu-item ,(purecopy "Line Wrapping in this Buffer") ,menu-bar-line-wrapping-menu))
81577689 1260
0ac1c4cf 1261
7f315c7c 1262(define-key menu-bar-options-menu [highlight-separator]
a3c20c83 1263 menu-bar-separator)
7f315c7c 1264(define-key menu-bar-options-menu [highlight-paren-mode]
09bfa5ca
SM
1265 (menu-bar-make-mm-toggle show-paren-mode
1266 "Paren Match Highlighting"
a9d96061 1267 "Highlight matching/mismatched parentheses at cursor (Show Paren mode)"))
bacb2d12 1268(define-key menu-bar-options-menu [transient-mark-mode]
a9d96061
SM
1269 (menu-bar-make-mm-toggle transient-mark-mode
1270 "Active Region Highlighting"
1271 "Make text in active region stand out in color (Transient Mark mode)"
e24f42ab 1272 (:enable (not cua-mode))))
7f315c7c 1273
e5683624 1274\f
7f315c7c
EZ
1275;; The "Tools" menu items
1276
e4ca8f8c
EZ
1277(defun send-mail-item-name ()
1278 (let* ((known-send-mail-commands '((sendmail-user-agent . "sendmail")
1279 (mh-e-user-agent . "MH")
1280 (message-user-agent . "Gnus Message")
1281 (gnus-user-agent . "Gnus")))
1282 (name (assq mail-user-agent known-send-mail-commands)))
1283 (if name
1284 (setq name (cdr name))
1285 (setq name (symbol-name mail-user-agent))
1286 (if (string-match "\\(.+\\)-user-agent" name)
1287 (setq name (match-string 1 name))))
1288 name))
1289
0a1f9f1d
EZ
1290(defun read-mail-item-name ()
1291 (let* ((known-rmail-commands '((rmail . "RMAIL")
1292 (mh-rmail . "MH")
1293 (gnus . "Gnus")))
1294 (known (assq read-mail-command known-rmail-commands)))
1295 (if known (cdr known) (symbol-name read-mail-command))))
1296
9a3558cb
DN
1297(defvar menu-bar-games-menu (make-sparse-keymap "Games"))
1298
1299(define-key menu-bar-tools-menu [games]
98b9bf40 1300 `(menu-item ,(purecopy "Games") ,menu-bar-games-menu))
9a3558cb
DN
1301
1302(define-key menu-bar-tools-menu [separator-games]
a3c20c83 1303 menu-bar-separator)
9a3558cb
DN
1304
1305(define-key menu-bar-games-menu [zone]
72033dbe
DN
1306 `(menu-item ,(purecopy "Zone Out") zone
1307 :help ,(purecopy "Play tricks with Emacs display when Emacs is idle")))
9a3558cb 1308(define-key menu-bar-games-menu [tetris]
72033dbe
DN
1309 `(menu-item ,(purecopy "Tetris") tetris
1310 :help ,(purecopy "Falling blocks game")))
9a3558cb 1311(define-key menu-bar-games-menu [solitaire]
72033dbe
DN
1312 `(menu-item ,(purecopy "Solitaire") solitaire
1313 :help ,(purecopy "Get rid of all the stones")))
9a3558cb 1314(define-key menu-bar-games-menu [snake]
72033dbe
DN
1315 `(menu-item ,(purecopy "Snake") snake
1316 :help ,(purecopy "Move snake around avoiding collisions")))
9a3558cb 1317(define-key menu-bar-games-menu [pong]
72033dbe
DN
1318 `(menu-item ,(purecopy "Pong") pong
1319 :help ,(purecopy "Bounce the ball to your opponent")))
9a3558cb 1320(define-key menu-bar-games-menu [mult]
72033dbe
DN
1321 `(menu-item ,(purecopy "Multiplication Puzzle") mpuz
1322 :help ,(purecopy "Exercise brain with multiplication")))
9a3558cb 1323(define-key menu-bar-games-menu [life]
72033dbe
DN
1324 `(menu-item ,(purecopy "Life") life
1325 :help ,(purecopy "Watch how John Conway's cellular automaton evolves")))
635f7282
GM
1326(define-key menu-bar-games-menu [land]
1327 `(menu-item ,(purecopy "Landmark") landmark
1328 :help ,(purecopy "Watch a neural-network robot learn landmarks")))
9a3558cb 1329(define-key menu-bar-games-menu [hanoi]
72033dbe
DN
1330 `(menu-item ,(purecopy "Towers of Hanoi") hanoi
1331 :help ,(purecopy "Watch Towers-of-Hanoi puzzle solved by Emacs")))
9a3558cb 1332(define-key menu-bar-games-menu [gomoku]
72033dbe
DN
1333 `(menu-item ,(purecopy "Gomoku") gomoku
1334 :help ,(purecopy "Mark 5 contiguous squares (like tic-tac-toe)")))
9a3558cb 1335(define-key menu-bar-games-menu [bubbles]
72033dbe
DN
1336 `(menu-item ,(purecopy "Bubbles") bubbles
1337 :help ,(purecopy "Remove all bubbles using the fewest moves")))
9a3558cb 1338(define-key menu-bar-games-menu [black-box]
72033dbe
DN
1339 `(menu-item ,(purecopy "Blackbox") blackbox
1340 :help ,(purecopy "Find balls in a black box by shooting rays")))
9a3558cb 1341(define-key menu-bar-games-menu [adventure]
72033dbe
DN
1342 `(menu-item ,(purecopy "Adventure") dunnet
1343 :help ,(purecopy "Dunnet, a text Adventure game for Emacs")))
9a3558cb 1344(define-key menu-bar-games-menu [5x5]
72033dbe
DN
1345 `(menu-item ,(purecopy "5x5") 5x5
1346 :help ,(purecopy "Fill in all the squares on a 5x5 board")))
9a3558cb 1347
bfeee9d1
DN
1348(defvar menu-bar-encryption-decryption-menu
1349 (make-sparse-keymap "Encryption/Decryption"))
1350
1351(define-key menu-bar-tools-menu [encryption-decryption]
98b9bf40 1352 `(menu-item ,(purecopy "Encryption/Decryption") ,menu-bar-encryption-decryption-menu))
bfeee9d1
DN
1353
1354(define-key menu-bar-tools-menu [separator-encryption-decryption]
a3c20c83 1355 menu-bar-separator)
bfeee9d1
DN
1356
1357(define-key menu-bar-encryption-decryption-menu [insert-keys]
72033dbe
DN
1358 `(menu-item ,(purecopy "Insert Keys") epa-insert-keys
1359 :help ,(purecopy "Insert public keys after the current point")))
bfeee9d1
DN
1360
1361(define-key menu-bar-encryption-decryption-menu [export-keys]
72033dbe
DN
1362 `(menu-item ,(purecopy "Export Keys") epa-export-keys
1363 :help ,(purecopy "Export public keys to a file")))
bfeee9d1
DN
1364
1365(define-key menu-bar-encryption-decryption-menu [import-keys-region]
72033dbe
DN
1366 `(menu-item ,(purecopy "Import Keys from Region") epa-import-keys-region
1367 :help ,(purecopy "Import public keys from the current region")))
bfeee9d1
DN
1368
1369(define-key menu-bar-encryption-decryption-menu [import-keys]
72033dbe
DN
1370 `(menu-item ,(purecopy "Import Keys from File...") epa-import-keys
1371 :help ,(purecopy "Import public keys from a file")))
bfeee9d1
DN
1372
1373(define-key menu-bar-encryption-decryption-menu [list-keys]
72033dbe
DN
1374 `(menu-item ,(purecopy "List Keys") epa-list-keys
1375 :help ,(purecopy "Browse your public keyring")))
bfeee9d1
DN
1376
1377(define-key menu-bar-encryption-decryption-menu [separator-keys]
a3c20c83 1378 menu-bar-separator)
bfeee9d1 1379
bfeee9d1 1380(define-key menu-bar-encryption-decryption-menu [sign-region]
72033dbe
DN
1381 `(menu-item ,(purecopy "Sign Region") epa-sign-region
1382 :help ,(purecopy "Create digital signature of the current region")))
bfeee9d1 1383
bfeee9d1 1384(define-key menu-bar-encryption-decryption-menu [verify-region]
72033dbe
DN
1385 `(menu-item ,(purecopy "Verify Region") epa-verify-region
1386 :help ,(purecopy "Verify digital signature of the current region")))
bfeee9d1 1387
9a3558cb 1388(define-key menu-bar-encryption-decryption-menu [encrypt-region]
72033dbe
DN
1389 `(menu-item ,(purecopy "Encrypt Region") epa-encrypt-region
1390 :help ,(purecopy "Encrypt the current region")))
bfeee9d1
DN
1391
1392(define-key menu-bar-encryption-decryption-menu [decrypt-region]
72033dbe
DN
1393 `(menu-item ,(purecopy "Decrypt Region") epa-decrypt-region
1394 :help ,(purecopy "Decrypt the current region")))
bfeee9d1 1395
9a3558cb 1396(define-key menu-bar-encryption-decryption-menu [separator-file]
a3c20c83 1397 menu-bar-separator)
bfeee9d1 1398
9a3558cb 1399(define-key menu-bar-encryption-decryption-menu [sign-file]
72033dbe
DN
1400 `(menu-item ,(purecopy "Sign File...") epa-sign-file
1401 :help ,(purecopy "Create digital signature of a file")))
7f315c7c 1402
9a3558cb 1403(define-key menu-bar-encryption-decryption-menu [verify-file]
72033dbe
DN
1404 `(menu-item ,(purecopy "Verify File...") epa-verify-file
1405 :help ,(purecopy "Verify digital signature of a file")))
7f315c7c 1406
9a3558cb 1407(define-key menu-bar-encryption-decryption-menu [encrypt-file]
72033dbe
DN
1408 `(menu-item ,(purecopy "Encrypt File...") epa-encrypt-file
1409 :help ,(purecopy "Encrypt a file")))
7f315c7c 1410
9a3558cb 1411(define-key menu-bar-encryption-decryption-menu [decrypt-file]
72033dbe
DN
1412 `(menu-item ,(purecopy "Decrypt File...") epa-decrypt-file
1413 :help ,(purecopy "Decrypt a file")))
7f315c7c 1414
1edd6ac4 1415(define-key menu-bar-tools-menu [simple-calculator]
72033dbe
DN
1416 `(menu-item ,(purecopy "Simple Calculator") calculator
1417 :help ,(purecopy "Invoke the Emacs built-in quick calculator")))
1edd6ac4 1418(define-key menu-bar-tools-menu [calc]
72033dbe
DN
1419 `(menu-item ,(purecopy "Programmable Calculator") calc
1420 :help ,(purecopy "Invoke the Emacs built-in full scientific calculator")))
506c6d61 1421(define-key menu-bar-tools-menu [calendar]
72033dbe
DN
1422 `(menu-item ,(purecopy "Calendar") calendar
1423 :help ,(purecopy "Invoke the Emacs built-in calendar")))
9a45aa3d
EZ
1424
1425(define-key menu-bar-tools-menu [separator-net]
a3c20c83 1426 menu-bar-separator)
9a45aa3d 1427
7f315c7c 1428(define-key menu-bar-tools-menu [directory-search]
72033dbe 1429 `(menu-item ,(purecopy "Directory Search") eudc-tools-menu))
506c6d61 1430(define-key menu-bar-tools-menu [compose-mail]
497f0cdd 1431 `(menu-item (format "Send Mail (with %s)" (send-mail-item-name)) compose-mail
98b9bf40
JL
1432 :visible (and mail-user-agent (not (eq mail-user-agent 'ignore)))
1433 :help ,(purecopy "Send a mail message")))
506c6d61 1434(define-key menu-bar-tools-menu [rmail]
497f0cdd
GM
1435 `(menu-item (format "Read Mail (with %s)" (read-mail-item-name))
1436 menu-bar-read-mail
1437 :visible (and read-mail-command
1438 (not (eq read-mail-command 'ignore)))
98b9bf40 1439 :help ,(purecopy "Read your mail and reply to it")))
277e0f9d
RS
1440
1441(defun menu-bar-read-mail ()
724f328c 1442 "Read mail using `read-mail-command'."
277e0f9d
RS
1443 (interactive)
1444 (call-interactively read-mail-command))
1445
7f315c7c 1446(define-key menu-bar-tools-menu [gnus]
72033dbe
DN
1447 `(menu-item ,(purecopy "Read Net News (Gnus)") gnus
1448 :help ,(purecopy "Read network news groups")))
7f315c7c
EZ
1449
1450(define-key menu-bar-tools-menu [separator-vc]
a3c20c83 1451 menu-bar-separator)
7f315c7c 1452
eccd9bd5 1453(define-key menu-bar-tools-menu [pcl-cvs]
72033dbe 1454 `(menu-item ,(purecopy "PCL-CVS") cvs-global-menu))
dc172b73 1455(define-key menu-bar-tools-menu [vc] nil) ;Create the place for the VC menu.
7f315c7c
EZ
1456
1457(define-key menu-bar-tools-menu [separator-compare]
a3c20c83 1458 menu-bar-separator)
7f315c7c 1459
7f315c7c 1460(define-key menu-bar-tools-menu [epatch]
72033dbe 1461 `(menu-item ,(purecopy "Apply Patch") menu-bar-epatch-menu))
7f315c7c 1462(define-key menu-bar-tools-menu [ediff-merge]
72033dbe 1463 `(menu-item ,(purecopy "Merge") menu-bar-ediff-merge-menu))
7f315c7c 1464(define-key menu-bar-tools-menu [compare]
72033dbe 1465 `(menu-item ,(purecopy "Compare (Ediff)") menu-bar-ediff-menu))
7f315c7c
EZ
1466
1467(define-key menu-bar-tools-menu [separator-spell]
a3c20c83 1468 menu-bar-separator)
7f315c7c
EZ
1469
1470(define-key menu-bar-tools-menu [spell]
72033dbe 1471 `(menu-item ,(purecopy "Spell Checking") ispell-menu-map))
7f315c7c
EZ
1472
1473(define-key menu-bar-tools-menu [separator-prog]
a3c20c83 1474 menu-bar-separator)
7f315c7c 1475
ebf5c4f5
CY
1476(define-key menu-bar-tools-menu [semantic]
1477 `(menu-item ,(purecopy "Source Code Parsers (Semantic)")
1478 semantic-mode
1479 :help ,(purecopy "Toggle automatic parsing in source code buffers (Semantic mode)")
1480 :button (:toggle . (bound-and-true-p semantic-mode))))
1481
1482(define-key menu-bar-tools-menu [ede]
1483 `(menu-item ,(purecopy "Project support (EDE)")
1484 global-ede-mode
1485 :help ,(purecopy "Toggle the Emacs Development Environment (Global EDE mode)")
1486 :button (:toggle . (bound-and-true-p global-ede-mode))))
1487
7f315c7c 1488(define-key menu-bar-tools-menu [gdb]
72033dbe
DN
1489 `(menu-item ,(purecopy "Debugger (GDB)...") gdb
1490 :help ,(purecopy "Debug a program from within Emacs with GDB")))
7f315c7c 1491(define-key menu-bar-tools-menu [shell-on-region]
72033dbe 1492 `(menu-item ,(purecopy "Shell Command on Region...") shell-command-on-region
7f315c7c 1493 :enable mark-active
72033dbe 1494 :help ,(purecopy "Pass marked region to a shell command")))
7f315c7c 1495(define-key menu-bar-tools-menu [shell]
72033dbe
DN
1496 `(menu-item ,(purecopy "Shell Command...") shell-command
1497 :help ,(purecopy "Invoke a shell command and catch its output")))
7f315c7c 1498(define-key menu-bar-tools-menu [compile]
72033dbe
DN
1499 `(menu-item ,(purecopy "Compile...") compile
1500 :help ,(purecopy "Invoke compiler or Make, view compilation errors")))
7f315c7c 1501(define-key menu-bar-tools-menu [grep]
72033dbe
DN
1502 `(menu-item ,(purecopy "Search Files (Grep)...") grep
1503 :help ,(purecopy "Search files for strings or regexps (with Grep)")))
7f315c7c
EZ
1504
1505\f
1506;; The "Help" menu items
1507
e5683624
RS
1508(defvar menu-bar-describe-menu (make-sparse-keymap "Describe"))
1509
7f315c7c 1510(define-key menu-bar-describe-menu [mule-diag]
72033dbe 1511 `(menu-item ,(purecopy "Show All of Mule Status") mule-diag
597e2240 1512 :visible (default-value 'enable-multibyte-characters)
72033dbe 1513 :help ,(purecopy "Display multilingual environment settings")))
df5bde6d 1514(define-key menu-bar-describe-menu [describe-coding-system-briefly]
72033dbe 1515 `(menu-item ,(purecopy "Describe Coding System (Briefly)")
df5bde6d 1516 describe-current-coding-system-briefly
597e2240 1517 :visible (default-value 'enable-multibyte-characters)))
7f315c7c 1518(define-key menu-bar-describe-menu [describe-coding-system]
72033dbe 1519 `(menu-item ,(purecopy "Describe Coding System...") describe-coding-system
597e2240 1520 :visible (default-value 'enable-multibyte-characters)))
7f315c7c 1521(define-key menu-bar-describe-menu [describe-input-method]
72033dbe 1522 `(menu-item ,(purecopy "Describe Input Method...") describe-input-method
597e2240 1523 :visible (default-value 'enable-multibyte-characters)
72033dbe 1524 :help ,(purecopy "Keyboard layout for specific input method")))
7f315c7c 1525(define-key menu-bar-describe-menu [describe-language-environment]
72033dbe 1526 `(menu-item ,(purecopy "Describe Language Environment")
98b9bf40 1527 ,describe-language-environment-map))
7f315c7c
EZ
1528
1529(define-key menu-bar-describe-menu [separator-desc-mule]
a3c20c83 1530 menu-bar-separator)
7f315c7c
EZ
1531
1532(define-key menu-bar-describe-menu [list-keybindings]
72033dbe
DN
1533 `(menu-item ,(purecopy "List Key Bindings") describe-bindings
1534 :help ,(purecopy "Display all current key bindings (keyboard shortcuts)")))
df5bde6d 1535(define-key menu-bar-describe-menu [describe-current-display-table]
72033dbe
DN
1536 `(menu-item ,(purecopy "Describe Display Table") describe-current-display-table
1537 :help ,(purecopy "Describe the current display table")))
cb6c4991
CY
1538(define-key menu-bar-describe-menu [describe-package]
1539 `(menu-item ,(purecopy "Describe Package...") describe-package
1540 :help ,(purecopy "Display documentation of a Lisp package")))
df5bde6d 1541(define-key menu-bar-describe-menu [describe-face]
72033dbe
DN
1542 `(menu-item ,(purecopy "Describe Face...") describe-face
1543 :help ,(purecopy "Display the properties of a face")))
e5683624 1544(define-key menu-bar-describe-menu [describe-variable]
72033dbe
DN
1545 `(menu-item ,(purecopy "Describe Variable...") describe-variable
1546 :help ,(purecopy "Display documentation of variable/option")))
e5683624 1547(define-key menu-bar-describe-menu [describe-function]
72033dbe
DN
1548 `(menu-item ,(purecopy "Describe Function...") describe-function
1549 :help ,(purecopy "Display documentation of function/command")))
686e63b3 1550(define-key menu-bar-describe-menu [describe-key-1]
72033dbe 1551 `(menu-item ,(purecopy "Describe Key or Mouse Operation...") describe-key
506c6d61 1552 ;; Users typically don't identify keys and menu items...
72033dbe
DN
1553 :help ,(purecopy "Display documentation of command bound to a \
1554key, a click, or a menu-item")))
df5bde6d 1555(define-key menu-bar-describe-menu [describe-mode]
72033dbe
DN
1556 `(menu-item ,(purecopy "Describe Buffer Modes") describe-mode
1557 :help ,(purecopy "Describe this buffer's major and minor mode")))
df5bde6d 1558
9f3bfa54
EZ
1559(defvar menu-bar-search-documentation-menu
1560 (make-sparse-keymap "Search Documentation"))
5275d6a8
EZ
1561(defun menu-bar-read-lispref ()
1562 "Display the Emacs Lisp Reference manual in Info mode."
1563 (interactive)
1564 (info "elisp"))
1565
1566(defun menu-bar-read-lispintro ()
1567 "Display the Introduction to Emacs Lisp Programming in Info mode."
1568 (interactive)
1569 (info "eintr"))
1570
5275d6a8
EZ
1571(defun search-emacs-glossary ()
1572 "Display the Glossary node of the Emacs manual in Info mode."
1573 (interactive)
1574 (info "(emacs)Glossary"))
1575
1576(defun emacs-index-search (topic)
1577 "Look up TOPIC in the indices of the Emacs User Manual."
1578 (interactive "sSubject to look up: ")
1579 (info "emacs")
1580 (Info-index topic))
1581
1582(defun elisp-index-search (topic)
1583 "Look up TOPIC in the indices of the Emacs Lisp Reference Manual."
1584 (interactive "sSubject to look up: ")
1585 (info "elisp")
1586 (Info-index topic))
df5bde6d 1587
9f3bfa54 1588(define-key menu-bar-search-documentation-menu [search-documentation-strings]
72033dbe 1589 `(menu-item ,(purecopy "Search Documentation Strings...") apropos-documentation
5275d6a8 1590 :help
72033dbe 1591 ,(purecopy "Find functions and variables whose doc strings match a regexp")))
9f3bfa54 1592(define-key menu-bar-search-documentation-menu [find-any-object-by-name]
72033dbe
DN
1593 `(menu-item ,(purecopy "Find Any Object by Name...") apropos
1594 :help ,(purecopy "Find symbols of any kind whose names match a regexp")))
9f3bfa54 1595(define-key menu-bar-search-documentation-menu [find-option-by-value]
72033dbe
DN
1596 `(menu-item ,(purecopy "Find Options by Value...") apropos-value
1597 :help ,(purecopy "Find variables whose values match a regexp")))
9f3bfa54 1598(define-key menu-bar-search-documentation-menu [find-options-by-name]
72033dbe
DN
1599 `(menu-item ,(purecopy "Find Options by Name...") apropos-variable
1600 :help ,(purecopy "Find variables whose names match a regexp")))
9f3bfa54 1601(define-key menu-bar-search-documentation-menu [find-commands-by-name]
72033dbe
DN
1602 `(menu-item ,(purecopy "Find Commands by Name...") apropos-command
1603 :help ,(purecopy "Find commands whose names match a regexp")))
9f3bfa54 1604(define-key menu-bar-search-documentation-menu [sep1]
a3c20c83 1605 menu-bar-separator)
9f3bfa54 1606(define-key menu-bar-search-documentation-menu [lookup-command-in-manual]
72033dbe
DN
1607 `(menu-item ,(purecopy "Look Up Command in User Manual...") Info-goto-emacs-command-node
1608 :help ,(purecopy "Display manual section that describes a command")))
9f3bfa54 1609(define-key menu-bar-search-documentation-menu [lookup-key-in-manual]
72033dbe
DN
1610 `(menu-item ,(purecopy "Look Up Key in User Manual...") Info-goto-emacs-key-command-node
1611 :help ,(purecopy "Display manual section that describes a key")))
9f3bfa54 1612(define-key menu-bar-search-documentation-menu [lookup-subject-in-elisp-manual]
72033dbe
DN
1613 `(menu-item ,(purecopy "Look Up Subject in ELisp Manual...") elisp-index-search
1614 :help ,(purecopy "Find description of a subject in Emacs Lisp manual")))
9f3bfa54 1615(define-key menu-bar-search-documentation-menu [lookup-subject-in-emacs-manual]
72033dbe
DN
1616 `(menu-item ,(purecopy "Look Up Subject in User Manual...") emacs-index-search
1617 :help ,(purecopy "Find description of a subject in Emacs User manual")))
9f3bfa54 1618(define-key menu-bar-search-documentation-menu [emacs-terminology]
72033dbe
DN
1619 `(menu-item ,(purecopy "Emacs Terminology") search-emacs-glossary
1620 :help ,(purecopy "Display the Glossary section of the Emacs manual")))
5275d6a8
EZ
1621
1622(defvar menu-bar-manuals-menu (make-sparse-keymap "More Manuals"))
e5683624
RS
1623
1624(define-key menu-bar-manuals-menu [man]
72033dbe
DN
1625 `(menu-item ,(purecopy "Read Man Page...") manual-entry
1626 :help ,(purecopy "Man-page docs for external commands and libraries")))
e5683624 1627(define-key menu-bar-manuals-menu [sep2]
a3c20c83 1628 menu-bar-separator)
5275d6a8 1629(define-key menu-bar-manuals-menu [order-emacs-manuals]
72033dbe
DN
1630 `(menu-item ,(purecopy "Ordering Manuals") view-order-manuals
1631 :help ,(purecopy "How to order manuals from the Free Software Foundation")))
9f3bfa54 1632(define-key menu-bar-manuals-menu [lookup-subject-in-all-manuals]
72033dbe
DN
1633 `(menu-item ,(purecopy "Lookup Subject in all Manuals...") info-apropos
1634 :help ,(purecopy "Find description of a subject in all installed manuals")))
9f3bfa54 1635(define-key menu-bar-manuals-menu [other-manuals]
72033dbe
DN
1636 `(menu-item ,(purecopy "All Other Manuals (Info)") Info-directory
1637 :help ,(purecopy "Read any of the installed manuals")))
9f3bfa54 1638(define-key menu-bar-manuals-menu [emacs-lisp-reference]
72033dbe
DN
1639 `(menu-item ,(purecopy "Emacs Lisp Reference") menu-bar-read-lispref
1640 :help ,(purecopy "Read the Emacs Lisp Reference manual")))
b374f54d 1641(define-key menu-bar-manuals-menu [emacs-lisp-intro]
72033dbe
DN
1642 `(menu-item ,(purecopy "Introduction to Emacs Lisp") menu-bar-read-lispintro
1643 :help ,(purecopy "Read the Introduction to Emacs Lisp Programming")))
bacb2d12 1644
a064691f 1645(define-key menu-bar-help-menu [about-gnu-project]
72033dbe
DN
1646 `(menu-item ,(purecopy "About GNU") describe-gnu-project
1647 :help ,(purecopy "About the GNU System, GNU Project, and GNU/Linux")))
a064691f 1648(define-key menu-bar-help-menu [about-emacs]
72033dbe
DN
1649 `(menu-item ,(purecopy "About Emacs") about-emacs
1650 :help ,(purecopy "Display version number, copyright info, and basic help")))
5275d6a8 1651(define-key menu-bar-help-menu [sep4]
a3c20c83 1652 menu-bar-separator)
f3e1e0dd 1653(define-key menu-bar-help-menu [describe-no-warranty]
72033dbe
DN
1654 `(menu-item ,(purecopy "(Non)Warranty") describe-no-warranty
1655 :help ,(purecopy "Explain that Emacs has NO WARRANTY")))
f3e1e0dd 1656(define-key menu-bar-help-menu [describe-copying]
72033dbe
DN
1657 `(menu-item ,(purecopy "Copying Conditions") describe-copying
1658 :help ,(purecopy "Show the Emacs license (GPL)")))
9f3bfa54 1659(define-key menu-bar-help-menu [getting-new-versions]
72033dbe
DN
1660 `(menu-item ,(purecopy "Getting New Versions") describe-distribution
1661 :help ,(purecopy "How to get the latest version of Emacs")))
277e0f9d
RS
1662(defun menu-bar-help-extra-packages ()
1663 "Display help about some additional packages available for Emacs."
1664 (interactive)
1665 (let (enable-local-variables)
1666 (view-file (expand-file-name "MORE.STUFF"
1667 data-directory))
4fd8fd32 1668 (goto-address-mode 1)))
e5683624 1669(define-key menu-bar-help-menu [sep2]
a3c20c83 1670 menu-bar-separator)
a064691f 1671(define-key menu-bar-help-menu [external-packages]
cb6c4991 1672 `(menu-item ,(purecopy "Finding Extra Packages") menu-bar-help-extra-packages
72033dbe 1673 :help ,(purecopy "Lisp packages distributed separately for use in Emacs")))
9f3bfa54 1674(define-key menu-bar-help-menu [find-emacs-packages]
cb6c4991
CY
1675 `(menu-item ,(purecopy "Search Built-in Packages") finder-by-keyword
1676 :help ,(purecopy "Find built-in packages and features by keyword")))
9f3bfa54 1677(define-key menu-bar-help-menu [more-manuals]
98b9bf40 1678 `(menu-item ,(purecopy "More Manuals") ,menu-bar-manuals-menu))
5275d6a8 1679(define-key menu-bar-help-menu [emacs-manual]
72033dbe
DN
1680 `(menu-item ,(purecopy "Read the Emacs Manual") info-emacs-manual
1681 :help ,(purecopy "Full documentation of Emacs features")))
e5683624 1682(define-key menu-bar-help-menu [describe]
98b9bf40 1683 `(menu-item ,(purecopy "Describe") ,menu-bar-describe-menu))
9f3bfa54 1684(define-key menu-bar-help-menu [search-documentation]
98b9bf40 1685 `(menu-item ,(purecopy "Search Documentation") ,menu-bar-search-documentation-menu))
e5683624 1686(define-key menu-bar-help-menu [sep1]
a3c20c83 1687 menu-bar-separator)
a064691f 1688(define-key menu-bar-help-menu [emacs-psychotherapist]
72033dbe
DN
1689 `(menu-item ,(purecopy "Emacs Psychotherapist") doctor
1690 :help ,(purecopy "Our doctor will help you feel better")))
9f3bfa54 1691(define-key menu-bar-help-menu [send-emacs-bug-report]
72033dbe
DN
1692 `(menu-item ,(purecopy "Send Bug Report...") report-emacs-bug
1693 :help ,(purecopy "Send e-mail to Emacs maintainers")))
9f3bfa54 1694(define-key menu-bar-help-menu [emacs-known-problems]
72033dbe
DN
1695 `(menu-item ,(purecopy "Emacs Known Problems") view-emacs-problems
1696 :help ,(purecopy "Read about known problems with Emacs")))
7f315c7c 1697(define-key menu-bar-help-menu [emacs-news]
72033dbe
DN
1698 `(menu-item ,(purecopy "Emacs News") view-emacs-news
1699 :help ,(purecopy "New features of this version")))
7f315c7c 1700(define-key menu-bar-help-menu [emacs-faq]
72033dbe
DN
1701 `(menu-item ,(purecopy "Emacs FAQ") view-emacs-FAQ
1702 :help ,(purecopy "Frequently asked (and answered) questions about Emacs")))
277e0f9d
RS
1703
1704(defun help-with-tutorial-spec-language ()
1705 "Use the Emacs tutorial, specifying which language you want."
f1180544 1706 (interactive)
277e0f9d
RS
1707 (help-with-tutorial t))
1708
451ec4e3 1709(define-key menu-bar-help-menu [emacs-tutorial-language-specific]
72033dbe 1710 `(menu-item ,(purecopy "Emacs Tutorial (choose language)...")
277e0f9d 1711 help-with-tutorial-spec-language
72033dbe 1712 :help ,(purecopy "Learn how to use Emacs (choose a language)")))
7f315c7c 1713(define-key menu-bar-help-menu [emacs-tutorial]
72033dbe
DN
1714 `(menu-item ,(purecopy "Emacs Tutorial") help-with-tutorial
1715 :help ,(purecopy "Learn how to use Emacs")))
889560ed 1716
b3edb781
GM
1717;; In OS X it's in the app menu already.
1718;; FIXME? There already is an "About Emacs" (sans ...) entry in the Help menu.
1719(and (featurep 'ns)
1720 (not (eq system-type 'darwin))
1721 (define-key menu-bar-help-menu [info-panel]
1722 `(menu-item ,(purecopy "About Emacs...") ns-do-emacs-info-panel)))
1723
92752c3a
EZ
1724(defun menu-bar-menu-frame-live-and-visible-p ()
1725 "Return non-nil if the menu frame is alive and visible.
1726The menu frame is the frame for which we are updating the menu."
55d42133 1727 (let ((menu-frame (or menu-updating-frame (selected-frame))))
92752c3a
EZ
1728 (and (frame-live-p menu-frame)
1729 (frame-visible-p menu-frame))))
1730
1731(defun menu-bar-non-minibuffer-window-p ()
1732 "Return non-nil if selected window of the menu frame is not a minibuf window.
1733
1734See the documentation of `menu-bar-menu-frame-live-and-visible-p'
1735for the definition of the menu frame."
55d42133 1736 (let ((menu-frame (or menu-updating-frame (selected-frame))))
92752c3a
EZ
1737 (not (window-minibuffer-p (frame-selected-window menu-frame)))))
1738
6eee5abf 1739(defun kill-this-buffer () ; for the menu bar
a86b330f
JL
1740 "Kill the current buffer.
1741When called in the minibuffer, get out of the minibuffer
1742using `abort-recursive-edit'."
db774a16 1743 (interactive)
a86b330f
JL
1744 (if (menu-bar-non-minibuffer-window-p)
1745 (kill-buffer (current-buffer))
1746 (abort-recursive-edit)))
db774a16 1747
2f1139a4
RS
1748(defun kill-this-buffer-enabled-p ()
1749 (let ((count 0)
1750 (buffers (buffer-list)))
1751 (while buffers
1752 (or (string-match "^ " (buffer-name (car buffers)))
1753 (setq count (1+ count)))
1754 (setq buffers (cdr buffers)))
a86b330f
JL
1755 (or (not (menu-bar-non-minibuffer-window-p))
1756 (> count 1))))
1f50590a 1757
92752c3a 1758(put 'dired 'menu-enable '(menu-bar-non-minibuffer-window-p))
1f50590a 1759
a0213a97 1760;; Permit deleting frame if it would leave a visible or iconified frame.
82a74107
KH
1761(defun delete-frame-enabled-p ()
1762 "Return non-nil if `delete-frame' should be enabled in the menu bar."
1763 (let ((frames (frame-list))
27aa8132
RS
1764 (count 0))
1765 (while frames
1766 (if (frame-visible-p (car frames))
1767 (setq count (1+ count)))
1768 (setq frames (cdr frames)))
1769 (> count 1)))
2f1139a4 1770
30e19aee 1771(defcustom yank-menu-length 20
9201cc28 1772 "Maximum length to display in the yank-menu."
30e19aee 1773 :type 'integer
d3434a5b 1774 :group 'menu)
3dd92899
KH
1775
1776(defun menu-bar-update-yank-menu (string old)
1777 (let ((front (car (cdr yank-menu)))
1778 (menu-string (if (<= (length string) yank-menu-length)
1779 string
c3e1d435
RS
1780 (concat
1781 (substring string 0 (/ yank-menu-length 2))
1782 "..."
1783 (substring string (- (/ yank-menu-length 2)))))))
7c70a955
RS
1784 ;; Don't let the menu string be all dashes
1785 ;; because that has a special meaning in a menu.
1786 (if (string-match "\\`-+\\'" menu-string)
1787 (setq menu-string (concat menu-string " ")))
3dd92899
KH
1788 ;; If we're supposed to be extending an existing string, and that
1789 ;; string really is at the front of the menu, then update it in place.
1790 (if (and old (or (eq old (car front))
1791 (string= old (car front))))
dfabc98f 1792 (progn
3dd92899
KH
1793 (setcar front string)
1794 (setcar (cdr front) menu-string))
1795 (setcdr yank-menu
1796 (cons
1797 (cons string (cons menu-string 'menu-bar-select-yank))
1798 (cdr yank-menu)))))
1799 (if (> (length (cdr yank-menu)) kill-ring-max)
1800 (setcdr (nthcdr kill-ring-max yank-menu) nil)))
1801
4cca6fbd 1802(put 'menu-bar-select-yank 'apropos-inhibit t)
3dd92899 1803(defun menu-bar-select-yank ()
5fb64ecc
EZ
1804 "Insert the stretch of previously-killed text selected from menu.
1805The menu shows all the killed text sequences stored in `kill-ring'."
3dd92899
KH
1806 (interactive "*")
1807 (push-mark (point))
1808 (insert last-command-event))
68310f2a 1809
40954111 1810\f
d3434a5b
JL
1811;;; Buffers Menu
1812
1813(defcustom buffers-menu-max-size 10
9201cc28 1814 "Maximum number of entries which may appear on the Buffers menu.
d3434a5b
JL
1815If this is 10, then only the ten most-recently-selected buffers are shown.
1816If this is nil, then all buffers are shown.
1817A large number or nil slows down menu responsiveness."
1818 :type '(choice integer
1819 (const :tag "All" nil))
1820 :group 'menu)
1821
1822(defcustom buffers-menu-buffer-name-length 30
9201cc28 1823 "Maximum length of the buffer name on the Buffers menu.
d3434a5b
JL
1824If this is a number, then buffer names are truncated to this length.
1825If this is nil, then buffer names are shown in full.
1826A large number or nil makes the menu too wide."
1827 :type '(choice integer
1828 (const :tag "Full length" nil))
1829 :group 'menu)
1830
68310f2a
MB
1831(defcustom buffers-menu-show-directories 'unless-uniquify
1832 "If non-nil, show directories in the Buffers menu for buffers that have them.
1833The special value `unless-uniquify' means that directories will be shown
1834unless `uniquify-buffer-name-style' is non-nil (in which case, buffer
1835names should include enough of a buffer's directory to distinguish it
1836from other buffers).
1837
1838Setting this variable directly does not take effect until next time the
1839Buffers menu is regenerated."
1840 :set (lambda (symbol value)
1841 (set symbol value)
1842 (menu-bar-update-buffers t))
1843 :initialize 'custom-initialize-default
1844 :type '(choice (const :tag "Never" nil)
1845 (const :tag "Unless uniquify is enabled" unless-uniquify)
1846 (const :tag "Always" t))
1847 :group 'menu)
1848
1849(defcustom buffers-menu-show-status t
1850 "If non-nil, show modified/read-only status of buffers in the Buffers menu.
1851Setting this variable directly does not take effect until next time the
1852Buffers menu is regenerated."
1853 :set (lambda (symbol value)
1854 (set symbol value)
1855 (menu-bar-update-buffers t))
1856 :initialize 'custom-initialize-default
1857 :type 'boolean
1858 :group 'menu)
1859
11ee8d90 1860(defvar list-buffers-directory nil
8f75f2da 1861 "String to display in buffer listings for buffers not visiting a file.")
11ee8d90 1862(make-variable-buffer-local 'list-buffers-directory)
d0690d12 1863
fb75de8f
VJL
1864(defun menu-bar-select-buffer ()
1865 (interactive)
1866 (switch-to-buffer last-command-event))
1867
ed10603b
SM
1868(defun menu-bar-select-frame (frame)
1869 (make-frame-visible frame)
1870 (raise-frame frame)
1871 (select-frame frame))
09642d97 1872
c171b42f 1873(defun menu-bar-update-buffers-1 (elt)
68703c11
MB
1874 (let* ((buf (car elt))
1875 (file
68310f2a
MB
1876 (and (if (eq buffers-menu-show-directories 'unless-uniquify)
1877 (or (not (boundp 'uniquify-buffer-name-style))
1878 (null uniquify-buffer-name-style))
1879 buffers-menu-show-directories)
68703c11 1880 (or (buffer-file-name buf)
68310f2a 1881 (buffer-local-value 'list-buffers-directory buf)))))
68703c11
MB
1882 (when file
1883 (setq file (file-name-directory file)))
1884 (when (and file (> (length file) 20))
1885 (setq file (concat "..." (substring file -17))))
68310f2a
MB
1886 (cons (if buffers-menu-show-status
1887 (let ((mod (if (buffer-modified-p buf) "*" ""))
1888 (ro (if (buffer-local-value 'buffer-read-only buf) "%" "")))
1889 (if file
1890 (format "%s %s%s -- %s" (cdr elt) mod ro file)
1891 (format "%s %s%s" (cdr elt) mod ro)))
1892 (if file
1893 (format "%s -- %s" (cdr elt) file)
1894 (cdr elt)))
68703c11
MB
1895 buf)))
1896
887d3c94
MB
1897;; Used to cache the menu entries for commands in the Buffers menu
1898(defvar menu-bar-buffers-menu-command-entries nil)
1899
ee1dbceb 1900(defun menu-bar-update-buffers (&optional force)
29397c58 1901 ;; If user discards the Buffers item, play along.
4d587a6c 1902 (and (lookup-key (current-global-map) [menu-bar buffer])
ee1dbceb 1903 (or force (frame-or-buffer-changed-p))
29397c58
RS
1904 (let ((buffers (buffer-list))
1905 (frames (frame-list))
bf902855 1906 buffers-menu)
29397c58
RS
1907 ;; If requested, list only the N most recently selected buffers.
1908 (if (and (integerp buffers-menu-max-size)
1909 (> buffers-menu-max-size 1))
1910 (if (> (length buffers) buffers-menu-max-size)
1911 (setcdr (nthcdr buffers-menu-max-size buffers) nil)))
1912
1913 ;; Make the menu of buffers proper.
1914 (setq buffers-menu
ed10603b 1915 (let (alist)
8b621d39
MB
1916 ;; Put into each element of buffer-list
1917 ;; the name for actual display,
1918 ;; perhaps truncated in the middle.
ed10603b
SM
1919 (dolist (buf buffers)
1920 (let ((name (buffer-name buf)))
1921 (unless (eq ?\s (aref name 0))
1922 (push (menu-bar-update-buffers-1
1923 (cons buf
d3434a5b
JL
1924 (if (and (integerp buffers-menu-buffer-name-length)
1925 (> (length name) buffers-menu-buffer-name-length))
1926 (concat
1927 (substring
1928 name 0 (/ buffers-menu-buffer-name-length 2))
1929 "..."
1930 (substring
1931 name (- (/ buffers-menu-buffer-name-length 2))))
1932 name)
1933 ))
ed10603b
SM
1934 alist))))
1935 ;; Now make the actual list of items.
1936 (let ((buffers-vec (make-vector (length alist) nil))
1937 (i (length alist)))
1938 (dolist (pair alist)
1939 (setq i (1- i))
1940 (aset buffers-vec i
1941 (nconc (list (car pair)
8b621d39 1942 (cons nil nil))
ed10603b
SM
1943 `(lambda ()
1944 (interactive)
1945 (switch-to-buffer ,(cdr pair))))))
1946 (list buffers-vec))))
29397c58
RS
1947
1948 ;; Make a Frames menu if we have more than one frame.
8b621d39 1949 (when (cdr frames)
ed10603b
SM
1950 (let* ((frames-vec (make-vector (length frames) nil))
1951 (frames-menu
1952 (cons 'keymap
1953 (list "Select Frame" frames-vec)))
1954 (i 0))
1955 (dolist (frame frames)
1956 (aset frames-vec i
1957 (nconc
1958 (list
1959 (frame-parameter frame 'name)
1960 (cons nil nil))
1961 `(lambda ()
1962 (interactive) (menu-bar-select-frame ,frame))))
1963 (setq i (1+ i)))
8b621d39
MB
1964 ;; Put it after the normal buffers
1965 (setq buffers-menu
1966 (nconc buffers-menu
1967 `((frames-separator "--")
1968 (frames menu-item "Frames" ,frames-menu))))))
1969
887d3c94
MB
1970 ;; Add in some normal commands at the end of the menu. We use
1971 ;; the copy cached in `menu-bar-buffers-menu-command-entries'
1972 ;; if it's been set already. Note that we can't use constant
1973 ;; lists for the menu-entries, because the low-level menu-code
1974 ;; modifies them.
1975 (unless menu-bar-buffers-menu-command-entries
1976 (setq menu-bar-buffers-menu-command-entries
1977 (list '(command-separator "--")
332b907c
RS
1978 (list 'next-buffer
1979 'menu-item
1980 "Next Buffer"
1981 'next-buffer
1982 :help "Switch to the \"next\" buffer in a cyclic order")
a74f9094 1983 (list 'previous-buffer
332b907c
RS
1984 'menu-item
1985 "Previous Buffer"
a74f9094 1986 'previous-buffer
332b907c 1987 :help "Switch to the \"previous\" buffer in a cyclic order")
887d3c94
MB
1988 (list 'select-named-buffer
1989 'menu-item
1990 "Select Named Buffer..."
1991 'switch-to-buffer
1992 :help "Prompt for a buffer name, and select that buffer in the current window")
1993 (list 'list-all-buffers
1994 'menu-item
1995 "List All Buffers"
1996 'list-buffers
4f00f90f 1997 :help "Pop up a window listing all Emacs buffers"
887d3c94 1998 ))))
8b621d39 1999 (setq buffers-menu
887d3c94 2000 (nconc buffers-menu menu-bar-buffers-menu-command-entries))
8b621d39 2001
bf902855
SM
2002 ;; We used to "(define-key (current-global-map) [menu-bar buffer]"
2003 ;; but that did not do the right thing when the [menu-bar buffer]
2004 ;; entry above had been moved (e.g. to a parent keymap).
2005 (setcdr global-buffers-menu-map (cons "Select Buffer" buffers-menu)))))
09642d97
RS
2006
2007(add-hook 'menu-bar-update-hook 'menu-bar-update-buffers)
2f1139a4 2008
3f557298
RS
2009(menu-bar-update-buffers)
2010
40954111 2011;; this version is too slow
a9d96061
SM
2012;;(defun format-buffers-menu-line (buffer)
2013;; "Returns a string to represent the given buffer in the Buffer menu.
2014;;nil means the buffer shouldn't be listed. You can redefine this."
2015;; (if (string-match "\\` " (buffer-name buffer))
2016;; nil
7fdbcd83 2017;; (with-current-buffer buffer
a9d96061
SM
2018;; (let ((size (buffer-size)))
2019;; (format "%s%s %-19s %6s %-15s %s"
2020;; (if (buffer-modified-p) "*" " ")
2021;; (if buffer-read-only "%" " ")
2022;; (buffer-name)
2023;; size
2024;; mode-name
2025;; (or (buffer-file-name) ""))))))
40954111 2026\f
25b048ee
RS
2027;;; Set up a menu bar menu for the minibuffer.
2028
32993295
SM
2029(dolist (map (list minibuffer-local-map
2030 ;; This shouldn't be necessary, but there's a funny
2031 ;; bug in keymap.c that I don't understand yet. -stef
d918e2dc
SM
2032 minibuffer-local-completion-map))
2033 (define-key map [menu-bar minibuf]
8f43cbf3 2034 (cons (purecopy "Minibuf") (make-sparse-keymap "Minibuf"))))
d918e2dc 2035
32993295 2036(let ((map minibuffer-local-completion-map))
d918e2dc 2037 (define-key map [menu-bar minibuf ?\?]
98b9bf40
JL
2038 `(menu-item ,(purecopy "List Completions") minibuffer-completion-help
2039 :help ,(purecopy "Display all possible completions")))
d918e2dc 2040 (define-key map [menu-bar minibuf space]
98b9bf40
JL
2041 `(menu-item ,(purecopy "Complete Word") minibuffer-complete-word
2042 :help ,(purecopy "Complete at most one word")))
d918e2dc 2043 (define-key map [menu-bar minibuf tab]
98b9bf40
JL
2044 `(menu-item ,(purecopy "Complete") minibuffer-complete
2045 :help ,(purecopy "Complete as far as possible"))))
d918e2dc 2046
32993295 2047(let ((map minibuffer-local-map))
d918e2dc 2048 (define-key map [menu-bar minibuf quit]
98b9bf40
JL
2049 `(menu-item ,(purecopy "Quit") abort-recursive-edit
2050 :help ,(purecopy "Abort input and exit minibuffer")))
d918e2dc 2051 (define-key map [menu-bar minibuf return]
98b9bf40 2052 `(menu-item ,(purecopy "Enter") exit-minibuffer
1e8780b1 2053 :key-sequence ,(purecopy "\r")
98b9bf40 2054 :help ,(purecopy "Terminate input and exit minibuffer")))
56a8f9c5 2055 (define-key map [menu-bar minibuf isearch-forward]
98b9bf40
JL
2056 `(menu-item ,(purecopy "Isearch History Forward") isearch-forward
2057 :help ,(purecopy "Incrementally search minibuffer history forward")))
56a8f9c5 2058 (define-key map [menu-bar minibuf isearch-backward]
98b9bf40
JL
2059 `(menu-item ,(purecopy "Isearch History Backward") isearch-backward
2060 :help ,(purecopy "Incrementally search minibuffer history backward")))
56a8f9c5 2061 (define-key map [menu-bar minibuf next]
98b9bf40
JL
2062 `(menu-item ,(purecopy "Next History Item") next-history-element
2063 :help ,(purecopy "Put next minibuffer history element in the minibuffer")))
56a8f9c5 2064 (define-key map [menu-bar minibuf previous]
98b9bf40
JL
2065 `(menu-item ,(purecopy "Previous History Item") previous-history-element
2066 :help ,(purecopy "Put previous minibuffer history element in the minibuffer"))))
25b048ee 2067\f
8ab9589d 2068(define-minor-mode menu-bar-mode
dfd29450 2069 "Toggle display of a menu bar on each frame.
057d49d1
RS
2070This command applies to all frames that exist and frames to be
2071created in the future.
e1d18ad8
RS
2072With a numeric argument, if the argument is positive,
2073turn on menu bars; otherwise, turn off menu bars."
6431f2e6 2074 :init-value t
8ab9589d 2075 :global t
9d794026
GM
2076 ;; It's defined in C/cus-start, this stops the d-m-m macro defining it again.
2077 :variable menu-bar-mode
095fe281 2078
6431f2e6
CY
2079 ;; Turn the menu-bars on all frames on or off.
2080 (let ((val (if menu-bar-mode 1 0)))
2081 (dolist (frame (frame-list))
4ad11f8c
CY
2082 (set-frame-parameter frame 'menu-bar-lines val))
2083 ;; If the user has given `default-frame-alist' a `menu-bar-lines'
2084 ;; parameter, replace it.
2085 (if (assq 'menu-bar-lines default-frame-alist)
2086 (setq default-frame-alist
2087 (cons (cons 'menu-bar-lines val)
2088 (assq-delete-all 'menu-bar-lines
2089 default-frame-alist)))))
8ab9589d
JD
2090 ;; Make the message appear when Emacs is idle. We can not call message
2091 ;; directly. The minor-mode message "Menu-bar mode disabled" comes
2092 ;; after this function returns, overwriting any message we do here.
32226619 2093 (when (and (called-interactively-p 'interactive) (not menu-bar-mode))
8ab9589d 2094 (run-with-idle-timer 0 nil 'message
4ad11f8c 2095 "Menu-bar mode disabled. Use M-x menu-bar-mode to make the menu bar appear.")))
1db87953 2096
639b9d87
GM
2097;;;###autoload
2098;; (This does not work right unless it comes after the above definition.)
2099;; This comment is taken from tool-bar.el near
2100;; (put 'tool-bar-mode ...)
2101;; We want to pretend the menu bar by standard is on, as this will make
2102;; customize consider disabling the menu bar a customization, and save
2103;; that. We could do this for real by setting :init-value above, but
2104;; that would overwrite disabling the menu bar from X resources.
2105(put 'menu-bar-mode 'standard-value '(t))
2106
6a5af08f
KL
2107(defun toggle-menu-bar-mode-from-frame (&optional arg)
2108 "Toggle menu bar on or off, based on the status of the current frame.
2109See `menu-bar-mode' for more information."
2110 (interactive (list (or current-prefix-arg 'toggle)))
2111 (if (eq arg 'toggle)
2112 (menu-bar-mode (if (> (frame-parameter nil 'menu-bar-lines) 0) 0 1))
2113 (menu-bar-mode arg)))
2114
f464330b 2115(declare-function x-menu-bar-open "term/x-win" (&optional frame))
1ad31f1b 2116(declare-function w32-menu-bar-open "term/w32-win" (&optional frame))
f464330b 2117
14ab3a40
KL
2118(defun menu-bar-open (&optional frame)
2119 "Start key navigation of the menu bar in FRAME.
2120
2121This function decides which method to use to access the menu
2122depending on FRAME's terminal device. On X displays, it calls
14f3467e
JR
2123`x-menu-bar-open'; on Windows, `w32-menu-bar-open' otherwise it
2124calls `tmm-menubar'.
14ab3a40
KL
2125
2126If FRAME is nil or not given, use the selected frame."
2127 (interactive)
14f3467e
JR
2128 (let ((type (framep (or frame (selected-frame)))))
2129 (cond
2130 ((eq type 'x) (x-menu-bar-open frame))
2131 ((eq type 'w32) (w32-menu-bar-open frame))
2132 (t (with-selected-frame (or frame (selected-frame))
2133 (tmm-menubar))))))
14ab3a40
KL
2134
2135(global-set-key [f10] 'menu-bar-open)
2136
bffa5d4d
RS
2137(provide 'menu-bar)
2138
235aa29b 2139;;; menu-bar.el ends here