Function: evil-select-an-object
evil-select-an-object is a byte-compiled function defined in
evil-common.el.
Signature
(evil-select-an-object THING BEG END TYPE COUNT &optional LINE)
Documentation
Return an outer text object range of COUNT objects.
If COUNT is positive, return objects following point; if COUNT is negative, return objects preceding point. If one is unspecified, the other is used with a negative argument. THING is a symbol understood by thing-at-point. BEG, END and TYPE specify the current selection. If LINE is non-nil, the text object should be linewise, otherwise it is character wise.
Source Code
;; Defined in ~/.emacs.d/elpa/evil-20251108.138/evil-common.el
(defun evil-select-an-object (thing beg end type count &optional line)
"Return an outer text object range of COUNT objects.
If COUNT is positive, return objects following point; if COUNT is
negative, return objects preceding point. If one is unspecified,
the other is used with a negative argument. THING is a symbol
understood by thing-at-point. BEG, END and TYPE specify the
current selection. If LINE is non-nil, the text object should be
linewise, otherwise it is character wise."
(let* ((dir (if (> (or count 1) 0) +1 -1))
(count (abs (or count 1)))
(objbnd (let ((b (bounds-of-thing-at-point thing)))
(and b (< (point) (cdr b)) b)))
(bnd (or objbnd
(evil-bounds-of-not-thing-at-point thing)
(cons (point-min) (point-max))))
addcurrent other)
;; check if current object is not selected
(when (or (not beg) (not end)
(> beg (car bnd))
(< end (cdr bnd))
(and (eq type 'inclusive)
(= (1+ beg) end))) ; empty region does not count
;; if not, enlarge selection
(when (or (not beg) (< (car bnd) beg)) (setq beg (car bnd)))
(when (or (not end) (> (cdr bnd) end)) (setq end (cdr bnd)))
(if objbnd (setq addcurrent t)))
;; make other and (point) reflect the selection
(cond
((> dir 0) (goto-char end) (setq other beg))
(t (goto-char beg) (setq other end)))
(cond
;; do nothing more than only current is selected
((not (and (= beg (car bnd)) (= end (cdr bnd)))))
;; current match is thing, add whitespace
(objbnd
(let ((wsend (evil-with-restriction
;; restrict to current line if we do non-line selection
(unless line (line-beginning-position))
(unless line (line-end-position))
(evil-bounds-of-not-thing-at-point thing dir))))
(cond
(wsend
;; add whitespace at end
(goto-char wsend)
(setq addcurrent t))
(t
;; no whitespace at end, try beginning
(save-excursion
(goto-char other)
(setq wsend
(evil-with-restriction
;; restrict to current line if we do non-line selection
(unless line
(if (member thing '(evil-word evil-WORD))
(save-excursion (back-to-indentation) (point))
(line-beginning-position)))
(unless line (line-end-position))
(evil-bounds-of-not-thing-at-point thing (- dir))))
(when wsend (setq other wsend addcurrent t)))))))
;; current match is whitespace, add thing
(t
(forward-thing thing dir)
(setq addcurrent t)))
;; possibly count current object as selection
(if addcurrent (setq count (1- count)))
;; move
(dotimes (_ count)
(let ((wsend (evil-bounds-of-not-thing-at-point thing dir)))
(if (and wsend (/= wsend (point)))
;; start with whitespace
(forward-thing thing dir)
;; start with thing
(forward-thing thing dir)
(setq wsend (evil-bounds-of-not-thing-at-point thing dir))
(when wsend (goto-char wsend)))))
;; return range
(evil-range (if (> dir 0) other (point))
(if (< dir 0) other (point))
(if line 'line type)
:expanded t)))