Merge from emacs-23 branch, up to 2010-05-20T22:16:19Z!juri@jurta.org.
[bpt/emacs.git] / lisp / time.el
index 0613e15..5f2e875 100644 (file)
@@ -1,16 +1,16 @@
 ;;; time.el --- display time, load and mail indicator in mode line of Emacs -*-coding: utf-8 -*-
 
 ;; Copyright (C) 1985, 1986, 1987, 1993, 1994, 1996, 2000, 2001, 2002,
-;;   2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+;;   2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
 
 ;; Maintainer: FSF
 
 ;; This file is part of GNU Emacs.
 
-;; GNU Emacs is free software; you can redistribute it and/or modify
+;; GNU Emacs is free software: you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 3, or (at your option)
-;; any later version.
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
 
 ;; GNU Emacs is distributed in the hope that it will be useful,
 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,9 +18,7 @@
 ;; GNU General Public License for more details.
 
 ;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
 
 ;;; Commentary:
 
@@ -39,7 +37,7 @@
 
 
 (defcustom display-time-mail-file nil
-  "*File name of mail inbox file, for indicating existence of new mail.
+  "File name of mail inbox file, for indicating existence of new mail.
 Non-nil and not a string means don't check for mail; nil means use
 default, which is system-dependent, and is the same as used by Rmail."
   :type '(choice (const :tag "None" none)
@@ -48,7 +46,7 @@ default, which is system-dependent, and is the same as used by Rmail."
   :group 'display-time)
 
 (defcustom display-time-mail-directory nil
-  "*Name of mail inbox directory, for indicating existence of new mail.
+  "Name of mail inbox directory, for indicating existence of new mail.
 Any nonempty regular file in the directory is regarded as newly arrived mail.
 If nil, do not check a directory for arriving mail."
   :type '(choice (const :tag "None" nil)
@@ -56,7 +54,7 @@ If nil, do not check a directory for arriving mail."
   :group 'display-time)
 
 (defcustom display-time-mail-function nil
-  "*Function to call, for indicating existence of new mail.
+  "Function to call, for indicating existence of new mail.
 If nil, that means use the default method: check that the file
 specified by `display-time-mail-file' is nonempty or that the
 directory `display-time-mail-directory' contains nonempty files."
@@ -65,9 +63,14 @@ directory `display-time-mail-directory' contains nonempty files."
   :group 'display-time)
 
 (defcustom display-time-default-load-average 0
-  "*Which load average value will be shown in the mode line.
+  "Which load average value will be shown in the mode line.
 Almost every system can provide values of load for past 1 minute, past 5 or
-past 15 minutes.  The default is to display 1 minute load average."
+past 15 minutes.  The default is to display 1 minute load average.
+The value can be one of:
+
+  0   => 1 minute load
+  1   => 5 minutes load
+  2   => 15 minutes load"
   :type '(choice (const :tag "1 minute load" 0)
                 (const :tag "5 minutes load" 1)
                 (const :tag "15 minutes load" 2)
@@ -78,33 +81,34 @@ past 15 minutes.  The default is to display 1 minute load average."
   "Load average currently being shown in mode line.")
 
 (defcustom display-time-load-average-threshold 0.1
-  "*Load-average values below this value won't be shown in the mode line."
+  "Load-average values below this value won't be shown in the mode line."
   :type 'number
   :group 'display-time)
 
 ;;;###autoload
 (defcustom display-time-day-and-date nil "\
-*Non-nil means \\[display-time] should display day and date as well as time."
+Non-nil means \\[display-time] should display day and date as well as time."
   :type 'boolean
   :group 'display-time)
 
 (defvar display-time-timer nil)
 
 (defcustom display-time-interval 60
-  "*Seconds between updates of time in the mode line."
+  "Seconds between updates of time in the mode line."
   :type 'integer
   :group 'display-time)
 
 (defcustom display-time-24hr-format nil
-  "*Non-nil indicates time should be displayed as hh:mm, 0 <= hh <= 23.
+  "Non-nil indicates time should be displayed as hh:mm, 0 <= hh <= 23.
 A value of nil means 1 <= hh <= 12, and an AM/PM suffix is used."
   :type 'boolean
   :group 'display-time)
 
 (defvar display-time-string nil)
+;;;###autoload(put 'display-time-string 'risky-local-variable t)
 
 (defcustom display-time-hook nil
-  "*List of functions to be called when the time is updated on the mode line."
+  "List of functions to be called when the time is updated on the mode line."
   :type 'hook
   :group 'display-time)
 
@@ -178,7 +182,7 @@ LABEL is a string to display as the label of that TIMEZONE's time."
   :version "23.1")
 
 (defcustom display-time-world-buffer-name "*wclock*"
-  "Name of the wclock buffer."
+  "Name of the world clock buffer."
   :group 'display-time
   :type 'string
   :version "23.1")
@@ -199,7 +203,7 @@ LABEL is a string to display as the label of that TIMEZONE's time."
   (let ((map (make-sparse-keymap)))
     (define-key map "q" 'kill-this-buffer)
     map)
-  "Keymap of Display Time World mode")
+  "Keymap of Display Time World mode.")
 
 ;;;###autoload
 (defun display-time ()
@@ -253,7 +257,7 @@ This can use the Unicode letter character if you can display it."
                 string))
 
 (defcustom display-time-format nil
-  "*String specifying format for displaying the time in the mode line.
+  "String specifying format for displaying the time in the mode line.
 See the function `format-time-string' for an explanation of
 how to write this string.  If this is nil, the defaults
 depend on `display-time-day-and-date' and `display-time-24hr-format'."
@@ -296,7 +300,7 @@ depend on `display-time-day-and-date' and `display-time-24hr-format'."
          'local-map (make-mode-line-mouse-map 'mouse-2
                                               read-mail-command)))
       ""))
-  "*List of expressions governing display of the time in the mode line.
+  "List of expressions governing display of the time in the mode line.
 For most purposes, you can control the time format using `display-time-format'
 which is a more standard interface.
 
@@ -450,15 +454,18 @@ update which can wait for the next redisplay."
   (force-mode-line-update))
 
 (defun display-time-file-nonempty-p (file)
-  (and (file-exists-p file)
-       (< 0 (nth 7 (file-attributes (file-chase-links file))))))
+  (let ((remote-file-name-inhibit-cache (- display-time-interval 5)))
+    (and (file-exists-p file)
+        (< 0 (nth 7 (file-attributes (file-chase-links file)))))))
 
 ;;;###autoload
 (define-minor-mode display-time-mode
   "Toggle display of time, load level, and mail flag in mode lines.
 With a numeric arg, enable this display if arg is positive.
 
-When this display is enabled, it updates automatically every minute.
+When this display is enabled, it updates automatically every minute
+\(you can control the number of seconds between updates by
+customizing `display-time-interval').
 If `display-time-day-and-date' is non-nil, the current day and date
 are displayed as well.
 This runs the normal hook `display-time-hook' after each update."
@@ -486,15 +493,10 @@ This runs the normal hook `display-time-hook' after each update."
                 'display-time-event-handler)))
 
 
-(defun display-time-world-mode ()
+(define-derived-mode display-time-world-mode nil "World clock"
   "Major mode for buffer that displays times in various time zones.
 See `display-time-world'."
-  (interactive)
-  (kill-all-local-variables)
-  (setq
-   major-mode 'display-time-world-mode
-   mode-name "World clock")
-  (use-local-map display-time-world-mode-map))
+  (setq show-trailing-whitespace nil))
 
 (defun display-time-world-display (alist)
   "Replace current buffer text with times in various zones, based on ALIST."
@@ -502,25 +504,23 @@ See `display-time-world'."
        (buffer-undo-list t))
     (erase-buffer)
     (let ((max-width 0)
-         (result ()))
+         (result ())
+         fmt)
       (unwind-protect
          (dolist (zone alist)
            (let* ((label (cadr zone))
                   (width (string-width label)))
              (set-time-zone-rule (car zone))
-             (setq result
-                   (append result
-                           (list
-                            label width
-                            (format-time-string display-time-world-time-format))))
+             (push (cons label
+                         (format-time-string display-time-world-time-format))
+                   result)
              (when (> width max-width)
                (setq max-width width))))
        (set-time-zone-rule nil))
-      (while result
-       (insert (pop result)
-               (make-string (1+ (- max-width (pop result))) ?\s)
-               (pop result) "\n")))
-    (delete-backward-char 1)))
+      (setq fmt (concat "%-" (int-to-string max-width) "s %s\n"))
+      (dolist (timedata (nreverse result))
+       (insert (format fmt (car timedata) (cdr timedata)))))
+    (delete-char -1)))
 
 ;;;###autoload
 (defun display-time-world ()
@@ -548,7 +548,6 @@ To turn off the world time display, go to that window and type `q'."
           (when (equal (symbol-name (aref elt 5)) "display-time-world-timer")
             (cancel-timer elt)))))))
 
-\f
 ;;;###autoload
 (defun emacs-uptime (&optional format)
   "Return a string giving the uptime of this instance of Emacs.
@@ -557,13 +556,24 @@ For example, the Unix uptime command format is \"%D, %z%2h:%.2m\"."
   (interactive)
   (let ((str
          (format-seconds (or format "%Y, %D, %H, %M, %z%S")
-                         (time-to-seconds
+                         (float-time
                           (time-subtract (current-time) before-init-time)))))
-    (if (interactive-p)
+    (if (called-interactively-p 'interactive)
+        (message "%s" str)
+      str)))
+
+;;;###autoload
+(defun emacs-init-time ()
+  "Return a string giving the duration of the Emacs initialization."
+  (interactive)
+  (let ((str
+        (format "%.1f seconds"
+                (float-time
+                 (time-subtract after-init-time before-init-time)))))
+    (if (called-interactively-p 'interactive)
         (message "%s" str)
       str)))
 
 (provide 'time)
 
-;;; arch-tag: b9c1623f-b5cb-48e4-b650-482a4d23c5a6
 ;;; time.el ends here