(activate-mark-hook, deactivate-mark-hook): Add defvars.
[bpt/emacs.git] / lisp / menu-bar.el
CommitLineData
55535639 1;;; menu-bar.el --- define a default menu bar
235aa29b 2
c960446b 3;; Copyright (C) 1993,94,1995,2000,01,02,2003 Free Software Foundation, Inc.
b578f267 4
235aa29b 5;; Author: RMS
e4874521 6;; Maintainer: FSF
dbcee71a 7;; Keywords: internal, mouse
235aa29b 8
1db87953
RS
9;; This file is part of GNU Emacs.
10
11;; GNU Emacs is free software; you can redistribute it and/or modify
12;; it under the terms of the GNU General Public License as published by
13;; the Free Software Foundation; either version 2, or (at your option)
14;; any later version.
15
16;; GNU Emacs is distributed in the hope that it will be useful,
17;; but WITHOUT ANY WARRANTY; without even the implied warranty of
18;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19;; GNU General Public License for more details.
20
21;; You should have received a copy of the GNU General Public License
b578f267
EN
22;; along with GNU Emacs; see the file COPYING. If not, write to the
23;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
24;; Boston, MA 02111-1307, USA.
1db87953 25
260130bb
KH
26;; Avishai Yacobi suggested some menu rearrangements.
27
55535639
PJ
28;;; Commentary:
29
b578f267
EN
30;;; Code:
31
d537086b
RS
32;;; User options:
33
30e19aee 34(defcustom buffers-menu-max-size 10
d537086b
RS
35 "*Maximum number of entries which may appear on the Buffers menu.
36If this is 10, then only the ten most-recently-selected buffers are shown.
37If this is nil, then all buffers are shown.
30e19aee
RS
38A large number or nil slows down menu responsiveness."
39 :type '(choice integer
40 (const :tag "All" nil))
41 :group 'mouse)
d537086b 42
b132f2b1
RM
43;; Don't clobber an existing menu-bar keymap, to preserve any menu-bar key
44;; definitions made in loaddefs.el.
45(or (lookup-key global-map [menu-bar])
46 (define-key global-map [menu-bar] (make-sparse-keymap "menu-bar")))
22390f50 47(defvar menu-bar-help-menu (make-sparse-keymap "Help"))
ffbdd83d
RS
48
49;; Force Help item to come last, after the major mode's own items.
0d31efcd
KH
50;; The symbol used to be called `help', but that gets confused with the
51;; help key.
52(setq menu-bar-final-items '(help-menu))
ffbdd83d 53
0d31efcd 54(define-key global-map [menu-bar help-menu] (cons "Help" menu-bar-help-menu))
ffbdd83d
RS
55(defvar menu-bar-tools-menu (make-sparse-keymap "Tools"))
56(define-key global-map [menu-bar tools] (cons "Tools" menu-bar-tools-menu))
7f315c7c
EZ
57;; This definition is just to show what this looks like.
58;; It gets overridden below when menu-bar-update-buffers is called.
59(define-key global-map [menu-bar buffer]
60 (cons "Buffers" (make-sparse-keymap "Buffers")))
61(defvar menu-bar-options-menu (make-sparse-keymap "Options"))
62(define-key global-map [menu-bar options]
63 (cons "Options" menu-bar-options-menu))
64(defvar menu-bar-edit-menu (make-sparse-keymap "Edit"))
65(define-key global-map [menu-bar edit] (cons "Edit" menu-bar-edit-menu))
b23b6fec
RS
66(defvar menu-bar-file-menu (make-sparse-keymap "File"))
67(define-key global-map [menu-bar file] (cons "File" menu-bar-file-menu))
1b009b97
RS
68
69;; This alias is for compatibility with 19.28 and before.
b23b6fec 70(defvar menu-bar-files-menu menu-bar-file-menu)
68703c11
MB
71
72;; This is referenced by some code below; it is defined in uniquify.el
73(defvar uniquify-buffer-name-style)
74
9bb8e471 75\f
7f315c7c 76;; The "File" menu items
b23b6fec 77(define-key menu-bar-file-menu [exit-emacs]
7f315c7c
EZ
78 '(menu-item "Exit Emacs" save-buffers-kill-emacs
79 :help "Save unsaved buffers, then exit"))
ffbdd83d 80
b23b6fec 81(define-key menu-bar-file-menu [separator-exit]
ffbdd83d
RS
82 '("--"))
83
7f315c7c
EZ
84;; Don't use delete-frame as event name because that is a special
85;; event.
b23b6fec 86(define-key menu-bar-file-menu [delete-this-frame]
7f315c7c
EZ
87 '(menu-item "Delete Frame" delete-frame
88 :visible (fboundp 'delete-frame)
89 :enable (delete-frame-enabled-p)
90 :help "Delete currently selected frame"))
b23b6fec 91(define-key menu-bar-file-menu [make-frame-on-display]
7f315c7c
EZ
92 '(menu-item "New Frame on Display..." make-frame-on-display
93 :visible (fboundp 'make-frame-on-display)
94 :help "Open a new frame on another display"))
b23b6fec 95(define-key menu-bar-file-menu [make-frame]
7f315c7c
EZ
96 '(menu-item "New Frame" make-frame-command
97 :visible (fboundp 'make-frame-command)
98 :help "Open a new frame"))
99
b23b6fec 100(define-key menu-bar-file-menu [one-window]
7f315c7c
EZ
101 '(menu-item "Unsplit Windows" delete-other-windows
102 :enable (not (one-window-p t nil))
103 :help "Make selected window fill its frame"))
ffbdd83d 104
b23b6fec 105(define-key menu-bar-file-menu [split-window]
7f315c7c
EZ
106 '(menu-item "Split Window" split-window-vertically
107 :help "Split selected window in two"))
108
b23b6fec 109(define-key menu-bar-file-menu [separator-window]
7f315c7c
EZ
110 '(menu-item "--"))
111
b23b6fec 112(define-key menu-bar-file-menu [ps-print-region]
438c2df0
GM
113 '(menu-item "Postscript Print Region (B+W)" ps-print-region
114 :enable mark-active
115 :help "Pretty-print marked region in black and white to PostScript printer"))
b23b6fec 116(define-key menu-bar-file-menu [ps-print-buffer]
438c2df0
GM
117 '(menu-item "Postscript Print Buffer (B+W)" ps-print-buffer
118 :help "Pretty-print current buffer in black and white to PostScript printer"))
b23b6fec 119(define-key menu-bar-file-menu [ps-print-region-faces]
7f315c7c
EZ
120 '(menu-item "Postscript Print Region" ps-print-region-with-faces
121 :enable mark-active
122 :help "Pretty-print marked region to PostScript printer"))
b23b6fec 123(define-key menu-bar-file-menu [ps-print-buffer-faces]
7f315c7c
EZ
124 '(menu-item "Postscript Print Buffer" ps-print-buffer-with-faces
125 :help "Pretty-print current buffer to PostScript printer"))
b23b6fec 126(define-key menu-bar-file-menu [print-region]
7f315c7c
EZ
127 '(menu-item "Print Region" print-region
128 :enable mark-active
129 :help "Print region between mark and current position"))
b23b6fec 130(define-key menu-bar-file-menu [print-buffer]
7f315c7c
EZ
131 '(menu-item "Print Buffer" print-buffer
132 :help "Print current buffer with page headings"))
133
b23b6fec 134(define-key menu-bar-file-menu [separator-print]
7f315c7c 135 '(menu-item "--"))
9bb8e471 136
b23b6fec 137(define-key menu-bar-file-menu [recover-session]
7f315c7c
EZ
138 '(menu-item "Recover Crashed Session..." recover-session
139 :enable (and auto-save-list-file-prefix
db3ca487
NF
140 (file-directory-p
141 (file-name-directory auto-save-list-file-prefix))
142 (directory-files
7f315c7c
EZ
143 (file-name-directory auto-save-list-file-prefix)
144 nil
145 (concat "\\`"
146 (regexp-quote
147 (file-name-nondirectory
148 auto-save-list-file-prefix)))
149 t))
150 :help "Recover edits from a crashed session"))
b23b6fec 151(define-key menu-bar-file-menu [revert-buffer]
7f315c7c
EZ
152 '(menu-item "Revert Buffer" revert-buffer
153 :enable (or revert-buffer-function
154 revert-buffer-insert-file-contents-function
59dac63b 155 (and buffer-file-number
7f315c7c
EZ
156 (or (buffer-modified-p)
157 (not (verify-visited-file-modtime
158 (current-buffer))))))
159 :help "Re-read current buffer from its file"))
b23b6fec 160(define-key menu-bar-file-menu [write-file]
7f315c7c
EZ
161 '(menu-item "Save Buffer As..." write-file
162 :enable (not (window-minibuffer-p
163 (frame-selected-window menu-updating-frame)))
164 :help "Write current buffer to another file"))
b23b6fec 165(define-key menu-bar-file-menu [save-buffer]
7f315c7c
EZ
166 '(menu-item "Save (current buffer)" save-buffer
167 :enable (and (buffer-modified-p)
7a98d821 168 (buffer-file-name)
7f315c7c
EZ
169 (not (window-minibuffer-p
170 (frame-selected-window menu-updating-frame))))
171 :help "Save current buffer to its file"))
172
b23b6fec 173(define-key menu-bar-file-menu [separator-save]
7f315c7c
EZ
174 '(menu-item "--"))
175
b23b6fec 176(define-key menu-bar-file-menu [kill-buffer]
7f315c7c
EZ
177 '(menu-item "Close (current buffer)" kill-this-buffer
178 :enable (kill-this-buffer-enabled-p)
ae65cd84 179 :help "Discard current buffer"))
b23b6fec 180(define-key menu-bar-file-menu [insert-file]
7f315c7c
EZ
181 '(menu-item "Insert File..." insert-file
182 :enable (not (window-minibuffer-p
183 (frame-selected-window menu-updating-frame)))
184 :help "Insert another file into current buffer"))
b23b6fec 185(define-key menu-bar-file-menu [dired]
7f315c7c
EZ
186 '(menu-item "Open Directory..." dired
187 :help "Read a directory, operate on its files"))
b23b6fec 188(define-key menu-bar-file-menu [open-file]
46bfc73b 189 '(menu-item "Open File..." find-file-existing
7f315c7c
EZ
190 :enable (not (window-minibuffer-p
191 (frame-selected-window menu-updating-frame)))
46bfc73b 192 :help "Read an existing file into an Emacs buffer"))
b23b6fec 193(define-key menu-bar-file-menu [new-file]
46bfc73b
JD
194 '(menu-item "New File..." find-file
195 :enable (not (window-minibuffer-p
196 (frame-selected-window menu-updating-frame)))
197 :help "Read or create a file and edit it"))
7f315c7c 198
9bb8e471 199\f
7f315c7c 200;; The "Edit" menu items
bac6e4e2
KS
201
202;; The "Edit->Search" submenu
203(defvar menu-bar-last-search-type nil
204 "Type of last non-incremental search command called from the menu.")
205
206(defun nonincremental-repeat-search-forward ()
207 "Search forward for the previous search string or regexp."
208 (interactive)
209 (cond
210 ((and (eq menu-bar-last-search-type 'string)
211 search-ring)
212 (search-forward (car search-ring)))
213 ((and (eq menu-bar-last-search-type 'regexp)
214 regexp-search-ring)
215 (re-search-forward (car regexp-search-ring)))
216 (t
217 (error "No previous search"))))
218
219(defun nonincremental-repeat-search-backward ()
220 "Search backward for the previous search string or regexp."
221 (interactive)
222 (cond
223 ((and (eq menu-bar-last-search-type 'string)
224 search-ring)
225 (search-backward (car search-ring)))
226 ((and (eq menu-bar-last-search-type 'regexp)
227 regexp-search-ring)
228 (re-search-backward (car regexp-search-ring)))
229 (t
230 (error "No previous search"))))
231
ffbdd83d
RS
232(defun nonincremental-search-forward (string)
233 "Read a string and search for it nonincrementally."
234 (interactive "sSearch for string: ")
bac6e4e2 235 (setq menu-bar-last-search-type 'string)
ffbdd83d
RS
236 (if (equal string "")
237 (search-forward (car search-ring))
238 (isearch-update-ring string nil)
239 (search-forward string)))
240
241(defun nonincremental-search-backward (string)
242 "Read a string and search backward for it nonincrementally."
243 (interactive "sSearch for string: ")
bac6e4e2 244 (setq menu-bar-last-search-type 'string)
ffbdd83d
RS
245 (if (equal string "")
246 (search-backward (car search-ring))
247 (isearch-update-ring string nil)
248 (search-backward string)))
249
250(defun nonincremental-re-search-forward (string)
251 "Read a regular expression and search for it nonincrementally."
252 (interactive "sSearch for regexp: ")
bac6e4e2 253 (setq menu-bar-last-search-type 'regexp)
ffbdd83d
RS
254 (if (equal string "")
255 (re-search-forward (car regexp-search-ring))
256 (isearch-update-ring string t)
257 (re-search-forward string)))
258
259(defun nonincremental-re-search-backward (string)
260 "Read a regular expression and search backward for it nonincrementally."
261 (interactive "sSearch for regexp: ")
bac6e4e2 262 (setq menu-bar-last-search-type 'regexp)
ffbdd83d
RS
263 (if (equal string "")
264 (re-search-backward (car regexp-search-ring))
265 (isearch-update-ring string t)
266 (re-search-backward string)))
267
bac6e4e2 268(defvar menu-bar-search-menu (make-sparse-keymap "Search"))
ffbdd83d 269
bac6e4e2
KS
270;; The Edit->Search->Incremental Search menu
271(defvar menu-bar-i-search-menu
272 (make-sparse-keymap "Incremental Search"))
273
274(define-key menu-bar-i-search-menu [isearch-backward-regexp]
275 '(menu-item "Backward Regexp..." isearch-backward-regexp
276 :help "Search backwards for a regular expression as you type it"))
277(define-key menu-bar-i-search-menu [isearch-forward-regexp]
278 '(menu-item "Forward Regexp..." isearch-forward-regexp
279 :help "Search forward for a regular expression as you type it"))
280(define-key menu-bar-i-search-menu [isearch-backward]
281 '(menu-item "Backward String..." isearch-backward
282 :help "Search backwards for a string as you type it"))
283(define-key menu-bar-i-search-menu [isearch-forward]
284 '(menu-item "Forward String..." isearch-forward
285 :help "Search forward for a string as you type it"))
ffbdd83d 286
7f315c7c 287
bac6e4e2
KS
288(define-key menu-bar-search-menu [i-search]
289 (list 'menu-item "Incremental Search" menu-bar-i-search-menu
e2bd460a 290 :help "Incremental Search finds partial matches while you type the search string.\nIt is most convenient from the keyboard. Try it!"))
bac6e4e2 291(define-key menu-bar-search-menu [separator-tag-isearch]
7f315c7c
EZ
292 '(menu-item "--"))
293
bac6e4e2
KS
294(define-key menu-bar-search-menu [tags-continue]
295 '(menu-item "Continue Tags Search" tags-loop-continue
296 :help "Continue last tags search operation"))
297(define-key menu-bar-search-menu [tags-srch]
298 '(menu-item "Search tagged files" tags-search
299 :help "Search for a regexp in all tagged files"))
300(define-key menu-bar-search-menu [separator-tag-search]
bc6f3791 301 '(menu-item "--"))
ffbdd83d 302
fe74180c 303(define-key menu-bar-search-menu [repeat-search-back]
7f315c7c 304 '(menu-item "Repeat Backwards" nonincremental-repeat-search-backward
bac6e4e2
KS
305 :enable (or (and (eq menu-bar-last-search-type 'string)
306 search-ring)
307 (and (eq menu-bar-last-search-type 'regexp)
308 regexp-search-ring))
7f315c7c 309 :help "Repeat last search backwards"))
fe74180c 310(define-key menu-bar-search-menu [repeat-search-fwd]
bac6e4e2
KS
311 '(menu-item "Repeat Forward" nonincremental-repeat-search-forward
312 :enable (or (and (eq menu-bar-last-search-type 'string)
313 search-ring)
314 (and (eq menu-bar-last-search-type 'regexp)
315 regexp-search-ring))
7f315c7c 316 :help "Repeat last search forward"))
bac6e4e2
KS
317(define-key menu-bar-search-menu [separator-repeat-search]
318 '(menu-item "--"))
319
320(define-key menu-bar-search-menu [re-search-backward]
321 '(menu-item "Regexp Backwards..." nonincremental-re-search-backward
322 :help "Search backwards for a regular expression"))
323(define-key menu-bar-search-menu [re-search-forward]
324 '(menu-item "Regexp Forward..." nonincremental-re-search-forward
325 :help "Search forward for a regular expression"))
326
fe74180c 327(define-key menu-bar-search-menu [search-backward]
bac6e4e2 328 '(menu-item "String Backwards..." nonincremental-search-backward
7f315c7c 329 :help "Search backwards for a string"))
fe74180c 330(define-key menu-bar-search-menu [search-forward]
bac6e4e2 331 '(menu-item "String Forward..." nonincremental-search-forward
7f315c7c 332 :help "Search forward for a string"))
9bb8e471 333
bac6e4e2
KS
334;; The Edit->Replace submenu
335
336(defvar menu-bar-replace-menu (make-sparse-keymap "Replace"))
337
338(define-key menu-bar-replace-menu [tags-repl-continue]
339 '(menu-item "Continue Replace" tags-loop-continue
340 :help "Continue last tags replace operation"))
341(define-key menu-bar-replace-menu [tags-repl]
342 '(menu-item "Replace in tagged files" tags-query-replace
343 :help "Interactively replace a regexp in all tagged files"))
344(define-key menu-bar-replace-menu [separator-replace-tags]
345 '(menu-item "--"))
346
347(define-key menu-bar-replace-menu [query-replace-regexp]
348 '(menu-item "Replace Regexp..." query-replace-regexp
349 :enable (not buffer-read-only)
350 :help "Replace regular expression interactively, ask about each occurrence"))
351(define-key menu-bar-replace-menu [query-replace]
352 '(menu-item "Replace String..." query-replace
353 :enable (not buffer-read-only)
354 :help "Replace string interactively, ask about each occurrence"))
355
7f315c7c
EZ
356;;; Assemble the top-level Edit menu items.
357(define-key menu-bar-edit-menu [props]
358 '(menu-item "Text Properties" facemenu-menu
359 :help "Change properties of text in region"))
3dd92899 360
2eef02ab
EZ
361(define-key menu-bar-edit-menu [fill]
362 '(menu-item "Fill" fill-region
363 :enable (and mark-active (not buffer-read-only))
364 :help
365 "Fill text in region to fit between left and right margin"))
366
367(define-key menu-bar-edit-menu [separator-bookmark]
7f315c7c
EZ
368 '(menu-item "--"))
369
370(define-key menu-bar-edit-menu [bookmark]
371 '(menu-item "Bookmarks" menu-bar-bookmark-map
372 :help "Record positions and jump between them"))
373
7f315c7c
EZ
374(defvar menu-bar-goto-menu (make-sparse-keymap "Go To"))
375
376(define-key menu-bar-goto-menu [set-tags-name]
377 '(menu-item "Set Tags File Name" visit-tags-table
378 :help "Tell Tags commands which tag table file to use"))
379
380(define-key menu-bar-goto-menu [separator-tag-file]
381 '(menu-item "--"))
382
383(define-key menu-bar-goto-menu [apropos-tags]
384 '(menu-item "Tags Apropos" tags-apropos
385 :help "Find function/variables whose names match regexp"))
386(define-key menu-bar-goto-menu [next-tag-otherw]
387 '(menu-item "Next Tag in Other Window"
277e0f9d 388 menu-bar-next-tag-other-window
0ae27881
EZ
389 :enable (and (boundp 'tags-location-ring)
390 (not (ring-empty-p tags-location-ring)))
7f315c7c 391 :help "Find next function/variable matching last tag name in another window"))
277e0f9d
RS
392
393(defun menu-bar-next-tag-other-window ()
394 "Find the next definition of the tag already specified."
395 (interactive)
396 (find-tag-other-window nil t))
397
398(defun menu-bar-next-tag ()
399 "Find the next definition of the tag already specified."
400 (interactive)
401 (find-tag nil t))
402
7f315c7c
EZ
403(define-key menu-bar-goto-menu [next-tag]
404 '(menu-item "Find Next Tag"
277e0f9d 405 menu-bar-next-tag
0ae27881
EZ
406 :enable (and (boundp 'tags-location-ring)
407 (not (ring-empty-p tags-location-ring)))
7f315c7c
EZ
408 :help "Find next function/variable matching last tag name"))
409(define-key menu-bar-goto-menu [find-tag-otherw]
410 '(menu-item "Find Tag in Other Window..." find-tag-other-window
411 :help "Find function/variable definition in another window"))
412(define-key menu-bar-goto-menu [find-tag]
413 '(menu-item "Find Tag..." find-tag
414 :help "Find definition of function or variable"))
415
416(define-key menu-bar-goto-menu [separator-tags]
417 '(menu-item "--"))
418
419(define-key menu-bar-goto-menu [end-of-buf]
420 '(menu-item "Goto End of Buffer" end-of-buffer))
421(define-key menu-bar-goto-menu [beg-of-buf]
422 '(menu-item "Goto Beginning of Buffer" beginning-of-buffer))
423(define-key menu-bar-goto-menu [go-to-pos]
424 '(menu-item "Goto Buffer Position..." goto-char
425 :help "Read a number N and go to buffer position N"))
426(define-key menu-bar-goto-menu [go-to-line]
427 '(menu-item "Goto Line..." goto-line
428 :help "Read a line number and go to that line"))
429
430(define-key menu-bar-edit-menu [goto]
431 (list 'menu-item "Go To" menu-bar-goto-menu))
432
bac6e4e2
KS
433(define-key menu-bar-edit-menu [replace]
434 (list 'menu-item "Replace" menu-bar-replace-menu))
435
7f315c7c
EZ
436(define-key menu-bar-edit-menu [search]
437 (list 'menu-item "Search" menu-bar-search-menu))
438
2eef02ab
EZ
439(define-key menu-bar-edit-menu [separator-search]
440 '(menu-item "--"))
441
496b7491
EZ
442(define-key menu-bar-edit-menu [mark-whole-buffer]
443 '(menu-item "Select All" mark-whole-buffer
444 :help "Mark the whole buffer for a subsequent cut/copy."))
7f315c7c
EZ
445(define-key menu-bar-edit-menu [clear]
446 '(menu-item "Clear" delete-region
447 :enable (and mark-active
448 (not buffer-read-only)
449 (not (mouse-region-match)))
450 :help
ae65cd84 451 "Delete the text in region between mark and current position"))
3dd92899
KH
452(defvar yank-menu (cons "Select Yank" nil))
453(fset 'yank-menu (cons 'keymap yank-menu))
7f315c7c
EZ
454(define-key menu-bar-edit-menu [select-paste]
455 '(menu-item "Select and Paste" yank-menu
456 :enable (and (cdr yank-menu) (not buffer-read-only))
19bd58e8 457 :help "Paste (yank) text cut or copied earlier"))
7f315c7c
EZ
458(define-key menu-bar-edit-menu [paste]
459 '(menu-item "Paste" yank
721c26b8
EZ
460 :enable (and
461 ;; Emacs compiled --without-x doesn't have
462 ;; x-selection-exists-p.
463 (fboundp 'x-selection-exists-p)
464 (x-selection-exists-p) (not buffer-read-only))
19bd58e8 465 :help "Paste (yank) text most recently cut/copied"))
7f315c7c
EZ
466(define-key menu-bar-edit-menu [copy]
467 '(menu-item "Copy" menu-bar-kill-ring-save
468 :enable mark-active
84932bf6
SM
469 :help "Copy text in region between mark and current position"
470 :keys "\\[kill-ring-save]"))
7f315c7c
EZ
471(define-key menu-bar-edit-menu [cut]
472 '(menu-item "Cut" kill-region
473 :enable (and mark-active (not buffer-read-only))
ae65cd84
DL
474 :help
475 "Cut (kill) text in region between mark and current position"))
7f315c7c
EZ
476(define-key menu-bar-edit-menu [undo]
477 '(menu-item "Undo" undo
478 :enable (and (not buffer-read-only)
479 (not (eq t buffer-undo-list))
480 (if (eq last-command 'undo)
481 pending-undo-list
482 (consp buffer-undo-list)))
483 :help "Undo last operation"))
484
057d49d1 485
4c0317b1
RS
486(defun menu-bar-kill-ring-save (beg end)
487 (interactive "r")
488 (if (mouse-region-match)
b1a4cc61 489 (message "Selecting a region with the mouse does `copy' automatically")
4c0317b1
RS
490 (kill-ring-save beg end)))
491
f9cf0be2 492;; These are alternative definitions for the cut, paste and copy
4c0317b1 493;; menu items. Use them if your system expects these to use the clipboard.
f9cf0be2 494
f9cf0be2
RS
495(put 'clipboard-kill-region 'menu-enable 'mark-active)
496(put 'clipboard-kill-ring-save 'menu-enable 'mark-active)
497(put 'clipboard-yank 'menu-enable
721c26b8
EZ
498 '(or (and (fboundp 'x-selection-exists-p) (x-selection-exists-p))
499 (x-selection-exists-p 'CLIPBOARD)))
f9cf0be2
RS
500
501(defun clipboard-yank ()
ee497664 502 "Insert the clipboard contents, or the last stretch of killed text."
f9cf0be2
RS
503 (interactive)
504 (let ((x-select-enable-clipboard t))
505 (yank)))
506
507(defun clipboard-kill-ring-save (beg end)
508 "Copy region to kill ring, and save in the X clipboard."
509 (interactive "r")
510 (let ((x-select-enable-clipboard t))
511 (kill-ring-save beg end)))
512
513(defun clipboard-kill-region (beg end)
514 "Kill the region, and save it in the X clipboard."
515 (interactive "r")
516 (let ((x-select-enable-clipboard t))
517 (kill-region beg end)))
518
519(defun menu-bar-enable-clipboard ()
5cbdeb30
RS
520 "Make CUT, PASTE and COPY (keys and menu bar items) use the clipboard.
521Do the same for the keys of the same name."
f9cf0be2 522 (interactive)
5754d7f2
RS
523 ;; We can't use constant list structure here because it becomes pure,
524 ;; and because it gets modified with cache data.
525 (define-key menu-bar-edit-menu [paste]
7f315c7c 526 (cons "Paste" (cons "Paste text from clipboard" 'clipboard-yank)))
5754d7f2 527 (define-key menu-bar-edit-menu [copy]
7f315c7c
EZ
528 (cons "Copy" (cons "Copy text in region to the clipboard"
529 'clipboard-kill-ring-save)))
5754d7f2 530 (define-key menu-bar-edit-menu [cut]
7f315c7c
EZ
531 (cons "Cut" (cons "Delete text in region and copy it to the clipboard"
532 'clipboard-kill-region)))
5cbdeb30 533
e3fa3057
DL
534 ;; These are Sun server keysyms for the Cut, Copy and Paste keys
535 ;; (also for XFree86 on Sun keyboard):
5cbdeb30
RS
536 (define-key global-map [f20] 'clipboard-kill-region)
537 (define-key global-map [f16] 'clipboard-kill-ring-save)
538 (define-key global-map [f18] 'clipboard-yank)
e3fa3057 539 ;; X11R6 versions:
5cbdeb30
RS
540 (define-key global-map [cut] 'clipboard-kill-region)
541 (define-key global-map [copy] 'clipboard-kill-ring-save)
542 (define-key global-map [paste] 'clipboard-yank))
f9cf0be2 543\f
7f315c7c 544;; The "Options" menu items
a9f53ffb
RS
545
546(defvar menu-bar-custom-menu (make-sparse-keymap "Customize"))
547
b0f661de 548(define-key menu-bar-custom-menu [customize-apropos-groups]
7f315c7c
EZ
549 '(menu-item "Groups Matching Regexp..." customize-apropos-groups
550 :help "Browse groups whose names match regexp"))
b0f661de 551(define-key menu-bar-custom-menu [customize-apropos-faces]
7f315c7c
EZ
552 '(menu-item "Faces Matching Regexp..." customize-apropos-faces
553 :help "Browse faces whose names match regexp"))
b0f661de 554(define-key menu-bar-custom-menu [customize-apropos-options]
7f315c7c
EZ
555 '(menu-item "Options Matching Regexp..." customize-apropos-options
556 :help "Browse options whose names match regexp"))
a9f53ffb 557(define-key menu-bar-custom-menu [customize-apropos]
7f315c7c
EZ
558 '(menu-item "Settings Matching Regexp..." customize-apropos
559 :help "Browse customizable settings whose names match regexp"))
6e0fbd65 560(define-key menu-bar-custom-menu [separator-1]
b0f661de 561 '("--"))
c9a86e71 562(define-key menu-bar-custom-menu [customize-group]
7f315c7c
EZ
563 '(menu-item "Specific Group..." customize-group
564 :help "Customize settings of specific group"))
a9f53ffb 565(define-key menu-bar-custom-menu [customize-face]
7f315c7c
EZ
566 '(menu-item "Specific Face..." customize-face
567 :help "Customize attributes of specific face"))
b0f661de 568(define-key menu-bar-custom-menu [customize-option]
7f315c7c 569 '(menu-item "Specific Option..." customize-option
6e0fbd65
KS
570 :help "Customize value of specific option"))
571(define-key menu-bar-custom-menu [separator-2]
572 '("--"))
6fe9c658 573(define-key menu-bar-custom-menu [customize-changed-options]
6e0fbd65
KS
574 '(menu-item "New Options..." customize-changed-options
575 :help "Options added or changed in recent Emacs versions"))
576(define-key menu-bar-custom-menu [customize-saved]
577 '(menu-item "Saved Options" customize-saved
578 :help "Customize previously saved options"))
b0f661de
RS
579(define-key menu-bar-custom-menu [separator-3]
580 '("--"))
e6354b3e 581(define-key menu-bar-custom-menu [customize-browse]
7f315c7c
EZ
582 '(menu-item "Browse Customization Groups" customize-browse
583 :help "Browse all customization groups"))
b0f661de 584(define-key menu-bar-custom-menu [customize]
7f315c7c
EZ
585 '(menu-item "Top-level Customization Group" customize
586 :help "The master group called `Emacs'"))
a9f53ffb 587
7f315c7c 588;(defvar menu-bar-preferences-menu (make-sparse-keymap "Preferences"))
bacb2d12 589
09bfa5ca
SM
590(defmacro menu-bar-make-mm-toggle (fname doc help &optional props)
591 "Make a menu-item for a global minor mode toggle.
592FNAME is the minor mode's name (variable and function).
7faa9d02 593DOC is the text to use for the menu entry.
09bfa5ca
SM
594HELP is the text to use for the tooltip.
595PROPS are additional properties."
72c0e394 596 `'(menu-item ,doc ,fname
09bfa5ca
SM
597 ,@(if props props)
598 :help ,help
599 :button (:toggle . (and (default-boundp ',fname)
600 (default-value ',fname)))))
601
a9d96061 602(defmacro menu-bar-make-toggle (name variable doc message help &rest body)
bacb2d12 603 `(progn
da67fa9a 604 (defun ,name (&optional interactively)
e8dd28e7 605 ,(concat "Toggle whether to " (downcase (substring help 0 1))
da67fa9a
RS
606 (substring help 1) ".\
607In an interactive call, record this option as a candidate for saving
608by \"Save Options\" in Custom buffers.")
609 (interactive "p")
bacb2d12 610 (if ,(if body `(progn . ,body)
bc6f3791 611 `(progn
4f9b9060
PA
612 (custom-load-symbol ',variable)
613 (let ((set (or (get ',variable 'custom-set) 'set-default))
614 (get (or (get ',variable 'custom-get) 'default-value)))
615 (funcall set ',variable (not (funcall get ',variable))))))
616 (message ,message "enabled")
a9d96061
SM
617 (message ,message "disabled"))
618 ;; The function `customize-mark-as-set' must only be called when
619 ;; a variable is set interactively, as the purpose is to mark it as
620 ;; a candidate for "Save Options", and we do not want to save options
621 ;; the user have already set explicitly in his init file.
da67fa9a 622 (if interactively (customize-mark-as-set ',variable)))
a9d96061 623 '(menu-item ,doc ,name
7f315c7c 624 :help ,help
4f9b9060
PA
625 :button (:toggle . (and (default-boundp ',variable)
626 (default-value ',variable))))))
7f315c7c
EZ
627
628;;; Assemble all the top-level items of the "Options" menu
629(define-key menu-bar-options-menu [customize]
630 (list 'menu-item "Customize Emacs" menu-bar-custom-menu
631 :help "Full customization of every Emacs feature"))
10013d74
DL
632
633(defun menu-bar-options-save ()
634 "Save current values of Options menu items using Custom."
635 (interactive)
414fd702 636 (let ((need-save nil))
5373d675
RS
637 ;; These are set with menu-bar-make-mm-toggle, which does not
638 ;; put on a customized-value property.
639 (dolist (elt '(line-number-mode column-number-mode cua-mode show-paren-mode
7faa9d02
LT
640 transient-mark-mode global-font-lock-mode
641 blink-cursor-mode))
5373d675
RS
642 (and (customize-mark-to-save elt)
643 (setq need-save t)))
4f9b9060 644 ;; These are set with `customize-set-variable'.
5373d675 645 (dolist (elt '(scroll-bar-mode
4f9b9060 646 debug-on-quit debug-on-error menu-bar-mode tool-bar-mode
8cfa1cd5 647 save-place uniquify-buffer-name-style fringe-mode
f7481749 648 fringe-indicators case-fold-search
4f9b9060 649 display-time-mode auto-compression-mode
f4990970 650 current-language-environment default-input-method
4f9b9060
PA
651 ;; Saving `text-mode-hook' is somewhat questionable,
652 ;; as we might get more than we bargain for, if
653 ;; other code may has added hooks as well.
654 ;; Nonetheless, not saving it would like be confuse
655 ;; more often.
656 ;; -- Per Abrahamsen <abraham@dina.kvl.dk> 2002-02-11.
657 text-mode-hook))
658 (and (get elt 'customized-value)
659 (customize-mark-to-save elt)
660 (setq need-save t)))
414fd702
PA
661 ;; Save if we changed anything.
662 (when need-save
663 (custom-save-all))))
10013d74
DL
664
665(define-key menu-bar-options-menu [save]
48c9f054 666 '(menu-item "Save Options" menu-bar-options-save
10013d74
DL
667 :help "Save options set from the menu above"))
668
669(define-key menu-bar-options-menu [custom-separator]
670 '("--"))
671
3f9f1c1f
RS
672(define-key menu-bar-options-menu [mouse-set-font]
673 '(menu-item "Set Font/Fontset" mouse-set-font
674 :visible (display-multi-font-p)
675 :help "Select a font from list of known fonts/fontsets"))
676
c2ca4bab
PJ
677;; The "Show/Hide" submenu of menu "Options"
678
679(defvar menu-bar-showhide-menu (make-sparse-keymap "Show/Hide"))
40189bd6 680
d0e1c755 681(define-key menu-bar-showhide-menu [column-number-mode]
a9d96061 682 (menu-bar-make-mm-toggle column-number-mode
e3fa3057 683 "Column Numbers"
a9d96061 684 "Show the current column number in the mode line"))
d0e1c755
PJ
685
686(define-key menu-bar-showhide-menu [line-number-mode]
a9d96061 687 (menu-bar-make-mm-toggle line-number-mode
e3fa3057 688 "Line Numbers"
a9d96061 689 "Show the current line number in the mode line"))
d0e1c755
PJ
690
691(define-key menu-bar-showhide-menu [linecolumn-separator]
692 '("--"))
693
40189bd6
PJ
694(defun showhide-date-time ()
695 "Toggle whether to show date and time in the mode-line."
696 (interactive)
697 (if (display-time-mode)
698 (message "Display-time mode enabled.")
277e0f9d
RS
699 (message "Display-time mode disabled."))
700 (customize-mark-as-set 'display-time-mode))
40189bd6
PJ
701
702(define-key menu-bar-showhide-menu [showhide-date-time]
e3fa3057
DL
703 '(menu-item "Date, Time and Mail" showhide-date-time
704 :help "Display date, time, mail status in mode line"
40189bd6
PJ
705 :button (:toggle . display-time-mode)))
706
707(define-key menu-bar-showhide-menu [datetime-separator]
708 '("--"))
709
a9c6d330
PA
710(define-key menu-bar-showhide-menu [showhide-speedbar]
711 '(menu-item "Speedbar" speedbar-frame-mode
5f7b6438 712 :help "Display a Speedbar quick-navigation frame"
a9c6d330
PA
713 :button (:toggle
714 . (and (boundp 'speedbar-frame)
715 (frame-live-p (symbol-value 'speedbar-frame))
bc6f3791 716 (frame-visible-p
a9c6d330
PA
717 (symbol-value 'speedbar-frame))))))
718
f7481749
KS
719
720(defvar menu-bar-showhide-fringe-ind-menu (make-sparse-keymap "Indicators"))
721
722;; The real definition is in fringe.el.
723;; This is to prevent errors in the :radio conditions below.
724(setq fringe-indicators nil)
725
726(defun menu-bar-showhide-fringe-ind-empty ()
727 "Display empty line indicators in the left or right fringe."
728 (interactive)
729 (require 'fringe)
730 (customize-set-variable 'fringe-indicators 'empty))
731
732(define-key menu-bar-showhide-fringe-ind-menu [empty]
733 '(menu-item "Empty lines only" menu-bar-showhide-fringe-ind-empty
734 :help "Show empty line indicators in fringe"
735 :visible (display-graphic-p)
736 :button (:radio . (eq fringe-indicators 'empty))))
737
738(defun menu-bar-showhide-fringe-ind-mixed ()
739 "Display top and bottom indicators in opposite fringes, arrow in right."
740 (interactive)
741 (require 'fringe)
742 (customize-set-variable 'fringe-indicators 'mixed))
743
744(define-key menu-bar-showhide-fringe-ind-menu [mixed]
745 '(menu-item "Opposite, arrows right" menu-bar-showhide-fringe-ind-mixed
746 :help "Show top/bottom indicators in opposite fringes, arrows in right"
747 :visible (display-graphic-p)
748 :button (:radio . (eq fringe-indicators 'mixed))))
749
750(defun menu-bar-showhide-fringe-ind-box ()
751 "Display top and bottom indicators in opposite fringes."
752 (interactive)
753 (require 'fringe)
754 (customize-set-variable 'fringe-indicators 'box))
755
756(define-key menu-bar-showhide-fringe-ind-menu [box]
757 '(menu-item "Opposite, no arrows" menu-bar-showhide-fringe-ind-box
758 :help "Show top/bottom indicators in opposite fringes, no arrows"
759 :visible (display-graphic-p)
760 :button (:radio . (eq fringe-indicators 'box))))
761
762(defun menu-bar-showhide-fringe-ind-right ()
763 "Display fringe indicators in the right fringe."
764 (interactive)
765 (require 'fringe)
766 (customize-set-variable 'fringe-indicators 'right))
767
768(define-key menu-bar-showhide-fringe-ind-menu [right]
769 '(menu-item "In right fringe" menu-bar-showhide-fringe-ind-right
770 :help "Show indicators in right fringe"
771 :visible (display-graphic-p)
772 :button (:radio . (eq fringe-indicators 'right))))
773
774(defun menu-bar-showhide-fringe-ind-left ()
775 "Display fringe indicators in the left fringe."
776 (interactive)
777 (require 'fringe)
778 (customize-set-variable 'fringe-indicators 'left))
779
780(define-key menu-bar-showhide-fringe-ind-menu [left]
781 '(menu-item "In left fringe" menu-bar-showhide-fringe-ind-left
782 :help "Show indicators in left fringe"
783 :visible (display-graphic-p)
784 :button (:radio . (eq fringe-indicators 'left))))
785
786(defun menu-bar-showhide-fringe-ind-none ()
787 "Do not display any fringe indicators."
788 (interactive)
789 (require 'fringe)
790 (customize-set-variable 'fringe-indicators nil))
791
792(define-key menu-bar-showhide-fringe-ind-menu [none]
793 '(menu-item "No indicators" menu-bar-showhide-fringe-ind-none
794 :help "Hide all fringe indicators"
795 :visible (display-graphic-p)
796 :button (:radio . (eq fringe-indicators nil))))
797
798
799
af5090c2 800(defvar menu-bar-showhide-fringe-menu (make-sparse-keymap "Fringe"))
8cfa1cd5
SJ
801
802(defun menu-bar-showhide-fringe-menu-customize ()
803 "Show customization buffer for `fringe-mode'."
804 (interactive)
805 (customize-variable 'fringe-mode))
806
807(define-key menu-bar-showhide-fringe-menu [customize]
808 '(menu-item "Customize" menu-bar-showhide-fringe-menu-customize
809 :help "Detailed customization of fringe"
810 :visible (display-graphic-p)))
811
812(defun menu-bar-showhide-fringe-menu-customize-reset ()
277e0f9d 813 "Reset the fringe mode: display fringes on both sides of a window."
8cfa1cd5
SJ
814 (interactive)
815 (customize-set-variable 'fringe-mode nil))
816
f7481749
KS
817(define-key menu-bar-showhide-fringe-menu [showhide-fringe-ind]
818 (list 'menu-item "Indicators" menu-bar-showhide-fringe-ind-menu
819 :visible `(display-graphic-p)
820 :help "Select fringe mode"))
821
13ef5524
RS
822;; The real definition is in fringe.el.
823;; This is to prevent errors in the :radio conditions below.
824(setq fringe-mode nil)
825
8cfa1cd5
SJ
826(define-key menu-bar-showhide-fringe-menu [default]
827 '(menu-item "Default" menu-bar-showhide-fringe-menu-customize-reset
828 :help "Default width fringe on both left and right side"
829 :visible (display-graphic-p)
277e0f9d 830 :button (:radio . (eq fringe-mode nil))))
8cfa1cd5
SJ
831
832(defun menu-bar-showhide-fringe-menu-customize-left ()
277e0f9d 833 "Display fringes only on the left of each window."
8cfa1cd5 834 (interactive)
00cb70dc
MB
835 (require 'fringe)
836 (customize-set-variable 'fringe-mode '(nil . 0)))
8cfa1cd5
SJ
837
838(define-key menu-bar-showhide-fringe-menu [left]
839 '(menu-item "On the Left" menu-bar-showhide-fringe-menu-customize-left
840 :help "Fringe only on the left side"
841 :visible (display-graphic-p)
277e0f9d 842 :button (:radio . (equal fringe-mode '(nil . 0)))))
8cfa1cd5
SJ
843
844(defun menu-bar-showhide-fringe-menu-customize-right ()
277e0f9d 845 "Display fringes only on the right of each window."
8cfa1cd5 846 (interactive)
00cb70dc
MB
847 (require 'fringe)
848 (customize-set-variable 'fringe-mode '(0 . nil)))
8cfa1cd5
SJ
849
850(define-key menu-bar-showhide-fringe-menu [right]
851 '(menu-item "On the Right" menu-bar-showhide-fringe-menu-customize-right
852 :help "Fringe only on the right side"
853 :visible (display-graphic-p)
277e0f9d 854 :button (:radio . (equal fringe-mode '(0 . nil)))))
8cfa1cd5
SJ
855
856(defun menu-bar-showhide-fringe-menu-customize-disable ()
277e0f9d 857 "Do not display window fringes."
8cfa1cd5 858 (interactive)
00cb70dc
MB
859 (require 'fringe)
860 (customize-set-variable 'fringe-mode 0))
8cfa1cd5
SJ
861
862(define-key menu-bar-showhide-fringe-menu [none]
863 '(menu-item "None" menu-bar-showhide-fringe-menu-customize-disable
864 :help "Turn off fringe"
865 :visible (display-graphic-p)
277e0f9d 866 :button (:radio . (eq fringe-mode 0))))
8cfa1cd5
SJ
867
868(define-key menu-bar-showhide-menu [showhide-fringe]
869 (list 'menu-item "Fringe" menu-bar-showhide-fringe-menu
870 :visible `(display-graphic-p)
871 :help "Select fringe mode"))
872
c2ca4bab
PJ
873(defvar menu-bar-showhide-scroll-bar-menu (make-sparse-keymap "Scroll-bar"))
874
c2ca4bab 875(define-key menu-bar-showhide-scroll-bar-menu [right]
bc6f3791 876 '(menu-item "On the Right"
277e0f9d 877 menu-bar-right-scroll-bar
c2ca4bab 878 :help "Scroll-bar on the right side"
5f7b6438 879 :visible (display-graphic-p)
4f9b9060
PA
880 :button (:radio . (eq (cdr (assq 'vertical-scroll-bars
881 (frame-parameters))) 'right))))
277e0f9d
RS
882(defun menu-bar-right-scroll-bar ()
883 "Display scroll bars on the right of each window."
884 (interactive)
885 (customize-set-variable 'scroll-bar-mode 'right))
c2ca4bab
PJ
886
887(define-key menu-bar-showhide-scroll-bar-menu [left]
bc6f3791 888 '(menu-item "On the Left"
277e0f9d 889 menu-bar-left-scroll-bar
c2ca4bab 890 :help "Scroll-bar on the left side"
5f7b6438 891 :visible (display-graphic-p)
4f9b9060
PA
892 :button (:radio . (eq (cdr (assq 'vertical-scroll-bars
893 (frame-parameters))) 'left))))
c2ca4bab 894
277e0f9d
RS
895(defun menu-bar-left-scroll-bar ()
896 "Display scroll bars on the left of each window."
897 (interactive)
0e5ddee1 898 (customize-set-variable 'scroll-bar-mode 'left))
277e0f9d 899
c2ca4bab 900(define-key menu-bar-showhide-scroll-bar-menu [none]
bc6f3791 901 '(menu-item "None"
277e0f9d 902 menu-bar-no-scroll-bar
c2ca4bab 903 :help "Turn off scroll-bar"
5f7b6438 904 :visible (display-graphic-p)
4f9b9060
PA
905 :button (:radio . (eq (cdr (assq 'vertical-scroll-bars
906 (frame-parameters))) nil))))
c2ca4bab 907
277e0f9d
RS
908(defun menu-bar-no-scroll-bar ()
909 "Turn off scroll bars."
910 (interactive)
911 (customize-set-variable 'scroll-bar-mode nil))
912
c2ca4bab 913(define-key menu-bar-showhide-menu [showhide-scroll-bar]
bc6f3791 914 (list 'menu-item "Scroll-bar" menu-bar-showhide-scroll-bar-menu
5f7b6438 915 :visible `(display-graphic-p)
c2ca4bab
PJ
916 :help "Select scroll-bar mode"))
917
09bfa5ca
SM
918(define-key menu-bar-showhide-menu [menu-bar-mode]
919 '(menu-item "Menu-bar" menu-bar-mode
c2ca4bab
PJ
920 :help "Toggle menu-bar on/off"
921 :button (:toggle . menu-bar-mode)))
922
c2ca4bab 923(define-key menu-bar-showhide-menu [showhide-tool-bar]
09bfa5ca 924 (list 'menu-item "Tool-bar" 'tool-bar-mode
5f7b6438
EZ
925 :help "Turn tool-bar on/off"
926 :visible `(display-graphic-p)
927 :button `(:toggle . tool-bar-mode)))
c2ca4bab
PJ
928
929(define-key menu-bar-options-menu [showhide]
930 (list 'menu-item "Show/Hide" menu-bar-showhide-menu
931 :help "Toggle on/off various display features"))
932
933(define-key menu-bar-options-menu [showhide-separator]
934 '("--"))
935
7f315c7c
EZ
936(define-key menu-bar-options-menu [mule]
937 ;; It is better not to use backquote here,
938 ;; because that makes a bootstrapping problem
939 ;; if you need to recompile all the Lisp files using interpreted code.
940 (list 'menu-item "Mule (Multilingual Environment)" mule-menu-keymap
506c6d61
DL
941;; Most of the MULE menu actually does make sense in unibyte mode,
942;; e.g. language selection.
943;;; ':visible 'default-enable-multibyte-characters
7f315c7c
EZ
944 ':help "Default language, encodings, input method"))
945;(setq menu-bar-final-items (cons 'mule menu-bar-final-items))
946;(define-key menu-bar-options-menu [preferences]
947; (list 'menu-item "Preferences" menu-bar-preferences-menu
948; :help "Toggle important global options"))
949
950(define-key menu-bar-options-menu [mule-separator]
506c6d61 951 '("--"))
bacb2d12
RS
952
953(define-key menu-bar-options-menu [debug-on-quit]
954 (menu-bar-make-toggle toggle-debug-on-quit debug-on-quit
e8dd28e7 955 "Enter Debugger on Quit/C-g" "Debug on Quit %s"
7f315c7c 956 "Enter Lisp debugger when C-g is pressed"))
bacb2d12
RS
957(define-key menu-bar-options-menu [debug-on-error]
958 (menu-bar-make-toggle toggle-debug-on-error debug-on-error
e8dd28e7
RS
959 "Enter Debugger on Error" "Debug on Error %s"
960 "Enter Lisp debugger when an error is signaled"))
7f315c7c 961(define-key menu-bar-options-menu [debugger-separator]
bacb2d12 962 '("--"))
7faa9d02
LT
963
964(define-key menu-bar-options-menu [blink-cursor-mode]
965 (menu-bar-make-mm-toggle blink-cursor-mode
966 "Blinking Cursor"
967 "Whether the cursor blinks (Blink Cursor mode)"))
968(define-key menu-bar-options-menu [cursor-separator]
969 '("--"))
970
7f315c7c
EZ
971(define-key menu-bar-options-menu [toggle-auto-compression]
972 '(menu-item "Automatic File De/compression"
09bfa5ca 973 auto-compression-mode
4f9b9060
PA
974 :help "Transparently decompress compressed files"
975 :button (:toggle . (rassq 'jka-compr-handler
976 file-name-handler-alist))))
277e0f9d 977
bacb2d12
RS
978(define-key menu-bar-options-menu [save-place]
979 (menu-bar-make-toggle toggle-save-place-globally save-place
89f1709f 980 "Save Place in Files between Sessions"
bacb2d12 981 "Saving place in files %s"
aef1a2e6
KF
982 "Visit files of previous session when restarting Emacs"
983 (require 'saveplace)
984 ;; Do it by name, to avoid a free-variable
985 ;; warning during byte compilation.
986 (set-default
987 'save-place (not (symbol-value 'save-place)))))
4f9b9060 988
bacb2d12
RS
989(define-key menu-bar-options-menu [uniquify]
990 (menu-bar-make-toggle toggle-uniquify-buffer-names uniquify-buffer-name-style
89f1709f 991 "Use Directory Names in Buffer Names"
bacb2d12 992 "Directory name in buffer names (uniquify) %s"
e8dd28e7 993 "Uniquify buffer names by adding parent directory names"
bacb2d12
RS
994 (require 'uniquify)
995 (setq uniquify-buffer-name-style
996 (if (not uniquify-buffer-name-style)
997 'forward))))
4f9b9060 998
7f315c7c
EZ
999(define-key menu-bar-options-menu [edit-options-separator]
1000 '("--"))
06753468 1001(define-key menu-bar-options-menu [cua-mode]
c960446b 1002 (menu-bar-make-mm-toggle cua-mode
4bf6af92 1003 "C-x/C-c/C-v cut and paste (CUA)"
c960446b 1004 "Use C-z/C-x/C-c/C-v keys for undo/cut/copy/paste"))
277e0f9d 1005
3f51f129
RS
1006(define-key menu-bar-options-menu [case-fold-search]
1007 (menu-bar-make-toggle toggle-case-fold-search case-fold-search
7f315c7c
EZ
1008 "Case-Insensitive Search"
1009 "Case-Insensitive Search %s"
e8dd28e7 1010 "Ignore letter-case in search"))
277e0f9d
RS
1011
1012(defun menu-bar-text-mode-auto-fill ()
1013 (interactive)
1014 (toggle-text-mode-auto-fill)
1015 ;; This is somewhat questionable, as `text-mode-hook'
1016 ;; might have changed outside customize.
1017 ;; -- Per Abrahamsen <abraham@dina.kvl.dk> 2002-02-11.
1018 (customize-mark-as-set 'text-mode-hook))
1019
7f315c7c 1020(define-key menu-bar-options-menu [auto-fill-mode]
6b285f60 1021 '(menu-item "Word Wrap in Text Modes"
277e0f9d 1022 menu-bar-text-mode-auto-fill
6b285f60 1023 :help "Automatically fill text between left and right margins (Auto Fill)"
e51c889c
RS
1024 :button (:toggle . (if (listp text-mode-hook)
1025 (member 'turn-on-auto-fill text-mode-hook)
1026 (eq 'turn-on-auto-fill text-mode-hook)))))
43c35fd7 1027(define-key menu-bar-options-menu [truncate-lines]
0ac1c4cf 1028 '(menu-item "Truncate Long Lines in this Buffer"
277e0f9d 1029 toggle-truncate-lines
0ac1c4cf
PA
1030 :help "Truncate long lines on the screen"
1031 :button (:toggle . truncate-lines)))
1032
7f315c7c
EZ
1033(define-key menu-bar-options-menu [highlight-separator]
1034 '("--"))
1035(define-key menu-bar-options-menu [highlight-paren-mode]
09bfa5ca
SM
1036 (menu-bar-make-mm-toggle show-paren-mode
1037 "Paren Match Highlighting"
a9d96061 1038 "Highlight matching/mismatched parentheses at cursor (Show Paren mode)"))
bacb2d12 1039(define-key menu-bar-options-menu [transient-mark-mode]
a9d96061
SM
1040 (menu-bar-make-mm-toggle transient-mark-mode
1041 "Active Region Highlighting"
1042 "Make text in active region stand out in color (Transient Mark mode)"
1043 (:enable (not cua-mode))))
8ad97b87 1044(define-key menu-bar-options-menu [toggle-global-lazy-font-lock-mode]
09bfa5ca
SM
1045 (menu-bar-make-mm-toggle global-font-lock-mode
1046 "Syntax Highlighting"
1047 "Colorize text based on language syntax (Global Font Lock mode)"))
7f315c7c 1048
e5683624 1049\f
7f315c7c
EZ
1050;; The "Tools" menu items
1051
e4ca8f8c
EZ
1052(defun send-mail-item-name ()
1053 (let* ((known-send-mail-commands '((sendmail-user-agent . "sendmail")
1054 (mh-e-user-agent . "MH")
1055 (message-user-agent . "Gnus Message")
1056 (gnus-user-agent . "Gnus")))
1057 (name (assq mail-user-agent known-send-mail-commands)))
1058 (if name
1059 (setq name (cdr name))
1060 (setq name (symbol-name mail-user-agent))
1061 (if (string-match "\\(.+\\)-user-agent" name)
1062 (setq name (match-string 1 name))))
1063 name))
1064
0a1f9f1d
EZ
1065(defun read-mail-item-name ()
1066 (let* ((known-rmail-commands '((rmail . "RMAIL")
1067 (mh-rmail . "MH")
1068 (gnus . "Gnus")))
1069 (known (assq read-mail-command known-rmail-commands)))
1070 (if known (cdr known) (symbol-name read-mail-command))))
1071
7f315c7c
EZ
1072(defvar menu-bar-games-menu (make-sparse-keymap "Games"))
1073
1074(define-key menu-bar-tools-menu [games]
1075 (list 'menu-item "Games" menu-bar-games-menu))
1076
1077(define-key menu-bar-tools-menu [separator-games]
1078 '("--"))
1079
7bff37dc
EZ
1080(define-key menu-bar-games-menu [zone]
1081 '(menu-item "Zone Out" zone
1082 :help "Play tricks with Emacs display when Emacs is idle"))
7f315c7c
EZ
1083(define-key menu-bar-games-menu [yow]
1084 '(menu-item "Random Quotation" yow
1085 :help "Display a random Zippy quotation"))
1086(define-key menu-bar-games-menu [tetris]
1087 '(menu-item "Tetris" tetris))
1088(define-key menu-bar-games-menu [solitaire]
1089 '(menu-item "Solitaire" solitaire))
1090(define-key menu-bar-games-menu [snake]
1091 '(menu-item "Snake" snake
1092 :help "Move snake around avoiding collisions"))
1093(define-key menu-bar-games-menu [mult]
1094 '(menu-item "Multiplication Puzzle" mpuz
1095 :help "Excercise brain with multiplication"))
1096(define-key menu-bar-games-menu [life]
1097 '(menu-item "Life" life
1098 :help "Watch how John Conway's cellular automaton evolves"))
1099(define-key menu-bar-games-menu [hanoi]
1100 '(menu-item "Towers of Hanoi" hanoi
1101 :help "Watch Towers-of-Hanoi puzzle solved by Emacs"))
1102(define-key menu-bar-games-menu [gomoku]
1103 '(menu-item "Gomoku" gomoku
1104 :help "Mark 5 contiguous squares (like tic-tac-toe)"))
1105(define-key menu-bar-games-menu [black-box]
1106 '(menu-item "Blackbox" blackbox
1107 :help "Find balls in a black box by shooting rays"))
1108(define-key menu-bar-games-menu [adventure]
1109 '(menu-item "Adventure" dunnet
1110 :help "Dunnet, a text Adventure game for Emacs"))
1111(define-key menu-bar-games-menu [5x5]
1112 '(menu-item "5x5" 5x5
1113 :help "Fill in all the squares on a 5x5 board"))
1114
1edd6ac4
CW
1115(define-key menu-bar-tools-menu [simple-calculator]
1116 '(menu-item "Simple Calculator" calculator
1117 :help "Invoke the Emacs built-in quick calculator"))
1118(define-key menu-bar-tools-menu [calc]
1119 '(menu-item "Programmable Calculator" calc
1120 :help "Invoke the Emacs built-in full scientific calculator"))
506c6d61 1121(define-key menu-bar-tools-menu [calendar]
7f315c7c 1122 '(menu-item "Display Calendar" calendar))
9a45aa3d
EZ
1123
1124(define-key menu-bar-tools-menu [separator-net]
1125 '("--"))
1126
7f315c7c
EZ
1127(define-key menu-bar-tools-menu [directory-search]
1128 '(menu-item "Directory Search" eudc-tools-menu
1129 :help "Query directory servers via LDAP, CCSO PH/QI or BBDB"))
506c6d61 1130(define-key menu-bar-tools-menu [compose-mail]
e4ca8f8c
EZ
1131 (list
1132 'menu-item `(format "Send Mail (with %s)" (send-mail-item-name))
1133 'compose-mail
1134 :visible `(and mail-user-agent (not (eq mail-user-agent 'ignore)))
1135 :help "Send a mail message"))
506c6d61 1136(define-key menu-bar-tools-menu [rmail]
0a1f9f1d
EZ
1137 (list
1138 'menu-item `(format "Read Mail (with %s)" (read-mail-item-name))
277e0f9d 1139 'menu-bar-read-mail
e4ca8f8c 1140 :visible `(and read-mail-command (not (eq read-mail-command 'ignore)))
0a1f9f1d 1141 :help "Read your mail and reply to it"))
277e0f9d
RS
1142
1143(defun menu-bar-read-mail ()
724f328c 1144 "Read mail using `read-mail-command'."
277e0f9d
RS
1145 (interactive)
1146 (call-interactively read-mail-command))
1147
7f315c7c 1148(define-key menu-bar-tools-menu [gnus]
0a1f9f1d 1149 '(menu-item "Read Net News (Gnus)" gnus
7f315c7c
EZ
1150 :help "Read network news groups"))
1151
1152(define-key menu-bar-tools-menu [separator-vc]
1153 '("--"))
1154
1155(defvar vc-menu-map (make-sparse-keymap "Version Control"))
eccd9bd5 1156(define-key menu-bar-tools-menu [pcl-cvs]
9817a6a3
SM
1157 '(menu-item "PCL-CVS" cvs-global-menu
1158 :help "Module-level interface to CVS"))
7f315c7c
EZ
1159(define-key menu-bar-tools-menu [vc]
1160 (list 'menu-item "Version Control" vc-menu-map
1161 :help "Interface to RCS, CVS, SCCS"))
1162
1163(define-key menu-bar-tools-menu [separator-compare]
1164 '("--"))
1165
1166(define-key menu-bar-tools-menu [ediff-misc]
1167 '(menu-item "Ediff Miscellanea" menu-bar-ediff-misc-menu
1168 :help "Ediff manual, customization, sessions, etc."))
1169(define-key menu-bar-tools-menu [epatch]
1170 '(menu-item "Apply Patch" menu-bar-epatch-menu))
1171(define-key menu-bar-tools-menu [ediff-merge]
1172 '(menu-item "Merge" menu-bar-ediff-merge-menu
1173 :help "Merge different revisions of files/directories"))
1174(define-key menu-bar-tools-menu [compare]
1175 '(menu-item "Compare (Ediff)" menu-bar-ediff-menu
1176 :help "Display differences between files/directories"))
1177
1178
1179(define-key menu-bar-tools-menu [separator-spell]
1180 '("--"))
1181
1182(define-key menu-bar-tools-menu [spell]
1183 '(menu-item "Spell Checking" ispell-menu-map))
1184
1185(define-key menu-bar-tools-menu [separator-prog]
1186 '("--"))
1187
1188(define-key menu-bar-tools-menu [gdb]
39328775
RS
1189 '(menu-item "Debugger (GDB)..." gdb
1190 :help "Debug a program from within Emacs with GDB"))
7f315c7c
EZ
1191(define-key menu-bar-tools-menu [shell-on-region]
1192 '(menu-item "Shell Command on Region..." shell-command-on-region
1193 :enable mark-active
1194 :help "Pass marked region to a shell command"))
1195(define-key menu-bar-tools-menu [shell]
1196 '(menu-item "Shell Command..." shell-command
1197 :help "Invoke a shell command and catch its output"))
1198(define-key menu-bar-tools-menu [compile]
1199 '(menu-item "Compile..." compile
1200 :help "Invoke compiler or Make, view compilation errors"))
1201(define-key menu-bar-tools-menu [grep]
ee103a41
RS
1202 '(menu-item "Search Files (with grep)..." grep
1203 :help "Search files for strings or regexps (with grep)"))
7f315c7c
EZ
1204
1205\f
1206;; The "Help" menu items
1207
e5683624
RS
1208(defvar menu-bar-describe-menu (make-sparse-keymap "Describe"))
1209
7f315c7c
EZ
1210(define-key menu-bar-describe-menu [mule-diag]
1211 '(menu-item "Show All of Mule Status" mule-diag
1212 :visible default-enable-multibyte-characters
1213 :help "Display multilingual environment settings"))
df5bde6d
SS
1214(define-key menu-bar-describe-menu [describe-coding-system-briefly]
1215 '(menu-item "Describe Coding System (Briefly)..."
1216 describe-current-coding-system-briefly
1217 :visible default-enable-multibyte-characters))
7f315c7c
EZ
1218(define-key menu-bar-describe-menu [describe-coding-system]
1219 '(menu-item "Describe Coding System..." describe-coding-system
1220 :visible default-enable-multibyte-characters))
1221(define-key menu-bar-describe-menu [describe-input-method]
1222 '(menu-item "Describe Input Method..." describe-input-method
1223 :visible default-enable-multibyte-characters
1224 :help "Keyboard layout for specific input method"))
1225(define-key menu-bar-describe-menu [describe-language-environment]
506c6d61
DL
1226 (list 'menu-item "Describe Language Environment"
1227 describe-language-environment-map
1228 :help "Show multilingual settings for a specific language"))
7f315c7c
EZ
1229
1230(define-key menu-bar-describe-menu [separator-desc-mule]
506c6d61 1231 '("--"))
7f315c7c
EZ
1232
1233(define-key menu-bar-describe-menu [list-keybindings]
1234 '(menu-item "List Key Bindings" describe-bindings
1235 :help "Display a list of all current keybindings"))
df5bde6d
SS
1236(define-key menu-bar-describe-menu [describe-current-display-table]
1237 '(menu-item "Describe Display Table" describe-current-display-table
1238 :help "Describe the current display table"))
1239(define-key menu-bar-describe-menu [describe-face]
1240 '(menu-item "Describe Face..." describe-face
1241 :help "Display the properties of a face"))
e5683624 1242(define-key menu-bar-describe-menu [describe-variable]
7f315c7c
EZ
1243 '(menu-item "Describe Variable..." describe-variable
1244 :help "Display documentation of variable/option"))
e5683624 1245(define-key menu-bar-describe-menu [describe-function]
7f315c7c
EZ
1246 '(menu-item "Describe Function..." describe-function
1247 :help "Display documentation of function/command"))
686e63b3 1248(define-key menu-bar-describe-menu [describe-key-1]
7f315c7c 1249 '(menu-item "Describe Key..." describe-key
506c6d61 1250 ;; Users typically don't identify keys and menu items...
686e63b3
RS
1251 :help "Display documentation of command bound to a \
1252key (or menu-item)"))
1253(define-key menu-bar-describe-menu [describe-key]
1254 '(menu-item "What's This? " describe-key
1255 ;; Users typically don't identify keys and menu items...
506c6d61
DL
1256 :help "Display documentation of command bound to a \
1257key (or menu-item)"))
df5bde6d
SS
1258(define-key menu-bar-describe-menu [describe-mode]
1259 '(menu-item "Describe Buffer Modes" describe-mode
1260 :help "Describe this buffer's major and minor mode"))
1261
1262(defvar menu-bar-apropos-menu (make-sparse-keymap "Apropos"))
5275d6a8
EZ
1263(defun menu-bar-read-lispref ()
1264 "Display the Emacs Lisp Reference manual in Info mode."
1265 (interactive)
1266 (info "elisp"))
1267
1268(defun menu-bar-read-lispintro ()
1269 "Display the Introduction to Emacs Lisp Programming in Info mode."
1270 (interactive)
1271 (info "eintr"))
1272
5275d6a8
EZ
1273(defun search-emacs-glossary ()
1274 "Display the Glossary node of the Emacs manual in Info mode."
1275 (interactive)
1276 (info "(emacs)Glossary"))
1277
1278(defun emacs-index-search (topic)
1279 "Look up TOPIC in the indices of the Emacs User Manual."
1280 (interactive "sSubject to look up: ")
1281 (info "emacs")
1282 (Info-index topic))
1283
1284(defun elisp-index-search (topic)
1285 "Look up TOPIC in the indices of the Emacs Lisp Reference Manual."
1286 (interactive "sSubject to look up: ")
1287 (info "elisp")
1288 (Info-index topic))
df5bde6d
SS
1289
1290(define-key menu-bar-apropos-menu [apropos-documentation]
5275d6a8
EZ
1291 '(menu-item "Search Documentation Strings..." apropos-documentation
1292 :help
1293 "Find functions and variables whose doc strings match a regexp"))
df5bde6d 1294(define-key menu-bar-apropos-menu [apropos]
5275d6a8
EZ
1295 '(menu-item "Find Any Object by Name..." apropos
1296 :help "Find symbols of any kind whose names match a regexp"))
df5bde6d 1297(define-key menu-bar-apropos-menu [apropos-value]
5275d6a8
EZ
1298 '(menu-item "Find Options by Value..." apropos-value
1299 :help "Find variables whose values match a regexp"))
df5bde6d 1300(define-key menu-bar-apropos-menu [apropos-variables]
5275d6a8
EZ
1301 '(menu-item "Find Options by Name..." apropos-variable
1302 :help "Find variables whose names match a regexp"))
df5bde6d 1303(define-key menu-bar-apropos-menu [apropos-commands]
5275d6a8
EZ
1304 '(menu-item "Find Commands by Name..." apropos-command
1305 :help "Find commands whose names match a regexp"))
1306(define-key menu-bar-apropos-menu [sep1]
1307 '("--"))
1308(define-key menu-bar-apropos-menu [elisp-index-search]
1309 '(menu-item "Look Up Subject in ELisp Manual..." elisp-index-search
1310 :help "Find description of a subject in Emacs Lisp manual"))
1311(define-key menu-bar-apropos-menu [emacs-index-search]
1312 '(menu-item "Look Up Subject in User Manual..." emacs-index-search
1313 :help "Find description of a subject in Emacs User manual"))
1314(define-key menu-bar-apropos-menu [emacs-glossary]
1315 '(menu-item "Emacs Terminology" search-emacs-glossary
1316 :help "Display the Glossary section of the Emacs manual"))
1317
1318(defvar menu-bar-manuals-menu (make-sparse-keymap "More Manuals"))
e5683624
RS
1319
1320(define-key menu-bar-manuals-menu [man]
7f315c7c
EZ
1321 '(menu-item "Read Man Page..." manual-entry
1322 :help "Man-page docs for external commands and libraries"))
e5683624
RS
1323(define-key menu-bar-manuals-menu [sep2]
1324 '("--"))
5275d6a8
EZ
1325(define-key menu-bar-manuals-menu [order-emacs-manuals]
1326 '(menu-item "Ordering Manuals" view-order-manuals
1327 :help "How to order manuals from the Free Software Foundation"))
e5683624 1328(define-key menu-bar-manuals-menu [info]
5275d6a8 1329 '(menu-item "All Other Manuals (Info)" Info-directory
7f315c7c 1330 :help "Read any of the installed manuals"))
5275d6a8
EZ
1331(define-key menu-bar-manuals-menu [info-elisp]
1332 '(menu-item "Emacs Lisp Reference" menu-bar-read-lispref
1333 :help "Read the Emacs Lisp Reference manual"))
1334(define-key menu-bar-manuals-menu [info-elintro]
1335 '(menu-item "Introduction to Emacs Lisp" menu-bar-read-lispintro
1336 :help "Read the Introduction to Emacs Lisp Programming"))
1337(define-key menu-bar-manuals-menu [sep3]
1338 '("--"))
7f315c7c
EZ
1339(define-key menu-bar-manuals-menu [command]
1340 '(menu-item "Find Command in Manual" Info-goto-emacs-command-node
1341 :help "Display manual section that describes a command"))
1342(define-key menu-bar-manuals-menu [key]
1343 '(menu-item "Find Key in Manual" Info-goto-emacs-key-command-node
1344 :help "Display manual section that describes a key"))
bacb2d12 1345
7f315c7c
EZ
1346(define-key menu-bar-help-menu [eliza]
1347 '(menu-item "Emacs Psychiatrist" doctor
1348 :help "Our doctor will help you feel better"))
5275d6a8 1349(define-key menu-bar-help-menu [sep4]
7f315c7c 1350 '("--"))
f3e1e0dd 1351(define-key menu-bar-help-menu [describe-no-warranty]
7f315c7c
EZ
1352 '(menu-item "(Non)Warranty" describe-no-warranty
1353 :help "Explain that Emacs has NO WARRANTY"))
f3e1e0dd 1354(define-key menu-bar-help-menu [describe-copying]
7f315c7c
EZ
1355 '(menu-item "Copying Conditions" describe-copying
1356 :help "Show the Emacs license (GPL)"))
f3e1e0dd 1357(define-key menu-bar-help-menu [describe-distribution]
7f315c7c
EZ
1358 '(menu-item "Getting New Versions" describe-distribution
1359 :help "How to get latest versions of Emacs"))
ae65cd84
DL
1360(define-key menu-bar-help-menu [more]
1361 '(menu-item "Find Extra Packages"
277e0f9d 1362 menu-bar-help-extra-packages
ae65cd84 1363 :help "Where to find some extra packages and possible updates"))
277e0f9d
RS
1364(defun menu-bar-help-extra-packages ()
1365 "Display help about some additional packages available for Emacs."
1366 (interactive)
1367 (let (enable-local-variables)
1368 (view-file (expand-file-name "MORE.STUFF"
1369 data-directory))
1370 (goto-address)))
008cea2c
PJ
1371(define-key menu-bar-help-menu [about]
1372 '(menu-item "About Emacs" display-splash-screen
40189bd6 1373 :help "Display version number, copyright info, and basic help"))
e5683624
RS
1374(define-key menu-bar-help-menu [sep2]
1375 '("--"))
260130bb 1376(define-key menu-bar-help-menu [finder-by-keyword]
7f315c7c
EZ
1377 '(menu-item "Find Emacs Packages..." finder-by-keyword
1378 :help "Find packages and features by keyword"))
5275d6a8
EZ
1379(define-key menu-bar-help-menu [manuals]
1380 (list 'menu-item "More Manuals" menu-bar-manuals-menu
1381 :help "Search and browse on-line manuals"))
1382(define-key menu-bar-help-menu [emacs-manual]
277e0f9d 1383 '(menu-item "Read the Emacs Manual" info-emacs-manual
5275d6a8 1384 :help "Full documentation of Emacs features"))
e5683624 1385(define-key menu-bar-help-menu [describe]
7f315c7c
EZ
1386 (list 'menu-item "Describe" menu-bar-describe-menu
1387 :help "Describe commands, variables, keys"))
5275d6a8
EZ
1388(define-key menu-bar-help-menu [apropos]
1389 (list 'menu-item "Search Documentation" menu-bar-apropos-menu
1390 :help "Look up terms, find commands, options, etc. (Apropos)"))
e5683624
RS
1391(define-key menu-bar-help-menu [sep1]
1392 '("--"))
7f315c7c
EZ
1393(define-key menu-bar-help-menu [report-emacs-bug]
1394 '(menu-item "Send Bug Report..." report-emacs-bug
1395 :help "Send e-mail to Emacs maintainers"))
1396(define-key menu-bar-help-menu [emacs-problems]
1397 '(menu-item "Emacs Known Problems" view-emacs-problems))
1398(define-key menu-bar-help-menu [emacs-news]
1399 '(menu-item "Emacs News" view-emacs-news
1400 :help "New features of this version"))
1401(define-key menu-bar-help-menu [emacs-faq]
1402 '(menu-item "Emacs FAQ" view-emacs-FAQ))
277e0f9d
RS
1403
1404(defun help-with-tutorial-spec-language ()
1405 "Use the Emacs tutorial, specifying which language you want."
f1180544 1406 (interactive)
277e0f9d
RS
1407 (help-with-tutorial t))
1408
451ec4e3
GM
1409(define-key menu-bar-help-menu [emacs-tutorial-language-specific]
1410 '(menu-item "Emacs Tutorial (choose language)..."
277e0f9d 1411 help-with-tutorial-spec-language
451ec4e3 1412 :help "Learn how to use Emacs (choose a language)"))
7f315c7c
EZ
1413(define-key menu-bar-help-menu [emacs-tutorial]
1414 '(menu-item "Emacs Tutorial" help-with-tutorial
1415 :help "Learn how to use Emacs"))
889560ed 1416
db774a16 1417(defun kill-this-buffer () ; for the menubar
506c6d61 1418 "Kill the current buffer."
db774a16
RS
1419 (interactive)
1420 (kill-buffer (current-buffer)))
1421
2f1139a4
RS
1422(defun kill-this-buffer-enabled-p ()
1423 (let ((count 0)
1424 (buffers (buffer-list)))
1425 (while buffers
1426 (or (string-match "^ " (buffer-name (car buffers)))
1427 (setq count (1+ count)))
1428 (setq buffers (cdr buffers)))
a6f8cbf1 1429 (and (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
1f50590a
RS
1430 (> count 1))))
1431
1f50590a 1432(put 'dired 'menu-enable
a6f8cbf1 1433 '(not (window-minibuffer-p (frame-selected-window menu-updating-frame))))
1f50590a 1434
a0213a97 1435;; Permit deleting frame if it would leave a visible or iconified frame.
82a74107
KH
1436(defun delete-frame-enabled-p ()
1437 "Return non-nil if `delete-frame' should be enabled in the menu bar."
1438 (let ((frames (frame-list))
27aa8132
RS
1439 (count 0))
1440 (while frames
1441 (if (frame-visible-p (car frames))
1442 (setq count (1+ count)))
1443 (setq frames (cdr frames)))
1444 (> count 1)))
2f1139a4 1445
30e19aee
RS
1446(defcustom yank-menu-length 20
1447 "*Maximum length to display in the yank-menu."
1448 :type 'integer
1449 :group 'mouse)
3dd92899
KH
1450
1451(defun menu-bar-update-yank-menu (string old)
1452 (let ((front (car (cdr yank-menu)))
1453 (menu-string (if (<= (length string) yank-menu-length)
1454 string
c3e1d435
RS
1455 (concat
1456 (substring string 0 (/ yank-menu-length 2))
1457 "..."
1458 (substring string (- (/ yank-menu-length 2)))))))
7c70a955
RS
1459 ;; Don't let the menu string be all dashes
1460 ;; because that has a special meaning in a menu.
1461 (if (string-match "\\`-+\\'" menu-string)
1462 (setq menu-string (concat menu-string " ")))
3dd92899
KH
1463 ;; If we're supposed to be extending an existing string, and that
1464 ;; string really is at the front of the menu, then update it in place.
1465 (if (and old (or (eq old (car front))
1466 (string= old (car front))))
dfabc98f 1467 (progn
3dd92899
KH
1468 (setcar front string)
1469 (setcar (cdr front) menu-string))
1470 (setcdr yank-menu
1471 (cons
1472 (cons string (cons menu-string 'menu-bar-select-yank))
1473 (cdr yank-menu)))))
1474 (if (> (length (cdr yank-menu)) kill-ring-max)
1475 (setcdr (nthcdr kill-ring-max yank-menu) nil)))
1476
4cca6fbd 1477(put 'menu-bar-select-yank 'apropos-inhibit t)
3dd92899
KH
1478(defun menu-bar-select-yank ()
1479 (interactive "*")
1480 (push-mark (point))
1481 (insert last-command-event))
68310f2a 1482
40954111 1483\f
68310f2a
MB
1484(defcustom buffers-menu-show-directories 'unless-uniquify
1485 "If non-nil, show directories in the Buffers menu for buffers that have them.
1486The special value `unless-uniquify' means that directories will be shown
1487unless `uniquify-buffer-name-style' is non-nil (in which case, buffer
1488names should include enough of a buffer's directory to distinguish it
1489from other buffers).
1490
1491Setting this variable directly does not take effect until next time the
1492Buffers menu is regenerated."
1493 :set (lambda (symbol value)
1494 (set symbol value)
1495 (menu-bar-update-buffers t))
1496 :initialize 'custom-initialize-default
1497 :type '(choice (const :tag "Never" nil)
1498 (const :tag "Unless uniquify is enabled" unless-uniquify)
1499 (const :tag "Always" t))
1500 :group 'menu)
1501
1502(defcustom buffers-menu-show-status t
1503 "If non-nil, show modified/read-only status of buffers in the Buffers menu.
1504Setting this variable directly does not take effect until next time the
1505Buffers menu is regenerated."
1506 :set (lambda (symbol value)
1507 (set symbol value)
1508 (menu-bar-update-buffers t))
1509 :initialize 'custom-initialize-default
1510 :type 'boolean
1511 :group 'menu)
1512
d0690d12
RS
1513(defvar list-buffers-directory nil)
1514
08e8171f
RS
1515(defvar menu-bar-update-buffers-maxbuf)
1516
09642d97
RS
1517(defun menu-bar-select-buffer ()
1518 (interactive)
1519 (switch-to-buffer last-command-event))
1520
1521(defun menu-bar-select-frame ()
1522 (interactive)
dfe5e27f
DL
1523 (let (frame)
1524 (dolist (f (frame-list))
1525 (when (equal last-command-event (frame-parameter f 'name))
1526 (setq frame f)))
f48e845f
RS
1527 ;; FRAME can be nil when user specifies the selected frame.
1528 (setq frame (or frame (selected-frame)))
1529 (make-frame-visible frame)
1530 (raise-frame frame)
1531 (select-frame frame)))
09642d97 1532
c171b42f 1533(defun menu-bar-update-buffers-1 (elt)
68703c11
MB
1534 (let* ((buf (car elt))
1535 (file
68310f2a
MB
1536 (and (if (eq buffers-menu-show-directories 'unless-uniquify)
1537 (or (not (boundp 'uniquify-buffer-name-style))
1538 (null uniquify-buffer-name-style))
1539 buffers-menu-show-directories)
68703c11 1540 (or (buffer-file-name buf)
68310f2a 1541 (buffer-local-value 'list-buffers-directory buf)))))
68703c11
MB
1542 (when file
1543 (setq file (file-name-directory file)))
1544 (when (and file (> (length file) 20))
1545 (setq file (concat "..." (substring file -17))))
68310f2a
MB
1546 (cons (if buffers-menu-show-status
1547 (let ((mod (if (buffer-modified-p buf) "*" ""))
1548 (ro (if (buffer-local-value 'buffer-read-only buf) "%" "")))
1549 (if file
1550 (format "%s %s%s -- %s" (cdr elt) mod ro file)
1551 (format "%s %s%s" (cdr elt) mod ro)))
1552 (if file
1553 (format "%s -- %s" (cdr elt) file)
1554 (cdr elt)))
68703c11
MB
1555 buf)))
1556
887d3c94
MB
1557;; Used to cache the menu entries for commands in the Buffers menu
1558(defvar menu-bar-buffers-menu-command-entries nil)
1559
ee1dbceb 1560(defun menu-bar-update-buffers (&optional force)
29397c58 1561 ;; If user discards the Buffers item, play along.
4d587a6c 1562 (and (lookup-key (current-global-map) [menu-bar buffer])
ee1dbceb 1563 (or force (frame-or-buffer-changed-p))
29397c58
RS
1564 (let ((buffers (buffer-list))
1565 (frames (frame-list))
1566 buffers-menu frames-menu)
1567 ;; If requested, list only the N most recently selected buffers.
1568 (if (and (integerp buffers-menu-max-size)
1569 (> buffers-menu-max-size 1))
1570 (if (> (length buffers) buffers-menu-max-size)
1571 (setcdr (nthcdr buffers-menu-max-size buffers) nil)))
1572
1573 ;; Make the menu of buffers proper.
1574 (setq buffers-menu
8b621d39
MB
1575 (let* ((buffer-list
1576 (mapcar 'list buffers))
1577 (menu-bar-update-buffers-maxbuf 0)
1578 alist)
1579 ;; Put into each element of buffer-list
1580 ;; the name for actual display,
1581 ;; perhaps truncated in the middle.
1582 (dolist (buf buffer-list)
1583 (let ((name (buffer-name (car buf))))
1584 (setcdr buf
1585 (if (> (length name) 27)
1586 (concat (substring name 0 12)
1587 "..."
1588 (substring name -12))
1589 name))))
1590 ;; Compute the maximum length of any name.
1591 (dolist (buf buffer-list)
1592 (unless (eq ?\ (aref (cdr buf) 0))
1593 (setq menu-bar-update-buffers-maxbuf
1594 (max menu-bar-update-buffers-maxbuf
1595 (length (cdr buf))))))
1596 ;; Set ALIST to an alist of the form
1597 ;; ITEM-STRING . BUFFER
1598 (dolist (buf buffer-list)
1599 (unless (eq ?\ (aref (cdr buf) 0))
1600 (push (menu-bar-update-buffers-1 buf) alist)))
1601 ;; Now make the actual list of items, and add
1602 ;; some miscellaneous buffer commands to the end.
1603 (mapcar (lambda (pair)
1604 ;; This is somewhat risque, to use
1605 ;; the buffer name itself as the event
1606 ;; type to define, but it works.
1607 ;; It would not work to use the buffer
1608 ;; since a buffer as an event has its
1609 ;; own meaning.
1610 (nconc (list (buffer-name (cdr pair))
1611 (car pair)
1612 (cons nil nil))
1613 'menu-bar-select-buffer))
1614 (nreverse alist))))
29397c58
RS
1615
1616 ;; Make a Frames menu if we have more than one frame.
8b621d39
MB
1617 (when (cdr frames)
1618 (let ((frames-menu
1619 (cons 'keymap
1620 (cons "Select Frame"
1621 (mapcar
1622 (lambda (frame)
1623 (nconc
1624 (list (frame-parameter frame 'name)
1625 (frame-parameter frame 'name)
1626 (cons nil nil))
1627 'menu-bar-select-frame))
1628 frames)))))
1629 ;; Put it after the normal buffers
1630 (setq buffers-menu
1631 (nconc buffers-menu
1632 `((frames-separator "--")
1633 (frames menu-item "Frames" ,frames-menu))))))
1634
887d3c94
MB
1635 ;; Add in some normal commands at the end of the menu. We use
1636 ;; the copy cached in `menu-bar-buffers-menu-command-entries'
1637 ;; if it's been set already. Note that we can't use constant
1638 ;; lists for the menu-entries, because the low-level menu-code
1639 ;; modifies them.
1640 (unless menu-bar-buffers-menu-command-entries
1641 (setq menu-bar-buffers-menu-command-entries
1642 (list '(command-separator "--")
332b907c
RS
1643 (list 'next-buffer
1644 'menu-item
1645 "Next Buffer"
1646 'next-buffer
1647 :help "Switch to the \"next\" buffer in a cyclic order")
1648 (list 'prev-buffer
1649 'menu-item
1650 "Previous Buffer"
1651 'prev-buffer
1652 :help "Switch to the \"previous\" buffer in a cyclic order")
887d3c94
MB
1653 (list 'select-named-buffer
1654 'menu-item
1655 "Select Named Buffer..."
1656 'switch-to-buffer
1657 :help "Prompt for a buffer name, and select that buffer in the current window")
1658 (list 'list-all-buffers
1659 'menu-item
1660 "List All Buffers"
1661 'list-buffers
1662 :help "Pop up a window listing all emacs buffers"
1663 ))))
8b621d39 1664 (setq buffers-menu
887d3c94 1665 (nconc buffers-menu menu-bar-buffers-menu-command-entries))
8b621d39
MB
1666
1667 (setq buffers-menu (cons 'keymap (cons "Select Buffer" buffers-menu)))
4d587a6c 1668 (define-key (current-global-map) [menu-bar buffer]
d08fd12f
RS
1669 ;; Call copy-sequence so the string is not pure.
1670 (cons (copy-sequence "Buffers") buffers-menu)))))
09642d97
RS
1671
1672(add-hook 'menu-bar-update-hook 'menu-bar-update-buffers)
2f1139a4 1673
3f557298
RS
1674(menu-bar-update-buffers)
1675
40954111 1676;; this version is too slow
a9d96061
SM
1677;;(defun format-buffers-menu-line (buffer)
1678;; "Returns a string to represent the given buffer in the Buffer menu.
1679;;nil means the buffer shouldn't be listed. You can redefine this."
1680;; (if (string-match "\\` " (buffer-name buffer))
1681;; nil
1682;; (save-excursion
1683;; (set-buffer buffer)
1684;; (let ((size (buffer-size)))
1685;; (format "%s%s %-19s %6s %-15s %s"
1686;; (if (buffer-modified-p) "*" " ")
1687;; (if buffer-read-only "%" " ")
1688;; (buffer-name)
1689;; size
1690;; mode-name
1691;; (or (buffer-file-name) ""))))))
40954111 1692\f
25b048ee
RS
1693;;; Set up a menu bar menu for the minibuffer.
1694
32993295
SM
1695(dolist (map (list minibuffer-local-map
1696 ;; This shouldn't be necessary, but there's a funny
1697 ;; bug in keymap.c that I don't understand yet. -stef
d918e2dc
SM
1698 minibuffer-local-completion-map))
1699 (define-key map [menu-bar minibuf]
1700 (cons "Minibuf" (make-sparse-keymap "Minibuf"))))
1701
32993295 1702(let ((map minibuffer-local-completion-map))
d918e2dc
SM
1703 (define-key map [menu-bar minibuf ?\?]
1704 (list 'menu-item "List Completions" 'minibuffer-completion-help
1705 :help "Display all possible completions"))
1706 (define-key map [menu-bar minibuf space]
1707 (list 'menu-item "Complete Word" 'minibuffer-complete-word
1708 :help "Complete at most one word"))
1709 (define-key map [menu-bar minibuf tab]
1710 (list 'menu-item "Complete" 'minibuffer-complete
1711 :help "Complete as far as possible")))
1712
32993295 1713(let ((map minibuffer-local-map))
d918e2dc
SM
1714 (define-key map [menu-bar minibuf quit]
1715 (list 'menu-item "Quit" 'keyboard-escape-quit
1716 :help "Abort input and exit minibuffer"))
1717 (define-key map [menu-bar minibuf return]
1718 (list 'menu-item "Enter" 'exit-minibuffer
1719 :help "Terminate input and exit minibuffer")))
25b048ee 1720\f
8ab9589d
JD
1721;;;###autoload
1722;; This comment is taken from toolbar/tool-bar.el near
1723;; (put 'tool-bar-mode ...)
1724;; We want to pretend the menu bar by standard is on, as this will make
1725;; customize consider disabling the menu bar a customization, and save
1726;; that. We could do this for real by setting :init-value below, but
1727;; that would overwrite disabling the tool bar from X resources.
1728(put 'menu-bar-mode 'standard-value '(t))
1729
1730;;;###autoload
1731(define-minor-mode menu-bar-mode
dfd29450 1732 "Toggle display of a menu bar on each frame.
057d49d1
RS
1733This command applies to all frames that exist and frames to be
1734created in the future.
e1d18ad8
RS
1735With a numeric argument, if the argument is positive,
1736turn on menu bars; otherwise, turn off menu bars."
8ab9589d
JD
1737 :init-value nil
1738 :global t
1739 :group 'frames
7b7d6615 1740 ;; Make menu-bar-mode and default-frame-alist consistent.
8ab9589d
JD
1741 (let ((lines (if menu-bar-mode 1 0)))
1742 ;; Alter existing frames...
1743 (mapc (lambda (frame)
1744 (modify-frame-parameters frame
1745 (list (cons 'menu-bar-lines lines))))
1746 (frame-list))
1747 ;; ...and future ones.
1748 (let ((elt (assq 'menu-bar-lines default-frame-alist)))
1749 (if elt
1750 (setcdr elt lines)
1751 (add-to-list 'default-frame-alist (cons 'menu-bar-lines lines)))))
1752
1753 ;; Make the message appear when Emacs is idle. We can not call message
1754 ;; directly. The minor-mode message "Menu-bar mode disabled" comes
1755 ;; after this function returns, overwriting any message we do here.
1756 (when (and (interactive-p) (not menu-bar-mode))
1757 (run-with-idle-timer 0 nil 'message
1758 "Menu-bar mode disabled. Use M-x menu-bar-mode to make the menu bar appear."))
09bfa5ca 1759 menu-bar-mode)
1db87953 1760
bffa5d4d
RS
1761(provide 'menu-bar)
1762
ab5796a9 1763;;; arch-tag: 6e6a3c22-4ec4-4d3d-8190-583f8ef94ced
235aa29b 1764;;; menu-bar.el ends here