X-Git-Url: https://code.delx.au/gnu-emacs-elpa/blobdiff_plain/38d0419e3d4217b30e2aa8c416c04bd44eb9e34a..2ac8539830be6bf45e164b1cc8b0f0a6230e6808:/beacon.el diff --git a/beacon.el b/beacon.el index be77a38c2..aac96e74f 100644 --- a/beacon.el +++ b/beacon.el @@ -5,7 +5,7 @@ ;; Author: Artur Malabarba ;; URL: https://github.com/Malabarba/beacon ;; Keywords: convenience -;; Version: 0.5 +;; Version: 0.5.1 ;; Package-Requires: ((seq "1.11")) ;; This program is free software; you can redistribute it and/or modify @@ -39,6 +39,23 @@ (require 'seq) (require 'faces) +(unless (fboundp 'seq-mapn) + ;; This is for people who are on outdated Emacs snapshots. Will be + ;; deleted in a couple of weeks. + (defun seq-mapn (function sequence &rest sequences) + "Like `seq-map' but FUNCTION is mapped over all SEQUENCES. +The arity of FUNCTION must match the number of SEQUENCES, and the +mapping stops on the shortest sequence. +Return a list of the results. + +\(fn FUNCTION SEQUENCES...)" + (let ((result nil) + (sequences (seq-map (lambda (s) (seq-into s 'list)) + (cons sequence sequences)))) + (while (not (memq nil sequences)) + (push (apply function (seq-map #'car sequences)) result) + (setq sequences (seq-map #'cdr sequences))) + (nreverse result)))) (defgroup beacon nil "Customization group for beacon." @@ -132,14 +149,16 @@ For instance, if you want to disable beacon on buffers where (add-hook 'beacon-dont-blink-predicates #'window-minibuffer-p) -(defcustom beacon-dont-blink-major-modes '(magit-status-mode magit-popup-mode) +(defcustom beacon-dont-blink-major-modes '(t magit-status-mode magit-popup-mode + gnus-summary-mode gnus-group-mode) "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)) -(defcustom beacon-dont-blink-commands '(recenter-top-bottom) +(defcustom beacon-dont-blink-commands '(next-line previous-line + forward-line) "A list of commands that should not make the beacon blink. Use this for commands that scroll the window in very predictable ways, when the blink would be more distracting @@ -236,14 +255,22 @@ Only returns `beacon-size' elements." (defun beacon--color-range () "Return a list of background colors for the beacon." - (let* ((default-bg (background-color-at-point)) - (bg (color-values (if (string-match "\\`unspecified-" default-bg) + (let* ((default-bg (or (save-excursion + (unless (eobp) + (forward-line 1) + (unless (or (bobp) (not (bolp))) + (forward-char -1))) + (background-color-at-point)) + (face-background 'default))) + (bg (color-values (if (or (not (stringp default-bg)) + (string-match "\\`unspecified-" default-bg)) (face-attribute 'beacon-fallback-background :background) default-bg))) (fg (cond ((stringp beacon-color) (color-values beacon-color)) - ((< (color-distance "black" bg) - (color-distance "white" bg)) + ((and (stringp bg) + (< (color-distance "black" bg) + (color-distance "white" bg))) (make-list 3 (* beacon-color 65535))) (t (make-list 3 (* (- 1 beacon-color) 65535)))))) (apply #'seq-mapn (lambda (r g b) (format "#%04x%04x%04x" r g b)) @@ -343,8 +370,8 @@ The same is true for DELTA-X and horizonta movement." (defun beacon--post-command () "Blink if point moved very far." (cond - ((not (markerp beacon--previous-place)) - (beacon--vanish)) + ;; Sanity check. + ((not (markerp beacon--previous-place))) ;; Blink for switching windows. ((and beacon-blink-when-window-changes (not (eq beacon--previous-window (selected-window)))) @@ -356,9 +383,7 @@ The same is true for DELTA-X and horizonta movement." ;; Blink for movement ((beacon--movement-> beacon-blink-when-point-moves-vertically beacon-blink-when-point-moves-horizontally) - (beacon-blink)) - ;; Even if we don't blink, vanish any previous beacon. - (t (beacon--vanish))) + (beacon-blink))) (beacon--maybe-push-mark) (setq beacon--window-scrolled nil))