X-Git-Url: https://code.delx.au/gnu-emacs-elpa/blobdiff_plain/3e1defba2d847bec0f67570c3f8d9148823b1703..f3b84896eee77611a0b0f487b6d4532111f775e7:/beacon.el diff --git a/beacon.el b/beacon.el index 290054eb0..e237c69d1 100644 --- a/beacon.el +++ b/beacon.el @@ -5,7 +5,7 @@ ;; Author: Artur Malabarba ;; 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 @@ -33,28 +33,7 @@ ;; ;; 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: @@ -67,7 +46,7 @@ (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 @@ -117,14 +96,18 @@ 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 +(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 -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) @@ -134,6 +117,13 @@ one of the major-modes on this list, the beacon will not blink." :type '(repeat symbol)) +(defcustom beacon-dont-blink-commands '(recenter-top-bottom) + "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 +than helpful.." + :type '(repeat symbol)) + ;;; Overlays (defvar beacon--ovs nil) @@ -259,7 +249,8 @@ Only returns `beacon-size' elements." (beacon--vanish) (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)) + (seq-find #'derived-mode-p beacon-dont-blink-major-modes) + (memq (or this-command last-command) beacon-dont-blink-commands)) (beacon--shine) (setq beacon--timer (run-at-time beacon-blink-delay @@ -273,6 +264,12 @@ Only returns `beacon-size' elements." (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." @@ -282,9 +279,21 @@ If DELTA is nil, return nil." (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."