[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#13312: 24.3.50; delete selection mode not killing on overwrite
From: |
Juri Linkov |
Subject: |
bug#13312: 24.3.50; delete selection mode not killing on overwrite |
Date: |
Sat, 19 Oct 2013 19:28:45 +0300 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/24.3.50 (x86_64-pc-linux-gnu) |
> Did you read the bug description and the associate StackOverflow
> question? The bug is that when you put `kill' as the
> `delete-selection' property value on `self-insert-command' the
> region is not killed - it is not added to the `kill-ring'.
Ah, I thought this is a new bug report from you. But I still
can't find a link to the associate StackOverflow question.
What I wanted to suggest is to add more self-inserting commands
to delsel like `insert-char' and `quoted-insert'. I guess
they don't need the same `self-insert-uses-region-functions'
like the currently existing `self-insert-iso' doesn't use that.
But when you want put `kill' as the `delete-selection' property
then it's better to use this code:
(put 'self-insert-command 'delete-selection
(lambda ()
(and (not (run-hook-with-args-until-success
'self-insert-uses-region-functions))
'kill)))
It currently doesn't work properly because `kill-region' overwrites
the value of `this-command'. This is a bug that can be fixed
by this patch that also fixes overwrite-mode for `kill' and
puts `delete-selection' on more commands:
=== modified file 'lisp/delsel.el'
--- lisp/delsel.el 2013-01-01 09:11:05 +0000
+++ lisp/delsel.el 2013-10-19 16:24:16 +0000
@@ -78,7 +78,9 @@ (defun delete-active-region (&optional k
"Delete the active region.
If KILLP in not-nil, the active region is killed instead of deleted."
(if killp
- (kill-region (point) (mark))
+ ;; Prevent `kill-region' from changing the value of `this-command'.
+ (let (this-command)
+ (kill-region (point) (mark)))
(delete-region (point) (mark)))
t)
@@ -102,7 +104,13 @@ (defun delete-selection-helper (type)
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
@@ -166,6 +174,8 @@ (put 'self-insert-command 'delete-select
'self-insert-uses-region-functions))))
(put 'self-insert-iso 'delete-selection t)
+(put 'insert-char 'delete-selection t)
+(put 'quoted-insert 'delete-selection t)
(put 'yank 'delete-selection 'yank)
(put 'clipboard-yank 'delete-selection 'yank)
@@ -175,6 +185,7 @@ (put 'delete-backward-char 'delete-selec
(put 'backward-delete-char-untabify 'delete-selection 'supersede)
(put 'delete-char 'delete-selection 'supersede)
+(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)
@@ -203,9 +214,9 @@ (defun delsel-unload-function ()
(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 self-insert-iso yank clipboard-yank
+ (dolist (sym '(self-insert-command self-insert-iso insert-char quoted-insert
yank clipboard-yank
insert-register delete-backward-char
backward-delete-char-untabify
- delete-char newline-and-indent newline open-line))
+ delete-char reindent-then-newline-and-indent
newline-and-indent newline open-line))
(put sym 'delete-selection nil))
;; continue standard unloading
nil)