Function: evil-shift-right
evil-shift-right is an interactive and byte-compiled function defined
in evil-commands.el.
Signature
(evil-shift-right BEG END &optional COUNT PRESERVE-EMPTY)
Documentation
Shift text from BEG to END to the right.
The text is shifted to the nearest multiple of evil-shift-width
(the rounding can be disabled by setting evil-shift-round).
If PRESERVE-EMPTY is non-nil, lines that contain only spaces are
indented, too, otherwise they are ignored. Location of point
is preserved relative to text when called from insert or replace states.
Otherwise, it is determined by evil-start-of-line and/or evil-track-eol.
See also evil-shift-left.
Key Bindings
Source Code
;; Defined in ~/.emacs.d/elpa/evil-20251108.138/evil-commands.el
(evil-define-operator evil-shift-right (beg end &optional count preserve-empty)
"Shift text from BEG to END to the right.
The text is shifted to the nearest multiple of `evil-shift-width'
\(the rounding can be disabled by setting `evil-shift-round').
If PRESERVE-EMPTY is non-nil, lines that contain only spaces are
indented, too, otherwise they are ignored. Location of point
is preserved relative to text when called from insert or replace states.
Otherwise, it is determined by `evil-start-of-line' and/or `evil-track-eol'.
See also `evil-shift-left'."
:type line
:move-point nil ; point is moved according to `evil-start-of-line' and state
(interactive "<r><vc>")
(setq count (or count 1))
(let ((beg (set-marker (make-marker) beg))
(end (set-marker (make-marker) end))
(col-for-insert (current-column))
first-shift) ; shift of first line
(save-excursion
(goto-char beg)
(while (< (point) end)
(let* ((indent (current-indentation))
(new-indent
(max 0
(if (not evil-shift-round)
(+ indent (* count evil-shift-width))
(* (+ (/ indent evil-shift-width)
count
(cond
((> count 0) 0)
((zerop (mod indent evil-shift-width)) 0)
(t 1)))
evil-shift-width)))))
(unless first-shift
(setq first-shift (- new-indent indent)))
(when (or preserve-empty
(save-excursion
(skip-chars-forward " \t")
(not (eolp))))
(indent-to new-indent 0))
(delete-region (point) (progn (skip-chars-forward " \t") (point)))
(forward-line 1))))
;; in case we're in an empty buffer first-shift is still unchanged
(unless first-shift
(if (< count 0)
(setq first-shift 0)
(setq first-shift (* count evil-shift-width))
(indent-to first-shift)))
;; When called from insert state (C-t or C-d) the cursor should shift with the line,
;; otherwise (normal state) its position is determined by `evil-start-of-line'.
(cond
((or (evil-insert-state-p) (evil-replace-state-p))
(move-to-column (max 0 (+ col-for-insert first-shift))))
(evil-start-of-line (evil-first-non-blank))
((evil--stick-to-eol-p) (move-end-of-line 1))
(t (move-to-column (or goal-column evil-operator-start-col col-for-insert))))))