(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
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
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)
(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."
(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."