+Mon Sep 27 15:18:05 1999 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Pterodactyl Gnus v0.97 is released.
+
+1999-09-01 Brendan Kehoe <brendan@zen.org>
+
+ * gnus-sum.el (gnus-summary-catchup-and-goto-next-group): Use
+ gnus-summary-next-group, not gnus-summary-next-article. Only give
+ 3 args.
+
+1999-09-25 08:07:57 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-agent.el (gnus-agent-fetch-group-1): Look in the group
+ buffer for params.
+
+ * gnus-xmas.el (gnus-xmas-summary-recenter): Display one more
+ line.
+
+ * message.el (message-forward-ignored-headers): New variable.
+
+ * gnus-art.el (gnus-article-prepare-display): Nix out
+ gnus-article-wash-types.
+
+ * gnus-agent.el (gnus-agent-create-buffer): New function.
+ (gnus-agent-fetch-group-1): Use it.
+ (gnus-agent-start-fetch): Ditto.
+
+ * gnus-sum.el (gnus-summary-exit): Don't use
+ `gnus-use-adaptive-scoring'.
+
+ * mail-source.el (mail-source-fetch-pop): Only store password when
+ successful.
+
+ * gnus-nocem.el (gnus-nocem-scan-groups): Message better.
+
+1999-09-24 18:43:23 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * message.el (message-reply): Use it.
+ (message-dont-reply-to-names): New variable.
+
+ * nntp.el (nntp-open-telnet): Don't erase-buffer.
+
+ * mm-util.el (mm-preferred-coding-system): Typo fix.
+
+ * message.el (message-bounce): Work for non-MIME.
+
+ * gnus.el (gnus-short-group-name): Short the right parts of the
+ name.
+
+1999-09-24 18:17:48 Johan Kullstam <kullstam@ne.mediaone.net>
+
+ * mm-encode.el (mm-qp-or-base64): New version.
+
+1999-09-10 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-art.el (article-make-date-line): Fix time-zone bug.
+
+1999-09-09 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-art.el (gnus-article-add-buttons): Don't delete markers out
+ of restricted region.
+ (gnus-mime-display-single): Set beg at correct point.
+
+1999-09-09 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnmail.el (nnmail-process-maildir-mail-format): Typo.
+
+1999-09-09 Jens-Ulrik Petersen <jens-ulrik.petersen@nokia.com>
+
+ * gnus-msg.el (gnus-configure-posting-styles): Let
+ `gnus-posting-styles' have its say in posting-style: local
+ variable `styles' is already bound to `gnus-posting-styles' so
+ don't rebind it to nil.
+
+1999-09-24 18:10:56 Robert Bihlmeyer <robbe@orcus.priv.at>
+
+ * gnus-score.el (gnus-summary-increase-score): Allow editing of
+ Message-ID.
+
+1999-09-08 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-encode.el (mm-encode-content-transfer-encoding): Fold
+ quoted-printable-encode-region.
+
+ * qp.el (quoted-printable-encode-region): Assume charset
+ encoded. Fold every line in the region.
+
+1999-09-02 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-srvr.el (gnus-browse-foreign-server): Read the first line
+ of active file.
+
+1999-09-01 Didier Verna <verna@inf.enst.fr>
+
+ * message.el (message-mode): allows whitespaces between multiple
+ instances of the fill character ">".
+
+1999-09-24 18:02:50 Kim-Minh Kaplan <kmkaplan@vocatex.fr>
+
+ * mm-encode.el (mm-qp-or-base64): Fix.
+
+1999-09-01 12:18:01 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * message.el (message-send): Too much and.
+
+1999-09-24 17:58:07 Andreas Schwab <schwab@suse.de>
+
+ * gnus-art.el (gnus-mime-view-part-as-type): Renamed.
+
+1999-08-28 12:44:20 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-score.el (gnus-score-headers): Work for nil scores.
+
+1999-08-27 20:46:11 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-cache.el (gnus-cache-write-active): Write full names.
+
+ * gnus-util.el (gnus-write-active-file): Accept full name.
+
+ * mm-decode.el (mm-inlinable-p): Use string-match on the types.
+ (mm-assoc-string-match): New function.
+ (mm-display-inline): Use it.
+
+ * gnus-group.el (gnus-group-set-info): Work for nil group params.
+
+ * gnus-msg.el (gnus-configure-posting-styles): Allow eval.
+
+1999-08-27 19:08:10 Florian Weimer <fw@s.netic.de>
+
+ * mml.el (mml-generate-multipart-alist): New variable.
+
+1999-08-27 15:30:02 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-art.el (gnus-treat-predicate): Work for (not 5).
+
+1999-08-27 Peter von der Ahé <pahe@daimi.au.dk>
+
+ * message.el (message-send): More helpful error message if sending
+ fails
+
Fri Aug 27 13:17:48 1999 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
* gnus.el: Pterodactyl Gnus v0.96 is released.
(setq gnus-agent t)
(gnus-agent-read-servers)
(gnus-category-read)
- (setq gnus-agent-overview-buffer
- (gnus-get-buffer-create " *Gnus agent overview*"))
- (with-current-buffer gnus-agent-overview-buffer
- (mm-enable-multibyte))
+ (gnus-agent-create-buffer)
(add-hook 'gnus-group-mode-hook 'gnus-agent-mode)
(add-hook 'gnus-summary-mode-hook 'gnus-agent-mode)
(add-hook 'gnus-server-mode-hook 'gnus-agent-mode))
+(defun gnus-agent-create-buffer ()
+ (if (gnus-buffer-live-p gnus-agent-overview-buffer)
+ t
+ (setq gnus-agent-overview-buffer
+ (gnus-get-buffer-create " *Gnus agent overview*"))
+ (with-current-buffer gnus-agent-overview-buffer
+ (mm-enable-multibyte))
+ nil))
+
(gnus-add-shutdown 'gnus-close-agent 'gnus)
(defun gnus-close-agent ()
(defun gnus-agent-start-fetch ()
"Initialize data structures for efficient fetching."
(gnus-agent-open-history)
- (setq gnus-agent-current-history (gnus-agent-history-buffer)))
+ (setq gnus-agent-current-history (gnus-agent-history-buffer))
+ (gnus-agent-create-buffer))
(defun gnus-agent-stop-fetch ()
"Save all data structures and clean up."
group)))
;; `gnus-agent-overview-buffer' may be killed for
;; timeout reason. If so, recreate it.
- (if (gnus-buffer-live-p gnus-agent-overview-buffer)
- t
- (setq gnus-agent-overview-buffer
- (gnus-get-buffer-create " *Gnus agent overview*"))
- (with-current-buffer gnus-agent-overview-buffer
- (mm-enable-multibyte))
- nil)))
+ (gnus-agent-create-buffer)))
(setq category (gnus-group-category group))
(setq predicate
(gnus-get-predicate
:type 'regexp
:group 'gnus-article-various)
-(defcustom gnus-article-mode-line-format "Gnus: %g %S%m"
+(defcustom gnus-article-mode-line-format "Gnus: %g [%w] %S%m"
"*The format specification for the article mode line.
See `gnus-summary-mode-line-format' for a closer description.
(article-narrow-to-head)
(when (re-search-forward tdate-regexp nil t)
(setq bface (get-text-property (gnus-point-at-bol) 'face)
+ date (or (get-text-property (gnus-point-at-bol)
+ 'original-date)
+ date)
eface (get-text-property (1- (gnus-point-at-eol))
'face))
(forward-line 1))
(beginning-of-line)
(when (looking-at "\\([^:]+\\): *\\(.*\\)$")
(put-text-property (match-beginning 1) (1+ (match-end 1))
+ 'original-date date)
+ (put-text-property (match-beginning 1) (1+ (match-end 1))
'face bface)
(put-text-property (match-beginning 2) (match-end 2)
'face eface))))))))
;; functions since they aren't particularly resistant to
;; buggy dates.
((eq type 'local)
- (let ((tz (car (current-time-zone))))
+ (let ((tz (car (current-time-zone time))))
(format "Date: %s %s%02d%02d" (current-time-string time)
- (if (> tz 0) "+" "-") (/ tz 3600) (/ (% tz 3600) 60))))
+ (if (> tz 0) "+" "-") (/ (abs tz) 3600)
+ (/ (% (abs tz) 3600) 60))))
;; Convert to Universal Time.
((eq type 'ut)
(concat "Date: "
(let* ((e (parse-time-string date))
(tm (apply 'encode-time e))
(ms (car tm))
- (ls (- (cadr tm) (car (current-time-zone)))))
+ (ls (- (cadr tm) (car (current-time-zone time)))))
(cond ((< ls 0) (list (1- ms) (+ ls 65536)))
((> ls 65535) (list (1+ ms) (- ls 65536)))
(t (list ms ls)))))
buffer-read-only)
(unless (eq major-mode 'gnus-article-mode)
(gnus-article-mode))
- (setq buffer-read-only nil)
+ (setq buffer-read-only nil
+ gnus-article-wash-types nil)
(gnus-run-hooks 'gnus-tmp-internal-hook)
(gnus-run-hooks 'gnus-article-prepare-hook)
(when gnus-display-mime-function
(let ((data (get-text-property (point) 'gnus-data)))
(mm-interactively-view-part data)))
-(defun gnus-mime-view-part-as-media ()
+(defun gnus-mime-view-part-as-type ()
"Choose a MIME media type, and view the part as such."
(interactive
(list (completing-read "View as MIME type: " mailcap-mime-types)))
(cond
(display
(when move
- (forward-line -2))
+ (forward-line -2)
+ (setq beg (point)))
(let ((mail-parse-charset gnus-newsgroup-charset)
(mail-parse-ignored-charsets
(save-excursion (set-buffer gnus-summary-buffer)
(goto-char (point-max)))
((and text not-attachment)
(when move
- (forward-line -2))
+ (forward-line -2)
+ (setq beg (point)))
(gnus-article-insert-newline)
(mm-insert-inline handle (mm-get-part handle))
(goto-char (point-max))))
(alist gnus-button-alist)
beg entry regexp)
;; Remove all old markers.
- (let (marker entry)
+ (let (marker entry new-list)
(while (setq marker (pop gnus-button-marker-list))
- (goto-char marker)
- (when (setq entry (gnus-button-entry))
- (put-text-property (match-beginning (nth 1 entry))
- (match-end (nth 1 entry))
- 'gnus-callback nil))
- (set-marker marker nil)))
+ (if (or (< marker (point-min)) (>= marker (point-max)))
+ (push marker new-list)
+ (goto-char marker)
+ (when (setq entry (gnus-button-entry))
+ (put-text-property (match-beginning (nth 1 entry))
+ (match-end (nth 1 entry))
+ 'gnus-callback nil))
+ (set-marker marker nil)))
+ (setq gnus-button-marker-list new-list))
;; We skip the headers.
(article-goto-body)
(setq beg (point))
((eq pred 'and)
(apply 'gnus-and (mapcar 'gnus-treat-predicate val)))
((eq pred 'not)
- (not (gnus-treat-predicate val)))
+ (not (gnus-treat-predicate (car val))))
((eq pred 'typep)
(equal (cadr val) type))
(t
(when (or force
(and gnus-cache-active-hashtb
gnus-cache-active-altered))
- (gnus-write-active-file gnus-cache-active-file gnus-cache-active-hashtb)
+ (gnus-write-active-file gnus-cache-active-file gnus-cache-active-hashtb t)
;; Mark the active hashtb as unaltered.
(setq gnus-cache-active-altered nil)))
(gnus-browse-foreign-server method))
(defun gnus-group-set-info (info &optional method-only-group part)
- (when info
+ (when (or info part)
(let* ((entry (gnus-gethash
(or method-only-group (gnus-info-group info))
gnus-newsrc-hashtb))
(unless gnus-inhibit-posting-styles
(let ((group (or gnus-newsgroup-name ""))
(styles gnus-posting-styles)
- style match variable attribute value v styles results
+ style match variable attribute value v results
filep name address element)
;; If the group has a posting-style parameter, add it at the end with a
;; regexp matching everything, to be sure it takes precedence over all
(when (cdr result)
(add-hook 'message-setup-hook
(cond
+ ((eq 'eval (car result))
+ 'ignore)
((eq 'body (car result))
`(lambda ()
(save-excursion
(interactive)
(let ((groups gnus-nocem-groups)
(gnus-inhibit-demon t)
- group active gactive articles)
+ group active gactive articles check-headers)
(gnus-make-directory gnus-nocem-directory)
;; Load any previous NoCeM headers.
(gnus-nocem-load-cache)
(null (mail-header-references header)))
(not (member (mail-header-message-id header)
gnus-nocem-seen-message-ids))))
- (gnus-nocem-check-article group header)))))))
+ (push header check-headers)))
+ (let ((i 0)
+ (len (length check-headers)))
+ (dolist (h check-headers)
+ (gnus-message
+ 7 "Checking article %d in %s for NoCeM (%d of %d)..."
+ (mail-header-number h) group (incf i) len)
+ (gnus-nocem-check-article group h)))))))
(setq gnus-nocem-active
(cons (list group gactive)
(delq (assoc group gnus-nocem-active)
(defun gnus-nocem-check-article (group header)
"Check whether the current article is an NCM article and that we want it."
;; Get the article.
- (gnus-message 7 "Checking article %d in %s for NoCeM..."
- (mail-header-number header) group)
(let ((date (mail-header-date header))
issuer b e type)
(when (or (not date)
(?s "subject" nil nil string)
(?b "body" "" nil body-string)
(?h "head" "" nil body-string)
- (?i "message-id" nil t string)
+ (?i "message-id" nil nil string)
(?r "references" "message-id" nil string)
(?x "xref" nil nil string)
(?e "extra" nil nil string)
(let (score)
(while (setq score (pop scores))
(while score
- (when (listp (caar score))
+ (when (consp (caar score))
(gnus-score-advanced (car score) trace))
(pop score))))
(goto-char (point-min))
(unless (string= gnus-ignored-newsgroups "")
(delete-matching-lines gnus-ignored-newsgroups))
- (while (and (not (eobp)) (forward-line))
+ (while (not (eobp))
(ignore-errors
(push (cons (read cur)
(max 0 (- (1+ (read cur)) (read cur))))
- groups)))))
+ groups))
+ (forward-line))))
(setq groups (sort groups
(lambda (l1 l2)
(string< (car l1) (car l2)))))
(unless quit-config
;; Do adaptive scoring, and possibly save score files.
(when gnus-newsgroup-adaptive
- (let ((gnus-newsgroup-adaptive gnus-use-adaptive-scoring))
- (gnus-score-adaptive)))
+ (gnus-score-adaptive))
(when gnus-use-scoring
(gnus-score-save)))
(gnus-run-hooks 'gnus-summary-prepare-exit-hook)
(gnus-group-read-ephemeral-group
name `(nndoc ,name (nndoc-address ,(get-buffer dig))
(nndoc-article-type
- ,(if force 'digest 'guess))) t))
+ ,(if force 'mbox 'guess))) t))
;; Make all postings to this group go to the parent group.
(nconc (gnus-info-params (gnus-get-info name))
params)
(interactive "P")
(save-excursion
(gnus-summary-catchup all))
- (gnus-summary-next-article t nil nil t))
+ (gnus-summary-next-group t nil nil))
;; Thread-based commands.
(throw 'found nil)))
t))
-(defun gnus-write-active-file (file hashtb)
+(defun gnus-write-active-file (file hashtb &optional full-names)
(with-temp-file file
(mapatoms
(lambda (sym)
(boundp sym)
(symbol-value sym))
(insert (format "%s %d %d y\n"
- (gnus-group-real-name (symbol-name sym))
+ (if full-names
+ (symbol-name sym)
+ (gnus-group-real-name (symbol-name sym)))
(cdr (symbol-value sym))
(car (symbol-value sym))))))
hashtb)))
(sit-for 0))
(when gnus-auto-center-summary
(let* ((height (if (fboundp 'window-displayed-height)
- (1- (window-displayed-height))
+ (window-displayed-height)
(- (window-height) 2)))
(top (cond ((< height 4) 0)
((< height 7) 1)
:link '(custom-manual "(gnus)Exiting Gnus")
:group 'gnus)
-(defconst gnus-version-number "0.96"
+(defconst gnus-version-number "0.97"
"Version number for this version of Gnus.")
(defconst gnus-version (format "Pterodactyl Gnus v%s" gnus-version-number)
("browse-url" browse-url)
("message" :interactive t
message-send-and-exit message-yank-original)
+ ("babel" babel-as-string)
("nnmail" nnmail-split-fancy nnmail-article-group)
("nnvirtual" nnvirtual-catchup-group nnvirtual-convert-headers)
("rmailout" rmail-output rmail-output-to-rmail-file)
(setq skip (match-end 0)
depth (+ depth 1)))
depth))))
- ;; separate foreign select method from group name and collapse.
- ;; if method contains a server, collapse to non-domain server name,
- ;; otherwise collapse to select method
- (let* ((colon (string-match ":" group))
+ ;; Separate foreign select method from group name and collapse.
+ ;; If method contains a server, collapse to non-domain server name,
+ ;; otherwise collapse to select method.
+ (let* ((colon (string-match ":" group))
(server (and colon (substring group 0 colon)))
- (plus (and server (string-match "+" server))))
+ (plus (and server (string-match "+" server))))
(when server
- (cond (plus
- (setq foreign (substring server (+ 1 plus)
- (string-match "\\." server))
- group (substring group (+ 1 colon))))
- (t
- (setq foreign server
- group (substring group (+ 1 colon)))))
- (setq foreign (concat foreign ":"))))
- ;; collapse group name leaving LEVELS uncollapsed elements
- (while group
- (if (and (string-match "\\." group) (> levels 0))
- (setq name (concat name (substring group 0 1))
- group (substring group (match-end 0))
- levels (- levels 1)
- name (concat name "."))
- (setq name (concat foreign name group)
- group nil)))
- name))
-
+ (if plus
+ (setq foreign (substring server (+ 1 plus)
+ (string-match "\\." server))
+ group (substring group (+ 1 colon)))
+ (setq foreign server
+ group (substring group (+ 1 colon))))
+ (setq foreign (concat foreign ":")))
+ ;; Collapse group name leaving LEVELS uncollapsed elements
+ (let* ((glist (split-string group "\\."))
+ (glen (length glist))
+ res)
+ (setq levels (- glen levels))
+ (dolist (g glist)
+ (push (if (>= (decf levels) 0)
+ (substring g 0 1)
+ g)
+ res))
+ (concat foreign (mapconcat 'identity (nreverse res) "."))))))
+
(defun gnus-narrow-to-body ()
"Narrow to the body of an article."
(narrow-to-region
w3-coding-system-for-mime-charset
rmail-summary-exists rmail-select-summary rmail-update-summary
url-generic-parse-url valid-image-instantiator-format-p
- babel-fetch babel-wash)))
+ babel-fetch babel-wash babel-as-string)))
(setq load-path (cons "." load-path))
(require 'custom)
(or password
(cdr (assoc from mail-source-password-cache))
(mail-source-read-passwd
- (format "Password for %s at %s: " user server))))
- (unless (assoc from mail-source-password-cache)
- (push (cons from password) mail-source-password-cache)))
+ (format "Password for %s at %s: " user server)))))
(when server
(setenv "MAILHOST" server))
(setq result
(if (eq authentication 'apop) 'apop 'pass)))
(save-excursion (pop3-movemail mail-source-crash-box))))))
(if result
- (prog1
- (mail-source-callback callback server)
- (mail-source-run-script
- postscript
- (format-spec-make ?p password ?t mail-source-crash-box
- ?s server ?P port ?u user)))
+ (progn
+ (when (eq authentication 'password)
+ (unless (assoc from mail-source-password-cache)
+ (push (cons from password) mail-source-password-cache)))
+ (prog1
+ (mail-source-callback callback server)
+ (mail-source-run-script
+ postscript
+ (format-spec-make ?p password ?t mail-source-crash-box
+ ?s server ?P port ?u user))))
;; We nix out the password in case the error
;; was because of a wrong password being given.
(setq mail-source-password-cache
:group 'message-interface
:type 'regexp)
+
+(defcustom message-forward-ignored-headers nil
+ "*All headers that match this regexp will be deleted when forwarding a message."
+ :group 'message-forwarding
+ :type '(choice (const :tag "None" nil)
+ regexp))
+
(defcustom message-ignored-cited-headers "."
"*Delete these headers from the messages you yank."
:group 'message-insertion
:group 'message
:type 'symbol)
+(defcustom message-dont-reply-to-names rmail-dont-reply-to-names
+ "*A regexp specifying names to prune when doing wide replies.
+A value of nil means exclude your own name only."
+ :group 'message
+ :type '(choice (const :tag "Yourself" nil)
+ regexp))
+
;;; Internal variables.
;;; Well, not really internal.
(insert (car headers) ?\n))))
(setq headers (cdr headers))))
+
(defun message-fetch-reply-field (header)
"Fetch FIELD from the message we're replying to."
(when (and message-reply-buffer
'(message-font-lock-keywords t)))
(make-local-variable 'adaptive-fill-regexp)
(setq adaptive-fill-regexp
- (concat "[ \t]*[-a-z0-9A-Z]*>+[ \t]*\\|" adaptive-fill-regexp))
+ (concat "[ \t]*[-a-z0-9A-Z]*\\(>[ \t]*\\)+[ \t]*\\|" adaptive-fill-regexp))
(unless (boundp 'adaptive-fill-first-line-regexp)
(setq adaptive-fill-first-line-regexp nil))
(make-local-variable 'adaptive-fill-first-line-regexp)
(setq adaptive-fill-first-line-regexp
- (concat "[ \t]*[-a-z0-9A-Z]*>+[ \t]*\\|"
+ (concat "[ \t]*[-a-z0-9A-Z]*\\(>[ \t]*\\)+[ \t]*\\|"
adaptive-fill-first-line-regexp))
(mm-enable-multibyte)
(make-local-variable 'indent-tabs-mode) ;Turn off tabs for indentation.
elem sent)
(while (and success
(setq elem (pop alist)))
- (when (and (or (not (funcall (cadr elem)))
- (and (or (not (memq (car elem)
- message-sent-message-via))
- (y-or-n-p
- (format
- "Already sent message via %s; resend? "
- (car elem))))
- (setq success (funcall (caddr elem) arg)))))
+ (when (or (not (funcall (cadr elem)))
+ (and (or (not (memq (car elem)
+ message-sent-message-via))
+ (y-or-n-p
+ (format
+ "Already sent message via %s; resend? "
+ (car elem))))
+ (setq success (funcall (caddr elem) arg))))
(setq sent t)))
- (unless sent
+ (unless (or sent (not success))
(error "No methods specified to send by"))
(when (and success sent)
(message-do-fcc)
- ;;(when (fboundp 'mail-hist-put-headers-into-history)
- ;; (mail-hist-put-headers-into-history))
(save-excursion
(run-hooks 'message-sent-hook))
(message "Sending...done")
(while (re-search-forward "[ \t]+" nil t)
(replace-match " " t t))
;; Remove addresses that match `rmail-dont-reply-to-names'.
- (insert (prog1 (rmail-dont-reply-to (buffer-string))
- (erase-buffer)))
+ (let ((rmail-dont-reply-to-names message-dont-reply-to-names))
+ (insert (prog1 (rmail-dont-reply-to (buffer-string))
+ (erase-buffer))))
(goto-char (point-min))
;; Perhaps Mail-Copies-To: never removed the only address?
(when (eobp)
;; message.
(message-goto-body)
(insert "\n\n<#part type=message/rfc822 disposition=inline>\n")
- (mml-insert-buffer cur)
- (insert "<#/part>\n")
+ (let ((b (point))
+ e)
+ (mml-insert-buffer cur)
+ (setq e (point))
+ (insert "<#/part>\n")
+ (when message-forward-ignored-headers
+ (save-restriction
+ (narrow-to-region b e)
+ (message-narrow-to-head)
+ (message-remove-header message-forward-ignored-headers t))))
(message-position-point)))
;;;###autoload
contains some mail you have written which has been bounced back to
you."
(interactive)
- (let ((handles (mm-dissect-buffer))
+ (let ((handles (mm-dissect-buffer t))
boundary)
(message-pop-to-buffer (message-buffer-name "bounce"))
(if (stringp (car handles))
(mm-insert-part (car (last handles)))
;; This is a non-MIME bounce, so we try to remove things
;; manually.
- (mm-insert-part (car (last handles)))
+ (mm-insert-part handles)
(undo-boundary)
(goto-char (point-min))
(search-forward "\n\n" nil t)
"message/rfc822")
"A list of MIME types to be displayed automatically.")
-(defvar mm-attachment-override-types
- '("text/plain" "text/x-vcard")
+(defvar mm-attachment-override-types '("text/plain" "text/x-vcard")
"Types that should have \"attachment\" ignored if they can be displayed inline.")
(defvar mm-automatic-external-display nil
(defun mm-display-inline (handle)
(let* ((type (mm-handle-media-type handle))
- (function (cadr (assoc type mm-inline-media-tests))))
+ (function (cadr (mm-assoc-string-match mm-inline-media-tests type))))
(funcall function handle)
(goto-char (point-min))))
+(defun mm-assoc-string-match (alist type)
+ (dolist (elem alist)
+ (when (string-match (car elem) type)
+ (return elem))))
+
(defun mm-inlinable-p (handle)
"Say whether HANDLE can be displayed inline."
(let ((alist mm-inline-media-tests)
(type (mm-handle-media-type handle))
test)
(while alist
- (when (equal type (caar alist))
+ (when (string-match (caar alist) type)
(setq test (caddar alist)
alist nil)
(setq test (funcall test handle)))
(defun mm-encode-content-transfer-encoding (encoding &optional type)
(cond
((eq encoding 'quoted-printable)
- (quoted-printable-encode-region (point-min) (point-max)))
+ (quoted-printable-encode-region (point-min) (point-max) t))
((eq encoding 'base64)
(when (equal type "text/plain")
(goto-char (point-min))
(defun mm-qp-or-base64 ()
(save-excursion
- (save-restriction
- (narrow-to-region (point-min) (min (+ (point-min) 1000) (point-max)))
+ (let ((limit (min (point-max) (+ 2000 (point-min))))
+ (n8bit 0))
(goto-char (point-min))
- (let ((8bit 0))
- (cond
- ((not (featurep 'mule))
- (while (re-search-forward "[^\x20-\x7f\r\n\t]" nil t)
- (incf 8bit)))
- (t
- ;; Mule version
- (while (not (eobp))
- (skip-chars-forward "\x20-\x7f\r\n\t")
- (unless (eobp)
- (forward-char 1)
- (incf 8bit)))))
- (if (> (/ (* 8bit 1.0) (buffer-size)) 0.166)
- 'base64
- 'quoted-printable)))))
+ (skip-chars-forward "\x20-\x7f\r\n\t" limit)
+ (while (< (point) limit)
+ (incf n8bit)
+ (forward-char 1)
+ (skip-chars-forward "\x20-\x7f\r\n\t" limit))
+ (if (< (* 6 n8bit) (- limit (point-min)))
+ 'quoted-printable
+ 'base64))))
(provide 'mm-encode)
(defun mm-preferred-coding-system (charset)
;; A typo in some Emacs versions.
(or (get-charset-property charset 'prefered-coding-system)
- (get-charset-property charset 'preffered-coding-system)))
+ (get-charset-property charset 'preferred-coding-system)))
(defun mm-mime-charset (charset)
"Return the MIME charset corresponding to the MULE CHARSET."
(eval-and-compile
(autoload 'message-make-message-id "message"))
+(defvar mml-generate-multipart-alist
+ '(("signed" . rfc2015-generate-signed-multipart)
+ ("encrypted" . rfc2015-generate-encrypted-multipart))
+ "*Alist of multipart generation functions.
+
+Each entry has the form (NAME . FUNCTION), where
+NAME: is a string containing the name of the part (without the
+leading \"/multipart/\"),
+FUNCTION: is a Lisp function which is called to generate the part.
+
+The Lisp function has to supply the appropriate MIME headers and the
+contents of this part.")
+
(defvar mml-syntax-table
(let ((table (copy-syntax-table emacs-lisp-mode-syntax-table)))
(modify-syntax-entry ?\\ "/" table)
(insert (or (cdr (assq 'contents cont))))
(insert "\n"))
((eq (car cont) 'multipart)
- (let ((mml-boundary (mml-compute-boundary cont)))
- (insert (format "Content-Type: multipart/%s; boundary=\"%s\"\n"
- (or (cdr (assq 'type cont)) "mixed")
- mml-boundary))
- (insert "\n")
- (setq cont (cddr cont))
- (while cont
- (insert "\n--" mml-boundary "\n")
- (mml-generate-mime-1 (pop cont)))
- (insert "\n--" mml-boundary "--\n")))
+ (let* ((type (or (cdr (assq 'type cont)) "mixed"))
+ (handler (assoc type mml-generate-multipart-alist)))
+ (if handler
+ (funcall (cdr handler) cont)
+ ;; No specific handler. Use default one.
+ (let ((mml-boundary (mml-compute-boundary cont)))
+ (insert (format "Content-Type: multipart/%s; boundary=\"%s\"\n"
+ type mml-boundary))
+ (insert "\n")
+ (setq cont (cddr cont))
+ (while cont
+ (insert "\n--" mml-boundary "\n")
+ (mml-generate-mime-1 (pop cont)))
+ (insert "\n--" mml-boundary "--\n")))))
(t
(error "Invalid element: %S" cont))))
(define-key map "p" 'mml-insert-part)
(define-key map "v" 'mml-validate)
(define-key map "P" 'mml-preview)
+ (define-key map "n" 'mml-narrow-to-part)
(define-key main "\M-m" map)
main))
("Insert"
["Multipart" mml-insert-multipart t]
["Part" mml-insert-part t])
+ ["Narrow" mml-narrow-to-part t]
["Quote" mml-quote-region t]
["Validate" mml-validate t]
["Preview" mml-preview t]))
;; if there is no head-body delimiter, we search a bit manually.
(while (and (looking-at "From \\|[^ \t]+:")
(not (eobp)))
- (forward-line 1)
- (point))))
+ (forward-line 1))
+ (point)))
;; Find the Message-ID header.
(goto-char (point-min))
(if (re-search-forward "^Message-ID:[ \t]*\\(<[^>]+>\\)" nil t)
(setq nntp-telnet-passwd
(mail-source-read-passwd "Password: ")))
"\n"))
- (erase-buffer)
(nntp-wait-for-string nntp-telnet-shell-prompt)
(process-send-string
proc (concat (mapconcat 'identity nntp-telnet-parameters " ") "\n"))
(save-excursion
(save-restriction
(narrow-to-region from to)
- (mm-encode-body)
+;; (mm-encode-body)
;; Encode all the non-ascii and control characters.
(goto-char (point-min))
(while (and (skip-chars-forward
(when fold
;; Fold long lines.
(goto-char (point-min))
- (end-of-line)
- (while (> (current-column) 72)
- (beginning-of-line)
- (forward-char 72)
- (search-backward "=" (- (point) 2) t)
- (insert "=\n")
- (end-of-line))))))
+ (while (not (eobp))
+ (end-of-line)
+ (while (> (current-column) 72)
+ (beginning-of-line)
+ (forward-char 72)
+ (search-backward "=" (- (point) 2) t)
+ (insert "=\n")
+ (end-of-line))
+ (forward-line))))))
(defun quoted-printable-encode-string (string)
"QP-encode STRING and return the results."
+1999-09-25 10:58:17 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * message.texi (Forwarding): Updated.
+
+ * emacs-mime.texi (New Viewers): New.
+
+1999-09-24 18:52:34 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus.texi (Group Line Specification): Doc fix.
+
+1999-09-24 18:06:33 Bill White <billw@wolfram.com>
+
+ * gnus.texi (Article Washing): Fix.
+
+1999-08-27 20:47:39 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus.texi (Posting Styles): Doc fix.
+
+1999-08-27 18:51:42 Robin S. Socha <robin@socha.net>
+
+ * gnus.texi: Typo fix.
+
1999-08-27 15:09:01 Jim Meyering <meyering@ascend.com>
* gnus.texi (The Active File): Typo fix.
* Handles:: Handle manipulations.
* Display:: Displaying handles.
* Customization:: Variables that affect display.
+* New Viewers:: How to write your own viewers.
@end menu
@end table
+@node New Viewers
+@section New Viewers
+
+Here's an example viewer for displaying @code{text/enriched} inline:
+
+@lisp
+(defun mm-display-enriched-inline (handle)
+ (let (text)
+ (with-temp-buffer
+ (mm-insert-part handle)
+ (save-window-excursion
+ (enriched-decode (point-min) (point-max))
+ (setq text (buffer-string))))
+ (mm-insert-inline handle text)))
+@end lisp
+
+We see that the function takes a @sc{mime} handle as its parameter. It
+then goes to a temporary buffer, inserts the text of the part, does some
+work on the text, stores the result, goes back to the buffer it was
+called from and inserts the result.
+
+The two important helper functions here are @code{mm-insert-part} and
+@code{mm-insert-inline}. The first function inserts the text of the
+handle in the current buffer. It handles charset and/or content
+transfer decoding. The second function just inserts whatever text you
+tell it to insert, but it also sets things up so that the text can be
+``undisplayed' in a convenient manner.
+
@node Composing
@chapter Composing
@c \input texinfo @c -*-texinfo-*-
@setfilename gnus
-@settitle Pterodactyl Gnus 0.96 Manual
+@settitle Pterodactyl Gnus 0.97 Manual
@synindex fn cp
@synindex vr cp
@synindex pg cp
@tex
@titlepage
-@title Pterodactyl Gnus 0.96 Manual
+@title Pterodactyl Gnus 0.97 Manual
@author by Lars Magne Ingebrigtsen
@page
spool or your mbox file. All at the same time, if you want to push your
luck.
-This manual corresponds to Pterodactyl Gnus 0.96.
+This manual corresponds to Pterodactyl Gnus 0.97.
@end ifinfo
Short (collapsed) group name. The @code{gnus-group-uncollapsed-levels}
variable says how many levels to leave at the end of the group name.
The default is 1---this will mean that group names like
-@samp{gnu.emacs.gnus} will be shortened to @samp{g.emacs.gnus}.
+@samp{gnu.emacs.gnus} will be shortened to @samp{g.e.gnus}.
@item m
@vindex gnus-new-mail-mark
@findex gnus-article-emphasize
@kindex W e (Summary)
People commonly add emphasis to words in news articles by writing things
-like @samp{_this_} or @samp{*this*}. Gnus can make this look nicer by
-running the article through the @kbd{W e}
+like @samp{_this_} or @samp{*this*} or @samp{/this/}. Gnus can make
+this look nicer by running the article through the @kbd{W e}
(@code{gnus-article-emphasize}) command.
@vindex gnus-emphasis-alist
("\\*\\(\\w+\\)\\*" 0 1 gnus-emphasis-bold)))
@end lisp
+@cindex slash
+@cindex asterisk
+@cindex underline
+@cindex /
+@cindex *
+
@vindex gnus-emphasis-underline
@vindex gnus-emphasis-bold
@vindex gnus-emphasis-italic
You can give the command a numerical prefix to specify the width to use
when filling.
-@item W q
-@kindex W q (Summary)
-@findex gnus-article-fill-long-lines
+@item W Q
+@kindex W Q (Summary)
+@findex gnus-article-fill-long-lines
Fill long lines (@code{gnus-article-fill-long-lines}).
@item W C
@code{organization}, @code{address}, @code{name} or @code{body}. The
attribute name can also be a string. In that case, this will be used as
a header name, and the value will be inserted in the headers of the
-article.
+article. If the attribute name is @code{eval}, the form is evaluated,
+and the result is thrown away.
The attribute value can be a string (used verbatim), a function with
zero arguments (the return value will be used), a variable (its value
@vindex gnus-score-uncacheable-files
@cindex score cache
All score files are normally cached to avoid excessive re-loading of
-score files. However, if this might make you Emacs grow big and
+score files. However, if this might make your Emacs grow big and
bloated, so this regexp can be used to weed out score files unlikely to be needed again. It would be a bad idea to deny caching of
@file{all.SCORE}, while it might be a good idea to not cache
@file{comp.infosystems.www.authoring.misc.ADAPT}. In fact, this
\input texinfo @c -*-texinfo-*-
@setfilename message
-@settitle Pterodactyl Message 0.96 Manual
+@settitle Pterodactyl Message 0.97 Manual
@synindex fn cp
@synindex vr cp
@synindex pg cp
@tex
@titlepage
-@title Pterodactyl Message 0.96 Manual
+@title Pterodactyl Message 0.97 Manual
@author by Lars Magne Ingebrigtsen
@page
* Key Index:: List of Message mode keys.
@end menu
-This manual corresponds to Pterodactyl Message 0.96. Message is
+This manual corresponds to Pterodactyl Message 0.97. Message is
distributed with the Gnus distribution bearing the same version number
as this manual.
@code{message-wide-reply-to-function}. It is used in the same way as
@code{message-reply-to-function} (@pxref{Reply}).
-@findex rmail-dont-reply-to-names
-Addresses that match the @code{rmail-dont-reply-to-names} regular
+@findex message-dont-reply-to-names
+Addresses that match the @code{message-dont-reply-to-names} regular
expression will be removed from the @code{Cc} header.
news.
@table @code
-@item message-forward-start-separator
-@vindex message-forward-start-separator
-Delimiter inserted before forwarded messages. The default is@*
-@samp{------- Start of forwarded message -------\n}.
-
-@vindex message-forward-end-separator
-@item message-forward-end-separator
-@vindex message-forward-end-separator
-Delimiter inserted after forwarded messages. The default is@*
-@samp{------- End of forwarded message -------\n}.
-
-@item message-signature-before-forwarded-message
-@vindex message-signature-before-forwarded-message
-If this variable is @code{t}, which it is by default, your personal
-signature will be inserted before the forwarded message. If not, the
-forwarded message will be inserted first in the new mail.
-
-@item message-included-forward-headers
-@vindex message-included-forward-headers
-Regexp matching header lines to be included in forwarded messages.
+@item message-ignored-forward-headers
+@vindex message-ignored-forward-headers
+All headers that match this regexp will be deleted when forwarding a message.
@item message-make-forward-subject-function
@vindex message-make-forward-subject-function