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