Function: evil-visual-paste
evil-visual-paste is an interactive and byte-compiled function defined
in evil-commands.el.
Signature
(evil-visual-paste COUNT &optional REGISTER)
Documentation
Paste over Visual selection.
Key Bindings
Source Code
;; Defined in ~/.emacs.d/elpa/evil-20251108.138/evil-commands.el
(evil-define-command evil-visual-paste (count &optional register)
"Paste over Visual selection."
:suppress-operator t
(interactive "*P<x>")
(setq count (prefix-numeric-value count))
;; evil-visual-paste is typically called from evil-paste-before or
;; evil-paste-after, but we have to mark that the paste was from
;; visual state
(setq this-command 'evil-visual-paste)
(let* ((text (if register
(evil-get-register register)
(current-kill 0)))
(yank-handler (car-safe (get-text-property
0 'yank-handler text)))
(dir (evil-visual-direction))
beg end type)
(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
type (evil-visual-type))
;; When pasting charwise text into linewise selection, keep trailing NL
(when (and text end
(eq 'line type)
(not (eq ?\n (aref text (1- (length text))))))
(cl-decf end))
(evil-visual-rotate 'upper-left)
(evil-delete beg end type (unless evil-kill-on-visual-paste ?_))
(when (and (eq yank-handler #'evil-yank-line-handler)
(not (memq type '(line block)))
(/= end (point-max)))
(insert "\n"))
(evil-normal-state)
(when kill-ring (current-kill 1)))
;; Effectively memoize `evil-get-register' because it can be
;; side-effecting (e.g. for the "=" register)...
(cl-letf (((symbol-function #'evil-get-register)
(lambda (&rest _) text)))
(cond
;; When replacing the last buffer line and it does not end
;; in a newline, use `evil-paste-after' because
;; `evil-delete' will have moved point to the line above.
((cond ((eq type 'line) (= end (point-max)))
((eq type 'block) (eq yank-handler #'evil-yank-line-handler)))
(goto-char end)
(evil-paste-after count register))
((and (eq type 'block)
(not (eq yank-handler #'evil-yank-block-handler))
(not (string-match-p "\n" text)))
(evil-apply-on-block #'evil-insert-for-yank-at-col beg end t text count))
(t (evil-paste-before count register)))))
(when evil-kill-on-visual-paste
(current-kill -1))
;; Ensure that gv can restore visually pasted area...
(set-marker evil-visual-point (evil-get-marker (if (< dir 0) ?\[ ?\]) t))
(set-marker evil-visual-mark (evil-get-marker (if (< dir 0) ?\] ?\[) t))
;; mark the last paste as visual-paste
(setq evil-last-paste
(list (nth 0 evil-last-paste)
(nth 1 evil-last-paste)
(nth 2 evil-last-paste)
(nth 3 evil-last-paste)
(nth 4 evil-last-paste)
t)))))