branch: master
commit 13377d92b2d6e47200ef17101a718e687717b2e3
Author: Oleh Krehel <[email protected]>
Commit: Oleh Krehel <[email protected]>
avy.el (avy--update-offset-and-str): Split from avy--overlay-at-full
* avy.el (avy--update-offset-and-str): New defun.
(avy--overlay-at-full): Update.
---
avy.el | 76 +++++++++++++++++++++++++++++++++++++++------------------------
1 files changed, 47 insertions(+), 29 deletions(-)
diff --git a/avy.el b/avy.el
index c321482..ac862d9 100644
--- a/avy.el
+++ b/avy.el
@@ -725,8 +725,7 @@ LEAF is normally ((BEG . END) . WND)."
'face 'avy-lead-face))
(len (length path))
(beg (avy-candidate-beg leaf))
- (wnd (cdr leaf))
- oov)
+ (wnd (cdr leaf)))
(dotimes (i len)
(set-text-properties (- len i 1) (- len i)
`(face ,(nth i avy-lead-faces))
@@ -740,33 +739,10 @@ LEAF is normally ((BEG . END) . WND)."
(with-selected-window wnd
(save-excursion
(goto-char beg)
- (when (setq oov
- (delq nil
- (mapcar
- (lambda (o)
- (and (eq (overlay-get o 'category) 'avy)
- (eq (overlay-get o 'window) wnd)
- (overlay-start o)))
- (overlays-in (point) (min (+ (point) len)
- (line-end-position))))))
- (setq len (- (apply #'min oov) beg))
- (setq str (substring str 0 len)))
- (let ((other-ov (cl-find-if
- (lambda (o)
- (and (eq (overlay-get o 'category) 'avy)
- (eq (overlay-start o) beg)
- (not (eq (overlay-get o 'window) wnd))))
- (overlays-in (point) (min (+ (point) len)
- (line-end-position))))))
- (when (and other-ov
- (> (overlay-end other-ov)
- (+ beg len)))
- (setq str (concat str (buffer-substring
- (+ beg len)
- (overlay-end other-ov))))
- (setq len (- (overlay-end other-ov)
- beg))))
- (let* ((end (if (= beg (line-end-position))
+ (let* ((len-and-str (avy--update-offset-and-str len str))
+ (len (car len-and-str))
+ (str (cdr len-and-str))
+ (end (if (= beg (line-end-position))
(1+ beg)
(min (+ beg
(if (eq (char-after) ?\t)
@@ -809,6 +785,48 @@ LEAF is normally ((BEG . END) . WND)."
(avy-candidate-end leaf)
(avy-candidate-wnd leaf))))
+(defun avy--update-offset-and-str (offset str)
+ "Recalculate the length of the new overlay at point.
+
+OFFSET is the previous overlay length.
+STR is the overlay string that we wish to add.
+
+We want to add an overlay between point and END=point+OFFSET.
+When other overlays already exist between point and END, set
+OFFSET to be the difference between the start of the first
+overlay and point. This is equivalent to truncating our new
+overlay, so that it doesn't intersect with overlays that already
+exist."
+ (let* ((wnd (selected-window))
+ (beg (point))
+ (oov (delq nil
+ (mapcar
+ (lambda (o)
+ (and (eq (overlay-get o 'category) 'avy)
+ (eq (overlay-get o 'window) wnd)
+ (overlay-start o)))
+ (overlays-in beg (min (+ beg offset)
+ (line-end-position)))))))
+ (when oov
+ (setq offset (- (apply #'min oov) beg))
+ (setq str (substring str 0 offset)))
+ (let ((other-ov (cl-find-if
+ (lambda (o)
+ (and (eq (overlay-get o 'category) 'avy)
+ (eq (overlay-start o) beg)
+ (not (eq (overlay-get o 'window) wnd))))
+ (overlays-in (point) (min (+ (point) offset)
+ (line-end-position))))))
+ (when (and other-ov
+ (> (overlay-end other-ov)
+ (+ beg offset)))
+ (setq str (concat str (buffer-substring
+ (+ beg offset)
+ (overlay-end other-ov))))
+ (setq offset (- (overlay-end other-ov)
+ beg))))
+ (cons offset str)))
+
(defun avy--style-fn (style)
"Transform STYLE symbol to a style function."
(cl-case style