[comp.emacs] mh-inc-folder-hook

tale@pawl.rpi.edu (David C Lawrence) (05/12/89)

A few months ago (December maybe?) Ashwin posted a patch to mh-e.el
that took care of the word " Mail" still appearing in the global mode
string if display-time is running.  Well, I trashed that patch about
two months ago when we upgraded to 18.53 (now 18.54) and today, after
repeated typing of "i" when I really had no new mail, I got frustrated
enough to go back and write the patch for it again.  Lo and behold,
there is now and mh-inc-folder-hook!  (It if was there before I never
noticed it and  Ashin's patch didn't use it.)

Well, anyway, I figured some people might find this useful in their
.emacs files.  If you already have an inc-folder-hook that does
something else you will have to merge this around/into your existing hook.

(BTW, echoing someone else's (I forget whose) opinion, why can't
match-data be global?  This extra code around each random
string-match/re-search seems to be somewhat of a kludge when simply
(let (VAR) ...) is sufficient in other cases when you want to preserve VAR.)

(setq mh-inc-folder-hook 
      '(lambda ()
         (if (and (boundp (quote display-time-process)) 
                  (eq (quote run) (process-status display-time-process))) 
             (let ((real-match-data (match-data)))
               (unwind-protect
                   (setq display-time-string
                         (concat 
                          (substring display-time-string 0
                                     (string-match " Mail" display-time-string))
                          (substring display-time-string (match-end 0))))
                 (store-match-data real-match-data))
               (set-buffer-modified-p (buffer-modified-p))))))

Dave
--
      tale@rpitsmts.bitnet, tale%mts@itsgw.rpi.edu, tale@pawl.rpi.edu

tale@pawl.rpi.edu (David C Lawrence) (05/16/89)

In <TALE.89May11183939@imagine.pawl.rpi.edu> I gave a hook to clobber
the " Mail" string when new mail is incorporated by mh-e.  I
overlooked the fact that " Mail" might not be part of the
display-time-string because you are either a) don't have any mail or
b) have mail but Emacs hasn't told you yet.  Mark D. Baushke
<mdb@kosciusko.ESD.3Com.COM> pointed this out to me and he asked that
I post the revised version as a bug-fix/enhancement.

(setq mh-inc-folder-hook 
      '(lambda ()
         (if (and (boundp 'display-time-process)
                  (eq 'run (process-status display-time-process))) 
             (let ((real-match-data (match-data)))
               (unwind-protect
                   (setq display-time-string
			 (let ((loc
                                (string-match " Mail" display-time-string)))
			   (if loc
			       (concat 
				(substring display-time-string 0 loc)
				(substring display-time-string (match-end 0)))
			     display-time-string)))
		 (store-match-data real-match-data))
               (set-buffer-modified-p (buffer-modified-p))))))


A couple people have said that protecting the match-data like that was
a good idea so I have this little function now:

(defun save-match-data (&rest forms)
  "Save the match-data while &rest FORMS do some miscellaneous matching.
This is similar in principle to save-excursion and save-restriction."
  (let ((original-match-data (match-data)))
    (unwind-protect
        (while forms
          (eval (car forms))
          (setq forms (cdr forms)))
      (store-match-data original-match-data))))
(put 'save-match-data 'lisp-indent-hook 0)

If you decide to keep that around as being handy, then the hook shortens a
little to this: 

(setq mh-inc-folder-hook 
      '(lambda ()
         (if (and (boundp 'display-time-process)
                  (eq 'run (process-status display-time-process)))
             (save-match-data
               (setq display-time-string
                     (let ((loc (string-match " Mail" display-time-string)))
                       (if loc
                           (concat 
                            (substring display-time-string 0 loc)
                            (substring display-time-string (match-end 0)))
                         display-time-string)))
               (set-buffer-modified-p (buffer-modified-p))))))

Ashwin informs me that as of 18.52 the hook for inc-folder was not
there, so this won't work for anyone running 18.52 or earlier.  You
have to either code in the hook or redefine mh-inc-folder to do the
stripping by itself.

Dave

--
 (setq mail '("tale@pawl.rpi.edu" "tale@itsgw.rpi.edu" "tale@rpitsmts.bitnet"))
 (error "UUCP not spoken here.  Long bang paths unlikely to get mail replies.")

Ram-Ashwin@cs.yale.edu (Ashwin Ram) (05/16/89)

In article <TALE.89May15161530@imagine.pawl.rpi.edu>, tale@pawl.rpi.edu (David C Lawrence) writes:
> Ashwin informs me that as of 18.52 the hook for inc-folder was not
> there, so this won't work for anyone running 18.52 or earlier.  You
> have to either code in the hook or redefine mh-inc-folder to do the
> stripping by itself.

Actually, what I said (or meant to say) was that mh-inc-folder-hook does exist
in 18.52, but there is no corresponding hook in rmail.el as of 18.52 :-(

-- Ashwin.

jr@bbn.com (John Robinson) (05/16/89)

In article <TALE.89May15161530@imagine.pawl.rpi.edu>, tale@pawl (David C Lawrence) writes:
>A couple people have said that protecting the match-data like that was
>a good idea so I have this little function now:
>
>(defun save-match-data (&rest forms)
...

And the suggestion I recently posted to beep when "Mail" appears, in
the time.el function that updates the mode-line, needs this function
to avoid clobbering match-data.  Talk about timing.  Thanks to
Wolfgang Rupprecht for pointing this out.
--
/jr
jr@bbn.com or bbn!jr
C'mon big money!