Function: evil-compile-subreplacement
evil-compile-subreplacement is a byte-compiled function defined in
evil-common.el.
Signature
(evil-compile-subreplacement TO &optional START)
Documentation
Convert a regexp replacement TO to Lisp from START until \e or \E.
Return a pair (RESULT . REST). RESULT is a list suitable for
perform-replace if necessary, the original string if not.
REST is the unparsed remainder of TO.
Source Code
;; Defined in ~/.emacs.d/elpa/evil-20251108.138/evil-common.el
(defun evil-compile-subreplacement (to &optional start)
"Convert a regexp replacement TO to Lisp from START until \\e or \\E.
Return a pair (RESULT . REST). RESULT is a list suitable for
`perform-replace' if necessary, the original string if not.
REST is the unparsed remainder of TO."
(let ((result
(evil-transform-magic
to evil-replacement-magic #'replace-quote
#'(lambda (char rest)
(cond
((eq char ?#)
(list '(number-to-string replace-count) rest))
((eq char ?r) (list "\r" rest))
((eq char ?n) (list "\n" rest))
((eq char ?b) (list "\b" rest))
((eq char ?t) (list "\t" rest))
((memq char '(?e ?E))
`("" ,rest . t))
((memq char '(?l ?L ?u ?U))
(let ((result (evil-compile-subreplacement rest))
(func (cdr (assoc char
'((?l . evil-downcase-first)
(?L . downcase)
(?u . evil-upcase-first)
(?U . upcase))))))
(list `(,func
(replace-quote
(evil-match-substitute-replacement
,(car result)
(not case-replace))))
(cdr result))))
((eq char ?=)
(when (or (zerop (length rest))
(not (eq (aref rest 0) ?@)))
(user-error "Expected @ after \\="))
(when (< (length rest) 2)
(user-error "Expected register after \\=@"))
(list (evil-get-register (aref rest 1))
(substring rest 2)))
((eq char ?,)
(let* ((obj (read-from-string rest))
(result `(replace-quote ,(car obj)))
(end
;; swallow a space after a symbol
(if (and (or (symbolp (car obj))
;; swallow a space after 'foo,
;; but not after (quote foo)
(and (eq (car-safe (car obj)) 'quote)
(not (= ?\( (aref rest 0)))))
(eq (string-match " " rest (cdr obj))
(cdr obj)))
(1+ (cdr obj))
(cdr obj))))
(list result (substring rest end))))
((eq char ?0)
(list "\\&" rest))
(t
(list (concat "\\" (char-to-string char)) rest))))
start)))
(let ((rest (cdr result))
(result (car result)))
(replace-match-string-symbols result)
(cons (if (cdr result)
(cons 'concat result)
(or (car result) ""))
rest))))