1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2025-01-06 11:55:48 +00:00

(rmail-view-buffer, rmail-enable-mime, rmail-show-mime-function,

rmail-mime-feature): New variables to control MIME feature.
(rmail-file-coding-system): Initial value is nil.
(rmail, rmail-convert-file, rmail-insert-inbox-text): Check
rmail-enable-mime.  Read a file without any code conversion.
(rmail-variables): Setup local variables rmail-buffer and rmail-view-buffer.
(rmail-decode-babyl-format, rmail-convert-babyl-format): Perform code
conversion of RMAIL file if rmail-enable-mime is nil.
(rmail-show-message): Make sure to be in rmail-buffer.  If
rmail-enable-mime is t, call appropriate function to decode MIME
format.
(rmail-mail, rmail-reply): Call rmail-start-mail with argument
rmail-view-buffer.
This commit is contained in:
Kenichi Handa 1997-02-26 12:57:47 +00:00
parent 2a23c7c2d1
commit d1e69dec61

View File

@ -295,6 +295,35 @@ before obeying `rmail-ignored-headers'.")
(let ((rmail-total-messages total)) (let ((rmail-total-messages total))
(,@ body)))) (,@ body))))
(rmail-maybe-display-summary)))) (rmail-maybe-display-summary))))
(defvar rmail-view-buffer nil
"Buffer which holds RMAIL message for displaying.")
;; Mule and MIME related variables.
;;;###autoload
(defvar rmail-file-coding-system nil
"Coding system used in RMAIL file.
This is set to nil by default.")
;;;###autoload
(defvar rmail-enable-mime nil
"*If non-nil, RMAIL uses MIME feature.
If the value is t, RMAIL automatically shows MIME decoded message.
If the value is neither t nor nil, RMAIL does not show MIME decoded message
until a user explicitly require it.")
;;;###autoload
(defvar rmail-show-mime-function nil
"Function to show MIME decoded message of RMAIL file.")
;;;###autoload
(defvar rmail-mime-feature 'rmail-mime
"Feature to provide for using MIME feature in RMAIL.
When starting rmail, this feature is requrired if rmail-enable-mime
is non-nil.")
;;;; *** Rmail Mode *** ;;;; *** Rmail Mode ***
@ -313,8 +342,15 @@ have a chance to specify a file name with the minibuffer.
If `rmail-display-summary' is non-nil, make a summary for this RMAIL file." If `rmail-display-summary' is non-nil, make a summary for this RMAIL file."
(interactive (if current-prefix-arg (interactive (if current-prefix-arg
(list (read-file-name "Run rmail on RMAIL file: ")))) (list (read-file-name "Run rmail on RMAIL file: "))))
(if rmail-enable-mime
(condition-case err
(require rmail-mime-feature)
(error (message "Feature `%s' not provided" rmail-mime-feature)
(sit-for 1)
(setq rmail-enable-mime nil))))
(let* ((file-name (expand-file-name (or file-name-arg rmail-file-name))) (let* ((file-name (expand-file-name (or file-name-arg rmail-file-name)))
(existed (get-file-buffer file-name)) (existed (get-file-buffer file-name))
(coding-system-for-read 'no-conversion)
run-mail-hook) run-mail-hook)
;; Like find-file, but in the case where a buffer existed ;; Like find-file, but in the case where a buffer existed
;; and the file was reverted, recompute the message-data. ;; and the file was reverted, recompute the message-data.
@ -391,6 +427,13 @@ If `rmail-display-summary' is non-nil, make a summary for this RMAIL file."
;; Non-empty file in non-RMAIL format. Add header and convert. ;; Non-empty file in non-RMAIL format. Add header and convert.
(setq convert t) (setq convert t)
(rmail-insert-rmail-file-header))) (rmail-insert-rmail-file-header)))
(if (and (not convert)
(not rmail-enable-mime)
rmail-file-coding-system)
;; Decode BABYL part at the headq only. The remaining non
;; BABYL parts are decode in rmail-convert-to-babyl-format if
;; necessary..
(rmail-decode-babyl-format))
;; If file was not a Babyl file or if there are ;; If file was not a Babyl file or if there are
;; Unix format messages added at the end, ;; Unix format messages added at the end,
;; convert file as necessary. ;; convert file as necessary.
@ -423,6 +466,24 @@ Note: This is the header of an rmail file.
Note: If you are seeing it in rmail, Note: If you are seeing it in rmail,
Note: it means the file has no messages in it.\n\^_"))) Note: it means the file has no messages in it.\n\^_")))
;; Decode Babyl formated part at the head of current buffer by
;; rmail-file-coding-system.
(defun rmail-decode-babyl-format ()
(let ((modifiedp (buffer-modified-p))
(buffer-read-only nil)
pos)
(goto-char (point-min))
(search-forward "\n\^_" nil t) ; Skip BYBYL header.
(setq pos (point))
(message "Decoding messages...")
(while (search-forward "\n\^_" nil t)
(decode-coding-region pos (point) rmail-file-coding-system)
(setq pos (point)))
(message "Decoding messages...done")
(set-buffer-file-coding-system rmail-file-coding-system)
(set-buffer-modified-p modifiedp)))
(if rmail-mode-map (if rmail-mode-map
nil nil
(setq rmail-mode-map (make-keymap)) (setq rmail-mode-map (make-keymap))
@ -691,6 +752,10 @@ Instead, these commands are available:
(make-local-variable 'rmail-last-label) (make-local-variable 'rmail-last-label)
(make-local-variable 'rmail-last-regexp) (make-local-variable 'rmail-last-regexp)
(make-local-variable 'rmail-deleted-vector) (make-local-variable 'rmail-deleted-vector)
(make-local-variable 'rmail-buffer)
(setq rmail-buffer (current-buffer))
(make-local-variable 'rmail-view-buffer)
(setq rmail-view-buffer rmail-buffer)
(make-local-variable 'rmail-summary-buffer) (make-local-variable 'rmail-summary-buffer)
(make-local-variable 'rmail-summary-vector) (make-local-variable 'rmail-summary-vector)
(make-local-variable 'rmail-current-message) (make-local-variable 'rmail-current-message)
@ -1014,9 +1079,6 @@ It returns t if it got any new messages."
;; Don't leave the buffer screwed up if we get a disk-full error. ;; Don't leave the buffer screwed up if we get a disk-full error.
(rmail-show-message)))) (rmail-show-message))))
(defvar rmail-file-coding-system 'coding-system-iso2022-7
"Coding system used in RMAIL file.")
(defun rmail-insert-inbox-text (files renamep) (defun rmail-insert-inbox-text (files renamep)
;; Detect a locked file now, so that we avoid moving mail ;; Detect a locked file now, so that we avoid moving mail
;; out of the real inbox file. (That could scare people.) ;; out of the real inbox file. (That could scare people.)
@ -1144,29 +1206,10 @@ It returns t if it got any new messages."
;; Either the alternate name (if we renamed) ;; Either the alternate name (if we renamed)
;; or the actual inbox (if not renaming). ;; or the actual inbox (if not renaming).
(if (file-exists-p tofile) (if (file-exists-p tofile)
(let (size) (let ((coding-system-for-read 'no-conversion)
size)
(goto-char (point-max)) (goto-char (point-max))
;; At first, read the file as is (i.e. no decoding). (setq size (nth 1 (insert-file-contents tofile)))
(setq size (nth 1 (let ((coding-system-for-read 'no-conversion))
(insert-file-contents tofile))))
;; Then, decode the contents one by one.
(let ((pos (point)))
(cond ((looking-at "^From ") ; new mails.
(forward-line 1)
(while (not (eobp))
(setq pos (point))
(search-forward "\nFrom " nil 'move)
(decode-coding-region pos (point)
'automatic-conversion)))
((looking-at "BABYL OPTIONS:\\|\^L") ; Babyl format
(while (not (eobp))
(setq pos (point))
(search-forward "\n^_" nil 'move)
(decode-coding-region pos (point)
rmail-file-coding-system)))
(t ; Perhaps MMDF format. Convert all data at once.
(decode-coding-region (point) (point-max)
'automatic-conversion))))
(goto-char (point-max)) (goto-char (point-max))
(or (= (preceding-char) ?\n) (or (= (preceding-char) ?\n)
(zerop size) (zerop size)
@ -1216,6 +1259,7 @@ Optional DEFAULT is password to start with."
(goto-char (point-min)) (goto-char (point-min))
(save-restriction (save-restriction
(while (not (eobp)) (while (not (eobp))
(setq start (point))
(cond ((looking-at "BABYL OPTIONS:");Babyl header (cond ((looking-at "BABYL OPTIONS:");Babyl header
(if (search-forward "\n\^_" nil t) (if (search-forward "\n\^_" nil t)
;; If we find the proper terminator, delete through there. ;; If we find the proper terminator, delete through there.
@ -1235,13 +1279,16 @@ Optional DEFAULT is password to start with."
(save-excursion (save-excursion
(skip-chars-forward " \t\n") (skip-chars-forward " \t\n")
(point))) (point)))
(or rmail-enable-mime
(not rmail-file-coding-system)
(decode-coding-region start (point)
rmail-file-coding-system))
(narrow-to-region (point) (point-max))) (narrow-to-region (point) (point-max)))
;;*** MMDF format ;;*** MMDF format
((let ((case-fold-search t)) ((let ((case-fold-search t))
(looking-at mmdf-delim1)) (looking-at mmdf-delim1))
(let ((case-fold-search t)) (let ((case-fold-search t))
(replace-match "\^L\n0, unseen,,\n*** EOOH ***\n") (replace-match "\^L\n0, unseen,,\n*** EOOH ***\n")
(setq start (point))
(re-search-forward mmdf-delim2 nil t) (re-search-forward mmdf-delim2 nil t)
(replace-match "\^_")) (replace-match "\^_"))
(save-excursion (save-excursion
@ -1250,11 +1297,13 @@ Optional DEFAULT is password to start with."
(goto-char (point-min)) (goto-char (point-min))
(while (search-forward "\n\^_" nil t); single char "\^_" (while (search-forward "\n\^_" nil t); single char "\^_"
(replace-match "\n^_")))); 2 chars: "^" and "_" (replace-match "\n^_")))); 2 chars: "^" and "_"
(or rmail-enable-mime
(not rmail-file-coding-system)
(decode-coding-region start (point) 'automatic-conversion))
(narrow-to-region (point) (point-max)) (narrow-to-region (point) (point-max))
(setq count (1+ count))) (setq count (1+ count)))
;;*** Mail format ;;*** Mail format
((looking-at "^From ") ((looking-at "^From ")
(setq start (point))
(insert "\^L\n0, unseen,,\n*** EOOH ***\n") (insert "\^L\n0, unseen,,\n*** EOOH ***\n")
(rmail-nuke-pinhead-header) (rmail-nuke-pinhead-header)
;; If this message has a Content-Length field, ;; If this message has a Content-Length field,
@ -1311,6 +1360,9 @@ Optional DEFAULT is password to start with."
(while (search-forward "\n\^_" nil t); single char (while (search-forward "\n\^_" nil t); single char
(replace-match "\n^_")))); 2 chars: "^" and "_" (replace-match "\n^_")))); 2 chars: "^" and "_"
(insert ?\^_) (insert ?\^_)
(or rmail-enable-mime
(not rmail-file-coding-system)
(decode-coding-region start (point) 'automatic-conversion))
(narrow-to-region (point) (point-max))) (narrow-to-region (point) (point-max)))
;; ;;
;; This kludge is because some versions of sendmail.el ;; This kludge is because some versions of sendmail.el
@ -1710,6 +1762,8 @@ change the invisible header text."
"Show message number N (prefix argument), counting from start of file. "Show message number N (prefix argument), counting from start of file.
If summary buffer is currently displayed, update current message there also." If summary buffer is currently displayed, update current message there also."
(interactive "p") (interactive "p")
(or (eq major-mode 'rmail-mode)
(switch-to-buffer rmail-buffer))
(rmail-maybe-set-message-counters) (rmail-maybe-set-message-counters)
(widen) (widen)
(if (zerop rmail-total-messages) (if (zerop rmail-total-messages)
@ -1742,6 +1796,10 @@ If summary buffer is currently displayed, update current message there also."
(narrow-to-region (point) end))) (narrow-to-region (point) end)))
(goto-char (point-min)) (goto-char (point-min))
(rmail-display-labels) (rmail-display-labels)
(if (eq rmail-enable-mime t)
(funcall rmail-show-mime-function)
(setq rmail-view-buffer rmail-buffer)
)
(rmail-highlight-headers) (rmail-highlight-headers)
(if transient-mark-mode (deactivate-mark)) (if transient-mark-mode (deactivate-mark))
(run-hooks 'rmail-show-message-hook) (run-hooks 'rmail-show-message-hook)
@ -2243,7 +2301,7 @@ Deleted messages stay in the file until the \\[rmail-expunge] command is given."
While composing the message, use \\[mail-yank-original] to yank the While composing the message, use \\[mail-yank-original] to yank the
original message into it." original message into it."
(interactive) (interactive)
(rmail-start-mail nil nil nil nil nil (current-buffer))) (rmail-start-mail nil nil nil nil nil rmail-view-buffer))
(defun rmail-continue () (defun rmail-continue ()
"Continue composing outgoing message previously being composed." "Continue composing outgoing message previously being composed."
@ -2261,8 +2319,7 @@ use \\[mail-yank-original] to yank the original message into it."
(interactive "P") (interactive "P")
(let (from reply-to cc subject date to message-id references (let (from reply-to cc subject date to message-id references
resent-to resent-cc resent-reply-to resent-to resent-cc resent-reply-to
(msgnum rmail-current-message) (msgnum rmail-current-message))
(rmail-buffer (current-buffer)))
(save-excursion (save-excursion
(save-restriction (save-restriction
(widen) (widen)
@ -2323,7 +2380,7 @@ use \\[mail-yank-original] to yank the original message into it."
(mail-strip-quoted-names (mail-strip-quoted-names
(if (null cc) to (concat to ", " cc)))))) (if (null cc) to (concat to ", " cc))))))
(if (string= cc-list "") nil cc-list))) (if (string= cc-list "") nil cc-list)))
(current-buffer) rmail-view-buffer
(list (list '(lambda () (list (list '(lambda ()
(let ((msgnum rmail-send-actions-rmail-msg-number)) (let ((msgnum rmail-send-actions-rmail-msg-number))
(save-excursion (save-excursion
@ -2338,7 +2395,7 @@ use \\[mail-yank-original] to yank the original message into it."
;; so that rmail-only-expunge can relocate the message number. ;; so that rmail-only-expunge can relocate the message number.
(make-local-variable 'rmail-send-actions-rmail-buffer) (make-local-variable 'rmail-send-actions-rmail-buffer)
(make-local-variable 'rmail-send-actions-rmail-msg-number) (make-local-variable 'rmail-send-actions-rmail-msg-number)
(setq rmail-send-actions-rmail-buffer rmail-buffer) (setq rmail-send-actions-rmail-buffer rmail-view-buffer)
(setq rmail-send-actions-rmail-msg-number msgnum))) (setq rmail-send-actions-rmail-msg-number msgnum)))
(defun rmail-make-in-reply-to-field (from date message-id) (defun rmail-make-in-reply-to-field (from date message-id)