annotate lisp/type-break.el @ 76297:35a8988b02f7

(type-break-get-previous-time): Handle end-of-file errors specially so they don't get reported wrong in .emacs.
author Richard M. Stallman <rms@gnu.org>
date Sun, 04 Mar 2007 17:50:46 +0000
parents acad3d4a5f18
children f4a10797c3ce
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8276
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
1 ;;; type-break.el --- encourage rests from typing at appropriate intervals
8248
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
2
74442
b2e5081b9320 Update copyright years.
Glenn Morris <rgm@gnu.org>
parents: 68651
diff changeset
3 ;; Copyright (C) 1994, 1995, 1997, 2000, 2001, 2002, 2003,
75347
e3694f1cb928 Add 2007 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 75296
diff changeset
4 ;; 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
8248
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
5
23240
b9d8ec6db59a Comment fixes only.
Noah Friedman <friedman@splode.com>
parents: 23239
diff changeset
6 ;; Author: Noah Friedman
b9d8ec6db59a Comment fixes only.
Noah Friedman <friedman@splode.com>
parents: 23239
diff changeset
7 ;; Maintainer: Noah Friedman <friedman@splode.com>
9355
8ac258bc59ef Assign copyright to FSF, and change comments to reflect that type-break
Noah Friedman <friedman@splode.com>
parents: 8497
diff changeset
8 ;; Keywords: extensions, timers
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
9 ;; Status: Works in GNU Emacs 19.25 or later, some versions of XEmacs
9355
8ac258bc59ef Assign copyright to FSF, and change comments to reflect that type-break
Noah Friedman <friedman@splode.com>
parents: 8497
diff changeset
10 ;; Created: 1994-07-13
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
11
9355
8ac258bc59ef Assign copyright to FSF, and change comments to reflect that type-break
Noah Friedman <friedman@splode.com>
parents: 8497
diff changeset
12 ;; This file is part of GNU Emacs.
8248
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
13
9355
8ac258bc59ef Assign copyright to FSF, and change comments to reflect that type-break
Noah Friedman <friedman@splode.com>
parents: 8497
diff changeset
14 ;; GNU Emacs is free software; you can redistribute it and/or modify
8ac258bc59ef Assign copyright to FSF, and change comments to reflect that type-break
Noah Friedman <friedman@splode.com>
parents: 8497
diff changeset
15 ;; it under the terms of the GNU General Public License as published by
8ac258bc59ef Assign copyright to FSF, and change comments to reflect that type-break
Noah Friedman <friedman@splode.com>
parents: 8497
diff changeset
16 ;; the Free Software Foundation; either version 2, or (at your option)
8ac258bc59ef Assign copyright to FSF, and change comments to reflect that type-break
Noah Friedman <friedman@splode.com>
parents: 8497
diff changeset
17 ;; any later version.
8ac258bc59ef Assign copyright to FSF, and change comments to reflect that type-break
Noah Friedman <friedman@splode.com>
parents: 8497
diff changeset
18
8ac258bc59ef Assign copyright to FSF, and change comments to reflect that type-break
Noah Friedman <friedman@splode.com>
parents: 8497
diff changeset
19 ;; GNU Emacs is distributed in the hope that it will be useful,
8ac258bc59ef Assign copyright to FSF, and change comments to reflect that type-break
Noah Friedman <friedman@splode.com>
parents: 8497
diff changeset
20 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
8ac258bc59ef Assign copyright to FSF, and change comments to reflect that type-break
Noah Friedman <friedman@splode.com>
parents: 8497
diff changeset
21 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8ac258bc59ef Assign copyright to FSF, and change comments to reflect that type-break
Noah Friedman <friedman@splode.com>
parents: 8497
diff changeset
22 ;; GNU General Public License for more details.
8ac258bc59ef Assign copyright to FSF, and change comments to reflect that type-break
Noah Friedman <friedman@splode.com>
parents: 8497
diff changeset
23
8ac258bc59ef Assign copyright to FSF, and change comments to reflect that type-break
Noah Friedman <friedman@splode.com>
parents: 8497
diff changeset
24 ;; You should have received a copy of the GNU General Public License
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
25 ;; along with GNU Emacs; see the file COPYING. If not, write to the
64091
6fb026ad601f Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 59684
diff changeset
26 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
6fb026ad601f Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 59684
diff changeset
27 ;; Boston, MA 02110-1301, USA.
8248
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
28
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
29 ;;; Commentary:
8276
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
30
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
31 ;; The docstring for the function `type-break-mode' summarizes most of the
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
32 ;; details of the interface.
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
33
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
34 ;; This package relies on the assumption that you live entirely in Emacs,
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
35 ;; as the author does. If that's not the case for you (e.g. you often
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
36 ;; suspend Emacs or work in other windows) then this won't help very much;
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
37 ;; it will depend on just how often you switch back to Emacs. At the very
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
38 ;; least, you will want to turn off the keystroke thresholds and rest
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
39 ;; interval tracking.
8276
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
40
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
41 ;; If you prefer not to be queried about taking breaks, but instead just
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
42 ;; want to be reminded, do the following:
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
43 ;;
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
44 ;; (setq type-break-query-mode nil)
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
45 ;;
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
46 ;; Or call the command `type-break-query-mode' with a negative prefix
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
47 ;; argument.
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
48
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
49 ;; If you find echo area messages annoying and would prefer to see messages
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
50 ;; in the mode line instead, do M-x type-break-mode-line-message-mode
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
51 ;; or set the variable of the same name to `t'.
8276
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
52
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
53 ;; This program can truly cons up a storm because of all the calls to
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
54 ;; `current-time' (which always returns 3 fresh conses). I'm dismayed by
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
55 ;; this, but I think the health of my hands is far more important than a
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
56 ;; few pages of virtual memory.
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
57
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
58 ;; This program has no hope of working in Emacs 18.
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
59
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
60 ;; This package was inspired by Roland McGrath's hanoi-break.el.
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
61 ;; Several people contributed feedback and ideas, including
25278
cbe304a26771 Fix maintainer address.
Karl Heuer <kwzh@gnu.org>
parents: 24648
diff changeset
62 ;; Roland McGrath <roland@gnu.org>
30391
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
63 ;; Kleanthes Koniaris <kgk@koniaris.com>
25278
cbe304a26771 Fix maintainer address.
Karl Heuer <kwzh@gnu.org>
parents: 24648
diff changeset
64 ;; Mark Ashton <mpashton@gnu.org>
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
65 ;; Matt Wilding <wilding@cli.com>
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
66 ;; Robert S. Boyer <boyer@cs.utexas.edu>
8276
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
67
8248
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
68 ;;; Code:
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
69
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
70
20800
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
71 (defgroup type-break nil
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
72 "Encourage the user to take a rest from typing at suitable intervals."
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
73 :prefix "type-break"
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
74 :group 'keyboard)
5939
454dc146502d Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
75
454dc146502d Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
76 ;;;###autoload
20800
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
77 (defcustom type-break-mode nil
24547
ab118f20a10b (type-break-mode): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 23240
diff changeset
78 "Toggle typing break mode.
20800
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
79 See the docstring for the `type-break-mode' command for more information.
24648
4c102f02bdcd (type-break-mode): Doc fix.
Dave Love <fx@gnu.org>
parents: 24550
diff changeset
80 Setting this variable directly does not take effect;
4c102f02bdcd (type-break-mode): Doc fix.
Dave Love <fx@gnu.org>
parents: 24550
diff changeset
81 use either \\[customize] or the function `type-break-mode'."
20800
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
82 :set (lambda (symbol value)
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
83 (type-break-mode (if value 1 -1)))
23239
b88e81176427 (type-break-mode): remove :version field from defcustom declaration.
Noah Friedman <friedman@splode.com>
parents: 22069
diff changeset
84 :initialize 'custom-initialize-default
20800
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
85 :type 'boolean
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
86 :group 'type-break
23239
b88e81176427 (type-break-mode): remove :version field from defcustom declaration.
Noah Friedman <friedman@splode.com>
parents: 22069
diff changeset
87 :require 'type-break)
8275
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
88
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
89 ;;;###autoload
20800
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
90 (defcustom type-break-interval (* 60 60)
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
91 "*Number of seconds between scheduled typing breaks."
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
92 :type 'integer
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
93 :group 'type-break)
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
94
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
95 ;;;###autoload
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
96 (defcustom type-break-good-rest-interval (/ type-break-interval 6)
8276
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
97 "*Number of seconds of idle time considered to be an adequate typing rest.
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
98
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
99 When this variable is non-nil, Emacs checks the idle time between
8304
6c34e249d217 type-break-good-rest-interval: Doc fix.
Noah Friedman <friedman@splode.com>
parents: 8282
diff changeset
100 keystrokes. If this idle time is long enough to be considered a \"good\"
8276
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
101 rest from typing, then the next typing break is simply rescheduled for later.
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
102
8304
6c34e249d217 type-break-good-rest-interval: Doc fix.
Noah Friedman <friedman@splode.com>
parents: 8282
diff changeset
103 If a break is interrupted before this much time elapses, the user will be
20800
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
104 asked whether or not really to interrupt the break."
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
105 :type 'integer
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
106 :group 'type-break)
8276
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
107
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
108 ;;;###autoload
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
109 (defcustom type-break-good-break-interval nil
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
110 "*Number of seconds considered to be an adequate explicit typing rest.
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
111
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
112 When this variable is non-nil, its value is considered to be a \"good\"
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
113 length (in seconds) for a break initiated by the command `type-break',
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
114 overriding `type-break-good-rest-interval'. This provides querying of
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
115 break interruptions when `type-break-good-rest-interval' is nil."
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
116 :type 'integer
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
117 :group 'type-break)
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
118
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
119 ;;;###autoload
20800
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
120 (defcustom type-break-keystroke-threshold
8304
6c34e249d217 type-break-good-rest-interval: Doc fix.
Noah Friedman <friedman@splode.com>
parents: 8282
diff changeset
121 ;; Assuming typing speed is 35wpm (on the average, do you really
8282
206451cdd48a type-break-keystroke-threshold: Change default wpm to 30 and lower
Noah Friedman <friedman@splode.com>
parents: 8281
diff changeset
122 ;; type more than that in a minute? I spend a lot of time reading mail
206451cdd48a type-break-keystroke-threshold: Change default wpm to 30 and lower
Noah Friedman <friedman@splode.com>
parents: 8281
diff changeset
123 ;; and simply studying code in buffers) and average word length is
8275
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
124 ;; about 5 letters, default upper threshold to the average number of
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
125 ;; keystrokes one is likely to type in a break interval. That way if the
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
126 ;; user goes through a furious burst of typing activity, cause a typing
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
127 ;; break to be required sooner than originally scheduled.
8282
206451cdd48a type-break-keystroke-threshold: Change default wpm to 30 and lower
Noah Friedman <friedman@splode.com>
parents: 8281
diff changeset
128 ;; Conversely, the minimum threshold should be about a fifth of this.
8304
6c34e249d217 type-break-good-rest-interval: Doc fix.
Noah Friedman <friedman@splode.com>
parents: 8282
diff changeset
129 (let* ((wpm 35)
8275
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
130 (avg-word-length 5)
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
131 (upper (* wpm avg-word-length (/ type-break-interval 60)))
8282
206451cdd48a type-break-keystroke-threshold: Change default wpm to 30 and lower
Noah Friedman <friedman@splode.com>
parents: 8281
diff changeset
132 (lower (/ upper 5)))
8275
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
133 (cons lower upper))
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
134 "*Upper and lower bound on number of keystrokes for considering typing break.
20800
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
135 This structure is a pair of numbers (MIN . MAX).
8248
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
136
8276
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
137 The first number is the minimum number of keystrokes that must have been
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
138 entered since the last typing break before considering another one, even if
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
139 the scheduled time has elapsed; the break is simply rescheduled until later
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
140 if the minimum threshold hasn't been reached. If this first value is nil,
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
141 then there is no minimum threshold; as soon as the scheduled time has
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
142 elapsed, the user will always be queried.
8275
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
143
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
144 The second number is the maximum number of keystrokes that can be entered
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
145 before a typing break is requested immediately, pre-empting the originally
8276
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
146 scheduled break. If this second value is nil, then no pre-emptive breaks
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
147 will occur; only scheduled ones will.
8275
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
148
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
149 Keys with bucky bits (shift, control, meta, etc) are counted as only one
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
150 keystroke even though they really require multiple keys to generate them.
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
151
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
152 The command `type-break-guesstimate-keystroke-threshold' can be used to
20800
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
153 guess a reasonably good pair of values for this variable."
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
154 :type 'sexp
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
155 :group 'type-break)
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
156
20800
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
157 (defcustom type-break-query-mode t
50868
7588d6aa3cb7 (type-break-good-rest-interval, type-break-query-mode)
Juanma Barranquero <lekktu@gmail.com>
parents: 50551
diff changeset
158 "*Non-nil means ask whether or not to prompt user for breaks.
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
159 If so, call the function specified in the value of the variable
20800
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
160 `type-break-query-function' to do the asking."
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
161 :type 'boolean
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
162 :group 'type-break)
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
163
30391
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
164 (defcustom type-break-query-function 'yes-or-no-p
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
165 "*Function to use for making query for a typing break.
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
166 It should take a string as an argument, the prompt.
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
167 Usually this should be set to `yes-or-no-p' or `y-or-n-p'.
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
168
50868
7588d6aa3cb7 (type-break-good-rest-interval, type-break-query-mode)
Juanma Barranquero <lekktu@gmail.com>
parents: 50551
diff changeset
169 To avoid being queried at all, set `type-break-query-mode' to nil."
30391
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
170 :type '(radio function
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
171 (function-item yes-or-no-p)
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
172 (function-item y-or-n-p))
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
173 :group 'type-break)
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
174
20800
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
175 (defcustom type-break-query-interval 60
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
176 "*Number of seconds between queries to take a break, if put off.
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
177 The user will continue to be prompted at this interval until he or she
20800
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
178 finally submits to taking a typing break."
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
179 :type 'integer
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
180 :group 'type-break)
8276
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
181
20800
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
182 (defcustom type-break-time-warning-intervals '(300 120 60 30)
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
183 "*List of time intervals for warnings about upcoming typing break.
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
184 At each of the intervals (specified in seconds) away from a scheduled
20800
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
185 typing break, print a warning in the echo area."
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
186 :type '(repeat integer)
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
187 :group 'type-break)
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
188
20800
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
189 (defcustom type-break-keystroke-warning-intervals '(300 200 100 50)
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
190 "*List of keystroke measurements for warnings about upcoming typing break.
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
191 At each of the intervals (specified in keystrokes) away from the upper
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
192 keystroke threshold, print a warning in the echo area.
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
193 If either this variable or the upper threshold is set, then no warnings
20800
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
194 will occur."
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
195 :type '(repeat integer)
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
196 :group 'type-break)
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
197
20800
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
198 (defcustom type-break-warning-repeat 40
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
199 "*Number of keystrokes for which warnings should be repeated.
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
200 That is, for each of this many keystrokes the warning is redisplayed
20800
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
201 in the echo area to make sure it's really seen."
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
202 :type 'integer
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
203 :group 'type-break)
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
204
30391
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
205 (defcustom type-break-time-stamp-format "[%H:%M] "
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
206 "*Timestamp format used to prefix messages.
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
207 Format specifiers are as used by `format-time-string'."
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
208 :type 'string
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
209 :group 'type-break)
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
210
20800
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
211 (defcustom type-break-demo-functions
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
212 '(type-break-demo-boring type-break-demo-life type-break-demo-hanoi)
8304
6c34e249d217 type-break-good-rest-interval: Doc fix.
Noah Friedman <friedman@splode.com>
parents: 8282
diff changeset
213 "*List of functions to consider running as demos during typing breaks.
8248
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
214 When a typing break begins, one of these functions is selected randomly
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
215 to have Emacs do something interesting.
8248
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
216
8304
6c34e249d217 type-break-good-rest-interval: Doc fix.
Noah Friedman <friedman@splode.com>
parents: 8282
diff changeset
217 Any function in this list should start a demo which ceases as soon as a
20800
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
218 key is pressed."
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
219 :type '(repeat function)
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
220 :group 'type-break)
8248
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
221
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
222 (defcustom type-break-demo-boring-stats nil
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
223 "*Show word per minute and keystroke figures in the Boring demo."
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
224 :type 'boolean
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
225 :group 'type-break)
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
226
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
227 (defcustom type-break-terse-messages nil
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
228 "*Use slightly terser messages."
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
229 :type 'boolean
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
230 :group 'type-break)
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
231
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
232 (defcustom type-break-file-name (convert-standard-filename "~/.type-break")
59554
73d669603319 (type-break-file-name): Doc update as per the above.
Eli Zaretskii <eliz@gnu.org>
parents: 59489
diff changeset
233 "*Name of file used to save state across sessions.
73d669603319 (type-break-file-name): Doc update as per the above.
Eli Zaretskii <eliz@gnu.org>
parents: 59489
diff changeset
234 If this is nil, no data will be saved across sessions."
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
235 :type 'file
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
236 :group 'type-break)
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
237
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
238 (defvar type-break-post-command-hook '(type-break-check)
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
239 "Hook run indirectly by `post-command-hook' for typing break functions.
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
240 This is not really intended to be set by the user, but it's probably
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
241 harmless to do so. Mainly it is used by various parts of the typing break
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
242 program to delay actions until after the user has completed some command.
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
243 It exists because `post-command-hook' itself is inaccessible while its
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
244 functions are being run, and some type-break--related functions want to
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
245 remove themselves after running.")
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
246
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
247
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
248 ;; Mode line frobs
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
249
20800
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
250 (defcustom type-break-mode-line-message-mode nil
50868
7588d6aa3cb7 (type-break-good-rest-interval, type-break-query-mode)
Juanma Barranquero <lekktu@gmail.com>
parents: 50551
diff changeset
251 "*Non-nil means put type-break related messages in the mode line.
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
252 Otherwise, messages typically go in the echo area.
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
253
20800
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
254 See also `type-break-mode-line-format' and its members."
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
255 :type 'boolean
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
256 :group 'type-break)
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
257
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
258 (defvar type-break-mode-line-format
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
259 '(type-break-mode-line-message-mode
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
260 (""
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
261 type-break-mode-line-break-message
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
262 type-break-mode-line-warning))
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
263 "*Format of messages in the mode line concerning typing breaks.")
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
264
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
265 (defvar type-break-mode-line-break-message
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
266 '(type-break-mode-line-break-message-p
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
267 type-break-mode-line-break-string))
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
268
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
269 (defvar type-break-mode-line-break-message-p nil)
30391
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
270 (defvar type-break-mode-line-break-string " *** TAKE A TYPING BREAK NOW ***")
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
271
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
272 (defvar type-break-mode-line-warning
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
273 '(type-break-mode-line-break-message-p
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
274 ("")
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
275 (type-break-warning-countdown-string
30391
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
276 (" *** "
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
277 "Break in "
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
278 type-break-warning-countdown-string
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
279 " "
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
280 type-break-warning-countdown-string-type
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
281 "***"))))
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
282
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
283 (defvar type-break-warning-countdown-string nil
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
284 "If non-nil, this is a countdown for the next typing break.
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
285
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
286 This variable, in conjunction with `type-break-warning-countdown-string-type'
50551
f51ff6ca84ca (type-break-warning-countdown-string): Doc fix; escape open paren at col 0.
John Paul Wallington <jpw@pobox.com>
parents: 34145
diff changeset
287 \(which indicates whether this value is a number of keystrokes or seconds)
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
288 is installed in `mode-line-format' to notify of imminent typing breaks.")
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
289
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
290 (defvar type-break-warning-countdown-string-type nil
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
291 "Indicates the unit type of `type-break-warning-countdown-string'.
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
292 It will be either \"seconds\" or \"keystrokes\".")
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
293
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
294
8275
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
295 ;; These are internal variables. Do not set them yourself.
8248
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
296
8497
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
297 (defvar type-break-alarm-p nil)
8276
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
298 (defvar type-break-keystroke-count 0)
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
299 (defvar type-break-time-last-break nil)
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
300 (defvar type-break-time-next-break nil)
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
301 (defvar type-break-time-last-command (current-time))
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
302 (defvar type-break-current-time-warning-interval nil)
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
303 (defvar type-break-current-keystroke-warning-interval nil)
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
304 (defvar type-break-time-warning-count 0)
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
305 (defvar type-break-keystroke-warning-count 0)
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
306 (defvar type-break-interval-start nil)
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
307
8304
6c34e249d217 type-break-good-rest-interval: Doc fix.
Noah Friedman <friedman@splode.com>
parents: 8282
diff changeset
308
8248
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
309 ;;;###autoload
8275
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
310 (defun type-break-mode (&optional prefix)
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
311 "Enable or disable typing-break mode.
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
312 This is a minor mode, but it is global to all buffers by default.
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
313
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
314 When this mode is enabled, the user is encouraged to take typing breaks at
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
315 appropriate intervals; either after a specified amount of time or when the
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
316 user has exceeded a keystroke threshold. When the time arrives, the user
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
317 is asked to take a break. If the user refuses at that time, Emacs will ask
8275
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
318 again in a short period of time. The idea is to give the user enough time
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
319 to find a good breaking point in his or her work, but be sufficiently
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
320 annoying to discourage putting typing breaks off indefinitely.
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
321
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
322 A negative prefix argument disables this mode.
8304
6c34e249d217 type-break-good-rest-interval: Doc fix.
Noah Friedman <friedman@splode.com>
parents: 8282
diff changeset
323 No argument or any non-negative argument enables it.
8275
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
324
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
325 The user may enable or disable this mode by setting the variable of the
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
326 same name, though setting it in that way doesn't reschedule a break or
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
327 reset the keystroke counter.
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
328
8276
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
329 If the mode was previously disabled and is enabled as a consequence of
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
330 calling this function, it schedules a break with `type-break-schedule' to
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
331 make sure one occurs (the user can call that command to reschedule the
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
332 break at any time). It also initializes the keystroke counter.
8275
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
333
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
334 The variable `type-break-interval' specifies the number of seconds to
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
335 schedule between regular typing breaks. This variable doesn't directly
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
336 affect the time schedule; it simply provides a default for the
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
337 `type-break-schedule' command.
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
338
8304
6c34e249d217 type-break-good-rest-interval: Doc fix.
Noah Friedman <friedman@splode.com>
parents: 8282
diff changeset
339 If set, the variable `type-break-good-rest-interval' specifies the minimum
6c34e249d217 type-break-good-rest-interval: Doc fix.
Noah Friedman <friedman@splode.com>
parents: 8282
diff changeset
340 amount of time which is considered a reasonable typing break. Whenever
6c34e249d217 type-break-good-rest-interval: Doc fix.
Noah Friedman <friedman@splode.com>
parents: 8282
diff changeset
341 that time has elapsed, typing breaks are automatically rescheduled for
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
342 later even if Emacs didn't prompt you to take one first. Also, if a break
8304
6c34e249d217 type-break-good-rest-interval: Doc fix.
Noah Friedman <friedman@splode.com>
parents: 8282
diff changeset
343 is ended before this much time has elapsed, the user will be asked whether
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
344 or not to continue. A nil value for this variable prevents automatic
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
345 break rescheduling, making `type-break-interval' an upper bound on the time
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
346 between breaks. In this case breaks will be prompted for as usual before
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
347 the upper bound if the keystroke threshold is reached.
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
348
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
349 If `type-break-good-rest-interval' is nil and
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
350 `type-break-good-break-interval' is set, then confirmation is required to
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
351 interrupt a break before `type-break-good-break-interval' seconds
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
352 have passed. This provides for an upper bound on the time between breaks
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
353 together with confirmation of interruptions to these breaks.
8276
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
354
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
355 The variable `type-break-keystroke-threshold' is used to determine the
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
356 thresholds at which typing breaks should be considered. You can use
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
357 the command `type-break-guesstimate-keystroke-threshold' to try to
8276
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
358 approximate good values for this.
8275
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
359
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
360 There are several variables that affect how or when warning messages about
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
361 imminent typing breaks are displayed. They include:
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
362
22049
247682b1da6b (type-break-mode-line-message-mode): Doc fix. Fix some messages.
Richard M. Stallman <rms@gnu.org>
parents: 21670
diff changeset
363 `type-break-mode-line-message-mode'
247682b1da6b (type-break-mode-line-message-mode): Doc fix. Fix some messages.
Richard M. Stallman <rms@gnu.org>
parents: 21670
diff changeset
364 `type-break-time-warning-intervals'
247682b1da6b (type-break-mode-line-message-mode): Doc fix. Fix some messages.
Richard M. Stallman <rms@gnu.org>
parents: 21670
diff changeset
365 `type-break-keystroke-warning-intervals'
247682b1da6b (type-break-mode-line-message-mode): Doc fix. Fix some messages.
Richard M. Stallman <rms@gnu.org>
parents: 21670
diff changeset
366 `type-break-warning-repeat'
247682b1da6b (type-break-mode-line-message-mode): Doc fix. Fix some messages.
Richard M. Stallman <rms@gnu.org>
parents: 21670
diff changeset
367 `type-break-warning-countdown-string'
247682b1da6b (type-break-mode-line-message-mode): Doc fix. Fix some messages.
Richard M. Stallman <rms@gnu.org>
parents: 21670
diff changeset
368 `type-break-warning-countdown-string-type'
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
369
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
370 There are several variables that affect if, how, and when queries to begin
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
371 a typing break occur. They include:
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
372
22049
247682b1da6b (type-break-mode-line-message-mode): Doc fix. Fix some messages.
Richard M. Stallman <rms@gnu.org>
parents: 21670
diff changeset
373 `type-break-query-mode'
247682b1da6b (type-break-mode-line-message-mode): Doc fix. Fix some messages.
Richard M. Stallman <rms@gnu.org>
parents: 21670
diff changeset
374 `type-break-query-function'
247682b1da6b (type-break-mode-line-message-mode): Doc fix. Fix some messages.
Richard M. Stallman <rms@gnu.org>
parents: 21670
diff changeset
375 `type-break-query-interval'
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
376
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
377 The command `type-break-statistics' prints interesting things.
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
378
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
379 Finally, a file (named `type-break-file-name') is used to store information
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
380 across Emacs sessions. This provides recovery of the break status between
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
381 sessions and after a crash. Manual changes to the file may result in
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
382 problems."
8275
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
383 (interactive "P")
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
384 (type-break-check-post-command-hook)
8275
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
385
8276
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
386 (let ((already-enabled type-break-mode))
8304
6c34e249d217 type-break-good-rest-interval: Doc fix.
Noah Friedman <friedman@splode.com>
parents: 8282
diff changeset
387 (setq type-break-mode (>= (prefix-numeric-value prefix) 0))
8275
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
388
8276
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
389 (cond
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
390 ((and already-enabled type-break-mode)
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
391 (and (interactive-p)
22049
247682b1da6b (type-break-mode-line-message-mode): Doc fix. Fix some messages.
Richard M. Stallman <rms@gnu.org>
parents: 21670
diff changeset
392 (message "Type Break mode is already enabled")))
8276
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
393 (type-break-mode
59684
bc6858294dbb (type-break-mode): Add a test for type-break-file-name being non-nil.
Eli Zaretskii <eliz@gnu.org>
parents: 59554
diff changeset
394 (when type-break-file-name
bc6858294dbb (type-break-mode): Add a test for type-break-file-name being non-nil.
Eli Zaretskii <eliz@gnu.org>
parents: 59554
diff changeset
395 (with-current-buffer (find-file-noselect type-break-file-name 'nowarn)
bc6858294dbb (type-break-mode): Add a test for type-break-file-name being non-nil.
Eli Zaretskii <eliz@gnu.org>
parents: 59554
diff changeset
396 (setq buffer-save-without-query t)))
59489
a72af674f3d8 (type-break-mode): Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents: 59129
diff changeset
397
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
398 (or global-mode-string
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
399 (setq global-mode-string '("")))
22069
3df130425e5e (type-break-mode): Don't alter global-mode-string.
Richard M. Stallman <rms@gnu.org>
parents: 22049
diff changeset
400 (or (assq 'type-break-mode-line-message-mode
3df130425e5e (type-break-mode): Don't alter global-mode-string.
Richard M. Stallman <rms@gnu.org>
parents: 22049
diff changeset
401 minor-mode-alist)
3df130425e5e (type-break-mode): Don't alter global-mode-string.
Richard M. Stallman <rms@gnu.org>
parents: 22049
diff changeset
402 (setq minor-mode-alist
3df130425e5e (type-break-mode): Don't alter global-mode-string.
Richard M. Stallman <rms@gnu.org>
parents: 22049
diff changeset
403 (cons type-break-mode-line-format
3df130425e5e (type-break-mode): Don't alter global-mode-string.
Richard M. Stallman <rms@gnu.org>
parents: 22049
diff changeset
404 minor-mode-alist)))
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
405 (type-break-keystroke-reset)
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
406 (type-break-mode-line-countdown-or-break nil)
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
407
59554
73d669603319 (type-break-file-name): Doc update as per the above.
Eli Zaretskii <eliz@gnu.org>
parents: 59489
diff changeset
408 (setq type-break-time-last-break
73d669603319 (type-break-file-name): Doc update as per the above.
Eli Zaretskii <eliz@gnu.org>
parents: 59489
diff changeset
409 (or (type-break-get-previous-time)
73d669603319 (type-break-file-name): Doc update as per the above.
Eli Zaretskii <eliz@gnu.org>
parents: 59489
diff changeset
410 (current-time)))
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
411
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
412 ;; schedule according to break time from session file
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
413 (type-break-schedule
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
414 (let (diff)
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
415 (if (and type-break-time-last-break
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
416 (< (setq diff (type-break-time-difference
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
417 type-break-time-last-break
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
418 (current-time)))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
419 type-break-interval))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
420 ;; use the file's value
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
421 (progn
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
422 (setq type-break-keystroke-count
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
423 (type-break-get-previous-count))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
424 ;; file the time, in case it was read from the auto-save file
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
425 (type-break-file-time type-break-interval-start)
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
426 (setq type-break-interval-start type-break-time-last-break)
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
427 (- type-break-interval diff))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
428 ;; schedule from now
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
429 (setq type-break-interval-start (current-time))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
430 (type-break-file-time type-break-interval-start)
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
431 type-break-interval))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
432 type-break-interval-start
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
433 type-break-interval)
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
434
8276
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
435 (and (interactive-p)
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
436 (message "Type Break mode is enabled and set")))
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
437 (t
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
438 (type-break-keystroke-reset)
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
439 (type-break-mode-line-countdown-or-break nil)
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
440 (type-break-cancel-schedule)
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
441 (do-auto-save)
59554
73d669603319 (type-break-file-name): Doc update as per the above.
Eli Zaretskii <eliz@gnu.org>
parents: 59489
diff changeset
442 (when type-break-file-name
73d669603319 (type-break-file-name): Doc update as per the above.
Eli Zaretskii <eliz@gnu.org>
parents: 59489
diff changeset
443 (with-current-buffer (find-file-noselect type-break-file-name
73d669603319 (type-break-file-name): Doc update as per the above.
Eli Zaretskii <eliz@gnu.org>
parents: 59489
diff changeset
444 'nowarn)
73d669603319 (type-break-file-name): Doc update as per the above.
Eli Zaretskii <eliz@gnu.org>
parents: 59489
diff changeset
445 (set-buffer-modified-p nil)
73d669603319 (type-break-file-name): Doc update as per the above.
Eli Zaretskii <eliz@gnu.org>
parents: 59489
diff changeset
446 (unlock-buffer)
73d669603319 (type-break-file-name): Doc update as per the above.
Eli Zaretskii <eliz@gnu.org>
parents: 59489
diff changeset
447 (kill-this-buffer)))
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
448 (and (interactive-p)
22049
247682b1da6b (type-break-mode-line-message-mode): Doc fix. Fix some messages.
Richard M. Stallman <rms@gnu.org>
parents: 21670
diff changeset
449 (message "Type Break mode is disabled")))))
8275
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
450 type-break-mode)
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
451
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
452 (defun type-break-mode-line-message-mode (&optional prefix)
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
453 "Enable or disable warnings in the mode line about typing breaks.
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
454
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
455 A negative PREFIX argument disables this mode.
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
456 No argument or any non-negative argument enables it.
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
457
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
458 The user may also enable or disable this mode simply by setting the
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
459 variable of the same name.
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
460
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
461 Variables controlling the display of messages in the mode line include:
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
462
22049
247682b1da6b (type-break-mode-line-message-mode): Doc fix. Fix some messages.
Richard M. Stallman <rms@gnu.org>
parents: 21670
diff changeset
463 `mode-line-format'
247682b1da6b (type-break-mode-line-message-mode): Doc fix. Fix some messages.
Richard M. Stallman <rms@gnu.org>
parents: 21670
diff changeset
464 `global-mode-string'
247682b1da6b (type-break-mode-line-message-mode): Doc fix. Fix some messages.
Richard M. Stallman <rms@gnu.org>
parents: 21670
diff changeset
465 `type-break-mode-line-break-message'
247682b1da6b (type-break-mode-line-message-mode): Doc fix. Fix some messages.
Richard M. Stallman <rms@gnu.org>
parents: 21670
diff changeset
466 `type-break-mode-line-warning'"
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
467 (interactive "P")
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
468 (setq type-break-mode-line-message-mode
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
469 (>= (prefix-numeric-value prefix) 0))
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
470 (and (interactive-p)
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
471 (if type-break-mode-line-message-mode
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
472 (message "type-break-mode-line-message-mode is enabled")
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
473 (message "type-break-mode-line-message-mode is disabled")))
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
474 type-break-mode-line-message-mode)
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
475
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
476 (defun type-break-query-mode (&optional prefix)
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
477 "Enable or disable warnings in the mode line about typing breaks.
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
478
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
479 When enabled, the user is periodically queried about whether to take a
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
480 typing break at that moment. The function which does this query is
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
481 specified by the variable `type-break-query-function'.
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
482
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
483 A negative PREFIX argument disables this mode.
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
484 No argument or any non-negative argument enables it.
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
485
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
486 The user may also enable or disable this mode simply by setting the
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
487 variable of the same name."
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
488 (interactive "P")
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
489 (setq type-break-query-mode
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
490 (>= (prefix-numeric-value prefix) 0))
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
491 (and (interactive-p)
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
492 (if type-break-query-mode
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
493 (message "type-break-query-mode is enabled")
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
494 (message "type-break-query-mode is disabled")))
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
495 type-break-query-mode)
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
496
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
497
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
498 ;;; session file functions
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
499
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
500 (defvar type-break-auto-save-file-name
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
501 (let ((buffer-file-name type-break-file-name))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
502 (make-auto-save-file-name))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
503 "Auto-save name of `type-break-file-name'.")
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
504
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
505 (defun type-break-file-time (&optional time)
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
506 "File break time in `type-break-file-name', unless the file is locked."
59554
73d669603319 (type-break-file-name): Doc update as per the above.
Eli Zaretskii <eliz@gnu.org>
parents: 59489
diff changeset
507 (if (and type-break-file-name
73d669603319 (type-break-file-name): Doc update as per the above.
Eli Zaretskii <eliz@gnu.org>
parents: 59489
diff changeset
508 (not (stringp (file-locked-p type-break-file-name))))
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
509 (with-current-buffer (find-file-noselect type-break-file-name
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
510 'nowarn)
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
511 (let ((inhibit-read-only t))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
512 (erase-buffer)
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
513 (insert (format "%s\n\n" (or time type-break-interval-start)))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
514 ;; file saving is left to auto-save
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
515 ))))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
516
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
517 (defun type-break-file-keystroke-count ()
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
518 "File keystroke count in `type-break-file-name', unless the file is locked."
59554
73d669603319 (type-break-file-name): Doc update as per the above.
Eli Zaretskii <eliz@gnu.org>
parents: 59489
diff changeset
519 (if (and type-break-file-name
73d669603319 (type-break-file-name): Doc update as per the above.
Eli Zaretskii <eliz@gnu.org>
parents: 59489
diff changeset
520 (not (stringp (file-locked-p type-break-file-name))))
59129
c5ec711f16c8 (type-break-mode): Set buffer-save-without-query.
Richard M. Stallman <rms@gnu.org>
parents: 57744
diff changeset
521 ;; Prevent deactivation of the mark in some other buffer.
c5ec711f16c8 (type-break-mode): Set buffer-save-without-query.
Richard M. Stallman <rms@gnu.org>
parents: 57744
diff changeset
522 (let (deactivate-mark)
c5ec711f16c8 (type-break-mode): Set buffer-save-without-query.
Richard M. Stallman <rms@gnu.org>
parents: 57744
diff changeset
523 (with-current-buffer (find-file-noselect type-break-file-name
c5ec711f16c8 (type-break-mode): Set buffer-save-without-query.
Richard M. Stallman <rms@gnu.org>
parents: 57744
diff changeset
524 'nowarn)
c5ec711f16c8 (type-break-mode): Set buffer-save-without-query.
Richard M. Stallman <rms@gnu.org>
parents: 57744
diff changeset
525 (save-excursion
c5ec711f16c8 (type-break-mode): Set buffer-save-without-query.
Richard M. Stallman <rms@gnu.org>
parents: 57744
diff changeset
526 (let ((inhibit-read-only t))
c5ec711f16c8 (type-break-mode): Set buffer-save-without-query.
Richard M. Stallman <rms@gnu.org>
parents: 57744
diff changeset
527 (goto-char (point-min))
c5ec711f16c8 (type-break-mode): Set buffer-save-without-query.
Richard M. Stallman <rms@gnu.org>
parents: 57744
diff changeset
528 (forward-line)
c5ec711f16c8 (type-break-mode): Set buffer-save-without-query.
Richard M. Stallman <rms@gnu.org>
parents: 57744
diff changeset
529 (delete-region (point) (save-excursion (end-of-line) (point)))
c5ec711f16c8 (type-break-mode): Set buffer-save-without-query.
Richard M. Stallman <rms@gnu.org>
parents: 57744
diff changeset
530 (insert (format "%s" type-break-keystroke-count))
c5ec711f16c8 (type-break-mode): Set buffer-save-without-query.
Richard M. Stallman <rms@gnu.org>
parents: 57744
diff changeset
531 ;; file saving is left to auto-save
c5ec711f16c8 (type-break-mode): Set buffer-save-without-query.
Richard M. Stallman <rms@gnu.org>
parents: 57744
diff changeset
532 ))))))
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
533
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
534 (defun timep (time)
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
535 "If TIME is in the format returned by `current-time' then
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
536 return TIME, else return nil."
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
537 (and (listp time)
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
538 (eq (length time) 3)
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
539 (integerp (car time))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
540 (integerp (nth 1 time))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
541 (integerp (nth 2 time))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
542 time))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
543
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
544 (defun type-break-choose-file ()
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
545 "Return file to read from."
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
546 (cond
59554
73d669603319 (type-break-file-name): Doc update as per the above.
Eli Zaretskii <eliz@gnu.org>
parents: 59489
diff changeset
547 ((not type-break-file-name)
73d669603319 (type-break-file-name): Doc update as per the above.
Eli Zaretskii <eliz@gnu.org>
parents: 59489
diff changeset
548 nil)
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
549 ((and (file-exists-p type-break-auto-save-file-name)
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
550 (file-readable-p type-break-auto-save-file-name))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
551 type-break-auto-save-file-name)
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
552 ((and (file-exists-p type-break-file-name)
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
553 (file-readable-p type-break-file-name))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
554 type-break-file-name)
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
555 (t nil)))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
556
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
557 (defun type-break-get-previous-time ()
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
558 "Get previous break time from `type-break-file-name'.
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
559 Returns nil if the file is missing or if the time breaks with the
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
560 `current-time' format."
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
561 (let ((file (type-break-choose-file)))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
562 (if file
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
563 (timep ;; returns expected format, else nil
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
564 (with-current-buffer (find-file-noselect file 'nowarn)
76297
35a8988b02f7 (type-break-get-previous-time): Handle end-of-file errors specially
Richard M. Stallman <rms@gnu.org>
parents: 75551
diff changeset
565 (condition-case nil
35a8988b02f7 (type-break-get-previous-time): Handle end-of-file errors specially
Richard M. Stallman <rms@gnu.org>
parents: 75551
diff changeset
566 (save-excursion
35a8988b02f7 (type-break-get-previous-time): Handle end-of-file errors specially
Richard M. Stallman <rms@gnu.org>
parents: 75551
diff changeset
567 (goto-char (point-min))
35a8988b02f7 (type-break-get-previous-time): Handle end-of-file errors specially
Richard M. Stallman <rms@gnu.org>
parents: 75551
diff changeset
568 (read (current-buffer)))
35a8988b02f7 (type-break-get-previous-time): Handle end-of-file errors specially
Richard M. Stallman <rms@gnu.org>
parents: 75551
diff changeset
569 (end-of-file
35a8988b02f7 (type-break-get-previous-time): Handle end-of-file errors specially
Richard M. Stallman <rms@gnu.org>
parents: 75551
diff changeset
570 (error "End of file in `%s'" file))))))))
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
571
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
572 (defun type-break-get-previous-count ()
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
573 "Get previous keystroke count from `type-break-file-name'.
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
574 Return 0 if the file is missing or if the form read is not an
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
575 integer."
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
576 (let ((file (type-break-choose-file)))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
577 (if (and file
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
578 (integerp
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
579 (setq file
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
580 (with-current-buffer
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
581 (find-file-noselect file 'nowarn)
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
582 (save-excursion
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
583 (goto-char (point-min))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
584 (forward-line 1)
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
585 (read (current-buffer)))))))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
586 file
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
587 0)))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
588
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
589
8275
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
590 ;;;###autoload
8248
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
591 (defun type-break ()
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
592 "Take a typing break.
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
593
8275
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
594 During the break, a demo selected from the functions listed in
8304
6c34e249d217 type-break-good-rest-interval: Doc fix.
Noah Friedman <friedman@splode.com>
parents: 8282
diff changeset
595 `type-break-demo-functions' is run.
8248
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
596
8275
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
597 After the typing break is finished, the next break is scheduled
8304
6c34e249d217 type-break-good-rest-interval: Doc fix.
Noah Friedman <friedman@splode.com>
parents: 8282
diff changeset
598 as per the function `type-break-schedule'."
5939
454dc146502d Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
599 (interactive)
30391
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
600 (do-auto-save)
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
601 (type-break-cancel-schedule)
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
602 ;; remove any query scheduled during interactive invocation
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
603 (remove-hook 'type-break-post-command-hook 'type-break-do-query)
8304
6c34e249d217 type-break-good-rest-interval: Doc fix.
Noah Friedman <friedman@splode.com>
parents: 8282
diff changeset
604 (let ((continue t)
6c34e249d217 type-break-good-rest-interval: Doc fix.
Noah Friedman <friedman@splode.com>
parents: 8282
diff changeset
605 (start-time (current-time)))
6c34e249d217 type-break-good-rest-interval: Doc fix.
Noah Friedman <friedman@splode.com>
parents: 8282
diff changeset
606 (setq type-break-time-last-break start-time)
6c34e249d217 type-break-good-rest-interval: Doc fix.
Noah Friedman <friedman@splode.com>
parents: 8282
diff changeset
607 (while continue
6c34e249d217 type-break-good-rest-interval: Doc fix.
Noah Friedman <friedman@splode.com>
parents: 8282
diff changeset
608 (save-window-excursion
6c34e249d217 type-break-good-rest-interval: Doc fix.
Noah Friedman <friedman@splode.com>
parents: 8282
diff changeset
609 ;; Eat the screen.
6c34e249d217 type-break-good-rest-interval: Doc fix.
Noah Friedman <friedman@splode.com>
parents: 8282
diff changeset
610 (and (eq (selected-window) (minibuffer-window))
6c34e249d217 type-break-good-rest-interval: Doc fix.
Noah Friedman <friedman@splode.com>
parents: 8282
diff changeset
611 (other-window 1))
6c34e249d217 type-break-good-rest-interval: Doc fix.
Noah Friedman <friedman@splode.com>
parents: 8282
diff changeset
612 (delete-other-windows)
6c34e249d217 type-break-good-rest-interval: Doc fix.
Noah Friedman <friedman@splode.com>
parents: 8282
diff changeset
613 (scroll-right (window-width))
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
614 (unless type-break-terse-messages
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
615 (message "Press any key to resume from typing break."))
5939
454dc146502d Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
616
8304
6c34e249d217 type-break-good-rest-interval: Doc fix.
Noah Friedman <friedman@splode.com>
parents: 8282
diff changeset
617 (random t)
6c34e249d217 type-break-good-rest-interval: Doc fix.
Noah Friedman <friedman@splode.com>
parents: 8282
diff changeset
618 (let* ((len (length type-break-demo-functions))
6c34e249d217 type-break-good-rest-interval: Doc fix.
Noah Friedman <friedman@splode.com>
parents: 8282
diff changeset
619 (idx (random len))
6c34e249d217 type-break-good-rest-interval: Doc fix.
Noah Friedman <friedman@splode.com>
parents: 8282
diff changeset
620 (fn (nth idx type-break-demo-functions)))
6c34e249d217 type-break-good-rest-interval: Doc fix.
Noah Friedman <friedman@splode.com>
parents: 8282
diff changeset
621 (condition-case ()
6c34e249d217 type-break-good-rest-interval: Doc fix.
Noah Friedman <friedman@splode.com>
parents: 8282
diff changeset
622 (funcall fn)
6c34e249d217 type-break-good-rest-interval: Doc fix.
Noah Friedman <friedman@splode.com>
parents: 8282
diff changeset
623 (error nil))))
8275
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
624
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
625 (let ((good-interval (or type-break-good-rest-interval
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
626 type-break-good-break-interval)))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
627 (cond
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
628 (good-interval
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
629 (let ((break-secs (type-break-time-difference
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
630 start-time (current-time))))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
631 (cond
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
632 ((>= break-secs good-interval)
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
633 (setq continue nil))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
634 ;; 60 seconds may be too much leeway if the break is only 3
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
635 ;; minutes to begin with. You can just say "no" to the query
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
636 ;; below if you're in that much of a hurry.
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
637 ;;((> 60 (abs (- break-secs good-interval)))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
638 ;; (setq continue nil))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
639 ((funcall
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
640 type-break-query-function
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
641 (format
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
642 (if type-break-terse-messages
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
643 "%s%s remaining. Continue break? "
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
644 "%sYou really ought to rest %s more. Continue break? ")
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
645 (type-break-time-stamp)
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
646 (type-break-format-time (- good-interval
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
647 break-secs)))))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
648 (t
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
649 (setq continue nil)))))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
650 (t (setq continue nil))))))
8276
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
651
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
652 (type-break-keystroke-reset)
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
653 (type-break-file-time)
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
654 (type-break-mode-line-countdown-or-break nil)
8276
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
655 (type-break-schedule))
8248
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
656
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
657
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
658 (defun type-break-schedule (&optional time start interval)
8497
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
659 "Schedule a typing break for TIME seconds from now.
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
660 If time is not specified it defaults to `type-break-interval'.
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
661 START and INTERVAL are used when recovering a break.
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
662 START is the start of the break (defaults to now).
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
663 INTERVAL is the full length of an interval (defaults to TIME)."
8497
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
664 (interactive (list (and current-prefix-arg
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
665 (prefix-numeric-value current-prefix-arg))))
8248
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
666 (or time (setq time type-break-interval))
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
667 (type-break-check-post-command-hook)
8275
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
668 (type-break-cancel-schedule)
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
669 (type-break-time-warning-schedule time 'reset)
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
670 (type-break-run-at-time (max 1 time) nil 'type-break-alarm)
8497
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
671 (setq type-break-time-next-break
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
672 (type-break-time-sum (or start (current-time))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
673 (or interval time))))
8248
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
674
8275
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
675 (defun type-break-cancel-schedule ()
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
676 (type-break-cancel-time-warning-schedule)
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
677 (type-break-cancel-function-timers 'type-break-alarm)
8276
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
678 (setq type-break-alarm-p nil)
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
679 (setq type-break-time-next-break nil))
5939
454dc146502d Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
680
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
681 (defun type-break-time-warning-schedule (&optional time resetp)
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
682 (let ((type-break-current-time-warning-interval nil))
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
683 (type-break-cancel-time-warning-schedule))
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
684 (add-hook 'type-break-post-command-hook 'type-break-time-warning 'append)
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
685 (cond
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
686 (type-break-time-warning-intervals
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
687 (and resetp
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
688 (setq type-break-current-time-warning-interval
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
689 type-break-time-warning-intervals))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
690
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
691 (or time
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
692 (setq time (type-break-time-difference (current-time)
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
693 type-break-time-next-break)))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
694
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
695 (while (and type-break-current-time-warning-interval
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
696 (> (car type-break-current-time-warning-interval) time))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
697 (setq type-break-current-time-warning-interval
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
698 (cdr type-break-current-time-warning-interval)))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
699
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
700 (cond
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
701 (type-break-current-time-warning-interval
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
702 (setq time (- time (car type-break-current-time-warning-interval)))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
703 (setq type-break-current-time-warning-interval
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
704 (cdr type-break-current-time-warning-interval))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
705
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
706 ;(let (type-break-current-time-warning-interval)
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
707 ; (type-break-cancel-time-warning-schedule))
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
708 (type-break-run-at-time (max 1 time) nil 'type-break-time-warning-alarm)
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
709
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
710 (cond
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
711 (resetp
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
712 (setq type-break-warning-countdown-string nil))
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
713 (t
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
714 (setq type-break-warning-countdown-string (number-to-string time))
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
715 (setq type-break-warning-countdown-string-type "seconds"))))))))
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
716
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
717 (defun type-break-cancel-time-warning-schedule ()
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
718 (type-break-cancel-function-timers 'type-break-time-warning-alarm)
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
719 (remove-hook 'type-break-post-command-hook 'type-break-time-warning)
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
720 (setq type-break-current-time-warning-interval
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
721 type-break-time-warning-intervals)
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
722 (setq type-break-time-warning-count 0) ; avoid warnings after break
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
723 (setq type-break-warning-countdown-string nil))
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
724
8275
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
725 (defun type-break-alarm ()
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
726 (type-break-check-post-command-hook)
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
727 (setq type-break-alarm-p t)
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
728 (type-break-mode-line-countdown-or-break 'break))
8248
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
729
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
730 (defun type-break-time-warning-alarm ()
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
731 (type-break-check-post-command-hook)
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
732 (type-break-time-warning-schedule)
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
733 (setq type-break-time-warning-count type-break-warning-repeat)
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
734 (type-break-time-warning)
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
735 (type-break-mode-line-countdown-or-break 'countdown))
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
736
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
737
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
738 (defun type-break-run-tb-post-command-hook ()
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
739 (and type-break-mode
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
740 (run-hooks 'type-break-post-command-hook)))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
741
8248
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
742 (defun type-break-check ()
8275
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
743 "Ask to take a typing break if appropriate.
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
744 This may be the case either because the scheduled time has come \(and the
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
745 minimum keystroke threshold has been reached\) or because the maximum
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
746 keystroke threshold has been exceeded."
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
747 (type-break-file-keystroke-count)
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
748 (let* ((min-threshold (car type-break-keystroke-threshold))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
749 (max-threshold (cdr type-break-keystroke-threshold)))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
750 (and type-break-good-rest-interval
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
751 (progn
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
752 (and (> (type-break-time-difference
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
753 type-break-time-last-command (current-time))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
754 type-break-good-rest-interval)
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
755 (progn
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
756 (type-break-keystroke-reset)
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
757 (type-break-mode-line-countdown-or-break nil)
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
758 (setq type-break-time-last-break (current-time))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
759 (type-break-schedule)))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
760 (setq type-break-time-last-command (current-time))))
8276
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
761
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
762 (and type-break-keystroke-threshold
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
763 (let ((keys (this-command-keys)))
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
764 (cond
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
765 ;; Ignore mouse motion
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
766 ((and (vectorp keys)
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
767 (consp (aref keys 0))
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
768 (memq (car (aref keys 0)) '(mouse-movement))))
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
769 (t
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
770 (setq type-break-keystroke-count
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
771 (+ type-break-keystroke-count (length keys)))))))
8276
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
772
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
773 (cond
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
774 (type-break-alarm-p
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
775 (cond
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
776 ((input-pending-p))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
777 ((eq (selected-window) (minibuffer-window)))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
778 ((and min-threshold
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
779 (< type-break-keystroke-count min-threshold))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
780 (type-break-schedule))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
781 (t
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
782 ;; If keystroke count is within min-threshold of
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
783 ;; max-threshold, lower it to reduce the likelihood of an
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
784 ;; immediate subsequent query.
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
785 (and max-threshold
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
786 min-threshold
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
787 (< (- max-threshold type-break-keystroke-count) min-threshold)
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
788 (progn
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
789 (type-break-keystroke-reset)
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
790 (setq type-break-keystroke-count min-threshold)))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
791 (type-break-query))))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
792 ((and type-break-keystroke-warning-intervals
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
793 max-threshold
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
794 (= type-break-keystroke-warning-count 0)
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
795 (type-break-check-keystroke-warning)))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
796 ((and max-threshold
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
797 (> type-break-keystroke-count max-threshold)
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
798 (not (input-pending-p))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
799 (not (eq (selected-window) (minibuffer-window))))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
800 (type-break-keystroke-reset)
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
801 (setq type-break-keystroke-count (or min-threshold 0))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
802 (type-break-query)))))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
803
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
804 ;; This should return t if warnings were enabled, nil otherwise.
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
805 (defun type-break-check-keystroke-warning ()
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
806 ;; This is safe because the caller should have checked that the cdr was
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
807 ;; non-nil already.
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
808 (let ((left (- (cdr type-break-keystroke-threshold)
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
809 type-break-keystroke-count)))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
810 (cond
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
811 ((null (car type-break-current-keystroke-warning-interval))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
812 nil)
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
813 ((> left (car type-break-current-keystroke-warning-interval))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
814 nil)
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
815 (t
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
816 (while (and (car type-break-current-keystroke-warning-interval)
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
817 (< left (car type-break-current-keystroke-warning-interval)))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
818 (setq type-break-current-keystroke-warning-interval
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
819 (cdr type-break-current-keystroke-warning-interval)))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
820 (setq type-break-keystroke-warning-count type-break-warning-repeat)
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
821 (add-hook 'type-break-post-command-hook 'type-break-keystroke-warning)
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
822 (setq type-break-warning-countdown-string (number-to-string left))
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
823 (setq type-break-warning-countdown-string-type "keystrokes")
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
824 (type-break-mode-line-countdown-or-break 'countdown)
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
825 t))))
8275
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
826
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
827 ;; Arrange for a break query to be made, when the user stops typing furiously.
8275
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
828 (defun type-break-query ()
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
829 (add-hook 'type-break-post-command-hook 'type-break-do-query))
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
830
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
831 (defun type-break-do-query ()
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
832 (cond
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
833 ((not type-break-query-mode)
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
834 (type-break-noninteractive-query)
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
835 (type-break-schedule type-break-query-interval)
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
836 (remove-hook 'type-break-post-command-hook 'type-break-do-query))
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
837 ((sit-for 2)
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
838 (condition-case ()
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
839 (cond
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
840 ((let ((type-break-mode nil)
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
841 ;; yes-or-no-p sets this-command to exit-minibuffer,
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
842 ;; which hoses undo or yank-pop (if you happened to be
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
843 ;; yanking just when the query occurred).
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
844 (this-command this-command))
30391
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
845 ;; Cancel schedule to prevent possibility of a second query
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
846 ;; from taking place before this one has even returned.
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
847 ;; The condition-case wrapper will reschedule on quit.
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
848 (type-break-cancel-schedule)
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
849 ;; Also prevent a second query when the break is interrupted.
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
850 (remove-hook 'type-break-post-command-hook 'type-break-do-query)
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
851 (funcall type-break-query-function
30391
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
852 (format "%s%s"
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
853 (type-break-time-stamp)
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
854 (if type-break-terse-messages
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
855 "Break now? "
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
856 "Take a break from typing now? "))))
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
857 (type-break))
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
858 (t
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
859 (type-break-schedule type-break-query-interval)))
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
860 (quit
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
861 (type-break-schedule type-break-query-interval))))))
5939
454dc146502d Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
862
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
863 (defun type-break-noninteractive-query (&optional ignored-args)
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
864 "Null query function which doesn't interrupt user and assumes `no'.
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
865 It prints a reminder in the echo area to take a break, but doesn't enforce
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
866 this or ask the user to start one right now."
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
867 (cond
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
868 (type-break-mode-line-message-mode)
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
869 (t
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
870 (beep t)
30391
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
871 (message "%sYou should take a typing break now. Do `M-x type-break'."
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
872 (type-break-time-stamp))
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
873 (sit-for 1)
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
874 (beep t)
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
875 ;; return nil so query caller knows to reset reminder, as if user
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
876 ;; said "no" in response to yes-or-no-p.
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
877 nil)))
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
878
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
879 (defun type-break-time-warning ()
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
880 (cond
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
881 ((and (car type-break-keystroke-threshold)
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
882 (< type-break-keystroke-count (car type-break-keystroke-threshold))))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
883 ((> type-break-time-warning-count 0)
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
884 (let ((timeleft (type-break-time-difference (current-time)
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
885 type-break-time-next-break)))
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
886 (setq type-break-warning-countdown-string (number-to-string timeleft))
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
887 (cond
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
888 ((eq (selected-window) (minibuffer-window)))
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
889 ;; Do nothing if the command was just a prefix arg, since that will
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
890 ;; immediately be followed by some other interactive command.
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
891 ;; Otherwise, it is particularly annoying for the sit-for below to
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
892 ;; delay redisplay when one types sequences like `C-u -1 C-l'.
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
893 ((memq this-command '(digit-argument universal-argument)))
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
894 ((not type-break-mode-line-message-mode)
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
895 ;; Pause for a moment so any previous message can be seen.
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
896 (sit-for 2)
30391
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
897 (message "%sWarning: typing break due in %s."
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
898 (type-break-time-stamp)
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
899 (type-break-format-time timeleft))
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
900 (setq type-break-time-warning-count
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
901 (1- type-break-time-warning-count))))))
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
902 (t
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
903 (remove-hook 'type-break-post-command-hook 'type-break-time-warning)
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
904 (setq type-break-warning-countdown-string nil))))
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
905
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
906 (defun type-break-keystroke-warning ()
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
907 (cond
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
908 ((> type-break-keystroke-warning-count 0)
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
909 (setq type-break-warning-countdown-string
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
910 (number-to-string (- (cdr type-break-keystroke-threshold)
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
911 type-break-keystroke-count)))
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
912 (cond
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
913 ((eq (selected-window) (minibuffer-window)))
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
914 ;; Do nothing if the command was just a prefix arg, since that will
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
915 ;; immediately be followed by some other interactive command.
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
916 ;; Otherwise, it is particularly annoying for the sit-for below to
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
917 ;; delay redisplay when one types sequences like `C-u -1 C-l'.
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
918 ((memq this-command '(digit-argument universal-argument)))
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
919 ((not type-break-mode-line-message-mode)
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
920 (sit-for 2)
30391
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
921 (message "%sWarning: typing break due in %s keystrokes."
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
922 (type-break-time-stamp)
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
923 (- (cdr type-break-keystroke-threshold)
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
924 type-break-keystroke-count))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
925 (setq type-break-keystroke-warning-count
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
926 (1- type-break-keystroke-warning-count)))))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
927 (t
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
928 (remove-hook 'type-break-post-command-hook
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
929 'type-break-keystroke-warning)
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
930 (setq type-break-warning-countdown-string nil))))
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
931
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
932 (defun type-break-mode-line-countdown-or-break (&optional type)
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
933 (cond
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
934 ((not type-break-mode-line-message-mode))
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
935 ((eq type 'countdown)
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
936 ;(setq type-break-mode-line-break-message-p nil)
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
937 (add-hook 'type-break-post-command-hook
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
938 'type-break-force-mode-line-update 'append))
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
939 ((eq type 'break)
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
940 ;; Alternate
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
941 (setq type-break-mode-line-break-message-p
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
942 (not type-break-mode-line-break-message-p))
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
943 (remove-hook 'type-break-post-command-hook
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
944 'type-break-force-mode-line-update))
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
945 (t
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
946 (setq type-break-mode-line-break-message-p nil)
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
947 (setq type-break-warning-countdown-string nil)
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
948 (remove-hook 'type-break-post-command-hook
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
949 'type-break-force-mode-line-update)))
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
950 (type-break-force-mode-line-update))
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
951
8248
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
952
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
953 ;;;###autoload
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
954 (defun type-break-statistics ()
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
955 "Print statistics about typing breaks in a temporary buffer.
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
956 This includes the last time a typing break was taken, when the next one is
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
957 scheduled, the keystroke thresholds and the current keystroke count, etc."
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
958 (interactive)
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
959 (with-output-to-temp-buffer "*Typing Break Statistics*"
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
960 (princ (format "Typing break statistics\n-----------------------\n
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
961 Typing break mode is currently %s.
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
962 Interactive query for breaks is %s.
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
963 Warnings of imminent typing breaks in mode line is %s.
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
964
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
965 Last typing break ended : %s
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
966 Next scheduled typing break : %s\n
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
967 Minimum keystroke threshold : %s
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
968 Maximum keystroke threshold : %s
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
969 Current keystroke count : %s"
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
970 (if type-break-mode "enabled" "disabled")
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
971 (if type-break-query-mode "enabled" "disabled")
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
972 (if type-break-mode-line-message-mode "enabled" "disabled")
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
973 (if type-break-time-last-break
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
974 (current-time-string type-break-time-last-break)
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
975 "never")
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
976 (if (and type-break-mode type-break-time-next-break)
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
977 (format "%s\t(%s from now)"
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
978 (current-time-string type-break-time-next-break)
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
979 (type-break-format-time
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
980 (type-break-time-difference
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
981 (current-time)
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
982 type-break-time-next-break)))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
983 "none scheduled")
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
984 (or (car type-break-keystroke-threshold) "none")
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
985 (or (cdr type-break-keystroke-threshold) "none")
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
986 type-break-keystroke-count))))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
987
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
988 ;;;###autoload
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
989 (defun type-break-guesstimate-keystroke-threshold (wpm &optional wordlen frac)
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
990 "Guess values for the minimum/maximum keystroke threshold for typing breaks.
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
991
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
992 If called interactively, the user is prompted for their guess as to how
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
993 many words per minute they usually type. This value should not be your
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
994 maximum WPM, but your average. Of course, this is harder to gauge since it
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
995 can vary considerably depending on what you are doing. For example, one
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
996 tends to type less when debugging a program as opposed to writing
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
997 documentation. (Perhaps a separate program should be written to estimate
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
998 average typing speed.)
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
999
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
1000 From that, this command sets the values in `type-break-keystroke-threshold'
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
1001 based on a fairly simple algorithm involving assumptions about the average
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
1002 length of words (5). For the minimum threshold, it uses about a fifth of
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
1003 the computed maximum threshold.
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1004
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1005 When called from Lisp programs, the optional args WORDLEN and FRAC can be
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1006 used to override the default assumption about average word length and the
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1007 fraction of the maximum threshold to which to set the minimum threshold.
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1008 FRAC should be the inverse of the fractional value; for example, a value of
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1009 2 would mean to use one half, a value of 4 would mean to use one quarter, etc."
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
1010 (interactive "NOn average, how many words per minute do you type? ")
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1011 (let* ((upper (* wpm (or wordlen 5) (/ type-break-interval 60)))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1012 (lower (/ upper (or frac 5))))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1013 (or type-break-keystroke-threshold
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1014 (setq type-break-keystroke-threshold (cons nil nil)))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1015 (setcar type-break-keystroke-threshold lower)
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1016 (setcdr type-break-keystroke-threshold upper)
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1017 (if (interactive-p)
57744
a14f0e52fd5e (type-break-run-at-time): Always use run-at-time; forget the alternatives.
Richard M. Stallman <rms@gnu.org>
parents: 55189
diff changeset
1018 (message "min threshold: %d\tmax threshold: %d" lower upper))
a14f0e52fd5e (type-break-run-at-time): Always use run-at-time; forget the alternatives.
Richard M. Stallman <rms@gnu.org>
parents: 55189
diff changeset
1019 type-break-keystroke-threshold))
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1020
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1021
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1022 ;;; misc functions
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1023
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1024 ;; Compute the difference, in seconds, between a and b, two structures
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1025 ;; similar to those returned by `current-time'.
8497
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1026 ;; Use addition rather than logand since that is more robust; the low 16
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1027 ;; bits of the seconds might have been incremented, making it more than 16
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1028 ;; bits wide.
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
1029 (defun type-break-time-difference (a b)
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1030 (+ (lsh (- (car b) (car a)) 16)
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1031 (- (car (cdr b)) (car (cdr a)))))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1032
8497
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1033 ;; Return (in a new list the same in structure to that returned by
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1034 ;; `current-time') the sum of the arguments. Each argument may be a time
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1035 ;; list or a single integer, a number of seconds.
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1036 ;; This function keeps the high and low 16 bits of the seconds properly
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1037 ;; balanced so that the lower value never exceeds 16 bits. Otherwise, when
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1038 ;; the result is passed to `current-time-string' it will toss some of the
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
1039 ;; "low" bits and format the time incorrectly.
8497
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1040 (defun type-break-time-sum (&rest tmlist)
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1041 (let ((high 0)
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1042 (low 0)
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1043 (micro 0)
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1044 tem)
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1045 (while tmlist
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1046 (setq tem (car tmlist))
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1047 (setq tmlist (cdr tmlist))
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1048 (cond
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1049 ((numberp tem)
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1050 (setq low (+ low tem)))
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1051 (t
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1052 (setq high (+ high (or (car tem) 0)))
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1053 (setq low (+ low (or (car (cdr tem)) 0)))
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1054 (setq micro (+ micro (or (car (cdr (cdr tem))) 0))))))
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1055
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1056 (and (>= micro 1000000)
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1057 (progn
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1058 (setq tem (/ micro 1000000))
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1059 (setq low (+ low tem))
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1060 (setq micro (- micro (* tem 1000000)))))
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1061
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1062 (setq tem (lsh low -16))
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1063 (and (> tem 0)
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1064 (progn
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1065 (setq low (logand low 65535))
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1066 (setq high (+ high tem))))
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1067
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1068 (list high low micro)))
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1069
30391
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
1070 (defun type-break-time-stamp (&optional when)
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
1071 (if (fboundp 'format-time-string)
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
1072 (format-time-string type-break-time-stamp-format when)
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
1073 ;; Emacs 19.28 and prior do not have format-time-string.
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
1074 ;; In that case, result is not customizable. Upgrade today!
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
1075 (format "[%s] " (substring (current-time-string when) 11 16))))
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
1076
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
1077 (defun type-break-format-time (secs)
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1078 (let ((mins (/ secs 60)))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1079 (cond
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1080 ((= mins 1) (format "%d minute" mins))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1081 ((> mins 0) (format "%d minutes" mins))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1082 ((= secs 1) (format "%d second" secs))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1083 (t (format "%d seconds" secs)))))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1084
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1085 (defun type-break-keystroke-reset ()
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1086 (setq type-break-interval-start (current-time)) ; not a keystroke
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1087 (setq type-break-keystroke-count 0)
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1088 (setq type-break-keystroke-warning-count 0)
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1089 (setq type-break-current-keystroke-warning-interval
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1090 type-break-keystroke-warning-intervals)
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1091 (remove-hook 'type-break-post-command-hook 'type-break-keystroke-warning))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1092
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
1093 (defun type-break-force-mode-line-update (&optional all)
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
1094 "Force the mode-line of the current buffer to be redisplayed.
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
1095 With optional non-nil ALL, force redisplay of all mode-lines."
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
1096 (and all (save-excursion (set-buffer (other-buffer))))
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
1097 (set-buffer-modified-p (buffer-modified-p)))
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
1098
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1099 ;; If an exception occurs in Emacs while running the post command hook, the
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
1100 ;; value of that hook is clobbered. This is because the value of the
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
1101 ;; variable is temporarily set to nil while it's running to prevent
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
1102 ;; recursive application, but it also means an exception aborts the routine
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
1103 ;; of restoring it. This function is called from the timers to restore it,
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
1104 ;; just in case.
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
1105 (defun type-break-check-post-command-hook ()
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
1106 (add-hook 'post-command-hook 'type-break-run-tb-post-command-hook 'append))
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
1107
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
1108
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
1109 ;;; Timer wrapper functions
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
1110 ;;;
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
1111 ;;; These shield type-break from variations in the interval timer packages
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1112 ;;; for different versions of Emacs.
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
1113
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
1114 (defun type-break-run-at-time (time repeat function)
54322
4712727ef275 (type-break-emacs-variant): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
1115 (condition-case nil (or (require 'timer) (require 'itimer)) (error nil))
57744
a14f0e52fd5e (type-break-run-at-time): Always use run-at-time; forget the alternatives.
Richard M. Stallman <rms@gnu.org>
parents: 55189
diff changeset
1116 (run-at-time time repeat function))
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
1117
54322
4712727ef275 (type-break-emacs-variant): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
1118 (defvar timer-dont-exit)
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
1119 (defun type-break-cancel-function-timers (function)
57744
a14f0e52fd5e (type-break-run-at-time): Always use run-at-time; forget the alternatives.
Richard M. Stallman <rms@gnu.org>
parents: 55189
diff changeset
1120 (let ((timer-dont-exit t))
a14f0e52fd5e (type-break-run-at-time): Always use run-at-time; forget the alternatives.
Richard M. Stallman <rms@gnu.org>
parents: 55189
diff changeset
1121 (cancel-function-timers function)))
18416
2ec71bb15f86 Don't require timer; use autoloaded functions from Emacs or XEmacs,
Noah Friedman <friedman@splode.com>
parents: 18414
diff changeset
1122
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1123
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1124 ;;; Demo wrappers
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1125
75551
acad3d4a5f18 (type-break-catch-up-event): New function.
Chong Yidong <cyd@stupidchicken.com>
parents: 75347
diff changeset
1126 (defun type-break-catch-up-event ()
acad3d4a5f18 (type-break-catch-up-event): New function.
Chong Yidong <cyd@stupidchicken.com>
parents: 75347
diff changeset
1127 ;; If the last input event is a down-event, read and discard the
acad3d4a5f18 (type-break-catch-up-event): New function.
Chong Yidong <cyd@stupidchicken.com>
parents: 75347
diff changeset
1128 ;; corresponding up-event too, to avoid triggering another prompt.
acad3d4a5f18 (type-break-catch-up-event): New function.
Chong Yidong <cyd@stupidchicken.com>
parents: 75347
diff changeset
1129 (and (eventp last-input-event)
acad3d4a5f18 (type-break-catch-up-event): New function.
Chong Yidong <cyd@stupidchicken.com>
parents: 75347
diff changeset
1130 (memq 'down (event-modifiers last-input-event))
acad3d4a5f18 (type-break-catch-up-event): New function.
Chong Yidong <cyd@stupidchicken.com>
parents: 75347
diff changeset
1131 (read-event)))
acad3d4a5f18 (type-break-catch-up-event): New function.
Chong Yidong <cyd@stupidchicken.com>
parents: 75347
diff changeset
1132
8248
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
1133 ;; This is a wrapper around hanoi that calls it with an arg large enough to
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
1134 ;; make the largest discs possible that will fit in the window.
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
1135 ;; Also, clean up the *Hanoi* buffer after we're done.
8275
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
1136 (defun type-break-demo-hanoi ()
8248
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
1137 "Take a hanoiing typing break."
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
1138 (and (get-buffer "*Hanoi*")
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
1139 (kill-buffer "*Hanoi*"))
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
1140 (condition-case ()
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
1141 (progn
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
1142 (hanoi (/ (window-width) 8))
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
1143 ;; Wait for user to come back.
75296
72790464e9ea (type-break-demo-hanoi, type-break-demo-life)
Chong Yidong <cyd@stupidchicken.com>
parents: 74442
diff changeset
1144 (read-event)
75551
acad3d4a5f18 (type-break-catch-up-event): New function.
Chong Yidong <cyd@stupidchicken.com>
parents: 75347
diff changeset
1145 (type-break-catch-up-event)
8248
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
1146 (kill-buffer "*Hanoi*"))
8276
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
1147 (quit
75296
72790464e9ea (type-break-demo-hanoi, type-break-demo-life)
Chong Yidong <cyd@stupidchicken.com>
parents: 74442
diff changeset
1148 (read-event)
75551
acad3d4a5f18 (type-break-catch-up-event): New function.
Chong Yidong <cyd@stupidchicken.com>
parents: 75347
diff changeset
1149 (type-break-catch-up-event)
8248
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
1150 (and (get-buffer "*Hanoi*")
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
1151 (kill-buffer "*Hanoi*")))))
5939
454dc146502d Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
1152
8248
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
1153 ;; This is a wrapper around life that calls it with a `sleep' arg to make
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
1154 ;; it run a little more leisurely.
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
1155 ;; Also, clean up the *Life* buffer after we're done.
8275
4fdf77f4e45c type-break-mode: New variable and function.
Noah Friedman <friedman@splode.com>
parents: 8248
diff changeset
1156 (defun type-break-demo-life ()
8248
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
1157 "Take a typing break and get a life."
8282
206451cdd48a type-break-keystroke-threshold: Change default wpm to 30 and lower
Noah Friedman <friedman@splode.com>
parents: 8281
diff changeset
1158 (let ((continue t))
206451cdd48a type-break-keystroke-threshold: Change default wpm to 30 and lower
Noah Friedman <friedman@splode.com>
parents: 8281
diff changeset
1159 (while continue
206451cdd48a type-break-keystroke-threshold: Change default wpm to 30 and lower
Noah Friedman <friedman@splode.com>
parents: 8281
diff changeset
1160 (setq continue nil)
206451cdd48a type-break-keystroke-threshold: Change default wpm to 30 and lower
Noah Friedman <friedman@splode.com>
parents: 8281
diff changeset
1161 (and (get-buffer "*Life*")
206451cdd48a type-break-keystroke-threshold: Change default wpm to 30 and lower
Noah Friedman <friedman@splode.com>
parents: 8281
diff changeset
1162 (kill-buffer "*Life*"))
206451cdd48a type-break-keystroke-threshold: Change default wpm to 30 and lower
Noah Friedman <friedman@splode.com>
parents: 8281
diff changeset
1163 (condition-case ()
206451cdd48a type-break-keystroke-threshold: Change default wpm to 30 and lower
Noah Friedman <friedman@splode.com>
parents: 8281
diff changeset
1164 (progn
206451cdd48a type-break-keystroke-threshold: Change default wpm to 30 and lower
Noah Friedman <friedman@splode.com>
parents: 8281
diff changeset
1165 (life 3)
8304
6c34e249d217 type-break-good-rest-interval: Doc fix.
Noah Friedman <friedman@splode.com>
parents: 8282
diff changeset
1166 ;; wait for user to return
75296
72790464e9ea (type-break-demo-hanoi, type-break-demo-life)
Chong Yidong <cyd@stupidchicken.com>
parents: 74442
diff changeset
1167 (read-event)
75551
acad3d4a5f18 (type-break-catch-up-event): New function.
Chong Yidong <cyd@stupidchicken.com>
parents: 75347
diff changeset
1168 (type-break-catch-up-event)
8282
206451cdd48a type-break-keystroke-threshold: Change default wpm to 30 and lower
Noah Friedman <friedman@splode.com>
parents: 8281
diff changeset
1169 (kill-buffer "*Life*"))
206451cdd48a type-break-keystroke-threshold: Change default wpm to 30 and lower
Noah Friedman <friedman@splode.com>
parents: 8281
diff changeset
1170 (life-extinct
18414
8d2051b79879 Changes which are not mine:
Noah Friedman <friedman@splode.com>
parents: 9355
diff changeset
1171 (message "%s" (get 'life-extinct 'error-message))
8282
206451cdd48a type-break-keystroke-threshold: Change default wpm to 30 and lower
Noah Friedman <friedman@splode.com>
parents: 8281
diff changeset
1172 ;; restart demo
206451cdd48a type-break-keystroke-threshold: Change default wpm to 30 and lower
Noah Friedman <friedman@splode.com>
parents: 8281
diff changeset
1173 (setq continue t))
206451cdd48a type-break-keystroke-threshold: Change default wpm to 30 and lower
Noah Friedman <friedman@splode.com>
parents: 8281
diff changeset
1174 (quit
75551
acad3d4a5f18 (type-break-catch-up-event): New function.
Chong Yidong <cyd@stupidchicken.com>
parents: 75347
diff changeset
1175 (type-break-catch-up-event)
8282
206451cdd48a type-break-keystroke-threshold: Change default wpm to 30 and lower
Noah Friedman <friedman@splode.com>
parents: 8281
diff changeset
1176 (and (get-buffer "*Life*")
206451cdd48a type-break-keystroke-threshold: Change default wpm to 30 and lower
Noah Friedman <friedman@splode.com>
parents: 8281
diff changeset
1177 (kill-buffer "*Life*")))))))
8248
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
1178
8497
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1179 ;; Boring demo, but doesn't use many cycles
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1180 (defun type-break-demo-boring ()
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1181 "Boring typing break demo."
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1182 (let ((rmsg (if type-break-terse-messages
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1183 ""
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1184 "Press any key to resume from typing break"))
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1185 (buffer-name "*Typing Break Buffer*")
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1186 lines elapsed timeleft tmsg)
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1187 (condition-case ()
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1188 (progn
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1189 (switch-to-buffer (get-buffer-create buffer-name))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1190 (buffer-disable-undo (current-buffer))
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1191 (setq lines (/ (window-body-height) 2))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1192 (unless type-break-terse-messages (setq lines (1- lines)))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1193 (if type-break-demo-boring-stats
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1194 (setq lines (- lines 2)))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1195 (setq lines (make-string lines ?\C-j))
8497
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1196 (while (not (input-pending-p))
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1197 (erase-buffer)
8497
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1198 (setq elapsed (type-break-time-difference
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1199 type-break-time-last-break
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1200 (current-time)))
55189
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1201 (let ((good-interval (or type-break-good-rest-interval
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1202 type-break-good-break-interval)))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1203 (cond
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1204 (good-interval
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1205 (setq timeleft (- good-interval elapsed))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1206 (if (> timeleft 0)
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1207 (setq tmsg
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1208 (format (if type-break-terse-messages
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1209 "Break remaining: %s"
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1210 "You should rest for %s more")
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1211 (type-break-format-time timeleft)))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1212 (setq tmsg
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1213 (format (if type-break-terse-messages
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1214 "Break complete (%s elapsed in total)"
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1215 "Typing break has lasted %s")
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1216 (type-break-format-time elapsed)))))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1217 (t
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1218 (setq tmsg
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1219 (format (if type-break-terse-messages
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1220 "Break has lasted %s"
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1221 "Typing break has lasted %s")
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1222 (type-break-format-time elapsed))))))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1223 (insert lines
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1224 (make-string (/ (- (window-width) (length tmsg)) 2) ?\ )
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1225 tmsg)
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1226 (if (> (length rmsg) 0)
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1227 (insert "\n"
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1228 (make-string (/ (- (window-width) (length rmsg)) 2)
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1229 ?\ )
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1230 rmsg))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1231 (if type-break-demo-boring-stats
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1232 (let*
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1233 ((message
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1234 (format
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1235 (if type-break-terse-messages
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1236 "Since last break: %s keystrokes\n"
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1237 "Since your last break you've typed %s keystrokes\n")
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1238 type-break-keystroke-count))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1239 (column-spaces
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1240 (make-string (/ (- (window-width) (length message)) 2)
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1241 ?\ ))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1242 (wpm (/ (/ (float type-break-keystroke-count) 5)
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1243 (/ (type-break-time-difference
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1244 type-break-interval-start
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1245 type-break-time-last-break)
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1246 60.0))))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1247 (insert "\n\n" column-spaces message)
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1248 (if type-break-terse-messages
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1249 (insert (format " %s%.2f wpm"
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1250 column-spaces
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1251 wpm))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1252 (setq message
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1253 (format "at an average of %.2f words per minute"
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1254 wpm))
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1255 (insert
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1256 (make-string (/ (- (window-width) (length message)) 2)
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1257 ?\ )
51108148b11d Capitalise Emacs and Lisp.
Eli Zaretskii <eliz@gnu.org>
parents: 54770
diff changeset
1258 message))))
8497
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1259 (goto-char (point-min))
3d566eab9870 type-break-time-sum: New function.
Noah Friedman <friedman@splode.com>
parents: 8370
diff changeset
1260 (sit-for 60))
75551
acad3d4a5f18 (type-break-catch-up-event): New function.
Chong Yidong <cyd@stupidchicken.com>
parents: 75347
diff changeset
1261 (read-event)
acad3d4a5f18 (type-break-catch-up-event): New function.
Chong Yidong <cyd@stupidchicken.com>
parents: 75347
diff changeset
1262 (type-break-catch-up-event)
8370
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1263 (kill-buffer buffer-name))
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1264 (quit
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1265 (and (get-buffer buffer-name)
97cacab659d3 type-break-time-warning-intervals, type-break-keystroke-warning-intervals,
Noah Friedman <friedman@splode.com>
parents: 8305
diff changeset
1266 (kill-buffer buffer-name))))))
8276
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
1267
73b85998c868 type-break-mode: Make variable `nil' by default.
Noah Friedman <friedman@splode.com>
parents: 8275
diff changeset
1268
8248
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
1269 (provide 'type-break)
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
1270
20800
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
1271 (if type-break-mode
43c77517a76c (type-break-mode): New customize variable to automatically load the package.
Stephen Eglen <stephen@gnu.org>
parents: 18416
diff changeset
1272 (type-break-mode 1))
30391
246b2f521192 (type-break): perform autosave.
Noah Friedman <friedman@splode.com>
parents: 25278
diff changeset
1273
52401
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 51288
diff changeset
1274 ;;; arch-tag: 943a2eb3-07e6-420b-993f-96e4796f5fd0
8248
5ecef3b02f2d Real initial revision. (rewrite from hanoi-break.)
Noah Friedman <friedman@splode.com>
parents: 5939
diff changeset
1275 ;;; type-break.el ends here