From: Artur Malabarba Date: Tue, 20 Oct 2015 20:49:20 +0000 (+0100) Subject: Merge pull request #16 from tsdh/master X-Git-Url: https://code.delx.au/gnu-emacs-elpa/commitdiff_plain/ddcd8e6bb4a27a17862726cd7d3955df274c19be?hp=3c14fa39c9233e64b598a7ca3af243c7395eccdb Merge pull request #16 from tsdh/master Speed up beacon--movement-> --- diff --git a/beacon.el b/beacon.el index 66853ca9a..138c3baae 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."