From bb8097b96b074e55ff05dc379b394dbdbdc82f3e Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Wed, 11 Dec 2013 03:11:24 +0200 Subject: [PATCH] * lisp/delsel.el (delete-active-region): Let-bind `this-command' to prevent `kill-region' from changing its original value. (delete-selection-helper): Handle `overwrite-mode' for the type `kill' exactly the same way as for the type `t'. (insert-char, quoted-insert, reindent-then-newline-and-indent): Support more commands. Fixes: debbugs:13312 --- lisp/ChangeLog | 9 +++++++++ lisp/delsel.el | 20 ++++++++++++++++---- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 96e2f57d6f6..186d6e154aa 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,12 @@ +2013-12-11 Juri Linkov + + * delsel.el (delete-active-region): Let-bind `this-command' + to prevent `kill-region' from changing its original value. + (delete-selection-helper): Handle `overwrite-mode' for the type + `kill' exactly the same way as for the type `t'. + (insert-char, quoted-insert, reindent-then-newline-and-indent): + Support more commands. (Bug#13312) + 2013-12-11 Juri Linkov * bindings.el: Map kp keys to non-kp keys systematically diff --git a/lisp/delsel.el b/lisp/delsel.el index 3c9a6561cde..f0c6996834b 100644 --- a/lisp/delsel.el +++ b/lisp/delsel.el @@ -78,7 +78,9 @@ any selection." "Delete the active region. If KILLP in not-nil, the active region is killed instead of deleted." (if killp - (kill-region (point) (mark) t) + ;; Don't allow `kill-region' to change the value of `this-command'. + (let (this-command) + (kill-region (point) (mark) t)) (funcall region-extract-function 'delete-only)) t) @@ -102,7 +104,13 @@ If KILLP in not-nil, the active region is killed instead of deleted." FUNCTION should take no argument and return one of the above values or nil." (condition-case data (cond ((eq type 'kill) - (delete-active-region t)) + (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 @@ -165,10 +173,14 @@ See `delete-selection-helper'." (not (run-hook-with-args-until-success 'self-insert-uses-region-functions)))) +(put 'insert-char 'delete-selection t) +(put 'quoted-insert 'delete-selection t) + (put 'yank 'delete-selection 'yank) (put 'clipboard-yank 'delete-selection 'yank) (put 'insert-register 'delete-selection t) +(put 'reindent-then-newline-and-indent 'delete-selection t) (put 'newline-and-indent 'delete-selection t) (put 'newline 'delete-selection t) (put 'open-line 'delete-selection 'kill) @@ -197,9 +209,9 @@ then it takes a second \\[keyboard-quit] to abort the minibuffer." (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) - (dolist (sym '(self-insert-command yank clipboard-yank + (dolist (sym '(self-insert-command insert-char quoted-insert yank clipboard-yank insert-register - newline-and-indent newline open-line)) + reindent-then-newline-and-indent newline-and-indent newline open-line)) (put sym 'delete-selection nil)) ;; continue standard unloading nil) -- 2.39.2