X-Git-Url: https://code.delx.au/gnu-emacs-elpa/blobdiff_plain/6f647f60c5b289cb593de779c9ee79ff88089a89..5622af463cacdeae3ddaf9be7c9decf8723eb675:/beacon.el diff --git a/beacon.el b/beacon.el index 149f6fbc7..8e2412008 100644 --- 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 ;; URL: https://github.com/Malabarba/beacon @@ -23,8 +23,30 @@ ;;; 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)) + ;;; 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)))) ;;; 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