From a00e16899cc7a0446a4ef4f5e4a658ae42248b2e Mon Sep 17 00:00:00 2001 From: Tom Dalziel Date: Mon, 18 Apr 2022 00:30:49 +0100 Subject: Simple fix for blockwise visual paste Fixes #906 --- evil-commands.el | 22 ++++++++++++++-------- evil-common.el | 4 ++-- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/evil-commands.el b/evil-commands.el index 94b1ba7..80a89d7 100644 --- a/evil-commands.el +++ b/evil-commands.el @@ -2213,6 +2213,11 @@ The return value is the yanked text." (setq evil-last-paste nil)) (and (> (length text) 0) text))))) +(defun evil-insert-for-yank-at-col (startcol _endcol string) + "Insert STRING at STARTCOL." + (move-to-column startcol) + (insert-for-yank string)) + (evil-define-command evil-visual-paste (count &optional register) "Paste over Visual selection." :suppress-operator t @@ -2227,10 +2232,12 @@ The return value is the yanked text." (current-kill 0))) (yank-handler (car-safe (get-text-property 0 'yank-handler text))) - paste-eob) + beg end paste-eob) (evil-with-undo (let ((kill-ring-yank-pointer (when kill-ring (list (current-kill 0))))) (when (evil-visual-state-p) + (setq beg evil-visual-beginning + end evil-visual-end) (evil-visual-rotate 'upper-left) ;; if we replace the last buffer line that does not end in a ;; newline, we use `evil-paste-after' because `evil-delete' @@ -2238,10 +2245,7 @@ The return value is the yanked text." (when (and (= evil-visual-end (point-max)) (/= (char-before (point-max)) ?\n)) (setq paste-eob t)) - (evil-delete evil-visual-beginning - evil-visual-end - (evil-visual-type) - (unless evil-kill-on-visual-paste ?_)) + (evil-delete beg end (evil-visual-type) (unless evil-kill-on-visual-paste ?_)) (when (and (eq yank-handler #'evil-yank-line-handler) (not (eq (evil-visual-type) 'line)) (not (= evil-visual-end (point-max)))) @@ -2252,9 +2256,11 @@ The return value is the yanked text." ;; side-effecting (e.g. for the `=' register)... (cl-letf (((symbol-function 'evil-get-register) (lambda (&rest _) text))) - (if paste-eob - (evil-paste-after count register) - (evil-paste-before count register)))) + (cond + ((eq 'block (evil-visual-type)) + (evil-apply-on-block #'evil-insert-for-yank-at-col beg end t text)) + (paste-eob (evil-paste-after count register)) + (t (evil-paste-before count register))))) (when evil-kill-on-visual-paste (current-kill -1)) ;; Ensure that gv can restore visually pasted area... diff --git a/evil-common.el b/evil-common.el index 3bb67a1..521ecf7 100644 --- a/evil-common.el +++ b/evil-common.el @@ -2458,8 +2458,8 @@ Then restore Transient Mark mode to its previous setting." "Call FUNC for each line of a block selection. The selection is specified by the region BEG and END. FUNC must take at least two arguments, the beginning and end of each -line. If PASS-COLUMNS is non-nil, these values are the columns, -otherwise tey are buffer positions. Extra arguments to FUNC may +line. If PASS-COLUMNS is non-nil, these values are the columns, +otherwise they are buffer positions. Extra arguments to FUNC may be passed via ARGS." (let ((eol-col (and (memq last-command '(next-line previous-line)) (numberp temporary-goal-column) -- cgit v1.0