-; $Id: post.el,v 2.4 2004/07/23 23:13:17 rreid Exp rreid $
+; $Id: post.el,v 1.10 2008/02/24 23:49:23 rreid Exp $
;; post.el --- Use (X?)Emacs(client) as an external editor for mail and news.
;;; Authors: Eric Kidd <eric.kidd@pobox.com>,
;;; Dave Pearson <davep@davep.org>,
-;;; Rob Reid <reid@astro.utoronto.ca>,
+;;; Rob Reid <rreid@nrao.edu>,
;;; Roland Rosenfeld <roland@spinnaker.de>
;; This is free software distributed under the GPL, yadda, yadda, yadda.
;; information. Send us your feature requests and patches, and we'll try
;; to integrate everything.
-;;; Maintainer: Rob Reid <reid@astro.utoronto.ca>
+;;; Maintainers: Rob Reid <rreid@nrao.edu> and
+;;; Philip J. Hollenback <philiph@pobox.com>
;;; Keywords: mail
;;; Commentary:
-;; This is a major mode for use with Mutt, the spiffy *nix mailreader du jour
-;; (See http://www.mutt.org/), slrn, the spiffy *nix newsreader du jour, or
-;; whatever you can get it to work with. To use this mode, add the following
-;; line to the .emacs file in your home directory:
+;; This is a major mode for use with mutt (http://www.mutt.org/), slrn, or most
+;; email and newsreaders that allow you to use an external editor.
+;;
+;; Installation:
+;;
+;; Add the following line to the .emacs(.el) file in your home directory:
;;
;; (load "/your/local/path/to/this/file/post")
;;
;; your sitewide default.el to (require 'post).
;;
;; You may find the latest version of this mode at
-;; http://astro.utoronto.ca/~reid/mutt/
+;; http://www.cv.nrao.edu/~rreid/software/email/ or possibly
+;; http://sourceforge.net/projects/post-mode/
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Revision History
;;;
;;; $Log: post.el,v $
+;;; Revision 1.10 2008/02/24 23:49:23 rreid
+;;; *** empty log message ***
+;;;
+;;; Revision 1.9 2008/02/24 23:46:23 rreid
+;;; I really hate the way RCS/VC mucks around with the version number and log.
+;;; It's not as dwim as it thinks it is.
+;;;
+;;; Revision 1.8 2008/02/24 23:43:46 rreid
+;;; Updated email address.
+;;;
+;;; Revision 2.402 2008/02/24 23:31:19 rreid
+;;; Emacs 22 finally fixed (how-many) to return an int instead of a string,
+;;; i.e. 13 instead of '13 occurrences'. A few people noticed that the change
+;;; broke my workaround, but Erik Mugele submitted the winning patch that works
+;;; for all emacs versions (I hope).
+;;;
+;;; This, and the below, are real entries, with real version numbers. Some of
+;;; the above are fake commits to get the version number back in sync.
+;;;
;;; Revision 2.401 2004/07/23 16:27:29 rreid
;;; Fixed post-delete-quoted-signatures to not remove sneaky things like quoted
;;; double dash arrows. Thanks go to Felix Klee for a clear bug report.
;; XEmacs gnuserv uses slightly different functions than the GNU Emacs
;; server, and some people are still wasting time and CPU cycles by starting
;; up a new emacs each time.
- (cond ((fboundp 'server-edit)
- (fset 'post-finish 'server-edit))
- ((fboundp 'gnuserv-kill-buffer-function)
- (fset 'post-finish 'gnuserv-kill-buffer-function))
- (t
- (fset 'post-finish 'save-buffers-kill-emacs)))
+ (fset 'post-finish (cond ((fboundp 'server-edit)
+ 'server-edit)
+ ((fboundp 'gnuserv-kill-buffer-function)
+ 'gnuserv-kill-buffer-function)
+ (t
+ 'save-buffers-kill-emacs)))
+;; (cond ((fboundp 'server-edit)
+;; (fset 'post-finish 'server-edit))
+;; ((fboundp 'gnuserv-kill-buffer-function)
+;; (fset 'post-finish 'gnuserv-kill-buffer-function))
+;; (t
+;; (fset 'post-finish 'save-buffers-kill-emacs)))
;; If customize isn't available just use defvar instead.
(unless (fboundp 'defgroup)
:type 'boolean
:group 'post)
-(defcustom post-mail-message "mutt-[a-z0-9]+-[0-9]+-[0-9]+\\'"
+(defcustom post-mail-message "mutt-[a-z0-9]+-[0-9]+-[0-9]+.*\\'"
"*Regular expression which matches your mailer's temporary files."
:type 'string
:group 'post)
(cond (post-has-attachment)
((equal post-should-prompt-for-attachment 'Never))
((or (equal post-should-prompt-for-attachment 'Always)
- (post-body-says-attach))
+ (post-body-says-attach-p))
(post-prompt-for-attachment)))
(basic-save-buffer)
;; Added by Rob Reid 10/13/1998 to prevent accumulating *Composing* buffers
;; when using (emacs|gnu)client. Helped by Eric Marsden's Eliza example in
;; http://www.ssc.com/lg/issue29/marsden.html
- (kill-buffer post-buf))
+; (kill-buffer post-buf)
+)
(defun post-goto-body ()
"Go to the beginning of the message body."
(nth r marks-st) (nth r marks-end))))
(kill-buffer (current-buffer)))
(goto-char (post-kill-signature))
- (insert-string "-- \n")
+ (insert "-- \n")
(insert sig)
(if (file-readable-p post-fixed-signature-source)
(insert-file-contents post-fixed-signature-source)
(let ((sig (buffer-substring-no-properties sig-start sig-end)))
(switch-to-buffer post-select-signature-last-buffer)
(goto-char (post-kill-signature))
- (insert-string "-- \n")
+ (insert "-- \n")
(insert sig))
(if (file-readable-p post-fixed-signature-source)
(insert-file-contents post-fixed-signature-source))
(setq sig-to-load (buffer-substring-no-properties sig-start (point)))
(switch-to-buffer post-select-signature-last-buffer)
(goto-char (post-kill-signature))
- (insert-string "-- \n")
+ (insert "-- \n")
(insert-file (concat post-signature-directory sig-to-load))
(message "Signature set to %s%s" post-signature-directory sig-to-load)
(post-select-signature-quit)))
(goto-char post-select-signature-last-point)
(delete-other-windows))
+(defun post-attach-file ()
+ "Prompt for an attachment."
+ (interactive)
+ (let ((file (read-file-name "Attach file: " nil nil t nil))
+ (description (string-read "Description: ")))
+ (header-attach-file file description)))
+
;;; Non-interactive functions
+(defun post-prompt-for-attachment ()
+ "Prompt for an attachment."
+ (if (y-or-n-p "Do you want to attach anything? ")
+ (post-attach-file)))
+
+(defun post-references-p ()
+ "Is there a References header in this buffer?"
+ (save-excursion
+ (goto-char (point-min))
+ (looking-at "^References: ")))
+
+(defun post-body-says-attach-p ()
+ "Check if attach appears in the body."
+ (post-goto-body)
+
+ ;; Aargh it's annoying that how-many returns a string,
+ ;; "13 occurences" instead of a number, 13.
+ ;; As of Emacs 22 how-many returns an integer number. Consideration
+ ;; must be taken for both newer and older versions.
+ (let ((total-attach (how-many post-attachment-regexp)))
+ (if (string= (type-of total-attach) 'string)
+ (setq total-attach (string-to-number (how-many post-attachment-regexp))))
+ ;; And this mess is just to catch the unlikely false alarm of
+ ;; "attach" being in the signature, but not in the body.
+ (if (> total-attach 0)
+ (progn (post-goto-signature)
+ (if (string= (type-of (how-many post-attachment-regexp)) 'string)
+ (> total-attach (string-to-number (how-many
+ post-attachment-regexp)))
+ (> total-attach (how-many
+ post-attachment-regexp)))))))
+
(defun post-ask-for-address-with-default (header)
"Prompt for an email address, showing default.
Argument HEADER the header type."
(message (substitute-command-keys
"Type \\[describe-mode] for help composing; \\[post-save-current-buffer-and-exit] when done."))))
-(defun post-references-p ()
- "Is there a References header in this buffer?"
- (save-excursion
- (goto-char (point-min))
- (looking-at "^References: ")))
-
-(defun post-body-says-attach ()
- "Check if attach appears in the body."
- (post-goto-body)
-
- ;; Aargh it's annoying that how-many returns a string,
- ;; "13 occurences" instead of a number, 13.
- (let ((total-attach (string-to-int (how-many post-attachment-regexp))))
- ;; And this mess is just to catch the unlikely false alarm of
- ;; "attach" being in the signature, but not in the body.
- (if (> total-attach 0)
- (progn (post-goto-signature)
- (> total-attach (string-to-int (how-many
- post-attachment-regexp)))))))
-
-(defun post-prompt-for-attachment ()
- "Prompt for an attachment."
- (if (y-or-n-p "Do you want to attach anything? ")
- (let ((file (read-file-name "Attach file: " nil nil t nil))
- (description (string-read "Description: ")))
- (header-attach-file file description))))
-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;; Post Header Mode
(when (re-search-forward (concat "^\\($\\|" field ": \\)"))
(if (looking-at "^$")
(progn
- (insert-string field ": \n")
+ (insert field ": \n")
(forward-char -1))
(header-position-on-value))))))
(widen)
(goto-char (point-min))
(search-forward-regexp "^$")
- (insert-string (concat "Attach: " (file-truename file) " "
+ (insert (concat "Attach: " (file-truename file) " "
description "\n"))
(message (concat "Attached '" file "'."))
(setq post-has-attachment t))))))
(cond ((post-find-header-line header)
(beginning-of-line)
(kill-line)
- (insert-string (concat header ": " value)))
+ (insert (concat header ": " value)))
(t
(header-append-value header value))))
(message "%s set to %s" header value))
"Add a HEADER and set it's VALUE (if header exists, will add multiple headers)."
(goto-char (point-min))
(search-forward-regexp "^$" nil t)
- (insert-string (concat header ": " value "\n")))
+ (insert (concat header ": " value "\n")))
;;; Setup the mode map for the select-signature buffer.
(if post-select-signature-mode-map nil