aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard M. Stallman1997-05-02 07:25:43 +0000
committerRichard M. Stallman1997-05-02 07:25:43 +0000
commit0985b41295cbf58bc95cf713e16d46bd33a92671 (patch)
treea97e5b66518f626d9d06a0e450539244f7d4418f
parent662659f092d37a67a7b9211bdf3c9de32a082ed1 (diff)
downloademacs-0985b41295cbf58bc95cf713e16d46bd33a92671.tar.gz
emacs-0985b41295cbf58bc95cf713e16d46bd33a92671.zip
(rmail-msgref-vector): New variable.
Holds, for each message, a cons cell which contains the message number and which relocates if the message number changes. (rmail-forget-messages): Clear rmail-msgref-vector. (rmail-variables): Make rmail-msgref-vector buffer-local. (rmail-count-new-messages): Extend rmail-msgref-vector. (rmail-set-message-counters): Initialize rmail-msgref-vector. (rmail-only-expunge): Update rmail-msgref-vector. Don't look for mail-mode buffers specially. (rmail-reply): Use rmail-msgref-vector element as arg. (rmail-forward, rmail-retry-failure): Likewise. (rmail-mark-message): Accept an element of rmail-mark-message as arg.
-rw-r--r--lisp/mail/rmail.el70
1 files changed, 40 insertions, 30 deletions
diff --git a/lisp/mail/rmail.el b/lisp/mail/rmail.el
index bed604883de..4a267a8e9eb 100644
--- a/lisp/mail/rmail.el
+++ b/lisp/mail/rmail.el
@@ -1,6 +1,6 @@
1;;; rmail.el --- main code of "RMAIL" mail reader for Emacs. 1;;; rmail.el --- main code of "RMAIL" mail reader for Emacs.
2 2
3;; Copyright (C) 1985,86,87,88,93,94,95,96 Free Software Foundation, Inc. 3;; Copyright (C) 1985,86,87,88,93,94,95,96,97 Free Software Foundation, Inc.
4 4
5;; Maintainer: FSF 5;; Maintainer: FSF
6;; Keywords: mail 6;; Keywords: mail
@@ -177,6 +177,10 @@ before obeying `rmail-ignored-headers'.")
177(defvar rmail-total-messages nil) 177(defvar rmail-total-messages nil)
178(defvar rmail-message-vector nil) 178(defvar rmail-message-vector nil)
179(defvar rmail-deleted-vector nil) 179(defvar rmail-deleted-vector nil)
180(defvar rmail-msgref-vector nil
181 "In an Rmail buffer, a vector whose Nth element is a list (N).
182When expunging renumbers messages, these lists are modified
183by substituting the new message number into the existing list.")
180 184
181(defvar rmail-overlay-list nil) 185(defvar rmail-overlay-list nil)
182 186
@@ -777,6 +781,7 @@ Instead, these commands are available:
777 (make-local-variable 'file-precious-flag) 781 (make-local-variable 'file-precious-flag)
778 (setq file-precious-flag t) 782 (setq file-precious-flag t)
779 (make-local-variable 'rmail-message-vector) 783 (make-local-variable 'rmail-message-vector)
784 (make-local-variable 'rmail-msgref-vector)
780 (make-local-variable 'rmail-inbox-list) 785 (make-local-variable 'rmail-inbox-list)
781 (setq rmail-inbox-list (rmail-parse-file-inboxes)) 786 (setq rmail-inbox-list (rmail-parse-file-inboxes))
782 ;; Provide default set of inboxes for primary mail file ~/RMAIL. 787 ;; Provide default set of inboxes for primary mail file ~/RMAIL.
@@ -1675,6 +1680,7 @@ change the invisible header text."
1675 (move-marker (aref v i) nil) 1680 (move-marker (aref v i) nil)
1676 (setq i (1+ i))))) 1681 (setq i (1+ i)))))
1677 (setq rmail-message-vector nil) 1682 (setq rmail-message-vector nil)
1683 (setq rmail-msgref-vector nil)
1678 (setq rmail-deleted-vector nil))) 1684 (setq rmail-deleted-vector nil)))
1679 1685
1680(defun rmail-maybe-set-message-counters () 1686(defun rmail-maybe-set-message-counters ()
@@ -1709,6 +1715,13 @@ change the invisible header text."
1709 (concat rmail-deleted-vector deleted-head)) 1715 (concat rmail-deleted-vector deleted-head))
1710 (setq rmail-summary-vector 1716 (setq rmail-summary-vector
1711 (vconcat rmail-summary-vector (make-vector total-messages nil))) 1717 (vconcat rmail-summary-vector (make-vector total-messages nil)))
1718 (setq rmail-msgref-vector
1719 (vconcat rmail-msgref-vector (make-vector total-messages nil)))
1720 ;; Fill in the new elements of rmail-msgref-vector.
1721 (let ((i (- rmail-total-messages old-total-messages)))
1722 (while (<= i rmail-total-messages)
1723 (aset rmail-msgref-vector i (list i))
1724 (setq i (1+ i))))
1712 (goto-char (point-min)) 1725 (goto-char (point-min))
1713 (or nomsg (message "Counting new messages...done (%d)" total-messages)))) 1726 (or nomsg (message "Counting new messages...done (%d)" total-messages))))
1714 1727
@@ -1741,7 +1754,12 @@ change the invisible header text."
1741 (setq rmail-message-vector 1754 (setq rmail-message-vector
1742 (apply 'vector (cons (point-min-marker) messages-head)) 1755 (apply 'vector (cons (point-min-marker) messages-head))
1743 rmail-deleted-vector (concat "D" deleted-head) 1756 rmail-deleted-vector (concat "D" deleted-head)
1744 rmail-summary-vector (make-vector rmail-total-messages nil)) 1757 rmail-summary-vector (make-vector rmail-total-messages nil)
1758 rmail-msgref-vector (make-vector (1+ rmail-total-messages) nil))
1759 (let ((i 0))
1760 (while (<= i rmail-total-messages)
1761 (aset rmail-msgref-vector i (list i))
1762 (setq i (1+ i))))
1745 (message "Counting messages...done"))))) 1763 (message "Counting messages...done")))))
1746 1764
1747(defun rmail-set-message-counters-counter (&optional stop) 1765(defun rmail-set-message-counters-counter (&optional stop)
@@ -2208,6 +2226,7 @@ Deleted messages stay in the file until the \\[rmail-expunge] command is given."
2208 (total rmail-total-messages) 2226 (total rmail-total-messages)
2209 (new-message-number rmail-current-message) 2227 (new-message-number rmail-current-message)
2210 (new-summary nil) 2228 (new-summary nil)
2229 (new-msgref (list (list 0)))
2211 (rmailbuf (current-buffer)) 2230 (rmailbuf (current-buffer))
2212 (buffer-read-only nil) 2231 (buffer-read-only nil)
2213 (messages rmail-message-vector) 2232 (messages rmail-message-vector)
@@ -2219,25 +2238,6 @@ Deleted messages stay in the file until the \\[rmail-expunge] command is given."
2219 rmail-deleted-vector nil 2238 rmail-deleted-vector nil
2220 rmail-summary-vector nil) 2239 rmail-summary-vector nil)
2221 2240
2222 ;; Find each sendmail buffer that is set to reply
2223 ;; to a message in this buffer, and update its
2224 ;; message number.
2225 (let ((bufs (buffer-list)))
2226 (while bufs
2227 (save-excursion
2228 (set-buffer (car bufs))
2229 (let ((tail mail-send-actions) action)
2230 (while tail
2231 (setq action (car tail)
2232 tail (cdr tail))
2233 (and (eq (car action) 'rmail-mark-message)
2234 (eq (nth 1 action) rmailbuf)
2235 (setcar (nthcdr 2 action)
2236 (rmail-msg-number-after-expunge
2237 deleted
2238 (nth 2 action)))))))
2239 (setq bufs (cdr bufs))))
2240
2241 (while (<= number total) 2241 (while (<= number total)
2242 (if (= (aref deleted number) ?D) 2242 (if (= (aref deleted number) ?D)
2243 (progn 2243 (progn
@@ -2253,7 +2253,11 @@ Deleted messages stay in the file until the \\[rmail-expunge] command is given."
2253 (cons (aref messages number) nil))) 2253 (cons (aref messages number) nil)))
2254 (setq new-summary 2254 (setq new-summary
2255 (cons (if (= counter number) (aref summary (1- number))) 2255 (cons (if (= counter number) (aref summary (1- number)))
2256 new-summary))) 2256 new-summary))
2257 (setq new-msgref
2258 (cons (aref rmail-msgref-vector number)
2259 new-msgref))
2260 (setcar (car new-msgref) counter))
2257 (if (zerop (% (setq number (1+ number)) 20)) 2261 (if (zerop (% (setq number (1+ number)) 20))
2258 (message "Expunging deleted messages...%d" number))) 2262 (message "Expunging deleted messages...%d" number)))
2259 (setq messages-tail 2263 (setq messages-tail
@@ -2264,6 +2268,7 @@ Deleted messages stay in the file until the \\[rmail-expunge] command is given."
2264 rmail-message-vector (apply 'vector messages-head) 2268 rmail-message-vector (apply 'vector messages-head)
2265 rmail-deleted-vector (make-string (1+ counter) ?\ ) 2269 rmail-deleted-vector (make-string (1+ counter) ?\ )
2266 rmail-summary-vector (vconcat (nreverse new-summary)) 2270 rmail-summary-vector (vconcat (nreverse new-summary))
2271 rmail-msgref-vector (apply 'vector (nreverse new-msgref))
2267 win t))) 2272 win t)))
2268 (message "Expunging deleted messages...done") 2273 (message "Expunging deleted messages...done")
2269 (if (not win) 2274 (if (not win)
@@ -2390,19 +2395,21 @@ use \\[mail-yank-original] to yank the original message into it."
2390 rmail-view-buffer 2395 rmail-view-buffer
2391 (list (list 'rmail-mark-message 2396 (list (list 'rmail-mark-message
2392 rmail-view-buffer 2397 rmail-view-buffer
2393 msgnum 2398 (aref rmail-msgref-vector msgnum)
2394 "answered")) 2399 "answered"))
2395 nil 2400 nil
2396 (list (cons "References" (concat (mapconcat 'identity references " ") 2401 (list (cons "References" (concat (mapconcat 'identity references " ")
2397 " " message-id)))))) 2402 " " message-id))))))
2398 2403
2399(defun rmail-mark-message (buffer msgnum attribute) 2404(defun rmail-mark-message (buffer msgnum-list attribute)
2400 "Give BUFFER's message number MSGNUM the attribute ATTRIBUTE. 2405 "Give BUFFER's message number in MSGNUM-LIST the attribute ATTRIBUTE.
2401This is use in the send-actions for message buffers." 2406This is use in the send-actions for message buffers.
2407MSGNUM-LIST is a list of the form (MSGNUM)
2408which is an element of rmail-msgref-vector."
2402 (save-excursion 2409 (save-excursion
2403 (set-buffer buffer) 2410 (set-buffer buffer)
2404 (if msgnum 2411 (if (car msgnum-list)
2405 (rmail-set-attribute attribute t msgnum)))) 2412 (rmail-set-attribute attribute t (car msgnum-list)))))
2406 2413
2407(defun rmail-make-in-reply-to-field (from date message-id) 2414(defun rmail-make-in-reply-to-field (from date message-id)
2408 (cond ((not from) 2415 (cond ((not from)
@@ -2481,7 +2488,8 @@ see the documentation of `rmail-resend'."
2481 (if (rmail-start-mail 2488 (if (rmail-start-mail
2482 nil nil subject nil nil nil 2489 nil nil subject nil nil nil
2483 (list (list 'rmail-mark-message 2490 (list (list 'rmail-mark-message
2484 forward-buffer msgnum 2491 forward-buffer
2492 (aref rmail-msgref-vector msgnum)
2485 "forwarded")) 2493 "forwarded"))
2486 ;; If only one window, use it for the mail buffer. 2494 ;; If only one window, use it for the mail buffer.
2487 ;; Otherwise, use another window for the mail buffer 2495 ;; Otherwise, use another window for the mail buffer
@@ -2700,7 +2708,9 @@ specifying headers which should not be copied into the new message."
2700 (let (mail-signature mail-setup-hook) 2708 (let (mail-signature mail-setup-hook)
2701 (if (rmail-start-mail nil nil nil nil nil rmail-buffer 2709 (if (rmail-start-mail nil nil nil nil nil rmail-buffer
2702 (list (list 'rmail-mark-message 2710 (list (list 'rmail-mark-message
2703 rmail-buffer msgnum "retried"))) 2711 rmail-buffer
2712 (aref rmail-msgref-vector msgnum)
2713 "retried")))
2704 ;; Insert original text as initial text of new draft message. 2714 ;; Insert original text as initial text of new draft message.
2705 ;; Bind inhibit-read-only since the header delimiter 2715 ;; Bind inhibit-read-only since the header delimiter
2706 ;; of the previous message was probably read-only. 2716 ;; of the previous message was probably read-only.