* lisp/delsel.el (delete-selection-mode): Don't enable transient-mark-mode.
[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)
4b72c12b 74 (add-hook 'pre-command-hook 'delete-selection-pre-hook)))
7853929f 75
b0dbaa21 76(defun delete-active-region (&optional killp)
b1d39ccc
SL
77 "Delete the active region.
78If KILLP in not-nil, the active region is killed instead of deleted."
af9157b9 79 (if killp
bb8097b9
JL
80 ;; Don't allow `kill-region' to change the value of `this-command'.
81 (let (this-command)
82 (kill-region (point) (mark) t))
00a2b823 83 (funcall region-extract-function 'delete-only))
af9157b9 84 t)
b0dbaa21 85
b1d39ccc 86(defun delete-selection-helper (type)
c77d37e2
SM
87 "Delete selection according to TYPE:
88 `yank'
b1d39ccc
SL
89 For commands which do a yank; ensures the region about to be
90 deleted isn't yanked.
c77d37e2 91 `supersede'
b1d39ccc
SL
92 Delete the active region and ignore the current command,
93 i.e. the command will just delete the region.
c77d37e2 94 `kill'
b1d39ccc
SL
95 `kill-region' is used on the selection, rather than
96 `delete-region'. (Text selected with the mouse will typically
97 be yankable anyhow.)
c77d37e2 98 t
b1d39ccc
SL
99 The normal case: delete the active region prior to executing
100 the command which will insert replacement text.
c77d37e2 101 FUNCTION
b1d39ccc 102 For commands which need to dynamically determine this behaviour.
c77d37e2 103 FUNCTION should take no argument and return one of the above values or nil."
b1d39ccc
SL
104 (condition-case data
105 (cond ((eq type 'kill)
bb8097b9
JL
106 (delete-active-region t)
107 (if (and overwrite-mode
108 (eq this-command 'self-insert-command))
109 (let ((overwrite-mode nil))
110 (self-insert-command
111 (prefix-numeric-value current-prefix-arg))
112 (setq this-command 'ignore))))
b1d39ccc
SL
113 ((eq type 'yank)
114 ;; Before a yank command, make sure we don't yank the
115 ;; head of the kill-ring that really comes from the
116 ;; currently active region we are going to delete.
117 ;; That would make yank a no-op.
118 (when (and (string= (buffer-substring-no-properties
119 (point) (mark))
120 (car kill-ring))
121 (fboundp 'mouse-region-match)
122 (mouse-region-match))
123 (current-kill 1))
4b72c12b
SM
124 (let ((pos (copy-marker (region-beginning))))
125 (delete-active-region)
126 ;; If the region was, say, rectangular, make sure we yank
127 ;; from the top, to "replace".
128 (goto-char pos)))
b1d39ccc
SL
129 ((eq type 'supersede)
130 (let ((empty-region (= (point) (mark))))
131 (delete-active-region)
132 (unless empty-region
133 (setq this-command 'ignore))))
c77d37e2 134 ((functionp type) (delete-selection-helper (funcall type)))
b1d39ccc
SL
135 (type
136 (delete-active-region)
137 (if (and overwrite-mode
138 (eq this-command 'self-insert-command))
139 (let ((overwrite-mode nil))
140 (self-insert-command
141 (prefix-numeric-value current-prefix-arg))
142 (setq this-command 'ignore)))))
143 ;; If ask-user-about-supersession-threat signals an error,
144 ;; stop safe_run_hooks from clearing out pre-command-hook.
145 (file-supersession (message "%s" (cadr data)) (ding))
146 (text-read-only
147 ;; This signal may come either from `delete-active-region' or
148 ;; `self-insert-command' (when `overwrite-mode' is non-nil).
149 ;; To avoid clearing out `pre-command-hook' we handle this case
150 ;; by issuing a simple message. Note, however, that we do not
151 ;; handle all related problems: When read-only text ends before
152 ;; the end of the region, the latter is not deleted but any
153 ;; subsequent insertion will succeed. We could avoid this case
154 ;; by doing a (setq this-command 'ignore) here. This would,
155 ;; however, still not handle the case where read-only text ends
156 ;; precisely where the region starts: In that case the deletion
157 ;; would succeed but the subsequent insertion would fail with a
158 ;; text-read-only error. To handle that case we would have to
159 ;; investigate text properties at both ends of the region and
160 ;; skip the deletion when inserting text is forbidden there.
161 (message "Text is read-only") (ding))))
162
28d3ed91 163(defun delete-selection-pre-hook ()
c77d37e2
SM
164 "Function run before commands that delete selections are executed.
165Commands which will delete the selection need a `delete-selection'
166property on their symbol; commands which insert text but don't
b1d39ccc 167have this property won't delete the selection.
c77d37e2
SM
168See `delete-selection-helper'."
169 (when (and delete-selection-mode (use-region-p)
7853929f 170 (not buffer-read-only))
c77d37e2
SM
171 (delete-selection-helper (and (symbolp this-command)
172 (get this-command 'delete-selection)))))
b1d39ccc 173
c77d37e2
SM
174(put 'self-insert-command 'delete-selection
175 (lambda ()
176 (not (run-hook-with-args-until-success
177 'self-insert-uses-region-functions))))
b1d39ccc 178
bb8097b9
JL
179(put 'insert-char 'delete-selection t)
180(put 'quoted-insert 'delete-selection t)
181
6b214411 182(put 'yank 'delete-selection 'yank)
b708f0ad 183(put 'clipboard-yank 'delete-selection 'yank)
d4df3279 184(put 'insert-register 'delete-selection t)
b0dbaa21 185
bb8097b9 186(put 'reindent-then-newline-and-indent 'delete-selection t)
69b3c6c7 187(put 'newline-and-indent 'delete-selection t)
28d3ed91 188(put 'newline 'delete-selection t)
69b3c6c7
DL
189(put 'open-line 'delete-selection 'kill)
190
c80e3b4a 191;; This is very useful for canceling a selection in the minibuffer without
b0dbaa21 192;; aborting the minibuffer.
b0dbaa21
RS
193(defun minibuffer-keyboard-quit ()
194 "Abort recursive edit.
69b3c6c7
DL
195In Delete Selection mode, if the mark is active, just deactivate it;
196then it takes a second \\[keyboard-quit] to abort the minibuffer."
b0dbaa21 197 (interactive)
4b72c12b 198 (if (and delete-selection-mode (region-active-p))
d4df3279 199 (setq deactivate-mark t)
b0dbaa21
RS
200 (abort-recursive-edit)))
201
23652376
DL
202(define-key minibuffer-local-map "\C-g" 'minibuffer-keyboard-quit)
203(define-key minibuffer-local-ns-map "\C-g" 'minibuffer-keyboard-quit)
204(define-key minibuffer-local-completion-map "\C-g" 'minibuffer-keyboard-quit)
205(define-key minibuffer-local-must-match-map "\C-g" 'minibuffer-keyboard-quit)
206(define-key minibuffer-local-isearch-map "\C-g" 'minibuffer-keyboard-quit)
207
c815b73f
JB
208(defun delsel-unload-function ()
209 "Unload the Delete Selection library."
23652376
DL
210 (define-key minibuffer-local-map "\C-g" 'abort-recursive-edit)
211 (define-key minibuffer-local-ns-map "\C-g" 'abort-recursive-edit)
212 (define-key minibuffer-local-completion-map "\C-g" 'abort-recursive-edit)
213 (define-key minibuffer-local-must-match-map "\C-g" 'abort-recursive-edit)
c815b73f 214 (define-key minibuffer-local-isearch-map "\C-g" 'abort-recursive-edit)
4b72c12b
SM
215 (dolist (sym '(self-insert-command insert-char quoted-insert yank
216 clipboard-yank insert-register newline-and-indent
217 reindent-then-newline-and-indent newline open-line))
8c8e1952 218 (put sym 'delete-selection nil))
c815b73f
JB
219 ;; continue standard unloading
220 nil)
87f14b12 221
d4df3279 222(provide 'delsel)
b0dbaa21 223
d4df3279 224;;; delsel.el ends here