X-Git-Url: https://code.delx.au/gnu-emacs-elpa/blobdiff_plain/9173a44b904d52c4c2634b68d74967d6261f4ddc..ddcd8e6bb4a27a17862726cd7d3955df274c19be:/beacon.el diff --git a/beacon.el b/beacon.el index afbe1440f..138c3baae 100644 --- a/beacon.el +++ b/beacon.el @@ -46,7 +46,7 @@ (defvar beacon--timer nil) -(defcustom beacon-push-mark nil +(defcustom beacon-push-mark 35 "Should the mark be pushed before long movements? If nil, `beacon' will not push the mark. Otherwise this should be a number, and `beacon' will push the @@ -96,7 +96,7 @@ If it is a string, it is a color name or specification, e.g. \"#666600\"." :type '(choice number color)) -(defcustom beacon-dont-blink-predicates nil +(defvar beacon-dont-blink-predicates nil "A list of predicates that prevent the beacon blink. These predicate functions are called in order, with no arguments, before blinking the beacon. If any returns @@ -105,9 +105,8 @@ non-nil, the beacon will not blink. For instance, if you want to disable beacon on buffers where `hl-line-mode' is on, you can do: - (add-hook 'beacon-dont-blink-predicates - (lambda () (bound-and-true-p hl-line-mode)))" - :type 'hook) + (add-hook \\='beacon-dont-blink-predicates + (lambda () (bound-and-true-p hl-line-mode)))") (add-hook 'beacon-dont-blink-predicates #'window-minibuffer-p) @@ -265,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." @@ -274,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."