My mail system was recently converted from mbox to "maildir++", and
while my mailreader (vm) is able to deal with this, I soon found that
display-time was not.

For anyone not using it, display-time can be used to put the string
"Mail" into your status line when you have new mail.  (It also displays
the current time)  It does this by periodically checking the mail
spool file.

With maildir++, there is no longer a single spool file to watch, there
is a directory of files.  If there are any files in that directory,
you have new mail.  It seemed that time.el anticipated something like
this, because it has an optional "display-time-mail-function", which I
defined as follows:

(defun my-check-mail-function ()
  (let ((result (if (directory-files (concat (getenv "MAIL") "/new")
                                     nil "panix")
                    t
                  nil)))
    result))
(setq display-time-mail-function 'my-check-mail-function)

However after setting this up, the status line contained "Mail" and it
never went away, even after I read all my new mail.

Looking at time.el some more, I think there's an error in the logic of
the display-time-update function.  The problem is that, if the
display-time-mail-function returns nil (indicating that I have no new
mail in my maildir++ folder), the function will continue trying other
ways to find new mail:

         (mail (or (and display-time-mail-function
                        (funcall display-time-mail-function))
                   (and (stringp mail-spool-file)
                        ... ;Stuff it shouldn't be doing for maildir++

I think that "or" should be change to a "cond", or maybe just an "if":

         (mail (if display-time-mail-function
                   (funcall display-time-mail-function)
                 (and (stringp mail-spool-file)
                      ...

This would behave correctly, i.e. if my display-time-mail-function
returns nil, it will stop there and realize there's no new mail,
rather than continue trying alternate methods.

Since I didn't want to make a local modified time.el, a small hack was
enough to get it to work correctly:

(setq display-time-mail-file t) ;To trick time.el (display-time-update)

This setting, while seemingly meaningless, will force time.el to not
try the alternate methods when display-time-mail-function returns nil.

Just thought I'd throw this out there, in case any other display-time
users run into a similar situation.

-Jason
_______________________________________________
Help-gnu-emacs mailing list
Help-gnu-emacs@gnu.org
http://lists.gnu.org/mailman/listinfo/help-gnu-emacs

Reply via email to