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)))))