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