Prevent save-buffer in Rmail buffers from using the coding-system

of the current message, and from clobbering the encoding mnemonics
in the mode line (Bug#4623).

(rmail-swap-buffers): Swap encoding and modified flag, too.
(rmail-message-encoding): New variable.
(rmail-write-region-annotate): Record the encoding of the current message
in rmail-message-encoding.
(rmail-after-save-hook): New function, restores the encoding of the current
message after the message collection is saved.
This commit is contained in:
Eli Zaretskii 2009-12-07 19:21:57 +00:00
parent 9136e89523
commit 5e7a90229a
2 changed files with 42 additions and 7 deletions

View file

@ -1,3 +1,17 @@
2009-12-07 Eli Zaretskii <eliz@gnu.org>
Prevent save-buffer in Rmail buffers from using the coding-system
of the current message, and from clobbering the encoding mnemonics
in the mode line (Bug#4623).
* mail/rmail.el (rmail-swap-buffers): Swap encoding and modified
flag, too.
(rmail-message-encoding): New variable.
(rmail-write-region-annotate): Record the encoding of the current
message in rmail-message-encoding.
(rmail-after-save-hook): New function, restores the encoding of
the current message after the message collection is saved.
2009-12-07 Juri Linkov <juri@jurta.org>
* progmodes/grep.el (grep-read-files): Use `completing-read'

View file

@ -1316,13 +1316,19 @@ Create the buffer if necessary."
This function preserves the current buffer's modified flag, and also
sets the current buffer's `buffer-file-coding-system' to that of
`rmail-view-buffer'."
(let ((modp (buffer-modified-p))
(coding
(let ((modp-this (buffer-modified-p))
(modp-that
(with-current-buffer rmail-view-buffer (buffer-modified-p)))
(coding-this buffer-file-coding-system)
(coding-that
(with-current-buffer rmail-view-buffer
buffer-file-coding-system)))
(buffer-swap-text rmail-view-buffer)
(setq buffer-file-coding-system coding)
(restore-buffer-modified-p modp)))
(setq buffer-file-coding-system coding-that)
(with-current-buffer rmail-view-buffer
(setq buffer-file-coding-system coding-this)
(restore-buffer-modified-p modp-that))
(restore-buffer-modified-p modp-this)))
(defun rmail-buffers-swapped-p ()
"Return non-nil if the message collection is in `rmail-view-buffer'."
@ -4179,16 +4185,31 @@ encoded string (and the same mask) will decode the string."
(add-to-list 'desktop-buffer-mode-handlers
'(rmail-mode . rmail-restore-desktop-buffer))
;; We use this to record the encoding of the current message before
;; saving the message collection.
(defvar rmail-message-encoding nil)
;; Used in `write-region-annotate-functions' to write rmail files.
(defun rmail-write-region-annotate (start end)
(when (and (null start) (rmail-buffers-swapped-p))
(setq rmail-message-encoding buffer-file-coding-system)
(set-buffer rmail-view-buffer)
;; Prevent viewing different messages from messing up the coding. (Bug#4623)
;; FIXME is there a better solution?
(set (make-local-variable 'coding-system-for-write) 'no-conversion)
(widen)
nil))
;; Used to restore the encoding of the buffer where we show the
;; current message, after we save the message collection. This is
;; needed because rmail-write-region-annotate switches buffers behind
;; save-file's back, with the side effect that last-coding-system-used
;; is assigned to buffer-file-coding-system of the wrong buffer.
(defun rmail-after-save-hook ()
(if (or (eq rmail-view-buffer (current-buffer))
(eq rmail-buffer (current-buffer)))
(with-current-buffer
(if (rmail-buffers-swapped-p) rmail-buffer rmail-view-buffer)
(setq buffer-file-coding-system rmail-message-encoding))))
(add-hook 'after-save-hook 'rmail-after-save-hook)
;;; Start of automatically extracted autoloads.