;; Author: Artur Malabarba <emacs@endlessparentheses.com>
;; URL: https://github.com/Malabarba/beacon
;; Keywords: convenience
-;; Version: 0.1.1
+;; Version: 0.2.1
;; Package-Requires: ((seq "1.9"))
;; This program is free software; you can redistribute it and/or modify
"Should the beacon blink when the window changes?"
:type 'boolean)
+(defcustom beacon-blink-when-focused nil
+ "Should the beacon blink when Emacs gains focus?
+Note that, due to a limitation of `focus-in-hook', this might
+trigger false positives on some systems."
+ :type 'boolean
+ :package-version '(beacon . "0.2"))
+
(defcustom beacon-blink-duration 0.3
"Time, in seconds, that the blink should last."
:type 'number)
(add-hook 'beacon-dont-blink-predicates #'window-minibuffer-p)
-(defcustom beacon-dont-blink-major-modes '(magit-status-mode)
+(defcustom beacon-dont-blink-major-modes '(magit-status-mode magit-popup-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
(markerp beacon--previous-place)
(equal (marker-buffer beacon--previous-place)
(current-buffer))
+ ;; Quick check that prevents running the code below in very
+ ;; short movements (like typing).
(> (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 >= DELTA lines by moving DELTA
+ ;; lines. `count-screen-lines' is too slow if the movement had
+ ;; thousands of lines.
+ (save-excursion
+ (let ((p (point)))
+ (goto-char (min beacon--previous-place p))
+ (vertical-motion delta)
+ (> (max p beacon--previous-place)
+ (line-beginning-position))))))
(defun beacon--maybe-push-mark ()
"Push mark if it seems to be safe."
(setq beacon--window-scrolled nil)
(beacon-blink)))
+(defun beacon--blink-on-focus ()
+ "Blink if `beacon-blink-when-focused' is non-nil"
+ (when beacon-blink-when-focused
+ (beacon-blink)))
+
\f
;;; Minor-mode
(defcustom beacon-lighter
(cond
- ((char-displayable-p ?💡) " 💡")
- ((char-displayable-p ?Λ) " Λ")
- (t " *"))
+ ;; ((char-displayable-p ?💡) " 💡")
+ ;; ((char-displayable-p ?Λ) " Λ")
+ (t " (*)"))
"Lighter string used on the mode-line."
:type 'string)
(if beacon-mode
(progn
(add-hook 'window-scroll-functions #'beacon--window-scroll-function)
+ (add-hook 'focus-in-hook #'beacon--blink-on-focus)
(add-hook 'post-command-hook #'beacon--post-command)
(add-hook 'pre-command-hook #'beacon--vanish))
+ (remove-hook 'focus-in-hook #'beacon--blink-on-focus)
(remove-hook 'window-scroll-functions #'beacon--window-scroll-function)
(remove-hook 'post-command-hook #'beacon--post-command)
(remove-hook 'pre-command-hook #'beacon--vanish)))
(provide 'beacon)
;;; beacon.el ends here
+
+;; Local Variables:
+;; indent-tabs-mode: nil
+;; End: