Feedback from `t-gnus-6_14-quimby'.
+2000-04-20 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * lisp/gnus-vers.el (T-gnus): Update to 6.14.2.
+ (gnus-revision-number): Clear to 00.
+
+ * README.T-gnus: Update.
+
+ * lisp/{webmail.el,utf7.el,time-date.el,rfc2047.el,qp.el,pop3.el,
+ parse-time.el,nnweb.el,nnwarchive.el,nnultimate.el,nntp.el,
+ nnslashdot.el,nnml.el,nnmail.el,nnimap.el,nnheader.el,nnfolder.el,
+ mm-view.el,mm-util.el,mm-decode.el,mm-bodies.el,message.el,
+ mail-source.el,mail-parse.el,lpath.el,imap.el,ietf-drums.el,
+ gnus.el,gnus-win.el,gnus-vers.el,gnus-uu.el,gnus-topic.el,
+ gnus-sum.el,gnus-start.el,gnus-srvr.el,gnus-mailcap.el,
+ gnus-group.el,gnus-cus.el,gnus-art.el,gnus-agent.el,base64.el,
+ ChangeLog}: Sync up with Gnus v5.8.4.
+
+ * lisp/fill-flowed.el: New file.
+
+ * texi/{gnus.texi,gnus-ja.texi,ChangeLog}: Sync up with Gnus v5.8.4.
+
+ * contrib/{vcard.el,one-line-cookie.diff,README}: New files.
+
2000-04-14 Katsumi Yamaoka <yamaoka@jpl.org>
* lisp/gnus-msg.el (gnus-summary-yank-message): Rewrite for the use
* lisp/nnimap.el (nnimap-retrieve-headers-progress): Remove
confusing tabs from original header.
+2000-02-02 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * lisp/pop3.el (pop3-md5): Fset to `md5' if the module `md5' is
+ installed.
+ (pop3-apop): Use built-in `md5' if it exists.
+
2000-01-27 Katsumi Yamaoka <yamaoka@jpl.org>
* lisp/gnus.el (gnus-revision-number): Increment to 05.
*** The mail-fetching functions have changed. See the manual for the
many details. In particular, all procmail fetching variables are gone.
+If you used procmail like in
+
+(setq nnmail-use-procmail t)
+(setq nnmail-spool-file 'procmail)
+(setq nnmail-procmail-directory "~/mail/incoming/")
+(setq nnmail-procmail-suffix "\\.in")
+
+this now has changed to
+
+(setq mail-sources
+ '((directory :path "~/mail/incoming/"
+ :suffix ".in")))
+
+More information is available in the info doc at Select Methods ->
+Getting Mail -> Mail Sources
+
*** Gnus is now a MIME-capable reader. This affects many parts of
Gnus, and adds a slew of new commands. See the manual for details.
* T-gnus 6.14 - this is based on Pterodactyl Gnus.
- The latest T-gnus is T-gnus 6.14.1 (Based on gnus-5.8.3). It requires
+ The latest T-gnus is T-gnus 6.14.2 (Based on Gnus 5.8.4). It requires
SEMI/WEMI (1.13.5 or later), FLIM (1.13.1 or later), and APEL (10.0 or
later).
+Thu Apr 20 01:39:25 2000 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Pterodactyl Gnus v5.8.4 is released.
+
+2000-04-19 Dave Love <fx@gnu.org>
+
+ * mailcap.el (mailcap-parse-mimetypes): Add ...mime.types.
+
+2000-04-18 12:28:24 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnwarchive.el (nnwarchive-type-definition): New egroups html.
+ (nnwarchive-egroups-*): Ditto.
+ (nnwarchive-url): Unibyte buffer and single line cookie.
+
+2000-04-14 18:50:04 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-util.el (mm-char-or-char-int-p): New alias.
+ * nnweb.el (nnweb-decode-entities): Check the validity of numeric
+ entities.
+
+2000-04-10 Daiki Ueno <ueno@unixuser.org>
+
+ * lisp/imap.el (imap-body-lines): Check Content-Type: of the
+ article case insensitively.
+
+2000-04-10 20:35:46 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mail-source.el (mail-source-fetch-webmail): Use the default
+ password provided in mail-sources; use webmail:subtype:user as
+ the key.
+
+2000-04-10 20:35:46 John Wiegley <johnw@gnu.org>
+
+ * mail-source.el (mail-source-fetch-webmail): Use
+ mail-source-password-cache.
+
+2000-04-09 18:13:47 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * webmail.el: Add netscape mail and fix HotMail mail.
+
+2000-04-08 Simon Josefsson <jas@pdc.kth.se>
+
+ * imap.el (imap-kerberos4-open): Work with recent `imtest's.
+
+2000-04-02 Simon Josefsson <jas@pdc.kth.se>
+
+ * nnimap.el (nnimap-request-article): Use BODY.PEEK[] instead of
+ RFC822.PEEK if server support IMAP4rev1.
+ (nnimap-request-body): Use BODY.PEEK[TEXT] instead of
+ RFC822.TEXT.PEEK if server support IMAP4rev1.
+ (nnimap-request-head): Use BODY.PEEK[HEADER] instead of
+ RFC822.HEADER if server support IMAP4rev1.
+ (nnimap-request-article-part): Support bodydetail in response
+ data.
+
+2000-03-11 Simon Josefsson <jas@pdc.kth.se>
+
+ * fill-flowed.el: New file.
+
+ * mm-decode.el (mm-dissect-singlepart): Create a MIME handle for
+ text/plain parts with `format' parameters.
+
+ * mm-view.el (autoload): Autoload fill-flowed.
+ (mm-inline-text): For "plain" parts with a format=flowed
+ parameter, call `fill-flowed'.
+
+2000-03-21 10:32:44 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnslashdot.el (nnslashdot-request-list): Fudge new-style
+ slashdot ids.
+
+2000-03-20 00:12:42 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnslashdot.el (nnslashdot-request-list): Use the new slashdot
+ format.
+
+2000-03-16 Simon Josefsson <jas@pdc.kth.se>
+
+ * imap.el: GSSAPI support, support kerberos 4 with Cyrus v1.6.x
+ `imtest' too.
+ (imap-kerberos4-program): Renamed from `imap-imtest-program'.
+ (imap-gssapi-program): New variable.
+ (imap-streams): Add gssapi.
+ (imap-stream-alist): Ditto.
+ (imap-authenticators): Ditto.
+ (imap-authenticator-alist): Ditto.
+ (imap-kerberos4-stream-p): Rename from `imap-kerberos4s-p'.
+ (imap-kerberos4-open): Loop over imtest programs, support Cyrus
+ 1.6.x `imtest' syntax.
+ (imap-gssapi-stream-p): New function.
+ (imap-gssapi-open): Ditto.
+ (imap-gssapi-auth-p): Ditto.
+ (imap-gssapi-auth): Ditto.
+ (imap-kerberos4-auth-p): Renamed from `imap-kerberos4a-p'.
+ (imap-send-command): Use buffer-local `imap-client-eol' value.
+
+ * nnimap.el (nnimap-retrieve-headers-progress): Fold continuation
+ lines and turn TAB into SPC before parsing.
+
+2000-03-15 Simon Josefsson <jas@pdc.kth.se>
+
+ * nnheader.el (nnheader-group-pathname): Make sure to return a
+ directory.
+ * nnmail.el (nnmail-group-pathname): Ditto.
+
+2000-02-08 Per Abrahamsen <abraham@dina.kvl.dk>
+
+ * nnmail.el (nnmail-fix-eudora-headers): Fix `In-Reply-To' too, it
+ might split in the middle of a message-id.
+
+2000-03-13 13:51:38 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-srvr.el (gnus-server-kill-server): Offer to kill all the
+ groups from the server.
+
+ * gnus-sum.el (gnus-summary-save-parts): Fix interactive spec.
+ (gnus-summary-toggle-header): Update the wash status.
+
+ * gnus-uu.el ((gnus-uu-extract-map "X" gnus-summary-mode-map)):
+ Moved here.
+
+ * gnus-agent.el (gnus-agent-save-group-info): Respect old
+ setting.
+
+ * nnmail.el (nnmail-get-active): Use it.
+ (nnmail-parse-active): New function.
+
+ * mm-view.el (mm-inline-text): Support the new version of
+ vcard.el.
+
+ * gnus-sum.el (gnus-summary-move-article): Only delete article
+ when moving junk.
+ (gnus-deaden-summary): Bury the buffer.
+
+ * nnmail.el (nnmail-group-pathname): Ditto.
+
+ * nnheader.el (nnheader-group-pathname): Use expand-file-name.
+
+2000-03-13 20:23:06 Christoph Rohland <hans-christoph.rohland@sap.com>
+
+ * rfc2047.el (rfc2047-encode-message-header): Encode no matter
+ whether Mule.
+
+2000-03-10 14:57:58 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * message.el (message-send-mail): Protect against unloaded Gnus.
+
+ * gnus-topic.el (gnus-topic-update-topic-line): Don't update the
+ parent.
+ (gnus-topic-update-topic-line): Yes, do.
+ (gnus-topic-goto-missing-group): Tally the correct number of
+ unread articles before inserting the topic line.
+
+2000-03-01 09:55:26 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnultimate.el (nnultimate-retrieve-headers): Ignore errors.
+
+2000-02-13 13:53:08 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mm-decode.el (mm-dissect-buffer): Ditto.
+
+ * gnus-art.el (article-decode-charset): Strip CTE.
+
+ * ietf-drums.el (ietf-drums-strip): New function.
+
+ * gnus-sum.el (gnus-summary-move-article): Don't use the prefix
+ when prompting in read-only groups.
+
+2000-02-23 Simon Josefsson <jas@pdc.kth.se>
+
+ * imap.el (imap-send-command): Change EOL-chars when
+ `imap-client-eol' differs from default, not only for kerberos4.
+ (imap-mailbox-status): Get encoded mailbox's status.
+
+2000-02-19 Simon Josefsson <jas@pdc.kth.se>
+
+ * mail-source.el (mail-source-fetch-imap): Copy `imap-password'
+ into `mail-source-password-cache'.
+
+2000-02-17 Florian Weimer <fw@deneb.cygnus.argh.org>
+
+ * mm-util.el (mm-mime-charset): Check for presence of
+ `coding-system-get' and `get-charset-property' (recent XEmacs has
+ the former, but not the latter).
+
+2000-01-28 Dave Love <fx@gnu.org>
+
+ * message.el (message-check-news-header-syntax): Fix typo
+ `newsgroyps'.
+ (message-talkative-question): Put temp buffer in fundamental-mode.
+ (message-recover): Use fundamental-mode in the right buffer.
+
+ * nnmail.el (nnmail-split-history): Use fundamental-mode in the
+ right buffer.
+
+2000-01-26 12:01:18 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * qp.el (quoted-printable-decode-region): Add charset parameter.
+ (quoted-printable-decode-string): Ditto.
+
+ * gnus-art.el (article-de-quoted-unreadable): Use it.
+
+2000-01-21 Simon Josefsson <jas@pdc.kth.se>
+
+ * nnimap.el (nnimap-split-predicate): New variable.
+ (nnimap-split-articles): Use it.
+
+2000-01-20 Simon Josefsson <jas@pdc.kth.se>
+
+ * utf7.el: Change email address.
+
+2000-01-18 22:03:51 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-group.el (gnus-group-catchup): Purge split history.
+
+2000-01-14 02:43:55 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnmail.el (nnmail-generate-active): Support extended group name.
+ (nnmail-get-active): Ditto.
+
+2000-01-13 15:16:10 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-agent.el (gnus-agent-write-active): Since no prefix in
+ group names, don't remove anything.
+
+2000-01-13 15:10:53 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * webmail.el (webmail-my-deja-open): My-deja changes.
+
+2000-01-13 Simon Josefsson <jas@pdc.kth.se>
+
+ * nnimap.el (nnimap-retrieve-headers-progress): Create xref field.
+
+2000-01-10 23:35:33 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-agent.el (gnus-agent-fetch-headers): Translate full path.
+
+2000-01-09 22:52:35 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus.el (gnus-other-frame): Fix typo.
+
+1999-06-25 Andreas Jaeger <aj@arthur.rhein-neckar.de>
+
+ * gnus-cus.el (gnus-group-customize): Fix typo.
+
+2000-01-08 08:36:13 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnweb.el (nnweb-insert): Simplified.
+
+2000-01-06 18:32:53 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-art.el (gnus-article-mode-map): "e" is
+ gnus-summary-edit-article.
+
+2000-01-06 18:25:37 Jari Aalto <jari.aalto@poboxes.com>
+
+ * mailcap.el (mailcap-mime-extensions): Add .diff.
+
+2000-01-06 00:06:40 Kim-Minh Kaplan <kmkaplan@vocatex.fr>
+
+ * mm-decode.el (mm-mailcap-command): handle "%%" and the case where
+ there is no "%s" in the method.
+
+2000-01-08 21:01:04 Kim-Minh Kaplan <kmkaplan@vocatex.fr>
+
+ * gnus-sum.el (gnus-summary-select-article): Return 'old.
+
+2000-01-06 13:41:11 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnfolder.el (nnfolder-read-folder): Use nnfolder-save-buffer.
+
+ * gnus.el: Really always pop up a new frame.
+
+ * parse-time.el (parse-time-rules): Allow 100-110 to be
+ 2000-2010.
+
+ * time-date.el (date-to-time): Don't use timezone.
+
+2000-01-06 Dave Love <fx@gnu.org>
+
+ * time-date.el: Add keywords.
+ (date-to-time): Add autoload cookie. Canonicalize with
+ timezone-make-date-arpa-standard.
+ (time-to-seconds): Avoid caddr.
+ (safe-date-to-time): Add autoload cookie.
+
+ * base64.el: Require cl when compiling.
+
2000-01-05 17:31:52 Lars Magne Ingebrigtsen <larsi@gnus.org>
* gnus-sum.el (gnus-summary-select-article): Return whether we
(mel-find-function 'mime-encode-region "base64"))
(static-when nil
+(eval-when-compile (require 'cl))
+
;; For non-MULE
(if (not (fboundp 'char-int))
(fset 'char-int 'identity))
(set (intern (symbol-name sym) orig) (symbol-value sym)))))
new))
(gnus-make-directory (file-name-directory file))
+ ;; The hashtable contains real names of groups, no more prefix
+ ;; removing, so set `full' to `t'.
(gnus-write-active-file-as-coding-system gnus-agent-file-coding-system
- file orig)))
+ file orig t)))
(defun gnus-agent-save-groups (method)
(gnus-agent-save-active-1 method 'gnus-groups-to-gnus-format))
(defun gnus-agent-save-group-info (method group active)
(when (gnus-agent-method-p method)
(let* ((gnus-command-method method)
- (file (gnus-agent-lib-file "active")))
+ (file (gnus-agent-lib-file "active"))
+ oactive)
(gnus-make-directory (file-name-directory file))
(with-temp-file file
(when (file-exists-p file)
(goto-char (point-min))
(when (re-search-forward
(concat "^" (regexp-quote group) " ") nil t)
+ (save-excursion
+ (save-restriction
+ (narrow-to-region (match-beginning 0)
+ (progn
+ (forward-line 1)
+ (point)))
+ (setq oactive (car (nnmail-parse-active)))))
(gnus-delete-line))
- (insert (format "%S %d %d y\n" (intern group) (cdr active)
- (car active)))
+ (insert (format "%S %d %d y\n" (intern group)
+ (cdr active)
+ (or (car oactive) (car active))))
(goto-char (point-max))
(while (search-backward "\\." nil t)
(delete-char 1))))))
(cdr (gnus-active group)))))))
;; Fetch them.
(gnus-make-directory (nnheader-translate-file-chars
- (file-name-directory file)))
+ (file-name-directory file) t))
(when articles
(gnus-message 7 "Fetching headers for %s..." group)
(save-excursion
(mm-read-coding-system "Charset to decode: "))
(ctl
(mail-content-type-get ctl 'charset))))
+ (when cte
+ (setq cte (mail-header-strip cte)))
(if (and ctl (not (string-match "/" (car ctl))))
(setq ctl nil))
(goto-char (point-max)))
(when (or force
(and type (string-match "quoted-printable" (downcase type))))
(article-goto-body)
- (save-restriction
- (narrow-to-region (point) (point-max))
- (quoted-printable-decode-region (point-min) (point-max))
- (when charset
- (mm-decode-body charset)))))))
+ (quoted-printable-decode-region (point) (point-max) charset)))))
(eval-when-compile
(require 'rfc1843))
"s" gnus-article-show-summary
"\C-c\C-m" gnus-article-mail
"?" gnus-article-describe-briefly
- "e" gnus-summary-article-edit
+ "e" gnus-summary-edit-article
"<" beginning-of-buffer
">" end-of-buffer
"\C-c\C-i" gnus-info-find-node
:tag "Parameters"
:format "%t:\n%h%v"
:doc "\
-These special paramerters are recognized by Gnus.
+These special parameters are recognized by Gnus.
Check the [ ] for the parameters you want to apply to this group or
to the groups in this topic, then edit the value to suit your taste."
,@types)
or nil if no action could be taken."
(let* ((entry (gnus-gethash group gnus-newsrc-hashtb))
(num (car entry)))
+ ;; Remove entries for this group.
+ (nnmail-purge-split-history (gnus-group-real-name group))
;; Do the updating only if the newsgroup isn't killed.
(if (not (numberp (car entry)))
(gnus-message 1 "Can't catch up %s; non-active group" group)
(".cpio" . "application/x-cpio")
(".csh" . "application/x-csh")
(".dvi" . "application/x-dvi")
+ (".diff" . "text/x-patch")
(".el" . "application/emacs-lisp")
(".eps" . "application/postscript")
(".etx" . "text/x-setext")
((memq system-type '(ms-dos ms-windows windows-nt))
(setq path (mapconcat 'expand-file-name
'("~/mime.typ" "~/etc/mime.typ") ";")))
- (t (setq path (mapconcat 'expand-file-name
- '("~/.mime-types"
- "/etc/mime-types:/usr/etc/mime-types"
- "/usr/local/etc/mime-types"
- "/usr/local/www/conf/mime-types") ":"))))
+ (t (setq path (mapconcat
+ 'expand-file-name
+ ;; mime.types seems to be the normal name,
+ ;; definitely so on current GNUish systems. The
+ ;; ordering follows that for mailcap.
+ '("~/.mime.types"
+ "/etc/mime.types"
+ "/usr/etc/mime.types"
+ "/usr/local/etc/mime.types"
+ "/usr/local/www/conf/mime.types"
+ "~/.mime-types"
+ "/etc/mime-types"
+ "/usr/etc/mime-types"
+ "/usr/local/etc/mime-types"
+ "/usr/local/www/conf/mime-types") ":"))))
(let ((fnames (reverse
(split-string path
(if (memq system-type
(push (assoc server gnus-server-alist) gnus-server-killed-servers)
(setq gnus-server-alist (delq (car gnus-server-killed-servers)
gnus-server-alist))
+ (let ((groups (gnus-groups-from-server server)))
+ (when (and groups
+ (gnus-yes-or-no-p
+ (format "Kill all %s groups from this server? "
+ (length groups))))
+ (dolist (group groups)
+ (setq gnus-newsrc-alist
+ (delq (assoc group gnus-newsrc-alist)
+ gnus-newsrc-alist))
+ (when gnus-group-change-level-function
+ (funcall gnus-group-change-level-function
+ group gnus-level-killed 3)))))
(gnus-server-position-point))
(defun gnus-server-yank-server ()
(gnus-group-prefixed-name "" method))))
;; Let the Gnus agent save the active file.
- (if (and gnus-agent real-active gnus-plugged (gnus-agent-method-p method))
+ (if (and gnus-agent
+ real-active
+ gnus-plugged
+ (gnus-agent-method-p method))
(progn
(gnus-agent-save-groups method)
(gnus-active-to-gnus-format method hashtb nil real-active))
:type 'hook)
(defcustom gnus-exit-group-hook nil
- "*A hook called when exiting (not quitting) summary mode."
+ "*A hook called when exiting summary mode.
+This hook is not called from the non-updating exit commands like `Q'."
:group 'gnus-various
:type 'hook)
(rename-buffer
(concat (substring name 0 (match-beginning 0)) "Dead "
(substring name (match-beginning 0)))
- t))))
+ t)
+ (bury-buffer))))
(defun gnus-kill-or-deaden-summary (buffer)
"Kill or deaden the summary BUFFER."
(set-buffer gnus-summary-buffer))
(let ((article (or article (gnus-summary-article-number)))
(all-headers (not (not all-headers))) ;Must be T or NIL.
- gnus-summary-display-article-function
- did)
+ gnus-summary-display-article-function)
(and (not pseudo)
(gnus-summary-article-pseudo-p article)
(error "This is a pseudo-article"))
- (prog1
- (save-excursion
- (set-buffer gnus-summary-buffer)
- (if (or (and gnus-single-article-buffer
- (or (null gnus-current-article)
- (null gnus-article-current)
- (null (get-buffer gnus-article-buffer))
- (not (eq article (cdr gnus-article-current)))
- (not (equal (car gnus-article-current)
- gnus-newsgroup-name))))
- (and (not gnus-single-article-buffer)
- (or (null gnus-current-article)
- (not (eq gnus-current-article article))))
- force)
- ;; The requested article is different from the current article.
- (prog1
- (gnus-summary-display-article article all-headers)
- (setq did article)
- (when (or all-headers gnus-show-all-headers)
- (if (eq 'gnus-summary-toggle-mime this-command)
- (gnus-article-show-all)
- (gnus-article-show-all-headers))))
+ (save-excursion
+ (set-buffer gnus-summary-buffer)
+ (if (or (and gnus-single-article-buffer
+ (or (null gnus-current-article)
+ (null gnus-article-current)
+ (null (get-buffer gnus-article-buffer))
+ (not (eq article (cdr gnus-article-current)))
+ (not (equal (car gnus-article-current)
+ gnus-newsgroup-name))))
+ (and (not gnus-single-article-buffer)
+ (or (null gnus-current-article)
+ (not (eq gnus-current-article article))))
+ force)
+ ;; The requested article is different from the current article.
+ (progn
+ (gnus-summary-display-article article all-headers)
(when (or all-headers gnus-show-all-headers)
(gnus-article-show-all-headers))
- 'old))
- (when did
- (gnus-article-set-window-start
- (cdr (assq article gnus-newsgroup-bookmarks)))))))
+ (gnus-article-set-window-start
+ (cdr (assq article gnus-newsgroup-bookmarks)))
+ article)
+ (when (or all-headers gnus-show-all-headers)
+ (gnus-article-show-all-headers))
+ 'old))))
(defun gnus-summary-set-current-mark (&optional current-mark)
"Obsolete function."
(if hidden
(let ((gnus-treat-hide-headers nil)
(gnus-treat-hide-boring-headers nil))
+ (setq gnus-article-wash-types
+ (delq 'headers gnus-article-wash-types))
(gnus-treat-article 'head))
- (gnus-treat-article 'head)))))))
+ (gnus-treat-article 'head)))
+ (gnus-set-mode-line 'article)))))
(defun gnus-summary-show-all-headers ()
"Make all header lines visible."
'request-replace-article gnus-newsgroup-name)))
(error "The current group does not support article editing")))
(let ((articles (gnus-summary-work-articles n))
- (prefix (gnus-group-real-prefix gnus-newsgroup-name))
+ (prefix (if (gnus-check-backend-function
+ 'request-move-article gnus-newsgroup-name)
+ (gnus-group-real-prefix gnus-newsgroup-name)
+ ""))
(names '((move "Move" "Moving")
(copy "Copy" "Copying")
(crosspost "Crosspost" "Crossposting")))
(gnus-message 1 "Couldn't %s article %s: %s"
(cadr (assq action names)) article
(nnheader-get-report (car to-method))))
- ((and (eq art-group 'junk)
- (eq action 'move))
- (gnus-summary-mark-article article gnus-canceled-mark)
- (gnus-message 4 "Deleted article %s" article))
+ ((eq art-group 'junk)
+ (when (eq action 'move)
+ (gnus-summary-mark-article article gnus-canceled-mark)
+ (gnus-message 4 "Deleted article %s" article)))
(t
(let* ((pto-group (gnus-group-prefixed-name
(car art-group) to-method))
(error "No such group: %s" to-newsgroup)))
to-newsgroup))
-(defun gnus-summary-save-parts (type dir n reverse)
+(defun gnus-summary-save-parts (type dir n &optional reverse)
"Save parts matching TYPE to DIR.
If REVERSE, save parts that do not match TYPE."
(interactive
(list (read-string "Save parts of type: " "image/.*")
- (read-file-name "Save to directory: " t nil t)
+ (read-file-name "Save to directory: " nil nil t)
current-prefix-arg))
(gnus-summary-iterate n
(let ((gnus-display-mime-function nil)
(let* ((topic (gnus-group-topic group))
(groups (cdr (assoc topic gnus-topic-alist)))
(g (cdr (member group groups)))
- (unfound t))
+ (unfound t)
+ entry)
;; Try to jump to a visible group.
(while (and g (not (gnus-group-goto-group (car g) t)))
(pop g))
(when (and unfound
topic
(not (gnus-topic-goto-missing-topic topic)))
- (gnus-topic-insert-topic-line
- topic t t (car (gnus-topic-find-topology topic)) nil 0)))))
+ (let* ((top (gnus-topic-find-topology topic))
+ (children (cddr top))
+ (type (cadr top))
+ (unread 0)
+ (entries (gnus-topic-find-groups
+ (car type) (car gnus-group-list-mode)
+ (cdr gnus-group-list-mode))))
+ (while children
+ (incf unread (gnus-topic-unread (caar (pop children)))))
+ (while (setq entry (pop entries))
+ (when (numberp (car entry))
+ (incf unread (car entry))))
+ (gnus-topic-insert-topic-line
+ topic t t (car (gnus-topic-find-topology topic)) nil unread))))))
(defun gnus-topic-goto-missing-topic (topic)
(if (gnus-topic-goto-topic topic)
"k" gnus-summary-kill-process-mark
"y" gnus-summary-yank-process-mark
"w" gnus-summary-save-process-mark
- "i" gnus-uu-invert-processable
- "m" gnus-summary-save-parts)
+ "i" gnus-uu-invert-processable)
(gnus-define-keys (gnus-uu-extract-map "X" gnus-summary-mode-map)
;;"x" gnus-uu-extract-any
- ;;"m" gnus-uu-extract-mime
+ "m" gnus-summary-save-parts
"u" gnus-uu-decode-uu
"U" gnus-uu-decode-uu-and-save
"s" gnus-uu-decode-unshar
(require 'product)
(provide 'gnus-vers)
-(defconst gnus-revision-number "18"
+(defconst gnus-revision-number "00"
"Revision number for this version of gnus.")
;; Product information of this gnus.
(product-provide 'gnus-vers
(product-define "T-gnus" nil
- (list 6 14 1
+ (list 6 14 2
(string-to-number gnus-revision-number))))
-(defconst gnus-original-version-number "5.8.3"
+(defconst gnus-original-version-number "5.8.4"
"Version number for this version of Gnus.")
(provide 'running-pterodactyl-gnus-0_73-or-later)
(gnus-delete-windows-in-gnusey-frames))
;; Just remove some windows.
(gnus-remove-some-windows)
- (set-buffer nntp-server-buffer))
+ (set-buffer nntp-server-buffer))
(select-frame frame)))
(let (gnus-window-frame-focus)
- (set-buffer nntp-server-buffer)
- (gnus-configure-frame split)
+ (set-buffer nntp-server-buffer)
+ (gnus-configure-frame split)
(when gnus-window-frame-focus
(select-frame (window-frame gnus-window-frame-focus))))))))
;;; gnus.el --- a newsreader for GNU Emacs
-;; Copyright (C) 1987-1990,1993-1999 Free Software Foundation, Inc.
+;; Copyright (C) 1987, 88, 89, 90, 93, 94, 95, 96, 97, 98, 99
+;; Free Software Foundation, Inc.
;; Author: Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
;; Lars Magne Ingebrigtsen <larsi@gnus.org>
(eval-when-compile (require 'cl))
(eval-when-compile (require 'static))
-(require 'custom)
(require 'gnus-vers)
-(eval-and-compile
- (if (< emacs-major-version 20)
- (require 'gnus-load)))
(require 'message)
(defgroup gnus nil
(when (consp function)
(setq keymap (car (memq 'keymap function)))
(setq function (car function)))
- (autoload function (car package) nil interactive keymap)))
+ (unless (fboundp function)
+ (autoload function (car package) nil interactive keymap))))
(if (eq (nth 1 package) ':interactive)
- (cdddr package)
+ (nthcdr 3 package)
(cdr package)))))
- '(("info" Info-goto-node)
+ '(("info" :interactive t Info-goto-node)
("pp" pp pp-to-string pp-eval-expression)
("ps-print" ps-print-preprint)
- ("mail-extr" mail-extract-address-components)
- ("browse-url" browse-url)
+ ("browse-url" :interactive t browse-url)
("message" :interactive t
message-send-and-exit message-yank-original)
("babel" babel-as-string)
(buffer-string))))
(defun ietf-drums-remove-whitespace (string)
- "Remove comments from STRING."
+ "Remove whitespace from STRING."
(with-temp-buffer
(ietf-drums-init string)
(let (c)
(forward-char 1))))
result)))
+(defun ietf-drums-strip (string)
+ "Remove comments and whitespace from STRING."
+ (ietf-drums-remove-whitespace (ietf-drums-remove-comments string)))
+
(defun ietf-drums-parse-address (string)
"Parse STRING and return a MAILBOX / DISPLAY-NAME pair."
(with-temp-buffer
;;
;; imap.el support RFC1730/2060 (IMAP4/IMAP4rev1), implemented IMAP
;; extensions are RFC2195 (CRAM-MD5), RFC2086 (ACL), RFC2342
-;; (NAMESPACE), RFC2359 (UIDPLUS), and the kerberos V4 part of RFC1731
-;; (with use of external program `imtest'). It also take advantage
-;; the UNSELECT extension in Cyrus IMAPD.
+;; (NAMESPACE), RFC2359 (UIDPLUS), the IMAP-part of RFC2595 (STARTTLS)
+;; (with use of external library starttls.el and program starttls) and
+;; the GSSAPI / kerberos V4 sections of RFC1731 (with use of external
+;; program `imtest'). It also take advantage the UNSELECT extension
+;; in Cyrus IMAPD.
;;
;; Without the work of John McClary Prevost and Jim Radford this library
;; would not have seen the light of day. Many thanks.
;; o Don't use `read' at all (important places already fixed)
;; o Accept list of articles instead of message set string in most
;; imap-message-* functions.
-;; o Cyrus IMAPd 1.6.x `imtest' support in the imtest wrapper
;;
;; Revision history:
;;
(eval-when-compile (require 'cl))
(eval-when-compile (require 'static))
-(eval-when-compile
+(eval-when-compile
(ignore-errors (require 'digest-md5)))
(eval-and-compile
(autoload 'digest-md5-digest-uri "digest-md5")
(autoload 'digest-md5-challenge "digest-md5")
(autoload 'rfc2104-hash "rfc2104")
+ (autoload 'md5 "md5")
(autoload 'utf7-encode "utf7")
(autoload 'utf7-decode "utf7")
(autoload 'format-spec "format-spec")
(autoload 'format-spec-make "format-spec"))
-(autoload 'md5 "md5")
-
;; User variables.
-(defvar imap-imtest-program "imtest -kp %s %p"
- "How to call program for Kerberos 4 authentication.
-%s is replaced with server and %p with port to connect to. The
-program should accept IMAP commands on stdin and return responses to
-stdout.")
+(defvar imap-kerberos4-program '("imtest -m kerberos_v4 -u %l -p %p %s"
+ "imtest -kp %s %p")
+ "List of strings containing commands for Kerberos 4 authentication.
+%s is replaced with server hostname, %p with port to connect to, and
+%l with the value of `imap-default-user'. The program should accept
+IMAP commands on stdin and return responses to stdout.")
+
+(defvar imap-gssapi-program '("imtest -m gssapi -u %l -p %p %s")
+ "List of strings containing commands for GSSAPI (krb5) authentication.
+%s is replaced with server hostname, %p with port to connect to, and
+%l with the value of `imap-default-user'. The program should accept
+IMAP commands on stdin and return responses to stdout.")
(defvar imap-ssl-program '("openssl s_client -ssl3 -connect %s:%p"
"openssl s_client -ssl2 -connect %s:%p"
(defvar imap-fetch-data-hook nil
"Hooks called after receiving each FETCH response.")
-(defvar imap-streams '(kerberos4 starttls ssl network)
+(defvar imap-streams '(gssapi kerberos4 starttls ssl network)
"Priority of streams to consider when opening connection to server.")
(defvar imap-stream-alist
- '((kerberos4 imap-kerberos4s-p imap-kerberos4-open)
- (ssl imap-ssl-p imap-ssl-open)
- (network imap-network-p imap-network-open)
- (starttls imap-starttls-p imap-starttls-open))
+ '((gssapi imap-gssapi-stream-p imap-gssapi-open)
+ (kerberos4 imap-kerberos4-stream-p imap-kerberos4-open)
+ (ssl imap-ssl-p imap-ssl-open)
+ (network imap-network-p imap-network-open)
+ (starttls imap-starttls-p imap-starttls-open))
"Definition of network streams.
-(NAME CHECK OPEN)
+\(NAME CHECK OPEN)
NAME names the stream, CHECK is a function returning non-nil if the
server support the stream and OPEN is a function for opening the
stream.")
-(defvar imap-authenticators '(kerberos4 digest-md5 cram-md5 login anonymous)
+(defvar imap-authenticators '(gssapi
+ kerberos4
+ digest-md5
+ cram-md5
+ login
+ anonymous)
"Priority of authenticators to consider when authenticating to server.")
-(defvar imap-authenticator-alist
- '((kerberos4 imap-kerberos4a-p imap-kerberos4-auth)
- (cram-md5 imap-cram-md5-p imap-cram-md5-auth)
- (login imap-login-p imap-login-auth)
- (anonymous imap-anonymous-p imap-anonymous-auth)
- (digest-md5 imap-digest-md5-p imap-digest-md5-auth))
+(defvar imap-authenticator-alist
+ '((gssapi imap-gssapi-auth-p imap-gssapia-auth)
+ (kerberos4 imap-kerberos4-auth-p imap-kerberos4-auth)
+ (cram-md5 imap-cram-md5-p imap-cram-md5-auth)
+ (login imap-login-p imap-login-auth)
+ (anonymous imap-anonymous-p imap-anonymous-auth)
+ (digest-md5 imap-digest-md5-p imap-digest-md5-auth))
"Definition of authenticators.
-(NAME CHECK AUTHENTICATE)
+\(NAME CHECK AUTHENTICATE)
NAME names the authenticator. CHECK is a function returning non-nil if
the server support the authenticator and AUTHENTICATE is a function
\f
;; Server functions; stream stuff:
-(defun imap-kerberos4s-p (buffer)
+(defun imap-kerberos4-stream-p (buffer)
(imap-capability 'AUTH=KERBEROS_V4 buffer))
(defun imap-kerberos4-open (name buffer server port)
- (message "Opening Kerberized IMAP connection...")
- (let* ((port (or port imap-default-port))
- (process (as-binary-process
- (start-process
- name buffer shell-file-name shell-command-switch
- (format-spec
- imap-imtest-program
- (format-spec-make ?s server ?p (number-to-string port))
- )))))
- (when process
- (with-current-buffer buffer
- (setq imap-client-eol "\n")
- ;; Result of authentication is a string: __Full privacy protection__
- (while (and (memq (process-status process) '(open run))
- (goto-char (point-min))
- (not (and (imap-parse-greeting)
- (re-search-forward "__\\(.*\\)__\n" nil t))))
- (accept-process-output process 1)
- (sit-for 1))
- (and imap-log
- (with-current-buffer (get-buffer-create imap-log)
- (buffer-disable-undo)
- (goto-char (point-max))
- (insert-buffer-substring buffer)))
- (let ((response (match-string 1)))
- (erase-buffer)
- (message "Kerberized IMAP connection: %s" response)
- (if (and response (let ((case-fold-search nil))
- (not (string-match "failed" response))))
- process
- (if (memq (process-status process) '(open run))
- (imap-send-command-wait "LOGOUT"))
- (delete-process process)
- nil))))))
+ (let ((cmds imap-kerberos4-program)
+ cmd done)
+ (while (and (not done) (setq cmd (pop cmds)))
+ (message "Opening Kerberos 4 IMAP connection with `%s'..." cmd)
+ (let* ((port (or port imap-default-port))
+ (process (as-binary-process
+ (start-process
+ name buffer shell-file-name shell-command-switch
+ (format-spec
+ cmd
+ (format-spec-make
+ ?s server
+ ?p (number-to-string port)
+ ?l imap-default-user)))))
+ response)
+ (when process
+ (with-current-buffer buffer
+ (setq imap-client-eol "\n")
+ (while (and (memq (process-status process) '(open run))
+ (goto-char (point-min))
+ ;; cyrus 1.6.x (13? < x <= 22) queries capabilities
+ (or (while (looking-at "^C:")
+ (forward-line))
+ t)
+ ;; cyrus 1.6 imtest print "S: " before server greeting
+ (or (not (looking-at "S: "))
+ (forward-char 3)
+ t)
+ (not (and (imap-parse-greeting)
+ ;; success in imtest < 1.6:
+ (or (re-search-forward
+ "^__\\(.*\\)__\n" nil t)
+ ;; success in imtest 1.6:
+ (re-search-forward
+ "^\\(Authenticat.*\\)" nil t))
+ (setq response (match-string 1)))))
+ (accept-process-output process 1)
+ (sit-for 1))
+ (and imap-log
+ (with-current-buffer (get-buffer-create imap-log)
+ (buffer-disable-undo)
+ (goto-char (point-max))
+ (insert-buffer-substring buffer)))
+ (erase-buffer)
+ (message "Kerberos 4 IMAP connection: %s" (or response "failed"))
+ (if (and response (let ((case-fold-search nil))
+ (not (string-match "failed" response))))
+ (setq done process)
+ (if (memq (process-status process) '(open run))
+ (imap-send-command-wait "LOGOUT"))
+ (delete-process process)
+ nil)))))
+ done))
+(defun imap-gssapi-stream-p (buffer)
+ (imap-capability 'AUTH=GSSAPI buffer))
+
+(defun imap-gssapi-open (name buffer server port)
+ (let ((cmds imap-gssapi-program)
+ cmd done)
+ (while (and (not done) (setq cmd (pop cmds)))
+ (message "Opening GSSAPI IMAP connection with `%s'..." cmd)
+ (let* ((port (or port imap-default-port))
+ (process (as-binary-process
+ (start-process
+ name buffer shell-file-name shell-command-switch
+ (format-spec
+ cmd
+ (format-spec-make
+ ?s server
+ ?p (number-to-string port)
+ ?l imap-default-user)))))
+ response)
+ (when process
+ (with-current-buffer buffer
+ (setq imap-client-eol "\n")
+ (while (and (memq (process-status process) '(open run))
+ (goto-char (point-min))
+ ;; cyrus 1.6 imtest print "S: " before server greeting
+ (or (not (looking-at "S: "))
+ (forward-char 3)
+ t)
+ (not (and (imap-parse-greeting)
+ ;; success in imtest 1.6:
+ (re-search-forward
+ "^\\(Authenticat.*\\)" nil t)
+ (setq response (match-string 1)))))
+ (accept-process-output process 1)
+ (sit-for 1))
+ (and imap-log
+ (with-current-buffer (get-buffer-create imap-log)
+ (buffer-disable-undo)
+ (goto-char (point-max))
+ (insert-buffer-substring buffer)))
+ (erase-buffer)
+ (message "GSSAPI IMAP connection: %s" (or response "failed"))
+ (if (and response (let ((case-fold-search nil))
+ (not (string-match "failed" response))))
+ (setq done process)
+ (if (memq (process-status process) '(open run))
+ (imap-send-command-wait "LOGOUT"))
+ (delete-process process)
+ nil)))))
+ done))
+
(defun imap-ssl-p (buffer)
nil)
(set-process-filter imap-process nil)))
(when (memq (process-status process) '(open run))
process))))
-
+
;; Server functions; authenticator stuff:
(defun imap-interactive-login (buffer loginfunc)
;; passwd nil))))
ret)))
-(defun imap-kerberos4a-p (buffer)
+(defun imap-gssapi-auth-p (buffer)
+ (imap-capability 'AUTH=GSSAPI buffer))
+
+(defun imap-gssapi-auth (buffer)
+ (eq imap-stream 'gssapi))
+
+(defun imap-kerberos4-auth-p (buffer)
(imap-capability 'AUTH=KERBEROS_V4 buffer))
(defun imap-kerberos4-auth (buffer)
(let ((streams imap-streams))
(while (setq stream (pop streams))
(if (funcall (nth 1 (assq stream imap-stream-alist)) buffer)
- (setq stream-changed (not (eq (or imap-stream
+ (setq stream-changed (not (eq (or imap-stream
imap-default-stream)
stream))
imap-stream stream
(when (null imap-auth)
(let ((auths imap-authenticators))
(while (setq auth (pop auths))
- (if (funcall (nth 1 (assq auth imap-authenticator-alist))
+ (if (funcall (nth 1 (assq auth imap-authenticator-alist))
buffer)
(setq imap-auth auth
auths nil)))
(list items))))))
(if (listp items)
(mapcar (lambda (item)
- (imap-mailbox-get-1 item mailbox))
+ (imap-mailbox-get item mailbox))
items)
- (imap-mailbox-get-1 items mailbox)))))
+ (imap-mailbox-get items mailbox)))))
(defun imap-mailbox-acl-get (&optional mailbox buffer)
"Get ACL on mailbox from server in BUFFER."
"Return number of lines in article by looking at the mime bodystructure BODY."
(if (listp body)
(if (stringp (car body))
+ ;; upcase for bug in courier imap server
(cond ((and (string= (upcase (car body)) "TEXT")
(numberp (nth 7 body)))
(nth 7 body))
(if (not (eq (imap-wait-for-tag tag) 'INCOMPLETE))
(setq command nil);; abort command if no cont-req
(let ((process imap-process)
- (stream imap-stream))
+ (stream imap-stream)
+ (eol imap-client-eol))
(with-current-buffer cmd
- (when (eq stream 'kerberos4)
+ (when (not (equal eol "\r\n"))
;; XXX modifies buffer!
(goto-char (point-min))
(while (search-forward "\r\n" nil t)
- (replace-match "\n")))
+ (replace-match eol)))
(and imap-log
(with-current-buffer (get-buffer-create
imap-log)
rmail-update-summary url-retrieve
temp-directory babel-fetch babel-wash
find-coding-systems-for-charsets sc-cite-regexp
- make-symbolic-link))
+ vcard-pretty-print make-symbolic-link))
(maybe-bind '(global-face-data
mark-active transient-mark-mode mouse-selection-click-count
mouse-selection-click-count-buffer buffer-display-table
url-current-callback-func url-current-callback-data
url-be-asynchronous temporary-file-directory
babel-translations babel-history
- display-time-mail-function)))
+ display-time-mail-function imap-password
+ )))
(maybe-bind '(mail-mode-hook
enable-multibyte-characters browse-url-browser-function
adaptive-fill-first-line-regexp adaptive-fill-regexp
url-current-mime-headers help-echo-owns-message
w3-meta-content-type-charset-regexp
w3-meta-charset-content-type-regexp
- babel-translations babel-history display-time-mail-function))
+ babel-translations babel-history
+ display-time-mail-function imap-password))
(maybe-fbind '(color-instance-rgb-components
temp-directory
glyph-width annotation-glyph window-pixel-width glyph-height
rmail-summary-exists rmail-select-summary rmail-update-summary
url-generic-parse-url valid-image-instantiator-format-p
babel-fetch babel-wash sc-cite-regexp
+ vcard-pretty-print
coding-system-get find-coding-system
find-coding-systems-for-charsets find-coding-systems-region
font-lock-set-defaults function-max-args get-charset-property
(defalias 'mail-header-remove-comments 'ietf-drums-remove-comments)
(defalias 'mail-header-remove-whitespace 'ietf-drums-remove-whitespace)
+(defalias 'mail-header-strip 'ietf-drums-strip)
(defalias 'mail-header-get-comment 'ietf-drums-get-comment)
(defalias 'mail-header-parse-address 'ietf-drums-parse-address)
(defalias 'mail-header-parse-addresses 'ietf-drums-parse-addresses)
(defun mail-source-fetch-imap (source callback)
"Fetcher for imap sources."
(mail-source-bind (imap source)
- (let ((found 0)
+ (let ((from (format "%s:%s:%s" server user port))
+ (found 0)
(buf (get-buffer-create
(format " *imap source %s:%s:%s *" server user mailbox)))
(mail-source-string (format "imap:%s:%s" server mailbox))
remove)
(if (and (imap-open server port stream authentication buf)
- (imap-authenticate user password buf)
+ (imap-authenticate
+ user (or (cdr (assoc from mail-source-password-cache))
+ password) buf)
(imap-mailbox-select mailbox nil buf))
(let (str
(coding-system-for-write 'binary)
(output-coding-system 'binary))
(with-temp-file mail-source-crash-box
+ ;; remember password
+ (with-current-buffer buf
+ (when (or imap-password
+ (assoc from mail-source-password-cache))
+ (push (cons from imap-password) mail-source-password-cache)))
;; if predicate is nil, use all uids
(dolist (uid (imap-search (or predicate "1:*") buf))
(when (setq str (imap-fetch uid "RFC822.PEEK" 'RFC822 nil buf))
(imap-mailbox-close buf))
(imap-close buf))
(imap-close buf)
+ ;; We nix out the password in case the error
+ ;; was because of a wrong password being given.
+ (setq mail-source-password-cache
+ (delq (assoc from mail-source-password-cache)
+ mail-source-password-cache))
(error (imap-error-text buf)))
+ (kill-buffer buf)
found)))
(eval-and-compile
(when (eq authentication 'password)
(setq password
(or password
+ (cdr (assoc (format "webmail:%s:%s" subtype user)
+ mail-source-password-cache))
(mail-source-read-passwd
- (format "Password for %s at %s: " user subtype)))))
+ (format "Password for %s at %s: " user subtype))))
+ (when (and password
+ (not (assoc (format "webmail:%s:%s" subtype user)
+ mail-source-password-cache)))
+ (push (cons (format "webmail:%s:%s" subtype user) password)
+ mail-source-password-cache)))
(webmail-fetch mail-source-crash-box subtype user password)
(mail-source-callback callback (symbol-name subtype)))))
(require 'mailheader)
(require 'nnheader)
(require 'easymenu)
-(require 'custom)
(if (string-match "XEmacs\\|Lucid" emacs-version)
(require 'mail-abbrevs)
(require 'mailabbrev))
(defun message-send-mail-with-sendmail ()
"Send off the prepared buffer with sendmail."
(let ((errbuf (if message-interactive
- (message-generate-new-buffer-clone-locals " sendmail errors")
+ (message-generate-new-buffer-clone-locals
+ " sendmail errors")
0))
resend-to-addresses delimline)
(let ((case-fold-search t))
(defun message-check-news-header-syntax ()
(and
;; Check Newsgroups header.
- (message-check 'newsgroyps
+ (message-check 'newsgroups
(let ((group (message-fetch-field "newsgroups")))
(or
(and group
(cond ((save-window-excursion
(if (not (eq system-type 'vax-vms))
(with-output-to-temp-buffer "*Directory*"
+ (with-current-buffer standard-output
+ (fundamental-mode)) ; for Emacs 20.4+
(buffer-disable-undo standard-output)
(let ((default-directory "/"))
(call-process
(save-excursion
(with-output-to-temp-buffer " *MESSAGE information message*"
(set-buffer " *MESSAGE information message*")
+ (fundamental-mode) ; for Emacs 20.4+
(mapcar 'princ text)
(goto-char (point-min))))
(funcall ask question))
((eq encoding 'quoted-printable)
(quoted-printable-decode-region (point-min) (point-max)))
((eq encoding 'base64)
- (base64-decode-region (point-min)
- ;; Some mailers insert whitespace
- ;; junk at the end which
- ;; base64-decode-region dislikes.
- (save-excursion
- (goto-char (point-max))
- (skip-chars-backward "\n\t ")
- (delete-region (point) (point-max))
- (point))))
+ (base64-decode-region
+ (point-min)
+ ;; Some mailers insert whitespace
+ ;; junk at the end which
+ ;; base64-decode-region dislikes.
+ (save-excursion
+ (goto-char (point-max))
+ (skip-chars-backward "\n\t ")
+ (delete-region (point) (point-max))
+ (point))))
((memq encoding '(7bit 8bit binary))
;; Do nothing.
)
cd (mail-fetch-field "content-disposition")
description (mail-fetch-field "content-description")
id (mail-fetch-field "content-id"))))
+ (when cte
+ (setq cte (mail-header-strip cte)))
(if (or (not ctl)
(not (string-match "/" (car ctl))))
(mm-dissect-singlepart
(defun mm-dissect-singlepart (ctl cte &optional force cdl description id)
(when (or force
- (not (equal "text/plain" (car ctl))))
+ (if (equal "text/plain" (car ctl))
+ (assoc 'format ctl)
+ t))
(let ((res (mm-make-handle
(mm-copy-to-buffer) ctl cte nil cdl description nil id)))
(push (car res) mm-dissection-list)
(defun mm-mailcap-command (method file type-list)
(let ((ctl (cdr type-list))
(beg 0)
+ (uses-stdin t)
out sub total)
- (while (string-match "%{\\([^}]+\\)}\\|%s\\|%t" method beg)
+ (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 "%%")
+ (push "%" out))
((string= total "%s")
+ (setq uses-stdin nil)
(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)
+ (if uses-stdin
+ (progn
+ (push "<" out)
+ (push (mm-quote-arg file) out)))
(mapconcat 'identity (nreverse out) "")))
(defun mm-remove-parts (handles)
prompt (mapcar (lambda (s) (list (symbol-name (car s))))
mm-mime-mule-charset-alist)))))))
+(eval-and-compile
+ (defalias 'mm-char-or-char-int-p
+ (cond
+ ((fboundp 'char-or-char-int-p) 'char-or-char-int-p)
+ ((fboundp 'char-valid-p) 'char-valid-p)
+ (t 'identity))))
+
(defvar mm-coding-system-list nil)
(defun mm-get-coding-system-list ()
"Get the coding system list."
(defun mm-mime-charset (charset)
"Return the MIME charset corresponding to the MULE CHARSET."
- (if (fboundp 'coding-system-get)
+ (if (and (fboundp 'coding-system-get) (fboundp 'get-charset-property))
;; This exists in Emacs 20.
(or
(and (mm-preferred-coding-system charset)
(autoload 'gnus-article-prepare-display "gnus-art")
(autoload 'vcard-parse-string "vcard")
(autoload 'vcard-format-string "vcard")
+ (autoload 'fill-flowed "fill-flowed")
(autoload 'diff-mode "diff-mode"))
;; Avoid byte compile warning.
(mm-insert-inline
handle
(concat "\n-- \n"
- (vcard-format-string
- (vcard-parse-string (mm-get-part handle)
- 'vcard-standard-filter)))))
+ (if (fboundp 'vcard-pretty-print)
+ (vcard-pretty-print (mm-get-part handle))
+ (vcard-format-string
+ (vcard-parse-string (mm-get-part handle)
+ 'vcard-standard-filter))))))
(t
(setq text (mm-get-part handle))
(let ((b (point))
(charset (mail-content-type-get
(mm-handle-type handle) 'charset)))
(insert (mm-decode-string text charset))
+ (when (and (equal type "plain")
+ (equal (cdr (assoc 'format (mm-handle-type handle)))
+ "flowed"))
+ (save-restriction
+ (narrow-to-region b (point))
+ (goto-char b)
+ (fill-flowed)
+ (goto-char (point-max))))
(save-restriction
(narrow-to-region b (point))
(set-text-properties (point-min) (point-max) nil)
buffer
(push (list group buffer) nnfolder-buffer-alist)
(set-buffer-modified-p t)
- (save-buffer))
+ (nnfolder-save-buffer))
;; Parse the damn thing.
(save-excursion
(goto-char (point-min))
;;; nnheader.el --- header access macros for Semi-gnus and its backends
-;; Copyright (C) 1987-1990,1993-1999 Free Software Foundation, Inc.
+
+;; Copyright (C) 1987, 88, 89, 90, 93, 94, 95, 96, 97, 98, 99
+;; Free Software Foundation, Inc.
;; Author: Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
;; Lars Magne Ingebrigtsen <larsi@gnus.org>
(concat
(let ((dir (file-name-as-directory (expand-file-name dir))))
;; If this directory exists, we use it directly.
- (if (file-directory-p (concat dir group))
- (concat dir group "/")
- ;; If not, we translate dots into slashes.
- (concat dir
- (encode-coding-string
- (nnheader-replace-chars-in-string group ?. ?/)
- nnheader-pathname-coding-system)
- "/")))
+ (file-name-as-directory
+ (if (file-directory-p (concat dir group))
+ (expand-file-name group dir)
+ ;; If not, we translate dots into slashes.
+ (expand-file-name (encode-coding-string
+ (nnheader-replace-chars-in-string group ?. ?/)
+ nnheader-pathname-coding-system)
+ dir))))
(cond ((null file) "")
((numberp file) (int-to-string file))
(t file))))
be called with the headers narrowed and should return a group where it
thinks the article should be splitted to.")
+(defvar nnimap-split-predicate "UNSEEN UNDELETED"
+ "The predicate used to find articles to split.
+If you use another IMAP client to peek on articles but always would
+like nnimap to split them once it's started, you could change this to
+\"UNDELETED\". Other available predicates are available in
+RFC2060 section 6.4.4.")
+
(defvar nnimap-split-fancy nil
"Like `nnmail-split-fancy', which see.")
nnimap-progress-how-often)
nnimap-progress-chars)))
(with-current-buffer nntp-server-buffer
- (let (headers lines chars uid)
+ (let (headers lines chars uid mbx)
(with-current-buffer nnimap-server-buffer
(setq uid imap-current-message
+ mbx imap-current-mailbox
headers (if (imap-capability 'IMAP4rev1)
;; xxx don't just use car? alist doesn't contain
;; anything else now, but it might...
(nnheader-fold-continuation-lines)
(subst-char-in-region (point-min) (point-max) ?\t ? )
(nnheader-ms-strip-cr)
+ (nnheader-fold-continuation-lines)
+ (subst-char-in-region (point-min) (point-max) ?\t ? )
(let ((head (nnheader-parse-head 'naked)))
(mail-header-set-number head uid)
(mail-header-set-chars head chars)
(mail-header-set-lines head lines)
+ (mail-header-set-xref
+ head (format "%s %s:%d" (system-name) mbx uid))
head))))))
(defun nnimap-retrieve-which-headers (articles fetch-old)
;; remove nov's for articles which has expired on server
(goto-char (point-min))
(dolist (uid (gnus-set-difference articles uids))
- (when (re-search-forward (format "^%d\t" uid) nil t)
- (gnus-delete-line)))))
+ (when (re-search-forward (format "^%d\t" uid) nil t)
+ (gnus-delete-line)))))
;; nothing cached, fetch whole range from server
(nnimap-retrieve-headers-from-server
(cons low high) group server))
(nnheader-ms-strip-cr)
(funcall nnimap-callback-callback-function t)))
-(defun nnimap-request-article-part (article part prop
- &optional group server to-buffer)
+(defun nnimap-request-article-part (article part prop &optional
+ group server to-buffer detail)
(when (nnimap-possibly-change-group group server)
(let ((article (if (stringp article)
(car-safe (imap-search
(format "HEADER Message-Id %s" article)
nnimap-server-buffer))
- article))
- fetch-data)
+ article)))
(when article
(gnus-message 9 "nnimap: Fetching (part of) article %d..." article)
(if (not nnheader-callback-function)
(with-current-buffer (or to-buffer nntp-server-buffer)
(erase-buffer)
- (setq fetch-data (imap-fetch article part
- prop nil nnimap-server-buffer))
- (when fetch-data
- (if (eq prop 'BODYDETAIL)
- (insert (nth 2 (car fetch-data)))
- (insert fetch-data))
- (nnheader-ms-strip-cr)
- (gnus-message 9 "nnimap: Fetching (part of) article %d...done"
- article)
- (if (bobp)
- (nnheader-report 'nnimap "No such article: %s"
- (imap-error-text nnimap-server-buffer))
- (cons group article))))
+ (let ((data (imap-fetch article part prop nil
+ nnimap-server-buffer)))
+ (when data
+ (insert (nnimap-demule (if detail
+ (nth 2 (car data))
+ data)))
+ (nnheader-ms-strip-cr)
+ (gnus-message 9
+ "nnimap: Fetching (part of) article %d...done"
+ article)
+ (if (bobp)
+ (nnheader-report 'nnimap "No such article: %s"
+ (imap-error-text nnimap-server-buffer))
+ (cons group article)))))
(add-hook 'imap-fetch-data-hook 'nnimap-callback)
(setq nnimap-callback-callback-function nnheader-callback-function
nnimap-callback-buffer nntp-server-buffer)
(deffoo nnimap-request-article (article &optional group server to-buffer)
(if (imap-capability 'IMAP4rev1 nnimap-server-buffer)
(nnimap-request-article-part
- article "BODY.PEEK[]" 'BODYDETAIL group server to-buffer)
+ article "BODY.PEEK[]" 'BODYDETAIL group server to-buffer 'detail)
(nnimap-request-article-part
article "RFC822.PEEK" 'RFC822 group server to-buffer)))
(deffoo nnimap-request-head (article &optional group server to-buffer)
- (nnimap-request-article-part
- article "RFC822.HEADER" 'RFC822.HEADER group server to-buffer))
+ (if (imap-capability 'IMAP4rev1 nnimap-server-buffer)
+ (nnimap-request-article-part
+ article "BODY.PEEK[HEADER]" 'BODYDETAIL group server to-buffer 'detail)
+ (nnimap-request-article-part
+ article "RFC822.HEADER" 'RFC822.HEADER group server to-buffer)))
(deffoo nnimap-request-body (article &optional group server to-buffer)
(if (imap-capability 'IMAP4rev1 nnimap-server-buffer)
(nnimap-request-article-part
- article "BODY.PEEK[TEXT]" 'BODYDETAIL group server to-buffer)
+ article "BODY.PEEK[TEXT]" 'BODYDETAIL group server to-buffer 'detail)
(nnimap-request-article-part
article "RFC822.TEXT.PEEK" 'RFC822.TEXT group server to-buffer)))
;; find split rule for this server / inbox
(when (setq rule (nnimap-split-find-rule server inbox))
;; iterate over articles
- (dolist (article (imap-search "UNSEEN UNDELETED"))
+ (dolist (article (imap-search nnimap-split-predicate))
(when (nnimap-request-head article)
;; copy article to right group(s)
(setq removeorig nil)
(erase-buffer)
(dolist (pattern (nnimap-pattern-to-list-arguments
nnimap-list-pattern))
- (dolist (mbx (imap-mailbox-lsub "*" (car pattern) nil
+ (dolist (mbx (imap-mailbox-lsub "*" (car pattern) nil
nnimap-server-buffer))
(or (member-if (lambda (mailbox)
(string= (downcase mailbox) "\\noselect"))
;;; nnmail.el --- mail support functions for the Gnus mail backends
-;; Copyright (C) 1995,96,97,98,99 Free Software Foundation, Inc.
+;; Copyright (C) 1995,96,97,98,99, 00 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news, mail
?. ?_))
(setq group (nnheader-translate-file-chars group))
;; If this directory exists, we use it directly.
- (if (or nnmail-use-long-file-names
- (file-directory-p (concat dir group)))
- (concat dir group "/")
- ;; If not, we translate dots into slashes.
- (concat dir
- (encode-coding-string
- (nnheader-replace-chars-in-string group ?. ?/)
- nnmail-pathname-coding-system)
- "/")))
+ (file-name-as-directory
+ (if (or nnmail-use-long-file-names
+ (file-directory-p (concat dir group)))
+ (expand-file-name group dir)
+ ;; If not, we translate dots into slashes.
+ (expand-file-name
+ (encode-coding-string
+ (nnheader-replace-chars-in-string group ?. ?/)
+ nnmail-pathname-coding-system)
+ dir))))
(or file "")))
(defun nnmail-get-active ()
"Returns an assoc of group names and active ranges.
nn*-request-list should have been called before calling this function."
- (let (group-assoc)
- ;; Go through all groups from the active list.
- (save-excursion
- (set-buffer nntp-server-buffer)
- (goto-char (point-min))
- (while (re-search-forward
- "^\\([^ \t]+\\)[ \t]+\\([0-9]+\\)[ \t]+\\([0-9]+\\)" nil t)
- ;; We create an alist with `(GROUP (LOW . HIGH))' elements.
- (push (list (match-string 1)
- (cons (string-to-int (match-string 3))
- (string-to-int (match-string 2))))
- group-assoc)))
+ ;; Go through all groups from the active list.
+ (save-excursion
+ (set-buffer nntp-server-buffer)
+ (nnmail-parse-active)))
+
+(defun nnmail-parse-active ()
+ "Parse the active file in the current buffer and return an alist."
+ (goto-char (point-min))
+ (unless (re-search-forward "[\\\"]" nil t)
+ (goto-char (point-max))
+ (while (re-search-backward "[][';?()#]" nil t)
+ (insert ?\\)))
+ (goto-char (point-min))
+ (let ((buffer (current-buffer))
+ group-assoc group max min)
+ (while (not (eobp))
+ (condition-case err
+ (progn
+ (narrow-to-region (point) (gnus-point-at-eol))
+ (setq group (read buffer))
+ (unless (stringp group)
+ (setq group (symbol-name group)))
+ (if (and (numberp (setq max (read nntp-server-buffer)))
+ (numberp (setq min (read nntp-server-buffer))))
+ (push (list group (cons min max))
+ group-assoc)))
+ (error nil))
+ (widen)
+ (forward-line 1))
group-assoc))
(defvar nnmail-active-file-coding-system 'raw-text
(erase-buffer)
(let (group)
(while (setq group (pop alist))
- (insert (format "%s %d %d y\n" (car group) (cdadr group)
- (caadr group))))))
+ (insert (format "%S %d %d y\n" (intern (car group)) (cdadr group)
+ (caadr group))))
+ (goto-char (point-max))
+ (while (search-backward "\\." nil t)
+ (delete-char 1))))
(defun nnmail-get-split-group (file source)
"Find out whether this FILE is to be split into GROUP only.
(goto-char (point-min))
(when (re-search-forward "^References:" nil t)
(beginning-of-line)
- (insert "X-Gnus-Broken-Eudora-"))))
+ (insert "X-Gnus-Broken-Eudora-"))
+ (goto-char (point-min))
+ (when (re-search-forward "^In-Reply-To:[^\n]+\\(\n[ \t]+\\)" nil t)
+ (replace-match "" t t nil 1))))
(custom-add-option 'nnmail-prepare-incoming-header-hook
'nnmail-fix-eudora-headers)
(unless nnmail-split-history
(error "No current split history"))
(with-output-to-temp-buffer "*nnmail split history*"
+ (with-current-buffer standard-output
+ (fundamental-mode)) ; for Emacs 20.4+
(let ((history nnmail-split-history)
elem)
(while (setq elem (pop history))
"Spool directory for the nnml mail backend.")
(defvoo nnml-active-file
- (concat (file-name-as-directory nnml-directory) "active")
+ (expand-file-name "active" nnml-directory)
"Mail active file.")
(defvoo nnml-newsgroups-file
- (concat (file-name-as-directory nnml-directory) "newsgroups")
+ (expand-file-name "newsgroups" nnml-directory)
"Mail newsgroups description file.")
(defvoo nnml-get-new-mail t
(nnmail-write-region
(point-min) (point-max)
(or (nnml-article-to-file article)
- (concat nnml-current-directory
- (int-to-string article)))
+ (expand-file-name (int-to-string article)
+ nnml-current-directory))
nil (if (nnheader-be-verbose 5) nil 'nomesg))
t)
(setq headers (nnml-parse-head chars article))
(nnml-update-file-alist)
(let (file)
(if (setq file (cdr (assq article nnml-article-file-alist)))
- (concat nnml-current-directory file)
+ (expand-file-name file nnml-current-directory)
;; Just to make sure nothing went wrong when reading over NFS --
;; check once more.
(when (file-exists-p
(defun nnml-find-id (group id)
(erase-buffer)
- (let ((nov (concat (nnmail-group-pathname group nnml-directory)
- nnml-nov-file-name))
+ (let ((nov (expand-file-name nnml-nov-file-name
+ (nnmail-group-pathname group nnml-directory)))
number found)
(when (file-exists-p nov)
(nnheader-insert-file-contents nov)
(defun nnml-retrieve-headers-with-nov (articles &optional fetch-old)
(if (or gnus-nov-is-evil nnml-nov-is-evil)
nil
- (let ((nov (concat nnml-current-directory nnml-nov-file-name)))
+ (let ((nov (expand-file-name nnml-nov-file-name nnml-current-directory)))
(when (file-exists-p nov)
(save-excursion
(set-buffer nntp-server-buffer)
(push (list group active) nnml-group-alist))
(setcdr active (1+ (cdr active)))
(while (file-exists-p
- (concat (nnmail-group-pathname group nnml-directory)
- (int-to-string (cdr active))))
+ (expand-file-name (int-to-string (cdr active))
+ (nnmail-group-pathname group nnml-directory)))
(setcdr active (1+ (cdr active))))
(cdr active)))
(save-excursion
(set-buffer buffer)
(set (make-local-variable 'nnml-nov-buffer-file-name)
- (concat (nnmail-group-pathname group nnml-directory)
- nnml-nov-file-name))
+ (expand-file-name
+ nnml-nov-file-name
+ (nnmail-group-pathname group nnml-directory)))
(erase-buffer)
(when (file-exists-p nnml-nov-buffer-file-name)
(nnheader-insert-file-contents nnml-nov-buffer-file-name)))
(narrow-to-region (point) (search-forward "</story>"))
(goto-char (point-min))
(re-search-forward "<title>\\([^<]+\\)</title>")
- (setq description (nnweb-decode-entities-string (match-string 1)))
+ (setq description
+ (nnweb-decode-entities-string (match-string 1)))
(re-search-forward "<url>\\([^<]+\\)</url>")
(setq sid (match-string 1))
- (string-match "/\\([0-9/]+\\).shtml" sid)
- (setq sid (match-string 1 sid))
+ (string-match "/\\([0-9/]+\\)\\(.shtml\\|$\\)" sid)
+ (setq sid (concat "00/" (match-string 1 sid)))
(re-search-forward "<comments>\\([^<]+\\)</comments>")
(setq articles (string-to-number (match-string 1)))
(setq gname (concat description " (" sid ")"))
(nnweb-insert (format nnslashdot-active-url number) t)
(goto-char (point-min))
(while (re-search-forward
- "article.pl\\?sid=\\([^&]+\\).*<b>\\([^<]+\\)</b>" nil t)
+ "article.pl\\?sid=\\([^&]+\\).*<b>\\([^<]+\\)</b>"
+ nil t)
(setq sid (match-string 1)
- description (nnweb-decode-entities-string (match-string 2)))
+ description
+ (nnweb-decode-entities-string (match-string 2)))
(forward-line 1)
(when (re-search-forward "<b>\\([0-9]+\\)</b>" nil t)
(setq articles (string-to-number (match-string 1))))
;;; nntp.el --- nntp access for Gnus
-;;; Copyright (C) 1987-90,92-99 Free Software Foundation, Inc.
+;;; Copyright (C) 1987, 88, 89, 90, 92, 93, 94, 95, 96, 97, 98, 99
+;;; Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Katsumi Yamaoka <yamaoka@jpl.org>
(while (and (setq article (car articles))
map)
(while (and map
- (> article (caar map)))
+ (or (> article (caar map))
+ (< (cadar map) (caar map))))
(pop map))
(when (setq mmap (car map))
(setq farticle -1)
"-" (number-to-string current-page)
(match-string 0 href))))
(goto-char (point-min))
- (setq contents (w3-parse-buffer (current-buffer)))
+ (setq contents
+ (ignore-errors (w3-parse-buffer (current-buffer))))
(setq table (nnultimate-find-forum-table contents))
(setq string (mapconcat 'identity (nnweb-text table) ""))
(when (string-match "topic is \\([0-9]\\) pages" string)
(setq art (1+ (string-to-number (car artlist)))))
(pop artlist))
(setq garticles art))
- (string-match "/\\([0-9]+\\).html" href)
- (setq topic (string-to-number (match-string 1 href)))
- (if (setq tinfo (assq topic topics))
- (progn
- (setq old-max (cadr tinfo))
- (setcar (cdr tinfo) garticles))
- (setq old-max 0)
- (push (list topic garticles subject href) topics)
- (setcar (nthcdr 4 entry) topics))
- (when (not (= old-max garticles))
- (setq inc (- garticles old-max))
- (setq mapping (nconc mapping
- (list
- (list
- old-total (1- (incf old-total inc))
- topic (1+ old-max)))))
- (incf old-max inc)
- (setcar (nthcdr 5 entry) mapping)
- (setcar (nthcdr 6 entry) old-total)))))
+ (when garticles
+ (string-match "/\\([0-9]+\\).html" href)
+ (setq topic (string-to-number (match-string 1 href)))
+ (if (setq tinfo (assq topic topics))
+ (progn
+ (setq old-max (cadr tinfo))
+ (setcar (cdr tinfo) garticles))
+ (setq old-max 0)
+ (push (list topic garticles subject href) topics)
+ (setcar (nthcdr 4 entry) topics))
+ (when (not (= old-max garticles))
+ (setq inc (- garticles old-max))
+ (setq mapping (nconc mapping
+ (list
+ (list
+ old-total (1- (incf old-total inc))
+ topic (1+ old-max)))))
+ (incf old-max inc)
+ (setcar (nthcdr 5 entry) mapping)
+ (setcar (nthcdr 6 entry) old-total))))))
(setcar (nthcdr 7 entry) current-time)
(setcar (nthcdr 1 entry) (1- old-total))
(nnultimate-write-groups)
'((egroups
(address . "www.egroups.com")
(open-url
- "http://www.egroups.com/register?method=loginAction&email=%s&password=%s"
+ "http://www.egroups.com/login.cgi?&login_email=%s&login_password=%s"
nnwarchive-login nnwarchive-passwd)
(list-url
- "http://www.egroups.com/UserGroupsPage?")
+ "http://www.egroups.com/mygroups")
(list-dissect . nnwarchive-egroups-list)
(list-groups . nnwarchive-egroups-list-groups)
(xover-url
- "http://www.egroups.com/group/%s/?fetchForward=1&start=%d" group aux)
+ "http://www.egroups.com/message/%s/%d" group aux)
(xover-last-url
- "http://www.egroups.com/group/%s/?fetchForward=1" group)
+ "http://www.egroups.com/message/%s/" group)
(xover-page-size . 13)
(xover-dissect . nnwarchive-egroups-xover)
(article-url
- "http://www.egroups.com/group/%s/%d.html?raw=1" group article)
+ "http://www.egroups.com/message/%s/%d?source=1" group article)
(article-dissect . nnwarchive-egroups-article)
(authentication . t)
(article-offset . 0)
t)
(deffoo nnwarchive-open-server (server &optional defs connectionless)
+ (nnoo-change-server 'nnwarchive server defs)
(nnwarchive-init server)
- (if (nnwarchive-server-opened server)
- t
- (nnoo-change-server 'nnwarchive server defs)
- (when nnwarchive-authentication
- (setq nnwarchive-login
- (or nnwarchive-login
- (read-string
+ (when nnwarchive-authentication
+ (setq nnwarchive-login
+ (or nnwarchive-login
+ (read-string
(format "Login at %s: " server)
user-mail-address)))
- (setq nnwarchive-passwd
- (or nnwarchive-passwd
- (mail-source-read-passwd
- (format "Password for %s at %s: "
- nnwarchive-login server)))))
- (unless nnwarchive-groups
- (nnwarchive-read-groups))
- (save-excursion
- (set-buffer nnwarchive-buffer)
- (erase-buffer)
- (if nnwarchive-open-url
- (nnwarchive-url nnwarchive-open-url))
- (if nnwarchive-open-dissect
- (funcall nnwarchive-open-dissect)))
- t))
+ (setq nnwarchive-passwd
+ (or nnwarchive-passwd
+ (mail-source-read-passwd
+ (format "Password for %s at %s: "
+ nnwarchive-login server)))))
+ (unless nnwarchive-groups
+ (nnwarchive-read-groups))
+ (save-excursion
+ (set-buffer nnwarchive-buffer)
+ (erase-buffer)
+ (if nnwarchive-open-url
+ (nnwarchive-url nnwarchive-open-url))
+ (if nnwarchive-open-dissect
+ (funcall nnwarchive-open-dissect)))
+ t)
(nnoo-define-skeleton nnwarchive)
expr)))
(defun nnwarchive-url (xurl)
- (let ((url-confirmation-func 'identity))
- (cond
- ((eq (car xurl) 'post)
- (pop xurl)
- (nnwarchive-fetch-form (car xurl) (nnwarchive-eval (cdr xurl))))
- (t
- (nnweb-insert (apply 'format (nnwarchive-eval xurl)))))))
-
+ (mm-with-unibyte-current-buffer
+ (let ((url-confirmation-func 'identity)
+ (url-cookie-multiple-line nil))
+ (cond
+ ((eq (car xurl) 'post)
+ (pop xurl)
+ (nnwarchive-fetch-form (car xurl) (nnwarchive-eval (cdr xurl))))
+ (t
+ (nnweb-insert (apply 'format (nnwarchive-eval xurl))))))))
+
(defun nnwarchive-generate-active ()
(save-excursion
(set-buffer nntp-server-buffer)
(erase-buffer)
(nnwarchive-url nnwarchive-xover-last-url)
(goto-char (point-min))
- (when (re-search-forward "of \\([0-9]+\\)</title>" nil t)
+ (when (re-search-forward "of \\([0-9]+\\)[ \t\n\r]*</title>" nil t)
(setq articles (string-to-number (match-string 1))))
(let ((elem (assoc group nnwarchive-groups)))
(if elem
group description elem articles)
(goto-char (point-min))
(while
- (re-search-forward
- "/group/\\([^/]+\\)/info\\.html[^>]+>[^>]+>[\040\t]*-[\040\t]*\\([^<]+\\)<"
- nil t)
+ (re-search-forward "href=\"/group/\\([^/\"\> ]+\\)" nil t)
(setq group (match-string 1)
description (match-string 2))
- (forward-line 1)
- (when (re-search-forward ">\\([0-9]+\\)<" nil t)
- (setq articles (string-to-number (match-string 1))))
(if (setq elem (assoc group nnwarchive-groups))
- (setcar (cdr elem) articles)
+ (setcar (cdr elem) 0)
(push (list group articles description) nnwarchive-groups))))
t)
(let (article subject from date)
(goto-char (point-min))
(while (re-search-forward
- "<a href=\"/group/\\([^/]+\\)/\\([0-9]+\\)\\.html[^>]+>\\([^<]+\\)<"
+ "<a href=\"/group/\\([^/]+\\)/\\([0-9]+\\)[^>]+>\\([^<]+\\)<"
nil t)
(setq group (match-string 1)
article (string-to-number (match-string 2))
(while (re-search-forward "&\\(#[0-9]+\\|[a-z]+\\);" nil t)
(replace-match (char-to-string
(if (eq (aref (match-string 1) 0) ?\#)
- (string-to-number (substring (match-string 1) 1))
+ (let ((c
+ (string-to-number (substring
+ (match-string 1) 1))))
+ (if (mm-char-or-char-int-p c) c 32))
(or (cdr (assq (intern (match-string 1))
w3-html-entities))
?#)))
(narrow-to-region (point) (point))
(url-insert-file-contents url)
(goto-char (point-min))
- (while (re-search-forward
- "HTTP-EQUIV=\"Refresh\"[^>]*URL=\\([^\"]+\\)\""
- nil t)
+ (when (re-search-forward
+ "HTTP-EQUIV=\"Refresh\"[^>]*URL=\\([^\"]+\\)\"" nil t)
(let ((url (match-string 1)))
(delete-region (point-min) (point-max))
- (nnweb-insert url))
- (goto-char (point-min)))
- (goto-char (point-max)))
+ (nnweb-insert url t))))
(url-insert-file-contents url))
(setq buffer-file-name name)))
(= (length elt) 7)
(= (aref elt 1) ?:)))
[0 1] [2 4] [5 7])
- ((5) (50 99) ,#'(lambda () (+ 1900 elt)))
+ ((5) (50 110) ,#'(lambda () (+ 1900 elt)))
((5) (0 49) ,#'(lambda () (+ 2000 elt))))
"(slots predicate extractor...)")
;;; pop3.el --- Post Office Protocol (RFC 1460) interface
-;; Copyright (C) 1996-1999 Free Software Foundation, Inc.
+;; Copyright (C) 1996, 97, 98, 1999 Free Software Foundation, Inc.
;; Author: Richard L. Pieri <ratinox@peorth.gweep.net>
;; Daiki Ueno <ueno@ueda.info.waseda.ac.jp>
-;; Keywords: mail, pop3
+;; Maintainer: FSF
+;; Keywords: mail
;; Version: 1.3s
;; This file is part of GNU Emacs.
;;; Code:
(eval-when-compile (require 'cl))
+(eval-when-compile (require 'static))
(require 'mail-utils)
(let* ((process (pop3-open-server pop3-mailhost pop3-port))
(crashbuf (get-buffer-create " *pop3-retr*"))
(n 1)
+ message-count
(pop3-password pop3-password)
- (pop3-uidl-file-name
- (convert-standard-filename
- (concat pop3-uidl-file-name "-" pop3-mailhost)))
- (retrieved-messages nil)
- messages message-count)
+ (pop3-uidl-file-name (convert-standard-filename
+ (concat pop3-uidl-file-name "-"
+ pop3-mailhost)))
+ retrieved-messages messages)
;; for debugging only
(if pop3-debug (switch-to-buffer (process-buffer process)))
;; query for password
(kill-buffer crashbuf)
message-count))
-(defun pop3-get-message-count ()
- "Return the number of messages in the maildrop."
- (let* ((process (pop3-open-server pop3-mailhost pop3-port))
- message-count
- (pop3-password pop3-password)
- )
- ;; for debugging only
- (if pop3-debug (switch-to-buffer (process-buffer process)))
- ;; query for password
- (if (and pop3-password-required (not pop3-password))
- (setq pop3-password
- (pop3-read-passwd (format "Password for %s: " pop3-maildrop))))
- (cond ((equal 'apop pop3-authentication-scheme)
- (pop3-apop process pop3-maildrop))
- ((equal 'pass pop3-authentication-scheme)
- (pop3-user process pop3-maildrop)
- (pop3-pass process))
- (t (error "Invalid POP3 authentication scheme.")))
- (setq message-count (car (pop3-stat process)))
- (pop3-quit process)
- message-count))
-
(defun pop3-open-server (mailhost port)
- "Open TCP connection to MAILHOST.
+ "Open TCP connection to MAILHOST on PORT.
Returns the process associated with the connection.
Argument PORT specifies connecting port."
- (let ((process-buffer
- (get-buffer-create (format "trace of POP session to %s" mailhost)))
- (process))
+ (let (process)
(save-excursion
- (set-buffer process-buffer)
- (erase-buffer))
- (setq
- process
- (cond
- ((eq pop3-connection-type 'ssl)
- (pop3-open-ssl-stream "POP" process-buffer mailhost port))
- ((eq pop3-connection-type 'tls)
- (pop3-open-tls-stream "POP" process-buffer mailhost port))
- (t
- (open-network-stream-as-binary "POP" process-buffer mailhost port))))
- (setq pop3-read-point (point-min))
- (let ((response (pop3-read-response process t)))
- (setq pop3-timestamp
- (substring response (or (string-match "<" response) 0)
- (+ 1 (or (string-match ">" response) -1)))))
- process))
+ (set-buffer (get-buffer-create (concat " trace of POP session to %s"
+ mailhost)))
+ (erase-buffer)
+ (setq pop3-read-point (point-min))
+ (setq
+ process
+ (cond
+ ((eq pop3-connection-type 'ssl)
+ (pop3-open-ssl-stream "POP" (current-buffer) mailhost port))
+ ((eq pop3-connection-type 'tls)
+ (pop3-open-tls-stream "POP" (current-buffer) mailhost port))
+ (t
+ (open-network-stream-as-binary "POP" (current-buffer)
+ mailhost port))))
+ (let ((response (pop3-read-response process t)))
+ (setq pop3-timestamp
+ (substring response (or (string-match "<" response) 0)
+ (+ 1 (or (string-match ">" response) -1)))))
+ process)))
(defun pop3-open-ssl-stream-1 (name buffer host service extra-arg)
(require 'path-util)
(insert output)))
(defun pop3-send-command (process command)
- (set-buffer (process-buffer process))
- (goto-char (point-max))
- ;; (if (= (aref command 0) ?P)
- ;; (insert "PASS <omitted>\r\n")
- ;; (insert command "\r\n"))
- (setq pop3-read-point (point))
- (goto-char (point-max))
- (process-send-string process (concat command "\r\n"))
- )
+ (set-buffer (process-buffer process))
+ (goto-char (point-max))
+;; (if (= (aref command 0) ?P)
+;; (insert "PASS <omitted>\r\n")
+;; (insert command "\r\n"))
+ (setq pop3-read-point (point))
+ (goto-char (point-max))
+ (process-send-string process (concat command "\r\n"))
+ )
(defun pop3-read-response (process &optional return)
"Read the response from the server PROCESS.
(setq match-end (point))
(goto-char pop3-read-point)
(if (looking-at "-ERR")
- (signal 'error (list (buffer-substring (point) (- match-end 2))))
+ (error (buffer-substring (point) (- match-end 2)))
(if (not (looking-at "+OK"))
(progn (setq pop3-read-point match-end) nil)
(setq pop3-read-point match-end)
(defvar pop3-read-passwd nil)
(defun pop3-read-passwd (prompt)
(if (not pop3-read-passwd)
- (if (functionp 'read-passwd)
+ (if (fboundp 'read-passwd)
(setq pop3-read-passwd 'read-passwd)
(if (load "passwd" t)
(setq pop3-read-passwd 'read-passwd)
(if (not (and response (string-match "+OK" response)))
(pop3-quit process))))
-(autoload 'md5 "md5")
+(static-unless (and (fboundp 'md5) (subrp (symbol-function 'md5)))
+ (eval-and-compile
+ (require 'path-util)
+ (if (module-installed-p 'md5)
+ (progn
+ (autoload 'md5 "md5")
+ (fset 'pop3-md5 'md5))
+
+ (defvar pop3-md5-program "md5"
+ "*Program to encode its input in MD5.")
+
+ (defun pop3-md5 (string)
+ (with-temp-buffer
+ (insert string)
+ (call-process-region (point-min) (point-max)
+ (or shell-file-name "/bin/sh")
+ t (current-buffer) nil
+ "-c" pop3-md5-program)
+ ;; The meaningful output is the first 32 characters.
+ ;; Don't return the newline that follows them!
+ (buffer-substring (point-min) (+ (point-min) 32))))
+ )))
(defun pop3-apop (process user)
"Send alternate authentication information to the server."
- (let ((hash (md5 (concat pop3-timestamp pop3-password))))
- (pop3-send-command process (format "APOP %s %s" user hash))
- (let ((response (pop3-read-response process t)))
- (if (not (and response (string-match "+OK" response)))
- (pop3-quit process)))))
+ (let ((pass pop3-password))
+ (if (and pop3-password-required (not pass))
+ (setq pass
+ (pop3-read-passwd (format "Password for %s: " pop3-maildrop))))
+ (if pass
+ (let ((hash (static-if (and (fboundp 'md5)
+ (subrp (symbol-function 'md5)))
+ (md5 (concat pop3-timestamp pass))
+ (pop3-md5 (concat pop3-timestamp pass)))))
+ (pop3-send-command process (format "APOP %s %s" user hash))
+ (let ((response (pop3-read-response process t)))
+ (if (not (and response (string-match "+OK" response)))
+ (pop3-quit process)))))
+ ))
(defun pop3-stls (process)
"Query whether TLS extension is supported"
"Return the number of messages in the maildrop and the maildrop's size."
(pop3-send-command process "STAT")
(let ((response (pop3-read-response process t)))
- (list (string-to-int (nth 1 (split-string response)))
- (string-to-int (nth 2 (split-string response))))
+ (list (string-to-int (nth 1 (split-string response " ")))
+ (string-to-int (nth 2 (split-string response " "))))
))
(defun pop3-retr (process msg crashbuf)
"Return highest accessed message-id number for the session."
(pop3-send-command process "LAST")
(let ((response (pop3-read-response process t)))
- (string-to-int (nth 1 (split-string response)))
+ (string-to-int (nth 1 (split-string response " ")))
))
(defun pop3-rset (process)
;;; Code:
+(require 'mm-util)
+
(defvar quoted-printable-encoding-characters
(mapcar 'identity "0123456789ABCDEFabcdef"))
-(defun quoted-printable-decode-region (from to)
- "Decode quoted-printable in the region between FROM and TO."
+(defun quoted-printable-decode-region (from to &optional charset)
+ "Decode quoted-printable in the region between FROM and TO.
+If CHARSET is non-nil, decode the region with charset."
(interactive "r")
(save-excursion
- (goto-char from)
- (while (search-forward "=" to t)
- (cond
- ;; End of the line.
- ((eq (char-after) ?\n)
- (delete-char -1)
- (delete-char 1))
- ;; Encoded character.
- ((and
- (memq (char-after) quoted-printable-encoding-characters)
- (memq (char-after (1+ (point)))
- quoted-printable-encoding-characters))
- (subst-char-in-region
- (1- (point)) (point) ?=
- (string-to-number
- (buffer-substring (point) (+ 2 (point)))
- 16))
- (delete-char 2))
- ;; Quoted equal sign.
- ((eq (char-after) ?=)
- (delete-char 1))
- ;; End of buffer.
- ((eobp)
- (delete-char -1))
- ;; Invalid.
- (t
- (message "Malformed MIME quoted-printable message"))))))
-
-(defun quoted-printable-decode-string (string)
- "Decode the quoted-printable-encoded STRING and return the results."
+ (save-restriction
+ (let (start)
+ (narrow-to-region from to)
+ (goto-char from)
+ (while (not (eobp))
+ (cond
+ ((eq (char-after) ?=)
+ (delete-char 1)
+ (unless start
+ (setq start (point)))
+ (cond
+ ;; End of the line.
+ ((eq (char-after) ?\n)
+ (delete-char 1))
+ ;; Encoded character.
+ ((and
+ (memq (char-after) quoted-printable-encoding-characters)
+ (memq (char-after (1+ (point)))
+ quoted-printable-encoding-characters))
+ (insert
+ (string-to-number
+ (buffer-substring (point) (+ 2 (point)))
+ 16))
+ (delete-char 2))
+ ;; Quoted equal sign.
+ ((eq (char-after) ?=)
+ (forward-char 1))
+ ;; End of buffer.
+ ((eobp))
+ ;; Invalid.
+ (t
+ (message "Malformed MIME quoted-printable message"))))
+ ((and charset start (not (eq (mm-charset-after) 'ascii)))
+ (mm-decode-coding-region start (point) charset)
+ (setq start nil)
+ (forward-char 1))
+ (t
+ (forward-char 1))))
+ (if (and charset start)
+ (mm-decode-coding-region start (point) charset))))))
+
+(defun quoted-printable-decode-string (string &optional charset)
+ "Decode the quoted-printable-encoded STRING and return the results.
+If CHARSET is non-nil, decode the region with charset."
(with-temp-buffer
(insert string)
- (quoted-printable-decode-region (point-min) (point-max))
+ (quoted-printable-decode-region (point-min) (point-max) charset)
(buffer-string)))
(defun quoted-printable-encode-region (from to &optional fold class)
"Encode the message header according to `rfc2047-header-encoding-alist'.
Should be called narrowed to the head of the message."
(interactive "*")
- (when (featurep 'mule)
- (save-excursion
- (goto-char (point-min))
- (let ((alist rfc2047-header-encoding-alist)
- elem method)
- (while (not (eobp))
- (save-restriction
- (rfc2047-narrow-to-field)
- (when (rfc2047-encodable-p)
- ;; We found something that may perhaps be encoded.
- (while (setq elem (pop alist))
- (when (or (and (stringp (car elem))
- (looking-at (car elem)))
- (eq (car elem) t))
- (setq alist nil
- method (cdr elem))))
- (when method
- (cond
- ((eq method 'mime)
- (rfc2047-encode-region (point-min) (point-max))
- (rfc2047-fold-region (point-min) (point-max)))
- ;; Hm.
- (t))))
- (goto-char (point-max)))))
- (when mail-parse-charset
- (encode-coding-region (point-min) (point-max)
- mail-parse-charset)))))
+ (save-excursion
+ (goto-char (point-min))
+ (let ((alist rfc2047-header-encoding-alist)
+ elem method)
+ (while (not (eobp))
+ (save-restriction
+ (rfc2047-narrow-to-field)
+ (when (rfc2047-encodable-p)
+ ;; We found something that may perhaps be encoded.
+ (while (setq elem (pop alist))
+ (when (or (and (stringp (car elem))
+ (looking-at (car elem)))
+ (eq (car elem) t))
+ (setq alist nil
+ method (cdr elem))))
+ (cond
+ ((eq method 'mime)
+ (rfc2047-encode-region (point-min) (point-max))
+ (rfc2047-fold-region (point-min) (point-max)))
+ ;; Hm.
+ (t)))
+ (goto-char (point-max)))))
+ (when mail-parse-charset
+ (encode-coding-region
+ (point-min) (point-max) mail-parse-charset))))
(defun rfc2047-encodable-p (&optional header)
"Say whether the current (narrowed) buffer contains characters that need encoding in headers."
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Masanobu Umeda <umerin@mse.kyutech.ac.jp>
+;; Keywords: mail news util
+
;; This file is part of GNU Emacs.
;; GNU Emacs is free software; you can redistribute it and/or modify
(require 'parse-time)
+;;;###autoload
(defun date-to-time (date)
"Convert DATE into time."
(condition-case ()
"Convert TIME to a floating point number."
(+ (* (car time) 65536.0)
(cadr time)
- (/ (or (caddr time) 0) 1000000.0)))
+ (/ (or (nth 2 time) 0) 1000000.0)))
(defun seconds-to-time (seconds)
"Convert SECONDS (a floating point number) to an Emacs time structure."
(- (/ (1- year) 100)) ; - century years
(/ (1- year) 400)))) ; + Gregorian leap years
+;;;###autoload
(defun safe-date-to-time (date)
"Parse DATE and return a time structure.
If DATE is malformed, a zero time will be returned."
;;; utf7.el --- UTF-7 encoding/decoding for Emacs
;; Copyright (C) 1999 Free Software Foundation, Inc.
-;; Author: Jon K Hellan <hellan@item.ntnu.no>
+;; Author: Jon K Hellan <hellan@acm.org>
;; Keywords: mail
;; This file is part of GNU Emacs, but the same permissions apply
;; Copyright (C) 1999 Free Software Foundation, Inc.
;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
-;; Keywords: hotmail yahoo netaddress my-deja
+;; Keywords: hotmail netaddress my-deja netscape
;; This file is part of GNU Emacs.
(list-snarf . webmail-hotmail-list)
(article-snarf . webmail-hotmail-article)
(trash-url
- "%s&login=%s&f=33792&curmbox=ACTIVE&_lang=&js=&foo=inbox&page=&%s=on&Move+To.x=Move+To&tobox=trAsH"
+ "%s&login=%s&f=33792&curmbox=ACTIVE&_lang=&foo=inbox&js=&page=&%s=on&_HMaction=MoveTo&tobox=trAsH&nullbox="
webmail-aux user id))
(yahoo
(paranoid cookie post)
"http://www.netaddress.com/tpl/Mail/%s/List?FolderID=-4&SortUseCase=True"
webmail-session)
(list-snarf . webmail-netaddress-list)
+ (article-url "http://www.netaddress.com/")
(article-snarf . webmail-netaddress-article)
(trash-url
"http://www.netaddress.com/tpl/Message/%s/Move?FolderID=-4&Q=%s&N=&Sort=Date&F=-1"
webmail-session id))
+ (netscape
+ (paranoid cookie post agent)
+ (address . "webmail.netscape.com")
+ (open-url "http://ureg.netscape.com/iiop/UReg2/login/login?U2_LA=en&U2_BACK_FROM_CJ=true&U2_CS=iso-8859-1&U2_ENDURL=http://webmail.netscape.com/tpl/Subscribe/Step1&U2_NEW_ENDURL=http://webmail.netscape.com/tpl/Subscribe/Step1&U2_EXITURL=http://home.netscape.com/&U2_SOURCE=Webmail")
+ (open-snarf . webmail-netscape-open)
+ (login-url
+ content
+ ("http://ureg.netscape.com/iiop/UReg2/login/loginform")
+ "%s&U2_USERNAME=%s&U2_PASSWORD=%s"
+ webmail-aux user password)
+ (login-snarf . webmail-netaddress-login)
+ (list-url
+ "http://webmail.netscape.com/tpl/Mail/%s/List?FolderID=-4&SortUseCase=True"
+ webmail-session)
+ (list-snarf . webmail-netaddress-list)
+ (article-url "http://webmail.netscape.com/")
+ (article-snarf . webmail-netscape-article)
+ (trash-url
+ "http://webmail.netscape.com/tpl/Message/%s/Move?FolderID=-4&Q=%s&N=&Sort=Date&F=-1"
+ webmail-session id))
(my-deja
(paranoid cookie post)
(address . "www.my-deja.com")
(login-url
content
("%s" webmail-aux)
- "user=%s&pw=%s&autologout=60&go="
+ "member_name=%s&pw=%s&go=&priv_opt_MyDeja99="
user password)
(list-url "http://www.deja.com/rg_gotomail.xp")
(list-snarf . webmail-my-deja-list)
(defun webmail-hotmail-list ()
(let (site url newp)
(goto-char (point-min))
- (if (re-search-forward "[0-9]+ messages, [0-9]+ new" nil t)
+ (if (re-search-forward "[0-9]+ new" nil t)
(message "Found %s" (match-string 0))
(webmail-error "maybe your w3 version is too old"))
(goto-char (point-min))
;;; netaddress
+(defun webmail-netscape-open ()
+ (goto-char (point-min))
+ (if (re-search-forward "login/hint\\?\\([^\"]+\\)\"" nil t)
+ (setq webmail-aux (match-string 1))
+ (webmail-error "open@1")))
+
(defun webmail-netaddress-open ()
(goto-char (point-min))
(if (re-search-forward "action=\"\\([^\"]+\\)\"" nil t)
(setq item
(cons id
(format "%s/tpl/Message/%s/Read?Q=%s&FolderID=-4&SortUseCase=True&Sort=Date&Headers=True"
- (car webmail-open-url)
+ (car webmail-article-url)
webmail-session id)))
(if (or (not webmail-newmail-only)
(equal (match-string 1) "True"))
;; Some blank line to seperate mails.
(insert "\n\nFrom nobody " (current-time-string) "\n")
(if id
- (insert (format "Message-ID: <%s@usa.net>\n" id)))
+ (insert (format "Message-ID: <%s@%s>\n" id webmail-address)))
+ (unless (looking-at "$")
+ (if (search-forward "\n\n" nil t)
+ (forward-line -1)
+ (webmail-error "article@2")))
+ (when mime
+ (narrow-to-region (point-min) (point))
+ (goto-char (point-min))
+ (while (not (eobp))
+ (if (looking-at "MIME-Version\\|Content-Type")
+ (delete-region (point)
+ (progn
+ (forward-line 1)
+ (if (re-search-forward "^[^ \t]" nil t)
+ (goto-char (match-beginning 0))
+ (point-max))))
+ (forward-line 1)))
+ (goto-char (point-max))
+ (widen)
+ (narrow-to-region (point) (point-max))
+ (insert "MIME-Version: 1.0\n"
+ (prog1
+ (mml-generate-mime)
+ (delete-region (point-min) (point-max))))
+ (goto-char (point-min))
+ (widen))
+ (let (case-fold-search)
+ (while (re-search-forward "^From " nil t)
+ (beginning-of-line)
+ (insert ">"))))
+ (mm-append-to-file (point-min) (point-max) file)))
+
+(defun webmail-netscape-article (file id)
+ (let (p p1 attachment count mime type)
+ (save-restriction
+ (webmail-encode-8bit)
+ (goto-char (point-min))
+ (if (not (search-forward "Trash" nil t))
+ (webmail-error "article@1"))
+ (if (not (search-forward "<form>" nil t))
+ (webmail-error "article@2"))
+ (delete-region (point-min) (match-beginning 0))
+ (if (not (search-forward "</form>" nil t))
+ (webmail-error "article@3"))
+ (narrow-to-region (point-min) (match-end 0))
+ (goto-char (point-min))
+ (while (re-search-forward "[\040\t\r\n]+" nil t)
+ (replace-match " "))
+ (goto-char (point-min))
+ (while (re-search-forward "<a href=[^>]*>[^<]*</a>" nil t)
+ (replace-match ""))
+ (goto-char (point-min))
+ (while (search-forward "<b>" nil t)
+ (replace-match "\n"))
+ (nnweb-remove-markup)
+ (nnweb-decode-entities)
+ (goto-char (point-min))
+ (delete-blank-lines)
+ (goto-char (point-min))
+ (while (re-search-forward "^\040+\\|\040+$" nil t)
+ (replace-match ""))
+ (goto-char (point-min))
+ (while (re-search-forward "\040+" nil t)
+ (replace-match " "))
+ (goto-char (point-max))
+ (widen)
+ (insert "\n\n")
+ (setq p (point))
+ (unless (search-forward "<!-- Data -->" nil t)
+ (webmail-error "article@4"))
+ (forward-line 14)
+ (delete-region p (point))
+ (goto-char (point-max))
+ (unless (re-search-backward
+ "<form name=\"Transfer2\"" p t)
+ (webmail-error "article@5"))
+ (delete-region (point) (point-max))
+ (goto-char p)
+ (while (search-forward
+ "<TABLE border=\"0\" WIDTH=\"98%\" cellpadding=0 cellspacing=0>"
+ nil t 2)
+ (setq mime t)
+ (unless (search-forward "</TABLE>" nil t)
+ (webmail-error "article@6"))
+ (setq p1 (point))
+ (if (search-backward "<IMG " p t)
+ (progn
+ (unless (re-search-forward "HREF=\"\\(/tpl/Attachment/[^/]+/\\([^/]+/[^\?]+\\)[^\"]+\\)\"" p1 t)
+ (webmail-error "article@7"))
+ (setq attachment (match-string 1))
+ (setq type (match-string 2))
+ (unless (search-forward "</TABLE>" nil t)
+ (webmail-error "article@8"))
+ (delete-region p (point))
+ (let (bufname);; Attachment
+ (save-excursion
+ (set-buffer (generate-new-buffer " *webmail-att*"))
+ (nnweb-insert (concat (car webmail-open-url) attachment))
+ (push (current-buffer) webmail-buffer-list)
+ (setq bufname (buffer-name)))
+ (insert "<#part type=" type)
+ (insert " buffer=\"" bufname "\"")
+ (insert " disposition=\"inline\"")
+ (insert "><#/part>\n")
+ (setq p (point))))
+ (delete-region p p1)
+ (narrow-to-region
+ p
+ (if (search-forward
+ "<TABLE border=\"0\" WIDTH=\"98%\" cellpadding=0 cellspacing=0>"
+ nil t)
+ (match-beginning 0)
+ (point-max)))
+ (webmail-netaddress-single-part)
+ (goto-char (point-max))
+ (setq p (point))
+ (widen)))
+ (unless mime
+ (narrow-to-region p (point-max))
+ (setq mime (webmail-netaddress-single-part))
+ (widen))
+ (goto-char (point-min))
+ ;; Some blank line to seperate mails.
+ (insert "\n\nFrom nobody " (current-time-string) "\n")
+ (if id
+ (insert (format "Message-ID: <%s@%s>\n" id webmail-address)))
(unless (looking-at "$")
(if (search-forward "\n\n" nil t)
(forward-line -1)
(defun webmail-my-deja-open ()
(webmail-refresh-redirect)
(goto-char (point-min))
- (if (re-search-forward "action=\"\\([^\"]+login_confirm\\.xp[^\"]+\\)\""
+ (if (re-search-forward "action=\"\\([^\"]+login_confirm\\.xp[^\"]*\\)\""
nil t)
(setq webmail-aux (match-string 1))
(webmail-error "open@1")))
@echo off\r
\r
-rem Written by David Charlap <shamino@writeme.com>\r
-\r
-rem There are two catches, however. The emacs.bat batch file may not exist\r
-rem in all distributions. It is part of the Voelker build of Emacs 19.34\r
-rem (http://www.cs.washington.edu/homes/voelker/ntemacs.html). If the user\r
-rem installs Gnus with some other build, he may have to replace calls to\r
+rem Written by David Charlap (shamino@writeme.com)\r
+rem\r
+rem There are two possible problems with this batch file. The emacs.bat batch\r
+rem file may not exist in all distributions. It is part of the GNU build of\r
+rem Emacs 20.4 (http://www.gnu.org/softare/emacs/windows.ntemacs.html) If you\r
+rem install Gnus with some other build, you may have to replace calls to\r
rem %1\emacs.bat with something else.\r
rem \r
-rem Also, the emacs.bat file that Voelker ships does not accept more than 9\r
+rem Also, the emacs.bat file that comes with Emacs does not accept more than 9\r
rem parameters, so the attempts to compile the .texi files will fail. To\r
rem fix that (at least on NT. I don't know about Win95), the following\r
rem change should be made to emacs.bat:\r
cd lisp\r
call %1\bin\emacs.bat -batch -q -no-site-file -l ./dgnushack.el -f dgnushack-compile\r
if not "%2" == "copy" goto info\r
-copy *.el* %1\lisp\r
+attrib -r %1\lisp\gnus\*\r
+copy *.el* %1\lisp\gnus\r
\r
:info\r
cd ..\texi\r
-call %1\bin\emacs.bat -batch -q -no-site-file gnus.texi -l texinfmt -f texinfo-every-node-update -f texinfo-format-buffer -f save-buffer\r
-call %1\bin\emacs.bat -batch -q -no-site-file message.texi -l texinfmt -f texinfo-every-node-update -f texinfo-format-buffer -f save-buffer\r
+call %1\bin\emacs.bat -batch -q -no-site-file message.texi -f texinfo-every-node-update -f texinfo-format-buffer -f save-buffer\r
+call %1\bin\emacs.bat -batch -q -no-site-file emacs-mime.texi -f texinfo-every-node-update -f texinfo-format-buffer -f save-buffer\r
+call %1\bin\emacs.bat -batch -q -no-site-file gnus.texi -f texinfo-every-node-update -f texinfo-format-buffer -f save-buffer\r
if not "%2" == "copy" goto done\r
copy gnus %1\info\r
copy gnus-?? %1\info\r
copy message %1\info\r
+copy emacs-mime %1\info\r
\r
:etc\r
cd ..\etc\r
echo Usage: make ^<emacs-dir^> [copy]\r
echo.\r
echo where: ^<emacs-dir^> is the directory you installed emacs in\r
-echo eg. d:\emacs\19.34\r
+echo eg. d:\emacs\20.4\r
echo copy indicates that the compiled files should be copied to your\r
echo emacs lisp, info, and etc directories\r
\r
+2000-03-19 Simon Josefsson <jas@pdc.kth.se>
+
+ * gnus.texi (IMAP): Addition.
+
+2000-03-13 17:44:59 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus.texi (Process/Prefix): Addition.
+
+2000-02-04 Simon Josefsson <jas@pdc.kth.se>
+
+ * gnus.texi (IMAP): Fix.
+
+2000-01-27 18:06:35 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus.texi (Remember): Addition.
+
+2000-01-21 Simon Josefsson <jas@pdc.kth.se>
+
+ * gnus.texi (Splitting in IMAP): Addition.
+ (Mail Source Specifiers): Add fetchflag setting in example.
+
+2000-01-08 08:10:04 Martin Bialasinski <agr30+news@uni-koeln.de>
+
+ * gnus.texi (Mail and Post): Example.
+
+2000-01-08 07:46:13 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus.texi (Customizing w3): New.
+
+2000-01-08 07:46:06 Hamish Macdonald <hamishm@lucent.com>
+
+ * gnus.texi (Customizing w3): Example.
+
+2000-01-06 17:55:28 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus.texi (Charsets): Addition.
+
2000-01-05 15:58:48 Lars Magne Ingebrigtsen <larsi@gnus.org>
* gnus.texi (Mail Group Commands): Addition.
+ (Top): Added detailmenu.
2000-01-03 01:31:02 Lars Magne Ingebrigtsen <larsi@gnus.org>
@end iftex
-
@menu
* Starting Up:: \e$(B%K%e!<%9$r8+$D$1$k$N$K$O6lO+$,H<$&$+$bCN$l$J$$\e(B
* The Group Buffer:: \e$(B%0%k!<%W$rA*Br$7!"9XFI$7!":o=|$9$k\e(B
* Appendices:: \e$(BMQ8l!"\e(BEmacs \e$(BF~Lg!"\e(BFAQ\e$(B!"Nr;K!"FbIt9=B$\e(B
* Index:: \e$(BJQ?t!"4X?t!"35G0$N:w0z\e(B
* Key Index:: \e$(B%-!<:w0z\e(B
+
+@detailmenu
+ --- The Detailed Node Listing ---
+
+Starting Gnus
+
+* Finding the News:: \e$(B%K%e!<%9$r<hF@$9$kJ}K!$rA*$V\e(B
+* The First Time:: \e$(B:G=i$K5/F0$7$?$H$-$K\e(B gnus \e$(B$O2?$r$9$k$+\e(B
+* The Server is Down:: \e$(B$I$&$9$l$P$=$N$h$&$J$H$-$K%a!<%k$r<j$KF~$l$k$3$H$,$G$-$k$+\e(B
+* Slave Gnusae:: \e$(BF1;~$K0l$D0J>e$N\e(B gnus \e$(B$r:nF0$5$;$k$3$H$,$G$-$k\e(B
+* Fetching a Group:: \e$(B%0%k!<%W$rFI$`$?$a$@$1$K\e(B gnus \e$(B$r5/F0$9$k\e(B
+* New Groups:: Gnus \e$(B$,?7$7$$%0%k!<%W$KBP$7$F2?$r$9$k$+\e(B
+* Startup Files:: \e$(B$d$C$+$$$J%9%?!<%H%"%C%W%U%!%$%k\e(B--@file{.newsrc}
+* Auto Save:: \e$(B%/%i%C%7%e$+$i$N2sI|\e(B
+* The Active File:: \e$(BCY$$2s@~$+$i$N%U%!%$%k$N<hF@$K$O;~4V$,$+$+$k\e(B
+* Changing Servers:: \e$(B$"$k%5!<%P$+$iJL$N%5!<%P$X0\$j$?$$$+$b$7$l$J$$\e(B
+* Startup Variables:: \e$(BJQ99$7$?$$$H;W$&$+$b$7$l$J$$JQ?t\e(B
+
+New Groups
+
+* Checking New Groups:: \e$(B$I$N%0%k!<%W$,?7$7$$$+$r7hDj$9$k!#\e(B
+* Subscription Methods:: \e$(B?7$7$$%0%k!<%W$KBP$7$F\e(B gnus \e$(B$O2?$r$9$Y$-$+\e(B
+* Filtering New Groups:: Gnus \e$(B$KFCDj$N?7$7$$%0%k!<%W$rL5;k$5$;$k\e(B
+
+The Group Buffer
+
+* Group Buffer Format:: \e$(BI=<($5$l$F$$$k>pJs$HJQ99$NJ}K!!#\e(B
+* Group Maneuvering:: \e$(B%0%k!<%W%P%C%U%!$r0\F0$9$k%3%^%s%I!#\e(B
+* Selecting a Group:: \e$(B<B:]$K%K%e!<%9$rFI$`!#\e(B
+* Group Data:: \e$(B%0%k!<%W$N>pJs$rJQ99$9$k!#\e(B
+* Subscription Commands:: \e$(B9XFI!"9XFICf;_!">C5n!#\e(B
+* Group Levels:: \e$(B%l%Y%k!)$=$l$C$F2?!)\e(B
+* Group Score:: \e$(B$"$J$?$N9%$-$J%0%k!<%W$r8+$D$1=P$9J}K!!#\e(B
+* Marking Groups:: \e$(B%0%k!<%W$K0u$r$D$1$F$*$$$F!"8e$G=hM}$G$-$^$9!#\e(B
+* Foreign Groups:: \e$(B%0%k!<%W$N:n@.$H=$@5!#\e(B
+* Group Parameters:: \e$(B%0%k!<%WKh$K0c$C$?%Q%i%a!<%?$r;}$?$;$i$l$^$9!#\e(B
+* Listing Groups:: Gnus \e$(B$O%0%k!<%W$r$$$m$$$m$JJ,$1J}$GI=<($G$-$^$9!#\e(B
+* Sorting Groups:: \e$(B%0%k!<%W$N=gHV$NG[CVBX$(!#\e(B
+* Group Maintenance:: \e$(B$-$l$$$J\e(B @file{.newsrc} \e$(B$NJ]$AJ}!#\e(B
+* Browse Foreign Server:: \e$(B%5!<%P$r354Q$G$-$k!#2?$,FI$a$k$N$+8+$F$_$h$&!#\e(B
+* Exiting Gnus:: \e$(B%K%e!<%9FI$`$N$r$d$a$F!";E;v$r$7$h$&!#\e(B
+* Group Topics:: \e$(B%0%k!<%W$r@Z$j:.$<$F!"%H%T%C%/$4$H$KJ,3d$9$k!#\e(B
+* Misc Group Stuff:: \e$(BB>$K$G$-$k$3$H!#\e(B
+
+Group Buffer Format
+
+* Group Line Specification:: \e$(B%0%k!<%W%P%C%U%!$N8+$(J}$r7h$a$k!#\e(B
+* Group Modeline Specification:: \e$(B%0%k!<%W%P%C%U%!$N%b!<%I9T!#\e(B
+* Group Highlighting:: \e$(B%0%k!<%W%P%C%U%!$K$-$l$$$K?'$r$D$1$k!#\e(B
+
+Group Topics
+
+* Topic Variables:: Lisp \e$(B$G%H%T%C%/$r%+%9%?%^%$%:$9$kJ}K!!#\e(B
+* Topic Commands:: \e$(BD64JC1BPOC7?L?Na!#\e(B
+* Topic Sorting:: \e$(B%H%T%C%/KhJL!9$KJB$YBX$($k!#\e(B
+* Topic Topology:: \e$(BA4@$3&$NCO?^!#\e(B
+* Topic Parameters:: \e$(B$"$k%H%T%C%/$NA4$F$N%0%k!<%W$KE,MQ$5$l$k%Q%i%a!<%?!#\e(B
+
+Misc Group Stuff
+
+* Scanning New Messages:: Gnus \e$(B$K?7$7$$%a%C%;!<%8$,E~Ce$7$?$+$I$&$+$rJ9$/!#\e(B
+* Group Information:: \e$(B%0%k!<%W$H\e(B gnus \e$(B$K4X$9$k>pJs$H%X%k%W!#\e(B
+* Group Timestamp:: Gnus \e$(B$K:G8e$K$$$D%0%k!<%W$rFI$s$@$+$r5-O?$5$;$k!#\e(B
+* File Commands:: Gnus \e$(B$N%U%!%$%k$NFI$_=q$-!#\e(B
+
+The Summary Buffer
+
+* Summary Buffer Format:: \e$(B35N,%P%C%U%!$N304Q$r7hDj$9$k!#\e(B
+* Summary Maneuvering:: \e$(B35N,%P%C%U%!$rF0$-2s$k!#\e(B
+* Choosing Articles:: \e$(B5-;v$rFI$`!#\e(B
+* Paging the Article:: \e$(BFI$s$G$$$k5-;v$r%9%/%m!<%k$9$k!#\e(B
+* Reply Followup and Post:: \e$(B5-;v$rEj9F$9$k!#\e(B
+* Marking Articles:: \e$(B5-;v$K4{FI$d4|8B@Z$l:o=|2DG=Ey$N0u$rIU$1$k!#\e(B
+* Limiting:: \e$(B35N,%P%C%U%!$K@)8B$r2C$($k$3$H$,$G$-$k!#\e(B
+* Threading:: \e$(B%9%l%C%I$,$I$N$h$&$K:n$i$l$k$+!#\e(B
+* Sorting:: \e$(B%9%l%C%I$H5-;v$,$I$N$h$&$KJB$S$+$($i$l$k$+!#\e(B
+* Asynchronous Fetching:: Gnus \e$(B$O5-;v$r@h$K<hF@$9$k$3$H$,$G$-$k!#\e(B
+* Article Caching:: \e$(B%-%c%C%7%e$K5-;v$rCy$a$F$*$1$k!#\e(B
+* Persistent Articles:: \e$(B5-;v$r4|8B@Z$l>C5n$7$J$/$5$;$k!#\e(B
+* Article Backlog:: \e$(B4{$KFI$s$@5-;v$r;D$7$F$*$/!#\e(B
+* Saving Articles:: \e$(B5-;v$NJ]B8$r%+%9%?%^%$%:$9$kJ}K!!#\e(B
+* Decoding Articles:: Gnus \e$(B$O0lO"$N\e(B (uu)encode \e$(B$5$l$?5-;v$r07$($k!#\e(B
+* Article Treatment:: \e$(B5-;v%P%C%U%!$O$*K>$_$I$*$j$KL\Cc6lCc$K$G$-$k!#\e(B
+@c * MIME Commands:: Doing MIMEy things with the articles.
+@c * Charsets:: Character set issues.
+* Article Commands:: \e$(B5-;v%P%C%U%!$G$$$m$$$m$J$3$H$r$9$k!#\e(B
+* Summary Sorting:: \e$(B$$$m$$$m$JJ}K!$G35N,%P%C%U%!$rJB$YBX$($k!#\e(B
+* Finding the Parent:: \e$(B;R5-;v$K1g=u$,L5$$$C$F\e(B? \e$(B?F5-;v$r<hF@$7$J$5$$!#\e(B
+* Alternative Approaches:: \e$(B=i4|@_Dj$G$J$$35N,$r;H$C$FFI$`!#\e(B
+* Tree Display:: \e$(B$b$C$H;k3PE*$J%9%l%C%I$NI=<(!#\e(B
+* Mail Group Commands:: \e$(B$$$/$D$+$NL?Na$O%a!<%k%0%k!<%W$@$1$G;H$&$3$H$,$G$-$k!#\e(B
+* Various Summary Stuff:: \e$(BB>$N$I$N>l=j$K$b9g$o$J$+$C$?$b$N!#\e(B
+* Exiting the Summary Buffer:: \e$(B%0%k!<%W%P%C%U%!$KLa$k!#\e(B
+* Crosspost Handling:: \e$(B%/%m%9%]%9%H$5$l$?5-;v$,$I$N$h$&$K07$o$l$k$+!#\e(B
+* Duplicate Suppression:: \e$(B%/%m%9%]%9%H$N07$$$K<:GT$7$?$H$-$NBeBX<jCJ!#\e(B
+
+Summary Buffer Format
+
+* Summary Buffer Lines:: \e$(B35N,%P%C%U%!$,$I$N$h$&$K8+$($k$Y$-$+$r;XDj$G$-$k!#\e(B
+* To From Newsgroups:: \e$(B<+J,<+?H$NL>A0$rI=<($7$J$$J}K!!#\e(B
+* Summary Buffer Mode Line:: \e$(B%b!<%I9T$N8+$(J}$r7h$a$i$l$k!#\e(B
+* Summary Highlighting:: \e$(B35N,%P%C%U%!$r$-$l$$$GAGE($K$9$k!#\e(B
+
+Choosing Articles
+
+* Choosing Commands:: \e$(B5-;v$rA*Br$9$k$?$a$NL?Na!#\e(B
+* Choosing Variables:: \e$(B$3$l$i$NL?Na$K1F6A$r5Z$\$9JQ?t!#\e(B
+
+Reply, Followup and Post
+
+* Summary Mail Commands:: \e$(B%a!<%k$rAw$k!#\e(B
+* Summary Post Commands:: \e$(B%K%e!<%9$rAw$k!#\e(B
+* Summary Message Commands:: \e$(BB>$N%a%C%;!<%84XO"$NL?Na!#\e(B
+* Canceling and Superseding:: \e$(B!X$"$!!"$"$s$J$U$&$K8@$&$s$8$c$J$+$C$?!#!Y\e(B
+
+Marking Articles
+
+* Unread Articles:: \e$(BL$FI5-;v$X$N0u\e(B
+* Read Articles:: \e$(B4{FI5-;v$X$N0u\e(B
+* Other Marks:: \e$(B9XFIEY$K1F6A$7$J$$0u\e(B
+
+Marking Articles
+
+* Setting Marks:: \e$(B0u$NIU$1J}$H>C$7J}\e(B
+* Generic Mark Commands:: \e$(B0u$r$I$N$h$&$K%+%9%?%^%$%:$9$k$+!#\e(B
+* Setting Process Marks:: \e$(B8e$N<B9T$N$?$a$N5-;v$N0u$NIU$1J}\e(B
+
+Threading
+
+* Customizing Threading:: \e$(BJQ992DG=$J%9%l%C%I$K1F6A$9$kJQ?t\e(B
+* Thread Commands:: \e$(B35N,%P%C%U%!$G$N%9%l%C%I$K4p$E$$$?L?Na\e(B
+
+Customizing Threading
+
+* Loose Threads:: Gnus \e$(B$,L5B+G{%9%l%C%I$r=8$a$FBg$-$J%9%l%C%I$K$9$kJ}K!\e(B
+* Filling In Threads:: \e$(B%9%l%C%I$rKd$a$k\e(B
+* More Threading:: \e$(B%9%l%C%I$r$$$8$/$k$5$i$KB?$/$NJQ?t\e(B
+* Low-Level Threading:: \e$(B$3$l$G=*$o$C$?$H;W$C$?$G$7$g$&\e(B... \e$(B$G$b$"$J$?$O4V0c$C$F$$$?!*\e(B
+
+Decoding Articles
+
+* Uuencoded Articles:: \e$(B5-;v$r\e(B uuencode \e$(B$9$k!#\e(B
+* Shell Archives:: shar \e$(B5-;v$r2rE`$9$k!#\e(B
+* PostScript Files:: \e$(B%]%9%H%9%/%j%W%H$rJ,3d$9$k!#\e(B
+* Other Files:: \e$(BIaDL$NJ]B8$H\e(B binhex.
+* Decoding Variables:: \e$(B9,$;$JI|9f2=$N$?$a$NJQ?t!#\e(B
+* Viewing Files:: \e$(BI|9f2=$N7k2L$r8+$?$$!)\e(B
+
+Decoding Variables
+
+* Rule Variables:: \e$(B%U%!%$%k$,$I$N$h$&$KI=<($5$l$k$+$r7h$a$kJQ?t!#\e(B
+* Other Decode Variables:: \e$(BB>$NI|9f2=$NJQ?t!#\e(B
+* Uuencoding and Posting:: uuencode \e$(B$9$k$N$r%+%9%?%^%$%:$9$kJQ?t!#\e(B
+
+Article Treatment
+
+* Article Highlighting:: \e$(B5-;v$r2LJ*%5%i%@$N$h$&$K8+$($k$h$&$K$7$?$$!#\e(B
+* Article Fontisizing:: \e$(B6/D4$5$l$?J8$rAGE($K$9$k!#\e(B
+* Article Hiding:: \e$(BFCDj$N>pJs$O>C$75n$j$?$$$H$b;W$&!#\e(B
+* Article Washing:: \e$(B?M@8$r$b$C$H$h$/$9$k$?$/$5$s$N5$$NMx$$$?4X?t!#\e(B
+* Article Buttons:: URL \e$(B$d\e(B Message-ID \e$(B$d\e(B \e$(B%"%I%l%9$J$I$r%/%j%C%/$9$k!#\e(B
+* Article Date:: \e$(B$0$:$0$:8@$&$J!"@$3&;~$@!*\e(B
+* Article Signature:: \e$(B=pL>$C$F2?!)\e(B
+* Article Miscellanina:: \e$(BB>$N$$$m$$$m$J$b$N!#\e(B
+
+Alternative Approaches
+
+* Pick and Read:: \e$(B$^$:!"5-;v$K0u$rIU$1$F!"$=$l$+$iFI$`\e(B
+* Binary Groups:: \e$(B$9$Y$F$N5-;v$r<+F0\e(B-\e$(BI|9f2=$9$k\e(B
+
+Various Summary Stuff
+
+* Summary Group Information:: \e$(B>pJs;X8~$NL?Na!#\e(B
+* Searching for Articles:: \e$(BJ#?t5-;vL?Na!#\e(B
+* Summary Generation Commands:: \e$(B35N,%P%C%U%!$N!J:F!K:n@.!#\e(B
+* Really Various Summary Commands:: \e$(B$"$N$d$C$+$$$JB>$KE,9g$7$J$$L?Na!#\e(B
+
+The Article Buffer
+
+* Hiding Headers:: \e$(B$I$N%X%C%@!<$rI=<($9$k$+$r7h$a$k!#\e(B
+* Using MIME:: @sc{mime} \e$(B5-;v$H$7$F8+$;$k!#\e(B
+* Customizing Articles:: \e$(B5-;v$N8+1I$($r;EN)$F$k!#\e(B
+* Article Keymap:: \e$(B5-;v%P%C%U%!$G;H$($k%-!<A`:n!#\e(B
+* Misc Article:: \e$(B$=$NB>!#\e(B
+
+Composing Messages
+
+* Mail:: \e$(B%a!<%k$HJVEz!#\e(B
+* Post:: \e$(BEj9F$H%U%)%m!<%"%C%W!#\e(B
+* Posting Server:: \e$(B$I$N%5!<%P!<$rDL$7$FEj9F$9$k$Y$-$+!)\e(B
+* Mail and Post:: \e$(BF1;~$K%a!<%k$r=P$7JVEz$9$k!#\e(B
+* Archived Messages:: \e$(BAw$C$?%a%C%;!<%8$r\e(B gnus \e$(B$,Cy$a$F$*$/$H$3$m!#\e(B
+* Posting Styles:: \e$(B$"$J$?$,C/$G$"$k$+$r;XDj$9$k$h$j4JC1$JJ}K!!#\e(B
+* Drafts:: \e$(B%a%C%;!<%8$N1d4|$H5qH]$5$l$?%a%C%;!<%8!#\e(B
+* Rejected Articles:: \e$(B%5!<%P!<$,$"$J$?$N5-;v$r9%$-$G$J$$$H$-$K2?$,5/$3$k!)\e(B
+
+Select Methods
+
+* The Server Buffer:: \e$(B;v<B>e$N%5!<%P!<$r:n$C$FJT=8$9$k!#\e(B
+* Getting News:: USENET \e$(B%K%e!<%9$r\e(B gnus \e$(B$GFI$`!#\e(B
+* Getting Mail:: \e$(B8D?ME*$J%a!<%k$r\e(B gnus \e$(B$GFI$`!#\e(B
+* Browsing the Web:: \e$(B2a>j$J%&%'%V$N;q8;$+$i%a%C%;!<%8$r<hF@$9$k!#\e(B
+* Other Sources:: \e$(B%G%#%l%/%H%j!<!"%U%!%$%k!"\e(BSOUP \e$(B%Q%1%C%H$rFI$`!#\e(B
+* Combined Groups:: \e$(BJ#?t$N%0%k!<%W$r0l$D$N%0%k!<%W$K7k9g$9$k!#\e(B
+* Gnus Unplugged:: \e$(B%K%e!<%9$H%a!<%k$r%*%U%i%$%s$GFI$`!#\e(B
+
+The Server Buffer
+
+* Server Buffer Format:: \e$(B$3$N%P%C%U%!$N308+$r%+%9%?%^%$%:$G$-$k!#\e(B
+* Server Commands:: \e$(B%5!<%P!<$rA`$kL?Na!#\e(B
+* Example Methods:: \e$(B%5!<%P!<;XDj$NNc!#\e(B
+* Creating a Virtual Server:: \e$(B%;%C%7%g%s$NNc!#\e(B
+* Server Variables:: \e$(B$I$NJQ?t$r@_Dj$9$k$+!#\e(B
+* Servers and Methods:: \e$(B%5!<%P!<L>$rA*BrJ}K!$H$7$F;H$&;v$,$G$-$k!#\e(B
+* Unavailable Servers:: \e$(B@\B3$7$h$&$H;n$_$?%5!<%P!<$N$$$/$D$+$,Mn$A$F$$$k$+$b$7$l$J$$!#\e(B
+
+Getting News
+
+* NNTP:: @sc{nntp} \e$(B%5!<%P!<$+$i%K%e!<%9$rFI$`!#\e(B
+* News Spool:: \e$(B%m!<%+%k%9%W!<%k$+$i%K%e!<%9$rFI$`!#\e(B
+
+Getting Mail
+
+* Mail in a Newsreader:: \e$(B%K%e!<%9%j!<%@$G%a!<%k\e(B (\e$(BBg;v$JA0CV$-\e(B)\e$(B!#\e(B
+* Getting Started Reading Mail:: \e$(B4JC1$JNAM}K\$N$h$&$JNc!#\e(B
+* Splitting Mail:: \e$(B$I$N$h$&$K%a!<%k%0%k!<%W$r:n@.$9$k$+!#\e(B
+* Mail Sources:: Gnus \e$(B$K$I$3$+$i%a!<%k$r<h$C$F$/$k$+$rCN$i$;$k!#\e(B
+* Mail Backend Variables:: \e$(B%a!<%k$N07$$$r%+%9%?%^%$%:$9$k$?$a$NJQ?t!#\e(B
+* Fancy Mail Splitting:: Gnus \e$(B$OF~$C$FMh$?%a!<%k$NLS$N$h$&$JJ,N%$r$9$k$3$H$,$G$-$k!#\e(B
+* Group Mail Splitting:: \e$(B%a!<%kJ,3d$r6nF0$9$k$?$a$K%0%k!<%W\e(B
+ \e$(B%+%9%?%^%$%:$r;H$&!#\e(B
+* Incorporating Old Mail:: \e$(B$"$J$?$,;}$C$F$$$k8E$$%a!<%k$r$I$&$9$k$+\e(B?
+* Expiring Mail:: \e$(BM_$7$/$J$$%a!<%k$r<h$j=|$/!#\e(B
+* Washing Mail:: \e$(B<hF@$7$?%a!<%k$+$i7y$J$b$N$r<h$j=|$/!#\e(B
+* Duplicates:: \e$(B=EJ#$7$?%a!<%k$r07$&!#\e(B
+* Not Reading Mail:: \e$(BB>$N%U%!%$%k$rFI$`$?$a$K%a!<%k%P%C%/%(%s%I$r;H$&!#\e(B
+* Choosing a Mail Backend:: Gnus \e$(B$O?'!9$J%a!<%kMM<0$rFI$`;v$,$G$-$k!#\e(B
+
+Mail Sources
+
+* Mail Source Specifiers:: \e$(B%a!<%k$N85$,$I$3$+$r;XDj$9$k!#\e(B
+* Mail Source Customization:: \e$(B@$$NCf$K1F6A$9$k$$$/$D$+$NJQ?t!#\e(B
+* Fetching Mail:: \e$(B%a!<%k%=!<%9;X<(;R$r;HMQ$9$k!#\e(B
+
+Choosing a Mail Backend
+
+* Unix Mail Box:: (\e$(B$H$F$b\e(B) \e$(BI8=`E*$J\e(B Un*x mbox \e$(B$r;H$&!#\e(B
+* Rmail Babyl:: Emacs \e$(B$N%W%m%0%i%`$O\e(B rmail \e$(B$N\e(B babyl format \e$(B$r;H$&!#\e(B
+* Mail Spool:: \e$(B$"$J$?$N%a!<%k$r;dE*$J%9%W!<%k$KN/$a$k!)\e(B
+* MH Spool:: mhspool \e$(B$N$h$&$J%P%C%/%(%s%I!#\e(B
+* Mail Folders:: \e$(B$=$l$>$l$N%0%k!<%W$KBP$7$F0l$D$N%U%!%$%k$r;}$D!#\e(B
+* Comparing Mail Backends:: \e$(BF@<:$N?<$$F6;!!#\e(B
+
+Browsing the Web
+
+* Web Searches:: \e$(BJ8;zNs$K%^%C%A$9$k5-;v$+$i%0%k!<%W$r:n$k!#\e(B
+* Slashdot:: Slashdot \e$(B$N%3%a%s%H$rFI$`!#\e(B
+* Ultimate:: Ultimate Bulletin Board \e$(B%7%9%F%`\e(B.
+* Web Archive:: \e$(B%&%'%V$KJ]4I$5$l$?%a!<%j%s%0%j%9%H$rFI$`!#\e(B
+* Customizing w3:: Gnus \e$(B$+$i\e(B Emacs/w3 \e$(B$rA`:n$9$k!#\e(B
+
+Other Sources
+
+* Directory Groups:: \e$(B%G%#%l%/%H%j!<$r%K%e!<%9%0%k!<%W$N$h$&$KFI$`!#\e(B
+* Anything Groups:: Dired? \e$(BC/$,\e(B dired \e$(B$J$s$F;H$&$N\e(B?
+* Document Groups:: \e$(B8DJL$N%U%!%$%k72$O%0%k!<%W$NAG!#\e(B
+* SOUP:: @sc{soup} \e$(B%Q%1%C%H$r\e(B ``\e$(B%*%U%i%$%s\e(B''\e$(B$GFI$`!#\e(B
+* Mail-To-News Gateways:: \e$(B%a!<%k$+$i%K%e!<%9$X$N%2!<%H%&%'%$$rDL$7$F5-;v$rEj9F$9$k!#\e(B
+* IMAP:: Gnus \e$(B$r\e(B IMAP \e$(B$N%/%i%$%"%s%H$H$7$F;H$&!#\e(B
+
+Document Groups
+
+* Document Server Internals:: \e$(B$"$J$?FH<+$NJ8=q<oJL$rDI2C$9$kJ}K!!#\e(B
+
+SOUP
+
+* SOUP Commands:: @sc{soup} \e$(B%Q%1%C%H$r:n@.!"Aw=P$9$kL?Na!#\e(B
+* SOUP Groups:: @sc{soup} \e$(B%Q%1%C%H$rFI$`%P%C%/%(%s%I!#\e(B
+* SOUP Replies:: @code{nnsoup} \e$(B$K%a!<%k$H%K%e!<%9$r0z$-7Q$,$;$kJ}K!!#\e(B
+
+IMAP
+
+* Splitting in IMAP:: nnimap \e$(B$G%a!<%k$rJ,3d$9$k\e(B.
+* Editing IMAP ACLs:: \e$(B%a!<%k%\%C%/%9$X$NB>$NMxMQ<T$N;HMQ$r@)8B\e(B/\e$(B5v2D\e(B
+ \e$(B$9$k\e(B.
+* Expunging mailboxes:: "\e$(B%a!<%k%\%C%/%905=L\e(B" \e$(B%\%?%s$HEy2A$J$b$N\e(B.
+
+Combined Groups
+
+* Virtual Groups:: \e$(B$?$/$5$s$N%0%k!<%W$N5-;v$r7k9g$9$k!#\e(B
+* Kibozed Groups:: \e$(B%K%e!<%9%9%W!<%k$NCf$+$i$N5-;v$r8!:w$9$k!#\e(B
+
+Gnus Unplugged
+
+* Agent Basics:: \e$(B$3$l$i$O$I$&F0$/$N$+!#\e(B
+* Agent Categories:: \e$(B2?$r%@%&%s%m!<%I$9$k$+$r\e(B gnus \e$(B%(!<%8%'%s%H$K65$($kJ}K!!#\e(B
+* Agent Commands:: \e$(B3F%P%C%U%!!<$G$N?7$7$$L?Na!#\e(B
+* Agent Expiry:: \e$(B8E$$5-;v$r>C$9J}K!!#\e(B
+* Outgoing Messages:: \e$(BEj9F!"%a!<%k$r=P$9$H$-$K$J$K$,5/$3$k$N$+\e(B?
+* Agent Variables:: \e$(B%+%9%?%^%$%:$O3Z$7!#\e(B
+* Example Setup:: \e$(B%*%U%i%$%s?M4V$N$?$a$N\e(B @file{.gnus.el} \e$(B$NNc!#\e(B
+* Batching Agents:: @code{cron} \e$(B%8%g%V$K$h$k%K%e!<%9<hF@J}K!!#\e(B
+* Agent Caveats:: \e$(B$"$J$?$,M=A[$9$k$3$H$H!"$=$l$,<B:]$K$9$k$3$H!#\e(B
+* Control Agents:: Offline \e$(B$r%3%s%H%m!<%k$9$k\e(B gnus-offline
+
+Agent Categories
+
+* Category Syntax:: \e$(BJ,N`$H$O$I$s$J$b$N$+!#\e(B
+* The Category Buffer:: \e$(BJ,N`$r4IM}$9$k%P%C%U%!!<!#\e(B
+* Category Variables:: \e$(B%+%9%?%^%$%6\e(B"\e$(B$i\e(B"\e$(B%9\e(B
+
+Agent Commands
+
+* Group Agent Commands::
+* Summary Agent Commands::
+* Server Agent Commands::
+
+Scoring
+
+* Summary Score Commands:: \e$(B8=:_$N%0%k!<%W$N$?$a$N%9%3%"EPO?$rDI2C$9$k!#\e(B
+* Group Score Commands:: \e$(B0lHLE*$J%9%3%"L?Na!#\e(B
+* Score Variables:: \e$(B$"$J$?$N%9%3%"$r%+%9%?%^%$%:$9$k!#\e(B
+ (\e$(B$^$!!"$J$s$FMQ8l$G$7$g$&\e(B)\e$(B!#\e(B
+* Score File Format:: \e$(B%9%3%"%U%!%$%k$K2?$rF~$l$k$+!#\e(B
+* Score File Editing:: \e$(B<j$G%9%3%"%U%!%$%k$rJT=8$9$k;v$b$G$-$k!#\e(B
+* Adaptive Scoring:: \e$(BBg;P\e(B gnus \e$(B$O$"$J$?$,2?$rFI$s$@$+CN$C$F$$$k!#\e(B
+* Home Score File:: \e$(B?7$7$$%9%3%"EPO?$,$I$3$X9T$/$+$r$I$N$h$&$K;XDj$9$k$+!#\e(B
+* Followups To Yourself:: \e$(B?M$,$"$J$?$KJVEz$7$?$H$-$K\e(B gnus \e$(B$K5$IU$+$;$k!#\e(B
+* Scoring Tips:: \e$(B$I$&$d$C$F8z2LE*$K%9%3%"$rIU$1$k$+!#\e(B
+* Reverse Scoring:: \e$(B8E$$$b$N$N;R$G$"$k$H$$$&LdBj$OLdBj$G$O$J$$!#\e(B
+* Global Score Files:: \e$(BCO$r$D$+$_!"<*$r@Z$jNv$/%9%3%"%U%!%$%k!#\e(B
+* Kill Files:: \e$(B$=$l$i$O$^$@$3$3$K$"$j$^$9$,!"L5;k$9$k;v$,$G$-$k!#\e(B
+* Converting Kill Files:: \e$(B:o=|%U%!%$%k$r%9%3%"%U%!%$%k$KJQ49$9$k!#\e(B
+* GroupLens:: \e$(B$I$l$rFI$`$N$,9%$-$+$NM=8@$rF@$k!#\e(B
+* Advanced Scoring:: \e$(B%9%3%"$NK!B'$r:n$k$?$a$KO@M}I=8=$r;H$&!#\e(B
+* Score Decays:: \e$(B%9%3%"$r8O$l$F$$$+$;$k$N$OLr$KN)$D;v$b$"$k!#\e(B
+
+GroupLens
+
+* Using GroupLens:: \e$(B$I$N$h$&$K\e(B gnus \e$(B$K\e(B GroupLens \e$(B$r;H$o$;$k$h$&\e(B
+ \e$(B$K$9$k$+!#\e(B
+* Rating Articles:: GropLens \e$(B$K$"$J$?$,$I$N$h$&$KCM$rIU$1$k$+$r\e(B
+ \e$(BCN$i$;$k!#\e(B
+* Displaying Predictions:: GropuLens \e$(B$K$h$C$FM?$($i$l$?M=8@$rI=<($9$k!#\e(B
+* GroupLens Variables:: GoupLens \e$(B$r%+%9%?%^%$%:$9$k!#\e(B
+
+Advanced Scoring
+
+* Advanced Scoring Syntax:: \e$(BDj5A!#\e(B
+* Advanced Scoring Examples:: \e$(B$I$N$h$&$K8+$($k$+!#\e(B
+* Advanced Scoring Tips:: \e$(B$=$l$r:GBg8BMxMQ$9$k!#\e(B
+
+Various
+
+* Process/Prefix:: \e$(BB?$/$N07$$L?Na$G;H$o$l$k=,47!#\e(B
+* Interactive:: Gnus \e$(B$KB?$/$N<ALd$r?R$M$5$;$k!#\e(B
+* Symbolic Prefixes:: \e$(B$$$/$D$+$N\e(B gnus \e$(B$N4X?t$KA*Br8"$rDs6!$9$kJ}K!!#\e(B
+* Formatting Variables:: \e$(B%P%C%U%!$,$I$N$h$&$K8+$($k$Y$-$+$r;XDj$9$k;v$,$G$-$k!#\e(B
+* Windows Configuration:: Gnus \e$(B%P%C%U%!%&%#%s%I%&$r@_Dj$9$k!#\e(B
+* Faces and Fonts:: \e$(B%U%'%$%9$,$I$N$h$&$K8+$($k$+$rJQ99$9$k!#\e(B
+* Compilation:: \e$(B$I$N$h$&$K$7$F\e(B gnus \e$(B$NB.EY$r>e$2$k$+!#\e(B
+* Mode Lines:: \e$(B%b!<%I9T$K>pJs$rI=<($9$k!#\e(B
+* Highlighting and Menus:: \e$(B%P%C%U%!$rAGE($G?4CO$h$/8+$;$k!#\e(B
+* Buttons:: \e$(B4JC1$J\e(B10\e$(BJb$G%"%-%l%9g'$rF@$k!#\e(B
+* Daemons:: Gnus \e$(B$O$"$J$?$NN"$GJ*;v$r<B9T$9$k;v$,$G$-$k!#\e(B
+* NoCeM:: Spam \e$(B$dB>$NB@$j$d$9$$?);v$rHr$1$kJ}K!!#\e(B
+* Undo:: \e$(B$$$/$D$+$NF0:n$O85$KLa$9;v$,$G$-$k!#\e(B
+* Moderation:: \e$(B$"$J$?$,%b%G%l!<%?!<$@$C$?$i$I$&$9$k$+!#\e(B
+* XEmacs Enhancements:: XEmacs \e$(B$G$O$b$C$H3($d$=$NB>$N$b$N$,B8:_$9$k!#\e(B
+* Fuzzy Matching:: \e$(BBg$-$JLJLS$C$F2?!)\e(B
+* Thwarting Email Spam:: \e$(BM>7W$J>&6HE*EE;R%a!<%k$rHr$1$kJ}K!!#\e(B
+* Various Various:: \e$(BK\Ev$K$$$m$$$m$J$b$N!#\e(B
+
+Formatting Variables
+
+* Formatting Basics:: \e$(B=qK!;EMMJQ?t$O4pK\E*$K=qK!;XDjJ8;zNs$G$"$k!#\e(B
+* Mode Line Formatting:: \e$(B%b!<%I9T$N=qK!;EMMJQ?t$K4X$9$k$$$/$D$+$N5,B'!#\e(B
+* Advanced Formatting:: \e$(B?'!9$JJ}K!$G=PNO$r=$@5$9$k!#\e(B
+* User-Defined Specs:: Gnus \e$(B$K$"$J$?<+?H$N4X?t$r8F$P$;$k!#\e(B
+* Formatting Fonts:: \e$(B;EMM$rB?:L$GAGE($K8+$;$k!#\e(B
+
+XEmacs Enhancements
+
+* Picons:: \e$(B$"$J$?$,FI$s$G$$$k$b$N$N3($rI=<($9$kJ}K!!#\e(B
+* Smileys:: \e$(BI=<($5$l$k$Y$/@8$^$l$?9,$;$=$&$J4i$rI=<($9$kJ}K!!#\e(B
+* Toolbar:: \e$(B%/%j%C%/1n!#\e(B
+* XVarious:: \e$(B$=$NB>$N\e(B XEmacs \e$(B$G\e(B Gnus \e$(B$JJQ?t!#\e(B
+
+Picons
+
+* Picon Basics:: picon \e$(B$H$O2?$G!"$I$&$d$C$F<j$KF~$l$k$N$+!#\e(B
+* Picon Requirements:: XEmacs \e$(B$r;H$C$F$J$1$l$P$3$3$+$i$OFI$^$J$$$G!#\e(B
+* Easy Picons:: picon \e$(B$NI=<(\e(B --- \e$(B3Z$JJ}K!!#\e(B
+* Hard Picons:: \e$(BK\Mh$9$Y$-$3$H!#2?$+$r3X$V$3$H$,$G$-$k$@$m$&!#\e(B
+* Picon Useless Configuration:: \e$(B$=$NB>$N$V$C2u$7$?$j$R$M$C$?$j$$$8$C$?$jM7$s$@$j$9$kJQ?t!#\e(B
+
+Appendices
+
+* History:: \e$(B$I$&$d$C$F\e(B gnus \e$(B$,:#F|$N$h$&$K$J$C$?$+!#\e(B
+* On Writing Manuals:: \e$(B$J$<$3$l$,=i?4<TMQ$N0FFb$G$J$$$+!#\e(B
+* Terminology:: \e$(B2f!9$OK\Ev$KFq$7$$!"8l$N$h$&$J8l$r;H$&!#\e(B
+* Customization:: \e$(B$"$J$?$NMW5a$K1h$C$F\e(B gnus \e$(B$r;EN)$F$k!#\e(B
+* Troubleshooting:: \e$(B>e<j$/9T$+$J$+$C$?$H$-$K;n$9$+$b$7$l$J$$;v!#\e(B
+* Gnus Reference Guide:: \e$(B?'!9$J5;=QE*$J$b$N!#\e(B
+* Emacs for Heathens:: Emacs \e$(B$NMQ8l$N<jC;$JF3F~!#\e(B
+* Frequently Asked Questions:: \e$(B<ALd$HEz!#\e(B
+
+History
+
+* Gnus Versions:: What Gnus versions have been released.
+* Other Gnus Versions:: Other Gnus versions that also have been released.
+* Why?:: Gnus \e$(B$NL\E*$O2?!)\e(B
+* Compatibility:: Gnus \e$(B$O\e(B @sc{gnus} \e$(B$H$I$l$/$i$$8_49@-$,$"$k$N!)\e(B
+* Conformity:: Gnus \e$(B$OA4$F$NI8=`$rK~$?$=$&$H$9$k!#\e(B
+* Emacsen:: Gnus \e$(B$O$$$/$D$+$N8=BeE*$J\e(B Emacs \e$(B4D6-$G<B9T$G$-$k!#\e(B
+* Gnus Development:: Gnus \e$(B$,3+H/$5$l$F$$$kJ}K!!#\e(B
+* Contributors:: \e$(BBgNL$N?M!9!#\e(B
+* New Features:: Gnus \e$(B$N?7$7$$;v$K4X$9$k<j$,$+$j!#\e(B
+* Newest Features:: \e$(B$"$^$j$K$b?7$7$$$?$a$K$^$@=q$+$l$F$$$J$$$b$N!#\e(B
+
+New Features
+
+* ding Gnus:: \e$(B:G=i$N?7$7$$\e(B Gnus \e$(B$G$"$k\e(B Gnus 5.0/5.1 \e$(B$N?7$7$$;v!#\e(B
+* September Gnus:: \e$(B8x<0$K\e(B GNus 5.2/5.3 \e$(B$H$7$FCN$i$l$F$$$k$b$N!#\e(B
+* Red Gnus:: 3\e$(BHVL\$N:G>e$N$b$N\e(B---Gnus 5.4/5.5
+* Quassia Gnus:: 2\e$(B$+$1$k\e(B2\e$(B$O\e(B4\e$(B!"$b$7$/$O\e(B Gnus 5.6/5.7\e$(B!#\e(B
+
+Customization
+
+* Slow/Expensive Connection:: \e$(B%m!<%+%k$N\e(B Emacs \e$(B$rN)$A>e$2$F!"\e(B
+ \e$(BB>$N$H$3$m$+$i%K%e!<%9$rF@$k;v$,$G$-$k!#\e(B
+* Slow Terminal Connection:: \e$(B1s3V\e(B Emacs \e$(B$r<B9T$9$k!#\e(B
+* Little Disk Space:: \e$(BBg$-$J5/F0%U%!%$%k$r;}$D;v$O$^$:$$!#\e(B
+* Slow Machine:: \e$(BB.$$5!3#$rGc$*$&$H46$8$k$G$"$m$&!#\e(B
+
+Gnus Reference Guide
+
+* Gnus Utility Functions:: \e$(B;HMQ$G$-$k6&DL$N4X?t$HJQ?t!#\e(B
+* Backend Interface:: Gnus \e$(B$O$I$&$d$C$F%5!<%P!<$HDL?.$9$k$N$+!#\e(B
+* Score File Syntax:: \e$(B%9%3%"%U%!%$%k5,3J$N\e(B BNF \e$(BDj5A!#\e(B
+* Headers:: Gnus \e$(B$O%X%C%@!<$rFbItE*$K$I$N$h$&$K3JG<$9$k$+!#\e(B
+* Ranges:: \e$(B$?$/$5$s$N?t$r3JG<$9$kJXMx$J7A<0!#\e(B
+* Group Info:: \e$(B%0%k!<%W>pJs7A<0!#\e(B
+* Extended Interactive:: \e$(B5-9f@\F,<-$J$I!#\e(B
+* Emacs/XEmacs Code:: Gnus \e$(B$OA4$F$N6aBe\e(B Emacsen \e$(B$GF0:n$9$k!#\e(B
+* Various File Formats:: Gnus \e$(B$N;HMQ$9$k%U%!%$%k$N7A<0!#\e(B
+
+Backend Interface
+
+* Required Backend Functions:: \e$(B<BAu$7$J$1$l$P$J$i$J$$4X?t!#\e(B
+* Optional Backend Functions:: \e$(B<BAu$7$J$/$F$b$h$$4X?t!#\e(B
+* Error Messaging:: \e$(B%a%C%;!<%8$d%(%i!<Js9p$rF@$kJ}K!!#\e(B
+* Writing New Backends:: \e$(B8E$$%P%C%/%(%s%I$N3HD%!#\e(B
+* Hooking New Backends Into Gnus:: Gnus \e$(BB&$G$7$J$1$l$P$J$i$J$$$3$H!#\e(B
+* Mail-like Backends:: \e$(B%a!<%kIw%P%C%/%(%s%I$N$?$a$N=u8@\e(B
+
+Various File Formats
+
+* Active File Format:: \e$(B;HMQ2DG=$J5-;v%0%k!<%W$N>pJs!#\e(B
+* Newsgroups File Format:: \e$(B%0%k!<%W$N5-=R!#\e(B
+
+Emacs for Heathens
+
+* Keystrokes:: \e$(BJ8>O$rF~NO$7$FL?Na$r<B9T$9$k!#\e(B
+* Emacs Lisp:: \e$(BHw$(IU$1$N\e(B Emacs \e$(B%W%m%0%i%_%s%08@8l!#\e(B
+
+@end detailmenu
@end menu
@node Starting Up
\e$(B$O$=$l$h$j>.$5$$!K%l%Y%k$N%0%k!<%W$K0\F0$7$^$9!#$3$l$O;D$j$N%0%k!<%W$rFI$`\e(B
\e$(B$h$j@h$K!"$h$j=EMW$J%0%k!<%W$rFI$s$G$*$-$?$$$H$-$K$OJXMx$+$b$7$l$^$;$s!#\e(B
+\e$(B$b$7$3$NCM$,\e(B @code{best} \e$(B$@$C$?$i!":G$b=EMW$J\e(B (\e$(B:G$b%l%Y%k$NCM$,>.$5$$\e(B)
+\e$(B%0%k!<%W$K0\F0$7$^$9!#\e(B
+
@vindex gnus-group-default-list-level
\e$(B=i4|@_Dj$G$O\e(B @code{gnus-group-default-list-level} \e$(B$HF1$8$+$=$l\e(B
\e$(B$h$j>.$5$$%l%Y%k$N%0%k!<%W$,!"%0%k!<%W%P%C%U%!$K0lMwI=<($5$l$^$9!#\e(B
@kindex W W l (Summary)
@findex gnus-article-hide-list-identifiers
@vindex gnus-list-identifiers
-@code{gnus-list-identifiers} \e$(B$G;XDj$5$l$F$$$k%a!<%j%s%0%j%9%H$NI8<1$r1#\e(B
-\e$(B$7$^$9!#$3$l$i$O$$$/$D$+$N%j%9%H$N%5!<%P!<$,A4$F$N\e(B @code{Subject} \e$(B%X%C%@!<\e(B
-\e$(B$N:G=i$K$D$1$kJ8;zNs$G$9\e(B---\e$(BNc$($P!"\e(B@samp{[zebra 4711]}\e$(B!#\e(B
+@code{gnus-list-identifiers} \e$(B$G;XDj$5$l$F$$$k%a!<%j%s%0%j%9%H$NI8<1$r:o\e(B
+\e$(B=|$7$^$9!#$3$l$i$O$$$/$D$+$N%a!<%j%s%0%j%9%H$N%5!<%P!<$,A4$F$N\e(B
+@code{Subject} \e$(B%X%C%@!<$N:G=i$K$D$1$kJ8;zNs$G$9\e(B---\e$(BNc$($P!"\e(B
+@samp{[zebra 4711]}\e$(B!#J8;zNs$N=i$a$K$"$k\e(B @samp{Re: } \e$(B$O!":o=|$r9T$J$&A0$K\e(B
+\e$(BD7$S1[$5$l$^$9!#\e(B
@table @code
@end table
@vindex gnus-exit-group-hook
-\e$(B8=:_$N%0%k!<%W$rH4$1$k$H$-$K\e(B @code{gnus-exit-group-hook} \e$(B$,8F$P$l$^$9!#\e(B
+\e$(B8=:_$N%0%k!<%W$r!"%0%k!<%W$NA4$F$N>pJs$r99?7$7$FH4$1$k$H$-$K\e(B
+@code{gnus-exit-group-hook} \e$(B$,8F$P$l$^$9!#\e(B
+@kbd{Q} \e$(BL?Na\e(B (@code{gnus-summary-exit-no-update}) \e$(B$G$O!"$3$N%U%C%/$r8F$S\e(B
+\e$(B$^$;$s!#\e(B
@findex gnus-summary-wake-up-the-dead
@findex gnus-dead-summary-mode
(add-hook 'message-send-hook 'ispell-message)
@end lisp
+\e$(B$b$7$"$J$?$,\e(B @code{ispell} \e$(B$N<-=q$r%0%k!<%W$K1~$8$F@Z$jBX$($?$$$J$i$P!"\e(B
+\e$(B0J2<$N$h$&$K$9$l$PNI$$$G$7$g$&!#\e(B
+
+@lisp
+(add-hook 'gnus-select-group-hook
+ (lambda ()
+ (cond
+ ((string-match "^de\\." gnus-newsgroup-name)
+ (ispell-change-dictionary "deutsch"))
+ (t
+ (ispell-change-dictionary "english")))))
+@end lisp
+
+\e$(B$"$J$?$NI,MW$K1~$8$FJQ99$7$F2<$5$$!#\e(B
+
@node Archived Messages
@section \e$(B%a%C%;!<%8$NJ]4I\e(B
(signature my-quote-randomizer))
((message-news-p)
(signature my-news-signature))
- ((header "From.*To" "larsi.*org")
+ (header "From.*To" "larsi.*org"
(Organization "Somewhere, Inc."))
((posting-from-work-p)
(signature-file "~/.work-signature")
IMAP \e$(B%a!<%k%=!<%9$NNc\e(B:
@lisp
-(imap :server "mail.mycorp.com" :stream kerberos4)
+(imap :server "mail.mycorp.com" :stream kerberos4 :fetchflag "\\Seen")
@end lisp
@item webmail
* Slashdot:: Slashdot \e$(B$N%3%a%s%H$rFI$`!#\e(B
* Ultimate:: Ultimate Bulletin Board \e$(B%7%9%F%`\e(B.
* Web Archive:: \e$(B%&%'%V$KJ]4I$5$l$?%a!<%j%s%0%j%9%H$rFI$`!#\e(B
+* Customizing w3:: Gnus \e$(B$+$i\e(B Emacs/w3 \e$(B$rA`:n$9$k!#\e(B
@end menu
+\e$(B$9$Y$F$N%&%'%V%=!<%9$O!"F0:n$5$;$k$?$a$K\e(B Emacs/w3 \e$(B$H\e(B url \e$(B%i%$%V%i%j$,I,\e(B
+\e$(BMW$G$9!#\e(B
+
\e$(B$3$l$i$N%&%'%V%=!<%9$N0lHV$NLdBj$OD94|4V$OF0:n$7$J$$2DG=@-$,9b$$$3$H$G$9!#\e(B
@sc{html} \e$(B%G!<%?$+$i>pJs$r=8$a$k$N$O$;$$$<$$?dB,$G!"9=B$$,JQ2=$7$?$H$-$K\e(B
\e$(B$O!"\e(Bgnus \e$(B%P%C%/%(%s%I$OF0:n$7$^$;$s!#$G$b!"$"$kDxEY?7$7$$%P!<%8%g%s$N%P%C\e(B
@samp{~/News/ultimate/} \e$(B$G$9!#\e(B
@end table
+
@node Web Archive
@subsection Web Archive
@cindex nnwarchive
\e$(B%&%'%V%5!<%P!<$G$N%"%+%&%s%H$N%Q%9%o!<%I$G$9!#\e(B
@end table
+
+@node Customizing w3
+@subsection w3 \e$(B$N%+%9%?%^%$%:\e(B
+@cindex w3
+@cindex html
+@cindex url
+@cindex Netscape
+
+Gnus \e$(B$O%&%'%V%Z!<%8$r<hF@$9$k$?$a$K\e(B url \e$(B%i%$%V%i%j$r!"%&%'%V%Z!<%8$rI=<(\e(B
+\e$(B$9$k$?$a$K\e(B Emacs/w3 \e$(B$r;H$$$^$9!#\e(BEmacs/w3 \e$(B$N$3$H$O$=$N%^%K%e%"%k$K5-:\$5\e(B
+\e$(B$l$F$$$^$9$,!"$3$3$G$O\e(B Gnus \e$(B$N%f!<%6$K$H$C$F$h$jE,@Z$J$$$/$D$+$N;vJA$r=R\e(B
+\e$(B$Y$k$3$H$K$7$^$9!#\e(B
+
+\e$(BNc$($P!"$h$/$"$k<ALd$K\e(B Emacs/w3 \e$(B$K\e(B @code{browse-url} \e$(B$N5!G=\e(B (Netscape \e$(B$N\e(B
+\e$(B$h$&$J30It%W%i%&%6!<$r;H$&$h$&$K@_Dj$5$l$F$$$k\e(B) \e$(B$r;H$C$F%j%s%/$r;2>H$5$;\e(B
+\e$(B$k$K$O$I$&$7$?$i$h$$$+!"$H$$$&$N$,$"$j$^$9!#0J2<$O0l$D$NJ}K!$G$9!#\e(B
+
+@lisp
+(eval-after-load "w3"
+ '(progn
+ (fset 'w3-fetch-orig (symbol-function 'w3-fetch))
+ (defun w3-fetch (&optional url target)
+ (interactive (list (w3-read-url-with-default)))
+ (if (eq major-mode 'gnus-article-mode)
+ (browse-url url)
+ (w3-fetch-orig url target)))))
+@end lisp
+
+\e$(B$3$l$r$"$J$?$N\e(B .emacs \e$(B%U%!%$%k$K=q$-9~$`$3$H$K$h$C$F!"\e(BGnus \e$(B$N5-;v%P%C%U%!\e(B
+\e$(B$G\e(B @sc{html} \e$(B%j%s%/$rC!$1$P!"\e(B@code{browse-url} \e$(B$r;H$C$F$=$N%j%s%/$r;2>H\e(B
+\e$(B$9$k$h$&$K$J$k$G$7$g$&!#\e(B
+
+
@node Other Sources
@section \e$(B$=$NB>$N%0%k!<%W8;\e(B
@item nnimap-stream
@vindex nnimap-stream
-\e$(B%5!<%P!<$K@\B3$9$k$H$-$K;H$o$l$k%9%H%j!<%`$N7?$G$9!#=i4|@_Dj$G$O!"\e(Bnnimap
-\e$(B$O%5!<%P!<$,BP1~$7$($$$k0lHV0BA4$J%9%H%j!<%`$r;H$$$^$9!#\e(B
+\e$(B%5!<%P!<$K@\B3$9$k$H$-$K;H$o$l$k%9%H%j!<%`$N7?$G$9!#=i4|@_Dj$G$O\e(B nnimap
+\e$(B$O\e(B SSL \e$(B$r=|$/0J2<$N$9$Y$F$r<+F0E*$K8!CN$7$F$=$l$r;H$$$^$9!#\e(B
+(SSL \e$(B$O\e(B STARTTLS \e$(B$GCV$-49$($i$l$F$$$^$9!#$3$l$O<+F08!=P$G$-$^$9$,!"$^$@\e(B
+\e$(B9-HO0O$KG[Hw$5$l$F$$$^$;$s!#\e(B)
@itemize @bullet
@item
-@dfn{kerberos4:} `imtest' \e$(B%W%m%0%i%`$r;H$$$^$9!#\e(B
+@dfn{gssapi:} GSSAPI (\e$(BIaDL$O\e(B kerberos 5) \e$(B$r;H$$$^$9!#\e(B@samp{imtest} \e$(B%W%m\e(B
+\e$(B%0%i%`$,I,MW$G$9!#\e(B
+@item
+@dfn{kerberos4:} kerberos 4 \e$(B$r;H$$$^$9!#\e(B@samp{imtest} \e$(B%W%m%0%i%`$,I,MW$G\e(B
+\e$(B$9!#\e(B
+@item
+@dfn{starttls:} STARTTLS (SSL \e$(B$KN`;w\e(B) \e$(B$r;H$$$^$9!#30It%i%$%V%i%j\e(B
+@samp{starttls.el} \e$(B$H\e(B @samp{starttls} \e$(B%W%m%0%i%`$,I,MW$G$9!#\e(B
@item
-@dfn{ssl:} OpenSSL \e$(B$+\e(B SSLeay \e$(B$r;H$$$^$9!#\e(B
+@dfn{ssl:} SSL \e$(B$r;H$$$^$9!#\e(BOpenSSL (@samp{openssl} \e$(B%W%m%0%i%`\e(B) \e$(B$+\e(B SSLeay
+(@samp{s_client}) \e$(B$,I,MW$G$9!#\e(B
@item
@dfn{network:} \e$(B@8$N!"\e(BTCP/IP \e$(B$N%M%C%H%o!<%/@\B3$G$9!#\e(B
@end itemize
+@samp{imtest} \e$(B%W%m%0%i%`$O\e(B Cyrus IMAPD \e$(B$K4^$^$l$F$$$^$9!#\e(Bnnimap \e$(B$O\e(B
+@samp{imtest} \e$(B%P!<%8%g%s\e(B 1.5.x \e$(B$H\e(B 1.6.x \e$(B$NN>J}$r%5%]!<%H$7$^$9!#\e(B
+
+SSL \e$(B@\B3$N$?$a$N\e(B OpenSSL \e$(B%W%m%0%i%`$O\e(B @file{http://www.openssl.org/} \e$(B$+\e(B
+\e$(B$iF~<j$G$-$^$9!#\e(BOpenSSL \e$(B$O0JA0$O\e(B SSLeay \e$(B$H$7$FCN$i$l$F$$$?$b$N$G!"\e(Bnnimap
+\e$(B$O$=$l$b%5%]!<%H$7$^$9!#$7$+$7!"\e(BSSLeay \e$(B$N:G?7HG$G$"$k\e(B 0.9.x \e$(B$K$O=EBg$J%P\e(B
+\e$(B%0$,$"$k$?$a;H$($^$;$s!#0JA0$NHG!"FC$K\e(B SSLeay 0.8.x \e$(B$O;H$($k$3$H$,$o$+$C\e(B
+\e$(B$F$$$^$9!#\e(B
+
@item nnimap-authenticator
@vindex nnimap-authenticator
@itemize @bullet
@item
-@dfn{kerberos4:} Kerberos \e$(BG'>Z$G$9!#\e(B
+@dfn{gssapi:} GSSAPI (\e$(BIaDL$O\e(B kerberos 5) \e$(BG'>Z$G$9!#30It%W%m%0%i%`\e(B
+@code{imtest} \e$(B$,I,MW$G$9!#\e(B
+@item
+@dfn{kerberos4:} Kerberos \e$(BG'>Z$G$9!#30It%W%m%0%i%`\e(B @code{imtest} \e$(B$,I,MW\e(B
+\e$(B$G$9!#\e(B
+@item
+@dfn{digest-md5:} DIGEST-MD5 \e$(B$G0E9f2=$5$l$?\e(B \e$(BMxMQ<TL>\e(B/\e$(B%Q%9%o!<%I\e(B \e$(B$G$9!#30\e(B
+\e$(BIt%i%$%V%i%j\e(B @code{digest-md5.el} \e$(B$,I,MW$G$9!#\e(B
@item
@dfn{cram-md5:} CRAM-MD5 \e$(B$G0E9f2=$5$l$?\e(B \e$(BMxMQ<TL>\e(B/\e$(B%Q%9%o!<%I\e(B \e$(B$G$9!#\e(B
@item
Nnmail \e$(B$GBP1~$9$k$b$N\e(B: @code{nnmail-split-methods}.
+@item nnimap-split-predicate
+@cindex splitting
+@vindex nnimap-split-predicate
+
+\e$(B$3$N=R8l$K%^%C%A$9$k\e(B @code{nnimap-split-inbox} \e$(B$K$"$k%a!<%k$OJ,3d$5$l$^\e(B
+\e$(B$9!#$3$l$OJ8;zNs$G4{DjCM$O\e(B @samp{UNSEEN UNDELETED} \e$(B$G$9!#\e(B
+
+\e$(B$b$7$"$J$?$,\e(B inbox \e$(B$K$"$k%a!<%k$rFI$`$?$a$KJL$N\e(B @sc{imap} \e$(B%/%i%$%"%s%H$r\e(B
+\e$(B;H$C$F$$$k$,!"9XFIEY$K4X$o$i$:$K$9$Y$F$N5-;v$r\e(B gnus \e$(B$KJ,3d$5$;$?$$$J$i$P!"\e(B
+\e$(B$3$l$OLr$KN)$D$+$b$7$l$^$;$s!#$=$N>l9g$O\e(B @samp{UNDELETED} \e$(B$KJQ$($l$PNI$$\e(B
+\e$(B$G$7$g$&!#\e(B
+
+@item nnimap-split-fancy
+@cindex splitting, fancy
+@findex nnimap-split-fancy
+@vindex nnimap-split-fancy
+
+\e$(B$b$7$"$J$?$,FC5iJ,3d$r;H$$$?$$$J$i$P!"\e(B@code{nnimap-split-rule} \e$(B$NCM$r\e(B
+@code{nnmail-split-fancy} \e$(B$K@_Dj$9$k$3$H$,$G$-$^$9!#\e(B
+@xref{Fancy Mail Splitting}\e$(B!#\e(B
+
+\e$(B$7$+$7\e(B nnmail \e$(B$H\e(B nnimap \e$(B$H$G0[$J$kFC5iJ,3dJ}<0$r;}$D$h$&$K$9$k$K$O!"\e(B
+@code{nnimap-split-rule} \e$(B$NCM$r\e(B @code{nnimap-split-fancy} \e$(B$K@_Dj$7$F!"\e(B
+nnimap \e$(BFCM-$NFC5iJ,3dJ}<0$r\e(B @code{nnimap-split-fancy} \e$(B$KDj5A$7$F2<$5$$!#\e(B
+
+\e$(BNc\e(B:
+
+@lisp
+(setq nnimap-split-rule 'nnimap-split-fancy
+ nnimap-split-fancy ...)
+@end lisp
+
+Nnmail \e$(B$GBP1~$9$k$b$N\e(B: @code{nnmail-split-fancy}.
+
@end table
@node Editing IMAP ACLs
\e$(B$D$NL$FI5-;v$r4{FI$K$7$^$9!#$b$C$HJ,$+$j$d$9$$F0:n$N$?$a$K$O\e(B
@code{gnus-summary-goto-unread} \e$(B$r\e(B @code{nil} \e$(B$K@_Dj$7$F$/$@$5$$!#\e(B
+\e$(BB?$/$N%3%^%s%I$O%W%m%;%9\e(B/\e$(B@\F,0z?t$N=,47$r;H$$$^$;$s!#$H$$$&$3$H$O!"$3$N\e(B
+\e$(B%^%K%e%"%k$G$O$C$-$j$H=R$Y$F$$$^$9!#%W%m%;%9\e(B/\e$(B@\F,0z?t$N=,47$r;H$o$J$$%3\e(B
+\e$(B%^%s%I$KE,MQ$9$k$K$O!"\e(B@kbd{M-&} \e$(B%3%^%s%I$r;H$$$^$7$g$&!#Nc$($P!"$=$N%0%k!<\e(B
+\e$(B%W$N$9$Y$F$N5-;v$r4|8B@Z$l:o=|2DG=$H$7$F0u$rIU$1$k$K$O\e(B `M P b M-& E' \e$(B$H\e(B
+\e$(B$7$^$9!#\e(B
+
@node Interactive
@section \e$(BBPOCE*\e(B
@end iftex
-
@menu
* Starting Up:: Finding news can be a pain.
* The Group Buffer:: Selecting, subscribing and killing groups.
* Appendices:: Terminology, Emacs intro, FAQ, History, Internals.
* Index:: Variable, function and concept index.
* Key Index:: Key Index.
+
+@detailmenu
+ --- The Detailed Node Listing ---
+
+Starting Gnus
+
+* Finding the News:: Choosing a method for getting news.
+* The First Time:: What does Gnus do the first time you start it?
+* The Server is Down:: How can I read my mail then?
+* Slave Gnusae:: You can have more than one Gnus active at a time.
+* Fetching a Group:: Starting Gnus just to read a group.
+* New Groups:: What is Gnus supposed to do with new groups?
+* Startup Files:: Those pesky startup files---@file{.newsrc}.
+* Auto Save:: Recovering from a crash.
+* The Active File:: Reading the active file over a slow line Takes Time.
+* Changing Servers:: You may want to move from one server to another.
+* Startup Variables:: Other variables you might change.
+
+New Groups
+
+* Checking New Groups:: Determining what groups are new.
+* Subscription Methods:: What Gnus should do with new groups.
+* Filtering New Groups:: Making Gnus ignore certain new groups.
+
+The Group Buffer
+
+* Group Buffer Format:: Information listed and how you can change it.
+* Group Maneuvering:: Commands for moving in the group buffer.
+* Selecting a Group:: Actually reading news.
+* Group Data:: Changing the info for a group.
+* Subscription Commands:: Unsubscribing, killing, subscribing.
+* Group Levels:: Levels? What are those, then?
+* Group Score:: A mechanism for finding out what groups you like.
+* Marking Groups:: You can mark groups for later processing.
+* Foreign Groups:: Creating and editing groups.
+* Group Parameters:: Each group may have different parameters set.
+* Listing Groups:: Gnus can list various subsets of the groups.
+* Sorting Groups:: Re-arrange the group order.
+* Group Maintenance:: Maintaining a tidy @file{.newsrc} file.
+* Browse Foreign Server:: You can browse a server. See what it has to offer.
+* Exiting Gnus:: Stop reading news and get some work done.
+* Group Topics:: A folding group mode divided into topics.
+* Misc Group Stuff:: Other stuff that you can to do.
+
+Group Buffer Format
+
+* Group Line Specification:: Deciding how the group buffer is to look.
+* Group Modeline Specification:: The group buffer modeline.
+* Group Highlighting:: Having nice colors in the group buffer.
+
+Group Topics
+
+* Topic Variables:: How to customize the topics the Lisp Way.
+* Topic Commands:: Interactive E-Z commands.
+* Topic Sorting:: Sorting each topic individually.
+* Topic Topology:: A map of the world.
+* Topic Parameters:: Parameters that apply to all groups in a topic.
+
+Misc Group Stuff
+
+* Scanning New Messages:: Asking Gnus to see whether new messages have arrived.
+* Group Information:: Information and help on groups and Gnus.
+* Group Timestamp:: Making Gnus keep track of when you last read a group.
+* File Commands:: Reading and writing the Gnus files.
+
+The Summary Buffer
+
+* Summary Buffer Format:: Deciding how the summary buffer is to look.
+* Summary Maneuvering:: Moving around the summary buffer.
+* Choosing Articles:: Reading articles.
+* Paging the Article:: Scrolling the current article.
+* Reply Followup and Post:: Posting articles.
+* Marking Articles:: Marking articles as read, expirable, etc.
+* Limiting:: You can limit the summary buffer.
+* Threading:: How threads are made.
+* Sorting:: How articles and threads are sorted.
+* Asynchronous Fetching:: Gnus might be able to pre-fetch articles.
+* Article Caching:: You may store articles in a cache.
+* Persistent Articles:: Making articles expiry-resistant.
+* Article Backlog:: Having already read articles hang around.
+* Saving Articles:: Ways of customizing article saving.
+* Decoding Articles:: Gnus can treat series of (uu)encoded articles.
+* Article Treatment:: The article buffer can be mangled at will.
+* MIME Commands:: Doing MIMEy things with the articles.
+* Charsets:: Character set issues.
+* Article Commands:: Doing various things with the article buffer.
+* Summary Sorting:: Sorting the summary buffer in various ways.
+* Finding the Parent:: No child support? Get the parent.
+* Alternative Approaches:: Reading using non-default summaries.
+* Tree Display:: A more visual display of threads.
+* Mail Group Commands:: Some commands can only be used in mail groups.
+* Various Summary Stuff:: What didn't fit anywhere else.
+* Exiting the Summary Buffer:: Returning to the Group buffer.
+* Crosspost Handling:: How crossposted articles are dealt with.
+* Duplicate Suppression:: An alternative when crosspost handling fails.
+
+Summary Buffer Format
+
+* Summary Buffer Lines:: You can specify how summary lines should look.
+* To From Newsgroups:: How to not display your own name.
+* Summary Buffer Mode Line:: You can say how the mode line should look.
+* Summary Highlighting:: Making the summary buffer all pretty and nice.
+
+Choosing Articles
+
+* Choosing Commands:: Commands for choosing articles.
+* Choosing Variables:: Variables that influence these commands.
+
+Reply, Followup and Post
+
+* Summary Mail Commands:: Sending mail.
+* Summary Post Commands:: Sending news.
+* Summary Message Commands:: Other Message-related commands.
+* Canceling and Superseding:: ``Whoops, I shouldn't have called him that.''
+
+Marking Articles
+
+* Unread Articles:: Marks for unread articles.
+* Read Articles:: Marks for read articles.
+* Other Marks:: Marks that do not affect readedness.
+
+Marking Articles
+
+* Setting Marks:: How to set and remove marks.
+* Generic Marking Commands:: How to customize the marking.
+* Setting Process Marks:: How to mark articles for later processing.
+
+Threading
+
+* Customizing Threading:: Variables you can change to affect the threading.
+* Thread Commands:: Thread based commands in the summary buffer.
+
+Customizing Threading
+
+* Loose Threads:: How Gnus gathers loose threads into bigger threads.
+* Filling In Threads:: Making the threads displayed look fuller.
+* More Threading:: Even more variables for fiddling with threads.
+* Low-Level Threading:: You thought it was over... but you were wrong!
+
+Decoding Articles
+
+* Uuencoded Articles:: Uudecode articles.
+* Shell Archives:: Unshar articles.
+* PostScript Files:: Split PostScript.
+* Other Files:: Plain save and binhex.
+* Decoding Variables:: Variables for a happy decoding.
+* Viewing Files:: You want to look at the result of the decoding?
+
+Decoding Variables
+
+* Rule Variables:: Variables that say how a file is to be viewed.
+* Other Decode Variables:: Other decode variables.
+* Uuencoding and Posting:: Variables for customizing uuencoding.
+
+Article Treatment
+
+* Article Highlighting:: You want to make the article look like fruit salad.
+* Article Fontisizing:: Making emphasized text look nice.
+* Article Hiding:: You also want to make certain info go away.
+* Article Washing:: Lots of way-neat functions to make life better.
+* Article Buttons:: Click on URLs, Message-IDs, addresses and the like.
+* Article Date:: Grumble, UT!
+* Article Signature:: What is a signature?
+* Article Miscellania:: Various other stuff.
+
+Alternative Approaches
+
+* Pick and Read:: First mark articles and then read them.
+* Binary Groups:: Auto-decode all articles.
+
+Various Summary Stuff
+
+* Summary Group Information:: Information oriented commands.
+* Searching for Articles:: Multiple article commands.
+* Summary Generation Commands:: (Re)generating the summary buffer.
+* Really Various Summary Commands:: Those pesky non-conformant commands.
+
+The Article Buffer
+
+* Hiding Headers:: Deciding what headers should be displayed.
+* Using MIME:: Pushing articles through @sc{mime} before reading them.
+* Customizing Articles:: Tailoring the look of the articles.
+* Article Keymap:: Keystrokes available in the article buffer.
+* Misc Article:: Other stuff.
+
+Composing Messages
+
+* Mail:: Mailing and replying.
+* Post:: Posting and following up.
+* Posting Server:: What server should you post via?
+* Mail and Post:: Mailing and posting at the same time.
+* Archived Messages:: Where Gnus stores the messages you've sent.
+* Posting Styles:: An easier way to specify who you are.
+* Drafts:: Postponing messages and rejected messages.
+* Rejected Articles:: What happens if the server doesn't like your article?
+
+Select Methods
+
+* The Server Buffer:: Making and editing virtual servers.
+* Getting News:: Reading USENET news with Gnus.
+* Getting Mail:: Reading your personal mail with Gnus.
+* Browsing the Web:: Getting messages from a plethora of Web sources.
+* Other Sources:: Reading directories, files, SOUP packets.
+* Combined Groups:: Combining groups into one group.
+* Gnus Unplugged:: Reading news and mail offline.
+
+The Server Buffer
+
+* Server Buffer Format:: You can customize the look of this buffer.
+* Server Commands:: Commands to manipulate servers.
+* Example Methods:: Examples server specifications.
+* Creating a Virtual Server:: An example session.
+* Server Variables:: Which variables to set.
+* Servers and Methods:: You can use server names as select methods.
+* Unavailable Servers:: Some servers you try to contact may be down.
+
+Getting News
+
+* NNTP:: Reading news from an @sc{nntp} server.
+* News Spool:: Reading news from the local spool.
+
+Getting Mail
+
+* Mail in a Newsreader:: Important introductory notes.
+* Getting Started Reading Mail:: A simple cookbook example.
+* Splitting Mail:: How to create mail groups.
+* Mail Sources:: How to tell Gnus where to get mail from.
+* Mail Backend Variables:: Variables for customizing mail handling.
+* Fancy Mail Splitting:: Gnus can do hairy splitting of incoming mail.
+* Group Mail Splitting:: Use group customize to drive mail splitting.
+* Incorporating Old Mail:: What about the old mail you have?
+* Expiring Mail:: Getting rid of unwanted mail.
+* Washing Mail:: Removing gruft from the mail you get.
+* Duplicates:: Dealing with duplicated mail.
+* Not Reading Mail:: Using mail backends for reading other files.
+* Choosing a Mail Backend:: Gnus can read a variety of mail formats.
+
+Mail Sources
+
+* Mail Source Specifiers:: How to specify what a mail source is.
+* Mail Source Customization:: Some variables that influence things.
+* Fetching Mail:: Using the mail source specifiers.
+
+Choosing a Mail Backend
+
+* Unix Mail Box:: Using the (quite) standard Un*x mbox.
+* Rmail Babyl:: Emacs programs use the rmail babyl format.
+* Mail Spool:: Store your mail in a private spool?
+* MH Spool:: An mhspool-like backend.
+* Mail Folders:: Having one file for each group.
+* Comparing Mail Backends:: An in-depth looks at pros and cons.
+
+Browsing the Web
+
+* Web Searches:: Creating groups from articles that match a string.
+* Slashdot:: Reading the Slashdot comments.
+* Ultimate:: The Ultimate Bulletin Board systems.
+* Web Archive:: Reading mailing list archived on web.
+
+Other Sources
+
+* Directory Groups:: You can read a directory as if it was a newsgroup.
+* Anything Groups:: Dired? Who needs dired?
+* Document Groups:: Single files can be the basis of a group.
+* SOUP:: Reading @sc{soup} packets ``offline''.
+* Mail-To-News Gateways:: Posting articles via mail-to-news gateways.
+* IMAP:: Using Gnus as a @sc{imap} client.
+
+Document Groups
+
+* Document Server Internals:: How to add your own document types.
+
+SOUP
+
+* SOUP Commands:: Commands for creating and sending @sc{soup} packets
+* SOUP Groups:: A backend for reading @sc{soup} packets.
+* SOUP Replies:: How to enable @code{nnsoup} to take over mail and news.
+
+@sc{imap}
+
+* Splitting in IMAP:: Splitting mail with nnimap.
+* Editing IMAP ACLs:: Limiting/enabling other users access to a mailbox.
+* Expunging mailboxes:: Equivalent of a "compress mailbox" button.
+
+Combined Groups
+
+* Virtual Groups:: Combining articles from many groups.
+* Kibozed Groups:: Looking through parts of the newsfeed for articles.
+
+Gnus Unplugged
+
+* Agent Basics:: How it all is supposed to work.
+* Agent Categories:: How to tell the Gnus Agent what to download.
+* Agent Commands:: New commands for all the buffers.
+* Agent Expiry:: How to make old articles go away.
+* Outgoing Messages:: What happens when you post/mail something?
+* Agent Variables:: Customizing is fun.
+* Example Setup:: An example @file{.gnus.el} file for offline people.
+* Batching Agents:: How to fetch news from a @code{cron} job.
+* Agent Caveats:: What you think it'll do and what it does.
+
+Agent Categories
+
+* Category Syntax:: What a category looks like.
+* The Category Buffer:: A buffer for maintaining categories.
+* Category Variables:: Customize'r'Us.
+
+Agent Commands
+
+* Group Agent Commands::
+* Summary Agent Commands::
+* Server Agent Commands::
+
+Scoring
+
+* Summary Score Commands:: Adding score entries for the current group.
+* Group Score Commands:: General score commands.
+* Score Variables:: Customize your scoring. (My, what terminology).
+* Score File Format:: What a score file may contain.
+* Score File Editing:: You can edit score files by hand as well.
+* Adaptive Scoring:: Big Sister Gnus knows what you read.
+* Home Score File:: How to say where new score entries are to go.
+* Followups To Yourself:: Having Gnus notice when people answer you.
+* Scoring Tips:: How to score effectively.
+* Reverse Scoring:: That problem child of old is not problem.
+* Global Score Files:: Earth-spanning, ear-splitting score files.
+* Kill Files:: They are still here, but they can be ignored.
+* Converting Kill Files:: Translating kill files to score files.
+* GroupLens:: Getting predictions on what you like to read.
+* Advanced Scoring:: Using logical expressions to build score rules.
+* Score Decays:: It can be useful to let scores wither away.
+
+GroupLens
+
+* Using GroupLens:: How to make Gnus use GroupLens.
+* Rating Articles:: Letting GroupLens know how you rate articles.
+* Displaying Predictions:: Displaying predictions given by GroupLens.
+* GroupLens Variables:: Customizing GroupLens.
+
+Advanced Scoring
+
+* Advanced Scoring Syntax:: A definition.
+* Advanced Scoring Examples:: What they look like.
+* Advanced Scoring Tips:: Getting the most out of it.
+
+Various
+
+* Process/Prefix:: A convention used by many treatment commands.
+* Interactive:: Making Gnus ask you many questions.
+* Symbolic Prefixes:: How to supply some Gnus functions with options.
+* Formatting Variables:: You can specify what buffers should look like.
+* Windows Configuration:: Configuring the Gnus buffer windows.
+* Faces and Fonts:: How to change how faces look.
+* Compilation:: How to speed Gnus up.
+* Mode Lines:: Displaying information in the mode lines.
+* Highlighting and Menus:: Making buffers look all nice and cozy.
+* Buttons:: Get tendonitis in ten easy steps!
+* Daemons:: Gnus can do things behind your back.
+* NoCeM:: How to avoid spam and other fatty foods.
+* Undo:: Some actions can be undone.
+* Moderation:: What to do if you're a moderator.
+* XEmacs Enhancements:: There are more pictures and stuff under XEmacs.
+* Fuzzy Matching:: What's the big fuzz?
+* Thwarting Email Spam:: A how-to on avoiding unsolicited commercial email.
+* Various Various:: Things that are really various.
+
+Formatting Variables
+
+* Formatting Basics:: A formatting variable is basically a format string.
+* Mode Line Formatting:: Some rules about mode line formatting variables.
+* Advanced Formatting:: Modifying output in various ways.
+* User-Defined Specs:: Having Gnus call your own functions.
+* Formatting Fonts:: Making the formatting look colorful and nice.
+
+XEmacs Enhancements
+
+* Picons:: How to display pictures of what your reading.
+* Smileys:: Show all those happy faces the way they were meant to be shown.
+* Toolbar:: Click'n'drool.
+* XVarious:: Other XEmacsy Gnusey variables.
+
+Picons
+
+* Picon Basics:: What are picons and How do I get them.
+* Picon Requirements:: Don't go further if you aren't using XEmacs.
+* Easy Picons:: Displaying Picons---the easy way.
+* Hard Picons:: The way you should do it. You'll learn something.
+* Picon Useless Configuration:: Other variables you can trash/tweak/munge/play with.
+
+Appendices
+
+* History:: How Gnus got where it is today.
+* On Writing Manuals:: Why this is not a beginner's guide.
+* Terminology:: We use really difficult, like, words here.
+* Customization:: Tailoring Gnus to your needs.
+* Troubleshooting:: What you might try if things do not work.
+* Gnus Reference Guide:: Rilly, rilly technical stuff.
+* Emacs for Heathens:: A short introduction to Emacsian terms.
+* Frequently Asked Questions:: A question-and-answer session.
+
+History
+
+* Gnus Versions:: What Gnus versions have been released.
+* Other Gnus Versions:: Other Gnus versions that also have been released.
+* Why?:: What's the point of Gnus?
+* Compatibility:: Just how compatible is Gnus with @sc{gnus}?
+* Conformity:: Gnus tries to conform to all standards.
+* Emacsen:: Gnus can be run on a few modern Emacsen.
+* Gnus Development:: How Gnus is developed.
+* Contributors:: Oodles of people.
+* New Features:: Pointers to some of the new stuff in Gnus.
+* Newest Features:: Features so new that they haven't been written yet.
+
+New Features
+
+* ding Gnus:: New things in Gnus 5.0/5.1, the first new Gnus.
+* September Gnus:: The Thing Formally Known As Gnus 5.3/5.3.
+* Red Gnus:: Third time best---Gnus 5.4/5.5.
+* Quassia Gnus:: Two times two is four, or Gnus 5.6/5.7.
+
+Customization
+
+* Slow/Expensive Connection:: You run a local Emacs and get the news elsewhere.
+* Slow Terminal Connection:: You run a remote Emacs.
+* Little Disk Space:: You feel that having large setup files is icky.
+* Slow Machine:: You feel like buying a faster machine.
+
+Gnus Reference Guide
+
+* Gnus Utility Functions:: Common functions and variable to use.
+* Backend Interface:: How Gnus communicates with the servers.
+* Score File Syntax:: A BNF definition of the score file standard.
+* Headers:: How Gnus stores headers internally.
+* Ranges:: A handy format for storing mucho numbers.
+* Group Info:: The group info format.
+* Extended Interactive:: Symbolic prefixes and stuff.
+* Emacs/XEmacs Code:: Gnus can be run under all modern Emacsen.
+* Various File Formats:: Formats of files that Gnus use.
+
+Backend Interface
+
+* Required Backend Functions:: Functions that must be implemented.
+* Optional Backend Functions:: Functions that need not be implemented.
+* Error Messaging:: How to get messages and report errors.
+* Writing New Backends:: Extending old backends.
+* Hooking New Backends Into Gnus:: What has to be done on the Gnus end.
+* Mail-like Backends:: Some tips on mail backends.
+
+Various File Formats
+
+* Active File Format:: Information on articles and groups available.
+* Newsgroups File Format:: Group descriptions.
+
+Emacs for Heathens
+
+* Keystrokes:: Entering text and executing commands.
+* Emacs Lisp:: The built-in Emacs programming language.
+
+@end detailmenu
@end menu
@node Starting Up
handy if you want to read the most important groups before you read the
rest.
+If this variable is @code{best}, Gnus will make the next newsgroup the
+one with the best level.
+
@vindex gnus-group-default-list-level
All groups with a level less than or equal to
@code{gnus-group-default-list-level} will be listed in the group buffer
@kindex W W l (Summary)
@findex gnus-article-hide-list-identifiers
@vindex gnus-list-identifiers
-Hide list identifiers specified in @code{gnus-list-identifiers}. These
-are strings some list servers add to the beginning of all @code{Subject}
-headers---for example, @samp{[zebra 4711]}.
+Strip list identifiers specified in @code{gnus-list-identifiers}.
+These are strings some mailing list servers add to the beginning of
+all @code{Subject} headers---for example, @samp{[zebra 4711]}. Any
+leading @samp{Re: } is skipped before stripping.
@table @code
Parameters}). The default value is @code{(unknown-8bit)}, which is
something some agents insist on having in there.
-@cindex Russina
+@vindex gnus-group-posting-charset-alist
+When posting, @code{gnus-group-posting-charset-alist} is used to
+determine which charsets should not be encoded using the @sc{mime}
+encodings. For instance, some hierarchies discourage using
+quoted-printable header encoding.
+
+This variable is an alist of regexps and permitted unencoded charsets
+for posting. Each element of the alist has the form @code{(}@var{test
+header body-list}@code{)}, where:
+
+@table @var
+@item
+test
+is either a regular expression matching the newsgroup header or a
+variable to query,
+@item header
+is the charset which may be left unencoded in the header (@code{nil}
+means encode all charsets),
+@item body-list
+is a list of charsets which may be encoded using 8bit content-transfer
+encoding in the body, or one of the special values @code{nil} (always
+encode using quoted-printable) or @code{t} (always use 8bit).
+@end table
+
+@cindex Russian
@cindex koi8-r
@cindex koi8-u
@cindex iso-8859-5
@end table
@vindex gnus-exit-group-hook
-@code{gnus-exit-group-hook} is called when you exit the current
-group.
+@code{gnus-exit-group-hook} is called when you exit the current group
+with an ``updating'' exit. For instance @kbd{Q}
+(@code{gnus-summary-exit-no-update}) does not call this hook.
@findex gnus-summary-wake-up-the-dead
@findex gnus-dead-summary-mode
(add-hook 'message-send-hook 'ispell-message)
@end lisp
+If you want to change the @code{ispell} dictionary based on what group
+you're in, you could say something like the following:
+
+@lisp
+(add-hook 'gnus-select-group-hook
+ (lambda ()
+ (cond
+ ((string-match "^de\\." gnus-newsgroup-name)
+ (ispell-change-dictionary "deutsch"))
+ (t
+ (ispell-change-dictionary "english")))))
+@end lisp
+
+Modify to suit your needs.
+
@node Archived Messages
@section Archived Messages
(signature my-quote-randomizer))
((message-news-p)
(signature my-news-signature))
- ((header "From.*To" "larsi.*org")
+ (header "From.*To" "larsi.*org"
(Organization "Somewhere, Inc."))
((posting-from-work-p)
(signature-file "~/.work-signature")
An example @sc{imap} mail source:
@lisp
-(imap :server "mail.mycorp.com" :stream kerberos4)
+(imap :server "mail.mycorp.com" :stream kerberos4 :fetchflag "\\Seen")
@end lisp
@item webmail
* Slashdot:: Reading the Slashdot comments.
* Ultimate:: The Ultimate Bulletin Board systems.
* Web Archive:: Reading mailing list archived on web.
+* Customizing w3:: Doing stuff to Emacs/w3 from Gnus.
@end menu
+All the web sources require Emacs/w3 and the url library to work.
+
The main caveat with all these web sources is that they probably won't
work for a very long time. Gleaning information from the @sc{html} data
is guesswork at best, and when the layout is altered, the Gnus backend
@samp{~/News/ultimate/}.
@end table
+
@node Web Archive
@subsection Web Archive
@cindex nnwarchive
The password for your account on the web server.
@end table
+
+@node Customizing w3
+@subsection Customizing w3
+@cindex w3
+@cindex html
+@cindex url
+@cindex Netscape
+
+Gnus uses the url library to fetch web pages and Emacs/w3 to display web
+pages. Emacs/w3 is documented in its own manual, but there are some
+things that may be more relevant for Gnus users.
+
+For instance, a common question is how to make Emacs/w3 follow links
+using the @code{browse-url} functions (which will call some external web
+browser like Netscape). Here's one way:
+
+@lisp
+(eval-after-load "w3"
+ '(progn
+ (fset 'w3-fetch-orig (symbol-function 'w3-fetch))
+ (defun w3-fetch (&optional url target)
+ (interactive (list (w3-read-url-with-default)))
+ (if (eq major-mode 'gnus-article-mode)
+ (browse-url url)
+ (w3-fetch-orig url target)))))
+@end lisp
+
+Put that in your @file{.emacs} file, and hitting links in w3-rendered
+@sc{html} in the Gnus article buffers will use @code{browse-url} to
+follow the link.
+
+
@node Other Sources
@section Other Sources
@item nnimap-stream
@vindex nnimap-stream
The type of stream used to connect to your server. By default, nnimap
-will use the most secure stream your server is capable of.
+will detect and automatically use all of the below, with the exception
+of SSL. (SSL is being replaced by STARTTLS, which can be automatically
+detected, but it's not widely deployed yet).
@itemize @bullet
@item
-@dfn{kerberos4:} Uses the `imtest' program.
+@dfn{gssapi:} Connect with GSSAPI (usually kerberos 5). Require the
+@samp{imtest} program.
+@item
+@dfn{kerberos4:} Connect with kerberos 4. Require the @samp{imtest} program.
@item
-@dfn{ssl:} Uses OpenSSL or SSLeay.
+@dfn{starttls:} Connect via the STARTTLS extension (similar to
+SSL). Require the external library @samp{starttls.el} and program
+@samp{starttls}.
+@item
+@dfn{ssl:} Connect through SSL. Require OpenSSL (the
+program @samp{openssl}) or SSLeay (@samp{s_client}).
@item
@dfn{network:} Plain, TCP/IP network connection.
@end itemize
+The @samp{imtest} program is shipped with Cyrus IMAPD, nnimap support
+both @samp{imtest} version 1.5.x and version 1.6.x.
+
+For SSL connections, the OpenSSL program is available from
+@file{http://www.openssl.org/}. OpenSSL was formerly known as SSLeay,
+and nnimap support it too - although the most recent versions of SSLeay,
+0.9.x, are known to have serious bugs making it useless. Earlier
+versions, especially 0.8.x, of SSLeay are known to work.
+
@item nnimap-authenticator
@vindex nnimap-authenticator
@itemize @bullet
@item
-@dfn{kerberos4:} Kerberos authentication.
+@dfn{gssapi:} GSSAPI (usually kerberos 5) authentication. Require
+external program @code{imtest}.
+@item
+@dfn{kerberos4:} Kerberos authentication. Require external program
+@code{imtest}.
+@item
+@dfn{digest-md5:} Encrypted username/password via DIGEST-MD5. Require
+external library @code{digest-md5.el}.
@item
@dfn{cram-md5:} Encrypted username/password via CRAM-MD5.
@item
Nnmail equivalent: @code{nnmail-split-methods}.
+@item nnimap-split-predicate
+@cindex splitting
+@vindex nnimap-split-predicate
+
+Mail matching this predicate in @code{nnimap-split-inbox} will be
+splitted, it is a string and the default is @samp{UNSEEN UNDELETED}.
+
+This might be useful if you use another @sc{imap} client to read mail in
+your inbox but would like Gnus to split all articles in the inbox
+regardless of readedness. Then you might change this to
+@samp{UNDELETED}.
+
@item nnimap-split-fancy
@cindex splitting, fancy
@findex nnimap-split-fancy
summary buffer looks like. Set @code{gnus-summary-goto-unread} to
@code{nil} for a more straightforward action.
+Many commands do not use the process/prefix convention. All commands
+that do explicitly say so in this manual. To apply the process/prefix
+convention to commands that do not use it, you can use the @kbd{M-&}
+command. For instance, to mark all the articles in the group as
+expirable, you could say `M P b M-& E'.
+
@node Interactive
@section Interactive