X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/3f715d17fef56ee78a3df7ebb00d4e8b1aec37de..30fcaf3a28e94241889bdd6e27ae759c4185ad74:/lisp/time.el diff --git a/lisp/time.el b/lisp/time.el index 8372419da8..ac4a011bdf 100644 --- a/lisp/time.el +++ b/lisp/time.el @@ -1,7 +1,7 @@ ;;; 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. +;; Copyright (C) 1985-1987, 1993-1994, 1996, 2000-2011 +;; Free Software Foundation, Inc. ;; Maintainer: FSF @@ -37,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) @@ -46,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) @@ -54,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." @@ -63,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) @@ -76,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) @@ -150,21 +156,24 @@ LABEL is a string to display as the label of that TIMEZONE's time." (defcustom display-time-world-list ;; Determine if zoneinfo style timezones are supported by testing that ;; America/New York and Europe/London return different timezones. - (let (gmt nyt) - (set-time-zone-rule "America/New York") - (setq nyt (format-time-string "%z")) - (set-time-zone-rule "Europe/London") - (setq gmt (format-time-string "%z")) - (set-time-zone-rule nil) + (let ((old-tz (getenv "TZ")) + gmt nyt) + (unwind-protect + (progn + (setenv "TZ" "America/New_York") + (setq nyt (format-time-string "%z")) + (setenv "TZ" "Europe/London") + (setq gmt (format-time-string "%z"))) + (setenv "TZ" old-tz)) (if (string-equal nyt gmt) legacy-style-world-list zoneinfo-style-world-list)) "Alist of time zones and places for `display-time-world' to display. Each element has the form (TIMEZONE LABEL). -TIMEZONE should be in the format supported by `set-time-zone-rule' on -your system. See the documentation of `zoneinfo-style-world-list' and -\`legacy-style-world-list' for two widely used formats. -LABEL is a string to display as the label of that TIMEZONE's time." +TIMEZONE should be in a format supported by your system. See the +documentation of `zoneinfo-style-world-list' and +\`legacy-style-world-list' for two widely used formats. LABEL is +a string to display as the label of that TIMEZONE's time." :group 'display-time :type '(repeat (list string string)) :version "23.1") @@ -176,7 +185,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") @@ -197,7 +206,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 () @@ -251,7 +260,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'." @@ -294,7 +303,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. @@ -359,6 +368,25 @@ would give mode line times like `94/12/30 21:07:48 (UTC)'." size nil))) +(with-no-warnings + ;; Warnings are suppresed to avoid "global/dynamic var `X' lacks a prefix". + (defvar now) + (defvar time) + (defvar load) + (defvar mail) + (defvar 24-hours) + (defvar hour) + (defvar 12-hours) + (defvar am-pm) + (defvar minutes) + (defvar seconds) + (defvar time-zone) + (defvar day) + (defvar year) + (defvar monthname) + (defvar month) + (defvar dayname)) + (defun display-time-update () "Update the display-time info for the mode line. However, don't redisplay right now. @@ -398,30 +426,31 @@ update which can wait for the next redisplay." (getenv "MAIL") (concat rmail-spool-directory (user-login-name)))) - (mail (or (and display-time-mail-function - (funcall display-time-mail-function)) - (and display-time-mail-directory - (display-time-mail-check-directory)) - (and (stringp mail-spool-file) - (or (null display-time-server-down-time) - ;; If have been down for 20 min, try again. - (> (- (nth 1 now) display-time-server-down-time) - 1200) - (and (< (nth 1 now) display-time-server-down-time) - (> (- (nth 1 now) - display-time-server-down-time) - -64336))) - (let ((start-time (current-time))) - (prog1 - (display-time-file-nonempty-p mail-spool-file) - (if (> (- (nth 1 (current-time)) - (nth 1 start-time)) - 20) - ;; Record that mail file is not accessible. - (setq display-time-server-down-time - (nth 1 (current-time))) - ;; Record that mail file is accessible. - (setq display-time-server-down-time nil))))))) + (mail (cond + (display-time-mail-function + (funcall display-time-mail-function)) + (display-time-mail-directory + (display-time-mail-check-directory)) + ((and (stringp mail-spool-file) + (or (null display-time-server-down-time) + ;; If have been down for 20 min, try again. + (> (- (nth 1 now) display-time-server-down-time) + 1200) + (and (< (nth 1 now) display-time-server-down-time) + (> (- (nth 1 now) + display-time-server-down-time) + -64336)))) + (let ((start-time (current-time))) + (prog1 + (display-time-file-nonempty-p mail-spool-file) + (if (> (- (nth 1 (current-time)) + (nth 1 start-time)) + 20) + ;; Record that mail file is not accessible. + (setq display-time-server-down-time + (nth 1 (current-time))) + ;; Record that mail file is accessible. + (setq display-time-server-down-time nil))))))) (24-hours (substring time 11 13)) (hour (string-to-number 24-hours)) (12-hours (int-to-string (1+ (% (+ hour 11) 12)))) @@ -448,18 +477,22 @@ 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. -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." +With a prefix argument ARG, enable Display Time mode if ARG is +positive, and disable it otherwise. If called from Lisp, enable +it if ARG is omitted or nil. + +When Display Time mode is enabled, it updates 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." :global t :group 'display-time (and display-time-timer (cancel-timer display-time-timer)) (setq display-time-timer nil) @@ -484,41 +517,34 @@ 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." (let ((inhibit-read-only t) - (buffer-undo-list t)) + (buffer-undo-list t) + (old-tz (getenv "TZ")) + (max-width 0) + result fmt) (erase-buffer) - (let ((max-width 0) - (result ())) - (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)))) - (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))) + (unwind-protect + (dolist (zone alist) + (let* ((label (cadr zone)) + (width (string-width label))) + (setenv "TZ" (car zone)) + (push (cons label + (format-time-string display-time-world-time-format)) + result) + (when (> width max-width) + (setq max-width width)))) + (setenv "TZ" old-tz)) + (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 () @@ -554,9 +580,9 @@ 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))) @@ -566,13 +592,12 @@ For example, the Unix uptime command format is \"%D, %z%2h:%.2m\"." (interactive) (let ((str (format "%.1f seconds" - (time-to-seconds + (float-time (time-subtract after-init-time before-init-time))))) - (if (interactive-p) + (if (called-interactively-p 'interactive) (message "%s" str) str))) (provide 'time) -;; arch-tag: b9c1623f-b5cb-48e4-b650-482a4d23c5a6 ;;; time.el ends here