From: yamaoka Date: Wed, 12 Apr 2000 08:55:44 +0000 (+0000) Subject: New branch `t-gnus-6_14-quimby' for synchronizing with the latest Gnus. X-Git-Tag: t-gnus-6_14-quimby-before-AC-changed-~130 X-Git-Url: http://git.chise.org/gitweb/?a=commitdiff_plain;h=ba53ae0653ff265937b5820dbf126d5fc99566d6;p=elisp%2Fgnus.git- New branch `t-gnus-6_14-quimby' for synchronizing with the latest Gnus. --- diff --git a/ChangeLog b/ChangeLog index 2897a7c..c16f714 100644 --- a/ChangeLog +++ b/ChangeLog @@ -306,6 +306,12 @@ * lisp/nnimap.el (nnimap-retrieve-headers-progress): Remove confusing tabs from original header. +2000-02-02 Katsumi Yamaoka + + * 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 * lisp/gnus.el (gnus-revision-number): Increment to 05. diff --git a/GNUS-NEWS b/GNUS-NEWS index ae36555..c9f6a07 100644 --- a/GNUS-NEWS +++ b/GNUS-NEWS @@ -7,6 +7,22 @@ internationalization and mail-fetching. *** 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. diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 4d81184..244849b 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,271 @@ +2000-04-10 Daiki Ueno + + * lisp/imap.el (imap-body-lines): Check Content-Type: of the + article case insensitively. + +2000-04-10 20:35:46 Shenghuo ZHU + + * 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 + + * mail-source.el (mail-source-fetch-webmail): Use + mail-source-password-cache. + +2000-04-09 18:13:47 Shenghuo ZHU + + * webmail.el: Add netscape mail and fix HotMail mail. + +2000-04-08 Simon Josefsson + + * imap.el (imap-kerberos4-open): Work with recent `imtest's. + +2000-04-02 Simon Josefsson + + * 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 + + * 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 + + * nnslashdot.el (nnslashdot-request-list): Fudge new-style + slashdot ids. + +2000-03-20 00:12:42 Lars Magne Ingebrigtsen + + * nnslashdot.el (nnslashdot-request-list): Use the new slashdot + format. + +2000-03-16 Simon Josefsson + + * 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 + + * nnheader.el (nnheader-group-pathname): Make sure to return a + directory. + * nnmail.el (nnmail-group-pathname): Ditto. + +2000-02-08 Per Abrahamsen + + * 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 + + * 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 + + * rfc2047.el (rfc2047-encode-message-header): Encode no matter + whether Mule. + +2000-03-10 14:57:58 Lars Magne Ingebrigtsen + + * 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 + + * nnultimate.el (nnultimate-retrieve-headers): Ignore errors. + +2000-02-13 13:53:08 Lars Magne Ingebrigtsen + + * 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 + + * 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 + + * mail-source.el (mail-source-fetch-imap): Copy `imap-password' + into `mail-source-password-cache'. + +2000-02-17 Florian Weimer + + * 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 + + * 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 + + * 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 + + * nnimap.el (nnimap-split-predicate): New variable. + (nnimap-split-articles): Use it. + +2000-01-20 Simon Josefsson + + * utf7.el: Change email address. + +2000-01-18 22:03:51 Lars Magne Ingebrigtsen + + * gnus-group.el (gnus-group-catchup): Purge split history. + +2000-01-14 02:43:55 Shenghuo ZHU + + * nnmail.el (nnmail-generate-active): Support extended group name. + (nnmail-get-active): Ditto. + +2000-01-13 15:16:10 Shenghuo ZHU + + * 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 + + * webmail.el (webmail-my-deja-open): My-deja changes. + +2000-01-13 Simon Josefsson + + * nnimap.el (nnimap-retrieve-headers-progress): Create xref field. + +2000-01-10 23:35:33 Shenghuo ZHU + + * gnus-agent.el (gnus-agent-fetch-headers): Translate full path. + +2000-01-09 22:52:35 Shenghuo ZHU + + * gnus.el (gnus-other-frame): Fix typo. + +1999-06-25 Andreas Jaeger + + * gnus-cus.el (gnus-group-customize): Fix typo. + +2000-01-08 08:36:13 Lars Magne Ingebrigtsen + + * nnweb.el (nnweb-insert): Simplified. + +2000-01-06 18:32:53 Lars Magne Ingebrigtsen + + * gnus-art.el (gnus-article-mode-map): "e" is + gnus-summary-edit-article. + +2000-01-06 18:25:37 Jari Aalto + + * mailcap.el (mailcap-mime-extensions): Add .diff. + +2000-01-06 00:06:40 Kim-Minh Kaplan + + * 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 + + * gnus-sum.el (gnus-summary-select-article): Return 'old. + +2000-01-06 13:41:11 Lars Magne Ingebrigtsen + + * 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 + + * 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 * gnus-sum.el (gnus-summary-select-article): Return whether we diff --git a/lisp/base64.el b/lisp/base64.el index 4c0e87b..2a47045 100644 --- a/lisp/base64.el +++ b/lisp/base64.el @@ -50,6 +50,8 @@ (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)) diff --git a/lisp/fill-flowed.el b/lisp/fill-flowed.el new file mode 100644 index 0000000..b0883de --- /dev/null +++ b/lisp/fill-flowed.el @@ -0,0 +1,94 @@ +;;; fill-flowed.el --- interprete RFC2646 "flowed" text +;; Copyright (C) 2000 Free Software Foundation, Inc. + +;; Author: Simon Josefsson +;; Keywords: mail + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2 of the License, or +;; (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, write to the Free Software +;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +;;; Commentary: + +;; This implement decoding of RFC2646 formatted text, including the +;; quoted-depth wins rules. + +;; Theory of operation: search for lines ending with SPC, save quote +;; length of line, remove SPC and concatenate line with the following +;; line if quote length of following line matches current line. + +;; When no further concatenations are possible, we've found a +;; paragraph and we let `fill-region' fill the long line into several +;; lines with the quote prefix as `fill-prefix'. + +;; Todo: encoding + +;; History: + +;; 2000-02-17 posted on ding mailing list +;; 2000-02-19 use `point-at-{b,e}ol' in XEmacs +;; 2000-03-11 no compile warnings for point-at-bol stuff +;; 2000-03-26 commited to gnus cvs + +;;; Code: + +(eval-and-compile + (fset 'fill-flowed-point-at-bol + (if (fboundp 'point-at-bol) + 'point-at-bol + 'line-beginning-position)) + + (fset 'fill-flowed-point-at-eol + (if (fboundp 'point-at-eol) + 'point-at-eol + 'line-end-position))) + +(defun fill-flowed (&optional buffer) + (save-excursion + (set-buffer (or (current-buffer) buffer)) + (goto-char (point-min)) + (while (re-search-forward " $" nil t) + (when (save-excursion + (beginning-of-line) + (looking-at "^\\(>*\\)\\( ?\\)")) + (let ((quote (match-string 1))) + (if (string= quote "") + (setq quote nil)) + (when (and quote (string= (match-string 2) "")) + (save-excursion + ;; insert SP after quote for pleasant reading of quoted lines + (beginning-of-line) + (when (> (skip-chars-forward ">") 0) + (insert " ")))) + (while (and (save-excursion + (backward-char 3) + (looking-at "[^-][^-] ")) + (save-excursion + (unless (eobp) + (forward-char 1) + (if quote + (looking-at (format "^\\(%s\\)\\([^>]\\)" quote)) + (looking-at "^ ?"))))) + (save-excursion + (replace-match (if (string= (match-string 2) " ") + "" "\\2"))) + (backward-delete-char -1) + (end-of-line)) + (let ((fill-prefix (when quote (concat quote " ")))) + (fill-region (fill-flowed-point-at-bol) + (fill-flowed-point-at-eol) + 'left 'nosqueeze))))))) + +(provide 'fill-flowed) + +;;; fill-flowed.el ends here diff --git a/lisp/gnus-agent.el b/lisp/gnus-agent.el index b61a2f8..6e8e8ce 100644 --- a/lisp/gnus-agent.el +++ b/lisp/gnus-agent.el @@ -622,8 +622,10 @@ the actual number of articles toggled is returned." (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)) @@ -631,7 +633,8 @@ the actual number of articles toggled is returned." (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) @@ -639,9 +642,17 @@ the actual number of articles toggled is returned." (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)))))) @@ -883,7 +894,7 @@ the actual number of articles toggled is returned." (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 diff --git a/lisp/gnus-art.el b/lisp/gnus-art.el index bb8a4e4..b8f61d2 100644 --- a/lisp/gnus-art.el +++ b/lisp/gnus-art.el @@ -1591,6 +1591,8 @@ If PROMPT (the prefix), prompt for a coding system to use." (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))) @@ -1625,11 +1627,7 @@ or not." (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)) @@ -2664,7 +2662,7 @@ If variable `gnus-use-long-file-name' is non-nil, it is "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 diff --git a/lisp/gnus-cus.el b/lisp/gnus-cus.el index 92baaca..1bc3c6c 100644 --- a/lisp/gnus-cus.el +++ b/lisp/gnus-cus.el @@ -323,7 +323,7 @@ DOC is a documentation string for the parameter.") :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) diff --git a/lisp/gnus-group.el b/lisp/gnus-group.el index 9d7f92d..95f77ea 100644 --- a/lisp/gnus-group.el +++ b/lisp/gnus-group.el @@ -2609,6 +2609,8 @@ The return value is the number of articles that were marked as read, 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) diff --git a/lisp/gnus-mailcap.el b/lisp/gnus-mailcap.el index 932fcb6..4595ce7 100644 --- a/lisp/gnus-mailcap.el +++ b/lisp/gnus-mailcap.el @@ -714,6 +714,7 @@ this type is returned." (".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") diff --git a/lisp/gnus-srvr.el b/lisp/gnus-srvr.el index dde25b8..ae85dac 100644 --- a/lisp/gnus-srvr.el +++ b/lisp/gnus-srvr.el @@ -296,6 +296,18 @@ The following commands are available: (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 () diff --git a/lisp/gnus-start.el b/lisp/gnus-start.el index 5f82050..0053a54 100644 --- a/lisp/gnus-start.el +++ b/lisp/gnus-start.el @@ -1921,7 +1921,10 @@ newsgroup." (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)) diff --git a/lisp/gnus-sum.el b/lisp/gnus-sum.el index 0594d8f..75058c6 100644 --- a/lisp/gnus-sum.el +++ b/lisp/gnus-sum.el @@ -724,7 +724,8 @@ is not run if `gnus-visual' is nil." :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) @@ -5586,7 +5587,8 @@ The state which existed when entering the ephemeral is reset." (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." @@ -5848,39 +5850,34 @@ be displayed." (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." @@ -7396,8 +7393,11 @@ If ARG is a negative number, hide the unwanted header lines." (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." @@ -7474,7 +7474,10 @@ ACTION can be either `move' (the default), `crosspost' or `copy'." '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"))) @@ -7566,10 +7569,10 @@ ACTION can be either `move' (the default), `crosspost' or `copy'." (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)) @@ -9221,12 +9224,12 @@ save those articles instead." (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) diff --git a/lisp/gnus-topic.el b/lisp/gnus-topic.el index 38cd202..6006fbe 100644 --- a/lisp/gnus-topic.el +++ b/lisp/gnus-topic.el @@ -595,7 +595,8 @@ articles in the topic and its subtopics." (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)) @@ -609,8 +610,20 @@ articles in the topic and its subtopics." (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) diff --git a/lisp/gnus-uu.el b/lisp/gnus-uu.el index b0772e5..b588861 100644 --- a/lisp/gnus-uu.el +++ b/lisp/gnus-uu.el @@ -368,12 +368,11 @@ didn't work, and overwrite existing files. Otherwise, ask each time." "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 diff --git a/lisp/gnus-vers.el b/lisp/gnus-vers.el index 8f43480..5b91e98 100644 --- a/lisp/gnus-vers.el +++ b/lisp/gnus-vers.el @@ -37,7 +37,7 @@ (product-provide 'gnus-vers (product-define "T-gnus" nil '(6 14 1))) -(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) diff --git a/lisp/gnus-win.el b/lisp/gnus-win.el index 6a335e8..1da662d 100644 --- a/lisp/gnus-win.el +++ b/lisp/gnus-win.el @@ -446,12 +446,12 @@ See the Gnus manual for an explanation of the syntax used.") (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)))))))) diff --git a/lisp/gnus.el b/lisp/gnus.el index 0a0055b..a4df64f 100644 --- a/lisp/gnus.el +++ b/lisp/gnus.el @@ -1,5 +1,6 @@ ;;; 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 ;; Lars Magne Ingebrigtsen @@ -33,11 +34,7 @@ (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 @@ -1661,15 +1658,15 @@ use the article treating faculties instead. Is is described in Info node (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) diff --git a/lisp/ietf-drums.el b/lisp/ietf-drums.el index 6ef4fc1..6df0b0f 100644 --- a/lisp/ietf-drums.el +++ b/lisp/ietf-drums.el @@ -115,7 +115,7 @@ (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) @@ -151,6 +151,10 @@ (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 diff --git a/lisp/imap.el b/lisp/imap.el index 3dca3d2..97ea769 100644 --- a/lisp/imap.el +++ b/lisp/imap.el @@ -74,9 +74,11 @@ ;; ;; 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. @@ -122,7 +124,6 @@ ;; 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: ;; @@ -136,7 +137,7 @@ (eval-when-compile (require 'cl)) (eval-when-compile (require 'static)) -(eval-when-compile +(eval-when-compile (ignore-errors (require 'digest-md5))) (eval-and-compile @@ -150,20 +151,26 @@ (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" @@ -185,34 +192,41 @@ stdin and return responses to stdout.") (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 @@ -374,45 +388,115 @@ If ARGS, PROMPT is used as an argument to `format'." ;; 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) @@ -517,7 +601,7 @@ If ARGS, PROMPT is used as an argument to `format'." (set-process-filter imap-process nil))) (when (memq (process-status process) '(open run)) process)))) - + ;; Server functions; authenticator stuff: (defun imap-interactive-login (buffer loginfunc) @@ -558,7 +642,13 @@ Returns t if login was successful, nil otherwise." ;; 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) @@ -693,7 +783,7 @@ necessery. If nil, the buffer name is generated." (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 @@ -710,7 +800,7 @@ necessery. If nil, the buffer name is generated." (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))) @@ -1005,9 +1095,9 @@ returned, if ITEMS is a symbol only it's value is returned." (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." @@ -1269,6 +1359,7 @@ on failure." "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)) @@ -1321,13 +1412,14 @@ on failure." (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) diff --git a/lisp/lpath.el b/lisp/lpath.el index ca2d1db..c7e3c57 100644 --- a/lisp/lpath.el +++ b/lisp/lpath.el @@ -47,7 +47,7 @@ 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 @@ -63,14 +63,16 @@ 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 @@ -97,6 +99,7 @@ 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 diff --git a/lisp/mail-parse.el b/lisp/mail-parse.el index d9caac1..078907e 100644 --- a/lisp/mail-parse.el +++ b/lisp/mail-parse.el @@ -49,6 +49,7 @@ (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) diff --git a/lisp/mail-source.el b/lisp/mail-source.el index 3ec9273..2017b4e 100644 --- a/lisp/mail-source.el +++ b/lisp/mail-source.el @@ -634,18 +634,26 @@ This only works when `display-time' is enabled." (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)) @@ -666,7 +674,13 @@ This only works when `display-time' is enabled." (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 @@ -681,8 +695,15 @@ This only works when `display-time' is enabled." (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))))) diff --git a/lisp/message.el b/lisp/message.el index 8f981d7..b69238c 100644 --- a/lisp/message.el +++ b/lisp/message.el @@ -41,7 +41,6 @@ (require 'mailheader) (require 'nnheader) (require 'easymenu) -(require 'custom) (if (string-match "XEmacs\\|Lucid" emacs-version) (require 'mail-abbrevs) (require 'mailabbrev)) @@ -2791,7 +2790,8 @@ This sub function is for exclusive use of `message-send-mail'." (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)) @@ -3069,7 +3069,7 @@ This sub function is for exclusive use of `message-send-news'." (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 @@ -4696,6 +4696,8 @@ header line with the old Message-ID." (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 @@ -5091,6 +5093,7 @@ The following arguments may contain lists of values." (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)) diff --git a/lisp/mm-bodies.el b/lisp/mm-bodies.el index 0901615..2ee6bf2 100644 --- a/lisp/mm-bodies.el +++ b/lisp/mm-bodies.el @@ -150,15 +150,16 @@ If no encoding was done, nil is returned." ((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. ) diff --git a/lisp/mm-decode.el b/lisp/mm-decode.el index 83f8ec4..c34921f 100644 --- a/lisp/mm-decode.el +++ b/lisp/mm-decode.el @@ -220,6 +220,8 @@ to: 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 @@ -255,7 +257,9 @@ to: (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) @@ -433,20 +437,28 @@ external if displayed external." (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) diff --git a/lisp/mm-util.el b/lisp/mm-util.el index bf94df4..d7dc793 100644 --- a/lisp/mm-util.el +++ b/lisp/mm-util.el @@ -241,7 +241,7 @@ If the charset is `composition', return the actual one." (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) diff --git a/lisp/mm-view.el b/lisp/mm-view.el index 6076bb5..fed099b 100644 --- a/lisp/mm-view.el +++ b/lisp/mm-view.el @@ -33,6 +33,7 @@ (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. @@ -130,15 +131,25 @@ (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) diff --git a/lisp/nnfolder.el b/lisp/nnfolder.el index 9c4b5b3..d2a8bb2 100644 --- a/lisp/nnfolder.el +++ b/lisp/nnfolder.el @@ -730,7 +730,7 @@ deleted. Point is left where the deleted region was." 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)) diff --git a/lisp/nnheader.el b/lisp/nnheader.el index e0ec1e1..f1bf79b 100644 --- a/lisp/nnheader.el +++ b/lisp/nnheader.el @@ -1,5 +1,7 @@ ;;; 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 ;; Lars Magne Ingebrigtsen @@ -917,14 +919,14 @@ without formatting." (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)))) diff --git a/lisp/nnimap.el b/lisp/nnimap.el index fab328f..e0531ce 100644 --- a/lisp/nnimap.el +++ b/lisp/nnimap.el @@ -126,6 +126,13 @@ This variable can also have a function as its value, the function will 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.") @@ -361,9 +368,10 @@ If EXAMINE is non-nil the group is selected read-only." 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... @@ -378,10 +386,14 @@ If EXAMINE is non-nil the group is selected read-only." (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) @@ -494,8 +506,8 @@ If EXAMINE is non-nil the group is selected read-only." ;; 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)) @@ -604,33 +616,33 @@ function is generally only called when Gnus is shutting down." (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) @@ -643,18 +655,21 @@ function is generally only called when Gnus is shutting down." (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))) @@ -902,7 +917,7 @@ function is generally only called when Gnus is shutting down." ;; 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) @@ -938,7 +953,7 @@ function is generally only called when Gnus is shutting down." (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")) diff --git a/lisp/nnmail.el b/lisp/nnmail.el index 20e134e..b86aedb 100644 --- a/lisp/nnmail.el +++ b/lisp/nnmail.el @@ -1,5 +1,5 @@ ;;; 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 ;; Keywords: news, mail @@ -475,32 +475,50 @@ parameter. It should return nil, `warn' or `delete'." ?. ?_)) (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 @@ -519,8 +537,11 @@ nn*-request-list should have been called before calling this function." (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. @@ -1074,7 +1095,10 @@ Return the number of characters in the body." (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) @@ -1586,6 +1610,8 @@ See the documentation for the variable `nnmail-split-fancy' for documentation." (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)) diff --git a/lisp/nnml.el b/lisp/nnml.el index e3ceec4..d512cd2 100644 --- a/lisp/nnml.el +++ b/lisp/nnml.el @@ -43,11 +43,11 @@ "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 @@ -374,8 +374,8 @@ all. This may very well take some time.") (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)) @@ -479,7 +479,7 @@ all. This may very well take some time.") (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 @@ -520,8 +520,8 @@ all. This may very well take some time.") (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) @@ -541,7 +541,7 @@ all. This may very well take some time.") (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) @@ -637,8 +637,8 @@ all. This may very well take some time.") (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))) @@ -678,8 +678,9 @@ all. This may very well take some time.") (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))) diff --git a/lisp/nnslashdot.el b/lisp/nnslashdot.el index 2476061..840eb82 100644 --- a/lisp/nnslashdot.el +++ b/lisp/nnslashdot.el @@ -378,11 +378,12 @@ (narrow-to-region (point) (search-forward "")) (goto-char (point-min)) (re-search-forward "\\([^<]+\\)") - (setq description (nnweb-decode-entities-string (match-string 1))) + (setq description + (nnweb-decode-entities-string (match-string 1))) (re-search-forward "\\([^<]+\\)") (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 "\\([^<]+\\)") (setq articles (string-to-number (match-string 1))) (setq gname (concat description " (" sid ")")) @@ -398,9 +399,11 @@ (nnweb-insert (format nnslashdot-active-url number) t) (goto-char (point-min)) (while (re-search-forward - "article.pl\\?sid=\\([^&]+\\).*\\([^<]+\\)" nil t) + "article.pl\\?sid=\\([^&]+\\).*\\([^<]+\\)" + 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 "\\([0-9]+\\)" nil t) (setq articles (string-to-number (match-string 1)))) diff --git a/lisp/nntp.el b/lisp/nntp.el index dd02180..910db3b 100644 --- a/lisp/nntp.el +++ b/lisp/nntp.el @@ -1,5 +1,6 @@ ;;; 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 ;; Katsumi Yamaoka diff --git a/lisp/nnultimate.el b/lisp/nnultimate.el index 6f2be5e..6042512 100644 --- a/lisp/nnultimate.el +++ b/lisp/nnultimate.el @@ -83,7 +83,8 @@ (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) @@ -125,7 +126,8 @@ "-" (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) @@ -338,25 +340,26 @@ (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) diff --git a/lisp/nnweb.el b/lisp/nnweb.el index 641d9d5..3c7e32b 100644 --- a/lisp/nnweb.el +++ b/lisp/nnweb.el @@ -756,14 +756,11 @@ If FOLLOW-REFRESH is non-nil, redirect refresh url in META." (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))) diff --git a/lisp/parse-time.el b/lisp/parse-time.el index 11e4682..9cc4ce2 100644 --- a/lisp/parse-time.el +++ b/lisp/parse-time.el @@ -167,7 +167,7 @@ (= (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...)") diff --git a/lisp/pop3.el b/lisp/pop3.el index 7063fa9..b2d2460 100644 --- a/lisp/pop3.el +++ b/lisp/pop3.el @@ -1,10 +1,11 @@ ;;; 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 ;; Daiki Ueno -;; Keywords: mail, pop3 +;; Maintainer: FSF +;; Keywords: mail ;; Version: 1.3s ;; This file is part of GNU Emacs. @@ -36,6 +37,7 @@ ;;; Code: (eval-when-compile (require 'cl)) +(eval-when-compile (require 'static)) (require 'mail-utils) @@ -104,12 +106,12 @@ Nil means no, t means yes, not-nil-or-t means yet to be determined.") (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 @@ -156,53 +158,31 @@ Nil means no, t means yes, not-nil-or-t means yet to be determined.") (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) @@ -263,15 +243,15 @@ Args are NAME BUFFER HOST SERVICE." (insert output))) (defun pop3-send-command (process command) - (set-buffer (process-buffer process)) - (goto-char (point-max)) - ;; (if (= (aref command 0) ?P) - ;; (insert "PASS \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 \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. @@ -287,7 +267,7 @@ Return the response string if optional second argument RETURN is non-nil." (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) @@ -299,7 +279,7 @@ Return the response string if optional second argument RETURN is non-nil." (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) @@ -458,15 +438,45 @@ Return the response string if optional second argument RETURN is non-nil." (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" @@ -481,8 +491,8 @@ Return the response string if optional second argument RETURN is non-nil." "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) @@ -510,7 +520,7 @@ Return the response string if optional second argument RETURN is non-nil." "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) diff --git a/lisp/qp.el b/lisp/qp.el index 8643104..fc909e4 100644 --- a/lisp/qp.el +++ b/lisp/qp.el @@ -23,46 +23,63 @@ ;;; 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) diff --git a/lisp/rfc2047.el b/lisp/rfc2047.el index 74705da..e01d7b8 100644 --- a/lisp/rfc2047.el +++ b/lisp/rfc2047.el @@ -105,33 +105,31 @@ Valid encodings are nil, `Q' and `B'.") "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." diff --git a/lisp/time-date.el b/lisp/time-date.el index 99c4135..f78aa60 100644 --- a/lisp/time-date.el +++ b/lisp/time-date.el @@ -3,6 +3,8 @@ ;; Author: Lars Magne Ingebrigtsen ;; Masanobu Umeda +;; Keywords: mail news util + ;; This file is part of GNU Emacs. ;; GNU Emacs is free software; you can redistribute it and/or modify @@ -28,6 +30,7 @@ (require 'parse-time) +;;;###autoload (defun date-to-time (date) "Convert DATE into time." (condition-case () @@ -38,7 +41,7 @@ "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." @@ -118,6 +121,7 @@ The Gregorian date Sunday, December 31, 1bce is imaginary." (- (/ (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." diff --git a/lisp/utf7.el b/lisp/utf7.el index 27be1c9..1f3652c 100644 --- a/lisp/utf7.el +++ b/lisp/utf7.el @@ -1,7 +1,7 @@ ;;; utf7.el --- UTF-7 encoding/decoding for Emacs ;; Copyright (C) 1999 Free Software Foundation, Inc. -;; Author: Jon K Hellan +;; Author: Jon K Hellan ;; Keywords: mail ;; This file is part of GNU Emacs, but the same permissions apply diff --git a/lisp/webmail.el b/lisp/webmail.el index 1b9b9c4..f81869e 100644 --- a/lisp/webmail.el +++ b/lisp/webmail.el @@ -2,7 +2,7 @@ ;; Copyright (C) 1999 Free Software Foundation, Inc. ;; Author: Shenghuo Zhu -;; Keywords: hotmail yahoo netaddress my-deja +;; Keywords: hotmail netaddress my-deja netscape ;; This file is part of GNU Emacs. @@ -77,7 +77,7 @@ (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) @@ -111,10 +111,31 @@ "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") @@ -123,7 +144,7 @@ (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) @@ -356,7 +377,7 @@ (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)) @@ -644,6 +665,12 @@ ;;; 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) @@ -671,7 +698,7 @@ (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")) @@ -788,7 +815,132 @@ ;; 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 "
" nil t)) + (webmail-error "article@2")) + (delete-region (point-min) (match-beginning 0)) + (if (not (search-forward "
" 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 "]*>[^<]*" nil t) + (replace-match "")) + (goto-char (point-min)) + (while (search-forward "" 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 "" nil t) + (webmail-error "article@4")) + (forward-line 14) + (delete-region p (point)) + (goto-char (point-max)) + (unless (re-search-backward + "
" + nil t 2) + (setq mime t) + (unless (search-forward "" nil t) + (webmail-error "article@6")) + (setq p1 (point)) + (if (search-backward "" 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 + "" + 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) @@ -825,7 +977,7 @@ (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"))) diff --git a/make.bat b/make.bat index b203277..9e9936c 100755 --- a/make.bat +++ b/make.bat @@ -1,14 +1,14 @@ @echo off -rem Written by David Charlap - -rem There are two catches, however. The emacs.bat batch file may not exist -rem in all distributions. It is part of the Voelker build of Emacs 19.34 -rem (http://www.cs.washington.edu/homes/voelker/ntemacs.html). If the user -rem installs Gnus with some other build, he may have to replace calls to +rem Written by David Charlap (shamino@writeme.com) +rem +rem There are two possible problems with this batch file. The emacs.bat batch +rem file may not exist in all distributions. It is part of the GNU build of +rem Emacs 20.4 (http://www.gnu.org/softare/emacs/windows.ntemacs.html) If you +rem install Gnus with some other build, you may have to replace calls to rem %1\emacs.bat with something else. rem -rem Also, the emacs.bat file that Voelker ships does not accept more than 9 +rem Also, the emacs.bat file that comes with Emacs does not accept more than 9 rem parameters, so the attempts to compile the .texi files will fail. To rem fix that (at least on NT. I don't know about Win95), the following rem change should be made to emacs.bat: @@ -31,16 +31,19 @@ if "%1" == "" goto usage cd lisp call %1\bin\emacs.bat -batch -q -no-site-file -l ./dgnushack.el -f dgnushack-compile if not "%2" == "copy" goto info -copy *.el* %1\lisp +attrib -r %1\lisp\gnus\* +copy *.el* %1\lisp\gnus :info cd ..\texi -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 -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 +call %1\bin\emacs.bat -batch -q -no-site-file message.texi -f texinfo-every-node-update -f texinfo-format-buffer -f save-buffer +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 +call %1\bin\emacs.bat -batch -q -no-site-file gnus.texi -f texinfo-every-node-update -f texinfo-format-buffer -f save-buffer if not "%2" == "copy" goto done copy gnus %1\info copy gnus-?? %1\info copy message %1\info +copy emacs-mime %1\info :etc cd ..\etc @@ -54,7 +57,7 @@ goto end echo Usage: make ^ [copy] echo. echo where: ^ is the directory you installed emacs in -echo eg. d:\emacs\19.34 +echo eg. d:\emacs\20.4 echo copy indicates that the compiled files should be copied to your echo emacs lisp, info, and etc directories diff --git a/texi/ChangeLog b/texi/ChangeLog index 73d708c..ad588ba 100644 --- a/texi/ChangeLog +++ b/texi/ChangeLog @@ -1,6 +1,44 @@ +2000-03-19 Simon Josefsson + + * gnus.texi (IMAP): Addition. + +2000-03-13 17:44:59 Lars Magne Ingebrigtsen + + * gnus.texi (Process/Prefix): Addition. + +2000-02-04 Simon Josefsson + + * gnus.texi (IMAP): Fix. + +2000-01-27 18:06:35 Lars Magne Ingebrigtsen + + * gnus.texi (Remember): Addition. + +2000-01-21 Simon Josefsson + + * gnus.texi (Splitting in IMAP): Addition. + (Mail Source Specifiers): Add fetchflag setting in example. + +2000-01-08 08:10:04 Martin Bialasinski + + * gnus.texi (Mail and Post): Example. + +2000-01-08 07:46:13 Lars Magne Ingebrigtsen + + * gnus.texi (Customizing w3): New. + +2000-01-08 07:46:06 Hamish Macdonald + + * gnus.texi (Customizing w3): Example. + +2000-01-06 17:55:28 Lars Magne Ingebrigtsen + + * gnus.texi (Charsets): Addition. + 2000-01-05 15:58:48 Lars Magne Ingebrigtsen * gnus.texi (Mail Group Commands): Addition. + (Top): Added detailmenu. 2000-01-03 01:31:02 Lars Magne Ingebrigtsen diff --git a/texi/gnus-ja.texi b/texi/gnus-ja.texi index 750f262..bab5eac 100644 --- a/texi/gnus-ja.texi +++ b/texi/gnus-ja.texi @@ -431,7 +431,6 @@ Emacs $(B$,J8>O$rJT=8$9$k?M$KNO$rM?$($k$h$&$K!"(Bgnus $(B$O%K%e!<%9$rFI$`?M$K @end iftex - @menu * Starting Up:: $(B%K%e!<%9$r8+$D$1$k$N$K$O6lO+$,H<$&$+$bCN$l$J$$(B * The Group Buffer:: $(B%0%k!<%W$rA*Br$7!"9XFI$7!":o=|$9$k(B @@ -445,6 +444,473 @@ Emacs $(B$,J8>O$rJT=8$9$k?M$KNO$rM?$($k$h$&$K!"(Bgnus $(B$O%K%e!<%9$rFI$`?M$K * Appendices:: $(BMQ8l!"(BEmacs $(BF~Lg!"(BFAQ$(B!"Nr;K!"FbIt9=B$(B * Index:: $(BJQ?t!"4X?t!"35G0$N:w0z(B * Key Index:: $(B%-!<:w0z(B + +@detailmenu + --- The Detailed Node Listing --- + +Starting Gnus + +* Finding the News:: $(B%K%e!<%9$re$N(B gnus $(B$r:nF0$5$;$k$3$H$,$G$-$k(B +* Fetching a Group:: $(B%0%k!<%W$rFI$`$?$a$@$1$K(B gnus $(B$r5/F0$9$k(B +* New Groups:: Gnus $(B$,?7$7$$%0%k!<%W$KBP$7$F2?$r$9$k$+(B +* Startup Files:: $(B$d$C$+$$$J%9%?!<%H%"%C%W%U%!%$%k(B--@file{.newsrc} +* Auto Save:: $(B%/%i%C%7%e$+$i$N2sI|(B +* The Active File:: $(BCY$$2s@~$+$i$N%U%!%$%k$NpJs$HJQ99$NJ}K!!#(B +* Group Maneuvering:: $(B%0%k!<%W%P%C%U%!$r0\F0$9$k%3%^%s%I!#(B +* Selecting a Group:: $(BpJs$rJQ99$9$k!#(B +* Subscription Commands:: $(B9XFI!"9XFICf;_!">C5n!#(B +* Group Levels:: $(B%l%Y%k!)$=$l$C$F2?!)(B +* Group Score:: $(B$"$J$?$N9%$-$J%0%k!<%W$r8+$D$1=P$9J}K!!#(B +* Marking Groups:: $(B%0%k!<%W$K0u$r$D$1$F$*$$$F!"8e$G=hM}$G$-$^$9!#(B +* Foreign Groups:: $(B%0%k!<%W$N:n@.$H=$@5!#(B +* Group Parameters:: $(B%0%k!<%WKh$K0c$C$?%Q%i%a!<%?$r;}$?$;$i$l$^$9!#(B +* Listing Groups:: Gnus $(B$O%0%k!<%W$r$$$m$$$m$JJ,$1J}$GI=<($G$-$^$9!#(B +* Sorting Groups:: $(B%0%k!<%W$N=gHV$NG[CVBX$(!#(B +* Group Maintenance:: $(B$-$l$$$J(B @file{.newsrc} $(B$NJ]$AJ}!#(B +* Browse Foreign Server:: $(B%5!<%P$r354Q$G$-$k!#2?$,FI$a$k$N$+8+$F$_$h$&!#(B +* Exiting Gnus:: $(B%K%e!<%9FI$`$N$r$d$a$F!";E;v$r$7$h$&!#(B +* Group Topics:: $(B%0%k!<%W$r@Z$j:.$<$F!"%H%T%C%/$4$H$KJ,3d$9$k!#(B +* Misc Group Stuff:: $(BB>$K$G$-$k$3$H!#(B + +Group Buffer Format + +* Group Line Specification:: $(B%0%k!<%W%P%C%U%!$N8+$(J}$r7h$a$k!#(B +* Group Modeline Specification:: $(B%0%k!<%W%P%C%U%!$N%b!<%I9T!#(B +* Group Highlighting:: $(B%0%k!<%W%P%C%U%!$K$-$l$$$K?'$r$D$1$k!#(B + +Group Topics + +* Topic Variables:: Lisp $(B$G%H%T%C%/$r%+%9%?%^%$%:$9$kJ}K!!#(B +* Topic Commands:: $(BD64JC1BPOC7?L?Na!#(B +* Topic Sorting:: $(B%H%T%C%/KhJL!9$KJB$YBX$($k!#(B +* Topic Topology:: $(BA4@$3&$NCO?^!#(B +* Topic Parameters:: $(B$"$k%H%T%C%/$NA4$F$N%0%k!<%W$KE,MQ$5$l$k%Q%i%a!<%?!#(B + +Misc Group Stuff + +* Scanning New Messages:: Gnus $(B$K?7$7$$%a%C%;!<%8$,E~Ce$7$?$+$I$&$+$rJ9$/!#(B +* Group Information:: $(B%0%k!<%W$H(B gnus $(B$K4X$9$k>pJs$H%X%k%W!#(B +* Group Timestamp:: Gnus $(B$K:G8e$K$$$D%0%k!<%W$rFI$s$@$+$r5-O?$5$;$k!#(B +* File Commands:: Gnus $(B$N%U%!%$%k$NFI$_=q$-!#(B + +The Summary Buffer + +* Summary Buffer Format:: $(B35N,%P%C%U%!$N304Q$r7hDj$9$k!#(B +* Summary Maneuvering:: $(B35N,%P%C%U%!$rF0$-2s$k!#(B +* Choosing Articles:: $(B5-;v$rFI$`!#(B +* Paging the Article:: $(BFI$s$G$$$k5-;v$r%9%/%m!<%k$9$k!#(B +* Reply Followup and Post:: $(B5-;v$rEj9F$9$k!#(B +* Marking Articles:: $(B5-;v$K4{FI$d4|8B@Z$l:o=|2DG=Ey$N0u$rIU$1$k!#(B +* Limiting:: $(B35N,%P%C%U%!$K@)8B$r2C$($k$3$H$,$G$-$k!#(B +* Threading:: $(B%9%l%C%I$,$I$N$h$&$K:n$i$l$k$+!#(B +* Sorting:: $(B%9%l%C%I$H5-;v$,$I$N$h$&$KJB$S$+$($i$l$k$+!#(B +* Asynchronous Fetching:: Gnus $(B$O5-;v$r@h$KC5n$7$J$/$5$;$k!#(B +* Article Backlog:: $(B4{$KFI$s$@5-;v$r;D$7$F$*$/!#(B +* Saving Articles:: $(B5-;v$NJ]B8$r%+%9%?%^%$%:$9$kJ}K!!#(B +* Decoding Articles:: Gnus $(B$O0lO"$N(B (uu)encode $(B$5$l$?5-;v$r07$($k!#(B +* Article Treatment:: $(B5-;v%P%C%U%!$O$*K>$_$I$*$j$KL\Cc6lCc$K$G$-$k!#(B +@c * MIME Commands:: Doing MIMEy things with the articles. +@c * Charsets:: Character set issues. +* Article Commands:: $(B5-;v%P%C%U%!$G$$$m$$$m$J$3$H$r$9$k!#(B +* Summary Sorting:: $(B$$$m$$$m$JJ}K!$G35N,%P%C%U%!$rJB$YBX$($k!#(B +* Finding the Parent:: $(B;R5-;v$K1g=u$,L5$$$C$F(B? $(B?F5-;v$r$N$I$N>l=j$K$b9g$o$J$+$C$?$b$N!#(B +* Exiting the Summary Buffer:: $(B%0%k!<%W%P%C%U%!$KLa$k!#(B +* Crosspost Handling:: $(B%/%m%9%]%9%H$5$l$?5-;v$,$I$N$h$&$K07$o$l$k$+!#(B +* Duplicate Suppression:: $(B%/%m%9%]%9%H$N07$$$K<:GT$7$?$H$-$NBeBXA0$rI=<($7$J$$J}K!!#(B +* Summary Buffer Mode Line:: $(B%b!<%I9T$N8+$(J}$r7h$a$i$l$k!#(B +* Summary Highlighting:: $(B35N,%P%C%U%!$r$-$l$$$GAGE($K$9$k!#(B + +Choosing Articles + +* Choosing Commands:: $(B5-;v$rA*Br$9$k$?$a$NL?Na!#(B +* Choosing Variables:: $(B$3$l$i$NL?Na$K1F6A$r5Z$\$9JQ?t!#(B + +Reply, Followup and Post + +* Summary Mail Commands:: $(B%a!<%k$rAw$k!#(B +* Summary Post Commands:: $(B%K%e!<%9$rAw$k!#(B +* Summary Message Commands:: $(BB>$N%a%C%;!<%84XO"$NL?Na!#(B +* Canceling and Superseding:: $(B!X$"$!!"$"$s$J$U$&$K8@$&$s$8$c$J$+$C$?!#!Y(B + +Marking Articles + +* Unread Articles:: $(BL$FI5-;v$X$N0u(B +* Read Articles:: $(B4{FI5-;v$X$N0u(B +* Other Marks:: $(B9XFIEY$K1F6A$7$J$$0u(B + +Marking Articles + +* Setting Marks:: $(B0u$NIU$1J}$H>C$7J}(B +* Generic Mark Commands:: $(B0u$r$I$N$h$&$K%+%9%?%^%$%:$9$k$+!#(B +* Setting Process Marks:: $(B8e$N$NI|9f2=$NJQ?t!#(B +* Uuencoding and Posting:: uuencode $(B$9$k$N$r%+%9%?%^%$%:$9$kJQ?t!#(B + +Article Treatment + +* Article Highlighting:: $(B5-;v$r2LJ*%5%i%@$N$h$&$K8+$($k$h$&$K$7$?$$!#(B +* Article Fontisizing:: $(B6/D4$5$l$?J8$rAGE($K$9$k!#(B +* Article Hiding:: $(BFCDj$N>pJs$O>C$75n$j$?$$$H$b;W$&!#(B +* Article Washing:: $(B?M@8$r$b$C$H$h$/$9$k$?$/$5$s$N5$$NMx$$$?4X?t!#(B +* Article Buttons:: URL $(B$d(B Message-ID $(B$d(B $(B%"%I%l%9$J$I$r%/%j%C%/$9$k!#(B +* Article Date:: $(B$0$:$0$:8@$&$J!"@$3&;~$@!*(B +* Article Signature:: $(B=pL>$C$F2?!)(B +* Article Miscellanina:: $(BB>$N$$$m$$$m$J$b$N!#(B + +Alternative Approaches + +* Pick and Read:: $(B$^$:!"5-;v$K0u$rIU$1$F!"$=$l$+$iFI$`(B +* Binary Groups:: $(B$9$Y$F$N5-;v$r<+F0(B-$(BI|9f2=$9$k(B + +Various Summary Stuff + +* Summary Group Information:: $(B>pJs;X8~$NL?Na!#(B +* Searching for Articles:: $(BJ#?t5-;vL?Na!#(B +* Summary Generation Commands:: $(B35N,%P%C%U%!$N!J:F!K:n@.!#(B +* Really Various Summary Commands:: $(B$"$N$d$C$+$$$JB>$KE,9g$7$J$$L?Na!#(B + +The Article Buffer + +* Hiding Headers:: $(B$I$N%X%C%@!<$rI=<($9$k$+$r7h$a$k!#(B +* Using MIME:: @sc{mime} $(B5-;v$H$7$F8+$;$k!#(B +* Customizing Articles:: $(B5-;v$N8+1I$($r;EN)$F$k!#(B +* Article Keymap:: $(B5-;v%P%C%U%!$G;H$($k%-!!#(B + +Composing Messages + +* Mail:: $(B%a!<%k$HJVEz!#(B +* Post:: $(BEj9F$H%U%)%m!<%"%C%W!#(B +* Posting Server:: $(B$I$N%5!<%P!<$rDL$7$FEj9F$9$k$Y$-$+!)(B +* Mail and Post:: $(BF1;~$K%a!<%k$r=P$7JVEz$9$k!#(B +* Archived Messages:: $(BAw$C$?%a%C%;!<%8$r(B gnus $(B$,Cy$a$F$*$/$H$3$m!#(B +* Posting Styles:: $(B$"$J$?$,C/$G$"$k$+$r;XDj$9$k$h$j4JC1$JJ}K!!#(B +* Drafts:: $(B%a%C%;!<%8$N1d4|$H5qH]$5$l$?%a%C%;!<%8!#(B +* Rejected Articles:: $(B%5!<%P!<$,$"$J$?$N5-;v$r9%$-$G$J$$$H$-$K2?$,5/$3$k!)(B + +Select Methods + +* The Server Buffer:: $(B;ve$N%5!<%P!<$r:n$C$FJT=8$9$k!#(B +* Getting News:: USENET $(B%K%e!<%9$r(B gnus $(B$GFI$`!#(B +* Getting Mail:: $(B8D?ME*$J%a!<%k$r(B gnus $(B$GFI$`!#(B +* Browsing the Web:: $(B2a>j$J%&%'%V$N;q8;$+$i%a%C%;!<%8$r$rA*BrJ}K!$H$7$F;H$&;v$,$G$-$k!#(B +* Unavailable Servers:: $(B@\B3$7$h$&$H;n$_$?%5!<%P!<$N$$$/$D$+$,Mn$A$F$$$k$+$b$7$l$J$$!#(B + +Getting News + +* NNTP:: @sc{nntp} $(B%5!<%P!<$+$i%K%e!<%9$rFI$`!#(B +* News Spool:: $(B%m!<%+%k%9%W!<%k$+$i%K%e!<%9$rFI$`!#(B + +Getting Mail + +* Mail in a Newsreader:: $(B%K%e!<%9%j!<%@$G%a!<%k(B ($(BBg;v$JA0CV$-(B)$(B!#(B +* Getting Started Reading Mail:: $(B4JC1$JNAM}K\$N$h$&$JNc!#(B +* Splitting Mail:: $(B$I$N$h$&$K%a!<%k%0%k!<%W$r:n@.$9$k$+!#(B +* Mail Sources:: Gnus $(B$K$I$3$+$i%a!<%k$r$N%U%!%$%k$rFI$`$?$a$K%a!<%k%P%C%/%(%s%I$r;H$&!#(B +* Choosing a Mail Backend:: Gnus $(B$O?'!9$J%a!<%kMM<0$rFI$`;v$,$G$-$k!#(B + +Mail Sources + +* Mail Source Specifiers:: $(B%a!<%k$N85$,$I$3$+$r;XDj$9$k!#(B +* Mail Source Customization:: $(B@$$NCf$K1F6A$9$k$$$/$D$+$NJQ?t!#(B +* Fetching Mail:: $(B%a!<%k%=!<%9;X<(;R$r;HMQ$9$k!#(B + +Choosing a Mail Backend + +* Unix Mail Box:: ($(B$H$F$b(B) $(BI8=`E*$J(B Un*x mbox $(B$r;H$&!#(B +* Rmail Babyl:: Emacs $(B$N%W%m%0%i%`$O(B rmail $(B$N(B babyl format $(B$r;H$&!#(B +* Mail Spool:: $(B$"$J$?$N%a!<%k$r;dE*$J%9%W!<%k$KN/$a$k!)(B +* MH Spool:: mhspool $(B$N$h$&$J%P%C%/%(%s%I!#(B +* Mail Folders:: $(B$=$l$>$l$N%0%k!<%W$KBP$7$F0l$D$N%U%!%$%k$r;}$D!#(B +* Comparing Mail Backends:: $(BF@<:$N?<$$F6;!!#(B + +Browsing the Web + +* Web Searches:: $(BJ8;zNs$K%^%C%A$9$k5-;v$+$i%0%k!<%W$r:n$k!#(B +* Slashdot:: Slashdot $(B$N%3%a%s%H$rFI$`!#(B +* Ultimate:: Ultimate Bulletin Board $(B%7%9%F%`(B. +* Web Archive:: $(B%&%'%V$KJ]4I$5$l$?%a!<%j%s%0%j%9%H$rFI$`!#(B +* Customizing w3:: Gnus $(B$+$i(B Emacs/w3 $(B$rA`:n$9$k!#(B + +Other Sources + +* Directory Groups:: $(B%G%#%l%/%H%j!<$r%K%e!<%9%0%k!<%W$N$h$&$KFI$`!#(B +* Anything Groups:: Dired? $(BC/$,(B dired $(B$J$s$F;H$&$N(B? +* Document Groups:: $(B8DJL$N%U%!%$%k72$O%0%k!<%W$NAG!#(B +* SOUP:: @sc{soup} $(B%Q%1%C%H$r(B ``$(B%*%U%i%$%s(B''$(B$GFI$`!#(B +* Mail-To-News Gateways:: $(B%a!<%k$+$i%K%e!<%9$X$N%2!<%H%&%'%$$rDL$7$F5-;v$rEj9F$9$k!#(B +* IMAP:: Gnus $(B$r(B IMAP $(B$N%/%i%$%"%s%H$H$7$F;H$&!#(B + +Document Groups + +* Document Server Internals:: $(B$"$J$?FH<+$NJ8=q$NMxMQC$9J}K!!#(B +* Outgoing Messages:: $(BEj9F!"%a!<%k$r=P$9$H$-$K$J$K$,5/$3$k$N$+(B? +* Agent Variables:: $(B%+%9%?%^%$%:$O3Z$7!#(B +* Example Setup:: $(B%*%U%i%$%s?M4V$N$?$a$N(B @file{.gnus.el} $(B$NNc!#(B +* Batching Agents:: @code{cron} $(B%8%g%V$K$h$k%K%e!<%9e$2$k$+!#(B +* Mode Lines:: $(B%b!<%I9T$K>pJs$rI=<($9$k!#(B +* Highlighting and Menus:: $(B%P%C%U%!$rAGE($G?4CO$h$/8+$;$k!#(B +* Buttons:: $(B4JC1$J(B10$(BJb$G%"%-%l%9g'$rF@$k!#(B +* Daemons:: Gnus $(B$O$"$J$?$NN"$GJ*;v$r$NB@$j$d$9$$?);v$rHr$1$kJ}K!!#(B +* Undo:: $(B$$$/$D$+$NF0:n$O85$KLa$9;v$,$G$-$k!#(B +* Moderation:: $(B$"$J$?$,%b%G%l!<%?!<$@$C$?$i$I$&$9$k$+!#(B +* XEmacs Enhancements:: XEmacs $(B$G$O$b$C$H3($d$=$NB>$N$b$N$,B8:_$9$k!#(B +* Fuzzy Matching:: $(BBg$-$JLJLS$C$F2?!)(B +* Thwarting Email Spam:: $(BM>7W$J>&6HE*EE;R%a!<%k$rHr$1$kJ}K!!#(B +* Various Various:: $(BK\Ev$K$$$m$$$m$J$b$N!#(B + +Formatting Variables + +* Formatting Basics:: $(B=qK!;EMMJQ?t$O4pK\E*$K=qK!;XDjJ8;zNs$G$"$k!#(B +* Mode Line Formatting:: $(B%b!<%I9T$N=qK!;EMMJQ?t$K4X$9$k$$$/$D$+$N5,B'!#(B +* Advanced Formatting:: $(B?'!9$JJ}K!$G=PNO$r=$@5$9$k!#(B +* User-Defined Specs:: Gnus $(B$K$"$J$?<+?H$N4X?t$r8F$P$;$k!#(B +* Formatting Fonts:: $(B;EMM$rB?:L$GAGE($K8+$;$k!#(B + +XEmacs Enhancements + +* Picons:: $(B$"$J$?$,FI$s$G$$$k$b$N$N3($rI=<($9$kJ}K!!#(B +* Smileys:: $(BI=<($5$l$k$Y$/@8$^$l$?9,$;$=$&$J4i$rI=<($9$kJ}K!!#(B +* Toolbar:: $(B%/%j%C%/1n!#(B +* XVarious:: $(B$=$NB>$N(B XEmacs $(B$G(B Gnus $(B$JJQ?t!#(B + +Picons + +* Picon Basics:: picon $(B$H$O2?$G!"$I$&$d$C$F$N$V$C2u$7$?$j$R$M$C$?$j$$$8$C$?$jM7$s$@$j$9$kJQ?t!#(B + +Appendices + +* History:: $(B$I$&$d$C$F(B gnus $(B$,:#F|$N$h$&$K$J$C$?$+!#(B +* On Writing Manuals:: $(B$J$<$3$l$,=i?4ee$N$b$N(B---Gnus 5.4/5.5 +* Quassia Gnus:: 2$(B$+$1$k(B2$(B$O(B4$(B!"$b$7$/$O(B Gnus 5.6/5.7$(B!#(B + +Customization + +* Slow/Expensive Connection:: $(B%m!<%+%k$N(B Emacs $(B$rN)$A>e$2$F!"(B + $(BB>$N$H$3$m$+$i%K%e!<%9$rF@$k;v$,$G$-$k!#(B +* Slow Terminal Connection:: $(B1s3V(B Emacs $(B$rpJs7A<0!#(B +* Extended Interactive:: $(B5-9f@\F,<-$J$I!#(B +* Emacs/XEmacs Code:: Gnus $(B$OA4$F$N6aBe(B Emacsen $(B$GF0:n$9$k!#(B +* Various File Formats:: Gnus $(B$N;HMQ$9$k%U%!%$%k$N7A<0!#(B + +Backend Interface + +* Required Backend Functions:: $(BpJs!#(B +* Newsgroups File Format:: $(B%0%k!<%W$N5-=R!#(B + +Emacs for Heathens + +* Keystrokes:: $(BJ8>O$rF~NO$7$FL?Na$r.$5$$!K%l%Y%k$N%0%k!<%W$K0\F0$7$^$9!#$3$l$O;D$j$N%0%k!<%W$rFI$`(B $(B$h$j@h$K!"$h$j=EMW$J%0%k!<%W$rFI$s$G$*$-$?$$$H$-$K$OJXMx$+$b$7$l$^$;$s!#(B +$(B$b$7$3$NCM$,(B @code{best} $(B$@$C$?$i!":G$b=EMW$J(B ($(B:G$b%l%Y%k$NCM$,>.$5$$(B) +$(B%0%k!<%W$K0\F0$7$^$9!#(B + @vindex gnus-group-default-list-level $(B=i4|@_Dj$G$O(B @code{gnus-group-default-list-level} $(B$HF1$8$+$=$l(B $(B$h$j>.$5$$%l%Y%k$N%0%k!<%W$,!"%0%k!<%W%P%C%U%!$K0lMwI=<($5$l$^$9!#(B @@ -6537,9 +7006,11 @@ Signature}. @kindex W W l (Summary) @findex gnus-article-hide-list-identifiers @vindex gnus-list-identifiers -@code{gnus-list-identifiers} $(B$G;XDj$5$l$F$$$k%a!<%j%s%0%j%9%H$NI8<1$r1#(B -$(B$7$^$9!#$3$l$i$O$$$/$D$+$N%j%9%H$N%5!<%P!<$,A4$F$N(B @code{Subject} $(B%X%C%@!<(B -$(B$N:G=i$K$D$1$kJ8;zNs$G$9(B---$(BNc$($P!"(B@samp{[zebra 4711]}$(B!#(B +@code{gnus-list-identifiers} $(B$G;XDj$5$l$F$$$k%a!<%j%s%0%j%9%H$NI8<1$r:o(B +$(B=|$7$^$9!#$3$l$i$O$$$/$D$+$N%a!<%j%s%0%j%9%H$N%5!<%P!<$,A4$F$N(B +@code{Subject} $(B%X%C%@!<$N:G=i$K$D$1$kJ8;zNs$G$9(B---$(BNc$($P!"(B +@samp{[zebra 4711]}$(B!#J8;zNs$N=i$a$K$"$k(B @samp{Re: } $(B$O!":o=|$r9T$J$&A0$K(B +$(BD7$S1[$5$l$^$9!#(B @table @code @@ -7913,7 +8384,10 @@ Parameters}) $(B$rJT=8$7$^$9(B (@code{gnus-summary-edit-parameters})$(B!#(B @end table @vindex gnus-exit-group-hook -$(B8=:_$N%0%k!<%W$rH4$1$k$H$-$K(B @code{gnus-exit-group-hook} $(B$,8F$P$l$^$9!#(B +$(B8=:_$N%0%k!<%W$r!"%0%k!<%W$NA4$F$N>pJs$r99?7$7$FH4$1$k$H$-$K(B +@code{gnus-exit-group-hook} $(B$,8F$P$l$^$9!#(B +@kbd{Q} $(BL?Na(B (@code{gnus-summary-exit-no-update}) $(B$G$O!"$3$N%U%C%/$r8F$S(B +$(B$^$;$s!#(B @findex gnus-summary-wake-up-the-dead @findex gnus-dead-summary-mode @@ -8624,6 +9098,21 @@ gnus $(B$O>o$KEj9F$K$I$NJ}K!$r;H$&$+$r$"$J$?$K?R$M$^$9!#(B (add-hook 'message-send-hook 'ispell-message) @end lisp +$(B$b$7$"$J$?$,(B @code{ispell} $(B$N<-=q$r%0%k!<%W$K1~$8$F@Z$jBX$($?$$$J$i$P!"(B +$(B0J2<$N$h$&$K$9$l$PNI$$$G$7$g$&!#(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 + +$(B$"$J$?$NI,MW$K1~$8$FJQ99$7$F2<$5$$!#(B + @node Archived Messages @section $(B%a%C%;!<%8$NJ]4I(B @@ -8834,7 +9323,7 @@ Gnus $(B$O30$X=P$F9T$/A4$F$N%a%C%;!<%8$K!"0l$D$+$=$l0J>e$N$=$N%5!<%P!<$N%0%k!< (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") @@ -10235,7 +10724,7 @@ UNDELETED} $(B$O$*$=$i$/$?$$$F$$$N?M$K$O:GNI$NA*Br$G$7$g$&$,!"$H$-$I$-(B IMAP $(B%a!<%k%=!<%9$NNc(B: @lisp -(imap :server "mail.mycorp.com" :stream kerberos4) +(imap :server "mail.mycorp.com" :stream kerberos4 :fetchflag "\\Seen") @end lisp @item webmail @@ -11396,8 +11885,12 @@ Gnus $(B$O$3$l$i$N%=!<%9$X$N3&LL$rDs6!$9$k%P%C%/%(%s%I72$r>/$7Hw$($D$D$"$j(B * Slashdot:: Slashdot $(B$N%3%a%s%H$rFI$`!#(B * Ultimate:: Ultimate Bulletin Board $(B%7%9%F%`(B. * Web Archive:: $(B%&%'%V$KJ]4I$5$l$?%a!<%j%s%0%j%9%H$rFI$`!#(B +* Customizing w3:: Gnus $(B$+$i(B Emacs/w3 $(B$rA`:n$9$k!#(B @end menu +$(B$9$Y$F$N%&%'%V%=!<%9$O!"F0:n$5$;$k$?$a$K(B Emacs/w3 $(B$H(B url $(B%i%$%V%i%j$,I,(B +$(BMW$G$9!#(B + $(B$3$l$i$N%&%'%V%=!<%9$N0lHV$NLdBj$OD94|4V$OF0:n$7$J$$2DG=@-$,9b$$$3$H$G$9!#(B @sc{html} $(B%G!<%?$+$i>pJs$r=8$a$k$N$O$;$$$<$$?dB,$G!"9=B$$,JQ2=$7$?$H$-$K(B $(B$O!"(Bgnus $(B%P%C%/%(%s%I$OF0:n$7$^$;$s!#$G$b!"$"$kDxEY?7$7$$%P!<%8%g%s$N%P%C(B @@ -11610,6 +12103,7 @@ Ultimate $(B%&%'%V%5%$%H$K$O$?$/$5$s5s$2$i$l$F$$$^$9!#(B) $(B$=$l$+$i%5!<%P!< @samp{~/News/ultimate/} $(B$G$9!#(B @end table + @node Web Archive @subsection Web Archive @cindex nnwarchive @@ -11645,6 +12139,39 @@ an_egroup RET egroups RET www.egroups.comRET your@@email.address RET}$(B!#(B $(B%&%'%V%5!<%P!<$G$N%"%+%&%s%H$N%Q%9%o!<%I$G$9!#(B @end table + +@node Customizing w3 +@subsection w3 $(B$N%+%9%?%^%$%:(B +@cindex w3 +@cindex html +@cindex url +@cindex Netscape + +Gnus $(B$O%&%'%V%Z!<%8$rH$5$;(B +$(B$k$K$O$I$&$7$?$i$h$$$+!"$H$$$&$N$,$"$j$^$9!#0J2<$O0l$D$NJ}K!$G$9!#(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 + +$(B$3$l$r$"$J$?$N(B .emacs $(B%U%!%$%k$K=q$-9~$`$3$H$K$h$C$F!"(BGnus $(B$N5-;v%P%C%U%!(B +$(B$G(B @sc{html} $(B%j%s%/$rC!$1$P!"(B@code{browse-url} $(B$r;H$C$F$=$N%j%s%/$r;2>H(B +$(B$9$k$h$&$K$J$k$G$7$g$&!#(B + + @node Other Sources @section $(B$=$NB>$N%0%k!<%W8;(B @@ -12397,18 +12924,36 @@ REFERENCE $(B$,;HMQ$5$l$k$+$O%5!<%P!J}$r%5%]!<%H$7$^$9!#(B + +SSL $(B@\B3$N$?$a$N(B OpenSSL $(B%W%m%0%i%`$O(B @file{http://www.openssl.org/} $(B$+(B +$(B$iF~Z$G$9!#(B +@dfn{gssapi:} GSSAPI ($(BIaDL$O(B kerberos 5) $(BG'>Z$G$9!#30It%W%m%0%i%`(B +@code{imtest} $(B$,I,MW$G$9!#(B +@item +@dfn{kerberos4:} Kerberos $(BG'>Z$G$9!#30It%W%m%0%i%`(B @code{imtest} $(B$,I,MW(B +$(B$G$9!#(B +@item +@dfn{digest-md5:} DIGEST-MD5 $(B$G0E9f2=$5$l$?(B $(BMxMQ(B/$(B%Q%9%o!<%I(B $(B$G$9!#30(B +$(BIt%i%$%V%i%j(B @code{digest-md5.el} $(B$,I,MW$G$9!#(B @item @dfn{cram-md5:} CRAM-MD5 $(B$G0E9f2=$5$l$?(B $(BMxMQ(B/$(B%Q%9%o!<%I(B $(B$G$9!#(B @item @@ -12562,6 +13114,40 @@ Nnmail $(B$NMxMQl9g$O(B @samp{UNDELETED} $(B$KJQ$($l$PNI$$(B +$(B$G$7$g$&!#(B + +@item nnimap-split-fancy +@cindex splitting, fancy +@findex nnimap-split-fancy +@vindex nnimap-split-fancy + +$(B$b$7$"$J$?$,FC5iJ,3d$r;H$$$?$$$J$i$P!"(B@code{nnimap-split-rule} $(B$NCM$r(B +@code{nnmail-split-fancy} $(B$K@_Dj$9$k$3$H$,$G$-$^$9!#(B +@xref{Fancy Mail Splitting}$(B!#(B + +$(B$7$+$7(B nnmail $(B$H(B nnimap $(B$H$G0[$J$kFC5iJ,3dJ}<0$r;}$D$h$&$K$9$k$K$O!"(B +@code{nnimap-split-rule} $(B$NCM$r(B @code{nnimap-split-fancy} $(B$K@_Dj$7$F!"(B +nnimap $(BFCM-$NFC5iJ,3dJ}<0$r(B @code{nnimap-split-fancy} $(B$KDj5A$7$F2<$5$$!#(B + +$(BNc(B: + +@lisp +(setq nnimap-split-rule 'nnimap-split-fancy + nnimap-split-fancy ...) +@end lisp + +Nnmail $(B$GBP1~$9$k$b$N(B: @code{nnmail-split-fancy}. + @end table @node Editing IMAP ACLs @@ -15454,6 +16040,12 @@ Gnus $(B$O(B1$(BF|$K(B1$(B2s%9%3%"$rIeGT$5$;$h$&$H$7$^$9!#Nc$($P!"$b$7(B g $(B$D$NL$FI5-;v$r4{FI$K$7$^$9!#$b$C$HJ,$+$j$d$9$$F0:n$N$?$a$K$O(B @code{gnus-summary-goto-unread} $(B$r(B @code{nil} $(B$K@_Dj$7$F$/$@$5$$!#(B +$(BB?$/$N%3%^%s%I$O%W%m%;%9(B/$(B@\F,0z?t$N=,47$r;H$$$^$;$s!#$H$$$&$3$H$O!"$3$N(B +$(B%^%K%e%"%k$G$O$C$-$j$H=R$Y$F$$$^$9!#%W%m%;%9(B/$(B@\F,0z?t$N=,47$r;H$o$J$$%3(B +$(B%^%s%I$KE,MQ$9$k$K$O!"(B@kbd{M-&} $(B%3%^%s%I$r;H$$$^$7$g$&!#Nc$($P!"$=$N%0%k!<(B +$(B%W$N$9$Y$F$N5-;v$r4|8B@Z$l:o=|2DG=$H$7$F0u$rIU$1$k$K$O(B `M P b M-& E' $(B$H(B +$(B$7$^$9!#(B + @node Interactive @section $(BBPOCE*(B diff --git a/texi/gnus.texi b/texi/gnus.texi index 02a39cd..01a6e82 100644 --- a/texi/gnus.texi +++ b/texi/gnus.texi @@ -393,7 +393,6 @@ the program. @end iftex - @menu * Starting Up:: Finding news can be a pain. * The Group Buffer:: Selecting, subscribing and killing groups. @@ -407,6 +406,465 @@ the program. * 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 @@ -1740,6 +2198,9 @@ will go to the next group of the same level (or lower). This might be 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 @@ -6611,9 +7072,10 @@ Signature}. @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 @@ -7345,7 +7807,31 @@ on a group-by-group basis using the group parameters (@pxref{Group 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 @@ -8229,8 +8715,9 @@ command will make exit without updating (the @kbd{Q} command) worthless. @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 @@ -8965,6 +9452,21 @@ spell-checking via the @code{ispell} package: (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 @@ -9182,7 +9684,7 @@ So here's a new example: (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") @@ -10639,7 +11141,7 @@ after finishing the fetch. 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 @@ -11846,8 +12348,11 @@ interfaces to these sources. * 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 @@ -12067,6 +12572,7 @@ The directory where @code{nnultimate} stores its files. The default is @samp{~/News/ultimate/}. @end table + @node Web Archive @subsection Web Archive @cindex nnwarchive @@ -12103,6 +12609,38 @@ The account name on the web server. 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 @@ -12834,17 +13372,36 @@ Example: @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 @@ -12853,7 +13410,14 @@ will use the most secure authenticator your server is capable of. @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 @@ -13003,6 +13567,18 @@ The splitting code tries to create mailboxes if it need too. 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 @@ -15839,6 +16415,12 @@ will mark the next three unread articles as read, no matter what the 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