* lisp/simple.el (just-one-space): Delete newlines for negative arg.
[bpt/emacs.git] / lisp / bindings.el
CommitLineData
1cd7adc6 1;;; bindings.el --- define standard key bindings and some variables
4d120e8c 2
0d30b337 3;; Copyright (C) 1985, 1986, 1987, 1992, 1993, 1994, 1995, 1996, 1999,
114f9c96 4;; 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
e49c0179 5;; Free Software Foundation, Inc.
4d120e8c
RS
6
7;; Maintainer: FSF
8;; Keywords: internal
bd78fa1d 9;; Package: emacs
4d120e8c
RS
10
11;; This file is part of GNU Emacs.
12
eb3fa2cf 13;; GNU Emacs is free software: you can redistribute it and/or modify
4d120e8c 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.
4d120e8c
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/>.
4d120e8c
RS
25
26;;; Commentary:
27
4d120e8c
RS
28;;; Code:
29
1ebfdece
GM
30(defun make-mode-line-mouse-map (mouse function) "\
31Return a keymap with single entry for mouse key MOUSE on the mode line.
32MOUSE is defined to run function FUNCTION with no args in the buffer
dfdabcf9
DL
33corresponding to the mode line clicked."
34 (let ((map (make-sparse-keymap)))
1ebfdece 35 (define-key map (vector 'mode-line mouse) function)
dfdabcf9
DL
36 map))
37
e9580d71
GM
38
39(defun mode-line-toggle-read-only (event)
40 "Like `toggle-read-only', for the mode-line."
41 (interactive "e")
42 (save-selected-window
43 (select-window (posn-window (event-start event)))
44 (toggle-read-only)
45 (force-mode-line-update)))
46
47
48(defun mode-line-toggle-modified (event)
49 "Toggle the buffer-modified flag from the mode-line."
24127af0 50 (interactive "e")
e9580d71
GM
51 (save-selected-window
52 (select-window (posn-window (event-start event)))
53 (set-buffer-modified-p (not (buffer-modified-p)))
54 (force-mode-line-update)))
55
56
57(defun mode-line-widen (event)
58 "Widen a buffer from the mode-line."
24127af0 59 (interactive "e")
e9580d71
GM
60 (save-selected-window
61 (select-window (posn-window (event-start event)))
62 (widen)
63 (force-mode-line-update)))
64
65
5e1cddda
DL
66(defvar mode-line-input-method-map
67 (let ((map (make-sparse-keymap)))
68 (define-key map [mode-line mouse-2]
69 (lambda (e)
70 (interactive "e")
71 (save-selected-window
72 (select-window
73 (posn-window (event-start e)))
74 (toggle-input-method)
75 (force-mode-line-update))))
76 (define-key map [mode-line mouse-3]
77 (lambda (e)
78 (interactive "e")
79 (save-selected-window
80 (select-window
81 (posn-window (event-start e)))
82 (describe-current-input-method))))
83 (purecopy map)))
84
f3185924
GM
85
86(defvar mode-line-coding-system-map
87 (let ((map (make-sparse-keymap)))
da16962a 88 (define-key map [mode-line mouse-1]
f3185924
GM
89 (lambda (e)
90 (interactive "e")
91 (save-selected-window
92 (select-window (posn-window (event-start e)))
93 (when (and enable-multibyte-characters
94 buffer-file-coding-system)
95 (describe-coding-system buffer-file-coding-system)))))
96 (purecopy map))
97 "Local keymap for the coding-system part of the mode line.")
98
99
6b61353c 100(defun mode-line-change-eol (event)
18a9f968 101 "Cycle through the various possible kinds of end-of-line styles."
6b61353c 102 (interactive "e")
0ec08b38 103 (with-selected-window (posn-window (event-start event))
6b61353c
KH
104 (let ((eol (coding-system-eol-type buffer-file-coding-system)))
105 (set-buffer-file-coding-system
106 (cond ((eq eol 0) 'dos) ((eq eol 1) 'mac) (t 'unix))))))
18a9f968
SM
107
108(defvar mode-line-eol-desc-cache nil)
109
110(defun mode-line-eol-desc ()
111 (let* ((eol (coding-system-eol-type buffer-file-coding-system))
112 (mnemonic (coding-system-eol-type-mnemonic buffer-file-coding-system))
1aa956a1 113 (desc (assoc eol mode-line-eol-desc-cache)))
18a9f968
SM
114 (if (and desc (eq (cadr desc) mnemonic))
115 (cddr desc)
116 (if desc (setq mode-line-eol-desc-cache nil)) ;Flush the cache if stale.
117 (setq desc
118 (propertize
119 mnemonic
40fabc71 120 'help-echo (format "End-of-line style: %s\nmouse-1 to cycle"
18a9f968 121 (if (eq eol 0) "Unix-style LF"
44d15ae0 122 (if (eq eol 1) "DOS-style CRLF"
18a9f968
SM
123 (if (eq eol 2) "Mac-style CR"
124 "Undecided"))))
125 'keymap
126 (eval-when-compile
127 (let ((map (make-sparse-keymap)))
da16962a 128 (define-key map [mode-line mouse-1] 'mode-line-change-eol)
359e4563
MY
129 map))
130 'mouse-face 'mode-line-highlight))
18a9f968
SM
131 (push (cons eol (cons mnemonic desc)) mode-line-eol-desc-cache)
132 desc)))
133
27d8b4bf
KL
134(defvar mode-line-client
135 `(""
136 (:propertize ("" (:eval (if (frame-parameter nil 'client) "@" "")))
ca0a881a 137 help-echo ,(purecopy "emacsclient frame")))
44d15ae0 138 "Mode-line control for identifying emacsclient frames.")
ac549fa5 139;;;###autoload
6dc3311d 140(put 'mode-line-client 'risky-local-variable t)
27d8b4bf 141
dfdabcf9
DL
142(defvar mode-line-mule-info
143 `(""
9ff33afb 144 (current-input-method
27451bb4
RS
145 (:propertize ("" current-input-method-title)
146 help-echo (concat
6bdad9ae 147 ,(purecopy "Current input method: ")
27451bb4 148 current-input-method
6bdad9ae 149 ,(purecopy "\n\
f46b8f6d 150mouse-2: Disable input method\n\
6bdad9ae 151mouse-3: Describe current input method"))
359e4563
MY
152 local-map ,mode-line-input-method-map
153 mouse-face mode-line-highlight))
3beb81fc 154 ,(propertize
18a9f968 155 "%z"
7ed93890 156 'help-echo
7e98f74c
RS
157 #'(lambda (window object point)
158 (with-current-buffer (window-buffer window)
159 ;; Don't show this tip if the coding system is nil,
160 ;; it reads like a bug, and is not useful anyway.
161 (when buffer-file-coding-system
f46b8f6d
DN
162 (format "Buffer coding system %s\nmouse-1: describe coding system"
163 (if enable-multibyte-characters
164 (concat "(multi-byte): "
165 (symbol-name buffer-file-coding-system))
166 (concat "(unibyte): "
167 (symbol-name buffer-file-coding-system)))))))
359e4563 168 'mouse-face 'mode-line-highlight
18a9f968
SM
169 'local-map mode-line-coding-system-map)
170 (:eval (mode-line-eol-desc)))
44c034c1
KH
171 "Mode-line control for displaying information of multilingual environment.
172Normally it displays current input method (if any activated) and
173mnemonics of the following coding systems:
174 coding system for saving or writing the current buffer
175 coding system for keyboard input (if Emacs is running on terminal)
ebc6753f 176 coding system for terminal output (if Emacs is running on terminal)"
18a9f968
SM
177 ;; Currently not:
178 ;; coding system for decoding output of buffer process (if any)
179 ;; coding system for encoding text to send to buffer process (if any)."
ebc6753f 180)
f8bce5df 181
ac549fa5 182;;;###autoload
6dc3311d 183(put 'mode-line-mule-info 'risky-local-variable t)
f8bce5df
KH
184(make-variable-buffer-local 'mode-line-mule-info)
185
fa5cde36
EZ
186;; MSDOS frames have window-system, but want the Fn identification.
187(defun mode-line-frame-control ()
188 "Compute mode-line control for frame identification.
189Value is used for `mode-line-frame-identification', which see."
300d87a1
EZ
190 (if (or (null window-system)
191 (eq window-system 'pc))
fa5cde36
EZ
192 "-%F "
193 " "))
194
2428c57b
EZ
195;; We need to defer the call to mode-line-frame-control to the time
196;; the mode line is actually displayed.
300d87a1
EZ
197(defvar mode-line-frame-identification '(:eval (mode-line-frame-control))
198 "Mode-line control to describe the current frame.")
ac549fa5 199;;;###autoload
2428c57b 200(put 'mode-line-frame-identification 'risky-local-variable t)
4544e9db 201
688953b5
DL
202(defvar mode-line-process nil "\
203Mode-line control for displaying info on process status.
4d120e8c
RS
204Normally nil in most modes, since there is no process to display.")
205
ac549fa5 206;;;###autoload
6dc3311d 207(put 'mode-line-process 'risky-local-variable t)
4d120e8c
RS
208(make-variable-buffer-local 'mode-line-process)
209
dfdabcf9
DL
210(defvar mode-line-modified
211 (list (propertize
3beb81fc
DL
212 "%1*"
213 'help-echo (purecopy (lambda (window object point)
40fabc71 214 (format "Buffer is %s\nmouse-1 toggles"
3beb81fc
DL
215 (save-selected-window
216 (select-window window)
217 (if buffer-read-only
40fabc71
DN
218 "read-only"
219 "writable")))))
1ebfdece 220 'local-map (purecopy (make-mode-line-mouse-map
da16962a 221 'mouse-1
359e4563
MY
222 #'mode-line-toggle-read-only))
223 'mouse-face 'mode-line-highlight)
3beb81fc
DL
224 (propertize
225 "%1+"
226 'help-echo (purecopy (lambda (window object point)
f46b8f6d 227 (format "Buffer is %sodified\nmouse-1 toggles modified state"
3beb81fc
DL
228 (save-selected-window
229 (select-window window)
230 (if (buffer-modified-p)
f529f302
GM
231 "m"
232 "not m")))))
1ebfdece 233 'local-map (purecopy (make-mode-line-mouse-map
da16962a 234 'mouse-1 #'mode-line-toggle-modified))
359e4563 235 'mouse-face 'mode-line-highlight))
4d120e8c
RS
236 "Mode-line control for displaying whether current buffer is modified.")
237
ac549fa5 238;;;###autoload
6dc3311d 239(put 'mode-line-modified 'risky-local-variable t)
4d120e8c
RS
240(make-variable-buffer-local 'mode-line-modified)
241
4c43ca07
NR
242(defvar mode-line-remote
243 (list (propertize
2c5b4e79 244 "%1@"
38805987 245 'mouse-face 'mode-line-highlight
4c43ca07
NR
246 'help-echo (purecopy (lambda (window object point)
247 (format "%s"
248 (save-selected-window
249 (select-window window)
2826687d 250 (concat
38805987
DN
251 (if (file-remote-p default-directory)
252 "Current directory is remote: "
253 "Current directory is local: ")
254 default-directory)))))))
4c43ca07 255 "Mode-line flag to show if default-directory for current buffer is remote.")
ac549fa5 256;;;###autoload
6dc3311d 257(put 'mode-line-remote 'risky-local-variable t)
4c43ca07
NR
258
259(make-variable-buffer-local 'mode-line-remote)
260
e6188964
RS
261;; Actual initialization is below.
262(defvar mode-line-position nil
6b61353c
KH
263 "Mode-line control for displaying the position in the buffer.
264Normally displays the buffer percentage and, optionally, the
265buffer size, the line number and the column number.")
ac549fa5 266;;;###autoload
6dc3311d 267(put 'mode-line-position 'risky-local-variable t)
e6188964
RS
268
269(defvar mode-line-modes nil
270 "Mode-line control for displaying major and minor modes.")
ac549fa5 271;;;###autoload
6dc3311d 272(put 'mode-line-modes 'risky-local-variable t)
e6188964 273
03b63ba9
SM
274(defvar mode-line-mode-menu (make-sparse-keymap "Minor Modes") "\
275Menu of mode operations in the mode line.")
276
6b61353c 277(defvar mode-line-major-mode-keymap
335028c3 278 (let ((map (make-sparse-keymap)))
0b2b62ff 279 (define-key map [mode-line down-mouse-1]
a7610c52 280 `(menu-item ,(purecopy "Menu Bar") ignore
0b2b62ff 281 :filter (lambda (_) (mouse-menu-major-mode-map))))
335028c3 282 (define-key map [mode-line mouse-2] 'describe-mode)
03b63ba9 283 (define-key map [mode-line down-mouse-3] mode-line-mode-menu)
335028c3 284 map) "\
8a42b336
JB
285Keymap to display on major mode.")
286
6b61353c 287(defvar mode-line-minor-mode-keymap
335028c3 288 (let ((map (make-sparse-keymap)))
fe1afc9b 289 (define-key map [mode-line down-mouse-1] 'mouse-minor-mode-menu)
335028c3 290 (define-key map [mode-line mouse-2] 'mode-line-minor-mode-help)
03b63ba9
SM
291 (define-key map [mode-line down-mouse-3] mode-line-mode-menu)
292 (define-key map [header-line down-mouse-3] mode-line-mode-menu)
335028c3 293 map) "\
8a42b336
JB
294Keymap to display on minor modes.")
295
10a55ba0
DN
296(defvar mode-line-column-line-number-mode-map
297 (let ((map (make-sparse-keymap))
298 (menu-map (make-sparse-keymap "Toggle Line and Column Number Display")))
299 (define-key menu-map [line-number-mode]
300 `(menu-item ,(purecopy "Display Line Numbers") line-number-mode
ca0a881a 301 :help ,(purecopy "Toggle displaying line numbers in the mode-line")
10a55ba0
DN
302 :button (:toggle . line-number-mode)))
303 (define-key menu-map [column-number-mode]
304 `(menu-item ,(purecopy "Display Column Numbers") column-number-mode
ca0a881a 305 :help ,(purecopy "Toggle displaying column numbers in the mode-line")
10a55ba0
DN
306 :button (:toggle . column-number-mode)))
307 (define-key map [mode-line down-mouse-1] menu-map)
308 map) "\
309Keymap to display on column and line numbers.")
310
e6188964
RS
311(let* ((help-echo
312 ;; The multi-line message doesn't work terribly well on the
313 ;; bottom mode line... Better ideas?
d1bf2a73
SM
314 ;; "\
315 ;; mouse-1: select window, mouse-2: delete others, mouse-3: delete,
316 ;; drag-mouse-1: resize, C-mouse-2: split horizontally"
40fabc71
DN
317 "mouse-1: Select (drag to resize)\n\
318mouse-2: Make current window occupy the whole frame\n\
319mouse-3: Remove current window from display")
39d0516b 320 (recursive-edit-help-echo "Recursive edit, type C-M-c to get out")
3f12b18c 321 (spaces (propertize " " 'help-echo help-echo))
044c2978
CY
322 (standard-mode-line-format
323 (list
324 "%e"
325 (propertize "-" 'help-echo help-echo)
326 'mode-line-mule-info
3f87f67e 327 'mode-line-client
044c2978 328 'mode-line-modified
4c43ca07 329 'mode-line-remote
044c2978
CY
330 'mode-line-frame-identification
331 'mode-line-buffer-identification
332 (propertize " " 'help-echo help-echo)
333 'mode-line-position
334 '(vc-mode vc-mode)
335 (propertize " " 'help-echo help-echo)
336 'mode-line-modes
3f12b18c
JD
337 `(which-func-mode ("" which-func-format ,spaces))
338 `(global-mode-string ("" global-mode-string ,spaces))
339 `(:eval (unless (display-graphic-p)
340 ,(propertize "-%-" 'help-echo help-echo)))))
044c2978
CY
341 (standard-mode-line-modes
342 (list
39d0516b 343 (propertize "%[" 'help-echo recursive-edit-help-echo)
b7fd8c46 344 (propertize "(" 'help-echo help-echo)
044c2978 345 `(:propertize ("" mode-name)
40fabc71
DN
346 help-echo "Major mode\n\
347mouse-1: Display major mode menu\n\
348mouse-2: Show help for major mode\n\
349mouse-3: Toggle minor modes"
044c2978
CY
350 mouse-face mode-line-highlight
351 local-map ,mode-line-major-mode-keymap)
352 '("" mode-line-process)
353 `(:propertize ("" minor-mode-alist)
354 mouse-face mode-line-highlight
40fabc71
DN
355 help-echo "Minor mode\n\
356mouse-1: Display minor mode menu\n\
357mouse-2: Show help for minor mode\n\
358mouse-3: Toggle minor modes"
044c2978 359 local-map ,mode-line-minor-mode-keymap)
40fabc71 360 (propertize "%n" 'help-echo "mouse-2: Remove narrowing from the current buffer"
044c2978
CY
361 'mouse-face 'mode-line-highlight
362 'local-map (make-mode-line-mouse-map
363 'mouse-2 #'mode-line-widen))
b7fd8c46 364 (propertize ")" 'help-echo help-echo)
39d0516b 365 (propertize "%]" 'help-echo recursive-edit-help-echo)
3f12b18c 366 spaces))
3f87f67e 367
044c2978 368 (standard-mode-line-position
10a55ba0
DN
369 `((-3 ,(propertize
370 "%p"
371 'local-map mode-line-column-line-number-mode-map
38805987 372 'mouse-face 'mode-line-highlight
10a55ba0
DN
373 ;; XXX needs better description
374 'help-echo "Size indication mode\n\
375mouse-1: Display Line and Column Mode Menu"))
044c2978 376 (size-indication-mode
2826687d 377 (8 ,(propertize
40fabc71 378 " of %I"
10a55ba0 379 'local-map mode-line-column-line-number-mode-map
38805987 380 'mouse-face 'mode-line-highlight
40fabc71 381 ;; XXX needs better description
10a55ba0
DN
382 'help-echo "Size indication mode\n\
383mouse-1: Display Line and Column Mode Menu")))
044c2978
CY
384 (line-number-mode
385 ((column-number-mode
2826687d
DN
386 (10 ,(propertize
387 " (%l,%c)"
10a55ba0 388 'local-map mode-line-column-line-number-mode-map
38805987 389 'mouse-face 'mode-line-highlight
10a55ba0
DN
390 'help-echo "Line number and Column number\n\
391mouse-1: Display Line and Column Mode Menu"))
2826687d
DN
392 (6 ,(propertize
393 " L%l"
10a55ba0 394 'local-map mode-line-column-line-number-mode-map
38805987 395 'mouse-face 'mode-line-highlight
10a55ba0
DN
396 'help-echo "Line Number\n\
397mouse-1: Display Line and Column Mode Menu"))))
044c2978 398 ((column-number-mode
2826687d
DN
399 (5 ,(propertize
400 " C%c"
10a55ba0 401 'local-map mode-line-column-line-number-mode-map
38805987 402 'mouse-face 'mode-line-highlight
10a55ba0
DN
403 'help-echo "Column number\n\
404mouse-1: Display Line and Column Mode Menu"))))))))
044c2978
CY
405
406 (setq-default mode-line-format standard-mode-line-format)
407 (put 'mode-line-format 'standard-value
408 (list `(quote ,standard-mode-line-format)))
409
410 (setq-default mode-line-modes standard-mode-line-modes)
411 (put 'mode-line-modes 'standard-value
412 (list `(quote ,standard-mode-line-modes)))
413
414 (setq-default mode-line-position standard-mode-line-position)
415 (put 'mode-line-position 'standard-value
416 (list `(quote ,standard-mode-line-position))))
4d120e8c 417
a8b7149d
SM
418(defvar mode-line-buffer-identification-keymap
419 ;; Add menu of buffer operations to the buffer identification part
420 ;; of the mode line.or header line.
421 (let ((map (make-sparse-keymap)))
422 ;; Bind down- events so that the global keymap won't ``shine
423 ;; through''.
424 (define-key map [mode-line mouse-1] 'mode-line-previous-buffer)
425 (define-key map [header-line down-mouse-1] 'ignore)
426 (define-key map [header-line mouse-1] 'mode-line-previous-buffer)
a8b7149d
SM
427 (define-key map [mode-line mouse-3] 'mode-line-next-buffer)
428 (define-key map [header-line down-mouse-3] 'ignore)
429 (define-key map [header-line mouse-3] 'mode-line-next-buffer)
430 map) "\
688953b5 431Keymap for what is displayed by `mode-line-buffer-identification'.")
b1dcba7b 432
3bd80f8b
RS
433(defun propertized-buffer-identification (fmt)
434 "Return a list suitable for `mode-line-buffer-identification'.
435FMT is a format specifier such as \"%12b\". This function adds
436text properties for face, help-echo, and local-map to it."
e0fcce78 437 (list (propertize fmt
3bd80f8b
RS
438 'face 'mode-line-buffer-id
439 'help-echo
e0fcce78 440 (purecopy "Buffer name\n\
40fabc71
DN
441mouse-1: previous buffer\n\
442mouse-3: next buffer")
3bd80f8b
RS
443 'mouse-face 'mode-line-highlight
444 'local-map mode-line-buffer-identification-keymap)))
445
f8e65267 446(defvar mode-line-buffer-identification (propertized-buffer-identification "%12b") "\
3bd80f8b
RS
447Mode-line control for identifying the buffer being displayed.
448Its default value is (\"%12b\") with some text properties added.
449Major modes that edit things other than ordinary files may change this
450\(e.g. Info, Dired,...)")
451
ac549fa5 452;;;###autoload
6dc3311d 453(put 'mode-line-buffer-identification 'risky-local-variable t)
3bd80f8b
RS
454(make-variable-buffer-local 'mode-line-buffer-identification)
455
fa3f4090
RS
456(defun unbury-buffer () "\
457Switch to the last buffer in the buffer list."
545f7310
SS
458 (interactive)
459 (switch-to-buffer (last-buffer)))
460
22b50772 461(defun mode-line-unbury-buffer (event) "\
545f7310 462Call `unbury-buffer' in this window."
22b50772
GM
463 (interactive "e")
464 (save-selected-window
465 (select-window (posn-window (event-start event)))
545f7310 466 (unbury-buffer)))
22b50772
GM
467
468(defun mode-line-bury-buffer (event) "\
c85ee897 469Like `bury-buffer', but temporarily select EVENT's window."
22b50772
GM
470 (interactive "e")
471 (save-selected-window
472 (select-window (posn-window (event-start event)))
473 (bury-buffer)))
b1dcba7b 474
688953b5
DL
475(defun mode-line-other-buffer () "\
476Switch to the most recently selected buffer other than the current one."
b1dcba7b
GM
477 (interactive)
478 (switch-to-buffer (other-buffer)))
479
4ec983f1
JL
480(defun mode-line-next-buffer (event)
481 "Like `next-buffer', but temporarily select EVENT's window."
482 (interactive "e")
483 (save-selected-window
484 (select-window (posn-window (event-start event)))
485 (next-buffer)))
486
487(defun mode-line-previous-buffer (event)
488 "Like `previous-buffer', but temporarily select EVENT's window."
489 (interactive "e")
490 (save-selected-window
491 (select-window (posn-window (event-start event)))
492 (previous-buffer)))
493
842d2ee9
DL
494(defmacro bound-and-true-p (var)
495 "Return the value of symbol VAR if it is bound, else nil."
ff69e012 496 `(and (boundp (quote ,var)) ,var))
842d2ee9 497
5400586c
NR
498;; Use mode-line-mode-menu for local minor-modes only.
499;; Global ones can go on the menubar (Options --> Show/Hide).
dfdabcf9 500(define-key mode-line-mode-menu [overwrite-mode]
5b1d5e63 501 `(menu-item ,(purecopy "Overwrite (Ovwrt)") overwrite-mode
9cd39aff 502 :help ,(purecopy "Overwrite mode: typed characters replace existing text")
dfdabcf9 503 :button (:toggle . overwrite-mode)))
2a5405b6 504(define-key mode-line-mode-menu [outline-minor-mode]
5b1d5e63 505 `(menu-item ,(purecopy "Outline (Outl)") outline-minor-mode
40fabc71 506 ;; XXX: This needs a good, brief description.
9cd39aff 507 :help ,(purecopy "")
2a5405b6 508 :button (:toggle . (bound-and-true-p outline-minor-mode))))
2a5405b6 509(define-key mode-line-mode-menu [highlight-changes-mode]
5b1d5e63 510 `(menu-item ,(purecopy "Highlight changes (Chg)") highlight-changes-mode
9cd39aff 511 :help ,(purecopy "Show changes in the buffer in a distinctive color")
6455508d 512 :button (:toggle . (bound-and-true-p highlight-changes-mode))))
2a5405b6 513(define-key mode-line-mode-menu [hide-ifdef-mode]
5b1d5e63 514 `(menu-item ,(purecopy "Hide ifdef (Ifdef)") hide-ifdef-mode
9cd39aff 515 :help ,(purecopy "Show/Hide code within #ifdef constructs")
2a5405b6 516 :button (:toggle . (bound-and-true-p hide-ifdef-mode))))
c29a05c8
DP
517(define-key mode-line-mode-menu [glasses-mode]
518 `(menu-item ,(purecopy "Glasses (o^o)") glasses-mode
9cd39aff 519 :help ,(purecopy "Insert virtual separators to make long identifiers easy to read")
c29a05c8 520 :button (:toggle . (bound-and-true-p glasses-mode))))
2a5405b6 521(define-key mode-line-mode-menu [font-lock-mode]
aa88b9e5 522 `(menu-item ,(purecopy "Font Lock") font-lock-mode
9cd39aff 523 :help ,(purecopy "Syntax coloring")
2a5405b6
GM
524 :button (:toggle . font-lock-mode)))
525(define-key mode-line-mode-menu [flyspell-mode]
5b1d5e63 526 `(menu-item ,(purecopy "Flyspell (Fly)") flyspell-mode
9cd39aff 527 :help ,(purecopy "Spell checking on the fly")
2a5405b6 528 :button (:toggle . (bound-and-true-p flyspell-mode))))
c29a05c8
DP
529(define-key mode-line-mode-menu [auto-revert-tail-mode]
530 `(menu-item ,(purecopy "Auto revert tail (Tail)") auto-revert-tail-mode
9cd39aff 531 :help ,(purecopy "Revert the tail of the buffer when buffer grows")
9f37aef4 532 :enable (buffer-file-name)
6455508d 533 :button (:toggle . (bound-and-true-p auto-revert-tail-mode))))
2a5405b6 534(define-key mode-line-mode-menu [auto-revert-mode]
5b1d5e63 535 `(menu-item ,(purecopy "Auto revert (ARev)") auto-revert-mode
9cd39aff 536 :help ,(purecopy "Revert the buffer when the file on disk changes")
6455508d 537 :button (:toggle . (bound-and-true-p auto-revert-mode))))
c29a05c8
DP
538(define-key mode-line-mode-menu [auto-fill-mode]
539 `(menu-item ,(purecopy "Auto fill (Fill)") auto-fill-mode
9cd39aff 540 :help ,(purecopy "Automatically insert new lines")
c29a05c8 541 :button (:toggle . auto-fill-function)))
2a5405b6 542(define-key mode-line-mode-menu [abbrev-mode]
5b1d5e63 543 `(menu-item ,(purecopy "Abbrev (Abbrev)") abbrev-mode
9cd39aff 544 :help ,(purecopy "Automatically expand abbreviations")
2a5405b6 545 :button (:toggle . abbrev-mode)))
dfdabcf9 546
8a42b336 547(defun mode-line-minor-mode-help (event)
fe1afc9b 548 "Describe minor mode for EVENT on minor modes area of the mode line."
8a42b336
JB
549 (interactive "@e")
550 (let ((indicator (car (nth 4 (car (cdr event))))))
551 (describe-minor-mode-from-indicator indicator)))
552
541b8aff
GM
553(defvar minor-mode-alist nil "\
554Alist saying how to show minor modes in the mode line.
555Each element looks like (VARIABLE STRING);
4837b516 556STRING is included in the mode line if VARIABLE's value is non-nil.
541b8aff
GM
557
558Actually, STRING need not be a string; any possible mode-line element
559is okay. See `mode-line-format'.")
ac549fa5 560;;;###autoload
6dc3311d 561(put 'minor-mode-alist 'risky-local-variable t)
541b8aff
GM
562;; Don't use purecopy here--some people want to change these strings.
563(setq minor-mode-alist
0b2b62ff
SM
564 '((abbrev-mode " Abbrev")
565 (overwrite-mode overwrite-mode)
566 (auto-fill-function " Fill")
567 ;; not really a minor mode...
568 (defining-kbd-macro " Def")))
541b8aff 569
4d120e8c
RS
570;; These variables are used by autoloadable packages.
571;; They are defined here so that they do not get overridden
572;; by the loading of those packages.
573
574;; Names in directory that end in one of these
575;; are ignored in completion,
576;; making it more likely you will get a unique match.
577(setq completion-ignored-extensions
d34c1b05 578 (append
a12ca054 579 (cond ((memq system-type '(ms-dos windows-nt))
a7610c52 580 (mapcar 'purecopy
a12ca054 581 '(".o" "~" ".bin" ".bak" ".obj" ".map" ".ico" ".pif" ".lnk"
a7610c52 582 ".a" ".ln" ".blg" ".bbl" ".dll" ".drv" ".vxd" ".386")))
d34c1b05 583 (t
a7610c52 584 (mapcar 'purecopy
a12ca054 585 '(".o" "~" ".bin" ".lbin" ".so"
a7610c52
DN
586 ".a" ".ln" ".blg" ".bbl"))))
587 (mapcar 'purecopy
d34c1b05
RS
588 '(".elc" ".lof"
589 ".glo" ".idx" ".lot"
bcca751d
JB
590 ;; VCS metadata directories
591 ".svn/" ".hg/" ".git/" ".bzr/" "CVS/" "_darcs/" "_MTN/"
d34c1b05 592 ;; TeX-related
640602f7 593 ".fmt" ".tfm"
c79e04d8
RS
594 ;; Java compiled
595 ".class"
7ed93890
SS
596 ;; CLISP
597 ".fas" ".lib" ".mem"
c79e04d8 598 ;; CMUCL
ff69e012 599 ".x86f" ".sparcf"
6b61353c 600 ;; Other CL implementations (Allegro, LispWorks, OpenMCL)
2e74da96 601 ".fasl" ".ufsl" ".fsl" ".dxl" ".pfsl" ".dfsl"
7fc743d4 602 ".p64fsl" ".d64fsl" ".dx64fsl"
f7e1a28d
GM
603 ;; Libtool
604 ".lo" ".la"
008c915c
RS
605 ;; Gettext
606 ".gmo" ".mo"
d34c1b05 607 ;; Texinfo-related
6b61353c
KH
608 ;; This used to contain .log, but that's commonly used for log
609 ;; files you do want to see, not just TeX stuff. -- fx
610 ".toc" ".aux"
d34c1b05 611 ".cp" ".fn" ".ky" ".pg" ".tp" ".vr"
7c226e40
EZ
612 ".cps" ".fns" ".kys" ".pgs" ".tps" ".vrs"
613 ;; Python byte-compiled
a7610c52 614 ".pyc" ".pyo"))))
4d120e8c 615
ae95a95a
SM
616;; Suffixes used for executables.
617(setq exec-suffixes
618 (cond
619 ((memq system-type '(ms-dos windows-nt))
620 '(".exe" ".com" ".bat" ".cmd" ".btm" ""))
621 (t
622 '(""))))
623
2b4b2add
DL
624;; Packages should add to this list appropriately when they are
625;; loaded, rather than listing everything here.
4d120e8c 626(setq debug-ignored-errors
a7610c52 627 `(beginning-of-line beginning-of-buffer end-of-line
4d120e8c 628 end-of-buffer end-of-file buffer-read-only
c79e04d8 629 file-supersession
a7610c52
DN
630 ,(purecopy "^Previous command was not a yank$")
631 ,(purecopy "^Minibuffer window is not active$")
632 ,(purecopy "^No previous history search regexp$")
633 ,(purecopy "^No later matching history item$")
634 ,(purecopy "^No earlier matching history item$")
635 ,(purecopy "^End of history; no default available$")
636 ,(purecopy "^End of defaults; no next item$")
637 ,(purecopy "^Beginning of history; no preceding item$")
638 ,(purecopy "^No recursive edit is in progress$")
639 ,(purecopy "^Changes to be undone are outside visible portion of buffer$")
640 ,(purecopy "^No undo information in this buffer$")
641 ,(purecopy "^No further undo information")
642 ,(purecopy "^Save not confirmed$")
643 ,(purecopy "^Recover-file cancelled\\.$")
644 ,(purecopy "^Cannot switch buffers in a dedicated window$")
cd8d6674 645 ))
4d120e8c
RS
646
647
648(make-variable-buffer-local 'indent-tabs-mode)
649
152d064d 650;; We have base64 and md5 functions built in now.
d1bf2a73
SM
651(provide 'base64)
652(provide 'md5)
653(provide 'overlay '(display syntax-table field))
654(provide 'text-properties '(display syntax-table field point-entered))
acafa9cf 655
0094907b
RS
656(define-key esc-map "\t" 'complete-symbol)
657
4d120e8c
RS
658;; Reduce total amount of space we must allocate during this function
659;; that we will not need to keep permanently.
660(garbage-collect)
661\f
3607b64d 662
4d120e8c
RS
663(setq help-event-list '(help f1))
664
97710114
RS
665(make-variable-buffer-local 'minor-mode-overriding-map-alist)
666
d1bf2a73
SM
667;; From frame.c
668(global-set-key [switch-frame] 'handle-switch-frame)
b6cb37ae
SM
669(global-set-key [select-window] 'handle-select-window)
670
671;; FIXME: Do those 3 events really ever reach the global-map ?
672;; It seems that they can't because they're handled via
673;; special-event-map which is used at very low-level. -stef
d1bf2a73
SM
674(global-set-key [delete-frame] 'handle-delete-frame)
675(global-set-key [iconify-frame] 'ignore-event)
676(global-set-key [make-frame-visible] 'ignore-event)
677
678
4d120e8c
RS
679;These commands are defined in editfns.c
680;but they are not assigned to keys there.
681(put 'narrow-to-region 'disabled t)
d455ee85 682
db5dce9d
EZ
683;; Moving with arrows in bidi-sensitive direction.
684(defun right-char (&optional n)
685 "Move point N characters to the right (to the left if N is negative).
686On reaching beginning or end of buffer, stop and signal error.
687
688Depending on the bidirectional context, this may move either forward
689or backward in the buffer. This is in contrast with \\[forward-char]
690and \\[backward-char], which see."
691 (interactive "^p")
692 (if (eq (current-bidi-paragraph-direction) 'left-to-right)
693 (forward-char n)
694 (backward-char n)))
695
696(defun left-char ( &optional n)
697 "Move point N characters to the left (to the right if N is negative).
698On reaching beginning or end of buffer, stop and signal error.
699
700Depending on the bidirectional context, this may move either backward
701or forward in the buffer. This is in contrast with \\[backward-char]
702and \\[forward-char], which see."
703 (interactive "^p")
704 (if (eq (current-bidi-paragraph-direction) 'left-to-right)
705 (backward-char n)
706 (forward-char n)))
707
708(defun right-word (&optional n)
709 "Move point N words to the right (to the left if N is negative).
710
711Depending on the bidirectional context, this may move either forward
712or backward in the buffer. This is in contrast with \\[forward-word]
713and \\[backward-word], which see.
714
715Value is normally t.
716If an edge of the buffer or a field boundary is reached, point is left there
717there and the function returns nil. Field boundaries are not noticed
718if `inhibit-field-text-motion' is non-nil."
719 (interactive "^p")
720 (if (eq (current-bidi-paragraph-direction) 'left-to-right)
721 (forward-word n)
722 (backward-word n)))
723
724(defun left-word (&optional n)
725 "Move point N words to the left (to the right if N is negative).
726
727Depending on the bidirectional context, this may move either backward
728or forward in the buffer. This is in contrast with \\[backward-word]
729and \\[forward-word], which see.
730
731Value is normally t.
732If an edge of the buffer or a field boundary is reached, point is left there
733there and the function returns nil. Field boundaries are not noticed
734if `inhibit-field-text-motion' is non-nil."
735 (interactive "^p")
736 (if (eq (current-bidi-paragraph-direction) 'left-to-right)
737 (backward-word n)
738 (forward-word n)))
739
d455ee85
JL
740(defvar narrow-map (make-sparse-keymap)
741 "Keymap for narrowing commands.")
742(define-key ctl-x-map "n" narrow-map)
743
744(define-key narrow-map "n" 'narrow-to-region)
745(define-key narrow-map "w" 'widen)
4d120e8c 746
ad1cc346
KS
747;; Quitting
748(define-key global-map "\e\e\e" 'keyboard-escape-quit)
749(define-key global-map "\C-g" 'keyboard-quit)
750
d3615887
SM
751;; Used to be in termdev.el: when using several terminals, make C-z
752;; suspend only the relevant terminal.
753(substitute-key-definition 'suspend-emacs 'suspend-frame global-map)
754
4d120e8c
RS
755(define-key global-map "\C-j" 'newline-and-indent)
756(define-key global-map "\C-m" 'newline)
757(define-key global-map "\C-o" 'open-line)
758(define-key esc-map "\C-o" 'split-line)
759(define-key global-map "\C-q" 'quoted-insert)
760(define-key esc-map "^" 'delete-indentation)
761(define-key esc-map "\\" 'delete-horizontal-space)
762(define-key esc-map "m" 'back-to-indentation)
763(define-key ctl-x-map "\C-o" 'delete-blank-lines)
764(define-key esc-map " " 'just-one-space)
765(define-key esc-map "z" 'zap-to-char)
766(define-key esc-map "=" 'count-lines-region)
767(define-key ctl-x-map "=" 'what-cursor-position)
768(define-key esc-map ":" 'eval-expression)
769;; Define ESC ESC : like ESC : for people who type ESC ESC out of habit.
770(define-key esc-map "\M-:" 'eval-expression)
771;; Changed from C-x ESC so that function keys work following C-x.
772(define-key ctl-x-map "\e\e" 'repeat-complex-command)
773;; New binding analogous to M-:.
774(define-key ctl-x-map "\M-:" 'repeat-complex-command)
8cb95edf
SM
775(define-key ctl-x-map "u" 'undo)
776(put 'undo :advertised-binding [?\C-x ?u])
4d120e8c
RS
777;; Many people are used to typing C-/ on X terminals and getting C-_.
778(define-key global-map [?\C-/] 'undo)
779(define-key global-map "\C-_" 'undo)
ad1cc346
KS
780;; Richard said that we should not use C-x <uppercase letter> and I have
781;; no idea whereas to bind it. Any suggestion welcome. -stef
782;; (define-key ctl-x-map "U" 'undo-only)
783
4d120e8c
RS
784(define-key esc-map "!" 'shell-command)
785(define-key esc-map "|" 'shell-command-on-region)
6f2d8b35 786(define-key esc-map "&" 'async-shell-command)
4d120e8c 787
d455ee85
JL
788(define-key ctl-x-map [right] 'next-buffer)
789(define-key ctl-x-map [C-right] 'next-buffer)
790(define-key ctl-x-map [left] 'previous-buffer)
791(define-key ctl-x-map [C-left] 'previous-buffer)
ad1cc346 792
a77dfeb0
SM
793(let ((map minibuffer-local-map))
794 (define-key map "\en" 'next-history-element)
795 (define-key map [next] 'next-history-element)
796 (define-key map [down] 'next-history-element)
797 (define-key map "\ep" 'previous-history-element)
798 (define-key map [prior] 'previous-history-element)
799 (define-key map [up] 'previous-history-element)
800 (define-key map "\es" 'next-matching-history-element)
b0c24554
SM
801 (define-key map "\er" 'previous-matching-history-element)
802 ;; Override the global binding (which calls indent-relative via
803 ;; indent-for-tab-command). The alignment that indent-relative tries to
804 ;; do doesn't make much sense here since the prompt messes it up.
2d914448 805 (define-key map "\t" 'self-insert-command)
77e0c5b6 806 (define-key map [C-tab] 'file-cache-minibuffer-complete))
4d120e8c
RS
807
808(define-key global-map "\C-u" 'universal-argument)
809(let ((i ?0))
810 (while (<= i ?9)
811 (define-key esc-map (char-to-string i) 'digit-argument)
812 (setq i (1+ i))))
813(define-key esc-map "-" 'negative-argument)
814;; Define control-digits.
815(let ((i ?0))
816 (while (<= i ?9)
817 (define-key global-map (read (format "[?\\C-%c]" i)) 'digit-argument)
818 (setq i (1+ i))))
819(define-key global-map [?\C--] 'negative-argument)
820;; Define control-meta-digits.
821(let ((i ?0))
822 (while (<= i ?9)
823 (define-key esc-map (read (format "[?\\C-%c]" i)) 'digit-argument)
824 (setq i (1+ i))))
825(define-key global-map [?\C-\M--] 'negative-argument)
826
b9229673 827(define-key global-map "\177" 'delete-backward-char)
b8a47412 828(define-key global-map "\C-d" 'delete-char)
b9229673 829
4d120e8c
RS
830(define-key global-map "\C-k" 'kill-line)
831(define-key global-map "\C-w" 'kill-region)
832(define-key esc-map "w" 'kill-ring-save)
833(define-key esc-map "\C-w" 'append-next-kill)
834(define-key global-map "\C-y" 'yank)
835(define-key esc-map "y" 'yank-pop)
836
837;; (define-key ctl-x-map "a" 'append-to-buffer)
838
839(define-key global-map "\C-@" 'set-mark-command)
840;; Many people are used to typing C-SPC and getting C-@.
e68e61b5 841(define-key global-map [?\C- ] 'set-mark-command)
4d120e8c
RS
842(define-key ctl-x-map "\C-x" 'exchange-point-and-mark)
843(define-key ctl-x-map "\C-@" 'pop-global-mark)
e68e61b5 844(define-key ctl-x-map [?\C- ] 'pop-global-mark)
4d120e8c
RS
845
846(define-key global-map "\C-n" 'next-line)
847(define-key global-map "\C-p" 'previous-line)
848(define-key ctl-x-map "\C-n" 'set-goal-column)
d17a638d 849(define-key global-map "\C-a" 'move-beginning-of-line)
c77ddea7 850(define-key global-map "\C-e" 'move-end-of-line)
4d120e8c 851
ad1cc346
KS
852(define-key ctl-x-map "`" 'next-error)
853
56d62ee1
JL
854(defvar goto-map (make-sparse-keymap)
855 "Keymap for navigation commands.")
856(define-key esc-map "g" goto-map)
857
858(define-key goto-map "g" 'goto-line)
859(define-key goto-map "\M-g" 'goto-line)
860(define-key goto-map "n" 'next-error)
861(define-key goto-map "\M-n" 'next-error)
862(define-key goto-map "p" 'previous-error)
863(define-key goto-map "\M-p" 'previous-error)
864
865(defvar search-map (make-sparse-keymap)
866 "Keymap for search related commands.")
867(define-key esc-map "s" search-map)
868
869(define-key search-map "o" 'occur)
870(define-key search-map "hr" 'highlight-regexp)
871(define-key search-map "hp" 'highlight-phrase)
872(define-key search-map "hl" 'highlight-lines-matching-regexp)
873(define-key search-map "hu" 'unhighlight-regexp)
874(define-key search-map "hf" 'hi-lock-find-patterns)
875(define-key search-map "hw" 'hi-lock-write-interactive-patterns)
ad1cc346 876
4d120e8c
RS
877;;(defun function-key-error ()
878;; (interactive)
1cd7adc6 879;; (error "That function key is not bound to anything"))
4d120e8c
RS
880
881(define-key global-map [menu] 'execute-extended-command)
882(define-key global-map [find] 'search-forward)
883
9d4850e5
GM
884;; Don't do this. We define <delete> in function-key-map instead.
885;(define-key global-map [delete] 'backward-delete-char)
4e4f9651 886
4d120e8c 887;; natural bindings for terminal keycaps --- defined in X keysym order
d391e05c 888(define-key global-map [C-S-backspace] 'kill-whole-line)
f88febbb 889(define-key global-map [home] 'move-beginning-of-line)
1dfca644 890(define-key global-map [C-home] 'beginning-of-buffer)
4d120e8c 891(define-key global-map [M-home] 'beginning-of-buffer-other-window)
480c8cd3 892(define-key esc-map [home] 'beginning-of-buffer-other-window)
db5dce9d 893(define-key global-map [left] 'left-char)
4d120e8c 894(define-key global-map [up] 'previous-line)
db5dce9d 895(define-key global-map [right] 'right-char)
4d120e8c 896(define-key global-map [down] 'next-line)
79ce172a
JL
897(define-key global-map [prior] 'scroll-down-command)
898(define-key global-map [next] 'scroll-up-command)
4d120e8c
RS
899(define-key global-map [C-up] 'backward-paragraph)
900(define-key global-map [C-down] 'forward-paragraph)
901(define-key global-map [C-prior] 'scroll-right)
e980968d 902(put 'scroll-left 'disabled t)
4d120e8c
RS
903(define-key global-map [C-next] 'scroll-left)
904(define-key global-map [M-next] 'scroll-other-window)
480c8cd3 905(define-key esc-map [next] 'scroll-other-window)
4d120e8c 906(define-key global-map [M-prior] 'scroll-other-window-down)
480c8cd3 907(define-key esc-map [prior] 'scroll-other-window-down)
ad1cc346 908(define-key esc-map [?\C-\S-v] 'scroll-other-window-down)
f88febbb 909(define-key global-map [end] 'move-end-of-line)
1dfca644 910(define-key global-map [C-end] 'end-of-buffer)
4d120e8c 911(define-key global-map [M-end] 'end-of-buffer-other-window)
480c8cd3 912(define-key esc-map [end] 'end-of-buffer-other-window)
4d120e8c
RS
913(define-key global-map [begin] 'beginning-of-buffer)
914(define-key global-map [M-begin] 'beginning-of-buffer-other-window)
480c8cd3 915(define-key esc-map [begin] 'beginning-of-buffer-other-window)
4d120e8c
RS
916;; (define-key global-map [select] 'function-key-error)
917;; (define-key global-map [print] 'function-key-error)
918(define-key global-map [execute] 'execute-extended-command)
919(define-key global-map [insert] 'overwrite-mode)
920(define-key global-map [C-insert] 'kill-ring-save)
921(define-key global-map [S-insert] 'yank)
8d79731e
RS
922;; `insertchar' is what term.c produces. Should we change term.c
923;; to produce `insert' instead?
924(define-key global-map [insertchar] 'overwrite-mode)
925(define-key global-map [C-insertchar] 'kill-ring-save)
926(define-key global-map [S-insertchar] 'yank)
4d120e8c
RS
927(define-key global-map [undo] 'undo)
928(define-key global-map [redo] 'repeat-complex-command)
6b61353c
KH
929(define-key global-map [again] 'repeat-complex-command) ; Sun keyboard
930(define-key global-map [open] 'find-file) ; Sun
931;; The following wouldn't work to interrupt running code since C-g is
932;; treated specially in the event loop.
933;; (define-key global-map [stop] 'keyboard-quit) ; Sun
4d120e8c
RS
934;; (define-key global-map [clearline] 'function-key-error)
935(define-key global-map [insertline] 'open-line)
936(define-key global-map [deleteline] 'kill-line)
b8a47412 937(define-key global-map [deletechar] 'delete-forward-char)
4d120e8c
RS
938;; (define-key global-map [backtab] 'function-key-error)
939;; (define-key global-map [f1] 'function-key-error)
940;; (define-key global-map [f2] 'function-key-error)
941;; (define-key global-map [f3] 'function-key-error)
942;; (define-key global-map [f4] 'function-key-error)
943;; (define-key global-map [f5] 'function-key-error)
944;; (define-key global-map [f6] 'function-key-error)
945;; (define-key global-map [f7] 'function-key-error)
946;; (define-key global-map [f8] 'function-key-error)
947;; (define-key global-map [f9] 'function-key-error)
948;; (define-key global-map [f10] 'function-key-error)
949;; (define-key global-map [f11] 'function-key-error)
950;; (define-key global-map [f12] 'function-key-error)
951;; (define-key global-map [f13] 'function-key-error)
952;; (define-key global-map [f14] 'function-key-error)
953;; (define-key global-map [f15] 'function-key-error)
954;; (define-key global-map [f16] 'function-key-error)
955;; (define-key global-map [f17] 'function-key-error)
956;; (define-key global-map [f18] 'function-key-error)
957;; (define-key global-map [f19] 'function-key-error)
958;; (define-key global-map [f20] 'function-key-error)
959;; (define-key global-map [f21] 'function-key-error)
960;; (define-key global-map [f22] 'function-key-error)
961;; (define-key global-map [f23] 'function-key-error)
962;; (define-key global-map [f24] 'function-key-error)
963;; (define-key global-map [f25] 'function-key-error)
964;; (define-key global-map [f26] 'function-key-error)
965;; (define-key global-map [f27] 'function-key-error)
966;; (define-key global-map [f28] 'function-key-error)
967;; (define-key global-map [f29] 'function-key-error)
968;; (define-key global-map [f30] 'function-key-error)
969;; (define-key global-map [f31] 'function-key-error)
970;; (define-key global-map [f32] 'function-key-error)
971;; (define-key global-map [f33] 'function-key-error)
972;; (define-key global-map [f34] 'function-key-error)
973;; (define-key global-map [f35] 'function-key-error)
974;; (define-key global-map [kp-backtab] 'function-key-error)
975;; (define-key global-map [kp-space] 'function-key-error)
976;; (define-key global-map [kp-tab] 'function-key-error)
977;; (define-key global-map [kp-enter] 'function-key-error)
978;; (define-key global-map [kp-f1] 'function-key-error)
979;; (define-key global-map [kp-f2] 'function-key-error)
980;; (define-key global-map [kp-f3] 'function-key-error)
981;; (define-key global-map [kp-f4] 'function-key-error)
982;; (define-key global-map [kp-multiply] 'function-key-error)
983;; (define-key global-map [kp-add] 'function-key-error)
984;; (define-key global-map [kp-separator] 'function-key-error)
985;; (define-key global-map [kp-subtract] 'function-key-error)
986;; (define-key global-map [kp-decimal] 'function-key-error)
987;; (define-key global-map [kp-divide] 'function-key-error)
988;; (define-key global-map [kp-0] 'function-key-error)
989;; (define-key global-map [kp-1] 'function-key-error)
990;; (define-key global-map [kp-2] 'function-key-error)
991;; (define-key global-map [kp-3] 'function-key-error)
992;; (define-key global-map [kp-4] 'function-key-error)
993;; (define-key global-map [kp-5] 'recenter)
994;; (define-key global-map [kp-6] 'function-key-error)
995;; (define-key global-map [kp-7] 'function-key-error)
996;; (define-key global-map [kp-8] 'function-key-error)
997;; (define-key global-map [kp-9] 'function-key-error)
998;; (define-key global-map [kp-equal] 'function-key-error)
999
1000;; X11R6 distinguishes these keys from the non-kp keys.
1001;; Make them behave like the non-kp keys unless otherwise bound.
554efd10
SM
1002;; FIXME: rather than list such mappings for every modifier-combination,
1003;; we should come up with a way to do it generically, something like
1004;; (define-key function-key-map [*-kp-home] [*-home])
4d120e8c
RS
1005(define-key function-key-map [kp-home] [home])
1006(define-key function-key-map [kp-left] [left])
1007(define-key function-key-map [kp-up] [up])
1008(define-key function-key-map [kp-right] [right])
1009(define-key function-key-map [kp-down] [down])
1010(define-key function-key-map [kp-prior] [prior])
1011(define-key function-key-map [kp-next] [next])
1012(define-key function-key-map [M-kp-next] [M-next])
1013(define-key function-key-map [kp-end] [end])
1014(define-key function-key-map [kp-begin] [begin])
1015(define-key function-key-map [kp-insert] [insert])
9d4850e5
GM
1016(define-key function-key-map [backspace] [?\C-?])
1017(define-key function-key-map [delete] [?\C-?])
ee5cece0 1018(define-key function-key-map [kp-delete] [?\C-?])
9761cd3a
EZ
1019(define-key function-key-map [S-kp-end] [S-end])
1020(define-key function-key-map [S-kp-down] [S-down])
1021(define-key function-key-map [S-kp-next] [S-next])
1022(define-key function-key-map [S-kp-left] [S-left])
1023(define-key function-key-map [S-kp-right] [S-right])
1024(define-key function-key-map [S-kp-home] [S-home])
1025(define-key function-key-map [S-kp-up] [S-up])
1026(define-key function-key-map [S-kp-prior] [S-prior])
1027(define-key function-key-map [C-S-kp-end] [C-S-end])
1028(define-key function-key-map [C-S-kp-down] [C-S-down])
1029(define-key function-key-map [C-S-kp-next] [C-S-next])
1030(define-key function-key-map [C-S-kp-left] [C-S-left])
1031(define-key function-key-map [C-S-kp-right] [C-S-right])
1032(define-key function-key-map [C-S-kp-home] [C-S-home])
1033(define-key function-key-map [C-S-kp-up] [C-S-up])
1034(define-key function-key-map [C-S-kp-prior] [C-S-prior])
7bc60154
EZ
1035;; Don't bind shifted keypad numeric keys, they reportedly
1036;; interfere with the feature of some keyboards to produce
1037;; numbers when NumLock is off.
1038;(define-key function-key-map [S-kp-1] [S-end])
1039;(define-key function-key-map [S-kp-2] [S-down])
1040;(define-key function-key-map [S-kp-3] [S-next])
1041;(define-key function-key-map [S-kp-4] [S-left])
1042;(define-key function-key-map [S-kp-6] [S-right])
1043;(define-key function-key-map [S-kp-7] [S-home])
1044;(define-key function-key-map [S-kp-8] [S-up])
1045;(define-key function-key-map [S-kp-9] [S-prior])
9761cd3a
EZ
1046(define-key function-key-map [C-S-kp-1] [C-S-end])
1047(define-key function-key-map [C-S-kp-2] [C-S-down])
1048(define-key function-key-map [C-S-kp-3] [C-S-next])
1049(define-key function-key-map [C-S-kp-4] [C-S-left])
1050(define-key function-key-map [C-S-kp-6] [C-S-right])
1051(define-key function-key-map [C-S-kp-7] [C-S-home])
1052(define-key function-key-map [C-S-kp-8] [C-S-up])
1053(define-key function-key-map [C-S-kp-9] [C-S-prior])
4d120e8c 1054
554efd10
SM
1055;; Hitting C-SPC on text terminals, usually sends the ascii code 0 (aka C-@),
1056;; so we can't distinguish those two keys, but usually we consider C-SPC
1057;; (rather than C-@) as the "canonical" binding.
1058(define-key function-key-map [?\C-@] [?\C-\s])
a7e26d8b
SM
1059;; Many keyboards don't have a `backtab' key, so by convention the user
1060;; can use S-tab instead to access that binding.
1061(define-key function-key-map [S-tab] [backtab])
554efd10 1062
4d120e8c
RS
1063(define-key global-map [mouse-movement] 'ignore)
1064
1065(define-key global-map "\C-t" 'transpose-chars)
1066(define-key esc-map "t" 'transpose-words)
1067(define-key esc-map "\C-t" 'transpose-sexps)
1068(define-key ctl-x-map "\C-t" 'transpose-lines)
1069
5589b330 1070(define-key esc-map ";" 'comment-dwim)
fedff3c6
SM
1071(define-key esc-map "j" 'indent-new-comment-line)
1072(define-key esc-map "\C-j" 'indent-new-comment-line)
5589b330 1073(define-key ctl-x-map ";" 'comment-set-column)
4d120e8c
RS
1074(define-key ctl-x-map "f" 'set-fill-column)
1075(define-key ctl-x-map "$" 'set-selective-display)
1076
1077(define-key esc-map "@" 'mark-word)
1078(define-key esc-map "f" 'forward-word)
1079(define-key esc-map "b" 'backward-word)
1080(define-key esc-map "d" 'kill-word)
1081(define-key esc-map "\177" 'backward-kill-word)
1082
1083(define-key esc-map "<" 'beginning-of-buffer)
1084(define-key esc-map ">" 'end-of-buffer)
1085(define-key ctl-x-map "h" 'mark-whole-buffer)
1086(define-key esc-map "\\" 'delete-horizontal-space)
1087
1088(defalias 'mode-specific-command-prefix (make-sparse-keymap))
4b189189 1089(defvar mode-specific-map (symbol-function 'mode-specific-command-prefix)
4d120e8c
RS
1090 "Keymap for characters following C-c.")
1091(define-key global-map "\C-c" 'mode-specific-command-prefix)
1092
1093(global-set-key [M-right] 'forward-word)
480c8cd3 1094(define-key esc-map [right] 'forward-word)
4d120e8c 1095(global-set-key [M-left] 'backward-word)
480c8cd3 1096(define-key esc-map [left] 'backward-word)
4d120e8c 1097;; ilya@math.ohio-state.edu says these bindings are standard on PC editors.
db5dce9d
EZ
1098(global-set-key [C-right] 'right-word)
1099(global-set-key [C-left] 'left-word)
4d120e8c 1100;; This is not quite compatible, but at least is analogous
7957d2f5
CY
1101(global-set-key [C-delete] 'kill-word)
1102(global-set-key [C-backspace] 'backward-kill-word)
4d120e8c
RS
1103;; This is "move to the clipboard", or as close as we come.
1104(global-set-key [S-delete] 'kill-region)
1105
480c8cd3
AS
1106(global-set-key [C-M-left] 'backward-sexp)
1107(define-key esc-map [C-left] 'backward-sexp)
1108(global-set-key [C-M-right] 'forward-sexp)
1109(define-key esc-map [C-right] 'forward-sexp)
1110(global-set-key [C-M-up] 'backward-up-list)
1111(define-key esc-map [C-up] 'backward-up-list)
1112(global-set-key [C-M-down] 'down-list)
1113(define-key esc-map [C-down] 'down-list)
1114(global-set-key [C-M-home] 'beginning-of-defun)
1115(define-key esc-map [C-home] 'beginning-of-defun)
1116(global-set-key [C-M-end] 'end-of-defun)
1117(define-key esc-map [C-end] 'end-of-defun)
486add9d 1118
4d120e8c
RS
1119(define-key esc-map "\C-f" 'forward-sexp)
1120(define-key esc-map "\C-b" 'backward-sexp)
1121(define-key esc-map "\C-u" 'backward-up-list)
1122(define-key esc-map "\C-@" 'mark-sexp)
1123(define-key esc-map [?\C-\ ] 'mark-sexp)
1124(define-key esc-map "\C-d" 'down-list)
1125(define-key esc-map "\C-k" 'kill-sexp)
0c3a466c
RS
1126;;; These are dangerous in various situations,
1127;;; so let's not encourage anyone to use them.
1128;;;(define-key global-map [C-M-delete] 'backward-kill-sexp)
1129;;;(define-key global-map [C-M-backspace] 'backward-kill-sexp)
da7ddbed
GM
1130(define-key esc-map [C-delete] 'backward-kill-sexp)
1131(define-key esc-map [C-backspace] 'backward-kill-sexp)
4d120e8c
RS
1132(define-key esc-map "\C-n" 'forward-list)
1133(define-key esc-map "\C-p" 'backward-list)
1134(define-key esc-map "\C-a" 'beginning-of-defun)
1135(define-key esc-map "\C-e" 'end-of-defun)
1136(define-key esc-map "\C-h" 'mark-defun)
1137(define-key ctl-x-map "nd" 'narrow-to-defun)
1138(define-key esc-map "(" 'insert-parentheses)
1139(define-key esc-map ")" 'move-past-close-and-reindent)
4d120e8c
RS
1140
1141(define-key ctl-x-map "\C-e" 'eval-last-sexp)
6d64bc9f
RS
1142
1143(define-key ctl-x-map "m" 'compose-mail)
1144(define-key ctl-x-4-map "m" 'compose-mail-other-window)
1145(define-key ctl-x-5-map "m" 'compose-mail-other-frame)
4d120e8c 1146\f
d455ee85
JL
1147
1148(defvar ctl-x-r-map (make-sparse-keymap)
1149 "Keymap for subcommands of C-x r.")
1150(define-key ctl-x-map "r" ctl-x-r-map)
4d120e8c 1151
792eb719 1152(define-key esc-map "q" 'fill-paragraph)
4d120e8c
RS
1153(define-key ctl-x-map "." 'set-fill-prefix)
1154\f
1155(define-key esc-map "{" 'backward-paragraph)
1156(define-key esc-map "}" 'forward-paragraph)
1157(define-key esc-map "h" 'mark-paragraph)
1158(define-key esc-map "a" 'backward-sentence)
1159(define-key esc-map "e" 'forward-sentence)
1160(define-key esc-map "k" 'kill-sentence)
1161(define-key ctl-x-map "\177" 'backward-kill-sentence)
1162
1163(define-key ctl-x-map "[" 'backward-page)
1164(define-key ctl-x-map "]" 'forward-page)
1165(define-key ctl-x-map "\C-p" 'mark-page)
1166(define-key ctl-x-map "l" 'count-lines-page)
1167(define-key ctl-x-map "np" 'narrow-to-page)
1168;; (define-key ctl-x-map "p" 'narrow-to-page)
1169\f
d455ee85
JL
1170(defvar abbrev-map (make-sparse-keymap)
1171 "Keymap for abbrev commands.")
1172(define-key ctl-x-map "a" abbrev-map)
1173
1174(define-key abbrev-map "l" 'add-mode-abbrev)
1175(define-key abbrev-map "\C-a" 'add-mode-abbrev)
1176(define-key abbrev-map "g" 'add-global-abbrev)
1177(define-key abbrev-map "+" 'add-mode-abbrev)
1178(define-key abbrev-map "ig" 'inverse-add-global-abbrev)
1179(define-key abbrev-map "il" 'inverse-add-mode-abbrev)
1180;; (define-key abbrev-map "\C-h" 'inverse-add-global-abbrev)
1181(define-key abbrev-map "-" 'inverse-add-global-abbrev)
1182(define-key abbrev-map "e" 'expand-abbrev)
1183(define-key abbrev-map "'" 'expand-abbrev)
4d120e8c
RS
1184;; (define-key ctl-x-map "\C-a" 'add-mode-abbrev)
1185;; (define-key ctl-x-map "\+" 'add-global-abbrev)
1186;; (define-key ctl-x-map "\C-h" 'inverse-add-mode-abbrev)
1187;; (define-key ctl-x-map "\-" 'inverse-add-global-abbrev)
1188(define-key esc-map "'" 'abbrev-prefix-mark)
1189(define-key ctl-x-map "'" 'expand-abbrev)
1190
aa5ba90e 1191(define-key ctl-x-map "z" 'repeat)
e4ade21b 1192
ef2cfb2e
RS
1193(define-key esc-map "\C-l" 'reposition-window)
1194
1195(define-key ctl-x-4-map "a" 'add-change-log-entry-other-window)
ad1cc346
KS
1196(define-key ctl-x-4-map "c" 'clone-indirect-buffer-other-window)
1197
56c5808a 1198;; Signal handlers
653a9100
KS
1199(define-key special-event-map [sigusr1] 'ignore)
1200(define-key special-event-map [sigusr2] 'ignore)
56c5808a 1201
d1bf2a73
SM
1202;; Don't look for autoload cookies in this file.
1203;; Local Variables:
1204;; no-update-autoloads: t
1205;; End:
4d120e8c 1206
6455508d 1207;; arch-tag: 23b5c7e6-e47b-49ed-8c6c-ed213c5fffe0
4d120e8c 1208;;; bindings.el ends here