Function: smerge--refine-shadow-cursor
smerge--refine-shadow-cursor is a byte-compiled function defined in
smerge-mode.el.gz.
Signature
(smerge--refine-shadow-cursor WINDOW OLDPOS DIR)
Source Code
;; Defined in /usr/src/emacs/lisp/vc/smerge-mode.el.gz
(defun smerge--refine-shadow-cursor (window _oldpos dir)
(let ((ol (window-parameter window 'smerge--refine-shadow-cursor)))
(if (not (and smerge-refine-shadow-cursor
(memq dir '(entered moved))))
(if ol (delete-overlay ol))
(with-current-buffer (window-buffer window)
(let* ((cursor (window-point window))
(other-beg (ignore-errors (smerge--refine-other-pos cursor))))
(if (not other-beg)
(if ol (delete-overlay ol))
(let ((other-end (min (point-max) (1+ other-beg))))
;; If other-beg/end covers a "wide" char like TAB or LF, the
;; resulting shadow cursor doesn't look like a cursor, so try
;; and convert it to a before-string space.
(when (or (and (eq ?\n (char-after other-beg))
(not (smerge--refine-at-right-margin-p
other-beg window)))
(and (eq ?\t (char-after other-beg))
;; FIXME: `posn-at-point' seems to be costly/slow.
(when-let* ((posn (posn-at-point other-beg window))
(xy (nth 2 posn))
(x (car-safe xy))
(_ (numberp x)))
(< (1+ (% x tab-width)) tab-width))))
(setq other-end other-beg))
;; FIXME: Doesn't obey `cursor-in-non-selected-windows'.
(if ol (move-overlay ol other-beg other-end)
(setq ol (make-overlay other-beg other-end nil t nil))
(setf (window-parameter window 'smerge--refine-shadow-cursor)
ol)
(overlay-put ol 'window window)
(overlay-put ol 'face 'smerge-refine-shadow-cursor))
;; When the shadow cursor needs to be at EOB (or TAB or EOL),
;; "draw" it as a pseudo space character.
(overlay-put ol 'before-string
(when (= other-beg other-end)
(eval-when-compile
(propertize
" " 'face 'smerge-refine-shadow-cursor)))))))))))