Function: delete-selection-helper
delete-selection-helper is a byte-compiled function defined in
delsel.el.gz.
Signature
(delete-selection-helper TYPE)
Documentation
Delete selection according to TYPE:
yank
For commands which do a yank; ensures the region about to be
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. 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.)
FUNCTION
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.
Source Code
;; Defined in /usr/src/emacs/lisp/delsel.el.gz
(defun delete-selection-helper (type)
"Delete selection according to TYPE:
`yank'
For commands which do a yank; ensures the region about to be
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. 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.)
FUNCTION
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) ;Deprecated, backward compatibility.
(delete-active-region t)
(if (and overwrite-mode
(eq this-command 'self-insert-command))
(let ((overwrite-mode nil))
(self-insert-command
(prefix-numeric-value current-prefix-arg))
(setq this-command 'ignore))))
((eq type 'yank)
;; Before a yank command, make sure we don't yank the
;; head of the kill-ring that really comes from the
;; currently active region we are going to delete.
;; That would make yank a no-op.
(when (and (string= (buffer-substring-no-properties
(point) (mark))
(car kill-ring))
(fboundp 'mouse-region-match)
(mouse-region-match))
(current-kill 1))
(let ((pos (copy-marker (region-beginning))))
(delete-active-region)
;; If the region was, say, rectangular, make sure we yank
;; from the top, to "replace".
(goto-char pos)))
((eq type 'supersede)
(let ((empty-region (= (point) (mark))))
(delete-active-region)
(unless empty-region
(setq this-command 'ignore))))
((functionp type) (delete-selection-helper (funcall type)))
(type
(delete-active-region)
(if (and overwrite-mode
(eq this-command 'self-insert-command))
(let ((overwrite-mode nil))
(self-insert-command
(prefix-numeric-value current-prefix-arg))
(setq this-command 'ignore)))))
;; If the user has quit here (for instance, if the user is
;; presented with a "changed on disk; really edit the buffer?"
;; prompt, but hit `C-g'), just ding.
(quit (ding))
;; If ask-user-about-supersession-threat signals an error,
;; stop safe_run_hooks from clearing out pre-command-hook.
(file-supersession (message "%s" (cadr data)) (ding))
(text-read-only
;; This signal may come either from `delete-active-region' or
;; `self-insert-command' (when `overwrite-mode' is non-nil).
;; To avoid clearing out `pre-command-hook' we handle this case
;; by issuing a simple message. Note, however, that we do not
;; handle all related problems: When read-only text ends before
;; the end of the region, the latter is not deleted but any
;; subsequent insertion will succeed. We could avoid this case
;; by doing a (setq this-command 'ignore) here. This would,
;; however, still not handle the case where read-only text ends
;; precisely where the region starts: In that case the deletion
;; would succeed but the subsequent insertion would fail with a
;; text-read-only error. To handle that case we would have to
;; investigate text properties at both ends of the region and
;; skip the deletion when inserting text is forbidden there.
(message "Text is read-only") (ding))))