;;; rmail.el --- main code of "RMAIL" mail reader for Emacs
-;; Copyright (C) 1985-1988, 1993-1998, 2000-2012
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1985-1988, 1993-1998, 2000-2013 Free Software
+;; Foundation, Inc.
;; Maintainer: FSF
;; Keywords: mail
(define-key map "<" 'rmail-first-message)
(define-key map ">" 'rmail-last-message)
(define-key map " " 'scroll-up-command)
+ (define-key map [?\S-\ ] 'scroll-down-command)
(define-key map "\177" 'scroll-down-command)
(define-key map "?" 'describe-mode)
(define-key map "\C-c\C-s\C-d" 'rmail-sort-by-date)
(setq file-precious-flag t)
(make-local-variable 'desktop-save-buffer)
(setq desktop-save-buffer t)
+ (make-local-variable 'save-buffer-coding-system)
+ (setq save-buffer-coding-system 'no-conversion)
(setq next-error-move-function 'rmail-next-error-move))
\f
;; Handle M-x revert-buffer done in an rmail-mode buffer.
(defun rmail-set-header-1 (name value)
"Subroutine of `rmail-set-header'.
-Narrow to header, set header NAME to VALUE, replacing existing if present.
-VALUE nil means to remove NAME altogether."
+Narrow to headers, set header NAME to VALUE, replacing existing if present.
+VALUE nil means to remove NAME altogether.
+
+Only changes the first instance of NAME. If VALUE is multi-line,
+continuation lines should already be indented. VALUE should not
+end in a newline."
(if (search-forward "\n\n" nil t)
(progn
(forward-char -1)
(narrow-to-region (point-min) (point))
+ ;; cf mail-fetch-field.
(goto-char (point-min))
- (if (re-search-forward (concat "^" (regexp-quote name) ":") nil 'move)
+ (if (let ((case-fold-search t))
+ (re-search-forward (concat "^" (regexp-quote name) "[ \t]*:")
+ nil 'move))
+ (let ((start (point))
+ end)
+ (while (and (zerop (forward-line 1))
+ (looking-at "[ \t]")))
+ ;; Back up over newline.
+ (forward-char -1)
+ (setq end (point))
+ (goto-char start)
(if value
(progn
- (delete-region (point) (line-end-position))
+ (delete-region start end)
(insert " " value))
- (delete-region (line-beginning-position)
- (line-beginning-position 2)))
+ (delete-region (line-beginning-position) (1+ end))))
+ ;; Not already present: insert at end of headers.
(if value (insert name ": " value "\n"))))
(rmail-error-bad-format)))
;; If the frame was probably made for this buffer, the user
;; probably wants to delete it now.
((display-multi-frame-p)
- (delete-frame (selected-frame)))
+ (delete-frame))
;; The previous frame is where normally they have the Rmail buffer
;; displayed.
(t (other-frame -1))))
(autoload 'mail-position-on-field "sendmail")
+(declare-function rmail-mime-message-p "rmailmm" ())
+(declare-function rmail-mime-toggle-raw "rmailmm" (&optional state))
+
(defun rmail-retry-failure ()
"Edit a mail message which is based on the contents of the current message.
For a message rejected by the mail system, extract the interesting headers and
specifying headers which should not be copied into the new message."
(interactive)
(require 'mail-utils)
- (if rmail-enable-mime
+ ;; FIXME This does not handle rmail-mime-feature != 'rmailmm.
+ ;; There is no API defined for rmail-mime-feature to provide
+ ;; rmail-mime-message-p, rmail-mime-toggle-raw equivalents.
+ ;; But does anyone actually use rmail-mime-feature != 'rmailmm?
+ (if (and rmail-enable-mime
+ (eq rmail-mime-feature 'rmailmm)
+ (featurep rmail-mime-feature))
(with-current-buffer rmail-buffer
(if (rmail-mime-message-p)
(let ((rmail-mime-mbox-buffer rmail-view-buffer)
;; Put the summary buffer back on the screen, if user wants that.
(defun rmail-maybe-display-summary ()
- (let ((selected (selected-window))
- (buffer (current-buffer))
- window)
- ;; If requested, make sure the summary is displayed.
- (and rmail-summary-buffer (buffer-name rmail-summary-buffer)
- rmail-redisplay-summary
- (if (get-buffer-window rmail-summary-buffer 0)
- ;; It's already in some frame; show that one.
- (let ((frame (window-frame
- (get-buffer-window rmail-summary-buffer 0))))
- (make-frame-visible frame)
- (raise-frame frame))
- (display-buffer rmail-summary-buffer)))
- ;; If requested, set the height of the summary window.
- (and rmail-summary-buffer (buffer-name rmail-summary-buffer)
- rmail-summary-window-size
- (setq window (get-buffer-window rmail-summary-buffer))
- ;; Don't try to change the size if just one window in frame.
- (not (eq window (frame-root-window (window-frame window))))
- (unwind-protect
- (progn
- (select-window window)
- (enlarge-window (- rmail-summary-window-size (window-height))))
- (select-window selected)
- (set-buffer buffer)))))
+ (cond
+ ((or (not rmail-summary-buffer)
+ (not (buffer-name rmail-summary-buffer))))
+ (rmail-redisplay-summary
+ ;; If `rmail-redisplay-summary' is non-nil, make sure the summary
+ ;; buffer is displayed.
+ (display-buffer
+ rmail-summary-buffer
+ `(nil
+ (reusable-frames . 0)
+ ,(when rmail-summary-window-size
+ `(window-height . ,rmail-summary-window-size)))))
+ (rmail-summary-window-size
+ ;; If `rmail-summary-window-size' is non-nil and the summary buffer
+ ;; is displayed, make sure it gets resized.
+ (let ((window (get-buffer-window rmail-summary-buffer 0)))
+ (when window
+ (window-resize-no-error
+ window (- rmail-summary-window-size (window-height window))))))))
\f
;;;; *** Rmail Local Fontification ***
(restore-buffer-modified-p nil)))))))
\f
;;; Speedbar support for RMAIL files.
-(eval-when-compile (require 'speedbar))
-
(defcustom rmail-speedbar-match-folder-regexp "^[A-Z0-9]+\\(\\.[A-Z0-9]+\\)?$"
"Regexp matching Rmail folder names to be displayed in Speedbar.
Enabling this permits Speedbar to display your folders for easy
(defvar rmail-speedbar-key-map nil
"Keymap used when in rmail display mode.")
+(declare-function speedbar-make-specialized-keymap "speedbar" ())
+
(defun rmail-install-speedbar-variables ()
"Install those variables used by speedbar to enhance rmail."
- (if rmail-speedbar-key-map
- nil
+ (unless rmail-speedbar-key-map
(setq rmail-speedbar-key-map (speedbar-make-specialized-keymap))
-
(define-key rmail-speedbar-key-map "e" 'speedbar-edit-line)
(define-key rmail-speedbar-key-map "r" 'speedbar-edit-line)
(define-key rmail-speedbar-key-map "\C-m" 'speedbar-edit-line)
(looking-at "<M> "))])
"Additional menu-items to add to speedbar frame.")
+(declare-function speedbar-insert-button "speedbar"
+ (text face mouse function &optional token prevline))
+
;; Make sure our special speedbar major mode is loaded
(if (featurep 'speedbar)
(rmail-install-speedbar-variables)
(speedbar-insert-button file 'speedbar-file-face 'highlight
'rmail-speedbar-find-file nil t)))))))
+(eval-when-compile (require 'dframe))
+;; Part of the macro expansion of dframe-with-attached-buffer.
+;; At runtime, will be pulled in as a require of speedbar.
+(declare-function dframe-select-attached-frame "dframe" (&optional frame))
+(declare-function dframe-maybee-jump-to-attached-frame "dframe" ())
+
(defun rmail-speedbar-button (text token indent)
"Execute an rmail command specified by TEXT.
The command used is TOKEN. INDENT is not used."
- (speedbar-with-attached-buffer
+ (dframe-with-attached-buffer
(funcall token t)))
(defun rmail-speedbar-find-file (text token indent)
"Load in the rmail file TEXT.
TOKEN and INDENT are not used."
- (speedbar-with-attached-buffer
+ (dframe-with-attached-buffer
(message "Loading in RMAIL file %s..." text)
(rmail text)))
+(declare-function speedbar-do-function-pointer "speedbar" ())
+
(defun rmail-speedbar-move-message-to-folder-on-line ()
"If the current line is a folder, move current message to it."
(interactive)
(defun rmail-speedbar-move-message (text token indent)
"From button TEXT, copy current message to the rmail file specified by TOKEN.
TEXT and INDENT are not used."
- (speedbar-with-attached-buffer
+ (dframe-with-attached-buffer
(message "Moving message to %s" token)
;; expand-file-name is needed due to the unhelpful way in which
;; rmail-output expands non-absolute filenames against rmail-default-file.
;;; Start of automatically extracted autoloads.
\f
;;;### (autoloads (rmail-edit-current-message) "rmailedit" "rmailedit.el"
-;;;;;; "791ea184628feb6335fe3e29f7234934")
+;;;;;; "0b056146d4775080a1847b8ce7527bc5")
;;; Generated autoloads from rmailedit.el
(autoload 'rmail-edit-current-message "rmailedit" "\
\f
;;;### (autoloads (rmail-next-labeled-message rmail-previous-labeled-message
;;;;;; rmail-read-label rmail-kill-label rmail-add-label) "rmailkwd"
-;;;;;; "rmailkwd.el" "4ae5660d86d49e524f4a6bcbc6d9a984")
+;;;;;; "rmailkwd.el" "b5337290fd35bbc11888afb25d767195")
;;; Generated autoloads from rmailkwd.el
(autoload 'rmail-add-label "rmailkwd" "\
;;;***
\f
-;;;### (autoloads (rmail-mime) "rmailmm" "rmailmm.el" "f1937f85a1258de8880a089fa5ae5621")
+;;;### (autoloads nil "rmailmm" "rmailmm.el" "8c14f4cf6e7dacb0c94fd300d814caf7")
;;; Generated autoloads from rmailmm.el
(autoload 'rmail-mime "rmailmm" "\
;;;***
\f
;;;### (autoloads (set-rmail-inbox-list) "rmailmsc" "rmailmsc.el"
-;;;;;; "e2212ea15561d60365ffa1f7a5902939")
+;;;;;; "8a2466563b4a463710531d01766c07a3")
;;; Generated autoloads from rmailmsc.el
(autoload 'set-rmail-inbox-list "rmailmsc" "\
\f
;;;### (autoloads (rmail-sort-by-labels rmail-sort-by-lines rmail-sort-by-correspondent
;;;;;; rmail-sort-by-recipient rmail-sort-by-author rmail-sort-by-subject
-;;;;;; rmail-sort-by-date) "rmailsort" "rmailsort.el" "38da5f17d4ed0dcd2b09c158642cef63")
+;;;;;; rmail-sort-by-date) "rmailsort" "rmailsort.el" "3e3a30326fc95d7f17835906c2ccb19f")
;;; Generated autoloads from rmailsort.el
(autoload 'rmail-sort-by-date "rmailsort" "\
;;;***
\f
-;;;### (autoloads (rmail-summary-by-senders rmail-summary-by-topic
-;;;;;; rmail-summary-by-regexp rmail-summary-by-recipients rmail-summary-by-labels
-;;;;;; rmail-summary) "rmailsum" "rmailsum.el" "856fc6e337d5398b302c448ee7a2315e")
+;;;### (autoloads nil "rmailsum" "rmailsum.el" "9005bd5da3e21d1cc173e86fd9fec3c9")
;;; Generated autoloads from rmailsum.el
(autoload 'rmail-summary "rmailsum" "\
;;;***
\f
;;;### (autoloads (unforward-rmail-message undigestify-rmail-message)
-;;;;;; "undigest" "undigest.el" "9f270a2571bbbbfabc27498a8d4089c7")
+;;;;;; "undigest" "undigest.el" "9b273a3e15b5496ab6121b585d8bd3b3")
;;; Generated autoloads from undigest.el
(autoload 'undigestify-rmail-message "undigest" "\