branch: master commit ddcd8e6bb4a27a17862726cd7d3955df274c19be Merge: 3c14fa3 ff1f8d2 Author: Artur Malabarba <malaba...@users.noreply.github.com> Commit: Artur Malabarba <malaba...@users.noreply.github.com>
Merge pull request #16 from tsdh/master Speed up beacon--movement-> --- beacon.el | 23 ++++++++++++++++++++--- 1 files changed, 20 insertions(+), 3 deletions(-) diff --git a/beacon.el b/beacon.el index 66853ca..138c3ba 100644 --- a/beacon.el +++ b/beacon.el @@ -264,6 +264,11 @@ Only returns `beacon-size' elements." (defvar beacon--previous-mark-head nil) (defvar beacon--previous-window nil) +(defun beacon--pos-on-current-line-p (pos) + "Return non-nil if POS is on the current line." + (and (<= (save-excursion (beginning-of-line) (point)) pos) + (<= pos (save-excursion (end-of-line) (point))))) + (defun beacon--movement-> (delta) "Return non-nil if latest point movement is > DELTA. If DELTA is nil, return nil." @@ -273,9 +278,21 @@ If DELTA is nil, return nil." (current-buffer)) (> (abs (- (point) beacon--previous-place)) delta) - (> (count-screen-lines (min (point) beacon--previous-place) - (max (point) beacon--previous-place)) - delta))) + ;; Check if the movement was larger than DELTA lines by testing if + ;; `point' is still on the same line or on any line DELTA lines up or + ;; down. This is much cheaper than computing the actual number of lines + ;; moved using `count-screen-lines'. + (let ((prev-pos (marker-position beacon--previous-place))) + (catch 'movement + (when (beacon--pos-on-current-line-p prev-pos) + (throw 'movement nil)) + (dolist (inc '(1 -1)) + (save-excursion + (dotimes (i delta) + (vertical-motion inc) + (when (beacon--pos-on-current-line-p prev-pos) + (throw 'movement nil))))) + (throw 'movement t))))) (defun beacon--maybe-push-mark () "Push mark if it seems to be safe."