Fix 'at-full moving text when visual-line-mode is on

* avy.el (avy--overlay-at-full): Compute line-end-position according to
  `visual-line-mode'.
(avy--update-offset-and-str): Add one more arg.

Note that `visual-line-mode' is actually extremely slow. If you have a
lot of candidates, you'll get a perceptible slowdown.
This commit is contained in:
Oleh Krehel 2015-10-25 15:08:13 +01:00
parent 0756c0b48a
commit 567570af41

20
avy.el
View File

@ -741,16 +741,21 @@ LEAF is normally ((BEG . END) . WND)."
(with-selected-window wnd (with-selected-window wnd
(save-excursion (save-excursion
(goto-char beg) (goto-char beg)
(let ((len-and-str (avy--update-offset-and-str len str))) (let* ((lep (if (bound-and-true-p visual-line-mode)
(save-excursion
(end-of-visual-line)
(point))
(line-end-position)))
(len-and-str (avy--update-offset-and-str len str lep)))
(setq len (car len-and-str)) (setq len (car len-and-str))
(setq str (cdr len-and-str)) (setq str (cdr len-and-str))
(setq end (if (= beg (line-end-position)) (setq end (if (= beg lep)
(1+ beg) (1+ beg)
(min (+ beg (min (+ beg
(if (eq (char-after) ?\t) (if (eq (char-after) ?\t)
1 1
len)) len))
(line-end-position))))))) lep))))))
(avy--overlay (avy--overlay
str beg end wnd str beg end wnd
(lambda (str old-str) (lambda (str old-str)
@ -782,11 +787,12 @@ LEAF is normally ((BEG . END) . WND)."
(avy-candidate-end leaf) nil (avy-candidate-end leaf) nil
(avy-candidate-wnd leaf)))) (avy-candidate-wnd leaf))))
(defun avy--update-offset-and-str (offset str) (defun avy--update-offset-and-str (offset str lep)
"Recalculate the length of the new overlay at point. "Recalculate the length of the new overlay at point.
OFFSET is the previous overlay length. OFFSET is the previous overlay length.
STR is the overlay string that we wish to add. STR is the overlay string that we wish to add.
LEP is the line end position.
We want to add an overlay between point and END=point+OFFSET. We want to add an overlay between point and END=point+OFFSET.
When other overlays already exist between point and END, set When other overlays already exist between point and END, set
@ -802,8 +808,7 @@ exist."
(and (eq (overlay-get o 'category) 'avy) (and (eq (overlay-get o 'category) 'avy)
(eq (overlay-get o 'window) wnd) (eq (overlay-get o 'window) wnd)
(overlay-start o))) (overlay-start o)))
(overlays-in beg (min (+ beg offset) (overlays-in beg (min (+ beg offset) lep))))))
(line-end-position)))))))
(when oov (when oov
(setq offset (- (apply #'min oov) beg)) (setq offset (- (apply #'min oov) beg))
(setq str (substring str 0 offset))) (setq str (substring str 0 offset)))
@ -812,8 +817,7 @@ exist."
(and (eq (overlay-get o 'category) 'avy) (and (eq (overlay-get o 'category) 'avy)
(eq (overlay-start o) beg) (eq (overlay-start o) beg)
(not (eq (overlay-get o 'window) wnd)))) (not (eq (overlay-get o 'window) wnd))))
(overlays-in (point) (min (+ (point) offset) (overlays-in (point) (min (+ (point) offset) lep)))))
(line-end-position))))))
(when (and other-ov (when (and other-ov
(> (overlay-end other-ov) (> (overlay-end other-ov)
(+ beg offset))) (+ beg offset)))