-;;; delsel.el --- delete selection if you insert
+;;; delsel.el --- delete selection if you insert -*- lexical-binding:t -*-
-;; Copyright (C) 1992, 1997-1998, 2001-2015 Free Software Foundation,
+;; Copyright (C) 1992, 1997-1998, 2001-2016 Free Software Foundation,
;; Inc.
;; Author: Matthieu Devin <devin@lucid.com>
;; property on their symbols; commands which insert text but don't
;; have this property won't delete the selection. It can be one of
;; the values:
-;; 'yank
+;; `yank'
;; For commands which do a yank; ensures the region about to be
-;; deleted isn't yanked.
-;; 'supersede
+;; deleted isn't immediately yanked back, which would make the
+;; command a no-op.
+;; `supersede'
;; Delete the active region and ignore the current command,
-;; i.e. the command will just delete the region.
-;; 'kill
+;; i.e. the command will just delete the region. This is for
+;; commands that normally delete small amounts of text, like
+;; a single character -- they will instead delete the whole
+;; active region.
+;; `kill'
;; `kill-region' is used on the selection, rather than
;; `delete-region'. (Text selected with the mouse will typically
;; be yankable anyhow.)
;; t
;; The normal case: delete the active region prior to executing
;; the command which will insert replacement text.
-;; <function>
+;; FUNCTION
;; For commands which need to dynamically determine this behavior.
-;; The function should return one of the above values or nil.
+;; FUNCTION should take no argument and return one of the above
+;; values, or nil. In the latter case, FUNCTION should itself
+;; do with the active region whatever is appropriate."
;;; Code:
When Delete Selection mode is enabled, typed text replaces the selection
if the selection is active. Otherwise, typed text is just inserted at
-point regardless of any selection."
+point regardless of any selection. Also, commands that normally delete
+just one character will delete the entire selection instead.
+
+See `delete-selection-helper' and `delete-selection-pre-hook' for
+information on adapting behavior of commands in Delete Selection mode."
:global t :group 'editing-basics
(if (not delete-selection-mode)
(remove-hook 'pre-command-hook 'delete-selection-pre-hook)
(cons (current-buffer)
(and (consp buffer-undo-list) (car buffer-undo-list)))))
(t
- (funcall region-extract-function 'delete-only)))
- t)
+ (funcall region-extract-function 'delete-only))))
(defun delete-selection-repeat-replace-region (arg)
"Repeat replacing text of highlighted region with typed text.
"Delete selection according to TYPE:
`yank'
For commands which do a yank; ensures the region about to be
- deleted isn't yanked.
+ deleted isn't immediately yanked back, which would make the
+ command a no-op.
`supersede'
Delete the active region and ignore the current command,
- i.e. the command will just delete the region.
+ i.e. the command will just delete the region. This is for
+ commands that normally delete small amounts of text, like
+ a single character -- they will instead delete the whole
+ active region.
`kill'
`kill-region' is used on the selection, rather than
- `delete-region'. (Text selected with the mouse will typically
- be yankable anyhow.)
- t
- The normal case: delete the active region prior to executing
- the command which will insert replacement text.
+ `delete-region'. (Text selected with the mouse will
+ typically be yankable anyhow.)
FUNCTION
- For commands which need to dynamically determine this behavior.
- FUNCTION should take no argument and return one of the above values or nil."
+ For commands which need to dynamically determine this
+ behavior. FUNCTION should take no argument and return a
+ value acceptable as TYPE, or nil. In the latter case,
+ FUNCTION should itself do with the active region whatever is
+ appropriate.
+ Other non-nil values
+ The normal case: delete the active region prior to executing
+ the command which will insert replacement text."
(condition-case data
- (cond ((eq type 'kill)
+ (cond ((eq type 'kill) ;Deprecated, backward compatibility.
(delete-active-region t)
(if (and overwrite-mode
(eq this-command 'self-insert-command))
(delete-selection-helper (and (symbolp this-command)
(get this-command 'delete-selection)))))
-(put 'self-insert-command 'delete-selection
- (lambda ()
- (not (run-hook-with-args-until-success
- 'self-insert-uses-region-functions))))
+(defun delete-selection-uses-region-p ()
+ "Return t when the current command will be using the region
+rather than having `delete-selection' delete it, nil otherwise.
+
+This function is intended for use as the value of the
+`delete-selection' property of a command, and shouldn't be used
+for anything else."
+ (not (run-hook-with-args-until-success
+ 'self-insert-uses-region-functions)))
+
+(put 'self-insert-command 'delete-selection 'delete-selection-uses-region-p)
(put 'insert-char 'delete-selection t)
(put 'quoted-insert 'delete-selection t)
(put 'newline-and-indent 'delete-selection t)
(put 'newline 'delete-selection t)
(put 'electric-newline-and-maybe-indent 'delete-selection t)
-(put 'open-line 'delete-selection 'kill)
+(put 'open-line 'delete-selection t)
;; This is very useful for canceling a selection in the minibuffer without
;; aborting the minibuffer.