]> git.eshelyaron.com Git - emacs.git/commitdiff
(rmail-view-buffer): Make buffer-local.
authorStefan Monnier <monnier@iro.umontreal.ca>
Sun, 1 Feb 2009 03:39:37 +0000 (03:39 +0000)
committerStefan Monnier <monnier@iro.umontreal.ca>
Sun, 1 Feb 2009 03:39:37 +0000 (03:39 +0000)
(rmail-select-summary, rmail-perm-variables, rmail-redecode-body)
(rmail-undelete-previous-message, rmail-mark-message)
(rmail-speedbar-buttons): Use with-current-buffer.
(rmail-mode-map): Move initialization into declaration.
(rmail-swap-buffers, rmail-unfontify-buffer-function)
(rmail-fontify-message): Use restore-buffer-modified-p.
(rmail-expunge-and-save): Don't swap buffer.
(rmail-get-header, rmail-set-header, rmail-set-attribute)
(rmail-apply-in-message): Swap save-excursion and save-restriction.

lisp/ChangeLog
lisp/mail/rmail.el

index 9188230e6f7ca6874fd3d4f7ea4c318f7d8a3705..020cc4e71cbc8698967741e918bd7026e8f854fd 100644 (file)
@@ -1,5 +1,16 @@
 2009-02-01  Stefan Monnier  <monnier@iro.umontreal.ca>
 
+       * mail/rmail.el (rmail-view-buffer): Make buffer-local.
+       (rmail-select-summary, rmail-perm-variables, rmail-redecode-body)
+       (rmail-undelete-previous-message, rmail-mark-message)
+       (rmail-speedbar-buttons): Use with-current-buffer.
+       (rmail-mode-map): Move initialization into declaration.
+       (rmail-swap-buffers, rmail-unfontify-buffer-function)
+       (rmail-fontify-message): Use restore-buffer-modified-p.
+       (rmail-expunge-and-save): Don't swap buffer.
+       (rmail-get-header, rmail-set-header, rmail-set-attribute)
+       (rmail-apply-in-message): Swap save-excursion and save-restriction.
+
        * mail/rmailsort.el (rmail-sort-messages): Use car-less-than-car
        if possible.
 
index b2bd29c19917710539597b9ba169d87873e10cf2..3966c0edac34f71d4d0f092a7146de5eda71df3e 100644 (file)
@@ -563,6 +563,7 @@ by substituting the new message number into the existing list.")
 
 (defvar rmail-view-buffer nil
   "Buffer which holds RMAIL message for MIME displaying.")
+(make-variable-buffer-local 'rmail-view-buffer)
 (put 'rmail-view-buffer 'permanent-local t)
 \f
 ;; `Sticky' default variables.
@@ -675,10 +676,6 @@ the variable `rmail-mime-feature'.")
 The first parenthesized expression should match the MIME-charset name.")
 
 \f
-;;; Regexp matching the delimiter of messages in UNIX mail format
-;;; (UNIX From lines), minus the initial ^.  Note that if you change
-;;; this expression, you must change the code in rmail-nuke-pinhead-header
-;;; that knows the exact ordering of the \\( \\) subexpressions.
 (defvar rmail-unix-mail-delimiter
   (let ((time-zone-regexp
         (concat "\\([A-Z]?[A-Z]?[A-Z][A-Z]\\( DST\\)?"
@@ -729,7 +726,10 @@ The first parenthesized expression should match the MIME-charset name.")
      "\\(remote from .*\\)?"
 
      "\n"))
-  nil)
+  "Regexp matching the delimiter of messages in UNIX mail format
+\(UNIX From lines), minus the initial ^.  Note that if you change
+this expression, you must change the code in rmail-nuke-pinhead-header
+that knows the exact ordering of the \\( \\) subexpressions.")
 
 (defvar rmail-font-lock-keywords
   ;; These are all matched case-insensitively.
@@ -774,8 +774,7 @@ The first parenthesized expression should match the MIME-charset name.")
                   (let ((rmail-total-messages total))
                     ,@body))
               (select-window window))))
-       (save-excursion
-        (set-buffer rmail-summary-buffer)
+       (with-current-buffer rmail-summary-buffer
         (let ((rmail-total-messages total))
           ,@body)))
      (rmail-maybe-display-summary)))
@@ -843,15 +842,15 @@ If `rmail-display-summary' is non-nil, make a summary for this RMAIL file."
       (switch-to-buffer
        (let ((enable-local-variables nil))
         (find-file-noselect file-name))))
-    ;; Insure that the collection and view buffers are in sync and
-    ;; insure that a message is not being edited.
+    ;; Ensure that the collection and view buffers are in sync and
+    ;; ensure that a message is not being edited.
     (if (eq major-mode 'rmail-mode)
        (rmail-swap-buffers-maybe))
     (if (eq major-mode 'rmail-edit-mode)
        (error "Exit Rmail Edit mode before getting new mail"))
     (or (and existed (> (buffer-size) 0))
        (setq run-mail-hook t))
-    ;; Insure that the Rmail file is in mbox format, the buffer is in
+    ;; Ensure that the Rmail file is in mbox format, the buffer is in
     ;; Rmail mode and has been scanned to find all the messages
     ;; (setting the global message variables in the process).
     (rmail-convert-file-maybe)
@@ -942,183 +941,183 @@ The buffer is expected to be narrowed to just the header of the message."
 \f
 ;;; Set up Rmail mode keymaps
 
-(defvar rmail-mode-map nil)
-(if rmail-mode-map
-    nil
-  (setq rmail-mode-map (make-keymap))
-  (suppress-keymap rmail-mode-map)
-  (define-key rmail-mode-map "a"      'rmail-add-label)
-  (define-key rmail-mode-map "b"      'rmail-bury)
-  (define-key rmail-mode-map "c"      'rmail-continue)
-  (define-key rmail-mode-map "d"      'rmail-delete-forward)
-  (define-key rmail-mode-map "\C-d"   'rmail-delete-backward)
-  (define-key rmail-mode-map "e"      'rmail-edit-current-message)
-  (define-key rmail-mode-map "f"      'rmail-forward)
-  (define-key rmail-mode-map "g"      'rmail-get-new-mail)
-  (define-key rmail-mode-map "h"      'rmail-summary)
-  (define-key rmail-mode-map "i"      'rmail-input)
-  (define-key rmail-mode-map "j"      'rmail-show-message-maybe)
-  (define-key rmail-mode-map "k"      'rmail-kill-label)
-  (define-key rmail-mode-map "l"      'rmail-summary-by-labels)
-  (define-key rmail-mode-map "\e\C-h" 'rmail-summary)
-  (define-key rmail-mode-map "\e\C-l" 'rmail-summary-by-labels)
-  (define-key rmail-mode-map "\e\C-r" 'rmail-summary-by-recipients)
-  (define-key rmail-mode-map "\e\C-s" 'rmail-summary-by-regexp)
-  (define-key rmail-mode-map "\e\C-t" 'rmail-summary-by-topic)
-  (define-key rmail-mode-map "m"      'rmail-mail)
-  (define-key rmail-mode-map "\em"    'rmail-retry-failure)
-  (define-key rmail-mode-map "n"      'rmail-next-undeleted-message)
-  (define-key rmail-mode-map "\en"    'rmail-next-message)
-  (define-key rmail-mode-map "\e\C-n" 'rmail-next-labeled-message)
-  (define-key rmail-mode-map "o"      'rmail-output)
-  (define-key rmail-mode-map "\C-o"   'rmail-output-as-seen)
-  (define-key rmail-mode-map "p"      'rmail-previous-undeleted-message)
-  (define-key rmail-mode-map "\ep"    'rmail-previous-message)
-  (define-key rmail-mode-map "\e\C-p" 'rmail-previous-labeled-message)
-  (define-key rmail-mode-map "q"      'rmail-quit)
-  (define-key rmail-mode-map "r"      'rmail-reply)
-;; I find I can't live without the default M-r command -- rms.
-;;  (define-key rmail-mode-map "\er"  'rmail-search-backwards)
-  (define-key rmail-mode-map "s"      'rmail-expunge-and-save)
-  (define-key rmail-mode-map "\es"    'rmail-search)
-  (define-key rmail-mode-map "t"      'rmail-toggle-header)
-  (define-key rmail-mode-map "u"      'rmail-undelete-previous-message)
-  (define-key rmail-mode-map "w"      'rmail-output-body-to-file)
-  (define-key rmail-mode-map "\C-c\C-w"    'rmail-widen)
-  (define-key rmail-mode-map "x"      'rmail-expunge)
-  (define-key rmail-mode-map "."      'rmail-beginning-of-message)
-  (define-key rmail-mode-map "/"      'rmail-end-of-message)
-  (define-key rmail-mode-map "<"      'rmail-first-message)
-  (define-key rmail-mode-map ">"      'rmail-last-message)
-  (define-key rmail-mode-map " "      'scroll-up)
-  (define-key rmail-mode-map "\177"   'scroll-down)
-  (define-key rmail-mode-map "?"      'describe-mode)
-  (define-key rmail-mode-map "\C-c\C-s\C-d" 'rmail-sort-by-date)
-  (define-key rmail-mode-map "\C-c\C-s\C-s" 'rmail-sort-by-subject)
-  (define-key rmail-mode-map "\C-c\C-s\C-a" 'rmail-sort-by-author)
-  (define-key rmail-mode-map "\C-c\C-s\C-r" 'rmail-sort-by-recipient)
-  (define-key rmail-mode-map "\C-c\C-s\C-c" 'rmail-sort-by-correspondent)
-  (define-key rmail-mode-map "\C-c\C-s\C-l" 'rmail-sort-by-lines)
-  (define-key rmail-mode-map "\C-c\C-s\C-k" 'rmail-sort-by-labels)
-  (define-key rmail-mode-map "\C-c\C-n" 'rmail-next-same-subject)
-  (define-key rmail-mode-map "\C-c\C-p" 'rmail-previous-same-subject)
-  )
+(defvar rmail-mode-map
+  (let ((map (make-keymap)))
+    (suppress-keymap map)
+    (define-key map "a"      'rmail-add-label)
+    (define-key map "b"      'rmail-bury)
+    (define-key map "c"      'rmail-continue)
+    (define-key map "d"      'rmail-delete-forward)
+    (define-key map "\C-d"   'rmail-delete-backward)
+    (define-key map "e"      'rmail-edit-current-message)
+    (define-key map "f"      'rmail-forward)
+    (define-key map "g"      'rmail-get-new-mail)
+    (define-key map "h"      'rmail-summary)
+    (define-key map "i"      'rmail-input)
+    (define-key map "j"      'rmail-show-message-maybe)
+    (define-key map "k"      'rmail-kill-label)
+    (define-key map "l"      'rmail-summary-by-labels)
+    (define-key map "\e\C-h" 'rmail-summary)
+    (define-key map "\e\C-l" 'rmail-summary-by-labels)
+    (define-key map "\e\C-r" 'rmail-summary-by-recipients)
+    (define-key map "\e\C-s" 'rmail-summary-by-regexp)
+    (define-key map "\e\C-t" 'rmail-summary-by-topic)
+    (define-key map "m"      'rmail-mail)
+    (define-key map "\em"    'rmail-retry-failure)
+    (define-key map "n"      'rmail-next-undeleted-message)
+    (define-key map "\en"    'rmail-next-message)
+    (define-key map "\e\C-n" 'rmail-next-labeled-message)
+    (define-key map "o"      'rmail-output)
+    (define-key map "\C-o"   'rmail-output-as-seen)
+    (define-key map "p"      'rmail-previous-undeleted-message)
+    (define-key map "\ep"    'rmail-previous-message)
+    (define-key map "\e\C-p" 'rmail-previous-labeled-message)
+    (define-key map "q"      'rmail-quit)
+    (define-key map "r"      'rmail-reply)
+    ;; I find I can't live without the default M-r command -- rms.
+    ;;  (define-key rmail-mode-map "\er"  'rmail-search-backwards)
+    (define-key map "s"      'rmail-expunge-and-save)
+    (define-key map "\es"    'rmail-search)
+    (define-key map "t"      'rmail-toggle-header)
+    (define-key map "u"      'rmail-undelete-previous-message)
+    (define-key map "w"      'rmail-output-body-to-file)
+    (define-key map "\C-c\C-w"    'rmail-widen)
+    (define-key map "x"      'rmail-expunge)
+    (define-key map "."      'rmail-beginning-of-message)
+    (define-key map "/"      'rmail-end-of-message)
+    (define-key map "<"      'rmail-first-message)
+    (define-key map ">"      'rmail-last-message)
+    (define-key map " "      'scroll-up)
+    (define-key map "\177"   'scroll-down)
+    (define-key map "?"      'describe-mode)
+    (define-key map "\C-c\C-s\C-d" 'rmail-sort-by-date)
+    (define-key map "\C-c\C-s\C-s" 'rmail-sort-by-subject)
+    (define-key map "\C-c\C-s\C-a" 'rmail-sort-by-author)
+    (define-key map "\C-c\C-s\C-r" 'rmail-sort-by-recipient)
+    (define-key map "\C-c\C-s\C-c" 'rmail-sort-by-correspondent)
+    (define-key map "\C-c\C-s\C-l" 'rmail-sort-by-lines)
+    (define-key map "\C-c\C-s\C-k" 'rmail-sort-by-labels)
+    (define-key map "\C-c\C-n" 'rmail-next-same-subject)
+    (define-key map "\C-c\C-p" 'rmail-previous-same-subject)
+
 \f
-(define-key rmail-mode-map [menu-bar] (make-sparse-keymap))
+    (define-key map [menu-bar] (make-sparse-keymap))
+
+    (define-key map [menu-bar classify]
+      (cons "Classify" (make-sparse-keymap "Classify")))
 
-(define-key rmail-mode-map [menu-bar classify]
-  (cons "Classify" (make-sparse-keymap "Classify")))
+    (define-key map [menu-bar classify input-menu]
+      nil)
 
-(define-key rmail-mode-map [menu-bar classify input-menu]
-  nil)
+    (define-key map [menu-bar classify output-menu]
+      nil)
 
-(define-key rmail-mode-map [menu-bar classify output-menu]
-  nil)
+    (define-key map [menu-bar classify output-body]
+      '("Output body to file..." . rmail-output-body-to-file))
 
-(define-key rmail-mode-map [menu-bar classify output-body]
-  '("Output body to file..." . rmail-output-body-to-file))
+    (define-key map [menu-bar classify output-inbox]
+      '("Output..." . rmail-output))
 
-(define-key rmail-mode-map [menu-bar classify output-inbox]
-  '("Output..." . rmail-output))
+    (define-key map [menu-bar classify output]
+      '("Output as seen..." . rmail-output-as-seen))
 
-(define-key rmail-mode-map [menu-bar classify output]
-  '("Output as seen..." . rmail-output-as-seen))
+    (define-key map [menu-bar classify kill-label]
+      '("Kill Label..." . rmail-kill-label))
 
-(define-key rmail-mode-map [menu-bar classify kill-label]
-  '("Kill Label..." . rmail-kill-label))
+    (define-key map [menu-bar classify add-label]
+      '("Add Label..." . rmail-add-label))
 
-(define-key rmail-mode-map [menu-bar classify add-label]
-  '("Add Label..." . rmail-add-label))
+    (define-key map [menu-bar summary]
+      (cons "Summary" (make-sparse-keymap "Summary")))
 
-(define-key rmail-mode-map [menu-bar summary]
-  (cons "Summary" (make-sparse-keymap "Summary")))
+    (define-key map [menu-bar summary senders]
+      '("By Senders..." . rmail-summary-by-senders))
 
-(define-key rmail-mode-map [menu-bar summary senders]
-  '("By Senders..." . rmail-summary-by-senders))
+    (define-key map [menu-bar summary labels]
+      '("By Labels..." . rmail-summary-by-labels))
 
-(define-key rmail-mode-map [menu-bar summary labels]
-  '("By Labels..." . rmail-summary-by-labels))
+    (define-key map [menu-bar summary recipients]
+      '("By Recipients..." . rmail-summary-by-recipients))
 
-(define-key rmail-mode-map [menu-bar summary recipients]
-  '("By Recipients..." . rmail-summary-by-recipients))
+    (define-key map [menu-bar summary topic]
+      '("By Topic..." . rmail-summary-by-topic))
 
-(define-key rmail-mode-map [menu-bar summary topic]
-  '("By Topic..." . rmail-summary-by-topic))
+    (define-key map [menu-bar summary regexp]
+      '("By Regexp..." . rmail-summary-by-regexp))
 
-(define-key rmail-mode-map [menu-bar summary regexp]
-  '("By Regexp..." . rmail-summary-by-regexp))
+    (define-key map [menu-bar summary all]
+      '("All" . rmail-summary))
 
-(define-key rmail-mode-map [menu-bar summary all]
-  '("All" . rmail-summary))
+    (define-key map [menu-bar mail]
+      (cons "Mail" (make-sparse-keymap "Mail")))
 
-(define-key rmail-mode-map [menu-bar mail]
-  (cons "Mail" (make-sparse-keymap "Mail")))
+    (define-key map [menu-bar mail rmail-get-new-mail]
+      '("Get New Mail" . rmail-get-new-mail))
 
-(define-key rmail-mode-map [menu-bar mail rmail-get-new-mail]
-  '("Get New Mail" . rmail-get-new-mail))
+    (define-key map [menu-bar mail lambda]
+      '("----"))
 
-(define-key rmail-mode-map [menu-bar mail lambda]
-  '("----"))
+    (define-key map [menu-bar mail continue]
+      '("Continue" . rmail-continue))
 
-(define-key rmail-mode-map [menu-bar mail continue]
-  '("Continue" . rmail-continue))
+    (define-key map [menu-bar mail resend]
+      '("Re-send..." . rmail-resend))
 
-(define-key rmail-mode-map [menu-bar mail resend]
-  '("Re-send..." . rmail-resend))
+    (define-key map [menu-bar mail forward]
+      '("Forward" . rmail-forward))
 
-(define-key rmail-mode-map [menu-bar mail forward]
-  '("Forward" . rmail-forward))
+    (define-key map [menu-bar mail retry]
+      '("Retry" . rmail-retry-failure))
 
-(define-key rmail-mode-map [menu-bar mail retry]
-  '("Retry" . rmail-retry-failure))
+    (define-key map [menu-bar mail reply]
+      '("Reply" . rmail-reply))
 
-(define-key rmail-mode-map [menu-bar mail reply]
-  '("Reply" . rmail-reply))
+    (define-key map [menu-bar mail mail]
+      '("Mail" . rmail-mail))
 
-(define-key rmail-mode-map [menu-bar mail mail]
-  '("Mail" . rmail-mail))
+    (define-key map [menu-bar delete]
+      (cons "Delete" (make-sparse-keymap "Delete")))
 
-(define-key rmail-mode-map [menu-bar delete]
-  (cons "Delete" (make-sparse-keymap "Delete")))
+    (define-key map [menu-bar delete expunge/save]
+      '("Expunge/Save" . rmail-expunge-and-save))
 
-(define-key rmail-mode-map [menu-bar delete expunge/save]
-  '("Expunge/Save" . rmail-expunge-and-save))
+    (define-key map [menu-bar delete expunge]
+      '("Expunge" . rmail-expunge))
 
-(define-key rmail-mode-map [menu-bar delete expunge]
-  '("Expunge" . rmail-expunge))
+    (define-key map [menu-bar delete undelete]
+      '("Undelete" . rmail-undelete-previous-message))
 
-(define-key rmail-mode-map [menu-bar delete undelete]
-  '("Undelete" . rmail-undelete-previous-message))
+    (define-key map [menu-bar delete delete]
+      '("Delete" . rmail-delete-forward))
 
-(define-key rmail-mode-map [menu-bar delete delete]
-  '("Delete" . rmail-delete-forward))
+    (define-key map [menu-bar move]
+      (cons "Move" (make-sparse-keymap "Move")))
 
-(define-key rmail-mode-map [menu-bar move]
-  (cons "Move" (make-sparse-keymap "Move")))
+    (define-key map [menu-bar move search-back]
+      '("Search Back..." . rmail-search-backwards))
 
-(define-key rmail-mode-map [menu-bar move search-back]
-  '("Search Back..." . rmail-search-backwards))
+    (define-key map [menu-bar move search]
+      '("Search..." . rmail-search))
 
-(define-key rmail-mode-map [menu-bar move search]
-  '("Search..." . rmail-search))
+    (define-key map [menu-bar move previous]
+      '("Previous Nondeleted" . rmail-previous-undeleted-message))
 
-(define-key rmail-mode-map [menu-bar move previous]
-  '("Previous Nondeleted" . rmail-previous-undeleted-message))
+    (define-key map [menu-bar move next]
+      '("Next Nondeleted" . rmail-next-undeleted-message))
 
-(define-key rmail-mode-map [menu-bar move next]
-  '("Next Nondeleted" . rmail-next-undeleted-message))
+    (define-key map [menu-bar move last]
+      '("Last" . rmail-last-message))
 
-(define-key rmail-mode-map [menu-bar move last]
-  '("Last" . rmail-last-message))
+    (define-key map [menu-bar move first]
+      '("First" . rmail-first-message))
 
-(define-key rmail-mode-map [menu-bar move first]
-  '("First" . rmail-first-message))
+    (define-key map [menu-bar move previous]
+      '("Previous" . rmail-previous-message))
 
-(define-key rmail-mode-map [menu-bar move previous]
-  '("Previous" . rmail-previous-message))
+    (define-key map [menu-bar move next]
+      '("Next" . rmail-next-message))
 
-(define-key rmail-mode-map [menu-bar move next]
-  '("Next" . rmail-next-message))
+    map))
 
 ;; Rmail toolbar
 (defvar rmail-tool-bar-map
@@ -1271,7 +1270,7 @@ sets the current buffer's `buffer-file-coding-system' to that of
           buffer-file-coding-system)))
     (buffer-swap-text rmail-view-buffer)
     (setq buffer-file-coding-system coding)
-    (set-buffer-modified-p modp)))
+    (restore-buffer-modified-p modp)))
 
 (defun rmail-buffers-swapped-p ()
   "Return non-nil if the message collection is in `rmail-view-buffer'."
@@ -1303,10 +1302,7 @@ If so restore the actual mbox message collection."
   (make-local-variable 'rmail-buffer)
   (setq rmail-buffer (current-buffer))
   (set-buffer-multibyte nil)
-  (make-local-variable 'rmail-view-buffer)
-  (save-excursion
-    (setq rmail-view-buffer (rmail-generate-viewer-buffer))
-    (set-buffer rmail-view-buffer)
+  (with-current-buffer (setq rmail-view-buffer (rmail-generate-viewer-buffer))
     (setq buffer-undo-list t)
     (set-buffer-multibyte t)
     ;; Force C-x C-s write Unix EOLs.
@@ -1391,7 +1387,8 @@ If so restore the actual mbox message collection."
   (interactive)
   (set-buffer rmail-buffer)
   (rmail-expunge t)
-  (rmail-swap-buffers-maybe)
+  ;; No need to swap buffers: rmail-write-region-annotate takes care of it.
+  ;; (rmail-swap-buffers-maybe)
   (save-buffer)
   (if (rmail-summary-exists)
       (rmail-select-summary (set-buffer-modified-p nil)))
@@ -1944,7 +1941,7 @@ new messages.  Return the number of new messages."
            limit)
        ;; Detect an empty inbox file.
        (unless (= start (point-max))
-         ;; Scan the new messages to establish a count and to insure that
+         ;; Scan the new messages to establish a count and to ensure that
          ;; an attribute header is present.
          (while (looking-at "From ")
            ;; Determine if a new attribute header needs to be added to
@@ -1977,9 +1974,9 @@ If MSGNUM is nil, use the current message."
        (save-excursion
          ;; ... so it is ok to go to a different buffer.
          (if (rmail-buffers-swapped-p) (set-buffer rmail-view-buffer))
+          (save-excursion
          (save-restriction
            (widen)
-           (save-excursion
              (goto-char msgbeg)
              (setq end (search-forward "\n\n" nil t))
              (if end
@@ -2001,9 +1998,9 @@ If MSGNUM is nil, use the current message."
        (save-excursion
          ;; ... so it is ok to go to a different buffer.
          (if (rmail-buffers-swapped-p) (set-buffer rmail-view-buffer))
+          (save-excursion
          (save-restriction
            (widen)
-           (save-excursion
              (goto-char msgbeg)
              (setq end (search-forward "\n\n" nil t))
              (if end (setq end (1- end)))
@@ -2117,9 +2114,9 @@ change; nil means current message."
            (save-excursion
              ;; ... so it is ok to go to a different buffer.
              (if (rmail-buffers-swapped-p) (set-buffer rmail-view-buffer))
+              (save-excursion
              (save-restriction
                (widen)
-               (save-excursion
                  ;; Determine if the current state is the desired state.
                  (goto-char msgbeg)
                  (save-excursion
@@ -2204,13 +2201,12 @@ If MSGNUM is nil, use the current message."
        (save-excursion
          ;; ... so it is ok to go to a different buffer.
          (if (rmail-buffers-swapped-p) (set-buffer rmail-view-buffer))
+          (save-excursion
          (save-restriction
            (widen)
-           (save-excursion
              (goto-char msgbeg)
-             (save-restriction
                (narrow-to-region msgbeg msgend)
-               (apply function args)))))))))
+              (apply function args))))))))
 
 (defun rmail-widen-to-current-msgbeg (function)
   "Call FUNCTION with point at start of internal data of current message.
@@ -2462,6 +2458,7 @@ N defaults to the current message."
   (interactive "p")
   (or (eq major-mode 'rmail-mode)
       (switch-to-buffer rmail-buffer))
+  ;; FIXME: Why do we swap the raw data back in?
   (rmail-swap-buffers-maybe)
   (rmail-maybe-set-message-counters)
   (widen)
@@ -2675,8 +2672,7 @@ to be used to fix messages encoded with 8-bit encodings, such as
 iso-8859, koi8-r, etc."
   (interactive "zCoding system for re-decoding this message: ")
   (when (not rmail-enable-mime)
-    (save-excursion
-      (set-buffer rmail-buffer)
+    (with-current-buffer rmail-buffer
       (rmail-swap-buffers-maybe)
       (save-restriction
        (widen)
@@ -3109,8 +3105,7 @@ If N is negative, go forwards instead."
          (rmail-show-message-maybe msg))
       (rmail-set-attribute rmail-deleted-attr-index nil)
       (if (rmail-summary-exists)
-         (save-excursion
-           (set-buffer rmail-summary-buffer)
+         (with-current-buffer rmail-summary-buffer
            (rmail-summary-mark-undeleted msg)))
       (rmail-maybe-display-summary))))
 
@@ -3407,8 +3402,7 @@ use \\[mail-yank-original] to yank the original message into it."
 This is use in the send-actions for message buffers.
 MSGNUM-LIST is a list of the form (MSGNUM)
 which is an element of rmail-msgref-vector."
-  (save-excursion
-    (set-buffer buffer)
+  (with-current-buffer buffer
     (if (car msgnum-list)
        (rmail-set-attribute attribute t (car msgnum-list)))))
 
@@ -3816,7 +3810,8 @@ This has an effect only if a summary buffer exists."
       (remove-hook 'rmail-show-message-hook 'rmail-fontify-message t)
       (remove-text-properties (point-min) (point-max) '(rmail-fontified nil))
       (font-lock-default-unfontify-buffer)
-      (and (not modified) (buffer-modified-p) (set-buffer-modified-p nil)))))
+      (and (not modified) (buffer-modified-p)
+           (restore-buffer-modified-p nil)))))
 
 (defun rmail-fontify-message ()
   ;; Fontify the current message if it is not already fontified.
@@ -3829,7 +3824,8 @@ This has an effect only if a summary buffer exists."
          (save-match-data
            (add-text-properties (point-min) (point-max) '(rmail-fontified t))
            (font-lock-fontify-region (point-min) (point-max))
-           (and (not modified) (buffer-modified-p) (set-buffer-modified-p nil)))))))
+           (and (not modified) (buffer-modified-p)
+                 (restore-buffer-modified-p nil)))))))
 \f
 ;;; Speedbar support for RMAIL files.
 (eval-when-compile (require 'speedbar))
@@ -3875,8 +3871,7 @@ Click on the address under Reply to: to reply to this person.
 Under Folders: Click a name to read it, or on the <M> to move the
 current message into that RMAIL folder."
   (let ((from nil))
-    (save-excursion
-      (set-buffer buffer)
+    (with-current-buffer buffer
       (goto-char (point-min))
       (if (not (re-search-forward "^Reply-To: " nil t))
          (if (not (re-search-forward "^From:? " nil t))
@@ -3896,8 +3891,8 @@ current message into that RMAIL folder."
                                  'rmail-speedbar-button 'rmail-reply))
       (insert "Folders:\n")
       (let* ((case-fold-search nil)
-            (df (directory-files (save-excursion (set-buffer buffer)
-                                                 default-directory)
+            (df (directory-files (with-current-buffer buffer
+                                    default-directory)
                                  nil rmail-speedbar-match-folder-regexp)))
        (while df
          (speedbar-insert-button "<M>" 'speedbar-button-face 'highlight