]> code.delx.au - gnu-emacs/blobdiff - lisp/bindings.el
* lwlib-utils.c (XtCompositeChildren): Likewise.
[gnu-emacs] / lisp / bindings.el
index 139a4853918e2d8929dde657a23d4e16c409c781..4d9f4f09e5822dd3d439b77d9f6d0321546c8e31 100644 (file)
@@ -1,11 +1,11 @@
 ;;; bindings.el --- define standard key bindings and some variables
 
-;; Copyright (C) 1985, 1986, 1987, 1992, 1993, 1994, 1995, 1996, 1999,
-;;   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+;; Copyright (C) 1985-1987, 1992-1996, 1999-2011
 ;;   Free Software Foundation, Inc.
 
 ;; Maintainer: FSF
 ;; Keywords: internal
+;; Package: emacs
 
 ;; This file is part of GNU Emacs.
 
@@ -62,24 +62,6 @@ corresponding to the mode line clicked."
     (force-mode-line-update)))
 
 
-(defun mode-line-abbrev-mode (event)
-  "Turn off `abbrev-mode' from the mode-line."
-  (interactive "e")
-  (save-selected-window
-    (select-window (posn-window (event-start event)))
-    (abbrev-mode)
-    (force-mode-line-update)))
-
-
-(defun mode-line-auto-fill-mode (event)
-  "Turn off `auto-fill-mode' from the mode-line."
-  (interactive "e")
-  (save-selected-window
-    (select-window (posn-window (event-start event)))
-    (auto-fill-mode)
-    (force-mode-line-update)))
-
-
 (defvar mode-line-input-method-map
   (let ((map (make-sparse-keymap)))
     (define-key map [mode-line mouse-2]
@@ -151,9 +133,9 @@ corresponding to the mode line clicked."
 (defvar mode-line-client
   `(""
     (:propertize ("" (:eval (if (frame-parameter nil 'client) "@" "")))
-                help-echo "emacsclient frame"))
+                help-echo ,(purecopy "emacsclient frame")))
   "Mode-line control for identifying emacsclient frames.")
-;; Autoload all risky properties if this file no longer dumped.
+;;;###autoload
 (put 'mode-line-client 'risky-local-variable t)
 
 (defvar mode-line-mule-info
@@ -161,11 +143,11 @@ corresponding to the mode line clicked."
     (current-input-method
      (:propertize ("" current-input-method-title)
                  help-echo (concat
-                            "Current input method: "
+                            ,(purecopy "Current input method: ")
                             current-input-method
-                            "\n\
+                            ,(purecopy "\n\
 mouse-2: Disable input method\n\
-mouse-3: Describe current input method")
+mouse-3: Describe current input method"))
                  local-map ,mode-line-input-method-map
                  mouse-face mode-line-highlight))
     ,(propertize
@@ -196,6 +178,7 @@ mnemonics of the following coding systems:
   ;;  coding system for encoding text to send to buffer process (if any)."
 )
 
+;;;###autoload
 (put 'mode-line-mule-info 'risky-local-variable t)
 (make-variable-buffer-local 'mode-line-mule-info)
 
@@ -212,12 +195,14 @@ Value is used for `mode-line-frame-identification', which see."
 ;; the mode line is actually displayed.
 (defvar mode-line-frame-identification '(:eval (mode-line-frame-control))
   "Mode-line control to describe the current frame.")
+;;;###autoload
 (put 'mode-line-frame-identification 'risky-local-variable t)
 
 (defvar mode-line-process nil "\
 Mode-line control for displaying info on process status.
 Normally nil in most modes, since there is no process to display.")
 
+;;;###autoload
 (put 'mode-line-process 'risky-local-variable t)
 (make-variable-buffer-local 'mode-line-process)
 
@@ -249,6 +234,7 @@ Normally nil in most modes, since there is no process to display.")
         'mouse-face 'mode-line-highlight))
   "Mode-line control for displaying whether current buffer is modified.")
 
+;;;###autoload
 (put 'mode-line-modified 'risky-local-variable t)
 (make-variable-buffer-local 'mode-line-modified)
 
@@ -266,6 +252,7 @@ Normally nil in most modes, since there is no process to display.")
                                             "Current directory is local: ")
                                           default-directory)))))))
   "Mode-line flag to show if default-directory for current buffer is remote.")
+;;;###autoload
 (put 'mode-line-remote 'risky-local-variable t)
 
 (make-variable-buffer-local 'mode-line-remote)
@@ -275,10 +262,12 @@ Normally nil in most modes, since there is no process to display.")
   "Mode-line control for displaying the position in the buffer.
 Normally displays the buffer percentage and, optionally, the
 buffer size, the line number and the column number.")
+;;;###autoload
 (put 'mode-line-position 'risky-local-variable t)
 
 (defvar mode-line-modes nil
   "Mode-line control for displaying major and minor modes.")
+;;;###autoload
 (put 'mode-line-modes 'risky-local-variable t)
 
 (defvar mode-line-mode-menu (make-sparse-keymap "Minor Modes") "\
@@ -287,7 +276,7 @@ Menu of mode operations in the mode line.")
 (defvar mode-line-major-mode-keymap
   (let ((map (make-sparse-keymap)))
     (define-key map [mode-line down-mouse-1]
-      '(menu-item "Menu Bar" ignore
+      `(menu-item ,(purecopy "Menu Bar") ignore
         :filter (lambda (_) (mouse-menu-major-mode-map))))
     (define-key map [mode-line mouse-2] 'describe-mode)
     (define-key map [mode-line down-mouse-3] mode-line-mode-menu)
@@ -308,11 +297,11 @@ Keymap to display on minor modes.")
        (menu-map (make-sparse-keymap "Toggle Line and Column Number Display")))
     (define-key menu-map [line-number-mode]
       `(menu-item ,(purecopy "Display Line Numbers") line-number-mode
-                 :help "Toggle displaying line numbers in the mode-line"
+                 :help ,(purecopy "Toggle displaying line numbers in the mode-line")
                  :button (:toggle . line-number-mode)))
     (define-key menu-map [column-number-mode]
       `(menu-item ,(purecopy "Display Column Numbers") column-number-mode
-                 :help "Toggle displaying column numbers in the mode-line"
+                 :help ,(purecopy "Toggle displaying column numbers in the mode-line")
                  :button (:toggle . column-number-mode)))
     (define-key map [mode-line down-mouse-1] menu-map)
     map) "\
@@ -328,7 +317,7 @@ Keymap to display on column and line numbers.")
 mouse-2: Make current window occupy the whole frame\n\
 mouse-3: Remove current window from display")
        (recursive-edit-help-echo "Recursive edit, type C-M-c to get out")
-       (dashes (propertize "--" 'help-echo help-echo))
+       (spaces (propertize " " 'help-echo help-echo))
        (standard-mode-line-format
        (list
         "%e"
@@ -344,9 +333,10 @@ mouse-3: Remove current window from display")
         '(vc-mode vc-mode)
         (propertize "  " 'help-echo help-echo)
         'mode-line-modes
-        `(which-func-mode ("" which-func-format ,dashes))
-        `(global-mode-string ("" global-mode-string ,dashes))
-        (propertize "-%-" 'help-echo help-echo)))
+        `(which-func-mode ("" which-func-format ,spaces))
+        `(global-mode-string ("" global-mode-string ,spaces))
+        `(:eval (unless (display-graphic-p)
+                  ,(propertize "-%-" 'help-echo help-echo)))))
        (standard-mode-line-modes
        (list
         (propertize "%[" 'help-echo recursive-edit-help-echo)
@@ -372,7 +362,7 @@ mouse-3: Toggle minor modes"
                                 'mouse-2 #'mode-line-widen))
         (propertize ")" 'help-echo help-echo)
         (propertize "%]" 'help-echo recursive-edit-help-echo)
-        (propertize "--" 'help-echo help-echo)))
+        spaces))
 
        (standard-mode-line-position
        `((-3 ,(propertize
@@ -458,6 +448,7 @@ Its default value is (\"%12b\") with some text properties added.
 Major modes that edit things other than ordinary files may change this
 \(e.g. Info, Dired,...)")
 
+;;;###autoload
 (put 'mode-line-buffer-identification 'risky-local-variable t)
 (make-variable-buffer-local 'mode-line-buffer-identification)
 
@@ -565,6 +556,7 @@ STRING is included in the mode line if VARIABLE's value is non-nil.
 
 Actually, STRING need not be a string; any possible mode-line element
 is okay.  See `mode-line-format'.")
+;;;###autoload
 (put 'minor-mode-alist 'risky-local-variable t)
 ;; Don't use purecopy here--some people want to change these strings.
 (setq minor-mode-alist
@@ -584,11 +576,14 @@ is okay.  See `mode-line-format'.")
 (setq completion-ignored-extensions
       (append
        (cond ((memq system-type '(ms-dos windows-nt))
+             (mapcar 'purecopy
              '(".o" "~" ".bin" ".bak" ".obj" ".map" ".ico" ".pif" ".lnk"
-               ".a" ".ln" ".blg" ".bbl" ".dll" ".drv" ".vxd" ".386"))
+               ".a" ".ln" ".blg" ".bbl" ".dll" ".drv" ".vxd" ".386")))
             (t
+             (mapcar 'purecopy
              '(".o" "~" ".bin" ".lbin" ".so"
-               ".a" ".ln" ".blg" ".bbl")))
+               ".a" ".ln" ".blg" ".bbl"))))
+       (mapcar 'purecopy
        '(".elc" ".lof"
         ".glo" ".idx" ".lot"
         ;; VCS metadata directories
@@ -615,7 +610,7 @@ is okay.  See `mode-line-format'.")
         ".cp" ".fn" ".ky" ".pg" ".tp" ".vr"
         ".cps" ".fns" ".kys" ".pgs" ".tps" ".vrs"
         ;; Python byte-compiled
-        ".pyc" ".pyo")))
+        ".pyc" ".pyo"))))
 
 ;; Suffixes used for executables.
 (setq exec-suffixes
@@ -628,24 +623,24 @@ is okay.  See `mode-line-format'.")
 ;; Packages should add to this list appropriately when they are
 ;; loaded, rather than listing everything here.
 (setq debug-ignored-errors
-      '(beginning-of-line beginning-of-buffer end-of-line
+      `(beginning-of-line beginning-of-buffer end-of-line
        end-of-buffer end-of-file buffer-read-only
        file-supersession
-       "^Previous command was not a yank$"
-       "^Minibuffer window is not active$"
-       "^No previous history search regexp$"
-       "^No later matching history item$"
-       "^No earlier matching history item$"
-       "^End of history; no default available$"
-       "^End of defaults; no next item$"
-       "^Beginning of history; no preceding item$"
-       "^No recursive edit is in progress$"
-       "^Changes to be undone are outside visible portion of buffer$"
-       "^No undo information in this buffer$"
-       "^No further undo information"
-       "^Save not confirmed$"
-       "^Recover-file cancelled\\.$"
-       "^Cannot switch buffers in a dedicated window$"
+       ,(purecopy "^Previous command was not a yank$")
+       ,(purecopy "^Minibuffer window is not active$")
+       ,(purecopy "^No previous history search regexp$")
+       ,(purecopy "^No later matching history item$")
+       ,(purecopy "^No earlier matching history item$")
+       ,(purecopy "^End of history; no default available$")
+       ,(purecopy "^End of defaults; no next item$")
+       ,(purecopy "^Beginning of history; no preceding item$")
+       ,(purecopy "^No recursive edit is in progress$")
+       ,(purecopy "^Changes to be undone are outside visible portion of buffer$")
+       ,(purecopy "^No undo information in this buffer$")
+       ,(purecopy "^No further undo information")
+       ,(purecopy "^Save not confirmed$")
+       ,(purecopy "^Recover-file cancelled\\.$")
+       ,(purecopy "^Cannot switch buffers in a dedicated window$")
         ))
 
 
@@ -659,23 +654,15 @@ is okay.  See `mode-line-format'.")
 
 (define-key esc-map "\t" 'complete-symbol)
 
-(defun complete-symbol (arg) "\
-Perform tags completion on the text around point.
-Completes to the set of names listed in the current tags table.
-The string to complete is chosen in the same way as the default
-for \\[find-tag] (which see).
+(defun complete-symbol (arg)
+  "Perform completion on the text around point.
+The completion method is determined by `completion-at-point-functions'.
 
 With a prefix argument, this command does completion within
 the collection of symbols listed in the index of the manual for the
 language you are using."
   (interactive "P")
-  (if arg
-      (info-complete-symbol)
-    (if (fboundp 'complete-tag)
-       (complete-tag)
-      ;; Don't autoload etags if we have no tags table.
-      (error "%s" (substitute-command-keys
-             "No tags table loaded; use \\[visit-tags-table] to load one")))))
+  (if arg (info-complete-symbol) (completion-at-point)))
 
 ;; Reduce total amount of space we must allocate during this function
 ;; that we will not need to keep permanently.
@@ -702,6 +689,63 @@ language you are using."
 ;but they are not assigned to keys there.
 (put 'narrow-to-region 'disabled t)
 
+;; Moving with arrows in bidi-sensitive direction.
+(defun right-char (&optional n)
+  "Move point N characters to the right (to the left if N is negative).
+On reaching beginning or end of buffer, stop and signal error.
+
+Depending on the bidirectional context, this may move either forward
+or backward in the buffer.  This is in contrast with \\[forward-char]
+and \\[backward-char], which see."
+  (interactive "^p")
+  (if (eq (current-bidi-paragraph-direction) 'left-to-right)
+      (forward-char n)
+    (backward-char n)))
+
+(defun left-char ( &optional n)
+  "Move point N characters to the left (to the right if N is negative).
+On reaching beginning or end of buffer, stop and signal error.
+
+Depending on the bidirectional context, this may move either backward
+or forward in the buffer.  This is in contrast with \\[backward-char]
+and \\[forward-char], which see."
+  (interactive "^p")
+  (if (eq (current-bidi-paragraph-direction) 'left-to-right)
+      (backward-char n)
+    (forward-char n)))
+
+(defun right-word (&optional n)
+  "Move point N words to the right (to the left if N is negative).
+
+Depending on the bidirectional context, this may move either forward
+or backward in the buffer.  This is in contrast with \\[forward-word]
+and \\[backward-word], which see.
+
+Value is normally t.
+If an edge of the buffer or a field boundary is reached, point is left there
+there and the function returns nil.  Field boundaries are not noticed
+if `inhibit-field-text-motion' is non-nil."
+  (interactive "^p")
+  (if (eq (current-bidi-paragraph-direction) 'left-to-right)
+      (forward-word n)
+    (backward-word n)))
+
+(defun left-word (&optional n)
+  "Move point N words to the left (to the right if N is negative).
+
+Depending on the bidirectional context, this may move either backward
+or forward in the buffer.  This is in contrast with \\[backward-word]
+and \\[forward-word], which see.
+
+Value is normally t.
+If an edge of the buffer or a field boundary is reached, point is left there
+there and the function returns nil.  Field boundaries are not noticed
+if `inhibit-field-text-motion' is non-nil."
+  (interactive "^p")
+  (if (eq (current-bidi-paragraph-direction) 'left-to-right)
+      (backward-word n)
+    (forward-word n)))
+
 (defvar narrow-map (make-sparse-keymap)
   "Keymap for narrowing commands.")
 (define-key ctl-x-map "n" narrow-map)
@@ -789,6 +833,9 @@ language you are using."
     (setq i (1+ i))))
 (define-key global-map [?\C-\M--] 'negative-argument)
 
+(define-key global-map "\177" 'delete-backward-char)
+(define-key global-map "\C-d" 'delete-char)
+
 (define-key global-map "\C-k" 'kill-line)
 (define-key global-map "\C-w" 'kill-region)
 (define-key esc-map "w" 'kill-ring-save)
@@ -852,12 +899,12 @@ language you are using."
 (define-key global-map [C-home]                'beginning-of-buffer)
 (define-key global-map [M-home]                'beginning-of-buffer-other-window)
 (define-key esc-map    [home]          'beginning-of-buffer-other-window)
-(define-key global-map [left]          'backward-char)
+(define-key global-map [left]          'left-char)
 (define-key global-map [up]            'previous-line)
-(define-key global-map [right]         'forward-char)
+(define-key global-map [right]         'right-char)
 (define-key global-map [down]          'next-line)
-(define-key global-map [prior]         'scroll-down)
-(define-key global-map [next]          'scroll-up)
+(define-key global-map [prior]         'scroll-down-command)
+(define-key global-map [next]          'scroll-up-command)
 (define-key global-map [C-up]          'backward-paragraph)
 (define-key global-map [C-down]                'forward-paragraph)
 (define-key global-map [C-prior]       'scroll-right)
@@ -896,7 +943,7 @@ language you are using."
 ;; (define-key global-map [clearline]  'function-key-error)
 (define-key global-map [insertline]    'open-line)
 (define-key global-map [deleteline]    'kill-line)
-(define-key global-map [deletechar]    'delete-char)
+(define-key global-map [deletechar]    'delete-forward-char)
 ;; (define-key global-map [backtab]    'function-key-error)
 ;; (define-key global-map [f1]         'function-key-error)
 ;; (define-key global-map [f2]         'function-key-error)
@@ -961,6 +1008,9 @@ language you are using."
 
 ;; X11R6 distinguishes these keys from the non-kp keys.
 ;; Make them behave like the non-kp keys unless otherwise bound.
+;; FIXME: rather than list such mappings for every modifier-combination,
+;;   we should come up with a way to do it generically, something like
+;;   (define-key function-key-map [*-kp-home] [*-home])
 (define-key function-key-map [kp-home] [home])
 (define-key function-key-map [kp-left] [left])
 (define-key function-key-map [kp-up] [up])
@@ -1011,6 +1061,14 @@ language you are using."
 (define-key function-key-map [C-S-kp-8] [C-S-up])
 (define-key function-key-map [C-S-kp-9] [C-S-prior])
 
+;; Hitting C-SPC on text terminals, usually sends the ascii code 0 (aka C-@),
+;; so we can't distinguish those two keys, but usually we consider C-SPC
+;; (rather than C-@) as the "canonical" binding.
+(define-key function-key-map [?\C-@] [?\C-\s])
+;; Many keyboards don't have a `backtab' key, so by convention the user
+;; can use S-tab instead to access that binding.
+(define-key function-key-map [S-tab] [backtab])
+
 (define-key global-map [mouse-movement] 'ignore)
 
 (define-key global-map "\C-t" 'transpose-chars)
@@ -1046,8 +1104,8 @@ language you are using."
 (global-set-key [M-left]   'backward-word)
 (define-key esc-map [left] 'backward-word)
 ;; ilya@math.ohio-state.edu says these bindings are standard on PC editors.
-(global-set-key [C-right]  'forward-word)
-(global-set-key [C-left]   'backward-word)
+(global-set-key [C-right]  'right-word)
+(global-set-key [C-left]   'left-word)
 ;; This is not quite compatible, but at least is analogous
 (global-set-key [C-delete] 'kill-word)
 (global-set-key [C-backspace] 'backward-kill-word)
@@ -1155,5 +1213,4 @@ language you are using."
 ;; no-update-autoloads: t
 ;; End:
 
-;; arch-tag: 23b5c7e6-e47b-49ed-8c6c-ed213c5fffe0
 ;;; bindings.el ends here