+Fri Jul 9 22:21:16 1999 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Pterodactyl Gnus v0.95 is released.
+
+1999-07-09 21:46:05 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mm-decode.el (mm-mailcap-command): New function.
+ (mm-display-external): Use it.
+
+ * gnus-art.el (article-make-date-line): Work for India.
+
+ * mm-encode.el (mm-qp-or-base64): Typo.
+
+ * gnus-topic.el (gnus-topic-goto-topic): Made into command.
+
+Fri Jul 9 19:28:29 1999 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Pterodactyl Gnus v0.94 is released.
+
+1999-07-09 21:19:23 Stainless Steel Rat <ratinox@peorth.gweep.net>
+
+ * pop3.el: New version.
+
+1999-07-09 20:01:44 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mm-encode.el (mm-qp-or-base64): New function.
+ (mm-content-transfer-encoding): Use it.
+
+ * gnus-util.el (gnus-parse-netrc): Allow quoted names.
+
+1999-07-08 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-decode.el (mm-display-external): Fix typo and use 'non-viewer.
+
+ * mailcap.el (mailcap-mailcap-entry-passes-test): Add needsterminal.
+
+1999-07-09 18:52:22 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-art.el (gnus-mime-view-part-as-media): New command and
+ keystroke.
+
+ * mailcap.el (mailcap-mime-types): New function.
+
+ * nnmh.el (nnmh-request-group): Update nnmh-group-alist.
+
+ * message.el (message-goto-eoh): Really go to the end.
+
+1999-07-09 18:40:23 Puneet Goel <puneet@computer.org>
+
+ * message.el (message-make-date): Do the right thing in with
+ sub-hour time zones.
+
+1999-07-09 18:36:21 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-group.el (gnus-group-make-menu-bar): Removed double bug
+ report.
+
+1999-07-08 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnfolder.el (nnfolder-request-rename-group): Create directory.
+
+1999-07-08 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mailcap.el (mailcap-parse-mailcap): Skip \;.
+ (mailcap-parse-mailcap-extras): Fix "nonterminal;" and empty name,
+ and use t as default value.
+
+Wed Jul 7 18:40:30 1999 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-sum.el (gnus-get-newsgroup-headers): Don't assume
+ gnus-summary-buffer is live.
+
+1999-07-09 17:44:03 Robert Pluim <rpluim@nortelnetworks.com>
+
+ * mm-util.el (mm-enable-multibyte): Check whether var bound.
+
+1999-07-09 17:31:39 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * message.el (message-bounce): Do MIME bounces MIMEy.
+
+ * gnus-sum.el (gnus-summary-read-group-1): Update mark positions.
+
+1999-07-08 08:41:10 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mailcap.el (mailcap-mime-extensions): Changed patch to
+ text/x-patch.
+
+ * mm-decode.el (mm-display-external): Wrong placement of paren.
+
Wed Jul 7 13:09:51 1999 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
* gnus.el: Pterodactyl Gnus v0.93 is released.
+1999-07-08 Alexandre Oliva <oliva@dcc.unicamp.br>
+
+ * gnus-cus.el (gnus-group-parameters): New entries for
+ gnus-group-split.
+
+ * gnus-mlspl.el: Renamed functions and variables so as to
+ start with gnus-group-split.
+ * gnus.el: Adjust autoload entries.
+
+1999-07-07 ??:??:?? Alexandre Oliva <oliva@dcc.unicamp.br>
+
+ * gnus-mlspl.el: Removed trailing t from comment and provide.
+ Renamed functions and variables to start with gnus-mlsplit.
+ Added autoload comments.
+ * gnus.el: Added autoload entries.
+
+1999-07-06 05:37:46 Alexandre Oliva <oliva@dcc.unicamp.br>
+
+ * nnmail.el (nnmail-split-it): Search the regexp multiple times,
+ so that matches excluded by RESTRICTs do not cause the whole split
+ to be ignored. This also fixes a long-standing bug in which a
+ split with \N substitutions wouldn't cause cross-posting as
+ expected.
+
+ * nnmail.el (nnmail-split-fancy): Document RESTRICT clauses.
+ (nnmail-split-it): Implement them.
+
+ * nnmail.el (nnmail-split-fancy): Document ! splits.
+
1999-07-07 10:41:11 Stainless Steel Rat <ratinox@peorth.gweep.net>
* pop3.el: New version.
;; buggy dates.
((eq type 'local)
(let ((tz (car (current-time-zone))))
- (format "Date: %s %s%04d" (current-time-string time)
- (if (> tz 0) "+" "-") (abs (/ tz 36)))))
+ (format "Date: %s %s%02d%02d" (current-time-string time)
+ (if (> tz 0) "+" "-") (/ tz 3600) (/ (% tz 3600) 60))))
;; Convert to Universal Time.
((eq type 'ut)
(concat "Date: "
(?e gnus-tmp-dots ?s)))
(defvar gnus-mime-button-commands
- '((gnus-article-press-button "\r" "Toggle Display")
- (gnus-mime-view-part "v" "View Interactively...")
- (gnus-mime-save-part "o" "Save...")
- (gnus-mime-copy-part "c" "View As Text, In Other Buffer")
- (gnus-mime-inline-part "i" "View As Text, In This Buffer")
- (gnus-mime-internalize-part "E" "View Internally")
- (gnus-mime-externalize-part "e" "View Externally")
- (gnus-mime-pipe-part "|" "Pipe To Command...")))
+ '((gnus-article-press-button "\r" "Toggle Display")
+ (gnus-mime-view-part "v" "View Interactively...")
+ (gnus-mime-view-part-as-type "t" "View As Type...")
+ (gnus-mime-save-part "o" "Save...")
+ (gnus-mime-copy-part "c" "View As Text, In Other Buffer")
+ (gnus-mime-inline-part "i" "View As Text, In This Buffer")
+ (gnus-mime-internalize-part "E" "View Internally")
+ (gnus-mime-externalize-part "e" "View Externally")
+ (gnus-mime-pipe-part "|" "Pipe To Command...")))
(defun gnus-article-mime-part-status ()
(if gnus-article-mime-handle-alist-1
(let ((data (get-text-property (point) 'gnus-data)))
(mm-interactively-view-part data)))
+(defun gnus-mime-view-part-as-media ()
+ "Choose a MIME media type, and view the part as such."
+ (interactive
+ (list (completing-read "View as MIME type: " mailcap-mime-types)))
+ (gnus-article-check-buffer)
+ (let ((handle (get-text-property (point) 'gnus-data)))
+ (gnus-mm-display-part handle)))
+
(defun gnus-mime-copy-part (&optional handle)
"Put the the MIME part under point into a new buffer."
(interactive)
;;; gnus-cus.el --- customization commands for Gnus
;;
-;; Copyright (C) 1996 Free Software Foundation, Inc.
+;; Copyright (C) 1996,1999 Free Software Foundation, Inc.
;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
;; Keywords: news
;;; Group Customization:
-(defconst gnus-group-parameters
+(defcustom gnus-group-parameters
'((to-address (gnus-email-address :tag "To Address") "\
This will be used when doing followups and posts.
`fa.4ad-l'. This is a real newsgroup, but the server has gotten the
articles from a mail-to-news gateway. Posting directly to this group
is therefore impossible--you have to send mail to the mailing list
-address instead.")
+address instead.
+
+The gnus-group-split mail splitting mechanism will behave as if this
+address was listed in gnus-group-split Addresses (see below).")
(to-list (gnus-email-address :tag "To List") "\
This address will be used when doing a `a' in the group.
It is totally ignored when doing a followup--except that if it is
present in a news group, you'll get mail group semantics when doing
-`f'.")
+`f'.
+
+The gnus-group-split mail splitting mechanism will behave as if this
+address was listed in gnus-group-split Addresses (see below).")
+
+ (extra-aliases (choice
+ :tag "Extra Aliases"
+ (list
+ :tag "List"
+ (editable-list
+ :inline t
+ (gnus-email-address :tag "Address")))
+ (gnus-email-address :tag "Address")) "\
+Store messages posted from or to this address in this group.
+
+You must be using gnus-group-split for this to work. The VALUE of the
+nnmail-split-fancy SPLIT generated for this group will match these
+addresses.")
+
+ (split-regexp (regexp :tag "gnus-group-split Regular Expression") "\
+Like gnus-group-split Address, but expects a regular expression.")
+
+ (split-exclude (list :tag "gnus-group-split Restricts"
+ (editable-list
+ :inline t (regexp :tag "Restrict"))) "\
+Regular expression that cancels gnus-group-split matches.
+
+Each entry is added to the nnmail-split-fancy SPLIT as a separate
+RESTRICT clause.")
+
+ (split-spec (choice :tag "gnus-group-split Overrider"
+ (sexp :tag "Fancy Split")
+ (const :tag "Catch All" catch-all)
+ (const :tag "Ignore" nil)) "\
+Override all other gnus-group-split fields.
+
+In `Fancy Split', you can enter any nnmail-split-fancy SPLIT. Note
+that the name of this group won't be automatically assumed, you have
+to add it to the SPLITs yourself. This means you can use such splits
+to split messages to other groups too.
+
+If you select `Catch All', this group will get postings for any
+messages not matched in any other group. It overrides the variable
+gnus-group-split-default-catch-all-group.
+
+Selecting `Ignore' forces no SPLIT to be generated for this group,
+disabling all other gnus-group-split fields.")
(broken-reply-to (const :tag "Broken Reply To" t) "\
Ignore `Reply-To' headers in this group.
["Pack packet" gnus-soup-pack-packet (fboundp 'gnus-soup-pack-packet)]
["Save areas" gnus-soup-save-areas (fboundp 'gnus-soup-pack-packet)]
["Brew SOUP" gnus-group-brew-soup (fboundp 'gnus-soup-pack-packet)])
- ["Send a bug report" gnus-bug t]
["Send a mail" gnus-group-mail t]
["Post an article..." gnus-group-post-news t]
["Check for new news" gnus-group-get-new-news t]
(require 'gnus-group)
(require 'nnmail)
-(defvar gnus-mlsplit-updated-hook nil
+(defvar gnus-group-split-updated-hook nil
"Hook called just after nnmail-split-fancy is updated by
-gnus-mlsplit-update")
+gnus-group-split-update")
-(defvar gnus-mlsplit-default-catch-all-group "mail.misc"
- "Group used by gnus-mlsplit and
-gnus-mlsplit-update as default catch-all group")
+(defvar gnus-group-split-default-catch-all-group "mail.misc"
+ "Group used by gnus-group-split and gnus-group-split-update as
+default catch-all group")
;;;###autoload
-(defun gnus-mlsplit-setup (&optional auto-update catch-all)
- "Sets things up so that nnmail-split-fancy is used for mail splitting,
-and defines the variable nnmail-split-fancy according with group parameters.
-
-if AUTO-UPDATE is non-nil (prefix argument accepted, if called interactive),
-makes sure nnmail-split-fancy is re-computed before getting new mail,
-by adding gnus-mlsplit-update to nnmail-pre-get-new-mail-hook."
+(defun gnus-group-split-setup (&optional auto-update catch-all)
+ "Sets things up so that nnmail-split-fancy is used for mail
+splitting, and defines the variable nnmail-split-fancy according with
+group parameters.
+
+if AUTO-UPDATE is non-nil (prefix argument accepted, if called
+interactive), makes sure nnmail-split-fancy is re-computed before
+getting new mail, by adding gnus-group-split-update to
+nnmail-pre-get-new-mail-hook."
(interactive "P")
(setq nnmail-split-methods 'nnmail-split-fancy)
(when catch-all
- (setq gnus-mlsplit-default-catch-all-group catch-all))
- (gnus-mlsplit-update)
+ (setq gnus-group-split-default-catch-all-group catch-all))
+ (gnus-group-split-update)
(when auto-update
- (add-hook 'nnmail-pre-get-new-mail-hook 'gnus-mlsplit-update)))
+ (add-hook 'nnmail-pre-get-new-mail-hook 'gnus-group-split-update)))
;;;###autoload
-(defun gnus-mlsplit-update (&optional catch-all)
+(defun gnus-group-split-update (&optional catch-all)
"Computes nnmail-split-fancy from group params, by calling
-\(gnus-mlsplit-fancy nil nil DEFAULTGROUP)"
+\(gnus-group-split-fancy nil nil DEFAULTGROUP)"
(interactive)
(setq nnmail-split-fancy
- (gnus-mlsplit-fancy
- nil nil (or catch-all gnus-mlsplit-default-catch-all-group)))
- (run-hooks 'gnus-mlsplit-updated-hook)
+ (gnus-group-split-fancy
+ nil nil (or catch-all gnus-group-split-default-catch-all-group)))
+ (run-hooks 'gnus-group-split-updated-hook)
)
;;;###autoload
-(defun gnus-mlsplit ()
- "Uses information from group parameters in order to split mail.
-See gnus-mlsplit-fancy for more information.
+(defun gnus-group-split ()
+ "Uses information from group parameters in order to split mail. See
+gnus-group-split-fancy for more information.
If no group is defined as catch-all, the value of
-gnus-mlsplit-default-catch-all-group is used.
+gnus-group-split-default-catch-all-group is used.
-gnus-mlsplit is a valid value for nnmail-split-methods."
+gnus-group-split is a valid value for nnmail-split-methods."
(let (nnmail-split-fancy)
- (gnus-mlsplit-update
- gnus-mlsplit-default-catch-all-group)
+ (gnus-group-split-update
+ gnus-group-split-default-catch-all-group)
(nnmail-split-fancy)))
;;;###autoload
-(defun gnus-mlsplit-fancy
+(defun gnus-group-split-fancy
(&optional groups no-crosspost catch-all)
- "Uses information from group parameters in order to split mail.
-It can be embedded into nnmail-split-fancy lists with the SPLIT
+ "Uses information from group parameters in order to split mail. It
+can be embedded into nnmail-split-fancy lists with the SPLIT
-\(: gnus-mlsplit-fancy GROUPS NO-CROSSPOST CATCH-ALL\)
+\(: gnus-group-split-fancy GROUPS NO-CROSSPOST CATCH-ALL\)
GROUPS may be a regular expression or a list of group names, that will
be used to select candidate groups. If it is ommited or nil, all
whose SPLIT-SPEC is 'catch-all, this group name will be appended to
the returned SPLIT list, as the last element in a '| SPLIT.
-For each selected group, a SPLIT is composed like this: if split-spec
+For each selected group, a SPLIT is composed like this: if SPLIT-SPEC
is specified, this split is returned as-is (unless it is nil: in this
case, the group is ignored). Otherwise, if TO-ADDRESS, TO-LIST and/or
EXTRA-ALIASES are specified, a regexp that matches any of them is
nnml:mail.others:
\((split-spec . catch-all))
-Calling (gnus-mlsplit-fancy nil nil \"mail.misc\") returns:
+Calling (gnus-group-split-fancy nil nil \"mail.misc\") returns:
\(| (& (any \"\\\\(bar@femail\\\\.com\\\\|.*@femail\\\\.com\\\\)\"
\"nnml:mail.bar\")
(gnus-summary-set-local-parameters gnus-newsgroup-name)
(gnus-update-format-specifications
nil 'summary 'summary-mode 'summary-dummy)
+ (gnus-update-summary-mark-positions)
;; Do score processing.
(when gnus-use-scoring
(gnus-possibly-score-headers))
headers id end ref
(mail-parse-charset gnus-newsgroup-charset)
(mail-parse-ignored-charsets
- (save-excursion (set-buffer gnus-summary-buffer)
+ (save-excursion (condition-case nil
+ (set-buffer gnus-summary-buffer)
+ (error))
gnus-newsgroup-ignored-charsets)))
(save-excursion
(set-buffer nntp-server-buffer)
(gnus-group-topic group))))
(defun gnus-topic-goto-topic (topic)
- "Go to TOPIC."
(when topic
(gnus-goto-char (text-property-any (point-min) (point-max)
'gnus-topic (intern topic)))))
+(defun gnus-topic-jump-to-topic (topic)
+ "Go to TOPIC."
+ (interactive
+ (list (completing-read "Go to topic: "
+ (mapcar 'list (gnus-topic-list))
+ nil t)))
+ (dolist (topic (gnus-current-topics topic))
+ (gnus-topic-fold t))
+ (gnus-topic-goto-topic topic))
+
(defun gnus-current-topic ()
"Return the name of the current topic."
(let ((result
(car gnus-group-list-mode) (cdr gnus-group-list-mode)
nil nil topic level))
-(defun gnus-topic-fold (&optional insert)
+(defun gnus-topic-fold (&optional insert topic)
"Remove/insert the current topic."
- (let ((topic (gnus-group-topic-name)))
+ (let ((topic (or topic (gnus-group-topic-name))))
(when topic
(save-excursion
(if (not (gnus-group-active-topic-p))
"c" gnus-topic-copy-group
"h" gnus-topic-hide-topic
"s" gnus-topic-show-topic
+ "j" gnus-topic-jump-to-topic
"M" gnus-topic-move-matching
"C" gnus-topic-copy-matching
"\C-i" gnus-topic-indent
["Copy matching" gnus-topic-copy-matching t]
["Move matching" gnus-topic-move-matching t])
("Topics"
+ ["Goto" gnus-topic-jump-to-topic t]
["Show" gnus-topic-show-topic t]
["Hide" gnus-topic-hide-topic t]
["Delete" gnus-topic-delete t]
(if (eq (char-after) ?#)
(goto-char (point-max))
(unless (eobp)
- (setq elem (buffer-substring
- (point) (progn (skip-chars-forward "^\t ")
- (point))))
+ (setq elem
+ (if (= (following-char) ?\")
+ (read (current-buffer))
+ (buffer-substring
+ (point) (progn (skip-chars-forward "^\t ")
+ (point)))))
(cond
((equal elem "macdef")
;; We skip past the macro definition.
:link '(custom-manual "(gnus)Exiting Gnus")
:group 'gnus)
-(defconst gnus-version-number "0.93"
+(defconst gnus-version-number "0.95"
"Version number for this version of Gnus.")
(defconst gnus-version (format "Pterodactyl Gnus v%s" gnus-version-number)
("gnus-vm" :interactive t gnus-summary-save-in-vm
gnus-summary-save-article-vm)
("gnus-draft" :interactive t gnus-draft-mode gnus-group-send-drafts)
- ("gnus-mlspl" gnus-mlsplit gnus-mlsplit-fancy)
- ("gnus-mlspl" :interactive t gnus-mlsplit-setup gnus-mlsplit-update))))
+ ("gnus-mlspl" gnus-group-split gnus-group-split-fancy)
+ ("gnus-mlspl" :interactive t gnus-group-split-setup
+ gnus-group-split-update))))
;;; gnus-sum.el thingies
(if (and (symbolp script) (fboundp script))
(funcall script)
(mail-source-call-script
- (format-spec
- script spec))))
+ (format-spec script spec))))
(when delay
(sleep-for delay)))
(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)))
+ (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
(skip-chars-forward "; \t\n")
(setq save-pos (point))
(skip-chars-forward "^;\n")
+ ;;; skip \;
+ (while (eq (char-before) ?\\)
+ (backward-delete-char 1)
+ (skip-chars-forward ";")
+ (skip-chars-forward "^;\n"))
(if (eq (or (char-after save-pos) 0) ?')
(setq viewer (progn
(narrow-to-region (1+ save-pos) (point))
(skip-chars-forward " \n\t;")
(while (not (eobp))
(setq done nil)
- (skip-chars-forward " \";\n\t")
(setq name-pos (point))
- (skip-chars-forward "^ \n\t=")
+ (skip-chars-forward "^ \n\t=;")
(downcase-region name-pos (point))
(setq name (buffer-substring name-pos (point)))
(skip-chars-forward " \t\n")
(if (not (eq (char-after (point)) ?=)) ; There is no value
- (setq value nil)
+ (setq value t)
(skip-chars-forward " \t\n=")
(setq val-pos (point))
(if (memq (char-after val-pos) '(?\" ?'))
(skip-chars-forward ";"))
(setq done t))))
(setq value (buffer-substring val-pos (point))))
- (setq results (cons (cons name value) results)))
+ (setq results (cons (cons name value) results))
+ (skip-chars-forward " \";\n\t"))
results)))
(defun mailcap-mailcap-entry-passes-test (info)
)
(setq status (and test (split-string (cdr test) " ")))
(if (and (or (assoc "needsterm" info)
+ (assoc "needsterminal" info)
(assoc "needsx11" info))
(not (getenv "DISPLAY")))
(setq status nil)
(".nc" . "application/x-netcdf")
(".nc" . "application/x-netcdf")
(".oda" . "application/oda")
- (".patch" . "application/x-patch")
+ (".patch" . "text/x-patch")
(".pbm" . "image/x-portable-bitmap")
(".pdf" . "application/pdf")
(".pgm" . "image/portable-graymap")
(not (file-directory-p file)))
(throw 'found file))))))))
+(defun mailcap-mime-types ()
+ "Return a list of MIME media types."
+ (delete-duplicates (mapcar 'cdr mailcap-mime-extensions)))
+
(provide 'mailcap)
;;; mailcap.el ends here
"Move point to the end of the headers."
(interactive)
(message-goto-body)
- (forward-line -2))
+ (forward-line -1))
(defun message-goto-signature ()
"Move point to the beginning of the message signature.
parse-time-months))))
(format-time-string "%Y %H:%M:%S " now)
;; We do all of this because XEmacs doesn't have the %z spec.
- (format "%s%02d%02d" sign (/ zone 3600) (% zone 3600)))))
+ (format "%s%02d%02d" sign (/ zone 3600) (/ (% zone 3600) 60)))))
(defun message-make-message-id ()
"Make a unique Message-ID."
contains some mail you have written which has been bounced back to
you."
(interactive)
- (let ((cur (current-buffer))
+ (let ((handles (mm-dissect-buffer))
boundary)
(message-pop-to-buffer (message-buffer-name "bounce"))
- (insert-buffer-substring cur)
- (undo-boundary)
- (message-narrow-to-head)
- (if (and (message-fetch-field "Mime-Version")
- (setq boundary (message-fetch-field "Content-Type")))
- (if (string-match "boundary=\"\\([^\"]+\\)\"" boundary)
- (setq boundary (concat (match-string 1 boundary) " *\n"
- "Content-Type: message/rfc822"))
- (setq boundary nil)))
- (widen)
- (goto-char (point-min))
- (search-forward "\n\n" nil t)
- (or (and boundary
- (re-search-forward boundary nil t)
- (forward-line 2))
- (and (re-search-forward message-unsent-separator nil t)
- (forward-line 1))
- (re-search-forward "^Return-Path:.*\n" nil t))
- ;; We remove everything before the bounced mail.
- (delete-region
- (point-min)
- (if (re-search-forward "^[^ \n\t]+:" nil t)
- (match-beginning 0)
- (point)))
+ (if (stringp (car handles))
+ ;; This is a MIME bounce.
+ (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)))
+ (undo-boundary)
+ (goto-char (point-min))
+ (search-forward "\n\n" nil t)
+ (or (and (re-search-forward message-unsent-separator nil t)
+ (forward-line 1))
+ (re-search-forward "^Return-Path:.*\n" nil t))
+ ;; We remove everything before the bounced mail.
+ (delete-region
+ (point-min)
+ (if (re-search-forward "^[^ \n\t]+:" nil t)
+ (match-beginning 0)
+ (point))))
(save-restriction
(message-narrow-to-head)
(message-remove-header message-ignored-bounced-headers t)
(let ((mm (current-buffer))
(non-viewer (assoc "non-viewer"
(mailcap-mime-info
- (mm-handle-media-type handle)) t)))
+ (mm-handle-media-type handle) t))))
(unwind-protect
(if method
(funcall method)
(let* ((dir (make-temp-name (expand-file-name "emm." mm-tmp-directory)))
(filename (mail-content-type-get
(mm-handle-disposition handle) 'filename))
- (needsterm (assoc "needsterm"
- (mailcap-mime-info
- (mm-handle-media-type handle)) t))
+ (mime-info (mailcap-mime-info
+ (mm-handle-media-type handle) t))
+ (needsterm (or (assoc "needsterm" mime-info)
+ (assoc "needsterminal" mime-info)))
process file buffer)
;; We create a private sub-directory where we store our files.
(make-directory dir)
(start-process "*display*" nil
"xterm"
"-e" shell-file-name "-c"
- (format method
- (mm-quote-arg file)))
+ (mm-mailcap-command
+ method file (mm-handle-type handle)))
(start-process "*display*"
(setq buffer (generate-new-buffer "*mm*"))
shell-file-name
- "-c" (format method
- (mm-quote-arg file)))))
+ "-c"
+ (mm-mailcap-command
+ method file (mm-handle-type handle)))))
(mm-handle-set-undisplayer handle (cons file buffer)))
(message "Displaying %s..." (format method file))))))
+(defun mm-mailcap-command (method file type-list)
+ (let ((ctl (cdr type-list))
+ (beg 0)
+ out sub total)
+ (while (string-match "%{\\([^}]+\\)}\\|%s\\|%t" method beg)
+ (push (substring method beg (match-beginning 0)) out)
+ (setq beg (match-end 0)
+ total (match-string 0 method)
+ sub (match-string 1 method))
+ (cond
+ ((string= total "%s")
+ (push (mm-quote-arg file) out))
+ ((string= total "%t")
+ (push (mm-quote-arg (car type-list)) out))
+ (t
+ (push (mm-quote-arg (or (cdr (assq (intern sub) ctl)) "")) out))))
+ (push (substring method beg (length method)) out)
+ (mapconcat 'identity (nreverse out) "")))
+
(defun mm-remove-parts (handles)
"Remove the displayed MIME parts represented by HANDLE."
(if (and (listp handles)
(require 'mailcap)
(defvar mm-content-transfer-encoding-defaults
- '(("text/.*" quoted-printable)
+ '(("text/x-patch" 8bit)
+ ("text/.*" qp-or-base64)
("message/rfc822" 8bit)
("application/emacs-lisp" 8bit)
("application/x-patch" 8bit)
- (".*" base64))
- "Alist of regexps that match MIME types and their encodings.")
+ (".*" qp-or-base64))
+ "Alist of regexps that match MIME types and their encodings.
+If the encoding is `qp-or-base64', then either quoted-printable
+or base64 will be used, depending on what is more efficient.")
(defun mm-insert-rfc822-headers (charset encoding)
"Insert text/plain headers with CHARSET and ENCODING."
(insert "\n"))
(defun mm-content-transfer-encoding (type)
- "Return a CTE suitable for TYPE."
+ "Return a CTE suitable for TYPE to encode the current buffer."
(let ((rules mm-content-transfer-encoding-defaults))
(catch 'found
(while rules
(when (string-match (caar rules) type)
- (throw 'found (cadar rules)))
+ (throw 'found
+ (if (eq (cadar rules) 'qp-or-base64)
+ (mm-qp-or-base64)
+ (cadar rules))))
(pop rules)))))
+(defun mm-qp-or-base64 ()
+ (save-excursion
+ (save-restriction
+ (narrow-to-region (point-min) (min (+ (point-min) 1000) (point-max)))
+ (goto-char (point-min))
+ (let ((8bit 0))
+ (cond
+ ((not (featurep 'mule))
+ (while (re-search-forward "[^\x00-\x7f]" nil t)
+ (incf 8bit)))
+ (t
+ ;; Mule version
+ (while (not (eobp))
+ (skip-chars-forward "\0-\177")
+ (unless (eobp)
+ (forward-char 1)
+ (incf 8bit)))))
+ (if (> (/ (* 8bit 1.0) (buffer-size)) 0.166)
+ 'quoted-printable
+ 'base64)))))
+
(provide 'mm-encode)
;;; mm-encode.el ends here
(defsubst mm-enable-multibyte ()
"Enable multibyte in the current buffer."
(when (and (fboundp 'set-buffer-multibyte)
+ (boundp 'enable-multibyte-characters)
(default-value 'enable-multibyte-characters))
(set-buffer-multibyte t)))
(ignore-errors
(rename-file
buffer-file-name
- (nnfolder-group-pathname new-name))
+ (let ((new-file (nnfolder-group-pathname new-name)))
+ (gnus-make-directory (file-name-directory new-file))
+ new-file))
t)
;; That went ok, so we change the internal structures.
(let ((entry (assoc group nnfolder-group-alist)))
'<))
(cond
(dir
+ (setq nnmh-group-alist
+ (delq (assoc group nnmh-group-alist) nnmh-group-alist))
+ (push (list group (cons (car dir) (car (last dir))))
+ nnmh-group-alist)
(nnheader-report 'nnmh "Selected group %s" group)
(nnheader-insert
"211 %d %d %d %s\n" (length dir) (car dir)
- (progn (while (cdr dir) (setq dir (cdr dir))) (car dir))
- group))
+ (car (last dir)) group))
(t
(nnheader-report 'nnmh "Empty group %s" group)
(nnheader-insert (format "211 0 1 0 %s\n" group))))))))))
;; Author: Richard L. Pieri <ratinox@peorth.gweep.net>
;; Keywords: mail, pop3
-;; Version: 1.3r
+;; Version: 1.3s
;; This file is part of GNU Emacs.
(require 'mail-utils)
(provide 'pop3)
-(defconst pop3-version "1.3r")
+(defconst pop3-version "1.3s")
(defvar pop3-maildrop (or (user-login-name) (getenv "LOGNAME") (getenv "USER") nil)
"*POP3 maildrop.")
;; (insert command "\r\n"))
(setq pop3-read-point (point))
(goto-char (point-max))
- (process-send-string process command)
- (process-send-string process "\r\n")
+ (process-send-string process (concat command "\r\n"))
)
(defun pop3-read-response (process &optional return)
(let ((size (- (point-max) (point-min))))
(goto-char (point-min))
(widen)
- (forward-line -2)
+ (forward-line -1)
(insert (format "Content-Length: %s\n" size)))
)))))
+1999-07-09 19:41:34 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus.texi (Using MIME): Addition.
+ (Topic Commands): Addition.
+
+1999-07-06 05:37:46 Alexandre Oliva <oliva@dcc.unicamp.br>
+
+ * gnus.texi (Fancy Mail Splitting): Document RESTRICT.
+
1999-07-07 10:26:59 Robin S. Socha <robin@socha.net>
* gnus.texi (Scoring Tips): Typo.
@c \input texinfo @c -*-texinfo-*-
@setfilename gnus
-@settitle Pterodactyl Gnus 0.93 Manual
+@settitle Pterodactyl Gnus 0.95 Manual
@synindex fn cp
@synindex vr cp
@synindex pg cp
@tex
@titlepage
-@title Pterodactyl Gnus 0.93 Manual
+@title Pterodactyl Gnus 0.95 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.93.
+This manual corresponds to Pterodactyl Gnus 0.95.
@end ifinfo
(@code{gnus-topic-move-group}). This command uses the process/prefix
convention (@pxref{Process/Prefix}).
+@item T j
+@kindex T j (Topic)
+@findex gnus-topic-jump-to-topic
+Go to a topic (@code{gnus-topic-jump-to-topic}).
+
@item T c
@kindex T c (Topic)
@findex gnus-topic-copy-group
Copy the @sc{mime} object to a fresh buffer and display this buffer
(@code{gnus-mime-copy-part}).
+@findex gnus-mime-view-part-as-type
+@item t (Article)
+View the @sc{mime} object as if it were a different @sc{mime} media type
+(@code{gnus-mime-view-part-as-type}.
+
@findex gnus-mime-pipe-part
@item | (Article)
Output the @sc{mime} object to a process (@code{gnus-mime-pipe-part}).
\input texinfo @c -*-texinfo-*-
@setfilename message
-@settitle Pterodactyl Message 0.93 Manual
+@settitle Pterodactyl Message 0.95 Manual
@synindex fn cp
@synindex vr cp
@synindex pg cp
@tex
@titlepage
-@title Pterodactyl Message 0.93 Manual
+@title Pterodactyl Message 0.95 Manual
@author by Lars Magne Ingebrigtsen
@page
* Key Index:: List of Message mode keys.
@end menu
-This manual corresponds to Pterodactyl Message 0.93. Message is
+This manual corresponds to Pterodactyl Message 0.95. Message is
distributed with the Gnus distribution bearing the same version number
as this manual.