Skip over linked overlays when moving through them

This commit is contained in:
Timothy 2024-09-15 02:24:13 +08:00
parent 15c71d1189
commit 7541281f8b
Signed by: tec
SSH key fingerprint: SHA256:eobz41Mnm0/iYWBvWThftS0ElEs1ftBr6jamutnXc/A

View file

@ -335,7 +335,7 @@ Optionally:
"Remove the parent or child overlay OV." "Remove the parent or child overlay OV."
(pcase (overlay-get ov 'category) (pcase (overlay-get ov 'category)
('inline-diff-overlay ('inline-diff-overlay
(let ((linked (overlay-get ov 'linked)) (let ((linked (overlay-get ov 'inline-diff-linked))
(parent (overlay-get ov 'parent))) (parent (overlay-get ov 'parent)))
(delete-overlay ov) (delete-overlay ov)
(dolist (link linked) (dolist (link linked)
@ -349,12 +349,18 @@ Optionally:
(delete-overlay child)) (delete-overlay child))
(delete-overlay ov)))) (delete-overlay ov))))
(defun inline-diff--overlays-within (start stop) (defun inline-diff--overlays-within (start stop &optional skip-linked)
"Return a list of overlays within the region from START to STOP." "Return a list of difference overlays within the region from START to STOP.
(let (overlays) When SKIP-LINKED is non-nil, linked overlays are skipped over."
(let (overlays skippable-links)
(dolist (ov (overlays-in start stop)) (dolist (ov (overlays-in start stop))
(when (eq (overlay-get ov 'category) 'inline-diff-overlay) (when (eq (overlay-get ov 'category) 'inline-diff-overlay)
(push ov overlays))) (if (not skip-linked)
(push ov overlays)
(unless (memq ov skippable-links)
(push ov overlays)
(when-let ((linked (inline-diff--get-linked ov)))
(setq skippable-links (nconc skippable-links linked)))))))
(nreverse overlays))) (nreverse overlays)))
(defun inline-diff--overlay-at (&optional pt) (defun inline-diff--overlay-at (&optional pt)
@ -447,8 +453,8 @@ position of an insert which is the very first entry of DIFF."
(dolist (op-ov diff-ovs) (dolist (op-ov diff-ovs)
(when (and (eq (caar last-op-ov) 'delete) (when (and (eq (caar last-op-ov) 'delete)
(eq (caar op-ov) 'insert)) (eq (caar op-ov) 'insert))
(push (cdr op-ov) (overlay-get (cdr last-op-ov) 'linked)) (push (cdr op-ov) (overlay-get (cdr last-op-ov) 'inline-diff-linked))
(push (cdr last-op-ov) (overlay-get (cdr op-ov) 'linked)) (push (cdr last-op-ov) (overlay-get (cdr op-ov) 'inline-diff-linked))
(overlay-put (cdr last-op-ov) 'after-string (overlay-put (cdr last-op-ov) 'after-string
(propertize inline-diff-change-joiner (propertize inline-diff-change-joiner
'face '(shadow inline-diff-removed)))) 'face '(shadow inline-diff-removed))))
@ -458,7 +464,7 @@ position of an insert which is the very first entry of DIFF."
"Get the linked overlays from OV, recursively. "Get the linked overlays from OV, recursively.
SO-FAR is a list of overlays already seen." SO-FAR is a list of overlays already seen."
(let ((first (not so-far))) (let ((first (not so-far)))
(dolist (link (overlay-get ov 'linked)) (dolist (link (overlay-get ov 'inline-diff-linked))
(unless (or (not (overlay-buffer link)) (memq link so-far)) (unless (or (not (overlay-buffer link)) (memq link so-far))
(push link so-far) (push link so-far)
(inline-diff--get-linked link so-far))) (inline-diff--get-linked link so-far)))
@ -569,7 +575,7 @@ This takes into account whether or not OV has a display string."
(+ (cdr range) offset)))) (+ (cdr range) offset))))
(overlay-put hl 'category 'inline-diff-refinement-overlay) (overlay-put hl 'category 'inline-diff-refinement-overlay)
(overlay-put hl 'face face) (overlay-put hl 'face face)
(push hl (overlay-get ov 'linked))))))) (push hl (overlay-get ov 'inline-diff-linked)))))))
;;;; Public functions ;;;; Public functions
@ -714,9 +720,9 @@ May move `point' when CAN-MOVE is non-nil."
(overlay-get ov 'parent)) (overlay-get ov 'parent))
(let ((parent (overlay-get ov 'parent))) (let ((parent (overlay-get ov 'parent)))
(setq ovs (inline-diff--overlays-within (setq ovs (inline-diff--overlays-within
(overlay-start parent) (overlay-end parent))))))) (overlay-start parent) (overlay-end parent) t))))))
(unless ovs (unless ovs
(setq ovs (inline-diff--overlays-within (point-min) (point-max)))) (setq ovs (inline-diff--overlays-within (point-min) (point-max) t)))
(when ovs (when ovs
(let ((ov-slice ovs) (let ((ov-slice ovs)
(o 0)) (o 0))