;;; type-break.el --- encourage rests from typing at appropriate intervals
-;; Copyright (C) 1994, 1995, 1997 Free Software Foundation, Inc.
+;; Copyright (C) 1994, 95, 97, 2000 Free Software Foundation, Inc.
-;; Author: Noah Friedman <friedman@prep.ai.mit.edu>
-;; Maintainer: friedman@prep.ai.mit.edu
+;; Author: Noah Friedman
+;; Maintainer: Noah Friedman <friedman@splode.com>
;; Keywords: extensions, timers
;; Status: Works in GNU Emacs 19.25 or later, some versions of XEmacs
;; Created: 1994-07-13
-;; $Id: type-break.el,v 1.12 1997/06/23 05:28:51 friedman Exp stephen $
+;; $Id: type-break.el,v 1.23 2000/03/13 11:16:00 friedman Exp $
;; This file is part of GNU Emacs.
;; This package was inspired by Roland McGrath's hanoi-break.el.
;; Several people contributed feedback and ideas, including
-;; Roland McGrath <roland@gnu.ai.mit.edu>
-;; Kleanthes Koniaris <kgk@martigny.ai.mit.edu>
-;; Mark Ashton <mpashton@gnu.ai.mit.edu>
+;; Roland McGrath <roland@gnu.org>
+;; Kleanthes Koniaris <kgk@koniaris.com>
+;; Mark Ashton <mpashton@gnu.org>
;; Matt Wilding <wilding@cli.com>
;; Robert S. Boyer <boyer@cs.utexas.edu>
(defgroup type-break nil
"Encourage the user to take a rest from typing at suitable intervals."
:prefix "type-break"
+ :group 'type-break
:group 'keyboard)
;;;###autoload
(defcustom type-break-mode nil
- "*Non-`nil' means typing break mode is enabled.
+ "Toggle typing break mode.
See the docstring for the `type-break-mode' command for more information.
-You must modify via \\[customize] for this variable to have an effect."
+Setting this variable directly does not take effect;
+use either \\[customize] or the function `type-break-mode'."
:set (lambda (symbol value)
(type-break-mode (if value 1 -1)))
- :initialize 'custom-initialize-default
+ :initialize 'custom-initialize-default
:type 'boolean
:group 'type-break
:require 'type-break)
:type 'boolean
:group 'type-break)
-(defvar type-break-query-function 'yes-or-no-p
- "Function to use for making query for a typing break.
+(defcustom type-break-query-function 'yes-or-no-p
+ "*Function to use for making query for a typing break.
It should take a string as an argument, the prompt.
Usually this should be set to `yes-or-no-p' or `y-or-n-p'.
-To avoid being queried at all, set `type-break-query-mode' to `nil'.")
+To avoid being queried at all, set `type-break-query-mode' to `nil'."
+ :type '(radio function
+ (function-item yes-or-no-p)
+ (function-item y-or-n-p))
+ :group 'type-break)
(defcustom type-break-query-interval 60
"*Number of seconds between queries to take a break, if put off.
:type '(repeat integer)
:group 'type-break)
-
(defcustom type-break-warning-repeat 40
"*Number of keystrokes for which warnings should be repeated.
That is, for each of this many keystrokes the warning is redisplayed
:type 'integer
:group 'type-break)
+(defcustom type-break-time-stamp-format "[%H:%M] "
+ "*Timestamp format used to prefix messages.
+Format specifiers are as used by `format-time-string'."
+ :type 'string
+ :group 'type-break)
+
(defcustom type-break-demo-functions
'(type-break-demo-boring type-break-demo-life type-break-demo-hanoi)
"*List of functions to consider running as demos during typing breaks.
type-break-mode-line-break-string))
(defvar type-break-mode-line-break-message-p nil)
-(defvar type-break-mode-line-break-string " *** TAKE A TYPING BREAK ***")
+(defvar type-break-mode-line-break-string " *** TAKE A TYPING BREAK NOW ***")
(defvar type-break-mode-line-warning
'(type-break-mode-line-break-message-p
("")
(type-break-warning-countdown-string
- (" ***Break in "
+ (" *** "
+ "Break in "
type-break-warning-countdown-string
" "
type-break-warning-countdown-string-type
(setq alist nil))
(t
(setq alist (cdr alist)))))
- (store-match-data data)
+ (set-match-data data)
(cond ((eq result 'lucid)
(and (string= emacs-version "19.8 Lucid")
(setq result 'lucid-19-8)))
There are several variables that affect how or when warning messages about
imminent typing breaks are displayed. They include:
- type-break-mode-line-message-mode
- type-break-time-warning-intervals
- type-break-keystroke-warning-intervals
- type-break-warning-repeat
- type-break-warning-countdown-string
- type-break-warning-countdown-string-type
+ `type-break-mode-line-message-mode'
+ `type-break-time-warning-intervals'
+ `type-break-keystroke-warning-intervals'
+ `type-break-warning-repeat'
+ `type-break-warning-countdown-string'
+ `type-break-warning-countdown-string-type'
There are several variables that affect if, how, and when queries to begin
a typing break occur. They include:
- type-break-query-mode
- type-break-query-function
- type-break-query-interval
+ `type-break-query-mode'
+ `type-break-query-function'
+ `type-break-query-interval'
Finally, the command `type-break-statistics' prints interesting things."
(interactive "P")
(cond
((and already-enabled type-break-mode)
(and (interactive-p)
- (message "type-break-mode is already enabled")))
+ (message "Type Break mode is already enabled")))
(type-break-mode
(or global-mode-string
(setq global-mode-string '("")))
- (or (memq 'type-break-mode-line-format
- (default-value 'global-mode-string))
- (setq-default global-mode-string
- (nconc (default-value 'global-mode-string)
- '(type-break-mode-line-format))))
+ (or (assq 'type-break-mode-line-message-mode
+ minor-mode-alist)
+ (setq minor-mode-alist
+ (cons type-break-mode-line-format
+ minor-mode-alist)))
(type-break-keystroke-reset)
(type-break-mode-line-countdown-or-break nil)
(type-break-schedule)
(and (interactive-p)
- (message "type-break-mode is enabled and reset")))
+ (message "Type Break mode is enabled and reset")))
(t
(type-break-keystroke-reset)
(type-break-mode-line-countdown-or-break nil)
(type-break-cancel-schedule)
(and (interactive-p)
- (message "type-break-mode is disabled")))))
+ (message "Type Break mode is disabled")))))
type-break-mode)
(defun type-break-mode-line-message-mode (&optional prefix)
Variables controlling the display of messages in the mode line include:
- mode-line-format
- global-mode-string
- type-break-mode-line-break-message
- type-break-mode-line-warning"
+ `mode-line-format'
+ `global-mode-string'
+ `type-break-mode-line-break-message'
+ `type-break-mode-line-warning'"
(interactive "P")
(setq type-break-mode-line-message-mode
(>= (prefix-numeric-value prefix) 0))
After the typing break is finished, the next break is scheduled
as per the function `type-break-schedule'."
(interactive)
+ (do-auto-save)
(type-break-cancel-schedule)
(let ((continue t)
(start-time (current-time)))
; (setq continue nil))
((funcall
type-break-query-function
- (format "You really ought to rest %s more. Continue break? "
+ (format "%sYou really ought to rest %s more. Continue break? "
+ (type-break-time-stamp)
(type-break-format-time (- type-break-good-rest-interval
break-secs)))))
(t
(setq type-break-time-last-command (current-time))))
(and type-break-keystroke-threshold
- ;; next line is test for 20.2 that can be deleted
- ;;(setq type-break-keystroke-count (1+ type-break-keystroke-count))
(let ((keys (this-command-keys)))
(cond
;; Ignore mouse motion
;; which hoses undo or yank-pop (if you happened to be
;; yanking just when the query occurred).
(this-command this-command))
+ ;; Cancel schedule to prevent possibility of a second query
+ ;; from taking place before this one has even returned.
+ ;; The condition-case wrapper will reschedule on quit.
+ (type-break-cancel-schedule)
(funcall type-break-query-function
- "Take a break from typing now? "))
+ (format "%s%s"
+ (type-break-time-stamp)
+ "Take a break from typing now? ")))
(type-break))
(t
(type-break-schedule type-break-query-interval)))
(type-break-mode-line-message-mode)
(t
(beep t)
- (message "You should take a typing break now. Do `M-x type-break'.")
+ (message "%sYou should take a typing break now. Do `M-x type-break'."
+ (type-break-time-stamp))
(sit-for 1)
(beep t)
;; return nil so query caller knows to reset reminder, as if user
((not type-break-mode-line-message-mode)
;; Pause for a moment so any previous message can be seen.
(sit-for 2)
- (message "Warning: typing break due in %s."
+ (message "%sWarning: typing break due in %s."
+ (type-break-time-stamp)
(type-break-format-time timeleft))
(setq type-break-time-warning-count
(1- type-break-time-warning-count))))))
((memq this-command '(digit-argument universal-argument)))
((not type-break-mode-line-message-mode)
(sit-for 2)
- (message "Warning: typing break due in %s keystrokes."
+ (message "%sWarning: typing break due in %s keystrokes."
+ (type-break-time-stamp)
(- (cdr type-break-keystroke-threshold)
type-break-keystroke-count))
(setq type-break-keystroke-warning-count
(list high low micro)))
+(defun type-break-time-stamp (&optional when)
+ (if (fboundp 'format-time-string)
+ (format-time-string type-break-time-stamp-format when)
+ ;; Emacs 19.28 and prior do not have format-time-string.
+ ;; In that case, result is not customizable. Upgrade today!
+ (format "[%s] " (substring (current-time-string when) 11 16))))
+
(defun type-break-format-time (secs)
(let ((mins (/ secs 60)))
(cond
(if type-break-mode
(type-break-mode 1))
+
;;; type-break.el ends here