* lisp/bindings.el: Map kp keys to non-kp keys systematically
[bpt/emacs.git] / lisp / delsel.el
CommitLineData
28d3ed91 1;;; delsel.el --- delete selection if you insert
76550a57 2
ab422c4d
PE
3;; Copyright (C) 1992, 1997-1998, 2001-2013 Free Software Foundation,
4;; Inc.
76550a57
ER
5
6;; Author: Matthieu Devin <devin@lucid.com>
4228277d 7;; Maintainer: FSF
76550a57 8;; Created: 14 Jul 92
f947a7fa 9;; Keywords: convenience emulations
b0dbaa21 10
b578f267 11;; This file is part of GNU Emacs.
b0dbaa21 12
eb3fa2cf 13;; GNU Emacs is free software: you can redistribute it and/or modify
b578f267 14;; it under the terms of the GNU General Public License as published by
eb3fa2cf
GM
15;; the Free Software Foundation, either version 3 of the License, or
16;; (at your option) any later version.
b0dbaa21 17
b578f267
EN
18;; GNU Emacs is distributed in the hope that it will be useful,
19;; but WITHOUT ANY WARRANTY; without even the implied warranty of
20;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21;; GNU General Public License for more details.
b0dbaa21 22
b578f267 23;; You should have received a copy of the GNU General Public License
eb3fa2cf 24;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
b0dbaa21 25
76550a57 26;;; Commentary:
b0dbaa21 27
b578f267
EN
28;; This file makes the active region be pending delete, meaning that
29;; text inserted while the region is active will replace the region contents.
30;; This is a popular behavior of personal computers text editors.
b0dbaa21 31
69b3c6c7
DL
32;; Interface:
33
34;; Commands which will delete the selection need a 'delete-selection
35;; property on their symbols; commands which insert text but don't
c815b73f 36;; have this property won't delete the selection. It can be one of
69b3c6c7
DL
37;; the values:
38;; 'yank
39;; For commands which do a yank; ensures the region about to be
40;; deleted isn't yanked.
41;; 'supersede
42;; Delete the active region and ignore the current command,
43;; i.e. the command will just delete the region.
44;; 'kill
45;; `kill-region' is used on the selection, rather than
46;; `delete-region'. (Text selected with the mouse will typically
47;; be yankable anyhow.)
c77d37e2 48;; t
69b3c6c7
DL
49;; The normal case: delete the active region prior to executing
50;; the command which will insert replacement text.
c77d37e2 51;; <function>
b1d39ccc 52;; For commands which need to dynamically determine this behaviour.
c77d37e2 53;; The function should return one of the above values or nil.
76550a57 54
69b3c6c7 55;;; Code:
7853929f
SM
56
57;;;###autoload
58(defalias 'pending-delete-mode 'delete-selection-mode)
59
60;;;###autoload
ad03cafc 61(define-minor-mode delete-selection-mode
7853929f 62 "Toggle Delete Selection mode.
06e21633
CY
63With a prefix argument ARG, enable Delete Selection mode if ARG
64is positive, and disable it otherwise. If called from Lisp,
65enable the mode if ARG is omitted or nil.
7853929f 66
69b3c6c7
DL
67When Delete Selection mode is enabled, Transient Mark mode is also
68enabled and typed text replaces the selection if the selection is
69active. Otherwise, typed text is just inserted at point regardless of
70any selection."
82fdafde 71 :global t :group 'editing-basics
7853929f
SM
72 (if (not delete-selection-mode)
73 (remove-hook 'pre-command-hook 'delete-selection-pre-hook)
74 (add-hook 'pre-command-hook 'delete-selection-pre-hook)
75 (transient-mark-mode t)))
76
b0dbaa21 77(defun delete-active-region (&optional killp)
b1d39ccc
SL
78 "Delete the active region.
79If KILLP in not-nil, the active region is killed instead of deleted."
af9157b9 80 (if killp
00a2b823
SM
81 (kill-region (point) (mark) t)
82 (funcall region-extract-function 'delete-only))
af9157b9 83 t)
b0dbaa21 84
b1d39ccc 85(defun delete-selection-helper (type)
c77d37e2
SM
86 "Delete selection according to TYPE:
87 `yank'
b1d39ccc
SL
88 For commands which do a yank; ensures the region about to be
89 deleted isn't yanked.
c77d37e2 90 `supersede'
b1d39ccc
SL
91 Delete the active region and ignore the current command,
92 i.e. the command will just delete the region.
c77d37e2 93 `kill'
b1d39ccc
SL
94 `kill-region' is used on the selection, rather than
95 `delete-region'. (Text selected with the mouse will typically
96 be yankable anyhow.)
c77d37e2 97 t
b1d39ccc
SL
98 The normal case: delete the active region prior to executing
99 the command which will insert replacement text.
c77d37e2 100 FUNCTION
b1d39ccc 101 For commands which need to dynamically determine this behaviour.
c77d37e2 102 FUNCTION should take no argument and return one of the above values or nil."
b1d39ccc
SL
103 (condition-case data
104 (cond ((eq type 'kill)
105 (delete-active-region t))
106 ((eq type 'yank)
107 ;; Before a yank command, make sure we don't yank the
108 ;; head of the kill-ring that really comes from the
109 ;; currently active region we are going to delete.
110 ;; That would make yank a no-op.
111 (when (and (string= (buffer-substring-no-properties
112 (point) (mark))
113 (car kill-ring))
114 (fboundp 'mouse-region-match)
115 (mouse-region-match))
116 (current-kill 1))
117 (delete-active-region))
118 ((eq type 'supersede)
119 (let ((empty-region (= (point) (mark))))
120 (delete-active-region)
121 (unless empty-region
122 (setq this-command 'ignore))))
c77d37e2 123 ((functionp type) (delete-selection-helper (funcall type)))
b1d39ccc
SL
124 (type
125 (delete-active-region)
126 (if (and overwrite-mode
127 (eq this-command 'self-insert-command))
128 (let ((overwrite-mode nil))
129 (self-insert-command
130 (prefix-numeric-value current-prefix-arg))
131 (setq this-command 'ignore)))))
132 ;; If ask-user-about-supersession-threat signals an error,
133 ;; stop safe_run_hooks from clearing out pre-command-hook.
134 (file-supersession (message "%s" (cadr data)) (ding))
135 (text-read-only
136 ;; This signal may come either from `delete-active-region' or
137 ;; `self-insert-command' (when `overwrite-mode' is non-nil).
138 ;; To avoid clearing out `pre-command-hook' we handle this case
139 ;; by issuing a simple message. Note, however, that we do not
140 ;; handle all related problems: When read-only text ends before
141 ;; the end of the region, the latter is not deleted but any
142 ;; subsequent insertion will succeed. We could avoid this case
143 ;; by doing a (setq this-command 'ignore) here. This would,
144 ;; however, still not handle the case where read-only text ends
145 ;; precisely where the region starts: In that case the deletion
146 ;; would succeed but the subsequent insertion would fail with a
147 ;; text-read-only error. To handle that case we would have to
148 ;; investigate text properties at both ends of the region and
149 ;; skip the deletion when inserting text is forbidden there.
150 (message "Text is read-only") (ding))))
151
28d3ed91 152(defun delete-selection-pre-hook ()
c77d37e2
SM
153 "Function run before commands that delete selections are executed.
154Commands which will delete the selection need a `delete-selection'
155property on their symbol; commands which insert text but don't
b1d39ccc 156have this property won't delete the selection.
c77d37e2
SM
157See `delete-selection-helper'."
158 (when (and delete-selection-mode (use-region-p)
7853929f 159 (not buffer-read-only))
c77d37e2
SM
160 (delete-selection-helper (and (symbolp this-command)
161 (get this-command 'delete-selection)))))
b1d39ccc 162
c77d37e2
SM
163(put 'self-insert-command 'delete-selection
164 (lambda ()
165 (not (run-hook-with-args-until-success
166 'self-insert-uses-region-functions))))
b1d39ccc 167
6b214411 168(put 'yank 'delete-selection 'yank)
b708f0ad 169(put 'clipboard-yank 'delete-selection 'yank)
d4df3279 170(put 'insert-register 'delete-selection t)
b0dbaa21 171
69b3c6c7 172(put 'newline-and-indent 'delete-selection t)
28d3ed91 173(put 'newline 'delete-selection t)
69b3c6c7
DL
174(put 'open-line 'delete-selection 'kill)
175
c80e3b4a 176;; This is very useful for canceling a selection in the minibuffer without
b0dbaa21 177;; aborting the minibuffer.
b0dbaa21
RS
178(defun minibuffer-keyboard-quit ()
179 "Abort recursive edit.
69b3c6c7
DL
180In Delete Selection mode, if the mark is active, just deactivate it;
181then it takes a second \\[keyboard-quit] to abort the minibuffer."
b0dbaa21 182 (interactive)
d4df3279
RS
183 (if (and delete-selection-mode transient-mark-mode mark-active)
184 (setq deactivate-mark t)
b0dbaa21
RS
185 (abort-recursive-edit)))
186
23652376
DL
187(define-key minibuffer-local-map "\C-g" 'minibuffer-keyboard-quit)
188(define-key minibuffer-local-ns-map "\C-g" 'minibuffer-keyboard-quit)
189(define-key minibuffer-local-completion-map "\C-g" 'minibuffer-keyboard-quit)
190(define-key minibuffer-local-must-match-map "\C-g" 'minibuffer-keyboard-quit)
191(define-key minibuffer-local-isearch-map "\C-g" 'minibuffer-keyboard-quit)
192
c815b73f
JB
193(defun delsel-unload-function ()
194 "Unload the Delete Selection library."
23652376
DL
195 (define-key minibuffer-local-map "\C-g" 'abort-recursive-edit)
196 (define-key minibuffer-local-ns-map "\C-g" 'abort-recursive-edit)
197 (define-key minibuffer-local-completion-map "\C-g" 'abort-recursive-edit)
198 (define-key minibuffer-local-must-match-map "\C-g" 'abort-recursive-edit)
c815b73f 199 (define-key minibuffer-local-isearch-map "\C-g" 'abort-recursive-edit)
00a2b823
SM
200 (dolist (sym '(self-insert-command yank clipboard-yank
201 insert-register
202 newline-and-indent newline open-line))
8c8e1952 203 (put sym 'delete-selection nil))
c815b73f
JB
204 ;; continue standard unloading
205 nil)
87f14b12 206
d4df3279 207(provide 'delsel)
b0dbaa21 208
d4df3279 209;;; delsel.el ends here