]> code.delx.au - gnu-emacs/blobdiff - lisp/midnight.el
(grep-read-files): Use buffer-name if no buffer-file-name.
[gnu-emacs] / lisp / midnight.el
index 531a401f564cf420562a4af037a5cd656500e4cf..1d9e1efbf2c15d744795e7c1503ac0f7f5f75119 100644 (file)
@@ -1,11 +1,12 @@
-;;; midnight.el --- run something every midnight, e.g., kill old buffers.
+;;; midnight.el --- run something every midnight, e.g., kill old buffers
 
 
-;;; Copyright (C) 1998 Free Software Foundation, Inc.
+;; Copyright (C) 1998, 2002, 2003, 2004, 2005,
+;;   2006 Free Software Foundation, Inc.
 
 
-;;; Author: Sam Steingold <sds@usa.net>
-;;; Maintainer: Sam Steingold <sds@usa.net>
-;;; Created: 1998-05-18
-;;; Keywords: utilities
+;; Author: Sam Steingold <sds@usa.net>
+;; Maintainer: Sam Steingold <sds@usa.net>
+;; Created: 1998-05-18
+;; Keywords: utilities
 
 ;; This file is part of GNU Emacs.
 
 
 ;; This file is part of GNU Emacs.
 
@@ -21,8 +22,8 @@
 
 ;; 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
 
 ;; 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., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
 
 ;;; Commentary:
 
 
 ;;; Commentary:
 
   :group 'calendar
   :version "20.3")
 
   :group 'calendar
   :version "20.3")
 
+(defvar midnight-timer nil
+  "Timer running the `midnight-hook' `midnight-delay' seconds after midnight.
+Use `cancel-timer' to stop it and `midnight-delay-set' to change
+the time when it is run.")
+
 (defcustom midnight-mode nil
   "*Non-nil means run `midnight-hook' at midnight.
 Setting this variable outside customize has no effect;
 (defcustom midnight-mode nil
   "*Non-nil means run `midnight-hook' at midnight.
 Setting this variable outside customize has no effect;
@@ -63,11 +69,6 @@ call `cancel-timer' or `timer-activate' on `midnight-timer' instead."
 
 ;;; time conversion
 
 
 ;;; time conversion
 
-(defun midnight-float-time (&optional tm)
-  "Convert `current-time' to a float number of seconds."
-  (multiple-value-bind (s0 s1 s2) (or tm (current-time))
-    (+ (* (float (ash 1 16)) s0) (float s1) (* 0.0000001 s2))))
-
 (defun midnight-time-float (num)
   "Convert the float number of seconds since epoch to the list of 3 integers."
   (let* ((div (ash 1 16)) (1st (floor num div)))
 (defun midnight-time-float (num)
   "Convert the float number of seconds since epoch to the list of 3 integers."
   (let* ((div (ash 1 16)) (1st (floor num div)))
@@ -76,9 +77,8 @@ call `cancel-timer' or `timer-activate' on `midnight-timer' instead."
 
 (defun midnight-buffer-display-time (&optional buf)
   "Return the time-stamp of the given buffer, or current buffer, as float."
 
 (defun midnight-buffer-display-time (&optional buf)
   "Return the time-stamp of the given buffer, or current buffer, as float."
-  (save-excursion
-    (set-buffer (or buf (current-buffer)))
-    (when buffer-display-time (midnight-float-time buffer-display-time))))
+  (with-current-buffer (or buf (current-buffer))
+    (when buffer-display-time (float-time buffer-display-time))))
 
 ;;; clean-buffer-list stuff
 
 
 ;;; clean-buffer-list stuff
 
@@ -104,12 +104,12 @@ displayed more than this many seconds ago."
 If buffer name matches a regexp in the list and the buffer was not displayed
 in the last `clean-buffer-list-delay-special' seconds, it is killed by
 `clean-buffer-list' when is it in `midnight-hook'.
 If buffer name matches a regexp in the list and the buffer was not displayed
 in the last `clean-buffer-list-delay-special' seconds, it is killed by
 `clean-buffer-list' when is it in `midnight-hook'.
-If a member of the list is a cons, it's `car' is the regexp and its `cdr' is
+If a member of the list is a cons, its `car' is the regexp and its `cdr' is
 the number of seconds to use instead of `clean-buffer-list-delay-special'.
 See also `clean-buffer-list-kill-buffer-names',
 `clean-buffer-list-kill-never-regexps' and
 `clean-buffer-list-kill-never-buffer-names'."
 the number of seconds to use instead of `clean-buffer-list-delay-special'.
 See also `clean-buffer-list-kill-buffer-names',
 `clean-buffer-list-kill-never-regexps' and
 `clean-buffer-list-kill-never-buffer-names'."
-  :type 'list
+  :type '(repeat (regexp :tag "Regexp matching Buffer Name"))
   :group 'midnight)
 
 (defcustom clean-buffer-list-kill-buffer-names
   :group 'midnight)
 
 (defcustom clean-buffer-list-kill-buffer-names
@@ -119,12 +119,12 @@ See also `clean-buffer-list-kill-buffer-names',
 Buffers with names in this list, which were not displayed in the last
 `clean-buffer-list-delay-special' seconds, are killed by `clean-buffer-list'
 when is it in `midnight-hook'.
 Buffers with names in this list, which were not displayed in the last
 `clean-buffer-list-delay-special' seconds, are killed by `clean-buffer-list'
 when is it in `midnight-hook'.
-If a member of the list is a cons, it's `car' is the name and its `cdr' is
+If a member of the list is a cons, its `car' is the name and its `cdr' is
 the number of seconds to use instead of `clean-buffer-list-delay-special'.
 See also `clean-buffer-list-kill-regexps',
 `clean-buffer-list-kill-never-regexps' and
 `clean-buffer-list-kill-never-buffer-names'."
 the number of seconds to use instead of `clean-buffer-list-delay-special'.
 See also `clean-buffer-list-kill-regexps',
 `clean-buffer-list-kill-never-regexps' and
 `clean-buffer-list-kill-never-buffer-names'."
-  :type 'list
+  :type '(repeat (string :tag "Buffer Name"))
   :group 'midnight)
 
 (defcustom clean-buffer-list-kill-never-buffer-names
   :group 'midnight)
 
 (defcustom clean-buffer-list-kill-never-buffer-names
@@ -134,24 +134,24 @@ See also `clean-buffer-list-kill-never-regexps'.
 Note that this does override `clean-buffer-list-kill-regexps' and
 `clean-buffer-list-kill-buffer-names' so a buffer matching any of these
 two lists will NOT be killed if it is also present in this list."
 Note that this does override `clean-buffer-list-kill-regexps' and
 `clean-buffer-list-kill-buffer-names' so a buffer matching any of these
 two lists will NOT be killed if it is also present in this list."
-  :type 'list
+  :type '(repeat (string :tag "Buffer Name"))
   :group 'midnight)
 
 
   :group 'midnight)
 
 
-(defcustom clean-buffer-list-kill-never-regexps '("^ \*Minibuf-.*\*$")
+(defcustom clean-buffer-list-kill-never-regexps '("^ \\*Minibuf-.*\\*$")
   "*List of regexp saying which buffers will never be killed at midnight.
 See also `clean-buffer-list-kill-never-buffer-names'.
 Killing is done by `clean-buffer-list'.
 Note that this does override `clean-buffer-list-kill-regexps' and
 `clean-buffer-list-kill-buffer-names' so a buffer matching any of these
 two lists will NOT be killed if it also matches anything in this list."
   "*List of regexp saying which buffers will never be killed at midnight.
 See also `clean-buffer-list-kill-never-buffer-names'.
 Killing is done by `clean-buffer-list'.
 Note that this does override `clean-buffer-list-kill-regexps' and
 `clean-buffer-list-kill-buffer-names' so a buffer matching any of these
 two lists will NOT be killed if it also matches anything in this list."
-  :type 'list
+  :type '(repeat (regexp :tag "Regexp matching Buffer Name"))
   :group 'midnight)
 
 (defun midnight-find (el ls test &optional key)
   "A stopgap solution to the absence of `find' in ELisp."
   (dolist (rr ls)
   :group 'midnight)
 
 (defun midnight-find (el ls test &optional key)
   "A stopgap solution to the absence of `find' in ELisp."
   (dolist (rr ls)
-    (when (funcall test el (if key (funcall key rr) rr))
+    (when (funcall test (if key (funcall key rr) rr) el)
       (return rr))))
 
 (defun clean-buffer-list-delay (name)
       (return rr))))
 
 (defun clean-buffer-list-delay (name)
@@ -165,6 +165,7 @@ Autokilling is done by `clean-buffer-list'."
                      clean-buffer-list-delay-special)
       (* clean-buffer-list-delay-general 24 60 60)))
 
                      clean-buffer-list-delay-special)
       (* clean-buffer-list-delay-general 24 60 60)))
 
+;;;###autoload
 (defun clean-buffer-list ()
   "Kill old buffers that have not been displayed recently.
 The relevant variables are `clean-buffer-list-delay-general',
 (defun clean-buffer-list ()
   "Kill old buffers that have not been displayed recently.
 The relevant variables are `clean-buffer-list-delay-general',
@@ -177,20 +178,22 @@ the current date/time, buffer name, how many seconds ago it was
 displayed (can be nil if the buffer was never displayed) and its
 lifetime, i.e., its \"age\" when it will be purged."
   (interactive)
 displayed (can be nil if the buffer was never displayed) and its
 lifetime, i.e., its \"age\" when it will be purged."
   (interactive)
-  (let ((tm (midnight-float-time)) bts (ts (format-time-string "%Y-%m-%d %T")) bn
-        (bufs (buffer-list)) buf delay cbld)
-    (while (setq buf (pop bufs))
-      (setq bts (midnight-buffer-display-time buf) bn (buffer-name buf)
-            delay (if bts (- tm bts) 0) cbld (clean-buffer-list-delay bn))
-      (message "[%s] `%s' [%s %d]" ts bn (if bts (round delay)) cbld)
-      (unless (or (midnight-find bn clean-buffer-list-kill-never-regexps
-                                 'string-match)
-                  (midnight-find bn clean-buffer-list-kill-never-buffer-names
-                                 'string-equal)
-                  (and (buffer-file-name buf) (buffer-modified-p buf))
-                  (get-buffer-window buf 'visible) (< delay cbld))
-        (message "[%s] killing `%s'" ts bn)
-        (kill-buffer buf)))))
+  (let ((tm (float-time)) bts (ts (format-time-string "%Y-%m-%d %T"))
+        delay cbld bn)
+    (dolist (buf (buffer-list))
+      (when (buffer-live-p buf)
+       (setq bts (midnight-buffer-display-time buf) bn (buffer-name buf)
+             delay (if bts (- tm bts) 0) cbld (clean-buffer-list-delay bn))
+       (message "[%s] `%s' [%s %d]" ts bn (if bts (round delay)) cbld)
+       (unless (or (midnight-find bn clean-buffer-list-kill-never-regexps
+                                  'string-match)
+                   (midnight-find bn clean-buffer-list-kill-never-buffer-names
+                                  'string-equal)
+                   (get-buffer-process buf)
+                   (and (buffer-file-name buf) (buffer-modified-p buf))
+                   (get-buffer-window buf 'visible) (< delay cbld))
+         (message "[%s] killing `%s'" ts bn)
+         (kill-buffer buf))))))
 
 ;;; midnight hook
 
 
 ;;; midnight hook
 
@@ -208,18 +211,13 @@ The default value is `clean-buffer-list'."
   (multiple-value-bind (sec min hrs) (decode-time)
     (- (* 24 60 60) (* 60 60 hrs) (* 60 min) sec)))
 
   (multiple-value-bind (sec min hrs) (decode-time)
     (- (* 24 60 60) (* 60 60 hrs) (* 60 min) sec)))
 
-(defvar midnight-timer nil
-  "Timer running the `midnight-hook' `midnight-delay' seconds after midnight.
-Use `cancel-timer' to stop it and `midnight-delay-set' to change
-the time when it is run.")
-
 ;;;###autoload
 (defun midnight-delay-set (symb tm)
   "Modify `midnight-timer' according to `midnight-delay'.
 Sets the first argument SYMB (which must be symbol `midnight-delay')
 to its second argument TM."
   (assert (eq symb 'midnight-delay) t
 ;;;###autoload
 (defun midnight-delay-set (symb tm)
   "Modify `midnight-timer' according to `midnight-delay'.
 Sets the first argument SYMB (which must be symbol `midnight-delay')
 to its second argument TM."
   (assert (eq symb 'midnight-delay) t
-          "Illegal argument to `midnight-delay-set': `%s'" symb)
+          "Invalid argument to `midnight-delay-set': `%s'")
   (set symb tm)
   (when (timerp midnight-timer) (cancel-timer midnight-timer))
   (setq midnight-timer
   (set symb tm)
   (when (timerp midnight-timer) (cancel-timer midnight-timer))
   (setq midnight-timer
@@ -238,4 +236,5 @@ first argument to `run-at-time'."
 
 (provide 'midnight)
 
 
 (provide 'midnight)
 
+;;; arch-tag: a5979be9-2890-46a3-ba84-791f0a4a6e80
 ;;; midnight.el ends here
 ;;; midnight.el ends here