/[emacs]/emacs/lisp/mh-e/mh-e.el
ViewVC logotype

Diff of /emacs/lisp/mh-e/mh-e.el

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.2 by wohler, Mon Feb 3 20:55:30 2003 UTC revision 1.3 by wohler, Fri Apr 25 05:52:00 2003 UTC
# Line 1  Line 1 
1  ;;; mh-e.el --- GNU Emacs interface to the MH mail system  ;;; mh-e.el --- GNU Emacs interface to the MH mail system
2    
3  ;; Copyright (C) 1985,86,87,88,90,92,93,94,95,97,2000,2001,2002 Free Software Foundation, Inc.  ;; Copyright (C) 1985, 86, 87, 88, 90, 92, 93, 94, 95, 97, 1999,
4    ;;  2000, 01, 02, 2003 Free Software Foundation, Inc.
5    
6  ;; Author: Bill Wohler <wohler@newt.com>  ;; Author: Bill Wohler <wohler@newt.com>
7  ;; Maintainer: Bill Wohler <wohler@newt.com>  ;; Maintainer: Bill Wohler <wohler@newt.com>
8  ;; Version: 7.2  ;; Version: 7.3
9  ;; Keywords: mail  ;; Keywords: mail
10    
11  ;; This file is part of GNU Emacs.  ;; This file is part of GNU Emacs.
# Line 79  Line 80 
80  ;; Maintenance picked up by Bill Wohler <wohler@newt.com> and the  ;; Maintenance picked up by Bill Wohler <wohler@newt.com> and the
81  ;; SourceForge Crew <http://mh-e.sourceforge.net/>. 2001.  ;; SourceForge Crew <http://mh-e.sourceforge.net/>. 2001.
82    
 ;; $Id$  
   
83  ;;; Code:  ;;; Code:
84    
85  (require 'cl)  (require 'cl)
# Line 92  Line 91 
91             (> 50 recursive-load-depth-limit))             (> 50 recursive-load-depth-limit))
92        (setq recursive-load-depth-limit 50)))        (setq recursive-load-depth-limit 50)))
93    
94    (require 'mh-inc)
95  (require 'mh-utils)  (require 'mh-utils)
96  (require 'gnus-util)  (require 'gnus-util)
97  (require 'easymenu)  (require 'easymenu)
# Line 102  Line 102 
102  (defvar font-lock-auto-fontify)  (defvar font-lock-auto-fontify)
103  (defvar font-lock-defaults)  (defvar font-lock-defaults)
104    
105  (defconst mh-version "7.2" "Version number of MH-E.")  (defconst mh-version "7.3" "Version number of MH-E.")
106    
107  ;;; Autoloads  ;;; Autoloads
108  (autoload 'Info-goto-node "info")  (autoload 'Info-goto-node "info")
# Line 413  is done highlighting.") Line 413  is done highlighting.")
413      (cond      (cond
414       ((not mh-folder-unseen-seq-cache)       ((not mh-folder-unseen-seq-cache)
415        nil)        nil)
416       ((not cur-msg)                     ;Presumably at end of buffer       ((>= (point) limit)                 ;Presumably at end of buffer
417        (setq mh-folder-unseen-seq-cache nil)        (setq mh-folder-unseen-seq-cache nil)
418        nil)        nil)
419       ((member cur-msg mh-folder-unseen-seq-cache)       ((member cur-msg mh-folder-unseen-seq-cache)
# Line 432  is done highlighting.") Line 432  is done highlighting.")
432        ;; Examine how we must have exited the loop...        ;; Examine how we must have exited the loop...
433        (let ((cur-msg (mh-get-msg-num nil)))        (let ((cur-msg (mh-get-msg-num nil)))
434          (cond          (cond
435           ((or (not cur-msg)           ((or (<= limit (point))
               (<= limit (point))  
436                (not (member cur-msg mh-folder-unseen-seq-cache)))                (not (member cur-msg mh-folder-unseen-seq-cache)))
437            (setq mh-folder-unseen-seq-cache nil)            (setq mh-folder-unseen-seq-cache nil)
438            nil)            nil)
# Line 468  is done highlighting.") Line 467  is done highlighting.")
467  (defvar mh-narrowed-to-seq nil)         ;Sequence display is narrowed to or  (defvar mh-narrowed-to-seq nil)         ;Sequence display is narrowed to or
468                                          ;nil if not narrowed.                                          ;nil if not narrowed.
469    
470    (defvar mh-tick-seq-changed-when-narrowed-flag nil)
471                                            ;Has tick sequence changed while the
472                                            ;folder was narrowed to it?
473    
474  (defvar mh-view-ops ())                 ;Stack of ops that change the folder  (defvar mh-view-ops ())                 ;Stack of ops that change the folder
475                                          ;view (such as narrowing or threading).                                          ;view (such as narrowing or threading).
476    
# Line 535  the Emacs front end to the MH mail syste Line 538  the Emacs front end to the MH mail syste
538    
539  (defun mh-delete-msg (msg-or-seq)  (defun mh-delete-msg (msg-or-seq)
540    "Mark the specified MSG-OR-SEQ for subsequent deletion and move to the next.    "Mark the specified MSG-OR-SEQ for subsequent deletion and move to the next.
541    Default is the displayed message.
542  Default is the displayed message. If optional prefix argument is given then  If optional prefix argument is provided, then prompt for the message sequence.
543  prompt for the message sequence. If variable `transient-mark-mode' is non-nil  If variable `transient-mark-mode' is non-nil and the mark is active, then the
544  and the mark is active, then the selected region is marked for deletion."  selected region is marked for deletion.
545    (interactive (list (cond  In a program, MSG-OR-SEQ can be a message number, a list of message numbers, a
546                        ((mh-mark-active-p t)  region in a cons cell, or a sequence."
547                         (cons (region-beginning) (region-end)))    (interactive (list (mh-interactive-msg-or-seq "Delete")))
                       (current-prefix-arg  
                        (mh-read-seq-default "Delete" t))  
                       (t  
                        (cons (line-beginning-position) (line-end-position))))))  
548    (mh-delete-msg-no-motion msg-or-seq)    (mh-delete-msg-no-motion msg-or-seq)
549    (mh-next-msg))    (mh-next-msg))
550    
551  (defun mh-delete-msg-no-motion (msg-or-seq)  (defun mh-delete-msg-no-motion (msg-or-seq)
552    "Mark the specified MSG-OR-SEQ for subsequent deletion.    "Mark the specified MSG-OR-SEQ for subsequent deletion.
553  Default is the displayed message. If optional prefix argument is provided,  Default is the displayed message.
554  then prompt for the message sequence."  If optional prefix argument is provided, then prompt for the message sequence.
555    (interactive (list (if current-prefix-arg  If variable `transient-mark-mode' is non-nil and the mark is active, then the
556                           (mh-read-seq-default "Delete" t)  selected region is marked for deletion.
557                         (mh-get-msg-num t))))  In a program, MSG-OR-SEQ can be a message number, a list of message numbers, a
558    (cond ((numberp msg-or-seq)  region in a cons cell, or a sequence."
559           (mh-delete-a-msg msg-or-seq))    (interactive (list (mh-interactive-msg-or-seq "Delete")))
560          ((and (consp msg-or-seq)    (mh-iterate-on-msg-or-seq () msg-or-seq
561                (numberp (car msg-or-seq)) (numberp (cdr msg-or-seq)))      (mh-delete-a-msg nil)))
          (mh-iterate-on-messages-in-region () (car msg-or-seq) (cdr msg-or-seq)  
            (mh-delete-a-msg nil)))  
         (t (mh-map-to-seq-msgs 'mh-delete-a-msg msg-or-seq))))  
562    
563  (defun mh-execute-commands ()  (defun mh-execute-commands ()
564    "Process outstanding delete and refile requests."    "Process outstanding delete and refile requests."
# Line 593  Type \"\\[mh-show]\" to show the message Line 589  Type \"\\[mh-show]\" to show the message
589         (mh-invalidate-show-buffer))         (mh-invalidate-show-buffer))
590    (let ((mh-decode-mime-flag nil)    (let ((mh-decode-mime-flag nil)
591          (mhl-formfile nil)          (mhl-formfile nil)
         (mh-decode-content-transfer-encoded-message-flag nil)  
592          (mh-clean-message-header-flag nil))          (mh-clean-message-header-flag nil))
593      (mh-show-msg nil)      (mh-show-msg nil)
594      (mh-in-show-buffer (mh-show-buffer)      (mh-in-show-buffer (mh-show-buffer)
# Line 601  Type \"\\[mh-show]\" to show the message Line 596  Type \"\\[mh-show]\" to show the message
596        (mh-recenter 0))        (mh-recenter 0))
597      (setq mh-showing-with-headers t)))      (setq mh-showing-with-headers t)))
598    
599  (defun mh-inc-folder (&optional maildrop-name)  (defun mh-inc-folder (&optional maildrop-name folder)
600    "Inc(orporate)s new mail into the Inbox folder.    "Inc(orporate)s new mail into the Inbox folder.
601  Optional argument MAILDROP-NAME specifies an alternate maildrop from the  Optional argument MAILDROP-NAME specifies an alternate maildrop from the
602  default. If the prefix argument is given, incorporates mail into the current  default. The optional argument FOLDER specifies where to incorporate mail
603  folder, otherwise uses the folder named by `mh-inbox'.  instead of the default named by `mh-inbox'.
604  The value of `mh-inc-folder-hook' is a list of functions to be called, with no  The value of `mh-inc-folder-hook' is a list of functions to be called, with no
605  arguments, after incorporating new mail.  arguments, after incorporating new mail.
606  Do not call this function from outside MH-E; use \\[mh-rmail] instead."  Do not call this function from outside MH-E; use \\[mh-rmail] instead."
607    (interactive (list (if current-prefix-arg    (interactive (list (if current-prefix-arg
608                           (expand-file-name                           (expand-file-name
609                            (read-file-name "inc mail from file: "                            (read-file-name "inc mail from file: "
610                                            mh-user-path)))))                                            mh-user-path)))
611                         (if current-prefix-arg
612                             (mh-prompt-for-folder "inc mail into" mh-inbox t))))
613      (if (not folder)
614          (setq folder mh-inbox))
615    (let ((threading-needed-flag nil))    (let ((threading-needed-flag nil))
616      (let ((config (current-window-configuration)))      (let ((config (current-window-configuration)))
617        (if (not maildrop-name)        (cond ((not (get-buffer folder))
618            (cond ((not (get-buffer mh-inbox))               (mh-make-folder folder)
619                   (mh-make-folder mh-inbox)               (setq threading-needed-flag mh-show-threads-flag)
620                   (setq threading-needed-flag mh-show-threads-flag)               (setq mh-previous-window-config config))
621                   (setq mh-previous-window-config config))              ((not (eq (current-buffer) (get-buffer folder)))
622                  ((not (eq (current-buffer) (get-buffer mh-inbox)))               (switch-to-buffer folder)
623                   (switch-to-buffer mh-inbox)               (setq mh-previous-window-config config))))
                  (setq mh-previous-window-config config)))))  
624      (mh-get-new-mail maildrop-name)      (mh-get-new-mail maildrop-name)
625      (when (and threading-needed-flag      (when (and threading-needed-flag
626                 (save-excursion                 (save-excursion
# Line 632  Do not call this function from outside M Line 630  Do not call this function from outside M
630                       (and (message "Not threading since the number of messages exceeds `mh-large-folder'")                       (and (message "Not threading since the number of messages exceeds `mh-large-folder'")
631                            nil))))                            nil))))
632        (mh-toggle-threads))        (mh-toggle-threads))
633      (if mh-showing-mode (mh-show))      (beginning-of-line)
634        (if (and mh-showing-mode (looking-at mh-scan-valid-regexp)) (mh-show))
635      (run-hooks 'mh-inc-folder-hook)))      (run-hooks 'mh-inc-folder-hook)))
636    
637  (defun mh-last-msg ()  (defun mh-last-msg ()
# Line 643  Do not call this function from outside M Line 642  Do not call this function from outside M
642      (forward-line -1))      (forward-line -1))
643    (mh-recenter nil))    (mh-recenter nil))
644    
645  (defun mh-next-undeleted-msg (&optional arg)  (defun mh-next-undeleted-msg (&optional arg wait-after-complaining-flag)
646    "Move to the next undeleted message ARG in window."    "Move to the next undeleted message ARG in window.
647    If optional argument WAIT-AFTER-COMPLAINING-FLAG is non-nil and we are at the
648    last undeleted message then pause for a second after printing message."
649    (interactive "p")    (interactive "p")
650    (setq mh-next-direction 'forward)    (setq mh-next-direction 'forward)
651    (forward-line 1)    (forward-line 1)
# Line 652  Do not call this function from outside M Line 653  Do not call this function from outside M
653           (beginning-of-line)           (beginning-of-line)
654           (mh-maybe-show))           (mh-maybe-show))
655          (t (forward-line -1)          (t (forward-line -1)
656             (message "No more undeleted messages"))))             (message "No more undeleted messages")
657               (if wait-after-complaining-flag (sit-for 1)))))
658    
659  (defun mh-folder-from-address ()  (defun mh-folder-from-address ()
660    "Determine folder name from address in From field.    "Determine folder name from address in From field.
661  Takes the address in the From: header field, and returns one of:  Takes the address in the From: header field, and returns one of:
662    
663    a) The folder name associated with the address in the alist    a) The folder name associated with the address in the alist
664       `mh-default-folder-list'.       `mh-default-folder-list'.  If the `Check Recipient' boolean
665          is set, then the `mh-default-folder-list' addresses are
666          checked against the recipient instead of the originator
667          (making possible to use this feature for mailing lists).
668          The first match found in `mh-default-folder-list' is used.
669    
670    b) The address' corresponding alias from the user's personal    b) The address' corresponding alias from the user's personal
671       aliases file prefixed by `mh-default-folder-prefix'.       aliases file prefixed by `mh-default-folder-prefix'.
672    
673  Returns nil if the address was not found in either place or if the variable  Returns nil if the address was not found in either place or if the variable
674  `mh-default-folder-must-exist-flag' is nil and the folder does not exist."  `mh-default-folder-must-exist-flag' is nil and the folder does not exist."
675    ;; Is address in mh-default-folder-list?    ;; Loop for all entries in mh-default-folder-list
676    (let* ((address    (save-excursion
677            (nth 1 (mail-extract-address-components      (let ((folder-name
678                    (mh-extract-from-header-value))))             (car
679           (folder-name              (delq nil
680            (nth 1 (assoc-ignore-case address mh-default-folder-list))))                    (mapcar
681                       (lambda (list)
682      ;; If not, is there an alias for the address?                       (let ((address-regexp (nth 0 list))
683      (if (not folder-name)                             (folder (nth 1 list))
684          (let* ((alias (mh-alias-address-to-alias address)))                             (to-flag (nth 2 list)))
685            (setq folder-name                         (when (or
686                  (and alias (concat "+" mh-default-folder-prefix alias)))))                                (mh-goto-header-field (if to-flag "To:" "From:"))
687                                  ; if the To: field is missing, try Cc:
688      ;; If mh-default-folder-must-exist-flag set, check that folder exists.                                (and to-flag (mh-goto-header-field "cc:")))
689      (if (and folder-name                           (let ((endfield (save-excursion
690               (or (not mh-default-folder-must-exist-flag)                                             (mh-header-field-end)(point))))
691                   (file-exists-p (mh-expand-file-name folder-name))))                             (if (re-search-forward address-regexp endfield t)
692          folder-name)))                                 folder
693                                 (when to-flag ;Try Cc: as well
694                                   (mh-goto-header-field "cc:")
695                                   (let ((endfield (save-excursion
696                                                     (mh-header-field-end)(point))))
697                                     (when (re-search-forward
698                                            address-regexp endfield t)
699                                       folder))))))))
700                       mh-default-folder-list)))))
701    
702          ;; Make sure a result from `mh-default-folder-list' begins with "+"
703          ;; since 'mh-expand-file-name below depends on it
704          (when (and folder-name (not (eq (aref folder-name 0) ?+)))
705            (setq folder-name (concat "+" folder-name)))
706    
707          ;; If not, is there an alias for the address?
708          (when (not folder-name)
709            (let* ((from-header (mh-extract-from-header-value))
710                   (address (and from-header
711                                 (nth 1 (mail-extract-address-components
712                                         from-header))))
713                   (alias (and address (mh-alias-address-to-alias address))))
714              (when alias
715                (setq folder-name
716                      (and alias (concat "+" mh-default-folder-prefix alias))))))
717    
718          ;; If mh-default-folder-must-exist-flag set, check that folder exists.
719          (if (and folder-name
720                   (or (not mh-default-folder-must-exist-flag)
721                       (file-exists-p (mh-expand-file-name folder-name))))
722              folder-name))))
723    
724  (defun mh-prompt-for-refile-folder ()  (defun mh-prompt-for-refile-folder ()
725    "Prompt the user for a folder in which the message should be filed.    "Prompt the user for a folder in which the message should be filed.
# Line 710  Otherwise, a default folder name is gene Line 746  Otherwise, a default folder name is gene
746             "")))             "")))
747     t))     t))
748    
749  (defun mh-refile-msg (msg-or-seq folder)  (defun mh-refile-msg (msg-or-seq folder
750    "Refile MSG-OR-SEQ (default: displayed message) into FOLDER.                        &optional dont-update-last-destination-flag)
751  If optional prefix argument provided, then prompt for message sequence.    "Refile MSG-OR-SEQ into FOLDER.
752    Default is the displayed message.
753    If optional prefix argument is provided, then prompt for the message sequence.
754  If variable `transient-mark-mode' is non-nil and the mark is active, then the  If variable `transient-mark-mode' is non-nil and the mark is active, then the
755  selected region is marked for refiling."  selected region is marked for refiling.
756    (interactive  In a program, MSG-OR-SEQ can be a message number, a list of message numbers, a
757     (list (cond  region in a cons cell, or a sequence.
758            ((mh-mark-active-p t)  
759             (cons (region-beginning) (region-end)))  If optional argument DONT-UPDATE-LAST-DESTINATION-FLAG is non-nil then the
760            (current-prefix-arg  variables `mh-last-destination' and `mh-last-destination-folder' are not
761             (mh-read-seq-default "Refile" t))  updated."
762            (t    (interactive (list (mh-interactive-msg-or-seq "Refile")
763             (cons (line-beginning-position) (line-end-position))))                       (intern (mh-prompt-for-refile-folder))))
764           (intern (mh-prompt-for-refile-folder))))    (unless dont-update-last-destination-flag
765    (setq mh-last-destination (cons 'refile folder)      (setq mh-last-destination (cons 'refile folder)
766          mh-last-destination-folder mh-last-destination)            mh-last-destination-folder mh-last-destination))
767    (cond ((numberp msg-or-seq)    (mh-iterate-on-msg-or-seq () msg-or-seq
768           (mh-refile-a-msg msg-or-seq folder))      (mh-refile-a-msg nil folder))
         ((and (consp msg-or-seq)  
               (numberp (car msg-or-seq)) (numberp (cdr msg-or-seq)))  
          (mh-iterate-on-messages-in-region () (car msg-or-seq) (cdr msg-or-seq)  
            (mh-refile-a-msg nil folder)))  
         (t (mh-map-to-seq-msgs 'mh-refile-a-msg msg-or-seq folder)))  
769    (mh-next-msg))    (mh-next-msg))
770    
771  (defun mh-refile-or-write-again (message)  (defun mh-refile-or-write-again (message)
# Line 742  refile or write command." Line 775  refile or write command."
775    (interactive (list (mh-get-msg-num t)))    (interactive (list (mh-get-msg-num t)))
776    (if (null mh-last-destination)    (if (null mh-last-destination)
777        (error "No previous refile or write"))        (error "No previous refile or write"))
778    (cond ((eq (car mh-last-destination) 'refile)    (let (output)
779           (mh-refile-a-msg message (cdr mh-last-destination))      (setq output
780           (message "Destination folder: %s" (cdr mh-last-destination)))            (cond ((eq (car mh-last-destination) 'refile)
781          (t                   (mh-refile-a-msg message (cdr mh-last-destination))
782           (apply 'mh-write-msg-to-file message (cdr mh-last-destination))                   (format "Destination folder: %s" (cdr mh-last-destination)))
783           (message "Destination: %s" (cdr mh-last-destination))))                  (t
784    (mh-next-msg))                   (apply 'mh-write-msg-to-file message (cdr mh-last-destination))
785                     (format "Destination: %s" (cdr mh-last-destination)))))
786        (mh-next-msg (interactive-p))
787        (message output)))
788    
789  (defun mh-quit ()  (defun mh-quit ()
790    "Quit the current MH-E folder.    "Quit the current MH-E folder.
# Line 809  Scrolls ARG lines or a full screen if no Line 845  Scrolls ARG lines or a full screen if no
845    (mh-in-show-buffer (mh-show-buffer)    (mh-in-show-buffer (mh-show-buffer)
846      (scroll-down arg)))      (scroll-down arg)))
847    
848  (defun mh-previous-undeleted-msg (&optional arg)  (defun mh-previous-undeleted-msg (&optional arg wait-after-complaining-flag)
849    "Move to the previous undeleted message ARG in window."    "Move to the previous undeleted message ARG in window.
850    If optional argument WAIT-AFTER-COMPLAINING-FLAG is non-nil and we are at the
851    first undeleted message then pause for a second after printing message."
852    (interactive "p")    (interactive "p")
853    (setq mh-next-direction 'backward)    (setq mh-next-direction 'backward)
854    (beginning-of-line)    (beginning-of-line)
855    (cond ((re-search-backward mh-scan-good-msg-regexp nil t arg)    (cond ((re-search-backward mh-scan-good-msg-regexp nil t arg)
856           (mh-maybe-show))           (mh-maybe-show))
857          (t (message "No previous undeleted message"))))          (t (message "No previous undeleted message")
858               (if wait-after-complaining-flag (sit-for 1)))))
859    
860  (defun mh-previous-unread-msg (&optional count)  (defun mh-previous-unread-msg (&optional count)
861    "Move to previous unread message.    "Move to previous unread message.
# Line 994  refiles aren't carried out." Line 1033  refiles aren't carried out."
1033                         nil)))                         nil)))
1034    (setq mh-next-direction 'forward)    (setq mh-next-direction 'forward)
1035    (let ((threaded-flag (memq 'unthread mh-view-ops)))    (let ((threaded-flag (memq 'unthread mh-view-ops)))
     (mh-reset-threads-and-narrowing)  
1036      (mh-scan-folder mh-current-folder (or range "all") dont-exec-pending)      (mh-scan-folder mh-current-folder (or range "all") dont-exec-pending)
1037      (cond (threaded-flag (mh-toggle-threads))      (cond (threaded-flag (mh-toggle-threads))
1038            (mh-index-data (mh-index-insert-folder-headers)))))            (mh-index-data (mh-index-insert-folder-headers)))))
# Line 1040  Otherwise send the entire message includ Line 1078  Otherwise send the entire message includ
1078  Default is the displayed message.  Default is the displayed message.
1079  If optional prefix argument is provided, then prompt for the message sequence.  If optional prefix argument is provided, then prompt for the message sequence.
1080  If variable `transient-mark-mode' is non-nil and the mark is active, then the  If variable `transient-mark-mode' is non-nil and the mark is active, then the
1081  selected region is unmarked."  selected region is unmarked.
1082    (interactive (list (cond  In a program, MSG-OR-SEQ can be a message number, a list of message numbers, a
1083                        ((mh-mark-active-p t)  region in a cons cell, or a sequence."
1084                         (cons (region-beginning) (region-end)))    (interactive (list (mh-interactive-msg-or-seq "Undo")))
                       (current-prefix-arg  
                        (mh-read-seq-default "Undo" t))  
                       (t  
                        (mh-get-msg-num t)))))  
1085    (cond ((numberp msg-or-seq)    (cond ((numberp msg-or-seq)
1086           (let ((original-position (point)))           (let ((original-position (point)))
1087             (beginning-of-line)             (beginning-of-line)
# Line 1064  selected region is unmarked." Line 1098  selected region is unmarked."
1098                   (mh-maybe-show))                   (mh-maybe-show))
1099               (goto-char original-position)               (goto-char original-position)
1100               (error "Nothing to undo"))))               (error "Nothing to undo"))))
1101          ((and (consp msg-or-seq)          (t (mh-iterate-on-msg-or-seq () msg-or-seq
1102                (numberp (car msg-or-seq)) (numberp (cdr msg-or-seq)))               (mh-undo-msg nil))))
          (mh-iterate-on-messages-in-region () (car msg-or-seq) (cdr msg-or-seq)  
            (mh-undo-msg nil)))  
         (t  
          (mh-map-to-seq-msgs 'mh-undo-msg msg-or-seq)))  
1103    (if (not (mh-outstanding-commands-p))    (if (not (mh-outstanding-commands-p))
1104        (mh-set-folder-modified-p nil)))        (mh-set-folder-modified-p nil)))
1105    
# Line 1176  used to avoid problems in corner cases i Line 1206  used to avoid problems in corner cases i
1206      (call-process (expand-file-name "flist" mh-progs) nil t nil      (call-process (expand-file-name "flist" mh-progs) nil t nil
1207                    "-norecurse" folder "-sequence" (symbol-name mh-unseen-seq))                    "-norecurse" folder "-sequence" (symbol-name mh-unseen-seq))
1208      (goto-char (point-min))      (goto-char (point-min))
1209      (multiple-value-bind (folder1 unseen total)      (multiple-value-bind (folder unseen total)
1210          (mh-parse-flist-output-line          (mh-parse-flist-output-line
1211           (buffer-substring (point) (line-end-position)))           (buffer-substring (point) (line-end-position)))
1212        (values total unseen))))        (values total unseen folder))))
1213    
1214  (defun mh-visit-folder (folder &optional range index-data)  (defun mh-visit-folder (folder &optional range index-data)
1215    "Visit FOLDER and display RANGE of messages.    "Visit FOLDER and display RANGE of messages.
# Line 1197  regardless of the size of the `mh-large- Line 1227  regardless of the size of the `mh-large-
1227                   (list folder-name                   (list folder-name
1228                         (mh-read-msg-range folder-name current-prefix-arg))))                         (mh-read-msg-range folder-name current-prefix-arg))))
1229    (let ((config (current-window-configuration))    (let ((config (current-window-configuration))
1230            (current-buffer (current-buffer))
1231          (threaded-view-flag mh-show-threads-flag))          (threaded-view-flag mh-show-threads-flag))
1232      (save-excursion      (save-excursion
1233        (when (get-buffer folder)        (when (get-buffer folder)
1234          (set-buffer folder)          (set-buffer folder)
1235          (setq threaded-view-flag (memq 'unthread mh-view-ops))          (setq threaded-view-flag (memq 'unthread mh-view-ops))))
         (mh-reset-threads-and-narrowing)))  
1236      (when index-data      (when index-data
1237        (mh-make-folder folder)        (mh-make-folder folder)
1238        (setq mh-index-data (car index-data)        (setq mh-index-data (car index-data)
# Line 1221  regardless of the size of the `mh-large- Line 1251  regardless of the size of the `mh-large-
1251            (mh-index-data            (mh-index-data
1252             (mh-index-insert-folder-headers)))             (mh-index-insert-folder-headers)))
1253      (unless mh-showing-mode (delete-other-windows))      (unless mh-showing-mode (delete-other-windows))
1254      (setq mh-previous-window-config config))      (unless (eq current-buffer (current-buffer))
1255          (setq mh-previous-window-config config)))
1256    nil)    nil)
1257    
1258  ;;;###mh-autoload  ;;;###mh-autoload
# Line 1305  arguments, after the message has been re Line 1336  arguments, after the message has been re
1336             (mh-notate nil mh-note-refiled mh-cmd-note)             (mh-notate nil mh-note-refiled mh-cmd-note)
1337             (run-hooks 'mh-refile-msg-hook)))))             (run-hooks 'mh-refile-msg-hook)))))
1338    
1339  (defun mh-next-msg ()  (defun mh-next-msg (&optional wait-after-complaining-flag)
1340    "Move backward or forward to the next undeleted message in the buffer."    "Move backward or forward to the next undeleted message in the buffer.
1341    If optional argument WAIT-AFTER-COMPLAINING-FLAG is non-nil and we are at the
1342    last message, then wait for a second after telling the user that there aren't
1343    any more unread messages."
1344    (if (eq mh-next-direction 'forward)    (if (eq mh-next-direction 'forward)
1345        (mh-next-undeleted-msg 1)        (mh-next-undeleted-msg 1 wait-after-complaining-flag)
1346      (mh-previous-undeleted-msg 1)))      (mh-previous-undeleted-msg 1 wait-after-complaining-flag)))
1347    
1348  (defun mh-next-unread-msg (&optional count)  (defun mh-next-unread-msg (&optional count)
1349    "Move to next unread message.    "Move to next unread message.
# Line 1406  Make it the current folder." Line 1440  Make it the current folder."
1440      ["Widen from Sequence"              mh-widen mh-narrowed-to-seq]      ["Widen from Sequence"              mh-widen mh-narrowed-to-seq]
1441      "--"      "--"
1442      ["Narrow to Subject Sequence"       mh-narrow-to-subject t]      ["Narrow to Subject Sequence"       mh-narrow-to-subject t]
1443        ["Narrow to Tick Sequence"          mh-narrow-to-tick
1444         (and mh-tick-seq (mh-seq-msgs (mh-find-seq mh-tick-seq)))]
1445      ["Delete Rest of Same Subject"      mh-delete-subject t]      ["Delete Rest of Same Subject"      mh-delete-subject t]
1446        ["Toggle Tick Mark"                 mh-toggle-tick t]
1447      "--"      "--"
1448      ["Push State Out to MH"             mh-update-sequences t]))      ["Push State Out to MH"             mh-update-sequences t]))
1449    
# Line 1459  Make it the current folder." Line 1496  Make it the current folder."
1496      "--"      "--"
1497      ["List Folders"                     mh-list-folders t]      ["List Folders"                     mh-list-folders t]
1498      ["Visit a Folder..."                mh-visit-folder t]      ["Visit a Folder..."                mh-visit-folder t]
1499        ["View New Messages"                mh-index-new-messages t]
1500      ["Search a Folder..."               mh-search-folder t]      ["Search a Folder..."               mh-search-folder t]
1501      ["Indexed Search..."                mh-index-search t]      ["Indexed Search..."                mh-index-search t]
1502      "--"      "--"
# Line 1474  Make it the current folder." Line 1512  Make it the current folder."
1512           (set-specifier horizontal-scrollbar-visible-p nil           (set-specifier horizontal-scrollbar-visible-p nil
1513                          (cons (current-buffer) nil)))))                          (cons (current-buffer) nil)))))
1514    
1515    ;; Avoid compiler warnings in XEmacs and GNU Emacs 20
1516    (eval-when-compile (defvar tool-bar-mode))
1517    
1518  (defmacro mh-write-file-functions-compat ()  (defmacro mh-write-file-functions-compat ()
1519    "Return `write-file-functions' if it exists.    "Return `write-file-functions' if it exists.
1520  Otherwise return `local-write-file-hooks'. This macro exists purely for  Otherwise return `local-write-file-hooks'. This macro exists purely for
# Line 1483  is used in previous versions and XEmacs. Line 1524  is used in previous versions and XEmacs.
1524        ''write-file-functions            ;Emacs 21.4        ''write-file-functions            ;Emacs 21.4
1525      ''local-write-file-hooks))          ;<Emacs 21.4, XEmacs      ''local-write-file-hooks))          ;<Emacs 21.4, XEmacs
1526    
1527    ;; Avoid compiler warning
1528    (defvar tool-bar-map)
1529    
1530  (define-derived-mode mh-folder-mode fundamental-mode "MH-Folder"  (define-derived-mode mh-folder-mode fundamental-mode "MH-Folder"
1531    "Major MH-E mode for \"editing\" an MH folder scan listing.\\<mh-folder-mode-map>    "Major MH-E mode for \"editing\" an MH folder scan listing.\\<mh-folder-mode-map>
1532    
# Line 1519  When a folder is visited, the hook `mh-f Line 1563  When a folder is visited, the hook `mh-f
1563     'mh-seen-list nil                    ; List of displayed messages     'mh-seen-list nil                    ; List of displayed messages
1564     'mh-next-direction 'forward          ; Direction to move to next message     'mh-next-direction 'forward          ; Direction to move to next message
1565     'mh-narrowed-to-seq nil              ; Sequence display is narrowed to     'mh-narrowed-to-seq nil              ; Sequence display is narrowed to
1566       'mh-tick-seq-changed-when-narrowed-flag nil
1567                                            ; Tick seq changed while narrowed
1568     'mh-view-ops ()                      ; Stack that keeps track of the order     'mh-view-ops ()                      ; Stack that keeps track of the order
1569                                          ; in which narrowing/threading has been                                          ; in which narrowing/threading has been
1570                                          ; carried out.                                          ; carried out.
# Line 1537  When a folder is visited, the hook `mh-f Line 1583  When a folder is visited, the hook `mh-f
1583    (setq truncate-lines t)    (setq truncate-lines t)
1584    (auto-save-mode -1)    (auto-save-mode -1)
1585    (setq buffer-offer-save t)    (setq buffer-offer-save t)
1586      (mh-make-local-hook (mh-write-file-functions-compat))
1587    (add-hook (mh-write-file-functions-compat) 'mh-execute-commands nil t)    (add-hook (mh-write-file-functions-compat) 'mh-execute-commands nil t)
1588    (make-local-variable 'revert-buffer-function)    (make-local-variable 'revert-buffer-function)
1589    (make-local-variable 'hl-line-mode)   ; avoid pollution    (make-local-variable 'hl-line-mode)   ; avoid pollution
1590    (if (fboundp 'hl-line-mode)    (mh-funcall-if-exists hl-line-mode 1)
       (hl-line-mode 1))  
1591    (setq revert-buffer-function 'mh-undo-folder)    (setq revert-buffer-function 'mh-undo-folder)
1592    (or (assq 'mh-showing-mode minor-mode-alist)    (or (assq 'mh-showing-mode minor-mode-alist)
1593        (setq minor-mode-alist        (setq minor-mode-alist
# Line 1551  When a folder is visited, the hook `mh-f Line 1597  When a folder is visited, the hook `mh-f
1597    (easy-menu-add mh-folder-folder-menu)    (easy-menu-add mh-folder-folder-menu)
1598    (if (and (boundp 'tool-bar-mode) tool-bar-mode)    (if (and (boundp 'tool-bar-mode) tool-bar-mode)
1599        (set (make-local-variable 'tool-bar-map) mh-folder-tool-bar-map))        (set (make-local-variable 'tool-bar-map) mh-folder-tool-bar-map))
1600      (mh-funcall-if-exists mh-toolbar-init :folder)
1601    (if (and mh-xemacs-flag    (if (and mh-xemacs-flag
1602             font-lock-auto-fontify)             font-lock-auto-fontify)
1603        (turn-on-font-lock)))             ; Force font-lock in XEmacs.        (turn-on-font-lock)))             ; Force font-lock in XEmacs.
# Line 1570  Return in the folder's buffer." Line 1617  Return in the folder's buffer."
1617    (cond ((null (get-buffer folder))    (cond ((null (get-buffer folder))
1618           (mh-make-folder folder))           (mh-make-folder folder))
1619          (t          (t
1620           (or dont-exec-pending (mh-process-or-undo-commands folder))           (unless dont-exec-pending
1621               (mh-process-or-undo-commands folder)
1622               (mh-reset-threads-and-narrowing))
1623           (switch-to-buffer folder)))           (switch-to-buffer folder)))
1624    (mh-regenerate-headers range)    (mh-regenerate-headers range)
1625    (if (zerop (buffer-size))    (if (zerop (buffer-size))
# Line 1578  Return in the folder's buffer." Line 1627  Return in the folder's buffer."
1627            (message "Folder %s is empty" folder)            (message "Folder %s is empty" folder)
1628          (message "No messages in %s, range %s" folder range))          (message "No messages in %s, range %s" folder range))
1629      (mh-goto-cur-msg))      (mh-goto-cur-msg))
1630    (when dont-exec-pending    (when (mh-outstanding-commands-p)
1631      (mh-notate-deleted-and-refiled)))      (mh-notate-deleted-and-refiled)))
1632    
1633  (defun mh-set-cmd-note (width)  (defun mh-set-cmd-note (width)
# Line 1742  Return in the current buffer." Line 1791  Return in the current buffer."
1791          (if new-mail-flag          (if new-mail-flag
1792              (progn              (progn
1793                (mh-make-folder-mode-line)                (mh-make-folder-mode-line)
1794                  (when (mh-speed-flists-active-p)
1795                    (mh-speed-flists t mh-current-folder))
1796                (when (memq 'unthread mh-view-ops)                (when (memq 'unthread mh-view-ops)
1797                  (mh-thread-inc folder start-of-inc))                  (mh-thread-inc folder start-of-inc))
1798                (mh-goto-cur-msg))                (mh-goto-cur-msg))
# Line 1861  Called by functions like `mh-sort-folder Line 1912  Called by functions like `mh-sort-folder
1912    (if (mh-outstanding-commands-p)    (if (mh-outstanding-commands-p)
1913        (if (or mh-do-not-confirm-flag        (if (or mh-do-not-confirm-flag
1914                (y-or-n-p                (y-or-n-p
1915                 "Process outstanding deletes and refiles (or lose them)? "))                 "Process outstanding deletes and refiles? "))
1916            (mh-process-commands folder)            (mh-process-commands folder)
1917            (set-buffer folder)
1918          (mh-undo-folder)))          (mh-undo-folder)))
1919    (mh-update-unseen)    (mh-update-unseen)
1920    (mh-invalidate-show-buffer))    (mh-invalidate-show-buffer))
# Line 1914  with no arguments, before the commands a Line 1966  with no arguments, before the commands a
1966    
1967        ;; Redraw folder buffer if needed        ;; Redraw folder buffer if needed
1968        (when (and redraw-needed-flag)        (when (and redraw-needed-flag)
1969            (when (mh-speed-flists-active-p)
1970              (mh-speed-flists t mh-current-folder))
1971          (cond ((memq 'unthread mh-view-ops) (mh-thread-inc folder (point-max)))          (cond ((memq 'unthread mh-view-ops) (mh-thread-inc folder (point-max)))
1972                (mh-index-data (mh-index-insert-folder-headers)))))                (mh-index-data (mh-index-insert-folder-headers)))))
1973    
# Line 1962  with no arguments, after the unseen sequ Line 2016  with no arguments, after the unseen sequ
2016    (or mh-delete-list mh-refile-list))    (or mh-delete-list mh-refile-list))
2017    
2018  (defun mh-coalesce-msg-list (messages)  (defun mh-coalesce-msg-list (messages)
2019    "Give a list of MESSAGES, return a list of message number ranges.    "Given a list of MESSAGES, return a list of message number ranges.
2020  Sort of the opposite of `mh-read-msg-list', which expands ranges.  This is the inverse of `mh-read-msg-list', which expands ranges.
2021  Message lists passed to MH programs go through this so  Message lists passed to MH programs should be processed by this function
2022  command line arguments won't exceed system limits."  to avoid exceeding system command line argument limits."
2023    (let ((msgs (sort (copy-sequence messages) 'mh-greaterp))    (let ((msgs (sort (copy-sequence messages) 'mh-greaterp))
2024          (range-high nil)          (range-high nil)
2025          (prev -1)          (prev -1)
# Line 2059  Expands ranges into set of individual nu Line 2113  Expands ranges into set of individual nu
2113               (setq msgs (cons num msgs)))))               (setq msgs (cons num msgs)))))
2114      msgs))      msgs))
2115    
2116  (defun mh-notate-user-sequences ()  (defun mh-notate-user-sequences (&optional msg-or-seq)
2117    "Mark the scan listing of all messages in user-defined sequences."    "Mark user-defined sequences in the messages specified by MSG-OR-SEQ.
2118    The optional argument MSG-OR-SEQ can be a message number, a list of message
2119    numbers, a sequence, a region in a cons cell, or nil in which case all
2120    messages in the folder buffer are notated."
2121      (unless msg-or-seq
2122        (setq msg-or-seq (cons (point-min) (point-max))))
2123    (let ((seqs mh-seq-list)    (let ((seqs mh-seq-list)
2124          (msg-hash (make-hash-table)))          (msg-hash (make-hash-table))
2125            (tick-msgs (and mh-tick-seq (mh-seq-msgs (mh-find-seq mh-tick-seq)))))
2126      (dolist (seq seqs)      (dolist (seq seqs)
2127        (unless (mh-internal-seq (mh-seq-name seq))        (unless (mh-internal-seq (mh-seq-name seq))
2128          (dolist (msg (mh-seq-msgs seq))          (dolist (msg (mh-seq-msgs seq))
2129            (setf (gethash msg msg-hash) t))))            (setf (gethash msg msg-hash) t))))
2130      (mh-iterate-on-messages-in-region msg (point-min) (point-max)      (mh-iterate-on-msg-or-seq msg msg-or-seq
2131        (when (gethash msg msg-hash)        (when (gethash msg msg-hash)
2132          (mh-notate nil mh-note-seq (1+ mh-cmd-note))))))          (mh-notate nil mh-note-seq (1+ mh-cmd-note)))
2133          (mh-notate-tick msg tick-msgs))))
2134    
2135  (defun mh-internal-seq (name)  (defun mh-internal-seq (name)
2136    "Return non-nil if NAME is the name of an internal MH-E sequence."    "Return non-nil if NAME is the name of an internal MH-E sequence."
2137    (or (memq name '(answered cur deleted forwarded printed))    (or (memq name '(answered cur deleted forwarded printed))
2138        (eq name mh-unseen-seq)        (eq name mh-unseen-seq)
2139          (and mh-tick-seq (eq name mh-tick-seq))
2140        (eq name mh-previous-seq)        (eq name mh-previous-seq)
2141        (mh-folder-name-p name)))        (mh-folder-name-p name)))
2142    
2143  (defun mh-delete-msg-from-seq (message sequence &optional internal-flag)  (defun mh-delete-msg-from-seq (msg-or-seq sequence &optional internal-flag)
2144    "Delete MESSAGE from SEQUENCE.    "Delete MSG-OR-SEQ from SEQUENCE.
2145  MESSAGE defaults to displayed message. From Lisp, optional third arg  Default value of MSG-OR-SEQ is the displayed message.
2146  INTERNAL-FLAG non-nil means do not inform MH of the change."  If optional prefix argument is provided, then prompt for the message sequence.
2147    (interactive (list (mh-get-msg-num t)  If variable `transient-mark-mode' is non-nil and the mark is active, then the
2148    selected region is deleted from SEQUENCE..
2149    In a program, MSG-OR-SEQ can be a message number, a list of message numbers, a
2150    region in a cons cell, or a sequence; optional third arg INTERNAL-FLAG non-nil
2151    means do not inform MH of the change."
2152      (interactive (list (mh-interactive-msg-or-seq "Delete")
2153                       (mh-read-seq-default "Delete from" t)                       (mh-read-seq-default "Delete from" t)
2154                       nil))                       nil))
2155    (let ((entry (mh-find-seq sequence)))    (let ((entry (mh-find-seq sequence)))
2156      (cond (entry      (when entry
2157             (mh-notate-if-in-one-seq message ?  (1+ mh-cmd-note) sequence)        (mh-iterate-on-msg-or-seq msg msg-or-seq
2158             (if (not internal-flag)          (when (memq msg (mh-seq-msgs entry))
2159                 (mh-undefine-sequence sequence (list message)))            (mh-notate nil ?  (1+ mh-cmd-note)))
2160             (setcdr entry (delq message (mh-seq-msgs entry)))))))          (mh-delete-a-msg-from-seq msg sequence internal-flag)
2161            (mh-clear-text-properties nil))
2162          (mh-notate-user-sequences msg-or-seq)
2163          (when (and (eq sequence mh-unseen-seq) (mh-speed-flists-active-p))
2164            (mh-speed-flists t mh-current-folder)))))
2165    
2166    (defun mh-delete-a-msg-from-seq (msg sequence internal-flag)
2167      "Delete MSG from SEQUENCE.
2168    If INTERNAL-FLAG is non-nil, then do not inform MH of the change."
2169      (let ((entry (mh-find-seq sequence)))
2170        (when (and entry (memq msg (mh-seq-msgs entry)))
2171          (if (not internal-flag)
2172              (mh-undefine-sequence sequence (list msg)))
2173          (setcdr entry (delq msg (mh-seq-msgs entry))))))
2174    
2175    (defun mh-clear-text-properties (message)
2176      "Clear all text properties (except mh-tick) from the scan line for MESSAGE."
2177      (save-excursion
2178        (with-mh-folder-updating (t)
2179          (when (or (not message) (mh-goto-msg message t t))
2180            (beginning-of-line)
2181            (let ((tick-property (get-text-property (point) 'mh-tick)))
2182              (set-text-properties (point) (line-end-position) nil)
2183              (when tick-property
2184                (add-text-properties (point) (line-end-position)
2185                                     `(mh-tick ,tick-property))))))))
2186    
2187  (defun mh-undefine-sequence (seq msgs)  (defun mh-undefine-sequence (seq msgs)
2188    "Remove from the SEQ the list of MSGS."    "Remove from the SEQ the list of MSGS."
2189    (mh-exec-cmd "mark" mh-current-folder "-delete"    (prog1 (mh-exec-cmd "mark" mh-current-folder "-delete"
2190                 "-sequence" (symbol-name seq)                        "-sequence" (symbol-name seq)
2191                 (mh-coalesce-msg-list msgs)))                        (mh-coalesce-msg-list msgs))
2192        (when (and (eq seq mh-unseen-seq) (mh-speed-flists-active-p))
2193          (mh-speed-flists t mh-current-folder))))
2194    
2195  (defun mh-define-sequence (seq msgs)  (defun mh-define-sequence (seq msgs)
2196    "Define the SEQ to contain the list of MSGS.    "Define the SEQ to contain the list of MSGS.
# Line 2181  range." Line 2275  range."
2275  (gnus-define-keys  mh-folder-mode-map  (gnus-define-keys  mh-folder-mode-map
2276    " "           mh-page-msg    " "           mh-page-msg
2277    "!"           mh-refile-or-write-again    "!"           mh-refile-or-write-again
2278      "'"           mh-toggle-tick
2279    ","           mh-header-display    ","           mh-header-display
2280    "."           mh-alt-show    "."           mh-alt-show
2281    ">"           mh-write-msg-to-file    ">"           mh-write-msg-to-file
# Line 2227  range." Line 2322  range."
2322    "i"           mh-index-search    "i"           mh-index-search
2323    "k"           mh-kill-folder    "k"           mh-kill-folder
2324    "l"           mh-list-folders    "l"           mh-list-folders
2325      "n"           mh-index-new-messages
2326    "o"           mh-alt-visit-folder    "o"           mh-alt-visit-folder
2327    "p"           mh-pack-folder    "p"           mh-pack-folder
2328    "r"           mh-rescan-folder    "r"           mh-rescan-folder
# Line 2234  range." Line 2330  range."
2330    "u"           mh-undo-folder    "u"           mh-undo-folder
2331    "v"           mh-visit-folder)    "v"           mh-visit-folder)
2332    
2333    (define-key mh-folder-mode-map "I" mh-inc-spool-map)
2334    
2335    (gnus-define-keys (mh-junk-map "J" mh-folder-mode-map)
2336      "?"           mh-prefix-help
2337      "b"           mh-junk-blacklist
2338      "w"           mh-junk-whitelist)
2339    
2340  (gnus-define-keys (mh-sequence-map "S" mh-folder-mode-map)  (gnus-define-keys (mh-sequence-map "S" mh-folder-mode-map)
2341    "?"           mh-prefix-help    "?"           mh-prefix-help
2342    "d"           mh-delete-msg-from-seq    "d"           mh-delete-msg-from-seq
# Line 2254  range." Line 2357  range."
2357    "o"           mh-thread-refile)    "o"           mh-thread-refile)
2358    
2359  (gnus-define-keys (mh-limit-map "/" mh-folder-mode-map)  (gnus-define-keys (mh-limit-map "/" mh-folder-mode-map)
2360      "'"           mh-narrow-to-tick
2361    "?"           mh-prefix-help    "?"           mh-prefix-help
2362    "s"           mh-narrow-to-subject    "s"           mh-narrow-to-subject
2363    "w"           mh-widen)    "w"           mh-widen)
# Line 2304  range." Line 2408  range."
2408    '((nil "[i]nc, [.]show, [,]show all, [n]ext, [p]revious,\n"    '((nil "[i]nc, [.]show, [,]show all, [n]ext, [p]revious,\n"
2409           "[d]elete, [o]refile, e[x]ecute,\n"           "[d]elete, [o]refile, e[x]ecute,\n"
2410           "[s]end, [r]eply.\n"           "[s]end, [r]eply.\n"
2411           "Prefix characters:\n [F]older, [S]equence, MIME [K]eys, "           "Prefix characters:\n [F]older, [S]equence, [J]unk, MIME [K]eys,"
2412           "[T]hread, / Limit, e[X]tract, [D]igest.")           "\n [T]hread, / Limit, e[X]tract, [D]igest, [I]nc spools.")
2413    
2414      (?F "[l]ist, [v]isit folder;\n"      (?F "[l]ist, [v]isit folder;\n"
2415          "[t]hread; [s]earch; [i]ndexed search;\n"          "[t]hread; [s]earch; [i]ndexed search;\n"
# Line 2318  range." Line 2422  range."
2422      (?X "un[s]har, [u]udecode message")      (?X "un[s]har, [u]udecode message")
2423      (?D "[b]urst digest")      (?D "[b]urst digest")
2424      (?K "[v]iew, [i]nline, [o]utput/save MIME part; save [a]ll parts; \n"      (?K "[v]iew, [i]nline, [o]utput/save MIME part; save [a]ll parts; \n"
2425          "[TAB] next; [SHIFT-TAB] previous"))          "[TAB] next; [SHIFT-TAB] previous")
2426        (?J "[b]lacklist, [w]hitelist message"))
2427    "Key binding cheat sheet.    "Key binding cheat sheet.
2428    
2429  This is an associative array which is used to show the most common commands.  This is an associative array which is used to show the most common commands.

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.3

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26