]> code.delx.au - gnu-emacs-elpa/blobdiff - beacon.el
[#2] Add more options for preventing a blink
[gnu-emacs-elpa] / beacon.el
index 149f6fbc76dfeddd6cfb3a26c9a3e228fadf89f6..8e24120081cc8335f0a49ace3fd779483d224ea8 100644 (file)
--- a/beacon.el
+++ b/beacon.el
@@ -1,6 +1,6 @@
 ;;; beacon.el --- Highlight the cursor whenever it moves long distances  -*- lexical-binding: t; -*-
 
-;; Copyright (C) 2015  Artur Malabarba
+;; Copyright (C) 2015 Free Software Foundation, Inc.
 
 ;; Author: Artur Malabarba <emacs@endlessparentheses.com>
 ;; URL: https://github.com/Malabarba/beacon
 
 ;;; Commentary:
 
-;; This is a global minor-mode.  Turn it on everywhere with
-;;     (beacon-mode 1)
+;; This is a global minor-mode. Turn it on everywhere with:
+;; ┌────
+;; │ (beacon-mode 1)
+;; └────
+;;
+;; Whenever the window scrolls or the buffer changes a light will shine on
+;; top of your cursor so you know where it is.
+;;
+;; That’s it.
+;;
+;;
+;; 1 Customizations
+;; ════════════════
+;;
+;;   • To customize the appearance of the beacon, configure `beacon-size'
+;;     and `beacon-color'.
+;;
+;;   • To customize how long it lasts, configure `beacon-blink-duration'
+;;       and `beacon-blink-delay'.
+;;
+;;   • To customize /when/ it is used at all, configure
+;;     `beacon-blink-when-window-scrolls',
+;;     `beacon-blink-when-buffer-changes', and
+;;     `beacon-blink-when-point-moves'.
 
 ;;; Code:
 
@@ -83,6 +105,23 @@ 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
+  "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)
+
+(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 nil
+  "A list of major-modes where the beacon won't blink.
+Whenever the current buffer satisfies `derived-mode-p' for
+one of the major-modes on this list, the beacon will not
+blink."
+  :type '(repeat symbol))
+
 \f
 ;;; Overlays
 (defvar beacon--ovs nil)
@@ -97,10 +136,13 @@ e.g. \"#666600\"."
 (defun beacon--ov-put-after-string (overlay colors)
   "Add an after-string property to OVERLAY.
 The property's value is a string of spaces with background
-COLORS applied to each one."
+COLORS applied to each one.
+If COLORS is nil, OVERLAY is deleted!"
   (if (not colors)
-      (delete-overlay overlay)
+      (when (overlayp overlay)
+        (delete-overlay overlay))
     (overlay-put overlay 'beacon-colors colors)
+    (overlay-put overlay 'priority most-positive-fixnum)
     (overlay-put overlay 'after-string
                  (propertize
                   (mapconcat (lambda (c) (propertize " " 'face (list :background c)))
@@ -196,11 +238,14 @@ Only returns `beacon-size' elements."
   "Blink the beacon at the position of the cursor."
   (interactive)
   (beacon--vanish)
-  (beacon--shine)
-  (setq beacon--timer
-        (run-at-time beacon-blink-delay
-                     (/ beacon-blink-duration 1.0 beacon-size)
-                     #'beacon--dec)))
+  (unless (or (not beacon-mode)
+              (run-hook-with-args-until-success 'beacon-dont-blink-predicates)
+              (seq-find #'derived-mode-p beacon-dont-blink-major-modes))
+    (beacon--shine)
+    (setq beacon--timer
+          (run-at-time beacon-blink-delay
+                       (/ beacon-blink-duration 1.0 beacon-size)
+                       #'beacon--dec))))
 
 \f
 ;;; Movement detection
@@ -239,8 +284,7 @@ If DELTA is nil, return nil."
    ((not (equal (marker-buffer beacon--previous-place)
                 (current-buffer)))
     (when beacon-blink-when-buffer-changes
-      (unless (window-minibuffer-p)
-        (beacon-blink))))
+      (beacon-blink)))
    ;; Blink for scrolling.
    ((and beacon-blink-when-window-scrolls
          beacon--window-scrolled
@@ -287,9 +331,11 @@ unreliable, so just blink immediately."
   (if beacon-mode
       (progn
         (add-hook 'window-scroll-functions #'beacon--window-scroll-function)
-        (add-hook 'post-command-hook #'beacon--post-command))
+        (add-hook 'post-command-hook #'beacon--post-command)
+        (add-hook 'pre-command-hook #'beacon--vanish))
     (remove-hook 'window-scroll-functions #'beacon--window-scroll-function)
-    (remove-hook 'post-command-hook #'beacon--post-command)))
+    (remove-hook 'post-command-hook #'beacon--post-command)
+    (remove-hook 'pre-command-hook #'beacon--vanish)))
 
 (provide 'beacon)
 ;;; beacon.el ends here