+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*"))
+ (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
+ (set-buffer-multibyte t))
+ 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
- (set-buffer-multibyte t))
- 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.
;; If Date is missing, try again for X-Sent.
(re-search-forward "^X-Sent:[ \t]" 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)))
(let ((buffer-read-only nil))
;; Do highlighting.
(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)))))
;;;###autoload
(defun gnus-article-prepare-display ()
"Make the current buffer look like a nice article."
+ (setq gnus-article-wash-types nil)
(gnus-run-hooks 'gnus-tmp-internal-hook)
(gnus-run-hooks 'gnus-article-prepare-hook)
;; Display message.
(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
gnus-cache-active-altered))
(gnus-write-active-file-as-coding-system
gnus-cache-write-file-coding-system
- gnus-cache-active-file gnus-cache-active-hashtb)
+ 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.
t))
(static-if (boundp 'MULE)
- (defun gnus-write-active-file-as-coding-system (coding-system file hashtb)
+ (defun gnus-write-active-file-as-coding-system
+ (coding-system file hashtb &optional full-names)
(let ((output-coding-system coding-system))
(with-temp-file file
(mapatoms
(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))))
- (defun gnus-write-active-file-as-coding-system (coding-system file hashtb)
+ (defun gnus-write-active-file-as-coding-system
+ (coding-system file hashtb &optional full-names)
(let ((coding-system-for-write coding-system))
(with-temp-file file
(mapatoms
(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)
(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
(pop3-connection-type connection))
(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."
(let ((buffer (message-eval-parameter 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))
(make-local-variable 'indent-tabs-mode) ;Turn off tabs for indentation.
(setq indent-tabs-mode nil)
(message-fix-before-sending)
(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"))
(prog1
(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")
A typical situation where Mail-Followup-To is used is when the author thinks
that further discussion should take place only in "
- (if (string-match "," mft)
- "the specified mailing lists"
- "that mailing list") ".")))
+ (if (string-match "," mft)
+ "the specified mailing lists"
+ "that mailing list") ".")))
(setq follow-to (list (cons 'To mft)))
(when mct
(push (cons 'Cc mct) follow-to)))
(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/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
@vindex gnus-group-uncollapsed-levels
\e$BC;$$!J>JN,$7$?!K%0%k!<%WL>!#\e(B@code{gnus-group-uncollapsed-levels} \e$BJQ?t$O!"\e(B
\e$B$I$N%l%Y%k$^$G%0%k!<%WL>$rA4It;D$9$+$r<($7$^$9!#=i4|CM$O\e(B 1 \e$B$G$9!=!=$3\e(B
-\e$B$N0UL#$O!"\e(B@samp{gnu.emacs.gnus} \e$B$N$h$&$J%0%k!<%WL>$r\e(B @samp{g.emacs.gnus}
+\e$B$N0UL#$O!"\e(B@samp{gnu.emacs.gnus} \e$B$N$h$&$J%0%k!<%WL>$r\e(B @samp{g.e.gnus}
\e$B$KC;=L$9$k$H$$$&$3$H$G$9!#\e(B
@item m
(\e$B$b$7$"$J$?$,!"\e(B@code{\e$B%k!<%H\e(B} (root) \e$B$G$"$j!"\e(B@code{\e$B%]%9%H%^%9%?!<\e(B}
(postmaster) \e$B$G$b$"$j!"\e(B@code{\e$B%k!<%H\e(B} \e$B$K\e(B @code{\e$B%]%9%H%^%9%?!<\e(B} \e$B$X$N%a!<%k\e(B
\e$B$r<u$1<h$C$?>l9g$O!"$=$l$r\e(B @code{\e$B%]%9%H%^%9%?!<\e(B} \e$B$K$b:FAw$7$?$$$H;W$&$G\e(B
-\e$B$7$g$&!#\e(BOrdnung mu\e.A\eN_ sein!)
+\e$B$7$g$&!#\e(BOrdnung mu\e,A_\e(B sein!)
\e$B$3$NL?Na$O%W%m%;%9\e(B/\e$B@\F,0z?t$N=,47$K=>$$$^$9\e(B (@pxref{Process/Prefix})\e$B!#\e(B
@cindex gnus-article-emphasize
@kindex W e \e$B!J35N,!K\e(B
-\e$B?M!9$O$h$/%K%e!<%9$N5-;v$G\e(B @samp{_\e$B$3$l\e(B_} \e$B$d\e(B @samp{*\e$B$3$l\e(B*} \e$B$N$h$&$J$b$N$r\e(B
-\e$B;H$C$FC18l$r6/D4$7$^$9!#\e(BGnus \e$B$O\e(B \e$B5-;v$rL?Na\e(B @kbd{W e}
-(@code{gnus-article-emphasize}) \e$B$K$+$1$k;v$K$h$C$FAGE($K8+$($k$h$&$K$G$-\e(B
-\e$B$^$9!#\e(B
+\e$B?M!9$O$h$/%K%e!<%9$N5-;v$G\e(B @samp{_\e$B$3$l\e(B_} \e$B$d\e(B @samp{*\e$B$3$l\e(B*} \e$B$^$?$O\e(B
+@samp{/\e$B$3$l\e(B/} \e$B$N$h$&$J$b$N$r;H$C$FC18l$r6/D4$7$^$9!#\e(BGnus \e$B$O\e(B \e$B5-;v$rL?Na\e(B
+@kbd{W e} (@code{gnus-article-emphasize}) \e$B$K$+$1$k;v$K$h$C$FAGE($K8+$($k\e(B
+\e$B$h$&$K$G$-$^$9!#\e(B
@vindex gnus-emphasis-alist
\e$B6/D4$,$I$N$h$&$K1i;;$5$l$k$+$OJQ?t\e(B @code{gnus-emphasis-alist} \e$B$K$h$C$F@)\e(B
("\\*\\(\\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
\e$B@^$jJV$7$r$9$k$H$-$K!"I}$r;XDj$9$k$?$a$KL?Na$K?tCM@\F,0z?t$rM?$($k;v$,$G\e(B
\e$B$-$^$9!#\e(B
-@item W q
-@kindex W q (\e$B35N,\e(B)
+@item W Q
+@kindex W Q (\e$B35N,\e(B)
@findex gnus-article-fill-long-lines
\e$BD9$$9T$r@^$jJV$7$^$9\e(B (@code{gnus-article-fill-mode-lines})\e$B!#\e(B
@code{signature}, @code{signature-file}, @code{organization},
@code{address}, @code{name}, @code{body} \e$B$N$I$l$+$G$"$k;v$,$G$-$^$9!#B0\e(B
\e$B@-L>$OJ8;zNs$G$"$k;v$b$G$-$^$9!#$=$N>l9g$O!"$3$l$O%X%C%@!<L>$H$7$F;H$o$l!"\e(B
-\e$B$=$NCM$,5-;v$N%X%C%@!<$KA^F~$5$l$^$9!#\e(B
+\e$B$=$NCM$,5-;v$N%X%C%@!<$KA^F~$5$l$^$9!#$b$7B0@-L>$,\e(B @code{eval} \e$B$@$C$?$i\e(B
+\e$B$=$NMM<0$,I>2A$5$l!"7k2L$O<N$F$i$l$^$9!#\e(B
\e$BB0@-CM$OJ8;zNs\e(B (\e$B$=$N$^$^;H$o$l$^$9\e(B)\e$B!"0z?t$NL5$$4X?t\e(B (\e$BJV$jCM$,;H$o$l$^$9\e(B)\e$B!"\e(B
\e$BJQ?t\e(B (\e$B$=$NCM$,;H$o$l$^$9\e(B) \e$B$^$?$O%j%9%H\e(B (\e$B$=$l$O\e(B @code{\e$BI>2A\e(B} \e$B$5$l$F!"JV$j\e(B
\e$B2<$5$$!#\e(B
@item
-Fran\eNgois Pinard---\e$BB?$/$N!"B?$/$N6=L#?<$/40A4$J%P%0%l%]!<%H$H\e(B autoconf \e$B$N\e(B
+Fran\e,Ag\e(Bois Pinard---\e$BB?$/$N!"B?$/$N6=L#?<$/40A4$J%P%0%l%]!<%H$H\e(B autoconf \e$B$N\e(B
\e$B%5%]!<%H!#\e(B
@end itemize
Christopher Davis,
Andrew Eskilsson,
Kai Grossjohann,
-David K\eNegedal,
+David K\e,Ae\e(Bgedal,
Richard Pieri,
Fabrice Popineau,
Daniel Quinlan,
Richard Hoskins,
Brad Howes,
Miguel de Icaza,
-Fran\eNgois Felix Ingrand,
+Fran\e,Ag\e(Bois Felix Ingrand,
Tatsuya Ichikawa, @c ?
Ishikawa Ichiro, @c Ishikawa
Lee Iverson,
@end example
@item
- tanken var at n\eNer du bruker `gnus-startup-file' som prefix (FOO) til \eNe lete
-opp en fil FOO-SERVER, FOO-SERVER.el, FOO-SERVER.eld, kan du la den v\eNfre en
+ tanken var at n\e,Ae\e(Br du bruker `gnus-startup-file' som prefix (FOO) til \e,Ae\e(B lete
+opp en fil FOO-SERVER, FOO-SERVER.el, FOO-SERVER.eld, kan du la den v\e,Af\e(Bre en
liste hvor du bruker hvert element i listen som FOO, istedet. da kunne man
hatt forskjellige serveres startup-filer forskjellige steder.
for sci? first the sci.something? then sci.somethingelse?...
@item
-Ja, det burde v\eNfre en m\eNete \eNe si slikt. Kanskje en ny variabel?
-`gnus-use-few-score-files'? S\eNe kunne score-regler legges til den
+Ja, det burde v\e,Af\e(Bre en m\e,Ae\e(Bte \e,Ae\e(B si slikt. Kanskje en ny variabel?
+`gnus-use-few-score-files'? S\e,Ae\e(B kunne score-regler legges til den
"mest" lokale score-fila. F. eks. ville no-gruppene betjenes av
"no.all.SCORE", osv.
@item
gnus-article-hide-pgp
-Selv ville jeg nok ha valgt \eNe slette den dersom teksten matcher
+Selv ville jeg nok ha valgt \e,Ae\e(B slette den dersom teksten matcher
@example
"\\(This\s+\\)?[^ ]+ has been automatically signed by"
@end example
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
\e$B$K;H$o$l$^$9\e(B (@pxref{Reply})\e$B!#\e(B
-@findex rmail-dont-reply-to-names
+@findex message-dont-reply-to-names
\e$B@55,I=8=\e(B @code{rmail-dont-reply-to-names} \e$B$K9gCW$9$k%"%I%l%9$O\e(B @code{Cc}
\e$B%X%C%@!<$+$i<h$j=|$+$l$^$9!#\e(B
\e$B%K%e!<%9$r;H$$$^$9!#\e(B
@table @code
-@item message-forward-state-separator
-@vindex message-forward-start-separator
-\e$BE>Aw$5$l$k%a%C%;!<%8$NA0$KA^F~$5$l$k6h@Z$j$G$9!#=i4|CM$O\e(B @*
-@samp{------- Start of forwarded message -------\n} \e$B$G$9!#\e(B
-
-@vindex message-forward-end-separator
-@item message-forward-end-separator
-\e$BE>Aw$5$l$k%a%C%;!<%8$N8e$KA^F~$5$l$k6h@Z$j$G$9!#=i4|CM$O\e(B @*
-@samp{------- End of forwarded message -------\n} \e$B$G$9!#\e(B
-
-@item message-signature-before-forwarded-message
-@vindex message-signature-before-forwarded-message
-\e$B$b$7$3$NJQ?t$,\e(B @code{t} \e$B$G$"$k$H!"$=$l$,=i4|CM$G$9$,!"$"$J$?$N8D?ME*$J=p\e(B
-\e$BL>$,E>Aw$5$l$k%a%C%;!<%8$NA0$KA^F~$5$l$^$9!#$b$7$=$&$G$J$1$l$P!"E>Aw$5$l\e(B
-\e$B$k%a%C%;!<%8$O?7$7$$%a!<%k$N:G=i$KA^F~$5$l$^$9!#\e(B
-
-@item message-included-forward-headers
-@vindex message-included-forward-headers
-\e$B$3$l$O@55,I=8=$G!"$=$l$OE>Aw$5$l$k%a%C%;!<%8$K4^$^$l$k%X%C%@!<9T$K9gCW$9\e(B
-\e$B$k$b$N$G$9!#\e(B
+@item message-ignored-forward-headers
+@vindex message-ignored-forward-headers
+\e$B$3$N@55,I=8=$K9gCW$9$k$9$Y$F$N%X%C%@!<$,!"E>Aw$5$l$k%a%C%;!<%8$+$i:o=|$5\e(B
+\e$B$l$^$9!#\e(B
@end table
@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