- (if (and delete-selection-mode
- (not buffer-read-only)
- transient-mark-mode mark-active)
- (let ((type (and (symbolp this-command)
- (get this-command 'delete-selection))))
- (cond ((eq type 'kill)
- (delete-active-region t))
- ((eq type 'supersede)
- (if (delete-active-region nil)
- (setq this-command '(lambda () (interactive)))))
- (type
- (delete-active-region nil))))))
-
-(add-hook 'pre-command-hook '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)
+ ;; Before a yank command,
+ ;; make sure we don't yank the same region
+ ;; that we are going to delete.
+ ;; That would make yank a no-op.
+ (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
+ ;; If ask-user-about-supersession-threat signals an error,
+ ;; stop safe_run_hooks from clearing out pre-command-hook.
+ (and (eq inhibit-quit 'pre-command-hook)
+ (setq inhibit-quit 'delete-selection-dummy))
+ (signal 'file-supersession (cdr data)))))))