0

I have the following configuration in my init.el:

(use-package delsel 
  :demand t
  :config (delete-selection-mode +1))

When I do yank-pop with M-y while a region is selected, it deletes the selected region, but if I abort the process with C-g, it doesn't bring my selected region back.

I have to undo, in order to bring back the deleted region.

Does anyone has any idea, how to implement this?

Drew
  • 75,699
  • 9
  • 109
  • 225

1 Answers1

0

There might be easier ways to do this, but adding the following to your :config block seems to work.

(defvar my-retract-yank-region-store)

(defun my-retract-yank-pre-hook ()
  (if (and delete-selection-mode
       (use-region-p)
       (eq 'yank (get this-command 'delete-selection)))
      (setq my-retract-yank-region-store
        (buffer-substring (region-beginning) (region-end)))))

(defun my-retract-yank-post-hook ()
  (when (and my-retract-yank-region-store
         (memq this-command '(keyboard-quit
                  minibuffer-keyboard-quit)))
    (insert my-retract-yank-region-store)
    (setq my-retract-yank-region-store nil)))

(define-minor-mode my-retract-yank-mode
  "Retract the original text of the region when yank-popping if the command is aborted."
  :group 'editing-basics
  :global t
  :after-hook
  (if my-retract-yank-mode
      (progn (add-hook 'pre-command-hook 'my-retract-yank-pre-hook)
         (add-hook 'post-command-hook 'my-retract-yank-post-hook))
    (remove-hook 'pre-command-hook 'my-retract-yank-pre-hook)
    (remove-hook 'post-command-hook 'my-retract-yank-post-hook)))

(my-retract-yank-mode 1)
mmarshall540
  • 131
  • 4