(rmail-forward): Simplify insertion of forwarded msg.

Don't use exchange-point-and-mark.

(rmail-msg-number-after-expunge): New function.
(rmail-reply, rmail-forward): Use separate local variables
rmail-send-actions-rmail-msg-number, rmail-send-actions-rmail-buffer
to record which message to mark as answered or forwarded.
(rmail-only-expunge): Update msg numbers stored in those variables.
This commit is contained in:
Richard M. Stallman 1994-09-27 19:32:35 +00:00
parent 63af2693ce
commit 1825bea106

View file

@ -1796,6 +1796,21 @@ Deleted messages stay in the file until the \\[rmail-expunge] command is given."
(interactive)
(rmail-delete-forward t))
;; Compute the message number a given message would have after expunging.
;; The present number of the message is OLDNUM.
;; DELETEDVEC should be rmail-deleted-vector.
;; The value is nil for a message that would be deleted.
(defun rmail-msg-number-after-expunge (deletedvec oldnum)
(if (or (null oldnum) (= (aref deletedvec oldnum) ?D))
nil
(let ((i 0)
(newnum 0))
(while (< i oldnum)
(if (/= (aref deletedvec i) ?D)
(setq newnum (1+ newnum)))
(setq i (1+ i)))
newnum)))
(defun rmail-only-expunge ()
"Actually erase all deleted messages in the file."
(interactive)
@ -1824,6 +1839,7 @@ Deleted messages stay in the file until the \\[rmail-expunge] command is given."
(total rmail-total-messages)
(new-message-number rmail-current-message)
(new-summary nil)
(rmailbuf (current-buffer))
(buffer-read-only nil)
(messages rmail-message-vector)
(deleted rmail-deleted-vector)
@ -1833,6 +1849,22 @@ Deleted messages stay in the file until the \\[rmail-expunge] command is given."
rmail-message-vector nil
rmail-deleted-vector nil
rmail-summary-vector nil)
;; Find each sendmail buffer that is set to reply
;; to a message in this buffer, and update its
;; message number.
(let ((bufs (buffer-list)))
(while bufs
(save-excursion
(set-buffer (car bufs))
(and (boundp 'rmail-send-actions-rmail-buffer)
(eq rmail-send-actions-rmail-buffer rmailbuf)
(setq rmail-send-actions-rmail-msg-number
(rmail-msg-number-after-expunge
deleted
rmail-send-actions-rmail-msg-number))))
(setq bufs (cdr bufs))))
(while (<= number total)
(if (= (aref deleted number) ?D)
(progn
@ -1903,7 +1935,9 @@ Normally include CC: to all other recipients of original message;
prefix argument means ignore them. While composing the reply,
use \\[mail-yank-original] to yank the original message into it."
(interactive "P")
(let (from reply-to cc subject date to message-id resent-reply-to)
(let (from reply-to cc subject date to message-id resent-reply-to
(msgnum rmail-current-message)
(rmail-buffer (current-buffer)))
(save-excursion
(save-restriction
(widen)
@ -1956,11 +1990,19 @@ use \\[mail-yank-original] to yank the original message into it."
(if (null cc) to (concat to ", " cc))))))
(if (string= cc-list "") nil cc-list)))
(current-buffer)
(list (list '(lambda (buf msgnum)
(save-excursion
(set-buffer buf)
(rmail-set-attribute "answered" t msgnum)))
(current-buffer) rmail-current-message)))))
(list (list '(lambda ()
(let ((msgnum rmail-send-actions-rmail-msg-number))
(save-excursion
(set-buffer rmail-send-actions-rmail-buffer)
(if msgnum
(rmail-set-attribute "answered" t msgnum))))))))
;; We keep the rmail buffer and message number in these
;; buffer-local vars in the sendmail buffer,
;; 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-msg-number)
(setq rmail-send-actions-rmail-buffer rmail-buffer)
(setq rmail-send-actions-rmail-msg-number msgnum)))
(defun rmail-make-in-reply-to-field (from date message-id)
(cond ((not from)
@ -2027,6 +2069,7 @@ see the documentation of `rmail-resend'."
(if resend
(call-interactively 'rmail-resend)
(let ((forward-buffer (current-buffer))
(msgnum rmail-current-message)
(subject (concat "["
(let ((from (or (mail-fetch-field "From")
(mail-fetch-field ">From"))))
@ -2043,26 +2086,33 @@ see the documentation of `rmail-resend'."
(function mail)
(function rmail-start-mail))
nil nil subject nil nil nil
(list (list (function (lambda (buf msgnum)
(save-excursion
(set-buffer buf)
(rmail-set-attribute
"forwarded" t msgnum))))
(current-buffer)
rmail-current-message)))
(list (list (function
(lambda ()
(let ((msgnum
rmail-send-actions-rmail-msg-number))
(save-excursion
(set-buffer rmail-send-actions-rmail-buffer)
(if msgnum
(rmail-set-attribute
"forwarded" t msgnum)))))))))
;; The mail buffer is now current.
(save-excursion
;; We keep the rmail buffer and message number in these
;; buffer-local vars in the sendmail buffer,
;; 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-msg-number)
(setq rmail-send-actions-rmail-buffer forward-buffer)
(setq rmail-send-actions-rmail-msg-number msgnum)
;; Insert after header separator--before signature if any.
(goto-char (point-min))
(search-forward-regexp
(concat "^" (regexp-quote mail-header-separator) "$"))
(forward-line 1)
(insert "------- Start of forwarded message -------\n")
(insert-buffer forward-buffer)
(forward-line -1)
(exchange-point-and-mark)
(insert-buffer-substring forward-buffer)
(insert "------- End of forwarded message -------\n")
(forward-line -1)
(exchange-point-and-mark))))))
(push-mark))))))
(defun rmail-resend (address &optional from comment mail-alias-file)
"Resend current message to ADDRESSES.