X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/31ca4639ad1bfaa355a3f30ef92eb977bd2c6b78..285f1858c328e250c78ec422a311a4b7fcc3d633:/lisp/bindings.el diff --git a/lisp/bindings.el b/lisp/bindings.el index b92d5e9a1e..416f6337d6 100644 --- a/lisp/bindings.el +++ b/lisp/bindings.el @@ -1,9 +1,9 @@ ;;; bindings.el --- define standard key bindings and some variables -;; Copyright (C) 1985-1987, 1992-1996, 1999-2012 -;; Free Software Foundation, Inc. +;; Copyright (C) 1985-1987, 1992-1996, 1999-2014 Free Software +;; Foundation, Inc. -;; Maintainer: FSF +;; Maintainer: emacs-devel@gnu.org ;; Keywords: internal ;; Package: emacs @@ -38,24 +38,20 @@ corresponding to the mode line clicked." (defun mode-line-toggle-read-only (event) "Like `toggle-read-only', for the mode-line." (interactive "e") - (save-selected-window - (select-window (posn-window (event-start event))) - (with-no-warnings (toggle-read-only)) - (force-mode-line-update))) + (with-selected-window (posn-window (event-start event)) + (read-only-mode 'toggle))) (defun mode-line-toggle-modified (event) "Toggle the buffer-modified flag from the mode-line." (interactive "e") - (save-selected-window - (select-window (posn-window (event-start event))) + (with-selected-window (posn-window (event-start event)) (set-buffer-modified-p (not (buffer-modified-p))) (force-mode-line-update))) (defun mode-line-widen (event) "Widen a buffer from the mode-line." (interactive "e") - (save-selected-window - (select-window (posn-window (event-start event))) + (with-selected-window (posn-window (event-start event)) (widen) (force-mode-line-update))) @@ -64,17 +60,13 @@ corresponding to the mode line clicked." (define-key map [mode-line mouse-2] (lambda (e) (interactive "e") - (save-selected-window - (select-window - (posn-window (event-start e))) + (with-selected-window (posn-window (event-start e)) (toggle-input-method) (force-mode-line-update)))) (define-key map [mode-line mouse-3] (lambda (e) (interactive "e") - (save-selected-window - (select-window - (posn-window (event-start e))) + (with-selected-window (posn-window (event-start e)) (describe-current-input-method)))) (purecopy map))) @@ -83,16 +75,14 @@ corresponding to the mode line clicked." (define-key map [mode-line mouse-1] (lambda (e) (interactive "e") - (save-selected-window - (select-window (posn-window (event-start e))) + (with-selected-window (posn-window (event-start e)) (when (and enable-multibyte-characters buffer-file-coding-system) (describe-coding-system buffer-file-coding-system))))) (define-key map [mode-line mouse-3] (lambda (e) (interactive "e") - (save-selected-window - (select-window (posn-window (event-start e))) + (with-selected-window (posn-window (event-start e)) (call-interactively 'set-buffer-file-coding-system)))) (purecopy map)) "Local keymap for the coding-system part of the mode line.") @@ -144,7 +134,7 @@ message to display when the mouse is moved over the mode line. If the text at the mouse position has a `help-echo' text property, that overrides this variable." :type '(choice (const :tag "No help" :value nil) string) - :version "24.2" + :version "24.3" :group 'mode-line) (defvar mode-line-front-space '(:eval (if (display-graphic-p) " " "-")) @@ -238,8 +228,7 @@ mnemonics of the following coding systems: 'mouse-face 'mode-line-highlight 'help-echo (purecopy (lambda (window _object _point) (format "%s" - (save-selected-window - (select-window window) + (with-selected-window window (concat (if (file-remote-p default-directory) "Current directory is remote: " @@ -273,14 +262,34 @@ Normally nil in most modes, since there is no process to display.") (put 'mode-line-process 'risky-local-variable t) (make-variable-buffer-local 'mode-line-process) +(defun bindings--define-key (map key item) + "Make as much as possible of the menus pure." + (declare (indent 2)) + (define-key map key + (cond + ((not (consp item)) item) ;Not sure that could be other than a symbol. + ;; Keymaps can't be made pure otherwise users can't remove/add elements + ;; from/to them any more. + ((keymapp item) item) + ((stringp (car item)) + (if (keymapp (cdr item)) + (cons (purecopy (car item)) (cdr item)) + (purecopy item))) + ((eq 'menu-item (car item)) + (if (keymapp (nth 2 item)) + `(menu-item ,(purecopy (nth 1 item)) ,(nth 2 item) + ,@(purecopy (nthcdr 3 item))) + (purecopy item))) + (t (message "non-menu-item: %S" item) item)))) + (defvar mode-line-mode-menu (make-sparse-keymap "Minor Modes") "\ 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 ,(purecopy "Menu Bar") ignore - :filter (lambda (_) (mouse-menu-major-mode-map)))) + (bindings--define-key map [mode-line down-mouse-1] + `(menu-item "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) map) "\ @@ -327,13 +336,13 @@ mouse-3: Toggle minor modes" (defvar mode-line-column-line-number-mode-map (let ((map (make-sparse-keymap)) (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 ,(purecopy "Toggle displaying line numbers in the mode-line") + (bindings--define-key menu-map [line-number-mode] + '(menu-item "Display Line Numbers" line-number-mode + :help "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 ,(purecopy "Toggle displaying column numbers in the mode-line") + (bindings--define-key menu-map [column-number-mode] + '(menu-item "Display Column Numbers" column-number-mode + :help "Toggle displaying column numbers in the mode-line" :button (:toggle . column-number-mode))) (define-key map [mode-line down-mouse-1] menu-map) map) "\ @@ -455,15 +464,13 @@ By default, this shows the information specified by (defun mode-line-unbury-buffer (event) "\ Call `unbury-buffer' in this window." (interactive "e") - (save-selected-window - (select-window (posn-window (event-start event))) + (with-selected-window (posn-window (event-start event)) (unbury-buffer))) (defun mode-line-bury-buffer (event) "\ Like `bury-buffer', but temporarily select EVENT's window." (interactive "e") - (save-selected-window - (select-window (posn-window (event-start event))) + (with-selected-window (posn-window (event-start event)) (bury-buffer))) (defun mode-line-other-buffer () "\ @@ -474,15 +481,13 @@ Switch to the most recently selected buffer other than the current one." (defun mode-line-next-buffer (event) "Like `next-buffer', but temporarily select EVENT's window." (interactive "e") - (save-selected-window - (select-window (posn-window (event-start event))) + (with-selected-window (posn-window (event-start event)) (next-buffer))) (defun mode-line-previous-buffer (event) "Like `previous-buffer', but temporarily select EVENT's window." (interactive "e") - (save-selected-window - (select-window (posn-window (event-start event))) + (with-selected-window (posn-window (event-start event)) (previous-buffer))) (defmacro bound-and-true-p (var) @@ -491,51 +496,51 @@ Switch to the most recently selected buffer other than the current one." ;; Use mode-line-mode-menu for local minor-modes only. ;; Global ones can go on the menubar (Options --> Show/Hide). -(define-key mode-line-mode-menu [overwrite-mode] - `(menu-item ,(purecopy "Overwrite (Ovwrt)") overwrite-mode - :help ,(purecopy "Overwrite mode: typed characters replace existing text") +(bindings--define-key mode-line-mode-menu [overwrite-mode] + '(menu-item "Overwrite (Ovwrt)" overwrite-mode + :help "Overwrite mode: typed characters replace existing text" :button (:toggle . overwrite-mode))) -(define-key mode-line-mode-menu [outline-minor-mode] - `(menu-item ,(purecopy "Outline (Outl)") outline-minor-mode +(bindings--define-key mode-line-mode-menu [outline-minor-mode] + '(menu-item "Outline (Outl)" outline-minor-mode ;; XXX: This needs a good, brief description. - :help ,(purecopy "") + :help "" :button (:toggle . (bound-and-true-p outline-minor-mode)))) -(define-key mode-line-mode-menu [highlight-changes-mode] - `(menu-item ,(purecopy "Highlight changes (Chg)") highlight-changes-mode - :help ,(purecopy "Show changes in the buffer in a distinctive color") +(bindings--define-key mode-line-mode-menu [highlight-changes-mode] + '(menu-item "Highlight changes (Chg)" highlight-changes-mode + :help "Show changes in the buffer in a distinctive color" :button (:toggle . (bound-and-true-p highlight-changes-mode)))) -(define-key mode-line-mode-menu [hide-ifdef-mode] - `(menu-item ,(purecopy "Hide ifdef (Ifdef)") hide-ifdef-mode - :help ,(purecopy "Show/Hide code within #ifdef constructs") +(bindings--define-key mode-line-mode-menu [hide-ifdef-mode] + '(menu-item "Hide ifdef (Ifdef)" hide-ifdef-mode + :help "Show/Hide code within #ifdef constructs" :button (:toggle . (bound-and-true-p hide-ifdef-mode)))) -(define-key mode-line-mode-menu [glasses-mode] - `(menu-item ,(purecopy "Glasses (o^o)") glasses-mode - :help ,(purecopy "Insert virtual separators to make long identifiers easy to read") +(bindings--define-key mode-line-mode-menu [glasses-mode] + '(menu-item "Glasses (o^o)" glasses-mode + :help "Insert virtual separators to make long identifiers easy to read" :button (:toggle . (bound-and-true-p glasses-mode)))) -(define-key mode-line-mode-menu [font-lock-mode] - `(menu-item ,(purecopy "Font Lock") font-lock-mode - :help ,(purecopy "Syntax coloring") +(bindings--define-key mode-line-mode-menu [font-lock-mode] + '(menu-item "Font Lock" font-lock-mode + :help "Syntax coloring" :button (:toggle . font-lock-mode))) -(define-key mode-line-mode-menu [flyspell-mode] - `(menu-item ,(purecopy "Flyspell (Fly)") flyspell-mode - :help ,(purecopy "Spell checking on the fly") +(bindings--define-key mode-line-mode-menu [flyspell-mode] + '(menu-item "Flyspell (Fly)" flyspell-mode + :help "Spell checking on the fly" :button (:toggle . (bound-and-true-p flyspell-mode)))) -(define-key mode-line-mode-menu [auto-revert-tail-mode] - `(menu-item ,(purecopy "Auto revert tail (Tail)") auto-revert-tail-mode - :help ,(purecopy "Revert the tail of the buffer when buffer grows") +(bindings--define-key mode-line-mode-menu [auto-revert-tail-mode] + '(menu-item "Auto revert tail (Tail)" auto-revert-tail-mode + :help "Revert the tail of the buffer when buffer grows" :enable (buffer-file-name) :button (:toggle . (bound-and-true-p auto-revert-tail-mode)))) -(define-key mode-line-mode-menu [auto-revert-mode] - `(menu-item ,(purecopy "Auto revert (ARev)") auto-revert-mode - :help ,(purecopy "Revert the buffer when the file on disk changes") +(bindings--define-key mode-line-mode-menu [auto-revert-mode] + '(menu-item "Auto revert (ARev)" auto-revert-mode + :help "Revert the buffer when the file on disk changes" :button (:toggle . (bound-and-true-p auto-revert-mode)))) -(define-key mode-line-mode-menu [auto-fill-mode] - `(menu-item ,(purecopy "Auto fill (Fill)") auto-fill-mode - :help ,(purecopy "Automatically insert new lines") +(bindings--define-key mode-line-mode-menu [auto-fill-mode] + '(menu-item "Auto fill (Fill)" auto-fill-mode + :help "Automatically insert new lines" :button (:toggle . auto-fill-function))) -(define-key mode-line-mode-menu [abbrev-mode] - `(menu-item ,(purecopy "Abbrev (Abbrev)") abbrev-mode - :help ,(purecopy "Automatically expand abbreviations") +(bindings--define-key mode-line-mode-menu [abbrev-mode] + '(menu-item "Abbrev (Abbrev)" abbrev-mode + :help "Automatically expand abbreviations" :button (:toggle . abbrev-mode))) (defun mode-line-minor-mode-help (event) @@ -630,9 +635,22 @@ okay. See `mode-line-format'.") user-error ;; That's the main one! )) - (make-variable-buffer-local 'indent-tabs-mode) +;; These per-buffer variables are never reset by +;; `kill-all-local-variables', because they have no default value. +;; For consistency, we give them the `permanent-local' property, even +;; though `kill-all-local-variables' does not actually consult it. + +(mapc (lambda (sym) (put sym 'permanent-local t)) + '(buffer-file-name default-directory buffer-backed-up + buffer-saved-size buffer-auto-save-file-name + buffer-read-only buffer-undo-list mark-active + point-before-scroll buffer-file-truename + buffer-file-format buffer-auto-save-file-format + buffer-display-count buffer-display-time + enable-multibyte-characters)) + ;; We have base64, md5 and sha1 functions built in now. (provide 'base64) (provide 'md5) @@ -657,7 +675,7 @@ language you are using." (garbage-collect) -(setq help-event-list '(help f1)) +(setq help-event-list '(help f1 ?\?)) (make-variable-buffer-local 'minor-mode-overriding-map-alist) @@ -678,29 +696,57 @@ language you are using." (put 'narrow-to-region 'disabled t) ;; Moving with arrows in bidi-sensitive direction. +(defcustom visual-order-cursor-movement nil + "If non-nil, moving cursor with arrow keys follows the visual order. + +When this is non-nil, \\[right-char] will move to the character that is +to the right of point on display, and \\[left-char] will move to the left, +disregarding the surrounding bidirectional context. Depending on the +bidirectional context of the surrounding characters, this can move point +many buffer positions away. + +When the text is entirely left-to-right, logical-order and visual-order +cursor movements produce identical results." + :type '(choice (const :tag "Logical-order cursor movement" nil) + (const :tag "Visual-order cursor movement" t)) + :group 'display + :version "24.4") + (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." +If `visual-order-cursor-movement' is non-nil, this always moves +to the right on display, wherever that is in the buffer. +Otherwise, depending on the bidirectional context, this may move +one position 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))) + (if visual-order-cursor-movement + (dotimes (i (if (numberp n) (abs n) 1)) + (move-point-visually (if (and (numberp n) (< n 0)) -1 1))) + (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." +If `visual-order-cursor-movement' is non-nil, this always moves +to the left on display, wherever that is in the buffer. +Otherwise, depending on the bidirectional context, this may move +one position either backward or forward 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) - (backward-char n) - (forward-char n))) + (if visual-order-cursor-movement + (dotimes (i (if (numberp n) (abs n) 1)) + (move-point-visually (if (and (numberp n) (< n 0)) 1 -1))) + (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). @@ -845,6 +891,7 @@ if `inhibit-field-text-motion' is non-nil." (define-key ctl-x-map "\C-x" 'exchange-point-and-mark) (define-key ctl-x-map "\C-@" 'pop-global-mark) +(define-key ctl-x-map " " 'rectangle-mark-mode) (define-key ctl-x-map [?\C- ] 'pop-global-mark) (define-key global-map "\C-n" 'next-line) @@ -866,6 +913,7 @@ if `inhibit-field-text-motion' is non-nil." (define-key goto-map "\M-n" 'next-error) (define-key goto-map "p" 'previous-error) (define-key goto-map "\M-p" 'previous-error) +(define-key goto-map "\t" 'move-to-column) (defvar search-map (make-sparse-keymap) "Keymap for search related commands.") @@ -875,6 +923,7 @@ if `inhibit-field-text-motion' is non-nil." (define-key search-map "hr" 'highlight-regexp) (define-key search-map "hp" 'highlight-phrase) (define-key search-map "hl" 'highlight-lines-matching-regexp) +(define-key search-map "h." 'highlight-symbol-at-point) (define-key search-map "hu" 'unhighlight-regexp) (define-key search-map "hf" 'hi-lock-find-patterns) (define-key search-map "hw" 'hi-lock-write-interactive-patterns) @@ -1007,36 +1056,30 @@ if `inhibit-field-text-motion' is non-nil." ;; 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]) -(define-key function-key-map [kp-right] [right]) -(define-key function-key-map [kp-down] [down]) -(define-key function-key-map [kp-prior] [prior]) -(define-key function-key-map [kp-next] [next]) -(define-key function-key-map [M-kp-next] [M-next]) -(define-key function-key-map [kp-end] [end]) -(define-key function-key-map [kp-begin] [begin]) -(define-key function-key-map [kp-insert] [insert]) +;; Currently we add keypad key combinations with basic modifiers +;; (to complement plain bindings in "Keypad support" section in simple.el) +;; Until [*-kp-home] is implemented, for more modifiers we could also use: +;; (todo-powerset '(control meta shift hyper super alt)) (Bug#14397) +(let ((modifiers '(nil (control) (meta) (control meta) (shift) + (control shift) (meta shift) (control meta shift))) + (keys '((kp-delete delete) (kp-insert insert) + (kp-end end) (kp-down down) (kp-next next) + (kp-left left) (kp-begin begin) (kp-right right) + (kp-home home) (kp-up up) (kp-prior prior) + (kp-enter enter) (kp-decimal ?.) + (kp-0 ?0) (kp-1 ?1) (kp-2 ?2) (kp-3 ?3) (kp-4 ?4) + (kp-5 ?5) (kp-6 ?6) (kp-7 ?7) (kp-8 ?8) (kp-9 ?9) + (kp-add ?+) (kp-subtract ?-) (kp-multiply ?*) (kp-divide ?/)))) + (dolist (pair keys) + (dolist (mod modifiers) + (define-key function-key-map + (vector (append mod (list (nth 0 pair)))) + (vector (append mod (list (nth 1 pair)))))))) + (define-key function-key-map [backspace] [?\C-?]) (define-key function-key-map [delete] [?\C-?]) (define-key function-key-map [kp-delete] [?\C-?]) -(define-key function-key-map [S-kp-end] [S-end]) -(define-key function-key-map [S-kp-down] [S-down]) -(define-key function-key-map [S-kp-next] [S-next]) -(define-key function-key-map [S-kp-left] [S-left]) -(define-key function-key-map [S-kp-right] [S-right]) -(define-key function-key-map [S-kp-home] [S-home]) -(define-key function-key-map [S-kp-up] [S-up]) -(define-key function-key-map [S-kp-prior] [S-prior]) -(define-key function-key-map [C-S-kp-end] [C-S-end]) -(define-key function-key-map [C-S-kp-down] [C-S-down]) -(define-key function-key-map [C-S-kp-next] [C-S-next]) -(define-key function-key-map [C-S-kp-left] [C-S-left]) -(define-key function-key-map [C-S-kp-right] [C-S-right]) -(define-key function-key-map [C-S-kp-home] [C-S-home]) -(define-key function-key-map [C-S-kp-up] [C-S-up]) -(define-key function-key-map [C-S-kp-prior] [C-S-prior]) + ;; Don't bind shifted keypad numeric keys, they reportedly ;; interfere with the feature of some keyboards to produce ;; numbers when NumLock is off. @@ -1048,14 +1091,14 @@ if `inhibit-field-text-motion' is non-nil." ;(define-key function-key-map [S-kp-7] [S-home]) ;(define-key function-key-map [S-kp-8] [S-up]) ;(define-key function-key-map [S-kp-9] [S-prior]) -(define-key function-key-map [C-S-kp-1] [C-S-end]) -(define-key function-key-map [C-S-kp-2] [C-S-down]) -(define-key function-key-map [C-S-kp-3] [C-S-next]) -(define-key function-key-map [C-S-kp-4] [C-S-left]) -(define-key function-key-map [C-S-kp-6] [C-S-right]) -(define-key function-key-map [C-S-kp-7] [C-S-home]) -(define-key function-key-map [C-S-kp-8] [C-S-up]) -(define-key function-key-map [C-S-kp-9] [C-S-prior]) +;(define-key function-key-map [C-S-kp-1] [C-S-end]) +;(define-key function-key-map [C-S-kp-2] [C-S-down]) +;(define-key function-key-map [C-S-kp-3] [C-S-next]) +;(define-key function-key-map [C-S-kp-4] [C-S-left]) +;(define-key function-key-map [C-S-kp-6] [C-S-right]) +;(define-key function-key-map [C-S-kp-7] [C-S-home]) +;(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 @@ -1150,7 +1193,30 @@ if `inhibit-field-text-motion' is non-nil." (define-key ctl-x-5-map "m" 'compose-mail-other-frame) -(defvar ctl-x-r-map (make-sparse-keymap) +(defvar ctl-x-r-map + (let ((map (make-sparse-keymap))) + (define-key map "c" 'clear-rectangle) + (define-key map "k" 'kill-rectangle) + (define-key map "d" 'delete-rectangle) + (define-key map "y" 'yank-rectangle) + (define-key map "o" 'open-rectangle) + (define-key map "t" 'string-rectangle) + (define-key map "N" 'rectangle-number-lines) + (define-key map "\M-w" 'copy-rectangle-as-kill) + (define-key map "\C-@" 'point-to-register) + (define-key map [?\C-\ ] 'point-to-register) + (define-key map " " 'point-to-register) + (define-key map "j" 'jump-to-register) + (define-key map "s" 'copy-to-register) + (define-key map "x" 'copy-to-register) + (define-key map "i" 'insert-register) + (define-key map "g" 'insert-register) + (define-key map "r" 'copy-rectangle-to-register) + (define-key map "n" 'number-to-register) + (define-key map "+" 'increment-register) + (define-key map "w" 'window-configuration-to-register) + (define-key map "f" 'frameset-to-register) + map) "Keymap for subcommands of C-x r.") (define-key ctl-x-map "r" ctl-x-r-map)