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