]> code.delx.au - gnu-emacs-elpa/blobdiff - beacon.el
Don't blink on the minibuffer
[gnu-emacs-elpa] / beacon.el
index 81eb64b9d6dbbf1d4755a69c6817e864eb89daec..76d7652de8ba4f14c1e5e05fa93468f84055e5c9 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:
 
@@ -196,11 +218,12 @@ 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 (window-minibuffer-p)
+    (beacon--shine)
+    (setq beacon--timer
+          (run-at-time beacon-blink-delay
+                       (/ beacon-blink-duration 1.0 beacon-size)
+                       #'beacon--dec))))
 
 \f
 ;;; Movement detection
@@ -239,13 +262,12 @@ 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)
-    (with-selected-window beacon--window-scrolled
-      (beacon-blink))
+         beacon--window-scrolled
+         (equal beacon--window-scrolled (selected-window)))
+    (beacon-blink)
     (setq beacon--window-scrolled nil))
    ;; Blink for movement
    ((beacon--movement-> beacon-blink-when-point-moves)
@@ -258,7 +280,17 @@ If DELTA is nil, return nil."
     (setq beacon--previous-place (point-marker))))
 
 (defun beacon--window-scroll-function (win _start-pos)
-  (setq beacon--window-scrolled win))
+  "Blink the beacon or record that window has been scrolled.
+If invoked during the command loop, record the current window so
+that it may be blinked on post-command.  This is because the
+scrolled window might not be active, but we only know that at
+`post-command-hook'.
+
+If invoked outside the command loop, `post-command-hook' would be
+unreliable, so just blink immediately."
+  (if this-command
+      (setq beacon--window-scrolled win)
+    (beacon-blink)))
 
 \f
 ;;; Minor-mode