X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/a9269c187774dea6e939066a79901f23ae79641f..7f02dedfcae6ba0e3a646c1367c908af9b3dbe1d:/lisp/type-break.el diff --git a/lisp/type-break.el b/lisp/type-break.el index d276e64f6d..0b3ee75661 100644 --- a/lisp/type-break.el +++ b/lisp/type-break.el @@ -1,6 +1,7 @@ -;;; type-break.el --- encourage rests from typing at appropriate intervals +;;; type-break.el --- encourage rests from typing at appropriate intervals -*- lexical-binding: t -*- -;; Copyright (C) 1994-1995, 1997, 2000-2011 Free Software Foundation, Inc. +;; Copyright (C) 1994-1995, 1997, 2000-2016 Free Software Foundation, +;; Inc. ;; Author: Noah Friedman ;; Maintainer: Noah Friedman @@ -44,7 +45,7 @@ ;; If you find echo area messages annoying and would prefer to see messages ;; in the mode line instead, do M-x type-break-mode-line-message-mode -;; or set the variable of the same name to `t'. +;; or set the variable of the same name to t. ;; This program can truly cons up a storm because of all the calls to ;; `current-time' (which always returns fresh conses). I'm dismayed by @@ -69,26 +70,11 @@ :prefix "type-break" :group 'keyboard) -;;;###autoload -(defcustom type-break-mode nil - "Toggle typing break mode. -See the docstring for the `type-break-mode' command for more information. -Setting this variable directly does not take effect; -use either \\[customize] or the function `type-break-mode'." - :set (lambda (_symbol value) - (type-break-mode (if value 1 -1))) - :initialize 'custom-initialize-default - :type 'boolean - :group 'type-break - :require 'type-break) - -;;;###autoload (defcustom type-break-interval (* 60 60) "Number of seconds between scheduled typing breaks." :type 'integer :group 'type-break) -;;;###autoload (defcustom type-break-good-rest-interval (/ type-break-interval 6) "Number of seconds of idle time considered to be an adequate typing rest. @@ -98,10 +84,10 @@ rest from typing, then the next typing break is simply rescheduled for later. If a break is interrupted before this much time elapses, the user will be asked whether or not really to interrupt the break." + :set-after '(type-break-interval) :type 'integer :group 'type-break) -;;;###autoload (defcustom type-break-good-break-interval nil "Number of seconds considered to be an adequate explicit typing rest. @@ -109,10 +95,9 @@ When this variable is non-nil, its value is considered to be a \"good\" length (in seconds) for a break initiated by the command `type-break', overriding `type-break-good-rest-interval'. This provides querying of break interruptions when `type-break-good-rest-interval' is nil." - :type 'integer + :type '(choice (const nil) integer) :group 'type-break) -;;;###autoload (defcustom type-break-keystroke-threshold ;; Assuming typing speed is 35wpm (on the average, do you really ;; type more than that in a minute? I spend a lot of time reading mail @@ -147,7 +132,8 @@ keystroke even though they really require multiple keys to generate them. The command `type-break-guesstimate-keystroke-threshold' can be used to guess a reasonably good pair of values for this variable." - :type 'sexp + :set-after '(type-break-interval) + :type '(cons (choice integer (const nil)) (choice integer (const nil))) :group 'type-break) (defcustom type-break-query-function 'yes-or-no-p @@ -218,11 +204,12 @@ key is pressed." :type 'boolean :group 'type-break) -(defcustom type-break-file-name (convert-standard-filename "~/.type-break") +(defcustom type-break-file-name + (locate-user-emacs-file "type-break" ".type-break") "Name of file used to save state across sessions. If this is nil, no data will be saved across sessions." - :type 'file - :group 'type-break) + :version "24.4" ; added locate-user + :type 'file) (defvar type-break-post-command-hook '(type-break-check) "Hook run indirectly by `post-command-hook' for typing break functions. @@ -241,7 +228,7 @@ remove themselves after running.") ("" type-break-mode-line-break-message type-break-mode-line-warning)) - "*Format of messages in the mode line concerning typing breaks.") + "Format of messages in the mode line concerning typing breaks.") (defvar type-break-mode-line-break-message '(type-break-mode-line-break-message-p @@ -288,7 +275,7 @@ It will be either \"seconds\" or \"keystrokes\".") ;;;###autoload -(defun type-break-mode (&optional prefix) +(define-minor-mode type-break-mode "Enable or disable typing-break mode. This is a minor mode, but it is global to all buffers by default. @@ -361,83 +348,70 @@ Finally, a file (named `type-break-file-name') is used to store information across Emacs sessions. This provides recovery of the break status between sessions and after a crash. Manual changes to the file may result in problems." - (interactive "P") - (type-break-check-post-command-hook) + :lighter type-break-mode-line-format + :global t - (let ((already-enabled type-break-mode)) - (setq type-break-mode (>= (prefix-numeric-value prefix) 0)) + (type-break-check-post-command-hook) - (cond - ((and already-enabled type-break-mode) - (and (called-interactively-p 'interactive) - (message "Type Break mode is already enabled"))) - (type-break-mode - (when type-break-file-name - (with-current-buffer (find-file-noselect type-break-file-name 'nowarn) - (setq buffer-save-without-query t))) - - (or global-mode-string - (setq global-mode-string '(""))) - (or (assq 'type-break-mode-line-message-mode - minor-mode-alist) - (setq minor-mode-alist - (cons type-break-mode-line-format - minor-mode-alist))) - (type-break-keystroke-reset) - (type-break-mode-line-countdown-or-break nil) - - (setq type-break-time-last-break - (or (type-break-get-previous-time) - (current-time))) - - ;; schedule according to break time from session file - (type-break-schedule - (let (diff) - (if (and type-break-time-last-break - (< (setq diff (type-break-time-difference - type-break-time-last-break - (current-time))) - type-break-interval)) - ;; use the file's value - (progn - (setq type-break-keystroke-count - (type-break-get-previous-count)) - ;; file the time, in case it was read from the auto-save file - (type-break-file-time type-break-interval-start) - (setq type-break-interval-start type-break-time-last-break) - (- type-break-interval diff)) - ;; schedule from now - (setq type-break-interval-start (current-time)) - (type-break-file-time type-break-interval-start) - type-break-interval)) - type-break-interval-start - type-break-interval) - - (and (called-interactively-p 'interactive) - (message "Type Break mode is enabled and set"))) - (t - (type-break-keystroke-reset) - (type-break-mode-line-countdown-or-break nil) - (type-break-cancel-schedule) - (do-auto-save) - (when type-break-file-name - (with-current-buffer (find-file-noselect type-break-file-name - 'nowarn) - (set-buffer-modified-p nil) - (unlock-buffer) - (kill-this-buffer))) - (and (called-interactively-p 'interactive) - (message "Type Break mode is disabled"))))) - type-break-mode) + (cond + ;; ((and already-enabled type-break-mode) + ;; (and (called-interactively-p 'interactive) + ;; (message "Type Break mode is already enabled"))) + (type-break-mode + (when type-break-file-name + (with-current-buffer (find-file-noselect type-break-file-name 'nowarn) + (setq buffer-save-without-query t))) + + (or global-mode-string (setq global-mode-string '(""))) ;FIXME: Why? + (type-break-keystroke-reset) + (type-break-mode-line-countdown-or-break nil) + + (setq type-break-time-last-break + (or (type-break-get-previous-time) + (current-time))) + + ;; Schedule according to break time from session file. + (type-break-schedule + (let (diff) + (if (and type-break-time-last-break + (< (setq diff (type-break-time-difference + type-break-time-last-break + (current-time))) + type-break-interval)) + ;; Use the file's value. + (progn + (setq type-break-keystroke-count + (type-break-get-previous-count)) + ;; File the time, in case it was read from the auto-save file. + (type-break-file-time type-break-interval-start) + (setq type-break-interval-start type-break-time-last-break) + (- type-break-interval diff)) + ;; Schedule from now. + (setq type-break-interval-start (current-time)) + (type-break-file-time type-break-interval-start) + type-break-interval)) + type-break-interval-start + type-break-interval)) + (t + (type-break-keystroke-reset) + (type-break-mode-line-countdown-or-break nil) + (type-break-cancel-schedule) + (do-auto-save) + (when type-break-file-name + (with-current-buffer (find-file-noselect type-break-file-name + 'nowarn) + (set-buffer-modified-p nil) + (unlock-buffer) + (kill-this-buffer)))))) (define-minor-mode type-break-mode-line-message-mode - "Enable or disable warnings in the mode line about typing breaks. - -A negative PREFIX argument disables this mode. -No argument or any non-negative argument enables it. + "Toggle warnings about typing breaks in the mode line. +With a prefix argument ARG, enable these warnings if ARG is +positive, and disable them otherwise. If called from Lisp, +enable them if ARG is omitted or nil. -The user may also enable or disable this mode simply by setting the -variable of the same name. +The user may also enable or disable this mode simply by setting +the variable of the same name. Variables controlling the display of messages in the mode line include: @@ -445,21 +419,17 @@ Variables controlling the display of messages in the mode line include: `global-mode-string' `type-break-mode-line-break-message' `type-break-mode-line-warning'" - :global t) + :global t :group 'type-break) (define-minor-mode type-break-query-mode - "Enable or disable warnings in the mode line about typing breaks. - -When enabled, the user is periodically queried about whether to take a -typing break at that moment. The function which does this query is -specified by the variable `type-break-query-function'. - -A negative PREFIX argument disables this mode. -No argument or any non-negative argument enables it. + "Toggle typing break queries. +With a prefix argument ARG, enable these queries if ARG is +positive, and disable them otherwise. If called from Lisp, +enable them if ARG is omitted or nil. -The user may also enable or disable this mode simply by setting the -variable of the same name." - :global t) +The user may also enable or disable this mode simply by setting +the variable of the same name." + :global t :group 'type-break) ;;; session file functions @@ -581,7 +551,6 @@ as per the function `type-break-schedule'." (unless type-break-terse-messages (message "Press any key to resume from typing break.")) - (random t) (let* ((len (length type-break-demo-functions)) (idx (random len)) (fn (nth idx type-break-demo-functions))) @@ -636,8 +605,7 @@ INTERVAL is the full length of an interval (defaults to TIME)." (type-break-time-warning-schedule time 'reset) (type-break-run-at-time (max 1 time) nil 'type-break-alarm) (setq type-break-time-next-break - (type-break-time-sum (or start (current-time)) - (or interval time)))) + (type-break-time-sum start (or interval time)))) (defun type-break-cancel-schedule () (type-break-cancel-time-warning-schedule) @@ -709,7 +677,7 @@ INTERVAL is the full length of an interval (defaults to TIME)." (defun type-break-check () "Ask to take a typing break if appropriate. This may be the case either because the scheduled time has come \(and the -minimum keystroke threshold has been reached\) or because the maximum +minimum keystroke threshold has been reached) or because the maximum keystroke threshold has been exceeded." (type-break-file-keystroke-count) (let* ((min-threshold (car type-break-keystroke-threshold)) @@ -835,8 +803,9 @@ this or ask the user to start one right now." (type-break-mode-line-message-mode) (t (beep t) - (message "%sYou should take a typing break now. Do `M-x type-break'." - (type-break-time-stamp)) + (message "%sYou should take a typing break now. Do `%s'." + (type-break-time-stamp) + (substitute-command-keys "\\[type-break]")) (sit-for 1) (beep t) ;; return nil so query caller knows to reset reminder, as if user @@ -993,19 +962,12 @@ FRAC should be the inverse of the fractional value; for example, a value of (defun type-break-time-difference (a b) (round (float-time (time-subtract b a)))) -;; Return (in a new list the same in structure to that returned by -;; `current-time') the sum of the arguments. Each argument may be a time -;; list or a single integer, a number of seconds. -;; This function keeps the high and low 16 bits of the seconds properly -;; balanced so that the lower value never exceeds 16 bits. Otherwise, when -;; the result is passed to `current-time-string' it will toss some of the -;; "low" bits and format the time incorrectly. +;; Return a time value that is the sum of the time-value arguments. (defun type-break-time-sum (&rest tmlist) - (let ((sum '(0 0 0))) - (dolist (tem tmlist sum) - (setq sum (time-add sum (if (integerp tem) - (list (floor tem 65536) (mod tem 65536)) - tem)))))) + (let ((sum '(0 0))) + (dolist (tem tmlist) + (setq sum (time-add sum tem))) + sum)) (defun type-break-time-stamp (&optional when) (if (fboundp 'format-time-string)