]> code.delx.au - gnu-emacs-elpa/blobdiff - beacon.el
Speed up beacon--movement->
[gnu-emacs-elpa] / beacon.el
index ab8b469b888deafd1199f39be6ba4ca9e5aebf49..e237c69d19a01bbfaa62f4a77b504a318127197b 100644 (file)
--- a/beacon.el
+++ b/beacon.el
@@ -5,7 +5,7 @@
 ;; Author: Artur Malabarba <emacs@endlessparentheses.com>
 ;; URL: https://github.com/Malabarba/beacon
 ;; Keywords: convenience
 ;; Author: Artur Malabarba <emacs@endlessparentheses.com>
 ;; URL: https://github.com/Malabarba/beacon
 ;; Keywords: convenience
-;; Version: 0.1
+;; Version: 0.1.1
 ;; Package-Requires: ((seq "1.9"))
 
 ;; This program is free software; you can redistribute it and/or modify
 ;; Package-Requires: ((seq "1.9"))
 
 ;; This program is free software; you can redistribute it and/or modify
 ;;
 ;; That’s it.
 ;;
 ;;
 ;; That’s it.
 ;;
-;;
-;; 1 Customizations
-;; ════════════════
-;;
-;;   • The appearance of the beacon is configured by `beacon-size' and
-;;     `beacon-color'.
-;;
-;;   • The duration is configured by `beacon-blink-duration' and
-;;     `beacon-blink-delay'.
-;;
-;;   • To customize /when/ the beacon should blink at all, configure
-;;     `beacon-blink-when-window-scrolls',
-;;     `beacon-blink-when-window-changes', and
-;;     `beacon-blink-when-point-moves'.
-;;
-;;   • To prevent the beacon from blinking only on some major-modes,
-;;     configure `beacon-dont-blink-major-modes'. For specific buffers, you
-;;     can do `(setq-local beacon-mode nil)'. For even more refined
-;;     control, configure `beacon-dont-blink-predicates'
-;;
-;;   • Beacon can also push the mark for you whenever point moves a long
-;;     distance. For this, configure `beacon-push-mark'.
+;; See the accompanying Readme.org for configuration details.
 
 ;;; Code:
 
 
 ;;; Code:
 
@@ -67,7 +46,7 @@
 
 (defvar beacon--timer nil)
 
 
 (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
   "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
@@ -117,14 +96,18 @@ If it is a string, it is a color name or specification,
 e.g. \"#666600\"."
   :type '(choice number color))
 
 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
   "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
-non-nil, the beacon will not blink."
-  :type 'hook)
+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)))")
 
 
-(add-hook 'beacon-dont-blink-predicates (lambda () (bound-and-true-p hl-line-mode)))
 (add-hook 'beacon-dont-blink-predicates #'window-minibuffer-p)
 
 (defcustom beacon-dont-blink-major-modes '(magit-status-mode)
 (add-hook 'beacon-dont-blink-predicates #'window-minibuffer-p)
 
 (defcustom beacon-dont-blink-major-modes '(magit-status-mode)
@@ -281,6 +264,12 @@ Only returns `beacon-size' elements."
 (defvar beacon--previous-mark-head nil)
 (defvar beacon--previous-window nil)
 
 (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."
+  (<= (save-excursion (beginning-of-line) (point))
+      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."
 (defun beacon--movement-> (delta)
   "Return non-nil if latest point movement is > DELTA.
 If DELTA is nil, return nil."
@@ -290,9 +279,21 @@ If DELTA is nil, return nil."
               (current-buffer))
        (> (abs (- (point) beacon--previous-place))
           delta)
               (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 (point))
+            (throw 'movement nil))
+          (dolist (inc '(1 -1))
+            (save-excursion
+              (dotimes (i delta)
+                (vertical-motion inc)
+                (when (beacon--pos-on-current-line-p (point))
+                  (throw 'movement nil)))))
+          (throw 'movement t)))))
 
 (defun beacon--maybe-push-mark ()
   "Push mark if it seems to be safe."
 
 (defun beacon--maybe-push-mark ()
   "Push mark if it seems to be safe."