*** /disk/07/darrylo/emacs-18.57/lisp/mh-e.el	Wed Jan  9 14:02:07 1991
--- mh-e.el	Thu May 23 20:29:24 1991
***************
*** 47,53
  ;;;(defvar mh-lib "/usr/new/lib/mh/" "Directory of MH library.")
  
  (defvar mh-redist-full-contents t
!   "Non-nil if the `dist' command needs whole letter for redistribution.
  This is the case when `send' is compiled with the BERK option.")
  
  

--- 47,53 -----
  ;;;(defvar mh-lib "/usr/new/lib/mh/" "Directory of MH library.")
  
  (defvar mh-redist-full-contents t
!   "*Non-nil if the `dist' command needs whole letter for redistribution.
  This is the case when `send' is compiled with the BERK option.")
  
  
***************
*** 153,158
  (defvar mh-recursive-folders nil
    "*If non-nil, then commands which operate on folders do so recursively.")
  
  
  ;;; Parameterize mh-e to work with different scan formats.  The defaults work
  ;;; the standard MH scan listings.

--- 153,162 -----
  (defvar mh-recursive-folders nil
    "*If non-nil, then commands which operate on folders do so recursively.")
  
+ (defvar mh-add-md4-signature nil
+   "*Controls the addition of MD4 signatures to the outgoing message header.
+ If non-nil, a valid \"X-Md4-Signature:\" header line is added to outgoing
+ mail messages.")
  
  ;;; Variables used when mh-add-md4-signature is non-nil:
  
***************
*** 154,159
    "*If non-nil, then commands which operate on folders do so recursively.")
  
  
  ;;; Parameterize mh-e to work with different scan formats.  The defaults work
  ;;; the standard MH scan listings.
  

--- 158,181 -----
  If non-nil, a valid \"X-Md4-Signature:\" header line is added to outgoing
  mail messages.")
  
+ ;;; Variables used when mh-add-md4-signature is non-nil:
+ 
+ (defvar mh-md4-program "md4"
+   "The MD4 program.
+ Text piped to stdin should produce an MD4 signature on stdout.")
+ 
+ (defvar mh-checkmd4-program "checkmd4"
+   "The MD4 program that checks a message for a valid MD4 signature.
+ This program should write a descriptive string to stdout saying whether or
+ not the message, piped to stdin, matches the MD4 signature in the message
+ header.")
+ 
+ (defvar mh-checkmd4-valid-string "Valid."
+   "The string printed by the mh-checkmd4-program if the signature is valid.
+ This string is considered to be anchored to the beginning of the first line
+ printed by the mh-checkmd4-program.")
+ 
+ 
  ;;; Parameterize mh-e to work with different scan formats.  The defaults work
  ;;; the standard MH scan listings.
  
***************
*** 547,552
      (if (not maildrop-name)
  	(cond ((not (get-buffer "+inbox"))
  	       (mh-make-folder "+inbox")
  	       (setq mh-previous-window-config config))
  	      ((not (eq (current-buffer) (get-buffer "+inbox")))
  	       (switch-to-buffer "+inbox")

--- 569,575 -----
      (if (not maildrop-name)
  	(cond ((not (get-buffer "+inbox"))
  	       (mh-make-folder "+inbox")
+ 	       (delete-other-windows)
  	       (setq mh-previous-window-config config))
  	      ((not (eq (current-buffer) (get-buffer "+inbox")))
  	       (switch-to-buffer "+inbox")
***************
*** 550,555
  	       (setq mh-previous-window-config config))
  	      ((not (eq (current-buffer) (get-buffer "+inbox")))
  	       (switch-to-buffer "+inbox")
  	       (setq mh-previous-window-config config)))))
    (mh-get-new-mail maildrop-name)
    (run-hooks 'mh-inc-folder-hook))

--- 573,579 -----
  	       (setq mh-previous-window-config config))
  	      ((not (eq (current-buffer) (get-buffer "+inbox")))
  	       (switch-to-buffer "+inbox")
+ 	       (delete-other-windows)
  	       (setq mh-previous-window-config config)))))
    (mh-get-new-mail maildrop-name)
    (run-hooks 'mh-inc-folder-hook))
***************
*** 760,765
    "Restore the previous window configuration, if one exists.
  Finish by running mh-quit-hook."
    (interactive)
    (if mh-previous-window-config
        (set-window-configuration mh-previous-window-config))
    (run-hooks 'mh-quit-hook))

--- 784,793 -----
    "Restore the previous window configuration, if one exists.
  Finish by running mh-quit-hook."
    (interactive)
+   (if mh-current-folder
+       (bury-buffer mh-current-folder))
+   (if mh-show-buffer
+       (bury-buffer mh-show-buffer))
    (if mh-previous-window-config
        (set-window-configuration mh-previous-window-config))
    (run-hooks 'mh-quit-hook))
***************
*** 904,910
  			 (mh-read-msg-range "Range to scan [all]? ")
  			 nil)))
    (setq mh-next-direction 'forward)
!   (mh-scan-folder mh-current-folder (or range "all")))
  
  
  (defun mh-redistribute (to cc msg)

--- 932,940 -----
  			 (mh-read-msg-range "Range to scan [all]? ")
  			 nil)))
    (setq mh-next-direction 'forward)
!   (mh-scan-folder mh-current-folder (if (string= range "")
! 					"all"
! 				      range)))
  
  
  (defun mh-redistribute (to cc msg)
***************
*** 1029,1035
        (setq msg (mh-get-msg-num t)))
    (setq mh-showing t)
    (mh-set-mode-name "mh-e show")
!   (if (not (eql (next-window (minibuffer-window)) (selected-window)))
        (delete-other-windows))		; force ourself to the top window
    (let ((folder mh-current-folder))
      (mh-show-message-in-other-window)

--- 1059,1065 -----
        (setq msg (mh-get-msg-num t)))
    (setq mh-showing t)
    (mh-set-mode-name "mh-e show")
!   (if (not (eql (minibuffer-window) (selected-window)))
        (delete-other-windows))		; force ourself to the top window
    (let ((folder mh-current-folder))
      (mh-show-message-in-other-window)
***************
*** 1121,1127
    (interactive (list (mh-prompt-for-folder "Visit" "+inbox" t)
  		     (mh-read-msg-range "Range [all]? ")))
    (let ((config (current-window-configuration)))
!     (mh-scan-folder folder (or range "all"))
      (setq mh-previous-window-config config)))
  
  

--- 1151,1159 -----
    (interactive (list (mh-prompt-for-folder "Visit" "+inbox" t)
  		     (mh-read-msg-range "Range [all]? ")))
    (let ((config (current-window-configuration)))
!     (mh-scan-folder folder (if (string= range "")
! 			       "all"
! 			     range))
      (setq mh-previous-window-config config)))
  
  
***************
*** 1493,1499
  
  (defun mh-regenerate-headers (range)
    ;; Replace buffer with scan of its contents over range RANGE.
!   (let ((folder mh-current-folder))
      (message "Scanning %s..." folder)
      (with-mh-folder-updating (nil)
        (erase-buffer)

--- 1525,1536 -----
  
  (defun mh-regenerate-headers (range)
    ;; Replace buffer with scan of its contents over range RANGE.
!   (let ((folder mh-current-folder)
! 	real-folder
! 	index-cache-dir
! 	index-cache
! 	(downcase-range (downcase range))
! 	)
      (message "Scanning %s..." folder)
      (setq real-folder (substring folder 1))
      (setq index-cache-dir (concat mh-user-path real-folder))
***************
*** 1495,1500
    ;; Replace buffer with scan of its contents over range RANGE.
    (let ((folder mh-current-folder))
      (message "Scanning %s..." folder)
      (with-mh-folder-updating (nil)
        (erase-buffer)
        (mh-exec-cmd-output "scan" nil

--- 1532,1540 -----
  	(downcase-range (downcase range))
  	)
      (message "Scanning %s..." folder)
+     (setq real-folder (substring folder 1))
+     (setq index-cache-dir (concat mh-user-path real-folder))
+     (setq index-cache (concat mh-user-path real-folder "/.mh-e-index"))
      (with-mh-folder-updating (nil)
        (erase-buffer)
        (setq truncate-lines t)
***************
*** 1497,1506
      (message "Scanning %s..." folder)
      (with-mh-folder-updating (nil)
        (erase-buffer)
!       (mh-exec-cmd-output "scan" nil
! 			  "-noclear" "-noheader"
! 			  "-width" (window-width)
! 			  folder range)
        (goto-char (point-min))
        (cond ((looking-at "scan: no messages in")
  	     (keep-lines mh-valid-scan-line)) ; Flush random scan lines

--- 1537,1564 -----
      (setq index-cache (concat mh-user-path real-folder "/.mh-e-index"))
      (with-mh-folder-updating (nil)
        (erase-buffer)
!       (setq truncate-lines t)
!       (if (or (not (string= downcase-range "all"))
! 	      (not (file-exists-p index-cache))
! 	      (file-newer-than-file-p index-cache-dir index-cache)
! 	      )
! 	  (progn
! 	    (mh-exec-cmd-output "scan" nil
! 				"-noclear" "-noheader"
! 				"-width" (window-width)
! 				folder range)
! 	    (if (and (file-writable-p index-cache)
! 		     (string= downcase-range "all")
! 		     )
! 		(progn
! 		  (write-region (point-min) (point-max) index-cache)
! 		  )
! 	      )
! 	    )
! 	(progn
! 	  (insert-file index-cache)
! 	  )
! 	)
        (goto-char (point-min))
        (cond ((looking-at "scan: no messages in")
  	     (keep-lines mh-valid-scan-line)) ; Flush random scan lines
***************
*** 1786,1791
        (< cur-point (point)))))
  
  
  (defun mh-to-field ()
    "Move point to the end of a specified header field.
  The field is indicated by the previous keystroke.  Create the field if

--- 1844,1860 -----
        (< cur-point (point)))))
  
  
+ (defun mh-insert-header-line (line)
+   "Move to the header, and insert the text given by LINE.
+ This function assumes that a similar header line does not already exist."
+   (let ()
+     (goto-char (dot-min))
+     (re-search-forward "\\(^--------\\)\\|\\(^$\\)")
+     (beginning-of-line 1)
+     (insert line)
+     ))
+ 
+ 
  (defun mh-to-field ()
    "Move point to the end of a specified header field.
  The field is indicated by the previous keystroke.  Create the field if
***************
*** 1976,1981
  Run mh-before-send-letter-hook before doing anything."
    (interactive "P")
    (run-hooks 'mh-before-send-letter-hook)
    (set-buffer-modified-p t)		; Make sure buffer is written
    (save-buffer)
    (message "Sending...")

--- 2045,2052 -----
  Run mh-before-send-letter-hook before doing anything."
    (interactive "P")
    (run-hooks 'mh-before-send-letter-hook)
+   (if mh-add-md4-signature
+       (mh-add-md4-header))
    (set-buffer-modified-p t)		; Make sure buffer is written
    (save-buffer)
    (message "Sending...")
***************
*** 2017,2022
      (message "Sending...done")))
  
  
  (defun mh-insert-letter (prefix-provided folder msg)
    "Insert a message from any folder into the current letter.
  Removes the message's headers using mh-invisible-headers.

--- 2088,2095 -----
      (message "Sending...done")))
  
  
+ ;; mod 22-Sep-1989 mdb:: mdb@ESD.3Com.COM, {3comvax,auspex,sun}!bridge2!mdb
+ ;; modified to conditionally use mhl instead of always using it.
  (defun mh-insert-letter (prefix-provided folder msg)
    "Insert a message from any folder into the current letter.
  Removes the message's headers using mh-invisible-headers.
***************
*** 2406,2411
      (yank)
      (goto-char beginning-of-line)))
  
  
  
  ;;; Issue commands to MH.

--- 2479,2535 -----
      (yank)
      (goto-char beginning-of-line)))
  
+ 
+ (defun mh-insert-sequence-list (seq)
+   "Format and insert, into the current buf, a description of the sequence SEQ."
+   (let ( (name (car seq))
+ 	 (s (sort (copy-sequence (cdr seq)) '<))
+ 	 (last-col 76)
+ 	 name-spec
+ 	 )
+     (insert (setq name-spec (format "%20s:" name)))
+     (while s
+       (if (> (current-column) last-col)
+ 	  (progn
+ 	    (insert "\n")
+ 	    (move-to-column (length name-spec))
+ 	    )
+ 	)
+       (insert (format " %s" (car s)))
+       (setq s (cdr s))
+       )
+     (insert "\n")
+     )
+   )
+ 
+ 
+ (defun mh-list-sequences (folder)
+   "List the sequences defined in FOLDER."
+   (interactive (list (mh-prompt-for-folder "List sequences in"
+ 					   mh-current-folder t)))
+   (let ( (temp-buffer " *mh-temp*")
+ 	 (l mh-seq-list)
+ 	 )
+     (with-output-to-temp-buffer temp-buffer
+       (save-excursion
+ 	(set-buffer temp-buffer)
+ 	(setq buffer-read-only nil)
+ 	(erase-buffer)
+ 	(message "Listing sequences ...")
+ 
+ 	(insert "Sequences in folder " folder ":\n\n")
+ 	(while l
+ 	  (mh-insert-sequence-list (car l))
+ 	  (setq l (cdr l))
+ 	  )
+ 
+ 	(goto-char (point-min))
+ 	(message "Listing sequences...done")
+ 	)
+       )
+     )
+   )
+ 
  
  
  ;;; Issue commands to MH.
***************
*** 2589,2594
  	(delq (assoc folder mh-folder-list) mh-folder-list)))
  
  
  (defun mh-read-msg-range (prompt)
    ;; Read a list of blank-separated items.
    (let* ((buf (read-string prompt))

--- 2713,2737 -----
  	(delq (assoc folder mh-folder-list) mh-folder-list)))
  
  
+ (defun mh-drop-spaces (str)
+   "Return a copy of STR, with leading and trailing spaces removed."
+   (let (loc)
+     (if (string-match "^[ \t]+" str)
+ 	(setq str (substring str (match-end 0)))
+       )
+     (if (string-match "[ \t]+$" str)
+ 	(progn
+ 	  (setq loc (match-beginning 0))
+ 	  (if (> loc 0)
+ 	      (setq loc (1- loc))
+ 	    )
+ 	  (setq str (substring str 0 loc))
+ 	  )
+       )
+     str
+     )
+   )
+ 
  (defun mh-read-msg-range (prompt)
    ;; Read a list of blank-separated items.
    (let* ((buf (read-string prompt))
***************
*** 2594,2605
    (let* ((buf (read-string prompt))
  	 (buf-size (length buf))
  	 (start 0)
! 	 (input ()))
!     (while (< start buf-size)
!       (let ((next (read-from-string buf start buf-size)))
! 	(mh-push (car next) input)
! 	(setq start (cdr next))))
!     (nreverse input)))
  
  
  

--- 2737,2764 -----
    (let* ((buf (read-string prompt))
  	 (buf-size (length buf))
  	 (start 0)
! 	 (input ""))
!     (while (> (length buf) 0)
!       (if (string-match "\\([^, \t]*\\)\\([, \t]*\\)" buf)
! 	  (progn
! 	    (if (/= (match-beginning 1) (match-end 1))
! 		(setq input (concat input " "
! 				    (substring buf
! 					       (match-beginning 1)
! 					       (match-end 1))))
! 	      )
! 	    )
! 	(error "Error in mh-read-msg-range")
! 	)
!       (setq buf (substring buf (match-end 2)))
!       )
!     (setq input (mh-drop-spaces input))
!     (if (string= input "")
! 	(setq input "all")
!       )
!     input
!     )
!   )
  
  
  
***************
*** 2736,2741
  
  
  
  ;;; Build the folder-mode keymap:
  
  (suppress-keymap mh-folder-mode-map)

--- 2895,2967 -----
  
  
  
+ (defun mh-add-md4-header ()
+   "Insert an \"X-Md4-Signature:\" line into the header."
+   (let (
+ 	(outbuf " *md4*")
+ 	checksum
+ 	)
+     (save-excursion
+       (set-buffer (get-buffer-create outbuf))
+       (kill-region (point-max) (point-min)))
+     (save-excursion
+       (goto-char (point-min))
+       (if (re-search-forward "^--------" nil t)
+ 	  (progn
+ 	    (forward-line 1)
+ 	    (call-process-region (point) (point-max) mh-md4-program nil outbuf)
+ 	    (save-excursion
+ 	      (set-buffer outbuf)
+ 	      (goto-char (point-min))
+ 	      (end-of-line)
+ 	      (setq checksum (buffer-substring (point-min) (point)))
+ 	      )
+ 	    (mh-insert-header-line (format "X-Md4-Signature: %s\n" checksum))
+ 	    )
+ 	)
+       )
+     ))
+ 
+ (defun mh-check-md4-signature ()
+   "If an MD4 signature is present in the header, check it and report the results."
+   (interactive)
+   (let (start end checksum (outbuf " *md4*"))
+     (mh-show nil)		;;; force showing of current message
+     (save-excursion
+       (set-buffer mh-show-buffer)
+       (goto-char (point-min))
+       (if (re-search-forward "\\(^$\\)\\|\\(^--------\\)" nil t)
+ 	  (progn
+ 	    (setq end (point))
+ 	    (goto-char (point-min))
+ 	    (if (re-search-forward "^X-Md4-Signature:[ \t]*" end t)
+ 		(progn
+ 		  (save-excursion
+ 		    (set-buffer (get-buffer-create outbuf))
+ 		    (kill-region (point-max) (point-min)))
+ 		  (call-process-region (point-min) (point-max)
+ 				       mh-checkmd4-program nil outbuf)
+ 		  (set-buffer outbuf)
+ 		  (goto-char (point-min))
+ 		  (if (looking-at mh-checkmd4-valid-string)
+ 		      (message "Message is uncorrupted (MD4 signature is OK).")
+ 		    (error "MD4 signature does not match -- possible message corruption!"))
+ 		  )
+ 	      (progn
+ 		(error "This message has no MD4 signature!")
+ 		)
+ 	      )
+ 	    )
+ 	(progn
+ 	  (error "Unable to find end of message header!")
+ 	  )
+ 	)
+       )
+     )
+   )
+ 
+ 
+ 
  ;;; Build the folder-mode keymap:
  
  (suppress-keymap mh-folder-mode-map)
***************
*** 2739,2747
  ;;; Build the folder-mode keymap:
  
  (suppress-keymap mh-folder-mode-map)
! (define-key mh-folder-mode-map "q" 'mh-quit)
! (define-key mh-folder-mode-map "b" 'mh-quit)
! (define-key mh-folder-mode-map "?" 'mh-msg-is-in-seq)
  (define-key mh-folder-mode-map "%" 'mh-put-msg-in-seq)
  (define-key mh-folder-mode-map "|" 'mh-pipe-msg)
  (define-key mh-folder-mode-map "\ea" 'mh-edit-again)

--- 2965,2972 -----
  ;;; Build the folder-mode keymap:
  
  (suppress-keymap mh-folder-mode-map)
! (define-key mh-folder-mode-map " " 'mh-page-msg)
! (define-key mh-folder-mode-map "!" 'mh-refile-or-write-again)
  (define-key mh-folder-mode-map "%" 'mh-put-msg-in-seq)
  (define-key mh-folder-mode-map "." 'mh-show)
  (define-key mh-folder-mode-map ">" 'mh-write-msg-to-file)
***************
*** 2743,2751
  (define-key mh-folder-mode-map "b" 'mh-quit)
  (define-key mh-folder-mode-map "?" 'mh-msg-is-in-seq)
  (define-key mh-folder-mode-map "%" 'mh-put-msg-in-seq)
! (define-key mh-folder-mode-map "|" 'mh-pipe-msg)
! (define-key mh-folder-mode-map "\ea" 'mh-edit-again)
! (define-key mh-folder-mode-map "\e%" 'mh-delete-msg-from-seq)
  (define-key mh-folder-mode-map "\C-xn" 'mh-narrow-to-seq)
  (define-key mh-folder-mode-map "\C-xw" 'mh-widen)
  (define-key mh-folder-mode-map "\eb" 'mh-burst-digest)

--- 2968,2978 -----
  (define-key mh-folder-mode-map " " 'mh-page-msg)
  (define-key mh-folder-mode-map "!" 'mh-refile-or-write-again)
  (define-key mh-folder-mode-map "%" 'mh-put-msg-in-seq)
! (define-key mh-folder-mode-map "." 'mh-show)
! (define-key mh-folder-mode-map ">" 'mh-write-msg-to-file)
! (define-key mh-folder-mode-map "?" 'mh-msg-is-in-seq)
! (define-key mh-folder-mode-map "\177" 'mh-previous-page)
! (define-key mh-folder-mode-map "\C-d" 'mh-delete-msg-no-motion)
  (define-key mh-folder-mode-map "\C-xn" 'mh-narrow-to-seq)
  (define-key mh-folder-mode-map "\C-xw" 'mh-widen)
  (define-key mh-folder-mode-map "\e " 'mh-page-digest)
***************
*** 2748,2755
  (define-key mh-folder-mode-map "\e%" 'mh-delete-msg-from-seq)
  (define-key mh-folder-mode-map "\C-xn" 'mh-narrow-to-seq)
  (define-key mh-folder-mode-map "\C-xw" 'mh-widen)
- (define-key mh-folder-mode-map "\eb" 'mh-burst-digest)
- (define-key mh-folder-mode-map "\eu" 'mh-undo-folder)
  (define-key mh-folder-mode-map "\e " 'mh-page-digest)
  (define-key mh-folder-mode-map "\e\177" 'mh-page-digest-backwards)
  (define-key mh-folder-mode-map "\ee" 'mh-extract-rejected-mail)

--- 2975,2980 -----
  (define-key mh-folder-mode-map "\C-d" 'mh-delete-msg-no-motion)
  (define-key mh-folder-mode-map "\C-xn" 'mh-narrow-to-seq)
  (define-key mh-folder-mode-map "\C-xw" 'mh-widen)
  (define-key mh-folder-mode-map "\e " 'mh-page-digest)
  (define-key mh-folder-mode-map "\e%" 'mh-delete-msg-from-seq)
  (define-key mh-folder-mode-map "\e\177" 'mh-page-digest-backwards)
***************
*** 2751,2756
  (define-key mh-folder-mode-map "\eb" 'mh-burst-digest)
  (define-key mh-folder-mode-map "\eu" 'mh-undo-folder)
  (define-key mh-folder-mode-map "\e " 'mh-page-digest)
  (define-key mh-folder-mode-map "\e\177" 'mh-page-digest-backwards)
  (define-key mh-folder-mode-map "\ee" 'mh-extract-rejected-mail)
  (define-key mh-folder-mode-map "\ef" 'mh-visit-folder)

--- 2976,2982 -----
  (define-key mh-folder-mode-map "\C-xn" 'mh-narrow-to-seq)
  (define-key mh-folder-mode-map "\C-xw" 'mh-widen)
  (define-key mh-folder-mode-map "\e " 'mh-page-digest)
+ (define-key mh-folder-mode-map "\e%" 'mh-delete-msg-from-seq)
  (define-key mh-folder-mode-map "\e\177" 'mh-page-digest-backwards)
  (define-key mh-folder-mode-map "\ea" 'mh-edit-again)
  (define-key mh-folder-mode-map "\eb" 'mh-burst-digest)
***************
*** 2752,2757
  (define-key mh-folder-mode-map "\eu" 'mh-undo-folder)
  (define-key mh-folder-mode-map "\e " 'mh-page-digest)
  (define-key mh-folder-mode-map "\e\177" 'mh-page-digest-backwards)
  (define-key mh-folder-mode-map "\ee" 'mh-extract-rejected-mail)
  (define-key mh-folder-mode-map "\ef" 'mh-visit-folder)
  (define-key mh-folder-mode-map "\ek" 'mh-kill-folder)

--- 2978,2985 -----
  (define-key mh-folder-mode-map "\e " 'mh-page-digest)
  (define-key mh-folder-mode-map "\e%" 'mh-delete-msg-from-seq)
  (define-key mh-folder-mode-map "\e\177" 'mh-page-digest-backwards)
+ (define-key mh-folder-mode-map "\ea" 'mh-edit-again)
+ (define-key mh-folder-mode-map "\eb" 'mh-burst-digest)
  (define-key mh-folder-mode-map "\ee" 'mh-extract-rejected-mail)
  (define-key mh-folder-mode-map "\ef" 'mh-visit-folder)
  (define-key mh-folder-mode-map "\ek" 'mh-kill-folder)
***************
*** 2758,2764
  (define-key mh-folder-mode-map "\el" 'mh-list-folders)
  (define-key mh-folder-mode-map "\eo" 'mh-write-msg-to-file)
  (define-key mh-folder-mode-map "\ep" 'mh-pack-folder)
! (define-key mh-folder-mode-map "\es" 'mh-search-folder)
  (define-key mh-folder-mode-map "\er" 'mh-rescan-folder)
  (define-key mh-folder-mode-map "l" 'mh-print-msg)
  (define-key mh-folder-mode-map "t" 'mh-toggle-showing)

--- 2986,2992 -----
  (define-key mh-folder-mode-map "\el" 'mh-list-folders)
  (define-key mh-folder-mode-map "\eo" 'mh-write-msg-to-file)
  (define-key mh-folder-mode-map "\ep" 'mh-pack-folder)
! (define-key mh-folder-mode-map "\eq" 'mh-list-sequences)
  (define-key mh-folder-mode-map "\er" 'mh-rescan-folder)
  (define-key mh-folder-mode-map "\es" 'mh-search-folder)
  (define-key mh-folder-mode-map "\et" 'mh-sort-folder)
***************
*** 2760,2767
  (define-key mh-folder-mode-map "\ep" 'mh-pack-folder)
  (define-key mh-folder-mode-map "\es" 'mh-search-folder)
  (define-key mh-folder-mode-map "\er" 'mh-rescan-folder)
! (define-key mh-folder-mode-map "l" 'mh-print-msg)
! (define-key mh-folder-mode-map "t" 'mh-toggle-showing)
  (define-key mh-folder-mode-map "c" 'mh-copy-msg)
  (define-key mh-folder-mode-map ">" 'mh-write-msg-to-file)
  (define-key mh-folder-mode-map "i" 'mh-inc-folder)

--- 2988,2999 -----
  (define-key mh-folder-mode-map "\ep" 'mh-pack-folder)
  (define-key mh-folder-mode-map "\eq" 'mh-list-sequences)
  (define-key mh-folder-mode-map "\er" 'mh-rescan-folder)
! (define-key mh-folder-mode-map "\es" 'mh-search-folder)
! (define-key mh-folder-mode-map "\et" 'mh-sort-folder)
! (define-key mh-folder-mode-map "\eu" 'mh-undo-folder)
! (define-key mh-folder-mode-map "^" 'mh-refile-msg)
! (define-key mh-folder-mode-map "a" 'mh-reply)
! (define-key mh-folder-mode-map "b" 'mh-quit)
  (define-key mh-folder-mode-map "c" 'mh-copy-msg)
  (define-key mh-folder-mode-map "d" 'mh-delete-msg)
  (define-key mh-folder-mode-map "e" 'mh-execute-commands)
***************
*** 2763,2771
  (define-key mh-folder-mode-map "l" 'mh-print-msg)
  (define-key mh-folder-mode-map "t" 'mh-toggle-showing)
  (define-key mh-folder-mode-map "c" 'mh-copy-msg)
! (define-key mh-folder-mode-map ">" 'mh-write-msg-to-file)
! (define-key mh-folder-mode-map "i" 'mh-inc-folder)
! (define-key mh-folder-mode-map "x" 'mh-execute-commands)
  (define-key mh-folder-mode-map "e" 'mh-execute-commands)
  (define-key mh-folder-mode-map "r" 'mh-redistribute)
  (define-key mh-folder-mode-map "f" 'mh-forward)

--- 2995,3001 -----
  (define-key mh-folder-mode-map "a" 'mh-reply)
  (define-key mh-folder-mode-map "b" 'mh-quit)
  (define-key mh-folder-mode-map "c" 'mh-copy-msg)
! (define-key mh-folder-mode-map "d" 'mh-delete-msg)
  (define-key mh-folder-mode-map "e" 'mh-execute-commands)
  (define-key mh-folder-mode-map "f" 'mh-forward)
  (define-key mh-folder-mode-map "g" 'mh-goto-msg)
***************
*** 2767,2773
  (define-key mh-folder-mode-map "i" 'mh-inc-folder)
  (define-key mh-folder-mode-map "x" 'mh-execute-commands)
  (define-key mh-folder-mode-map "e" 'mh-execute-commands)
- (define-key mh-folder-mode-map "r" 'mh-redistribute)
  (define-key mh-folder-mode-map "f" 'mh-forward)
  (define-key mh-folder-mode-map "s" 'mh-send)
  (define-key mh-folder-mode-map "m" 'mh-send)

--- 2997,3002 -----
  (define-key mh-folder-mode-map "c" 'mh-copy-msg)
  (define-key mh-folder-mode-map "d" 'mh-delete-msg)
  (define-key mh-folder-mode-map "e" 'mh-execute-commands)
  (define-key mh-folder-mode-map "f" 'mh-forward)
  (define-key mh-folder-mode-map "g" 'mh-goto-msg)
  (define-key mh-folder-mode-map "i" 'mh-inc-folder)
***************
*** 2769,2778
  (define-key mh-folder-mode-map "e" 'mh-execute-commands)
  (define-key mh-folder-mode-map "r" 'mh-redistribute)
  (define-key mh-folder-mode-map "f" 'mh-forward)
- (define-key mh-folder-mode-map "s" 'mh-send)
- (define-key mh-folder-mode-map "m" 'mh-send)
- (define-key mh-folder-mode-map "a" 'mh-reply)
- (define-key mh-folder-mode-map "j" 'mh-goto-msg)
  (define-key mh-folder-mode-map "g" 'mh-goto-msg)
  (define-key mh-folder-mode-map "\177" 'mh-previous-page)
  (define-key mh-folder-mode-map " " 'mh-page-msg)

--- 2998,3003 -----
  (define-key mh-folder-mode-map "d" 'mh-delete-msg)
  (define-key mh-folder-mode-map "e" 'mh-execute-commands)
  (define-key mh-folder-mode-map "f" 'mh-forward)
  (define-key mh-folder-mode-map "g" 'mh-goto-msg)
  (define-key mh-folder-mode-map "i" 'mh-inc-folder)
  (define-key mh-folder-mode-map "j" 'mh-goto-msg)
***************
*** 2774,2788
  (define-key mh-folder-mode-map "a" 'mh-reply)
  (define-key mh-folder-mode-map "j" 'mh-goto-msg)
  (define-key mh-folder-mode-map "g" 'mh-goto-msg)
! (define-key mh-folder-mode-map "\177" 'mh-previous-page)
! (define-key mh-folder-mode-map " " 'mh-page-msg)
! (define-key mh-folder-mode-map "." 'mh-show)
! (define-key mh-folder-mode-map "u" 'mh-undo)
! (define-key mh-folder-mode-map "!" 'mh-refile-or-write-again)
! (define-key mh-folder-mode-map "^" 'mh-refile-msg)
! (define-key mh-folder-mode-map "d" 'mh-delete-msg)
! (define-key mh-folder-mode-map "\C-d" 'mh-delete-msg-no-motion)
! (define-key mh-folder-mode-map "p" 'mh-previous-undeleted-msg)
  (define-key mh-folder-mode-map "n" 'mh-next-undeleted-msg)
  (define-key mh-folder-mode-map "o" 'mh-refile-msg)
  

--- 2999,3008 -----
  (define-key mh-folder-mode-map "e" 'mh-execute-commands)
  (define-key mh-folder-mode-map "f" 'mh-forward)
  (define-key mh-folder-mode-map "g" 'mh-goto-msg)
! (define-key mh-folder-mode-map "i" 'mh-inc-folder)
! (define-key mh-folder-mode-map "j" 'mh-goto-msg)
! (define-key mh-folder-mode-map "l" 'mh-print-msg)
! (define-key mh-folder-mode-map "m" 'mh-send)
  (define-key mh-folder-mode-map "n" 'mh-next-undeleted-msg)
  (define-key mh-folder-mode-map "o" 'mh-refile-msg)
  (define-key mh-folder-mode-map "p" 'mh-previous-undeleted-msg)
***************
*** 2785,2790
  (define-key mh-folder-mode-map "p" 'mh-previous-undeleted-msg)
  (define-key mh-folder-mode-map "n" 'mh-next-undeleted-msg)
  (define-key mh-folder-mode-map "o" 'mh-refile-msg)
  
  
  ;;; Build the letter-mode keymap:

--- 3005,3019 -----
  (define-key mh-folder-mode-map "m" 'mh-send)
  (define-key mh-folder-mode-map "n" 'mh-next-undeleted-msg)
  (define-key mh-folder-mode-map "o" 'mh-refile-msg)
+ (define-key mh-folder-mode-map "p" 'mh-previous-undeleted-msg)
+ (define-key mh-folder-mode-map "q" 'mh-quit)
+ (define-key mh-folder-mode-map "r" 'mh-redistribute)
+ (define-key mh-folder-mode-map "s" 'mh-send)
+ (define-key mh-folder-mode-map "t" 'mh-toggle-showing)
+ (define-key mh-folder-mode-map "u" 'mh-undo)
+ (define-key mh-folder-mode-map "v" 'mh-check-md4-signature)
+ (define-key mh-folder-mode-map "x" 'mh-execute-commands)
+ (define-key mh-folder-mode-map "|" 'mh-pipe-msg)
  
  
  ;;; Build the letter-mode keymap:

