@cindex Delete Selection mode
@cindex mode, Delete Selection
@findex delete-selection-mode
+@vindex delete-selection-temporary-region
By default, text insertion occurs normally even if the mark is
active---for example, typing @kbd{a} inserts the character @samp{a},
then deactivates the mark. Delete Selection mode, a minor mode,
modifies this behavior: if you enable that mode, then inserting text
while the mark is active causes the text in the region to be deleted
-first. To toggle Delete Selection mode on or off, type @kbd{M-x
+first. However, you can tune this behavior by customizing the
+@code{delete-selection-temporary-region} option. Its default value is
+@code{nil}, but you can set it to @code{t}, in which case only
+temporarily-active regions will be replaced: those which are set by
+dragging the mouse (@pxref{Setting Mark}) or by shift-selection
+(@pxref{Shift Selection}), as well as by @kbd{C-u C-x C-x} when
+Transient Mark Mode is disabled. You can further tune the behavior by
+setting @code{delete-selection-temporary-region} to @code{selection}:
+then temporary regions by @kbd{C-u C-x C-x} won't be replaced, only
+the ones activated by dragging the mouse or shift-selection. To
+toggle Delete Selection mode on or off, type @kbd{M-x
delete-selection-mode}.
@node Mark Ring
\f
* Changes in Emacs 29.1
++++
+** New user option 'delete-selection-temporary-region'.
+When non-nil, 'delete-selection-mode' will only delete the temporary
+regions (usually set by mouse-dragging or shift-selection).
+
+++
** New user option 'switch-to-prev-buffer-skip-regexp'.
This should be a regexp or a list of regexps; buffers whose names
"If non-nil, deleted region text is stored in this register.
Value must be the register (key) to use.")
+(defcustom delete-selection-temporary-region nil
+ "Whether to delete only temporary regions.
+When non-nil, typed text replaces only the regions set by
+mouse-dragging, shift-selection, and \"\\[universal-argument] \\[exchange-point-and-mark]\" when
+`transient-mark-mode' is turned off. If the value is the symbol
+`selection', then replace only the regions set by mouse-dragging
+and shift-selection."
+ :version "29.1"
+ :group 'editing-basics
+ :type '(choice (const :tag "Replace all regions" nil)
+ (const :tag "Replace region from mouse, shift-selection, and \"C-u C-x C-x\"" t)
+ (const :tag "Replace region from mouse and shift-selection" selection)))
+
;;;###autoload
(defalias 'pending-delete-mode 'delete-selection-mode)
have this property won't delete the selection.
See `delete-selection-helper'."
(when (and delete-selection-mode (use-region-p)
- (not buffer-read-only))
+ (not buffer-read-only)
+ (or (null delete-selection-temporary-region)
+ (and delete-selection-temporary-region
+ (consp transient-mark-mode)
+ (eq (car transient-mark-mode) 'only))
+ (and (not (eq delete-selection-temporary-region 'selection))
+ (eq transient-mark-mode 'lambda))))
(delete-selection-helper (and (symbolp this-command)
(get this-command 'delete-selection)))))