koomen@rochester.UUCP (Hans Koomen) (03/10/84)
From: Hans.Koomen Because of the overwhelming response to my anouncement a while back, I am including my version of rmail.ml below. I will not be mailing it to indivuals! Also, there are too many changes to use diff output. Enjoy, and be sure to mail bugs, complaints and praise to -- Hans (Koomen@Rochester, {allegra,seismo}!rochester!koomen) ; ; Koomen's rmail: ; (message "Loading the mail system, please wait...") (sit-for 0) ; Unix Emacs RMail facility. implements rmail (read mail) and ; smail (send mail). ; "rmail" is used for reading mail. Executing it places your incoming ; mailbox into a window and enters a special command interpretation loop. ; The commands that it understands are: ; p move to the previous message. ; n move to the next message. ; f move forward in the current message. ; b move backward in the current message. ; d delete the current message. ; u undelete the last deleted message. ; r reply to the current message. ; q quit out of RMail, appending all undeleted messages to mbox. ; ************************************************************************ ; Fri Feb 3 00:43:21 1984 * Koomen@Rochester * multi-mailfolder upgrade ; To make mail filing easier I gave rmail a multi-mailfolder capability. ; Messages can be moved from the standard inbox to dedicated message folders ; but not by appending as was the case but intact. Each message folder is ; implemented as a Unix subdirectory of $user/Messages containing its own ; Directory file. When moving a message rmail asks for a message folder ; (defaulting to the one last used), creates a link of the current message ; in the indicated directory, updates the appropriate Directory file, and ; marks the current message for deletion in the current Directory. One can ; move from message folder to message folder to inspect filed messages. ; The following commands interface with this new capability ; m move message to different message folder ; ^Xr read different message folder ; ^Xm mail new message (used to be 'm') ; Fri Feb 3 00:56:44 1984 * Koomen@Rochester * additional upgrades ; More message header stripping. Only displays To, From, Subject, Date and ; possibly Reply-To and In-Reply-To lines. Header info is kept, and can be ; examined by ; h restore full message header ; H strip message header ; As a bonus I've thrown in display of the current message number on the ; Directory buffer line (useful in combination with the rmail-goto-message ; command 'g'). ; I also got rmail to display the directory window at half the size of the ; current message window, and to depict graphically what proportion of the ; message is currently visible. ; ************************************************************************ ; "smail" is used for sending mail. It places you in a buffer for ; constructing the message and locally defines a few commands: ; ^X^S send the mail -- if all went well the window will disappear, ; otherwise a message indicating which addresses failed will appear ; at the bottom of the acreen. Unfortunatly, the way the mailers on ; Unix work, the message will have been sent to those addresses which ; succeded and not to the others, so you have to delete some ; addresses and fix up the others before you resend the message. ; ^Xt positions you in the To: field of the message. ; ^Xc positions you in the Cc: field of the message, creating it if it ; doesn't already exist. ; The abbrev facility is used for mail address expansion, ; the file /usr/local/lib/emacs/RMailAbbrevs should contain ; abbrev definitions to expand login names to their ; proper mail address. This gets used at CMU since we have ; 7 VAXen, 4 10's and countless 11's; remembering where a ; person usually logs in is nearly impossible. ; ^Xs positions you in the Subject: field of the message. ; ^Xa positions you to the end of the body of the message, ready to ; append more text. (defun (rmail ; The top level mail reader origfolder curfolder savefolder origfolderpath curfolderpath entry-name header-is-stripped current-message-number (save-window-excursion (setq origfolder "Messages") (setq curfolder origfolder) (setq savefolder "") (setq origfolderpath (concat (getenv "HOME") "/Messages")) (setq curfolderpath origfolderpath) (message "Please wait while I read mail folder " curfolder "...") (sit-for 0) (pop-to-buffer "rmail-directory") (setq case-fold-search 1) (setq needs-checkpointing 0) (delete-other-windows) (split-current-window) (previous-window) (rmail-adjust-dirwindow) (rmail-read-mail-folder) (message "Type ^C to exit rmail; ? for help") (recursive-edit) (pop-to-buffer "rmail-directory") (erase-messages) (if buffer-is-modified (write-current-file)) ) (novalue) ) (rmail-adjust-dirwindow dirwinsize curmeswinsize (error-occured (save-excursion (pop-to-buffer "current-message") (setq curmeswinsize (window-height)) (pop-to-buffer "rmail-directory") (setq dirwinsize (/ (+ curmeswinsize (window-height)) 3)) (if (< dirwinsize 3) (setq dirwinsize 3)) (while (< dirwinsize (window-height)) (shrink-window)))) ) (rmail-read-mail-folder (if (= curfolder origfolder) (progn (set-mark) (filter-region (concat "/usr/local/lib/emacs/may83/collectmail " curfolderpath " $HOME/BlindBox /usr/spool/mail/$USER")))) (read-file (concat curfolderpath "/Directory")) (beginning-of-file) (while (& (eolp) (! (eobp))) (delete-next-character)) (set-rmail-directory-mode-line-format) (position-on-dirent) (pick-up-message) (sit-for 0) (novalue) ) (rmail-read-new-mail-folder newfolder newfolderpath (setq newfolder (get-tty-string (concat "read mail folder [" origfolder "] "))) (if (= newfolder "") (progn (setq newfolder origfolder) (setq newfolderpath origfolderpath)) (setq newfolderpath (concat origfolderpath "/" newfolder))) (if (! (file-exists (concat newfolderpath "/Directory"))) (error-message (concat "Can't read mail folder " newfolder)) (| (!= newfolder curfolder) (= newfolder origfolder)) (progn (erase-messages) (if buffer-is-modified (write-current-file)) (setq curfolder newfolder) (setq curfolderpath newfolderpath) (message "Please wait while I read mail folder " curfolder "...") (sit-for 0) (rmail-read-mail-folder))) (novalue) ) (position-on-dirent (pop-to-buffer "rmail-directory") (setq needs-checkpointing 0) (if (= (buffer-size) 0) (read-file (concat curfolderpath "/Directory"))) (if (! (looking-at "^>[^0-9\n]*\\([0-9][0-9]*\\)")) (progn (beginning-of-file) (if (error-occured (re-search-forward "")) (progn (beginning-of-file) (if (error-occured (re-search-forward "^ N")) (end-of-file)) (rmail-mark) (if (! (looking-at "^>[^0-9\n]*\\([0-9][0-9]*\\)")) (error-message "No messages")))))) (region-around-match 1) (setq entry-name (region-to-string)) (beginning-of-line) (setq current-message-number (current-line)) (setq mode-string current-message-number) ) (pick-up-message (position-on-dirent) (save-excursion (pop-to-buffer "current-message") (setq needs-checkpointing 0) (setq case-fold-search 1) (set-rmail-message-mode-line-format) (erase-buffer "current-message") (read-file (concat curfolderpath "/" entry-name)) (setq header-is-stripped 0) (beginning-of-file) (rmail-strip-message-header) (setq buffer-is-modified 0) ) ) (rmail-strip-message-header (if (! header-is-stripped) (save-excursion (pop-to-buffer "current-message") (beginning-of-file) (set-mark) (search-forward "\n\n") (backward-character) (copy-region-to-buffer "current-message-header") (set-mark) (while (! (bobp)) (previous-line) (beginning-of-line) (if (| (looking-at "To: ") (looking-at "Cc: ") (looking-at "From: ") (looking-at "Date: ") (looking-at "Subject: ") (looking-at "Reply-To: ") (looking-at "In-Reply-To: ")) (set-mark) (| (= ' ' (following-char)) (= '\t' (following-char))) (novalue) (delete-to-killbuffer))) (setq header-is-stripped 1) (set-rmail-message-mode-line-format)) (novalue)) ) (rmail-restore-message-header (if header-is-stripped (save-excursion (pop-to-buffer "current-message") (setq needs-checkpointing 0) (beginning-of-file) (set-mark) (search-forward "\n\n") (backward-character) (delete-to-killbuffer) (yank-buffer "current-message-header") (setq header-is-stripped 0) (beginning-of-file) (set-rmail-message-mode-line-format)) (novalue)) ) (erase-messages (save-excursion (pop-to-buffer "rmail-directory") (setq needs-checkpointing 0) (beginning-of-file) (error-occured (re-replace-string "^.N" " ")) (error-occured fn (while 1 (re-search-forward "^.D[^0-9\n]*\\([0-9]*\\)") (region-around-match 1) (unlink-file (concat curfolderpath "/" (region-to-string))) (beginning-of-line) (set-mark) (end-of-line) (forward-character) (erase-region)))) ) (rmail-move-message direntry mess movefolder movefolderpath newflg (position-on-dirent) (save-excursion (set-mark) (end-of-line) (setq direntry (region-to-string))) (setq mess ": move message to folder ") (if (!= savefolder "") (setq mess (concat mess "[" savefolder "] ")) (!= curfolder origfolder) (setq mess (concat mess "[" origfolder "] "))) (setq movefolder (get-tty-string mess)) (if (= movefolder "") (setq movefolder savefolder)) (if (= movefolder "") (setq movefolder origfolder)) (if (= movefolder curfolder) (error-message "move canceled.")) (setq movefolderpath (concat origfolderpath "/" movefolder)) (if (file-exists movefolderpath) (setq newflg 0) (progn answer (setq answer (get-tty-string (concat movefolder ": new mail folder? "))) (if (& (!= answer "") (!= (substr answer 1 1) "y")) (error-message "move canceled.")) (message "creating mail folder " movefolder "...") (sit-for 0) (execute-monitor-command (concat "mkdir " movefolderpath)) (if (file-exists movefolderpath) (setq newflg 1) (error-message (concat "couldn't create " movefolder))))) (message "moving message to " movefolder "...") (sit-for 0) (execute-monitor-command (concat "ln " curfolderpath "/" entry-name " " movefolderpath)) (if (! (file-exists (concat movefolderpath "/" entry-name))) (error-message (concat "failed to move message to " movefolder))) (save-excursion (temp-use-buffer "Scratch Stuff") (erase-buffer) (insert-string direntry) (newline) (beginning-of-file) (delete-next-character) (insert-character (if newflg '>' ' ')) (if (| (= 'N' (following-char)) (= 'D' (following-char))) (progn (delete-next-character) (insert-character ' '))) (append-to-file (concat movefolderpath "/Directory"))) (position-on-dirent) (rmail-delete-message) (setq savefolder movefolder) (message "message moved to " movefolder) (novalue) ) (rmail-com (argc) (rmail) (exit-emacs) ) (smail-com i (declare-global exit-when-through) (pop-to-buffer "send-mail") (setq needs-checkpointing 0) (setq case-fold-search 1) (erase-buffer) (if (! (is-bound read-mail-abbrevs)) (progn (declare-global read-mail-abbrevs) (quietly-read-abbrev-file "/usr/local/lib/emacs/may83/RMailAbbrevs") ) ) (use-abbrev-table "RMail") (setq i 1) (newline) (while (> (argc) i) (if (!= (substr (argv i) 1 1) "-") (progn (insert-string (argv i)) (if (> (argc) i) (insert-character ',')) ) ) (setq i (+ i 1)) ) (newline) (do-mail-setup) (exit-emacs) ) (rmail-next-page (save-excursion (pop-to-buffer "current-message") (setq needs-checkpointing 0) (next-page) (set-rmail-message-mode-line-format) ) ) (rmail-previous-page (save-excursion (pop-to-buffer "current-message") (setq needs-checkpointing 0) (previous-page) (set-rmail-message-mode-line-format) ) ) (set-rmail-directory-mode-line-format (save-excursion (end-of-file) (setq mode-line-format (concat " Mail folder: " curfolder " #%m (of " (- (current-line) 1) ") %M"))) ) (set-rmail-message-mode-line-format top bot end s1 s2 len (save-excursion (setq len 30) (setq end (+ 1 (buffer-size))) (beginning-of-window) (setq top (/ (+ end -1 (* len (dot))) end)) (end-of-window) (setq bot (/ (+ end -1 (* len (dot))) end)) (setq s1 "----------------------------------------") (setq s2 "========================================") (setq mode-line-format (concat " Message #" current-message-number " " (substr s1 1 (- top 1)) (substr s2 1 (- bot top -1)) (substr s1 1 (- len bot)))) ) ) (rmail-next-message (position-on-dirent) (delete-next-character) (insert-character ' ') (beginning-of-line) (next-line) (if (eobp) (progn (previous-line) (message "You're at the last message already"))) (delete-next-character) (insert-character '>') (backward-character) (pick-up-message) ) (rmail-previous-message (position-on-dirent) (if (bobp) (message "You're at the first message") (progn (delete-next-character) (insert-character ' ') (beginning-of-line) (previous-line) (delete-next-character) (insert-character '>') (backward-character) (pick-up-message))) ) (rmail-delete-message (position-on-dirent) (forward-character) (delete-next-character) (insert-character 'D') (beginning-of-line) ) (rmail-undelete-message (position-on-dirent) (forward-character) (delete-next-character) (insert-character ' ') (beginning-of-line) ) ) (if (error-occured (current-line)) (defun (current-line lcnt incr ; approx log search (save-excursion (setq lcnt 1) (setq incr (/ (dot) 40)) (while (> incr 1) (while (! (error-occured (provide-prefix-argument incr (search-reverse "\^J")))) (setq lcnt (+ lcnt incr))) (setq incr (/ incr 4))) (while (! (error-occured (search-reverse "\^J"))) (setq lcnt (+ lcnt 1)))) lcnt) ) ) (autoload "&info" "info.ml") (defun (rmail-help (&info "emacs" "rmail") ) (rmail-reply subject dest excess (setq subject "") (setq dest "") (setq excess "") (save-window-excursion (pop-to-buffer "current-message") (setq needs-checkpointing 0) (setq case-fold-search 1) (beginning-of-file) (search-forward "\n\n") (set-mark) (beginning-of-file) (narrow-region) (error-occured (re-search-forward "^Subject:[ \t]*\\(.*\\)") (region-around-match 1) (setq subject (region-to-string)) (if (!= (substr subject 1 3) "Re:") (setq subject (concat "Re: " subject)) ) ) (beginning-of-file) (error-occured (if (error-occured (re-search-forward "^reply-to:[ \t]*\\(.*\\)")) (re-search-forward "^from:[ \t]*\\(.*\\)")) (region-around-match 1) (setq dest (region-to-string)) ) (beginning-of-file) (error-occured edest (save-excursion (temp-use-buffer "Scratch Stuff") (setq needs-checkpointing 0) (erase-buffer) (insert-string dest) (set-mark) (beginning-of-file) (error-occured (re-replace-string " *at *[^,\n]*\\| *@ *[^,\n]*\\| *([^)\n]*)\\| *<[^>\n]*>" "")) (setq edest (region-to-string))) (re-search-forward "^date:[ \t]*") (set-mark) (end-of-line) (setq excess (concat "In-Reply-To: " edest "'s message of " (region-to-string) "\n")) ) (widen-region) (pop-to-buffer "send-mail") (setq needs-checkpointing 0) (setq case-fold-search 1) (erase-buffer) (insert-string subject) (newline) (insert-string dest) (newline) (insert-string excess) (error-occured (beginning-of-file) (search-forward "In-Reply-To: ") (replace-string ":" "")) (do-mail-setup) ) (position-on-dirent) (if (looking-at "^>[N ]") (progn (forward-character) (delete-next-character) (insert-character 'A') (beginning-of-line))) ) (rmail-unmark (error-occured (position-on-dirent) (delete-next-character) (insert-character ' ') (beginning-of-line)) ) (rmail-mark (if (error-occured (beginning-of-line) (if (eobp) (re-search-reverse "^.") (progn (re-search-forward "^.") (beginning-of-line))) (delete-next-character) (insert-character '>') (beginning-of-line) (position-on-dirent) (pick-up-message) ) (message "No messages")) ) (rmail-search-forward (rmail-unmark) (error-occured (re-search-forward (get-tty-string "Search forward: "))) (rmail-mark) ) (rmail-search-reverse (rmail-unmark) (error-occured (re-search-reverse (get-tty-string "Search reverse: "))) (rmail-mark) ) (rmail-goto-message n (setq n (get-tty-string "Goto message: ")) (rmail-unmark) (beginning-of-file) (provide-prefix-argument (- n 1) (next-line)) (rmail-mark) ) (rmail-first-message (rmail-unmark) (beginning-of-file) (rmail-mark) ) (rmail-last-message (rmail-unmark) (end-of-file) (rmail-mark) ) (rmail-skip n (setq n (get-tty-string "Skip messages: ")) (rmail-unmark) (provide-prefix-argument n (next-line)) (rmail-mark) ) (rmail-but-mark (save-excursion (rmail-unmark)) (rmail-mark) ) (rmail-but-delete (rmail-but-mark) (rmail-delete-message) ) (mail-insert (mail-append) (save-excursion (insert-string "\n_________________________________\n") (yank-buffer "current-message")) (re-replace-string "^From \\|^Date:" ">&") ) (mail-noblind-exit (setq mail-append-blind 0) (exit-emacs) ) ) (defun (smail ; initiate mail sending (save-window-excursion (pop-to-buffer "send-mail") (setq needs-checkpointing 0) (setq case-fold-search 1) (erase-buffer) (do-mail-setup) ) (novalue) ) ; set things up in a mail sending buffer. (do-mail-setup mail-do-send mail-append-blind (beginning-of-file) ; makemail is a tiny little C program that (set-mark) ; builds a prototype mail header from an (end-of-file) ; input subject and destination. (setq mode-string "SMail") (setq mail-do-send 1) (setq mail-append-blind 1) (if (! (is-bound read-mail-abbrevs)) (progn (declare-global read-mail-abbrevs) (quietly-read-abbrev-file "/usr/local/lib/emacs/may83/RMailAbbrevs") ) ) (use-abbrev-table "RMail") (filter-region "/usr/local/lib/emacs/may83/makemail") (beginning-of-file) (search-forward "hErE<!}") (delete-previous-word) (setq abbrev-mode (= (current-column) 5)) (setq right-margin 72) (local-bind-to-key "rmail-help" "\^X?") (local-bind-to-key "mail-to" "\^Xt") (local-bind-to-key "mail-append" "\^Xa") (local-bind-to-key "mail-cc" "\^Xc") (local-bind-to-key "mail-subject" "\^Xs") (local-bind-to-key "mail-fetch-field" "\^Xf") (local-bind-to-key "mail-insert" "\^Xi") (local-bind-to-key "mail-noblind-exit" "\^X\^C") (local-bind-to-key "exit-emacs" "\^X\^S") (local-bind-to-key "exit-emacs" "\^X\^F") (local-bind-to-key "mail-abort-send" "\^G") (local-bind-to-key "mail-abort-send" "\^X\^A") (local-bind-to-key "justify-paragraph" "\ej") (message "Type ^C to send the message; ^X^A to abort; ^X? for help.") (while mail-do-send (save-excursion (recursive-edit) (if mail-do-send (progn (message "Sending...") (sit-for 0)))) (if mail-do-send (send-mail))) ) ) (defun (mail-abort-send (if (!= "y" (substr (get-tty-string "Do you really want to abort the message? ") 1 1)) (error-message "message aborted.")) (setq mail-do-send 0) (exit-emacs)) (mail-to ; move to the "To:" field (abbrev-expand) (setq abbrev-mode 1) (beginning-of-file) (re-search-forward "^to:.*") (setq left-margin 10) ) (mail-subject ; move to the "Subject:" field (abbrev-expand) (setq abbrev-mode 0) (beginning-of-file) (re-search-forward "^subject:.*") (setq left-margin 10) ) (mail-fetch-field ; fetch a field from the current message field-name field-contents (setq field-name (get-tty-string ": field name ")) (save-excursion (temp-use-buffer "current-message") (beginning-of-file) (setq case-fold-search 1) (re-search-forward (concat "^" field-name "[^\n:]*:[ \t]*")) (mail-extend-field) (setq field-contents (region-to-string)) ) (insert-string field-contents) ) (mail-append ; move to the body (abbrev-expand) (setq abbrev-mode 0) (end-of-file) (setq left-margin 1) ) (mail-cc ; move to the "cc:" field. (abbrev-expand) (setq abbrev-mode 1) (beginning-of-file) (if (error-occured (re-search-forward "^cc:.*")) (progn (re-search-forward "\n\n\\|^to:.*\n.") (backward-character) (backward-character) (while (looking-at "^[ \t]") (progn (beginning-of-line) (next-line))) (insert-string "\nCc: ") ) ) ) (mail-extend-field (set-mark) (while (progn (end-of-line) (looking-at "\n[ \t]")) (forward-character)) ) (send-mail addresses ; finally send the mail (abbrev-expand) (beginning-of-file) (if (error-occured (re-search-forward "^$")) (end-of-file)) (set-mark) (beginning-of-file) (narrow-region) (setq addresses "") (error-occured (re-search-forward "^to:[ \t]*") (mail-extend-field) (setq addresses (region-to-string))) (beginning-of-file) (error-occured (re-search-forward "^cc:[ \t]*") (mail-extend-field) (setq addresses (concat addresses "," (region-to-string)))) (widen-region) (message "sending...") (save-excursion (temp-use-buffer "Scratch Stuff") (setq needs-checkpointing 0) (erase-buffer) (insert-string addresses) (beginning-of-file) (error-occured (re-replace-string "[\t\n]" " ")) (error-occured (re-replace-string " *([^(]*)" "")) (error-occured (re-replace-string "[^,]*<\\([^>,]*\\)>" "\\1")) (error-occured (re-replace-string " *at *" "@")) (error-occured (re-replace-string " *" ".")) (error-occured (re-replace-string "\\.*,\\.*" " ")) (error-occured (replace-string "!" "\\!")) (error-occured (re-replace-string "^ *\\|[ .][ .]*$" "")) (set-mark) (end-of-file) (setq addresses (region-to-string)) ) (end-of-file) (if (! (bolp)) (newline)) (beginning-of-file) (if mail-append-blind (progn (insert-string "\3\n") (append-to-file "~/BlindBox") (delete-previous-word))) (set-mark) (end-of-file) (filter-region (concat "/usr/lib/csmail -i " ; changed from addresses)) ; delivermail by lee (if (= (buffer-size) 0) (progn (setq mail-do-send 0) (message (concat "Sent to " addresses))) (progn T (beginning-of-file) (set-mark) (end-of-file) (copy-region-to-buffer "Delivery-errors") (beginning-of-file) (error-occured (re-replace-string "\n\n* *" "; ")) (end-of-line) (setq T (region-to-string)) (erase-buffer) (yank-from-killbuffer) (beginning-of-file) (error-occured (re-search-forward "^to:[^>\n]*")) (message T)) ) ) (abbrev-expand (insert-character ' ') (delete-previous-character) ) ) (declare-global rmail-default-log) (setq rmail-default-log "~/TextMessage") (defun (rmail-append file (setq file (get-tty-string (concat ": append-message-to-file [" rmail-default-log "] "))) (if (= file "") (setq file rmail-default-log)) (save-excursion (temp-use-buffer "current-message") (append-to-file file)) (setq rmail-default-log file) ) (rmail-shell (save-window-excursion (shell) (message "Type ^C to resume mail reading") (recursive-edit)) ) ) (defun (rmail-query-exit (if (!= "y" (substr (get-tty-string "Do you really want to abort mail reading? ") 1 1)) (error-message "exit ignored.")) (exit-emacs) ) ) (save-excursion i (temp-use-buffer "rmail-directory") (define-keymap "rmail-commands") (use-local-map "rmail-commands") (setq i 0) (while (< i 128) (local-bind-to-key "illegal-operation" i) (setq i (+ i 1))) (local-bind-to-key "rmail-but-mark" "\eA") (local-bind-to-key "rmail-but-mark" "\eB") (local-bind-to-key "rmail-but-delete" "\eC") (local-bind-to-key "rmail-but-mark" "\eD") (local-bind-to-key "rmail-next-page" 'f') (local-bind-to-key "rmail-previous-page" 'b') (local-bind-to-key "rmail-next-page" '^f') (local-bind-to-key "rmail-previous-page" '^b') (local-bind-to-key "rmail-next-page" ' ') (local-bind-to-key "rmail-previous-page" '^H') (local-bind-to-key "rmail-next-page" '^v') (local-bind-to-key "rmail-read-new-mail-folder" "\^Xr") (local-bind-to-key "rmail-next-message" 'n') (local-bind-to-key "rmail-previous-message" 'p') (local-bind-to-key "rmail-next-message" '^n') (local-bind-to-key "rmail-previous-message" '^p') (local-bind-to-key "rmail-delete-message" 'd') (local-bind-to-key "rmail-delete-message" '\177') (local-bind-to-key "rmail-delete-message" '^d') (local-bind-to-key "rmail-undelete-message" 'u') (local-bind-to-key "rmail-help" '?') (local-bind-to-key "rmail-query-exit" "\^G") (local-bind-to-key "exit-emacs" 'q') (local-bind-to-key "rmail-reply" 'r') (local-bind-to-key "smail" "\^Xm") (local-bind-to-key "rmail-move-message" 'm') (local-bind-to-key "rmail-search-forward" '^s') (local-bind-to-key "rmail-search-reverse" '^r') (local-bind-to-key "rmail-goto-message" 'g') (local-bind-to-key "rmail-strip-message-header" 'H') (local-bind-to-key "rmail-restore-message-header" 'h') (local-bind-to-key "rmail-first-message" '<') (local-bind-to-key "rmail-last-message" '>') (local-bind-to-key "rmail-skip" 's') (local-bind-to-key "rmail-append" 'a') (local-bind-to-key "rmail-shell" '!') (local-bind-to-key "execute-extended-command" ':') (local-bind-to-key "exit-emacs" '^c') (local-bind-to-key "redraw-display" "\^L") ) ; ; End of Koomen's rmail.ml ;