(defalias 'pending-delete-mode 'delete-selection-mode)
(define-minor-mode delete-selection-mode
"Toggle Delete Selection mode.
With prefix ARG, turn Delete Selection mode on if and only if ARG is
positive.
When Delete Selection mode is enabled, Transient Mark mode is also
enabled and typed text replaces the selection if the selection is
active. Otherwise, typed text is just inserted at point regardless of
any selection."
:global t :group 'editing-basics
(if (not delete-selection-mode)
(remove-hook 'pre-command-hook 'delete-selection-pre-hook)
(add-hook 'pre-command-hook 'delete-selection-pre-hook)
(transient-mark-mode t)))
(defun delete-active-region (&optional killp)
(if killp
(kill-region (point) (mark))
(delete-region (point) (mark)))
t)
(defun delete-selection-pre-hook ()
(when (and delete-selection-mode transient-mark-mode mark-active
(not buffer-read-only))
(let ((type (and (symbolp this-command)
(get this-command 'delete-selection))))
(condition-case data
(cond ((eq type 'kill)
(delete-active-region t))
((eq type 'yank)
(when (string= (buffer-substring-no-properties (point) (mark))
(car kill-ring))
(current-kill 1))
(delete-active-region))
((eq type 'supersede)
(let ((empty-region (= (point) (mark))))
(delete-active-region)
(unless empty-region
(setq this-command 'ignore))))
(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)))))
(file-supersession
(and (eq inhibit-quit 'pre-command-hook)
(setq inhibit-quit 'delete-selection-dummy))
(signal 'file-supersession (cdr data)))))))
(put 'self-insert-command 'delete-selection t)
(put 'self-insert-iso 'delete-selection t)
(put 'yank 'delete-selection 'yank)
(put 'clipboard-yank 'delete-selection 'yank)
(put 'insert-register 'delete-selection t)
(put 'delete-backward-char 'delete-selection 'supersede)
(put 'backward-delete-char-untabify 'delete-selection 'supersede)
(put 'delete-char 'delete-selection 'supersede)
(put 'newline-and-indent 'delete-selection t)
(put 'newline 'delete-selection t)
(put 'open-line 'delete-selection 'kill)
(defun minibuffer-keyboard-quit ()
"Abort recursive edit.
In Delete Selection mode, if the mark is active, just deactivate it;
then it takes a second \\[keyboard-quit] to abort the minibuffer."
(interactive)
(if (and delete-selection-mode transient-mark-mode mark-active)
(setq deactivate-mark t)
(abort-recursive-edit)))
(define-key minibuffer-local-map "\C-g" 'minibuffer-keyboard-quit)
(define-key minibuffer-local-ns-map "\C-g" 'minibuffer-keyboard-quit)
(define-key minibuffer-local-completion-map "\C-g" 'minibuffer-keyboard-quit)
(define-key minibuffer-local-must-match-map "\C-g" 'minibuffer-keyboard-quit)
(define-key minibuffer-local-isearch-map "\C-g" 'minibuffer-keyboard-quit)
(defun delsel-unload-hook ()
(define-key minibuffer-local-map "\C-g" 'abort-recursive-edit)
(define-key minibuffer-local-ns-map "\C-g" 'abort-recursive-edit)
(define-key minibuffer-local-completion-map "\C-g" 'abort-recursive-edit)
(define-key minibuffer-local-must-match-map "\C-g" 'abort-recursive-edit)
(define-key minibuffer-local-isearch-map "\C-g" 'abort-recursive-edit))
(add-hook 'delsel-unload-hook 'delsel-unload-hook)
(provide 'delsel)