From: tomo Date: Tue, 4 Sep 2001 11:19:04 +0000 (+0000) Subject: This commit was manufactured by cvs2svn to create branch 'grossjoh'. X-Git-Url: http://git.chise.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fheads%2Fgrossjoh;p=elisp%2Fgnus.git- This commit was manufactured by cvs2svn to create branch 'grossjoh'. --- diff --git a/ChangeLog b/ChangeLog deleted file mode 100644 index 9941366..0000000 --- a/ChangeLog +++ /dev/null @@ -1,999 +0,0 @@ -2001-09-04 KOSEKI Yoshinori - - * lisp/nnir.el: Add namazu support. - -2001-09-04 TSUCHIYA Masatoshi - - * lisp/nnir.el: Import from - ftp://ls6-ftp.cs.uni-dortmund.de/pub/src/emacs/nnir.el. - -2001-08-29 Katsumi Yamaoka - - * lisp/gnus-util.el (gnus-truncate-string): Abolished. - -2001-08-18 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el (gnus-group-make-shimbun-group): Call - `shimbun-groups' to detect avaiable groups of specified server. - -2001-08-17 KANEMATSU Daiji - - * lisp/message.el (message-signature-separator-for-insertion): New - customizable variable which is used for signature separator. - * lisp/message.el (message-insert-signature): Use variable - `message-signature-separator-for-insertion' instead of hard code. - -2001-08-15 Yoichi NAKAYAMA - - * texi/gnus-ja.texi (Browsing the Web): Fix typo. - -2001-08-13 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 06. - -2001-08-10 Katsumi Yamaoka - - * lisp/gnus-art.el (gnus-request-article-this-buffer): Insert an - article into `gnus-original-article-buffer' instead of - `gnus-article-buffer'. - -2001-07-31 Katsumi Yamaoka - - * lisp/mml2015.el: Require `gnus-clfns' when compiling. - * lisp/gnus-clfns.el (string-to-list): New compiler macro. - -2001-07-30 Katsumi Yamaoka - - * lisp/gnus-sum.el (gnus-select-newsgroup): Don't examine cached - articles with `gnus-cache-articles-in-group' even if the current - group is not a virtual group (see ChangeLog.1 1999-03-02). - -2001-07-30 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 05. - - * lisp/nnmh.el (nnmh-retrieve-parsed-headers): Abolished. - - * lisp/gnus-sum.el (gnus-get-newsgroup-headers-xover): Don't use - `gnus-retrieve-parsed-headers'. - (gnus-fetch-headers): Ditto. - - * lisp/gnus-int.el (gnus-retrieve-parsed-headers): Abolished. - - * lisp/gnus-cache.el (gnus-cache-braid-headers): Abolished. - (gnus-cache-retrieve-parsed-headers): Abolished. - -2001-07-30 Katsumi Yamaoka - - * lisp/nnshimbun.el (nnshimbun-request-expire-articles): Bind - `nnmail-expiry-wait-function' to nil if the group's parameter - `expiry-wait' is specified by the user or the shimbun's default - value is provided. - -2001-07-27 Katsumi Yamaoka - - * lisp/gnus-msg.el (gnus-message-make-user-agent): New - implementation. - -2001-07-24 Katsumi Yamaoka - - * lisp/gnus-clfns.el (copy-list): New compiler macro. - -2001-07-23 Katsumi Yamaoka - - * lisp/gnus-delay.el (gnus-delay-initialize): Don't use the macro - `kbd'. - - * lisp/nnheader.el (mm-read-coding-system): New function which is - a substitute for mm-util.el. - -2001-07-19 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 04. - - * lisp/nntp.el (nntp-request-newgroups): Use UTC date for - NEWGROUPS command. - - * lisp/gnus-start.el (gnus-find-new-newsgroups): Use - `message-make-date' instead of `current-time-string'. - (gnus-ask-server-for-new-groups): Ditto. - (gnus-check-first-time-used): Ditto. - -2001-07-17 Katsumi Yamaoka - - * texi/message-ja.texi (message-citation-line-function): Add a - comma just after the `@xref' form. - - * lisp/nnheader.el (nnheader-header-value): Ignore leading - whitespaces. - - * lisp/dgnushack.el (dgnushack-make-auto-load): Advise - `make-autoload' to handle `define-derived-mode'. - -2001-07-12 Katsumi Yamaoka - - * lisp/message.el (message-yank-original): Unwind-protect while - suspending font-lock. - (message-mode): Modify for the following changes. - (message-font-lock-keywords-2): Abolished. - (message-font-lock-keywords-1): Abolished. - (message-font-lock-keywords): Unified. - (message-font-lock-cited-text-matcher): Abolished. - (font-lock-after-change-function): Don't advise it. - (message-font-lock-last-position): Abolished. - (message-font-lock-citation-name-max-column): Abolished. - (message-font-lock-cited-text-regexp) Abolished. - (message-font-lock-fence-close-position): Abolished. - (message-font-lock-fence-open-position): Abolished. - (message-font-lock-fence-close-regexp): Abolished. - (message-font-lock-fence-open-regexp): Abolished. - -2001-07-10 Katsumi Yamaoka - - * lisp/message.el (message-font-lock-keywords-1): Replace regexp - for mml tags with `mime-edit-tag-regexp'. - -2001-07-10 Katsumi Yamaoka - - * lisp/message.el (message-font-lock-keywords-2): Move definitions - for cited texts and mml tags to `message-font-lock-keywords-1'. - -2001-07-10 Katsuhiro Hermit Endo - - * texi/gnus-ja.texi (Mail Group Commands): Fix a slight mistake. - -2001-07-09 Katsumi Yamaoka - - * lisp/dgnushack.el: Add the parent directory of the directory - where the APEL modules are installed to `load-path' according to - the description of the file Mule23@1934. - -2001-07-04 Yair Friedman - - * make.bat: Use infohack.el to create info files. - -2001-07-09 Akihiro Arisawa - - * README.semi: Modify URI of emacs-w3m. - * README.semi.ja: Ditto. - * Mule23@1934.en: Ditto. - * Mule23@1934.ja: Ditto. - * lisp/nnshimbun.el: Ditto. - - * texi/gnus-ja.texi (Top, Article Treatment): Fix typo. - (Web Newspaper): Modify URI of emacs-w3m. - -2001-07-06 KITAGAWA Takurou - - * lisp/Makefile.in (clever): Use `if test... then' instead of - `test... &&'. - -2001-07-06 Katsumi Yamaoka - - * lisp/Makefile.in (clever): Change the quoting style for the - elisp form to check for XEmacs-p. - - * lisp/dgnushack.el: Require `path-util' first, and then search - for the path if it is not found. - -2001-07-05 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 03. - -2001-06-28 Akitada Koyama - - * texi/gnus-ja.texi (Web Newspaper): Add a description how to show - html documents inline. - -2001-06-28 Katsumi Yamaoka - - * texi/message-ja.texi (message-suspend-font-lock-when-citing): Add - a description. - * texi/message.texi (message-suspend-font-lock-when-citing): Ditto. - - * lisp/message.el (message-yank-original): Suspend font-lock'ing - while citing an original message. - (message-suspend-font-lock-when-citing): New user option. - -2001-06-25 Katsumi Yamaoka - - * lisp/gnus-clfns.el (find-cl-run-time-functions): New - implementation. - -2001-06-22 Katsumi Yamaoka - - * lisp/gnus-art.el (article-display-x-face): Don't gather X-Face - fields in `gnus-original-article-buffer'. - -2001-06-18 Katsumi Yamaoka - - * lisp/nnshimbun.el (nnshimbun-find-parameter): Undo the last - bogus changes; use the value of `nnshimbun-pre-fetch-article' if - the value of the group parameter `prefetch-articles' is nil; do - likewise for `encapsulate-images'. - -2001-06-18 Katsumi Yamaoka - - * lisp/nnshimbun.el (nnshimbun-find-parameter): Use the value of - `nnshimbun-pre-fetch-article' if the value of the group parameter - `prefetch-articles' is `off'; do likewise for `encapsulate-images'. - -2001-06-18 Katsumi Yamaoka - - * lisp/nnshimbun.el (nnshimbun-encapsulate-images): Fix a - doc-string that both the values `off' and nil specifies not to - encapsulate images. - (nnshimbun-pre-fetch-article): Default to `off'. - -2001-06-18 Katsumi Yamaoka - - * lisp/nnshimbun.el (nnshimbun-encapsulate-images): Renamed from - `nnshimbun-encapsulate-article'. - (nnshimbun-request-article-1): Replace `encapsulate-article' with - `encapsulate-images'. - (nnshimbun-find-parameter): Ditto. - (nnshimbun-group-parameters): Ditto. - (nnshimbun-group-parameters-custom): Ditto. - -2001-06-15 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el (nnshimbun-group-parameters-custom): Add - `encapsulate-article' as a customizable option, and modified - `prefetch-articles'. - (nnshimbun-group-parameters): Add document for - `encapsulate-article'. - (nnshimbun-encapsulate-article): New server variable. - (nnshimbun-find-parameter): Add code for `encapsulate-article'. - (nnshimbun-request-article-1): Refer `encapsulate-article' group - parameter to control `shimbun-encapsulate-article' value when - `shimbun-article' is called. - -2001-06-14 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 02. - -2001-06-14 Katsumi Yamaoka - - * lisp/nnshimbun.el (nnshimbun-request-expire-articles): Use - `nnshimbun-find-parameter'. - (nnshimbun-generate-nov-database): Bind a full group name while - processing. - (nnshimbun-find-parameter): New implementation to refer to the - nnshimbun group parameters. - (nnshimbun-index-range): Add a document that it's just a default. - (nnshimbun-pre-fetch-article): Ditto. - (nnshimbun-group-parameters): Specify a parameter type as `list'. - (TopLevel): Remove the local variable "-*- coding: junet; -*-". - -2001-06-13 Katsumi Yamaoka - - * lisp/nnshimbun.el (nnshimbun-group-parameters): New group - parameter. It also provides the user option - `nnshimbun-group-parameters-alist' and the function - `nnshimbun-find-group-parameters'. - (nnshimbun-group-parameters-custom): New variable. - (TopLevel): Require `gnus' expressly. - -2001-06-12 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el (nnshimbun-find-parameter): New macro. - (nnshimbun-generate-nov-database): Use `nnshimbun-find-parameter'. - (nnshimbun-request-expire-articles): Fixed. - -2001-06-12 Katsumi Yamaoka - - * lisp/nnshimbun.el (Gnus-p): Use `file-exists-p' instead of - `locate-library' to check for the existence of mailcap.el in the - same directory of gnus.el. - (nnshimbun-retrieve-headers-with-nov): Remove a redundant check - that I made. - -2001-06-11 Katsumi Yamaoka - - * lisp/lpath.el: Don't Fbind `xml-node-children'. - -2001-06-11 Akihiro Arisawa - - * lisp/nnshimbun.el (nnshimbun-request-expire-articles): Fix - inhibiting the expiring when `nnshimbun-keep-unparsable-dated-articles' - is nil. - -2001-06-11 TSUCHIYA Masatoshi - - * lisp/gnus-group.el (toplevel): Removed autoload code for - "nnshimbun". - - * texi/gnus-ja.texi (Web Newspaper): Add documents about - `nnshimbun-index-range'. - -2001-06-11 Katsumi Yamaoka - - * lisp/nnshimbun.el (nnshimbun-request-expire-articles): Don't - refer to the variable `nnshimbun-keep-last-article', we should - keep the last article anyway. - (nnshimbun-keep-last-article): Abolished. - - * lisp/gnus.el: Autoload "nnshimbun" for the command `gnus-group- - make-shimbun-group'. - -2001-06-11 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el: Remove some garbage. - -2001-06-10 Katsumi Yamaoka - - * texi/message-ja.texi: Use `iso-2022-7bit' instead of - `iso-2022-7bit-ss2' to keep a compatibility between XEmacsen and - FSF Emacsen. - * texi/gnus-ja.texi: Ditto. - -2001-06-09 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el (top-level): Updated comments. - (nnshimbun): New customize group. - (nnshimbun-keep-last-article): Defined as customize variable. - (nnshimbun-keep-unparsable-dated-articles): Ditto. - (nnshimbun-insert-nov): Use `when' instead of `if'. - (gnus-group-shimbun-server-history): Imported from - `gnus-group.el'. - (gnus-group-make-shimbun-group): Ditto. - - * lisp/gnus-group.el (gnus-group-make-shimbun-group): Its real - definition is moved to `nnshimbun.el' and autload code is added. - (gnus-group-shimbun-server-history): Its definition is moved to - `nnshimbun.el'. - -2001-06-08 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el (nnshimbun-use-entire-index): Removed. - (nnshimbun-index-range): New variable. - (nnshimbun-close-server): Check status strictly to close server - safely. - (nnshimbun-generate-nov-database): Refer the group paramter - `nnshimbun-index-range' as the second parameter of - `shimbun-headers'. - (shimbun-mua-use-entire-index): Removed. - (nnshimbun-request-article-1): Replace a date string in - `gnus-newsgroup-data' only when article header has non-nil value. - (nnshimbun-insert-nov): Fixed condition to decide whether - `X-Nnshimbun-Id' should be inseted or not. - -2001-06-08 Katsumi Yamaoka - - * lisp/nnshimbun.el (nnshimbun-expire-nov-databases): Removed. - (nnshimbun-request-expire-articles): Simplified; refer to the - shimbun's default expiration days. - -2001-06-08 Katsumi Yamaoka - - * lisp/lpath.el: Fbind `xml-node-children' for XEmacsen and old FSF - Emacsen. - -2001-06-07 Katsumi Yamaoka - - * lisp/nnshimbun.el (nnshimbun-request-expire-articles): Prefer the - group parameter `expiry-wait' when expiring a closed group. - -2001-06-07 Katsumi Yamaoka - - * lisp/nnshimbun.el (nnshimbun-request-article-1): Replace a date - string in `gnus-newsgroup-data' based on the newly retrieved - article. - -2001-06-07 Katsumi Yamaoka - - * lisp/nnshimbun.el (nnshimbun-request-expire-articles): Fix - inhibiting the expiring. - -2001-06-06 Katsumi Yamaoka - - * lisp/nnshimbun.el (nnshimbun-expire-nov-databases): New command. - (nnshimbun-request-expire-articles): New function. - (nnshimbun-keep-unparsable-dated-articles): New variable. - (nnshimbun-keep-last-article): New variable. - (nnshimbun-insert-nov): Rewrite using `nnshimbun-string-or'. - (nnshimbun-string-or): New macro. - (nnshimbun-tmp-string): New internal variable. - (TopLevel): Require `message' for `message-make-date'. - -2001-05-30 Katsumi Yamaoka - - * lisp/gnus-clfns.el (find-cl-run-time-functions): Remove a - useless non-global var; scroll the output window automatically. - -2001-05-31 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el (nnshimbun-header-xref): Removed. - (nnshimbun-check-header): Removed. - (nnshimbun-make-shimbun-header): Don't call - `nnshimbun-header-xref'. - (nnshimbun-request-group): Simplified. - (nnshimbun-request-article-1): Call `nnshimbun-replace-nov-entry' - instead of `nnshimbun-check-header'. - (nnshimbun-insert-nov): New function. - (nnshimbun-generate-nov-database): Call `nnshimbun-insert-nov' - instead of `nnheader-insert-nov'. - (nnshimbun-replace-nov-entry): New function. - -2001-05-29 Katsumi Yamaoka - - * lisp/gnus-clfns.el (find-cl-run-time-functions): Add a parser for - `dolist'; protect against errors. - -2001-05-29 Katsumi Yamaoka - - * lisp/nnshimbun.el (nnshimbun-retrieve-headers-with-nov): Don't - use `last'. - (nnshimbun-make-shimbun-header): Use the following macros. - (nnshimbun-mail-header-from): New macro whose definition will be - changed statically for Gnus or gnus. - (nnshimbun-mail-header-subject): Ditto. - (TopLevel): Don't require `gnus-clfns'. - - * lisp/gnus.el: Add autoload for `find-cl-run-time-functions'. - - * lisp/gnus-clfns.el (find-cl-run-time-functions): New command for - the developers. - (cl-run-time-functions): New variable. - (TopLevel): Don't require `cl' at run-time. - -2001-05-28 TSUCHIYA Masatoshi - - * texi/gnus-ja.texi (Web Newspaper): Updated. - -2001-05-28 Katsumi Yamaoka - - * lisp/dgnushack.el (dgnushack-unexporting-files): Add - "nnshimbun.el" if the library "shimbun" is not found. - (TopLevel): Add "/somewhere/apel/" to `load-path' if it is needed. - (locate-library): Redefine it for Mule before it is called. - - * README.semi.ja: Update for the use of Emacs-W3M. - * README.semi: Ditto. - * Mule23@1934.ja: Ditto. - * Mule23@1934.en: Ditto. - -2001-05-28 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el: Reconstructed to use `shimbun'. - - * lisp/gnus-group.el (gnus-group-make-shimbun-group): - Reconstructed to use `shimbun'. - - * lisp/dgnushack.el (toplevel): Add paths if and only if APEL and - FLIM can't be found. - -2001-05-17 Kai =?iso-8859-1?q?Gro=DFjohann?= - - * etc/Makefile.in (datadir): Set this variable, like in the other - Makefile.in's. Patch from Gaute B Strokkenes . - -2001-05-16 Katsumi Yamaoka - - * lisp/dgnushack.el (dgnushack-bind-colon-keywords): Don't ignore - `widget-convert-button', `widget-create' and `widget-put'; ignore - `defface'. - -2001-05-14 Katsumi Yamaoka - - * lisp/gnus.el: Require `base64' if `base64-encode-string' is not a - built-in function. - - * lisp/dgnushack.el (dgnushack-bind-colon-keywords): Ignore - `defgroup'. - -2001-05-14 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 01. - - * lisp/nnmail.el: Don't bind the colon keywords here. - * lisp/gnus.el (gnus-colon-keywords): New variable which will - default to the value of `dgnushack-colon-keywords'; bind them. - * lisp/dgnushack.el (dgnushack-unexporting-files): Add - dgnuskwds.el. - (dgnushack-colon-keywords): New constant which will have the colon - keywords shuld be bound at run-time for old Emacsen; cache them in - the file dgnuskwds.el and bind them. - (dgnushack-bind-colon-keywords): New function. - (locate-library): Make the function to be silent for Mule. - * lisp/Makefile.in (clean): Remove dgnuskwds.el. - -2001-05-07 Katsumi Yamaoka - - * lisp/message.el (message-maybe-encode): Don't use - `end-of-invisible'. - -2001-05-07 Katsumi Yamaoka - - * lisp/gnus-vers.el: T-gnus 6.15.4 revision 00. - -2001-04-27 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 01. - - * lisp/gnus-art.el (gnus-article-mime-edit-exit): Set buffer to - `gnus-article-buffer' just before `gnus-article-prepare-display' is - called. - (gnus-article-mime-edit-article-setup): Ditto. - (gnus-article-prepare-display): Don't bind `buffer-read-only' - because of `inhibit-read-only'; don't set the value of - `gnus-article-current-summary' here; delete all extents or overlays - and clear the value of `gnus-button-marker-list' in advance; make - it to run in `gnus-article-buffer'. - (gnus-article-prepare): Make it to run in `gnus-article-buffer'. - (article-toggle-headers): Don't bind `buffer-read-only' because of - `inhibit-read-only'. - (article-hide-headers): Ditto. - -2001-04-16 Katsumi Yamaoka - - * lisp/gnus-vers.el: T-gnus 6.15.3 revision 00. - -2001-04-16 Katsumi Yamaoka - - * lisp/gnus-vers.el: T-gnus 6.15.2 revision 00. - -2001-04-16 Katsumi Yamaoka - - * lisp/gnus-vers.el: T-gnus 6.15.1 revision 00. - -2001-04-13 Katsumi Yamaoka - - * lisp/lpath.el: Fbind `xml-parse-region' for XEmacsen and old FSF - Emacsen; don't bind `mh-lib-progs'. - -2001-04-10 Katsumi Yamaoka - - * lisp/nnshimbun.el: Enclose w3m stuff with `eval-and-compile'; - bind `w3m-work-buffer-name' and `w3m-retrieve' when compiling. - -2001-04-09 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 10. - -2001-04-03 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el (nnshimbun-type-definition: Follow changes in - asahi.com. - (nnshimbun-asahi-get-headers): Ditto. - (nnshimbun-retrieve-url): Use `w3m-retrieve' if it is available. - -2001-04-02 Katsumi Yamaoka - - * lisp/gnus-msg.el (gnus-inews-yank-articles): Make it to work with - multiple articles even if there is a detached minibuffer frame on - some window managers. - -2001-03-21 Thierry Emery - - * lisp/mm-decode.el (mm-copy-to-buffer): Copy buffer in unibyte - mode. - -2001-03-19 Katsumi Yamaoka - - * lisp/gnus-kill.el (gnus-execute): Work with the extra headers. - * lisp/gnus-sum.el (gnus-summary-execute-command): Ditto. - -2001-03-13 Katsumi Yamaoka - - * lisp/message.el (message-fix-before-sending): Hide again the - invisible property of encoded binary data parts after checking is - done. - (message-find-invisible-regions): New function. - (message-save-drafts, message-send): Inherit the invisible property - of encoded binary data parts to make MIME-Edit find the MIME part - boundaries. - - * lisp/dgnushack.el (dgnushack-compose-package): Tidy up. - (dgnushack-make-load): Ditto. - -2001-03-12 Katsumi Yamaoka - - * lisp/dgnushack.el (dgnushack-compose-package): New function. - (dgnushack-make-load): Add autoload for cus-load if it is missing. - - * lisp/Makefile.in (compose-package): Use - `dgnushack-compose-package'. - (clean, clever): Remove custom-load.el. - - * Makefile.in (elclean): Remove custom-load.el. - -2001-03-08 Katsumi Yamaoka - - * lisp/gnus-art.el (gnus-article-prepare-display): Setup MIME - entity even if `gnus-show-mime' is nil. - -2001-03-08 Katsumi Yamaoka - - * lisp/dgnushack.el: Load gnus-clfns.el after `load-path' is - adjusted. - - * lisp/gnus-clfns.el (string): New compiler macro. - (string): Defun-maybe as an ordinary function since it won't be - provided in cl. - * lisp/gnus-score.el (gnus-score-find-bnews): Use it as Gnus does. - -2001-03-06 Katsumi Yamaoka - - * lisp/nnshimbun.el (nnshimbun-retrieve-url): Check if - `url-current-mime-charset' is bound. - -2001-03-04 Katsumi Yamaoka - - * lisp/gnus.el (gnus-info-find-node): Pretend to be - `gnus-article-mode' in the article buffer. - -2001-03-02 Katsumi Yamaoka - - * lisp/nnshimbun.el (nnshimbun-kinsoku-eol-list): Simplified. - (nnshimbun-kinsoku-bol-list): Ditto. - -2001-03-01 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 09. - - * lisp/gnus-offline.el (gnus-offline-get-menu-items): Rewrite using - `dolist'. - - * lisp/gnus-group.el (gnus-group-make-shimbun-group): Simplified. - - * lisp/dgnushack.el: Load cl-macs to ensure that the macro `dolist' - is defined properly. - -2001-02-28 Katsumi Yamaoka - - * lisp/nnwfm.el: Require `gnus-clfns' when compiling. - * lisp/nnshimbun.el: Ditto. - * lisp/nnfolder.el: Ditto. - * lisp/mm-util.el: Ditto. - * lisp/gnus-vers.el: Ditto. - * lisp/gnus-sum.el: Ditto. - * lisp/gnus-score.el: Ditto. - * lisp/gnus-nocem.el: Ditto. - - * lisp/gnus-ofsetup.el: Don't require `gnus-clfns'. - (gnus-ofsetup-customize-done): Use `dolist' instead of `mapc'. - (gnus-setup-for-offline): Ditto. - - * lisp/gnus-offline.el: Don't use `mapc' for binding some vars; - don't require `gnus-clfns'. - - * lisp/gnus-clfns.el (subseq, merge, coerce, butlast): New compiler - macros. - (mapc): Remove. - - * lisp/gnus-art.el: Use `dolist' instead of `mapcar' for defining - `gnus-article-read-summary-keys'. - -2001-02-28 Katsumi Yamaoka - - * lisp/gnus-art.el (gnus-article-mime-edit-article-setup): Leave - the forwarded parts undecoded. - (gnus-article-decode-article-as-default-mime-charset): Set the - value of `default-mime-charset' buffer-locally. - -2001-02-27 Katsumi Yamaoka - - * lisp/gnus.el: Add autoloads for - `gnus-summary-digest-post-forward' and - `gnus-summary-digest-mail-forward'. - - * lisp/gnus-sum.el (gnus-summary-post-menu): Replace - `gnus-uu-digest-mail-forward' and `gnus-uu-digest-post-forward' - with `gnus-summary-digest-post-forward' and - `gnus-summary-digest-mail-forward'. - - * lisp/gnus-msg.el (gnus-summary-digest-post-forward): Restore and - repair the command `gnus-summary-post-digest' and rename it. - (gnus-summary-digest-mail-forward): Ditto. - (gnus-summary-send-map): Replace `gnus-uu-digest-mail-forward' and - `gnus-uu-digest-post-forward' with - `gnus-summary-digest-post-forward' and - `gnus-summary-digest-mail-forward'. - -2001-02-27 Katsumi Yamaoka - - * lisp/gnus-sum.el (gnus-summary-show-article): Bind - `gnus-inhibit-treatment' to t while fetching the raw article. - - * lisp/gnus-art.el (gnus-article-mime-edit-exit): Bind - `mime-edit-insert-user-agent-field' to nil while `mime-edit-exit' - is being done; turn off font-lock first; query if the buffer is - modified. - (gnus-article-mime-edit-done): New function. - (gnus-article-mime-edit-article-setup): Make the window fill its - frame; clear the buffere modified flag; substitute key definition - `gnus-article-edit-done' with `gnus-article-mime-edit-done'; don't - turn off font-lock here; bind `mime-edit-insert-user-agent-field' - to nil while `mime-edit-exit' is being done. - (gnus-article-mime-edit-article-unwind): Turn off font-lock first. - -2001-02-23 Katsumi Yamaoka - - * lisp/dgnushack.el: Don't require `emu'. - -2001-02-16 Katsumi Yamaoka - - * lisp/message.el (message-forward-subject-author-subject): Decode - `From' field. - -2001-02-16 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 08. - - * lisp/gnus-sum.el (gnus-get-newsgroup-headers-xover): Don't use - `gnus-retrieve-parsed-headers' when the backend is nnimap. It is - only a temporary fix for an infloop on nnimap. FIXME!!! - (gnus-select-newsgroup): Ditto. - -2001-02-16 Katsumi Yamaoka - - * texi/gnus-ja.texi (New features in Gnus 5.8): Remove annotation - about `gnus-article-display-hook.' - * texi/gnus-faq-ja.texi (Q2.1): Remove mention of - `gnus-article-display-hook.' - - * lisp/gnus.el (gnus-article-display-hook): Abolished. - - * lisp/gnus-uu.el (gnus-uu-grab-articles): Don't care about - `gnus-article-display-hook'. - * lisp/gnus-sum.el (gnus-summary-show-article): Ditto. - (gnus-summary-search-article): Ditto. - - * lisp/gnus-bbdb.el (gnus-bbdb-insinuate): Use - `gnus-article-prepare-hook' instead of `gnus-article-display-hook'. - - * lisp/gnus-art.el (gnus-article-prepare-display): Evaluate - `gnus-article-prepare-hook' after an article has been prepared; - don't evaluate `gnus-article-display-hook'. - -2001-02-15 Katsumi Yamaoka - - * lisp/message.el (message-cite-original-without-signature): - Extract from field for the simple citation line. - -2001-02-14 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 07. - - * lisp/dgnushack.el (dgnushack-make-autoloads): Remove function. - (dgnushack-make-load): Ignore cus-load.el if it does not exist. - (dgnushack-make-auto-load): Remove auto-autoloads.el. - (dgnushack-make-cus-load): Do nothing if loading cus-dep is failed. - - * lisp/Makefile.in (clean): Remove gnus-load.el instead of - custom-load.el. - (compose-package): Call `gnus-load.elc' and then rename - gnus-load.el(c) to auto-autoloads.el(c) instead of the use of - `dgnushack-make-autoloads'. - (clever): No need to remove custom-load.el. - - * Makefile.in (elclean): Remove gnus-load.el instead of - custom-load.el. - - * aclocal.m4 (AC_CHECK_URL): Ignore cache. - -2001-02-13 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 06. - -2001-02-11 18:00:00 ShengHuo ZHU - - * GNUS-NEWS: Copyright and others. - -2001-02-09 20:00:00 ShengHuo ZHU - - * aclocal.m4 (AC_CHECK_URL): Add. - - * configure.in: Use it. - -2001-02-08 Katsumi Yamaoka - - * lisp/nnshimbun.el (nnshimbun-fml-get-headers): Fix unbalanced - parentheses. - -2001-02-08 Akihiro Arisawa - - * lisp/nnshimbun.el: Add `bbdb-ml' support. - -2001-02-02 Akihiro Arisawa - - * lisp/nnshimbun.el (nnshimbun-type-definition): Follow URL change - of `xemacs'. - (nnshimbun-xemacs-get-headers): Ditto. - -2001-02-06 Katsumi Yamaoka - - * README-gnus-bbdb.{en,ja}: Update the patch for BBDB v2.2. - -2001-02-01 Katsumi Yamaoka - - * texi/Makefile.in (.texi, %.info): Don't use makeinfo command when - gnus-ja.texi or message-ja.texi is given. It is needed for some - make command if which can not understand "%-ja:" or "%-ja.info:". - -2001-01-31 Katsumi Yamaoka - - * lisp/gnus-sum.el (gnus-summary-display-article): Replace - `mm-enable-multibyte-mule4' with `set-buffer-multibyte'. - -2001-01-29 Katsumi Yamaoka - - * lisp/gnus-art.el (gnus-article-mime-edit-exit): Use - `buffer-substring-no-properties' instead of `format'. - -2001-01-23 TAKAHASHI Kaoru - - * texi/ptexinfmt.el: Support @letterpaper and @afivepaper. - -2001-01-22 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 05. - - * Makefile.in (install-package-lisp): Use - `install-without-compiling' instead of `install'. - - * lisp/Makefile.in (install): Use `install-without-compiling'. - (install-without-compiling): New target. - -2001-01-22 Katsumi Yamaoka - - * texi/Makefile.in (.texi, %.info, %-ja.info, %-ja): Use - `infohack-texi-format'. - - * texi/infohack: (infohack-texi-format): New function. - * lisp/dgnushack.el (dgnushack-texi-format): Move to - texi/infohack.el and rename. - (dgnushack-texi-add-suffix-and-format): Remove. - - * texi/ptexinfmt.el: New file. - * lisp/ptexinfmt.el: Move to texi/. - -2001-01-18 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 04. - -2001-01-17 Katsumi Yamaoka - - * lisp/dgnushack.el (dgnushack-make-autoloads): Do nothing if the - files for autoloads already exist. - (dgnushack-unexporting-files): More useful message. - - * lisp/Makefile.in (install): Call `clever' before installing. - (install-lisp): Remove. - (clever): Check for whether the all elc files should be recompiled. - - * Makefile.in (xclever): New target. - (install-package-lisp): Replace `install-lisp' with `install'. - (install-package-ja): Replace `xlick' with `xclever'. - (install-package): Ditto. - -2001-01-17 KOSEKI Yoshinori - - * Makefile.in: Unset `PWD' for Meadow/NTEmacs. - -2001-01-15 Jesper Harder - - * make.bat: Fix doc. - -2001-01-15 Katsumi Yamaoka - - * lisp/nnheader.el: Require `pces', `poem' and `std11' to reduce - the required value of `recursive-load-depth-limit' for Emacs 21. - - * lisp/message.el (message-followup): Handle "Mail-Copies-To:" - correctly. - (message-get-reply-headers): Ditto. - -2001-01-15 Keiichi Suzuki - - * lisp/gnus-bbdb.el (gnus-bbdb/update-record): Save excursion - while `bbdb-annotate-message-sender' is being done. - -2001-01-13 Kinji Itoh - - * Makefile.in (install-package-lisp): Specify EMACS=$(XEMACS). - -2001-01-11 Katsumi Yamaoka - - * lisp/gnus-msg.el (gnus-copy-article-buffer): Remove smiley - extents for XEmacs 21.1 using `format'. - - * lisp/dgnushack.el (dgnushack-texi-format): Cancel last change. - -2001-01-10 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 03. - - * lisp/gnus.el: Don't autoload "smiley" for `smiley-toggle-buffer'; - don't autoload "gnus-bitmap" or "x-face-mule" when Emacs 21 is - running. - - * lisp/gnus-art.el (TopLevel): Autoload "gnus-bitmap" for - `smiley-toggle-buffer' when compiling. - (gnus-treatment-function-alist): Use `gnus-smiley-display' for - `gnus-treat-display-smileys' by default when XEmacs or Emacs 21 is - running. - (gnus-treat-display-smileys): Check for `smiley-mule' instead of - `gnus-bitmap'. - (gnus-article-x-face-command): Don't check for xbm for x-face-e21. - -2001-01-05 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 02. - - * lisp/dgnushack.el (dgnushack-texi-format): Remove "@anchor" if it - is not supported. - -2000-12-26 Katsumi Yamaoka - - * lisp/gnus.el: Bind `:parameter-type', `:parameter-document', - `:function', `:function-document', `:variable', - `:variable-document', `:variable-group', `:variable-type' and - `:variable-default' for old Emacsen. - -2000-12-22 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 01. - - * configure: Regenerate. - * configure.in: Add `AC_PATH_ETCDIR'. - * Makefile.in (install-etc): New target. - - * lisp/nnheader.el (mm-image-load-path): Alias to - `nnheader-image-load-path'. - (nnheader-image-load-path): New function copied from - the function `mm-image-load-path' in mm-util.el. - - * lisp/drums.el: Remove. - -2000-12-22 03:00:00 ShengHuo ZHU - - * configure.in: Add etc/Makefile. - -2000-12-22 Katsumi Yamaoka - - * lisp/gnus-msg.el (gnus-debug): Use `sit-for' in the inside of - `save-excursion'. - (gnus-bug): Pop up the sending buffer first. - - * lisp/gnus-art.el (article-treat-dumbquotes): Quote backslashes in - doc-string. - - * lisp/dgnushack.el - (byte-compile-file-form-custom-declare-variable): Use `defvar' - instead of `custom-declare-variable' to make the variable - uncustomizable if the arguments has the keyword `:version'. - -2000-12-22 Katsuhiro Hermit Endo - - * README.semi.ja: Fix typo. - -2000-12-21 Katsumi Yamaoka - - * lisp/lpath.el: Fbind `compose-mail' for Mule. - - * lisp/dgnushack.el (TopLevel): Byte-optimize - `custom-declare-variable', `custom-declare-group, and - `custom-declare-face' to omit unsupported keywords when Mule is - running. - -2000-12-20 Katsumi Yamaoka - - * lisp/gnus-vers.el: T-gnus 6.15.0 revision 00. - - * lisp/dgnushack.el (TopLevel): Advise `custom-handle-keyword' not - to signal an error when Mule is running. - (TopLevel): Bind `:ascent', `:foreground', `:help', `:version' and - `:set-after' if colon keyword is not available. - (TopLevel): Require `custom'. - - * lisp/lpath.el (TopLevel): Fbind `shell-command-to-string' for - Mule. - (TopLevel): Don't require `custom' here. - -2000-12-20 Jesper Harder - - * make.bat: set max-lisp-eval-depth. - -See ChangeLog.3 for earlier changes. diff --git a/ChangeLog.1 b/ChangeLog.1 deleted file mode 100644 index 2b2a04e..0000000 --- a/ChangeLog.1 +++ /dev/null @@ -1,4121 +0,0 @@ -1999-06-08 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 16. - - * lisp/gnus-sum.el (gnus-article-sort-by-author): Bug fix - use the - car of the return value of `mime-read-field'. - -1999-05-28 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 15. - - * texi/gnus.texi (Customizing Articles): Abolish the treatment - variable `nomime' and rename - `gnus-treat-decode-message-body-as-default-mime-charset' with - `gnus-treat-decode-article-as-default-mime-charset'. - - * lisp/gnus-art.el (gnus-treat-predicate): Abolish the treatment - variable `nomime'. - (gnus-article-prepare-mime-display): Call `gnus-treat-article' with - the 1st arg t for treating if the part is not the last one. - (gnus-article-decode-article-as-default-mime-charset): Renamed from - `gnus-article-decode-message-body-as-default-mime-charset'; Don't - work if `gnus-show-mime' is non-nil. - (gnus-treat-decode-article-as-default-mime-charset): Renamed from - `gnus-treat-decode-message-body-as-default-mime-charset'; add - choice item for decoding the whole article. - -1999-05-28 Yoshiki Hayashi - - * lisp/message.el (message-header-hook): Pass optional argument - code-conversion. - -1999-05-26 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 14. - - * lisp/gnus-art.el (gnus-article-prepare-display): Narrow to - header with trailing newline instead of the use of - `std11-narrow-to-header'. - (article-date-ut): Use `text-property-any' instead of - `next-single-property-change'. - (article-toggle-headers): Use `text-property-any' and - `text-property-not-all' instead of `get-text-property' or - `next-single-property-change'; use `gnus-hidden-properties' instead - of the property `invisible' with the function `add-text-properties' - or `remove-text-properties'; use `article-hide-headers' instead of - `gnus-article-maybe-hide-headers'; re-display X-Face image under - XEmacs after sorting fields. - -1999-05-25 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 13. - (TopLevel): Autoload "gnus-art" for `gnus-article-toggle-headers'. - - * texi/gnus.texi, texi/gnus-ja.texi (Article Hiding): Replace - `gnus-article-hide-headers' with `gnus-article-toggle-headers'. - - * lisp/gnus-sum.el (gnus-summary-article-menu, - gnus-summary-wash-hide-map, gnus-summary-wash-map, - gnus-summary-mode-map): Use `gnus-article-toggle-headers' instead - of `gnus-article-hide-headers'. - - * lisp/gnus-msg.el (gnus-copy-article-buffer): Remove bitmap images - with text property `x-face-mule-bitmap-image'; - don't bind `inhibit-read-only'. - - * lisp/gnus-art.el (gnus-article-display-x-face-with-x-face-mule): - Do nothing if `window-system' is nil. - (gnus-article-decode-message-body-as-default-mime-charset): Don't - bind `buffer-read-only'; decode from (point-min) instead of (point). - (gnus-article-prepare-display): Bind `inhibit-read-only' to t; bind - `buffer-read-only' to nil; don't bind - `mime-preview-over-to-next-method-alist'; - strip read-only properties after preparing. - (gnus-article-prepare-mime-display): Put text property - `article-treated-header' to the header; don't use - `mime-preview-move-to-next'; reduce a number of bound variables. - (gnus-article-display-traditional-message): Don't bind - `inhibit-read-only'. - (gnus-article-make-menu-bar): Use `gnus-article-toggle-headers' - instead of `gnus-article-hide-headers'. - (article-toggle-headers): New function. - -1999-05-24 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 12. - - * texi/gnus.texi (Customizing Articles): Remove duplicates; add the - function `gnus-treat-decode-message-body-as-default-mime-charset'. - - * lisp/gnus-msg.el (gnus-copy-article-buffer): Bind - `inhibit-read-only' to t during modifying the destination buffer. - - * lisp/gnus-art.el (gnus-article-prepare-mime-display): Rewrite. - (article-date-ut): If there is a forwarded message, fetch Date from - its header instead of `gnus-current-headers'. - (gnus-article-display-x-face-with-x-face-mule): New function. - (TopLevel): Autoload "x-face-mule" for the function - `x-face-mule-x-face-decode-message-header'. - (gnus-treatment-function-alist): Remove duplicates. - -1999-05-21 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 11. - - * lisp/gnus-art.el (gnus-article-prepare-mime-display): Don't treat - as a MIME message if the article is not so. - (gnus-article-display-traditional-message): Bind - `inhibit-read-only' to t. - (article-hide-headers): Ditto. - -1999-05-19 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 10. - (gnus-article-display-hook): Default to nil; annotate that it is an - obsolete variable. - - * texi/gnus.texi (Customizing Articles): Document the new treatment - variables `mime' and `nomime'. - - * lisp/gnus-art.el (gnus-treat-predicate): Handle the new treatment - variables `mime' and `nomime'. - (gnus-article-decode-message-body-as-default-mime-charset): New - function. - (gnus-article-prepare-display): Rewrite for the use of - `gnus-treat-article'. - (gnus-article-prepare-mime-display): New function. - (article-date-ut): Use `next-single-property-change' instead of - re-search. - (gnus-treatment-function-alist): Add a pair of - `gnus-treat-decode-message-body-as-default-mime-charset' and - `gnus-article-decode-message-body-as-default-mime-charset'. - (gnus-treat-decode-message-body-as-default-mime-charset): New user - option. - -1999-05-19 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 09. - - * lisp/gnus-art.el (article-date-ut): Keep the original X-Sent - field, fix the position of the converted date to be displayed, - etc. - -1999-05-18 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 08. - - * lisp/gnus-art.el (gnus-article-prepare-display): Undo the last - change - don't call `gnus-treat-article'. - -1999-05-17 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 07. - - * lisp/gnus-art.el (gnus-article-prepare-display): Call - `gnus-treat-article'. - -1999-05-17 Daiki Ueno - - * lisp/gnus-art.el (article-date-ut): Always detete the last - newline of any old Date fields. - -1999-05-17 Daiki Ueno - Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 06. - - * lisp/mail-source.el (mail-source-keyword-map): New keyword - :connection for pop. It is introduced to enable SSL connection. - (mail-source-fetch-pop): Use it to bind `pop3-connection-type'. - - * lisp/pop3.el : Add an autoload for `open-ssl-stream' defined in - `ssl'. - (pop3-connection-type, pop3-ssl-program-arguments): New variables. - (pop3-open-ssl-stream-1, pop3-open-ssl-stream): New functions. - (pop3-open-server): Call the latter when `pop3-connection-type' is - ssl. - -1999-05-17 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 05. - (TopLevel): Remove autoloads for `gnus-picons-display-x-face' and - `gnus-picons-article-display-x-face'. - -1999-05-16 Tsukamoto Tetsuo - - * texi/gnusref-ja.tex (subsec Notes): Complete words. - (sec GroupMode): Translate description of "P". - -1999-05-15 Tsukamoto Tetsuo - - * texi/gnusref-ja.tex: Undo the last change. - -1999-05-15 Tsukamoto Tetsuo - - * texi/gnusref-ja.tex: Fix typo. - -1999-05-14 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 04. - - * lisp/*.el: Undo all of the last changes. - -1999-05-13 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 03. - - * lisp/nnsoup.el (nnsoup-store-reply): Use `forward-char' instead - of `backward-char'. - * lisp/message.el (message-send-news-with-gnus, - message-send-mail-with-smtp, message-send-mail-with-qmail, - message-send-mail-with-sendmail): Ditto. - * lisp/gnus-picon.el (gnus-group-display-picons): Ditto. - - * lisp/nnsoup.el (nnsoup-store-reply): Use `(bolp)' instead of - `(= (preceding-char) ?\n)'. - * lisp/message.el (message-send-news, message-send-mail): Ditto. - - * lisp/gnus-sum.el (gnus-summary-reparent-thread): Use - `(end-of-line 0)' to go to the end of the previous line. - - * lisp/nnmail.el (nnmail-decode-status): Don't use regexp search. - * lisp/message.el (message-next-header, message-remove-header): - Ditto. - * lisp/gnus-art.el (gnus-article-add-buttons-to-head, - gnus-article-highlight-headers, gnus-article-hide-header, - article-hide-boring-headers, article-hide-headers): Ditto. - - * lisp/nntp.el (nntp-snarf-error-message, nntp-read-server-type): - Use `buffer-substring' instead of `buffer-string'. - * lisp/nnspool.el (nnspool-inews-sentinel): Ditto. - * lisp/message.el (message-wash-subject, message-reply, - message-make-from, message-make-organization): Ditto. - * lisp/md5.el (md5): Ditto. - * lisp/mail-source.el (mail-source-movemail): Ditto. - * lisp/gnus.el (gnus-getenv-nntpserver): Ditto. - * lisp/gnus-xmas.el (gnus-xmas-article-display-xface): Ditto. - * lisp/gnus-util.el (gnus-mode-string-quote): Ditto. - * lisp/gnus-sum.el (gnus-summary-edit-article-done, - gnus-simplify-subject-fuzzy): Ditto. - * lisp/gnus-spec.el (gnus-parse-simple-format): Ditto. - * lisp/gnus-picon.el (gnus-picons-make-glyph): Ditto. - * lisp/gnus-msg.el (gnus-copy-article-buffer): Ditto. - * lisp/gnus-mh.el (gnus-summary-save-in-folder): Ditto. - * lisp/gnus-kill.el (gnus-kill-file-apply-buffer): Ditto. - * lisp/gnus-art.el (gnus-article-mime-edit-exit, - gnus-article-edit-exit): Ditto. - * lisp/format-spec.el (format-spec): Ditto. - * lisp/dgnushack.el (dgnushack-make-package): Ditto. - * lisp/base64.el (base64-decode, base64-encode, - base64-run-command-on-region): Ditto. - -1999-05-13 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 02. - - * lisp/gnus-ofsetup.el (gnus-setup-for-offline): Don't specify - the authentication scheme if `password' is selected. - -1999-05-06 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - - * texi/gnus-ja.texi: (gnus-summary-enter-digest-group): Change the - key assignment "C-d" into "A D". - (Article treatment): Document the new variable - `gnus-article-date-lapsed-new-header'. - - * lisp/mail-source.el: Use the original source without any changes. - - * lisp/gnus-art.el (article-hide-headers): To work toggle hiding. - - * README.T-gnus: Update what is the latest T-gnus. - -1999-05-04 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.064. - (gnus-revision-number): Fresh start from 00. - - * Sync up with Pterodactyl Gnus v0.84. - -1999-04-28 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 03. - - * lisp/gnus-vm.el (gnus-summary-save-in-vm): Use - `vm-read-file-name' instead of `read-file-name'. This allows to use - the optional sixth argument HISTORY for the various environments. - (gnus-summary-save-article-vm): Ditto. - (TopLevel): Autoload "vm" for the function `vm-read-file-name'. - -1999-04-27 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 02. - - * lisp/gnus-vm.el (gnus-summary-save-in-vm): To read the name of - FOLDER in the way of VM; give the value of `gnus-current-article' - to the function `gnus-summary-select-article' if it is called non - interactively. - (gnus-summary-save-article-vm): Accept the optional 2nd arg FOLDER. - If it is called interactively the name of FOLDER is read from the - minibuffer; bind `mime-display-header-hook', - `mime-display-text/plain-hook', `mime-text-decode-hook', - `mime-view-define-keymap-hook' and `mime-view-mode-hook' to nil - when the function `gnus-summary-save-article' is called. - (gnus-summary-save-article-vm-count, - gnus-summary-save-article-vm-folder): New internal variables. - (gnus-vm-make-folder): Bind `mime-display-header-hook', - `mime-display-text/plain-hook', `mime-text-decode-hook', - `mime-view-define-keymap-hook' and `mime-view-mode-hook' to nil - when the function `vm-mode' is called. - (vm-use-toolbar, vm-primary-inbox, vm-folder-history, - vm-folder-directory): Define variables for avoiding byte compile - warning. - (gnus-vm-inhibit-window-system): Abolish variable; don't require - `win-vm'. - (TopLevel): Don't autoload "vm" for the functions - `vm-forward-message', `vm-reply' or `vm-mail'; don't require - `sendmail', `message', `gnus' or `gnus-msg' but `gnus-art'. - -1999-04-20 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - - * lisp/pop3.el (pop3-munge-message-separator): Don't put the - Content-Length field break into the other fields. - -1999-04-18 Sin'ya Kanematsu - - * texi/gnus-ja.texi: Fix typo - `gnus-auto-expirable-newgroups' -> - `gnus-auto-expirable-newsgroups'. - -1999-04-18 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.063. - (gnus-revision-number): Fresh start from 00. - - * Sync up with Pterodactyl Gnus v0.83. - -1999-04-15 NAKAGAWA Tsuneo - - * REDME.semi.ja: Fix where the required packages are. - -1999-04-13 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 09. - -1999-04-13 Keiichi Suzuki - - * lisp/gnus-sum.el (gnus-summary-move-article): Fix, - `gnus-article-mark-lists' will be broken by side effect. - -1999-04-09 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 08. - - * lisp/gnus-art.el (TopLevel): Remove symbol's function definition - for `gnus-article-mime-decode-quoted-printable'. - -1999-04-05 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 07. - -1999-03-30 Yoshiki Hayashi - - * texi/gnus-ja.texi: Some fixes. - -1999-03-26 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 06. - - * lisp/pop3.el (pop3-munge-message-separator): If a retrieved - message has a illegal date field, use `(current-time)' instead. - -1999-03-25 Katsumi Yamaoka - - * lisp/message.el (message-send): Kill `message-encoding-buffer' - after sending. - -1999-03-25 Katsumi Yamaoka - - * lisp/message.el (message-maybe-encode): Inherit the buffer local - variable `mime-edit-pgp-processing' and call - `mime-edit-pgp-enclose-buffer'. - -1999-03-24 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 05. - - * lisp/gnus-art.el (gnus-article-display-mime-message): Set up the - buffer local variable `default-mime-charset' of - `gnus-article-buffer' before `mime-display-message' is called. - - * lisp/gnus-i18n.el (gnus-newsgroup-default-charset-alist): Be also - matched with the group name which has a method name and/or a - foreign server name. - (gnus-set-summary-default-charset): Cancel the last change. - -1999-03-24 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 04. - - * lisp/gnus-i18n.el (gnus-set-summary-default-charset): Strip - method and foreign server name from the newsgroup name. - -1999-03-22 Tsukamoto Tetsuo - - * lisp/gnus-offline.el (gnus-offline-popup-menu): Fix. - -1999-03-22 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 03. - - * lisp/gnus-offline.el (gnus-offline-popup-menu): Modify so that - the title of a popup menu is displayed under Emacs 19.34. - (gnus-offline-define-menu-and-key): Rewrite the function to change - the behavior of "Get new news" button, under XEmacs. - - * lisp/gnus-ofsetup.el: Modify for Semi-gnus 6.10.xx so that - `pop3-fma-password' can be saved in .newsrc.eld. - - * README-offline.en: Update. - * README-offline.ja: Ditto. - -1999-03-09 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 02. - - * lisp/message.el (message-yank-original): Keep the existing - references. - -1999-03-04 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - (gnus-other-frame): Rewrite on the model of `toolbar-gnus'. - (gnus-frame): New internal variable. - (gnus-frame-properties): New user option. - -1999-03-04 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.062. - (gnus-revision-number): Fresh start from 00. - - * Sync up with Pterodactyl Gnus v0.80. - - * lisp/gnus-sum.el (gnus-summary-edit-article): Don't use - `mime-to-mml' nor `mml-to-mime'. - -1999-03-02 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 03. - - * lisp/gnus-sum.el (gnus-select-newsgroup): Examine cached articles - with `gnus-cache-articles-in-group' if the current group is not - a virtual group. - (TopLevel): Autoload `gnus-cache-articles-in-group' - -1999-03-01 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 02. - - * texi/gnus-ja.texi: Sync up with Semi-gnus 6.10. - - * lisp/dgnushack.el (dgnushack-install-package): Don't refer to - `configure-package-path'. Use `early-packages', `late-packages' or - `last-packages' instead. - -1999-03-01 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - - * lisp/message.el (messgage-inhibit-body-encoding): Default to t. - (message-mode): Abolish `message-mime-attach-file' from doc - string. - (message-mode-map): Abolish `message-mime-attach-file' from - `message-mode-menu'. - - * lisp/gnus-start.el (save-buffer-as-coding-system): Abolished. It - is given in APEL 9.13 by now. - - * lisp/gnus-ems.el (gnus-decode-coding-string): Abolished. - (gnus-encode-coding-string): Abolished. - (gnus-mule-cite-add-face): Restored. - (gnus-cite-add-face): Restored. - - * README.semi.ja: Note that APEL 9.13 or later is required. - * README.semi: Ditto. - * README.T-gnus: Ditto. - -1999-02-27 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.061. - (gnus-revision-number): Fresh start from 00. - - * Sync up with Pterodactyl Gnus v0.79. - -1999-02-27 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.060. - (gnus-revision-number): Fresh start from 00. - - * Sync up with Pterodactyl Gnus v0.78. - -1999-02-26 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 05. - - * Makefile.in (add-info-suffix, remove-info-suffix): New targets. - (package, install-package, package-ja, install-package-ja): Use - them. - (xinfo, xinfo-ja): Only build infos. - - * texi/Makefile.in (add-info-suffix): Chdir ../lisp first. - - * lisp/dgnushack.el (dgnushack-add-info-suffix-maybe): Chdir - ../texi first. - (dgnushack-install-package): Don't refer to `package-path'; error - if the package path does not found. - (TopLevel): Don't define `gnus-revision-number', - `gnus-version-number' and `package-path'. - -1999-02-24 Tatsuya Ichikawa - - * README.ichikawa : Removed. - - * README.T-gnus : Renamed from README.ichikawa - Remove description about T-gnus 6.8. - -1999-02-24 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 04. - - * Makefile.in (xinfo, xinfo-ja): Make add-info-suffix, formatting, - and make remove-info-suffix. - - * texi/Makefile.in (.texi): Don't specify the output filename when - makeinfo command is used. - (add-info-suffix, remove-info-suffix): New targets. - - * lisp/dgnushack.el (dgnushack-add-info-suffix-maybe): New - function. It will be used for adding ".info" suffix to @setfilename - line in each .texi files. - (dgnushack-texi-file-regexp): New constant. - (dgnushack-info-file-regexp): Add ".info" suffix. - -1999-02-24 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 03. - - * lisp/Makefile.in (all, total): Remove "auto-autoloads.el" and - "custom-load.el" as well. - - * Makefile.in (xlick, xinfo, xinfo-ja): New targets. - (install-package-ja, package-ja, install-package, package): Use - them; use $XEMACS instead of $EMACS. - (osome): Use $XEMACS instead of "xemacs21". - (x): Ditto. - (XEMACS): Use "xemacs" instead of "xemacs21" in default. - - * lisp/dgnushack.el (dgnushack-install-package): Remove extra files - in destination lisp directory. - (dgnushack-make-package): Don't generate "_pkg.el" file; don't - remove "auto-autoloads.el*" files. - (dgnushack-compile): Don't remove "_pkg.el" from the list. - -1999-02-23 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 02. - - * lisp/mail-source.el (mail-source-fetch-pop): Fix typo in original - source and merged it. - - * README.ichikawa: Update description about the latest T-gnus. - -1999-02-22 Tatsuya Ichikawa - - * lisp/gnus-art.el (gnus-narrow-to-page): Fix that "^L" do not work. - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - -1999-02-21 Tatsuya Ichikawa - - * lisp/mail-source.el (mail-source-fetch-pop): Comment out - postscript block - I don't know why it does not work. - There is no Bug report from ding ML. - - * lisp/gnus.el (gnus-version-number): Update to 6.10.059. - (gnus-revision-number): Fresh start from 00. - - * Sync up with Pterodactyl Gnus v0.77. - -1999-02-18 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 09. - - * lisp/gnus-start.el (save-buffers-kill-emacs): Rewrite the - advice. Call `gnus-offer-save-summaries'. - -1999-02-18 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 08. - - * lisp/gnus-start.el (save-buffers-kill-emacs): Advice. Call - `gnus-save-newsrc-file' before `save-some-buffers' is called. - - * README-offline.en: Update. - - * README-offline.ja: Fix typo. - - * lisp/gnus-ofsetup.el (gnus-setup-for-offline): Set - `gnus-offline-hangup-program' and `gnus-offline-dialup-program' to - nil when null string is given. - -1999-02-18 Tatsuya Ichikawa - - * texi/Makefile.in: Change to work on Windows environment and - other platforms. - - * lisp/gnus.el (gnus-revision-number): Increment to 07. - -1999-02-17 Katsumi Yamaoka - - * lisp/dgnushack.el (dgnushack-make-package): Fix typo. - -1999-02-17 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 06. - - * Makefile.in (install-package-ja, package-ja, install-package, - package): New targets. - (PACKAGEDIR): New user option. - - * lisp/Makefile.in (install-package, package): New targets. - (PACKAGEDIR): New user option. - - * lisp/dgnushack.el (dgnushack-install-package): New function. - (dgnushack-make-package): New function. - (dgnushack-info-file-regexp): New constant. - (dgnushack-compile): Remove "_pkg.el" from the list. - - * configure: Regenerate by autoconf-2.13. - -1999-02-17 Yoshiki Hayashi - - * aclocal.m4: install .el files to site-lisp/gnus instead of - site-lisp. - * Makefile.in: add new rule `all-ja'. - -1999-02-15 Tatsuya Ichikawa - - * lisp/gnus-ofsetup.el (gnus-setup-for-offline): Bug fix when - using nnspool. - - * lisp/gnus.el (gnus-revision-number): Increment to 05. - -1999-02-12 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-revision-number): Increment to 04. - - * lisp/read-passwd.el: Change location of (provide 'read-passwd) - - * lisp/gnus-offline.el: ditto. - -1999-02-12 Hidekazu Nakamura - - * lisp/gnus-ofsetup.el (gnus-setup-for-offline): To work with APOP - authentication scheme. - - * lisp/read-passwd..el (read-pw-set-mail-source-passwd-cache): - Undo my change. - -1999-02-12 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 03. - - * lisp/gnus-sum.el (gnus-summary-mode-map): Bound the command - `gnus-article-hide-headers' to "t". - - * lisp/gnus-art.el (article-hide-headers): Show all headers when - unhiding. - - * texi/gnus.texi: Fix latin chars. - -1999-02-12 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 02. - - * texi/emacs-mime.texi: Fix latin chars. - -1999-02-12 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - - * lisp/gnus-sum.el (gnus-nov-parse-line): Use - `nnheader-nov-read-message-id' instead of `nnheader-nov-field' or - `nnheader-generate-fake-message-id'; use `(eobp)' instead of - `(eq (char-after) ?\n)'. - -1999-02-11 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.058. - (gnus-revision-number): Fresh start from 00. - - * lisp/message.el (message-forward): Get back to the previous - design. - * lisp/gnus-msg.el (gnus-summary-mail-forward): Ditto. - - * lisp/mail-source.el (mail-source-fetch-pop): Ignore program and - authentication scheme.. - - * lisp/message.el (message-forward-start-separator): Restored. - (message-forward-end-separator): Restored. - (message-signature-before-forwarded-message): Restored. - (message-included-forward-headers): Restored. - - * lisp/message.el (message-make-forward-subject): Use "(none)" if - the original article has no subject. - - * Sync up with Pterodactyl Gnus v0.76. - - * lisp/gnus-ofsetup.el (gnus-setup-for-offline): Change for pGnus 0.76. - -1999-02-09 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 08. - - * lisp/score-mode.el (gnus-score-edit-exit): Use - `save-buffer-as-coding-system' instead of - `write-region-as-coding-system'. - * lisp/gnus-start.el (gnus-save-newsrc-file): Ditto. - - * lisp/gnus-start.el (save-buffer-as-coding-system): New function - defined with `defun-maybe'. NOTE: It should be deleted in the - future. - - * lisp/gnus-sum.el (TopLevel): Require `mime-play' when compile. - -1999-02-09 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 07. - - * lisp/gnus-sum.el (gnus-mime-extract-message/rfc822): New - implementation. - -1999-02-08 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 06. - -1999-02-08 Masatoshi Tsuchiya - - * lisp/gnus-sum.el (gnus-articles-to-read): Use maximum number in - default instead of `gnus-large-newsgroup'. - -1999-02-08 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 05. - -1999-02-08 Masatoshi Tsuchiya , - Katsumi Yamaoka , - Keiichi Suzuki - - * lisp/gnus-sum.el (gnus-articles-to-read): If the number of - unread articles is more than `gnus-large-newsgroup', use it in - default instead of the maximum number. - -1999-02-08 MORIOKA Tomohiko , - Katsumi Yamaoka - - * lisp/gnus-sum.el (gnus-mime-extract-multipart): New function; - add it to the acting-condition for extracting mulitpart messages. - (gnus-mime-extract-message/rfc822): New function; add it to the - acting-condition for extracting message/rfc822 or message/news. - -1999-02-08 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-revision-number): Increment to 04. - - * lisp/nntp.el: Change nnmail-read-passwd -> mail-source-read-passwd. - -1999-02-08 Tsukamoto Tetsuo - - * README-offline.ja: Change for current version. - * README-offline.en: Ditto. - -1999-02-07 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-revision-number): Increment to 03. - -1999-02-04 Tsukamoto Tetsuo - - * lisp/gnus-offline.el: Delete security notice. - (gnus-offline-pop-password-file): Removed. - (gnus-offline-pop-password-decoding-function): Removed. - (gnus-offline-gnus-get-new-news): Revert to its original. - -1999-02-04 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 02. - -1999-02-04 YOSHIZAWA Masahiro - - * README-offline.en: New description. - * README-offline.ja: Ditto. - -1999-02-03 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-revision-number): Change to 01 - - * lisp/gnus-ofsetup.el (gnus-setup-for-offline): Add default value. - -1999-02-03 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-revision-number): New constant. - -1999-02-02 Tatsuya Ichikawa - - * lisp/gnus-ofsetup.el (gnus-setup-for-offline): Ask save password - information to .newsrc file. - - * lisp/gnus.el (gnus-variable-list): Undo my last change. - - * lisp/read-password.el (read-pw-set-mail-source-passwd-cache): Do - not input password if mail-source-password-cache is non nil. - -1999-02-03 Hidekazu Nakamura - - * lisp/read-passwd.el (read-pw-set-mail-source-passwd-cache): To - work with APOP authentication scheme. - -1999-02-02 Tatsuya Ichikawa - - * lisp/gnus-ofsetup.el (gnus-setup-for-offline): To work with - external movemail program. - - * lisp/gnus.el (gnus-variable-list): Add - mail-source-password-cache to save password information. - -1999-02-01 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.057. - - * Sync up with Pterodactyl Gnus v0.75. - -1999-02-01 Tatsuya Ichikawa - - * lisp/gnus-offline.el (gnus-offline-gnus-get-new-news): Undo my - change. - -1999-02-01 Katsumi Yamaoka - - * lisp/gnus-offline.el (gnus-offline-define-menu-on-miee): Close - parentheses. - (gnus-offline-define-menu-on-agent): Ditto. - -1999-02-01 Katsumi Yamaoka - - * README.ichikawa: Fix about the last version of T-gnus based on - Gnus 5.6. - -1999-02-01 Akihiro Arisawa - - * lisp/nndoc.el (nndoc-mime-digest-type-p): Add the element of - `header-begin' to type-alist for mime-digest. - -1999-02-01 Tatsuya Ichikawa - - * README-offline.ja: Add description written by YOSHIZAWA Masahiro - - -1999-02-01 Tatsuya Ichikawa - Tsukamoto Tetsuo - - * lisp/gnus-offline.el (gnus-offline-gnus-get-new-news): Modify for - pGnus with mail-source.el. - - * lisp/gnus-offline.el: Use (running-pterodactyl-gnus-0_73-or-later) - to check pGnus 0.73 or later instead of (locate-library "mail-source") - -1999-02-01 Katsumi Yamaoka - - * lisp/nndoc.el (nndoc-mime-parts-type-p): Strip leading white - space from the matching pattern. - -1999-02-01 Katsumi Yamaoka - - * lisp/gnus-sum.el (gnus-nov-parse-extra): Abolished. - (gnus-nov-parse-line): Use `char-after' instead of `following-char' - ; use `nnheader-nov-parse-extra' instead of `gnus-nov-parse-extra'. - -1999-01-31 MORIOKA Tomohiko - - * lisp/gnus-sum.el: Abolish macro `gnus-nov-read-integer', - `gnus-nov-skip-field' and `gnus-nov-field'. - (gnus-nov-parse-line): Use `nnheader-nov-field' and - `nnheader-nov-read-integer' instead of `gnus-nov-field' and - `gnus-nov-read-integer'. - (gnus-get-newsgroup-headers-xover): Use - `gnus-retrieve-parsed-headers'. - - * lisp/gnus-cache.el (gnus-cache-retrieve-parsed-headers): Use - `gnus-cache-braid-headers', - `nnheader-get-newsgroup-headers-xover*' and - `nnheader-retrieve-headers-from-directory*' instead of - `gnus-get-newsgroup-headers-xover', `gnus-cache-braid-parsed-nov' - nor `gnus-cache-braid-parsed-heads'; abolish function - `gnus-cache-braid-parsed-nov' and `gnus-cache-braid-parsed-nov'. - (gnus-cache-braid-headers): New function. - - * lisp/nnheader.el (nnheader-nov-read-integer): Use - `(search-forward "\t" eol 'move)' instead of `(forward-char 1)' as - same as `gnus-nov-read-integer'. - (nnheader-retrieve-headers-from-directory*): New function. - (nnheader-retrieve-headers-from-directory): Use - `nnheader-retrieve-headers-from-directory*'. - (nnheader-get-newsgroup-headers-xover*): New function. - -1999-01-30 MORIOKA Tomohiko - - * lisp/nnmh.el (nnmh-retrieve-parsed-headers): Use - `nnheader-retrieve-headers-from-directory'. - - * lisp/nnheader.el (nnheader-retrieve-headers-from-directory): New - function. - -1999-01-29 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version): Modify for SEMI 1.13. - - * lisp/gnus-int.el (gnus-retrieve-parsed-headers): Use - `gnus-cache-retrieve-parsed-headers' instead of - `gnus-cache-retrieve-headers'. - - * lisp/gnus-cache.el (gnus-cache-retrieve-parsed-headers): New - function. - (gnus-cache-braid-parsed-nov): New function. - (gnus-cache-braid-parsed-heads): New function. - -1999-01-30 Tatsuya Ichikawa - - * lisp/gnus-offline.el: Rewrite to work with pGnus v0.74 based T-gnus. - * lisp/gnus-ofsetup.el: Ditto. - - * lisp/pop3-fma.el: Removed because after pGnus0.73 , pGnus can treat - multiple pop3 account. - -1999-01-29 Tatsuya Ichikawa - - * lisp/read-passwd.el: New file. - -1999-01-28 Katsumi Yamaoka - - * lisp/gnus.el (running-pterodactyl-gnus-0_73-or-later): Provide as - a new feature. - - * lisp/mail-source.el (mail-source-read-passwd): Don't load - "passwd" if the function `read-passwd' already exists. - - * lisp/gnus-start.el (gnus-read-active-file): Eliminate duplicated - select methods. - - * lisp/gnus-group.el (gnus-group-catchup-current): Fix typo. - -1999-01-27 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.056. - - * Sync up with Pterodactyl Gnus v0.74. - -1999-01-28 Katsumi Yamaoka - - * lisp/gnus-msg.el (gnus-summary-mail-digest): Reselect the message - frame after selecting a new article if the value of - `message-use-multi-frames' is non-nil and more than one articles - are given. - -1999-01-28 Keiichi Suzuki - - * lisp/gnus-sum.el (gnus-summary-move-article): Fix, could not - respool article. - -1999-01-26 Katsumi Yamaoka - - * lisp/nnmh.el (nnmh-retrieve-parsed-headers): Bind `in-reply-to' - and `cur' as temporary variables. - -1999-01-25 MORIOKA Tomohiko - - * lisp/gnus-sum.el (gnus-article-sort-by-author): fixed. - -1999-01-12 MORIOKA Tomohiko - - * lisp/gnus-int.el (gnus-retrieve-parsed-headers): Add new - optional arguments `dependencies' and `force-new'; new - implementation; call `retrieve-parsed-headers' if it is found. - - * lisp/nnmh.el (nnmh-retrieve-parsed-headers): New function. - -1999-01-12 MORIOKA Tomohiko - - * lisp/gnus-sum.el (gnus-select-newsgroup): Use - `gnus-retrieve-parsed-headers' instead of `gnus-retrieve-headers' - and `gnus-get-newsgroup-headers-xover' or - `gnus-get-newsgroup-headers'. - - * lisp/gnus-int.el (gnus-retrieve-parsed-headers): New function. - -1999-01-26 Tsukamoto Tetsuo - - * lisp/gnus-offline.el: Add security notice. - -1999-01-25 Tatsuya Ichikawa - - * README-offline.ja: New file - Variable and command description - for gnus-offline(Japanese edition). - * README-offline.en: New file - Ditto (English edition). - -1999-01-25 Tsukamoto Tetsuo - - * lisp/gnus-offline.el (gnus-offline-pop-password-file): New - variable. - (gnus-offline-pop-password-decoding-function): New variable. - (gnus-offline-get-new-news): When `gnus-offline-pop-password-file' - is non-nil, get one's password information from a file specified - by this variable, and don't store the passwords as a variable. - * lisp/smiley.el (smiley-buffer): Avoid a few duplicate - translations. - -1999-01-23 Kiyokazu SUTO - - * lisp/gnus-msg.el (gnus-inews-yank-articles): Use - `message-list-references' for gathering IDs from yanked articles. - - * lisp/message.el (message-list-references): New function. - (message-yank-original): Use it for gathering IDs from a yanked - article. - -1999-01-22 Katsumi Yamaoka - - * lisp/message.el (message-reply): Get the references from - `In-Reply-To' field if there were no references and `In-Reply-To' - field looks promising. - (message-yank-original): Try to fetch ID from `In-Reply-To' field - if `References' field does not exist. - (message-yank-original): Use `std11-narrow-to-header' instead of - `message-narrow-to-head'. - -1999-01-22 Katsumi Yamaoka - - * lisp/gnus-msg.el (gnus-inews-yank-articles): Fetch IDs from - `gnus-current-headers' instead of article header. - -1999-01-22 Katsumi Yamaoka - - * lisp/gnus-msg.el (gnus-inews-yank-articles): Save the beginning - position of the yanked articles -- apologize to SUTO-san, it has - been supported in his original code, but I didn't. - - * lisp/message.el: Replace line endings from `CRLF' to `LF'. - -1999-01-21 Hiroaki Matsui - - * lisp/message.el : Fix typo. - -1999-01-20 Katsumi Yamaoka - - * lisp/message.el (message-yank-original): If - `message-yank-add-new-references' is non-nil and this command is - called interactively, new IDs from the yanked article will be added - to `References' field. - (message-yank-add-new-references): New user option. - (message-header-format-alist): Use `message-shorten-references' for - `References' in default. - -1999-01-20 Kiyokazu SUTO , - Katsumi Yamaoka - - * lisp/gnus-msg.el (gnus-inews-yank-articles): Replace `References' - field with the gathered Message-IDs and References if more than one - articles are given. - -1999-01-20 Katsumi Yamaoka - - * lisp/gnus-msg.el (gnus-inews-yank-articles): Reselect the message - frame after selecting a new article if the value of - `message-use-multi-frames' is non-nil and more than one articles - are given. - -1999-01-20 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.055. - - * Sync up with Pterodactyl Gnus v0.72. - -1999-01-19 Katsumi Yamaoka - - * README.semi.ja: Add keiichi and nana-gnus to the branches info. - Modify the directory name for the daily snapshots. - * README.semi: Ditto. - - * README.branch.ja: Modified for Semi-gnus 6.10, etc. - * README.branch: Ditto. - -1999-01-19 Katsumi Yamaoka - - * lisp/message.el (message-reply): Cancel the last change. - (message-followup): Cancel the last change. - (message-wide-reply): Cancel the last change. - - * lisp/gnus-msg.el (gnus-summary-gather-references): Abolished. - (gnus-summary-reply): Cancel the last change. - (gnus-post-news): Cancel the last change. - -1999-01-18 Katsumi Yamaoka - - * lisp/gnus-sum.el (gnus-summary-move-article): Don't copy - expirable marks if the destination group is not expirable. - -1999-01-16 Kiyokazu SUTO - - * lisp/message.el (message-reply): Accept references as a new - optional arg. - (message-followup): Ditto. - (message-wide-reply): Ditto. - - * lisp/gnus-msg.el (gnus-summary-gather-references): New function. - (gnus-summary-reply): Use it - (gnus-post-news): Use it. - -1999-01-16 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.054. - - * Sync up with Pterodactyl Gnus v0.71. - -1999-01-16 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.053. - - * Sync up with Pterodactyl Gnus v0.70. - -1999-01-13 Kiyokazu SUTO - - * lisp/nnspool.el (nnspool-retrieve-headers): Protect against empty - body. - -1999-01-13 Tatsuya Ichikawa - - * lisp/gnus-offline.el: Add Tsukamoto Tetsuo - to author and maintainer. - -1999-01-12 Katsumi Yamaoka - - * lisp/nnmail.el (nnmail-article-group): Don't infloop. - -1999-01-12 Katsumi Yamaoka - - * TODO.ja: Modified for Cancel-Lock feature. - - * lisp/nntp.el (nntp-request-post): Put a Message-ID generated by - server if it does not exist in the article. - (nntp-request-post): Run `nntp-prepare-post-hook'. - (nntp-async-trigger): Save a response from the server in - `nntp-process-response' after sending a command. - (nntp-wait-for): Ditto. - (nntp-prepare-post-hook): New hook, run just before posting an - article. - - * lisp/nnheader.el (nnheader-init-server-buffer): Make - `nntp-process-response' be buffer-local in `nntp-server-buffer'. - (nntp-process-response): New variable, used for holding a response - from the server after sending a command. - -1999-01-11 Tsukamoto Tetsuo - - * lisp/message.el (message-draft-coding-system): Don't Call - `coding-system-p'. Find its default value using - `find-coding-system' instead. - -1999-01-11 Katsumi Yamaoka - - * lisp/pop3.el (pop3-munge-message-separator): Use - `parse-time-string'. - - * lisp/gnus-vm.el (gnus-summary-save-in-vm): Save window config, - select the article before saving. - -1999-01-09 Tsukamoto Tetsuo - - * lisp/gnus-offline.el (gnus-offline-popup-menu): Bug fix -- Use - `gnus-offline-menu-on-agent' if `miee-popup-menu' does not exist. - -1999-01-08 Katsumi Yamaoka - - * lisp/pop3.el (pop3-last): Use `split-string' instead of - `pop3-string-to-list'. - (pop3-stat): Ditto. - (pop3-munge-message-separator): Ditto. - (pop3-string-to-list): Abolished. - -1999-01-06 Tsukamoto Tetsuo - - * lisp/gnus-offline.el (gnus-offline-setup): Don't call - `gnus-offline-agent-expire' when 'gnus-agent-expire-all' is - non-nil. - (gnus-offline-define-menu-on-miee): Call `easy-menu-add' under - XEmacs. - (gnus-offline-popup-menu): New function. - (gnus-offline-define-menu-and-key): Call it under Emacs to create - a popup menu in the group buffer. - -1999-01-04 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.052. - - * Sync up with Pterodactyl Gnus v0.69. - -1998-12-28 Katsumi Yamaoka - - * lisp/gnus-sum.el (gnus-summary-preview-mime-message): Always - select the article before previewing. Abolish prefix arg. - - * lisp/gnus-art.el (gnus-mime-preview-quitting-method): re-select - the article without reservation. - (gnus-article-display-mime-message): Show all headers if - `gnus-have-all-headers' the local var of summary buffer is non-nil. - -1998-12-25 Katsumi Yamaoka - - * lisp/gnus-art.el (gnus-article-check-buffer): Rewrite (checking - for buffer object). - -1998-12-22 Katsumi Yamaoka - - * lisp/gnus-art.el (mime-preview-over-to-next-method-alist): Use - `gnus-summary-next-article' in `gnus-original-article-mode'. - (mime-preview-over-to-previous-method-alist): Use - `gnus-summary-prev-article' in `gnus-original-article-mode'. - -1998-12-22 Katsumi Yamaoka - - * lisp/gnus-bbdb.el (toplevel): Define `bbdb-pop-up-elided-display' - for avoiding byte-compile warning. - - * lisp/gnus-art.el (gnus-article-mode-map): Define almost undefined - keys to `gnus-article-read-summary-keys'. - (gnus-article-check-buffer): Check for a major-mode in - `gnus-original-article-buffer' as well. - (gnus-article-prepare-display): Set `gnus-article-current-summary' - to `gnus-summary-buffer'. - -1998-12-21 Tatsuya Ichikawa - - * lisp/pop3-fma.el (pop3-fma-movemail): Work with movemail.exe - with APOP extention. - -1998-12-18 Katsumi Yamaoka - - * lisp/gnus-start.el (gnus-read-newsrc-el-file): Bug (referring to - unbounded variable) fix. - -1998-12-17 Katsumi Yamaoka - - * lisp/gnus-start.el (gnus-read-newsrc-el-file): Don't load newsrc - file if it does not exist. - -1998-12-16 Tatsuya Ichikawa - - * lisp/gnus-offline.el: (gnus-offline-define-menu-on-miee) - (gnus-offline-define-menu-on-agent): Use Japanized menu when using - under Meadow. - -1998-12-16 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.051. - - * Sync up with Pterodactyl Gnus v0.68. - -1998-12-14 Tatsuya Ichikawa - - * lisp/gnus-offline.el (gnus-offline-define-menu-on-miee): Bug - fix. - -1998-12-14 Katsumi Yamaoka - - * lisp/nnheader.el (nnheader-find-file-noselect): Call - `find-file-noselect-as-coding-system' with CODING-SYSTEM as the - 1st arg. - - * lisp/gnus-score.el (gnus-score-load-score-alist): Call - `insert-file-contents-as-coding-system' with CODING-SYSTEM as the - 1st arg. - * lisp/nnmail.el (nnmail-find-file): Ditto. - * lisp/nnheader.el (nnheader-insert-file-contents): Ditto. - - * lisp/score-mode.el (gnus-score-edit-exit): Call - `write-region-as-coding-system' as the 1st arg. - * lisp/gnus-start.el (gnus-save-newsrc-file): Ditto. - - * lisp/gnus-start.el (gnus-read-newsrc-el-file): Call - `insert-file-contents-as-coding-system' with CODING-SYSTEM as the - 1st arg. - - * lisp/gnus-score.el (gnus-score-save): Call - `gnus-write-buffer-as-coding-system' with CODING-SYSTEM as the 1st - arg. - * lisp/gnus-cache.el (gnus-cache-possibly-enter-article): Ditto. - (gnus-cache-save-buffers): Ditto. - - * lisp/gnus-util.el (gnus-write-buffer-as-coding-system): Be - CODING-SYSTEM the 1st arg. - - * lisp/nnmail.el (nnmail-write-region): Call - `write-region-as-coding-system' as the 1st arg. - * lisp/gnus-agent.el (gnus-agent-expire): Ditto. - (gnus-agent-fetch-headers): Ditto. - (gnus-agent-flush-cache): Ditto. - (gnus-agent-fetch-articles): Ditto. - (gnus-agent-save-history): Ditto. - (gnus-agent-save-groups): Ditto. - (gnus-agent-save-active): Ditto. - -1998-12-14 Tsukamoto Tetsuo - - * lisp/gnus-offline.el (gnus-offline-define-menu-and-key): Bug - fix. - Overwrite the toolbar spec for gnus-group-mode, under XEmacs. - -1998-12-14 Katsumi Yamaoka - - * lisp/nnheader.el (nnheader-find-file-noselect): Use - `find-file-noselect-as-coding-system' (renamed from - `find-file-noselect-as-specified-coding-system'). - - * lisp/gnus-score.el (gnus-score-load-score-alist): Use - `insert-file-contents-as-coding-system' (renamed from - `insert-file-contents-as-specified-coding-system'). - * lisp/nnmail.el (nnmail-find-file): Ditto. - * lisp/nnheader.el (nnheader-insert-file-contents): Ditto. - - * lisp/score-mode.el (gnus-score-edit-exit): Use - `write-region-as-coding-system' (renamed from - `write-region-as-specified-coding-system'). - * lisp/gnus-start.el (gnus-save-newsrc-file): Ditto. - - * lisp/gnus-start.el (gnus-read-newsrc-el-file): Use - `insert-file-contents-as-coding-system' (renamed from - `insert-file-contents-as-specified-coding-system'). - - * lisp/gnus-score.el (gnus-score-save): Use - `gnus-write-buffer-as-coding-system' (renamed from - `gnus-write-buffer-as-specified-coding-system'). - * lisp/gnus-cache.el (gnus-cache-possibly-enter-article): Ditto. - (gnus-cache-save-buffers): Ditto. - - * lisp/gnus-util.el (gnus-write-buffer-as-coding-system): Renamed - from 'gnus-write-buffer-as-specified-coding-system'. - - * lisp/nnmail.el (nnmail-write-region): Use - `write-region-as-coding-system' (renamed from - `write-region-as-specified-coding-system'). - * lisp/gnus-agent.el (gnus-agent-expire): Ditto. - (gnus-agent-fetch-headers): Ditto. - (gnus-agent-flush-cache): Ditto. - (gnus-agent-fetch-articles): Ditto. - (gnus-agent-save-history): Ditto. - (gnus-agent-save-groups): Ditto. - (gnus-agent-save-active): Ditto. - -1998-12-14 Tsukamoto Tetsuo - - * lisp/gnus-offline.el (gnus-offline-define-menu-on-miee): Bug - fix. - (gnus-offline-set-offline-sendmail-function): Bug fix. - -1998-12-12 Hidekazu Nakamura - - * lisp/gnus-ofsetup.el (gnus-setup-for-offline): Bug fix. - -1998-12-12 Tsukamoto Tetsuo - - * lisp/gnus-offline.el (gnus-offline-define-menu-on-miee): Bug - fix. - (gnus-offline-set-offline-sendmail-function): Bug fix. - -1998-12-11 Tatsuya Ichikawa - - * lisp/gnus-offline.el (gnus-offline-define-menu-on-miee): Change - easy-menu-define to easy-menu-change to override miee menu. - -1998-12-11 Katsumi Yamaoka - - * lisp/nnheader.el (nnheader-find-file-noselect): Call - `find-file-noselect-as-specified-coding-system' directly. - -1998-12-10 Tatsuya Ichikawa - - * lisp/gnus-offline.el (gnus-offline-setup): Add - gnus-offline-setup to gnus-group-mode-hook. - (gnus-offline-set-offline-sendmail-function): Bug fix. - -1998-12-10 Tsukamoto Tetsuo - - * lisp/gnus-offline.el (gnus-offline-define-menu-on-miee): Bug - fix. - (gnus-offline-define-menu-on-agent): Bug fix. - -1998-12-10 Katsumi Yamaoka - - * lisp/pop3.el (pop3-movemail): Use `write-region-as-binary' - instead of `append-to-file'. - (pop3-movemail-file-coding-system): Abolished. - - * lisp/nnheader.el (nnheader-find-file-noselect): Use - `find-file-noselect-as-specified-coding-system' instead of - `find-file-noselect'. - - * lisp/gnus-score.el (gnus-score-load-score-alist): Use - `insert-file-contents-as-specified-coding-system' instead of - `insert-file-contents'. - * lisp/nnmail.el (nnmail-find-file): Ditto. - * lisp/nnheader.el (nnheader-insert-file-contents): Ditto. - - * lisp/message.el (message-send-mail-with-qmail): Enclose - `call-process-region' with `as-binary-process'. - (message-send-mail-with-sendmail): Ditto. - (message-send-coding-system): Abolished. - - * lisp/score-mode.el (gnus-score-edit-exit): Emulate - `save-buffer' with `write-region-as-specified-coding-system'. - * lisp/gnus-start.el (gnus-save-newsrc-file): Ditto. - - * lisp/gnus-start.el (gnus-read-newsrc-el-file): Emulate `load' - with `insert-file-contents-as-specified-coding-system' and - `eval-region'. - - * lisp/gnus-score.el (gnus-score-save): Use - `gnus-write-buffer-as-specified-coding-system' instead of - `gnus-write-buffer'. - * lisp/gnus-cache.el (gnus-cache-possibly-enter-article): Ditto. - (gnus-cache-save-buffers): Ditto. - - * lisp/gnus-util.el (gnus-output-to-mail): Use - `write-region-as-binary' instead of `append-to-file'. - (gnus-output-to-mail): Use `gnus-write-buffer-as-binary' instead - of `gnus-write-buffer'. - (gnus-write-buffer-as-specified-coding-system): New function. - (gnus-write-buffer-as-binary): New function. - - * lisp/nnmail.el (nnmail-write-region): Use - `write-region-as-specified-coding-system' instead of - `write-region'. - * lisp/gnus-agent.el (gnus-agent-expire): Ditto. - (gnus-agent-fetch-headers): Ditto. - (gnus-agent-flush-cache): Ditto. - (gnus-agent-fetch-articles): Ditto. - (gnus-agent-save-history): Ditto. - (gnus-agent-save-groups): Ditto. - (gnus-agent-save-active): Ditto. - -1998-12-10 Tatsuya Ichikawa - - * lisp/gnus-offline.el (gnus-offline-after-jobs-done): Create menu - using 'easymenu'. - -1998-12-09 Tsukamoto Tetsuo - - * lisp/gnus-offline.el (gnus-offline-after-jobs-done): Don't call - `gnus-offline-agent-expire' under XEmacs. - -1998-12-08 Katsumi Yamaoka - - * texi/gnus-ja.texi: Fix latin chars. - * texi/gnus.texi: Ditto. - - * texi/ChangeLog: Shrunk. - - * text/widget.texi: Removed. - * texi/custom.texi: Removed. - - * lisp/ChangeLog: Fix latin chars. - - * lisp/pop3.el (pop3-open-server): Use - `open-network-stream-as-binary' instead of `open-network-stream'. - * lisp/nntp.el (nntp-open-network-stream): Ditto. - * lisp/gnus-gl.el (bbb-connect-to-bbbd): Ditto. - - * lisp/nntp.el (nntp-open-rlogin): Enclose `start-process' with - `as-binary-process'. - (nntp-open-telnet): Ditto. - - * lisp/nntp.el (nntp-coding-system-for-write): Abolished. - (nntp-coding-system-for-read): Abolished. - - * lisp/nndb.el: Don't require `tcp'. - -1998-12-07 Katsumi Yamaoka - - * lisp/message.el (message-get-parameter-with-eval): Call - `message-get-parameter' with arg `key' first. - -1998-12-07 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.050. - - * Sync up with Pterodactyl Gnus 0.65. - -1998-12-06 Tatsuya Ichikawa - - * lisp/message.el (message-cite-original-without-signature): Do - not use mml-quote-region. - - * lisp/message.el (message-cite-original): Ditto. - - * lisp/gnus.el (gnus-version-number): Update to 6.10.049. - - * Sync up with Pterodactyl Gnus 0.64. - -1998-12-04 Katsumi Yamaoka - - * lisp/gnus-sum.el (gnus-summary-show-article): Don't use - `mm-destroy-parts'. - -1998-12-04 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.048. - - * Sync up with Pterodactyl Gnus 0.63. - -1998-12-04 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.047. - - * Sync up with Pterodactyl Gnus 0.62. - - * README.ichikawa: Add description of required APEL/FLIM/SEMI. - -1998-12-03 Katsumi Yamaoka - - * lisp/nndraft.el (nndraft-request-article): Don't bind - `nnmail-file-coding-system'. - -1998-12-03 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.046. - - * Sync up with Pterodactyl Gnus 0.61. - -1998-12-02 Tatsuya Ichikawa - - * lisp/smtp.el: Abolished - Use smtp.el in FLIM. - - * lisp/gnus.el (gnus-version-number): Update to 6.10.045. - - * Sync up with Pterodactyl Gnus 0.59. - -1998-12-01 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.044. - - * Sync up with Pterodactyl Gnus 0.58. - -1998-12-01 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.043. - - * Sync up with Pterodactyl Gnus 0.57. - -1998-11-30 Katsumi Yamaoka - - * lisp/base64.el (base64-decode-region): Use `defun-maybe'. - (base64-encode-region): Ditto. - - * lisp/gnus.el (gnus-version-number): Update to 6.10.042. - - * Sync up with Pterodactyl Gnus 0.56. - -1998-11-29 Tatsuya Ichikawa - - * lisp/gnus-offline.el: Fix typo of DOC string. - - * lisp/score-mode.el: Change default value - score-mode-coding-system 'binary to 'ctext. - -1998-11-28 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.041. - - * Sync up with Pterodactyl Gnus 0.55. - -1998-11-26 Katsumi Yamaoka - - * lisp/gnus-msg.el (gnus-summary-supersede-article): Bind - `gnus-message-setup-hook' to minimum setting. - - * lisp/message.el (message-supersede-setup-for-mime-edit): New - function. - (message-supersede-setup-function): New user option. Use - `message-supersede-setup-for-mime-edit' in default. - (message-supersede): Call `message-supersede-setup-function' if it - is non-nil. - (message-supersede-setup-hook): New user option. - - * lisp/message.el (message-bounce-setup-for-mime-edit): Don't - delete header separator. It is up to MIME-Edit to do so. - -1998-11-24 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.040. - - * Sync up with Pterodactyl Gnus 0.54. - -1998-11-24 Tatsuya Ichikawa - - * lisp/gnus-offline.el (gnus-offline-version-number): Update to - 2.00. - - * lisp/pop3-fma.el (pop3-fma-save-password-information): New - variable. Do not save password information when - `pop3-fma-save-password-information' set to nil (in default). - (pop3-fma-encode-string): abolished - because of difference of - FLIM API. - (pop3-fma-decode-string): Ditto. - -1998-11-21 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.039. - - * Sync up with Pterodactyl Gnus 0.53. - - * lisp/pop3-fma.el (pop3-fma-init-message-hook): Change - message-send-hook to mime-edit-translate-hook - enbug. - -1998-11-20 Tatsuya Ichikawa - - * lisp/gnus-offline.el: Update to beta5. - - * lisp/gnus-ofsetup.el: Update to beta5. - - * lisp/gnus.el (gnus-version-number): Update to 6.10.038. - - * Sync up with Pterodactyl Gnus 0.52. - -1998-11-19 Keiichi Suzuki - - * lisp/message.el (message-get-reply-buffer): Abolished. - (message-get-original-reply-buffer): Abolished. - (message-get-parameter): New inline function. - (message-get-parameter-with-eval): New macro. - (message-fetch-reply-field): Do not use `message-get-reply-buffer'. - (message-yank-original): Ditto. - (message-setup): Use `message-get-parameter'. - (message-mime-insert-article): Use - `message-get-parameter-with-eval' instead of - `message-get-original-reply-buffer'. - - * lisp/gnus-msg.el (gnus-inews-add-send-actions): Do not add - `set-window-configuration' to action when - `message-use-multi-frames' is non-`nil'. - -1998-11-19 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.037. - - * Sync up with Pterodactyl Gnus 0.51. - - * lisp/gnus-ofsetup.el (gnus-setup-for-offline): Force set - `use-miee' to t if `news-method' is equal to "nnspool". - (gnus-setup-for-offline): Put a question for "Agent directory" - only if `gnus-offline-news-fetch-method' is equal to `nnagent'. - (Top-Level): Defvar `use-miee' for avoiding byte-compile warning. - -1998-11-18 Katsumi Yamaoka - - * lisp/gnus-sum.el (gnus-summary-save-article-rmail): Use - `gnus-summary-save-in-rmail' instead of - `rmail-output-to-rmail-file'. - -1998-11-18 Katsumi Yamaoka - - * lisp/message.el (message-mimic-kill-buffer): Rewrite. - -1998-11-18 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.036. - - * Sync up with Pterodactyl Gnus 0.50. - -1998-11-18 Katsumi Yamaoka - - * lisp/message.el (message-mimic-kill-buffer): New function. - (message-mode-map): Use it for `C-x k'. - -1998-11-18 Keiichi Suzuki - - * lisp/message.el (message-dont-send): Use `message-delete-frame'. - -1998-11-18 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.035. - - * Sync up with Pterodactyl Gnus 0.49. - -1998-11-17 Tsukamoto Tetsuo - - * lisp/message.el (message-dont-send): Use `message-save-drafts' - instead of `save-buffer'. - -1998-11-17 Hiroaki Matsui - - * lisp/message.el (message-clone-locals): Add - "user-mail-address" and "user-full-name" to matching pattern. - -1998-11-14 Kenji Itoh - - * lisp/nnmail.el (nnmail-read-passwd): Use `read-passwd' if it - exists as a function. - - * lisp/pop3.el (pop3-read-passwd): Ditto. - -1998-11-16 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.034. - (gnus-version): Modify for SEMI 1.11, FLIM 1.12. - -1998-11-16 Katsumi Yamaoka - - * make.bat: Replace line endings from `LF' to `CRLF'. - -1998-11-16 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.033. - - * Sync up with Pterodactyl Gnus 0.48. - -1998-11-16 Katsumi Yamaoka - - * texi/emacs-mime.texi: Fix iso-8859-1 chars. - - * lisp/message.el (message-send-news): Call - `message-maybe-split-and-send-news' with an arg `method'. - (message-maybe-split-and-send-news): Accept an arg `method'. - - * lisp/rfc1843.el: Defvar `gnus-decode-encoded-word-function'. - - * lisp/mm-uu.el: Require `gnus-mailcap'. - * lisp/mm-decode.el: Require `gnus-mailcap' instead of `mailcap'. - * lisp/mm-encode.el: Ditto. - * lisp/gnus-mailcap.el: Provide `gnus-mailcap' instead of `mailcap'. - -1998-11-16 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.032. - - * Sync up with Pterodactyl Gnus 0.47. - -1998-11-15 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.031. - - * Sync up with Pterodactyl Gnus 0.46. - -1998-11-14 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.030. - - * Sync up with Pterodactyl Gnus 0.44. - -1998-11-13 Katsumi Yamaoka - - * lisp/gnus-art.el (gnus-article-header-presentation-method): Use - `mime-insert-header' instead of `mime-insert-decoded-header'. - - * lisp/nnheader.el (nnheader-decode-subject): Change the 2nd arg of - `mime-find-field-decoder' to 'nov'. - (nnheader-decode-from): Ditto. - - * lisp/message.el (message-maybe-split-and-send-mail): Discard - a return from `message-send-mail-function'. - -1998-11-12 Tatsuya Ichikawa - - * lisp/gnus-offline.el: bug fix. - - * lisp/gnus-ofsetup.el: Bug fix. - -1998-11-12 Katsumi Yamaoka - - * texi/Makefile.in (.texi:): Don't escape double quote. - (texi2latex.elc:): Ditto. - -1998-11-12 Tatsuya Ichikawa - - * texi/gnus-ja.texi: Add infos about `pop3-fma' and `gnus-offline'. - -1998-11-12 Katsumi Yamaoka - - * lisp/message.el (message-maybe-split-and-send-mail): Use - `defsubst' instead of `defun'. - (message-maybe-split-and-send-news): Ditto. - -1998-11-12 Katsumi Yamaoka - - * lisp/gnus-msg.el (gnus-summary-resend-bounced-mail): Bind - `gnus-message-setup-hook' to minimum setting. - - * lisp/message.el (message-bounce-setup-for-mime-edit): New - function. - (message-bounce-setup-function): New user option. Use - `message-bounce-setup-for-mime-edit' in default. - (message-bounce): Call `message-bounce-setup-function' if it is - non-nil. - (message-bounce-setup-hook): New user option. - (message-send-mail): Delete useless things. - -1998-11-12 Katsumi Yamaoka - - * lisp/message.el (message-maybe-split-and-send-mail): New function. - (message-send-mail): Use it. - (message-maybe-split-and-send-news): New function. - (message-send-news): Use it. - -1998-11-11 Tatsuya Ichikawa - - * lisp/gnus-offline.el: bug fix. - - * lisp/gnus-ofsetup.el: Bug fix. - -1998-11-11 Katsumi Yamaoka - - * lisp/message.el (message-send-mail): Protect against errors. - (message-send-news): Ditto. - -1998-11-11 Keiichi Suzuki - - * lisp/message.el (message-do-fcc): Sync up with Semi-gnus 6.8. - (message-8bit-encoding-list): New variable. - (message-check-encoding): Use `message-8bit-encoding-list'. Change - search pattern. - -1998-11-11 Keiichi Suzuki - - * lisp/gnus-bbdb.el (gnus-bbdb/extract-address-components): Normalize - return value. - (gnus-bbdb/update-record): Change condition for checking own message. - -1998-11-11 Yoshiki Hayashi - - * README.semi.ja, README.branch.ja: New file. - -1998-11-10 Tatsuya Ichikawa - - * lisp/gnus-offline.el: bug fix. - - * lisp/gnus-ofsetup.el: Bug fix. - -1998-11-09 Tatsuya Ichikawa - - * lisp/gnus-offline.el: v2.00b1 Separate setting part and - functional part - setting part move to gnus-ofsetup.el (New file). - - * lisp/gnus-ofsetup.el: New file - setting function for - gnus-offline. - -1998-11-09 Katsumi Yamaoka - - * lisp/nnheader.el (nnheader-decode-subject): Call - `mime-find-field-decoder' with `summary' as the 2nd arg. - (nnheader-decode-from): Ditto. - -1998-11-09 Katsumi Yamaoka - - * lisp/pop3-fma.el: Set the value of `nnmail-read-passwd' as a - symbol `pop3-fma-read-passwd'. - -1998-11-09 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.029. - - * Sync up with Pterodactyl Gnus 0.42. - -1998-11-09 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.028. - - * Sync up with Pterodactyl Gnus 0.41. - -1998-11-06 Katsumi Yamaoka - - * lisp/gnus-art.el (gnus-article-make-full-mail-header): New - function. - (gnus-article-mime-edit-article-setup): Use it. - (gnus-article-mime-edit-exit): Use it. - - (gnus-article-mime-edit-article-setup): Set `gnus-show-mime' to t. - - * lisp/gnus-bbdb.el: Modify header description. - -1998-11-05 Katsumi Yamaoka - - * lisp/gnus-art.el (gnus-article-edit-done): Remove - `gnus-article-mime-edit-article-unwind' from - `gnus-article-mode-hook' before run `gnus-article-edit-exit'. - (gnus-article-mime-edit-article-setup): Revised. - (gnus-article-mime-edit-article-unwind): New function. - (gnus-article-mime-edit-exit): New function. - - (gnus-insert-mime-button): Fix typo. - -1998-11-04 Yoshiki Hayashi - - * lisp/message.el: (message-do-fcc): Don't run message-header-hook - and message-before-do-fcc-hook. - -1998-11-04 MORIOKA Tomohiko - - * lisp/mmgnus.el (entity-buffer): Must move to (point-min) before - search boundary between header and body (to fix problem with - Emacs). - -1998-11-03 MORIOKA Tomohiko - - * lisp/nnmh.el (nnmh-retrieve-headers): Don't use - `nnheader-fold-continuation-lines'. - - * lisp/gnus-sum.el (gnus-get-newsgroup-headers): Don't expect - unfolded (to fix problem when using gnus-cache). - -1998-11-04 Katsumi Yamaoka - - * lisp/message.el (message-make-in-reply-to): Quote date. - -1998-11-02 Keiichi Suzuki - - * lisp/gnus-bbdb.el (gnus-bbdb/canonicalize-full-name-methods): - New variable. (Merged from `mime-bbdb.el' in SEMI.) - (gnus-bbdb/extract-address-components): New function. (Merged from - `mime-bbdb.el' in SEMI.) - (gnus-bbdb/canonicalize-spaces): Ditto. - (gnus-bbdb/canonicalize-dots): Ditto. - (gnus-bbdb/update-record): Use - `gnus-bbdb/extract-address-components'. - (gnus-bbdb/lines-and-from): Ditto. - (gnus-bbdb/summary-get-author): Ditto. - (gnus-bbdb/summary-author-in-bbdb): Ditto. - (gnus-bbeb/decode-field-body-function): New variable. - (gnus-bbdb/decode-field-body): New macro. - (gnus-bbdb/update-record): Use `gnus-bbdb/decode-field-body'. - (gnus-bbdb/extract-field-value): Ditto. - (gnus-bbdb/decode-field-body-function): Fix typo. - (gnus-bbdb/decode-field-body): Ditto. - (gnus-bbdb/update-record): Use `save-excursion' and change timing - of `save-restriction'. - -1998-10-31 Katsumi Yamaoka - - * lisp/gnus-draft.el (gnus-draft-decoding-function): Use - `mime-edit-decode-message-in-buffer' instead of - `mime-edit-decode-buffer'. - -1998-10-31 Tatsuya Ichikawa - - * lisp/nnheader.el (nnheader-decode-field-body): New inline - function. - - * lisp/gnus-draft.el (gnus-draft-decoding-function): Use - `mime-edit-decode-buffer' and `mime-decode-header-in-buffer'. - - * lisp/gnus-bbdb.el (gnus-bbdb/update-record): Use - `nnheader-decode-field-body' instead of `mime-decode-field-body'. - (gnus-bbdb/extract-field-value): Ditto. - -1998-10-30 Keiichi Suzuki - - * lisp/gnus-bbdb.el (gnus-bbdb/update-record): Check existance of - `To' field before decoding. - -1998-10-30 Katsumi Yamaoka - - * README-gnus-bbdb.en: New file, translated by courtesy of - Hiroshi Kawaguchi . - -1998-10-30 Katsumi Yamaoka - - * lisp/dgnushack.el (dgnushack-compile): Add `gnus-bbdb.el'. - - * lisp/gnus-bbdb.el: New file. By courtesy of Keiichi Suzuki. - * README-gnus-bbdb.ja: Ditto (A part of Nana-TIPS.ja). - -1998-10-30 Tatsuya Ichikawa - - * lisp/gnus.el: Add autoload setting for `gnus-offline' and - `pop3-fma'. - -1998-10-30 Katsumi Yamaoka - - * lisp/gnus-art.el (article-decode-encoded-words): Use - `mime-decode-header-in-buffer' instead of `eword-decode-header'. - (gnus-article-display-message-with-encoded-word): Likewise. - - * lisp/gnus-art.el (gnus-article-mime-edit-article-setup): Fix - typo. - -1998-10-29 MORIOKA Tomohiko - - * lisp/gnus-draft.el (gnus-draft-decoding-function): Use - `mime-edit-decode-buffer' simply as initial value. - - * lisp/message.el (message-make-forward-subject): Use - `nnheader-decode-subject' instead of - `eword-decode-unstructured-field-body'. - - * lisp/nnheader.el (nnheader-decode-subject): New alias. - (nnheader-decode-from): New alias. - (make-full-mail-header): Use `nnheader-decode-subject' and - `nnheader-decode-from' instead of - `eword-decode-and-unfold-unstructured-field' and - `eword-decode-and-unfold-structured-field'. - -1998-10-29 Katsumi Yamaoka - - * lisp/gnus-art.el (gnus-article-mime-edit-article-setup): Force - `font-lock' to turn on at the beginning. Turn off `font-lock' - after editing article. - -1998-10-29 Katsumi Yamaoka - - * lisp/gnus-sum.el (gnus-summary-edit-article-done): Abolish - `gnus-article-decoded-p'. - - * lisp/nnheader.el: Delete useless comments. - - * lisp/gnus-art.el (gnus-article-edit-article): Call - `gnus-article-edit-article-setup-function' if it is non nil. - (gnus-article-mime-edit-article-setup): New function. - (gnus-article-mime-edit-article-setup-hook): New hook. - (gnus-article-edit-article-setup-function): New user option. Use - `gnus-article-mime-edit-article-setup' in default. - -1998-10-28 Tatsuya Ichikawa - - * lisp/pop3-fma.el: Determin base64 encode/decode function by FLIM. - -1998-10-26 Tatsuya Ichikawa - - * lisp/pop3-fma.el: Require `mel-b-el' if `mel-b' does not exist. - -1998-10-26 Katsumi Yamaoka - - * lisp/pop3-fma.el: Require `mel-b-ccl' or `mel-b-el' if `mel-b' - does not exist. - - * lisp/nnheader.el (nnheader-file-coding-system): Restore the - previous default value. - -1998-10-26 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.027. - - * Sync up with Pterodactyl Gnus 0.40. - -1998-10-23 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.026. - (gnus-version): Modify supported version for FLIM and SEMI. - -1998-10-22 Katsumi Yamaoka - - * lisp/gnus-cache.el (gnus-cache-possibly-enter-article): Use - `mime-fetch-field' for getting Subject and From field. - -1998-10-20 MORIOKA Tomohiko - - * lisp/nnheader.el (nnheader-insert-nov): Use `mime-fetch-field' - for Subject and From field. - -1998-10-20 Katsumi Yamaoka - - * lisp/nnheader.el (nnheader-parse-nov): Use - `make-full-mail-header'. - -1998-10-20 MORIOKA Tomohiko - - * lisp/nnheader.el (nnheader-parse-head): Use - `make-full-mail-header'. - -1998-10-20 Katsumi Yamaoka - - * lisp/nnheader.el (make-full-mail-header): Sync up with - "chao-6_9" branch. - (mail-header-set-xref): Use `mime-entity-set-xref-internal'. - (mail-header-xref): Use `mime-entity-xref-internal' - (mail-header-set-lines): mime-entity-set-lines-internal'. - (mail-header-lines): Use `mime-entity-lines-internal' - (mail-header-set-chars): Use `mime-entity-set-chars-internal'. - (mail-header-chars): Use `mime-entity-chars-internal'. - (mail-header-set-references): Use - `mime-entity-set-references-internal'. - (mail-header-references): Use `mime-entity-references-internal'. - (mail-header-set-message-id): Use - `mime-entity-set-message-id-internal'. - (mail-header-message-id): Use `mime-entity-message-id-internal'. - (mail-header-set-date): Use `mime-entity-set-date-internal'. - (mail-header-date): Use `mime-entity-date-internal'. - (mail-header-set-from): Use - `mime-entity-set-decoded-from-internal'. - (mail-header-from): Use `mime-entity-decoded-from-internal'. - (mail-header-set-subject): Use - `mime-entity-set-decoded-subject-internal'. - (mail-header-subject): Use `mime-entity-decoded-subject-internal'. - All changes are imported from "chao-6_9" branch. - - * lisp/message.el (message-reply): Use - `make-full-mail-header-from-decoded-header`. - (message-followup): Ditto. - (message-get-reply-buffer-function): Abolished. - (message-fill-address): Don't fold if the current column number is - less than 79. - - * lisp/gnus-sum.el (gnus-summary-insert-line): Use - `gnus-put-text-property-excluding-characters-with-faces' instead - of `gnus-put-text-property'. - (gnus-summary-mode-map): Abolish key definition - "b" for `gnus-article-view-part'. - (gnus-encoded-word-method-alist): Abolished. - (gnus-multi-decode-encoded-word-string) Abolished. - - * lisp/gnus-int.el (gnus-request-replace-article): Don't encode - message body. - - * lisp/gnus-i18n.el (gnus-get-summary-default-charset): Abolished. - (gnus-set-summary-default-charset): Sync up with "chao-6_9" branch. - - * lisp/gnus-art.el (gnus-article-display-method-for-encoded-word): - Abolished. - (gnus-article-display-message-with-encoded-word): Abolished. - -1998-10-14 MORIOKA Tomohiko - - * lisp/gnus-sum.el (gnus-summary-line-format-alist): Use - `mime-read-field', `std11-address-string' and - `std11-full-name-string' instead of - `gnus-extract-address-components'. - (gnus-article-sort-by-author): Likewise. - -1998-10-12 MORIOKA Tomohiko - - * lisp/nnheader.el (make-full-mail-header-from-decoded-header): - New function. - -1998-10-05 MORIOKA Tomohiko - - * lisp/gnus-art.el (gnus-article-display-mime-message): Set up - buffer local variable `default-mime-charset' of - `gnus-original-article-buffer' and `gnus-article-buffer'. - -1998-09-30 MORIOKA Tomohiko - - * lisp/nnheader.el: Use `mime-entity' as gnus-header structure. - (mail-header-number): Use `mime-entity-location-internal'. - (mail-header-set-number): Use `mime-entity-set-location-internal'. - - Change other `mail-header-*' and `mail-header-set-*' to alias of - reference and set functions for mime-entity-internal. - - * lisp/mmgnus.el: New module. - - * lisp/gnus-sum.el: Abolish variable - `gnus-structured-field-decoder' and - `gnus-unstructured-field-decoder'. - (gnus-nov-parse-line): Don't decode from and subject. - (gnus-get-newsgroup-headers): Likewise. - - * lisp/gnus-score.el (gnus-header-index): Modify to use - mime-entity structure as gnus-header structure. - - * lisp/gnus-art.el (gnus-article-prepare-display): Use content of - `gnus-current-headers' as mime-message-structure. - -1998-09-29 MORIOKA Tomohiko - - * lisp/gnus-sum.el (gnus-update-summary-mark-positions): Use - `make-full-mail-header'. - -1997-11-27 MORIOKA Tomohiko - - (gnus-parse-headers-hook): Use - `(gnus-set-summary-default-charset)' in default. - - -1998-10-21 Katsumi Yamaoka - - * lisp/gnus-xmas.el (gnus-tilde-pad-form): Guard for non string - symbol. - -1998-10-21 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.025. - (gnus-version): Fix supported version for FLIM and SEMI. - - * Sync up with Pterodactyl Gnus 0.36. - -1998-10-20 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.024. - Fix supported version for FLIM and SEMI. - - * Sync up with Pterodactyl Gnus 0.35. - -1998-10-17 Tatsuya Ichikawa - - * lisp/gnus-offline.el (gnus-offline-setup-needed-hooks): Change - message-send-hook to mime-edit-translate-hook. - - * lisp/pop3-fma.el (pop3-fma-init-message-hook): Change - message-send-hook to mime-edit-translate-hook. - - * lisp/message.el (message-save-drafts): New function to save - drafts in network code. - -1998-10-16 Katsumi Yamaoka - - * lisp/gnus-msg.el (gnus-message-setup-hook): Replace the default - value to `gnus-maybe-setup-default-charset'. - (gnus-maybe-setup-default-charset): New function. It is called - `message-maybe-setup-default-charset' at one time. - - * lisp/message.el (message-maybe-setup-default-charset): Abolished. - -1998-10-16 Tatsuya Ichikawa - - * TODO.ja: Update. - -1998-10-15 Keiichi Suzuki - - * lisp/gnus-spec.el (gnus-update-format-specifications): Force - update `gnus-format-specs' when `gnus-version' is differ from - saved version. - -1998-10-14 Katsumi Yamaoka - - * lisp/pop3-fma.el (pop3-fma-read-char-exclusive): New macro. Use - `next-command-event' instead of `read-char-exclusive' under XEmacs. - (pop3-fma-read-noecho): Use it. - -1998-10-13 Katsumi Yamaoka - - * lisp/nnheaderxm.el (nnheader-xmas-Y-or-n-p): New function. - It will be used for the substitute of `nnheader-Y-or-n-p' under - XEmacs. - - * lisp/nnheader.el (nnheader-Y-or-n-p): Rewrite for Emacs 19 or - later except for XEmacs. - -1998-10-12 Katsumi Yamaoka - - * lisp/uudecode.el: New file. - -1998-10-11 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.023. - Add version information for SEMI-1.9/FLIM-1.10. - - * Sync up with Pterodactyl Gnus 0.34. - -1998-10-10 Katsumi Yamaoka - - * lisp/gnus-msg.el (gnus-message-make-user-agent): Fix typo in doc - string. - -1998-10-07 Yoshiki Hayashi - - * lisp/nnagent.el (nnagent-open-server): Small bug fix. - -1998-10-07 Keiichi Suzuki - - * TODO.ja: New file. - -1998-10-06 Katsumi Yamaoka - - * lisp/message.el (message-mime-insert-article): Don't refer to - `mark' position. - - * lisp/message.el (message-mime-insert-article): If the optional - arg FULL-HEADERS is non-nil, include full headers when inserting. - -1998-10-06 Keiichi Suzuki - - * lisp/message.el (message-parameter-alist): New variable. - (message-startup-parameter-alist): New variable. - (message-fetch-reply-field): Get reply buffer with - `message-get-reply-buffer()'. - (message-yank-original): Ditto. - (message-eval-parameter): New function. - (message-get-reply-buffer): Ditto. - (message-get-original-reply-buffer): Ditto. - (message-mode): New buffer local variable - `message-parameter-alist'. - (message-setup): Set up `message-reply-buffer' from - `message-parameter-alist'. - (message-mime-insert-article): Get `Original message buffer' with - `message-get-original-reply-buffer' instead of - `gnus-original-article-buffer'. - Remove bogus header fields for forwarding message. - - * lisp/gnus-msg.el (gnus-setup-message): Setup - `message-startup-parameter-alist'. - -1998-10-05 Yoshiki Hayashi - - * lisp/gnus.el (gnus-info-filename): New variable. - (gnus-info-find-node): Use `gnus-info-filename' and - `current-language-environment'. - -1998-10-05 Katsumi Yamaoka - - * lisp/message.el (message-send-mail): Remove misplaced - `interactive'. - - * lisp/message.el (message-yank-original): Get back to the previous - state. - (message-fetch-reply-field): Ditto. - (message-setup): Ditto. - * lisp/gnus-msg.el (gnus-setup-message): Ditto. - -1998-10-05 Katsumi Yamaoka - - * lisp/gnus-draft.el: Remove some useless comments. - - * lisp/gnus-draft.el (gnus-draft-send-draft): Abolished. - -1998-10-05 Katsumi Yamaoka - - * lisp/message.el (message-yank-original): Use the value of - `message-reply-buffer' as a function if it is a function. - (message-fetch-reply-field): Ditto. - - * lisp/message.el (message-setup): Set the value of - `message-reply-buffer' if the variable - `gnus-message-get-reply-buffer' exists. - - * lisp/gnus-msg.el (gnus-setup-message): Bind - `gnus-message-get-reply-buffer' as the function - `gnus-copy-article-buffer'. - -1998-10-03 MORIOKA Tomohiko - - * lisp/gnus-draft.el (gnus-draft-send): Call - `message-send-news-function' or `message-send-mail-function' - instead of `message-send-and-exit'. - -1998-10-03 Katsumi Yamaoka - - * lisp/message.el (message-mode-map): Use `define-key' instead of - `substitute-key-definition' for `message-kill-buffer'. - -1998-10-03 Katsumi Yamaoka - - * lisp/message.el (message-make-user-agent): Replace with the - new code again. It is based on MORIOKA-san's code. - -1998-10-03 Katsumi Yamaoka - - * lisp/message.el (message-make-user-agent): Replace with the - new code. - - * lisp/gnus-msg.el (gnus-message-make-user-agent): New function. - - * lisp/gnus-msg.el (gnus-extended-version): Needn't be interactive. - - * lisp/gnus-msg.el (gnus-inviolable-extended-version): Abolished. - -1998-10-03 Katsumi Yamaoka - - * lisp/message.el (message-kill-buffer): Change the prompt string. - - * lisp/message.el (message-mode-map): Substitute key definition - from `kill-buffer' to `message-kill-buffer'. - -1998-10-03 Katsumi Yamaoka - - * lisp/gnus-msg.el (gnus-message-setup-hook): Set the default value - to `message-maybe-setup-default-charset'. - - * lisp/message.el (message-setup-hook): Move - 'message-maybe-setup-default-charset' to `gnus-message-setup-hook'. - -1998-10-02 Katsumi Yamaoka - - * lisp/message.el (message-kill-buffer): Refer to - `message-kill-buffer-query-function'. - - * lisp/message.el (message-kill-buffer-query-function): New user - option. - - * lisp/nnheader.el (nnheader-Y-or-n-p): New function. - -1998-10-01 Tatsuya Ichikawa - - * lisp/pop3-fma.el (pop3-fma-movemail): Bug fix. - Delete variable pop3-fma-movemail options. - Add new variabel pop3-fma-commandline-arguments. - -1998-10-01 Katsumi Yamaoka - - * lisp/message.el: Fix my stupid changes. - -1998-09-30 Katsumi Yamaoka - - * lisp/message.el (message-make-user-agent): Add the value of - `system-configuration' to Emacs and XEmacs as a comment. - - * lisp/message.el (message-make-user-agent): Fold up the return - value if the optional arg MAX-COLUMN is specified. - -1998-09-29 Katsumi Yamaoka - - * lisp/message.el (message-make-user-agent): Make a user-agent - string without MUA info, if the value of `message-user-agent' is - nil nor `gnus-inviolable-extended-version' is not exists. - -1998-09-28 Tatsuya Ichikawa - - * lisp/nnmh.el (nnmh-request-accept-article): Insert `Message-ID' - only if `group' name is neither "queue" nor "draft". - Fix typo (at 23:25). - - * lisp/message.el (message-send-mail): Add different Message-ID in - each message/partial - -1998-09-26 Katsumi Yamaoka - - * texi/gnus-ja.texi: Sync up with Semi-gnus 6.8.19. - - * lisp/gnus.el: Add autoload setting for - `gnus-quote-arg-for-sh-or-csh'. - -1998-09-26 Katsumi Yamaoka - - * lisp/gnus-sum.el (gnus-summary-insert-pseudos): Use - `gnus-quote-arg-for-sh-or-csh' instead of `mm-quote-arg'. - - * lisp/nndoc.el (nndoc-possibly-change-buffer): Don't eval - `mm-enable-multibyte'. - * lisp/nnmbox.el (nnmbox-possibly-change-newsgroup): Ditto. - -1998-09-25 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.022. - - * Sync up with Pterodactyl Gnus 0.32. - -1998-09-24 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.021. - - * Sync up with Pterodactyl Gnus 0.31. - -1998-09-23 Katsumi Yamaoka - - * lisp/message.el (message-make-user-agent): Add extended version - number to Emacs/{VERSION} (e.g. "Emacs/20.3.90"). - -1998-09-22 Tatsuya Ichikawa - - * lisp/gnus-agent.el (gnus-agent-expire): Bug fix when variable - expired is nil. - -1998-09-18 Tsukamoto Tetsuo - - * lisp/gnus-draft.el: (gnus-draft-edit-message): Fix typo. - -1998-09-17 Katsumi Yamaoka - - * lisp/message.el (message-make-user-agent): Use - `gnus-inviolable-extended-version' if `message-user-agent' is nil. - - * lisp/message.el (message-make-user-agent): In message-mode, make - the most of the `User-Agent' field value if already exists. - - * lisp/gnus-msg.el (gnus-inviolable-extended-version): New constant. - - * lisp/gnus-msg.el (gnus-extended-version): Remove trailing white - space. - -1998-09-17 Tsukamoto Tetsuo - - * lisp/gnus-draft.el (gnus-draft-send-draft): Expire queued message - after news posting. - -1998-09-17 Tatsuya Ichikawa - - * lisp/gnus-draft.el (gnus-draft-send-draft): Error if no - recipients. - -1998-09-17 Tsukamoto Tetsuo - - * lisp/gnus-draft.el (gnus-draft-decoding-function): Uncommented. - -1998-09-17 Tatsuya Ichikawa - - * lisp/gnus-draft.el (gnus-draft-edit-message): Use - `gnus-draft-setup-for-editing' instead of `gnus-draft-setup'. - (gnus-draft-send): Use `gnus-draft-setup-for-sending' instead of - `gnus-draft-setup'. - (gnus-draft-setup-for-editing): New function (renamed from - `gnus-draft-setup'). - (gnus-draft-setup-for-sending): New function. - (gnus-draft-send-draft-buffer): New variable. - -1998-09-16 Katsumi Yamaoka - - * texi/gnus-ja.texi: Sync up with Semi-gnus 6.8.18. - - * Makefile.in: Add entry `info-ja'. - * texi/Makefile.in: Add entry `ja'. - -1998-09-16 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.020. - - * lisp/ietf-drums.el: New file. - * lisp/date.el: Abolished. - * lisp/mm.el: Abolished. - - * Sync up with Pterodactyl Gnus 0.31. - -1998-09-14 Katsumi Yamaoka - - * lisp/message.el (message-encode-message-body): Copied from - Pterodactyl Gnus 0.30. It is useless for Semi-gnus but usefull for - reducing differences while at work for synchronizing up. It will - be removed when the Gnus becomes stable. - * lisp/gnus-art.el (gnus-mime-display-alternative) - (gnus-display-mime) (gnus-widget-press-button) - (gnus-insert-mime-button) (gnus-mime-copy-part) - (gnus-mime-view-part) (gnus-mime-pipe-part) (gnus-mime-save-part) - (gnus-mime-button-map) (gnus-mime-button-line-format-alist) - (gnus-mime-button-line-format) - (article-mime-decode-quoted-printable-buffer) - (article-de-quoted-unreadable) (article-decode-charset) - (article-decode-mime-words) (gnus-decode-header-function) - (gnus-display-mime-function): Ditto. - -1998-09-14 Katsumi Yamaoka - - * lisp/gnus-art.el (article-decode-encoded-words): Renamed from - `gnus-article-decode-rfc1522'. - - * lisp/mail-parse.el: New file. - * lisp/mm-view.el: New file. - * lisp/rfc2231.el: New file. - * texi/emacs-mime.texi: New file. - - * lisp/gnus.el (gnus-version-number): Update to 6.10.019. - - * Sync up with Pterodactyl Gnus 0.30. - -1998-09-11 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.018. - - * Sync up with Pterodactyl Gnus 0.26. - -1998-09-11 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.017. - - * lisp/gnus-art.el (gnus-show-mime) (gnus-summary-toggle-mime): - Revived. - - * lisp/gnus-mailcap.el: New file. Renamed from `mailcap.el'. - - * Sync up with Pterodactyl Gnus 0.25. - -1998-09-11 Katsumi Yamaoka - - * lisp/gnus-art.el (article-make-date-line): Add TZ value to - `local' and `ut' date. - - * lisp/gnus-art.el (article-make-date-line): Fix `ut' date. - - * lisp/parse-time.el (parse-time-string): The last element of the - return list should be TZ. - - * lisp/message.el (message-send): Eval 'message-fix-before-sending' - after encoding. - -1998-09-10 Katsumi Yamaoka - - * lisp/gnus-spec.el (gnus-tilde-pad-form): Use old macro form. - - * lisp/gnus-art.el (article-decode-mime-words): Abolished. - -1998-09-10 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.016. - - * Sync up with Pterodactyl Gnus 0.24. - -1998-09-09 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.015. - - * Sync up with Pterodactyl Gnus 0.23. - -1998-09-09 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.014. - - * Sync up with Pterodactyl Gnus 0.22. - -1998-09-08 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.013. - - * Sync up with Pterodactyl Gnus 0.19. - -1998-09-08 Tatsuya Ichikawa - - * lisp/gnus-draft.el (gnus-draft-send-draft) (gnus-draft-send): New - implementations for testing. - - * lisp/gnus-agent.el (gnus-agent-expire) (gnus-agent-fetch-headers) - (gnus-agent-flush-cache) (gnus-agent-save-history) - (gnus-agent-save-groups): Bind `coding-system-for-write' by - `gnus-agent-file-coding-system' while writing a file. - - * lisp/gnus-agent.el (gnus-agent-file-coding-system): Renamed from - `gnus-agent-article-file-coding-system'. - -1998-09-08 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.012. - - * Sync up with Pterodactyl Gnus 0.18. - -1998-09-07 Tatsuya Ichikawa - - * lisp/gnus-draft.el (gnus-draft-setup): Do not use message mode. - (gnus-draft-send): Ditto. - gnus-draft-send-draft-buffer: New variable. - - * lisp/gnus-msg.el (gnus-extended-version): Display original Gnus - version. - - * lisp/gnus-agent.el : Use pGnus 0.17 gnus-agent.el - -1998-09-07 Katsumi Yamaoka - - * lisp/gnus.el (gnus-continuum-version): Use `char-int' instead of - `mm-char-int'. - * lisp/messagexmas.el (message-xmas-make-caesar-translation-table): - Ditto. - - * lisp/gnus-art.el (gnus-article-setup-buffer): Don't use - `mm-enable-multibyte'. - -1998-09-07 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.011. - - * Sync up with Pterodactyl Gnus 0.17. - -1998-09-06 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.010. - - * Sync up with Pterodactyl Gnus 0.16. - -1998-09-04 Tatsuya Ichikawa - - * lisp/pop3-fma.el (pop3-fma-movemail): Add error handle. - (pop3-fma-get-movemail-type): Fix typo. - -1998-09-04 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.9.09. - - * Sync up with Pterodactyl Gnus 0.14. - -1998-09-03 Katsumi Yamaoka - - * lisp/nndoc.el (nndoc-transform-mime-parts): Insert - "MIME-Version:" instead of "Mime-Version:". - - * lisp/message.el (message-encode-message-body): Abolished. - - * lisp/message.el: Don't require `rfc2047'. - - * lisp/gnus.el: Delete autoload settings for `qp' and `rfc2047'. - - * lisp/gnus.el (semi-gnus-developers): New constant. - - * lisp/gnus.el (gnus-version-number): Update to 6.9.08. - - * lisp/gnus-xmas.el (gnus-tilde-pad-form): Move to - `gnus-xmas-redefine' from `gnus-xmas-define'. - - * lisp/gnus-sum.el (gnus-set-mode-line): Use `gnus-truncate-string' - instead of `truncate-string'. - - * lisp/gnus-sum.el: Don't define menu for "MIME". - - * lisp/gnus-sum.el: Delete key definitions for - `gnus-article-decode-mime-words' and `gnus-article-decode-charset'. - - * lisp/gnus-spec.el (gnus-tilde-pad-form): New function for the - benefit of avoiding byte-compile warning. - - * lisp/gnus-soup.el (gnus-soup-send-packet): Set - `message-user-agent' instead of `message-newsreader'. - - * lisp/message.el (message-set-work-buffer) (message-mode): Don't - use `mm-enable-multibyte'. - * lisp/gnus-util.el (gnus-set-work-buffer): Ditto. - * lisp/gnus-sum.el (gnus-summary-mode): Ditto. - * lisp/gnus-msg.el (gnus-copy-article-buffer): Ditto. - * lisp/gnus-art.el (gnus-article-mode): Ditto. - - * lisp/gnus-art.el (gnus-article-decode-mime-words) - (gnus-article-decode-charset) (gnus-decode-rfc1522) - (article-decode-rfc1522) (article-de-quoted-unreadable) - (article-mime-decode-quoted-printable-buffer): Abolished. - - * lisp/message.el: Don't require `mm-bodies'. - * lisp/gnus-art.el: Ditto. - - * lisp/gnus-agent.el (gnus-category-line-format-alist): Change - variable name `name' and `groups' to `gnus-tmp-name' and - `gnus-tmp-groups'. - (gnus-category-insert-line): Ditto. - - * lisp/gnus-agent.el (gnus-agent-fetch-articles): Delete useless - binding variables. - -1998-09-01 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.9.07. - - * Sync up with Pterodactyl Gnus 0.13. - -1998-08-31 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.9.04. - - * Sync up with Pterodactyl Gnus 0.10. - - * lisp/gnus-agent.el : back to version Gnus 5.6.32. - -1998-08-31 Katsumi Yamaoka - - * lisp/rfc1522.el: Abolished. - - * lisp/message.el: (message-send-mail) (message-send-news): Don't - use `mm-encode-message-header'. - - * lisp/gnus.el: Delete autoload settings for - `hexl-hex-string-to-integer', `mm-decode-words-region', - `mm-decode-words-string', `gnus-hack-decode-rfc1522', - `gnus-article-de-quoted-unreadable', `gnus-decode-rfc1522' and - `article-decode-rfc1522'. - - * lisp/gnus-sum.el: Delete key definitions for - `gnus-article-decode-mime-words', `gnus-article-decode-mime-words' - and `gnus-article-de-quoted-unreadable'. - - * lisp/gnus-art.el (gnus-article-decode-mime-words) - (gnus-decode-rfc1522) (article-de-quoted-unreadable) - (article-mime-decode-quoted-printable-buffer): Abolished. - - * lisp/gnus.el (gnus-version-number): Update to 6.9.03. - - * Sync up with Pterodactyl Gnus 0.9. - -1998-08-31 Tatsuya Ichikawa - - * lisp/gnus-agent.el: Do not use nnheader-temp-write. - - * lisp/gnus-ems.el: Do not use nnheader-temp-write. - - * lisp/gnus.el (gnus-version-number): Update to 6.9.02. - - * Sync up with Pterodactyl Gnus 0.8. - -1998-08-30 Tatsuya Ichikawa - - * New branch ... pgnus-ichikawa - - * lisp/gnus.el (gnus-original-version-number) - (gnus-original-product-name) : New variable. - - * lisp/gnus.el (gnus-version-number): Update to 6.9.01. - Third version number 0x means Original gnus's status in beta version. - - * Sync up with Pterodactyl Gnus 0.6. - -1998-08-30 Tatsuya Ichikawa - - * lisp/gnus-agent.el (gnus-agent-fetch-headers): Bug Fix. - When add a new newsgroup , gnus-agent cannot fetch articles. - - * lisp/gnus.el (gnus-version-number): Update to 6.8.17. - - * Sync up with Gnus 5.6.42. - -1998-08-28 Shuhei KOBAYASHI - - * lisp/gnus-i18n.el (gnus-set-summary-default-charset): Try - "qualified" newsgroup name first. - -1998-08-28 Shuhei KOBAYASHI - - * lisp/gnus-i18n.el (gnus-set-summary-default-charset): Match - "real" newsgroup name; strip "backend+server" prefix. - -1998-08-28 Katsumi Yamaoka - - * lisp/message.el (message-make-user-agent): New function. - (message-generate-headers): Use it. - These changes are copied from Shoe-gnus. - -1998-08-28 Shuhei KOBAYASHI - - * lisp/message.el (message-make-in-reply-to): - Use `std11-extract-address-components'. - (message-use-mail-reply-to): Doc fix. - -1998-08-27 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.8.16. - - * Sync up with Gnus 5.6.41. - -1998-08-26 Katsumi Yamaoka - - * lisp/gnus-spec.el (gnus-parse-simple-format): Use - `gnus-tilde-pad-form' instead of the padding faculty of `format' - under XEmacs-mule. - - * lisp/gnus-xmas.el - (gnus-xmas-redefine): Redifine `gnus-truncate-string', - `gnus-tilde-max-form' and `gnus-tilde-cut-form' for XEmacs-mule. - (gnus-xmas-define): New function 'gnus-tilde-pad-form' for - XEmacs-mule. - -1998-08-26 Shuhei KOBAYASHI - - * lisp/gnus-art.el (gnus-article-narrow-to-signature): - Removed TM stuff. - (gnus-article-display-mime-message): - Set `mime-button-mother-dispatcher' in correct buffer. - (gnus-url-mailto): Use `gnus-setup-message'. - (gnus-button-mailto): Ditto. - (gnus-button-reply): Ditto. - - * lisp/gnus-ems.el (gnus-mule-max-width-function): Removed. - (gnus-truncate-string): Use `truncate-string-to-width' if available. - (gnus-tilde-max-form): New implementation. - (gnus-tilde-cut-form): Ditto. - - * lisp/gnus-msg.el (gnus-summary-mail-digest): New function. - (gnus-summary-post-digest): New function. - - * lisp/gnus-sum.el (gnus-summary-make-menu-bar): Use - `gnus-summary-mail-digest' and `gnus-summary-post-digest' instead - of `gnus-uu-digest-mail-forward' and `gnus-uu-digest-post-forward'. - - * lisp/gnus-util.el (gnus-truncate-string): Ignore more than two - arguments. - - * lisp/message.el (message-forward-end-separator): Use - `text/plain' tag. - -1998-08-25 Tatsuya Ichikawa - - * lisp/gnus-cache.el (gnus-cache-possibly-enter-article): Write - file in raw-text coding system. - (gnus-cache-save-buffers): Ditto. - * lisp/gnus-cache.el (gnus-cache-write-file-coding-system): New variable. - * lisp/gnus-util.el (gnus-write-buffer): Undo change. - - * lisp/gnus-util.el (gnus-write-file-coding-system): Delete variable. - -1998-08-25 Shuhei KOBAYASHI - - * lisp/gnus-msg.el (gnus-bug-message): About Semi-gnus. - (gnus-extended-version): Return gnus version only. - (gnus-bug): Add Semi-gnus developers to recipients. - - * lisp/message.el (message-make-user-agent): New function. - (message-generate-headers): Use it. - -1998-08-24 Tatsuya Ichikawa - - * lisp/gnus-offline.el (gnus-offline-setup): Bug fix and version - changed to 1.53. - - * lisp/gnus-util.el (gnus-write-buffer): Write file in raw-text coding - system. - - * lisp/gnus-util.el (gnus-write-file-coding-system): New variable. - -1998-08-23 Shuhei KOBAYASHI - - * lisp/message.el: Suppress some byte-compile warnings. - (message-make-forward-subject): Failed to sync. - (message-setup): Ditto. - (message-clone-locals): Modify regexp. - - * lisp/message.el (message-fill-references): Reverted. - -1998-08-23 Shuhei KOBAYASHI - - * lisp/gnus-agent.el (gnus-agent-braid-nov): Use - `nnheader-insert-file-contents'. - - * lisp/gnus-i18n.el (gnus-set-summary-default-charset): Sync up - with "akr" branch. - -1998-08-23 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.8.15. - - * Sync up with Gnus 5.6.39. - -1998-08-20 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.8.14. - - * Sync up with Gnus 5.6.38. - - * lisp/gnus-offline.el (gnus-offline-enable-fetch-mail): Enable to get - APOP server. - - * lisp/pop3-fma.el (pop3-fma-movemail): Enable to get from APOP server. - (pop3-fma-set-pop3-password) Enable to get from APOP server. - -1998-08-16 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.8.13. - - * Sync up with Gnus 5.6.37. - - * lisp/gnus-offline.el (gnus-offline-setup) : To create spol directory - if not exists. - Change default value of gnus-offline-drafts-queue-type 'miee to 'agent - -1998-08-16 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.8.12. - - * Sync up with Gnus 5.6.36. - - * lisp/gnus-offline.el : New file. - Merge gnus-offline to ichikawa branch. - -1998-08-15 Yoshiki Hayashi - - * texi/gnus-ja.texi: Update. - -1998-08-14 Katsumi Yamaoka - - * lisp/gnus-start.el (gnus-save-newsrc-file): Bind - `coding-system-for-write' by `gnus-startup-file-coding-system' - while saving the quick newsrc file. - - * lisp/gnus-start.el (gnus-startup-file-coding-system): Change - default value to `ctext'. - -1998-08-13 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.8.11. - - * Sync up with Gnus 5.6.34. - -1998-08-12 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.8.10. - - * Sync up with Gnus 5.6.33. - -1998-08-11 Keiichi Suzuki - - * lisp/message.el (message-frames): New custom group. - (message-original-frame): New variable. - (message-use-multi-frames): New variable. - (message-delete-frame-on-exit): New variable. - (message-send-and-exit): Delete frame which made for editing - message. - (message-kill-buffer): Ditto. - (message-delete-frame): New function. - (message-pop-to-buffer): Make new frame when edit message. - -1998-08-11 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.8.9. - - * Sync up with Gnus 5.6.31. - -1998-08-10 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.8.8. - - * Sync up with Gnus 5.6.30. - -1998-08-10 Shuhei KOBAYASHI - - * lisp/gnus.el (gnus-version-number): Update to 6.8.7. - -1998-08-06 Katsumi Yamaoka - - * lisp/smtp.el: Do not insert empty line at the end of message. - -1998-08-06 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.8.6. - - * Sync up with Gnus 5.6.29. - -1998-08-05 Tatsuya Ichikawa - - * lisp/gnus-start.el (gnus-read-init-file): Fix indent. - * lisp/gnus-ems.el (gnus-tilde-max-form): Redefine instead of - (gnus-summary-line-format-spec) to display Japanese character - correctly in Gnus summaly. - -1998-08-05 Keiichi Suzuki - - * lisp/gnus-start.el (gnus-read-init-file): Don't restrict - `coding-system-for-read' by `binary' when loading `.gnus'. - -1998-08-04 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.8.5. - - * Sync up with Gnus 5.6.28. - -1998-07-27 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.8.4. - - * Sync up with Gnus 5.6.27. - -1998-07-27 Yoshiki Hayashi - - * texi/message-ja.texi: Japanese translation of "message.texi". - -1998-07-26 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.8.3. - - * Sync up with Gnus 5.6.26. - -1998-07-23 Shuhei KOBAYASHI - - * lisp/gnus.el (gnus-version-number): Update to 6.8.2. - (gnus-version): Change to "Semi-gnus". Change comment format. - -1998-07-21 Keisuke Mori - - * texi/gnus-ja.texi: Add "Appendices". - -1998-07-21 Yoshiki Hayashi - - * texi/gnus-ja.texi: Add "Appendices". - -1998-07-16 Shuhei KOBAYASHI - - * lisp/gnus.el (gnus-version-number): Update to 6.8.1. - - * Sync up with Gnus 5.6.24. - -1998-07-10 Keiichi Suzuki - - * lisp/gnus-ems.el (gnus-mule-cite-add-face): Fix problem when multi - bytes charactors are used in cite prefix. (for Emacs 20.1 and 20.2) - (gnus-ems-redefine): for Emacs 20.1 and 20.2 - - * lisp/gnus-cite.el (gnus-cite-add-face): Abolish my last bogus change. - -1998-07-09 Keiichi Suzuki - - * lisp/gnus-cite.el (gnus-cite-add-face): Fix problem when multi - bytes charactors are used in cite prefix. - -1998-07-07 Yoshiki Hayashi - - * texi/gnus-ja.texi: Add "The End". - -1998-07-06 Keisuke Mori - - * texi/gnus-ja.texi: Add "Various". - -1998-07-06 Yoshiki Hayashi - - * texi/gnus-ja.texi: Add "Various". - * texi/gnus-ja.texi: Sync up with Gnus 5.6.22 - -1998-07-02 MORIOKA Tomohiko - - * lisp/message.el (message-header-format-alist): Repair to use - `message-fill-references' for References. - -1998-07-01 MORIOKA Tomohiko - - * lisp/gnus-art.el (gnus-article-header-presentation-method): - Delete nil optional arguments. - - Delete setting for `mime-raw-representation-type-alist'. - -1998-07-01 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to 6.8.0. - (gnus-version): Modify for FLIM 1.8. - - * lisp/gnus-art.el (gnus-article-header-presentation-method): - Modify for FLIM 1.8. - -1998-06-30 Keisuke Mori - - * texi/gnus-ja.texi: Add "Scroing". - -1998-06-30 Yoshiki Hayashi - - * texi/gnus-ja.texi: Add "Scoring". - -1998-06-30 Tatsuya Ichikawa - - * Sync up with Gnus 5.6.22 - * lisp/gnus.el (gnus-version-number): Update to 6.7.8. - * lisp/pop3-fma.el : Enable to get localhost mail spool. - -1998-06-29 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to 6.7.7. - - * lisp/gnus-art.el (gnus-article-prepare): Set up - `gnus-article-current-summary' of gnus-article-buffer. - (gnus-request-article-this-buffer): Don't set up - `gnus-article-current-summary'. - -1998-06-27 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to 6.7.6. - -1998-06-27 MORIOKA Tomohiko - - * lisp/gnus-art.el (gnus-mime-preview-quitting-method): Renamed - from `mime-preview-quitting-method-for-gnus'. - -1998-06-27 MORIOKA Tomohiko - - * lisp/gnus-sum.el (gnus-summary-preview-mime-message): New - implementation. - - * lisp/gnus-art.el (mime-preview-quitting-method-for-gnus): Use - `gnus-article-show-summary' is `gnus-show-mime' is not nil. - -1998-06-27 MORIOKA Tomohiko - - * texi/ChangeLog, texi/gnus.texi, texi/message.texi, - lisp/ChangeLog, lisp/gnus.el, lisp/nngateway.el, lisp/nnfolder.el, - lisp/message.el, lisp/gnus-sum.el, lisp/gnus-soup.el: Sync up with - Gnus 5.6.20. - -1998-06-26 MORIOKA Tomohiko - - * README, texi/ChangeLog, texi/gnus.texi, texi/message.texi, - lisp/ChangeLog, lisp/nnweb.el, lisp/nnmail.el, lisp/nndoc.el, - lisp/message.el, lisp/lpath.el, lisp/gnus.el, lisp/gnus-util.el, - lisp/gnus-topic.el, lisp/gnus-sum.el, lisp/gnus-score.el, - lisp/gnus-group.el, lisp/gnus-ems.el, lisp/gnus-demon.el, - lisp/gnus-art.el: Sync up with Gnus 5.6.16. - -1998-06-26 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to 6.7.3. - - * lisp/gnus-sum.el (gnus-summary-move-article): Use - `gnus-request-article-this-buffer'. - (gnus-request-partial-message): Likewise. - - * lisp/gnus-art.el (gnus-article-prepare): Use - `gnus-request-article-this-buffer'. - (gnus-request-article-this-buffer): Renamed from - `gnus-request-original-article'; abolish conventional - implementation. - - Abolish unused setting for `mime-view-show-summary-method'. - -1998-06-26 MORIOKA Tomohiko - - * readme, texi/ChangeLog, texi/gnus.texi, texi/message.texi, - lisp/ChangeLog, lisp/gnus.el, lisp/nnmail.el, lisp/nnheader.el, - lisp/nngateway.el, lisp/nnfolder.el, lisp/nnagent.el, - lisp/message.el, lisp/gnus-sum.el, lisp/gnus-score.el, - lisp/gnus-salt.el, lisp/gnus-msg.el, lisp/gnus-cus.el, - lisp/gnus-cache.el, lisp/gnus-art.el: Sync up with Gnus 5.6.15. - -1998-06-24 MORIOKA Tomohiko - - * texi/gnus.texi, texi/message.texi, texi/ChangeLog: Sync up with - Gnus 5.6.13. - -1998-06-14 Tatsuya Ichikawa - - * Sync up with Gnus 5.6.13. - -1998-06-24 MORIOKA Tomohiko - - * lisp/gnus-art.el (gnus-article-display-mime-message): Don't - `save-excursion'. - (gnus-article-prepare): Use `mime-fetch-field' instead of - `mime-entity-fetch-field'. - -1998-06-19 MORIOKA Tomohiko - - * lisp/gnus-art.el (gnus-article-display-mime-message): Use - `mime-display-message' instead of `mime-view-buffer'. - (gnus-article-display-traditional-message): Set - `gnus-article-buffer'. - (gnus-article-display-message-with-encoded-word): Modify for - `gnus-article-display-traditional-message'. - (gnus-article-prepare): Use `mime-parse-buffer' and - `mime-entity-fetch-field'; don't set gnus-article-buffer. - -1998-06-19 MORIOKA Tomohiko - - * lisp/gnus-sum.el (gnus-summary-move-article): Use - `gnus-request-original-article' instead of - `gnus-request-article-this-buffer'. - -1998-06-19 MORIOKA Tomohiko - - * texi/gnus-ja.texi, texi/gnus.texi (Using MIME): Modify - description about new display mechanism. - -1998-06-19 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to 6.6.0. - (gnus-version): Modify for this branch. - - * lisp/gnus-art.el (gnus-article-display-method-for-mime): New - variable; abolish `gnus-show-mime-method'. - (gnus-article-display-method-for-encoded-word): New variable; - abolish `gnus-decode-encoded-word-method'. - (gnus-article-display-method-for-traditional): New variable. - (gnus-article-display-mime-message): New function; abolish - `gnus-article-preview-mime-message'. - (gnus-article-display-traditional-message): New function. - (gnus-article-display-message-with-encoded-word): New function; - abolish `gnus-article-decode-encoded-word'. - (gnus-article-prepare): Change display mechanism; use - `gnus-request-original-article' instead of - `gnus-request-article-this-buffer'. - (gnus-request-original-article): New function. - -1998-06-22 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to 6.6.0. - (gnus-version): Modify for SEMI 1.8. - - * lisp/gnus-sum.el: Modify for interface change in SEMI 1.8 about - automatic message/partial combining. - -1998-06-19 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to 6.5.0. - (gnus-version): Modify for SEMI 1.7. - - * lisp/gnus-sum.el: Rename - `mime-method-to-combine-message/partial-pieces' to - `mime-combine-message/partial-pieces-automatically'. - - * lisp/gnus-art.el (gnus-article-preview-mime-message): Use - `mime-view-buffer'. - (gnus-article-decode-encoded-word): Fix DOC-string. - (gnus-article-header-presentation-method): New function; abolish - `gnus-content-header-filter'. - Modify for SEMI 1.7. - -1998-06-18 Keisuke Mori - - * texi/gnus-ja.texi: Add "Select Methods". - -1998-06-18 Yoshiki Hayashi - - * texi/gnus-ja.texi: Add "Select Methods". - -1998-06-17 Tatsuya Ichikawa - - * lisp/pop3-fma.el: Small bug fix. - - * lisp/pop3-fma.el: Delete variable pop3-fma-cypher-key - Use base64-encode-string , base64-decode-string instead. - Both change by Yasuo OKABE - -1998-06-13 Tatsuya Ichikawa - - * lisp/pop3-fma.el: New function pop3-fma-cypher-string - New variable pop3-fma-cypher-key - -1998-06-12 Shuhei KOBAYASHI - - * lisp/message.el (message-required-news-headers): `X-Newsreader' - was replaced by `User-Agent'. - (message-required-mail-headers): `X-Mailer' was replaced by - `User-Agent'. - (message-header-format-alist): `X-Mailer' and `X-Newsreader' were - replaced by `User-Agent'. - (message-generate-headers): Ditto. - - (message-user-agent): New variable. - (message-newsreader): Replaced by `message-user-agent'. - (message-mailer): Ditto. - (message-mode): `message-mailer' and `message-newsreader' were - replaced by `message-user-agent'. - - * lisp/gnus-msg.el (gnus-inews-add-send-actions): `message-mailer' - and `message-newsreader' were replaced by `message-user-agent'. - (gnus-extended-version): Generate "PRODUCT/VERSION" style strings. - - * lisp/gnus-soup.el (gnus-soup-send-packet): `message-mailer' and - `message-newsreader' were replaced by `message-user-agent'. - -1998-06-07 MORIOKA Tomohiko - - * lisp/gnus-art.el: Delete setting for - `article-de-quoted-unreadable' and - `article-mime-decode-quoted-printable' because they have been - already abolished. - -1998-06-07 MORIOKA Tomohiko - - * texi/gnus-ja.texi: Sync up with latest gnus.texi. - - * texi/gnus.texi: Modify for Semi-gnus 6.4.0. - -1998-06-06 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-extract-address-components): Add - `std11-extract-address-components' as a choice. - -1998-06-06 Yoshiki Hayashi - - * texi/gnus-ja.texi: Add "Composing Messages". - -1998-06-04 MORIOKA Tomohiko - - * lisp/gnus-ems.el (gnus-ems-redefine): Must require 'path-util - before call `module-installed-p'. - - * lisp/gnus.el (gnus-version-number): Update to 6.4.0. - (gnus-version): Modify for SEMI 1.5. - - * lisp/gnus-art.el: Modify for SEMI 1.5 API. - -1998-06-04 Tatsuya Ichikawa - - * lisp/pop3-fma.el: New file. To handle multiple POP account. - - * lisp/gnus.el (gnus-version-number): Update to 6.3.4. - And fix typo 5.6.10 -> 5.6.11. - -1998-06-03 Shuhei KOBAYASHI - - * lisp/gnus.el (gnus-version-number): Update to 6.3.3. - - * Sync up with Gnus 5.6.11. - -1998-06-03 Keisuke Mori - - * texi/gnus-ja.texi: Add "The Article Buffer". - -1998-06-03 Yoshiki Hayashi - - * texi/gnus-ja.texi: Add "The Summary Buffer". - -1998-06-02 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.3.2. - - * Sync up with Gnus 5.6.10. - -1998-05-30 Shuhei KOBAYASHI - - * README.semi: Add description of `shuhei-k' branch. - -1998-05-17 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to 6.3.1. - -1998-05-17 MORIOKA Tomohiko - - * lisp/gnus-util.el (gnus-output-to-rmail): Guard as binary. - - * lisp/gnus-util.el (gnus-output-to-mail): Guard as binary. - -1998-04-24 Yoshiki Hayashi - - * texi/gnus-ja.texi: Add "The Active File". - -1998-05-04 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to 6.3.0. - (gnus-version): Modify for SEMI 1.4. - - * lisp/gnus-sum.el: Use 'mime-add-condition to set up - acting-condition. - -1998-05-04 MORIOKA Tomohiko - - * lisp/lpath.el: Must add "flim" instead of "mel" to load-path. - -1998-05-03 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to 6.2.5. - - * texi/gnus.texi, lisp/ChangeLog: Sync up with Gnus v5.6.9. - - * lisp/gnus.el, lisp/message.el, lisp/gnus-sum.el, - lisp/gnus-msg.el, lisp/gnus-draft.el, lisp/gnus-agent.el: Sync up - with Gnus v5.6.9. - -1998-04-30 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to 6.2.4. - - * texi/gnus.texi, lisp/ChangeLog: Sync up with Gnus 5.6.7. - - * lisp/gnus.el, lisp/message.el, lisp/gnus-sum.el, - lisp/gnus-msg.el, lisp/gnus-cache.el, lisp/gnus-art.el: Sync up - with Gnus 5.6.7. - -1998-04-28 Shuhei KOBAYASHI - - * lisp/gnus.el (gnus-version-number): Update to 6.2.3. - - * Sync up with Gnus 5.6.6. - -1998-04-27 MORIOKA Tomohiko - - * lisp/nnheader.el: Sync up with Gnus 5.6.5. - -1998-04-26 Shuhei KOBAYASHI - - * lisp/gnus.el (gnus-version-number): Update to 6.2.2. - - * Sync up with Gnus 5.6.5. - - * texi/custom.texi, texi/widget.texi: Removed from Semi-gnus. - -1998-04-25 MORIOKA Tomohiko - - * README.semi (How to get? (via CVS)): Modify descriptions about - TAG. - -1998-04-23 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to 6.2.1. - -1998-04-23 MORIOKA Tomohiko - - * lisp/message.el (message-make-forward-subject): Use - `eword-decode-unstructured-field-body' for subject. - - * lisp/gnus-msg.el (gnus-summary-mail-forward): Make local - variable `default-mime-charset' of `gnus-original-article-buffer' - and set up by `default-mime-charset' of `gnus-summary-buffer'. - -1998-04-23 MORIOKA Tomohiko - - * texi/gnus-ja.texi: Fix typos. - - * texi/gnus.texi: Modify for Semi-gnus. - -1998-04-23 Yoshiki Hayashi - - * texi/gnus-ja.texi: Add "Auto Save". - -1998-04-22 Yoshiki Hayashi - - * texi/gnus-ja.texi: Add "Startup Files". - -1998-04-21 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to 6.2.0. - (gnus-version): Modify for SEMI 1.3. - - * lisp/gnus-sum.el: Use 'ctree-set-calist-strictly instead of - 'set-atype to set up for 'mime-acting-condition. - -1998-04-21 Yoshiki Hayashi - - * texi/gnus-ja.texi: Add "Changing Servers". - -1998-04-20 MORIOKA Tomohiko - - * texi/gnus-ja.texi: Modify styles. - - * texi/gnus.texi: Modify for Semi-gnus (sync up with - gnus-ja.texi). - -1998-04-20 Yoshiki Hayashi - - * texi/gnus-ja.texi: Add "New Groups". - -1998-04-20 Yoshiki Hayashi - - * texi/gnus-ja.texi: Modify styles. - -1998-04-18 MORIOKA Tomohiko - - * texi/gnus-ja.texi: Check and modify for Semi-gnus. - -1998-04-18 Yoshiki Hayashi - - * texi/gnus-ja.texi: New file. - -1998-04-19 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to 6.1.3. - -1998-04-19 MORIOKA Tomohiko - - * lisp/gnus-art.el (gnus-following-method): New function; set up - for 'mime-view-following-method-alist. - -1998-04-18 MORIOKA Tomohiko - - * texi/gnus.texi: Add and modify description for Semi-gnus. - -1998-04-16 MORIOKA Tomohiko - - * texi/gnus.texi: "Gnus 5.6.4" -> "Semi-gnus 6.1.2". - (Top): "Gnus" -> "gnus". - (Starting Up): "Gnus" -> "gnus". - -1998-04-10 Shuhei KOBAYASHI - - * lisp/ChangeLog, lisp/gnus-agent.el: Sync up with Gnus 5.6.4. - -1998-04-08 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to 6.1.2. - (gnus-version): Include corresponding SEMI version. - - * lisp/gnus.el, lisp/nnkiboze.el, lisp/message.el, - lisp/gnus-sum.el, lisp/gnus-agent.el: Sync up with Gnus 5.6.4. - -1998-03-27 Shuhei KOBAYASHI - - * README.semi: Change descriptions of sending bug report. - -1998-03-20 Shuhei KOBAYASHI - - * lisp/gnus.el (gnus-version-number): Update to 6.1.1. - (gnus-version): Include corresponding SEMI version. - - * Sync up with Gnus 5.6.3. - -1998-03-15 Shuhei KOBAYASHI - - * lisp/gnus-agent.el (gnus-agent-crosspost): Use - `nnheader-insert-file-contents'. - (gnus-agent-braid-nov): Ditto. - (gnus-agent-expire): Ditto. - - * lisp/gnus-cache.el (gnus-cache-request-article): Ditto. - (gnus-cache-retrieve-headers): Ditto. - (gnus-cache-change-buffer): Ditto. - (gnus-cache-braid-nov): Ditto. - - * lisp/gnus-sum.el (gnus-summary-import-article): Ditto. - - * lisp/nnkiboze.el (nnkiboze-retrieve-headers): Ditto. - - * lisp/message.el (message-generate-headers): Fix regexp. - (cf. [semi-gnus-ja:107]) - -1998-03-14 MORIOKA Tomohiko - - * lisp/gnus-art.el: Add setting for - `mime-raw-buffer-coding-system-alist'. - -1998-03-13 MORIOKA Tomohiko - - * lisp/gnus-art.el: Rename `mime-view-quitting-method-for-gnus' -> - `mime-preview-quitting-method-for-gnus'. - - * lisp/gnus-art.el: Rename `mime-view-quitting-method-alist' -> - `mime-preview-quitting-method-alist'. - - * lisp/gnus-art.el: Rename `mime-view-kill-buffer' -> - `mime-preview-kill-buffer'. - - * lisp/gnus.el (gnus-version-number): Update to 6.0.10. - - * lisp/gnus-sum.el: Add code to check latest SEMI. - (mime-acting-condition): Separate type and subtype; rename - `mime-combine-message/partials-automatically' -> - `mime-method-to-combine-message/partial-pieces'. - -1998-03-08 Shuhei KOBAYASHI - - * lisp/gnus.el (gnus-version-number): Update to 6.0.9. - - * README.semi (How to get?): Add description of daily snapshot. - (How to join development): Change mailing list command address. - - * Sync up with Gnus 5.6.2. - -1998-03-01 Tatsuya Ichikawa - - * lisp/gnus-ems.el: Change variable name - gnus-bdf-image-file to gnus-mule-bitmap-image-file. - -1998-02-28 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to 6.0.8. - - * lisp/gnus.el: Sync up with qgnus-0.34. - -1998-02-28 MORIOKA Tomohiko - - * lisp/message.el: Sync up with qgnus-0.33. - - * lisp/gnus-ems.el (gnus-bdf-image-file): New variable; moved from - gnus.el. - (gnus-mule-group-startup-message): New function; moved and renamed - from `gnus-group-startup-message' of gnus.el. - - * lisp/gnus.el, lisp/gnus-sum.el, lisp/gnus-art.el, - lisp/gnus-agent.el: Sync up with qgnus-0.33. - -1998-02-28 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-bdf-image-file): New variable. - (gnus-mule-group-startup-message): Display bitmap image using - bitmap.el running with Emacs 20. - - * lisp/gnus-agent.el (gnus-agent-fetch-headers): Fix problem when - Xref field is not exist. - -1998-02-26 MORIOKA Tomohiko - - * README.semi (How to join development): Modify for Semi-gnus - mailing list. - - * lisp/gnus.el (gnus-version-number): Update to 6.0.7. - - * lisp/gnus.el (gnus-article-display-hook): Delete - `gnus-article-de-quoted-unreadable' from options. - - * lisp/gnus-sum.el (gnus-article-make-menu-bar): Delete key for - `gnus-article-de-quoted-unreadable'. - (gnus-summary-make-menu-bar): Delete menu for - `gnus-article-de-quoted-unreadable'. - - * lisp/gnus-art.el (gnus-article-make-menu-bar): Delete menu for - `gnus-article-de-quoted-unreadable'. - -1998-02-24 MORIOKA Tomohiko - - * lisp/gnus.el, lisp/message.el: Sync up with qgnus-0.32. - -1998-02-23 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to 6.0.6. - - * lisp/message.el (message-fill-references): Abolish unused local - variables. - - * lisp/pop3.el, lisp/message.el, lisp/gnus.el, lisp/gnus-sum.el, - lisp/gnus-art.el: Sync up with qgnus-0.31. - - * lisp/gnus.el, lisp/message.el, lisp/gnus-sum.el, - lisp/gnus-art.el: Sync up with qgnus-0.30. - -1998-02-20 Christophe Broult - - * README.semi (How to get?): The command `update' must come before - `-r semi-gnus'. (cf. [tm-en:1559]) - -1998-02-17 MORIOKA Tomohiko - - * lisp/gnus.el: Sync up with qgnus-0.29. - - * lisp/gnus.el, lisp/message.el: Sync up with qgnus-0.28. - - * lisp/message.el: Abolish variable - `message-references-generator'. Abolish function - `message-generate-filled-references', - `message-generate-folded-references' and - `message-generate-unfolded-references'. - (message-reply): Don't use `message-references-generator'. - (message-followup): Don't use `message-references-generator'. - - (message-fill-references): New function. - (message-header-format-alist): Use `message-fill-references' for - References. - -1998-02-17 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to 6.0.5. - -1998-02-17 MORIOKA Tomohiko - - * lisp/gnus-sum.el: Check SEMI-0.118.2 (Otomaru) or later. - (gnus-structured-field-decoder): Use - `eword-decode-and-unfold-structured-field'. - - * lisp/gnus-art.el (gnus-article-decode-rfc1522): Use charset - conversion option of `eword-decode-header'. - (gnus-article-decode-encoded-word): Use charset conversion option - of `eword-decode-header'; use `gnus-run-hooks'. - (gnus-content-header-filter): Use charset conversion option of - `eword-decode-header'. - - * README.semi (How to get?): Should specify "-r semi-gnus". - -1998-02-16 MORIOKA Tomohiko - - * lisp/gnus-art.el (gnus-article-decode-rfc1522): Decode header by - localized code. - -1998-02-16 MORIOKA Tomohiko - - * lisp/gnus-msg.el: Delete commented-out function - `gnus-inews-insert-mime-headers'. - - * lisp/gnus.el, lisp/message.el, lisp/gnus-sum.el, - lisp/gnus-art.el: Sync up with qgnus-0.27. - -1998-02-16 MORIOKA Tomohiko - - * lisp/nnheader.el: Use original. - - * lisp/gnus.el, lisp/pop3.el, lisp/message.el, lisp/gnus-sum.el, - lisp/gnus-msg.el, lisp/gnus-draft.el, lisp/gnus-art.el: Sync up - with qgnus-0.26. - -1998-02-15 MORIOKA Tomohiko - - * lisp/nnmail.el, lisp/nnmh.el: Use original. - - * lisp/gnus.el, lisp/gnus-draft.el, lisp/gnus-sum.el, - lisp/message.el, lisp/gnus-art.el: Sync up with qgnus-0.25. - -1998-02-11 Shuhei Kobayashi - - * texi/message.texi, texi/gnus.texi, texi/ChangeLog, - lisp/message.el, lisp/gnus.el, lisp/gnus-uu.el, - lisp/gnus-topic.el, lisp/gnus-sum.el, lisp/gnus-start.el, - lisp/gnus-score.el, lisp/gnus-group.el, lisp/gnus-art.el, - lisp/gnus-agent.el, lisp/ChangeLog: Importing qgnus-0.24 - -1998-02-10 MORIOKA Tomohiko - - * lisp/gnus-art.el (gnus-article-prepare): Don't bind coding - systems. - - * lisp/gnus.el (gnus-version-number): Update to 6.0.4. - (gnus-version): Sync with qgnus-0.23. - - * lisp/pop3.el, lisp/nnmh.el, lisp/nnheader.el, lisp/message.el, - lisp/gnus-sum.el, lisp/gnus-msg.el, lisp/gnus-draft.el, - lisp/gnus-art.el: Merge qgnus-0.23. - -1998-02-09 Shuhei Kobayashi - - * texi/message.texi, texi/gnus.texi, texi/ChangeLog, lisp/nntp.el, - lisp/nnheader.el, lisp/message.el, lisp/gnus.el, - lisp/gnus-xmas.el, lisp/gnus-sum.el, lisp/gnus-start.el, - lisp/gnus-msg.el, lisp/gnus-group.el, lisp/gnus-draft.el, - lisp/gnus-art.el, lisp/gnus-agent.el, lisp/ChangeLog: Importing - qgnus-0.23 - -1998-02-04 MORIOKA Tomohiko - - * lisp/message.el (message-references-generator): New variable. - (message-generate-filled-references): New function. - (message-generate-folded-references): New function. - (message-generate-unfolded-references): New function. - (message-reply): Refer `message-references-generator'. - (message-followup): Refer `message-references-generator'. - -1998-01-17 MORIOKA Tomohiko - - * lisp/message.el (message-send-mail-with-sendmail): Guard - `coding-system-for-write' by binary. - (message-send-mail-with-qmail): Likewise. - -1998-01-16 MORIOKA Tomohiko - - * lisp/lpath.el: Require path-util; add load-path of APEL, MEL and - SEMI. - -1998-01-12 MORIOKA Tomohiko - - * lisp/message.el: Require smtp.el when compile. - - * lisp/message.el (message-send-mail-with-smtp): Use - `(current-buffer)' instead of `tembuf'; rename - `smtp-recipient-address-list' -> `recipient-address-list'. - -1998-01-12 MORIOKA Tomohiko - - * lisp/smtp.el (smtp-deduce-address-list): Don't use - `smtp-recipient-address-list' as global variable. - - * lisp/message.el (message-send-mail-with-smtp): Don't use - `smtp-recipient-address-list' as global variable. - - * lisp/smtpmail.el (smtpmail-recipient-address-list): New - variable; renamed from `smtp-recipient-address-list'. - (smtpmail-send-it): Remove `(not (null ...))'. - (smtpmail-send-queued-mail): Likewise. - -1998-01-12 MORIOKA Tomohiko - - * lisp/message.el (message-send-mail-with-smtp): Don't generate - temporary buffer for message; don't generate and kill - `smtp-address-buffer' for `smtp-deduce-address-list'. - - * lisp/smtpmail.el (smtpmail-send-it): Don't generate and kill - `smtp-address-buffer' for `smtp-deduce-address-list'. - - * lisp/smtp.el (smtp-deduce-address-list): Bind and generate - `smtp-address-buffer' in itself. - -1998-01-12 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to version 6.0.3. - -1998-01-11 MORIOKA Tomohiko - - * lisp/smtp.el: New file. - - * lisp/smtpmail.el: Split basic features into smtp.el. - - * lisp/message.el (message-send-mail-function): Add - `message-send-mail-with-smtp' as an item. - (message-send-mail-with-smtp): New function. - - * ChangeLog: New file. - -1998-01-08 MORIOKA Tomohiko - - * lisp/smtpmail.el (smtpmail-via-smtp): Bind - `coding-system-for-read' by `smtpmail-coding-system' to avoid - dead-locking in Emacs 20. - - * lisp/gnus.el: gnus.el (gnus-version-number): Update to version - 6.0.2. - -1998-01-07 MORIOKA Tomohiko - - * lisp/nnmail.el, lisp/message.el: Sync with Quassia Gnus v0.22. - - * lisp/gnus.el: Delete autoload setting for `metamail-buffer'. - - * lisp/gnus.el, lisp/gnus-sum.el: Sync with Quassia Gnus v0.22. - - * lisp/gnus-msg.el: Abolish function - `gnus-inews-insert-mime-headers'. - - * lisp/gnus-msg.el, lisp/gnus-draft.el, lisp/gnus-art.el: Sync - with Quassia Gnus v0.22. - - * lisp/smtpmail.el (smtpmail-coding-system): New variable; abolish - `smtpmail-code-conv-from'. - (smtpmail-via-smtp): Guard `coding-system-for-write' by - `smtpmail-coding-system'. - - * lisp/smtpmail.el: Imported from Emacs 20.2. - - * lisp/pop3.el (pop3-movemail-file-coding-system): Change default - value to `binary'. - (pop3-open-server): Guard `coding-system-for-read' by `binary'. - -1998-01-06 Shuhei Kobayashi - - * texi/message.texi, texi/gnus.texi, texi/ChangeLog, lisp/nnoo.el, - lisp/nnml.el, lisp/message.el, lisp/gnus.el, lisp/gnus-sum.el, - lisp/gnus-start.el, lisp/gnus-ems.el, lisp/gnus-draft.el, - lisp/gnus-agent.el, lisp/ChangeLog: Importing qgnus-0.22 - - * texi/message.texi, texi/gnus.texi, lisp/gnus.el, lisp/ChangeLog: - Importing qgnus-0.21 - - * texi/message.texi, texi/gnus.texi, texi/ChangeLog, - lisp/nnvirtual.el, lisp/nnsoup.el, lisp/nnoo.el, lisp/nnmh.el, - lisp/nnmail.el, lisp/nndraft.el, lisp/gnus.el, lisp/gnus-xmas.el, - lisp/gnus-sum.el, lisp/gnus-start.el, lisp/gnus-score.el, - lisp/gnus-msg.el, lisp/gnus-group.el, lisp/gnus-draft.el, - lisp/gnus-art.el, lisp/ChangeLog: Importing qgnus-0.20 - - * texi/message.texi, texi/gnus.texi, texi/ChangeLog, lisp/pop3.el, - lisp/nntp.el, lisp/nnml.el, lisp/nnmail.el, lisp/nndoc.el, - lisp/message.el, lisp/gnus.el, lisp/gnus-uu.el, - lisp/gnus-topic.el, lisp/gnus-sum.el, lisp/gnus-start.el, - lisp/gnus-score.el, lisp/gnus-group.el, lisp/gnus-cache.el, - lisp/gnus-agent.el, lisp/ChangeLog: Importing qgnus-0.19 - -1997-12-27 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to version 6.0.1. - - * lisp/message.el (message-resend): Enclose `message-setup' with - `(let (message-setup-hook) ...)' to avoid to `turn-on-mime-edit'; - must setup `message-encoding-buffer' and `message-edit-buffer' for - `message-send-mail'. - -1997-12-08 Shuhei Kobayashi - - * lisp/pop3.el, lisp/message.el, lisp/gnus.el, lisp/gnus-sum.el, - lisp/gnus-art.el, lisp/ChangeLog: Synch'ed up to qgnus-0.18. - - * texi/message.texi, texi/gnus.texi, texi/ChangeLog, - lisp/smiley.el, lisp/pop3.el, lisp/nnweb.el, lisp/nntp.el, - lisp/nnml.el, lisp/nnmail.el, lisp/nnheader.el, lisp/nndraft.el, - lisp/message.el, lisp/lpath.el, lisp/gnus.el, lisp/gnus-util.el, - lisp/gnus-sum.el, lisp/gnus-start.el, lisp/gnus-picon.el, - lisp/gnus-nocem.el, lisp/gnus-mh.el, lisp/gnus-group.el, - lisp/gnus-ems.el, lisp/gnus-cite.el, lisp/gnus-art.el, - lisp/gnus-agent.el, lisp/dgnushack.el, lisp/ChangeLog: Importing - qgnus-0.18 - -1997-11-29 MORIOKA Tomohiko - - * README.semi: New file. - - * lisp/gnus.el (gnus-version): Rename to "Semi-gnus". - -1997-11-28 MORIOKA Tomohiko - - * lisp/gnus-draft.el (gnus-draft-decoding-function): New variable. - (gnus-draft-setup): Use `gnus-draft-decoding-function'. - -1997-11-27 MORIOKA Tomohiko - - * lisp/nnmail.el, lisp/nnheader.el, lisp/message.el, lisp/gnus.el, - lisp/gnus-sum.el, lisp/gnus-msg.el, lisp/gnus-art.el: sync with - qgnus-0.17. - - * texi/message.texi, texi/gnus.texi, lisp/smiley.el, lisp/nnoo.el, - lisp/nnml.el, lisp/nnmail.el, lisp/nnheader.el, - lisp/messagexmas.el, lisp/message.el, lisp/gnus.el, - lisp/gnus-xmas.el, lisp/gnus-util.el, lisp/gnus-sum.el, - lisp/gnus-start.el, lisp/gnus-spec.el, lisp/gnus-score.el, - lisp/gnus-picon.el, lisp/gnus-move.el, lisp/gnus-msg.el, - lisp/gnus-kill.el, lisp/gnus-group.el, lisp/gnus-draft.el, - lisp/gnus-demon.el, lisp/gnus-cite.el, lisp/gnus-art.el, - lisp/ChangeLog: Quassia Gnus v0.17. - - * lisp/gnus-i18n.el: New file. - - * lisp/nnmail.el (nnmail-file-coding-system): Use `raw-text' in - default. - - * lisp/nnheader.el (nnheader-file-coding-system): Use `raw-text' - in default. - - * lisp/message.el (message-encode-function): New variable. - (message-forward-start-separator): Modify for mime-edit. - (message-forward-end-separator): Modify for mime-edit. - (message-setup-hook): Use `(message-maybe-setup-default-charset - turn-on-mime-edit)' in default. - (message-header-hook): Use `(eword-encode-header)' in default. - - (message-send): Use local variable `message-encoding-buffer', - `message-edit-buffer' and `message-mime-mode' as public variables; - use `message-encode-function'. - (message-send-mail): Use `message-encoding-buffer' to get contents - of body; abolish `message-encode-mail-hook'; use - `mime-edit-maybe-split-and-send'; use `message-edit-buffer' to - refer original editing buffer. - (message-send-news): Use `message-encoding-buffer' to get contents - of body; abolish `message-encode-news-hook'; use - `mime-edit-maybe-split-and-send'; use `message-edit-buffer' to - refer original editing buffer. - (message-check-news-syntax): Call `message-check-news-body-syntax' - in `mime-edit-buffer'. - (message-do-fcc): Use `message-encoding-buffer' to get contents; - run `message-header-hook'. - (message-cancel-news): Use `std11-extract-address-components' - instead of `mail-extract-address-components'; bind - `message-encoding-buffer' and `message-edit-buffer'. - - (message-maybe-setup-default-charset): New function. - (message-maybe-encode): New function. - (message-mime-insert-article): New function. - Add setting for mime-view. - - * lisp/gnus.el (gnus-version-number): for version number for Open - gnus. - (gnus-version): Modify for Open gnus. - - * lisp/gnus-sum.el: Autoload gnus-i18n. - - (gnus-show-mime): `t' in default. - (gnus-structured-field-decoder): Use - `eword-decode-structured-field-body' in default. - (gnus-unstructured-field-decoder): Use - `eword-decode-unstructured-field-body' in default. - - (gnus-parse-headers-hook): Use - `(gnus-set-summary-default-charset)' in default. - - (gnus-summary-mode-map): Add binding for - `gnus-summary-scroll-down' and - `gnus-summary-preview-mime-message'. - - (gnus-summary-preview-mime-message): New function. - (gnus-mime-partial-preview-function): New function. - Add setting for mime-view. - - * lisp/gnus-msg.el (gnus-summary-cancel-article): Display - `gnus-article-buffer' instead ofb `gnus-original-article-buffer'. - (gnus-extended-version): Don't return version of emacsen. - (gnus-inews-do-gcc): Refer `message-encoding-buffer'. - - * lisp/gnus-art.el (gnus-show-mime-method): Use - `gnus-article-preview-mime-message' instead of `metamail-buffer' - in default. - (gnus-decode-encoded-word-method): Use - `gnus-article-decode-encoded-word' instead of - `gnus-article-de-quoted-unreadable' in default. - - Abolish `gnus-hack-decode-rfc1522', `gnus-decode-rfc1522', - `article-decode-rfc1522', `article-de-quoted-unreadable', - `article-mime-decode-quoted-printable-buffer' and - `article-mime-decode-quoted-printable'. - (gnus-article-decode-rfc1522): New implementation (use - `eword-decode-header'). - - (gnus-article-preview-mime-message): New function. - (gnus-article-decode-encoded-word): New function. - (gnus-content-header-filter): New function. - (mime-view-quitting-method-for-gnus): New function. - Add setting for mime-view. - - * lisp/message.el: Abolish `message-max-size' because it is not - used. - - * lisp/message.el: sync with qgnus-0.16. - - * texi/Makefile, texi/message.texi, texi/gnus.texi, lisp/nnweb.el, - lisp/nnmh.el, lisp/nnheader.el, lisp/nnfolder.el, lisp/message.el, - lisp/gnus.el, lisp/gnus-xmas.el, lisp/gnus-uu.el, - lisp/gnus-sum.el, lisp/gnus-srvr.el, lisp/gnus-picon.el, - lisp/gnus-group.el, lisp/gnus-cite.el, lisp/gnus-art.el: Quassia - Gnus v0.16. - - * lisp/nnmh.el (nnmh-request-list-1): fix maybe. - - * lisp/message.el (message-do-fcc): Guard - `coding-system-for-write' by `raw-text'; run - `message-before-do-fcc-hook'. - - * lisp/gnus-msg.el (gnus-inews-do-gcc): Guard - `coding-system-for-write' by `raw-text'; run - `gnus-before-do-gcc-hook'. - - * texi/message.texi, texi/gnus.texi, texi/ChangeLog, lisp/nntp.el, - lisp/nnoo.el, lisp/nnml.el, lisp/nndraft.el, lisp/nnbabyl.el, - lisp/message.el, lisp/gnus.el, lisp/gnus-xmas.el, lisp/gnus-uu.el, - lisp/gnus-util.el, lisp/gnus-sum.el, lisp/gnus-start.el, - lisp/gnus-spec.el, lisp/gnus-soup.el, lisp/gnus-score.el, - lisp/gnus-msg.el, lisp/gnus-gl.el, lisp/gnus-ems.el, - lisp/gnus-draft.el, lisp/gnus-cache.el, lisp/gnus-audio.el, - lisp/gnus-art.el, lisp/gnus-agent.el, lisp/ChangeLog: Quassia Gnus - v0.15. - - * lisp/message.el, lisp/ChangeLog: sync with qgnus-0.14. - - * texi/Makefile, texi/gnus.texi: Quassia Gnus v0.14. - - * texi/dir: New file. - - * texi/dir, lisp/pop3.el, lisp/nntp.el, lisp/nnml.el, - lisp/nnmail.el, lisp/nnfolder.el, lisp/message.el, lisp/lpath.el, - lisp/gnus.el, lisp/gnus-win.el, lisp/gnus-util.el, - lisp/gnus-topic.el, lisp/gnus-sum.el, lisp/gnus-start.el, - lisp/gnus-score.el, lisp/gnus-msg.el, lisp/gnus-mh.el, - lisp/gnus-cus.el, lisp/gnus-art.el, lisp/gnus-agent.el, - lisp/ChangeLog: Quassia Gnus v0.14. - - * lisp/message.el, lisp/ChangeLog: sync with qgnus-0.13. - - * texi/gnus.texi, texi/ChangeLog, lisp/pop3.el, lisp/nnweb.el, - lisp/nnmail.el: Quassia Gnus v0.13. - - * lisp/nnlistserv.el: New file. - - * lisp/nnlistserv.el, lisp/message.el, lisp/md5.el, lisp/lpath.el, - lisp/gnus.el, lisp/gnus-topic.el, lisp/gnus-sum.el, - lisp/gnus-score.el, lisp/gnus-picon.el, lisp/gnus-msg.el, - lisp/gnus-group.el, lisp/gnus-art.el, lisp/gnus-agent.el, - lisp/dgnushack.el, lisp/ChangeLog, GNUS-NEWS: Quassia Gnus v0.13. - - * lisp/message.el: sync with qgnus-0.12. - - * texi/message.texi, texi/gnus.texi, texi/gnus-faq.texi, - texi/ChangeLog, lisp/nntp.el, lisp/nnmh.el, lisp/nnmail.el, - lisp/nndraft.el, lisp/messcompat.el, lisp/message.el, - lisp/gnus.el, lisp/gnus-xmas.el, lisp/gnus-uu.el, - lisp/gnus-sum.el, lisp/gnus-score.el, lisp/gnus-salt.el, - lisp/gnus-msg.el, lisp/gnus-int.el, lisp/gnus-group.el, - lisp/gnus-demon.el, lisp/gnus-cache.el, lisp/gnus-art.el, - lisp/gnus-agent.el, lisp/ChangeLog, GNUS-NEWS: Quassia Gnus v0.12. - - * lisp/message.el (message-send-news-function): Use - `message-send-news-with-gnus' in default. - (message-send-via-news): Use `message-send-news' instead of - `message-send-news-function'. - (message-send-mail): Don't avoid text properties; run - `message-encode-mail-hook'. - (message-send-news): Don't avoid text properties; run - `message-encode-news-hook'; use `message-send-news-function'. - (message-send-news-with-gnus): New function. - (message-cancel-news): Use `message-send-news' instead of - `message-send-news-function'. diff --git a/ChangeLog.2 b/ChangeLog.2 deleted file mode 100644 index 616c7b3..0000000 --- a/ChangeLog.2 +++ /dev/null @@ -1,620 +0,0 @@ -1999-08-03 NAKAJI Hiroyuki - - * Makefile.in (clean): Exec make clean in both lisp and texi - subdirectories. - (distclean): Use $(MAKE), not `make'. - -1999-08-03 Katsumi Yamaoka - - * message.el (TopLevel): Autoload "mu-cite" for the function - `mu-cite-original' instead of the function `mu-cite/cite-original'. - (message-cite-function): Replace `mu-cite/cite-original' with - `mu-cite-original'. - -1999-08-02 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 06. - - * lisp/Makefile.in (distclean): Remove dgnuspath.el instead of - paths.el. - (install): Don't install dgnuspath.el; don't touch the installed - files. - -1999-08-01 YAMAMOTO Kouji - - * lisp/nnmail.el (nnmail-split-it): Don't compare ".*" and VALUE - of each element of `nnmail-split-fancy' if the length of VALUE is - less than 2. - -1999-07-30 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 05. - -1999-07-30 NAKAJI Hiroyuki - - * lisp/Makefile.in (install): install *.el files too. - to avoid warning about el is newer than elc, exec touch - $(lispdir)/*.elc. - -1999-07-29 Yoshiki Hayashi - - * texi/gnus-ja.texi: Sync up with pGnus 0.95. - -1999-07-28 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 04. - - * lisp/gnus-cite.el (gnus-ems-redefine): Don't replace the function - `gnus-cite-add-face' with `gnus-mule-cite-add-face' because the - former will work well under old Emacsen by now. - (gnus-mule-cite-add-face): Abolish function. - -1999-07-27 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 03. - - * texi/Makefile.in (prefix): Define it first. - - * lisp/dgnuspath.el.in: Rename from paths.el. - - * lisp/dgnushack.el (dgnushack-install-package): Don't install - dgnuspath.el nor dgnuspath.elc. - (dgnushack-make-package): Don't enter dgnuspath.el nor - dgnuspath.elc to MANIFEST file. - (dgnushack-compile): Don't compile dgnuspath.el. - (TopLevel): Use `expand-file-name' for the file "./dgnuspath.el"; - use dgnuspath.el instead of paths.el. - - * lisp/Makefile.in (PACKAGEDIR): Default to @PACKAGEDIR@. - - * configure.in (AC_OUTPUT): Use dgnuspath.el instead of paths.el. - (TopLevel): Add options `--with-xemacs' and `--with-packagedir'. - (ADDITIONAL_LOAD_PATH): Default to empty string. - - * configure: Regenerate. - - * README.T-gnus: Update for the new features. - - * Makefile.in (PACKAGEDIR): Default to @PACKAGEDIR@. - (XEMACS): Default to @XEMACS@. - -1999-07-26 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 02. - - * lisp/dgnushack.el: Load ./paths.el. - - * lisp/paths.el.in: New file. - - * lisp/Makefile.in (distclean): Remove paths.el. - - * Mule23@1934: Update for the new configure usage. - - * configure: Regenerate. - -1999-07-22 TSUCHIYA Masatoshi - - * configure.in: Add an option `--with-addpath' to specify load-path. - - * aclocal.m4: New implementation. - - * acinclude.m4: New file. - -1999-07-20 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - - * lisp/gnus-ofsetup.el (gnus-ofsetup-prepare-for-miee, - gnus-ofsetup-write-setting-file): New functions. - (gnus-setup-for-offline): Use them. - (gnus-ofsetup-parameters, gnus-ofsetup-customize, - gnus-ofsetup-customize-done): New functions for customization - support. - - * lisp/gnus-offline.el (gnus-offline-version-number): Update to - 2.20. - (gnus-offline-define-menu-on-miee, - gnus-offline-define-menu-on-agent): Add a menu item which calls - `gnus-ofsetup-customize'. - -1999-07-11 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.11.08. - (gnus-revision-number): Fresh start from 00. - - * texi/{gnus.texi,gnus-ja.texi,ChangeLog}: Update for T-gnus - 6.11.08. - - * lisp{pop3.el,nnmh.el,nnfolder.el,mm-util.el,mm-encode.el, - mm-decode.el,message.el,mail-source.el,gnus-util.el,gnus-topic.el, - gnus-sum.el,gnus-mlspl.el,gnus-mailcap.el,gnus-group.el, - gnus-cus.el,gnus-art.el,ChangeLog}: Sync up with Pterodactyl Gnus - v0.95. - - * README.T-gnus: Update for T-gnus 6.11.08. - -1999-07-08 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - - * lisp/nnheader.el (make-full-mail-header-from-decoded-header): Add - `extra' as a luna-class. - (make-full-mail-header): Ditto. - (nnheader-decode-field-body): Redefine as a regular function. - (mail-header-set-extra): Alias to - `mime-gnus-entity-set-extra-internal'. - (mail-header-extra): Alias to `mime-gnus-entity-extra-internal'. - - * lisp/mmgnus.el (TopLevel): Add definition of `extra' as a - luna-class. - - * lisp/gnus-sum.el (gnus-summary-from-or-to-or-newsgroups): Bind - the value of `default-mime-charset' to its local value in - `gnus-summary-buffer'; don't bind `mail-parse-charset' and - `mail-parse-ignored-charsets'. - (gnus-decode-encoded-word-function): New variable. - -1999-07-07 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.11.07. - - * texi/{gnus.texi,gnus-ja.texi,ChangeLog}: Sync up with Pterodactyl - Gnus v0.93. - - * lisp/{pop3.el,nnmail.el,mml.el,mm-view.el,mm-uu.el,mm-util.el, - mm-decode.el,message.el,gnus-util.el,gnus-sum.el,gnus-start.el, - gnus-srvr.el,gnus-score.el,gnus-mlspl.el,gnus-art.el,gnus-agent.el, - ChangeLog}: Sync up with Pterodactyl Gnus v0.93. - - * README.T-gnus: Update for T-gnus 6.11.07. - -1999-07-06 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.11.06. - (gnus-revision-number): Fresh start from 00. - - * texi/{gnus-ja.texi,gnus.texi,emacs-mime.texi,ChangeLog}: Sync up - with Pterodactyl Gnus v0.92. - - * lisp/gnus-mlspl.el: New file copied from Pterodactyl Gnus v0.92. - - * lisp/{nntp.el,nnmail.el,nnfolder.el,nndraft.el,nndoc.el,mml.el, - mm-view.el,mm-util.el,mm-decode.el,message.el,gnus-xmas.el, - gnus-util.el,gnus-sum.el,gnus-start.el,gnus-mailcap.el, - gnus-group.el,gnus-art.el,gnus-agent.el,Makefile.in,ChangeLog}: - Sync up with Pterodactyl Gnus v0.92. - - * README.T-gnus: Update for T-gnus 6.11.06. - -1999-07-06 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - - * lisp/gnus-util.el (gnus-point-at-eol, gnus-point-at-bol): Use - `static-cond'. NOTE: It requires APEL 9.20 or later. - -1999-07-05 Tsukamoto Tetsuo - - * lisp/gnus-agent.el (gnus-agent-expire): Refresh the value of - `gnus-active-hashtb' for each method. - -1999-07-05 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.11.05. - (gnus-revision-number): Fresh start from 00. - - * texi/gnus-ja.texi (Mail in a Newsreader): Translate into Japanese. - - * README.T-gnus: Update for T-gnus 6.11.05. - - * lisp/nnmbox.el (nnmbox-save-buffer): Bind `output-coding-system' - instead of `coding-system-for-write' Under Mule 2. - - * lisp/nnmbox.el (nnmbox-active-file-coding-system, - nnmbox-file-coding-system): Default to `raw-text-dos' or 'raw-text'. - * lisp/nnfolder.el (nnfolder-file-coding-system, - nnfolder-active-file-coding-system): Ditto. - - * lisp/mm-view.el (TopLevel): Don't bind vars `w3-meta-*'. - - * lisp/gnus-util.el (gnus-write-active-file): Abolish function. - (gnus-write-active-file-as-coding-system): New function. - - * lisp/gnus-cache.el (gnus-cache-write-active): Use - `gnus-write-active-file-as-coding-system' instead of - `gnus-write-active-file'. - * lisp/gnus-agent.el (gnus-agent-expire, gnus-agent-write-active): - Ditto. - - * lisp/gnus-agent.el (gnus-agent-expire, gnus-agent-write-active, - gnus-agent-save-active-1): Use - `insert-file-contents-as-coding-system' instead of - `insert-file-contents-literally' or `insert-file-contents'. - -1999-07-05 Katsumi Yamaoka - - * texi/{emacs-mime.texi,ChangeLog}: Sync up with Pterodactyl Gnus - v0.91. - * lisp/{smiley.el,rfc2047.el,qp.el,nnml.el,nnmbox.el,nnmail.el, - nnheader.el,nnfolder.el,mml.el,mm-view.el,mm-uu.el,mm-util.el, - mm-encode.el,mm-decode.el,message.el,lpath.el,gnus-util.el, - gnus-sum.el,gnus-start.el,gnus-srvr.el,gnus-msg.el,gnus-mailcap.el, - gnus-cache.el,gnus-art.el,gnus-agent.el,base64.el}: Ditto. - * GNUS-NEWS: Ditto. - -1999-07-04 Yoshiki Hayashi - - * texi/{gnusref-ja.tex,refcard-ja.tex}: Update to the version 5.5. - -1999-07-04 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 03. - -1999-07-04 Tsukamoto Tetsuo - - * lisp/gnus-sum.el (gnus-get-newsgroup-headers): Don't bind the - value of `mail-parse-ignored-charsets' if its local value in - `gnus-summary-buffer' is nil. - -1999-07-02 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 02. - (gnus-other-frame): Use `static-if'. - (TopLevel): Require `static'. - - * lisp/score-mode.el (score-mode-coding-system): Use `static-if'. - (TopLevel): Require `static'. - - * lisp/gnus-util.el (gnus-point-at-eol, gnus-point-at-bol): Use - `static-cond' if it exists. NOTE: It should be simplified in the - future. - - * lisp/gnus-start.el (gnus-startup-file-coding-system): Use - `static-if'. - (TopLevel): Require `static'. - - * lisp/gnus-art.el (gnus-article-display-x-face-with-x-face-mule): - Abolish function. - - * lisp/dgnushack.el (dgnushack-make-package): Suppress verbose - messages while generating auto-autoloads.el. - (TopLevel): Set coding priority of Shift-JIS to the bottom. - -1999-06-30 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - - * lisp/message.el (message-pop-to-buffer-1): New macro. - (message-pop-to-buffer): Use it. - (message-delete-frame): Use `static-if'. - (TopLevel): Autoload "mu-cite". - (message-cite-function): Add `mu-cite/cite-original'. - - * lisp/dgnushack.el (TopLevel): Bind functions defined by - `defun-maybe' for all Emacsen. - - * lisp/Makefile.in (clean): Fix typo. - - * Makefile.in (elclean): Remove auto-autoloads.el and - custom-load.el as well. - -1999-06-28 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.11.04. - (gnus-revision-number): Fresh start from 00. - - * configure: Regenerate. - - * lisp/mm-view.el (TopLevel): Define `gnus-article-mime-handles' - for avoiding byte compile warning. - - * lisp/{rfc2047.el,nnmail.el,mml.el,mm-view.el,mm-util.el, - mm-bodies.el,message.el,mail-prsvr.el,gnus-xmas.el,gnus-sum.el, - gnus-start.el,gnus-draft.el,gnus-cus.el,gnus-cache.el,gnus-art.el, - ChangeLog}: Sync up with Pterodactyl Gnus v0.89. - * aclocal.m4: Ditto. - - * README.T-gnus: Update for T-gnus 6.11.04. - -1999-06-24 Katsumi Yamaoka - - * Mule23@1934: New file. - -1999-06-23 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 06. - - * lisp/gnus-sum.el (gnus-articles-to-read): Use - `read-from-minibuffer' with specifying the input position instead - of the use of `read-string' with modifying `minibuffer-setup-hook'. - Exceptionally, don't specify the input position under Emacs 19 or - earlier against the mysterious bug. [cf. ] - (TopLevel): Require `static'. - -1999-06-22 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 05. - -1999-06-22 NAKAJI Hiroyuki - - * texi/Makefile.in (distclean, veryclean): Use `clean' instead of - `make clean'. - (complete, tmps, latexboth, psout, pss, latexps): Use `$(MAKE)' - instead of `make'. - (TopLevel): Use `@SET_MAKE@'. - - * lisp/Makefile.in (distclean): New target. - (clean): Renamed from `distclean'; don't remove Makefile. - - * Makefile.in (distclean): Use `clean' instead of `make clean'. - (x, osome): Use `$(MAKE)' instead of `make'. - (elclean): Use the arg `-f'. - (clean): Remove MANIFEST.*. - -1999-06-22 Katsumi Yamaoka - - * lisp/gnus-sum.el (gnus-dont-select-after-jump-to-other-group): - New user option. - (gnus-summary-jump-to-other-group): Use it. - - * lisp/gnus-cite.el (gnus-cite-add-face): Add check for Emacs 21 or - later. - -1999-06-21 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 04. - - * lisp/gnus-cite.el (gnus-cite-add-face): Use `move-to-column' - statically to skip the prefix string under Emacs 20.2 or earlier. - (TopLevel): Require `static'. - - * lisp/gnus-msg.el (gnus-extended-version): Move - `gnus-revision-number' to the last. - -1999-06-21 Daiji KANEMATSU - - * lisp/gnus-sum.el (gnus-summary-jump-to-other-group): Call - `gnus-summary-read-group' with the 3rd arg T. - -1999-06-21 NAKAJI Hiroyuki - - * texi/Makefile.in (clean): Remove gnus.info*, gnus-ja.info*, - message.info*, message-ja.info*, *.texi_ and emacs-mime.info. - - * lisp/Makefile.in (distclean): Remove auto-autoload.el and - custom-load.el. - -1999-06-18 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 03. - - * lisp/gnus-sum.el (gnus-summary-mark-article): Call - `gnus-cache-possibly-enter-article' with the arg `headers'. - (gnus-summary-mark-article-as-unread): Ditto. - (gnus-summary-move-article): Ditto. - - * lisp/gnus-cache.el (gnus-cache-update-article): Call - `gnus-cache-possibly-enter-article' with the arg `headers'. - (gnus-cache-enter-article): Ditto. - (gnus-cache-possibly-enter-article): Accept parameter `headers'. - -1999-06-17 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 02. - - * lisp/gnus-sum.el (gnus-summary-jump-to-other-group): Rewrite as - an independent function. - (gnus-summary-read-group): Revert to the previous form. - - * lisp/gnus-msg.el (gnus-extended-version): Include - `gnus-revision-number' if it is non-zero. - -1999-06-16 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - (TopLevel): Autoload "gnus-sum" for the command - `gnus-summary-jump-to-other-group'. - - * lisp/gnus-art.el (gnus-article-read-summary-keys): Add key "ZJ" - to the list `nosaves'; convert key events to string statically - under XEmacs. - (gnus-article-display-x-face-with-x-face-mule): Use `gnus-xemacs' - instead of `featurep' with an arg `xemacs'. - (article-toggle-headers): Ditto. - (TopLevel): Require `static'. - - * lisp/gnus-sum.el (gnus-summary-exit-map): New keystroke "ZJ" for - the command `gnus-summary-jump-to-other-group'. - -1999-06-16 Katsumi Yamaoka - Daiji KANEMATSU - - * lisp/gnus-sum.el (gnus-summary-read-group): Allow it to be an - user command. - (gnus-summary-jump-to-other-group): Defalias to - `gnus-summary-read-group'. - -1999-06-15 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.11.03. - (gnus-revision-number): Fresh start from 00. - - * lisp/{gnus-sum.el,nnmail.el,ChangeLog}: Sync up with Pterodactyl - Gnus v0.88. - - * README.T-gnus: Update for T-gnus 6.11.03. - -1999-06-14 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - - * lisp/message.el (message-send-news): Don't generate the Lines - field; don't make `tembuf' as unmodified. - (message-send-mail): Ditto. - -1999-06-14 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.11.02. - - * lisp/{mail-source.el,gnus-sum.el,gnus-art.el}: Sync up with - Pterodactyl Gnus v0.87. - - * text/gnus-ja.text (Troubleshooting): Make the return value of - `gnus-version' ambiguous. - - * lisp/message.el (message-send-news): Make `tembuf' as unmodified - after inserting a text from `message-encoding-buffer'. - (message-send-mail): Ditto. - -1999-06-14 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.11.01. - (gnus-revision-number): Fresh start from 00. - - * lisp/mm-view.el (TopLevel): Avoid byte compile warnings for the - use of old W3. - - * lisp/dgnushack.el (TopLevel): Bind `:file' for old Emacsen. - - * texi/{gnus.texi,gnus-ja.texi,ChangeLog}: Sync up with Pterodactyl - Gnus v0.86. - * lisp/{nnmail.el,nnheader.el,nndoc.el,mml.el,mm-view.el, - mm-decode.el,mm-bodies.el,message.el,mail-source.el,lpath.el, - gnus.el,gnus-xmas.el,gnus-uu.el,gnus-util.el,gnus-sum.el, - gnus-start.el,gnus-score.el,gnus-range.el,gnus-msg.el, - gnus-mailcap.el,gnus-group.el,gnus-cus.el,gnus-cite.el, - gnus-cache.el,gnus-art.el,gnus-agent.el,ChangeLog}: Ditto. - - * etc/gnus/x-splash: New file copied from pgnus 0.86. - -1999-06-12 Daiki Ueno - - * lisp/gnus-msg.el (gnus-copy-article-buffer): Bind - `inhibit-read-only' to t during modifying the destination buffer. - -1999-06-11 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 02. - - * sample.lpath.el: New file. It is supposed to be used for telling - old Emacsen where EMU, APEL or CUSTOM packages have already - installed. - - * lisp/score-mode.el (score-mode-coding-system): Default to - `*ctext*' under Mule 2. - - * lisp/nnmail.el (nnmail-save-active): Bind `output-coding-system' - to the value of `nnmail-active-file-coding-system'. - - * lisp/message.el (message-set-auto-save-file-name): Use - `set-file-coding-system' statically under Mule 2. - (message-do-fcc): Bind `output-coding-system' to `raw-text'. - (message-draft-coding-system): Default to `*junet*' under Mule 2. - (TopLevel): Require `static'. - - * lisp/gnus-util.el (gnus-point-at-eol): Defun statically for the - various Emacsen. - (gnus-point-at-bol): Ditto. - (TopLevel): Require `static'. - - * lisp/gnus-start.el (gnus-startup-file-coding-system): Default to - `*ctext*' under Mule 2. - - * lisp/gnus-msg.el (gnus-inews-do-gcc): Bind `output-coding-system' - to `raw-text'. - - * lisp/gnus-ems.el (language-info-alist): Defvar-maybe for old - Emacsen. - (current-language-environment): Ditto. - (set-language-info): Defun-maybe for old Emacsen. - (get-language-info): Ditto. - (assoc-ignore-case): Ditto. - - * lisp/gnus-cite.el (gnus-cite-parse): Bind `mc-flag' to nil. - - * lisp/dgnushack.el (TopLevel): Define some unknown functions for - avoiding byte compile warnings. - (TopLevel): Require `emu' for picking up some macros, bind some - colon keywords, bind functions defined by `defun-maybe', bind - defcustom'ed variables and optimize byte code for `char-after' and - `char-before' for old Emacsen. - (TopLevel): Attempt to load ~/.lpath.el. - - * configure: Regenerate by autoconf 2.14.1. - -1999-06-11 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - - * lisp/gnus-art.el (gnus-article-display-x-face-with-x-face-mule): - Warn if it is used with X-Face-Mule 0.25 or later. Note that it - should be abolished in the future. - -1999-06-08 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version): Modify for SEMI 1.13, FLIM 1.13. - (gnus-revision-number): Fresh start from 00. - (gnus-version-number): Update to 6.11.0. - (gnus-product-name): Rename to ET-gnus. E is short for Experimental. - - * lisp/gnus-sum.el (gnus-summary-reselect-current-group): Rescan - the current newsgroup before exiting. - - * lisp/gnus-art.el (gnus-article-prepare-display): Change - representation-type of `mime-message-structure'. - - * ChangeLog: New file. - * ChangeLog.1: Renamed from ChangeLog. - -1999-06-01 MORIOKA Tomohiko - - * lisp/gnus-score.el (gnus-header-index): Use - `luna-class-slot-index' and `luna-find-class' to get index number - for an entity. - -1999-05-31 MORIOKA Tomohiko - - * lisp/nnheader.el: Require `mmgnus'. - (mail-header-subject): Now an alias for - `mime-gnus-entity-subject-internal'. - (mail-header-set-subject): Now an alias for - `mime-gnus-entity-set-subject-internal)'. - (mail-header-from): Now an alias for - `mime-gnus-entity-from-internal'. - (mail-header-set-from): Now an alias for - `mime-gnus-entity-set-from-internal'. - (mail-header-date): Now an alias for - `mime-gnus-entity-date-internal'. - (mail-header-set-date): Now an alias for - `mime-gnus-entity-set-date-internal'. - (mail-header-message-id): Now an alias for - `mime-gnus-entity-id-internal'. - (mail-header-id): Likewise. - (mail-header-set-message-id): Now an alias for - `mime-gnus-entity-set-id-internal'. - (mail-header-set-id): Likewise. - (mail-header-references): Now an alias for - `mime-gnus-entity-references-internal'. - (mail-header-set-references): Now an alias for - `mime-gnus-entity-set-references-internal'. - (mail-header-chars): Now an alias for - `mime-gnus-entity-chars-internal. - (mail-header-set-chars): Now an alias for - `mime-gnus-entity-set-chars-internal. - (mail-header-lines): Now an alias for - `mime-gnus-entity-lines-internal'. - (mail-header-set-lines): Now an alias for - `mime-gnus-entity-set-lines-internal'. - (mail-header-xref): Now an alias for - `mime-gnus-entity-xref-internal'. - (mail-header-set-xref): Now an alias for - `mime-gnus-entity-set-xref-internal'. - (make-full-mail-header): New implementation [use - `luna-make-entity']. - (make-full-mail-header-from-decoded-header): Likewise. - - * lisp/mmgnus.el (mime-gnus-entity): New definition of luna-class. - (mime-entity-buffer): Abolished. - (initialize-instance): New method. - -See ChangeLog.1 for earlier changes. diff --git a/ChangeLog.3 b/ChangeLog.3 deleted file mode 100644 index 6859e0f..0000000 --- a/ChangeLog.3 +++ /dev/null @@ -1,2916 +0,0 @@ -2000-12-06 Katsumi Yamaoka - - * lisp/nnshimbun.el (TopLevel): Defalias `coding-system-category' - to `get-code-mnemonic' for Mule. - (TopLevel): Make codesys `euc-japan' and `shift_jis' for Mule. - (nnshimbun-type-definition): Use `static-if' to determine codesys. - (TopLevel): Require `static'. - -2000-12-06 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el (nnshimbun-retrieve-url): coding detection is - improved. - (nnshimbun-meta-content-type-charset-regexp): New constant. - (nnshimbun-meta-charset-content-type-regexp): Ditto. - -2000-12-03 Tetsuo Tsukamoto - - * texi/gnus-ja.texi: Fixes for the last modification. - -2000-12-02 Tetsuo Tsukamoto - - * texi/gnus-ja.texi: Translate description about - `nnmail-split-fancy-with-parent'. - - * texi/message-ja.texi: Use two lines for direntry. - -2000-12-01 Katsumi Yamaoka - - * lisp/dgnushack.el: Attempt to add another FLIM path to `load-path' - if the module `mel' does not found. This procedure may be needed - when recent FLIM 1.14 is used under old Emacsen. - -2000-11-27 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 08. - - * lisp/message.el (message-send-mail-with-smtp): Leave the error - handling in `smtp-send-buffer's own care. - -2000-11-22 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 07. - - * lisp/gnus.el: Add autoloads for x-face-e21. - - * lisp/gnus-sum.el (gnus-summary-search-article-position-point): - Search for `x-face-image' as well as `x-face-mule-bitmap-image'. - - * lisp/gnus-art.el (gnus-article-x-face-command): Default to - `x-face-decode-message-header' when Emacs 21 is running and - x-face-e21 is installed. - -2000-11-21 Katsumi Yamaoka - - * lisp/message.el (message-send-mail-with-smtp): Use - `smtp-send-buffer' if it exists instead of `smtp-via-smtp'. - - * lisp/dgnushack.el (describe-key-briefly): New compiler macro for - old Emacsen. - -2000-11-17 Akihiro Arisawa - - * lisp/nnheader.el (nnheader-header-value): Save point. - -2000-11-16 Katsuhiro Hermit Endo - - * texi/gnus-ja.texi (Drafts): Fix typo. - -2000-11-14 Katsumi Yamaoka - - * lisp/gnus-art.el (article-verify-x-pgp-sig): Autoload "mm-uu". - (gnus-treat-x-pgp-sig): Default to nil. - -2000-11-10 Katsumi Yamaoka - - * Mule23@1934.en, Mule23@1934.ja, sample.lpath.el: Upgrade. - - * configure: Regenerate. - * aclocal.m4 (AC_PATH_PACKAGEDIR): No need to quote a string for - `AC_MSG_RESULT'. - (AC_CHECK_W3): Ignore cache; no need to quote a string for - `AC_MSG_RESULT'. - (AC_CHECK_EMACS_FLAVOR): Ignore cache. - (AC_CHECK_EMACS): Ignore cache. - (AC_DEFINE_GNUS_PRODUCT_NAME): Cache. - -2000-11-09 Katsumi Yamaoka - - * configure: Regenerate. - - * aclocal.m4 (AC_CHECK_W3): Substitute `W3' with empty string - instead of "no" if it is not acceptable. - - * lisp/dgnushack.el: Load dgnuspath.el and ~/.lpath.el just before - path-util is loaded. - (dgnushack-compile): Show `load-path'. - (dgnushack-w3-dir): Ignore the env var W3DIR if it is empty. - - * lisp/lpath.el: Move out `load-path' modification for APEL, FLIM - and SEMI to dgnushack.el. - * lisp/dgnushack.el: Move here. - - * lisp/lpath.el (md5): Don't bind. - (url-insert-file-contents): Fbind for FSF Emacsen. - -2000-11-08 Katsumi Yamaoka - - * texi/Makefile.in (install-ja-info): Specify `EMACS' and - `infodir'. - (install-info): Ditto. - (install-ja): Ditto. - - * lisp/lpath.el (md5): Fbind using `maybe-fbind'. - - * lisp/dgnushack.el (dgnushack-compose-package): Remove function. - (dgnushack-install-package-info-ja): Remove function. - (dgnushack-install-package-info): Remove function. - (dgnushack-install-package-lick): Remove function. - (dgnushack-install-package-pkginfo): Remove function. - (dgnushack-install-package-info-files): Remove function. - (dgnushack-install-package-manifest): New function. - (dgnushack-remove-extra-files-in-package): New function. - (dgnushack-gnus-product-name): Remove function. - (dgnushack-examine-package-dir): Remove function. - (dgnushack-exporting-files): Rename from `dgnushack-exported-files'. - (dgnushack-unexporting-files): Rename from - `dgnushack-unexported-files'; attempt to fix `load-path' for W3 and - retry to load `w3-forms' if it is failed. - (dgnushack-w3-dir): New variable. - - * lisp/Makefile.in (remove-extra-files-in-package): New target. - (install-package-manifest): New target. - (install-package-info-ja): Remove target. - (install-package-info): Remove target. - (install-package-lick): Remove target. - (install-lisp): New target detached from `install'. - (install): Call `clever' and `install-lisp'. - (EXPORTING_FILES, GNUS_PRODUCT_NAME): New variables. - - * configure: Regenerate. - - * aclocal.m4 (AC_PATH_PACKAGEDIR): Examine `PACKAGEDIR' if it is - not specified under XEmacs. - (AC_EXAMINE_PACKAGEDIR): New function. - (AC_PATH_LISPDIR): Don't say annotations about install-package if - FSFmacs is used. - (AC_DEFINE_GNUS_PRODUCT_NAME): Add substitution for - `GNUS_PRODUCT_NAME'. - - * Makefile.in (remove-extra-files-in-package): New target. - (install-package-manifest): New target. - (install-package-info-ja): Examine `PACKAGEDIR' if it is not - specified; call install-ja-info in texi/Makefile. - (install-package-info): Examine `PACKAGEDIR' if it is not - specified; call install-info in texi/Makefile. - (install-package-lisp): Rename from `install-package-lick'; examine - `PACKAGEDIR' if it is not specified; call `install-lisp' in - lisp/Makefile. - (install-package-ja): Call `xlick', `compose-package', - `remove-extra-files-in-package', `install-package-lisp', - `install-package-info', `install-package-info-ja' and - `install-package-manifest'. - (install-package): Call `xlick', `compose-package', - `remove-extra-files-in-package', `install-package-lisp', - `install-package-info' and `install-package-manifest'. - (install-info-ja, install-info): Specify `infodir'. - (EXAMINE_PACKAGEDIR, GNUS_PRODUCT_NAME, infodir): New variables. - -2000-11-07 Tetsuo Tsukamoto - - * texi/gnus-ja.texi: Do not use characters other than ascii ones - for direntries. - * texi/message-ja.texi: Ditto. - -2000-11-06 Katsumi Yamaoka - - * lisp/Makefile.in (install): Don't check for the file names. - -2000-11-04 Katsuhiro Hermit Endo - - * lisp/gnus-topic.el (gnus-group-topic-map): Define "T" prefix - command in `gnus-topic-mode-map' instead of `gnus-group-mode-map'. - -2000-10-25 Katsuhiro Hermit Endo - - * lisp/gnus-topic.el (gnus-topic-rename): Use current topic as - initial value for read-string. - -2000-11-06 Katsumi Yamaoka - - * lisp/Makefile.in (install): Use the lisp function - `dgnushack-exported-files'. - - * lisp/nnmail.el (nnmail-pathname-coding-system): Default to - `binary'. - * lisp/nnheader.el (nnheader-pathname-coding-system): Ditto. - - * lisp/message.el (message-get-reply-headers): Remove useless - `concat'. - - * lisp/md5.el: Restore the file. - - * lisp/dgnushack.el (dgnushack-compile): Refer to the constant - `dgnushack-exported-files'. - (dgnushack-exported-files): New function. - (dgnushack-exported-files): New constant. - (dgnushack-unexported-files): Add some files. - (dgnushack-tool-files): Remove, merge it into - `dgnushack-unexported-files'. - - * lisp/base64.el: New file -- base64 encoding functions using MEL. - -2000-11-05 Tetsuo Tsukamoto - - * lisp/smiley.el (smiley-deformed-regexp-alist): Modify regexp for - the winking face. - -2000-11-02 Katsumi Yamaoka - - * lisp/dgnushack.el (dgnushack-make-manifest): Fix info directory. - -2000-11-02 Katsumi Yamaoka - - * Makefile.in (install-package-ja): Compile and install lisp files - first. - (install-package): Ditto. - (compose-package, install-package-info-ja, install-package-info, - install-package-lick): New sub targets. - - * lisp/Makefile.in (install-package-info-ja, install-package-info, - install-package-lick): New targets. - (compose-package): Rename from `package'. - (install-package): Remove. - - * lisp/dgnushack.el (dgnushack-install-package-info-ja, - dgnushack-install-package-info, dgnushack-install-package-lick, - dgnushack-install-package-pkginfo, - dgnushack-install-package-info-files, dgnushack-make-manifest, - dgnushack-gnus-product-name, dgnushack-examine-package-dir, - dgnushack-make-autoloads): New functions. - (dgnushack-install-package): Remove. - (dgnushack-compose-package): Rename from `dgnushack-make-package'. - (dgnushack-info-file-regexp-ja, dgnushack-info-file-regexp-en): - Split from `dgnushack-info-file-regexp'. - (dgnushack-texi-file-regexp): Remove. - -2000-11-01 Katsumi Yamaoka - - * lisp/dgnushack.el (dgnushack-texi-format): Remove @ignore'd areas - before processing. - -2000-11-01 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 06. - - * lisp/gnus.el (gnus-product-variable-file-list): Check for - `emacs-version' in the file "cache" as well. - * lisp/gnus-start.el (gnus-product-read-variable-file-1): Make it - talkative. - -2000-10-31 Katsumi Yamaoka - - * lisp/dgnushack.el: Bind `:key-type' and `:value-type' for old - Emacsen. - -2000-10-31 TAKAHASHI Kaoru - - * lisp/ptexinfmt.el (texinfo-format-direntry): Fixed broken - direntry generate probrem. - (Advised by Tetsuo Tsukamoto ) - -2000-10-31 Katsumi Yamaoka - - * lisp/gnus-sum.el (gnus-summary-insert-line): Work with quoted - double-quote characters. - (gnus-summary-prepare-threads): Ditto. - -2000-10-30 TAKAHASHI Kaoru - - * lisp/ptexinfmt.el (ptexinfmt-disable-broken-notice-flag): Renamed - from `ptexinfmt-disable-broken-notice'. - -2000-10-27 TAKAHASHI Kaoru - - * lisp/ptexinfmt.el (texinfo-format-printindex): Mule for Windows - detection fixed. - -2000-10-26 Katsumi Yamaoka - - * lisp/gnus.el (gnus-group-startup-message): Rewrite for Emacs 21. - * lisp/lpath.el: Fbind `propertize'. - -2000-10-22 Katsuhiro Hermit Endo - - * texi/gnus-ja.texi (Changing Servers): Fix typo. - -2000-10-19 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el (nnshimbun-netbsd-get-headers): Fix regular - expression to extract xover urls. - -2000-10-12 Jesper Harder - - * make.bat: Makes it possible to generate the Info files on - windows again. - -2000-10-11 Katsumi Yamaoka - - * Makefile.in (info-ja, xinfo-ja): No need to use `MAKEINFO=no'. - (install-info-ja, install-info, install-lisp, install-ja): New - targets (possibly for FSF Emacsen). - - * texi/Makefile.in (install-ja-info, install-info, install-ja, - %-ja.info, %-ja): New targets. - - * texi/message-ja.texi (direntry): Replace "message" with - "message-ja". - -2000-10-08 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el (nnshimbun-type-definition): Fix regular - expression to extract article body from `ZDNet'. - -2000-10-06 Katsumi Yamaoka - - * lisp/imap.el: Require `base64' instead of to autoload it. - -2000-10-05 Katsumi Yamaoka - - * lisp/gnus-xmas.el (gnus-xmas-group-startup-message): Don't use - `gnus-point-at-eol'. - * lisp/gnus.el (gnus-group-startup-message): Ditto. - - * lisp/gnus-ems.el (gnus-ems-redefine): Revive annulling of - `gnus-summary-set-display-table'. - -2000-10-04 Akihiro Arisawa - - * lisp/gnus-sum.el (gnus-build-sparse-threads): Use - `make-full-mail-header-from-decoded-header' instead of - `make-full-mail-header'. - -2000-10-03 Katsumi Yamaoka - - * lisp/gnus-group.el (gnus-group-get-new-news): Update modeline - using `gnus-agent-toggle-plugged' if agent is activated. - * lisp/gnus-agent.el (gnus-group-get-new-news): Don't advise it, - merge it into gnus-group.el instead. - - * lisp/gnus-offline.el (gnus-offline-after-jobs-done): Use `ding' - with `play-sound-file' for XEmacs statically. - - * lisp/gnus-art.el (gnus-article-add-button): Quote - `:button-keymap' for Mule 2.3 but it won't work. - -2000-09-29 Katsumi Yamaoka - - * lisp/message.el (message-ignored-supersedes-headers): Synch with - Gnus. - -2000-09-27 TAKAHASHI Kaoru - - * list/ptexinfmt.el (texinfo-multitable-widths): Fix - broken-facility probrem when use multitable unsupported - texinfmt.el. - -2000-09-26 TAKAHASHI Kaoru - - * lisp/ptexinfmt.el (texinfo-format-printindex): Use (featurep - 'meadow) instead of `texinfmt-version'. - -2000-09-25 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 05. - - * texi/gnus-faq-ja.texi, lisp/gnus.el, README.semi.ja, README.semi, - README: Replace "" with - "". - -2000-09-22 TAKAHASHI Kaoru - - * lisp/ptexinfmt.el (texinfo-format-printindex): Add - broken-facility check, for Mule for Windows. - (texinfo-format-printindex): New function. - -2000-09-19 Katsumi Yamaoka - - * lisp/gnus-msg.el (gnus-copy-article-buffer): Encode bitmap - smileys to ordinary text before removing any text properties. It - is synchronized with the latest smiley-mule.el. - -2000-09-19 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el (nnshimbun-type-definition): Follow URL change - of `ZDNet'. - -2000-09-15 Daiki Ueno - - * lisp/gnus-art.el: Always require `wid-edit'. - -2000-09-14 Katsumi Yamaoka - - * lisp/dgnushack.el (dgnushack-compile): Don't compile gnus-ml.el - when FSFmacs is running. - - * lisp/gnus-ml.el: Bind some undeclared variables. - - * lisp/gnus-art.el (gnus-article-add-button): Add widget button. - (gnus-article-display-mime-message): Don't set - `mime-button-mother-dispatcher'. - - * lisp/message.el: Require `reporter' for the function - `define-mail-user-agent' when Mule 2.3 is running. - -2000-09-07 Tadashi Watanabe - - * lisp/smiley.el (smiley-buffer, smiley-create-glyph): Work with - GTK XEmacs as well. - -2000-09-06 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el (nnshimbun-header-xref): New function. - (nnshimbun-insert-header): Use `nnshimbun-header-xref', instead of - `mail-header-xref'. - (nnshimbun-make-mhonarc-contents): Took a measure against - unexpected TAB characters. - -2000-09-05 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el: Add `netbsd' support. - (nnshimbun-nov-fix-header): Change a form storing Message-Id. - (nnshimbun-search-id): Ditto. - (nnshimbun-make-mhonarc-contents): Use optional header - information. - -2000-09-05 Daiki Ueno - - * lisp/pop3.el (pop3-quit): Don't clear `pop3-uidl-obarray'. - (pop3-save-uidls): Clear `pop3-uidl-obarray' here. - -2000-09-04 Daiki Ueno - - * lisp/mail-source.el (pop3-leave-mail-on-server): Declare. - (mail-source-keyword-map): New keyword `:leave' for pop. - (mail-source-fetch-pop): Refer it. - - * lisp/pop3.el (pop3-ssl-program-name): New variable. - -2000-08-31 TAKAHASHI Kaoru - - * lisp/ptexinfmt.el (texinfo-multitable-widths, - texinfo-multitable-item): Apply char-width probrem fix patch - (by KOIE Hidetaka ). - Newsgroups: fj.editor.emacs - Message-ID: <5dzom3nxq7.fsf@skipjack.koie.org> - - * lisp/ptexinfmt.el (ptexinfmt-disable-broken-notice): New - variable. - -2000-08-29 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el (nnshimbun-zdnet-get-headers): Follow changes - of ZDNet. - -2000-08-25 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 04. - -2000-08-25 Yagi Tatsuya - Katsumi Yamaoka - - * lisp/nntp.el (nntp-list-options, nntp-options-subscribe, - nntp-options-not-subscribe): New server variables. - (nntp-request-list): Use them. - * texi/gnus.texi, texi/gnus-ja.texi: Update for them. - -2000-08-23 Katsumi Yamaoka - - * lisp/gnus.el (gnus-group-startup-message): Use `image-size' to - simplify the program. - - * lisp/gnus-group.el (gnus-group-rename-group): Inhibit renaming of - zombie or killed groups. - -2000-08-21 Katsumi Yamaoka - - * lisp/nnheader.el (nnheader-replace-chars-in-string): Use - `static-if'. - * lisp/message.el (message-replace-chars-in-string): Ditto. - -2000-08-19 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el (nnshimbun-type-definition): Follow changes of - ZDNet. - (nnshimbun-make-text-or-html-contents): Ditto. - (nnshimbun-make-html-contents): Ditto. - -2000-08-18 TSUCHIYA Masatoshi - Akihiro Arisawa - - * lisp/nnshimbun.el: Add `mew' and `xemacs' support. - -2000-08-17 Katsumi Yamaoka - - * lisp/dgnushack.el (dgnushack-texi-format): Require `ptexinfmt' - instead of `texinfmt'. - (dgnushack-install-package): Don't install ptexinfmt.el. - (dgnushack-make-package): Don't include ptexinfmt.el in MANIFEST. - (dgnushack-compile): Don't compile dgnushack.el nor ptexinfmt.el. - (dgnushack-unexported-files, dgnushack-tool-files): New constants. - - * lisp/Makefile.in (install-package): No need to remove - dgnushack.elc. - (install): Don't install ptexinfmt.el; no need to remove - dgnushack.elc. - - * lisp/ptexinfmt.el: New file imported from Wanderlust. - -2000-08-09 Katsumi Yamaoka - - * lisp/nntp.el (nntp-open-telnet): Wait for the telnet prompt - before sending a command; allow the rtelnet prompt as well. - - * lisp/message.el (message-make-forward-subject): Remove garbage - line. - -2000-08-01 Katsumi Yamaoka - - * configure: Regenerate. - * aclocal.m4 (AC_CHECK_EMACS): Unset `EMACS' environment variable - if it is `t'. - -2000-07-24 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 03. - - * configure: Regenerate with autoconf v2.14.1. - - * configure.in: Rewrite for using new macros in aclocal.m4. - - * aclocal.m4: (AC_ADD_LOAD_PATH, AC_PATH_PACKAGEDIR, - AC_CHECK_EMACS, AC_DEFINE_GNUS_PRODUCT_NAME): New macros. - (AC_PATH_LISPDIR): Set `lispdir' to ".../site-lisp/t-gnus" by - default. - (AC_CHECK_EMACS_FLAVOR): Rename from `AC_XEMACS_P'; check for - `MULE' as well. - (AM_PATH_LISPDIR): Remove. - - * acinclude.m4: Remove. - - * lisp/dgnushack.el: Don't add "/usr/share/emacs/site-lisp" to - `load-path'. - - * lisp/gnus-ems.el (gnus-ems-redefine): Defalias - `gnus-summary-set-display-table' to `(lambda ())' instead of - `ignore' (don't synch. with Gnus). - -2000-07-21 Daiki Ueno - - * lisp/gnus-bbdb.el (gnus-bbdb/update-record): Use - mime-entity-fetch-field instead of mail-header-from. - -2000-07-18 Daiki Ueno - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 02. - - * lisp/gnus-bbdb.el (gnus-bbdb/update-record): Don't refer - gnus-original-article-buffer. - (gnus-bbdb-insinuate): Set gnus-article-display-hook instead of - gnus-article-prepare-hook. - (gnus-bbdb/extract-field-value): Use mime-entity-fetch-field - instead of mail-fetch-field. - (gnus-bbdb/extract-field-value-init): Just return extractor. - -2000-07-15 Daiki Ueno - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 01. - - * README-gnus-bbdb.{ja|en}: Add example setting about - gnus-bbdb-insinuate-message. - (bbdb-auto-notes-hook): Don't use pop. - - * lisp/gnus-bbdb.el: Check defvaralias when compiling. - - * lisp/gnus-art.el (gnus-article-setup-buffer): Set - gnus-original-article-buffer as unibyte. - (gnus-request-article-this-buffer): Ditto. - - * lisp/nnimap.el (nnimap-callback): Don't use nnimap-demule. - (nnimap-request-article-part): Ditto. - - * lisp/imap.el (imap-open): Set process buffer as unibyte. - -2000-07-13 10:09:52 Katsumi Yamaoka - - * acinclude.m4 (AC_CHECK_W3): Fix typo. - -2000-07-13 Katsumi Yamaoka - - * configure: Regenerate with autoconf v2.14.1. - * aclocal.m4: Regenerate with aclocal v1.4. - - * configure.in: Don't call `AC_CHECK_PROG' for `EMACS'. - - * acinclude.m4: Merge ShengHuo's changes. - (AC_CHECK_W3): Use `quote' instead of '. - (AC_XEMACS_P): Don't modify the value of `XEMACS'. - (AC_EMACS_LISP): Safely quote the elisp form. - -2000-07-12 15:47:06 ShengHuo ZHU - - * aclocal.m4: Stolen macros from w3. - * configure.in: Use them. - * configure: Generate it. - -2000-07-03 Katsumi Yamaoka - - * lisp/gnus-vers.el (T-gnus): Update to 6.14.5. - (gnus-revision-number): Clear to 00. - - * README.T-gnus: Update. - - * lisp/{webmail.el,rfc2047.el,qp.el,pop3.el,nnwarchive.el, - nnsoup.el,nnslashdot.el,nnml.el,nnmh.el,nnmbox.el,nnmail.el, - nnimap.el,nnheader.el,nnfolder.el,nndraft.el,nndoc.el,mml.el, - mm-view.el,mm-uu.el,mm-util.el,mm-decode.el,mm-bodies.el, - message.el,mail-source.el,lpath.el,imap.el,gnus.el,gnus-uu.el, - gnus-util.el,gnus-topic.el,gnus-sum.el,gnus-start.el,gnus-srvr.el, - gnus-soup.el,gnus-score.el,gnus-msg.el,gnus-mailcap.el, - gnus-group.el,gnus-ems.el,gnus-demon.el,gnus-cus.el,gnus-art.el, - gnus-agent.el,ChangeLog}: Sync up with Gnus v5.8.7. - - * texi/{message.texi,gnus.texi,gnus-ja.texi,ChangeLog}: Sync up - with Gnus v5.8.7. - - * contrib/rfc2015.el: New file. - -2000-06-27 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 04. - - * lisp/gnus-sum.el (gnus-mime-extract-message/rfc822): Use - `mime-insert-entity-content' instead of obsolete functions. - -2000-06-13 Hirokazu FUKUI - - * lisp/gnus-bbdb.el(gnus-bbdb/update-record): Fix to fetch last - mail field. - -2000-06-09 Katsumi Yamaoka - - * lisp/gnus.el (gnus-news-group-p): Sync with Gnus. - (gnus-select-method): Remove "*" from doc string. - (gnus-group-startup-message): Use `dino' colors. - -2000-06-08 Katsumi Yamaoka - - * lisp/message.el (message-fix-before-sending): Expose all - invisible text with the property `message-invisible'; don't expose - invisible X-Face fields; widen at first. - (message-invisible-region): New function, substitute for - `invisible-region'. - (message-send): Call `message-fix-before-sending' after evaluating - `message-send-hook'. - (message-check-ignore-invisible-x-face-field): Remove. You can use - (add-hook 'message-send-hook 'x-face-xmas-remove-x-face-glyph) - instead. - -2000-06-06 Katsumi Yamaoka - - * lisp/message.el (message-save-drafts): Rewrite. - - * lisp/nnheader.el (nnheader-text-coding-system-for-write, - nnheader-text-coding-system): New variables, substitutes for - `mm-text-coding-system-for-write' or `mm-text-coding-system'. - - * lisp/nnmbox.el (nnmbox-active-file-coding-system, - nnmbox-file-coding-system): Use `nnheader-text-coding-system'. - * lisp/nnmail.el (nnmail-incoming-coding-system): Ditto. - * lisp/nnfolder.el (nnfolder-file-coding-system): Ditto. - (nnfolder-active-file-coding-system): Ditto. - - * lisp/mail-source.el (mail-source-text-coding-system): Remove. - (TopLevel): require `nnheader'. - - * lisp/nndraft.el (nndraft-request-article): Bind coding system to - `nnheader-text-coding-system'. - (nndraft-request-replace-article): Ditto. - * lisp/mail-source.el (mail-source-fetch-maildir): Ditto. - * lisp/gnus-uu.el (gnus-uu-save-article): Ditto. - * lisp/gnus-util.el (gnus-output-to-mail, gnus-output-to-rmail): - Ditto. - * lisp/gnus-soup.el (gnus-soup-write-prefixes): Ditto. - - * lisp/gnus-util.el (gnus-write-buffer): Bind - `file-name-coding-system' to `nnmail-pathname-coding-system'. - * lisp/gnus-start.el (gnus-slave-save-newsrc): Bind coding system - to `gnus-startup-file-coding-system'. - -2000-06-06 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 03. - - * lisp/message.el (message-fix-before-sending): Don't check for - invisible X-Face fields if - `message-check-ignore-invisible-x-face-field' is non-nil. - (message-send): Call `message-fix-before-sending' before encoding. - (message-check-ignore-invisible-x-face-field): New user option. - -2000-06-01 KANEMATSU Daiji - - * texi/gnus-ja.texi (gnus-summary-hide-all-threads): Fix typo. - -2000-05-28 TSUCHIYA Masatoshi - - * nnshimbun.el (nnshimbun-request-article-1): Fix to insert x-face - unless SERVER. - (nnshimbun-asahi-get-headers): Fix for subjects which contain ^M. - -2000-05-26 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el (nnshimbun-write-nov): New function. - (nnshimbun-close-group): Call nnshimbun-write-nov. - (nnshimbun-generate-nov-database): Ditto. - (nnshimbun-generate-nov-for-each-group): Fix bug which occur new - entries add NOV database. - (nnshimbun-generate-nov-for-all-groups): Ditto. - (nnshimbun-search-id): Add argument to return header, and modify - for search of original message id. - (nnshimbun-nov-fix-header): New function. - (nnshimbun-make-date-string): Fix for a two-digit year. - -2000-05-26 Katsumi Yamaoka - - * lisp/nnshimbun.el (nnshimbun-make-html-contents): Show X-Face. - (nnshimbun-make-text-or-html-contents): Ditto. - (nnshimbun-request-article-1): Ditto. - (nnshimbun-x-face-alist): New variable. - -2000-05-25 Tanaka Akira - - * README.semi, README.semi.ja: Update for CVS via SSH. - -2000-05-25 Katsumi Yamaoka - - * texi/gnus-ja.texi: Change coding-system to `iso-2022-7bit-ss2'. - * texi/TRANSLATION.ja: Replace CRLF with LF. - -2000-05-25 Keiichi Suzuki - - * lisp/nnshimbun.el (nnshimbun-fill-line): Use - `nnshimbun-fill-column' instead of `fill-column'. - -2000-05-25 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el: Clean up codes. - - * lisp/gnus-group.el (gnus-group-make-shimbun-group): Follow - changes in nnshimbun.el. - * texi/gnus-ja.texi (nnshimbun): Ditto. - -2000-05-24 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el: Add `ZDNet Japan', `Yomiuri', and `Wired - News' support. - (nnshimbun-regexp-opt): New function. - (nnshimbun-wired-get-all-headers): Replace regexp-opt with - nnshimbun-regexp-opt. - -2000-05-24 Katsumi Yamaoka - - * lisp/gnus-group.el (gnus-group-make-shimbun-group): Complete - completions. - -2000-05-24 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el: Add `CNET Japan' support. - (nnshimbun-make-date-string): New function. - (nnshimbun-asahi-get-headers): Use nnshimbun-make-date-string. - (nnshimbun-sponichi-get-headers): Ditto. - -2000-05-24 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el (nnshimbun-retrieve-url): Add argument to - ignore w3's cache. - -2000-05-24 Katsumi Yamaoka - - * lisp/gnus-group.el (gnus-group-make-shimbun-group): Add - completion to the shimbun address; delete empty strings from - `gnus-group-shimbun-type-history' and - `gnus-group-shimbun-address-history'. - - * lisp/nnshimbun.el (nnshimbun-asahi-get-headers): Don't use - `timezone'. - (nnshimbun-type-definition): Add address. - -2000-05-23 Tatsuya Ichikawa - - * lisp/nnshimbun.el: Add `sponichi' support. - -2000-05-23 KOSEKI Yoshinori - - * lisp/nnshimbun.el (nnshimbun-mime-encode-string): Fix wrong - close brackets. - -2000-05-23 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el: Change coding-system. - -2000-05-21 TSUCHIYA Masatoshi - - * texi/gnus-ja.texi (nnshimbun): Add description. - -2000-05-21 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 02. - - * lisp/dgnushack.el (dgnushack-texi-format): Fix last change. - -2000-05-21 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el: New backend. - - * lisp/gnus-group.el (gnus-group-make-shimbun-group): New command. - -2000-05-17 Kenichi OKADA - - * lisp/imap.el (imap-digest-md5-auth): Rewrite for the use of - `sasl-digest-md5-digest-response' instead of - `digest-md5-digest-response'. - (TopLevel): Require `sasl' when compiling instead of `digest-md5'; - don't autoload "digest-md5". - -2000-05-17 Katsumi Yamaoka - - * lisp/nndraft.el (nndraft-request-replace-article): Replace - `mm-text-coding-system' with `mail-source-text-coding-system'; - Replace `mm-auto-save-coding-system' with - `message-draft-coding-system'. - - * lisp/mail-source.el (mail-source-fetch-maildir): Replace - `mm-text-coding-system' with `mail-source-text-coding-system'. - (mail-source-text-coding-system): New variable. - - * lisp/dgnushack.el (dgnushack-texi-format): Use - `output-coding-system' instead of `coding-system-for-write' when - old Mule is used. - -2000-05-16 Katsumi Yamaoka - - * lisp/message.el (message-forward) Replace the use of `eolp' with - `bolp' for detecting the start of the line. - (message-indent-citation): Ditto. - -2000-05-10 Daiki Ueno - - * lisp/gnus-bbdb.el (gnus-bbdb/pop-up-bbdb-buffer): Don't bind - `bbdb-use-pop-up' while executing `bbdb-pop-up-bbdb-buffer'. - -2000-05-10 Katsumi Yamaoka - - * lisp/gnus-msg.el (gnus-debug): Break MIME tags from the snoopies. - (gnus-bug): Insert text/plain tag at the end of the buffer. - -2000-05-10 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 01. - -2000-05-10 Keiichi Suzuki - - * lisp/message.el (message-list-references): Do not insert - duplicate Message-Id, when specified - `message-list-references-add-position'. - - * lisp/gnus-bbdb.el (gnus-bbdb/split-mail): Support group address. - (gnus-bbdb/insert-address-regexp): New function. - -2000-05-09 Katsumi Yamaoka - - * lisp/gnus-msg.el (gnus-debug): Add "nntp.el" and `defvoo'. - -2000-05-08 Katsumi Yamaoka - - * lisp/gnus-vers.el (T-gnus): Update to 6.14.4. - - * README.T-gnus: Update. - - * lisp/{webmail.el,rfc2047.el,nnmbox.el,nndoc.el,mml.el,mm-view.el, - mm-partial.el,mm-decode.el,mm-bodies.el,message.el,lpath.el, - gnus.el,gnus-vers.el,gnus-util.el,gnus-start.el,gnus-score.el, - gnus-msg.el,gnus-mailcap.el,gnus-ems.el,gnus-draft.el,gnus-art.el, - ChangeLog}: Sync up with Gnus v5.8.6. - * texi/{postamble.tex,message.texi,message-ja.texi,gnusref.tex, - gnus.texi,gnus-ja.texi,emacs-mime.texi,Makefile.in,ChangeLog}: Sync - up with Gnus v5.8.6. - -2000-04-28 Katsumi Yamaoka - - * texi/gnus.texi, texi/gnus-ja.texi, texi/gnus-faq-ja.texi, README: - You might be able to use T-gnus with the versions of XEmacs prior - to 21.1.1. - - * contrib/timer.el: New file. Imported from fsf-compat-1.07-pkg. - -2000-04-27 Katsumi Yamaoka - - * lisp/mm-view.el (gnus-article-mime-handles): Don't bind it. - - * lisp/gnus-sum.el (gnus-article-mime-handles): Restore from Gnus. - (gnus-article-decoded-p): Ditto. - - * lisp/gnus-art.el (gnus-article-mime-handles): Don't bind it. - (gnus-article-decoded-p): Ditto. - -2000-04-25 NAKAJI Hiroyuki - - * lisp/dgnushack.el: Add code to avoid mule-2.3@19.34 failing to - make info from texi. Thanks to Hayashi-san. - -2000-04-25 Katsumi Yamaoka - - * lisp/dgnushack.el (union, member-if, mapcon, last): Remove - compiler macros. - -2000-04-24 Katsumi Yamaoka - - * lisp/gnus-vers.el (T-gnus): Update to 6.14.3. - - * README.T-gnus: Update. - - * GNUS-NEWS: Sync up with Gnus v5.8.5. - * lisp/{webmail.el,utf7.el,time-date.el,smiley.el,rfc2047.el, - rfc1843.el,qp.el,pop3.el,parse-time.el,nnweb.el,nnwarchive.el, - nnvirtual.el,nnultimate.el,nntp.el,nnspool.el,nnslashdot.el, - nnml.el,nnmail.el,nnimap.el,nnheader.el,nnfolder.el,nndraft.el, - nndoc.el,nnagent.el,mml.el,mm-view.el,mm-uu.el,mm-util.el, - mm-encode.el,mm-decode.el,mm-bodies.el,message.el,mail-source.el, - mail-prsvr.el,mail-parse.el,lpath.el,imap.el,ietf-drums.el,gnus.el, - gnus-xmas.el,gnus-win.el,gnus-uu.el,gnus-util.el,gnus-topic.el, - gnus-sum.el,gnus-start.el,gnus-srvr.el,gnus-spec.el,gnus-score.el, - gnus-msg.el,gnus-move.el,gnus-mlspl.el,gnus-mh.el,gnus-mailcap.el, - gnus-logic.el,gnus-kill.el,gnus-int.el,gnus-group.el,gnus-ems.el, - gnus-eform.el,gnus-dup.el,gnus-draft.el,gnus-cite.el,gnus-cache.el, - gnus-bcklg.el,gnus-async.el,gnus-art.el,gnus-agent.el, - format-spec.el,flow-fill.el,fill-flowed.el,dgnushack.el,ChangeLog}: - Sync up with Gnus v5.8.5. - * texi/{refcard.tex,gnusref.tex,gnus.texi,gnus-ja.texi, - gnus-faq-ja.texi,Makefile.in,ChangeLog}: Sync up with Gnus v5.8.5. - - * README: Requires XEmacs 21.1.1 and later. - * texi/{gnus.texi, gnus-faq-ja.texi}: Ditto. - -2000-04-20 Katsumi Yamaoka - - * lisp/gnus-vers.el (T-gnus): Update to 6.14.2. - (gnus-revision-number): Clear to 00. - - * README.T-gnus: Update. - - * lisp/{webmail.el,utf7.el,time-date.el,rfc2047.el,qp.el,pop3.el, - parse-time.el,nnweb.el,nnwarchive.el,nnultimate.el,nntp.el, - nnslashdot.el,nnml.el,nnmail.el,nnimap.el,nnheader.el,nnfolder.el, - mm-view.el,mm-util.el,mm-decode.el,mm-bodies.el,message.el, - mail-source.el,mail-parse.el,lpath.el,imap.el,ietf-drums.el, - gnus.el,gnus-win.el,gnus-vers.el,gnus-uu.el,gnus-topic.el, - gnus-sum.el,gnus-start.el,gnus-srvr.el,gnus-mailcap.el, - gnus-group.el,gnus-cus.el,gnus-art.el,gnus-agent.el,base64.el, - ChangeLog}: Sync up with Gnus v5.8.4. - - * lisp/fill-flowed.el: New file. - - * texi/{gnus.texi,gnus-ja.texi,ChangeLog}: Sync up with Gnus v5.8.4. - - * contrib/{vcard.el,one-line-cookie.diff,README}: New files. - -2000-04-14 Katsumi Yamaoka - - * lisp/gnus-msg.el (gnus-summary-yank-message): Rewrite for the use - of the separated message frames; use `gnus-copy-article-buffer'. - -2000-04-13 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 18. - (gnus-extended-version): Use `gnus-product-name' and - `gnus-version-number' instead of the use of `product-string'. - (gnus-version-number): Exclude `gnus-revision-number'. - (Defining product): Include `gnus-revision-number'. - (TopLevel): Require `poe' for the function `butlast'. - -2000-04-13 Keiichi Suzuki - - * lisp/gnus-spec.el (gnus-update-format): Fix a bug in last - modification. - (gnus-search-or-regist-spec): Change interface. - -2000-04-12 Katsumi Yamaoka - - * lisp/gnus-art.el (gnus-article-prev-page): Bind - `window-pixel-scroll-increment' to nil while scrolling for - canceling a backlash and a modeline erosion. It may work under - XEmacs 21.2.20 and later. - (gnus-article-next-page): Ditto. - -2000-04-12 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 17. - - * lisp/gnus-spec.el (gnus-format-specs-compiled): Fix doc string. - -2000-04-11 Keiichi Suzuki - - * lisp/gnus-start.el (gnus-product-variable-touch): Support multiple - arguments. - - * lisp/gnus-spec.el (gnus-search-or-regist-spec): New utility macro. - (gnus-update-format-specifications): Support new data structure of - `gnus-format-specs-compiled'. - (gnus-update-format-specification-1): Likewise. - (gnus-update-format): Support new data structure of - `gnus-format-specs'. - (gnus-format-specs): Modify data structure. - -2000-04-10 Daiki Ueno - - * lisp/imap.el (imap-body-lines): Check Content-Type: of the - article case insensitively. - -2000-04-07 Katsumi Yamaoka - - * lisp/message.el (message-cite-original): Use "unknown sender" if - from field does not exist in the yanked article. - -2000-04-06 Katsumi Yamaoka - - * lisp/message.el (message-cite-original): Extract from field for - the simple citation line. - -2000-03-21 Katsumi Yamaoka - - * lisp/nnimap.el (nnimap-request-article-part): Returns nil if the - article does not exist. - -2000-03-17 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 16. - - * lisp/nnweb.el (nnweb-fetch-url): Bind `input-coding-system' and - `output-coding-system' for Mule 2.3. - * lisp/mail-source.el (mail-source-fetch-imap): Ditto. - * lisp/imap.el (imap-ssl-open): Ditto. - * lisp/gnus-start.el (gnus-product-read-variable-file-1): Ditto. - -2000-03-17 Katsumi Yamaoka - - * lisp/gnus-start.el (gnus-re-read-newsrc-el-file): New function. - (gnus-read-newsrc-el-file): If it fails, attempt to re-read the - file using `gnus-re-read-newsrc-el-file'. In that case, the - compiled format specs in the file which may be created by the other - Gnusae should be ignored. - -2000-03-16 Katsumi Yamaoka - - * lisp/gnus.el (gnus-product-variable-file-list): Use `*ctext*' - when Mule 2.3 is running. - -2000-03-16 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 15. - - * lisp/gnus.el (gnus-continuum-version): Remove. - (gnus-product-variable-file-list): Use `product-version' instead of - the constant values. - (TopLevel): Don't autoload "gnus-msg" for the function - `gnus-extended-version'. - (gnus-version): Move to gnus-vers.el. - (gnus-version): Ditto. - (gnus-version-number): Ditto. - (gnus-product-name): Ditto. - (gnus-original-product-name): Ditto. - (running-pterodactyl-gnus-0_73-or-later): Ditto. - (gnus-original-version-number): Ditto. - (gnus-revision-number): Ditto. - - * lisp/gnus-vers.el (gnus-extended-version): Move from gnus-msg.el. - (gnus-version): Move from gnus.el. - (gnus-version): Ditto. - (gnus-version-number): Ditto. - (gnus-product-name): Ditto. - (gnus-original-product-name): Ditto. - (running-pterodactyl-gnus-0_73-or-later): Ditto. - (gnus-original-version-number): Ditto. - (gnus-revision-number): Ditto. - - * lisp/gnus-start.el (gnus-product-quick-file-format): Use - `gnus-vers' instead of `gnus' for the product. - (gnus-product-save-variable-file-1): Message an absolute file name; - use `save-buffer-as-coding-system'; use `gnus-vers' instead of - `gnus' for the product. - (gnus-convert-old-ticks): Remove. - (gnus-convert-old-newsrc): Remove. - (gnus-read-newsrc-file): Don't call `gnus-read-newsrc-file'. - - * lisp/gnus-spec.el (gnus-compile): Modify for the new form of - `gnus-format-specs-compiled'. - (gnus-update-format-specifications): Specify the arg `format' for - `gnus-update-format-specification-1'. - (gnus-update-format-specification-1): Modify for the new form of - `gnus-format-specs-compiled'; add a new arg `format'. - (gnus-format-specs-compiled): Allow the plural compiled functions - for each element. - - * lisp/gnus-msg.el (gnus-extended-version): Move to gnus-vers.el. - -2000-03-14 Keiichi Suzuki - - NOTE: It requires `product' in APEL 10.0 or later. - Will be created ``~/News/.T-gnus/'' directory automatically by - default. You can customize location by `gnus-product-directory'. - ``cache'' and ``strict-cache'' files will be created under the - directory. - - * lisp/gnus.el (TopLevel): Require `gnus-vers'. - (gnus-product-name): Abolished. - (gnus-version-number): Ditto. - (gnus-version): Use `product-string'. (Format changed) - (gnus-variable-list): Delete `gnus-format-specs'. - (gnus-product-variable-file-list): New variable. - (TopLevel): Use `product-provide'. - - * lisp/gnus-vers.el: New file. - - * lisp/gnus-start.el (gnus-product-directory): New user option. - (gnus-clear-quick-file-variables): New function. - (gnus-clear-system): Use `gnus-clear-quick-file-variables'. - (gnus-read-newsrc-file): Likewise. - (gnus-read-newsrc-el-file): Read product's variable files. - (gnus-product-read-variable-file-1): New function. - (gnus-save-newsrc-file): Save product's variable files. - (gnus-product-variable-touch): New function. - (gnus-product-variables-dirty-p): Ditto. - (gnus-product-save-variable-file): Ditto. - (gnus-product-save-variable-file-1): Ditto. - (gnus-product-quick-file-format): Ditto. - - * lisp/gnus-spec.el (gnus-update-format): Use - `gnus-product-variable-touch'. - (gnus-update-format-specification-1): Likewise. - (gnus-update-format-specifications): Do not check `emacs-version' - and `gnus-newsrc-file-version'. Use - `gnus-product-variable-touch'. - - * lisp/gnus-msg.el (gnus-inews-add-send-actions): Use - `product-string'. - -2000-03-09 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 14. - (gnus-compile-user-specs): New user option. - - * texi/gnus.texi: Update. - * texi/gnus-ja.texi: Update. - - * lisp/gnus-start.el (gnus-setup-news): Revert. - (gnus-setup-news-hook): Revert. - - * lisp/gnus-spec.el (gnus-compile): Modify the actual format specs - as well; don't bind `gnus-tmp-func'. - (gnus-update-format-specifications): Revert; use - `gnus-update-format-specification-1'. - (gnus-update-format-specification-1): New function. - (gnus-format-specs-compiled): Modify the form. - (TopLevel): Require `alist'. - -2000-03-09 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 13. - - * texi/gnus.texi: Update. - * texi/gnus-ja.texi: Update. - - * lisp/gnus-start.el (gnus-setup-news): Update all format specs - just before `gnus-setup-news-hook' is evaluated. - (gnus-setup-news-hook): Default to `gnus-compile'. - - * lisp/gnus-spec.el (gnus-compile): Don't modify the value of - `gnus-format-specs', generate compiled specs in - `gnus-format-specs-compiled' instead; don't touch the dribble - buffer. - (gnus-update-format-specifications): Bind `gnus-format-specs' to - `gnus-format-specs-compiled' if the latter is non-nil; use - `gnus-update-format-specifications-1'. - (gnus-update-format-specifications-1): Rename from - `gnus-update-format-specifications'; update the value of - `gnus-newsrc-file-version' if the updating is forced. - (gnus-format-specs-compiled): New internal variable. - -2000-03-05 Keiichi Suzuki - - * lisp/gnus-spec.el (gnus-update-format-specifications): Force - update format specifications, when differ `gnus-version' and - `gnus-newsrc-file-version' instead of `gnus-version' and - `gnus-version' in `gnus-format-specs'. - Do not add `gnus-version' into `gnus-format-specs'. - -2000-03-04 Daiki Ueno - - * lisp/gnus-spec.el (gnus-compile): Remove gnus-version entry - from gnus-format-specs. - -2000-02-21 Yoshiki Hayashi - - * nnvirtual.el (nnvirtual-request-article): - Bind gnus-override-method to nil. - (nnvirtual-request-update-mark): Don't update mark when - article is not there. - -2000-03-03 Daiki Ueno - - * lisp/gnus.el (gnus-revision-number): Increment to 12. - - * lisp/gnus-sum.el: Add autoload setting for `pgg-decrypt-region' - and `pgg-verify-region'. - (gnus-summary-decrypt-article): New command. - (gnus-summary-verify-article): New command. - (gnus-summary-article-map): Bind them. - (gnus-wheel-summary-scroll): Fix paren style. - -2000-03-02 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 11. - -2000-03-01 MORIOKA Tomohiko - - * lisp/nnheader.el (nnheader-insert-nov): Use - `mime-entity-fetch-field' instead of `mime-fetch-field'. - - * lisp/gnus-sum.el (gnus-summary-line-format-alist): Use - `mime-entity-read-field' instead of `mime-read-field'. - (gnus-article-sort-by-author): Likewise. - -2000-03-02 Daiki Ueno - - * lisp/nnimap.el (nnimap-request-article-part): Don't use - `imap-capability' to detect BODYDETAIL response. - -2000-03-01 Daiki Ueno - - * lisp/gnus.el (gnus-revision-number): Increment to 10. - - * lisp/nnimap.el - (nnimap-request-article-part): Handle `BODY' fetch response when - the server implements IMAP4 rev1 capabilities. - (nnimap-request-article): Use BODY.PEEK rather than RFC822.PEEK. - this attribute was obsoleted in RFC2060. - (nnimap-request-body): Ditto. - -2000-02-29 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 09. - - * lisp/gnus-ems.el (gnus-tilde-cut-form, gnus-tilde-max-form): Copy - from gnus-xmas.el; share them with XEmacs-MULE. - - * lisp/gnus-xmas.el (gnus-tilde-cut-form, gnus-tilde-max-form): - Move to gnus-ems.el. - -2000-02-20 Daiki Ueno - - * lisp/gnus.el (gnus-revision-number): Increment to 08. - - * lisp/gnus-bbdb.el: Sync up with Nana-gnus 7 for supporting - `gnus-bbdb/split-mail'. - * README-gnus-bbdb.ja: Ditto. - -2000-02-08 Yoshiki Hayashi - - * gnus-art.el (article-display-face): Show folded X-Face. - -2000-02-08 Keiichi Suzuki - - * lisp/gnus.el (gnus-revision-number): Increment to 07. - - * lisp/nnmail.el (nnmail-get-new-mail): Do not check - `nnmail-spool-file'. - -2000-02-06 Daiki Ueno - - * lisp/gnus.el (gnus-revision-number): Increment to 06. - - * lisp/gnus-ofsetup.el: Provide `gnus-ofsetup'. - (gnus-setup-for-offline): Add `starttls' to IMAP streams; add - `digest-md5' to IMAP authenticators. - - * lisp/gnus-offline.el (gnus-group-get-new-news, - gnus-agent-toggle-plugged,gnus-agent-expire, - gnus-agent-mode): Check whether `gnus-ofsetup' is provided before - redefining. - - * lisp/imap.el (imap-stream-alist): Remove redundant entry for TLS. - - * 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. - - * lisp/gnus-art.el (gnus-treat-display-smileys): Check for the - module `gnus-bitmap' instead of `smiley-mule'. - - * lisp/gnus-sum.el (gnus-summary-exit): Recenter the group buffer - without redisplaying if the point is out of view. - -2000-01-25 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 04. - -2000-01-24 SANETO Takanori - - * lisp/gnus-spec.el: Call `gnus-ems-redefine'. - - * lisp/pop3.el (pop3-movemail): Don't use `format' for `message'. - * lisp/gnus-offline.el (gnus-offline-toggle-articles-to-fetch): - Ditto. - - * lisp/read-passwd.el (read-pw-read-noecho): Use "%s" for the 1st - arg of `message'. - * lisp/gnus.el (gnus-version): Ditto. - * lisp/gnus-sum.el (gnus-summary-simplify-subject-query): Ditto. - * lisp/gnus-offline.el (gnus-offline-set-interval-time, - gnus-offline-empting-spool, gnus-offline-toggle-on/off-send-mail, - gnus-offline-set-auto-ppp, gnus-offline-after-jobs-done, - gnus-offline-hangup-line, gnus-offline-get-new-news-function, - gnus-offline-connect-server): Ditto. - * lisp/dgnushack.el (dgnushack-make-package): Ditto. - -2000-01-18 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 03. - - * lisp/gnus-sum.el (gnus-summary-exit): Don't recenter the group - buffer if it is called non-interactively. - -2000-01-18 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 02. - - * lisp/gnus-sum.el (gnus-summary-exit): Recenter the group buffer - if the point is out of view. - -2000-01-15 Tsukamoto Tetsuo - - * lisp/gnus-art.el (gnus-article-next-page): Scroll up LINES if - `pos-visible-in-window-p' returns nil. - -2000-01-15 Tsukamoto Tetsuo - - * lisp/gnus-offline.el (gnus-agent-mode): New advice. - -2000-01-12 Hirokazu FUKUI - - * lisp/base64.el: Unbound base64-*-string and base64-*-region - when defined by autoload. - -2000-01-11 Katsumi Yamaoka - - * lisp/gnus-sum.el (gnus-summary-reselect-current-group): Restore - the original code; hide group contents while rescanning. - -2000-01-07 Katsumi Yamaoka - - * lisp/gnus-sum.el (gnus-summary-reselect-current-group): Truncate - lines in the imitation buffer; turn off h-scrollbar for XEmacs. - -2000-01-07 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - - * lisp/{rfc2231.el,nnweb.el,nnultimate.el,nntp.el,nnspool.el, - nnslashdot.el,nnml.el,nnmh.el,nnkiboze.el,nnimap.el,gnus-topic.el, - gnus-ofsetup.el,gnus-offline.el,gnus-mlspl.el,gnus-cache.el, - gnus-agent.el}: Require `gnus-clfns' when compiling. - - * lisp/rfc2231.el: Require `cl' when compiling. - - * lisp/gnus-clfns.el: New file. - - * lisp/dgnushack.el: Move compiler macros to gnus-clfns.el; load - gnus-clfns.el. - - * lisp/gnus-sum.el (gnus-summary-reselect-current-group): Don't - rescan the current newsgroup before exiting; wear an imitation - summary buffer while rescanning. - -2000-01-06 Hirokazu FUKUI - - * lisp/dgnushack.el (char-before): Use the byte-optimaization. - -2000-01-05 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.14.1. - (gnus-revision-number): Clear to 00. - - * README.T-gnus: Update. - - * lisp/{webmail.el,uudecode.el,utf7.el,time-date.el,smiley.el, - score-mode.el,rfc2047.el,rfc1843.el,qp.el,pop3.el,parse-time.el, - nnweb.el,nnwarchive.el,nnvirtual.el,nnultimate.el,nntp.el, - nnspool.el,nnsoup.el,nnslashdot.el,nnml.el,nnmh.el,nnmbox.el, - nnmail.el,nnlistserv.el,nnkiboze.el,nnimap.el,nnheader.el, - nnfolder.el,nneething.el,nndraft.el,nndoc.el,nndb.el,nnbabyl.el, - nnagent.el,mml.el,mm-view.el,mm-uu.el,mm-util.el,mm-encode.el, - mm-decode.el,mm-bodies.el,messcompat.el,message.el,md5.el, - mail-source.el,mail-prsvr.el,lpath.el,imap.el,ietf-drums.el, - gnus-xmas.el,gnus-win.el,gnus-vm.el,gnus-uu.el,gnus-util.el, - gnus-undo.el,gnus-topic.el,gnus-sum.el,gnus-start.el,gnus-srvr.el, - gnus-spec.el,gnus-soup.el,gnus-setup.el,gnus-score.el,gnus-salt.el, - gnus-range.el,gnus-picon.el,gnus-nocem.el,gnus-msg.el, - gnus-mlspl.el,gnus-mh.el,gnus-mailcap.el,gnus-logic.el, - gnus-load.el,gnus-kill.el,gnus-group.el,gnus-gl.el,gnus-ems.el, - gnus-draft.el,gnus-demon.el,gnus-cus.el,gnus-cite.el,gnus-cache.el, - gnus-bcklg.el,gnus-audio.el,gnus-async.el,gnus-art.el, - gnus-agent.el,binhex.el,base64.el,ChangeLog}: Sync up with Gnus - v5.8.3. - - * texi/{postamble.tex,message.texi,gnus.texi,gnus-ja.texi, - emacs-mime.texi,ChangeLog}: Sync up with Gnus v5.8.3. - -2000-01-05 Katsumi Yamaoka - - * README.semi, README.semi.ja, texi/gnus-faq-ja.texi: Update for - the new CVS server. - - * lisp/gnus-sum.el (gnus-articles-to-read): Bind - `cursor-in-echo-area' to nil while `read-from-minibuffer'. - -1999-12-30 Tsukamoto Tetsuo - - * lisp/gnus-offline.el (TopLevel): Call - `define-process-argument-editiong' only under Meadow -- i.e. don't - call this function under NTEmacs. - -1999-12-28 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 15. - - * lisp/gnus-offline.el (gnus-offline-auto-expire): Rename from - `gnus-offline-agent-automatic-expire'. - (gnus-agent-expire): Fix the advice. - (gnus-offline-after-jobs-done): Refer to - `gnus-offline-auto-expire'. - - * lisp/gnus-ofsetup.el (gnus-offline-resource-en): Reorder the - messages. - (gnus-offline-resource-ja): Ditto. - - * lisp/imap.el (imap-ssl-open-2): If `system-type' is windows-nt, - bind `coding-system-for-read' to raw-text-dos, else bind it to - binary. - -1999-12-28 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 14. - - * lisp/dgnushack.el (mapcon): Bind the 1st arg `fn' as a temp var. - -1999-12-27 Tsukamoto Tetsuo - - * lisp/pop3.el (pop3-ssl-program-arguments): Add "s_client". - (pop3-open-ssl-stream-1): Bind `ssl-program-name' because its - value depends on the version of ssl.el. - (pop3-open-ssl-stream): If `system-type' is windows-nt, bind - `coding-system-for-read' to raw-text-dos, else bind it to binary. - -1999-12-23 Keiichi Suzuki - - * lisp/gnus-bbdb.el (gnus-bbdb/update-record): Fix timing of - `save-restriction'. - -1999-12-21 Daiki Ueno - - * lisp/imap.el (imap-streams,imap-stream-alist, - imap-authenticators,imap-authenticator-alist, - imap-digest-md5-p): Sync with latest Gnus. - (imap-starttls-p): Rename from `imap-tls-p'. - (imap-starttls-open): Rename from `imap-tls-open'. - -1999-12-21 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 13. - - * lisp/dgnuspath.el.in: Add the path of APEL to `load-path' as well - as its parent directory. - - * lisp/imap.el (base64-encode-string, base64-decode-string): - Autoload "base64" instead of the tricky definitions. - - * lisp/base64.el: Restore the original code and invalidate it; use - mel for the base64 codec. - -1999-12-20 Katsumi Yamaoka - - * lisp/imap.el (mel-find-function): Always require `mel' instead of - the use of autoloading. Because the function `mel-find-function' - is defined by `defsubst'. - -1999-12-18 Tsukamoto Tetsuo - - * lisp/gnus-offline.el (gnus-offline-after-get-new-news): Refer to - `gnus-offline-connected', not `gnus-plugged'. - - * lisp/gnus-ofsetup.el (gnus-setup-for-offline): No need to use - `unless'. Use `when'. - - * lisp/imap.el (base64-encode-string): Fix. May work. - -1999-12-16 Katsumi Yamaoka - - * lisp/message.el (message-goto-mail-copies-to): If the field is - newly created, a string "never" is inserted in default. - (message-goto-mail-followup-to): If the field is newly created and - To field contains only one address, the address is inserted in - default. - (message-mode-map): New key stroke `C-c C-f c' for the command - `message-goto-mail-copies-to'. - -1999-12-15 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 12. - - * lisp/nnimap.el (nnimap-request-newgroups): Use `member-if'. - - * lisp/lpath.el (toolbar-gnus, get-charset-property, - font-lock-set-defaults, find-coding-system, coding-system-get): - Bind them for FSF Emacsen. - (read-color, x-defined-colors, compute-motion): Don't bind. - - * lisp/imap.el (imap-digest-md5-auth, imap-cram-md5-auth): Use - `base64-encode-string' and `base64-decode-string' instead of - `imap-base64-encode-string' or `imap-base64-decode-string'. - (base64-encode-string): New function. It won't be defined if it - is already bound and the optional second arg is allowed. - (base64-decode-string): New function defined by `defun-maybe'. - (imap-base64-encode-string, imap-base64-decode-string): Remove. - (mel-find-function): Autoload "mel". - - * lisp/dgnushack.el (read-color, x-defined-colors, event-object, - get-popup-menu-response, toolbar-gnus, get-charset-property, - find-coding-system, coding-system-get, font-lock-set-defaults): - Don't bind. - (union, member-if, mapcon, mapc, last): Don't define as compiler - macros under XEmacs. It is based on Hrvoje's advice. - (member-if): New compiler macro for emulating cl function. - -1999-12-14 Katsumi Yamaoka - - * lisp/imap.el (imap-base64-encode-string): Use `static-if' instead - of `static-condition-case'. - -1999-12-14 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 11. - - * lisp/imap.el (imap-base64-encode-string): Allow the optional 2nd - arg `no-line-break'. - -1999-12-14 Daiki Ueno - - * lisp/imap.el: Require `digest-md5' when compiling; add autoload - settings for `digest-md5-parse-digest-challenge' and - `digest-md5-digest-response'. - (imap-authenticators): Add `digest-md5'. - (imap-authenticator-alist): Setup for `digest-md5'. - (imap-digest-md5-p): New function. - (imap-digest-md5-auth): New function. - -1999-12-12 Tsukamoto Tetsuo - - * lisp/mail-source.el (mail-source-fetch-imap): Each temporary - buffer name must be specific to its mail source. - -1999-12-11 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 10. - - * lisp/gnus-offline.el (gnus-offline-define-menu-and-key): Don't - call too many `static-if's. - - * lisp/gnus-uu.el (gnus-uu-grab-move): Simply copy FILE if - `make-symbolic-link' is not availabe. - - * lisp/lpath.el (TopLevel): Don't warn about `make-symbolic-link'. - -1999-12-11 Tsukamoto Tetsuo - - * lisp/gnus-offline.el (gnus-offline-set-unplugged-state): Call - the original `gnus-agent-toggle-plugged'. - - * lisp/mail-source.el (mail-source-fetch-imap): Don't create - multiple temporary buffers, and don't kill one. - -1999-12-10 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 09. - - * lisp/gnus-ofsetup.el (gnus-setup-for-offline): Accept an - optional argument `force'. Use `read-file-name' instead of - `read-directory-name'. - -1999-12-10 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-numbser): Increment to 08. - - * lisp/gnus-agent.el (gnus): Give up to advise here. - (gnus-group-get-new-news): New advice instead. - - * lisp/gnus-offline.el (gnus-offline-setup): Call - `gnus-offline-processed-by-timer' and `gnus-offline-error-check' - here. - (gnus-offline-define-menu-and-key): Simplify. - (gnus-offline-processed-by-timer): Call `gnus-group-get-new-news' - interactively. - - * lisp/gnus-ofsetup.el (TopLevel): Require `read-passwd' here, not in - `gnus-offline-setting-file'. - (gnus-nntp-service): Set this variable here, not in - `gnus-offline-setting-file' - (gnus-nntp-server): Ditto. - (gnus-after-getting-new-news-hook): Ditto. - (message-send-hook): Ditto. - (mail-source-read-passwd): Ditto. - (gnus-setup-news-hook): Ditto. - (gnus-setup-for-offline): Now one can get mails from `imap', - `file', `directory' or `maildir'. - - * lisp/read-passwd.el (read-pw-set-mail-source-passwd-cache): - Ignore non-POP mail sources. - -1999-12-10 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 07. - - * lisp/gnus-util.el (gnus-union): Remove. - (gnus-ems-redefine): Don't call it; don't require `gnus-ems'. - - * lisp/gnus-agent.el (gnus-agent-fetch-headers): Use `union' - instead of `gnus-union'. - -1999-12-10 A.Hitachi - Katsumi Yamaoka - - * lisp/dgnushack.el (union): New compiler macro for emulating cl - function. - -1999-12-10 Katsumi Yamaoka - - * lisp/gnus-util.el: Require `gnus-ems'. - (gnus-ems-redefine): Call it to redefine the functions - `gnus-truncate-string', etc. - (gnus-union): Fix doc string. - - * lisp/dgnushack.el (mapcon, mapc): Eliminate the redundant code. - -1999-12-09 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 06. - -1999-12-09 Tsukamoto Tetsuo - - * lisp/dgnushack.el (dgnushack-install-package): Preserve any file - in $(PACKAGEDIR)/lisp/t-gnus if it is without .el or .elc suffix. - -1999-12-09 Katsumi Yamaoka - - * lisp/dgnushack.el (mapcon): New compiler macro for emulating cl - function. - (mapc): Bug fix - treat the last arg as a list. - -1999-12-08 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 05. - - * lisp/gnus-agent.el (gnus): New advice. Always synchronize the - modeline "Plugged" status display with the value of - `gnus-plugged'. - - * lisp/gnus-offline.el (TopLevel): Require `gnus-group' at the - compile time. - (gnus-offline-set-online-sendmail-function): defsubst. - (gnus-offline-set-offline-sendmail-function): Ditto. - (gnus-offline-set-offline-post-news-function): Ditto. - (gnus-offline-set-online-post-news-function): Ditto. - (gnus-offline-disable-fetch-mail): Ditto. - (gnus-offline-enable-fetch-mail): Ditto. - (gnus-offline-setup): Fix typo. - (gnus-offline-gnus-get-new-news): Abolish. - (gnus-offline-toggle-plugged): Ditto. - (gnus-offline-agent-expire): Ditto. - (gnus-group-get-new-news): New advice which does things - `gnus-offline-gnus-get-new-news' was doing. - (gnus-agent-toggle-plugged): New advice which does thing - `gnus-offline-toggle-plugged' was doing. - (gnus-agent-expire): New advice which does things - `gnus-offline-agent-expire' was doing. - (gnus-offline-define-menu-and-key): No longer substitute key - definitions on `gnus-group-mode-map'. No longer swap commands for - a toolbar button. - (gnus-offline-after-get-new-news): Do jobs only when - `gnus-plugged' is t. - - * lisp/gnus-ofsetup.el (gnus-ofsetup-customize): Compile lambda - expressions. - -1999-12-08 Katsumi Yamaoka - - * lisp/message.el (message-yank-add-new-references): Fix doc string. - - * texi/{message-ja.texi, message.texi} - (message-list-references-add-position, - message-yank-add-new-references): Add documentations. - -1999-12-07 Tsukamoto Tetsuo - - * lisp/gnus-offline.el (gnus-offline-gettext): Rename from - `gnus-offline-get-message'. - - * lisp/gnus-ofsetup.el (gnus-ofsetup-gettext): Rename from - `gnus-ofsetup-get-message'. - -1999-12-07 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 04. - (smiley-toggle-buffer): Autoload "smiley" or "gnus-bitmap". - - * lisp/gnus-art.el (gnus-article-prepare-mime-display): Don't use - `get-text-property' in the outside of the boundary. - (gnus-article-smiley-display): New function. - (gnus-treatment-function-alist): Use it. - - * lisp/dgnushack.el (byte-optimize-form-code-walker): Replace with - the bug fixed version rigidly instead of the use of `defadvice'. - - * lisp/message.el (font-lock-after-change-function): Don't use - `compile' for the arg of `defadvice'. - -1999-12-06 Keiichi Suzuki - - * lisp/message.el (message-yank-add-new-references): New option - value `message-id-only'. - (message-yank-original): Likewise. - (message-list-references-add-position): New user option. - (message-list-references): When - `message-list-references-add-position' is integer value, the order - of designate number message-ids is kept. - -1999-12-06 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 03. - - * lisp/gnus-offline.el (gnus): Don't advise here. - (TopLevel): Call `gnus-offline-define-menu-and-key'. - (gnus-offline-setup): Don't call - `gnus-offline-define-menu-and-key' here. - - * lisp/gnus-ofsetup.el (gnus-offline-update-setting-file): Don't - rely on `gnus-load-hook'. - (gnus): New advice. Call `gnus-offline-setup' when everything is - done. - - * lisp/gnus-start.el (save-buffers-kill-emacs): Compile the advice - at the compile time. Use `gnus-alive-p'. - -1999-12-06 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 02. - - * lisp/dgnushack.el (char-after): Uncomment the byte-optimization; - don't use `byte-defop-compiler'. - (byte-optimize-form-code-walker): Advise it for fixing the bug in - and/or forms. The original idea is devised by FUKUI-san, modified - by KOBAYASHI-san. - (max-specpdl-size): Set 3000. - -1999-12-05 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - - * lisp/gnus-offline.el (gnus): New advice. synchronize - `gnus-offline-connected' with `gnus-plugged'. - -1999-12-04 Daiki Ueno - - * lisp/gnus.el (gnus-version-number): Update to 6.14.0. - (gnus-revision-number): Clear to 00. - - * README.branch.ja: Update for t-gnus-6_14 branch. - * README.branch: Ditto. - * README.T-gnus: Ditto. - * README.semi.ja: Ditto. - * README.semi: Ditto. - - * lisp/{rfc2047.el,nnweb.el,nnultimate.el,nntp.el,nnslashdot.el, - nnmh.el,nnfolder.el,nndoc.el,mml.el,mm-view.el,mm-util.el, - mm-bodies.el,message.el,mail-source.el,gnus.el,gnus-uu.el, - gnus-sum.el,gnus-start.el,gnus-msg.el,gnus-int.el,gnus-cache.el, - gnus-art.el,dgnushack.el,ChangeLog}: Sync up with Gnus v5.8.2. - - * texi/{message.texi,message-ja.texi,gnus.texi,gnus-ja.texi, - gnus-faq-ja.texi,ChangeLog}: Modify for T-gnus 6.14; sync up with - Gnus v5.8.2. - - * t-gnus-6_14: NEW PUBLIC BRANCH. - -1999-12-03 Hirokazu FUKUI - Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - - * lisp/dgnushack.el (char-before): Use compiler macro instead of - byte-optimizer. - (char-after): Comment out the byte-optimization. - - * imap.el (imap-base64-encode-string, imap-base64-decode-string): - New functions. They are identical to the built-in codec if - possible, otherwise the functions defined in mel are used. - (imap-cram-md5-auth): Use them. - -1999-12-02 Katsumi Yamaoka - - * lisp/imap.el: Remove autoload settings for `base64-decode-string' - and `base64-encode-string'. - -1999-12-02 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.13.4. - (gnus-revision-number): Clear to 00. - - * README.T-gnus: Update. - - * GNUS-NEWS: Sync up with Pterodactyl Gnus v0.99. - - * lisp/{rfc2047.el,rfc1843.el,nnweb.el,nnvirtual.el,nntp.el, - nnmh.el,nnmail.el,nnimap.el,nnheader.el,nnfolder.el,nndraft.el, - nndoc.el,mml.el,mm-view.el,mm-uu.el,mm-util.el,mm-encode.el, - mm-decode.el,mm-bodies.el,message.el,mail-source.el,lpath.el, - gnus-xmas.el,gnus-uu.el,gnus-util.el,gnus-topic.el,gnus-sum.el, - gnus-start.el,gnus-srvr.el,gnus-spec.el,gnus-score.el,gnus-salt.el, - gnus-picon.el,gnus-msg.el,gnus-mailcap.el,gnus-int.el, - gnus-group.el,gnus-ems.el,gnus-cus.el,gnus-cache.el,gnus-async.el, - gnus-art.el,gnus-agent.el,dgnushack.el,base64.el,Makefile.in, - ChangeLog}: Sync up with Pterodactyl Gnus v0.99. - - * lisp/{webmail.el,nnwarchive.el,nnultimate.el,nnslashdot.el}: New - files. - - * texi/{message.texi,message-ja.texi,gnus.texi,gnus-ja.texi, - emacs-mime.texi,Makefile.in,ChangeLog}: Sync up with Pterodactyl - Gnus v0.99. - -1999-12-02 Katsumi Yamaoka - - * lisp/gnus.el (gnus-select-method): Undo (`if' -> `when'). - * lisp/gnus-picon.el (gnus-picons-file-suffixes): Ditto. - * lisp/gnus-start.el (save-buffers-kill-emacs): Ditto. - (gnus-after-getting-new-news-hook): Ditto. - - * lisp/gnus-group.el (gnus-useful-groups): Undo (`or' -> `unless'). - -1999-12-01 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 10. - - * lisp/gnus-art.el (article-treat-overstrike): Work for multibyte - char with old Emacsen as well. - -1999-12-01 Daiki Ueno - - * lisp/gnus-agent.el (gnus-category-edit-predicate): Expand `setf' - appears in the backquoted form. - (gnus-category-edit-score): Ditto. - - * lisp/gnus-sum.el (gnus-data-set-header): Expand `setf' - appears in the backquoted form. - -1999-11-30 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 09. - - * lisp/gnus-offline.el (gnus-offline-define-menu-and-key): Fix a - bug -- do add-hook. - (gnus-offline-popup): Examine whether `easy-menu-create-menu' is - defined. If not, call `easy-menu-create-keymaps'. - -1999-11-30 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 08. - - * lisp/gnus-offline.el (TopLevel): Use `static-if', requiring - "static" at the compile time. - (gnus-offline-hangup-function): Abolish. - (gnus-offline-auto-ppp): New variable. - (gnus-offline-gnus-get-new-news): Refer to it. - (gnus-offline-set-unplugged-state): Ditto. - (gnus-offline-set-auto-ppp): New function. It replaces the - function `gnus-offline-toggle-auto-hangup'. - (gnus-offline-toggle-auto-hangup): Abolish. - (gnus-offline-define-menu-and-key): Use `static-if' and - `static-cond'. - (gnus-offline-popup-menu): Do not define this function under XEmacs. - (gnus-offline-popup): New function. - - * gnus-ofsetup.el (gnus-ofsetup-update-setting-file): Typo. - (gnus-ofsetup-resource-en): Fix doc strings. - (gnus-ofsetup-resource-ja): Ditto. - -1999-11-30 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 07. - - * lisp/gnus-art.el (gnus-article-wash-status): Sync up with - Pterodactyl Gnus v0.98. - -1999-11-30 Katsumi Yamaoka - - * lisp/nnimap.el (nnimap-request-newgroups): Don't use `member-if'. - - * lisp/gnus.el (gnus-select-method): Use `if' instead of `when'. - - * lisp/gnus-sum.el (gnus-summary-make-marking-command-1): Use - `car' and `cdr' instead of `cadr'. - - * lisp/gnus-picon.el (gnus-picons-file-suffixes): Use `cons' - instead of `push'; use `if' instead of `when'. - - * lisp/gnus-group.el (gnus-group-iterate): Use `car' and `cdr' - instead of `pop'. - (gnus-useful-groups): Use `or' instead of `unless'. - - * lisp/gnus-art.el (gnus-emphasis-alist): Use `car' and `cdr' - instead of `cadr'. - -1999-11-30 Katsumi Yamaoka - - * lisp/gnus-start.el (save-buffers-kill-emacs): Don't use the macro - `when' in the body of `defadvice'. Use `if' instead. - - * lisp/dgnushack.el (last, mapc): New compiler macros for emulating - cl functions. - -1999-11-29 Katsumi Yamaoka - - * lisp/gnus-start.el (gnus-after-getting-new-news-hook): Don't use - the macro `when' in the arg of `defcustom'. Use `if' instead. - -1999-11-27 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 06. - - * lisp/gnus-art.el (gnus-signature-toggle): Specify the 4th arg of - `next-single-property-change' LIMIT as `point-max'. - (gnus-article-prepare-mime-display): Ditto. - (article-hide-signature): Ditto. - -1999-11-26 NAKAJI Hiroyuki - - * lisp/gnus.el (gnus-version): Parentheses of gnus-revision-number - are removed to fill gnus-version within 80 columns. - -1999-11-25 NAKAJI Hiroyuki - - * lisp/gnus.el (gnus-version): Shows also gnus-revision-number. - -1999-11-24 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 05. - - * lisp/gnus-agent.el (gnus-agent-fetch-headers): Use `gnus-union' - instead of `union'. - - * lisp/gnus-util.el (gnus-union): New function. - - * lisp/gnus-sum.el (gnus-summary-exit-no-update): Use - `copy-sequence' instead of `copy-list'. - * lisp/gnus-art.el (gnus-article-setup-highlight-words): Ditto. - - * lisp/dgnushack.el (union, copy-list): Remove compiler macros. - -1999-11-24 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 04. - - * lisp/dgnushack.el (union, copy-list): New compiler macros for - emulating cl functions. - -1999-11-22 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 03. - (gnus-select-method): Use `condition-case' instead of - `ignore-errors'. - - * lisp/gnus-start.el (gnus-site-init-file): Use `condition-case' - instead of `ignore-errors'. - - * lisp/{gnus-ofsetup.el,gnus-offline.el}: Remove RCS magic cookie. - - * lisp/{time-date.el,smiley.el,score-mode.el,pop3.el,nnweb.el, - nnvirtual.el,nntp.el,nnspool.el,nnsoup.el,nnoo.el,nnml.el,nnmh.el, - nnmbox.el,nnmail.el,nnlistserv.el,nnimap.el,nnheader.el, - nneething.el,nndraft.el,nndoc.el,nnbabyl.el,message.el,imap.el, - gnus-win.el,gnus-vm.el,gnus-util.el,gnus-topic.el,gnus-sum.el, - gnus-start.el,gnus-srvr.el,gnus-spec.el,gnus-score.el,gnus-salt.el, - gnus-range.el,gnus-picon.el,gnus-ofsetup.el,gnus-offline.el, - gnus-msg.el,gnus-mlspl.el,gnus-mailcap.el,gnus-logic.el, - gnus-kill.el,gnus-group.el,gnus-cite.el,gnus-async.el,gnus-art.el, - gnus-agent.el,earcon.el}: Require `cl' using `eval-when-compile'. - -1999-11-22 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 02. - - * lisp/{time-date.el,smiley.el,pop3.el,nnweb.el,nnvirtual.el, - nntp.el,nnspool.el,nnsoup.el,nnoo.el,nnml.el,nnmh.el,nnmbox.el, - nnmail.el,nnlistserv.el,nnimap.el,nnheader.el,nneething.el, - nndoc.el,nnbabyl.el,message.el,imap.el,gnus.el,gnus-win.el, - gnus-util.el,gnus-topic.el,gnus-sum.el,gnus-start.el,gnus-srvr.el, - gnus-spec.el,gnus-score.el,gnus-salt.el,gnus-range.el, - gnus-picon.el,gnus-ofsetup.el,gnus-offline.el,gnus-mlspl.el, - gnus-mailcap.el,gnus-logic.el,gnus-kill.el,gnus-group.el, - gnus-cite.el,gnus-async.el,gnus-art.el,gnus-agent.el,earcon.el}: - Require `cl' at the top level. - - * lisp/gnus.el (gnus-select-method): Undo last change. - * lisp/gnus-util.el (copy-list): Undo last change (remove it). - * lisp/gnus-start.el (gnus-site-init-file): Undo last change. - - * lisp/gnus-ems.el (gnus-split-string): Remove. - -1999-11-21 Daiki Ueno - - * lisp/pop3.el: Add description about STLS extension; add autoload - setting for `starttls-open-stream' and `starttls-negotiate'. - (pop3-stls): New function. - (pop3-open-tls-stream): New function. - (pop3-open-server): Use `pop3-open-tls-stream' if - 'pop3-connection-type' is bound to `tls'. - -1999-11-20 Daiki Ueno - - * lisp/imap.el: Add autoload setting for `starttls-open-stream' - and `starttls-negotiate'. - (imap-stream-alist): Add TLS entry. - (imap-tls-p): New function. - (imap-tls-open): New function. - (imap-ssl-open): Enclose `open-ssl-stream' with - `as-binary-process'. - -1999-11-19 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - (gnus-select-method): Use `condition-case' instead of - `ignore-errors'. - - * lisp/pop3.el (pop3-apop): Move the autoload seting to the top - level. - - * lisp/md5.el (md5): Allow the optional 4th and 5th arguments - `coding' and `noerror' for the stopgaps. - - * lisp/lpath.el (md5): Allow the optional 4th and 5th arguments - `coding' and `noerror'. - (function-max-args): Maybe-fbind for FSF Emacsen. - - * lisp/imap.el (imap-cram-md5-auth): Specify the 4th arg to `md5' - as `binary' if possible. - (imap-log): Default to nil (synched with pgnus 0.99). - (base64-decode-string): Autoload "mel" instead of "base64". - (md5): Autoload "md5" without `eval-and-compile'. - - * lisp/gnus-util.el (copy-list): New function defined by - `defun-maybe'. - - * lisp/gnus-sum.el (gnus-update-summary-mark-positions): Specify - the 3rd arg of `make-full-mail-header' to "nobody" instead of "". - - * lisp/gnus-start.el (gnus-site-init-file): Use `condition-case' - instead of `ignore-errors'. - - * lisp/gnus-picon.el: Require `cl'. - - * lisp/{smiley.el,rfc2104.el,nnvirtual.el,mailheader.el, - gnus-offline.el} (cl): Enclose the requiring procedure with - `eval-when-compile'. - - * lisp/{imap.el,gnus-mailcap.el} (cl): Enclose the requiring - procedure with `eval-when-compile' instead of `eval-and-compile'. - -1999-11-09 Yoshiki Hayashi - - * lisp/read-passwd.el (read-pw-set-mail-source-passwd-cache): - Use mail-sources instead of nnmail-spool-file. - From: Toshiaki -PCX- Tanaka. - -1999-11-09 Katsumi Yamaoka - - * lisp/gnus.el (gnus-group-startup-message): Insert space before - "based on". - * lisp/gnus-xmas.el (gnus-xmas-group-startup-message): Ditto. - -1999-11-09 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.13.3. - (gnus-revision-number): Clear to 00. - - * README.T-gnus: Update. - - * lisp/{rfc1843.el,qp.el,nntp.el,nnmail.el,nnfolder.el,nnagent.el, - mml.el,mm-view.el,mm-uu.el,mm-util.el,mm-decode.el,mm-bodies.el, - message.el,mail-source.el,lpath.el,gnus-util.el,gnus-topic.el, - gnus-sum.el,gnus-start.el,gnus-srvr.el,gnus-msg.el,gnus-mailcap.el, - gnus-group.el,gnus-art.el,gnus-agent.el,dgnushack.el,binhex.el, - ChangeLog}: Sync up with Pterodactyl Gnus v0.98. - - * lisp/{rfc2104.el,nnimap.el,imap.el}: New files. - - * texi/gnus-ja.texi: Sync up with Pterodactyl Gnus v0.98 without - translation. - - * texi/{gnus.texi,ChangeLog}: Sync up with Pterodactyl Gnus v0.98. - -1999-11-08 Kinji Itoh - - * lisp/gnus-draft.el (gnus-draft-edit-message): Use - `message-save-drafts' instead of `set-buffer-modified-p' and - `save-buffer'. - * lisp/message.el (message-save-drafts): Insert In-Reply-To header - because the reply data is lost in Drafts. - * lisp/gnus-art.el (gnus-signature-face): Don't check - window-system type. - -1999-11-08 Daiki Ueno - - * lisp/pop3.el (pop3-progress-message): New function. - (pop3-movemail): Use it. - -1999-10-28 Katsumi Yamaoka - - * lisp/gnus.el (TopLevel): Autolaod "gnus-msg" for the function - `gnus-following-method'. - - * lisp/gnus-msg.el (gnus-following-method): Move from gnus-msg.el; - wide reply as a mail if the message is not a news; use the macro - `gnus-setup-message'. - - * lisp/gnus-art.el (gnus-following-method): Move to gnus-msg.el. - -1999-10-26 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 14. - (TopLevel): Autoload "gnus-bitmap" instead of "smiley-mule" for the - function `gnus-smiley-display'. - - * lisp/gnus-art.el (gnus-treat-display-smileys): Default to nil if - `window-system' is nil. - (gnus-article-x-face-command): Default to external command if - `window-system' is nil. - -1999-10-26 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 13. - (TopLevel): Rearrange autoload settings. - - * lisp/gnus-art.el (gnus-treatment-function-alist): Don't use - `smiley-buffer'. - - * lisp/gnus-sum.el (gnus-summary-make-menu-bar): Add button - "Toggle smileys" in "Washing" menu. - (gnus-summary-wash-map): Add "s" key for `smiley-toggle-buffer'. - - * lisp/smiley.el (gnus-smiley-display): Use `smiley-toggle-buffer'. - (smiley-toggle-buffer): New function. - (smiley-buffer): Don't quote the function. - (smiley-toggle-extents): Ditto. - -1999-10-24 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 12. - (TopLevel): Add and delete autoloads for functions defined in - "gnus-cus", "gnus-offline", "miee", "pop3-fma" and "mw32misc". - - * lisp/gnus-offline.el (TopLevel): Do not consider the functions - defined in "miee". - - * lisp/gnus-ofsetup.el (TopLEvel): Do not autoload - `gnus-custom-mode' defined in "gnus-cus". - -1999-10-21 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 11. - - * lisp/gnus-offline.el (TopLevel): Call `mime-set-field-decoder' - when "eword-decode" is loaded. It is for X-Gnus-Offline-Backend - header. - -1999-10-19 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 10. - (TopLevel): Autoload "x-face-mule" and "smiley-mule" for the - functions `x-face-mule-gnus-article-display-x-face' and - `smiley-buffer'. - - * lisp/lpath.el (smiley-encode-buffer): Bind it for FSF Emacsen. - - * lisp/gnus-ems.el (gnus-group-startup-message): Don't replace with - `gnus-mule-group-startup-message'. - (gnus-mule-group-startup-message): Remove. - (gnus-mule-bitmap-image-file): Remove. - - * lisp/gnus-msg.el (gnus-copy-article-buffer): Encode smileys to - ordinary text if the feature `smiley-mule' is provided and FSF - Emacs is used. - (TopLevel): Require `static' at the compile time. - - * lisp/gnus-art.el (gnus-article-prepare-display): Bind - `mime-display-text/plain-hook' to nil. - (gnus-article-prepare-mime-display): Use `let' instead of `let*'; - treat the next entity position as a marker. - (gnus-treatment-function-alist): Use `smiley-buffer' instead of - `gnus-smiley-display' under FSF Emacsen. - (gnus-treat-display-smileys): Default to t if the module - `smiley-mule' is installed. - (gnus-treat-display-xface): Default to `head' if the value of - `gnus-article-x-face-command' is - `x-face-mule-gnus-article-display-x-face'. - (gnus-article-x-face-command): Default to - `x-face-mule-gnus-article-display-x-face' if the module - `x-face-mule' is installed. - (TopLevel): Require `static' first; require `path-util'. - -1999-10-18 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 09. - - * lisp/message.el (message-mode): Make - `message-font-lock-last-position' as buffer local. - (message-font-lock-keywords-2): Use - `message-font-lock-cited-text-matcher' instead of regexp. - (message-font-lock-cited-text-matcher): New function. - (font-lock-after-change-function): Advice to the keep last cursor - position in `message-font-lock-last-position' before fontifying. - (message-font-lock-last-position): New variable. - (message-font-lock-citation-name-max-column): New variable. - (message-font-lock-cited-text-regexp): New variable. - (message-font-lock-fence-close-position): New variable. - (message-font-lock-fence-open-position): New variable. - (message-font-lock-fence-close-regexp): New variable. - (message-font-lock-fence-open-regexp): New variables. - -1999-10-04 Masatoshi Tsuchiya - - * lisp/message.el (message-mode): Rearrange `font-lock-defaults' - using `message-font-lock-keywords', `message-font-lock-keywords-1' - and `message-font-lock-keywords-2'. - (message-font-lock-keywords): Restruct. - (message-font-lock-keywords-1): New variable split from - `message-font-lock-keywords'. - (message-font-lock-keywords-2): Ditto. - -1999-10-11 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 08. - - * lisp/gnus-art.el (gnus-treat-article): Buttonize the signature - before highlighting or hiding it. - (gnus-article-buttonize-signature): New function. - (gnus-article-highlight-signature): Don't buttonize. - (gnus-treatment-function-alist): Undo the last change. - (gnus-treat-emphasize): Default to nil. - -1999-10-08 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 07. - (TopLevel): Autoload "gnus-art" for the function - `gnus-article-show-all'. - - * lisp/gnus-sum.el (gnus-summary-select-article): Expose all - hidden text if the command `gnus-summary-toggle-mime' is used. - - * lisp/gnus-art.el (gnus-signature-toggle): Don't hide the - following parts. - (gnus-article-highlight-signature): Work for forwarded messages. - (gnus-article-show-all): New function based on `article-show-all'. - (gnus-article-show-all-headers): Based on - `article-show-all-headers'. - (article-show-all-headers): New function to show all *HEADERS*. - (article-show-all): Show *ALL* literally. - (article-hide-signature): Work for forwarded messages. - (gnus-treatment-function-alist): Put `gnus-treat-hide-signature' - off after `gnus-treat-highlight-signature'. - -1999-10-08 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 06. - - * lisp/gnus-art.el (gnus-article-prepare-mime-display): Protect - against forwarded messages without MIME structure. - (gnus-treatment-function-alist): Move - 'gnus-treat-decode-article-as-default-mime-charset' to the top; - put `gnus-treat-emphasize' off after - `gnus-treat-highlight-headers'. - -1999-10-07 Yoshiki Hayashi - - * lisp/gnus.el (gnus-revision-number): Increment to 05. - -1999-10-07 Katsumi Yamaoka - - * lisp/gnus-art.el (gnus-treat-predicate): Examine whether the - argument is list or not before condition. - -1999-10-07 Yoshiki Hayashi - - * lisp/gnus-art.el (gnus-treat-predicate): Work for - (typep "something"). - -1999-10-07 Yoshiki Hayashi - - * lisp/gnus-art.el (gnus-article-prepare-display): - Pass argument nil as a condition to gnus-treat-article. - * lisp/gnus-art.el (gnus-article-prepare-mime-display): - Ditto. Also, treat last part of multipart article correctly. - -1999-10-06 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 04. - - * lisp/message.el (message-generate-headers): Don't insert - excessive newline. - - * lisp/gnus-xmas.el (gnus-xmas-group-startup-message): Don't use - negative number for the 2nd arg of `insert-char'. - -1999-10-06 Tsukamoto Tetsuo - - * lisp/gnus-ofsetup.el (gnus-ofsetup-customize): Info link to - gnus-ja instead of gnus if Japanese environment is on. - -1999-10-06 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 03. - (semi-gnus-developers): Remove. - (gnus-maintainer): Change mail address. - (gnus-group-startup-message): Display version string. - - * lisp/gnus-msg.el (gnus-bug): Delete `Cc'; modify version string. - - * lisp/gnus-xmas.el (gnus-xmas-group-startup-message): Display - version string; fix glyph position. - -1999-10-06 Yoshiki Hayashi - - * lisp/gnus-sum.el (gnus-read-move-group-name): Revert - to previous version until problem of respooling from - nnimap to nnml is solved. - (gnus-summary-move-article): Ditto. - -1999-10-05 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 02. - - * lisp/gnus-art.el (gnus-treat-predicate): Check whether arg's - value is t before checking for `condition'. - (gnus-article-prepare-mime-display): Search for the entity children - if the primary type is `multipart'. - -1999-10-01 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - - * lisp/gnus-sum.el (gnus-read-move-group-name): Returns nil - instead of signaling an error if the destination group is not - newly created. - (gnus-summary-move-article): Do nothing if the destination group - is not newly created. - - * lisp/gnus-msg.el (gnus-bug): Use text/plain for the snooped - environment part. - -1999-09-30 Daiki Ueno - - * nnfolder.el (nnfolder-possibly-change-group): Don't create an - active entry for the group even if it doesn't exist. - -1999-09-28 Daiki Ueno - - * gnus-art.el (gnus-article-mime-part-status): Use `mime-entity-children'. - -1999-09-28 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.13.2. - (gnus-revision-number): Clear to 00. - - * README.T-gnus: Update. - - * texi/{message.texi,message-ja.texi,gnus.texi,gnus-ja.texi, - emacs-mime.texi,ChangeLog}: Sync up with Pterodactyl Gnus v0.97. - - * lisp/{qp.el,nntp.el,nnmail.el,mml.el,mm-util.el,mm-encode.el, - mm-decode.el,message.el,mail-source.el,gnus.el,gnus-xmas.el, - gnus-util.el,gnus-sum.el,gnus-srvr.el,gnus-score.el,gnus-nocem.el, - gnus-msg.el,gnus-group.el,gnus-cache.el,gnus-art.el,gnus-agent.el, - ChangeLog}: Sync up with Pterodactyl Gnus v0.97. - -1999-09-24 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 07. - - * lisp/gnus-art.el (gnus-article-prev-page): Rewrite to realize - smooth scrolling under XEmacs. - (gnus-article-next-page):Ditto. - - * Mule23@1934.en, Mule23@1934.ja: Separate from Mule23@1934; add - descriptions about the problem of loaddefs.el and the patch for - CUSTOM 1.9962. - -1999-09-22 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 06. - - * lisp/nnmail.el (TopLevel): Bind keywords `:user', `:path' and - `:predicate' for old Emacsen; require `static'. - - * lisp/dgnushack.el (TopLevel): Don't bind keywords `:user', - `:path' and `:predicate'. - -1999-09-20 Daiki Ueno - - * gnus-agent.el (gnus-agent-toggle-plugged): Mark the current - modeline as modified. - -1999-09-17 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 05. - - * lisp/gnus-art.el (gnus-treat-article): Inherit the text property - `mime-view-entity' in the modified header under FSF Emacsen. - -1999-09-13 Tsukamoto Tetsuo - - * README-offline.en: Rewrite the usage description. - * README-offline.ja: Ditto. - -1999-09-12 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 04. - - * lisp/gnus-ofsetup.el (gnus-offline-lang): Declare before loading - `gnus-offline'. - -1999-09-12 Tsukamoto Tetsuo - - * README-offline.en: Do not refer to `gnus-agent-toggle-plugged'. - * README-offline.ja: Ditto. - -1999-09-11 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 03. - - * lisp/gnus-agent.el (gnus-agent-toggle-plugged): Do not mark - the current buffer as modified. - - * lisp/gnus-offline.el (gnus-offline-menu): New variable. - (gnus-offline-get-menu-items): New function. - (gnus-offline-define-menu-on-miee): Use it. - (gnus-offline-define-menu-on-agent): Ditto. - -1999-09-04 Daiki Ueno - - * lisp/gnus-msg.el (gnus-configure-posting-styles): Quote `:file'. - - * lisp/pop3.el (pop3-save-uidls): Don't use `dotimes' to check - backets of `pop3-uidl-obarray'; don't clear `pop3-uidl-obarray'. - (pop3-quit): Clear `pop3-uidl-obarray'. - -1999-09-03 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 02. - - * lisp/gnus-offline.el (gnus-offline-resource-en, - gnus-offline-resource-ja, - gnus-offline-resource-ja_complete): New variables. - (gnus-offline-get-message): News function. - (gnus-offline-error-check): Use it. - (gnus-offline-connect-server): Ditto. - (gnus-offline-get-new-news-function): Ditto. - (gnus-offline-set-mail-group-level): Ditto. - (gnus-offline-hangup-line): Ditto. - (gnus-offline-after-jobs-done): Ditto. - (gnus-offline-toggle-auto-hangup): Ditto. - (gnus-offline-toggle-on/off-send-mail): Ditto. - (gnus-offline-toggle-articles-to-fetch): Ditto. - (gnus-offline-empting-spool): Ditto. - (gnus-offline-set-interval-time): Ditto. - - * lisp/gnus-ofsetup.el (gnus-offline-lang, - gnus-ofsetup-resource-en, gnus-ofsetup-resource-ja): New - variables. - (gnus-ofsetup-get-message): New function. - (gnus-setup-for-offline): Use it. - (gnus-ofsetup-find-parameters): Ditto. - (gnus-ofsetup-prepapre-for-miee): Ditto. - (gnus-ofsetup-completing-read-symbol): Ditto. - (gnus-ofsetup-customize): Ditto. - (gnus-ofsetup-customize-done): Ditto. - -1999-09-01 Katsumi Yamaoka - - * lisp/gnus-sum.el (gnus-summary-isearch-article): Don't bind - `isearch-lazy-highlight'. - -1999-08-30 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - - * lisp/lpath.el (babel-as-string): Bind it. - - * lisp/gnus-sum.el (gnus-summary-search-article): Keep the - original X-Face field while searching. It is done for only FSF - Emacsen. - (gnus-summary-search-article-highlight-matched-text): Ditto. - (gnus-summary-search-article-matched-data): Bind it explicitly. - -1999-08-29 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.13.1. - (gnus-revision-number): Clear to 00. - - * README.T-gnus: Update. - - * README: Sync up with Pterodactyl Gnus v0.96. - * lisp/{smiley.el,nntp.el,nnmail.el,nnfolder.el,mml.el,mm-view.el, - mm-uu.el,mm-util.el,mm-encode.el,mm-decode.el,mm-bodies.el, - gnus-uu.el,gnus-util.el,gnus-sum.el,gnus-start.el,gnus-score.el, - gnus-mlspl.el,gnus-group.el,gnus-bcklg.el,gnus-art.el, - gnus-agent.el,ChangeLog}: Ditto. - * texi/{gnus.texi,gnus-ja.texi,ChangeLog}: Ditto. - -1999-08-27 Daiki Ueno - - * lisp/pop3.el (pop3-movemail): If the argument `crashbox' is t, - don't retrieve any incoming mails.; Don't filter articles here. - Use `convert-standard-filename' to generate fresh UIDL file names. - (pop3-get-message-numbers): Rewrite. - (pop3-save-uidls): Clear UIDL hash.; Use `with-temp-file' instead - of `with-temp-buffer'. - -1999-08-27 Tsukamoto Tetsuo - - * README-offline.ja : Fix. - - * lisp/gnus-offline.el (gnus-offline-agent-automatic-expire): - Fix typo. - - * lisp/gnus-ofsetup.el : Remove gnus-cus from compile time - requirements; Enclose the autoload for `gnus-custom-mode' with - `eval-and-compile'. - -1999-08-27 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 15. - - * lisp/dgnushack.el (char-before, char-after): Optimize byte code - for them before lpath.el is loaded. Because lpath.el requires - `poe' via `path-util'. [cf. ] - - * lisp/gnus-sum.el (gnus-summary-search-article): Search for - X-Face image if the regexp "^X-Face:" is specified. - (gnus-summary-search-article-highlight-matched-text): Use - `gnus-summary-search-article-highlight-goto-x-face'; maybe display - X-Face image if it is requested. - (gnus-summary-search-article-highlight-goto-x-face): New macro. - -1999-08-26 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 14. - - * lisp/gnus-sum.el (gnus-summary-search-article): Treat and - recenter the article when touchdown; popup the article buffer if - it is disappeared. - (gnus-summary-search-article-highlight-matched-text): Treat the - article before highlighting; use old style backquote syntax. - (gnus-summary-search-article-position-point): Fix the beginning - position; use old style backquote syntax. - (gnus-summary-select-article): Undo the last change. - (gnus-summary-display-article): Bind - `gnus-summary-search-article-matched-data' in the article buffer - locally. It is moved from `gnus-summary-select-article'. - -1999-08-25 NAKAJI Hiroyuki - - * texi/Makefile.in (EMACS): Use @EMACS@, not emacs directly. - (clean): Remove formatted info files. - (distclean): Just remove Makefile. - -1999-08-25 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 13. - - * lisp/gnus-agent.el (gnus-agent-large-newsgroup): New variable. - (gnus-agent-fetch-headers): Limit downloadable articles if the - number of unread articles exceeds `gnus-agent-large-newsgroup'. - (gnus-agent-expire): Do not expire saved or replied articles when - `gnus-agent-expire-all' is nil. - - * lisp/gnus-offline.el (gnus-offline-agent-automatic-expire): New - variable. - (gnus-offline-agent-expire): Check it; Bind - `gnus-agent-expire-all' to nil if `gnus-agent-expire-days' is 0. - (gnus-offline-after-jobs-done): Don't check - `gnus-agent-expire-all'. - - * lisp/gnus-ofsetup.el (gnus-offline-setting-file): Check if - `user-login-name' and `user-real-login-name' returns the same - value or not. - (gnus-ofsetup-prepare-for-miee): Write forms as a variable. - (gnus-ofsetup-update-setting-file): Ditto. - (gnus-ofsetup-prepare): New macro. - (gnus-setup-for-offline): Use it. - (gnus-ofsetup-customize-done): Ditto. - -1999-08-25 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 12. - - * lisp/gnus-sum.el (gnus-summary-search-article): Rearrange. - (gnus-summary-search-article-highlight-matched-text): Rearrange. - (gnus-summary-search-article-position-point): New macro. - (gnus-summary-search-article-matched-data): Rename from - `gnus-summary-search-article-matched-text'. - (gnus-summary-isearch-article): Bind `gnus-inhibit-treatment' to t; - use `gnus-article-show-all-headers' for exposing the visited - article. - (gnus-summary-select-article): Bind - `gnus-summary-search-article-matched-data' in the article buffer - locally. - - * lisp/gnus-art.el (gnus-treat-article): Don't treat the article - if the value of `gnus-inhibit-treatment' is non-nil. - (article-toggle-headers): Don't redisplay X-Face if the value of - `gnus-inhibit-treatment' is non-nil. - (gnus-article-treat-custom): Add new treatment variable `mime'. - -1999-08-25 Daiki Ueno - - * lisp/gnus-group.el (gnus-group-line-format): Fix typo in - documentation. - - * lisp/gnus-sum.el (gnus-summary-mode): Don't set - `gnus-newsgroup-incorporated' explicitly. - -1999-08-24 Katsumi Yamaoka - - * README.semi: Update for the recent a-ftp sites and directories. - * README.semi.ja: Ditto. - * texi/gnus-faq.texi: Ditto. - * texi/gnus-faq-ja.texi: Ditto. - -1999-08-24 Daiki Ueno - - * lisp/gnus.el (gnus-revision-number): Increment to 11. - (gnus-summary-incorporated-face): New face spec. - - * lisp/gnus-group.el (gnus-group-line-format-alist): Add - entry about the format specifier `w'. - (gnus-group-line-format): Fix documentation. - - * lisp/gnus-sum.el (gnus-summary-highlight): Highlight lines on - newly incorporated mails with `gnus-summary-incorporated-face'. - (gnus-newsgroup-incorporated): New variable. - (gnus-summary-local-variables): Add `gnus-newsgroup-incorporated'. - (gnus-summary-mode): Set `gnus-newsgroup-incorporated'. - - * lisp/nnmail.el (nnmail-new-mail-numbers): New function. - - * lisp/gnus-srvr.el (gnus-browse-foreign-server): Don't prepend - `K' if the group has already been subscribed. - -1999-08-24 Katsumi Yamaoka - - * lisp/gnus-sum.el (gnus-summary-isearch-article): Set - `isearch-lazy-highlight' t in the buffer locally; goto the - beginning of the buffer before searching. - - * lisp/gnus-util.el (gnus-eval-in-buffer-window): Select the last - selected frame. - -1999-08-23 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 10. - - * lisp/gnus-sum.el (gnus-summary-search-article): Highlight - matched text after the searching is done; call - `gnus-summary-select-article' with the args nil and t; bind - `gnus-treat-*' to nil. - (gnus-summary-search-article-highlight-matched-text): New macro - for highlighting matched text. It is bound at the compile time - only. - (gnus-summary-isearch-article): Call `gnus-summary-select-article' - with the args nil and t; bind `gnus-treat-*' to nil. - - * lisp/gnus-ems.el (gnus-x-splash): Change the foreground color of - `gnus-splash' to "Brown"; use `with-temp-buffer' instead of - `with-temp-file'; use `insert-file-contents-as-binary' instead of - `insert-file-contents'. - -1999-08-20 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 09. - - * lisp/gnus-offline.el: Fix comments. - (TopLevel): Delete the code for emulating custom. Do not inhibit - byte-compile-warnings, but hide useless ones. - (gnus-offline-dialup-program-arguments): defvar instead of - defcustom. - (gnus-offline-hangup-program-arguments): Ditto. - (gnus-offline-interval-time): Ditto. - (gnus-offline-dialup-program, gnus-offline-hangup-program, - gnus-offline-drafts-queue-type, gnus-offline-MTA-type): defvar. - (gnus-offline-disable-fetch-mail): Remove pop3-fma dependent - codes. - Set `mail-sources' instead of `nnmail-spool-file'. - (gnus-offline-enable-fetch-mail): Ditto. - (gnus-offline-toggle-movemail-program): Abolish. - (gnus-offline-define-menu-and-key): Modify according to it. - (gnus-offline-define-menu-on-miee): Ditto. - (gnus-offline-define-menu-on-agent): Ditto. - (gnus-offline-message-add-header): Bind temporary variables. - (gnus-offline-add-custom-header): Ditto. - (gnus-offline-restore-mail-group-level): Ditto. - - * lisp/gnus-ofsetup.el (TopLevel): Require gnus-cus and - gnus-offline at the compile time. Do not inhibit - byte-compile-warnings. - (gnus-setup-for-offline): Really bind all temporary variables. - (gnus-ofsetup-write-settting-file): Check if interval is a - integer. - Use `mail-sources' instead of `nnmail-spool-file'. - (gnus-ofsetup-update-setting-file): Redefine as a macro. - (gnus-ofsetup-prepare-for-miee): Ditto. - - * README-offline.en : Update. - * README-offline.ja : Ditto. - -1999-08-20 Daiki Ueno - - * lisp/gnus-sum.el (gnus-wheel-summary-scroll): Bind - `inhibit-read-only' to t; bind `buffer-read-only' to nil. - -1999-08-20 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 08. - -1999-08-19 Keiichi Suzuki - - * lisp/nnmail.el (nnmail-split-it): Match whole word for getting - group name with `\N'. - -1999-08-19 Daiki Ueno - - * lisp/gnus.el (gnus-revision-number): Increment to 07. - - * lisp/pop3.el (pop3-except-header-regexp): New variable. - (pop3-movemail): Don't retrieve messages whose headers are - matching `pop3-except-header-regexp'. - (pop3-top): New function. - (pop3-retr): Don't use `save-restriction'. - -1999-08-18 Daiki Ueno - - * lisp/pop3.el (pop3-get-extended-response): Fix regexp. - -1999-08-18 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 06. - - * lisp/gnus-art.el (mime-preview-over-to-next-method-alist): Use - `gnus-article-next-page' when the last page is not displayed. - (mime-preview-over-to-previous-method-alist): Use - `gnus-article-prev-page' when the first page is not displayed. - (gnus-next-page-map): Use `make-sparse-keymap' instead of - `make-keymap'; don't use `suppress-keymap'. - (gnus-insert-next-page-button, gnus-insert-prev-page-button): - Succeed to the value of the text property `mime-view-situation' in - the Next/Prev buttons; make `gnus-{next|prev}-page-map' have the - current local map as a parent under FSF Emacsen. - -1999-08-18 Daiki Ueno - - * lisp/pop3.el (pop3-retr): Undo last change. - -1999-08-17 Daiki Ueno - - * lisp/gnus.el (gnus-revision-number): Increment to 05. - - * lisp/pop3.el (pop3-get-extended-response): Enable timeout of - `accept-process-output'; Move point to the end of the normal - response. - (pop3-movemail): Add suffix to `pop3-uidl-file-name'. - (pop3-get-list): Abolish. - (pop3-retr): Don't use `save-restriction'. - (pop3-uidl): Don't use `condition-case' when checking UIDL support. - (pop3-list): Likewise. - -1999-08-17 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 04. - - * lisp/gnus-sum.el (gnus-wheel-summary-scroll): Use - `event-basic-type' instead of `event-button' under FSF Emacsen. - -1999-08-16 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 03. - -1999-08-16 Daiki Ueno - - * lisp/gnus-sum.el: Add `gnus-wheel-install' to - `gnus-summary-mode-hook'. - (gnus-use-wheel): New variable. - (gnus-wheel-scroll-amount): New variable. - (gnus-wheel-edge-resistance): New variable. - (gnus-wheel-summary-scroll): New function. - (gnus-wheel-install): New function. - -1999-08-16 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 02. - - * lisp/nnheader.el (make-full-mail-header-from-decoded-header): Use - `defun' instead of `defsubst'. - (make-full-mail-header): Ditto. - - * lisp/dgnushack.el (dgnushack-texi-format): Fold up long lines. - (TopLevel): Autoload "texinfmt" for avoiding byte compile warning. - -1999-08-16 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - - * lisp/gnus-draft.el (gnus-group-send-drafts): Say which message - is being sent. - - * lisp/gnus-ofsetup.el (gnus-ofsetup-completing-read-symbol): New - function from Nana-gnus. - (gnus-setup-for-offline): Rewrite. Bind all temporary variables. - (gnus-ofsetup-update-setting-file): Rename from - `gnus-ofsetup-write-setting-file'. - (gnus-ofsetup-find-parameters): Rename from - `gnus-ofsetup-parameters'. - (gnus-ofsetup-customize-done): Rewrite. - -1999-08-15 Daiki Ueno - - * pop3.el: Sync up with pop3.el version 2.04. - (pop3-leave-mail-on-server): New variable. - (pop3-maximum-message-size): New variable. - (pop3-uidl-file-name): New variable. - (pop3-uidl-support): New variable. - (pop3-uidl-obarray): New variable. - (pop3-movemail): Check message size on every retrieval. - (pop3-open-ssl-stream-1): Use new style macro. - (pop3-get-message-numbers): New function. - (pop3-get-list): New function. - (pop3-get-uidl): New function. - (pop3-get-unread-message-numbers): New function. - (pop3-save-uidls): New function. - (pop3-retr): Use `pop3-get-extended-response'. - (pop3-list): New implementation. - (pop3-uidl): New function. - (pop3-get-extended-response): New function. - -1999-08-04 Katsumi Yamaoka - - * lisp/gnus.el: T-gnus 6.13.0 is released. - -1999-08-04 Katsumi Yamaoka - - * ChangeLog.2: New file, rename from ChangeLog. - - * lisp/dgnushack.el (TopLevel): Rearrange. - - * README.branch.ja: Update for t-gnus-6_12 and t-gnus-6_13 branch. - * README.branch: Ditto. - - * texi/gnus-faq.texi: Replace ftp.jaist.ac.jp with ftp.etl.go.jp. - - * texi/gnus-faq-ja.texi: Modify for T-gnus 6.13. - * texi/message-ja.texi: Ditto. - * texi/message.texi: Ditto. - * texi/gnus-ja.texi: Ditto. - * texi/gnus.texi: Ditto. - * README-offline.ja: Ditto. - * README-offline.en: Ditto. - * README.semi.ja: Ditto. - * README.semi: Ditto. - * README.T-gnus: Ditto. - - * t-gnus-6_13: NEW PUBLIC BRANCH. - -See ChangeLog.2 for earlier changes. diff --git a/GNUS-NEWS b/GNUS-NEWS deleted file mode 100644 index 8f63ecb..0000000 --- a/GNUS-NEWS +++ /dev/null @@ -1,112 +0,0 @@ -GNUS NEWS -- history of user-visible changes. -Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. -See the end for copying conditions. - -Please send Gnus bug reports to bugs@gnus.org. -For older news, see Gnus info node "New Features". - - -* Changes in Oort Gnus - -** The nnml and nnfolder backends store marks for each groups. - -This makes it possible to take backup of nnml/nnfolder servers/groups -separately of .newsrc.eld, while preserving marks. It also makes it -possible to share articles and marks between users (without sharing -.newsrc.eld) within e.g. a department. - -** The menu bar (in Group and Summary buffer) named "Misc" has been - renamed to "Gnus". - -** The menu bar (in Message mode) named "MML" has been renamed to - "Attachments". - -** gnus-group-charset-alist and gnus-group-ignored-charsets-alist - -The regexps in these variables are compared with full group names -instead of real group names in 5.8. Users who customize these -variables should change those regexps accordingly. For example: - - ("^han\\>" euc-kr) -> ("\\(^\\|:\\)han\\>" euc-kr) - -** Gnus now supports PGP-MIME (RFC2015) and SMIME. - -** Gnus inlines external parts (message/external). - -** MML (Mime compose) prefix changed from `M-m' to `C-c C-m'. - -This change was made to avoid conflict with the standard binding of -`back-to-indentation', which is also useful in message mode. - - -* Changes in Pterodactyl Gnus (5.8/5.9) - -The Gnus NEWS entries are short, but they reflect sweeping changes in -four areas: Article display treatment, MIME treatment, -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. - -** Gnus has also been multilingualized. This also affects too -many parts of Gnus to summarize here, and adds many new variables. - -** gnus-auto-select-first can now be a function to be -called to position point. - -** The user can now decide which extra headers should be included in -summary buffers and NOV files. - -** `gnus-article-display-hook' has been removed. Instead, a number -of variables starting with `gnus-treat-' have been added. - -** The Gnus posting styles have been redone again and now works in a -subtly different manner. - -** New web-based backends have been added: nnslashdot, nnwarchive -and nnultimate. nnweb has been revamped, again, to keep up with -ever-changing layouts. - -** Gnus can now read IMAP mail via nnimap. - - -* For older news, see Gnus info node "New Features". - ----------------------------------------------------------------------- -Copyright information: - -Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. - - Permission is granted to anyone to make or distribute verbatim copies - of this document as received, in any medium, provided that the - copyright notice and this permission notice are preserved, - thus giving the recipient permission to redistribute in turn. - - Permission is granted to distribute modified versions - of this document, or of portions of it, - under the above conditions, provided also that they - carry prominent notices stating who last changed them. - -Local variables: -mode: outline -paragraph-separate: "[ ]*$" -end: diff --git a/Makefile.in b/Makefile.in deleted file mode 100644 index 9a70c03..0000000 --- a/Makefile.in +++ /dev/null @@ -1,188 +0,0 @@ -prefix = @prefix@ -datadir = @datadir@ -infodir = @infodir@ -lispdir = @lispdir@ -srcdir = @srcdir@ - -@SET_MAKE@ -EMACS = @EMACS@ -XEMACS = @XEMACS@ -PACKAGEDIR = @PACKAGEDIR@ -GNUS_PRODUCT_NAME = @GNUS_PRODUCT_NAME@ - -# It may be needed for Meadow/NTEmacs when sh.exe is used for SHELL. -# Because Meadow/NTEmacs will get the value of the current-directory from -# the environment variable PWD, but sh.exe will not take care of it even -# if the current-directory has changed. So we should invalidate it. -PWD= - -# It will be used to look for the XEmacs package path if this file is -# mis-configured (e.g. configured for FSFmacs). -EXAMINE_PACKAGEDIR = $(XEMACS) -batch -q -no-site-file -eval \ - "(let (package-dir) \ - (if (boundp (quote early-packages)) \ - (let ((dirs (delq nil (append (if early-package-load-path \ - early-packages) \ - (if late-package-load-path \ - late-packages) \ - (if last-package-load-path \ - last-packages))))) \ - (while (and dirs (not package-dir)) \ - (if (file-directory-p (car dirs)) \ - (setq package-dir (car dirs) \ - dirs (cdr dirs)))))) \ - (princ (or package-dir \"\")))" 2>/dev/null - -all: lick info - -all-ja: lick info info-ja - -lick: - cd lisp && $(MAKE) EMACS="$(EMACS)" lispdir="$(lispdir)" all - -#install: install-lisp install-info install-etc -install: install-lisp install-info - -install-ja: install install-info-ja - -install-lisp: - cd lisp && $(MAKE) EMACS="$(EMACS)" lispdir="$(lispdir)" install - -install-info: - cd texi && $(MAKE) EMACS="$(EMACS)" infodir="$(infodir)" install - -install-etc: - cd etc && $(MAKE) EMACS="$(EMACS)" install - -install-info-ja: - cd texi && $(MAKE) EMACS="$(EMACS)" infodir="$(infodir)" install-ja - -## Rule for XEmacs package. -install-package: xclever compose-package remove-extra-files-in-package \ - install-package-lisp \ - install-package-info install-package-manifest - -install-package-ja: xclever compose-package remove-extra-files-in-package \ - install-package-lisp \ - install-package-info install-package-info-ja \ - install-package-manifest - -package: xlick xinfo compose-package - -package-ja: xlick xinfo xinfo-ja compose-package - -# Sub-rule for XEmacs package. -install-package-lisp: - @if test x$(PACKAGEDIR) = x; then \ - package_dir=`$(EXAMINE_PACKAGEDIR)`; \ - else \ - package_dir="$(PACKAGEDIR)"; \ - fi; \ - echo "cd lisp && $(MAKE) EMACS=$(XEMACS)" \ - "lispdir=$$package_dir""/lisp/$(GNUS_PRODUCT_NAME)" \ - "install-without-compiling"; \ - cd lisp && $(MAKE) EMACS="$(XEMACS)" \ - lispdir="$$package_dir""/lisp/$(GNUS_PRODUCT_NAME)" \ - install-without-compiling - -install-package-info: - @if test x$(PACKAGEDIR) = x; then \ - package_dir=`$(EXAMINE_PACKAGEDIR)`; \ - else \ - package_dir="$(PACKAGEDIR)"; \ - fi; \ - echo "cd texi && $(MAKE) EMACS=$(XEMACS)" \ - "infodir=$$package_dir""/info install-info"; \ - cd texi && $(MAKE) EMACS="$(XEMACS)" \ - infodir="$$package_dir""/info" install-info - -install-package-info-ja: - @if test x$(PACKAGEDIR) = x; then \ - package_dir=`$(EXAMINE_PACKAGEDIR)`; \ - else \ - package_dir="$(PACKAGEDIR)"; \ - fi; \ - echo "cd texi && $(MAKE) EMACS=$(XEMACS)" \ - "infodir=$$package_dir""/info install-ja-info"; \ - cd texi && $(MAKE) EMACS="$(XEMACS)" \ - infodir="$$package_dir""/info" install-ja-info - -install-package-manifest: - @if test x$(PACKAGEDIR) = x; then \ - package_dir=`$(EXAMINE_PACKAGEDIR)`; \ - else \ - package_dir="$(PACKAGEDIR)"; \ - fi; \ - echo "cd lisp && $(MAKE) EMACS=$(XEMACS) PACKAGEDIR=$$package_dir" \ - "install-package-manifest"; \ - cd lisp && $(MAKE) EMACS="$(XEMACS)" PACKAGEDIR=$$package_dir \ - install-package-manifest - -remove-extra-files-in-package: - @if test x$(PACKAGEDIR) = x; then \ - package_dir=`$(EXAMINE_PACKAGEDIR)`; \ - else \ - package_dir="$(PACKAGEDIR)"; \ - fi; \ - echo "cd lisp && $(MAKE) EMACS=$(XEMACS) PACKAGEDIR=$$package_dir" \ - "remove-extra-files-in-package"; \ - cd lisp && $(MAKE) EMACS="$(XEMACS)" PACKAGEDIR=$$package_dir \ - remove-extra-files-in-package - -compose-package: - cd lisp && $(MAKE) EMACS="$(XEMACS)" compose-package -## - -xclever: - cd lisp && $(MAKE) EMACS="$(XEMACS)" lispdir="$(lispdir)" clever - -xlick: - cd lisp && $(MAKE) EMACS="$(XEMACS)" lispdir="$(lispdir)" all - -xinfo: - cd texi && $(MAKE) EMACS="$(XEMACS)" all-info - -xinfo-ja: - cd texi && $(MAKE) EMACS="$(XEMACS)" ja-info - -# Rule for Lars and nobody else. -some: - cd lisp && $(MAKE) EMACS="$(EMACS)" some -l: - cd lisp && $(MAKE) EMACS="$(EMACS)" clever - -info: - cd texi && $(MAKE) EMACS="$(EMACS)" all - -info-ja: - cd texi && $(MAKE) EMACS=$(EMACS) ja - -clean: - rm -f */*.orig */*.rej *.orig *.rej - rm -f MANIFEST.* - for i in lisp texi; do (cd $$i; $(MAKE) clean); done - -elclean: - cd lisp && rm -f *.elc auto-autoloads.el custom-load.el gnus-load.el - -x: - $(MAKE) EMACS="$(XEMACS)" - -xsome: - $(MAKE) EMACS="$(XEMACS)" some - -distclean: clean - rm -rf *~ - for i in lisp texi etc; do (cd $$i; $(MAKE) distclean); done - rm -f config.log config.status config.cache Makefile - -config.status: $(srcdir)/configure - $(SHELL) ./config.status --recheck -$(srcdir)/configure: $(srcdir)/configure.in - cd $(srcdir) && autoconf -Makefile: $(srcdir)/Makefile.in config.status - CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/Mule23@1934.en b/Mule23@1934.en deleted file mode 100644 index ae13f11..0000000 --- a/Mule23@1934.en +++ /dev/null @@ -1,155 +0,0 @@ -How to build T-gnus with Mule 2.3 based on Emacs 19.34. - -FIXING loaddefs.el -================== - -Unfortunately, some variables for `message' are predefined in lisp/ -loaddefs.el which is dumped in Mule executable file. It is uninvited, -moreover, it has a bad influence. So you should remove these -definitions from lisp/loaddefs.el and rebuild Mule. However, if you -don't want to rebuild Mule, you may put the following lines in the -beginning of .emacs file instead of rebuilding Mule. - -(let ((symbols '(citation-line-function - cite-function courtesy-message default-headers - default-mail-headers default-news-headers - deletable-headers fcc-handler-function - followup-to-function from-style - generate-headers-first generate-new-buffers - ignored-bounced-headers ignored-cited-headers - ignored-mail-headers ignored-news-headers - ignored-resent-headers ignored-supersedes-headers - included-forward-headers indent-citation-function - interactive kill-buffer-on-exit post-method - reply-to-function required-mail-headers - required-news-headers send-mail-function - send-news-function signature - signature-before-forwarded-message signature-file - signature-separator syntax-checks use-followup-to - user-organization-file wide-reply-to-function - yank-prefix)) - symbol) - (while symbols - (setq symbol (car symbols) - symbols (cdr symbol)) - (makunbound (intern (format "message-%s" symbol))))) - - -INSTALL CUSTOM, APEL, FLIM, SEMI/WEMI -===================================== - -T-gnus requires the latest version of CUSTOM, APEL, FLIM and SEMI or -WEMI; you should install these packages before installing T-gnus. - -As for CUSTOM, you should apply the following patch before building it. - ------- cut here ------ cut here ------ cut here ------ cut here ------ ---- custom-1.9962/cus-face.el~ Wed Mar 4 19:52:39 1998 -+++ custom-1.9962/cus-face.el Mon Mar 9 08:05:33 1998 -@@ -96,7 +96,7 @@ - "Define a new FACE on all frames, ignoring X resources." - (interactive "SMake face: ") - (or (internal-find-face name) -- (let ((face (make-vector 8 nil))) -+ (let ((face (make-vector face-vector-length nil))) - (aset face 0 'face) - (aset face 1 name) - (let* ((frames (frame-list)) ------- cut here ------ cut here ------ cut here ------ cut here ------ - -By the way, the latest CUSTOM package for Emacs v19 is available from: - -ftp://ftp.dina.kvl.dk/pub/Staff/Per.Abrahamsen/custom/custom-1.9962.tar.gz - - -INSTALL T-gnus -============== - -There are three ways of making T-gnus with Mule 2.3 based on Emacs 19.34. - -1. If you have installed EMU, APEL, FLIM and SEMI or WEMI packages - under the standard load-path, for instance: - - EMU: /usr/local/share/mule/19.34/site-lisp/ - APEL: /usr/local/share/mule/site-lisp/apel/ - FLIM: /usr/local/share/mule/site-lisp/flim/ - SEMI: /usr/local/share/mule/site-lisp/semi/ - - What is more, if you have been replaced old CUSTOM with new CUSTOM - or if you have installed new CUSTOM directly under the standard - load-path as such as /usr/local/share/mule/19.34/site-lisp/, you - may have nothing to be done; type the following commands right now. - - % ./configure --with-emacs=mule - % make install - - However, if you have installed new CUSTOM in the subdirectory under - the standard load-path, use the configure option `--with-addpath=' - as follows: - - % ./configure --with-emacs=mule\ - --with-addpath=/usr/local/share/mule/site-lisp/custom/ - % make install - - or you can use the file subdirs.el under the parent directory of - the subdirectory of CUSTOM to add it into load-path which contain - the following contents: - - (normal-top-level-add-to-load-path - '("custom/" "and the other subdirectories.../")) - - and then just type: - - % ./configure --with-emacs=mule - % make install - -2. If you have installed EMU, APEL, FLIM and SEMI or WEMI packages in - the non-standard load-path, use the configure option - `--with-addpath=' with the colon separated directory names where - EMU, APEL or CUSTOM packages are installed. For example: - - % ./configure --with-emacs=mule\ - --with-addpath=~/elisp/emu/:~/elisp/apel/:~/elisp/custom/ - % make install - - In this case, you have no need to add paths of FLIM, SEMI or WEMI - if they are installed under the directory which is same as the - parent directory of APEL. - -3. This is another way to install T-gnus when you have installed EMU, - APEL, FLIM and SEMI or WEMI packages in the non-standard load-path. - Copy the file `sample.lpath.el' which is included in the - distribution to `~/.lpath.el' and modify it suitably for your - environment. And then type the following command. - - % ./configure --with-emacs=mule - % make install - - -USING Emacs-W3M (and Emacs W3) -============================== -The web based backend `nnshimbun' uses the shimbun modules which are -included in Emacs-W3M package (and the other web based backends of T- -gnus requires Emacs W3). Emacs-W3M is an interface program to the -external command W3M, visit the following pages for more information. - - http://emacs-w3m.namazu.org/ - http://ei5nazha.yz.yamagata-u.ac.jp/~aito/w3m/ - -If you wish to build T-gnus to be able to use Emacs-W3M and nnshimbun, -you have to specify the path where Emacs-W3M is installed using the -configure option `--with-addpath=' (for Emacs W3, use the configure -option `--with-w3=' or editing the file `~/.lpath.el'). Here is an -example for that: - - % ./configure --with-emacs=mule\ - --with-addpath=~/elisp/emu/:~/elisp/apel/: ... :~/elisp/w3m/\ - --with-w3=/usr/local/share/mule/site-lisp/w3/ - % make install - -;; Don't mind if configure says "W3... not found". It is currently -;; malfunction when the configure option `--with-w3=' is not used even -;; if the path of Emacs W3 is specified in the file `~/.lpath.el'. - -;; By the way, does anyone know where do we find Emacs W3 package -;; which is suitable to Mule 2.3 based on Emacs 19.34? diff --git a/Mule23@1934.ja b/Mule23@1934.ja deleted file mode 100644 index ec2aecf..0000000 --- a/Mule23@1934.ja +++ /dev/null @@ -1,160 +0,0 @@ -Emacs 19.34 $B$r%Y!<%9$K$7$?(B Mule 2.3 $B$G(B T-gnus $B$r:n$kJ}K!!#(B - -FIXING loaddefs.el -================== - -$B;DG0$J$3$H$K$$$/$D$+$N(B `message' $B$G;H$&JQ?t$,(B lisp/loaddefs.el $B$GDj5A(B -$B$5$l$F$$$F(B Mule $B$N7W(B -$B$J$*@$OC$@$7!"$7$+$b0-1F6A$,$"$j$^$9!#$=$3$G$"$J$?$O$=$l$i$NDj5A$r(B -lisp/loaddefs.el $B$+$i:o=|$7$F!"(BMule $B$r:n$jD>$5$J$1$l$P$J$j$^$;$s!#(B -$B$7$+$7!"$b$7$"$J$?$,(B Mule $B$r:n$jD>$9$3$H$rK>$^$J$$$J$i$P!"(B.emacs $B%U%!(B -$B%$%k$N@hF,$K0J2<$N3F9T$r=q$-9~$`$3$H$G!"(BMule $B$r:n$jD>$9Be$o$j$K$9$k$3(B -$B$H$,$G$-$^$9!#(B - -(let ((symbols '(citation-line-function - cite-function courtesy-message default-headers - default-mail-headers default-news-headers - deletable-headers fcc-handler-function - followup-to-function from-style - generate-headers-first generate-new-buffers - ignored-bounced-headers ignored-cited-headers - ignored-mail-headers ignored-news-headers - ignored-resent-headers ignored-supersedes-headers - included-forward-headers indent-citation-function - interactive kill-buffer-on-exit post-method - reply-to-function required-mail-headers - required-news-headers send-mail-function - send-news-function signature - signature-before-forwarded-message signature-file - signature-separator syntax-checks use-followup-to - user-organization-file wide-reply-to-function - yank-prefix)) - symbol) - (while symbols - (setq symbol (car symbols) - symbols (cdr symbol)) - (makunbound (intern (format "message-%s" symbol))))) - - -INSTALL CUSTOM, APEL, FLIM, SEMI -================================ - -T-gnus $B$O:G?7HG$N(B CUSTOM, APEL, FLIM $B$*$h$S(B SEMI $B$+(B WEMI $B$rI,MW$H$7$^(B -$B$9!#$"$J$?$O$3$l$i$N%Q%C%1!<%8$r(B T-gnus $B$NA0$K%$%s%9%H!<%k$7$J$1$l$P$J(B -$B$j$^$;$s!#(BCUSTOM $B$K$D$$$F$O!":n$kA0$K$"$J$?$O0J2<$N%Q%C%A$rEv$F$kI,MW(B -$B$,$"$j$^$9!#(B - ------- cut here ------ cut here ------ cut here ------ cut here ------ ---- custom-1.9962/cus-face.el~ Wed Mar 4 19:52:39 1998 -+++ custom-1.9962/cus-face.el Mon Mar 9 08:05:33 1998 -@@ -96,7 +96,7 @@ - "Define a new FACE on all frames, ignoring X resources." - (interactive "SMake face: ") - (or (internal-find-face name) -- (let ((face (make-vector 8 nil))) -+ (let ((face (make-vector face-vector-length nil))) - (aset face 0 'face) - (aset face 1 name) - (let* ((frames (frame-list)) ------- cut here ------ cut here ------ cut here ------ cut here ------ - -$B$J$*(B Emacs v19 $BMQ$N:G?7$N(B CUSTOM $B$O0J2<$N$b$N$rF~2<$K%$%s%9%H!<%k$7$F$$$k$J$i$P!"$"$J$?$O2?$b$9(B - $B$kI,MW$,$"$j$^$;$s!#:#$9$0$K0J2<$N%3%^%s%I$r%?%$%W$7$F2<$5$$!#(B - - % ./configure --with-emacs=mule - % make install - - $B$7$+$7!"$b$7$"$J$?$,?7$7$$(B CUSTOM $B$rI8=`$N(B load-path $B$N2<$N%5%V%G%#(B - $B%l%/%H%j$K%$%s%9%H!<%k$7$F$"$k$J$i$P!"0J2<$N$h$&$K(B configure $B%*%W(B - $B%7%g%s$N(B `--with-addpath=' $B$r;H$&$+!"(B - - % ./configure --with-emacs=mule\ - --with-addpath=/usr/local/share/mule/site-lisp/custom/ - % make install - - $B$"$k$$$O$"$J$?$O0J2<$NFbMF$r4^$`!"(BCUSTOM $B%5%V%G%#%l%/%H%j$N?F%G%#(B - $B%l%/%H%j$N2<$N(B subdirs.el $B%U%!%$%k$r;H$&$3$H$,$G$-$^$9!#(B - - (normal-top-level-add-to-load-path - '("custom/" "and the other subdirectories.../")) - - $B$=$7$FC1$K(B - - % ./configure --with-emacs=mule - % make install - - $B$H%?%$%W$7$F2<$5$$!#(B - -2. $B$b$7$"$J$?$,(B EMU, APEL, FLIM $B$*$h$S(B SEMI $B$^$?$O(B WEMI $B$N3F%Q%C%1!<(B - $B%8$rI8=`$G$O$J$$(B load-path $B$K%$%s%9%H!<%k$7$F$$$k$J$i$P!"%3%m%s$G(B - $B6h@Z$i$l$?(B EMU, APEL $B$*$h$S(B CUSTOM $B$,%$%s%9%H!<%k$5$l$F$$$k%G%#%l(B - $B%/%H%jL>$H(B configure $B%*%W%7%g%s$N(B `--with-addpath=' $B$r;H$C$F2<$5$$!#(B - $BNc$($P(B - - % ./configure --with-emacs=mule\ - --with-addpath=~/elisp/emu/:~/elisp/apel/:~/elisp/custom/ - % make - - $B$3$N>l9g!"$b$7(B FLIM, SEMI $B$^$?$O(B WEMI $B$,(B APEL $B$N?F%G%#%l%/%H%j$HF1(B - $B$8%G%#%l%/%H%j$N2<$K%$%s%9%H!<%k$5$l$F$$$k$J$i$P!"$=$l$i$N(B path $B$r(B - $BDI2C$9$kI,MW$O$"$j$^$;$s!#(B - -3. $B$3$l$O!"(BEMU, APEL, FLIM $B$*$h$S(B SEMI $B$^$?$O(B WEMI $B$N3F%Q%C%1!<%8$rI8(B - $B=`$G$O$J$$(B load-path $B$K%$%s%9%H!<%k$7$F$$$k>l9g$N!"JL$NJ}K!$G$9!#(B - $BG[I[$K4^$^$l$F$$$k%U%!%$%k(B `sample.lpath.el' $B$r(B `~/.lpath.el' $B$K%3(B - $B%T!<$7$F!"$"$J$?$N4D6-$K9g$&$h$&$K=q$-49$($F2<$5$$!#$=$7$F$N(B T-gnus $B$N%&%'%V$K(B -$B4p$E$$$?%P%C%/%(%s%I$O(B Emacs W3 $B$rI,MW$H$7$^$9(B)$B!#(BEmacs-W3M $B$O30It%3%^(B -$B%s%I(B W3M $B$X$N%$%s%?!<%U%'!<%9$r9T$J$&%W%m%0%i%`$G!">\:Y>pJs$K$D$$$F$O(B -$B0J2<$N%Z!<%8$rK,$M$F$_$F2<$5$$!#(B - - http://emacs-w3m.namazu.org/ - http://ei5nazha.yz.yamagata-u.ac.jp/~aito/w3m/ - -Emacs-W3M $B$H(B nnshimbun $B$,;H$($k$h$&$K(B T-gnus $B$r:n$k$K$O!"(BEmacs-W3M $B$,(B -$B%$%s%9%H!<%k$5$l$F$$$k%Q%9$r(B configure $B%*%W%7%g%s$N(B `--with-addpath=' -$B$G;XDj$7$J$1$l$P$J$j$^$;$s(B (Emacs W3 $BMQ$K$O(B `--with-w3=' $B$r;H$&$+!"$^(B -$B$?$O(B `~/.lpath.el' $B%U%!%$%k$rJT=8$7$F2<$5$$(B)$B!#0J2<$ONc$G$9!#(B - - % ./configure --with-emacs=mule\ - --with-addpath=~/elisp/emu/:~/elisp/apel/: ... :~/elisp/w3m/\ - --with-w3=/usr/local/share/mule/site-lisp/w3/ - % make install - -;; $B$b$7(B configure $B$,!V(BW3... not found$B!W$H8@$C$F$b5$$K$7$J$$$G2<$5$$!#(B -;; $B$?$H$((B `~/.lpath.el' $B%U%!%$%k$G(B Emacs W3 $B$N(B path $B$,;XDj$5$l$F$$$F$b!"(B -;; configure $B%*%W%7%g%s$N(B `--with-w3=' $B$r;H$o$J$$$H!"8=:_$=$l$O@5>o$K(B -;; $BF/$-$^$;$s$N$G!#(B - -;; $B$H$3$m$G!"C/$+(B Emacs 19.34 $B$r%Y!<%9$K$7$?(B Mule 2.3 $B$KE,9g$9$k(B Emacs -;; W3 $B$,$I$3$K$"$k$+CN$j$^$;$s$+(B? diff --git a/README-gnus-bbdb.en b/README-gnus-bbdb.en deleted file mode 100644 index 109da56..0000000 --- a/README-gnus-bbdb.en +++ /dev/null @@ -1,127 +0,0 @@ --*- mode: text; fill-column: 70; -*- - ---- - If BBDB is used then, bbdb-gnus.elc can't be shared with them before -Semi-gnus 6.8.X. It is necessary to byte-compile it again. - -;; It is a simple way that only bbdb-gnus.el is byte-compiled after -;; gnus starts. - ---- -gnus-bbdb.el - - This is the BBDB API module for Semi-gnus. `mime-bbdb' should not be -necessary for Semi-gnus, if that module were used. - - You need FLIM 1.11.3 or later. - - If you are using bbdb-auto-notes-hook, the patch listed at the end -of this file should be applied. If not, it might not. - - EXAMPLE: - -;; You need to set nothing for `mime-bbdb'. -;(setq mime-bbdb/use-mail-extr nil) -;(eval-after-load "mail-extr" '(require 'mime-bbdb)) - -(require 'bbdb) -(require 'gnus-bbdb) -(bbdb-initialize 'sc) ;; 'Gnus or 'gnus should be deleted. -(add-hook 'gnus-startup-hook 'gnus-bbdb-insinuate) -(add-hook 'message-setup-hook 'gnus-bbdb-insinuate-message) - - If you would like to decode the quoted encoded words forcibly, even -though FLIM does not decode them, put the following lines in your -.gnus file. - -(setq gnus-bbdb/decode-field-body-function - (function - (lambda (field-body field-name) - (eword-decode-string field-body)))) - ---- - This is a patch for bbdb.el / bbdb-hooks.el. - ------- cut here ------ cut here ------ cut here ------ cut here ------ ---- bbdb-2.32/lisp/bbdb-com.el~ Sun Feb 18 08:00:39 2001 -+++ bbdb-2.32/lisp/bbdb-com.el Sun Feb 18 08:00:39 2001 -@@ -1620,7 +1620,7 @@ - ;; to be enclosed in quotes. Double-quotes and backslashes have - ;; already been escaped. This quotes a few extra characters as - ;; well (!,%, and $) just for common sense. -- ((string-match "[][\000-\037\177()<>@,;:.!$%]" name) -+ ((string-match "[][\000-\037\177<>@,;.!$%]" name) - (format "\"%s\" <%s>" name net)) - (t - (format "%s <%s>" name net))))) ---- bbdb-2.32/lisp/bbdb-hooks.el~ Tue Jan 30 08:00:56 2001 -+++ bbdb-2.32/lisp/bbdb-hooks.el Tue Jan 30 08:00:56 2001 -@@ -83,6 +83,8 @@ - ;; - ;; - -+(eval-when-compile (require 'cl)) -+ - (require 'bbdb) - - (defmacro the-v18-byte-compiler-sucks-wet-farts-from-dead-pigeons () -@@ -415,12 +417,23 @@ - (marker (bbdb-header-start)) - field pairs fieldval ; do all bindings here for speed - regexp string notes-field-name notes -- replace-p replace-or-add-msg) -+ replace-p replace-or-add-msg -+ extract-field-value-funtion) - (set-buffer (marker-buffer marker)) - (save-restriction -- (widen) -- (goto-char marker) -- (if (and (setq fieldval (bbdb-extract-field-value "From")) -+ (let ((function-list bbdb-extract-field-value-function-list) -+ function) -+ (or (progn -+ (while (and (not extract-field-value-funtion) -+ (setq function (car function-list))) -+ (setq extract-field-value-funtion (funcall function) -+ function-list (cdr function-list))) -+ extract-field-value-funtion) -+ (progn -+ (widen) -+ (goto-char marker) -+ (setq extract-field-value-funtion 'bbdb-extract-field-value)))) -+ (if (and (setq fieldval (funcall extract-field-value-funtion "From")) - (string-match (bbdb-user-mail-names) fieldval)) - ;; Don't do anything if this message is from us. Note that we have - ;; to look at the message instead of the record, because the record -@@ -431,7 +444,7 @@ - (goto-char marker) - (setq field (car (car ignore-all)) - regexp (cdr (car ignore-all)) -- fieldval (bbdb-extract-field-value field)) -+ fieldval (funcall extract-field-value-funtion field)) - (if (and fieldval - (string-match regexp fieldval)) - (setq ignore t) -@@ -444,7 +457,8 @@ - pairs (cdr (car rest)) ; (REGEXP . STRING) or - ; (REGEXP FIELD-NAME STRING) or - ; (REGEXP FIELD-NAME STRING REPLACE-P) -- fieldval (bbdb-extract-field-value field)) ; e.g., Subject line -+ fieldval (funcall extract-field-value-funtion field)) -+ ; e.g., Subject line - (when fieldval - (while pairs - (setq regexp (car (car pairs)) ---- bbdb-2.32/lisp/bbdb.el~ Sun Mar 4 20:30:09 2001 -+++ bbdb-2.32/lisp/bbdb.el Sun Mar 4 20:30:09 2001 -@@ -710,6 +710,7 @@ - (defvar bbdb-showing-changed-ones nil) - (defvar bbdb-modified-p nil) - (defvar bbdb-elided-display nil) -+(defvar bbdb-extract-field-value-function-list nil) - - (defvar bbdb-debug t) - (defmacro bbdb-debug (&rest body) ------- cut here ------ cut here ------ cut here ------ cut here ------ - ---- diff --git a/README-gnus-bbdb.ja b/README-gnus-bbdb.ja deleted file mode 100644 index 81299ab..0000000 --- a/README-gnus-bbdb.ja +++ /dev/null @@ -1,161 +0,0 @@ --*- mode: text; fill-column: 70; -*- - ---- -BBDB $B$r;HMQ$5$l$F$$$kJ}$O!"(B bbdb-gnus.elc $B$r(B Semi-gnus 6.8.X $B0JA0$N$b(B -$B$N$H6&M-$9$k$3$H$O$G$-$^$;$s!#I,$:!"(B byte-compile $B$7D>$7$F$/$@$5$$!#(B - -;; gnus $B$r5/F0$7$?$"$H$G!"(B bbdb-gnus.el $B$N$_$r(B byte-compile $B$9$k$H$$$&(B -;; $B$N$,$*l9g$K$O(B mime-bbdb $B$,ITMW$K$J$j$^$9!#(B - -1.11.3 $B0J9_$N(B FLIM $B$,I,MW$G$9!#(B - -bbdb-auto-notes-hook $B$r;HMQ$7$F$$$J$$J}$K$OITMW$G$9$,!";HMQ$7$F$$$kJ}(B -$B$O(B bbdb.el / bbdb-hooks.el $B$K$3$N%U%!%$%k$N:G8e$K$"$k(B patch $B$r$"$F$kI,(B -$BMW$,$"$j$^$9!#(B - -$B@_DjNc(B: - -;; mime-bbdb $B$K4X$9$k@_Dj$OITMW$G$9!#(B -;(setq mime-bbdb/use-mail-extr nil) -;(eval-after-load "mail-extr" '(require 'mime-bbdb)) - -(require 'bbdb) -(require 'gnus-bbdb) -(bbdb-initialize 'sc) ;; 'gnus / 'Gnus $B$O$O$:$7$F$/$@$5$$!#(B -(add-hook 'gnus-startup-hook 'gnus-bbdb-insinuate) -(add-hook 'message-setup-hook 'gnus-bbdb-insinuate-message) - -FLIM $B$G$O(B quote $B$5$l$?(B eword encoded word $B$O(B decode $B$5$l$^$;$s$,!"$=$l(B -$B$r6/@)E*$K(B decode $B$7$?$$>l9g$K$O!"@,;:.!$%]" name) -+ ((string-match "[][\000-\037\177<>@,;.!$%]" name) - (format "\"%s\" <%s>" name net)) - (t - (format "%s <%s>" name net))))) ---- bbdb-2.32/lisp/bbdb-hooks.el~ Tue Jan 30 08:00:56 2001 -+++ bbdb-2.32/lisp/bbdb-hooks.el Tue Jan 30 08:00:56 2001 -@@ -83,6 +83,8 @@ - ;; - ;; - -+(eval-when-compile (require 'cl)) -+ - (require 'bbdb) - - (defmacro the-v18-byte-compiler-sucks-wet-farts-from-dead-pigeons () -@@ -415,12 +417,23 @@ - (marker (bbdb-header-start)) - field pairs fieldval ; do all bindings here for speed - regexp string notes-field-name notes -- replace-p replace-or-add-msg) -+ replace-p replace-or-add-msg -+ extract-field-value-funtion) - (set-buffer (marker-buffer marker)) - (save-restriction -- (widen) -- (goto-char marker) -- (if (and (setq fieldval (bbdb-extract-field-value "From")) -+ (let ((function-list bbdb-extract-field-value-function-list) -+ function) -+ (or (progn -+ (while (and (not extract-field-value-funtion) -+ (setq function (car function-list))) -+ (setq extract-field-value-funtion (funcall function) -+ function-list (cdr function-list))) -+ extract-field-value-funtion) -+ (progn -+ (widen) -+ (goto-char marker) -+ (setq extract-field-value-funtion 'bbdb-extract-field-value)))) -+ (if (and (setq fieldval (funcall extract-field-value-funtion "From")) - (string-match (bbdb-user-mail-names) fieldval)) - ;; Don't do anything if this message is from us. Note that we have - ;; to look at the message instead of the record, because the record -@@ -431,7 +444,7 @@ - (goto-char marker) - (setq field (car (car ignore-all)) - regexp (cdr (car ignore-all)) -- fieldval (bbdb-extract-field-value field)) -+ fieldval (funcall extract-field-value-funtion field)) - (if (and fieldval - (string-match regexp fieldval)) - (setq ignore t) -@@ -444,7 +457,8 @@ - pairs (cdr (car rest)) ; (REGEXP . STRING) or - ; (REGEXP FIELD-NAME STRING) or - ; (REGEXP FIELD-NAME STRING REPLACE-P) -- fieldval (bbdb-extract-field-value field)) ; e.g., Subject line -+ fieldval (funcall extract-field-value-funtion field)) -+ ; e.g., Subject line - (when fieldval - (while pairs - (setq regexp (car (car pairs)) ---- bbdb-2.32/lisp/bbdb.el~ Sun Mar 4 20:30:09 2001 -+++ bbdb-2.32/lisp/bbdb.el Sun Mar 4 20:30:09 2001 -@@ -710,6 +710,7 @@ - (defvar bbdb-showing-changed-ones nil) - (defvar bbdb-modified-p nil) - (defvar bbdb-elided-display nil) -+(defvar bbdb-extract-field-value-function-list nil) - - (defvar bbdb-debug t) - (defmacro bbdb-debug (&rest body) ------- cut here ------ cut here ------ cut here ------ cut here ------ - ---- -gnus-bbdb/split-mail() - -nnmail-split-fancy $B$G;HMQ$9$k$?$a$N4X?t$G$9!#l9g!"(B - `foo-group' $B$K?6$jJ,$1$^$9!#(B - -*2 : `company' $B%U%#!<%k%I$,(B `bar' $B$G;O$^$C$F$$$k>l9g!"(B`company' $B%U%#!<(B - $B%k%I$NFbMF$r$=$N$^$^%0%k!<%WL>$H$7$F;HMQ$7!"?6$jJ,$1$^$9!#(B - -*3 : `group' $B%U%#!<%k%I$,$"$k>l9g!"(B`group' $B%U%#!<%k%I$NFbMF$r$=$N$^$^(B - $B%0%k!<%WL>$H$7$F;HMQ$7!"?6$jJ,$1$^$9!#(B - -*4 : `note' $B%U%#!<%k%I$K(B `my friend' $B$,4^$^$l$k>l9g!"$=$N8e$m$K;XDj$5(B - $B$l$?5,B'$G?6$jJ,$1$^$9!#$3$N5,B'$N5-=RJ}K!$O!"DL>o$N(B - `nnmail-split-fancy' $B$G$N5-=RJ}K!$HF1$8$b$N$G$9!#(B diff --git a/README-offline.en b/README-offline.en deleted file mode 100644 index 65af7ee..0000000 --- a/README-offline.en +++ /dev/null @@ -1,203 +0,0 @@ -1) What's "gnus-offline (Gnus Offline Backend Utility)" ? -========================================================= - -This program is a utility for T-gnus that handles messages -(i.e. mail and news) in the "offline" state in a more simple way. - -It is basically designed for "gnus-agent". (See info about gnus-agent.) - -You can also use it with a function "nnspool"(*1) (which needs an -external program such as "gnspool"(*2) ), or with "miee.el"(*3) for -posting and/or sending messages. - - (*1) See info about nnspool. - (*2) gnspool comes with a newsreader "gn". - (*3) The latest version of miee.el (or MIEE) is available at - http://www.shiojiri.ne.jp/%7Et-ichi/meadow.html - -You can handle messages in the offline state without "gnus-offline", -but "gnus-offline" provides a simple way for setup and operation. - -**Features** - -o Simple configuration -- An "INTERACTIVE" configuration to set - the variables. - -o Simple operation -- Type "g" in the *Group* buffer, and gnus-offline - will: - o Dial (*) - o Send mails & post news articles - o Fetch new mails & articles - o Hang up (*) - - (*) For dialing and hanging up, external softwares are needed. - But you can do without ones if you connect and disconnect - manually. - -This document is written mainly for the case using "gnus-agent" with -gnus-offline.el bundled in T-gnus 6.12.0 or later. - -2) Installation -=============== - -As you are reading this document, this version of T-gnus includes -gnus-offline. Installation is simple. "make install" will -automatically install "gnus-offline". - -3) How to use -============= - -o First, you must do a general setup for T-gnus (See info about the - setup). - -o Add the following code to ~/.emacs - - (autoload 'gnus-plugged "gnus-agent" nil t) - (autoload 'gnus-unplugged "gnus-agent" nil t) - -o Add the following code to ~/.emacs - - (load "gnus-ofsetup") - (gnus-setup-for-offline) - -o Add the following code to ~/.gnus - - (gnus-agentize) - -o Restart Emacs. gnus-ofsetup.el will ask you some questions and - create ~/.gnus-offline.el. (*) - - (*) If you don't know how to answer some questions, typing "TAB" - key may show you the possible answers. See the next section - which explains the user options. - You will also be asked whether to save the POP password in - ~/.newsrc.eld or not. Answer it carefully. See section 6) - for details. - -o At the first time, you must start Gnus in the online state - (by M-x gnus-plugged) and decide which groups to subscribe (See info - about subscribing). - - From now on you can start Gnus as an offline reader by M-x gnus-unplugged. - Try typing "g" in the *Group* buffer. - -o You may want M-x gnus to start Gnus as an offline reader as - M-x gnus-unplugged. Then write the following code to ~/.emacs - - (setq gnus-plugged nil) - - you can put it into ~/.gnus if there's no need to start Gnus as an online - reader (by M-x gnus-plugged). - -4) User customizable variables in gnus-offline -============================================== - -o gnus-offline-dialup-program - Program name to dialup. - -o gnus-offline-dialup-program-arguments - List of dialup program arguments. - -o gnus-offline-hangup-program - Program name to hangup. - -o gnus-offline-hangup-program-arguments - List of hangup program arguments. - -o gnus-offline-mail-spool-directory - Spool directory for sending mail. - This variable is available only using MIEE. - -o gnus-offline-news-spool-directory - Spool directory for sending news. - This variable is available only using MIEE. - -o gnus-offline-mail-treat-environ - If t , gnus-offline sends mail to spool first. - If nil , gnus-offline sends mail immediately. - -o gnus-offline-articles-to-fetch - Article type you want to fetch. - - 'both ... Fetch both Mail/News. - 'Mail ... Fetch only Mail. - 'News ... Fetch only News. - - Default value is both. - -o gnus-offline-load-hook - Hook before gnus-offline load. - -o gnus-offline-before-online-hook - Hook before all online jobs. - -o gnus-offline-after-online-hook - Hook after all online jobs. - -o gnus-offline-interval-time - Interval time to do all online jobs.(minutes) - -o gnus-offline-MTA-type - MTA type to sending mail. - - 'smtp ... Use smtp.el. - 'sendmail ... Use sendmail.el. - -o gnus-offline-drafts-queue-type - Message queue type when spooling message. - - 'miee ... Use miee.el. - 'agent ... Use gnus-agent.el. - -o gnus-offline-after-empting-spool-hook - Hook before empting spool. - -o gnus-offline-before-empting-spool-hook - Hook after emoting spool. - -o gnus-offline-dialup-function - Function to dialup. - -o gnus-offline-hangup-function - Function to hangup. - -5) Commands in gnus-offline -=========================== - -o M-x gnus-offline-toggle-plugged - Toggle offline/online state. - -o M-x gnus-offline-toggle-auto-hangup - Change current state to offline. - -o M-x gnus-offline-toggle-on/off-send-mail - Toggle method to sending mail. - -o M-x gnus-offline-toggle-articles-to-fetch - Toggle articles you want to fetch. - -o M-x gnus-offline-set-interval-time - Set interval time(minute) to fetch article. - -o M-x gnus-offline-agent-expire - Expire articles. - -6) [!!!IMPORTANT!!!] About the pop password -=========================================== - -If your machine is stand alone, and nobody else uses it, you can save -the password. (But, on your own responsibility!) - -At the first interactive configuration, it will ask you whether to -save the password in ~/.newsrc.eld or not. When you answer "y" to this -question, the password will be saved in ~/.newsrc.eld. (*) - - (*) Actually the following will be added to ~/.gnus-offline.el. - - (add-hook - 'gnus-setup-news-hook - (lambda () - (add-to-list 'gnus-variable-list 'mail-source-password-cache))) - -Answer this question carefully, because the password will NOT be -encoded! diff --git a/README-offline.ja b/README-offline.ja deleted file mode 100644 index 40e7245..0000000 --- a/README-offline.ja +++ /dev/null @@ -1,206 +0,0 @@ -1) gnus-offline (Gnus Offline Backend Utility)$B$C$F2?(B? - -$B$3$l$O(B T-gnus $B$G%a%C%;!<%8$r$h$jMF0W$K%*%U%i%$%s4D6-$G07$&$?$a$N%f!<%F%#(B -$B%j%F%#$G$9!#(B - -$BH$7$F$/$@$5$$!#(B - (*) gnspool $B$O(B gn $B$H$$$&%K%e!<%9%j!<%@!<$H6&$KG[I[$5$l$F$$$^$9!#(B - (*) miee.el $B$N:G?7HG$O0J2<$N>l=j$+$i$B%a%$%k(B - $B$*$h$S(B $B%M%C%H%K%e!<%9$NAw$B%@%$%"%k%"%C%W$N@ZCG(B $B$H$$$&F0:n$r0l5$(B - $B$K9T$&$3$H$,2DG=$K$J$j$^$9!#(B($B$?$@$7@\B3!&$*$h$S@ZCG$OJLES@lMQ$N%D!<(B - $B%k$,I,MW$G$9(B) - -$B$J$*!"$3$N%I%-%e%a%s%H$G$Ol9g!"(Bgnus-offline.el $B$OFC$K2?$b9M$($J$/$F$b(B T-gnus -$B$HF1;~$K%$%s%9%H!<%k$5$l$^$9!#(B - -3) $B;H$$J}(B - -$B!&(BT-gnus $B$N0lHLE*$J;HMQJ}K!$K$D$$$F(B info $B$J$I$GD4$Y$F@_Dj$7$F$/$@$5$$!#(B - -$B!&0J2<$N%3!<%I$r(B .emacs $B$K2C$($^$9!#(B - - (autoload 'gnus-plugged "gnus-agent" nil t) - (autoload 'gnus-unplugged "gnus-agent" nil t) - -$B!&0J2<$N%3!<%I$r(B .emacs $B$K2C$($^$9!#(B - - (load "gnus-ofsetup") - (gnus-setup-for-offline) - -$B!&0J2<$N%3!<%I$r(B .gnus $B$K2C$($^$9!#(B - - (gnus-agentize) - -$B!&(BEmacs $B$r:F5/F0$7$^$9!#$9$k$H!"(Bgnus-ofsetup.el $B$,5/F0$7$^$9$N$G!"BPOC(B - $BE*$KI,MW$JJQ?t$N@_Dj$r9T$$$^$9!#(B - ($B2?$rF~NO$7$?$i$$$$$+$o$+$i$J$$>l9g$O(B 4) $B$r;2>H$9$k$+!"(BTAB $B$GF~NO(B - $B2DG=$J8uJd$r0lMwI=<($5$;$k$+$7$F$/$@$5$$(B) - $B$9$Y$F@_Dj$9$k$H%[!<%`%G%#%l%/%H%j$K(B .gnus-offline.el $B$H$$$&%U%!%$%k(B - $B$,=PMh>e$,$j$^$9!#(B(*) - - (*) $B!V(BPOP $B%Q%9%o!<%I$r(B ~/.newsrc.eld $B$KJ]B8$9$k$+$I$&$+!We$GEz$($F$/$@$5$$!#>\$7$/$O(B 6) - $B$r;2>H$7$F2<$5$$!#(B - -$B!&$3$N$"$H0lC6(B M-x gnus-plugged $B$G(B Gnus $B$r5/F0$7$F!"9XFI$9$k%0%k!<%W$r(B - $B7h$a$F$/$@$5$$!#(B($B>\$7$$J}K!$O(B Gnus $B$N(B info $B$r8+$F$/$@$5$$(B) - - $B$=$7$F(B $Bl9g$O!"(B.emacs $B$K(B - - (setq gnus-plugged nil) - - $B$r=q$$$F2<$5$$!#$b$7(B M-x gnus-plugged $B$r;H$o$J$$$J$i$P!"$3$l$r(B .gnus $B$K(B - $B=q$/$H$$$&(B - -$B!&(Bgnus-offline-dialup-program-arguments - $B%@%$%"%k%"%C%W%W%m%0%i%`$N0z?t$N%j%9%H(B - $BNc$($P!"(Bgnus-offline-dialup-program $B$K(B "-s AAA" $B$rEO$9>l9g$O(B - (setq gnus-offline-dialup-program-arguments '("-s" "AAA")) - $B$H5-=R$7$F$/$@$5$$!#(B - -$B!&(Bgnus-offline-hangup-program - $B2s@~$r@ZCG$9$k%W%m%0%i%`L>(B - -$B!&(Bgnus-offline-hangup-program-arguments - $B@ZCG$9$k%W%m%0%i%`$N0z?t$N%j%9%H(B - $BNc$($P!"(Bgnus-offline-hangup-program $B$K(B "-s AAA" $B$rEO$9>l9g$O(B - (setq gnus-offline-hangup-program-arguments '("-s" "AAA")) - $B$H5-=R$7$F$/$@$5$$!#(B - -$B!&(Bgnus-offline-mail-spool-directory - $BAw?.%a!<%k$N%9%W!<%k%G%#%l%/%H%j(B - Offline $B>uBV$G(B Mail $B$rAw?.$9$k$H0lC6$3$3$G;XDj$7$?%G%#%l%/%H%j$KJ](B - $BB8$5$l$^$9!#(B - MIEE $B$r;HMQ$9$k>l9g0J30L58z$G$9!#(B - -$B!&(Bgnus-offline-news-spool-directory - $BAw?.%K%e!<%9$N%9%W!<%k%G%#%l%/%H%j(B - Offline $B>uBV$G(B News $B$rAw?.$9$k$H0lC6$3$3$G;XDj$7$?%G%#%l%/%H%j$KJ](B - $BB8$5$l$^$9!#(B - MIEE $B$r;HMQ$9$k>l9g0J30L58z$G$9!#(B - -$B!&(Bgnus-offline-mail-treat-environ - Mail $B$NAw?.$r(B Online/Offline $B$G9T$&;v$r@Z$jBX$($k(B - -$B!&(Bgnus-offline-articles-to-fetch - fetch $B$9$k5-;v$r@Z$jBX$($k(B both->mail->news->both... - 'both ... Mail/News $B$rN>J}2A$5$l$k(B hook - -$B!&(Bgnus-offline-before-online-hook - Online job $BD>A0$KI>2A$5$l$k(B hook - -$B!&(Bgnus-offline-after-online-hook - Online job $B=*N;D>A0$KI>2A$5$l$k(B hook - -$B!&(Bgnus-offline-interval-time - Online job $B$r9T$&4V3V(B($BJ,(B) - Emacs $B$,(B idle $B>uBV$K$J$C$F$+$i$3$3$G;XDj$7$?;~4VKh$K(B Online $B>uBV$K(B - $B$7(B Mail/News $B$r2A$5$l$k(B hook - -$B!&(Bgnus-offline-before-empting-spool-hook - $BAw?.%a%C%;!<%8$rAw?.8e$K!"6u$K$J$C$?8eI>2A$5$l$k(B hook - -$B!&(Bgnus-offline-dialup-function - $B@\B3$K;HMQ$9$k4X?tL>(B - -$B!&(Bgnus-offline-hangup-function - $B@ZCG$K;HMQ$9$k4X?tL>(B - -$B!&(Bgnus-offline-mail-source - $B%a!<%k%5!<%P!$N%j%9%H(B - -5) gnus-offline M-x $B$GuBV(B/Online $B>uBV$r@ZBX$($^$9!#(B - -$B!&(BM-x gnus-offline-toggle-auto-hangup - offline $B>uBV$K$7$^$9!#(B - -$B!&(BM-x gnus-offline-toggle-on/off-send-mail - Online $B>uBV(B/Offline $B>uBV$G$N(B Mail $BAw?.>uBV$r@ZBX$($^$9!#(B - Online $B>uBV$G$OD>@\Aw?.$7$^$9$,!"(BOffline $B>uBV$G$O0lC6(B spool $B$K=q$-9~(B - $B$_!"(B"g" $B$r2!$7$?;~$KA4ItAw?.$5$l$^$9!#(B - -$B!&(BM-x gnus-offline-toggle-articles-to-fetch - $B mail -> news -> both ... $B$N$h$&$K(B - $B@Z$jBX$o$j$^$9!#(B - -$B!&(BM-x gnus-offline-set-interval-time - $B5-;v(B/Mail $B$Nl9g$K$OF~NO$NJ$/J}K!$,$"$j$^$9!#(B -$B$?$@$7!"EvA3%Q%9%o!<%I$rEp$^$l$k4m81$OA}$7$^$9$N$Gl9g$OJ]B8$5$l$k%Q%9%o!<%I$OJ?J8$N$^$^$J$N$G$+$J$j4m81$G$"$k(B -$B$3$H$r$4>5CN$N$&$($*;H$$$/$@$5$$!#(B diff --git a/README.T-gnus b/README.T-gnus deleted file mode 100644 index 1966194..0000000 --- a/README.T-gnus +++ /dev/null @@ -1,38 +0,0 @@ -======================================================================== -Codename: T-gnus -Branch Tag: t-gnus-6_15-quimby -Branch Status: Develop, Synchronize with Oort Gnus -Branch Goal: Implement latest features of gnus and offline features - Use Gnus in Offline status. -Branch Policy: (not defined yet) -======================================================================== -NEWS: - -* New codename: "T-gnus" - - In order to distinguish this branch from the other branches, codename - was changed to "T-gnus" , gnu with T-Shirt. - -* New Features - - Use T-gnus in offline(Unplugged) status using gnus-offline. - T-gnus have also features that have the branches `shuhei-k', `chao-6_9' - `keiichi', ... and the MainTrunk. - - If you would like to make T-gnus with Mule 2.3 based on Emacs 19.34, - see Mule23@1934 file for more information. - - You can use some convenient configure options, e.g. `--with-addpath=', - to build T-gnus easier. Try `./configure --help'. - - And added many other features by "ELIPS" - -* TODO - - See TODO.ja - -* T-gnus 6.15 - this is based on Oort Gnus. - - The latest T-gnus is T-gnus 6.15.4 (based on Oort Gnus 0.04). It - requires SEMI/WEMI (1.13.5 or later), FLIM (1.13.1 or later), and - APEL (10.0 or later). diff --git a/README.branch b/README.branch deleted file mode 100644 index c97790c..0000000 --- a/README.branch +++ /dev/null @@ -1,162 +0,0 @@ -README.branch --- description of branches and tags. (DRAFT) -======================================================================== - -Semi-gnus revision tree (2001-04-16) - - vendor personal main trunk public - branch branches branches ------------------------------------------------------------------------- -qGnus 0.?? ------> Semi-gnus 6.0.0 - : : - : himi <-- 6.0.7 - : ichikawa <------ 6.0.8 - : | | - : 6.8.17 ---+ : - : : : : - : V : - : pgnus-ichikawa : - : | : - : 6.9.01 : - : : : (1999.07.02: turn into the public branch) - : +-------->---------------+ - : : : - : : V - : : 6.10.072 -----> t-gnus-6_12 - : : : \ (for FLIM 1.12, - : : : \ stable) - : : : \ - : : : --> t-gnus-6_13 - : : : (for FLIM 1.13, - : : : develop) - : : : : - : : t-gnus-6_10-last- t-gnus-6_13-last- - : : | feedback | - : : +<--------------+ - : : | | - : ------------<---------------+ t-gnus-6_14 - : Oort Gnus / : | (for FLIM 1.13, - : | | : : develop) - : V V : : | - : t-gnus-6_15-quimby<---<-----(t-gnus-6_14-quimby)<-----+ - : | : : | - : : : | feedback | - : : +<--------------+ - : : | | - : akr <-- 6.2.3 : t-gnus-6_15 - : shuhei-k <-- 6.3.1 (for FLIM 1.13, -Gnus 5.6.11 ------> 6.3.3 develop) - : 6.4.0 (for SEMI 1.5) | - : (6.4.?)------> for SEMI 1.5 : - : | \ - : | \ -(Synch with original Gnus | ---> for SEMI 1.6 - was done many times, but (6.4.?)------> 6.5 (for SEMI 1.7) - we don't include them.) | / 6.5.0 - : | (?)/ - : | <--- - : (6.5.?)------> 6.6 (for SEMI 1.8, FLIM 1.7) - : | \ 6.6.0 stable branch - : | \ - : | ---> 6.7 (for SEMI 1.8, FLIM 1.7) - : | 6.7.0 stable branch - : sync | : -Gnus 5.6.22 ------> | feedback 6.7.7 - : (6.7.8)<------ 6.7.8 - : | \ - : | \ - : | ---> 6.8 (for SEMI 1.8, FLIM 1.8) - : keiichi <-- 6.8.18 6.8.0 stable branch - : sync | : -Gnus 5.6.45 ------> | feedback 6.8.20 - : (6.8.20)<------ 6.8.20 - : | \ - : | \ - : | --> 6.9 (for SEMI 1.11, FLIM 1.12) - : | 6.9.1 stable branch - : | feedback 6.9.2 - : (6.9.2)<---------6.9.2 - : | \ - : | \ - : | --> 6.10 (for SEMI 1.12, FLIM 1.12) - : | 6.10.1 develop branch - : : : - : : : -======================================================================== - -The Vendor Branch - - Original version of Gnus. - Each version has a tag of the form "qgnus-0_XY" or "gnus-5_X_Y" or - "pgnus-0_XY". - - The branch tag for the vendor branch is "larsi". - -The Main Trunk - - Semi-gnus was developed on the main trunk until current branch- - management plan (See "Public Branches" below) was introduced. - Each version has a tag of the form "gnus-6_N2_N3". (0 < N2 < 5) - -Public Branches - - Current main stream of Semi-gnus development. - - [Goal and policy of public branches here ???] - - Each branch has a tag of the form "gnus-N1_N2" and each version - has a tag of the form "gnus-N1_N2_N3". - - N1, N2, and N3 are changed by the following rules. - - N1 will be incremented if any fundamental architecture change is - made. Of cource, in this case, N2 and N3 will be reset to zero. - - N2 will be incremented and new branch will be made if any "major - changes" are made. "major changes" include API changes, major - version up of original Gnus, or synchronization with original Gnus - which requires design decision. - - N3 will be incremented if some "minor changes" are made. "minor - changes" include small bug fix or synchronization with original Gnus - without design decision. - - The following branch tags are currently available. - - for-semi-1_5 Semi-gnus for SEMI 1.5 API - for-semi-1_6 Semi-gnus for SEMI 1.6 API - gnus-6_5 Semi-gnus for SEMI 1.7 API - gnus-6_6 Semi-gnus for SEMI 1.8, FLIM 1.7 API (stable) - gnus-6_7 Semi-gnus for SEMI 1.8, FLIM 1.7 API (stable) - gnus-6_8 Semi-gnus for SEMI 1.8, FLIM 1.8 API (stable) - gnus-6_9 Semi-gnus for SEMI 1.11, FLIM 1.12 API (stable) - gnus-6_10 Semi-gnus for SEMI 1.12, FLIM 1.12 API (develop) - pgnus-ichikawa (Main trunk of T-gnus) - t-gnus-6_12 T-gnus for SEMI 1.12/1.13, FLIM 1.12 API (stable) - t-gnus-6_13 T-gnus for SEMI 1.13, FLIM 1.13 API (develop) - t-gnus-6_14 T-gnus for SEMI 1.13, FLIM 1.13 API (develop) - t-gnus-6_15 T-gnus for SEMI 1.13, FLIM 1.13 API (develop) - t-gnus-6_15-quimby T-gnus for SEMI 1.13, FLIM 1.13 API (develop) - -Personal Branches - - Some Semi-gnus developers have their own "personal branches". - Each personal branch may have its own goal and/or policy. - See README.${tag} (if exists) for information of each branch. - - The following branch tags are curretly available. - - himi Owner: Miyashita Hisashi - ichikawa Owner: Tatsuya Ichikawa - akr Owner: Tanaka Akira - shuhei-k Owner: Shuhei KOBAYASHI - keiichi Owner: Keiichi Suzuki - -"semi-gnus" Tag - - Was assigned to the latest stable version. - Currently not maintained. (XXX: ???) - -"for-semi-N1_N2" Tags - - Were assigned to corresponding version of SEMI API N1.N2. - We will not use this convention any longer. (XXX: ???) diff --git a/README.branch.ja b/README.branch.ja deleted file mode 100644 index 3e54c4c..0000000 --- a/README.branch.ja +++ /dev/null @@ -1,163 +0,0 @@ -README.branch.ja --- branch $B$H(B tag $B$N@bL@(B ($BAp9F(B) -======================================================================== - -Semi-gnus revision tree (2001-04-16) - - vendor personal main trunk public - branch branches branches ------------------------------------------------------------------------- -qGnus 0.?? ------> Semi-gnus 6.0.0 - : : - : himi <-- 6.0.7 - : ichikawa <------ 6.0.8 - : | | - : 6.8.17 ---+ : - : : : : - : V : - : pgnus-ichikawa : - : | : - : 6.9.01 : - : : : (1999.07.02: $B8xE*;^$K0a99$((B) - : +-------->---------------+ - : : : - : : V - : : 6.10.072 -----> t-gnus-6_12 - : : : \ (for FLIM 1.12, - : : : \ stable) - : : : \ - : : : --> t-gnus-6_13 - : : : (for FLIM 1.13, - : : : develop) - : : : : - : : t-gnus-6_10-last- t-gnus-6_13-last- - : : | feedback | - : : +<--------------+ - : : | | - : ------------<---------------+ t-gnus-6_14 - : Oort Gnus / : | (for FLIM 1.13, - : | | : : develop) - : V V : : | - : t-gnus-6_15-quimby<---<-----(t-gnus-6_14-quimby)<-----+ - : | : : | - : : : | feedback | - : : +<--------------+ - : : | | - : akr <-- 6.2.3 : t-gnus-6_15 - : shuhei-k <-- 6.3.1 (for FLIM 1.13, -Gnus 5.6.11 ------> 6.3.3 develop) - : 6.4.0 (for SEMI 1.5) | - : (6.4.?)------> for SEMI 1.5 : - : | \ - : | \ -($B85$N(B Gnus $B$H$N(B Sync $B$O2?EY(B | ---> for SEMI 1.6 - $B$b$J$5$l$F$$$^$9$,!"$3$3$K(B (6.4.?)------> 6.5 (for SEMI 1.7) - $B$O=q$-$^$;$s!#(B) | / 6.5.0 - : | (?)/ - : | <--- - : (6.5.?)------> 6.6 (for SEMI 1.8, FLIM 1.7) - : | \ 6.6.0 stable branch - : | \ - : | ---> 6.7 (for SEMI 1.8, FLIM 1.7) - : | 6.7.0 stable branch - : sync | : -Gnus 5.6.22 ------> | feedback 6.7.7 - : (6.7.8)<------ 6.7.8 - : | \ - : | \ - : | ---> 6.8 (for SEMI 1.8, FLIM 1.8) - : keiichi <-- 6.8.18 6.8.0 stable branch - : sync | : -Gnus 5.6.45 ------> | feedback 6.8.20 - : (6.8.20)<------ 6.8.20 - : | \ - : | \ - : | --> 6.9 (for SEMI 1.11, FLIM 1.12) - : | 6.9.1 stable branch - : | feedback 6.9.2 - : (6.9.2)<---------6.9.2 - : | \ - : | \ - : | --> 6.10 (for SEMI 1.12, FLIM 1.12) - : | 6.10.1 develop branch - : : : - : : : -======================================================================== - -The Vendor Branch - - Gnus $B$N85$N%P!<%8%g%s$G$9!#(B - $B$=$l$>$l$N%P!<%8%g%s$O(B "qgnus-0_XY" $B$d(B "gnus-5_X_Y" $B$d(B - "pgnus-0_XY" $B$H$$$&7A<0$N(B tag $B$,IU$$$F$$$^$9!#(B - - vendor branch $B$N(B branch tag $B$O(B "larsi" $B$G$9!#(B - -The Main Trunk - - $B8=:_$N(B branch $B4IM}7W2h$,F3F~$5$l$k$^$G!"(BSemi-gnus $B$O(B main trunk $B$G(B - $B3+H/$5$l$F$$$^$7$?(B ($B2<$N(B "Public Branches" $B$rFI$s$G$/$@$5$$(B)$B!#$=$l(B - $B$>$l$N%P!<%8%g%s$O(B "gnus-6_N2_N3" $B$H$$$&7A<0$G$9!#(B(0 < N2 < 5) - -Public Branches - - $B8=:_$N(B Semi-gnus $B3+H/$N$l$N(B branch $B$O(B "gnus-N1_N2" $B$H$$$&7A<0$N(B tag $B$,IU$$$F$$$F!"(B - $B$=$l$>$l$N%P!<%8%g%s$O(B "gnus-N1_N2_N3" $B$H$$$&7A<0$N(B tag $B$,IU$$$F$$(B - $B$^$9!#(B - - N1, N2, N3 $B$O0J2<$N5,B'$K=>$C$FJQ99$5$l$^$9!#(B - - N1 $B$O4pACE*$J;EAH$_$NJQ99$,$J$5$l$?$H$-$KA}$d$5$l$^$9!#$b$A$m$s!"(B - $B$3$N>l9g$O(B N2 $B$H(B N3 $B$O(B 0 $B$K$J$j$^$9!#(B - - N2 $B$O?7$7$$(B branch $B$,(B "$B.$5$JJQ99(B" $B$,$J$5$l$?$H$-$KA}$d$5$l$^$9!#(B"$B>.$5$JJQ99(B" $B$O>.(B - $B$5$J%P%0=$@5$d!"@_7W$N7hDj$rH<$o$J$$85$N(B Gnus $B$H$NF14|$J$I$G$9!#(B - - $B8=:_$O0J2<$N(B branch tag $B$,;HMQ2DG=$G$9!#(B - The following branch tags are currently available. - - for-semi-1_5 Semi-gnus for SEMI 1.5 API - for-semi-1_6 Semi-gnus for SEMI 1.6 API - gnus-6_5 Semi-gnus for SEMI 1.7 API - gnus-6_6 Semi-gnus for SEMI 1.8, FLIM 1.7 API (stable) - gnus-6_7 Semi-gnus for SEMI 1.8, FLIM 1.7 API (stable) - gnus-6_8 Semi-gnus for SEMI 1.8, FLIM 1.8 API (stable) - gnus-6_9 Semi-gnus for SEMI 1.11, FLIM 1.12 API (stable) - gnus-6_10 Semi-gnus for SEMI 1.12, FLIM 1.12 API (develop) - pgnus-ichikawa (Main trunk of T-gnus) - t-gnus-6_12 T-gnus for SEMI 1.12/1.13, FLIM 1.12 API (stable) - t-gnus-6_13 T-gnus for SEMI 1.13, FLIM 1.13 API (develop) - t-gnus-6_14 T-gnus for SEMI 1.13, FLIM 1.13 API (develop) - t-gnus-6_15 T-gnus for SEMI 1.13, FLIM 1.13 API (develop) - t-gnus-6_15-quimby T-gnus for SEMI 1.13, FLIM 1.13 API (develop) - -Personal Branches - - Semi-gnus $B3+H/$l$N(B personal branch $B$OL\I8!"$l$N(B branch $B$N>pJs$O(B ($BB8:_$9$k$J$i$P!"(B) README.${tag} $B$r(B - $BFI$s$G$/$@$5$$!#(B - - $B0J2<$N(B branch tag $B$,8=:_;HMQ2DG=$G$9!#(B - - himi Owner: Miyashita Hisashi - ichikawa Owner: Tatsuya Ichikawa - akr Owner: Tanaka Akira - shuhei-k Owner: Shuhei KOBAYASHI - keiichi Owner: Keiichi Suzuki - -"semi-gnus" Tag - - $B$3$l$O:G?7$N0BDjHG$K3d$jEv$F$i$l$F$$$^$7$?!#8=:_$O0];}$5$l$F$$$^$;(B - $B$s!#(B(XXX: ???) - -"for-semi-N1_N2" Tags - - $B$3$l$O(B SEMI API N1.N2 $B$KBP1~$9$k%P!<%8%g%s$K3d$jEv$F$i$l$F$$$^$7$?!#(B - $B$3$N=,47$O$b$&;H$o$l$^$;$s!#(B(XXX: ???) diff --git a/README.semi b/README.semi deleted file mode 100644 index dfa5660..0000000 --- a/README.semi +++ /dev/null @@ -1,132 +0,0 @@ -This package contains T-gnus 6.15. - -What is T-gnus? -=============== - - T-gnus is a replacement of Gnus with gnus-mime for SEMI. It has all -features of Gnus and gnus-mime, so there are no need to install Gnus -to use it, and you must not use gnus-mime for SEMI. - - It requires APEL, FLIM and SEMI packages, so please get and install -them before to install it. T-gnus 6.15 requires APEL 10.0 or later, -FLIM (1.13.1 or later) and SEMI/WEMI (1.13.5 or later). You can get -these packages from: - -ftp://ftp.m17n.org/pub/mule/apel/ -ftp://ftp.m17n.org/pub/mule/flim/flim-1.13/ -ftp://ftp.m17n.org/pub/mule/semi/semi-1.13-for-flim-1.13/ - -Required environment for SEMI is written in README.en of SEMI package. - - In addition, if you wish to use the web based backend `nnshimbun', -you have to install the package Emacs-W3M and the external command W3M. -Visit the following pages for more information. - -http://emacs-w3m.namazu.org/ -http://ei5nazha.yz.yamagata-u.ac.jp/~aito/w3m/ - - -How to get? (via CVS) -===================== - -(0) cvs login (first time only) - - % cvs -d :pserver:anonymous@cvs.m17n.org:/cvs/root login - - CVS password: [CR] # NULL string - -(1) checkout - - % cvs -d :pserver:anonymous@cvs.m17n.org:/cvs/root \ - checkout -r t-gnus-6_15-quimby gnus - -(2) compile - - % cd gnus - % configure [options] - % make [options] - -(3) update - - % cvs update -r t-gnus-6_15-quimby gnus - -Major tags are following: - - t-gnus-6_15-quimby Assigned to the latest version of T-gnus for - developing and synchronizing with Oort Gnus. - - t-gnus-6_15 Assigned to the latest version of T-gnus for - developing and synchronizing with the released - version of Oort Gnus. - - pgnus-ichikawa The main trunk of T-gnus. - - semi-gnus Assigned to the latest stable version. It is - very conservative. Currently it is not used. - - for-semi-N1_N2 assigned to the latest stable version for SEMI - API N1.N2 (N1 and N2 are natural number). - (e.g. `for-semi-1_3' is for SEMI API 1.3) - - gnus-N1_N2_N3 assigned to gnus(Gnus) N1.N2.N3 - (e.g. `gnus-6_2_1' means gnus 6.2.1). - - larsi Original Gnus - - himi himi branch - - akr akr branch - - shuhei-k shuhei-k branch - Mail-Followup-To/Mail-Reply-To, gnus-cache fix. - - keiichi keiichi branch - nana-gnus-N1_N2 Stable version of `keiichi branch'. - -For more detailed information, please read README.branch. - - -How to get? (via ftp) -===================== - - T-gnus 6.15 is available from - - ftp://ftp.jpl.org/pub/elisp/t-gnus-6.15/snapshots/ - - NOTE: These snapshots are manually created when the urge takes the - administrator of the a-ftp site, and will usually not be tested. - - -How to join development -======================= - - If you have found a bug in Gnus proper, please do `M-x gnus-bug' and -send a bug report to the Gnus maintainers. - - If you have found a bug in T-gnus, or if you're not sure whether it -is a Gnus proper, please send a bug report to the Semi-gnus mailing -list: - - semi-gnus-en@meadowy.org (English) - semi-gnus-ja@meadowy.org (Japanese) - -Suggestions for T-gnus improvements are also welcome. - - Via the Semi-gnus ML, you can report T-gnus related bugs, obtain the -latest release of T-gnus, and discuss future enhancements to T-gnus. -To join the Semi-gnus ML, send an empty e-mail to - - semi-gnus-en-help@meadowy.org (English) - semi-gnus-ja-help@meadowy.org (Japanese) - - In addition, we need developers. If you would like to develop it, -please send mail to cvs@cvs.m17n.org with your account name and your -public key for ssh. cvsroot is :ext:cvs@cvs.m17n.org:/cvs/root. -If you cannot use ssh, please send UNIX /etc/passwd style crypted -password instead. cvsroot is -:pserver:@cvs.m17n.org:/cvs/root in this case. You can -get the notice of modifications in m17n open CVS server via the mail -which also contains informations on the other modules. To subscribe -it, send an empty e-mail to - - cvs-info-help@cvs.m17n.org diff --git a/README.semi.ja b/README.semi.ja deleted file mode 100644 index a266e80..0000000 --- a/README.semi.ja +++ /dev/null @@ -1,135 +0,0 @@ -$B$3$N%Q%C%1!<%8$K$O(B T-gnus 6.15 $B$,F~$C$F$$$^$9!#(B - -T-gnus $B$H$O!)(B -============= - - T-gnus $B$O(B SEMI $B$N$?$a$N(B gnus-mime $B$H(B Gnus $B$NAH9g$;$rCV$-49$($k$b$N$G(B -$B$9!#(BGnus $B$H(B gnus-mime $B$NA4$F$N5!G=$r;}$C$F$$$^$9$N$G!"$3$l$r;HMQ$9$k$?(B -$B$a$K(B Gnus $B$r%$%s%9%H!<%k$9$kI,MW$O$J$/!"(BSEMI $B$N$?$a$N(B gnus-mime $B$O;HMQ(B -$B$7$F$O$$$1$^$;$s!#(B - - APEL, FLIM $B$*$h$S(B SEMI $B%Q%C%1!<%8$,I,MW$G$9$N$G!"%$%s%9%H!<%k$9$kA0(B -$B$K$=$l$i$r%$%s%9%H!<%k$7$F$/$@$5$$!#(BT-gnus 6.15 $B$O(B APEL 10.0 $B0J>e!"(B -FLIM (1.13.1 $B0J>e(B) $B$*$h$S(B SEMI/WEMI (1.13.5 $B0J>e(B) $B$rI,MW$H$7$^$9!#$=$l(B -$B$i$N%Q%C%1!<%8$O(B - -ftp://ftp.m17n.org/pub/mule/apel/ -ftp://ftp.m17n.org/pub/mule/flim/flim-1.13/ -ftp://ftp.m17n.org/pub/mule/semi/semi-1.13-for-flim-1.13/ - -$B$+$iH$7$F(B -$B$/$@$5$$!#(B - - $B2C$($F!"(B`nnshimbun' $B$r;H$$$?$$>l9g$K$O!"(BEmacs-W3M $B%Q%C%1!<%8$H30It(B -$B%3%^%s%I$N(B W3M $B$,I,MW$G$9!#>\$7$$$3$H$O0J2<$N%Z!<%8$r$4Mw2<$5$$!#(B - -http://emacs-w3m.namazu.org/ -http://ei5nazha.yz.yamagata-u.ac.jp/~aito/w3m/ - - -$Bo$KJ]\$7$/$O!"(BREADME.branch.ja $B$r;2>H$7$F$/$@$5$$!#(B - - -$Bl=j$+$i-Mh$N3HD%$r5DO@$7$?$j$9$k$3$H$,$G$-$^(B - $B$9!#(BSemi-gnus ML $B$K;22C$9$k$?$a$K$O(B - - semi-gnus-en-help@meadowy.org ($B1Q8l(B) - semi-gnus-ja-help@meadowy.org ($BF|K\8l(B) - - $B$K6u$N%a!<%k$rAw$C$F$/$@$5$$!#(B - - $B2C$($F!"3+H/l9g$O!"(B - cvs@cvs.m17n.org $B$K%"%+%&%s%HL>$H(B ssh $B$N8x3+80$rAw$C$F$/$@$5$$!#(Bssh - $B7PM3$G$N(B cvsroot $B$O(B :ext:cvs@cvs.m17n.org:/cvs/root $B$H$J$j$^$9!#$I$&(B - $B$7$F$b(B ssh $B$,;H$($J$$>l9g!"(BUNIX $B$N(B /etc/passwd $B$NMM<0$G0E9f2=$5$l$?(B - $B%Q%9%o!<%I$r%a!<%k$rAw$C$F$/$@$5$$!#$3$N>l9g(B cvsroot $B$O(B - :pserver:<$B%"%+%&%s%HL>(B>@cvs.m17n.org:/cvs/root $B$H$J$j$^$9!#(Bm17n open - CVS server $B$G9T$J$o$l$?JQ99$r%a!<%k$GDLCN$7$F$b$i$&$3$H$b2DG=$G$9!#(B - $B$3$l$K$O(B gnus $B0J30$N(B module $B$K4X$9$k>pJs$b4^$^$l$^$9!#I,MW$JJ}$O(B - - cvs-info-help@cvs.m17n.org - - $B$K6u$N%a!<%k$rAw$C$F0FFb$K=>$C$F2<$5$$!#(B diff --git a/TODO.ja b/TODO.ja deleted file mode 100644 index 0223ce8..0000000 --- a/TODO.ja +++ /dev/null @@ -1,110 +0,0 @@ --*- mode: text; left-margin: 4; fill-column: 70; -*- - -To do list. - -;; $BBP:v:Q$N$b$N$O!"E,Ev$J%?%$%_%s%0(B($B%j%j!<%9;~(B?)$B$G:o=|$7$F$/$@$5$$!#(B -;; $B$^$?!"3F(B personal branch $B$GBP:vCf!"$^$?$OBP:v:Q$N$b$N$K4X$7$F$O$=$N(B -;; $B;]$r5-:\$7$F$/$@$5$$!#(B - ------------ $BL$BP:v(B ----------- - -*1998/09/25-1 message/partial $B$N7k9g5!G=$N2~NI(B - - Subject $B$G(B summary $B$r8!:w$9$kBe$o$j$K!"(Bgnus-newsgroup-headers $B$J(B - $B$I$N>pJs$r;H$C$F!"3N$l$K(B Message-Id $B$rIU2C$9$k!#(B - - 1998/09/28 - $B40N;(B - -*1998/10/02-5 Edit article $B;~$K%a%C%;!<%8$rGK2u$9$kLdBj(B - - 1998/10/29 - $B40N;(B - -*1998/10/02-6 smtpmail.el $B:o=|(B - - 1998/??/?? - $B40N;(B - -*1998/10/02-8 User-Agent $B%X%C%@!$C$?7A<0$KJQ99$9$k!#(B - - 1998/11/02 - $B40N;(B - -*1998/10/02-10 $B$O$8$a$F(B gnus-agent $B$r;HMQ$7$?$H$-$NLdBj(B - - 1998/10/16 - $B40N;(B (cf. semi-gnus-ja: 1482, 1536) - -*1998/10/02-11 message.el $B$NFHN)$7$?;HMQ;~$NLdBj(B - - gnus $B$K0MB8$9$k$b$N$r(B gnus-msg.el $B$K0\F0!#(B - - 1998/10/03 - $B40N;(B - -*1998/10/03-01 $BG$0U%a%C%;!<%8(B cite $B5!G=$Nl9g!"DL>o$N%F%-%9%H!&%G!<(B - $B%?$H$7$FJ]B8$7$F$$$k$,!"$3$l$r(B network $B7A<0$GJ]B8$9$k$h$&$KJQ99$7!"(B - $B:FJT=8$O(B decode $B$7$F$+$i9T$$!"Aw?.$O$=$N$^$^$N7A<0$G9T$&$h$&$K$9$k!#(B - - 1998/10/17 - $B40N;(B - -*1998/10/16-2 Offline $B;~$K:n@.$7$?%a%C%;!<%8$N(B Message-Id $BLdBj(B - - Offline $B;~$K%a%C%;!<%8$r:n@.$7$?>l9g!"(B Message-Id $B$N7A<0$,ITEv$J$b(B - $B$N$K$J$C$F$7$^$&$,!"8=>u$G$O(B Message-ID $B$rIU$1$J$$;v$GBP:v!#(B - - 1998/09/28 - $B40N;(B - -*1998/11/05-1 Cancel-Lock - - $B%K%e!<%9Aw?.;~(B Cancel-Lock $B%U%#!<%k%I$rIU2C$9$k!#(B - Cancel/Replaces/Supersedes $B$N$H$-$O(B Cancel-Key $B%U%#!<%k%I$rIU2C$9$k!#(B - - 1999/01/12 - $B40N;(B - -*1998/10/02-7 smtp.el $B0\F0(B - - smtp.el $B$O!"B>$N(B package $B$G$b;HMQ$9$k2DG=@-$,$"$k$N$G!"(B FLIM $B$K0\(B - $BF0$9$k!#(B - $B$=$NA0$K!"(B shuhei-k $B;^$N(B smtp.el $B$H$N;EMM$r6&DL2=$9$kI,MW$,$"$k!#(B - - 1998/12/02 - $B40N;(B diff --git a/aclocal.m4 b/aclocal.m4 deleted file mode 100644 index aec56f3..0000000 --- a/aclocal.m4 +++ /dev/null @@ -1,270 +0,0 @@ -AC_DEFUN(AC_DEFINE_GNUS_PRODUCT_NAME, - [echo $ac_n "defining gnus product name... $ac_c" - AC_CACHE_VAL(EMACS_cv_GNUS_PRODUCT_NAME,[EMACS_cv_GNUS_PRODUCT_NAME=$1]) - GNUS_PRODUCT_NAME=${EMACS_cv_GNUS_PRODUCT_NAME} - AC_MSG_RESULT(${GNUS_PRODUCT_NAME}) - AC_SUBST(GNUS_PRODUCT_NAME)]) - -AC_DEFUN(AC_CHECK_EMACS, - [dnl Check for Emacsen. - - dnl Apparently, if you run a shell window in Emacs, it sets the EMACS - dnl environment variable to 't'. Lets undo the damage. - test x$EMACS = xt && EMACS= - - dnl Ignore cache. - unset ac_cv_prog_EMACS; unset ac_cv_prog_XEMACS; - - AC_ARG_WITH(emacs, - [ --with-emacs=EMACS compile with EMACS [EMACS=emacs, mule...]], - [if test x$withval = xyes -o x$withval = x; then - AC_CHECK_PROGS(EMACS, emacs xemacs mule, emacs) - else - AC_CHECK_PROG(EMACS, $withval, $withval, emacs) - fi]) - AC_ARG_WITH(xemacs, - [ --with-xemacs=XEMACS compile with XEMACS [XEMACS=xemacs]], - [if test x$withval = xyes -o x$withval = x; then - AC_CHECK_PROG(XEMACS, xemacs, xemacs, xemacs) - else - AC_CHECK_PROG(XEMACS, $withval, $withval, xemacs) - fi - EMACS=$XEMACS], - [XEMACS=xemacs - test x$EMACS = x &&\ - AC_CHECK_PROGS(EMACS, emacs xemacs mule, emacs)]) - AC_SUBST(EMACS) - AC_SUBST(XEMACS)]) - -AC_DEFUN(AC_EMACS_LISP, [ -elisp="$2" -if test -z "$3"; then - AC_MSG_CHECKING(for $1) -fi -AC_CACHE_VAL(EMACS_cv_SYS_$1,[ - OUTPUT=./conftest-$$ - echo ${EMACS}' -batch -eval '\''(let ((x '${elisp}')) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil "'${OUTPUT}'" nil 5))'\' >& AC_FD_CC 2>&1 - eval ${EMACS}' -batch -eval '\''(let ((x '${elisp}')) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil "'${OUTPUT}'" nil 5))'\' >& AC_FD_CC 2>&1 - retval=`cat ${OUTPUT}` - echo "=> ${retval}" >& AC_FD_CC 2>&1 - rm -f ${OUTPUT} - EMACS_cv_SYS_$1=$retval -]) -$1=${EMACS_cv_SYS_$1} -if test -z "$3"; then - AC_MSG_RESULT($$1) -fi -]) - -AC_DEFUN(AC_CHECK_EMACS_FLAVOR, - [AC_MSG_CHECKING([what a flavor does $EMACS have]) - - dnl Ignore cache. - unset EMACS_cv_SYS_flavor; - - AC_EMACS_LISP(flavor, - (cond ((featurep (quote xemacs)) \"XEmacs\")\ - ((boundp (quote MULE)) \"MULE\")\ - (t \"FSF Emacs\")), - "noecho") - case $EMACS_cv_SYS_flavor in - XEmacs) - EMACS_FLAVOR=xemacs;; - MULE) - EMACS_FLAVOR=mule;; - *) - EMACS_FLAVOR=emacs;; - esac - AC_MSG_RESULT($EMACS_cv_SYS_flavor)]) - -AC_DEFUN(AC_PATH_LISPDIR, [ - AC_CHECK_EMACS_FLAVOR - if test "$prefix" = "NONE"; then - AC_MSG_CHECKING([prefix for your Emacs]) - AC_EMACS_LISP(prefix,(expand-file-name \"..\" invocation-directory),"noecho") - prefix=${EMACS_cv_SYS_prefix} - AC_MSG_RESULT($prefix) - fi - AC_ARG_WITH(lispdir, - [ --with-lispdir=DIR Where to install lisp files - (for XEmacs package, use --with-packagedir instead)], - lispdir=${withval}) - AC_MSG_CHECKING([where lisp files should go]) - if test -z "$lispdir"; then - dnl Set default value - theprefix=$prefix - if test "x$theprefix" = "xNONE"; then - theprefix=$ac_default_prefix - fi - lispdir="\$(datadir)/${EMACS_FLAVOR}/site-lisp/${GNUS_PRODUCT_NAME}" - for thedir in share lib; do - potential= - if test -d ${theprefix}/${thedir}/${EMACS_FLAVOR}/site-lisp; then - lispdir="\$(prefix)/${thedir}/${EMACS_FLAVOR}/site-lisp/${GNUS_PRODUCT_NAME}" - break - fi - done - fi - if test ${EMACS_FLAVOR} = xemacs; then - AC_MSG_RESULT([$lispdir - (it will be ignored when \"make install-package[[-ja]]\" is done)]) - else - AC_MSG_RESULT([$lispdir]) - fi - AC_SUBST(lispdir) -]) - -AC_DEFUN(AC_PATH_ETCDIR, [ - AC_ARG_WITH(etcdir,[ --with-etcdir=DIR Where to install etc files], etcdir=${withval}) - AC_MSG_CHECKING([where etc files should go]) - if test -z "$etcdir"; then - dnl Set default value - etcdir="\$(lispdir)/../etc" - fi - AC_MSG_RESULT($etcdir) - AC_SUBST(etcdir) -]) - -dnl -dnl Check whether a function exists in a library -dnl All '_' characters in the first argument are converted to '-' -dnl -AC_DEFUN(AC_EMACS_CHECK_LIB, [ -if test -z "$3"; then - AC_MSG_CHECKING(for $2 in $1) -fi -library=`echo $1 | tr _ -` -AC_EMACS_LISP($1,(progn (fmakunbound (quote $2)) (condition-case nil (progn (require (quote $library)) (fboundp (quote $2))) (error (prog1 nil (message \"$library not found\"))))),"noecho") -if test "${EMACS_cv_SYS_$1}" = "nil"; then - EMACS_cv_SYS_$1=no -fi -if test "${EMACS_cv_SYS_$1}" = "t"; then - EMACS_cv_SYS_$1=yes -fi -HAVE_$1=${EMACS_cv_SYS_$1} -AC_SUBST(HAVE_$1) -if test -z "$3"; then - AC_MSG_RESULT($HAVE_$1) -fi -]) - -dnl -dnl Perform sanity checking and try to locate the W3 package -dnl -AC_DEFUN(AC_CHECK_W3, [ -AC_MSG_CHECKING(for acceptable W3 version) - -dnl Ignore cache. -unset EMACS_cv_ACCEPTABLE_W3; -unset EMACS_cv_SYS_w3_dir; -unset EMACS_cv_SYS_w3_forms; - -AC_CACHE_VAL(EMACS_cv_ACCEPTABLE_W3,[ -AC_EMACS_CHECK_LIB(w3_forms, w3-form-encode-xwfu,"noecho") -if test "${HAVE_w3_forms}" = "yes"; then - EMACS_cv_ACCEPTABLE_W3=yes -else - EMACS_cv_ACCEPTABLE_W3= -fi - -if test "x${EMACS_cv_ACCEPTABLE_W3}" = "xyes"; then - AC_EMACS_LISP(w3_dir,(file-name-directory (locate-library \"w3-forms\")),"noecho") - EMACS_cv_ACCEPTABLE_W3=$EMACS_cv_SYS_w3_dir -fi -]) - AC_ARG_WITH(w3,[ --with-w3=DIR Specify where to find the w3 package], [ EMACS_cv_ACCEPTABLE_W3=`( cd $withval && pwd || echo "$withval" ) 2> /dev/null` ]) - W3=${EMACS_cv_ACCEPTABLE_W3} - AC_SUBST(W3) - if test "x${EMACS_cv_ACCEPTABLE_W3}" = "x"; then - AC_MSG_RESULT(not found) - else - AC_MSG_RESULT(${W3}) - fi -]) - -dnl -dnl Perform sanity checking and try to locate the W3 package -dnl -AC_DEFUN(AC_CHECK_URL, [ -AC_MSG_CHECKING(for acceptable URL version) - -dnl Ignore cache. -unset EMACS_cv_ACCEPTABLE_URL; -unset EMACS_cv_SYS_url_dir; -unset EMACS_cv_SYS_url; - -AC_CACHE_VAL(EMACS_cv_ACCEPTABLE_URL,[ -AC_EMACS_CHECK_LIB(url, url-retrieve, "noecho") -if test "${HAVE_url}" = "yes"; then - EMACS_cv_ACCEPTABLE_URL=yes -else - EMACS_cv_ACCEPTABLE_URL= -fi - -if test "x${EMACS_cv_ACCEPTABLE_URL}" = "xyes"; then - AC_EMACS_LISP(url_dir,(file-name-directory (locate-library \"url\")),"noecho") - EMACS_cv_ACCEPTABLE_URL=$EMACS_cv_SYS_url_dir -fi -]) - AC_ARG_WITH(url,[ --with-url=DIR Specify where to find the url package], [ EMACS_cv_ACCEPTABLE_URL=`( cd $withval && pwd || echo "$withval" ) 2> /dev/null` ]) - URL=${EMACS_cv_ACCEPTABLE_URL} - AC_SUBST(URL) - if test "x${EMACS_cv_ACCEPTABLE_URL}" = "x"; then - AC_MSG_RESULT(not found) - else - AC_MSG_RESULT("${URL}") - fi -]) - -AC_DEFUN(AC_EXAMINE_PACKAGEDIR, - [dnl Examine PACKAGEDIR. - AC_EMACS_LISP(PACKAGEDIR, - (let (package-dir)\ - (if (boundp (quote early-packages))\ - (let ((dirs (delq nil (append (if early-package-load-path\ - early-packages)\ - (if late-package-load-path\ - late-packages)\ - (if last-package-load-path\ - last-packages)))))\ - (while (and dirs (not package-dir))\ - (if (file-directory-p (car dirs))\ - (setq package-dir (car dirs)\ - dirs (cdr dirs))))))\ - (or package-dir \"\")), - "noecho")]) - -AC_DEFUN(AC_PATH_PACKAGEDIR, - [dnl Check for PACKAGEDIR. - if test ${EMACS_FLAVOR} = xemacs; then - AC_MSG_CHECKING([where the XEmacs package is]) - AC_ARG_WITH(packagedir, - [ --with-packagedir=DIR package DIR for XEmacs], - [if test x$withval != xyes -a x$withval != x; then - PACKAGEDIR=$withval - else - AC_EXAMINE_PACKAGEDIR - fi], - AC_EXAMINE_PACKAGEDIR) - if test x$PACKAGEDIR = x; then - AC_MSG_RESULT(not found) - else - AC_MSG_RESULT($PACKAGEDIR) - fi - else - PACKAGEDIR= - fi - AC_SUBST(PACKAGEDIR)]) - -AC_DEFUN(AC_ADD_LOAD_PATH, - [dnl Check for additional load path. - AC_ARG_WITH(addpath, - [ --with-addpath=PATH search Emacs-Lisp libraries with PATH - use colons to separate directory names], - [if test x$withval != xyes -a x$withval != x; then - AC_MSG_CHECKING([where to find the additional elisp libraries]) - ADDITIONAL_LOAD_PATH=$withval - AC_MSG_RESULT($ADDITIONAL_LOAD_PATH) - fi], - ADDITIONAL_LOAD_PATH=) - AC_SUBST(ADDITIONAL_LOAD_PATH)]) diff --git a/configure b/configure deleted file mode 100755 index d93cbb7..0000000 --- a/configure +++ /dev/null @@ -1,1595 +0,0 @@ -#! /bin/sh - -# Guess values for system-dependent variables and create Makefiles. -# Generated automatically using autoconf version 2.14.1 -# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. -# -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. - -# Defaults: -ac_help= -ac_default_prefix=/usr/local -# Any additions from configure.in: -ac_help="$ac_help - --with-emacs=EMACS compile with EMACS [EMACS=emacs, mule...]" -ac_help="$ac_help - --with-xemacs=XEMACS compile with XEMACS [XEMACS=xemacs]" -ac_help="$ac_help - --with-lispdir=DIR Where to install lisp files - (for XEmacs package, use --with-packagedir instead)" -ac_help="$ac_help - --with-etcdir=DIR Where to install etc files" -ac_help="$ac_help - --with-url=DIR Specify where to find the url package" -ac_help="$ac_help - --with-w3=DIR Specify where to find the w3 package" -ac_help="$ac_help - --with-packagedir=DIR package DIR for XEmacs" -ac_help="$ac_help - --with-addpath=PATH search Emacs-Lisp libraries with PATH - use colons to separate directory names" - -# Initialize some variables set by options. -# The variables have the same names as the options, with -# dashes changed to underlines. -build=NONE -cache_file=./config.cache -exec_prefix=NONE -host=NONE -no_create= -nonopt=NONE -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -target=NONE -verbose= -x_includes=NONE -x_libraries=NONE -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datadir='${prefix}/share' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -libdir='${exec_prefix}/lib' -includedir='${prefix}/include' -oldincludedir='/usr/include' -infodir='${prefix}/info' -mandir='${prefix}/man' - -# Initialize some other variables. -subdirs= -MFLAGS= MAKEFLAGS= -SHELL=${CONFIG_SHELL-/bin/sh} -# Maximum number of lines to put in a shell here document. -ac_max_here_lines=12 - -ac_prev= -for ac_option -do - - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval "$ac_prev=\$ac_option" - ac_prev= - continue - fi - - case "$ac_option" in - -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) ac_optarg= ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case "$ac_option" in - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir="$ac_optarg" ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build="$ac_optarg" ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file="$ac_optarg" ;; - - -datadir | --datadir | --datadi | --datad | --data | --dat | --da) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ - | --da=*) - datadir="$ac_optarg" ;; - - -disable-* | --disable-*) - ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - eval "enable_${ac_feature}=no" ;; - - -enable-* | --enable-*) - ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "enable_${ac_feature}='$ac_optarg'" ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix="$ac_optarg" ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he) - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat << EOF -Usage: configure [options] [host] -Options: [defaults in brackets after descriptions] -Configuration: - --cache-file=FILE cache test results in FILE - --help print this message - --no-create do not create output files - --quiet, --silent do not print \`checking...' messages - --version print the version of autoconf that created configure -Directory and file names: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [same as prefix] - --bindir=DIR user executables in DIR [EPREFIX/bin] - --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] - --libexecdir=DIR program executables in DIR [EPREFIX/libexec] - --datadir=DIR read-only architecture-independent data in DIR - [PREFIX/share] - --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data in DIR - [PREFIX/com] - --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] - --libdir=DIR object code libraries in DIR [EPREFIX/lib] - --includedir=DIR C header files in DIR [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] - --infodir=DIR info documentation in DIR [PREFIX/info] - --mandir=DIR man documentation in DIR [PREFIX/man] - --srcdir=DIR find the sources in DIR [configure dir or ..] - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM - run sed PROGRAM on installed program names -EOF - cat << EOF -Host type: - --build=BUILD configure for building on BUILD [BUILD=HOST] - --host=HOST configure for HOST [guessed] - --target=TARGET configure for TARGET [TARGET=HOST] -Features and packages: - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --x-includes=DIR X include files are in DIR - --x-libraries=DIR X library files are in DIR -EOF - if test -n "$ac_help"; then - echo "--enable and --with options recognized:$ac_help" - fi - exit 0 ;; - - -host | --host | --hos | --ho) - ac_prev=host ;; - -host=* | --host=* | --hos=* | --ho=*) - host="$ac_optarg" ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir="$ac_optarg" ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir="$ac_optarg" ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir="$ac_optarg" ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir="$ac_optarg" ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst \ - | --locals | --local | --loca | --loc | --lo) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* \ - | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) - localstatedir="$ac_optarg" ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir="$ac_optarg" ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir="$ac_optarg" ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix="$ac_optarg" ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix="$ac_optarg" ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix="$ac_optarg" ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name="$ac_optarg" ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir="$ac_optarg" ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir="$ac_optarg" ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site="$ac_optarg" ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir="$ac_optarg" ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir="$ac_optarg" ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target="$ac_optarg" ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers) - echo "configure generated by autoconf version 2.14.1" - exit 0 ;; - - -with-* | --with-*) - ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "with_${ac_package}='$ac_optarg'" ;; - - -without-* | --without-*) - ac_package=`echo $ac_option|sed -e 's/-*without-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - eval "with_${ac_package}=no" ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes="$ac_optarg" ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries="$ac_optarg" ;; - - -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } - ;; - - *) - if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then - echo "configure: warning: $ac_option: invalid host type" 1>&2 - fi - if test "x$nonopt" != xNONE; then - { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } - fi - nonopt="$ac_option" - ;; - - esac -done - -if test -n "$ac_prev"; then - { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } -fi - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -# File descriptor usage: -# 0 standard input -# 1 file creation -# 2 errors and warnings -# 3 some systems may open it to /dev/tty -# 4 used on the Kubota Titan -# 6 checking for... messages and results -# 5 compiler messages saved in config.log -if test "$silent" = yes; then - exec 6>/dev/null -else - exec 6>&1 -fi -exec 5>./config.log - -echo "\ -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. -" 1>&5 - -# Strip out --no-create and --no-recursion so they do not pile up. -# Also quote any args containing shell metacharacters. -ac_configure_args= -for ac_arg -do - case "$ac_arg" in - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) ;; - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) - ac_configure_args="$ac_configure_args '$ac_arg'" ;; - *) ac_configure_args="$ac_configure_args $ac_arg" ;; - esac -done - -# NLS nuisances. -# Only set these to C if already set. These must not be set unconditionally -# because not all systems understand e.g. LANG=C (notably SCO). -# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! -# Non-C LC_CTYPE values break the ctype check. -if test "${LANG+set}" = set; then LANG=C; export LANG; fi -if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi -if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi -if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -rf conftest* confdefs.h -# AIX cpp loses on an empty file, so make sure it contains at least a newline. -echo > confdefs.h - -# A filename unique to this package, relative to the directory that -# configure is in, which we can look for to find out if srcdir is correct. -ac_unique_file=lisp/gnus.el - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then its parent. - ac_prog=$0 - ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` - test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. - srcdir=$ac_confdir - if test ! -r $srcdir/$ac_unique_file; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r $srcdir/$ac_unique_file; then - if test "$ac_srcdir_defaulted" = yes; then - { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } - else - { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } - fi -fi -srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` - -# Prefer explicitly selected file to automatically selected ones. -if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi -fi -for ac_site_file in $CONFIG_SITE; do - if test -r "$ac_site_file"; then - echo "loading site script $ac_site_file" - . "$ac_site_file" - fi -done - -if test -r "$cache_file"; then - echo "loading cache $cache_file" - test -f "$cache_file" && . $cache_file -else - echo "creating cache $cache_file" - > $cache_file -fi - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -ac_exeext= -ac_objext=o -if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then - # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. - if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then - ac_n= ac_c=' -' ac_t=' ' - else - ac_n=-n ac_c= ac_t= - fi -else - ac_n= ac_c='\c' ac_t= -fi - - -echo $ac_n "defining gnus product name... $ac_c" - if eval "test \"\${EMACS_cv_GNUS_PRODUCT_NAME+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - EMACS_cv_GNUS_PRODUCT_NAME=t-gnus -fi - - GNUS_PRODUCT_NAME=${EMACS_cv_GNUS_PRODUCT_NAME} - echo "$ac_t""${GNUS_PRODUCT_NAME}" 1>&6 - -echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 -echo "configure:554: checking whether ${MAKE-make} sets \${MAKE}" >&5 -set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` -if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftestmake <<\EOF -all: - @echo 'ac_maketemp="${MAKE}"' -EOF -# GNU make sometimes prints "make[1]: Entering...", which would confuse us. -eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=` -if test -n "$ac_maketemp"; then - eval ac_cv_prog_make_${ac_make}_set=yes -else - eval ac_cv_prog_make_${ac_make}_set=no -fi -rm -f conftestmake -fi -if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then - echo "$ac_t""yes" 1>&6 - SET_MAKE= -else - echo "$ac_t""no" 1>&6 - SET_MAKE="MAKE=${MAKE-make}" -fi - -ac_aux_dir= -for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do - if test -f $ac_dir/install-sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f $ac_dir/install.sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - fi -done -if test -z "$ac_aux_dir"; then - { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } -fi -ac_config_guess="$SHELL $ac_aux_dir/config.guess" -ac_config_sub="$SHELL $ac_aux_dir/config.sub" -ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# ./install, which can be erroneously created by make from ./install.sh. -echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 -echo "configure:611: checking for a BSD compatible install" >&5 -if test -z "$INSTALL"; then -if eval "test \"\${ac_cv_path_install+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" - for ac_dir in $PATH; do - # Account for people who put trailing slashes in PATH elements. - case "$ac_dir/" in - /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - if test -f $ac_dir/$ac_prog; then - if test $ac_prog = install && - grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus $ac_dir/$ac_prog >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - ac_cv_path_install="$ac_dir/$ac_prog -c" - break 2 - fi - fi - done - ;; - esac - done - IFS="$ac_save_IFS" - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL="$ac_cv_path_install" - else - # As a last resort, use the slow shell script. We don't cache a - # path for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the path is relative. - INSTALL="$ac_install_sh" - fi -fi -echo "$ac_t""$INSTALL" 1>&6 - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - -# Extract the first word of "makeinfo", so it can be a program name with args. -set dummy makeinfo; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:670: checking for $ac_word" >&5 -if eval "test \"\${ac_cv_prog_MAKEINFO+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$MAKEINFO"; then - ac_cv_prog_MAKEINFO="$MAKEINFO" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_MAKEINFO="makeinfo" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_MAKEINFO" && ac_cv_prog_MAKEINFO="no" -fi -fi -MAKEINFO="$ac_cv_prog_MAKEINFO" -if test -n "$MAKEINFO"; then - echo "$ac_t""$MAKEINFO" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - - test x$EMACS = xt && EMACS= - - unset ac_cv_prog_EMACS; unset ac_cv_prog_XEMACS; - - # Check whether --with-emacs or --without-emacs was given. -if test "${with_emacs+set}" = set; then - withval="$with_emacs" - if test x$withval = xyes -o x$withval = x; then - for ac_prog in emacs xemacs mule -do -# Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:711: checking for $ac_word" >&5 -if eval "test \"\${ac_cv_prog_EMACS+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$EMACS"; then - ac_cv_prog_EMACS="$EMACS" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_EMACS="$ac_prog" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -EMACS="$ac_cv_prog_EMACS" -if test -n "$EMACS"; then - echo "$ac_t""$EMACS" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -test -n "$EMACS" && break -done -test -n "$EMACS" || EMACS="emacs" - - else - # Extract the first word of "$withval", so it can be a program name with args. -set dummy $withval; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:745: checking for $ac_word" >&5 -if eval "test \"\${ac_cv_prog_EMACS+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$EMACS"; then - ac_cv_prog_EMACS="$EMACS" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_EMACS="$withval" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_EMACS" && ac_cv_prog_EMACS="emacs" -fi -fi -EMACS="$ac_cv_prog_EMACS" -if test -n "$EMACS"; then - echo "$ac_t""$EMACS" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - fi -fi - - # Check whether --with-xemacs or --without-xemacs was given. -if test "${with_xemacs+set}" = set; then - withval="$with_xemacs" - if test x$withval = xyes -o x$withval = x; then - # Extract the first word of "xemacs", so it can be a program name with args. -set dummy xemacs; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:782: checking for $ac_word" >&5 -if eval "test \"\${ac_cv_prog_XEMACS+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$XEMACS"; then - ac_cv_prog_XEMACS="$XEMACS" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_XEMACS="xemacs" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_XEMACS" && ac_cv_prog_XEMACS="xemacs" -fi -fi -XEMACS="$ac_cv_prog_XEMACS" -if test -n "$XEMACS"; then - echo "$ac_t""$XEMACS" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - else - # Extract the first word of "$withval", so it can be a program name with args. -set dummy $withval; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:813: checking for $ac_word" >&5 -if eval "test \"\${ac_cv_prog_XEMACS+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$XEMACS"; then - ac_cv_prog_XEMACS="$XEMACS" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_XEMACS="$withval" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_XEMACS" && ac_cv_prog_XEMACS="xemacs" -fi -fi -XEMACS="$ac_cv_prog_XEMACS" -if test -n "$XEMACS"; then - echo "$ac_t""$XEMACS" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - fi - EMACS=$XEMACS -else - XEMACS=xemacs - test x$EMACS = x &&\ - for ac_prog in emacs xemacs mule -do -# Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:850: checking for $ac_word" >&5 -if eval "test \"\${ac_cv_prog_EMACS+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$EMACS"; then - ac_cv_prog_EMACS="$EMACS" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_EMACS="$ac_prog" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -EMACS="$ac_cv_prog_EMACS" -if test -n "$EMACS"; then - echo "$ac_t""$EMACS" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -test -n "$EMACS" && break -done -test -n "$EMACS" || EMACS="emacs" - -fi - - - - - echo $ac_n "checking what a flavor does $EMACS have""... $ac_c" 1>&6 -echo "configure:886: checking what a flavor does $EMACS have" >&5 - - unset EMACS_cv_SYS_flavor; - - -elisp="(cond ((featurep (quote xemacs)) \"XEmacs\")\ - ((boundp (quote MULE)) \"MULE\")\ - (t \"FSF Emacs\"))" -if test -z ""noecho""; then - echo $ac_n "checking for flavor""... $ac_c" 1>&6 -echo "configure:896: checking for flavor" >&5 -fi -if eval "test \"\${EMACS_cv_SYS_flavor+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - - OUTPUT=./conftest-$$ - echo ${EMACS}' -batch -eval '\''(let ((x '${elisp}')) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil "'${OUTPUT}'" nil 5))'\' >& 5 2>&1 - eval ${EMACS}' -batch -eval '\''(let ((x '${elisp}')) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil "'${OUTPUT}'" nil 5))'\' >& 5 2>&1 - retval=`cat ${OUTPUT}` - echo "=> ${retval}" >& 5 2>&1 - rm -f ${OUTPUT} - EMACS_cv_SYS_flavor=$retval - -fi - -flavor=${EMACS_cv_SYS_flavor} -if test -z ""noecho""; then - echo "$ac_t""$flavor" 1>&6 -fi - - case $EMACS_cv_SYS_flavor in - XEmacs) - EMACS_FLAVOR=xemacs;; - MULE) - EMACS_FLAVOR=mule;; - *) - EMACS_FLAVOR=emacs;; - esac - echo "$ac_t""$EMACS_cv_SYS_flavor" 1>&6 - if test "$prefix" = "NONE"; then - echo $ac_n "checking prefix for your Emacs""... $ac_c" 1>&6 -echo "configure:928: checking prefix for your Emacs" >&5 - -elisp="(expand-file-name \"..\" invocation-directory)" -if test -z ""noecho""; then - echo $ac_n "checking for prefix""... $ac_c" 1>&6 -echo "configure:933: checking for prefix" >&5 -fi -if eval "test \"\${EMACS_cv_SYS_prefix+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - - OUTPUT=./conftest-$$ - echo ${EMACS}' -batch -eval '\''(let ((x '${elisp}')) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil "'${OUTPUT}'" nil 5))'\' >& 5 2>&1 - eval ${EMACS}' -batch -eval '\''(let ((x '${elisp}')) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil "'${OUTPUT}'" nil 5))'\' >& 5 2>&1 - retval=`cat ${OUTPUT}` - echo "=> ${retval}" >& 5 2>&1 - rm -f ${OUTPUT} - EMACS_cv_SYS_prefix=$retval - -fi - -prefix=${EMACS_cv_SYS_prefix} -if test -z ""noecho""; then - echo "$ac_t""$prefix" 1>&6 -fi - - prefix=${EMACS_cv_SYS_prefix} - echo "$ac_t""$prefix" 1>&6 - fi - # Check whether --with-lispdir or --without-lispdir was given. -if test "${with_lispdir+set}" = set; then - withval="$with_lispdir" - lispdir=${withval} -fi - - echo $ac_n "checking where lisp files should go""... $ac_c" 1>&6 -echo "configure:964: checking where lisp files should go" >&5 - if test -z "$lispdir"; then - theprefix=$prefix - if test "x$theprefix" = "xNONE"; then - theprefix=$ac_default_prefix - fi - lispdir="\$(datadir)/${EMACS_FLAVOR}/site-lisp/${GNUS_PRODUCT_NAME}" - for thedir in share lib; do - potential= - if test -d ${theprefix}/${thedir}/${EMACS_FLAVOR}/site-lisp; then - lispdir="\$(prefix)/${thedir}/${EMACS_FLAVOR}/site-lisp/${GNUS_PRODUCT_NAME}" - break - fi - done - fi - if test ${EMACS_FLAVOR} = xemacs; then - echo "$ac_t""$lispdir - (it will be ignored when \"make install-package[-ja]\" is done)" 1>&6 - else - echo "$ac_t""$lispdir" 1>&6 - fi - - - - # Check whether --with-etcdir or --without-etcdir was given. -if test "${with_etcdir+set}" = set; then - withval="$with_etcdir" - etcdir=${withval} -fi - - echo $ac_n "checking where etc files should go""... $ac_c" 1>&6 -echo "configure:995: checking where etc files should go" >&5 - if test -z "$etcdir"; then - etcdir="\$(lispdir)/../etc" - fi - echo "$ac_t""$etcdir" 1>&6 - - - -echo $ac_n "checking for acceptable URL version""... $ac_c" 1>&6 -echo "configure:1004: checking for acceptable URL version" >&5 - -unset EMACS_cv_ACCEPTABLE_URL; -unset EMACS_cv_SYS_url_dir; -unset EMACS_cv_SYS_url; - -if eval "test \"\${EMACS_cv_ACCEPTABLE_URL+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - - -if test -z ""noecho""; then - echo $ac_n "checking for url-retrieve in url""... $ac_c" 1>&6 -echo "configure:1017: checking for url-retrieve in url" >&5 -fi -library=`echo url | tr _ -` - -elisp="(progn (fmakunbound (quote url-retrieve)) (condition-case nil (progn (require (quote $library)) (fboundp (quote url-retrieve))) (error (prog1 nil (message \"$library not found\")))))" -if test -z ""noecho""; then - echo $ac_n "checking for url""... $ac_c" 1>&6 -echo "configure:1024: checking for url" >&5 -fi -if eval "test \"\${EMACS_cv_SYS_url+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - - OUTPUT=./conftest-$$ - echo ${EMACS}' -batch -eval '\''(let ((x '${elisp}')) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil "'${OUTPUT}'" nil 5))'\' >& 5 2>&1 - eval ${EMACS}' -batch -eval '\''(let ((x '${elisp}')) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil "'${OUTPUT}'" nil 5))'\' >& 5 2>&1 - retval=`cat ${OUTPUT}` - echo "=> ${retval}" >& 5 2>&1 - rm -f ${OUTPUT} - EMACS_cv_SYS_url=$retval - -fi - -url=${EMACS_cv_SYS_url} -if test -z ""noecho""; then - echo "$ac_t""$url" 1>&6 -fi - -if test "${EMACS_cv_SYS_url}" = "nil"; then - EMACS_cv_SYS_url=no -fi -if test "${EMACS_cv_SYS_url}" = "t"; then - EMACS_cv_SYS_url=yes -fi -HAVE_url=${EMACS_cv_SYS_url} - -if test -z ""noecho""; then - echo "$ac_t""$HAVE_url" 1>&6 -fi - -if test "${HAVE_url}" = "yes"; then - EMACS_cv_ACCEPTABLE_URL=yes -else - EMACS_cv_ACCEPTABLE_URL= -fi - -if test "x${EMACS_cv_ACCEPTABLE_URL}" = "xyes"; then - -elisp="(file-name-directory (locate-library \"url\"))" -if test -z ""noecho""; then - echo $ac_n "checking for url_dir""... $ac_c" 1>&6 -echo "configure:1068: checking for url_dir" >&5 -fi -if eval "test \"\${EMACS_cv_SYS_url_dir+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - - OUTPUT=./conftest-$$ - echo ${EMACS}' -batch -eval '\''(let ((x '${elisp}')) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil "'${OUTPUT}'" nil 5))'\' >& 5 2>&1 - eval ${EMACS}' -batch -eval '\''(let ((x '${elisp}')) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil "'${OUTPUT}'" nil 5))'\' >& 5 2>&1 - retval=`cat ${OUTPUT}` - echo "=> ${retval}" >& 5 2>&1 - rm -f ${OUTPUT} - EMACS_cv_SYS_url_dir=$retval - -fi - -url_dir=${EMACS_cv_SYS_url_dir} -if test -z ""noecho""; then - echo "$ac_t""$url_dir" 1>&6 -fi - - EMACS_cv_ACCEPTABLE_URL=$EMACS_cv_SYS_url_dir -fi - -fi - - # Check whether --with-url or --without-url was given. -if test "${with_url+set}" = set; then - withval="$with_url" - EMACS_cv_ACCEPTABLE_URL=`( cd $withval && pwd || echo "$withval" ) 2> /dev/null` -fi - - URL=${EMACS_cv_ACCEPTABLE_URL} - - if test "x${EMACS_cv_ACCEPTABLE_URL}" = "x"; then - echo "$ac_t""not found" 1>&6 - else - echo "$ac_t"""${URL}"" 1>&6 - fi - - -echo $ac_n "checking for acceptable W3 version""... $ac_c" 1>&6 -echo "configure:1110: checking for acceptable W3 version" >&5 - -unset EMACS_cv_ACCEPTABLE_W3; -unset EMACS_cv_SYS_w3_dir; -unset EMACS_cv_SYS_w3_forms; - -if eval "test \"\${EMACS_cv_ACCEPTABLE_W3+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - - -if test -z ""noecho""; then - echo $ac_n "checking for w3-form-encode-xwfu in w3_forms""... $ac_c" 1>&6 -echo "configure:1123: checking for w3-form-encode-xwfu in w3_forms" >&5 -fi -library=`echo w3_forms | tr _ -` - -elisp="(progn (fmakunbound (quote w3-form-encode-xwfu)) (condition-case nil (progn (require (quote $library)) (fboundp (quote w3-form-encode-xwfu))) (error (prog1 nil (message \"$library not found\")))))" -if test -z ""noecho""; then - echo $ac_n "checking for w3_forms""... $ac_c" 1>&6 -echo "configure:1130: checking for w3_forms" >&5 -fi -if eval "test \"\${EMACS_cv_SYS_w3_forms+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - - OUTPUT=./conftest-$$ - echo ${EMACS}' -batch -eval '\''(let ((x '${elisp}')) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil "'${OUTPUT}'" nil 5))'\' >& 5 2>&1 - eval ${EMACS}' -batch -eval '\''(let ((x '${elisp}')) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil "'${OUTPUT}'" nil 5))'\' >& 5 2>&1 - retval=`cat ${OUTPUT}` - echo "=> ${retval}" >& 5 2>&1 - rm -f ${OUTPUT} - EMACS_cv_SYS_w3_forms=$retval - -fi - -w3_forms=${EMACS_cv_SYS_w3_forms} -if test -z ""noecho""; then - echo "$ac_t""$w3_forms" 1>&6 -fi - -if test "${EMACS_cv_SYS_w3_forms}" = "nil"; then - EMACS_cv_SYS_w3_forms=no -fi -if test "${EMACS_cv_SYS_w3_forms}" = "t"; then - EMACS_cv_SYS_w3_forms=yes -fi -HAVE_w3_forms=${EMACS_cv_SYS_w3_forms} - -if test -z ""noecho""; then - echo "$ac_t""$HAVE_w3_forms" 1>&6 -fi - -if test "${HAVE_w3_forms}" = "yes"; then - EMACS_cv_ACCEPTABLE_W3=yes -else - EMACS_cv_ACCEPTABLE_W3= -fi - -if test "x${EMACS_cv_ACCEPTABLE_W3}" = "xyes"; then - -elisp="(file-name-directory (locate-library \"w3-forms\"))" -if test -z ""noecho""; then - echo $ac_n "checking for w3_dir""... $ac_c" 1>&6 -echo "configure:1174: checking for w3_dir" >&5 -fi -if eval "test \"\${EMACS_cv_SYS_w3_dir+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - - OUTPUT=./conftest-$$ - echo ${EMACS}' -batch -eval '\''(let ((x '${elisp}')) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil "'${OUTPUT}'" nil 5))'\' >& 5 2>&1 - eval ${EMACS}' -batch -eval '\''(let ((x '${elisp}')) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil "'${OUTPUT}'" nil 5))'\' >& 5 2>&1 - retval=`cat ${OUTPUT}` - echo "=> ${retval}" >& 5 2>&1 - rm -f ${OUTPUT} - EMACS_cv_SYS_w3_dir=$retval - -fi - -w3_dir=${EMACS_cv_SYS_w3_dir} -if test -z ""noecho""; then - echo "$ac_t""$w3_dir" 1>&6 -fi - - EMACS_cv_ACCEPTABLE_W3=$EMACS_cv_SYS_w3_dir -fi - -fi - - # Check whether --with-w3 or --without-w3 was given. -if test "${with_w3+set}" = set; then - withval="$with_w3" - EMACS_cv_ACCEPTABLE_W3=`( cd $withval && pwd || echo "$withval" ) 2> /dev/null` -fi - - W3=${EMACS_cv_ACCEPTABLE_W3} - - if test "x${EMACS_cv_ACCEPTABLE_W3}" = "x"; then - echo "$ac_t""not found" 1>&6 - else - echo "$ac_t""${W3}" 1>&6 - fi - - if test ${EMACS_FLAVOR} = xemacs; then - echo $ac_n "checking where the XEmacs package is""... $ac_c" 1>&6 -echo "configure:1216: checking where the XEmacs package is" >&5 - # Check whether --with-packagedir or --without-packagedir was given. -if test "${with_packagedir+set}" = set; then - withval="$with_packagedir" - if test x$withval != xyes -a x$withval != x; then - PACKAGEDIR=$withval - else - -elisp="(let (package-dir)\ - (if (boundp (quote early-packages))\ - (let ((dirs (delq nil (append (if early-package-load-path\ - early-packages)\ - (if late-package-load-path\ - late-packages)\ - (if last-package-load-path\ - last-packages)))))\ - (while (and dirs (not package-dir))\ - (if (file-directory-p (car dirs))\ - (setq package-dir (car dirs)\ - dirs (cdr dirs))))))\ - (or package-dir \"\"))" -if test -z ""noecho""; then - echo $ac_n "checking for PACKAGEDIR""... $ac_c" 1>&6 -echo "configure:1239: checking for PACKAGEDIR" >&5 -fi -if eval "test \"\${EMACS_cv_SYS_PACKAGEDIR+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - - OUTPUT=./conftest-$$ - echo ${EMACS}' -batch -eval '\''(let ((x '${elisp}')) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil "'${OUTPUT}'" nil 5))'\' >& 5 2>&1 - eval ${EMACS}' -batch -eval '\''(let ((x '${elisp}')) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil "'${OUTPUT}'" nil 5))'\' >& 5 2>&1 - retval=`cat ${OUTPUT}` - echo "=> ${retval}" >& 5 2>&1 - rm -f ${OUTPUT} - EMACS_cv_SYS_PACKAGEDIR=$retval - -fi - -PACKAGEDIR=${EMACS_cv_SYS_PACKAGEDIR} -if test -z ""noecho""; then - echo "$ac_t""$PACKAGEDIR" 1>&6 -fi - - fi -else - -elisp="(let (package-dir)\ - (if (boundp (quote early-packages))\ - (let ((dirs (delq nil (append (if early-package-load-path\ - early-packages)\ - (if late-package-load-path\ - late-packages)\ - (if last-package-load-path\ - last-packages)))))\ - (while (and dirs (not package-dir))\ - (if (file-directory-p (car dirs))\ - (setq package-dir (car dirs)\ - dirs (cdr dirs))))))\ - (or package-dir \"\"))" -if test -z ""noecho""; then - echo $ac_n "checking for PACKAGEDIR""... $ac_c" 1>&6 -echo "configure:1278: checking for PACKAGEDIR" >&5 -fi -if eval "test \"\${EMACS_cv_SYS_PACKAGEDIR+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - - OUTPUT=./conftest-$$ - echo ${EMACS}' -batch -eval '\''(let ((x '${elisp}')) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil "'${OUTPUT}'" nil 5))'\' >& 5 2>&1 - eval ${EMACS}' -batch -eval '\''(let ((x '${elisp}')) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil "'${OUTPUT}'" nil 5))'\' >& 5 2>&1 - retval=`cat ${OUTPUT}` - echo "=> ${retval}" >& 5 2>&1 - rm -f ${OUTPUT} - EMACS_cv_SYS_PACKAGEDIR=$retval - -fi - -PACKAGEDIR=${EMACS_cv_SYS_PACKAGEDIR} -if test -z ""noecho""; then - echo "$ac_t""$PACKAGEDIR" 1>&6 -fi - -fi - - if test x$PACKAGEDIR = x; then - echo "$ac_t""not found" 1>&6 - else - echo "$ac_t""$PACKAGEDIR" 1>&6 - fi - else - PACKAGEDIR= - fi - - # Check whether --with-addpath or --without-addpath was given. -if test "${with_addpath+set}" = set; then - withval="$with_addpath" - if test x$withval != xyes -a x$withval != x; then - echo $ac_n "checking where to find the additional elisp libraries""... $ac_c" 1>&6 -echo "configure:1315: checking where to find the additional elisp libraries" >&5 - ADDITIONAL_LOAD_PATH=$withval - echo "$ac_t""$ADDITIONAL_LOAD_PATH" 1>&6 - fi -else - ADDITIONAL_LOAD_PATH= -fi - - -trap '' 1 2 15 -cat > confcache <<\EOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs. It is not useful on other systems. -# If it contains results you don't want to keep, you may remove or edit it. -# -# By default, configure uses ./config.cache as the cache file, -# creating it if it does not exist already. You can give configure -# the --cache-file=FILE option to use a different cache file; that is -# what configure does when it calls configure scripts in -# subdirectories, so they share the cache. -# Giving --cache-file=/dev/null disables caching, for debugging configure. -# config.status only pays attention to the cache file if you give it the -# --recheck option to rerun configure. -# -EOF -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, don't put newlines in cache variables' values. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -(set) 2>&1 | - case `(ac_space=' '; set | grep ac_space) 2>&1` in - *ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote substitution - # turns \\\\ into \\, and sed turns \\ into \). - sed -n \ - -e "s/'/'\\\\''/g" \ - -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" - ;; - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' - ;; - esac >> confcache -if cmp -s $cache_file confcache; then - : -else - if test -w $cache_file; then - echo "updating cache $cache_file" - cat confcache > $cache_file - else - echo "not updating unwritable cache $cache_file" - fi -fi -rm -f confcache - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -# Any assignment to VPATH causes Sun make to only execute -# the first set of double-colon rules, so remove it if not needed. -# If there is a colon in the path, we need to keep it. -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' -fi - -trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 - -# Transform confdefs.h into DEFS. -# Protect against shell expansion while executing Makefile rules. -# Protect against Makefile macro expansion. -cat > conftest.defs <<\EOF -s%#define \([^ ][^ ]*\) *\(.*\)%-D\1=\2%g -s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g -s%\[%\\&%g -s%\]%\\&%g -s%\$%$$%g -EOF -DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '` -rm -f conftest.defs - - -# Without the "./", some shells look in PATH for config.status. -: ${CONFIG_STATUS=./config.status} - -echo creating $CONFIG_STATUS -rm -f $CONFIG_STATUS -cat > $CONFIG_STATUS </dev/null | sed 1q`: -# -# $0 $ac_configure_args -# -# Compiler output produced by configure, useful for debugging -# configure, is in ./config.log if it exists. - -ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" -for ac_option -do - case "\$ac_option" in - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" - exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; - -version | --version | --versio | --versi | --vers | --ver | --ve | --v) - echo "$CONFIG_STATUS generated by autoconf version 2.14.1" - exit 0 ;; - -help | --help | --hel | --he | --h) - echo "\$ac_cs_usage"; exit 0 ;; - *) echo "\$ac_cs_usage"; exit 1 ;; - esac -done - -ac_given_srcdir=$srcdir -ac_given_INSTALL="$INSTALL" - -trap 'rm -fr `echo "Makefile lisp/Makefile lisp/dgnuspath.el texi/Makefile etc/Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 -EOF -cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF -$ac_vpsub -$extrasub -s%@SHELL@%$SHELL%g -s%@CFLAGS@%$CFLAGS%g -s%@CPPFLAGS@%$CPPFLAGS%g -s%@CXXFLAGS@%$CXXFLAGS%g -s%@FFLAGS@%$FFLAGS%g -s%@DEFS@%$DEFS%g -s%@LDFLAGS@%$LDFLAGS%g -s%@LIBS@%$LIBS%g -s%@exec_prefix@%$exec_prefix%g -s%@prefix@%$prefix%g -s%@program_transform_name@%$program_transform_name%g -s%@bindir@%$bindir%g -s%@sbindir@%$sbindir%g -s%@libexecdir@%$libexecdir%g -s%@datadir@%$datadir%g -s%@sysconfdir@%$sysconfdir%g -s%@sharedstatedir@%$sharedstatedir%g -s%@localstatedir@%$localstatedir%g -s%@libdir@%$libdir%g -s%@includedir@%$includedir%g -s%@oldincludedir@%$oldincludedir%g -s%@infodir@%$infodir%g -s%@mandir@%$mandir%g -s%@GNUS_PRODUCT_NAME@%$GNUS_PRODUCT_NAME%g -s%@SET_MAKE@%$SET_MAKE%g -s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g -s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g -s%@INSTALL_DATA@%$INSTALL_DATA%g -s%@MAKEINFO@%$MAKEINFO%g -s%@EMACS@%$EMACS%g -s%@XEMACS@%$XEMACS%g -s%@lispdir@%$lispdir%g -s%@etcdir@%$etcdir%g -s%@HAVE_url@%$HAVE_url%g -s%@URL@%$URL%g -s%@HAVE_w3_forms@%$HAVE_w3_forms%g -s%@W3@%$W3%g -s%@PACKAGEDIR@%$PACKAGEDIR%g -s%@ADDITIONAL_LOAD_PATH@%$ADDITIONAL_LOAD_PATH%g - -CEOF -EOF - -cat >> $CONFIG_STATUS <<\EOF - -# Split the substitutions into bite-sized pieces for seds with -# small command number limits, like on Digital OSF/1 and HP-UX. -ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. -ac_file=1 # Number of current file. -ac_beg=1 # First line for current file. -ac_end=$ac_max_sed_cmds # Line after last line for current file. -ac_more_lines=: -ac_sed_cmds="" -while $ac_more_lines; do - if test $ac_beg -gt 1; then - sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file - else - sed "${ac_end}q" conftest.subs > conftest.s$ac_file - fi - if test ! -s conftest.s$ac_file; then - ac_more_lines=false - rm -f conftest.s$ac_file - else - if test -z "$ac_sed_cmds"; then - ac_sed_cmds="sed -f conftest.s$ac_file" - else - ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" - fi - ac_file=`expr $ac_file + 1` - ac_beg=$ac_end - ac_end=`expr $ac_end + $ac_max_sed_cmds` - fi -done -if test -z "$ac_sed_cmds"; then - ac_sed_cmds=cat -fi -EOF - -cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF -for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` - ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; - *) ac_file_in="${ac_file}.in" ;; - esac - - # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. - - # Remove last slash and all that follows it. Not all systems have dirname. - ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` - if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then - # The file is in a subdirectory. - test ! -d "$ac_dir" && mkdir "$ac_dir" - ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" - # A "../" for each directory in $ac_dir_suffix. - ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` - else - ac_dir_suffix= ac_dots= - fi - - case "$ac_given_srcdir" in - .) srcdir=. - if test -z "$ac_dots"; then top_srcdir=. - else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; - /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; - *) # Relative path. - srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" - top_srcdir="$ac_dots$ac_given_srcdir" ;; - esac - - case "$ac_given_INSTALL" in - [/$]*) INSTALL="$ac_given_INSTALL" ;; - *) INSTALL="$ac_dots$ac_given_INSTALL" ;; - esac - - echo creating "$ac_file" - rm -f "$ac_file" - configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." - case "$ac_file" in - *Makefile*) ac_comsub="1i\\ -# $configure_input" ;; - *) ac_comsub= ;; - esac - - ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` - sed -e "$ac_comsub -s%@configure_input@%$configure_input%g -s%@srcdir@%$srcdir%g -s%@top_srcdir@%$top_srcdir%g -s%@INSTALL@%$INSTALL%g -" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file -fi; done -rm -f conftest.s* - -EOF -cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF - -exit 0 -EOF -chmod +x $CONFIG_STATUS -rm -fr confdefs* $ac_clean_files -test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 - diff --git a/configure.in b/configure.in deleted file mode 100644 index 839c1cf..0000000 --- a/configure.in +++ /dev/null @@ -1,13 +0,0 @@ -AC_INIT(lisp/gnus.el) -AC_DEFINE_GNUS_PRODUCT_NAME(t-gnus) -AC_SET_MAKE -AC_PROG_INSTALL -AC_CHECK_PROG(MAKEINFO, makeinfo, makeinfo, no) -AC_CHECK_EMACS -AC_PATH_LISPDIR -AC_PATH_ETCDIR -AC_CHECK_URL -AC_CHECK_W3 -AC_PATH_PACKAGEDIR -AC_ADD_LOAD_PATH -AC_OUTPUT(Makefile lisp/Makefile lisp/dgnuspath.el texi/Makefile etc/Makefile) diff --git a/contrib/ChangeLog b/contrib/ChangeLog deleted file mode 100644 index be5b92b..0000000 --- a/contrib/ChangeLog +++ /dev/null @@ -1,73 +0,0 @@ -2001-08-24 16:09:14 Fabien Penso - - * gpg.el (gpg-command-sign-detached): Doc fix. - -2001-08-07 Andreas Jaeger - - * gpg.el (gpg-passphrase-forget): Don't cache - gpg-passphrase-timer. - (gpg-passphrase-store): Check if gpg-passphrase-timer is - initialized already. - -2001-07-30 16:00:00 ShengHuo ZHU - From Andreas Fuchs - - * gpg.el (gpg-command-verify): --status-fd 1 - (gpg-unabbrev-trust-alist): New. - -2001-01-18 Colin Marquardt - - * gpg.el (gpg-make-temp-file): Error info. - -2001-01-13 23:00:00 ShengHuo ZHU - - * gpg.el (gpg-build-arg-list): Use copy-sequence. - -2000-12-19 22:00:00 ShengHuo ZHU - - * gpg.el (defalias): Use eval-and-compile. - (gpg-command-all-arglist): Suggest by Jeff Senn . - -2000-12-15 00:00:00 ShengHuo ZHU - - * gpg.el (gpg-command-alist): Alist may not be defined. - -2000-12-14 23:00:00 ShengHuo ZHU - - * gpg.el (gpg-make-temp-file): Don't check file-modes of M$Windows. - -2000-12-14 10:00:00 ShengHuo ZHU - - * gpg.el (gpg-passphrase-store): Don't activate timer if it is live. - -2000-11-30 22:00:00 ShengHuo ZHU - - * gpg.el: (gpg-make-temp-file): Use expand-file-name. - (gpg-point-at-eol): New function. - (gpg-call-process): Use it. - (gpg-key-list-keys-parse-line): Ditto. - (gpg-with-passphrase-env): edebug-form-spec. - (gpg-with-temp-files): Ditto. - (gpg-show-result): Ditto. - -2000-11-08 Bj,Av(Brn Torkelsson - - * gpg.el: In Xemacs it is called point-at-eol, not - line-end-position - - * gpg.el (gpg-key-lessp): use string-lessp instead of - compare-strings (not available on XEmacs) - -2000-11-16 Simon Josefsson - - * gpg.el (gpg-command-verify-cleartext): New variable. - (gpg-verify-cleartext): New function. - -2000-10-31 17:32:02 ShengHuo ZHU - - * gpg.el (gpg-verify): The last argument of apply is a list. - (gpg-encrypt): Add passphrase as a parameter. - -;; Local Variables: -;; coding: iso-2022-7bit -;; End: diff --git a/contrib/README b/contrib/README deleted file mode 100644 index 76d0e5c..0000000 --- a/contrib/README +++ /dev/null @@ -1,3 +0,0 @@ -The files in this directory are not (yet) part of the -Gnus distribution proper. They may later become part -of the distribution, or they may disappear altogether. diff --git a/contrib/base64.el b/contrib/base64.el deleted file mode 100644 index 572a5d3..0000000 --- a/contrib/base64.el +++ /dev/null @@ -1,278 +0,0 @@ -;;; base64.el,v --- Base64 encoding functions -;; Author: Kyle E. Jones -;; Created: 1997/03/12 14:37:09 -;; Version: 1.6 -;; Keywords: extensions - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Copyright (C) 1997 Kyle E. Jones -;;; -;;; This file is not part of GNU Emacs, but the same permissions apply. -;;; -;;; GNU Emacs 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, or (at your option) -;;; any later version. -;;; -;;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;;; Boston, MA 02111-1307, USA. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(eval-when-compile (require 'cl)) - -;; For non-MULE -(if (not (fboundp 'char-int)) - (defalias 'char-int 'identity)) - -(defvar base64-alphabet - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/") - -(defvar base64-decoder-program nil - "*Non-nil value should be a string that names a MIME base64 decoder. -The program should expect to read base64 data on its standard -input and write the converted data to its standard output.") - -(defvar base64-decoder-switches nil - "*List of command line flags passed to the command named by -base64-decoder-program.") - -(defvar base64-encoder-program nil - "*Non-nil value should be a string that names a MIME base64 encoder. -The program should expect arbitrary data on its standard -input and write base64 data to its standard output.") - -(defvar base64-encoder-switches nil - "*List of command line flags passed to the command named by -base64-encoder-program.") - -(defconst base64-alphabet-decoding-alist - '( - ( ?A . 00) ( ?B . 01) ( ?C . 02) ( ?D . 03) ( ?E . 04) ( ?F . 05) - ( ?G . 06) ( ?H . 07) ( ?I . 08) ( ?J . 09) ( ?K . 10) ( ?L . 11) - ( ?M . 12) ( ?N . 13) ( ?O . 14) ( ?P . 15) ( ?Q . 16) ( ?R . 17) - ( ?S . 18) ( ?T . 19) ( ?U . 20) ( ?V . 21) ( ?W . 22) ( ?X . 23) - ( ?Y . 24) ( ?Z . 25) ( ?a . 26) ( ?b . 27) ( ?c . 28) ( ?d . 29) - ( ?e . 30) ( ?f . 31) ( ?g . 32) ( ?h . 33) ( ?i . 34) ( ?j . 35) - ( ?k . 36) ( ?l . 37) ( ?m . 38) ( ?n . 39) ( ?o . 40) ( ?p . 41) - ( ?q . 42) ( ?r . 43) ( ?s . 44) ( ?t . 45) ( ?u . 46) ( ?v . 47) - ( ?w . 48) ( ?x . 49) ( ?y . 50) ( ?z . 51) ( ?0 . 52) ( ?1 . 53) - ( ?2 . 54) ( ?3 . 55) ( ?4 . 56) ( ?5 . 57) ( ?6 . 58) ( ?7 . 59) - ( ?8 . 60) ( ?9 . 61) ( ?+ . 62) ( ?/ . 63) - )) - -(defvar base64-alphabet-decoding-vector - (let ((v (make-vector 123 nil)) - (p base64-alphabet-decoding-alist)) - (while p - (aset v (car (car p)) (cdr (car p))) - (setq p (cdr p))) - v)) - -(defvar base64-binary-coding-system 'binary) - -(defun base64-run-command-on-region (start end output-buffer command - &rest arg-list) - (let ((tempfile nil) status errstring default-process-coding-system - (coding-system-for-write base64-binary-coding-system) - (coding-system-for-read base64-binary-coding-system)) - (unwind-protect - (progn - (setq tempfile (make-temp-name "base64")) - (setq status - (apply 'call-process-region - start end command nil - (list output-buffer tempfile) - nil arg-list)) - (cond ((equal status 0) t) - ((zerop (save-excursion - (set-buffer (find-file-noselect tempfile)) - (buffer-size))) - t) - (t (save-excursion - (set-buffer (find-file-noselect tempfile)) - (setq errstring (buffer-string)) - (kill-buffer nil) - (cons status errstring))))) - (ignore-errors - (delete-file tempfile))))) - -(if (featurep 'xemacs) - (defalias 'base64-insert-char 'insert-char) - (defun base64-insert-char (char &optional count ignored buffer) - (if (or (null buffer) (eq buffer (current-buffer))) - (insert-char char count) - (with-current-buffer buffer - (insert-char char count)))) - (setq base64-binary-coding-system 'no-conversion)) - -(defun base64-decode-region (start end) - (interactive "r") - ;;(message "Decoding base64...") - (let ((work-buffer nil) - (done nil) - (counter 0) - (bits 0) - (lim 0) inputpos - (non-data-chars (concat "^=" base64-alphabet))) - (unwind-protect - (save-excursion - (setq work-buffer (generate-new-buffer " *base64-work*")) - (buffer-disable-undo work-buffer) - (if base64-decoder-program - (let* ((binary-process-output t) ; any text already has CRLFs - (status (apply 'base64-run-command-on-region - start end work-buffer - base64-decoder-program - base64-decoder-switches))) - (if (not (eq status t)) - (error "%s" (cdr status)))) - (goto-char start) - (skip-chars-forward non-data-chars end) - (while (not done) - (setq inputpos (point)) - (cond - ((> (skip-chars-forward base64-alphabet end) 0) - (setq lim (point)) - (while (< inputpos lim) - (setq bits (+ bits - (aref base64-alphabet-decoding-vector - (char-int (char-after inputpos))))) - (setq counter (1+ counter) - inputpos (1+ inputpos)) - (cond ((= counter 4) - (base64-insert-char (lsh bits -16) 1 nil work-buffer) - (base64-insert-char (logand (lsh bits -8) 255) 1 nil - work-buffer) - (base64-insert-char (logand bits 255) 1 nil - work-buffer) - (setq bits 0 counter 0)) - (t (setq bits (lsh bits 6))))))) - (cond - ((or (= (point) end) - (eq (char-after (point)) ?=)) - (if (and (= (point) end) (> counter 1)) - (message - "at least %d bits missing at end of base64 encoding" - (* (- 4 counter) 6))) - (setq done t) - (cond ((= counter 1) - (error "at least 2 bits missing at end of base64 encoding")) - ((= counter 2) - (base64-insert-char (lsh bits -10) 1 nil work-buffer)) - ((= counter 3) - (base64-insert-char (lsh bits -16) 1 nil work-buffer) - (base64-insert-char (logand (lsh bits -8) 255) - 1 nil work-buffer)) - ((= counter 0) t))) - (t (skip-chars-forward non-data-chars end))))) - (or (markerp end) (setq end (set-marker (make-marker) end))) - (goto-char start) - (insert-buffer-substring work-buffer) - (delete-region (point) end)) - (and work-buffer (kill-buffer work-buffer)))) - ;;(message "Decoding base64... done") - ) - -(defun base64-encode-region (start end &optional no-line-break) - (interactive "r") - (message "Encoding base64...") - (let ((work-buffer nil) - (counter 0) - (cols 0) - (bits 0) - (alphabet base64-alphabet) - inputpos) - (unwind-protect - (save-excursion - (setq work-buffer (generate-new-buffer " *base64-work*")) - (buffer-disable-undo work-buffer) - (if base64-encoder-program - (let ((status (apply 'base64-run-command-on-region - start end work-buffer - base64-encoder-program - base64-encoder-switches))) - (if (not (eq status t)) - (error "%s" (cdr status)))) - (setq inputpos start) - (while (< inputpos end) - (setq bits (+ bits (char-int (char-after inputpos)))) - (setq counter (1+ counter)) - (cond ((= counter 3) - (base64-insert-char (aref alphabet (lsh bits -18)) 1 nil - work-buffer) - (base64-insert-char - (aref alphabet (logand (lsh bits -12) 63)) - 1 nil work-buffer) - (base64-insert-char - (aref alphabet (logand (lsh bits -6) 63)) - 1 nil work-buffer) - (base64-insert-char - (aref alphabet (logand bits 63)) - 1 nil work-buffer) - (setq cols (+ cols 4)) - (cond ((and (= cols 72) - (not no-line-break)) - (base64-insert-char ?\n 1 nil work-buffer) - (setq cols 0))) - (setq bits 0 counter 0)) - (t (setq bits (lsh bits 8)))) - (setq inputpos (1+ inputpos))) - ;; write out any remaining bits with appropriate padding - (if (= counter 0) - nil - (setq bits (lsh bits (- 16 (* 8 counter)))) - (base64-insert-char (aref alphabet (lsh bits -18)) 1 nil - work-buffer) - (base64-insert-char (aref alphabet (logand (lsh bits -12) 63)) - 1 nil work-buffer) - (if (= counter 1) - (base64-insert-char ?= 2 nil work-buffer) - (base64-insert-char (aref alphabet (logand (lsh bits -6) 63)) - 1 nil work-buffer) - (base64-insert-char ?= 1 nil work-buffer))) - (if (and (> cols 0) - (not no-line-break)) - (base64-insert-char ?\n 1 nil work-buffer))) - (or (markerp end) (setq end (set-marker (make-marker) end))) - (goto-char start) - (insert-buffer-substring work-buffer) - (delete-region (point) end)) - (and work-buffer (kill-buffer work-buffer)))) - (message "Encoding base64... done")) - -(defun base64-encode (string &optional no-line-break) - (save-excursion - (set-buffer (get-buffer-create " *base64-encode*")) - (erase-buffer) - (insert string) - (base64-encode-region (point-min) (point-max) no-line-break) - (skip-chars-backward " \t\r\n") - (delete-region (point-max) (point)) - (prog1 - (buffer-string) - (kill-buffer (current-buffer))))) - -(defun base64-decode (string) - (save-excursion - (set-buffer (get-buffer-create " *base64-decode*")) - (erase-buffer) - (insert string) - (base64-decode-region (point-min) (point-max)) - (goto-char (point-max)) - (skip-chars-backward " \t\r\n") - (delete-region (point-max) (point)) - (prog1 - (buffer-string) - (kill-buffer (current-buffer))))) - -(defalias 'base64-decode-string 'base64-decode) -(defalias 'base64-encode-string 'base64-encode) - -(provide 'base64) diff --git a/contrib/canlock.el b/contrib/canlock.el deleted file mode 100644 index 3cce006..0000000 --- a/contrib/canlock.el +++ /dev/null @@ -1,475 +0,0 @@ -;;; canlock.el --- Functions for Cancel-Lock feature. -;; Copyright (C) 1998,1999 Katsumi Yamaoka - -;; Author: Katsumi Yamaoka -;; Yuuichi Teranishi -;; Hideyuki SHIRAI -;; Hidekazu Nakamura -;; Ken'ichi Okada -;; Shuhei KOBAYASHI -;; Created: 1998-11-24 -;; Revised: 1999-06-14 -;; Keywords: news, cancel-lock, hmac, sha1, rfc2104 - -;; 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, 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 library is based on draft-ietf-usefor-cancel-lock-01.txt, -;; released on 1998-11-03. - -;;; Code: - -(defconst canlock-version "0.6") - -(eval-when-compile (require 'cl)) -(require 'custom) -(require 'mail-utils) - -(autoload 'sha1-encode-binary "sha1") -(autoload 'base64-encode "base64") - -(defgroup canlock nil - "Cancel-Lock feature." - :prefix "canlock-" - :group 'applications) - -(defcustom canlock-base64-encode-function 'base64-encode-string - "*Function called to encode string to base64." - :type '(radio (function-item base64-encode-string) - (function-item base64-encode) - (function-item canlock-base64-encode-string-with-mmencode) - (function :tag "Other")) - :group 'canlock) - -(defcustom canlock-mmencode-program "mmencode" - "*Name of mmencode program." - :type 'string - :group 'canlock) - -(defcustom canlock-mmencode-args-for-encoding nil - "*Arguments passed to mmencode program for encoding." - :type 'sexp - :group 'canlock) - -(defcustom canlock-sha1-function 'sha1-encode-binary - "*Function called to make a SHA1 digest from a message (string)." - :type '(radio (function-item sha1-encode-binary) - (function-item canlock-sha1-with-ssleay) - (function :tag "Other")) - :group 'canlock) - -(defcustom canlock-sha1-function-for-verify canlock-sha1-function - "*Function called to make a SHA1 digest for verifying." - :type '(radio (function-item sha1-encode-binary) - (function-item canlock-sha1-with-ssleay) - (function :tag "Other")) - :group 'canlock) - -(defcustom canlock-ssleay-program "ssleay" - "*Name of SSLeay program." - :type 'string - :group 'canlock) - -(defcustom canlock-ssleay-args '("sha1") - "*Arguments passed to SSLeay program." - :type 'sexp - :group 'canlock) - -(defcustom canlock-ignore-errors nil - "*If non-nil, ignore any error signals." - :type 'boolean - :group 'canlock) - -(defcustom canlock-load-hook nil - "*Hook to be run after the canlock package has been loaded." - :type 'hook - :group 'canlock) - -;;; Internal variables. - -(defvar canlock-password nil - "*Password to use when signing a Cancel-Lock or a Cancel-Key header.") - -(defvar canlock-password-for-verify canlock-password - "*Password to use when verifying a Cancel-Lock or a Cancel-Key header.") - -(defvar canlock-force-insert-header nil - "*If non-nil, insert a Cancel-Lock or a Cancel-Key header even though the -buffer does not contain a news message.") - -;;; Functions. - -(defun canlock-base64-encode-string-with-mmencode (string) - "Encode string to base64 with mmencode." - (with-temp-buffer - (let ((coding-system-for-read 'raw-text) - (coding-system-for-write 'binary) - ;; For Mule 2 with APEL 9.12 or later. - (default-process-coding-system '(raw-text . binary)) - mc-flag program-coding-system-alist) - (insert string) - (apply 'call-process-region (point-min) (point-max) - canlock-mmencode-program t t nil - canlock-mmencode-args-for-encoding) - (goto-char (point-max)) - (skip-chars-backward "\n") - (buffer-substring (point-min) (point))))) - -(defun canlock-hex-string-to-int (string) - "Convert hexadecimal string to integer." - (let ((integer 0)) - (mapcar - (lambda (hex) - (setq integer (+ (* 16 integer) - (logand hex 15) - (* (lsh hex -6) 9)))) - string) - integer)) - -(defun canlock-sha1-with-ssleay (message) - "Make a SHA1 digest from a specified message (string) with SSLeay." - (with-temp-buffer - (let ((coding-system-for-read 'binary) - (coding-system-for-write 'binary) - ;; For Mule 2 with APEL 9.12 or later. - (default-process-coding-system '(binary . binary)) - mc-flag program-coding-system-alist - (case-fold-search t)) - (insert message) - (apply 'call-process-region (point-min) (point-max) - canlock-ssleay-program t t nil canlock-ssleay-args) - (goto-char (point-min)) - (while (re-search-forward "[0-9A-F][0-9A-F]" nil t) - (goto-char (match-beginning 0)) - (insert-char (canlock-hex-string-to-int (match-string 0)) 1) - (delete-char 2)) - (buffer-substring (point-min) (point))))) - -(defvar canlock-read-passwd nil) -(defun canlock-read-passwd (prompt &rest args) - "Read a password using PROMPT. -If ARGS, PROMPT is used as an argument to `format'." - (let ((prompt - (if args - (apply 'format prompt args) - prompt))) - (unless canlock-read-passwd - (if (or (fboundp 'read-passwd) (load "passwd" t)) - (setq canlock-read-passwd 'read-passwd) - (unless (fboundp 'ange-ftp-read-passwd) - (autoload 'ange-ftp-read-passwd "ange-ftp")) - (setq canlock-read-passwd 'ange-ftp-read-passwd))) - (funcall canlock-read-passwd prompt))) - -(defun canlock-make-cancel-key (message-id password) - "Make a Cancel-Key header." - (cond ((> (length password) 20) - (setq password (funcall canlock-sha1-function password))) - ((< (length password) 20) - (setq password (concat - password - (make-string (- 20 (length password)) 0))))) - (setq password (concat password (make-string 44 0))) - (let ((ipad (mapconcat (lambda (char) - (char-to-string (logxor 54 char))) - password "")) - (opad (mapconcat (lambda (char) - (char-to-string (logxor 92 char))) - password ""))) - (funcall canlock-base64-encode-function - (funcall canlock-sha1-function - (concat - opad - (funcall canlock-sha1-function - (concat ipad message-id))))))) - -(defun canlock-narrow-to-header () - "Narrow to the message header." - (let (case-fold-search) - (narrow-to-region - (goto-char (point-min)) - (goto-char (if (re-search-forward - (format "^$\\|^%s$" - (regexp-quote mail-header-separator)) - nil t) - (match-beginning 0) - (point-max)))))) - -(defun canlock-delete-headers () - "Delete Canlock headers if they already exist. -The buffer is expected to be narrowed to just the headers of the message." - (let ((case-fold-search t)) - (goto-char (point-min)) - (while (re-search-forward "^Cancel-\\(Key\\|Lock\\):" nil t) - (delete-region (match-beginning 0) - (if (re-search-forward "^[^\t ]" nil t) - (goto-char (match-beginning 0)) - (point-max)))))) - -(defun canlock-fetch-fields (&optional key) - "Return the list of values of Cancel-Lock field. -If the optional arg KEY is non-nil, Cancel-Key field will be fetched. -The buffer is expected to be narrowed to just the headers of the message." - (let ((feild (mail-fetch-field (if key "Cancel-Key" "Cancel-Lock"))) - (case-fold-search t)) - (when feild - (mapcar (lambda (str) - (string-match "^sha1:" str) - (substring str (match-end 0))) - (split-string feild "[\t\n\r ,]+"))))) - -(defun canlock-fetch-id-for-key () - "Return the Message-ID for Cancel-Key. -The buffer is expected to be narrowed to just the headers of the message." - (let ((cancel (mail-fetch-field "Control"))) - (if cancel - (progn - (string-match "^cancel[\t ]+\\(<[^\t\n @<>]+@[^\t\n @<>]+>\\)" - cancel) - (match-string 1 cancel)) - (or (mail-fetch-field "Supersedes") - (mail-fetch-field "Replaces"))))) - -;;;###autoload -(defun canlock-insert-header (&optional id-for-key id-for-lock password) - "Insert a Cancel-Key and/or a Cancel-Lock header if possible." - (let (news control key-for-key key-for-lock) - (save-excursion - (save-restriction - (canlock-narrow-to-header) - (when (setq news (or canlock-force-insert-header - (mail-fetch-field "Newsgroups"))) - (unless id-for-key - (setq id-for-key (canlock-fetch-id-for-key))) - (if (and (setq control (mail-fetch-field "Control")) - (string-match - "^cancel[\t ]+\\(<[^\t\n @<>]+@[^\t\n @<>]+>\\)" - control)) - (setq id-for-lock nil) - (unless id-for-lock - (setq id-for-lock (mail-fetch-field "Message-ID")))) - (canlock-delete-headers) - (goto-char (point-max)))) - (when news - (if (not (or id-for-key id-for-lock)) - (message "There are no Message-ID(s).") - (unless password - (setq password (or canlock-password - (canlock-read-passwd - "Password for Canlock: ")))) - (if (or (not (stringp password)) (zerop (length password))) - (message "Password for Canlock is bad.") - (setq key-for-key (when id-for-key - (canlock-make-cancel-key - id-for-key password)) - key-for-lock (when id-for-lock - (canlock-make-cancel-key - id-for-lock password))) - (if (not (or key-for-key key-for-lock)) - (message "Couldn't insert Canlock header.") - (when key-for-key - (insert "Cancel-Key: sha1:" key-for-key "\n")) - (when key-for-lock - (insert "Cancel-Lock: sha1:" - (funcall canlock-base64-encode-function - (funcall canlock-sha1-function - key-for-lock)) - "\n"))))))))) - -;;;###autoload -(defun canlock-verify (&optional buffer) - "Verify Cancel-Lock or Cancel-Key. If failed, returns non-nil or signals -an error if `canlock-ignore-errors' is nil. If the optional arg BUFFER -is not specified, it runs in place." - (interactive) - (let ((canlock-sha1-function (or canlock-sha1-function-for-verify - canlock-sha1-function)) - keys locks errmsg id-for-key id-for-lock password - key-for-key key-for-lock match) - (save-excursion - (when buffer - (set-buffer buffer)) - (save-restriction - (widen) - (canlock-narrow-to-header) - (setq keys (canlock-fetch-fields 'key) - locks (canlock-fetch-fields)) - (if (not (or keys locks)) - (setq errmsg - "There are neither Cancel-Lock nor Cancel-Key fields.") - (setq id-for-key (canlock-fetch-id-for-key) - id-for-lock (mail-fetch-field "Message-ID")) - (or id-for-key id-for-lock - (setq errmsg "There are no Message-ID(s)."))))) - - (if errmsg - (if canlock-ignore-errors - errmsg - (error "%s" errmsg)) - - (setq password (or canlock-password-for-verify - (canlock-read-passwd "Password for Canlock: "))) - (if (or (not (stringp password)) (zerop (length password))) - (progn - (setq errmsg "Password for Canlock is bad.") - (if canlock-ignore-errors - errmsg - (error "%s" errmsg))) - - (when keys - (when id-for-key - (setq key-for-key (canlock-make-cancel-key id-for-key password)) - (while (and keys (not match)) - (setq match (string-equal key-for-key (pop keys))))) - (setq keys (if match "good" "bad"))) - (setq match nil) - - (when locks - (when id-for-lock - (setq key-for-lock - (funcall canlock-base64-encode-function - (funcall canlock-sha1-function - (canlock-make-cancel-key - id-for-lock password)))) - (when (and locks (not match)) - (setq match (string-equal key-for-lock (pop locks))))) - (setq locks (if match "good" "bad"))) - - (prog1 - (when (member "bad" (list keys locks)) - "bad") - (cond ((and keys locks) - (message "Cancel-Key is %s, Cancel-Lock is %s." keys locks)) - (locks - (message "Cancel-Lock is %s." locks)) - (keys - (message "Cancel-Key is %s." keys)))))))) - -;; Avoid byte compile warnings. -(defvar gnus-show-all-headers) -(defvar gnus-original-article-buffer) -(defvar mh-show-buffer) -(defvar vm-mail-buffer) -(defvar vm-message-pointer) -(defvar cmail-current-folder) -(defvar rmail-buffer) - -;;;###autoload -(defun gnus-summary-canlock-verify () - "Run `canlock-verify' from gnus summary buffer." - (interactive) - (gnus-summary-select-article gnus-show-all-headers) - (canlock-verify gnus-original-article-buffer)) - -;;;###autoload -(defun wl-summary-canlock-verify () - "Run `canlock-verify' from Wanderlust summary buffer." - (interactive) - (wl-summary-set-message-buffer-or-redisplay) - (canlock-verify (wl-message-get-original-buffer))) - -(eval-when-compile - (if (or (featurep 'use-mew-1.94b20-or-later) - (and (fboundp 'function-max-args) - (or (fboundp 'mew-summary-display) - (load "mew-summary" t)) - (eq 2 (function-max-args 'mew-summary-display)))) - (progn - (defmacro canlock-mew-summary-display () - '(mew-summary-display t)) - (message "Use mew-1.94b20 or later.")) - (defmacro canlock-mew-summary-display () - '(condition-case nil - (mew-summary-display) - (wrong-number-of-arguments - (mew-summary-display t)))) - )) - -;;;###autoload -(defun mew-summary-canlock-verify () - "Run `canlock-verify' from Mew summary buffer." - (interactive) - (canlock-mew-summary-display) - (canlock-verify (mew-buffer-message))) - -;;;###autoload -(defun mh-summary-canlock-verify () - "Run `canlock-verify' from MH folder buffer." - (interactive) - (mh-header-display) - (canlock-verify mh-show-buffer)) - -;;;###autoload -(defun vm-summary-canlock-verify () - "Run `canlock-verify' from VM summary buffer." - (interactive) - (vm-follow-summary-cursor) - (if (and vm-mail-buffer (buffer-name vm-mail-buffer)) - (save-excursion - (set-buffer vm-mail-buffer) - (let* ((mp (car vm-message-pointer)) - (header (save-restriction - (widen) - (buffer-substring - (aref (aref mp 0) 0) (vm-text-of mp))))) - (with-temp-buffer - (insert header) - (canlock-verify)))) - (or canlock-ignore-errors - (error "Folder buffer has been killed")))) - -;;;###autoload -(defun cmail-summary-canlock-verify () - "Run `canlock-verify' from cmail summary buffer." - (interactive) - (let* ((page (cmail-get-page-number-from-summary)) - (header (save-excursion - (set-buffer (cmail-folder-buffer cmail-current-folder)) - (cmail-n-page page) - (buffer-substring (point) - (if (search-forward "\n\n" nil t) - (1- (point)) - (point-max)))))) - (with-temp-buffer - (insert header) - (canlock-verify)))) - -;;;###autoload -(defun rmail-summary-canlock-verify () - "Run `canlock-verify' from RMAIL summary buffer." - (interactive) - (rmail-summary-rmail-update) - (let ((header (save-excursion - (set-buffer rmail-buffer) - (goto-char (point-min)) - (save-restriction - (widen) - (search-backward "\n\C-_\C-l\n") ;; ^_^L - (re-search-forward "^[^\t\n ]+:") - (buffer-substring - (goto-char (match-beginning 0)) - (progn (search-forward "\n\n") - (1- (point)))))))) - (with-temp-buffer - (insert header) - (canlock-verify)))) - -(provide 'canlock) - -(run-hooks 'canlock-load-hook) - -;;; canlock.el ends here diff --git a/contrib/gpg-ring.el b/contrib/gpg-ring.el deleted file mode 100644 index d402886..0000000 --- a/contrib/gpg-ring.el +++ /dev/null @@ -1,483 +0,0 @@ -;;; gpg-ring.el --- Major mode for editing GnuPG key rings. - -;; Copyright (C) 2000 RUS-CERT, University Of Stuttgart - -;; Author: Florian Weimer -;; Maintainer: Florian Weimer -;; Keywords: crypto -;; Created: 2000-04-28 - -;; $Id: gpg-ring.el,v 1.1.4.2 2001-07-15 23:22:50 yamaoka Exp $ - -;; This file is NOT (yet?) part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - - - -;;; Code: - -(require 'gpg) -(eval-when-compile (require 'cl)) - -;;;; Customization: - -;;; Customization: Groups: - -(defgroup gpg-ring nil - "GNU Privacy Guard user interface." - :tag "GnuPG user interface" - :group 'gpg) - -;;; Customization: Variables: - -(defface gpg-ring-key-invalid-face - '((((class color)) - (:foreground "yellow" :background "red")) - (t (:bold t :italic t :underline t))) - "Face for strings indicating key invalidity." - :group 'gpg-ring) - -(defface gpg-ring-uncertain-validity-face - '((((class color)) (:foreground "red")) - (t (:bold t))) - "Face for strings indicating uncertain validity." - :group 'gpg-ring) - -(defface gpg-ring-full-validity-face - '((((class color)) (:foreground "ForestGreen" :bold t)) - (t (:bold t))) - "Face for strings indicating key invalidity." - :group 'gpg-ring) - -(defvar gpg-ring-mode-hook nil - "Normal hook run when entering GnuPG ring mode.") - -;;; Constants - -(defconst gpg-ring-algo-alist - '((rsa . "RSA") - (rsa-encrypt-only . "RSA-E") - (rsa-sign-only . "RSA-S") - (elgamal-encrypt-only . "ELG-E") - (dsa . "DSA") - (elgamal . "ELG-E")) - "Alist mapping algorithm IDs to algorithm abbreviations.") - -(defconst gpg-ring-trust-alist - '((not-known "???" gpg-ring-uncertain-validity-face) - (disabled "DIS" gpg-ring-key-invalid-face) - (revoked "REV" gpg-ring-key-invalid-face) - (expired "EXP" gpg-ring-key-invalid-face) - (trust-undefined "QES" gpg-ring-uncertain-validity-face) - (trust-none "NON" gpg-ring-uncertain-validity-face) - (trust-marginal "MAR") - (trust-full "FUL" gpg-ring-full-validity-face) - (trust-ultimate "ULT" gpg-ring-full-validity-face)) - "Alist mapping trust IDs to trust abbrevs and faces.") - -(defvar gpg-ring-mode-map - (let ((map (make-keymap))) - (suppress-keymap map t) - map) - "Keymap for `gpg-ring-mode'.") - -(define-key gpg-ring-mode-map "0" 'delete-window) -(define-key gpg-ring-mode-map "1" 'delete-other-windows) -(define-key gpg-ring-mode-map "M" 'gpg-ring-mark-process-all) -(define-key gpg-ring-mode-map "U" 'gpg-ring-unmark-all) -(define-key gpg-ring-mode-map "a" 'gpg-ring-toggle-show-unusable) -(define-key gpg-ring-mode-map "d" 'gpg-ring-mark-delete) -(define-key gpg-ring-mode-map "f" 'gpg-ring-update-key) -(define-key gpg-ring-mode-map "g" 'gpg-ring-update) -(define-key gpg-ring-mode-map "i" 'gpg-ring-show-key) -(define-key gpg-ring-mode-map "l" 'gpg-ring-toggle-show-all-ids) -(define-key gpg-ring-mode-map "m" 'gpg-ring-mark-process) -(define-key gpg-ring-mode-map "n" 'gpg-ring-next-record) -(define-key gpg-ring-mode-map "p" 'gpg-ring-previous-record) -(define-key gpg-ring-mode-map "q" 'gpg-ring-quit) -(define-key gpg-ring-mode-map "u" 'gpg-ring-unmark) -(define-key gpg-ring-mode-map "x" 'gpg-ring-extract-keys) -(define-key gpg-ring-mode-map "X" 'gpg-ring-extract-keys-to-kill) - -(define-key gpg-ring-mode-map "\C-c\C-c" 'gpg-ring-action) - -;;; Internal functions: - -(defvar gpg-ring-key-list - nil - "List of keys in the key list buffer.") -(make-variable-buffer-local 'gpg-ring-key-list) - -(defvar gpg-ring-update-funcs - nil - "List of functions called to obtain the key list.") -(make-variable-buffer-local 'gpg-ring-update-funcs) - -(defvar gpg-ring-show-unusable - nil - "If t, show expired, revoked and disabled keys, too.") -(make-variable-buffer-local 'gpg-ring-show-unusable) - -(defvar gpg-ring-show-all-ids - nil - "If t, show all user IDs. If nil, show only the primary user ID.") -(make-variable-buffer-local 'gpg-ring-show-all-ids) - -(defvar gpg-ring-marks-alist - nil - "Alist of (UNIQUE-ID MARK KEY). -UNIQUE-ID is a unique key ID from GnuPG. MARK is either `?D' -(marked for deletion), or `?*' (marked for processing).") -(make-variable-buffer-local 'gpg-ring-marks-alist) - -(defvar gpg-ring-action - nil - "Function to call when `gpg-ring-action' is invoked. -A list of the keys which are marked for processing is passed as argument.") -(make-variable-buffer-local 'gpg-ring-action) - -(defun gpg-ring-mode () - "Mode for editing GnuPG key rings. -\\{gpg-ring-mode-map} -Turning on gpg-ring-mode runs `gpg-ring-mode-hook'." - (interactive) - (kill-all-local-variables) - (buffer-disable-undo) - (setq truncate-lines t) - (setq buffer-read-only t) - (use-local-map gpg-ring-mode-map) - (setq mode-name "Key Ring") - (setq major-mode 'gpg-ring-mode) - (run-hooks 'gpg-ring-mode-hook)) - - -(defmacro gpg-ring-record-start (&optional pos) - "Return buffer position of start of record containing POS." - `(get-text-property (or ,pos (point)) 'gpg-record-start)) - -(defun gpg-ring-current-key (&optional pos) - "Return GnuPG key at POS, or at point if ommitted." - (or (get-text-property (or pos (point)) 'gpg-key) - (error "No record on current line"))) - -(defun gpg-ring-goto-record (pos) - "Go to record starting at POS. -Position point after the marks at the beginning of a record." - (goto-char pos) - (forward-char 2)) - -(defun gpg-ring-next-record () - "Advances point to the start of the next record." - (interactive) - (let ((start (next-single-property-change - (point) 'gpg-record-start nil (point-max)))) - ;; Don't advance to the last line of the buffer. - (when (/= start (point-max)) - (gpg-ring-goto-record start)))) - -(defun gpg-ring-previous-record () - "Advances point to the start of the previous record." - (interactive) - ;; The last line of the buffer doesn't contain a record. - (let ((start (gpg-ring-record-start))) - (if start - (gpg-ring-goto-record (previous-single-property-change - start 'gpg-record-start nil (point-min))) - (gpg-ring-goto-record - (gpg-ring-record-start (1- (point-max))))))) - -(defun gpg-ring-set-mark (&optional pos mark) - "Set MARK on record at POS, or at point if POS is omitted. -If MARK is omitted, clear it." - (save-excursion - (let* ((start (gpg-ring-record-start pos)) - (key (gpg-ring-current-key start)) - (id (gpg-key-unique-id key)) - (entry (assoc id gpg-ring-marks-alist)) - buffer-read-only) - (goto-char start) - ;; Replace the mark character. - (subst-char-in-region (point) (1+ (point)) (char-after) - (or mark ? )) - ;; Store the mark in alist. - (if entry - (setcdr entry (if mark (list mark key))) - (when mark - (push (list id mark key) gpg-ring-marks-alist)))))) - -(defun gpg-ring-marked-keys (&optional only-marked mark) - "Return list of key specs which have MARK. -If no marks are present and ONLY-MARKED is not nil, return singleton -list with key of the current record. If MARK is omitted, `?*' is -used." - (let ((the-marker (or mark ?*)) - (marks gpg-ring-marks-alist) - key-list) - (while marks - (let ((mark (pop marks))) - ;; If this entry has got the right mark ... - (when (equal (nth 1 mark) the-marker) - ;; ... rember the key spec. - (push (nth 2 mark) key-list)))) - (or key-list (if (not only-marked) (list (gpg-ring-current-key)))))) - -(defun gpg-ring-mark-process () - "Mark record at point for processing." - (interactive) - (gpg-ring-set-mark nil ?*) - (gpg-ring-next-record)) - -(defun gpg-ring-mark-delete () - "Mark record at point for processing." - (interactive) - (gpg-ring-set-mark nil ?D) - (gpg-ring-next-record)) - -(defun gpg-ring-unmark () - "Mark record at point for processing." - (interactive) - (gpg-ring-set-mark) - (gpg-ring-next-record)) - -(defun gpg-ring-mark-process-all () - "Put process mark on all records." - (interactive) - (setq gpg-ring-marks-alist - (mapcar (lambda (key) - (list (gpg-key-unique-id key) ?* key)) - gpg-ring-key-list)) - (gpg-ring-regenerate)) - -(defun gpg-ring-unmark-all () - "Remove all record marks." - (interactive) - (setq gpg-ring-marks-alist nil) - (gpg-ring-regenerate)) - -(defun gpg-ring-toggle-show-unusable () - "Toggle value if `gpg-ring-show-unusable'." - (interactive) - (setq gpg-ring-show-unusable (not gpg-ring-show-unusable)) - (gpg-ring-regenerate)) - -(defun gpg-ring-toggle-show-all-ids () - "Toggle value of `gpg-ring-show-all-ids'." - (interactive) - (setq gpg-ring-show-all-ids (not gpg-ring-show-all-ids)) - (gpg-ring-regenerate)) - -(defvar gpg-ring-output-buffer-name "*GnuPG Output*" - "Name buffer to which output from GnuPG is sent.") - -(defmacro gpg-ring-with-output-buffer (&rest body) - "Erase GnuPG output buffer, evaluate BODY in it, and display it." - `(with-current-buffer (get-buffer-create gpg-ring-output-buffer-name) - (erase-buffer) - (setq truncate-lines t) - ,@body - (goto-char (point-min)) - (display-buffer gpg-ring-output-buffer-name))) - -(defun gpg-ring-quit () - "Bury key list buffer and kill GnuPG output buffer." - (interactive) - (let ((output (get-buffer gpg-ring-output-buffer-name))) - (when output - (kill-buffer output))) - (when (eq 'gpg-ring-mode major-mode) - (bury-buffer))) - -(defun gpg-ring-show-key () - "Show information for current key." - (interactive) - (let ((keys (gpg-ring-marked-keys))) - (gpg-ring-with-output-buffer - (gpg-key-insert-information (gpg-key-unique-id-list keys))))) - -(defun gpg-ring-extract-keys () - "Export currently selected public keys in ASCII armor." - (interactive) - (let ((keys (gpg-ring-marked-keys))) - (gpg-ring-with-output-buffer - (gpg-key-insert-public-key (gpg-key-unique-id-list keys))))) - -(defun gpg-ring-extract-keys-to-kill () - "Export currently selected public keys in ASCII armor to kill ring." - (interactive) - (let ((keys (gpg-ring-marked-keys))) - (with-temp-buffer - (gpg-key-insert-public-key (gpg-key-unique-id-list keys)) - (copy-region-as-kill (point-min) (point-max))))) - -(defun gpg-ring-update-key () - "Fetch key information from key server." - (interactive) - (let ((keys (gpg-ring-marked-keys))) - (gpg-ring-with-output-buffer - (gpg-key-retrieve (gpg-key-unique-id-list keys))))) - -(defun gpg-ring-insert-key-stat (key) - (let* ((validity (gpg-key-validity key)) - (validity-entry (assq validity gpg-ring-trust-alist)) - (trust (gpg-key-trust key)) - (trust-entry (assq trust gpg-ring-trust-alist))) - ;; Insert abbrev for key status. - (let ((start (point))) - (insert (nth 1 validity-entry)) - ;; Change face if necessary. - (when (nth 2 validity-entry) - (add-text-properties start (point) - (list 'face (nth 2 validity-entry))))) - ;; Trust, key ID, length, algorithm, creation date. - (insert (format "/%s %-8s/%4d/%-5s created %s" - (nth 1 trust-entry) - (gpg-short-key-id key) - (gpg-key-length key) - (cdr (assq (gpg-key-algorithm key) gpg-ring-algo-alist)) - (gpg-key-creation-date key))) - ;; Expire date. - (when (gpg-key-expire-date key) - (insert ", ") - (let ((start (point)) - (expired (eq 'expired validity)) - (notice (concat ))) - (insert (if expired "EXPIRED" "expires") - " " (gpg-key-expire-date key)) - (when expired - (add-text-properties start (point) - '(face gpg-ring-key-invalid-face))))))) - -(defun gpg-ring-insert-key (key &optional mark) - "Inserts description for KEY into current buffer before point." - (let ((start (point))) - (insert (if mark mark " ") - " " (gpg-key-primary-user-id key) "\n" - " ") - (gpg-ring-insert-key-stat key) - (insert "\n") - (when gpg-ring-show-all-ids - (let ((uids (gpg-key-user-ids key))) - (while uids - (insert " ID " (pop uids) "\n")))) - (add-text-properties start (point) - (list 'gpg-record-start start - 'gpg-key key)))) - -(defun gpg-ring-regenerate () - "Regenerate the key list buffer from stored data." - (interactive) - (let* ((key-list gpg-ring-key-list) - ;; Record position of point. - (old-record (if (eobp) ; No record on last line. - nil - (gpg-key-unique-id (gpg-ring-current-key)))) - (old-pos (if old-record (- (point) (gpg-ring-record-start)))) - found new-pos new-pos-offset buffer-read-only new-marks) - ;; Replace buffer contents with new data. - (erase-buffer) - (while key-list - (let* ((key (pop key-list)) - (id (gpg-key-unique-id key)) - (mark (assoc id gpg-ring-marks-alist))) - (when (or gpg-ring-show-unusable - (not (memq (gpg-key-validity key) - '(disabled revoked expired)))) - ;; Check if point was in this record. - (when (and old-record - (string-equal old-record id)) - (setq new-pos (point)) - (setq new-pos-offset (+ new-pos old-pos))) - ;; Check if this record was marked. - (if (nth 1 mark) - (progn - (push mark new-marks) - (gpg-ring-insert-key key (nth 1 mark))) - (gpg-ring-insert-key key))))) - ;; Replace mark alist with the new one (which does not contain - ;; marks for records which vanished during this update). - (setq gpg-ring-marks-alist new-marks) - ;; Restore point. - (if (not old-record) - ;; We were at the end of the buffer before. - (goto-char (point-max)) - (if new-pos - (if (and (< new-pos-offset (point-max)) - (equal old-record (gpg-key-unique-id - (gpg-ring-current-key new-pos-offset)))) - ;; Record is there, with offset. - (goto-char new-pos-offset) - ;; Record is there, but not offset. - (goto-char new-pos)) - ;; Record is not there. - (goto-char (point-min)))))) - -(defun gpg-ring-update () - "Update the key list buffer with new data." - (interactive) - (let ((funcs gpg-ring-update-funcs) - old) - ;; Merge the sorted lists obtained by calling elements of - ;; `gpg-ring-update-funcs'. - (while funcs - (let ((additional (funcall (pop funcs))) - new) - (while (and additional old) - (if (gpg-key-lessp (car additional) (car old)) - (push (pop additional) new) - (if (gpg-key-lessp (car old) (car additional)) - (push (pop old) new) - ;; Keys are perhaps equal. Always Add old key. - (push (pop old) new) - ;; If new key is equal, drop it, otherwise add it as well. - (if (string-equal (gpg-key-unique-id (car old)) - (gpg-key-unique-id (car additional))) - (pop additional) - (push (pop additional) new))))) - ;; Store new list as old one for next round. - (setq old (nconc (nreverse new) old additional)))) - ;; Store the list in the buffer. - (setq gpg-ring-key-list old)) - (gpg-ring-regenerate)) - -(defun gpg-ring-action () - "Perform the action associated with this buffer." - (interactive) - (if gpg-ring-action - (funcall gpg-ring-action (gpg-ring-marked-keys)) - (error "No action for this buffer specified"))) - -;;;###autoload -(defun gpg-ring-keys (&optional key-list-funcs action) - (interactive) - (let ((buffer (get-buffer-create "*GnuPG Key List*"))) - (with-current-buffer buffer - (gpg-ring-mode) - (setq gpg-ring-action action) - (setq gpg-ring-update-funcs key-list-funcs key-list-funcs) - (gpg-ring-update) - (goto-char (point-min))) - (switch-to-buffer buffer))) - -;;;###autoload -(defun gpg-ring-public (key-spec) - "List public keys matching keys KEY-SPEC." - (interactive "sList public keys containing: ") - (gpg-ring-keys `((lambda () (gpg-key-list-keys ,key-spec))))) - -(provide 'gpg-ring) - -;;; gpg-ring.el ends here diff --git a/contrib/gpg.el b/contrib/gpg.el deleted file mode 100644 index fa1c5f3..0000000 --- a/contrib/gpg.el +++ /dev/null @@ -1,1321 +0,0 @@ -;;; gpg.el --- Interface to GNU Privacy Guard - -;; Copyright (C) 2000 RUS-CERT, University Of Stuttgart - -;; Author: Florian Weimer -;; Maintainer: Florian Weimer -;; Keywords: crypto -;; Created: 2000-04-15 - -;; This file is NOT (yet?) part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA -;; ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA -;; -;; This code is not well-tested. BE CAREFUL! -;; -;; ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA -;; ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA - -;; Implemented features which can be tested: -;; -;; * Customization for all flavors of PGP is possible. -;; * The main operations (verify, decrypt, sign, encrypt, sign & -;; encrypt) are implemented. -;; * Gero Treuner's gpg-2comp script is supported, and data which is is -;; compatible with PGP 2.6.3 is generated. - -;; Customizing external programs -;; ============================= - -;; The customization are very similar to those of others programs, -;; only the C-ish "%" constructs have been replaced by more Lisp-like -;; syntax. -;; -;; First, you have to adjust the default executable paths -;; (`gpg-command-default-alist', customization group `gpg-options', -;; "Controlling GnuPG invocation."). After that, you should -;; change the configuration options which control how specific -;; command line flags are built (`gpg-command-flag-sign-with-key', -;; (`gpg-command-flag-recipient'). The elements of these lists are -;; concatenated without spaces, and a new argument is only started -;; where indicated. The `gpg-command-flag-recipient' list is special: -;; it consists of two parts, the first one remains at the beginning -;; of the argument, the second one is repeated for each recipient. -;; Finally, `gpg-command-passphrase-env' has to be changed if there's -;; no command line flag to force the external program to read the data -;; from standard input before the message. -;; -;; In customization group `gpg-commands', "Controlling GnuPG -;; invocation.", you have to supply the actual syntax for external -;; program calls. Each variable consists of a pair of a program -;; specification (if a Lisp symbol is given here, it is translated -;; via `gpg-command-default-alist') and a list of program arguments -;; with placeholders. Please read the documentation of each variable -;; before making your adjustments and try to match the given -;; requirements as closely as possible! -;; -;; The `gpg-commands-key' group, "GnuPG Key Management Commands.", -;; specifies key management commands. The syntax of these variables -;; is like those in the `gpg-commands' group. Note that the output -;; format of some of these external programs has to match very close -;; that of GnuPG. Additional tools (Thomas Roessler's "pgpring.c") -;; are available if your favorite implementation of OpenPGP cannot -;; output the this format. - -;; Security considerations -;; ======================= - -;; On a typical multiuser UNIX system, the memory image of the -;; Emacs process is not locked, therefore it can be swapped to disk -;; at any time. As a result, the passphrase might show up in the -;; swap space (even if you don't use the passphrase cache, i.e. if -;; `gpg-passphrase-timeout' is 0). If someone is able to run `gdb' or -;; another debugger on your Emacs process, he might be able to recover -;; the passphrase as well. Unfortunately, nothing can be done in -;; order to prevent this at the moment. -;; -;; BE CAREFUL: If you use the passphrase cache feature, the passphrase -;; is stored in the variable `gpg-passphrase' -- and it is NOT -;; encrypted in any way. (This is a conceptual problem because the -;; nature of the passphrase cache requires that Emacs is able to -;; decrypt automatically, so only a very weak protection could be -;; applied anyway.) -;; -;; In addition, if you use an unpatched Emacs 20 (and earlier -;; versions), passwords show up in the output of the `view-lossage' -;; function (bound to `C-h l' by default). - - -;;; Code: - -(require 'timer) -(eval-when-compile (require 'cl)) - -(eval-and-compile - (defalias 'gpg-point-at-eol - (if (fboundp 'point-at-eol) - 'point-at-eol - 'line-end-position))) - -;;;; Customization: - -;;; Customization: Groups: - -(defgroup gpg nil - "GNU Privacy Guard interface." - :tag "GnuPG" - :group 'processes) - -(defgroup gpg-options nil - "Controlling GnuPG invocation." - :tag "GnuPG Options" - :group 'gpg) - -(defgroup gpg-commands nil - "Primary GnuPG Operations." - :tag "GnuPG Commands" - :group 'gpg) - -(defgroup gpg-commands-key nil - "Commands for GnuPG key management." - :tag "GnuPG Key Commands" - :group 'gpg-commands) - -;;; Customization: Widgets: - -(if (get 'alist 'widget-type) - (define-widget 'gpg-command-alist 'alist - "An association list for GnuPG command names." - :key-type '(symbol :tag "Abbreviation") - :value-type '(string :tag "Program name") - :convert-widget 'widget-alist-convert-widget - :tag "Alist") - (define-widget 'gpg-command-alist 'repeat - "An association list for GnuPG command names." - :args '((cons :format "%v" - (symbol :tag "Abbreviation") - (string :tag "Program name"))) - :tag "Alist")) - -(define-widget 'gpg-command-program 'choice - "Widget for entering the name of a program (mostly the GnuPG binary)." - :tag "Program" - :args '((const :tag "Default GnuPG program." - :value gpg) - (const :tag "GnuPG compatibility wrapper." - :value gpg-2comp) - (const :tag "Disabled" - :value nil) - (string :tag "Custom program" :format "%v"))) - -(define-widget 'gpg-command-sign-options 'cons - "Widget for entering signing options." - :args '(gpg-command-program - (repeat - :tag "Arguments" - (choice - :format "%[Type%] %v" - (const :tag "Insert armor option here if necessary." - :value armor) - (const :tag "Insert text mode option here if necessary." - :value textmode) - (const :tag "Insert the sign with key option here if necessary." - :value sign-with-key) - (string :format "%v"))))) - -(define-widget 'gpg-command-key-options 'cons - "Widget for entering key command options." - :args '(gpg-command-program - (repeat - :tag "Arguments" - (choice - :format "%[Type%] %v" - (const :tag "Insert key ID here." - :value key-id) - (string :format "%v"))))) - -;;; Customization: Variables: - -;;; Customization: Variables: Paths and Flags: - -(defcustom gpg-passphrase-timeout - 0 - "Timeout (in seconds) for the passphrase cache. -The passphrase cache is cleared after is hasn't been used for this -many seconds. The values 0 means that the passphrase is not cached at -all." - :tag "Passphrase Timeout" - :type 'number - :group 'gpg-options) - -(defcustom gpg-default-key-id - nil - "Default key/user ID used for signatures." - :tag "Default Key ID" - :type '(choice - (const :tag "Use GnuPG default." :value nil) - (string)) - :group 'gpg-options) - -(defcustom gpg-temp-directory - (expand-file-name "~/tmp") - "Directory for temporary files. -If you are running Emacs 20, this directory must have mode 0700." - :tag "Temp directory" - :type 'string - :group 'gpg-options) - -(defcustom gpg-command-default-alist - '((gpg . "gpg") - (gpg-2comp . "gpg-2comp")) - "Default paths for some GnuPG-related programs. -Modify this variable if you have to change the paths to the -executables required by the GnuPG interface. You can enter \"gpg\" -for `gpg-2comp' if you don't have this script, but you'll lose PGP -2.6.x compatibility." - :tag "GnuPG programs" - :type 'gpg-command-alist - :group 'gpg-options) - -(defcustom gpg-command-all-arglist - nil - "List of arguments to add to all GPG commands." - :tag "All command args" - :group 'gpg-options) - -(defcustom gpg-command-flag-textmode "--textmode" - "The flag to indicate canonical text mode to GnuPG." - :tag "Text mode flag" - :type 'string - :group 'gpg-options) - -(defcustom gpg-command-flag-armor "--armor" - "The flag to request ASCII-armoring output from GnuPG." - :tag "Armor flag" - :type 'string - :group 'gpg-options) - -(defcustom gpg-command-flag-sign-with-key '("--local-user=" sign-with-key) - "String to include to specify the signing key ID. -The elements are concatenated (without spaces) to form a command line -option." - :tag "Sign with key flag" - :type '(repeat :tag "Argument parts" - (choice :format "%[Type%] %v" - (const :tag "Start next argument." :value next-argument) - (const :tag "Insert signing key ID here." :value sign-with-key) - (string))) - :group 'gpg-options) - -(defcustom gpg-command-flag-recipient - '(nil . ("-r" next-argument recipient next-argument)) - "Format of a recipient specification. -The elements are concatenated (without spaces) to form a command line -option. The second part is repeated for each recipient." - :tag "Recipients Flag" - :type '(cons - (repeat :tag "Common prefix" - (choice :format "%[Type%] %v" - (const :tag "Start next argument." :value next-argument) - (string))) - (repeat :tag "For each recipient" - (choice :format "%[Type%] %v" - (const :tag "Start next argument." :value next-argument) - (const :tag "Insert recipient key ID here." :value recipient) - (string)))) - :group 'gpg-options) - -(defcustom gpg-command-passphrase-env - nil - "Environment variable to set when a passphrase is required, or nil. -If an operation is invoked which requires a passphrase, this -environment variable is set before calling the external program to -indicate that it should read the passphrase from standard input." - :tag "Passphrase environment" - :type '(choice - (const :tag "Disabled" :value nil) - (cons - (string :tag "Variable") - (string :tag "Value"))) - :group 'gpg-options) - -;;; Customization: Variables: GnuPG Commands: - -(defcustom gpg-command-verify - '(gpg . ("--status-fd" "1" "--batch" "--verbose" "--verify" signature-file message-file)) - "Command to verify a detached signature. -The invoked program has to read the signed message and the signature -from the given files. It should write human-readable information to -standard output and/or standard error. The program shall not convert -charsets or line endings; the input data shall be treated as binary." - :tag "Verify Command" - :type '(cons - gpg-command-program - (repeat - :tag "Arguments" - (choice - :format "%[Type%] %v" - (const :tag "Insert name of file containing the message here." - :value message-file) - (const :tag "Insert name of file containing the signature here." - :value signature-file) - (string :format "%v")))) - :group 'gpg-commands) - -(defcustom gpg-command-verify-cleartext - '(gpg . ("--status-fd" "1" "--batch" "--verbose" "--verify" message-file)) - "Command to verify a message. -The invoked program has to read the signed message from the given -file. It should write human-readable information to standard output -and/or standard error. The program shall not convert charsets or line -endings; the input data shall be treated as binary." - :tag "Cleartext Verify Command" - :type '(cons - gpg-command-program - (repeat - :tag "Arguments" - (choice - :format "%[Type%] %v" - (const :tag "Insert name of file containing the message here." - :value message-file) - (string :format "%v")))) - :group 'gpg-commands) - -(defcustom gpg-command-decrypt - '(gpg . ("--decrypt" "--batch" "--passphrase-fd=0")) - "Command to decrypt a message. -The invoked program has to read the passphrase from standard -input, followed by the encrypted message. It writes the decrypted -message to standard output, and human-readable diagnostic messages to -standard error." - :tag "Decrypt Command" - :type '(cons - gpg-command-program - (repeat - :tag "Arguments" - (choice - :format "%[Type%] %v" - (const :tag "Insert name of file containing the message here." - :value message-file) - (string :format "%v")))) - :group 'gpg-commands) - -(defcustom gpg-command-sign-cleartext - '(gpg-2comp . ("--batch" "--passphrase-fd=0" "--output=-" - armor textmode "--clearsign" - sign-with-key)) - "Command to create a \"clearsign\" text file. -The invoked program has to read the passphrase from standard input, -followed by the message to sign. It should write the ASCII-amored -signed text message to standard output, and diagnostic messages to -standard error." - :tag "Clearsign Command" - :type 'gpg-command-sign-options - :group 'gpg-commands) - -(defcustom gpg-command-sign-detached - '(gpg-2comp . ("--batch" "--passphrase-fd=0" "--output=-" - armor textmode "--detach-sign" - sign-with-key)) - "Command to create a detached signature. -The invoked program has to read the passphrase from standard input, -followed by the message to sign. It should write the ASCII-amored -detached signature to standard output, and diagnostic messages to -standard error. The program shall not convert charsets or line -endings; the input data shall be treated as binary." - :tag "Sign Detached Command" - :type 'gpg-command-sign-options - :group 'gpg-commands) - -(defcustom gpg-command-sign-encrypt - '(gpg-2comp . ("--batch" "--passphrase-fd=0" "--output=-" - armor textmode "--always-trust" sign-with-key recipients - "--sign" "--encrypt" plaintext-file)) - "Command to sign and encrypt a file. -The invoked program has to read the passphrase from standard input, -followed by the message to sign and encrypt if there is no -`plaintext-file' placeholder. It should write the ASCII-amored -encrypted message to standard output, and diagnostic messages to -standard error." - :tag "Sign And Encrypt Command" - :type '(cons - gpg-command-program - (repeat - :tag "Arguments" - (choice - :format "%[Type%] %v" - (const :tag "Insert the `sign with key' option here if necessary." - :value sign-with-key) - (const :tag "Insert list of recipients here." - :value recipients) - (const :tag "Insert here name of file with plaintext." - :value plaintext-file) - (string :format "%v")))) - :group 'gpg-commands) - -(defcustom gpg-command-encrypt - '(gpg-2comp . ("--batch" "--output=-" armor textmode "--always-trust" - "--encrypt" recipients plaintext-file)) - "Command to encrypt a file. -The invoked program has to read the message to encrypt from standard -input or from the plaintext file (if the `plaintext-file' placeholder -is present). It should write the ASCII-amored encrypted message to -standard output, and diagnostic messages to standard error." - :type '(cons - gpg-command-program - (repeat - :tag "Arguments" - (choice - :format "%[Type%] %v" - (const :tag "Insert list of recipients here." - :value recipients) - (const :tag "Insert here name of file with plaintext." - :value plaintext-file) - (string :format "%v")))) - :group 'gpg-commands) - -;;; Customization: Variables: Key Management Commands: - -(defcustom gpg-command-key-import - '(gpg . ("--import" "--verbose" message-file)) - "Command to import a public key from a file." - :tag "Import Command" - :type '(cons - gpg-command-program - (repeat - :tag "Arguments" - (choice - :format "%[Type%] %v" - (const :tag "Insert name of file containing the key here." - :value message-file) - (string :format "%v")))) - :group 'gpg-commands-key) - -(defcustom gpg-command-key-export - '(gpg . ("--no-verbose" "--armor" "--export" key-id)) - "Command to export a public key from the key ring. -The key should be written to standard output using ASCII armor." - :tag "Export Command" - :type 'gpg-command-key-options - :group 'gpg-commands-key) - -(defcustom gpg-command-key-verify - '(gpg . ("--no-verbose" "--batch" "--fingerprint" "--check-sigs" key-id)) - "Command to verify a public key." - :tag "Verification Command" - :type 'gpg-command-key-options - :group 'gpg-commands-key) - -(defcustom gpg-command-key-public-ring - '(gpg . ("--no-verbose" "--batch" "--with-colons" "--list-keys" key-id)) - "Command to list the contents of the public key ring." - :tag "List Public Key Ring Command" - :type 'gpg-command-key-options - :group 'gpg-commands-key) - -(defcustom gpg-command-key-secret-ring - '(gpg . ("--no-verbose" "--batch" "--with-colons" - "--list-secret-keys" key-id)) - "Command to list the contents of the secret key ring." - :tag "List Secret Key Ring Command" - :type 'gpg-command-key-options - :group 'gpg-commands-key) - -(defcustom gpg-command-key-retrieve - '(gpg . ("--batch" "--recv-keys" key-id)) - "Command to retrieve public keys." - :tag "Retrieve Keys Command" - :type 'gpg-command-key-options - :group 'gpg-commands-key) - - -;;;; Helper functions for GnuPG invocation: - -;;; Build the GnuPG command line: - -(defun gpg-build-argument (template substitutions &optional pass-start) - "Build command line argument(s) by substituting placeholders. -TEMPLATE is a list of strings and symbols. The placeholder symbols in -it are replaced by SUBSTITUTIONS, the elements between -`next-argument' symbols are concatenated without spaces and are -returned in a list. - -SUBSTITIONS is a list of (SYMBOL . SEXP) pairs, where SEXP is either -a string (which is inserted literally), a list of strings (which are -inserted as well), or nil, which means to insert nothing. - -If PASS-START is t, `next-argument' is also inserted into the result, -and symbols without a proper substitution are retained in the output, -otherwise, an untranslated symbol results in an error. - -This function does not handle empty arguments reliably." - (let ((current-arg "") - (arglist nil)) - (while template - (let* ((templ (pop template)) - (repl (assoc templ substitutions)) - (new (if repl (cdr repl) templ))) - (cond - ((eq templ 'next-argument) - ;; If the current argument is not empty, start a new one. - (unless (equal current-arg "") - (setq arglist (nconc arglist - (if pass-start - (list current-arg 'next-argument) - (list current-arg)))) - (setq current-arg ""))) - ((null new) nil) ; Drop it. - ((and (not (stringp templ)) (null repl)) - ;; Retain an untranslated symbol in the output if - ;; `pass-start' is true. - (unless pass-start - (error "No replacement for `%s'" templ)) - (setq arglist (nconc arglist (list current-arg templ))) - (setq current-arg "")) - (t - (unless (listp new) - (setq new (list new))) - (setq current-arg (concat current-arg - (apply 'concat new))))))) - (unless (equal current-arg "") - (setq arglist (nconc arglist (list current-arg)))) - arglist)) - -(defun gpg-build-arg-list (template substitutions) - "Build command line by substituting placeholders. -TEMPLATE is a list of strings and symbols. The placeholder symbols in -it are replaced by SUBSTITUTIONS. - -SUBSTITIONS is a list of (SYMBOL . SEXP) pairs, where SEXP is either a -string (which is inserted literally), a list of strings (which are -inserted as well), or nil, which means to insert nothing." - (let ((arglist (copy-sequence gpg-command-all-arglist))) - (while template - (let* ((templ (pop template)) - (repl (assoc templ substitutions)) - (new (if repl (cdr repl) templ))) - (cond - ((and (symbolp templ) (null repl)) - (error "No replacement for `%s'" templ)) - ((null new) nil) ; Drop it. - (t - (unless (listp new) - (setq new (list new))) - (setq arglist (nconc arglist new)))))) - arglist)) - -(defun gpg-build-flag-recipients-one (recipient) - "Build argument for one RECIPIENT." - (gpg-build-argument (cdr gpg-command-flag-recipient) - `((recipient . ,recipient)) t)) - -(defun gpg-build-flag-recipients (recipients) - "Build list of RECIPIENTS using `gpg-command-flag-recipient'." - (gpg-build-argument - (apply 'append (car gpg-command-flag-recipient) - (mapcar 'gpg-build-flag-recipients-one - recipients)) - nil)) - -(defun gpg-read-recipients () - "Query the user for several recipients." - (let ((go t) - recipients r) - (while go - (setq r (read-string "Enter recipient ID [RET when no more]: ")) - (if (equal r "") - (setq go nil) - (setq recipients (nconc recipients (list r))))) - recipients)) - -(defun gpg-build-flag-sign-with-key (key) - "Build sign with key flag using `gpg-command-flag-sign-with-key'." - (let ((k (if key key - (if gpg-default-key-id gpg-default-key-id - nil)))) - (if k - (gpg-build-argument gpg-command-flag-sign-with-key - (list (cons 'sign-with-key k))) - nil))) - -(defmacro gpg-with-passphrase-env (&rest body) - "Adjust the process environment and evaluate BODY. -During the evaluation of the body forms, the process environment is -adjust according to `gpg-command-passphrase-env'." - (let ((env-value (make-symbol "env-value"))) - `(let ((,env-value)) - (unwind-protect - (progn - (when gpg-command-passphrase-env - (setq ,env-value (getenv (car gpg-command-passphrase-env))) - (setenv (car gpg-command-passphrase-env) - (cdr gpg-command-passphrase-env))) - ,@body) - (when gpg-command-passphrase-env - ;; This will clear the variable if it wasn't set before. - (setenv (car gpg-command-passphrase-env) ,env-value)))))) -(put 'gpg-with-passphrase-env 'lisp-indent-function 0) -(put 'gpg-with-passphrase-env 'edebug-form-spec '(body)) - -;;; Temporary files: - -(defun gpg-make-temp-file () - "Create a temporary file in a safe way" - (let ((name ;; User may use "~/" - (expand-file-name "gnupg" gpg-temp-directory))) - (if (fboundp 'make-temp-file) - ;; If we've got make-temp-file, we are on the save side. - (make-temp-file name) - ;; make-temp-name doesn't create the file, and an ordinary - ;; write-file operation is prone to nasty symlink attacks if the - ;; temporary file resides in a world-writable directory. - (unless (or (memq system-type '(windows-nt cygwin32 win32 w32 mswindows)) - (eq (file-modes gpg-temp-directory) 448)) ; mode 0700 - (error "Directory for temporary files (%s) must have mode 0700" gpg-temp-directory)) - (setq name (make-temp-name name)) - (let ((mode (default-file-modes))) - (unwind-protect - (progn - (set-default-file-modes 384) ; mode 0600 - (with-temp-file name)) - (set-default-file-modes mode))) - name))) - -(defvar gpg-temp-files nil - "List of temporary files used by the GnuPG interface. -Do not set this variable. Call `gpg-with-temp-files' if you need -temporary files.") - -(defun gpg-with-temp-files-create (count) - "Do not call this function. Used internally by `gpg-with-temp-files'." - (while (> count 0) - (setq gpg-temp-files (cons (gpg-make-temp-file) gpg-temp-files)) - (setq count (1- count)))) - -(defun gpg-with-temp-files-delete () - "Do not call this function. Used internally by `gpg-with-temp-files'." - (while gpg-temp-files - (let ((file (pop gpg-temp-files))) - (condition-case nil - (delete-file file) - (error nil))))) - -(defmacro gpg-with-temp-files (count &rest body) - "Create COUNT temporary files, USE them, and delete them. -The function USE is called with the names of all temporary files as -arguments." - `(let ((gpg-temp-files)) - (unwind-protect - (progn - ;; Create the temporary files. - (gpg-with-temp-files-create ,count) - ,@body) - (gpg-with-temp-files-delete)))) -(put 'gpg-with-temp-files 'lisp-indent-function 1) -(put 'gpg-with-temp-files 'edebug-form-spec '(body)) - -;;; Making subprocesses: - -(defun gpg-exec-path (option) - "Return the program name for OPTION. -OPTION is of the form (PROGRAM . ARGLIST). This functions returns -PROGRAM, but takes default values into account." - (let* ((prg (car option)) - (path (assq prg gpg-command-default-alist))) - (cond - (path (if (null (cdr path)) - (error "Command `%s' is not available" prg) - (cdr path))) - ((null prg) (error "Command is disabled")) - (t prg)))) - -(defun gpg-call-process (cmd args stdin stdout stderr &optional passphrase) - "Invoke external program CMD with ARGS on buffer STDIN. -Standard output is insert before point in STDOUT, standard error in -STDERR. If PASSPHRASE is given, send it before STDIN. PASSPHRASE -should not end with a line feed (\"\\n\"). - -If `stdin-file' is present in ARGS, it is replaced by the name of a -temporary file. Before invoking CMD, the contents of STDIN is written -to this file." - (gpg-with-temp-files 2 - (let* ((coding-system-for-read 'no-conversion) - (coding-system-for-write 'no-conversion) - (have-stdin-file (memq 'stdin-file args)) - (stdin-file (nth 0 gpg-temp-files)) - (stderr-file (nth 1 gpg-temp-files)) - (cpr-args `(,cmd - nil ; don't delete - (,stdout ,stderr-file) - nil ; don't display - ;; Replace `stdin-file'. - ,@(gpg-build-arg-list - args (list (cons 'stdin-file stdin-file))))) - res) - (when have-stdin-file - (with-temp-file stdin-file - (buffer-disable-undo) - (insert-buffer-substring stdin))) - (setq res - (if passphrase - (with-temp-buffer - (buffer-disable-undo) - (insert passphrase "\n") - (unless have-stdin-file - (apply 'insert-buffer-substring - (if (listp stdin) stdin (list stdin)))) - (apply 'call-process-region (point-min) (point-max) cpr-args) - ;; Wipe out passphrase. - (goto-char (point-min)) - (translate-region (point) (gpg-point-at-eol) - (make-string 256 ? ))) - (if (listp stdin) - (with-current-buffer (car stdin) - (apply 'call-process-region - (cadr stdin) - (if have-stdin-file (cadr stdin) (caddr stdin)) - cpr-args)) - (with-current-buffer stdin - (apply 'call-process-region - (point-min) - (if have-stdin-file (point-min) (point-max)) - cpr-args))))) - (with-current-buffer stderr - (insert-file-contents-literally stderr-file)) - (if (or (stringp res) (> res 0)) - ;; Signal or abnormal exit. - (with-current-buffer stderr - (goto-char (point-max)) - (insert (format "\nCommand exit status: %s\n" res)) - nil) - t)))) - -(defvar gpg-result-buffer nil - "The result of a GnuPG operation is stored in this buffer. -Never set this variable directly, use `gpg-show-result' instead.") - -(defun gpg-show-result-buffer (always-show result) - "Called by `gpg-show-results' to actually show the buffer." - (with-current-buffer gpg-result-buffer - ;; Only proceed if the buffer is non-empty. - (when (and (/= (point-min) (point-max)) - (or always-show (not result))) - (save-window-excursion - (display-buffer (current-buffer)) - (unless (y-or-n-p "Continue? ") - (error "GnuPG operation aborted")))))) - -(defmacro gpg-show-result (always-show &rest body) - "Show GnuPG result to user for confirmation. -This macro binds `gpg-result-buffer' to a temporary buffer and -evaluates BODY, like `progn'. If BODY evaluates to `nil' (or -`always-show' is not nil), the user is asked for confirmation." - `(let ((gpg-result-buffer (get-buffer-create - (generate-new-buffer-name "*GnuPG Output*")))) - (unwind-protect - (gpg-show-result-buffer ,always-show (progn ,@body)) - (kill-buffer gpg-result-buffer)))) -(put 'gpg-show-result 'lisp-indent-function 1) -(put 'gpg-show-result 'edebug-form-spec '(body)) - -;;; Passphrase handling: - -(defvar gpg-passphrase-timer - (timer-create) - "This timer will clear the passphrase cache periodically.") - -(defvar gpg-passphrase - nil - "The (unencrypted) passphrase cache.") - -(defun gpg-passphrase-clear-string (str) - "Erases STR by overwriting all characters." - (let ((pos 0) - (len (length str))) - (while (< pos len) - (aset str pos ? ) - (incf pos)))) - -;;;###autoload -(defun gpg-passphrase-forget () - "Forget stored passphrase." - (interactive) - (cancel-timer gpg-passphrase-timer) - (setq gpg-passphrase-timer nil) - (gpg-passphrase-clear-string gpg-passphrase) - (setq gpg-passphrase nil)) - -(defun gpg-passphrase-store (passphrase) - "Store PASSPHRASE in cache. -Updates the timeout for clearing the cache to `gpg-passphrase-timeout'." - (unless (equal gpg-passphrase-timeout 0) - (if (null gpg-passphrase-timer) - (setq gpg-passphrase-timer (timer-create))) - (timer-set-time gpg-passphrase-timer - (timer-relative-time (current-time) - gpg-passphrase-timeout)) - (timer-set-function gpg-passphrase-timer 'gpg-passphrase-forget) - (unless (and (fboundp 'itimer-live-p) - (itimer-live-p gpg-passphrase-timer)) - (timer-activate gpg-passphrase-timer)) - (setq gpg-passphrase passphrase)) - passphrase) - -(defun gpg-passphrase-read () - "Read a passphrase and remember it for some time." - (interactive) - (if gpg-passphrase - ;; This reinitializes the timer. - (gpg-passphrase-store gpg-passphrase) - (let ((pp (read-passwd "Enter passphrase: "))) - (gpg-passphrase-store pp)))) - - -;;;; Main operations: - -;;;###autoload -(defun gpg-verify (message signature result) - "Verify buffer MESSAGE against detached SIGNATURE buffer. -Returns t if everything worked out well, nil otherwise. Consult -buffer RESULT for details." - (interactive "bBuffer containing message: \nbBuffer containing signature: \nbBuffor for result: ") - (gpg-with-temp-files 2 - (let* ((sig-file (nth 0 gpg-temp-files)) - (msg-file (nth 1 gpg-temp-files)) - (cmd (gpg-exec-path gpg-command-verify)) - (args (gpg-build-arg-list (cdr gpg-command-verify) - `((signature-file . ,sig-file) - (message-file . ,msg-file)))) - res) - (with-temp-file sig-file - (buffer-disable-undo) - (apply 'insert-buffer-substring (if (listp signature) - signature - (list signature)))) - (with-temp-file msg-file - (buffer-disable-undo) - (apply 'insert-buffer-substring (if (listp message) - message - (list message)))) - (setq res (apply 'call-process-region - (point-min) (point-min) ; no data - cmd - nil ; don't delete - result - nil ; don't display - args)) - (if (or (stringp res) (> res 0)) - ;; Signal or abnormal exit. - (with-current-buffer result - (insert (format "\nCommand exit status: %s\n" res)) - nil) - t)))) - -;;;###autoload -(defun gpg-verify-cleartext (message result) - "Verify message in buffer MESSAGE. -Returns t if everything worked out well, nil otherwise. Consult -buffer RESULT for details. - -NOTE: Use of this function is deprecated." - (interactive "bBuffer containing message: \nbBuffor for result: ") - (gpg-with-temp-files 1 - (let* ((msg-file (nth 0 gpg-temp-files)) - (cmd (gpg-exec-path gpg-command-verify-cleartext)) - (args (gpg-build-arg-list (cdr gpg-command-verify-cleartext) - `((message-file . ,msg-file)))) - res) - (with-temp-file msg-file - (buffer-disable-undo) - (apply 'insert-buffer-substring (if (listp message) - message - (list message)))) - (setq res (apply 'call-process-region - (point-min) (point-min) ; no data - cmd - nil ; don't delete - result - nil ; don't display - args)) - (if (or (stringp res) (> res 0)) - ;; Signal or abnormal exit. - (with-current-buffer result - (insert (format "\nCommand exit status: %s\n" res)) - nil) - t)))) - -;;;###autoload -(defun gpg-decrypt (ciphertext plaintext result &optional passphrase) - "Decrypt buffer CIPHERTEXT to buffer PLAINTEXT. -Returns t if everything worked out well, nil otherwise. Consult -buffer RESULT for details. Reads a missing PASSPHRASE using -`gpg-passphrase-read'." - (interactive "bBuffer containing ciphertext: \nbBuffer for plaintext: \nbBuffor for decryption status: ") - (gpg-call-process (gpg-exec-path gpg-command-decrypt) - (gpg-build-arg-list (cdr gpg-command-decrypt) nil) - ciphertext plaintext result - (if passphrase passphrase (gpg-passphrase-read))) - (when passphrase - (gpg-passphrase-clear-string passphrase))) - -;;;###autoload -(defun gpg-sign-cleartext - (plaintext signed-text result &optional passphrase sign-with-key) - "Sign buffer PLAINTEXT, and store PLAINTEXT with signature in -SIGNED-TEXT. -Reads a missing PASSPHRASE using `gpg-passphrase-read'. Uses key ID -SIGN-WITH-KEY if given, otherwise the default key ID. Returns t if -everything worked out well, nil otherwise. Consult buffer RESULT for -details. - -NOTE: Use of this function is deprecated." - (interactive "bBuffer containing plaintext: \nbBuffer for text with signature: \nbBuffer for status information: ") - (let ((subst (list (cons 'sign-with-key - (gpg-build-flag-sign-with-key sign-with-key)) - (cons 'armor gpg-command-flag-armor) - (cons 'textmode gpg-command-flag-textmode)))) - (gpg-call-process (gpg-exec-path gpg-command-sign-cleartext) - (gpg-build-arg-list (cdr gpg-command-sign-cleartext) - subst) - plaintext signed-text result - (if passphrase passphrase (gpg-passphrase-read)))) - (when passphrase - (gpg-passphrase-clear-string passphrase))) - -;;;###autoload -(defun gpg-sign-detached - (plaintext signature result &optional passphrase sign-with-key - armor textmode) - "Sign buffer PLAINTEXT, and store SIGNATURE in that buffer. -Reads a missing PASSPHRASE using `gpg-passphrase-read'. Uses key ID -SIGN-WITH-KEY if given, otherwise the default key ID. Returns t if -everything worked out well, nil otherwise. Consult buffer RESULT for -details. ARMOR the result and activate canonical TEXTMODE if -requested." - (interactive "bBuffer containing plaintext: \nbBuffer for text with signature: \nbBuffer for status information: ") - (let ((subst (list (cons 'sign-with-key - (gpg-build-flag-sign-with-key sign-with-key)) - (cons 'armor (if armor gpg-command-flag-armor)) - (cons 'textmode (if armor gpg-command-flag-textmode))))) - (gpg-call-process (gpg-exec-path gpg-command-sign-detached) - (gpg-build-arg-list (cdr gpg-command-sign-detached) - subst) - plaintext signature result - (if passphrase passphrase (gpg-passphrase-read)))) - (when passphrase - (gpg-passphrase-clear-string passphrase))) - - -;;;###autoload -(defun gpg-sign-encrypt - (plaintext ciphertext result recipients &optional passphrase sign-with-key - armor textmode) - "Sign buffer PLAINTEXT, and store SIGNATURE in that buffer. -RECIPIENTS is a list of key IDs used for encryption. This function -reads a missing PASSPHRASE using `gpg-passphrase-read', and uses key -ID SIGN-WITH-KEY for the signature if given, otherwise the default key -ID. Returns t if everything worked out well, nil otherwise. Consult -buffer RESULT for details. ARMOR the result and activate canonical -TEXTMODE if requested." - (interactive (list - (read-buffer "Buffer containing plaintext: " nil t) - (read-buffer "Buffer for ciphertext: " nil t) - (read-buffer "Buffer for status informationt: " nil t) - (gpg-read-recipients))) - (let ((subst `((sign-with-key . ,(gpg-build-flag-sign-with-key - sign-with-key)) - (plaintext-file . stdin-file) - (recipients . ,(gpg-build-flag-recipients recipients)) - (armor ,(if armor gpg-command-flag-armor)) - (textmode ,(if armor gpg-command-flag-textmode))))) - (gpg-call-process (gpg-exec-path gpg-command-sign-encrypt) - (gpg-build-arg-list (cdr gpg-command-sign-encrypt) - subst) - plaintext ciphertext result - (if passphrase passphrase (gpg-passphrase-read)))) - (when passphrase - (gpg-passphrase-clear-string passphrase))) - - -;;;###autoload -(defun gpg-encrypt - (plaintext ciphertext result recipients &optional passphrase armor textmode) - "Encrypt buffer PLAINTEXT, and store CIPHERTEXT in that buffer. -RECIPIENTS is a list of key IDs used for encryption. Returns t if -everything worked out well, nil otherwise. Consult buffer RESULT for -details. ARMOR the result and activate canonical -TEXTMODE if requested." - (interactive (list - (read-buffer "Buffer containing plaintext: " nil t) - (read-buffer "Buffer for ciphertext: " nil t) - (read-buffer "Buffer for status informationt: " nil t) - (gpg-read-recipients))) - (let ((subst `((plaintext-file . stdin-file) - (recipients . ,(gpg-build-flag-recipients recipients)) - (armor ,(if armor gpg-command-flag-armor)) - (textmode ,(if armor gpg-command-flag-textmode))))) - (gpg-call-process (gpg-exec-path gpg-command-encrypt) - (gpg-build-arg-list (cdr gpg-command-encrypt) subst) - plaintext ciphertext result nil)) - (when passphrase - (gpg-passphrase-clear-string passphrase))) - - -;;;; Key management - -;;; ADT: OpenPGP Key - -(defun gpg-key-make (user-id key-id unique-id length algorithm - creation-date expire-date validity trust) - "Create a new key object (for internal use only)." - (vector - ;; 0 1 2 3 4 - user-id key-id unique-id length algorithm - ;; 5 6 7 8 - creation-date expire-date validity trust)) - - -(defun gpg-key-p (key) - "Return t if KEY is a key specification." - (and (arrayp key) (equal (length key) 9) key)) - -(defmacro gpg-key-primary-user-id (key) - "The primary user ID for KEY (human-readable). -DO NOT USE this ID for selecting recipients. It is probably not -unique." - (list 'car (list 'aref key 0))) - -(defmacro gpg-key-user-ids (key) - "A list of additional user IDs for KEY (human-readable). -DO NOT USE these IDs for selecting recipients. They are probably not -unique." - (list 'cdr (list 'aref key 0))) - -(defmacro gpg-key-id (key) - "The key ID of KEY. -DO NOT USE this ID for selecting recipients. It is not guaranteed to -be unique." - (list 'aref key 1)) - -(defun gpg-short-key-id (key) - "The short key ID of KEY." - (let* ((id (gpg-key-id key)) - (len (length id))) - (if (> len 8) - (substring id (- len 8)) - id))) - -(defmacro gpg-key-unique-id (key) - "A non-standard ID of KEY which is only valid locally. -This ID can be used to specify recipients in a safe manner. Note, -even this ID might not be unique unless GnuPG is used." - (list 'aref key 2)) - -(defmacro gpg-key-unique-id-list (key-list) - "Like `gpg-key-unique-id', but operate on a list." - `(mapcar (lambda (key) (gpg-key-unique-id key)) - ,key-list)) - -(defmacro gpg-key-length (key) - "Returns the key length." - (list 'aref key 3)) - -(defmacro gpg-key-algorithm (key) - "The encryption algorithm used by KEY. -One of the symbols `rsa', `rsa-encrypt', `rsa-sign', `elgamal', -`elgamal-encrypt', `dsa'." - (list 'aref key 4)) - -(defmacro gpg-key-creation-date (key) - "A string with the creation date of KEY in ISO format." - (list 'aref key 5)) - -(defmacro gpg-key-expire-date (key) - "A string with the expiration date of KEY in ISO format." - (list 'aref key 6)) - -(defmacro gpg-key-validity (key) - "The calculated validity of KEY. -One of the symbols `not-known', `disabled', `revoked', `expired', -`undefined', `trust-none', `trust-marginal', `trust-full', -`trust-ultimate' (see the GnuPG documentation for details)." - (list 'aref key 7)) - -(defmacro gpg-key-trust (key) - "The assigned trust for KEY. -One of the symbols `not-known', `undefined', `trust-none', -`trust-marginal', `trust-full' (see the GnuPG -documentation for details)." - (list 'aref key 8)) - -(defun gpg-key-lessp (a b) - "Returns t if primary user ID of A is less than B." - (string-lessp (gpg-key-primary-user-id a) (gpg-key-primary-user-id b) )) - -;;; Accessing the key database: - -;; Internal functions: - -(defmacro gpg-key-list-keys-skip-field () - '(search-forward ":" eol 'move)) - -(defmacro gpg-key-list-keys-get-field () - '(buffer-substring (point) (if (gpg-key-list-keys-skip-field) - (1- (point)) - eol))) -(defmacro gpg-key-list-keys-string-field () - '(gpg-key-list-keys-get-field)) - -(defmacro gpg-key-list-keys-read-field () - (let ((field (make-symbol "field"))) - `(let ((,field (gpg-key-list-keys-get-field))) - (if (equal (length ,field) 0) - nil - (read ,field))))) - -(defun gpg-key-list-keys-parse-line () - "Parse the line in the current buffer and return a vector of fields." - (let* ((eol (gpg-point-at-eol)) - (v (if (eolp) - nil - (vector - (gpg-key-list-keys-read-field) ; type - (gpg-key-list-keys-get-field) ; trust - (gpg-key-list-keys-read-field) ; key length - (gpg-key-list-keys-read-field) ; algorithm - (gpg-key-list-keys-get-field) ; key ID - (gpg-key-list-keys-get-field) ; creation data - (gpg-key-list-keys-get-field) ; expire - (gpg-key-list-keys-get-field) ; unique (local) ID - (gpg-key-list-keys-get-field) ; ownertrust - (gpg-key-list-keys-string-field) ; user ID - )))) - (if (eolp) - (when v - (forward-char 1)) - (error "Too many fields in GnuPG key database")) - v)) - -(defconst gpg-pubkey-algo-alist - '((1 . rsa) - (2 . rsa-encrypt-only) - (3 . rsa-sign-only) - (16 . elgamal-encrypt-only) - (17 . dsa) - (20 . elgamal)) - "Alist mapping OpenPGP public key algorithm numbers to symbols.") - -(defconst gpg-trust-alist - '((?- . not-known) - (?o . not-known) - (?d . disabled) - (?r . revoked) - (?e . expired) - (?q . trust-undefined) - (?n . trust-none) - (?m . trust-marginal) - (?f . trust-full) - (?u . trust-ultimate)) - "Alist mapping GnuPG trust value short forms to long symbols.") - -(defconst gpg-unabbrev-trust-alist - '(("TRUST_UNDEFINED" . trust-undefined) - ("TRUST_NEVER" . trust-none) - ("TRUST_MARGINAL" . trust-marginal) - ("TRUST_FULLY" . trust-full) - ("TRUST_ULTIMATE" . trust-ultimate)) - "Alist mapping capitalized GnuPG trust values to long symbols.") - -(defmacro gpg-key-list-keys-in-buffer-store () - '(when primary-user-id - (sort user-id 'string-lessp) - (push (gpg-key-make (cons primary-user-id user-id) - key-id unique-id key-length - algorithm creation-date - expire-date validity trust) - key-list))) - -(defun gpg-key-list-keys-in-buffer (&optional buffer) - "Return a list of keys for BUFFER. -If BUFFER is omitted, use current buffer." - (with-current-buffer (if buffer buffer (current-buffer)) - (goto-char (point-min)) - ;; Skip key ring filename written by GnuPG. - (search-forward "\n---------------------------\n" nil t) - ;; Loop over all lines in buffer and analyze them. - (let (primary-user-id user-id key-id unique-id ; current key components - key-length algorithm creation-date expire-date validity trust - line ; fields in current line - key-list) ; keys gather so far - - (while (setq line (gpg-key-list-keys-parse-line)) - (cond - ;; Public or secret key. - ((memq (aref line 0) '(pub sec)) - ;; Store previous key, if any. - (gpg-key-list-keys-in-buffer-store) - ;; Record field values. - (setq primary-user-id (aref line 9)) - (setq user-id nil) - (setq key-id (aref line 4)) - ;; We use the key ID if no unique ID is available. - (setq unique-id (if (> (length (aref line 7)) 0) - (concat "#" (aref line 7)) - (concat "0x" key-id))) - (setq key-length (aref line 2)) - (setq algorithm (assq (aref line 3) gpg-pubkey-algo-alist)) - (if algorithm - (setq algorithm (cdr algorithm)) - (error "Unknown algorithm %s" (aref line 3))) - (setq creation-date (if (> (length (aref line 5)) 0) - (aref line 5))) - (setq expire-date (if (> (length (aref line 6)) 0) - (aref line 6))) - (setq validity (assq (aref (aref line 1) 0) gpg-trust-alist)) - (if validity - (setq validity (cdr validity)) - (error "Unknown validity specification %S" (aref line 1))) - (setq trust (assq (aref (aref line 8) 0) gpg-trust-alist)) - (if trust - (setq trust (cdr trust)) - (error "Unknown trust specification %S" (aref line 8)))) - - ;; Additional user ID - ((eq 'uid (aref line 0)) - (setq user-id (cons (aref line 9) user-id))) - - ;; Subkeys are ignored for now. - ((memq (aref line 0) '(sub ssb)) - t) - (t (error "Unknown record type %S" (aref line 0))))) - - ;; Store the key retrieved last. - (gpg-key-list-keys-in-buffer-store) - ;; Sort the keys according to the primary user ID. - (sort key-list 'gpg-key-lessp)))) - -(defun gpg-key-list-keyspec (command &optional keyspec stderr ignore-error) - "Insert the output of COMMAND before point in current buffer." - (let* ((cmd (gpg-exec-path command)) - (key (if (equal keyspec "") nil keyspec)) - (args (gpg-build-arg-list (cdr command) `((key-id . ,key)))) - exit-status) - (setq exit-status - (apply 'call-process-region - (point-min) (point-min) ; no data - cmd - nil ; don't delete - (if stderr t '(t nil)) - nil ; don't display - args)) - (unless (or ignore-error (equal exit-status 0)) - (error "GnuPG command exited unsuccessfully")))) - - -(defun gpg-key-list-keyspec-parse (command &optional keyspec) - "Return a list of keys matching KEYSPEC. -COMMAND is used to obtain the key list. The usual substring search -for keys is performed." - (with-temp-buffer - (buffer-disable-undo) - (gpg-key-list-keyspec command keyspec) - (gpg-key-list-keys-in-buffer))) - -;;;###autoload -(defun gpg-key-list-keys (&optional keyspec) - "A list of public keys matching KEYSPEC. -The usual substring search for keys is performed." - (gpg-key-list-keyspec-parse gpg-command-key-public-ring keyspec)) - -;;;###autoload -(defun gpg-key-list-secret-keys (&optional keyspec) - "A list of secret keys matching KEYSPEC. -The usual substring search for keys is performed." - (gpg-key-list-keyspec-parse gpg-command-key-secret-ring keyspec)) - -;;;###autoload -(defun gpg-key-insert-public-key (key) - "Inserts the public key(s) matching KEYSPEC. -The ASCII-armored key is inserted before point into current buffer." - (gpg-key-list-keyspec gpg-command-key-export key)) - -;;;###autoload -(defun gpg-key-insert-information (key) - "Insert human-readable information (including fingerprint) on KEY. -Insertion takes place in current buffer before point." - (gpg-key-list-keyspec gpg-command-key-verify key)) - -;;;###autoload -(defun gpg-key-retrieve (key) - "Fetch KEY from default key server. -KEY is a key ID or a list of key IDs. Status information about this -operation is inserted into the current buffer before point." - (gpg-key-list-keyspec gpg-command-key-retrieve key t t)) - -;;;###autoload -(defun gpg-key-add-to-ring (key result) - "Adds key in buffer KEY to the GnuPG key ring. -Human-readable information on the RESULT is stored in buffer RESULT -before point.") - -(provide 'gpg) - -;;; gpg.el ends here diff --git a/contrib/md5.el b/contrib/md5.el deleted file mode 100644 index a036819..0000000 --- a/contrib/md5.el +++ /dev/null @@ -1,409 +0,0 @@ -;;; md5.el -- MD5 Message Digest Algorithm -;;; Gareth Rees - -;; LCD Archive Entry: -;; md5|Gareth Rees|gdr11@cl.cam.ac.uk| -;; MD5 cryptographic message digest algorithm| -;; 13-Nov-95|1.0|~/misc/md5.el.Z| - -;;; Details: ------------------------------------------------------------------ - -;; This is a direct translation into Emacs LISP of the reference C -;; implementation of the MD5 Message-Digest Algorithm written by RSA -;; Data Security, Inc. -;; -;; The algorithm takes a message (that is, a string of bytes) and -;; computes a 16-byte checksum or "digest" for the message. This digest -;; is supposed to be cryptographically strong in the sense that if you -;; are given a 16-byte digest D, then there is no easier way to -;; construct a message whose digest is D than to exhaustively search the -;; space of messages. However, the robustness of the algorithm has not -;; been proven, and a similar algorithm (MD4) was shown to be unsound, -;; so treat with caution! -;; -;; The C algorithm uses 32-bit integers; because GNU Emacs -;; implementations provide 28-bit integers (with 24-bit integers on -;; versions prior to 19.29), the code represents a 32-bit integer as the -;; cons of two 16-bit integers. The most significant word is stored in -;; the car and the least significant in the cdr. The algorithm requires -;; at least 17 bits of integer representation in order to represent the -;; carry from a 16-bit addition. - -;;; Usage: -------------------------------------------------------------------- - -;; To compute the MD5 Message Digest for a message M (represented as a -;; string or as a vector of bytes), call -;; -;; (md5-encode M) -;; -;; which returns the message digest as a vector of 16 bytes. If you -;; need to supply the message in pieces M1, M2, ... Mn, then call -;; -;; (md5-init) -;; (md5-update M1) -;; (md5-update M2) -;; ... -;; (md5-update Mn) -;; (md5-final) - -;;; Copyright and licence: ---------------------------------------------------- - -;; Copyright (C) 1995 by Gareth Rees -;; Derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm -;; -;; md5.el 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, or (at your option) any -;; later version. -;; -;; md5.el 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. -;; -;; The original copyright notice is given below, as required by the -;; licence for the original code. This code is distributed under *both* -;; RSA's original licence and the GNU General Public Licence. (There -;; should be no problems, as the former is more liberal than the -;; latter). - -;;; Original copyright notice: ------------------------------------------------ - -;; Copyright (C) 1990, RSA Data Security, Inc. All rights reserved. -;; -;; License to copy and use this software is granted provided that it is -;; identified as the "RSA Data Security, Inc. MD5 Message- Digest -;; Algorithm" in all material mentioning or referencing this software or -;; this function. -;; -;; License is also granted to make and use derivative works provided -;; that such works are identified as "derived from the RSA Data -;; Security, Inc. MD5 Message-Digest Algorithm" in all material -;; mentioning or referencing the derived work. -;; -;; RSA Data Security, Inc. makes no representations concerning either -;; the merchantability of this software or the suitability of this -;; software for any particular purpose. It is provided "as is" without -;; express or implied warranty of any kind. -;; -;; These notices must be retained in any copies of any part of this -;; documentation and/or software. - -;;; Code: - -(defvar md5-program "md5sum" - "*Program that reads a message on its standard input and writes an -MD5 digest on its output.") - -(defvar md5-maximum-internal-length 4096 - "*The maximum size of a piece of data that should use the MD5 routines -written in lisp. If a message exceeds this, it will be run through an -external filter for processing. Also see the `md5-program' variable. -This variable has no effect if you call the md5-init|update|final -functions - only used by the `md5' function's simpler interface.") - -(defvar md5-bits (make-vector 4 0) - "Number of bits handled, modulo 2^64. -Represented as four 16-bit numbers, least significant first.") -(defvar md5-buffer (make-vector 4 '(0 . 0)) - "Scratch buffer (four 32-bit integers).") -(defvar md5-input (make-vector 64 0) - "Input buffer (64 bytes).") - -(defun md5-unhex (x) - (if (> x ?9) - (if (>= x ?a) - (+ 10 (- x ?a)) - (+ 10 (- x ?A))) - (- x ?0))) - -(defun md5-encode (message) - "Encodes MESSAGE using the MD5 message digest algorithm. -MESSAGE must be a string or an array of bytes. -Returns a vector of 16 bytes containing the message digest." - (if (<= (length message) md5-maximum-internal-length) - (progn - (md5-init) - (md5-update message) - (md5-final)) - (save-excursion - (set-buffer (get-buffer-create " *md5-work*")) - (erase-buffer) - (insert message) - (call-process-region (point-min) (point-max) - (or shell-file-name "/bin/sh") - t (current-buffer) nil - "-c" md5-program) - ;; MD5 digest is 32 chars long - ;; mddriver adds a newline to make neaten output for tty - ;; viewing, make sure we leave it behind. - (let ((data (buffer-substring (point-min) (+ (point-min) 32))) - (vec (make-vector 16 0)) - (ctr 0)) - (while (< ctr 16) - (aset vec ctr (+ (* 16 (md5-unhex (aref data (* ctr 2)))) - (md5-unhex (aref data (1+ (* ctr 2)))))) - (setq ctr (1+ ctr))))))) - -(defsubst md5-add (x y) - "Return 32-bit sum of 32-bit integers X and Y." - (let ((m (+ (car x) (car y))) - (l (+ (cdr x) (cdr y)))) - (cons (logand 65535 (+ m (lsh l -16))) (logand l 65535)))) - -;; FF, GG, HH and II are basic MD5 functions, providing transformations -;; for rounds 1, 2, 3 and 4 respectively. Each function follows this -;; pattern of computation (where ROTATE(x,y) means rotate 32-bit value x -;; by y bits to the left): -;; -;; FF(a,b,c,d,x,s,ac) = ROTATE(a + F(b,c,d) + x + ac,s) + b -;; -;; so we use the macro `md5-make-step' to construct each one. The -;; helper functions F, G, H and I operate on 16-bit numbers; the full -;; operation splits its inputs, operates on the halves separately and -;; then puts the results together. - -(defsubst md5-F (x y z) (logior (logand x y) (logand (lognot x) z))) -(defsubst md5-G (x y z) (logior (logand x z) (logand y (lognot z)))) -(defsubst md5-H (x y z) (logxor x y z)) -(defsubst md5-I (x y z) (logxor y (logior x (logand 65535 (lognot z))))) - -(defmacro md5-make-step (name func) - (` - (defun (, name) (a b c d x s ac) - (let* - ((m1 (+ (car a) ((, func) (car b) (car c) (car d)) (car x) (car ac))) - (l1 (+ (cdr a) ((, func) (cdr b) (cdr c) (cdr d)) (cdr x) (cdr ac))) - (m2 (logand 65535 (+ m1 (lsh l1 -16)))) - (l2 (logand 65535 l1)) - (m3 (logand 65535 (if (> s 15) - (+ (lsh m2 (- s 32)) (lsh l2 (- s 16))) - (+ (lsh m2 s) (lsh l2 (- s 16)))))) - (l3 (logand 65535 (if (> s 15) - (+ (lsh l2 (- s 32)) (lsh m2 (- s 16))) - (+ (lsh l2 s) (lsh m2 (- s 16))))))) - (md5-add (cons m3 l3) b))))) - -(md5-make-step md5-FF md5-F) -(md5-make-step md5-GG md5-G) -(md5-make-step md5-HH md5-H) -(md5-make-step md5-II md5-I) - -(defun md5-init () - "Initialise the state of the message-digest routines." - (aset md5-bits 0 0) - (aset md5-bits 1 0) - (aset md5-bits 2 0) - (aset md5-bits 3 0) - (aset md5-buffer 0 '(26437 . 8961)) - (aset md5-buffer 1 '(61389 . 43913)) - (aset md5-buffer 2 '(39098 . 56574)) - (aset md5-buffer 3 '( 4146 . 21622))) - -(defun md5-update (string) - "Update the current MD5 state with STRING (an array of bytes)." - (let ((len (length string)) - (i 0) - (j 0)) - (while (< i len) - ;; Compute number of bytes modulo 64 - (setq j (% (/ (aref md5-bits 0) 8) 64)) - - ;; Store this byte (truncating to 8 bits to be sure) - (aset md5-input j (logand 255 (aref string i))) - - ;; Update number of bits by 8 (modulo 2^64) - (let ((c 8) (k 0)) - (while (and (> c 0) (< k 4)) - (let ((b (aref md5-bits k))) - (aset md5-bits k (logand 65535 (+ b c))) - (setq c (if (> b (- 65535 c)) 1 0) - k (1+ k))))) - - ;; Increment number of bytes processed - (setq i (1+ i)) - - ;; When 64 bytes accumulated, pack them into sixteen 32-bit - ;; integers in the array `in' and then tranform them. - (if (= j 63) - (let ((in (make-vector 16 (cons 0 0))) - (k 0) - (kk 0)) - (while (< k 16) - (aset in k (md5-pack md5-input kk)) - (setq k (+ k 1) kk (+ kk 4))) - (md5-transform in)))))) - -(defun md5-pack (array i) - "Pack the four bytes at ARRAY reference I to I+3 into a 32-bit integer." - (cons (+ (lsh (aref array (+ i 3)) 8) (aref array (+ i 2))) - (+ (lsh (aref array (+ i 1)) 8) (aref array (+ i 0))))) - -(defun md5-byte (array n b) - "Unpack byte B (0 to 3) from Nth member of ARRAY of 32-bit integers." - (let ((e (aref array n))) - (cond ((eq b 0) (logand 255 (cdr e))) - ((eq b 1) (lsh (cdr e) -8)) - ((eq b 2) (logand 255 (car e))) - ((eq b 3) (lsh (car e) -8))))) - -(defun md5-final () - (let ((in (make-vector 16 (cons 0 0))) - (j 0) - (digest (make-vector 16 0)) - (padding)) - - ;; Save the number of bits in the message - (aset in 14 (cons (aref md5-bits 1) (aref md5-bits 0))) - (aset in 15 (cons (aref md5-bits 3) (aref md5-bits 2))) - - ;; Compute number of bytes modulo 64 - (setq j (% (/ (aref md5-bits 0) 8) 64)) - - ;; Pad out computation to 56 bytes modulo 64 - (setq padding (make-vector (if (< j 56) (- 56 j) (- 120 j)) 0)) - (aset padding 0 128) - (md5-update padding) - - ;; Append length in bits and transform - (let ((k 0) (kk 0)) - (while (< k 14) - (aset in k (md5-pack md5-input kk)) - (setq k (+ k 1) kk (+ kk 4)))) - (md5-transform in) - - ;; Store the results in the digest - (let ((k 0) (kk 0)) - (while (< k 4) - (aset digest (+ kk 0) (md5-byte md5-buffer k 0)) - (aset digest (+ kk 1) (md5-byte md5-buffer k 1)) - (aset digest (+ kk 2) (md5-byte md5-buffer k 2)) - (aset digest (+ kk 3) (md5-byte md5-buffer k 3)) - (setq k (+ k 1) kk (+ kk 4)))) - - ;; Return digest - digest)) - -;; It says in the RSA source, "Note that if the Mysterious Constants are -;; arranged backwards in little-endian order and decrypted with the DES -;; they produce OCCULT MESSAGES!" Security through obscurity? - -(defun md5-transform (in) - "Basic MD5 step. Transform md5-buffer based on array IN." - (let ((a (aref md5-buffer 0)) - (b (aref md5-buffer 1)) - (c (aref md5-buffer 2)) - (d (aref md5-buffer 3))) - (setq - a (md5-FF a b c d (aref in 0) 7 '(55146 . 42104)) - d (md5-FF d a b c (aref in 1) 12 '(59591 . 46934)) - c (md5-FF c d a b (aref in 2) 17 '( 9248 . 28891)) - b (md5-FF b c d a (aref in 3) 22 '(49597 . 52974)) - a (md5-FF a b c d (aref in 4) 7 '(62844 . 4015)) - d (md5-FF d a b c (aref in 5) 12 '(18311 . 50730)) - c (md5-FF c d a b (aref in 6) 17 '(43056 . 17939)) - b (md5-FF b c d a (aref in 7) 22 '(64838 . 38145)) - a (md5-FF a b c d (aref in 8) 7 '(27008 . 39128)) - d (md5-FF d a b c (aref in 9) 12 '(35652 . 63407)) - c (md5-FF c d a b (aref in 10) 17 '(65535 . 23473)) - b (md5-FF b c d a (aref in 11) 22 '(35164 . 55230)) - a (md5-FF a b c d (aref in 12) 7 '(27536 . 4386)) - d (md5-FF d a b c (aref in 13) 12 '(64920 . 29075)) - c (md5-FF c d a b (aref in 14) 17 '(42617 . 17294)) - b (md5-FF b c d a (aref in 15) 22 '(18868 . 2081)) - a (md5-GG a b c d (aref in 1) 5 '(63006 . 9570)) - d (md5-GG d a b c (aref in 6) 9 '(49216 . 45888)) - c (md5-GG c d a b (aref in 11) 14 '( 9822 . 23121)) - b (md5-GG b c d a (aref in 0) 20 '(59830 . 51114)) - a (md5-GG a b c d (aref in 5) 5 '(54831 . 4189)) - d (md5-GG d a b c (aref in 10) 9 '( 580 . 5203)) - c (md5-GG c d a b (aref in 15) 14 '(55457 . 59009)) - b (md5-GG b c d a (aref in 4) 20 '(59347 . 64456)) - a (md5-GG a b c d (aref in 9) 5 '( 8673 . 52710)) - d (md5-GG d a b c (aref in 14) 9 '(49975 . 2006)) - c (md5-GG c d a b (aref in 3) 14 '(62677 . 3463)) - b (md5-GG b c d a (aref in 8) 20 '(17754 . 5357)) - a (md5-GG a b c d (aref in 13) 5 '(43491 . 59653)) - d (md5-GG d a b c (aref in 2) 9 '(64751 . 41976)) - c (md5-GG c d a b (aref in 7) 14 '(26479 . 729)) - b (md5-GG b c d a (aref in 12) 20 '(36138 . 19594)) - a (md5-HH a b c d (aref in 5) 4 '(65530 . 14658)) - d (md5-HH d a b c (aref in 8) 11 '(34673 . 63105)) - c (md5-HH c d a b (aref in 11) 16 '(28061 . 24866)) - b (md5-HH b c d a (aref in 14) 23 '(64997 . 14348)) - a (md5-HH a b c d (aref in 1) 4 '(42174 . 59972)) - d (md5-HH d a b c (aref in 4) 11 '(19422 . 53161)) - c (md5-HH c d a b (aref in 7) 16 '(63163 . 19296)) - b (md5-HH b c d a (aref in 10) 23 '(48831 . 48240)) - a (md5-HH a b c d (aref in 13) 4 '(10395 . 32454)) - d (md5-HH d a b c (aref in 0) 11 '(60065 . 10234)) - c (md5-HH c d a b (aref in 3) 16 '(54511 . 12421)) - b (md5-HH b c d a (aref in 6) 23 '( 1160 . 7429)) - a (md5-HH a b c d (aref in 9) 4 '(55764 . 53305)) - d (md5-HH d a b c (aref in 12) 11 '(59099 . 39397)) - c (md5-HH c d a b (aref in 15) 16 '( 8098 . 31992)) - b (md5-HH b c d a (aref in 2) 23 '(50348 . 22117)) - a (md5-II a b c d (aref in 0) 6 '(62505 . 8772)) - d (md5-II d a b c (aref in 7) 10 '(17194 . 65431)) - c (md5-II c d a b (aref in 14) 15 '(43924 . 9127)) - b (md5-II b c d a (aref in 5) 21 '(64659 . 41017)) - a (md5-II a b c d (aref in 12) 6 '(25947 . 22979)) - d (md5-II d a b c (aref in 3) 10 '(36620 . 52370)) - c (md5-II c d a b (aref in 10) 15 '(65519 . 62589)) - b (md5-II b c d a (aref in 1) 21 '(34180 . 24017)) - a (md5-II a b c d (aref in 8) 6 '(28584 . 32335)) - d (md5-II d a b c (aref in 15) 10 '(65068 . 59104)) - c (md5-II c d a b (aref in 6) 15 '(41729 . 17172)) - b (md5-II b c d a (aref in 13) 21 '(19976 . 4513)) - a (md5-II a b c d (aref in 4) 6 '(63315 . 32386)) - d (md5-II d a b c (aref in 11) 10 '(48442 . 62005)) - c (md5-II c d a b (aref in 2) 15 '(10967 . 53947)) - b (md5-II b c d a (aref in 9) 21 '(60294 . 54161))) - - (aset md5-buffer 0 (md5-add (aref md5-buffer 0) a)) - (aset md5-buffer 1 (md5-add (aref md5-buffer 1) b)) - (aset md5-buffer 2 (md5-add (aref md5-buffer 2) c)) - (aset md5-buffer 3 (md5-add (aref md5-buffer 3) d)))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Here begins the merger with the XEmacs API and the md5.el from the URL -;;; package. Courtesy wmperry@spry.com -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defun md5 (object &optional start end) - "Return the MD5 (a secure message digest algorithm) of an object. -OBJECT is either a string or a buffer. -Optional arguments START and END denote buffer positions for computing the -hash of a portion of OBJECT." - (let ((buffer nil)) - (unwind-protect - (save-excursion - (setq buffer (generate-new-buffer " *md5-work*")) - (set-buffer buffer) - (cond - ((bufferp object) - (insert-buffer-substring object start end)) - ((stringp object) - (insert (if (or start end) - (substring object start end) - object))) - (t nil)) - (prog1 - (if (<= (point-max) md5-maximum-internal-length) - (mapconcat - (function (lambda (node) (format "%02x" node))) - (md5-encode (buffer-string)) - "") - (call-process-region (point-min) (point-max) - (or shell-file-name "/bin/sh") - t buffer nil - "-c" md5-program) - ;; MD5 digest is 32 chars long - ;; mddriver adds a newline to make neaten output for tty - ;; viewing, make sure we leave it behind. - (buffer-substring (point-min) (+ (point-min) 32))) - (kill-buffer buffer))) - (and buffer (kill-buffer buffer) nil)))) - -(provide 'md5) - -;;; md5.el ends here diff --git a/contrib/one-line-cookie.diff b/contrib/one-line-cookie.diff deleted file mode 100644 index 1cab64a..0000000 --- a/contrib/one-line-cookie.diff +++ /dev/null @@ -1,28 +0,0 @@ -Index: url-cookie.el -=================================================================== -RCS file: /gd/gnu/anoncvsroot/url/lisp/url-cookie.el,v -retrieving revision 1.1.1.1 -diff -u -r1.1.1.1 url-cookie.el ---- url-cookie.el 1999/11/26 12:11:47 1.1.1.1 -+++ url-cookie.el 1999/12/10 06:53:05 -@@ -255,6 +255,10 @@ - (setq retval (cons cur retval)))))) - retval)) - -+(defvar url-cookie-multiple-line t -+ "If nil, use one line cookie. -+Some web servers, such as hotmail, only accept one line cookie.") -+ - ;;;###autolaod - (defun url-cookie-generate-header-lines (host path secure) - (let* ((cookies (url-cookie-retrieve host path secure)) -@@ -272,7 +276,8 @@ - (setq cur (car cookies) - cookies (cdr cookies) - chunk (format "%s=%s" (url-cookie-name cur) (url-cookie-value cur)) -- retval (if (< 80 (+ (length retval) (length chunk) 4)) -+ retval (if (and url-cookie-multiple-line -+ (< 80 (+ (length retval) (length chunk) 4))) - (concat retval "\r\nCookie: " chunk) - (if retval - (concat retval "; " chunk) diff --git a/contrib/sha1.el b/contrib/sha1.el deleted file mode 100644 index f4706b8..0000000 --- a/contrib/sha1.el +++ /dev/null @@ -1,397 +0,0 @@ -;;; sha1.el --- SHA1 Message Digest Algorithm. -;; Copyright (C) 1998,1999 Keiichi Suzuki. - -;; Author: Keiichi Suzuki -;; Author: Katsumi Yamaoka -;; Created: 1998-12-25 -;; Revised: 1999-01-13 -;; Keywords: sha1, news, cancel-lock, hmac, rfc2104 - -;; 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, 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. - -;;; A copy of the GNU General Public License can be obtained from this -;;; program's author (send electronic mail to kyle@uunet.uu.net) or from -;;; the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA -;;; 02139, USA. - -;;; Commentary: - -;; This is a direct translation into Emacs LISP of the reference C -;; implementation of the SHA1 message digest algorithm. - -;;; Usage: - -;; To compute the SHA1 message digest for a message M (represented as -;; a string), call -;; -;; (sha1-encode M) -;; -;; which returns the message digest as a hexadecimal string of 20 bytes. -;; If you need to supply the message in pieces M1, M2, ... Mn, then call -;; -;; (sha1-init) -;; (sha1-update M1) -;; (sha1-update M2) -;; ... -;; (sha1-update Mn) -;; (sha1-final) - -;;; Notes: - -;; The C algorithm uses 32-bit integers; because GNU Emacs -;; implementations provide 28-bit integers (with 24-bit integers on -;; versions prior to 19.29), the code represents a 32-bit integer as the -;; cons of two 16-bit integers. The most significant word is stored in -;; the car and the least significant in the cdr. The algorithm requires -;; at least 19 bits of integer representation in order to represent the -;; carry from a 16-bit addition. (see sha1-add()) - -;;; Code: - -(defmacro sha1-f1 (x y z) - `(cons - (logior (logand (car ,x) (car ,y)) (logand (lognot (car ,x)) (car ,z))) - (logior (logand (cdr ,x) (cdr ,y)) (logand (lognot (cdr ,x)) (cdr ,z))) - )) - -(defmacro sha1-f2 (x y z) - `(cons - (logxor (car ,x) (car ,y) (car ,z)) - (logxor (cdr ,x) (cdr ,y) (cdr ,z)) - )) - -(defmacro sha1-f3 (x y z) - `(cons - (logior (logand (car ,x) (car ,y)) (logand (car ,x) (car ,z)) - (logand (car ,y) (car ,z))) - (logior (logand (cdr ,x) (cdr ,y)) (logand (cdr ,x) (cdr ,z)) - (logand (cdr ,y) (cdr ,z))) - )) - -(defmacro sha1-f4 (x y z) - `(cons - (logxor (car ,x) (car ,y) (car ,z)) - (logxor (cdr ,x) (cdr ,y) (cdr ,z)) - )) - -(defconst sha1-const1 '(23170 . 31129) - "SHA constants 1 \(0x5a827999\)") -(defconst sha1-const2 '(28377 . 60321) - "SHA constants 2 \(0x6ed9eba1\)") -(defconst sha1-const3 '(36635 . 48348) - "SHA constants 3 \(0x8f1bbcdc\)") -(defconst sha1-const4 '(51810 . 49622) - "SHA constants 4 \(0xca62c1d6\)") - -(defvar sha1-digest (make-vector 5 nil)) -(defvar sha1-count-lo nil) -(defvar sha1-count-hi nil) -(defvar sha1-data nil) -(defvar sha1-local nil) -(defconst SHA1-BLOCKSIZE 64) - -(defun sha1-init () - "Initialize the state of the SHA1 message digest routines." - (aset sha1-digest 0 (cons 26437 8961)) - (aset sha1-digest 1 (cons 61389 43913)) - (aset sha1-digest 2 (cons 39098 56574)) - (aset sha1-digest 3 (cons 4146 21622)) - (aset sha1-digest 4 (cons 50130 57840)) - (setq sha1-count-lo (cons 0 0) - sha1-count-hi (cons 0 0) - sha1-local 0 - sha1-data nil) - ) - -(defmacro sha1-32-make (v) - "Return 32bits internal value from normal integer." - `(cons (lsh ,v -16) (logand 65535 ,v))) - -(defun sha1-add (to &rest vals) - "Set sum of all the arguments to the first one." - (let (val) - (while (setq val (car vals)) - (setcar to (+ (car to) (car val))) - (setcdr to (+ (cdr to) (cdr val))) - (setq vals (cdr vals)) - ) - (setcar to (logand 65535 (+ (car to) (lsh (cdr to) -16)))) - (setcdr to (logand 65535 (cdr to))) - to - )) - -(defun sha1-xor (to &rest vals) - "Set bitwise-exclusive-or of all the arguments to the first one." - (let (val) - (while (setq val (car vals)) - (setcar to (logxor (car to) (car val))) - (setcdr to (logxor (cdr to) (cdr val))) - (setq vals (cdr vals))) - )) - -(defmacro sha1-rot (val c1 c2) - "Internal macro for sha1-rot-*." - `(cons - (logand 65535 (logior (lsh (car ,val) ,c1) (lsh (cdr ,val) ,c2))) - (logand 65535 (logior (lsh (cdr ,val) ,c1) (lsh (car ,val) ,c2))) - )) - -(defmacro sha1-rot-1 (val) - "Return VAL with its bits rotated left by 1." - `(sha1-rot ,val 1 -15) - ) - -(defmacro sha1-rot-5 (val) - "Return VAL with its bits rotated left by 5." - `(sha1-rot ,val 5 -11) - ) - -(defmacro sha1-rot-30 (val) - "Return VAL with its bits rotated left by 30." - `(sha1-rot ,val -2 14) - ) - -(defun sha1-inc (to) - "Set TO pulus one to TO." - (setcdr to (1+ (cdr to))) - (when (> (cdr to) 65535) - (setcdr to (logand 65535 (cdr to))) - (setcar to (logand 65535 (1+ (car to)))))) - -(defun sha1-lsh (to v count) - "Set TO with its bits shifted left by COUNT to TO." - (setcar to (logand 65535 - (logior (lsh (car v) count) (lsh (cdr v) (- count 16))))) - (setcdr to (logand 65535 (lsh (cdr v) count))) - to - ) - -(defun sha1-rsh (to v count) - "Set TO with its bits shifted right by COUNT to TO." - (setq count (- 0 count)) - (setcdr to (logand 65535 - (logior (lsh (cdr v) count) (lsh (car v) (- count 16))))) - (setcar to (logand 65535 (lsh (car v) count))) - to - ) - -(defun sha1-< (v1 v2) - "Return t if firast argment is less then second argument." - (or (< (car v1) (car v2)) - (and (eq (car v1) (car v2)) - (< (cdr v1) (cdr v2)))) - ) - -(unless (fboundp 'string-as-unibyte) - (defsubst string-as-unibyte (string) - string) - ) - -(defun sha1-update (bytes) - "Update the current SHA1 state with BYTES (an string of uni-bytes)." - (setq bytes (string-as-unibyte bytes)) - (let* ((len (length bytes)) - (len32 (sha1-32-make len)) - (tmp32 (cons 0 0)) - (top 0) - (clo (cons 0 0)) - i done) - (sha1-add clo sha1-count-lo (sha1-lsh tmp32 len32 3)) - (when (sha1-< clo sha1-count-lo) - (sha1-inc sha1-count-hi)) - (setq sha1-count-lo clo) - (sha1-add sha1-count-hi (sha1-rsh tmp32 len32 29)) - (when (> (length sha1-data) 0) - (setq i (- SHA1-BLOCKSIZE (length sha1-data))) - (when (> i len) - (setq i len)) - (setq sha1-data (concat sha1-data (substring bytes 0 i))) - (setq len (- len i) - top i) - (if (eq (length sha1-data) SHA1-BLOCKSIZE) - (sha1-transform) - (setq done t))) - (when (not done) - (while (and (not done) - (>= len SHA1-BLOCKSIZE)) - (setq sha1-data (substring bytes top (+ top SHA1-BLOCKSIZE)) - top (+ top SHA1-BLOCKSIZE) - len (- len SHA1-BLOCKSIZE)) - (sha1-transform)) - (setq sha1-data (substring bytes top (+ top len)))) - )) - -(defmacro sha1-FA (n) - (let ((func (intern (format "sha1-f%d" n))) - (const (intern (format "sha1-const%d" n)))) - `(setq T (sha1-add (cons 0 0) (sha1-rot-5 A) (,func B C D) E (aref W WIDX) - ,const) - WIDX (1+ WIDX) - B (sha1-rot-30 B)))) - -(defmacro sha1-FB (n) - (let ((func (intern (format "sha1-f%d" n))) - (const (intern (format "sha1-const%d" n)))) - `(setq E (sha1-add (cons 0 0) (sha1-rot-5 T) (,func A B C) D (aref W WIDX) - ,const) - WIDX (1+ WIDX) - A (sha1-rot-30 A)))) - -(defmacro sha1-FC (n) - (let ((func (intern (format "sha1-f%d" n))) - (const (intern (format "sha1-const%d" n)))) - `(setq D (sha1-add (cons 0 0) (sha1-rot-5 E) (,func T A B) C (aref W WIDX) - ,const) - WIDX (1+ WIDX) - T (sha1-rot-30 T)))) - -(defmacro sha1-FD (n) - (let ((func (intern (format "sha1-f%d" n))) - (const (intern (format "sha1-const%d" n)))) - `(setq C (sha1-add (cons 0 0) (sha1-rot-5 D) (,func E T A) B (aref W WIDX) - ,const) - WIDX (1+ WIDX) - E (sha1-rot-30 E)))) - -(defmacro sha1-FE (n) - (let ((func (intern (format "sha1-f%d" n))) - (const (intern (format "sha1-const%d" n)))) - `(setq B (sha1-add (cons 0 0) (sha1-rot-5 C) (,func D E T) A (aref W WIDX) - ,const) - WIDX (1+ WIDX) - D (sha1-rot-30 D)))) - -(defmacro sha1-FT (n) - (let ((func (intern (format "sha1-f%d" n))) - (const (intern (format "sha1-const%d" n)))) - `(setq A (sha1-add (cons 0 0) (sha1-rot-5 B) (,func C D E) T (aref W WIDX) - ,const) - WIDX (1+ WIDX) - C (sha1-rot-30 C)))) - -(defun sha1-transform () - "Basic SHA1 step. Transform sha1-digest based on sha1-data." - (let ((W (make-vector 80 nil)) - (WIDX 0) - (bidx 0) - T A B C D E) - (while (< WIDX 16) - (aset W WIDX - (cons (logior (lsh (aref sha1-data bidx) 8) - (aref sha1-data (setq bidx (1+ bidx)))) - (logior (lsh (aref sha1-data (setq bidx (1+ bidx))) 8) - (aref sha1-data (setq bidx (1+ bidx)))))) - (setq bidx (1+ bidx) - WIDX (1+ WIDX))) - (while (< WIDX 80) - (aset W WIDX (cons 0 0)) - (sha1-xor (aref W WIDX) - (aref W (- WIDX 3)) (aref W (- WIDX 8)) - (aref W (- WIDX 14)) (aref W (- WIDX 16))) - (aset W WIDX (sha1-rot-1 (aref W WIDX))) - (setq WIDX (1+ WIDX))) - (setq A (cons (car (aref sha1-digest 0)) (cdr (aref sha1-digest 0))) - B (cons (car (aref sha1-digest 1)) (cdr (aref sha1-digest 1))) - C (cons (car (aref sha1-digest 2)) (cdr (aref sha1-digest 2))) - D (cons (car (aref sha1-digest 3)) (cdr (aref sha1-digest 3))) - E (cons (car (aref sha1-digest 4)) (cdr (aref sha1-digest 4))) - WIDX 0) - - (sha1-FA 1) (sha1-FB 1) (sha1-FC 1) (sha1-FD 1) (sha1-FE 1) (sha1-FT 1) - (sha1-FA 1) (sha1-FB 1) (sha1-FC 1) (sha1-FD 1) (sha1-FE 1) (sha1-FT 1) - (sha1-FA 1) (sha1-FB 1) (sha1-FC 1) (sha1-FD 1) (sha1-FE 1) (sha1-FT 1) - (sha1-FA 1) (sha1-FB 1) (sha1-FC 2) (sha1-FD 2) (sha1-FE 2) (sha1-FT 2) - (sha1-FA 2) (sha1-FB 2) (sha1-FC 2) (sha1-FD 2) (sha1-FE 2) (sha1-FT 2) - (sha1-FA 2) (sha1-FB 2) (sha1-FC 2) (sha1-FD 2) (sha1-FE 2) (sha1-FT 2) - (sha1-FA 2) (sha1-FB 2) (sha1-FC 2) (sha1-FD 2) (sha1-FE 3) (sha1-FT 3) - (sha1-FA 3) (sha1-FB 3) (sha1-FC 3) (sha1-FD 3) (sha1-FE 3) (sha1-FT 3) - (sha1-FA 3) (sha1-FB 3) (sha1-FC 3) (sha1-FD 3) (sha1-FE 3) (sha1-FT 3) - (sha1-FA 3) (sha1-FB 3) (sha1-FC 3) (sha1-FD 3) (sha1-FE 3) (sha1-FT 3) - (sha1-FA 4) (sha1-FB 4) (sha1-FC 4) (sha1-FD 4) (sha1-FE 4) (sha1-FT 4) - (sha1-FA 4) (sha1-FB 4) (sha1-FC 4) (sha1-FD 4) (sha1-FE 4) (sha1-FT 4) - (sha1-FA 4) (sha1-FB 4) (sha1-FC 4) (sha1-FD 4) (sha1-FE 4) (sha1-FT 4) - (sha1-FA 4) (sha1-FB 4) - - (sha1-add (aref sha1-digest 0) E) - (sha1-add (aref sha1-digest 1) T) - (sha1-add (aref sha1-digest 2) A) - (sha1-add (aref sha1-digest 3) B) - (sha1-add (aref sha1-digest 4) C) - )) - -(defun sha1-final (&optional binary) - "Transform buffered sha1-data and return SHA1 message digest. -If optional argument BINARY is non-nil, then return binary formed -string of message digest." - (let ((count (logand (lsh (cdr sha1-count-lo) -3) 63))) - (when (< (length sha1-data) SHA1-BLOCKSIZE) - (setq sha1-data - (concat sha1-data - (make-string (- SHA1-BLOCKSIZE (length sha1-data)) 0)))) - (aset sha1-data count 128) - (setq count (1+ count)) - (if (> count (- SHA1-BLOCKSIZE 8)) - (progn - (setq sha1-data (concat (substring sha1-data 0 count) - (make-string (- SHA1-BLOCKSIZE count) 0))) - (sha1-transform) - (setq sha1-data (concat (make-string (- SHA1-BLOCKSIZE 8) 0) - (substring sha1-data -8)))) - (setq sha1-data (concat (substring sha1-data 0 count) - (make-string (- SHA1-BLOCKSIZE 8 count) 0) - (substring sha1-data -8)))) - (aset sha1-data 56 (lsh (car sha1-count-hi) -8)) - (aset sha1-data 57 (logand 255 (car sha1-count-hi))) - (aset sha1-data 58 (lsh (cdr sha1-count-hi) -8)) - (aset sha1-data 59 (logand 255 (cdr sha1-count-hi))) - (aset sha1-data 60 (lsh (car sha1-count-lo) -8)) - (aset sha1-data 61 (logand 255 (car sha1-count-lo))) - (aset sha1-data 62 (lsh (cdr sha1-count-lo) -8)) - (aset sha1-data 63 (logand 255 (cdr sha1-count-lo))) - (sha1-transform) - (if binary - (mapconcat - (lambda (elem) - (concat (char-to-string (/ (car elem) 256)) - (char-to-string (% (car elem) 256)) - (char-to-string (/ (cdr elem) 256)) - (char-to-string (% (cdr elem) 256)))) - (list (aref sha1-digest 0) (aref sha1-digest 1) (aref sha1-digest 2) - (aref sha1-digest 3) (aref sha1-digest 4)) - "") - (format "%04x%04x%04x%04x%04x%04x%04x%04x%04x%04x" - (car (aref sha1-digest 0)) (cdr (aref sha1-digest 0)) - (car (aref sha1-digest 1)) (cdr (aref sha1-digest 1)) - (car (aref sha1-digest 2)) (cdr (aref sha1-digest 2)) - (car (aref sha1-digest 3)) (cdr (aref sha1-digest 3)) - (car (aref sha1-digest 4)) (cdr (aref sha1-digest 4))) - ))) - -(defun sha1-encode (message &optional binary) - "Encodes MESSAGE using the SHA1 message digest algorithm. -MESSAGE must be a unibyte-string. -By default, return a string which formed hex-decimal charcters -from message digest. -If optional argument BINARY is non-nil, then return binary formed -string of message digest." - (sha1-init) - (sha1-update message) - (sha1-final binary)) - -(defun sha1-encode-binary (message) - "Encodes MESSAGE using the SHA1 message digest algorithm. -MESSAGE must be a unibyte-string. -Return binary formed string of message digest." - (sha1-encode message 'binary)) - -(provide 'sha1) - -;;; sha1.el ends here diff --git a/contrib/ssl.el b/contrib/ssl.el deleted file mode 100644 index fcb2509..0000000 --- a/contrib/ssl.el +++ /dev/null @@ -1,201 +0,0 @@ -;;; ssl.el,v --- ssl functions for emacsen without them builtin -;; Author: #Author: zsh # -;; Created: #Date: 2001/07/13 19:31:09 # -;; Version: #Revision: 1.2 # -;; Keywords: comm - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Copyright (c) 1995, 1996 by William M. Perry -;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc. -;;; -;;; This file is part of GNU Emacs. -;;; -;;; GNU Emacs 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, or (at your option) -;;; any later version. -;;; -;;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;;; Boston, MA 02111-1307, USA. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(eval-when-compile (require 'cl)) -(require 'base64) - -(eval-and-compile - (condition-case () - (require 'custom) - (error nil)) - (if (and (featurep 'custom) (fboundp 'custom-declare-variable)) - nil ;; We've got what we needed - ;; We have the old custom-library, hack around it! - (defmacro defgroup (&rest args) - nil) - (defmacro defcustom (var value doc &rest args) - (` (defvar (, var) (, value) (, doc)))))) - -(defgroup ssl nil - "Support for `Secure Sockets Layer' encryption." - :group 'comm) - -(defcustom ssl-certificate-directory "~/.w3/certs/" - "*Directory to store CA certificates in" - :group 'ssl - :type 'directory) - -(defcustom ssl-rehash-program-name "c_rehash" - "*Program to run after adding a cert to a directory . -Run with one argument, the directory name." - :group 'ssl - :type 'string) - -(defcustom ssl-view-certificate-program-name "x509" - "*The program to run to provide a human-readable view of a certificate." - :group 'ssl - :type 'string) - -(defcustom ssl-view-certificate-program-arguments '("-text" "-inform" "DER") - "*Arguments that should be passed to the certificate viewing program. -The certificate is piped to it. -Maybe a way of passing a file should be implemented" - :group 'ssl - :type 'list) - -(defcustom ssl-certificate-directory-style 'ssleay - "*Style of cert database to use, the only valid value right now is `ssleay'. -This means a directory of pem encoded certificates with hash symlinks." - :group 'ssl - :type '(choice (const :tag "SSLeay" :value ssleay) - (const :tag "OpenSSL" :value openssl))) - -(defcustom ssl-certificate-verification-policy 0 - "*How far up the certificate chain we should verify." - :group 'ssl - :type '(choice (const :tag "No verification" :value 0) - (const :tag "Verification required" :value 1) - (const :tag "Reject connection if verification fails" :value 3) - (const :tag "SSL_VERIFY_CLIENT_ONCE" :value 5))) - -(defcustom ssl-program-name "openssl" - "*The program to run in a subprocess to open an SSL connection." - :group 'ssl - :type 'string) - -(defcustom ssl-program-arguments - '("s_client" - "-quiet" - "-host" host - "-port" service - "-verify" (int-to-string ssl-certificate-verification-policy) - "-CApath" ssl-certificate-directory - ) - "*Arguments that should be passed to the program `ssl-program-name'. -This should be used if your SSL program needs command line switches to -specify any behaviour (certificate file locations, etc). -The special symbols 'host and 'port may be used in the list of arguments -and will be replaced with the hostname and service/port that will be connected -to." - :group 'ssl - :type 'list) - -(defun ssl-certificate-information (der) - "Return an assoc list of information about a certificate in DER format." - (let ((certificate (concat "-----BEGIN CERTIFICATE-----\n" - (base64-encode-string der) - "\n-----END CERTIFICATE-----\n")) - (exit-code 0)) - (save-excursion - (set-buffer (get-buffer-create " *openssl*")) - (erase-buffer) - (insert certificate) - (setq exit-code (condition-case () - (call-process-region (point-min) (point-max) - ssl-program-name - t (list (current-buffer) nil) t - "x509" - "-subject" ; Print the subject DN - "-issuer" ; Print the issuer DN - "-dates" ; Both before and after dates - "-serial" ; print out serial number - "-noout" ; Don't spit out the certificate - ) - (error -1))) - (if (/= exit-code 0) - nil - (let ((vals nil)) - (goto-char (point-min)) - (while (re-search-forward "^\\([^=\n\r]+\\)\\s *=\\s *\\(.*\\)" nil t) - (push (cons (match-string 1) (match-string 2)) vals)) - vals))))) - -(defun ssl-accept-ca-certificate () - "Ask if the user is willing to accept a new CA certificate. The buffer-name -should be the intended name of the certificate, and the buffer should probably -be in DER encoding" - ;; TODO, check if it is really new or if we already know it - (let* ((process-connection-type nil) - (tmpbuf (generate-new-buffer "X509 CA Certificate Information")) - (response (save-excursion - (and (eq 0 - (apply 'call-process-region - (point-min) (point-max) - ssl-view-certificate-program-name - nil tmpbuf t - ssl-view-certificate-program-arguments)) - (switch-to-buffer tmpbuf) - (goto-char (point-min)) - (or (recenter) t) - (yes-or-no-p - "Accept this CA to vouch for secure server identities? ") - (kill-buffer tmpbuf))))) - (if (not response) - nil - (if (not (file-directory-p ssl-certificate-directory)) - (make-directory ssl-certificate-directory)) - (case ssl-certificate-directory-style - (ssleay - (base64-encode-region (point-min) (point-max)) - (goto-char (point-min)) - (insert "-----BEGIN CERTIFICATE-----\n") - (goto-char (point-max)) - (insert "-----END CERTIFICATE-----\n") - (let ((f (expand-file-name - (concat (file-name-sans-extension (buffer-name)) ".pem") - ssl-certificate-directory))) - (write-file f) - (call-process ssl-rehash-program-name - nil nil nil - (expand-file-name ssl-certificate-directory)))))))) - -(defun open-ssl-stream (name buffer host service) - "Open a SSL connection for a service to a host. -Returns a subprocess-object to represent the connection. -Input and output work as for subprocesses; `delete-process' closes it. -Args are NAME BUFFER HOST SERVICE. -NAME is name for process. It is modified if necessary to make it unique. -BUFFER is the buffer (or buffer-name) to associate with the process. - Process output goes at end of that buffer, unless you specify - an output stream or filter function to handle the output. - BUFFER may be also nil, meaning that this process is not associated - with any buffer -Third arg is name of the host to connect to, or its IP address. -Fourth arg SERVICE is name of the service desired, or an integer -specifying a port number to connect to." - (if (integerp service) (setq service (int-to-string service))) - (let* ((process-connection-type nil) - (port service) - (proc (eval - (` - (start-process name buffer ssl-program-name - (,@ ssl-program-arguments)))))) - (process-kill-without-query proc) - proc)) - -(provide 'ssl) diff --git a/contrib/timer.el b/contrib/timer.el deleted file mode 100644 index 70d9940..0000000 --- a/contrib/timer.el +++ /dev/null @@ -1,308 +0,0 @@ -;;; timer.el --- run a function with args at some time in future. - -;; Copyright (C) 1996 Free Software Foundation, Inc. - -;; Maintainer: FSF - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; This package gives you the capability to run Emacs Lisp commands at -;; specified times in the future, either as one-shots or periodically. - -;;; Code: - -(require 'itimer) - -(fset 'timer-create 'make-itimer) - -(fset 'timerp 'itimerp) - -;(defvar timer-idle-list nil -; "List of active idle-time timers in order of increasing time") -(defvaralias 'timer-idle-list 'itimer-list) -(defvaralias 'timer-list 'itimer-list) - - -(defun timer-set-time (timer time &optional delta) - "Set the trigger time of TIMER to TIME. -TIME must be in the internal format returned by, e.g., `current-time'. -If optional third argument DELTA is a non-zero integer, make the timer -fire repeatedly that many seconds apart." - (set-itimer-value timer (itimer-time-difference time (current-time))) - (and delta (check-nonnegative-number delta)) - (and delta (set-itimer-restart timer delta)) - timer) - -(defun timer-set-idle-time (timer secs &optional repeat) - "Set the trigger idle time of TIMER to SECS. -If optional third argument REPEAT is non-nil, make the timer -fire each time Emacs is idle for that many seconds." - (set-itimer-is-idle timer t) - (set-itimer-value timer secs) - (when repeat - (set-itimer-restart timer secs)) - timer) - -(defun timer-relative-time (time secs &optional usecs) - "Advance TIME by SECS seconds and optionally USECS microseconds. -SECS may be a fraction." - (let ((high (car time)) - (low (if (consp (cdr time)) (nth 1 time) (cdr time))) - (micro (if (numberp (car-safe (cdr-safe (cdr time)))) - (nth 2 time) - 0))) - ;; Add - (if usecs (setq micro (+ micro usecs))) - (if (floatp secs) - (setq micro (+ micro (floor (* 1000000 (- secs (floor secs))))))) - (setq low (+ low (floor secs))) - - ;; Normalize - (setq low (+ low (/ micro 1000000))) - (setq micro (mod micro 1000000)) - (setq high (+ high (/ low 65536))) - (setq low (logand low 65535)) - - (list high low (and (/= micro 0) micro)))) - -(defun timer-inc-time (timer secs &optional usecs) - "Increment the time set in TIMER by SECS seconds and USECS microseconds. -SECS may be a fraction." - (let ((time (itimer-value timer))) - (setq time (+ time secs (if (and usecs (fboundp 'lisp-float-type)) - (/ usecs (float 1000000)) - 0))) - (set-itimer-value timer time))) - -(defun timer-set-time-with-usecs (timer time usecs &optional delta) - "Set the trigger time of TIMER to TIME. -TIME must be in the internal format returned by, e.g., `current-time'. -If optional third argument DELTA is a non-zero integer, make the timer -fire repeatedly that many seconds apart." - (let ((list (list nil nil nil))) - (setcar list (car time)) - (setcar (nthcdr 1 list) (if (consp (cdr time)) - (car (cdr time)) - (cdr time))) - (setcar (nthcdr 2 list) usecs) - (set-itimer-value timer (itimer-time-difference list (current-time))) - (set-itimer-restart timer delta) - timer)) - -(defun timer-set-function (timer function &optional args) - "Make TIMER call FUNCTION with optional ARGS when triggering." - (set-itimer-function timer function) - (set-itimer-function-arguments timer args) - (set-itimer-uses-arguments timer t) - timer) - -(defun timer-activate (timer) - "Put TIMER on the list of active timers." - (activate-itimer timer)) - -(defun timer-activate-when-idle (timer) - "Arrange to activate TIMER whenever Emacs is next idle." - (set-itimer-is-idle timer t) - ;(set-itimer-uses-arguments timer nil) - ;(unless (memq timer timer-idle-list) - ;(setq timer-idle-list (cons timer timer-idle-list))) - (activate-itimer timer)) - -;; can't do this, different kind of timer -;;(defalias 'disable-timeout 'cancel-timer) - -(defun cancel-timer (timer) - "Remove TIMER from the list of active timers." - ;(setq timer-idle-list (delq timer timer-idle-list)) - (delete-itimer timer)) - -(defun cancel-function-timers (function) - "Cancel all timers scheduled by `run-at-time' which would run FUNCTION." - (interactive "aCancel timers of function: ") - (let ((p itimer-list)) - (while p - (if (eq function (itimer-function p)) - (progn - (setq p (cdr p)) - (delete-itimer (car p))) - (setq p (cdr p)))))) - -;;;###autoload -(defun run-at-time (time repeat function &rest args) - "Perform an action after a delay of SECS seconds. -Repeat the action every REPEAT seconds, if REPEAT is non-nil. -TIME should be a string like \"11:23pm\", nil meaning now, a number of seconds -from now, or a value from `encode-time'. -REPEAT may be an integer or floating point number. -The action is to call FUNCTION with arguments ARGS. - -This function returns a timer object which you can use in `cancel-timer'." - (interactive "sRun at time: \nNRepeat interval: \naFunction: ") - - ;; Special case: nil means "now" and is useful when repeating. - (if (null time) - (setq time (current-time))) - - ;; Handle numbers as relative times in seconds. - (if (numberp time) - (setq time (timer-relative-time (current-time) time))) - - ;; Handle relative times like "2 hours and 35 minutes" - (if (stringp time) - (let ((secs (timer-duration time))) - (if secs - (setq time (timer-relative-time (current-time) secs))))) - - ;; Handle "11:23pm" and the like. Interpret it as meaning today - ;; which admittedly is rather stupid if we have passed that time - ;; already. (Though only Emacs hackers hack Emacs at that time.) - (if (stringp time) - (progn - (require 'diary-lib) - (let ((hhmm (diary-entry-time time)) - (now (decode-time))) - (if (>= hhmm 0) - (setq time - (encode-time 0 (% hhmm 100) (/ hhmm 100) (nth 3 now) - (nth 4 now) (nth 5 now) (nth 8 now))))))) - - (or (consp time) - (error "Invalid time format")) - - (or (null repeat) - (numberp repeat) - (error "Invalid repetition interval")) - - (let ((timer (timer-create))) - (timer-set-time timer time repeat) - (timer-set-function timer function args) - (timer-activate timer) - timer)) - -;;;###autoload -(defun run-with-timer (secs repeat function &rest args) - "Perform an action after a delay of SECS seconds. -Repeat the action every REPEAT seconds, if REPEAT is non-nil. -SECS and REPEAT may be integers or floating point numbers. -The action is to call FUNCTION with arguments ARGS. - -This function returns a timer object which you can use in `cancel-timer'." - (interactive "sRun after delay (seconds): \nNRepeat interval: \naFunction: ") - (apply 'run-at-time secs repeat function args)) - -;;;###autoload -(defun run-with-idle-timer (secs repeat function &rest args) - "Perform an action the next time Emacs is idle for SECS seconds. -If REPEAT is non-nil, do this each time Emacs is idle for SECS seconds. -SECS may be an integer or a floating point number. -The action is to call FUNCTION with arguments ARGS. - -This function returns a timer object which you can use in `cancel-timer'." - (interactive - (list (read-from-minibuffer "Run after idle (seconds): " nil nil t) - (y-or-n-p "Repeat each time Emacs is idle? ") - (intern (completing-read "Function: " obarray 'fboundp t)))) - (let ((timer (timer-create))) - (timer-set-function timer function args) - (timer-set-idle-time timer secs repeat) - (timer-activate-when-idle timer) - timer)) - -(defun with-timeout-handler (tag) - (throw tag 'timeout)) - -;;;###autoload (put 'with-timeout 'lisp-indent-function 1) - -;;;###autoload -(defmacro with-timeout (list &rest body) - "Run BODY, but if it doesn't finish in SECONDS seconds, give up. -If we give up, we run the TIMEOUT-FORMS and return the value of the last one. -The call should look like: - (with-timeout (SECONDS TIMEOUT-FORMS...) BODY...) -The timeout is checked whenever Emacs waits for some kind of external -event \(such as keyboard input, input from subprocesses, or a certain time); -if the program loops without waiting in any way, the timeout will not -be detected." - (let ((seconds (car list)) - (timeout-forms (cdr list))) - `(let ((with-timeout-tag (cons nil nil)) - with-timeout-value with-timeout-timer) - (if (catch with-timeout-tag - (progn - (setq with-timeout-timer - (run-with-timer ,seconds nil - 'with-timeout-handler - with-timeout-tag)) - (setq with-timeout-value (progn . ,body)) - nil)) - (progn . ,timeout-forms) - (cancel-timer with-timeout-timer) - with-timeout-value)))) - -(defun y-or-n-p-with-timeout (prompt seconds default-value) - "Like (y-or-n-p PROMPT), with a timeout. -If the user does not answer after SECONDS seconds, return DEFAULT-VALUE." - (with-timeout (seconds default-value) - (y-or-n-p prompt))) - -(defvar timer-duration-words - (list (cons "microsec" 0.000001) - (cons "microsecond" 0.000001) - (cons "millisec" 0.001) - (cons "millisecond" 0.001) - (cons "sec" 1) - (cons "second" 1) - (cons "min" 60) - (cons "minute" 60) - (cons "hour" (* 60 60)) - (cons "day" (* 24 60 60)) - (cons "week" (* 7 24 60 60)) - (cons "fortnight" (* 14 24 60 60)) - (cons "month" (* 30 24 60 60)) ; Approximation - (cons "year" (* 365.25 24 60 60)) ; Approximation - ) - "Alist mapping temporal words to durations in seconds") - -(defun timer-duration (string) - "Return number of seconds specified by STRING, or nil if parsing fails." - (let ((secs 0) - (start 0) - (case-fold-search t)) - (while (string-match - "[ \t]*\\([0-9.]+\\)?[ \t]*\\([a-z]+[a-rt-z]\\)s?[ \t]*" - string start) - (let ((count (if (match-beginning 1) - (string-to-number (match-string 1 string)) - 1)) - (itemsize (cdr (assoc (match-string 2 string) - timer-duration-words)))) - (if itemsize - (setq start (match-end 0) - secs (+ secs (* count itemsize))) - (setq secs nil - start (length string))))) - (if (= start (length string)) - secs - (if (string-match "\\`[0-9.]+\\'" string) - (string-to-number string))))) - -(provide 'timer) - -;;; timer.el ends here diff --git a/contrib/vcard.el b/contrib/vcard.el deleted file mode 100644 index 22f032c..0000000 --- a/contrib/vcard.el +++ /dev/null @@ -1,308 +0,0 @@ -;;; vcard.el --- vcard parsing and display routines - -;; Copyright (C) 1997 Noah S. Friedman - -;; Author: Noah Friedman -;; Maintainer: friedman@splode.com -;; Keywords: extensions -;; Created: 1997-09-27 - -;; 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, 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, you can either send email to this -;; program's maintainer or write to: The Free Software Foundation, -;; Inc.; 59 Temple Place, Suite 330; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; The display routines here are just an example. The primitives in the -;; first section can be used to construct other vcard formatters. - -;;; Code: - -(defvar vcard-standard-filters '(vcard-filter-html) - "*Standard list of filters to apply to parsed vcard data. -These filters are applied sequentially to vcard data records when -the function `vcard-standard-filter' is supplied as the second argument to -`vcard-parse-string'.") - -(defun vcard-parse-string (raw &optional filter) - "Parse RAW vcard data as a string, and return an alist representing data. - -If the optional function FILTER is specified, apply that filter to the -data record of each key before splitting fields. Filters should accept -two arguments: the key and the data. They are expected to operate on -\(and return\) a modified data value. - -Vcard data is normally in the form - - begin: vcard - key1: field - key2;subkey1: field - key2;subkey2: field1;field2;field3 - end: vcard - -\(Whitespace after the colon separating the key and field is optional.\) -If supplied to this function an alist of the form - - ((\"key1\" \"field\") - (\"key2\" - (\"subkey2\" \"field1\" \"field2\" \"field3\") - (\"subkey1\" \"field\"))) - -would be returned." - (save-match-data - (let ((raw-pos 0) - (vcard-data nil) - key data) - (string-match "^[ \t]*begin:[ \t]*vcard[ \t]*[\r\n]+" raw raw-pos) - (setq raw-pos (match-end 0)) - (while (and (< raw-pos (length raw)) - (string-match - "^[ \t]*\\([^:]+\\):[ \t]*\\(.*\\)[ \t]*[\n\r]+" - raw raw-pos)) - (setq key (vcard-matching-substring 1 raw)) - (setq data (vcard-matching-substring 2 raw)) - (setq raw-pos (match-end 0)) - (cond - ((string= key "end") - (setq raw-pos (length raw))) - (t - (and filter - (setq data (funcall filter key data))) - (setq vcard-data - (vcard-set-alist-slot vcard-data - (vcard-split-string key ";") - (vcard-split-string data ";")))))) - (nreverse vcard-data)))) - -(defun vcard-ref (key vcard-data) - "Return the vcard data associated with KEY in VCARD-DATA. -Key may be a list of nested keys or a single string of colon-separated -keys." - (cond ((listp key) - (vcard-alist-assoc key vcard-data)) - ((and (stringp key) - (save-match-data - (string-match ";" key))) - (vcard-alist-assoc (vcard-split-string key ";") vcard-data)) - ((stringp key) - (cdr (assoc key vcard-data))))) - - -;;; Vcard data filters. - -;; These receive both the key and data, but are expected to operate on (and -;; return) just the data. -;; -;; There is probably no overwhelming need for this, except that some lusers -;; put HTML in their vcards under the misguided notion that it's a standard -;; feature of vcards just because Netscape supports this feature. (Or -;; perhaps those lusers just don't care that their vcards look like shit in -;; every other MUA). -;; -;; On the other hand, perhaps someone will devise some other use for these -;; filters, such as noticing common phone number formats and re-formatting -;; them to fit personal preferences. - -(defun vcard-filter-apply-filter-list (filter-list key data) - (while filter-list - (setq data (funcall (car filter-list) key data)) - (setq filter-list (cdr filter-list))) - data) - -(defun vcard-standard-filter (key data) - (vcard-filter-apply-filter-list vcard-standard-filters key data)) - -(defun vcard-filter-html (key data) - (save-match-data - (while (string-match "<[^<>\n]+>" data) - (setq data (concat (substring data 0 (match-beginning 0)) - (substring data (match-end 0))))) - data)) - - -;;; Utility routines. - -;; This does most of the dirty work of key lookup for vcard-ref. -(defun vcard-alist-assoc (keys alist) - (while (and keys alist) - (setq alist (cdr (assoc (car keys) alist))) - (setq keys (cdr keys))) - alist) - -;; In ALIST, set KEY-LIST's value to VALUE, and return new value of ALIST. -;; KEY-LIST should be a list of nested keys, if ALIST is an alist of alists. -;; If any key is not present in an alist, the key and value pair will be -;; inserted into the parent alist. -(defun vcard-set-alist-slot (alist key-list value) - (let* ((key (car key-list)) - (elt (assoc key alist))) - (setq key-list (cdr key-list)) - (cond ((and (cdr elt) key-list) - (vcard-set-alist-slot (cdr elt) key-list value)) - ((and elt key-list) - (setcdr elt (vcard-set-alist-slot nil key-list value))) - (elt (setcdr elt value)) - (t - (let ((new)) - (setq key-list (nreverse (cons key key-list))) - (while key-list - (if new - (setq new (cons (car key-list) (cons new nil))) - (setq new (cons (car key-list) value))) - (setq key-list (cdr key-list))) - - (cond ((null alist) - (setq alist (cons new nil))) - (t - (setcdr alist (cons (car alist) (cdr alist))) - (setcar alist new)))))) - alist)) - -;; Return substring matched by last search. -;; N specifies which match data pair to use -;; Value is nil if there is no Nth match. -;; If STRING is not specified, the current buffer is used. -(defun vcard-matching-substring (n &optional string) - (if (match-beginning n) - (if string - (substring string (match-beginning n) (match-end n)) - (buffer-substring (match-beginning n) (match-end n))))) - -;; Split STRING at occurences of SEPARATOR. Return a list of substrings. -;; SEPARATOR can be any regexp, but anything matching the separator will -;; never appear in any of the returned substrings. -(defun vcard-split-string (string separator) - (let* ((list nil) - (pos 0)) - (save-match-data - (while (string-match separator string pos) - (setq list (cons (substring string pos (match-beginning 0)) list)) - (setq pos (match-end 0))) - (nreverse (cons (substring string pos) list))))) - -(defun vcard-flatten (l) - (if (consp l) - (apply 'nconc (mapcar 'vcard-flatten l)) - (list l))) - - -;;; Sample formatting routines. - -(defun vcard-format-box (vcard-data) - "Like `vcard-format-string', but put an ascii box around text." - (let* ((lines (vcard-format-lines vcard-data)) - (len (vcard-format-max-length lines)) - (edge (concat "\n+" (make-string (+ len 2) ?-) "+\n")) - (line-fmt (format "| %%-%ds |" len)) - (formatted-lines - (mapconcat (function (lambda (s) (format line-fmt s))) lines "\n"))) - (if (string= formatted-lines "") - formatted-lines - (concat edge formatted-lines edge)))) - -(defun vcard-format-string (vcard-data) - "Format VCARD-DATA into a string suitable for presentation. -VCARD-DATA should be a parsed vcard alist. The result is a string -with formatted vcard information which can be inserted into a mime -presentation buffer." - (mapconcat 'identity (vcard-format-lines vcard-data) "\n")) - -(defun vcard-format-lines (vcard-data) - (let* ((name (vcard-format-get-name vcard-data)) - (title (vcard-format-ref "title" vcard-data)) - (org (vcard-format-ref "org" vcard-data)) - (addr (vcard-format-get-address vcard-data)) - (tel (vcard-format-get-telephone vcard-data)) - (lines (delete nil (vcard-flatten (list name title org addr)))) - (col-template (format "%%-%ds%%s" - (vcard-format-offset lines tel))) - (l lines)) - (while tel - (setcar l (format col-template (car l) (car tel))) - ;; If we stripped away too many nil slots from l, add empty strings - ;; back in so setcar above will work on next iteration. - (and (cdr tel) - (null (cdr l)) - (setcdr l (cons "" nil))) - (setq l (cdr l)) - (setq tel (cdr tel))) - lines)) - - -(defun vcard-format-get-name (vcard-data) - (let ((name (vcard-format-ref "fn" vcard-data)) - (email (or (vcard-format-ref '("email" "internet") vcard-data) - (vcard-format-ref "email" vcard-data)))) - (if email - (format "%s <%s>" name email) - name))) - -(defun vcard-format-get-address (vcard-data) - (let* ((addr-raw (or (vcard-format-ref '("adr" "dom") vcard-data) - (vcard-format-ref "adr" vcard-data))) - (addr (if (consp addr-raw) - addr-raw - (list addr-raw))) - (street (delete "" (list (nth 0 addr) (nth 1 addr) (nth 2 addr)))) - (city-list (delete "" (nthcdr 3 addr))) - (city (cond ((null (car city-list)) nil) - ((cdr city-list) - (format "%s, %s" - (car city-list) - (mapconcat 'identity (cdr city-list) " "))) - (t (car city-list))))) - (delete nil - (if city - (append street (list city)) - street)))) - -(defun vcard-format-get-telephone (vcard-data) - (delete nil - (mapcar (function (lambda (x) - (let ((result (vcard-format-ref (car x) - vcard-data))) - (and result - (concat (cdr x) result))))) - '((("tel" "work") . "Work: ") - (("tel" "home") . "Home: ") - (("tel" "fax") . "Fax: "))))) - -(defun vcard-format-ref (key vcard-data) - (setq key (vcard-ref key vcard-data)) - (or (cdr key) - (setq key (car key))) - (and (stringp key) - (string= key "") - (setq key nil)) - key) - -(defun vcard-format-offset (row1 row2 &optional maxwidth) - (or maxwidth (setq maxwidth (frame-width))) - (let ((max1 (vcard-format-max-length row1)) - (max2 (vcard-format-max-length row2))) - (+ max1 (min 5 (max 1 (- maxwidth (+ max1 max2))))))) - -(defun vcard-format-max-length (strings) - (let ((maxlen 0) - (len 0)) - (while strings - (setq len (length (car strings))) - (setq strings (cdr strings)) - (and (> len maxlen) - (setq maxlen len))) - maxlen)) - -(provide 'vcard) - -;;; vcard.el ends here diff --git a/contrib/xml.el b/contrib/xml.el deleted file mode 100644 index d128b83..0000000 --- a/contrib/xml.el +++ /dev/null @@ -1,518 +0,0 @@ -;;; xml.el --- XML parser - -;; Copyright (C) 2000, 2001 Free Software Foundation, Inc. - -;; Author: Emmanuel Briot -;; Maintainer: Emmanuel Briot -;; Keywords: xml - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; This file contains a full XML parser. It parses a file, and returns a list -;; that can be used internally by any other lisp file. -;; See some example in todo.el - -;;; FILE FORMAT - -;; It does not parse the DTD, if present in the XML file, but knows how to -;; ignore it. The XML file is assumed to be well-formed. In case of error, the -;; parsing stops and the XML file is shown where the parsing stopped. -;; -;; It also knows how to ignore comments, as well as the special ?xml? tag -;; in the XML file. -;; -;; The XML file should have the following format: -;; value -;; value2 -;; value3 -;; -;; Of course, the name of the nodes and attributes can be anything. There can -;; be any number of attributes (or none), as well as any number of children -;; below the nodes. -;; -;; There can be only top level node, but with any number of children below. - -;;; LIST FORMAT - -;; The functions `xml-parse-file' and `xml-parse-tag' return a list with -;; the following format: -;; -;; xml-list ::= (node node ...) -;; node ::= (tag_name attribute-list . child_node_list) -;; child_node_list ::= child_node child_node ... -;; child_node ::= node | string -;; tag_name ::= string -;; attribute_list ::= (("attribute" . "value") ("attribute" . "value") ...) -;; | nil -;; string ::= "..." -;; -;; Some macros are provided to ease the parsing of this list - -;;; Code: - -;;******************************************************************* -;;** -;;** Macros to parse the list -;;** -;;******************************************************************* - -(defmacro xml-node-name (node) - "Return the tag associated with NODE. -The tag is a lower-case symbol." - (list 'car node)) - -(defmacro xml-node-attributes (node) - "Return the list of attributes of NODE. -The list can be nil." - (list 'nth 1 node)) - -(defmacro xml-node-children (node) - "Return the list of children of NODE. -This is a list of nodes, and it can be nil." - (list 'cddr node)) - -(defun xml-get-children (node child-name) - "Return the children of NODE whose tag is CHILD-NAME. -CHILD-NAME should be a lower case symbol." - (let ((children (xml-node-children node)) - match) - (while children - (if (car children) - (if (equal (xml-node-name (car children)) child-name) - (set 'match (append match (list (car children)))))) - (set 'children (cdr children))) - match)) - -(defun xml-get-attribute (node attribute) - "Get from NODE the value of ATTRIBUTE. -An empty string is returned if the attribute was not found." - (if (xml-node-attributes node) - (let ((value (assoc attribute (xml-node-attributes node)))) - (if value - (cdr value) - "")) - "")) - -;;******************************************************************* -;;** -;;** Creating the list -;;** -;;******************************************************************* - -(defun xml-parse-file (file &optional parse-dtd) - "Parse the well-formed XML FILE. -If FILE is already edited, this will keep the buffer alive. -Returns the top node with all its children. -If PARSE-DTD is non-nil, the DTD is parsed rather than skipped." - (let ((keep)) - (if (get-file-buffer file) - (progn - (set-buffer (get-file-buffer file)) - (setq keep (point))) - (find-file file)) - - (let ((xml (xml-parse-region (point-min) - (point-max) - (current-buffer) - parse-dtd))) - (if keep - (goto-char keep) - (kill-buffer (current-buffer))) - xml))) - -(defun xml-parse-region (beg end &optional buffer parse-dtd) - "Parse the region from BEG to END in BUFFER. -If BUFFER is nil, it defaults to the current buffer. -Returns the XML list for the region, or raises an error if the region -is not a well-formed XML file. -If PARSE-DTD is non-nil, the DTD is parsed rather than skipped, -and returned as the first element of the list" - (let (xml result dtd) - (save-excursion - (if buffer - (set-buffer buffer)) - (goto-char beg) - (while (< (point) end) - (if (search-forward "<" end t) - (progn - (forward-char -1) - (if (null xml) - (progn - (set 'result (xml-parse-tag end parse-dtd)) - (cond - ((listp (car result)) - (set 'dtd (car result)) - (add-to-list 'xml (cdr result))) - (t - (add-to-list 'xml result)))) - - ;; translation of rule [1] of XML specifications - (error "XML files can have only one toplevel tag."))) - (goto-char end))) - (if parse-dtd - (cons dtd (reverse xml)) - (reverse xml))))) - - -(defun xml-parse-tag (end &optional parse-dtd) - "Parse the tag that is just in front of point. -The end tag must be found before the position END in the current buffer. -If PARSE-DTD is non-nil, the DTD of the document, if any, is parsed and -returned as the first element in the list. -Returns one of: - - a list : the matching node - - nil : the point is not looking at a tag. - - a cons cell: the first element is the DTD, the second is the node" - (cond - ;; Processing instructions (like the tag at the - ;; beginning of a document) - ((looking-at "<\\?") - (search-forward "?>" end) - (skip-chars-forward " \t\n") - (xml-parse-tag end)) - ;; Character data (CDATA) sections, in which no tag should be interpreted - ((looking-at "" end t) - (error "CDATA section does not end anywhere in the document")) - (buffer-substring-no-properties pos (match-beginning 0)))) - ;; DTD for the document - ((looking-at "" end) - (skip-chars-forward " \t\n") - (xml-parse-tag end)) - ;; end tag - ((looking-at " \t\n]+\\)") - (let* ((node-name (match-string 1)) - (children (list (intern node-name))) - (case-fold-search nil) ;; XML is case-sensitive - pos) - (goto-char (match-end 1)) - - ;; parses the attribute list - (set 'children (append children (list (xml-parse-attlist end)))) - - ;; is this an empty element ? - (if (looking-at "/>") - (progn - (forward-char 2) - (skip-chars-forward " \t\n") - (append children '(""))) - - ;; is this a valid start tag ? - (if (= (char-after) ?>) - (progn - (forward-char 1) - (skip-chars-forward " \t\n") - ;; Now check that we have the right end-tag. Note that this one might - ;; contain spaces after the tag name - (while (not (looking-at (concat ""))) - (cond - ((looking-at " (point) end) - (error "XML: End tag for %s not found before end of region." - node-name)) - children - ) - - ;; This was an invalid start tag - (error "XML: Invalid attribute list") - )))) - (t ;; This is not a tag. - (error "XML: Invalid character.")) - )) - -(defun xml-parse-attlist (end) - "Return the attribute-list that point is looking at. -The search for attributes end at the position END in the current buffer. -Leaves the point on the first non-blank character after the tag." - (let ((attlist '()) - name) - (skip-chars-forward " \t\n") - (while (looking-at "\\([a-zA-Z_:][-a-zA-Z0-9._:]*\\)[ \t\n]*=[ \t\n]*") - (set 'name (intern (match-string 1))) - (goto-char (match-end 0)) - - ;; Do we have a string between quotes (or double-quotes), - ;; or a simple word ? - (unless (looking-at "\"\\([^\"]+\\)\"") - (unless (looking-at "'\\([^\"]+\\)'") - (error "XML: Attribute values must be given between quotes."))) - - ;; Each attribute must be unique within a given element - (if (assoc name attlist) - (error "XML: each attribute must be unique within an element.")) - - (set 'attlist (append attlist - (list (cons name (match-string-no-properties 1))))) - (goto-char (match-end 0)) - (skip-chars-forward " \t\n") - (if (> (point) end) - (error "XML: end of attribute list not found before end of region.")) - ) - attlist - )) - -;;******************************************************************* -;;** -;;** The DTD (document type declaration) -;;** The following functions know how to skip or parse the DTD of -;;** a document -;;** -;;******************************************************************* - -(defun xml-skip-dtd (end) - "Skip the DTD that point is looking at. -The DTD must end before the position END in the current buffer. -The point must be just before the starting tag of the DTD. -This follows the rule [28] in the XML specifications." - (forward-char (length "") - (error "XML: invalid DTD (excepting name of the document)")) - (condition-case nil - (progn - (forward-word 1) ;; name of the document - (skip-chars-forward " \t\n") - (if (looking-at "\\[") - (re-search-forward "\\][ \t\n]*>" end) - (search-forward ">" end))) - (error (error "XML: No end to the DTD")))) - -(defun xml-parse-dtd (end) - "Parse the DTD that point is looking at. -The DTD must end before the position END in the current buffer." - (let (dtd type element end-pos) - (forward-char (length "") - (error "XML: invalid DTD (excepting name of the document)")) - - ;; Get the name of the document - (looking-at "\\sw+") - (set 'dtd (list 'dtd (match-string-no-properties 0))) - (goto-char (match-end 0)) - - (skip-chars-forward " \t\n") - - ;; External DTDs => don't know how to handle them yet - (if (looking-at "SYSTEM") - (error "XML: Don't know how to handle external DTDs.")) - - (if (not (= (char-after) ?\[)) - (error "XML: Unknown declaration in the DTD.")) - - ;; Parse the rest of the DTD - (forward-char 1) - (while (and (not (looking-at "[ \t\n]*\\]")) - (<= (point) end)) - (cond - - ;; Translation of rule [45] of XML specifications - ((looking-at - "[\t \n]*]+\\)>") - - (setq element (intern (match-string-no-properties 1)) - type (match-string-no-properties 2)) - (set 'end-pos (match-end 0)) - - ;; Translation of rule [46] of XML specifications - (cond - ((string-match "^EMPTY[ \t\n]*$" type) ;; empty declaration - (set 'type 'empty)) - ((string-match "^ANY[ \t\n]*$" type) ;; any type of contents - (set 'type 'any)) - ((string-match "^(\\(.*\\))[ \t\n]*$" type) ;; children ([47]) - (set 'type (xml-parse-elem-type (match-string-no-properties 1 type)))) - ((string-match "^%[^;]+;[ \t\n]*$" type) ;; substitution - nil) - (t - (error "XML: Invalid element type in the DTD"))) - - ;; rule [45]: the element declaration must be unique - (if (assoc element dtd) - (error "XML: elements declaration must be unique in a DTD (<%s>)." - (symbol-name element))) - - ;; Store the element in the DTD - (set 'dtd (append dtd (list (list element type)))) - (goto-char end-pos) - ) - - - (t - (error "XML: Invalid DTD item")) - ) - ) - - ;; Skip the end of the DTD - (search-forward ">" end) - dtd - )) - - -(defun xml-parse-elem-type (string) - "Convert a STRING for an element type into an elisp structure." - - (let (elem modifier) - (if (string-match "(\\([^)]+\\))\\([+*?]?\\)" string) - (progn - (setq elem (match-string 1 string) - modifier (match-string 2 string)) - (if (string-match "|" elem) - (set 'elem (append '(choice) - (mapcar 'xml-parse-elem-type - (split-string elem "|")))) - (if (string-match "," elem) - (set 'elem (append '(seq) - (mapcar 'xml-parse-elem-type - (split-string elem ",")))) - ))) - (if (string-match "[ \t\n]*\\([^+*?]+\\)\\([+*?]?\\)" string) - (setq elem (match-string 1 string) - modifier (match-string 2 string)))) - - (if (and (stringp elem) - (string= elem "#PCDATA")) - (set 'elem 'pcdata)) - - (cond - ((string= modifier "+") - (list '+ elem)) - ((string= modifier "*") - (list '* elem)) - ((string= modifier "?") - (list '? elem)) - (t - elem)))) - - -;;******************************************************************* -;;** -;;** Substituting special XML sequences -;;** -;;******************************************************************* - -(defun xml-substitute-special (string) - "Return STRING, after subsituting special XML sequences." - (while (string-match "&" string) - (set 'string (replace-match "&" t nil string))) - (while (string-match "<" string) - (set 'string (replace-match "<" t nil string))) - (while (string-match ">" string) - (set 'string (replace-match ">" t nil string))) - (while (string-match "'" string) - (set 'string (replace-match "'" t nil string))) - (while (string-match """ string) - (set 'string (replace-match "\"" t nil string))) - string) - -;;******************************************************************* -;;** -;;** Printing a tree. -;;** This function is intended mainly for debugging purposes. -;;** -;;******************************************************************* - -(defun xml-debug-print (xml) - (while xml - (xml-debug-print-internal (car xml) "") - (set 'xml (cdr xml))) - ) - -(defun xml-debug-print-internal (xml &optional indent-string) - "Outputs the XML tree in the current buffer. -The first line indented with INDENT-STRING." - (let ((tree xml) - attlist) - (unless indent-string - (set 'indent-string "")) - - (insert indent-string "<" (symbol-name (xml-node-name tree))) - - ;; output the attribute list - (set 'attlist (xml-node-attributes tree)) - (while attlist - (insert " ") - (insert (symbol-name (caar attlist)) "=\"" (cdar attlist) "\"") - (set 'attlist (cdr attlist))) - - (insert ">") - - (set 'tree (xml-node-children tree)) - - ;; output the children - (while tree - (cond - ((listp (car tree)) - (insert "\n") - (xml-debug-print-internal (car tree) (concat indent-string " ")) - ) - ((stringp (car tree)) - (insert (car tree)) - ) - (t - (error "Invalid XML tree"))) - (set 'tree (cdr tree)) - ) - - (insert "\n" indent-string - "") - )) - -(provide 'xml) - -;;; xml.el ends here diff --git a/etc/Makefile.in b/etc/Makefile.in deleted file mode 100644 index f81c462..0000000 --- a/etc/Makefile.in +++ /dev/null @@ -1,47 +0,0 @@ -datadir = @datadir@ -infodir = @infodir@ -prefix = @prefix@ -srcdir = @srcdir@ -subdir = etc -top_srcdir = @top_srcdir@ -lispdir = @lispdir@ -etcdir = @etcdir@ - -VPATH=$(srcdir) -EMACS=@EMACS@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -SHELL = /bin/sh - -all: - -install: - $(SHELL) $(top_srcdir)/mkinstalldirs $(etcdir) - cd $(srcdir) \ - && for p in gnus-tut.txt; do \ - echo " $(INSTALL_DATA) $$p $(etcdir)/$$p"; \ - $(INSTALL_DATA) $$p $(etcdir)/$$p; \ - done - $(SHELL) $(top_srcdir)/mkinstalldirs $(etcdir)/gnus - cd $(srcdir) \ - && for p in gnus/*.xpm gnus/*.pbm gnus/*.xbm gnus/x-splash; do \ - echo " $(INSTALL_DATA) $$p $(etcdir)/$$p"; \ - $(INSTALL_DATA) $$p $(etcdir)/$$p; \ - done - $(SHELL) $(top_srcdir)/mkinstalldirs $(etcdir)/smilies - cd $(srcdir) \ - && for p in smilies/*.pbm; do \ - echo " $(INSTALL_DATA) $$p $(etcdir)/$$p"; \ - $(INSTALL_DATA) $$p $(etcdir)/$$p; \ - done - -Makefile: $(srcdir)/Makefile.in ../config.status - cd .. \ - && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status - -distclean: - rm -f *~ Makefile - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/etc/gnus-tut.txt b/etc/gnus-tut.txt deleted file mode 100644 index 94e9500..0000000 --- a/etc/gnus-tut.txt +++ /dev/null @@ -1,294 +0,0 @@ -From lars Thu Feb 23 23:20:38 1995 -From: larsi@ifi.uio.no (ding) -Date: Fri Feb 24 13:40:45 1995 -Subject: So you want to use the new Gnus -Message-ID: - -Actually, since you are reading this, chances are you are already -using the new Gnus. Congratulations. - -This entire newsgroup you are reading is, in fact, no real newsgroup -at all, in the traditional sense. It is an example of one of the -"foreign" select methods that Gnus may use. - -The text you are now reading is stored in the "etc" directory with the -rest of the Emacs sources. You are using the "nndoc" backend for -accessing it. Scary, isn't it? - -This isn't the real documentation. `M-x info', `m gnus ' to read -that. This "newsgroup" is intended as a kinder, gentler way of getting -people started. - -Gnus is a rewrite of GNUS 4.1, written by Masanobu Umeda. The rewrite -was done by moi, yours truly, your humble servant, Lars Magne -Ingebrigtsen. If you have a WWW browser, you can investigate to your -heart's delight at . - -;; Copyright (C) 1995 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -From lars Thu Feb 23 23:20:38 1995 -From: larsi@ifi.uio.no (ding) -Date: Fri Feb 24 13:40:45 1995 -Subject: Starting up -Message-ID: - -If you are having problems with Gnus not finding your server, you have -to set `gnus-select-method'. A "method" is a way of specifying *how* -the news is to be found, and from *where*. - -Say you want to read news from you local, friendly nntp server -"news.my.local.server". - -(setq gnus-select-method '(nntp "news.my.local.server")) - -Quite easy, huh? - -From the news spool: - -(setq gnus-select-method '(nnspool "")) - -From your mh-e spool: - -(setq gnus-select-method '(nnmh "")) - -There's a whole bunch of other methods for reading mail and news, see -the "Foreign groups" article for that. - - -From lars Thu Feb 23 23:20:38 1995 -From: larsi@ifi.uio.no (ding) -Date: Fri Feb 24 13:40:45 1995 -Subject: Where are all the groups, then? -Message-ID: - -If this is the first time you have used a newsreader, you won't have a -.newsrc file. This means that Gnus will think that all the newsgroups -on the server are "new", and kill them all. - -If you have a .newsrc file, the new groups will be processed with the -function in the `gnus-subscribe-newsgroup-method' variable, which is -`gnus-subscribe-zombies' by default. - -This means that all the groups have been made into "zombies" - not -quite dead, but not exactly alive, either. - -Jump back to the *Group* buffer, and type `A z' to list all the zombie -groups. Look though the list, and subscribe to the groups you want to -read by pressing `u' on the one you think look interesting. - -If all the groups have been killed, type `A k' to list all the killed -groups. Subscribe to them the same way. - -When you are satisfied, press `S z' to kill all the zombie groups. - -Now you should have a nice list of all groups you are interested in. - -(If you later want to subscribe to more groups, press `A k' to -list all the kill groups, and repeat. You can also type `U' and be -prompted for groups to subscribe to.) - - -From lars Thu Feb 23 23:20:38 1995 -From: larsi@ifi.uio.no (ding) -Date: Fri Feb 24 13:40:45 1995 -Subject: I want to read my mail! -Message-ID: - -Yes, Virginia, you can read mail with Gnus. - -First you have to decide which mail backend you want to use. You have -nnml, which is a one-file-one-mail backend, which is quite nice, but -apt to make your systems administrator go crazy and come after you -with a shotgun. - -nnmbox uses a Unix mail box to store mail. Nice, but slow. - -nnmh uses mh-e folders, which is also a one-file-one-mail thingie, but -slower than nnml. (It doesn't support NOV files.) - -So if you want to go with nnmbox, you can simply say: - -(setq gnus-secondary-select-methods '((nnmbox ""))) - -(The same for the other methods, kind of.) - -You should also set `nnmail-split-methods' to something sensible: - -(setq nnmail-split-methods - '(("mail.junk" "From:.*Lars") - ("mail.misc ""))) - -This will put all mail from me in you junk mail group, and the rest in -"mail.misc". - -These groups will be subscribe the same way as the normal groups, so -you will probably find them among the zombie groups after you set -these variables and re-start Gnus. - - -From lars Thu Feb 23 23:20:38 1995 -From: larsi@ifi.uio.no (ding) -Date: Fri Feb 24 13:40:45 1995 -Subject: Foreign newsgroups -Message-ID: - -These are groups that do not come from `gnus-select-method'. - -Say you want to read "alt.furniture.couches" from "news.funet.fi". You -can then either type `B news.funet.fi ' to browse that server and -subscribe to that group, or you can type -`G m alt.furniture.couchesnntpnews.funet.fi', if you -like to type a lot. - -If you want to read a directory as a newsgroup, you can create an -nndir group, much the same way. There's a shorthand for that, -though. If, for instance, you want to read the (ding) list archives, -you could type `G d /ftp '. - -There's lots more to know about foreign groups, but you have to read -the info pages to find out more. - - -From lars Thu Feb 23 23:20:38 1995 -From: larsi@ifi.uio.no (ding) -Date: Fri Feb 24 13:40:45 1995 -Subject: Low level changes in GNUS, or, Wrong type argument: stringp, nil -Message-ID: - -Gnus really isn't GNUS, even though it looks like it. If you scrape -the surface, you'll find that most things have changed. - -This means that old code that relies on GNUS internals will fail. - -In particular, `gnus-newsrc-hashtb', `gnus-newsrc-assoc', -`gnus-killed-list', the `nntp-header-' macros and the display formats -have all changed. If you have some code lying around that depend on -these, or change these, you'll have to re-write your code. - -Old hilit19 code does not work at all. In fact, you should probably -remove all hilit code from all the Gnus hooks -(`gnus-group-prepare-hook', `gnus-summary-prepare-hook' and -`gnus-summary-article-hook'). (Well, at the very least the first -two.) Gnus provides various integrated functions for highlighting, -which are both faster and more accurated. - -There is absolutely no chance, whatsoever, of getting Gnus to work -with Emacs 18. It won't even work on Emacsen older than Emacs -19.30/XEmacs 19.13. Upgrade your Emacs or die. - - -From lars Thu Feb 23 23:20:38 1995 -From: larsi@ifi.uio.no (ding) -Date: Fri Feb 24 13:40:45 1995 -Subject: How do I re-scan my mail groups? -Message-ID: - -Reading the active file from the nntp server is a drag. - -Just press `M-g' on the mail groups, and they will be re-scanned. - -You can also re-scan all the mail groups by putting them on level 1 -(`S l 1'), and saying `1 g' to re-scan all level 1 groups. - - -From lars Thu Feb 23 23:20:38 1995 -From: larsi@ifi.uio.no (ding) -Date: Fri Feb 24 13:40:45 1995 -Subject: How do I set up virtual newsgroups? -Message-ID: - -Virtual newsgroups are collections of other newsgroups. Why people -want this is beyond me, but here goes: - -Create the group by saying - -`M-a my.virtual.newsgroupnnvirtual^rec\.aquaria\.*' - -This will create the group "nnvirtual:my.virtual.newsgroup", which -will collect all articles from all the groups in the "rec.aquaria" -hierarchy. - -If you want to edit the regular expression, just type `M-e' on the -group line. - -Note that all the groups that are part of the virtual group have to be -alive. This means that the cannot, absolutely not, be zombie or -killed. They can be unsubscribed; that's no problem. - -You can combine groups from different servers in the same virtual -newsgroup, something that may actually be useful. Say you have the -group "comp.headers" on the server "news.server.no" and the same group -on "news.server.edu". If people have posted articles with Distribution -headers that stop propagation of their articles, combining these two -newsgroups into one virtual newsgroup should give you a better view of -what's going on. - -One caveat, though: The virtual group article numbers from the first -source group (group A) will always be lower than the article numbers -from the second (group B). This means that Gnus will believe that -articles from group A are older than articles from group B. Threading -will lessen these problems, but it might be a good idea to sort the -threads over the date of the articles to get a correct feel for the -flow of the groups: - -(setq gnus-thread-sort-functions '(gnus-thread-sort-by-date)) - -If you only want this in virtual groups, you could say something along -the lines of: - -(setq gnus-select-group-hook - (lambda () - (if (eq 'nnvirtual (car (gnus-find-method-for-group - gnus-newsgroup-name))) - (progn - (make-local-variable 'gnus-thread-sort-functions) - (setq gnus-thread-sort-functions '(gnus-thread-sort-by-date)))))) - - -From lars Thu Feb 23 23:20:38 1995 -From: larsi@ifi.uio.no (ding) -Date: Fri Feb 24 13:40:45 1995 -Subject: Bugs & stuff -Message-ID: - -If you want to report a bug, please type `M-x gnus-bug'. This will -give me a precise overview of your Gnus and Emacs version numbers, -along with a look at all Gnus variables you have changed. - -Du not expect a reply back, but your bug should be fixed in the next -version. If the bug persists, please re-submit your bug report. - -When a bug occurs, I need a recipe for how to trigger the bug. You -have to tell me exactly what you do to uncover the bug, and you should -(setq debug-on-error t) and send me the backtrace along with the bug -report. - -If I am not able to reproduce the bug, I won't be able to fix it. - -I would, of course, prefer that you locate the bug, fix it, and mail -me the patches, but one can't have everything. - -If you have any questions on usage, the "ding@ifi.uio.no" mailing list -is where to post the questions. - - diff --git a/etc/gnus/bar.xbm b/etc/gnus/bar.xbm deleted file mode 100644 index e61300a..0000000 --- a/etc/gnus/bar.xbm +++ /dev/null @@ -1,7 +0,0 @@ -#define noname_width 6 -#define noname_height 48 -static char noname_bits[] = { - 0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, - 0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, - 0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, - 0x0c,0x0c,0x0c}; diff --git a/etc/gnus/bar.xpm b/etc/gnus/bar.xpm deleted file mode 100644 index 2985065..0000000 --- a/etc/gnus/bar.xpm +++ /dev/null @@ -1,54 +0,0 @@ -/* XPM */ -static char * picon-bar_xpm[] = { -"6 48 2 1", -" c white s background", -". c black", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. "}; diff --git a/etc/gnus/catchup.pbm b/etc/gnus/catchup.pbm deleted file mode 100644 index 3fc571b..0000000 Binary files a/etc/gnus/catchup.pbm and /dev/null differ diff --git a/etc/gnus/catchup.xpm b/etc/gnus/catchup.xpm deleted file mode 100644 index 832c4eb..0000000 --- a/etc/gnus/catchup.xpm +++ /dev/null @@ -1,73 +0,0 @@ -/* XPM */ -static char *magick[] = { -/* columns rows colors chars-per-pixel */ -"24 24 43 1", -" c Gray0", -". c #099909990999", -"X c Gray6", -"o c #133313331333", -"O c Gray9", -"+ c Gray11", -"@ c Gray12", -"# c #23f323f323f3", -"$ c Gray15", -"% c #2ff12ff12ff1", -"& c #3fff3fff3fff", -"* c Gray25", -"= c #4ccc4ccc4ccc", -"- c #519151915191", -"; c #53ed53ed53ed", -": c #565b565b565b", -"> c Gray35", -", c #5b1a5b1a5b1a", -"< c #5fe95fe95fe9", -"1 c #626262626262", -"2 c Gray40", -"3 c #67e767e767e7", -"4 c Gray42", -"5 c #6fff6fff6fff", -"6 c Gray45", -"7 c Gray46", -"8 c #77e977e977e9", -"9 c #7bdb7bdb7bdb", -"0 c #7ccc7ccc7ccc", -"q c Gray50", -"w c #866586658665", -"e c Gray56", -"r c Gray60", -"t c #9bcb9bcb9bcb", -"y c #9fff9fff9fff", -"u c #a7c7a7c7a7c7", -"i c #af0eaf0eaf0e", -"p c Gray70", -"a c Gray75", -"s c Gray81", -"d c #dfffdfffdfff", -"f c #efffefffefff", -"g c Gray100", -/* pixels */ -"aaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaa7$$*uaaaaaaaaareep", -"aaaaaa$rr6", -"aaaaaa76;aaaareeeee#rw*", -"&aqqagga@<<<7e7qqqqqq=:u", -"33e4qgggsaa%1Oa&&&gggeae7ggyar=aa=r6 er=aa=r6 aggg=wr&g&rrr", -"rrrrr$a<:6 @$$$rri=d5qrr", -"rrrrr<===6$wrrrrrr6&qo6r", -"rrrrrrrrrewrrrrrrr6 oq", -"rrrrrrrrrrrrrrrrrrrrrrrr", -"rrrrrrrrrrrrrrrrrrrrrrrr", -"rrrrrrrrrrrrrrrrrrrrrrrr" -}; diff --git a/etc/gnus/cu-exit.pbm b/etc/gnus/cu-exit.pbm deleted file mode 100644 index 210869c..0000000 Binary files a/etc/gnus/cu-exit.pbm and /dev/null differ diff --git a/etc/gnus/cu-exit.xpm b/etc/gnus/cu-exit.xpm deleted file mode 100644 index bc051f8..0000000 --- a/etc/gnus/cu-exit.xpm +++ /dev/null @@ -1,64 +0,0 @@ -/* XPM */ -static char *magick[] = { -/* columns rows colors chars-per-pixel */ -"24 24 34 1", -" c Gray0", -". c #0bfb0bfb0bfb", -"X c Gray6", -"o c Gray9", -"O c Gray11", -"+ c Gray12", -"@ c #23f323f323f3", -"# c Gray15", -"$ c #2ff52ff52ff5", -"% c #3fff3fff3fff", -"& c Gray25", -"* c Gray28", -"= c #4ccc4ccc4ccc", -"- c #53e853e853e8", -"; c #5b1a5b1a5b1a", -": c #5fef5fef5fef", -"> c #67e767e767e7", -", c Gray42", -"< c #6ff76ff76ff7", -"1 c #77dc77dc77dc", -"2 c Gray50", -"3 c #866586658665", -"4 c #88a888a888a8", -"5 c Gray56", -"6 c Gray60", -"7 c #9bcb9bcb9bcb", -"8 c #9fff9fff9fff", -"9 c #a7d7a7d7a7d7", -"0 c Gray70", -"q c #b635b635b635", -"w c Gray75", -"e c Gray78", -"r c #dfffdfffdfff", -"t c Gray100", -/* pixels */ -"wwwwwwwwwwwwwwwwwwwwwwww", -"wwwwwwwwwwwwwwwwwwwwwwww", -"wwwwwwwwwwwwwwwwwwwwwwww", -"wwwwwwwwwwwwwwwwwwwwwwww", -"wwwwwwwwwwwwwwwwwwwwwwww", -"wwwwwwwwwww-$$$-wwwwwwww", -"wwwwwww9-$w$ttt$wwwwwwww", -"wwwwww:wwwwww", -"wwwwww,::X%%%+$w:5wwwwww", -"qqqqqq4*5%t%t255;qqqqqqq", -"6666663#*+2+2%**=6666666", -"6666666=0$w$0*0&36666666", -"6666666=,$9@5*,#66666666", -"6666666= +% 2% #66666666", -"6666666= %e@<2 #66666666", -"6666666:# +666666666", -"666666666=====3666666666", -"666666666666666666666666" -}; diff --git a/etc/gnus/describe-group.pbm b/etc/gnus/describe-group.pbm deleted file mode 100644 index de7bf11..0000000 Binary files a/etc/gnus/describe-group.pbm and /dev/null differ diff --git a/etc/gnus/describe-group.xpm b/etc/gnus/describe-group.xpm deleted file mode 100644 index e191277..0000000 --- a/etc/gnus/describe-group.xpm +++ /dev/null @@ -1,72 +0,0 @@ -/* XPM */ -static char *magick[] = { -/* columns rows colors chars-per-pixel */ -"24 24 42 1", -" c Gray0", -". c #099909990999", -"X c #0bfb0bfb0bfb", -"o c #133313331333", -"O c Gray9", -"+ c Gray11", -"@ c #23f323f323f3", -"# c Gray15", -"$ c #2d8d2d8d2d8d", -"% c #399939993999", -"& c #433243324332", -"* c #4ccc4ccc4ccc", -"= c #519151915191", -"- c #53e353e353e3", -"; c #565656565656", -": c Gray36", -"> c #5fdf5fdf5fdf", -", c Gray42", -"< c #6fff6fff6fff", -"1 c Gray45", -"2 c #77f777f777f7", -"3 c #7ccc7ccc7ccc", -"4 c Gray50", -"5 c #865a865a865a", -"6 c Gray58", -"7 c Gray60", -"8 c #9bfb9bfb9bfb", -"9 c Gray62", -"0 c #9fff9fff9fff", -"q c #a0c0a0c0a0c0", -"w c Gray64", -"e c Gray65", -"r c Gray70", -"t c #b635b635b635", -"y c Gray73", -"u c Gray75", -"i c #d332d332d332", -"p c Gray85", -"a c #e665e665e665", -"s c #eccbeccbeccb", -"d c #f998f998f998", -"f c Gray100", -/* pixels */ -"&77&77&77&77&77&77&77&77", -"777777777777777777777777", -"77777777777777777iaaa777", -"&77&77&77&77&77 c #5ff55ff55ff5", -", c #626262626262", -"< c Gray40", -"1 c #67e767e767e7", -"2 c Gray42", -"3 c #6ff96ff96ff9", -"4 c Gray45", -"5 c #77d777d777d7", -"6 c #7ccc7ccc7ccc", -"7 c Gray50", -"8 c Gray56", -"9 c #97f797f797f7", -"0 c Gray60", -"q c #9bd19bd19bd1", -"w c #9ff29ff29ff2", -"e c #a7cba7cba7cb", -"r c Gray67", -"t c #afd5afd5afd5", -"y c Gray70", -"u c Gray75", -"i c #c3c3c3c3c3c3", -"p c Gray78", -"a c #cbcbcbcbcbcb", -"s c Gray81", -"d c #d7d8d7d8d7d8", -"f c #dff2dff2dff2", -"g c Gray89", -"h c #e7e7e7e7e7e7", -"j c #eff8eff8eff8", -"k c Gray100", -/* pixels */ -"kkkkkkkkkufkkkku7skkkkkk", -"kkkkkkkkw>%fkkw 7kkkkkkk", -"kk3%wkkksu ukk%u7skkkkkk", -"kww>>@@uu3f@8 @@7.@Owskk", -"kkwf777%>77O> >>%7777wkk", -"kkkkkss7j8O.@ 8jujsfjkkk", -"kkkjuuwO @> @>@@ujkkkkkk", -"kkk>%O77O$ > %f >kkkkkk", -"kkk87sj7<=u>@7s8>@%wkkkk", -"kkkkkkq==u>>u ukk3u7kkkk", -"7uwfuw+=>u u> >fuw7uwwuf", -"8twut#>:8q q8* uprwswwtu", -"ipuge&,5uq5uau-@uuuuuadu", -"psuu>4@uuuuuduu5uuduuuuu", -"uugu>4@uuguuuuuuuuauuuuu", -"uuuy:>-uuuuuuugguaaugguu", -"psu8=+uuuuspuuuuudduuuuu", -"ipu8=+uuujfhguuuuuudauuu", -"ue82=+8euuuuishspujdgguu", -"e@$$+X=;>uu5ttp9sduuuuuu", -"&4$8$ 7=4@@5y>qejdjduuuu", -";$4O4444444O@eye5@uuusfd", -">>>>3<>@*<3>@wp9f7uuufsd", -"uuujfhgedhfjqpswsiuuuuuu" -}; diff --git a/etc/gnus/exit-summ.pbm b/etc/gnus/exit-summ.pbm deleted file mode 100644 index d019231..0000000 Binary files a/etc/gnus/exit-summ.pbm and /dev/null differ diff --git a/etc/gnus/exit-summ.xpm b/etc/gnus/exit-summ.xpm deleted file mode 100644 index 00caf53..0000000 --- a/etc/gnus/exit-summ.xpm +++ /dev/null @@ -1,45 +0,0 @@ -/* XPM */ -static char *magick[] = { -/* columns rows colors chars-per-pixel */ -"24 24 15 1", -" c Gray0", -". c #0bfb0bfb0bfb", -"X c Gray9", -"o c #23f323f323f3", -"O c #2fef2fef2fef", -"+ c Gray28", -"@ c #53e353e353e3", -"# c #5fdf5fdf5fdf", -"$ c Gray42", -"% c #77d777d777d7", -"& c Gray56", -"* c #9bcb9bcb9bcb", -"= c #a7c7a7c7a7c7", -"- c Gray70", -"; c Gray75", -/* pixels */ -"@;;@;;@;;@;;@;;@;;@;;@;;", -";;;;;;;;;;;;;;;;;;;;;;;;", -";;;;;;;;;;;;;;;;;;;;;;;;", -"@;;@;;&=@OOOo O;;@;;", -";;;;;;X&;;;;=## O;;;;;", -";;;;;;.%;;;;;;; O;;;;;", -"@;;@;;@;;@;;*;; O;;@;;", -";;;;;;;;;;;;%;; O;;;;;", -";;;;;;O%;;;;;;; O;;;;;", -"@;;@;;o=;@;;-&- O;;@;;", -";;;;;;X&;;;;+ & O;;;;;", -";;;;;;.%;;;;$ & O;;;;;", -"@;;@;;o=;@;;;;; O;;@;;", -";;;;;;X&;;;;;;; O;;;;;", -";;;;;;*;;;;;@;; O;;;;;", -"@;;@;;&=;@;;;;; O;;@;;", -";;;;;; #;;;;;&#XO+O;;;;;", -";;;;;;o=;*OO*#o%#+*;;;;;", -"@;;@;@;%OOOO@%*@%*@;;@;;", -";;;;;;;;;;;;;;;;;;;;;;;;", -";;;;;;;;;;;;;;;;;;;;;;;;", -"@;;@;;@;;@;;@;;@;;@;;@;;", -";;;;;;;;;;;;;;;;;;;;;;;;", -";;;;;;;;;;;;;;;;;;;;;;;;" -}; diff --git a/etc/gnus/followup.pbm b/etc/gnus/followup.pbm deleted file mode 100644 index 61be114..0000000 Binary files a/etc/gnus/followup.pbm and /dev/null differ diff --git a/etc/gnus/followup.xpm b/etc/gnus/followup.xpm deleted file mode 100644 index c7cd85a..0000000 --- a/etc/gnus/followup.xpm +++ /dev/null @@ -1,54 +0,0 @@ -/* XPM */ -static char *magick[] = { -/* columns rows colors chars-per-pixel */ -"24 24 24 1", -" c Gray0", -". c Gray6", -"X c Gray9", -"o c Gray12", -"O c #2ff22ff22ff2", -"+ c #3fff3fff3fff", -"@ c Gray28", -"# c #53ed53ed53ed", -"$ c #5fee5fee5fee", -"% c #67e767e767e7", -"& c #6fff6fff6fff", -"* c #77f077f077f0", -"= c #7bdb7bdb7bdb", -"- c Gray50", -"; c Gray56", -": c #9bd79bd79bd7", -"> c #9fff9fff9fff", -", c #a7c7a7c7a7c7", -"< c Gray70", -"1 c Gray75", -"2 c Gray81", -"3 c #dfffdfffdfff", -"4 c #efffefffefff", -"5 c Gray100", -/* pixels */ -"<,1<,1<,1<,1<,1<,1<,1<,1", -",;1,;1,;1,;1,;1,;1,;1,;1", -"111111111111111111111111", -"<,1<,1<,1<,:=+.<,1<,1<,1", -",;1,;1,;1;O*>5+$;1,;1,;1", -"11111111##142+>O11111111", -"<,1<,:=+2555 o2#,1<,1<,1", -",;1;O*>5555>-151$1,;1,;1", -"111<@15555525554*:111111", -"<,1<$:5555555555>=<,1<,1", -",;1,;*>553--55555+,;1,;1", -"111111=>&$1O555552#11111", -"<,111:=+241$+55555#,1<,1", -",;1,$*>55$ 1+555551$1,;1", -"11##14555 $4>>55554*:111", -"<@155555&5551-55555>=<,1", -",O15555555553-355551o,;1", -"1,#55555555553$555+%;111", -"<,#25555555555&1*O<,1<,1", -",;1+55555555555X;1,;1,;1", -"111=>5555555555:*1111111", -"<,1:*45555555552%<<,1<,1", -",;11$15555555555-;,;1,;1", -"1111,#55555555553#111111" -}; diff --git a/etc/gnus/fuwo.pbm b/etc/gnus/fuwo.pbm deleted file mode 100644 index b81af10..0000000 Binary files a/etc/gnus/fuwo.pbm and /dev/null differ diff --git a/etc/gnus/fuwo.xpm b/etc/gnus/fuwo.xpm deleted file mode 100644 index e860d95..0000000 --- a/etc/gnus/fuwo.xpm +++ /dev/null @@ -1,53 +0,0 @@ -/* XPM */ -static char *magick[] = { -/* columns rows colors chars-per-pixel */ -"24 24 23 1", -" c Gray0", -". c Gray6", -"X c Gray9", -"o c Gray12", -"O c #2fef2fef2fef", -"+ c #3fff3fff3fff", -"@ c #53ee53ee53ee", -"# c #5fe85fe85fe8", -"$ c #67e767e767e7", -"% c #6fff6fff6fff", -"& c #77ea77ea77ea", -"* c #7bdb7bdb7bdb", -"= c Gray50", -"- c Gray56", -"; c #9bd69bd69bd6", -": c #9fff9fff9fff", -"> c #a7c7a7c7a7c7", -", c Gray70", -"< c Gray75", -"1 c Gray81", -"2 c #dfffdfffdfff", -"3 c #efffefffefff", -"4 c Gray100", -/* pixels */ -",><,><,><,><,><,><,><,><", -">-<>-<>-<>-<>-<>-<>-<>-<", -"<<<<<<<<<<<<<<<<<<<<<<<<", -",><,><,><,><,><,><,><,><", -">-<>-<>-<>-<>-<>-<>-<>-<", -"<<<<<<<<<<<<;O;<<<<<<<<<", -",><,><,><,>< X;,><,><,><", -">-<>-<>-<>-&#-<>-<>-<>-<", -"<<<<<<<<<<<;<<<<<<<<<<<<", -",><,><,><,><,><,><,><,><", -">-<>-<>-<-O>>-<>-<>-<>-<", -"<<<<<<<<@@<@<<<<<<<<<<<<", -",><<<;*+1<<#;<<,><,><,><", -">-<>#&:<==+#&-<>-<>-<>-<", -"<<@@<3+=<1o <#<<<<<<<<<<", -",>O<=+444:+.4=-,><,><,><", -">-O=<4444:4::<$>-<>-<>-<", -"<&;444444444+4+<<<<<<<<<", -",#;444444444<=4O<<,><,><", -">-O4444444442=2&-<>-<>-<", -"<<;%444444444=<<#<<<<<<<", -",><@2444444444+4=-,><,><", -">-<-=444444444::<$>-<>-<", -"<<<,$1444444444+4+<<<<<<" -}; diff --git a/etc/gnus/get-news.pbm b/etc/gnus/get-news.pbm deleted file mode 100644 index c008071..0000000 Binary files a/etc/gnus/get-news.pbm and /dev/null differ diff --git a/etc/gnus/get-news.xpm b/etc/gnus/get-news.xpm deleted file mode 100644 index b9ad760..0000000 --- a/etc/gnus/get-news.xpm +++ /dev/null @@ -1,68 +0,0 @@ -/* XPM */ -static char *magick[] = { -/* columns rows colors chars-per-pixel */ -"24 24 38 1", -" c Gray0", -". c #0bfb0bfb0bfb", -"X c Gray6", -"o c #133313331333", -"O c Gray9", -"+ c Gray11", -"@ c Gray12", -"# c #23f323f323f3", -"$ c Gray15", -"% c #2ff32ff32ff3", -"& c #399939993999", -"* c #3fff3fff3fff", -"= c Gray25", -"- c #433243324332", -"; c Gray28", -": c #4ccc4ccc4ccc", -"> c #519151915191", -", c #53e753e753e7", -"< c #565a565a565a", -"1 c Gray35", -"2 c #5b1a5b1a5b1a", -"3 c #5fe55fe55fe5", -"4 c Gray45", -"5 c Gray46", -"6 c #77d777d777d7", -"7 c #7ccc7ccc7ccc", -"8 c Gray50", -"9 c #866586658665", -"0 c Gray56", -"q c Gray60", -"w c #9bcb9bcb9bcb", -"e c #9fff9fff9fff", -"r c #a7c7a7c7a7c7", -"t c Gray70", -"y c Gray75", -"u c Gray81", -"i c #dfffdfffdfff", -"p c Gray100", -/* pixels */ -"0000000ryyyyyyyyyyyyyyyy", -"@8888833yyyyyyyyyyyyyyyy", -"*pppppy3yyyyyyyyyyyyyyyy", -"*pppppy3yyyyyr=$$6yyyyyy", -"*ppppp3%3yyyr<9qq36yyyyy", -"*ppppp ;0>yy0:qqqq%yyyyy", -"*pppppy @82tq>0qq8>yyyyy", -"*pppppy%>q42y0>q42yyyyyy", -"*pppppy3q=q8%%.=:#%6yyyy", -"%yyyyy03y0:qqqqqqqq:0yyy", -"33333330yr<9qqqqqqq42yyy", -"yyyyyyyyyyr=qqqqqqqq$yyy", -"yyyyyyyyyyyy$:%***$q$**X", -"yyyyyyyyyyyy$:yppe3q$pp*", -"yyyyyyyyyyyy$:ypp*q3qpp*", -"yyyyyyyyyyyy$:yp8402upp*", -"yyyyyyyyyyyyo$yi*&48ppp*", -"yyyyyyyyyyy>4&u>00:ippp*", -"yyyyyyyyyyy%q:00Oq%yyyy%", -"yyyyyyyyyyy%q4:o<3&%3333", -"yyyyyyyyyyy%qqq$9443yyyy", -"yyyyyyyyyyy%44@0&4<3yyyy", -"yyyyyyyyyyy6o$;r%&O0yyyy", -"yyyyyyyyyyyy$:0y34%yyyyy" -}; diff --git a/etc/gnus/gnntg.pbm b/etc/gnus/gnntg.pbm deleted file mode 100644 index 2f5e526..0000000 Binary files a/etc/gnus/gnntg.pbm and /dev/null differ diff --git a/etc/gnus/gnntg.xpm b/etc/gnus/gnntg.xpm deleted file mode 100644 index ea2a723..0000000 --- a/etc/gnus/gnntg.xpm +++ /dev/null @@ -1,64 +0,0 @@ -/* XPM */ -static char *magick[] = { -/* columns rows colors chars-per-pixel */ -"24 24 34 1", -" c Gray0", -". c #099909990999", -"X c #0bfb0bfb0bfb", -"o c #133313331333", -"O c Gray9", -"+ c Gray11", -"@ c #23f323f323f3", -"# c Gray15", -"$ c #2fef2fef2fef", -"% c #399939993999", -"& c #3fff3fff3fff", -"* c Gray25", -"= c #433243324332", -"- c Gray28", -"; c #4ccc4ccc4ccc", -": c #519151915191", -"> c #566656665666", -", c #5fed5fed5fed", -"< c #626262626262", -"1 c Gray42", -"2 c Gray45", -"3 c Gray46", -"4 c #77d777d777d7", -"5 c #7ccc7ccc7ccc", -"6 c Gray50", -"7 c #866586658665", -"8 c Gray56", -"9 c Gray60", -"0 c #9bcb9bcb9bcb", -"q c #a7c7a7c7a7c7", -"w c Gray70", -"e c Gray75", -"r c #dfffdfffdfff", -"t c Gray100", -/* pixels */ -"w8888888weeeeeeeeeeeeeee", -"8&66666&8eeeeeeeeeeeeeee", -"86ttttt68eeeeeeeeeeeeeee", -"86ttttt68eeeee0###0eeeee", -"86ttttr&-4eee8:000:8eeee", -"86tttte 144ee,20002,eeee", -"86ttttt6 =,4e4<000<4eeee", -"86ttttt6-,0,4e4,0,4eeeee", -"86ttttt684,0<$$.,#$$0eee", -"8,eeeee,8e,200000000#eee", -"q,,,,,,,qe8:00000000,4ee", -"eeeeeeeeeee0=000006,0$ee", -"eeeeeeeeeeee8;00002;0$ee", -"eeeeeeeeeeee8;00002;0$ee", -"eeeeeeeeeeee8;00002;0$ee", -"eeeeeeeeeeee8;00002;0$ee", -"eeeeeeeeeeee8#;;;;%#;$ee", -"eeeeeeeeeeee=2222+88@0ee", -"eeeeeeeeeeee#00000.4$eee", -"eeeeeeeeeeee#00720O,,eee", -"eeeeeeeeeeee#002;02%8eee", -"eeeeeeeeeeee+22$,>2%8eee", -"eeeeeeeeeeee-#o48O%$qeee", -"eeeeeeeeeeee8;#ee$2,eeee" -}; diff --git a/etc/gnus/gnus-group-catchup-current-up.xbm b/etc/gnus/gnus-group-catchup-current-up.xbm deleted file mode 100644 index f801fea..0000000 --- a/etc/gnus/gnus-group-catchup-current-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x20,0x40,0x10,0x20,0x0a,0x15,0x85,0x0a,0x20,0x20,0x28,0x50,0x8a,0x8a,0x02, - 0x05,0x10,0x5e,0x54,0xa8,0xa5,0x35,0x01,0x7a,0x00,0x33,0x54,0x95,0xaa,0xaa, - 0x02,0xcc,0xfe,0x17,0xa8,0xd8,0x01,0xac,0xfa,0x4f,0x3d,0xf8,0x05,0x30,0x22, - 0x80,0xf6,0x60,0x2b,0xfc,0x8f,0x20,0x11,0x82,0xca,0x60,0x1a,0x2a,0x6e,0x28, - 0x08,0x85,0x42,0x68,0xfa,0x11,0x28,0xc8,0x04,0x8b,0xe2,0xb7,0x06,0x21,0x14, - 0xd4,0x1a,0x11,0x31,0x04,0x31,0x56,0x6d,0xdc,0x58,0xea,0xc7,0x28,0x64,0x66, - 0x60,0xa9,0x57,0x72,0x90,0x49,0xc8,0xec,0x5f,0x99,0xa6,0x7f,0x95,0x52,0xaa, - 0x64,0x22,0xbf,0x49,0x2a,0xa9,0x7e,0x92,0x52,0x55,0x55,0x54,0x49,0x4a,0xa4, - 0x49,0xaa,0xa4,0x4a,0x2a,0x49,0x2a,0x25}; diff --git a/etc/gnus/gnus-group-catchup-current-up.xpm b/etc/gnus/gnus-group-catchup-current-up.xpm deleted file mode 100644 index 0504f9d..0000000 --- a/etc/gnus/gnus-group-catchup-current-up.xpm +++ /dev/null @@ -1,39 +0,0 @@ -/* XPM */ -static char * icon-catchup_xpm[] = { -"32 32 4 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #999999999999", -"o c #FFFFFFFFFFFF", -" ", -" ", -" ", -" ", -" .... ", -" .XXXX. .... ", -" .XXXX. .XXXX.", -" .XXX. .XXXX.", -" .........XX. .XXX.", -".ooooooooo.. .........XX. ", -".o....ooooo...... .ooooooooo.. ", -"X. .ooooooooo.X..o....ooooo. ", -"X. .oooo........X. .ooooo. ", -". .oooo. .X. .ooooo. ", -" .oooo. .. .oooo.o. ", -" .oooo. .oooo.o. ", -" ...... .ooooo.oo..", -" .ooooo. ...... ..X.", -" .ooooo. .ooooo. ..", -" .o..ooo. ..oooo. ", -".ooo..ooo.XXXXXXXXX.o..ooo.XXXXX", -"ooo.XX.oo.XXX......ooo..ooo.XXXX", -"oo.XXX.oo.XXX..oooooo.XX.oo.XXXX", -"..XXXX.oo.XXX..ooooo.XXX.oo.XXXX", -"XXXXXXX.oo.XX.......XXX .oo.XXXX", -"XXXXXXX.....X..XXXXXXXXXX.oo.XXX", -"XXXXXXXXXXXXX.XXXXXXXXXXX.....XX", -"XXXXXXXXXXXXXXXXXXXXXXXXX......X", -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"}; diff --git a/etc/gnus/gnus-group-catchup-current.xbm b/etc/gnus/gnus-group-catchup-current.xbm deleted file mode 100644 index 2218640..0000000 --- a/etc/gnus/gnus-group-catchup-current.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x84,0x20,0x00,0x04,0x21,0x88,0x54,0x51,0x84,0x22,0x02,0x04,0x51,0x88,0xa0, - 0x42,0x04,0x1f,0x0a,0x28,0x51,0x75,0xa1,0x7a,0x04,0x23,0x04,0xcc,0xa1,0x76, - 0xa9,0xa6,0xfe,0x1b,0x00,0xd8,0x01,0x0c,0xfd,0x5f,0x3d,0xf8,0x05,0x30,0x26, - 0x80,0xf7,0x60,0x33,0xfc,0xdb,0x20,0x11,0x22,0x8e,0x20,0x14,0x8a,0x66,0x68, - 0x09,0x45,0x48,0x28,0xfc,0x11,0x21,0xc8,0x04,0x45,0xf4,0xf7,0x06,0x89,0x10, - 0xc4,0x1a,0x23,0x35,0x2c,0x31,0xaa,0x6c,0x54,0x58,0xea,0xc7,0x48,0x64,0x66, - 0xa0,0x99,0x57,0x72,0x50,0x59,0xc8,0xec,0x2f,0x49,0xa6,0x7f,0xaa,0x52,0xaa, - 0x64,0x49,0xbf,0x49,0x2a,0xa5,0x7e,0x92,0xa4,0x14,0x55,0xa9,0x52,0xaa,0x92, - 0x4a,0xa5,0x24,0x25,0xa5,0x94,0xaa,0xa8}; diff --git a/etc/gnus/gnus-group-catchup-current.xpm b/etc/gnus/gnus-group-catchup-current.xpm deleted file mode 100644 index bea4643..0000000 --- a/etc/gnus/gnus-group-catchup-current.xpm +++ /dev/null @@ -1,39 +0,0 @@ -/* XPM */ -static char * icon-catchup_xpm[] = { -"32 32 4 1", -" c #BFBFBFBFBFBF", -". c #000000000000", -"X c #999999999999", -"o c #FFFFFFFFFFFF", -" ", -" ", -" ", -" ", -" .... ", -" .XXXX. .... ", -" .XXXX. .XXXX.", -" .XXX. .XXXX.", -" .........XX. .XXX.", -".ooooooooo.. .........XX. ", -".o....ooooo...... .ooooooooo.. ", -"X. .ooooooooo.X..o....ooooo. ", -"X. .oooo........X. .ooooo. ", -". .oooo. .X. .ooooo. ", -" .oooo. .. .oooo.o. ", -" .oooo. .oooo.o. ", -" ...... .ooooo.oo..", -" .ooooo. ...... ..X.", -" .ooooo. .ooooo. ..", -" .o..ooo. ..oooo. ", -".ooo..ooo.XXXXXXXXX.o..ooo.XXXXX", -"ooo.XX.oo.XXX......ooo..ooo.XXXX", -"oo.XXX.oo.XXX..oooooo.XX.oo.XXXX", -"..XXXX.oo.XXX..ooooo.XXX.oo.XXXX", -"XXXXXXX.oo.XX.......XXX .oo.XXXX", -"XXXXXXX.....X..XXXXXXXXXX.oo.XXX", -"XXXXXXXXXXXXX.XXXXXXXXXXX.....XX", -"XXXXXXXXXXXXXXXXXXXXXXXXX......X", -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"}; diff --git a/etc/gnus/gnus-group-describe-group-up.xbm b/etc/gnus/gnus-group-describe-group-up.xbm deleted file mode 100644 index 0054d63..0000000 --- a/etc/gnus/gnus-group-describe-group-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x55,0xb5,0x55,0xb5,0xaa,0x12,0xa9,0x12,0x12,0x55,0x12,0x65,0xa9,0xa4,0x4a, - 0x10,0x55,0x9b,0x15,0xc1,0x55,0x51,0x09,0x00,0x92,0x4a,0x02,0x00,0xa9,0x24, - 0x01,0x00,0x55,0x5b,0x11,0x11,0x92,0xa4,0x00,0x00,0x2a,0x49,0x00,0x00,0x49, - 0x55,0x00,0x00,0x35,0x55,0x11,0x11,0xaa,0xaa,0x00,0x00,0x92,0x44,0x00,0x00, - 0xa5,0x32,0x00,0x00,0x55,0x55,0x11,0x11,0x29,0x55,0x01,0x00,0xaa,0x24,0x01, - 0x00,0x92,0x97,0x00,0x00,0x75,0xba,0x13,0x11,0x2a,0x51,0x04,0x00,0xb2,0xaa, - 0x0a,0x40,0x59,0x75,0x25,0x40,0xb5,0x3d,0x59,0xb5,0xfa,0x77,0xa5,0x2a,0xae, - 0x9a,0x2a,0x49,0xd6,0x5f,0x49,0xa5,0xf7,0x57,0x35,0x55,0x7d,0x29,0x95,0x2a, - 0x7e,0x55,0xa9,0x54,0x5f,0x92,0x94,0x92}; diff --git a/etc/gnus/gnus-group-describe-group-up.xpm b/etc/gnus/gnus-group-describe-group-up.xpm deleted file mode 100644 index e0ffde7..0000000 --- a/etc/gnus/gnus-group-describe-group-up.xpm +++ /dev/null @@ -1,39 +0,0 @@ -/* XPM */ -static char * icon-describe-group_xpm[] = { -"32 32 4 1", -" c #000000000000", -". c #999999999999 s backgroundToolBarColor", -"X c #FFFFFFFFFFFF", -"o c #BFBFBFBFBFBF", -" ... ... ... ... ... ... ... ...", -"................................", -"................................", -".......................XXXXX....", -" ... ... ... ... ... XXX XXXXX..", -"....................XXXXXXXXXXX.", -"...................XXXXXXXXXXXXX", -"..................XXXXXXXXXXXXXX", -" ... ... ... ... XXX XXX XXX XXX", -"................XXXXXXXXXXXXXXXX", -"................XXXXXXXXXXXXXXXX", -"................XXXXXXXXXXXXXXXX", -" ... ... ... ... XXX XXX XXX XXX", -"................XXXXXXXXXXXXXXXX", -"................XXXXXXXXXXXXXXXX", -"................XXXXXXXXXXXXXXXX", -" ... ... ... ... XXX XXX XXX XXX", -".................XXXXXXXXXXXXXXX", -".................XXXXXXXXXXXXXXX", -"....... .......XXXXXXXXXXXXXX", -" ... . oooo ... ..X XXX XXX XXX", -"..... o...oo .......XXXXXXXXXXX.", -".... .o....o. .......XXXXXXXXX..", -".... o . ... .........XXXXX....", -" ... o .. . .. ... ... ... ...", -"... o . . ..................", -".. X . . . ...................", -". o . . ....................", -" o . ... ... ... ... ...", -" o .........................", -"o . ...o......................", -" ..........................."}; diff --git a/etc/gnus/gnus-group-exit-up.xbm b/etc/gnus/gnus-group-exit-up.xbm deleted file mode 100644 index c03e1fa..0000000 --- a/etc/gnus/gnus-group-exit-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x00,0x00,0x40,0x00,0x00,0x30,0x30,0x00,0x00,0x68,0x38,0x00,0x38,0x60,0x48, - 0x00,0xd4,0x91,0xde,0x07,0x68,0xcf,0xb7,0x1a,0x80,0xb4,0x6e,0x05,0x00,0xe2, - 0x07,0x00,0x00,0xde,0x1d,0x00,0xe0,0xfd,0x77,0x00,0xb0,0x6a,0xf3,0x00,0x20, - 0x9c,0xa5,0x03,0x00,0xaa,0x86,0x02,0x00,0x65,0x06,0x02,0xab,0x6f,0xaf,0x59, - 0x80,0x62,0x0c,0x00,0xaa,0xab,0xba,0x4a,0x40,0x21,0x10,0x10,0xea,0x45,0x4a, - 0x42,0x40,0x89,0x90,0x28,0xd2,0x21,0x02,0x82,0xa4,0x8a,0x44,0x20,0xf0,0x10, - 0x10,0x85,0xa4,0x04,0x4a,0x20,0xe2,0x22,0x80,0x80,0xbc,0x4b,0x09,0x2a,0xee, - 0x8e,0x32,0x80,0xeb,0x73,0x85,0x28,0x56,0xaa,0xb5,0x02,0xff,0xff,0x85,0x48, - 0x08,0x94,0x11,0x01,0x42,0x02,0x48,0x54}; diff --git a/etc/gnus/gnus-group-exit-up.xpm b/etc/gnus/gnus-group-exit-up.xpm deleted file mode 100644 index 1b8982f..0000000 --- a/etc/gnus/gnus-group-exit-up.xpm +++ /dev/null @@ -1,39 +0,0 @@ -/* XPM */ -static char * icon-exit-gnus_xpm[] = { -"32 32 4 1", -" c #FFFFFFFFFFFF s backgroundToolBarColor", -". c #000000000000", -"X c #999999999999", -"o c #BFBFBFBFBFBF", -" . ", -" .. .. ", -" . .. ... ", -" ... .. . . ", -" . . ... . . .... ..... ", -" . .. .... ..... .. . . .. ", -" . . .. . ... .. . . ", -" . ...... ", -" .... ... ... ", -" .... ......... ... ", -" .. . . .X.. .. .... ", -" . .X. .. . . ... ", -" .X. . . .. . . ", -" .X. .. .. . ", -".. . . ..X.. .. .... . .. .. . ", -"ooooooo.X.ooo..ooo..oo ooooooooo", -"oooo oo.X.ooo.ooooo..oooooooo oo", -"o oooo.X.ooooooo ooo.ooooooooooo", -"oooooo.X.ooooooooooooooo ooooooo", -"ooo oo.X.ooo ooooooooooooooooooo", -"oooooo.X.oooooooooo oooooo ooo", -"ooooo.X.ooooooooooooooo ooooooo", -"o ooo.X.oooooo ooooooooooooooooo", -"ooooo.X.oooo o ooooooooo ooooo", -"ooooo.X.ooooooooooo oooo o ooo", -"oo....X...ooooooo o oooooooooo", -"o..XX...XX..ooo.o.oo.oo oooooooo", -".XX.XX..X.XX...ooo.oo o oooooo", -"X.XX.XXXXXXXXXX..oooo.o.oooooo o", -".................o.o oo.oooo o ", -"oooooo ooo.oo oo.o . ooooooooo", -"oooo o oo o oooooooooooooooo"}; diff --git a/etc/gnus/gnus-group-get-new-news-this-group-up.xbm b/etc/gnus/gnus-group-get-new-news-this-group-up.xbm deleted file mode 100644 index 2f354f4..0000000 --- a/etc/gnus/gnus-group-get-new-news-this-group-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x20,0x00,0x40,0x88,0xff,0x57,0x15,0x22,0x02,0x0c,0xa0,0x88,0x02,0xa4,0x0a, - 0x22,0x02,0x04,0xf0,0x84,0x03,0x54,0xdd,0x21,0x02,0x1e,0x14,0x97,0x02,0x66, - 0xcd,0x02,0x02,0x7c,0x14,0x2b,0x03,0x9c,0xad,0x41,0x02,0x54,0xb1,0x0a,0x02, - 0x2c,0xff,0x47,0x02,0xe4,0x14,0x2d,0xff,0x4f,0xa5,0x0a,0x48,0xa0,0x4a,0xb4, - 0x12,0x0a,0x51,0x1b,0x40,0xa1,0x96,0x36,0x2a,0x10,0x4a,0x56,0x80,0x4a,0x57, - 0x1b,0x55,0x00,0x92,0x52,0x00,0x55,0x26,0x17,0xa9,0x00,0xab,0x5a,0x04,0x2a, - 0xfe,0x1f,0x41,0x41,0xcb,0x48,0x14,0x14,0x95,0x2f,0x82,0x42,0x53,0x09,0x28, - 0x08,0xa5,0xaf,0x84,0xa2,0x75,0x06,0x12,0x04,0xd3,0x54,0x40,0x51,0xdf,0x0f, - 0x0a,0x82,0xae,0x23,0xa0,0x28,0x8a,0x4a}; diff --git a/etc/gnus/gnus-group-get-new-news-this-group-up.xpm b/etc/gnus/gnus-group-get-new-news-this-group-up.xpm deleted file mode 100644 index 918fd2e..0000000 --- a/etc/gnus/gnus-group-get-new-news-this-group-up.xpm +++ /dev/null @@ -1,39 +0,0 @@ -/* XPM */ -static char * icon-get-new-news-this-group_xpm[] = { -"32 32 4 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -"o c #999999999999", -" ", -" .......... ", -" .XXXXXXXX. ", -" .XXXXXXXX. ", -" .XXXXXXXX. .... ", -" .XXXXXXXX. .oooo. ", -" .XXXXXXX.... .oooooo. ", -" .XXXXXXX.. . .oooooo. ", -" .XXXXXXXX...o. .oooooo. ", -" .XXXXXXXX..ooo. .oooo. ", -" .XXXXXXXX. .ooo. .oo. ", -" .XXXXXXXX. .ooo.....o.... ", -" .XXXXXXXX. .oooooooooooo. ", -" .......... .oooooooooooo. ", -" .oooooooooooo. ", -" .oooooooo.oo. ", -" .ooooooo.oo. ", -" .ooooooo.oo. ", -" .ooooooo.oo. ", -" .ooooooo.oo. ", -" .ooooooo.oo. ", -" .ooooooo.oo. ", -" ............ ", -" .oooooo. . ", -" .ooooooo.. . ", -" .ooooooo. . ", -" .oooo.oo... ", -" .oooo.oooo. ", -" .ooo. .ooo. ", -" ..... ..... ", -" .o. .o. ", -" .o. .o. "}; diff --git a/etc/gnus/gnus-group-get-new-news-up.xbm b/etc/gnus/gnus-group-get-new-news-up.xbm deleted file mode 100644 index bea7a56..0000000 --- a/etc/gnus/gnus-group-get-new-news-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x00,0x81,0x00,0x08,0xff,0x2b,0xa8,0x42,0x01,0x42,0x05,0x14,0x01,0x16,0x50, - 0x41,0x01,0xa2,0x7a,0x0a,0x01,0x0a,0xcc,0x40,0x01,0xaf,0x92,0x15,0x01,0x13, - 0x56,0x43,0x01,0xbe,0x2a,0x09,0x01,0x6e,0xcc,0x52,0x01,0xca,0x69,0x80,0x01, - 0x32,0xdf,0x2b,0x01,0x66,0x55,0x85,0xff,0x33,0xa9,0x2e,0x24,0xc9,0x92,0x88, - 0x09,0x82,0x4a,0x2e,0xa0,0x28,0xfd,0xf9,0x14,0x42,0x07,0x8d,0x42,0x08,0x85, - 0x8d,0x20,0x52,0x87,0x85,0x8a,0x80,0x45,0x86,0x20,0x2a,0xc7,0x82,0x8a,0x00, - 0xe7,0x82,0x41,0xd4,0x15,0x81,0x14,0x81,0xe6,0x81,0x81,0xa8,0x3d,0xff,0x14, - 0x82,0xfa,0x02,0x42,0xd1,0x52,0x57,0x08,0x8a,0xad,0x82,0xa2,0xa0,0xef,0x2b, - 0x04,0x05,0x55,0x81,0x51,0x50,0xc7,0x2b}; diff --git a/etc/gnus/gnus-group-get-new-news-up.xpm b/etc/gnus/gnus-group-get-new-news-up.xpm deleted file mode 100644 index d324784..0000000 --- a/etc/gnus/gnus-group-get-new-news-up.xpm +++ /dev/null @@ -1,39 +0,0 @@ -/* XPM */ -static char * icon-get-new-news_xpm[] = { -"32 32 4 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -"o c #999999999999", -" ", -".......... ", -".XXXXXXXX. ", -".XXXXXXXX. ", -".XXXXXXXX. .... ", -".XXXXXXXX. .oooo. ", -".XXXXXXX.... .oooooo. ", -".XXXXXXX.. . .oooooo. ", -".XXXXXXXX...o. .oooooo. ", -".XXXXXXXX..ooo. .oooo. ", -".XXXXXXXX. .ooo. .oo. ", -".XXXXXXXX. .ooo.....o.... ", -".XXXXXXXX. .oooooooooooo. ", -".......... .oooooooooooo. ", -" .oooooooooooo. ", -" .ooooooooooo. ", -" .o.......oo.....", -" .o.XXXXX.oo.XXX.", -" .o.XXXX.ooo.XXX.", -" .o.XXXX.oo.XXXX.", -" .o.XXX.ooo.XXXX.", -" .o.XXX.oo.XXXXX.", -" ...XX...o.XXXXX.", -" .oo.X. .XXXXXX.", -" .oo.XX.. .XXXXXX.", -" .oo.... ........", -" .oooo.o..o. ", -" .oooo.oooo. ", -" .ooo. .ooo. ", -" ..... ..... ", -" .o. .o. ", -" .o. .o. "}; diff --git a/etc/gnus/gnus-group-kill-group-up.xbm b/etc/gnus/gnus-group-kill-group-up.xbm deleted file mode 100644 index 8c3526d..0000000 --- a/etc/gnus/gnus-group-kill-group-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x00,0x04,0x20,0x20,0x54,0xa1,0x0a,0x4a,0x02,0x0a,0x50,0x01,0xa0,0x40,0x05, - 0x54,0xca,0xff,0x7f,0x00,0x50,0x00,0x60,0x55,0x42,0x00,0xa0,0x80,0x68,0xc0, - 0x21,0x2b,0x42,0xe0,0xe3,0x83,0x50,0xb0,0x06,0x2a,0x4a,0xf0,0x07,0x42,0x60, - 0x70,0x07,0x16,0x42,0xe0,0x03,0x42,0x68,0x40,0x01,0x2a,0x42,0x40,0x01,0x82, - 0x50,0xc8,0x05,0x2a,0x4a,0x0c,0x0c,0x82,0x60,0x30,0x03,0x2a,0x4a,0xc0,0x00, - 0x82,0x40,0xc0,0x00,0x2a,0x6a,0x30,0x03,0x42,0x41,0x0c,0x0c,0x16,0x54,0x08, - 0x04,0x22,0x41,0x00,0x00,0x4a,0x54,0x00,0x00,0x02,0x41,0x00,0x00,0x56,0x54, - 0x00,0x00,0x02,0x42,0x00,0x00,0x52,0xe8,0xff,0xff,0x0b,0x04,0x84,0x00,0x42, - 0x52,0x11,0xaa,0x28,0x00,0xa4,0x04,0x04}; diff --git a/etc/gnus/gnus-group-kill-group-up.xpm b/etc/gnus/gnus-group-kill-group-up.xpm deleted file mode 100644 index e728bf5..0000000 --- a/etc/gnus/gnus-group-kill-group-up.xpm +++ /dev/null @@ -1,38 +0,0 @@ -/* XPM */ -static char * icon-killfile_xpm[] = { -"32 32 3 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -" ", -" ", -" ", -" ", -" ................ ", -" .XXXXXXXXXXXXXX.. ", -" .XXXXXXXXXXXXXX.X. ", -" .XXXXXXX...XXXX.XX. ", -" .XXXXXX.....XXX..... ", -" .XXXXX..X.X..XXXXXX. ", -" .XXXXX.......XXXXXX. ", -" .XXXXX...X...XXXXXX. ", -" .XXXXXX.....XXXXXXX. ", -" .XXXXXXX.X.XXXXXXXX. ", -" .XXXXXXX.X.XXXXXXXX. ", -" .XXXX.XX...X.XXXXXX. ", -" .XXX..XXXXXX..XXXXX. ", -" .XXXXX..XX..XXXXXXX. ", -" .XXXXXXX..XXXXXXXXX. ", -" .XXXXXXX..XXXXXXXXX. ", -" .XXXXX..XX..XXXXXXX. ", -" .XXX..XXXXXX..XXXXX. ", -" .XXXX.XXXXXX.XXXXXX. ", -" .XXXXXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXXXXX. ", -" .................... ", -" ", -" ", -" "}; diff --git a/etc/gnus/gnus-group-subscribe-up.xbm b/etc/gnus/gnus-group-subscribe-up.xbm deleted file mode 100644 index 98819e5..0000000 --- a/etc/gnus/gnus-group-subscribe-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x08,0x04,0x00,0x40,0x22,0x51,0x55,0x15,0x88,0x04,0x00,0x20,0x22,0xa0,0xaa, - 0x4a,0xc4,0xff,0x3f,0x00,0x61,0x80,0x60,0x55,0x54,0x8a,0xa0,0x80,0x42,0x84, - 0x20,0x2b,0x68,0x8a,0xe0,0x83,0x42,0x80,0x00,0x2a,0xd4,0xff,0x00,0x42,0x41, - 0x80,0x00,0x16,0x54,0x8a,0x00,0x42,0x41,0x84,0x00,0x2a,0x54,0x8a,0x00,0x82, - 0x41,0x80,0x00,0x2a,0xd4,0xff,0x00,0x82,0x42,0x80,0x00,0x2a,0x68,0x8a,0x00, - 0x82,0x44,0x84,0x00,0x2a,0x52,0x8a,0x00,0x42,0x40,0x80,0x00,0x16,0xea,0xff, - 0x00,0x22,0x40,0x80,0x00,0x4a,0x4a,0x80,0x00,0x02,0x61,0x80,0x00,0x56,0x44, - 0x80,0x00,0x02,0x51,0x80,0x00,0x52,0xc4,0xff,0xff,0x0b,0xa1,0x04,0x00,0x42, - 0x14,0xa8,0xaa,0x88,0x82,0x02,0x00,0x22}; diff --git a/etc/gnus/gnus-group-subscribe-up.xpm b/etc/gnus/gnus-group-subscribe-up.xpm deleted file mode 100644 index 15f7d43..0000000 --- a/etc/gnus/gnus-group-subscribe-up.xpm +++ /dev/null @@ -1,38 +0,0 @@ -/* XPM */ -static char * icon-unsubscribe_xpm[] = { -"32 32 3 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -" ", -" ", -" ", -" ", -" ................ ", -" .XXXXXXXX.XXXXX.. ", -" .XX.X.XXX.XXXXX.X. ", -" .XXX.XXXX.XXXXX.XX. ", -" .XX.X.XXX.XXXXX..... ", -" .XXXXXXXX.XXXXXXXXX. ", -" ..........XXXXXXXXX. ", -" .XXXXXXXX.XXXXXXXXX. ", -" .XX.X.XXX.XXXXXXXXX. ", -" .XXX.XXXX.XXXXXXXXX. ", -" .XX.X.XXX.XXXXXXXXX. ", -" .XXXXXXXX.XXXXXXXXX. ", -" ..........XXXXXXXXX. ", -" .XXXXXXXX.XXXXXXXXX. ", -" .XX.X.XXX.XXXXXXXXX. ", -" .XXX.XXXX.XXXXXXXXX. ", -" .XX.X.XXX.XXXXXXXXX. ", -" .XXXXXXXX.XXXXXXXXX. ", -" ..........XXXXXXXXX. ", -" .XXXXXXXX.XXXXXXXXX. ", -" .XXXXXXXX.XXXXXXXXX. ", -" .XXXXXXXX.XXXXXXXXX. ", -" .XXXXXXXX.XXXXXXXXX. ", -" .XXXXXXXX.XXXXXXXXX. ", -" .................... ", -" ", -" ", -" "}; diff --git a/etc/gnus/gnus-group-unsubscribe-up.xbm b/etc/gnus/gnus-group-unsubscribe-up.xbm deleted file mode 100644 index 9edc6b8..0000000 --- a/etc/gnus/gnus-group-unsubscribe-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x08,0x04,0x00,0x40,0x22,0x51,0x55,0x15,0x88,0x04,0x00,0x20,0x22,0xa0,0xaa, - 0x4a,0xc4,0xff,0x3f,0x00,0x61,0x80,0x60,0x55,0x54,0xa0,0xa0,0x80,0x42,0x90, - 0x20,0x2b,0x68,0x8a,0xe0,0x83,0x42,0x84,0x00,0x2a,0xd4,0xff,0x00,0x42,0x41, - 0x80,0x00,0x16,0x54,0xa0,0x00,0x42,0x41,0x90,0x00,0x2a,0x54,0x8a,0x00,0x82, - 0x41,0x84,0x00,0x2a,0xd4,0xff,0x00,0x82,0x42,0x80,0x00,0x2a,0x68,0xa0,0x00, - 0x82,0x44,0x90,0x00,0x2a,0x52,0x8a,0x00,0x42,0x40,0x84,0x00,0x16,0xea,0xff, - 0x00,0x22,0x40,0x80,0x00,0x4a,0x4a,0x80,0x00,0x02,0x61,0x80,0x00,0x56,0x44, - 0x80,0x00,0x02,0x51,0x80,0x00,0x52,0xc4,0xff,0xff,0x0b,0xa1,0x04,0x00,0x42, - 0x14,0xa8,0xaa,0x88,0x82,0x02,0x00,0x22}; diff --git a/etc/gnus/gnus-group-unsubscribe-up.xpm b/etc/gnus/gnus-group-unsubscribe-up.xpm deleted file mode 100644 index 7c7ce5b..0000000 --- a/etc/gnus/gnus-group-unsubscribe-up.xpm +++ /dev/null @@ -1,38 +0,0 @@ -/* XPM */ -static char * icon-subscribe_xpm[] = { -"32 32 3 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -" ", -" ", -" ", -" ", -" ................ ", -" .XXXXXXXX.XXXXX.. ", -" .XXXXXX.X.XXXXX.X. ", -" .XXXXX.XX.XXXXX.XX. ", -" .XX.X.XXX.XXXXX..... ", -" .XXX.XXXX.XXXXXXXXX. ", -" ..........XXXXXXXXX. ", -" .XXXXXXXX.XXXXXXXXX. ", -" .XXXXXX.X.XXXXXXXXX. ", -" .XXXXX.XX.XXXXXXXXX. ", -" .XX.X.XXX.XXXXXXXXX. ", -" .XXX.XXXX.XXXXXXXXX. ", -" ..........XXXXXXXXX. ", -" .XXXXXXXX.XXXXXXXXX. ", -" .XXXXXX.X.XXXXXXXXX. ", -" .XXXXX.XX.XXXXXXXXX. ", -" .XX.X.XXX.XXXXXXXXX. ", -" .XXX.XXXX.XXXXXXXXX. ", -" ..........XXXXXXXXX. ", -" .XXXXXXXX.XXXXXXXXX. ", -" .XXXXXXXX.XXXXXXXXX. ", -" .XXXXXXXX.XXXXXXXXX. ", -" .XXXXXXXX.XXXXXXXXX. ", -" .XXXXXXXX.XXXXXXXXX. ", -" .................... ", -" ", -" ", -" "}; diff --git a/etc/gnus/gnus-pointer.xbm b/etc/gnus/gnus-pointer.xbm deleted file mode 100644 index 94e9154..0000000 --- a/etc/gnus/gnus-pointer.xbm +++ /dev/null @@ -1,6 +0,0 @@ -#define noname_width 18 -#define noname_height 13 -static char noname_bits[] = { - 0x00,0x00,0x00,0xc0,0x0c,0x00,0xe0,0x1f,0x00,0x92,0x39,0x00,0x0e,0x71,0x02, - 0x46,0xe0,0x03,0x20,0xc0,0x01,0x00,0x08,0x00,0x10,0x0d,0x00,0xc4,0x08,0x00, - 0x78,0x08,0x00,0x18,0x89,0x00,0x00,0x08,0x00}; diff --git a/etc/gnus/gnus-pointer.xpm b/etc/gnus/gnus-pointer.xpm deleted file mode 100644 index c47443d..0000000 --- a/etc/gnus/gnus-pointer.xpm +++ /dev/null @@ -1,22 +0,0 @@ -/* XPM */ -static char *gnus-pointer[] = { -/* width height num_colors chars_per_pixel */ -" 18 13 2 1", -/* colors */ -". c #0000ff", -"# c None s None", -/* pixels */ -"##################", -"######..##..######", -"#####........#####", -"#.##.##..##...####", -"#...####.###...##.", -"#..###.######.....", -"#####.########...#", -"###########.######", -"####.###.#..######", -"######..###.######", -"###....####.######", -"###..######.######", -"###########.######" -}; \ No newline at end of file diff --git a/etc/gnus/gnus-summary-caesar-message-up.xbm b/etc/gnus/gnus-summary-caesar-message-up.xbm deleted file mode 100644 index 0de8759..0000000 --- a/etc/gnus/gnus-summary-caesar-message-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x40,0x40,0x10,0x01,0x15,0x15,0x45,0x50,0x40,0x40,0x08,0x05,0x14,0x14,0xa2, - 0x50,0xe2,0xff,0x3f,0x82,0x48,0x00,0xe0,0x28,0x62,0xe6,0xb8,0x82,0x48,0x29, - 0x25,0x29,0x62,0xa9,0xe4,0x83,0x48,0x2f,0x05,0x2a,0x42,0xe9,0x38,0x42,0x60, - 0x00,0x00,0x16,0x4a,0x82,0x10,0x22,0x50,0x00,0x00,0x4a,0x42,0xcb,0x1c,0x02, - 0x68,0x2b,0x25,0x56,0x42,0x2d,0x1d,0x02,0x50,0x2d,0x05,0x52,0x4a,0xc9,0x04, - 0x0a,0x40,0x00,0x00,0x42,0x6a,0x18,0x00,0x16,0x41,0x3c,0x00,0x42,0x54,0xe6, - 0x3f,0x0a,0x41,0xe6,0x3f,0x52,0x54,0x3c,0x2a,0x06,0x42,0x18,0x2a,0x42,0x68, - 0x00,0x08,0x2a,0x44,0x00,0x00,0x06,0xd2,0xff,0xff,0x53,0x20,0x84,0x20,0x04, - 0x8a,0x10,0x8a,0xa8,0x20,0x4a,0x21,0x02}; diff --git a/etc/gnus/gnus-summary-caesar-message-up.xpm b/etc/gnus/gnus-summary-caesar-message-up.xpm deleted file mode 100644 index 6f56aa9..0000000 --- a/etc/gnus/gnus-summary-caesar-message-up.xpm +++ /dev/null @@ -1,38 +0,0 @@ -/* XPM */ -static char * icon-rot13_xpm[] = { -"32 32 3 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -" ", -" ", -" ", -" ", -" ................ ", -" .XXXXXXXXXXXXXX.. ", -" .XX..XX...XXX...X. ", -" .X.XX.X.XX.X.XX.XX. ", -" .X.XX.X.X.XX.XX..... ", -" .X....X.XX.X.XXXXXX. ", -" .X.XX.X...XXX...XXX. ", -" .XXXXXXXXXXXXXXXXXX. ", -" .XX.XXXXX.XXXX.XXXX. ", -" .XXXXXXXXXXXXXXXXXX. ", -" .X..X.XX..XX...XXXX. ", -" .X..X.X.XX.X.XX.XXX. ", -" .X.X..X.XX.X...XXXX. ", -" .X.X..X.XX.X.XXXXXX. ", -" .X.XX.XX..XX.XXXXXX. ", -" .XXXXXXXXXXXXXXXXXX. ", -" .XXXX..XXXXXXXXXXXX. ", -" .XXX....XXXXXXXXXXX. ", -" .XX..XX.........XXX. ", -" .XX..XX.........XXX. ", -" .XXX....XXX.X.X.XXX. ", -" .XXXX..XXXX.X.X.XXX. ", -" .XXXXXXXXXXXX.XXXXX. ", -" .XXXXXXXXXXXXXXXXXX. ", -" .................... ", -" ", -" ", -" "}; diff --git a/etc/gnus/gnus-summary-cancel-article-up.xbm b/etc/gnus/gnus-summary-cancel-article-up.xbm deleted file mode 100644 index e8d8d68..0000000 --- a/etc/gnus/gnus-summary-cancel-article-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x11,0x11,0x01,0x11,0x54,0x4a,0xa9,0x52,0x82,0x10,0x04,0x08,0x28,0x24,0xa1, - 0x42,0x91,0x91,0x0f,0x19,0x25,0xaa,0xa9,0x44,0x88,0x60,0x18,0x11,0x42,0x1c, - 0x56,0x44,0x19,0x07,0x97,0x31,0x44,0x01,0x23,0x0a,0x12,0x81,0x60,0x50,0x80, - 0x02,0x42,0x05,0x3b,0x05,0x78,0x59,0x00,0x0a,0x56,0x12,0xaa,0xf4,0x05,0x41, - 0x00,0x54,0x51,0x10,0x5b,0x51,0x95,0x55,0x10,0x15,0x00,0x11,0x42,0x40,0x55, - 0x44,0x10,0x2a,0x00,0x21,0x5b,0x91,0x5b,0x95,0x80,0x24,0x00,0x21,0x12,0x92, - 0x2a,0x14,0x44,0x01,0x80,0x42,0x11,0xb5,0x35,0x19,0x54,0x11,0x08,0x42,0x02, - 0x44,0xa1,0x08,0xa8,0x22,0x14,0x52,0x11,0x99,0x51,0x11,0x4a,0x22,0x14,0x4a, - 0x20,0x89,0x42,0x10,0x15,0x40,0x20,0x45}; diff --git a/etc/gnus/gnus-summary-cancel-article-up.xpm b/etc/gnus/gnus-summary-cancel-article-up.xpm deleted file mode 100644 index fa7c639..0000000 --- a/etc/gnus/gnus-summary-cancel-article-up.xpm +++ /dev/null @@ -1,39 +0,0 @@ -/* XPM */ -static char * icon-cancel-post_xpm[] = { -"32 32 4 1", -" c #000000000000", -". c #BFBFBFBFBFBF s backgroundToolBarColor", -"X c #FFFFFFFFFFFF", -"o c #999999999999", -" ... ... ... ... ....... ... ...", -"................................", -"................................", -"................................", -" ... ... ... ... .... ... ...", -"............... XX ............", -"............. XXXX ...........", -"........... XXXX X ...........", -" ... .... XXXXX X ... ... ...", -"........ XXXXXXX XXX ..........", -"........ XXXXXX oXXXX ..........", -"........o XXXXXXXoXXXX .........", -" ... ...oo XXXXXXXX . ... ...", -".........oo XXXXX oooo.........", -"..........oo o..............", -"..........ooooooo...............", -" ... ... ... oo. ... ... ... ...", -"................................", -"................................", -"................................", -" ... ... ... ... ... ... ... ...", -"................................", -"................................", -"................................", -" ... ... ... ... ... ... ... ...", -"................................", -"................................", -"................................", -" ... ... ... ... ... ... ... ...", -"................................", -"................................", -"................................"}; diff --git a/etc/gnus/gnus-summary-catchup-and-exit-up.xbm b/etc/gnus/gnus-summary-catchup-and-exit-up.xbm deleted file mode 100644 index 4adec42..0000000 --- a/etc/gnus/gnus-summary-catchup-and-exit-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x08,0x81,0x00,0x04,0x42,0x28,0x52,0x51,0x14,0x85,0x08,0x04,0x81,0x20,0x42, - 0x49,0x14,0x8a,0x08,0x20,0x41,0x21,0x52,0x15,0x14,0x44,0x00,0x40,0x41,0x91, - 0xbf,0x2a,0x14,0xda,0x10,0x80,0x81,0x94,0x90,0x2a,0x14,0x73,0xf0,0x80,0xe1, - 0x60,0x90,0x2b,0xc4,0x60,0x08,0x43,0xa2,0xf0,0x0f,0x15,0x88,0x11,0xfc,0x21, - 0xd2,0x11,0x8c,0x4a,0x80,0x12,0x84,0x00,0xd5,0x13,0x84,0x55,0x00,0x17,0x74, - 0x80,0x54,0xfb,0xcf,0x2a,0x02,0x9a,0x24,0x40,0x54,0x9f,0xbc,0x36,0xa9,0xf4, - 0x77,0x49,0x94,0x96,0x94,0xa4,0x25,0x95,0x35,0x15,0xa9,0xfe,0xbf,0xa4,0x92, - 0xdc,0x5c,0x29,0x4a,0x9e,0x3d,0x95,0xaa,0xfe,0x4f,0x52,0x24,0xf9,0xaf,0x4a, - 0xa9,0x52,0x91,0x94,0x25,0x29,0x55,0x52}; diff --git a/etc/gnus/gnus-summary-catchup-and-exit-up.xpm b/etc/gnus/gnus-summary-catchup-and-exit-up.xpm deleted file mode 100644 index a5d8ba6..0000000 --- a/etc/gnus/gnus-summary-catchup-and-exit-up.xpm +++ /dev/null @@ -1,39 +0,0 @@ -/* XPM */ -static char * icon-catchup_xpm[] = { -"32 32 4 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -"o c #999999999999", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ...... ", -" .. .XXXX. ", -" .X. .XXXX. ", -" ..XX...XXXXX.... ", -" ..XXXXX..XXXXX.XX... ", -" ..XXXXX..XXXX.XXXX.. ", -" .XXXX........XXXX. ", -" ..XXX.XXXXX....... ", -" ..XXX.XXXXX..XXX. ", -" .X.XX.XXXXX.XXXX. ", -" ...XX.XXXXX.XXXX. ", -" ...X.XXXXX.X... ", -" .X.........XX. ", -" . .XX.XX.XX. ", -"ooooooooo....XX.XX....oooooooooo", -"oooooooooo. ....... .oooooooooo", -"oooooooooo.X.XX.X .X.ooooooooooo", -"oooooooooo. .X . . .ooooooooooo", -"oooooooooo...........ooooooooooo", -"oooooooooo...X..XX...ooooooooooo", -"oooooooooo...X ..X...ooooooooooo", -"oooooooooo..........oooooooooooo", -"oooooooooooo.......ooooooooooooo", -"oooooooooooooooooooooooooooooooo", -"oooooooooooooooooooooooooooooooo"}; diff --git a/etc/gnus/gnus-summary-catchup-up.xbm b/etc/gnus/gnus-summary-catchup-up.xbm deleted file mode 100644 index ca093e1..0000000 --- a/etc/gnus/gnus-summary-catchup-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x11,0x91,0x11,0x95,0x54,0x25,0x54,0x21,0x02,0x90,0x00,0x84,0xa0,0x0a,0x54, - 0x29,0x1b,0xb1,0x11,0x91,0x40,0x0a,0x4a,0x25,0x8a,0xa0,0x20,0x88,0x20,0x14, - 0x0e,0x22,0x9b,0x51,0xb7,0x99,0x20,0x14,0x0b,0x02,0x42,0xc1,0x22,0x28,0x14, - 0x92,0x48,0x45,0x51,0x19,0x11,0x11,0x14,0x42,0xaa,0x54,0x42,0x88,0x00,0x02, - 0x90,0x72,0xaa,0x56,0x15,0x71,0x11,0x17,0x42,0x3a,0x49,0x4b,0x28,0x49,0xa4, - 0x22,0x04,0x30,0x02,0x09,0xb1,0xdb,0x59,0xb5,0x15,0xa0,0xd3,0xff,0x40,0x05, - 0xbf,0x02,0x2a,0xd3,0x08,0x54,0x91,0x53,0x77,0x7f,0xc8,0xa9,0xd4,0x8a,0x62, - 0x22,0x86,0x35,0xc8,0x5b,0x4b,0x67,0x93,0xfd,0x91,0x39,0x24,0x18,0xff,0x7a, - 0x90,0x46,0xc5,0xcf,0x25,0x94,0x21,0xf1}; diff --git a/etc/gnus/gnus-summary-catchup-up.xpm b/etc/gnus/gnus-summary-catchup-up.xpm deleted file mode 100644 index 9de9baf..0000000 --- a/etc/gnus/gnus-summary-catchup-up.xpm +++ /dev/null @@ -1,37 +0,0 @@ -/* XPM */ -static char * icon-catchup2_xpm[] = { -"32 32 2 1", -" c #000000000000", -". c #BFBFBFBFBFBF s backgroundToolBarColor", -" ... ... ... ... ... ... ... ...", -"................................", -"................................", -"................................", -" ... ... ... ... ... ... ... ...", -"................................", -"................................", -"................. .............", -" ... ... ... ... . ... ... ...", -"................ ..............", -"............... ................", -"................................", -" ... ... ... ... ... ... ... ...", -"................................", -"................................", -"............. .......... .....", -" ... ... ... . ... ... . ...", -"............ .......... ......", -"........... ........... ........", -"............ .......... .......", -" ... ... ... . . ... ... ... ...", -"............... ..... ", -"................ ... ......", -"........ ..... ... ...... .....", -" ... .. .. . . . . .. . .", -"....... .... .... ... .. . ... ", -"...... ...... ... ..... ... ...", -"...... .. .... ...... .. ..", -" ... ... . ... .. .. ..", -"........... .... . .... .", -".......... ..... ..... .. .", -".......... ..... ....... ... "}; diff --git a/etc/gnus/gnus-summary-exit-up.xbm b/etc/gnus/gnus-summary-exit-up.xbm deleted file mode 100644 index 4d55755..0000000 --- a/etc/gnus/gnus-summary-exit-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x19,0x51,0x91,0x11,0x82,0x14,0x2a,0x48,0x28,0x42,0x40,0x25,0x82,0x10,0x15, - 0x00,0x59,0xfa,0xff,0x5b,0x12,0x4b,0xfe,0x21,0x40,0x21,0xf1,0x93,0x2a,0x0b, - 0xf8,0x05,0x91,0xb5,0xf2,0x31,0x24,0x01,0xf1,0x4b,0x12,0x54,0xfa,0x01,0x80, - 0x83,0xf0,0x55,0x5b,0x35,0xf2,0x11,0x00,0x8b,0xfe,0x4b,0x2a,0x21,0xf7,0x21, - 0x80,0x0b,0xf6,0x13,0x5b,0xb5,0xf4,0x59,0x10,0x03,0xf1,0x01,0x42,0x2b,0xf4, - 0x55,0x90,0x40,0xf3,0x03,0x13,0x1a,0xf8,0x59,0xa8,0x83,0xf2,0x11,0x02,0x2b, - 0x5c,0x43,0x50,0xe3,0xee,0x10,0x93,0xfc,0x55,0x5b,0x48,0x92,0x92,0x00,0x22, - 0x49,0x48,0xaa,0x08,0x00,0x84,0x00,0xb5,0xbb,0x31,0x5b,0x01,0x00,0x0a,0x00, - 0x54,0x25,0x51,0x55,0x01,0x48,0x04,0x00}; diff --git a/etc/gnus/gnus-summary-exit-up.xpm b/etc/gnus/gnus-summary-exit-up.xpm deleted file mode 100644 index d1ab26a..0000000 --- a/etc/gnus/gnus-summary-exit-up.xpm +++ /dev/null @@ -1,37 +0,0 @@ -/* XPM */ -static char * icon-exit-summary_xpm[] = { -"32 32 2 1", -" c #000000000000", -". c #BFBFBFBFBFBF s backgroundToolBarColor", -" ... ... ... ... ... ... ... ...", -"................................", -"................................", -"................................", -" ... ...... ... ...", -"........ ....... .......", -"........ ........... .......", -"........ .......... .......", -" ... ... ... ....... ... ...", -"................ ... .......", -".................... .......", -"........ .......... .......", -" ... ... ... ....... ... ...", -"........ ....... . .......", -"........ ....... . .......", -"........ ....... . .......", -" ... ... ... ....... ... ...", -"........ .......... .......", -"........ ........... .......", -"................ ... .......", -" ... ....... ....... ... ...", -"........ .......... .......", -"........ ........ . . .......", -"........ .... . . . . ........", -" ... .. .. . . . . ... ...", -"................................", -"................................", -"................................", -" ... ... ... ... ... ... ... ...", -"................................", -"................................", -"................................"}; diff --git a/etc/gnus/gnus-summary-followup-up.xbm b/etc/gnus/gnus-summary-followup-up.xbm deleted file mode 100644 index c6ba686..0000000 --- a/etc/gnus/gnus-summary-followup-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x00,0x00,0x40,0x08,0xb6,0x76,0x37,0x63,0x20,0x02,0x00,0x04,0x8a,0x48,0x55, - 0x51,0x10,0x22,0x0e,0x82,0xa6,0xaa,0xa9,0x36,0x12,0x62,0x38,0x20,0xa0,0x18, - 0x96,0x4a,0x0a,0x07,0x17,0x00,0xa2,0x01,0xa3,0x76,0x6a,0x80,0x60,0x00,0x60, - 0x00,0x40,0x55,0x52,0x00,0x40,0x00,0xa6,0x00,0x80,0x6b,0x90,0xe1,0x80,0x04, - 0x24,0x9a,0x00,0x51,0x82,0x86,0x01,0x85,0xaa,0x61,0x01,0x32,0x60,0x70,0x01, - 0x42,0x1d,0x30,0x02,0x14,0x04,0x08,0x02,0x4c,0x06,0x00,0x02,0x28,0x06,0x00, - 0x04,0xac,0x08,0x00,0x08,0x0b,0x0a,0x00,0xc8,0x22,0x12,0x00,0x70,0x6a,0x1a, - 0x00,0x10,0x01,0x20,0x00,0x60,0x52,0x32,0x00,0x20,0x08,0x46,0x00,0x40,0x63, - 0x50,0x00,0x40,0x04,0x85,0x00,0x80,0x52}; diff --git a/etc/gnus/gnus-summary-followup-up.xpm b/etc/gnus/gnus-summary-followup-up.xpm deleted file mode 100644 index 3cee12e..0000000 --- a/etc/gnus/gnus-summary-followup-up.xpm +++ /dev/null @@ -1,38 +0,0 @@ -/* XPM */ -static char * icon-followup_xpm[] = { -"32 32 3 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -" ", -" . . . . . . . . ", -" ", -" ", -" ... ", -" . . . . ..XX. . . . ", -" ..XXXX.. ", -" ..XXXX..X. ", -" ..XXXXX...X. ", -" . . ..XXXXXXX..XXX. . . ", -" ..XXXXXXXX.XXXXX. ", -" .XXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXX. ", -" . . .XXXXXXXXXXXXXXX. . . ", -" .XXXX...XXXXXXX. ", -" .X..XX.XXXXXXXX. ", -" ..XXXX..XXXXXXX. ", -" . ..XXXX..X.XXXXXXXX. . ", -" ..XXXXX...X.XXXXXXXX. ", -" ..XXXXXXX..XXX.XXXXXXXX. ", -" .XXXXXXXX.XXXXX.XXXXXXXX. ", -" ..XXXXXXXXXXXXXX.XXXXXXXXX. . ", -" .XXXXXXXXXXXXXXX.XXXXXXX.. ", -" .XXXXXXXXXXXXXXX.XXXX.. ", -" .XXXXXXXXXXXXXXX.XX.. ", -" . .XXXXXXXXXXXXXXX.. . . ", -" .XXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXX. ", -" . .XXXXXXXXXXXXXXX. . . ", -" .XXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXX. "}; diff --git a/etc/gnus/gnus-summary-followup-with-original-up.xbm b/etc/gnus/gnus-summary-followup-with-original-up.xbm deleted file mode 100644 index a0e6dfe..0000000 --- a/etc/gnus/gnus-summary-followup-with-original-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x04,0x40,0x10,0x00,0xa3,0x36,0xa6,0x76,0x54,0x40,0x11,0x02,0x01,0x2a,0x88, - 0x48,0x54,0x81,0x22,0x22,0x22,0x6a,0xaa,0x2a,0x4a,0x02,0x21,0xa0,0x90,0x50, - 0x8e,0x0a,0x02,0x0a,0x27,0x50,0xb2,0xa2,0xab,0x26,0x42,0xaa,0x00,0x92,0x94, - 0x00,0xaa,0x20,0x00,0xaa,0x00,0x85,0xb6,0x22,0x76,0x32,0x20,0xea,0x80,0x44, - 0x8a,0x98,0x2a,0x11,0x10,0x87,0x00,0x44,0xa6,0x71,0x6b,0x33,0x60,0xcc,0x22, - 0x44,0x1d,0xe3,0x0a,0x11,0xc8,0xe0,0x24,0x44,0x3e,0x90,0x6c,0x2b,0x08,0x00, - 0x09,0xa0,0x06,0x00,0x49,0x0a,0x04,0x00,0x92,0x50,0x0b,0x00,0x32,0x26,0x0c, - 0x00,0xa4,0x90,0x11,0x00,0x24,0x24,0x14,0x00,0xc8,0x82,0x22,0x00,0x48,0x32, - 0x2a,0x00,0x90,0x42,0x50,0x00,0x90,0x28}; diff --git a/etc/gnus/gnus-summary-followup-with-original-up.xpm b/etc/gnus/gnus-summary-followup-with-original-up.xpm deleted file mode 100644 index baffb6b..0000000 --- a/etc/gnus/gnus-summary-followup-with-original-up.xpm +++ /dev/null @@ -1,38 +0,0 @@ -/* XPM */ -static char * icon-followup-w-orig_xpm[] = { -"32 32 3 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -" ", -" . . . . . . . . ", -" ", -" ", -" ", -" . . . . . . . . ", -" ", -" .. ", -" ... ", -" . . . . .. . . . ", -" . ", -" ", -" ", -" . . . . . . . . ", -" .. ", -" ..XX. ", -" ..XXXX. ", -" . ..XXX...X. . . . ", -" ..XXX..XX..X. ", -" ..XXX..XXX...X. ", -" .XX..XXXXX...XX. ", -" . ...XXXXXX.XX.XX. . . . ", -" .XXXXXXXXXXXX.XX. ", -" .XXXXXXXXXXXXX.XX. ", -" .XXXXXXXXXXXXXX.XX. ", -" . .XXXXXXXXXXXXX.XX. . . ", -" .XXXXXXXXXXXXXX.XX. ", -" .XXXXXXXXXXXXX.XX. ", -" .XXXXXXXXXXXXXX.XX. ", -" . .XXXXXXXXXXXXX.XX. . . ", -" .XXXXXXXXXXXXXX.XX. ", -" .XXXXXXXXXXXXX.XX. "}; diff --git a/etc/gnus/gnus-summary-mail-copy-up.xbm b/etc/gnus/gnus-summary-mail-copy-up.xbm deleted file mode 100644 index a1eea6b..0000000 --- a/etc/gnus/gnus-summary-mail-copy-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x00,0x20,0x20,0x40,0xaa,0x8a,0x0a,0x15,0xfe,0xff,0xff,0x27,0x0e,0x00,0x80, - 0x4d,0x32,0x00,0x60,0x04,0xc2,0x00,0x18,0x54,0x02,0x03,0x06,0x04,0x03,0x8c, - 0x01,0x54,0x02,0x74,0x02,0x04,0x02,0x03,0x0c,0x54,0x82,0x00,0x10,0x84,0xf2, - 0xff,0xff,0x3f,0x52,0x00,0x00,0x6c,0x9b,0x01,0x00,0x23,0x16,0x06,0xc0,0x60, - 0x1e,0x18,0x30,0x20,0x14,0x60,0x0c,0xa0,0x11,0xa0,0x0b,0x20,0x14,0x10,0x30, - 0x60,0x11,0x0c,0x40,0x20,0x14,0x02,0x80,0xa0,0x12,0x01,0x00,0x23,0xd8,0x00, - 0x00,0x64,0x32,0x00,0x00,0x38,0xf8,0xff,0xff,0xbf,0x02,0x00,0x40,0x24,0x54, - 0x55,0x15,0x11,0x01,0x00,0x40,0x44,0x54,0x55,0x15,0x11,0x01,0x00,0x40,0x44, - 0x54,0x55,0x05,0x11,0x02,0x00,0x50,0x44}; diff --git a/etc/gnus/gnus-summary-mail-copy-up.xpm b/etc/gnus/gnus-summary-mail-copy-up.xpm deleted file mode 100644 index e73e6d5..0000000 --- a/etc/gnus/gnus-summary-mail-copy-up.xpm +++ /dev/null @@ -1,38 +0,0 @@ -/* XPM */ -static char * icon-mail-copy_xpm[] = { -"32 32 3 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -" ", -" ", -" .......................... ", -" ...XXXXXXXXXXXXXXXXXXX..X. ", -" .XX..XXXXXXXXXXXXXXX..XXX. ", -" .XXXX..XXXXXXXXXXX..XXXXX. ", -" .XXXXXX..XXXXXXX..XXXXXXX. ", -" .XXXXXXXX..XXX..XXXXXXXXX. ", -" .XXXXXXXX.X...XX.XXXXXXXX. ", -" .XXXXXX..XXXXXXXX..XXXXXX. ", -" .XXXXX.XXXXXXXXXXXX.XXXXX. ", -" .XX.......................... ", -" .XX.X.XXXXXXXXXXXXXXXXXXX..X. ", -" .X..XX..XXXXXXXXXXXXXXX..XXX. ", -" ..X.XXXX..XXXXXXXXXXX..XXXXX. ", -" ....XXXXXX..XXXXXXX..XXXXXXX. ", -" .XXXXXXXX..XXX..XXXXXXXXX. ", -" .XXXXXXXX.X...X.XXXXXXXXX. ", -" .XXXXXXX.XXXXXXX..XXXXXXX. ", -" .XXXXX..XXXXXXXXXX.XXXXXX. ", -" .XXXX.XXXXXXXXXXXXX.XXXXX. ", -" .XXX.XXXXXXXXXXXXXXX..XXX. ", -" .X..XXXXXXXXXXXXXXXXXX.XX. ", -" ..XXXXXXXXXXXXXXXXXXXXX... ", -" .......................... ", -" ", -" ", -" ", -" ", -" ", -" ", -" "}; diff --git a/etc/gnus/gnus-summary-mail-delete-up.xbm b/etc/gnus/gnus-summary-mail-delete-up.xbm deleted file mode 100644 index 9d1c637..0000000 --- a/etc/gnus/gnus-summary-mail-delete-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x08,0x00,0x80,0x00,0xa2,0xaa,0x2a,0x54,0x08,0x00,0x40,0x81,0xf2,0xab,0x2a, - 0x28,0x5c,0x03,0x80,0x82,0x2d,0x56,0xf5,0x28,0x84,0x06,0x98,0x8b,0x5d,0x5e, - 0xe7,0x2c,0x1c,0x1f,0x1f,0xba,0xf1,0xf3,0xa7,0xc9,0x44,0xa8,0x90,0x88,0xf1, - 0xf3,0x8b,0x08,0x1c,0x5f,0x7f,0x09,0xad,0x1e,0xff,0x08,0x04,0x46,0x08,0x04, - 0xae,0x26,0x06,0x04,0x18,0x8b,0x02,0x06,0xfa,0x23,0xc1,0x01,0x20,0x88,0x38, - 0x00,0x95,0x62,0x07,0x80,0x40,0xe4,0x00,0x40,0x14,0xd1,0x00,0x20,0x42,0x44, - 0x03,0x60,0x10,0x11,0x05,0x10,0x4a,0x44,0x1c,0xa8,0x00,0x11,0x61,0x0c,0x2a, - 0x42,0xa4,0x25,0x81,0x14,0x09,0x42,0x14,0x20,0x50,0x15,0xa1,0x4a,0x05,0x40, - 0x04,0x00,0xa8,0x0a,0x51,0x55,0x05,0x50}; diff --git a/etc/gnus/gnus-summary-mail-delete-up.xpm b/etc/gnus/gnus-summary-mail-delete-up.xpm deleted file mode 100644 index 932d8f2..0000000 --- a/etc/gnus/gnus-summary-mail-delete-up.xpm +++ /dev/null @@ -1,39 +0,0 @@ -/* XPM */ -static char * icon-mail-delete_xpm[] = { -"32 32 4 1", -" c #BEBEBEBEBEBE s backgroundToolBarColor", -"X c #000000000000", -"o c #E7E7E7E7E7E7", -"O c #FFFFFFFFFFFF", -" ", -" ", -" ", -" XXXXX ", -" XX XX ", -" XX XX XXX ", -" X X XXooXX X ", -" XX XXX XXooXX XX ", -" XX XXXXX XXXXX XOXXX ", -" XXXXX XXXXXX XOOXOOXX", -" XOX XOOOXOOOX", -" XXXXX XXXXXX XOOOXOOOO", -" XX XXXXX XXXXXX XOOXOOOO", -" XX XXX XXXXXXXOOOXOOOO", -" X X XOOOOOOXOOOOO", -" XX XX XOOOOOOOXOOOOO", -" XX XX XOOOOOOOXXOOOOO", -" XXXXX XOOOOOXXXOOOOOOO", -" XOOOXXXOOOOOOOOOO", -" XOXXXOOOOOOOOOOOOX", -" XXXOOOOOOOOOOOOOOX ", -" XXOOOOOOOOOOOOOX ", -" XXOOOOOOOOOOOX ", -" XOOOOOOOOOX ", -" XXOOOOOOX ", -" XXOOOX ", -" XXOX ", -" X ", -" ", -" ", -" ", -" "}; diff --git a/etc/gnus/gnus-summary-mail-forward-up.xbm b/etc/gnus/gnus-summary-mail-forward-up.xbm deleted file mode 100644 index 1b66f5b..0000000 --- a/etc/gnus/gnus-summary-mail-forward-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x10,0x42,0x80,0x20,0x84,0x10,0x2a,0x14,0x3a,0xa5,0x40,0x41,0x64,0x08,0x14, - 0x28,0xd6,0xa0,0x62,0x85,0x80,0x15,0xe8,0x20,0xca,0x41,0x39,0x8b,0xb0,0x2a, - 0x24,0x22,0xd2,0x86,0x12,0x86,0x58,0x24,0x11,0x2c,0xd2,0x8c,0x08,0x98,0x34, - 0x75,0x08,0x10,0x30,0x14,0x08,0x60,0x8a,0x0e,0x04,0x20,0x10,0x05,0xfc,0x7f, - 0x45,0x02,0x02,0x60,0x10,0x01,0x03,0x18,0xca,0xe0,0x01,0x44,0x20,0x3e,0x00, - 0x0a,0xf4,0x21,0x00,0x53,0x32,0x20,0x80,0x80,0x10,0x10,0x40,0x2a,0x2a,0x10, - 0xb0,0x80,0x60,0x10,0x28,0x2a,0xea,0x10,0x84,0x40,0x81,0x10,0x2a,0x14,0x94, - 0x11,0x41,0x21,0x21,0xca,0x2a,0x48,0x84,0xac,0x80,0x02,0x21,0x3d,0x54,0x50, - 0x14,0x84,0x00,0x05,0x42,0x21,0xaa,0x50}; diff --git a/etc/gnus/gnus-summary-mail-forward-up.xpm b/etc/gnus/gnus-summary-mail-forward-up.xpm deleted file mode 100644 index 19db803..0000000 --- a/etc/gnus/gnus-summary-mail-forward-up.xpm +++ /dev/null @@ -1,38 +0,0 @@ -/* XPM */ -static char * icon-mail-forward_xpm[] = { -"32 32 3 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -" ", -" ", -" ... ", -" . . ", -" . . . ", -" . ... ", -" ... ...XX. ", -" . . . .XX.XXX. ", -" . . . .XX.XXXX.. ", -" . . . .XXX.XXXXX.. ", -" . . . .XXX.XXXXXXX. ", -" .. . ..XXXX.XXXXXXXX. ", -" . . .XXXXXX.XXXXXXXXX. ", -" . .XXXXXX.XXXXXXXXXX. ", -" .XXXXXXX............. ", -" .XXXXXXX.XXXXXXXXXXX. ", -" .XXXXXXX..XXXXXXXXX.. ", -" ..XXXXX....XXXXXXXXX. ", -" .XXX.....XXXXXXXXXXX. ", -" ....XXXX.XXXXXXXXXX. ", -" ..XXXXXXX.XXXXXXXXX. ", -" .XXXXXXX.XXXXXXXXX. ", -" .XXXXXX.XXXXXXX.. ", -" ..XXXXX.XXXXXX. ", -" ..XXXX.XXXXX. ", -" .XXXX.XXXX. ", -" .XXX.XXX. ", -" .X.XX.. ", -" ..X. ", -" ... ", -" ", -" "}; diff --git a/etc/gnus/gnus-summary-mail-get-up.xbm b/etc/gnus/gnus-summary-mail-get-up.xbm deleted file mode 100644 index 0d0e212..0000000 --- a/etc/gnus/gnus-summary-mail-get-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x48,0x00,0x11,0x02,0x12,0x54,0x84,0x50,0x40,0x81,0x50,0x82,0x2a,0x28,0x0a, - 0x28,0x80,0x42,0xa0,0x82,0xaa,0x13,0x3d,0x28,0x40,0x46,0xd4,0x42,0xb5,0x28, - 0x86,0x10,0x50,0xda,0x51,0x47,0x99,0xb0,0x09,0x13,0x14,0x50,0x01,0x45,0x21, - 0x18,0x82,0x21,0x74,0x4c,0xc7,0x94,0x81,0x13,0x78,0x02,0x94,0x44,0x05,0x29, - 0xf1,0xff,0xff,0x7f,0x74,0x00,0x00,0x2c,0x91,0x01,0x00,0x23,0x14,0x06,0xc0, - 0xa0,0x11,0x18,0x30,0x20,0x14,0x60,0x0c,0x60,0x12,0x90,0x0b,0x20,0x18,0x0c, - 0x30,0xa0,0x12,0x02,0x40,0x20,0x18,0x01,0x80,0xa0,0xd2,0x00,0x00,0x23,0x38, - 0x00,0x00,0x64,0x12,0x00,0x00,0x38,0xf8,0xff,0xff,0xbf,0x02,0x00,0x00,0x20, - 0xa8,0xaa,0xaa,0x8a,0x05,0x00,0x40,0x20}; diff --git a/etc/gnus/gnus-summary-mail-get-up.xpm b/etc/gnus/gnus-summary-mail-get-up.xpm deleted file mode 100644 index ffdb84c..0000000 --- a/etc/gnus/gnus-summary-mail-get-up.xpm +++ /dev/null @@ -1,38 +0,0 @@ -/* XPM */ -static char * icon-mail-get_xpm[] = { -"32 32 3 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -" ", -" ", -" ", -" ", -" ", -" ... ... ", -" . . . . ", -" . . . . ", -" . . . . .. ", -" . .. .. .. ", -" .XXXXXXX. .XXXXXXX. ", -" .XXXXX. .XXXXX. ", -" ..XXX.. ..XXX.. ", -" ... ... ", -" ", -" .......................... ", -" ...XXXXXXXXXXXXXXXXXXX..X. ", -" .XX..XXXXXXXXXXXXXXX..XXX. ", -" .XXXX..XXXXXXXXXXX..XXXXX. ", -" .XXXXXX..XXXXXXX..XXXXXXX. ", -" .XXXXXXXX..XXX..XXXXXXXXX. ", -" .XXXXXXX.XX...X.XXXXXXXXX. ", -" .XXXXX..XXXXXXXX..XXXXXXX. ", -" .XXXX.XXXXXXXXXXXX.XXXXXX. ", -" .XXX.XXXXXXXXXXXXXX.XXXXX. ", -" .X..XXXXXXXXXXXXXXXX..XXX. ", -" ..XXXXXXXXXXXXXXXXXXXX.XX. ", -" .XXXXXXXXXXXXXXXXXXXXXX... ", -" .......................... ", -" ", -" ", -" "}; diff --git a/etc/gnus/gnus-summary-mail-originate-up.xbm b/etc/gnus/gnus-summary-mail-originate-up.xbm deleted file mode 100644 index 6d25e12..0000000 --- a/etc/gnus/gnus-summary-mail-originate-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x04,0x42,0x08,0x10,0xa1,0x10,0x42,0x05,0x14,0xa2,0xff,0xaf,0x01,0x89,0x00, - 0x14,0x54,0xa4,0x00,0x64,0x02,0xc1,0x00,0x3c,0xf8,0xff,0x1f,0xa0,0x6d,0x10, - 0x68,0x20,0xf8,0xff,0x1f,0x60,0x12,0x84,0x00,0x20,0x48,0xd1,0x00,0xa0,0x02, - 0x88,0xfc,0x21,0xfc,0xff,0x00,0x60,0x1e,0x80,0x6c,0x21,0x64,0x80,0x00,0xa0, - 0x86,0x81,0x00,0x20,0x04,0x86,0x00,0x60,0x05,0x98,0x00,0x20,0x04,0xe4,0x00, - 0xa0,0x06,0x83,0x80,0x25,0x84,0x80,0x00,0x60,0x46,0x80,0x00,0x20,0x34,0x80, - 0x00,0xa0,0x0d,0x80,0xff,0x3f,0x04,0x00,0x00,0x2e,0xfe,0xff,0xff,0x4f,0x48, - 0x92,0x44,0x12,0x92,0x08,0x11,0x44,0x00,0x21,0x44,0x11,0x55,0x48,0x21,0x44, - 0x80,0x02,0x8a,0x10,0x2a,0xa8,0x40,0x44}; diff --git a/etc/gnus/gnus-summary-mail-originate-up.xpm b/etc/gnus/gnus-summary-mail-originate-up.xpm deleted file mode 100644 index 8ba8bc2..0000000 --- a/etc/gnus/gnus-summary-mail-originate-up.xpm +++ /dev/null @@ -1,38 +0,0 @@ -/* XPM */ -static char * icon-mail-originate_xpm[] = { -"32 32 3 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -" ", -" ", -" ............. ", -" .XXXXXXXXXX.X. ", -" .XXXXXXXXXX.XX. ", -" .XXXXXXXXXX.... ", -" ..................XXXXXXXX. ", -" .X. X X X X X X .X..XXXXXX. ", -" ..................XXXXXXXX. ", -" .XXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXX. ", -" .XX.......XXXX. ", -" ..............XXXXXXXXXXXXX. ", -" ...XXXXXXXXXX.XX..X..X.XXXX. ", -" .XX..XXXXXXXX.XXXXXXXXXXXXX. ", -" .XXXX..XXXXXX.XXXXXXXXXXXXX. ", -" .XXXXXX..XXXX.XXXXXXXXXXXXX. ", -" .XXXXXXXX..XX.XXXXXXXXXXXXX. ", -" .XXXXXXX.XX...XXXXXXXXXXXXX. ", -" .XXXXX..XXXXX.XXXXXXX..X.XX. ", -" .XXXX.XXXXXXX.XXXXXXXXXXXXX. ", -" .XXX.XXXXXXXX.XXXXXXXXXXXXX. ", -" .X..XXXXXXXXX.XXXXXXXXXXXXX. ", -" ..XXXXXXXXXXX............... ", -" .XXXXXXXXXXXXXXXXXXXXXX... ", -" .......................... ", -" ", -" ", -" ", -" ", -" ", -" "}; diff --git a/etc/gnus/gnus-summary-mail-reply-up.xbm b/etc/gnus/gnus-summary-mail-reply-up.xbm deleted file mode 100644 index e16ec66..0000000 --- a/etc/gnus/gnus-summary-mail-reply-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x00,0x40,0x40,0x20,0xaa,0x2a,0x7a,0x0a,0x00,0x80,0x88,0x51,0xaa,0x2a,0x06, - 0x06,0x00,0xc0,0x05,0x58,0xaa,0x3a,0x12,0x08,0x00,0x0c,0x11,0x2c,0xaa,0x03, - 0x09,0x42,0xc0,0x80,0x04,0x06,0x35,0x40,0x04,0x57,0x98,0x49,0x80,0x18,0x3a, - 0x20,0x41,0x56,0xc8,0x10,0xc1,0x11,0x0c,0x93,0x60,0x50,0x0a,0x1c,0x18,0x90, - 0x08,0x30,0x06,0x30,0x0a,0xc8,0x05,0x90,0x08,0x06,0x18,0x30,0x0a,0x01,0x20, - 0x10,0x88,0x00,0x40,0x50,0x6a,0x00,0x80,0x11,0x19,0x00,0x00,0x52,0x0c,0x00, - 0x00,0x1c,0xf9,0xff,0xff,0x5f,0x44,0x44,0x44,0x24,0x11,0x11,0x11,0x09,0x44, - 0x44,0x44,0xa0,0x11,0x11,0x11,0x15,0x44,0x44,0x44,0x40,0x11,0x11,0x91,0x14, - 0x44,0x44,0x04,0xa2,0x11,0x22,0xa2,0x08}; diff --git a/etc/gnus/gnus-summary-mail-reply-up.xpm b/etc/gnus/gnus-summary-mail-reply-up.xpm deleted file mode 100644 index 20fe672..0000000 --- a/etc/gnus/gnus-summary-mail-reply-up.xpm +++ /dev/null @@ -1,38 +0,0 @@ -/* XPM */ -static char * icon-mail-reply_xpm[] = { -"32 32 3 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -" ", -" ... ", -" .XXX.. ", -" .XXXXXX.. ", -" ... .XXXXXXXX. ", -" ..XXX.XX.XXXXXX. ", -" ..XXXX.XXX.XXXXX. ", -" ..XXXXXX.XX.XXXXX. ", -" ..XXXXXXX.XX.XXXXXX. ", -" .XXXXXXXX.XXX.XXXXX... ", -" ..XX..XX.XX.XXXXXXXX.XXX.. ", -" ...XXXXXXX.XX.XXXXX.XX..X. ", -" .XX..XXXX.XXX.XXXXX...XXX. ", -" .XXXX..XX.XX.XXXXX..XXXXX. ", -" .XXXXXX...XXXXXX..XXXXXXX. ", -" .XXXXXXXX..XXX..XXXXXXXXX. ", -" .XXXXXXX.XX...X.XXXXXXXXX. ", -" .XXXXX..XXXXXXXX..XXXXXXX. ", -" .XXXX.XXXXXXXXXXXX.XXXXXX. ", -" .XXX.XXXXXXXXXXXXXX.XXXXX. ", -" .X..XXXXXXXXXXXXXXXX..XXX. ", -" ..XXXXXXXXXXXXXXXXXXXX.XX. ", -" .XXXXXXXXXXXXXXXXXXXXXX... ", -" .......................... ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" "}; diff --git a/etc/gnus/gnus-summary-mail-save-up.xbm b/etc/gnus/gnus-summary-mail-save-up.xbm deleted file mode 100644 index 0601dfb..0000000 --- a/etc/gnus/gnus-summary-mail-save-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x00,0x10,0x10,0x00,0x55,0x45,0x45,0x55,0x00,0x10,0x08,0x00,0xd4,0xff,0xff, - 0x7f,0x82,0x03,0x00,0xf0,0xd0,0x0c,0x00,0x4c,0x82,0x30,0x00,0x43,0xd4,0xc0, - 0xc0,0x40,0x80,0x80,0x33,0xc0,0xaa,0x60,0xcc,0x40,0xc0,0x10,0x00,0x41,0x95, - 0x08,0x00,0x46,0xc0,0x06,0x00,0xd8,0xfe,0xff,0x0f,0x60,0x2c,0x00,0x0b,0x40, - 0x35,0x10,0xfd,0x7f,0x2c,0x02,0x2b,0x49,0x35,0x40,0x4d,0x12,0xac,0x00,0x0b, - 0xa0,0x35,0x00,0xad,0x0a,0x2c,0x24,0x09,0x90,0x2d,0x00,0x5d,0x25,0xf4,0xff, - 0x0b,0x80,0xa6,0x55,0xad,0x2a,0x4c,0xaa,0x08,0x40,0xf5,0xff,0x5d,0x15,0x6c, - 0x35,0x0b,0x20,0x66,0x37,0xab,0x4a,0x6c,0x2d,0x0d,0x00,0xb9,0x35,0x4b,0x55, - 0xf4,0xff,0x1f,0x80,0x01,0x40,0x80,0x2a}; diff --git a/etc/gnus/gnus-summary-mail-save-up.xpm b/etc/gnus/gnus-summary-mail-save-up.xpm deleted file mode 100644 index fd4824b..0000000 --- a/etc/gnus/gnus-summary-mail-save-up.xpm +++ /dev/null @@ -1,41 +0,0 @@ -/* XPM */ -static char * icon-save-mail_xpm[] = { -"32 32 6 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -"o c #999999999999", -"O c #E5E5E5E5E5E5", -"+ c #666666666666", -" ", -" ", -" ", -" ........................ ", -" ...XXXXXXXXXXXXXXXXXX... ", -" .XX..XXXXXXXXXXXXXX..XX. ", -" .XXXX..XXXXXXXXXX..XXXX. ", -" .XXXXXX..XXXXXX..XXXXXX. ", -" .XXXXXXX...XX..XXXXXXXX. ", -" .XXXXX..XXX..XX..XXXXXX. ", -" .XXXX.XXXXXXXXXXX.XXXXX. ", -" .XXX.XXXXXXXXXXXXX..XXX. ", -" .X..XXXXXXXXXXXXXXXX..X. ", -" ..................XXXXXXXXX.. ", -" .oo.OOOOOOOOOO.oo.XXXXXXXXXX. ", -" .oo.OOOOOOOOOO.oo............ ", -" .oo.OOOOOOOOOO.oo. ", -" .oo.OOOOOOOOOO.oo. ", -" .oo.OOOOOOOOOO.oo. ", -" .oo.OOOOOOOOOO.oo. ", -" .oo.OOOOOOOOOO.oo. ", -" .oo.OOOOOOOOOO.oo. ", -" .oo............oo. ", -" .oooooooooooooooo. ", -" .oooooooooooooooo. ", -" .oo............oo. ", -" .oo.+++++++.OO.oo. ", -" .oo.+++++++.OO.oo. ", -" .oo.+++++++.OO.oo. ", -" .o.+++++++.OO.oo. ", -" ................ ", -" "}; diff --git a/etc/gnus/gnus-summary-next-unread-up.xbm b/etc/gnus/gnus-summary-next-unread-up.xbm deleted file mode 100644 index a6c17a9..0000000 --- a/etc/gnus/gnus-summary-next-unread-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x08,0x10,0x20,0x00,0xa3,0x66,0xab,0x76,0x14,0x11,0x04,0x02,0x41,0x04,0xa1, - 0x48,0x14,0x51,0x1e,0x22,0x62,0xa6,0xa9,0x2a,0x0a,0x71,0x18,0xa0,0x40,0x18, - 0xb6,0x0a,0x8a,0x06,0x17,0x50,0xb2,0x01,0x63,0x27,0x62,0x80,0x20,0x90,0x50, - 0x00,0x40,0x25,0x4a,0x00,0x40,0x80,0xe2,0x00,0x80,0x36,0x12,0xe1,0x80,0x41, - 0x84,0x9a,0x00,0x29,0x10,0x87,0x01,0x85,0xa6,0x61,0x01,0x32,0x62,0x70,0x01, - 0x42,0x18,0x30,0x02,0x14,0x06,0x08,0x02,0x4c,0x06,0x00,0x02,0x28,0x04,0x00, - 0x04,0xac,0xca,0x07,0x7c,0x0b,0x68,0x0d,0xea,0x20,0x1b,0x12,0x93,0x6b,0xb4, - 0x54,0x29,0x03,0x91,0xba,0x95,0x51,0x74,0x19,0x53,0x0b,0x6a,0x0a,0xd6,0x62, - 0xe0,0x07,0x7c,0x09,0x8a,0x00,0x80,0x42}; diff --git a/etc/gnus/gnus-summary-next-unread-up.xpm b/etc/gnus/gnus-summary-next-unread-up.xpm deleted file mode 100644 index e525816..0000000 --- a/etc/gnus/gnus-summary-next-unread-up.xpm +++ /dev/null @@ -1,39 +0,0 @@ -/* XPM */ -static char * icon-next-unread_xpm[] = { -"32 32 4 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -"o c #999999999999", -" ", -" . . . . . . . . ", -" ", -" ", -" ... ", -" . . . . ..XX. . . . ", -" ..XXXX.. ", -" ..XXXX..X. ", -" ..XXXXX...X. ", -" . . ..XXXXXXX..XXX. . . ", -" ..XXXXXXXX.XXXXX. ", -" .XXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXX. ", -" . . .XXXXXXXXXXXXXXX. . . ", -" .XXXX...XXXXXXX. ", -" .X..XX.XXXXXXXX. ", -" ..XXXX..XXXXXXX. ", -" . ..XXXX..X.XXXXXXXX. . ", -" ..XXXXX...X.XXXXXXXX. ", -" ..XXXXXXX..XXX.XXXXXXXX. ", -" .XXXXXXXX.XXXXX.XXXXXXXX. ", -" ..XXXXXXXXXXXXXX.XXXXXXXXX. . ", -" .XXXXXXXXXXXXXXX.XXXXXXX.. ", -" .XX.....XXXXXXX.....X.. ", -" .X.ooooo.XXXXX.oooo.. ", -" . .oXooooo.XXX.oXooooo.. . ", -" .ooooooo.X.X.ooooooo. ", -" .ooooooo..X..ooooooo. ", -" ..oooooo.XXX.ooooooo. ", -" . ..oooo.XXXXX.oooo.. . . ", -" .....XXXXXXX..... ", -" .XXXXXXXXXXXXXXX. "}; diff --git a/etc/gnus/gnus-summary-post-news-up.xbm b/etc/gnus/gnus-summary-post-news-up.xbm deleted file mode 100644 index 8eb4c33..0000000 --- a/etc/gnus/gnus-summary-post-news-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x00,0x10,0x10,0x01,0x6b,0xa7,0x66,0x72,0x04,0x10,0x02,0x05,0xa1,0x8a,0x50, - 0x48,0x04,0x20,0x8f,0x20,0x72,0xab,0x39,0x2b,0x02,0x64,0x58,0xa4,0x50,0x19, - 0x16,0x01,0x0a,0x06,0x57,0x54,0xe2,0x01,0x23,0x23,0x72,0x80,0x20,0x94,0x44, - 0x00,0x40,0x01,0x50,0x00,0xc0,0x54,0xa6,0x00,0x80,0x22,0x92,0x00,0x80,0x4a, - 0x40,0x01,0x00,0x11,0x8a,0x01,0x00,0x45,0x32,0x02,0x00,0x2a,0x42,0x02,0x00, - 0xa2,0x10,0x05,0x00,0x0c,0x4a,0x06,0x00,0x24,0x22,0x0a,0x00,0x68,0xaa,0x0c, - 0x00,0x0c,0x00,0x11,0x80,0x53,0x2a,0x14,0x40,0x05,0x22,0x23,0x70,0x62,0x92, - 0x34,0x0e,0x09,0x24,0xc0,0x4b,0x52,0x80,0x0a,0x21,0x80,0x6b,0x62,0xaa,0x36, - 0x04,0x15,0x01,0x42,0x51,0x80,0xa8,0x28}; diff --git a/etc/gnus/gnus-summary-post-news-up.xpm b/etc/gnus/gnus-summary-post-news-up.xpm deleted file mode 100644 index 46be7c1..0000000 --- a/etc/gnus/gnus-summary-post-news-up.xpm +++ /dev/null @@ -1,38 +0,0 @@ -/* XPM */ -static char * icon-post_xpm[] = { -"32 32 3 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -" ", -" . . . . . . . . ", -" ", -" ", -" ... ", -" . . . . ..XX. . . . ", -" ..XXXX.. ", -" ..XXXX..X. ", -" ..XXXXX...X. ", -" . . ..XXXXXXX..XXX. . . ", -" ..XXXXXXXX.XXXXX. ", -" .XXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXX. ", -" . . .XXXXXXXXXXXXXXX. . . ", -" .XXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXX. ", -" . . .XXXXXXXXXXXXXXX. . ", -" .XXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXX. ", -" . . . .XXXXXXXXXXXXXXX. . ", -" .XXXXXXXXXXXXXX.. ", -" .XXXXXXXXXX... ", -" .XXXXXXXXX. ", -" . . . .XXXXXX.. . . ", -" .XXX... ", -" .... ", -" ", -" . . . . . . . . ", -" ", -" "}; diff --git a/etc/gnus/gnus-summary-prev-unread-up.xbm b/etc/gnus/gnus-summary-prev-unread-up.xbm deleted file mode 100644 index 6cf240e..0000000 --- a/etc/gnus/gnus-summary-prev-unread-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x08,0x08,0x40,0x20,0x23,0x63,0x2b,0x2b,0x54,0x14,0x24,0xa4,0x01,0x02,0x09, - 0x01,0x54,0xa9,0x2e,0x2a,0x22,0xa2,0xa9,0x62,0x4a,0x6a,0x18,0x12,0x90,0x18, - 0xb6,0x04,0x02,0x06,0x17,0x50,0xea,0x01,0x63,0x2b,0x64,0x80,0x20,0x44,0x51, - 0x00,0x40,0x21,0x44,0x00,0x40,0x8a,0xe2,0x00,0xc0,0x22,0x0a,0xe1,0xc0,0x2f, - 0xd0,0x9f,0x20,0x4d,0x42,0x87,0xb1,0x1a,0xea,0x61,0x15,0x72,0x60,0x70,0xbb, - 0x14,0x1d,0x30,0xb1,0x5a,0x04,0x08,0x22,0x0d,0x06,0x00,0xc2,0x6f,0x06,0x00, - 0x84,0x20,0x08,0x00,0x64,0x0a,0x0a,0x00,0x58,0x50,0x12,0x00,0x10,0x27,0x1a, - 0x00,0x50,0x90,0x20,0x00,0xa0,0x24,0x32,0x00,0x20,0x82,0x26,0x00,0xc0,0x32, - 0x40,0x00,0x40,0x44,0xaa,0x00,0x80,0x11}; diff --git a/etc/gnus/gnus-summary-prev-unread-up.xpm b/etc/gnus/gnus-summary-prev-unread-up.xpm deleted file mode 100644 index b2088fb..0000000 --- a/etc/gnus/gnus-summary-prev-unread-up.xpm +++ /dev/null @@ -1,39 +0,0 @@ -/* XPM */ -static char * icon-prev-unread_xpm[] = { -"32 32 4 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -"o c #999999999999", -" ", -" . . . . . . . . ", -" ", -" ", -" ... ", -" . . . . ..XX. . . . ", -" ..XXXX.. ", -" ..XXXX..X. ", -" ..XXXXX...X. ", -" . . ..XXXXXXX..XXX. . . ", -" ..XXXXXXXX.XXXXX. ", -" .XXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXX. ", -" . . .XXXXXXXXXXXXXX. . . ", -" .XXXX...XXXXXX..... ", -" ...o..XX.XXXXX.oooo.. ", -" .oo..XXXX..XXX.oXooooo. ", -" . .o..XXXX..X.X.X.ooooooo.. ", -" ..XXXXX...X..X..ooooooo. ", -" ..XXXXXXX..XX.XXX.ooooooo. ", -" .XXXXXXXX.XXXXX.XXX.oooo.. ", -" ..XXXXXXXXXXXXXX.XXXX..... . ", -" .XXXXXXXXXXXXXXX.XXXX. ", -" .XXXXXXXXXXXXXX.XX.. ", -" .XXXXXXXXXXXXXXX.. ", -" . .XXXXXXXXXXXXXXX. . . ", -" .XXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXX. ", -" . .XXXXXXXXXXXXXXXX. . . ", -" .XXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXX. "}; diff --git a/etc/gnus/gnus-summary-reply-up.xbm b/etc/gnus/gnus-summary-reply-up.xbm deleted file mode 100644 index 61dad9a..0000000 --- a/etc/gnus/gnus-summary-reply-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x10,0x00,0x11,0x88,0x45,0x55,0x84,0x22,0x08,0x80,0x10,0x88,0x42,0x55,0xa4, - 0x22,0x28,0x00,0x01,0x84,0x05,0x55,0x5a,0x21,0x50,0x00,0x35,0x8a,0x09,0xf5, - 0xc2,0x20,0x24,0x18,0x81,0x85,0x01,0x87,0x00,0x2a,0xd4,0x41,0x00,0x43,0x61, - 0x40,0x80,0x17,0x1c,0x20,0x80,0x58,0xb5,0x1a,0xc0,0x3f,0x0c,0x08,0x60,0xb0, - 0x75,0x08,0xb0,0x2e,0x84,0x04,0xb8,0xa1,0x06,0x03,0x4c,0x20,0x04,0x0c,0x36, - 0x60,0x06,0x10,0x0f,0x20,0x06,0x70,0x07,0x60,0x05,0xc8,0x09,0xa0,0x04,0x04, - 0x10,0xa0,0x06,0x02,0x20,0x60,0x85,0x01,0xc0,0xa0,0x44,0x00,0x00,0x61,0x25, - 0x00,0x00,0x22,0x1e,0x00,0x00,0xbc,0x0e,0x00,0x00,0x70,0xfd,0xff,0xff,0x3f, - 0x94,0x52,0x55,0x55,0x4a,0x29,0x22,0xa2}; diff --git a/etc/gnus/gnus-summary-reply-up.xpm b/etc/gnus/gnus-summary-reply-up.xpm deleted file mode 100644 index 255f7a1..0000000 --- a/etc/gnus/gnus-summary-reply-up.xpm +++ /dev/null @@ -1,39 +0,0 @@ -/* XPM */ -static char * icon-follow-up_xpm[] = { -"32 32 4 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -"o c #999999999999", -" ", -" ", -" ", -" ", -" ", -" . ", -" .X.. ", -" ... .XXXX. ", -" ..XXX.XXXXXX.. ", -" ..XXXX.XXXXXXXXX. ", -" ..XXXXX.XXXXXXXXX.. ", -" ..XXXXXXX.XXXXXXXX.... ", -" ..XXXXXXXX.XXXXXXXXX.oXX.. ", -" .X..X.X.X..XXXXXXXXX..o...o. ", -" ..XXXXXXX.XXXXXXXXX..ooXXX.. ", -" .X...XXXX.XXXXXXXX..ooX...X. ", -" .XXXX.XX.XXXXXXXX..oX..XXXX. ", -" .XXXXX..XXXXXXXX..oX.XXXXXX. ", -" .XXXXXXX..XXXXX..X..XXXXXXX. ", -"oo.XXXXXXXXX.XXX....XXXXXXXXX.oo", -"oo.XXXXXXXXX...X...XXXXXXXXXX.oo", -"oo.XXXXXXXX.XX...XX.XXXXXXXXX.oo", -"oo.XXXXXXX.XXXXXXXXX.XXXXXXXX.oo", -"oo.XXXXXX.XXXXXXXXXXX.XXXXXXX.oo", -"oo.XXXX..XXXXXXXXXXXXX..XXXXX.oo", -"oo.XXX.XXXXXXXXXXXXXXXXX.XXXX.oo", -"oo.XX.XXXXXXXXXXXXXXXXXXX.XXX.oo", -"oo...XXXXXXXXXXXXXXXXXXXXX....oo", -"oo..XXXXXXXXXXXXXXXXXXXXXXXX..oo", -"oo............................oo", -"oooooooooooooooooooooooooooooooo", -"oooooooooooooooooooooooooooooooo"}; diff --git a/etc/gnus/gnus-summary-reply-with-original-up.xbm b/etc/gnus/gnus-summary-reply-with-original-up.xbm deleted file mode 100644 index 37b0d73..0000000 --- a/etc/gnus/gnus-summary-reply-with-original-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x00,0x08,0x00,0x20,0xaa,0x82,0xaa,0x4a,0x00,0x54,0x00,0x00,0xaa,0x02,0x54, - 0x55,0x00,0xa8,0x07,0x00,0x54,0x85,0x5a,0x55,0x02,0x50,0x32,0x80,0x50,0x25, - 0xc2,0x2a,0x02,0x18,0x81,0x41,0x54,0x17,0x01,0x17,0x80,0x09,0xc1,0x23,0x75, - 0x04,0x3d,0x4f,0x18,0xc3,0x83,0x18,0x85,0x40,0xc0,0x61,0x4c,0x7c,0x60,0x30, - 0xf6,0x23,0xb0,0x6e,0x84,0x20,0x98,0x21,0x05,0x13,0x5c,0x20,0x04,0x1c,0x36, - 0x60,0x06,0x30,0x0f,0x60,0x06,0x70,0x07,0xa0,0x05,0xc8,0x09,0x20,0x06,0x04, - 0x10,0x60,0x04,0x02,0x20,0xa0,0x85,0x01,0xc0,0x20,0x46,0x00,0x00,0xa1,0x24, - 0x00,0x00,0x62,0x1e,0x00,0x00,0x7c,0x0d,0x00,0x00,0xb0,0xfc,0xff,0xff,0x3f, - 0x55,0x55,0x4a,0x55,0x24,0x89,0x52,0xa2}; diff --git a/etc/gnus/gnus-summary-reply-with-original-up.xpm b/etc/gnus/gnus-summary-reply-with-original-up.xpm deleted file mode 100644 index 1135bfa..0000000 --- a/etc/gnus/gnus-summary-reply-with-original-up.xpm +++ /dev/null @@ -1,39 +0,0 @@ -/* XPM */ -static char * icon-follow-up-incl_xpm[] = { -"32 32 4 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -"o c #999999999999", -" ", -" ", -" ", -" ", -" ... ", -" .X.X. ", -" .XX.XX.. ", -" .XXX.XXXX. ", -" ..XXX.XXXXXX.. ", -" ..X.XXX.XXXXXXX.. ", -" ..XX.XXXX.XXXXX.... ", -" ..XXX.XXXXX.X....XX... ", -" ..XXX..XXXX....XXXXX.oXX.. ", -" .XXXX.XXXXXX.XXXXXXX..oXXXo. ", -" ..XX.XXX.....XXXXXX..ooXXX.. ", -" .X......XXX.XXXXXX..ooX...X. ", -" .XXXX.XXXXX.XXXXX..oX..XXXX. ", -" .XXXXX..XX.XXXXX..oX.XXXXXX. ", -" .XXXXXXX...XXXX..X..XXXXXXX. ", -"oo.XXXXXXXXX..XX....XXXXXXXXX.oo", -"oo.XXXXXXXXX...X...XXXXXXXXXX.oo", -"oo.XXXXXXXX.XX...XX.XXXXXXXXX.oo", -"oo.XXXXXXX.XXXXXXXXX.XXXXXXXX.oo", -"oo.XXXXXX.XXXXXXXXXXX.XXXXXXX.oo", -"oo.XXXX..XXXXXXXXXXXXX..XXXXX.oo", -"oo.XXX.XXXXXXXXXXXXXXXXX.XXXX.oo", -"oo.XX.XXXXXXXXXXXXXXXXXXX.XXX.oo", -"oo...XXXXXXXXXXXXXXXXXXXXX....oo", -"oo..XXXXXXXXXXXXXXXXXXXXXXXX..oo", -"oo............................oo", -"oooooooooooooooooooooooooooooooo", -"oooooooooooooooooooooooooooooooo"}; diff --git a/etc/gnus/gnus-summary-save-article-file-up.xbm b/etc/gnus/gnus-summary-save-article-file-up.xbm deleted file mode 100644 index a14e003..0000000 --- a/etc/gnus/gnus-summary-save-article-file-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x20,0x08,0x08,0x82,0x8a,0x82,0xa2,0x20,0x20,0x14,0x04,0x15,0x14,0xfd,0xff, - 0x43,0x42,0x04,0x00,0x0d,0x10,0x05,0x00,0x49,0x22,0x06,0x00,0x31,0x88,0x04, - 0x00,0x1f,0x22,0x06,0x00,0x50,0x88,0x04,0x00,0x10,0x22,0x04,0x00,0xb0,0x88, - 0x06,0x00,0x10,0x22,0x04,0x00,0x50,0xfc,0xff,0x0f,0x10,0x36,0x00,0x0b,0xb0, - 0x2c,0x02,0x0d,0x10,0x34,0x10,0x0b,0x50,0x2d,0x00,0x0b,0x10,0x34,0x41,0x0d, - 0xb0,0x2d,0x08,0x09,0x10,0x34,0x00,0x0b,0x50,0x2d,0x01,0x0d,0x10,0xf4,0xff, - 0x0b,0xb0,0xad,0xda,0x0a,0x10,0x44,0x22,0x0d,0x50,0xf6,0xff,0xf9,0x1f,0x6c, - 0x3b,0x4b,0x52,0xb5,0x2d,0x1d,0x08,0x6c,0x35,0x4b,0xa1,0x6a,0x3b,0x29,0x14, - 0xf8,0xff,0x8f,0x40,0x02,0x40,0x2a,0x15}; diff --git a/etc/gnus/gnus-summary-save-article-file-up.xpm b/etc/gnus/gnus-summary-save-article-file-up.xpm deleted file mode 100644 index ea30122..0000000 --- a/etc/gnus/gnus-summary-save-article-file-up.xpm +++ /dev/null @@ -1,41 +0,0 @@ -/* XPM */ -static char * icon-save-text_xpm[] = { -"32 32 6 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -"o c #999999999999", -"O c #E5E5E5E5E5E5", -"+ c #666666666666", -" ", -" ", -" ", -" ................ ", -" .XXXXXXXXXXXXX.X. ", -" .XXXXXXXXXXXXX.XX. ", -" .XXXXXXXXXXXXX.XXX. ", -" .XXXXXXXXXXXXX..... ", -" .XXXXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXXXX. ", -" ..................XXXXXXXX. ", -" .oo.OOOOOOOOOO.oo.XXXXXXXX. ", -" .oo.OOOOOOOOOO.oo.XXXXXXXX. ", -" .oo.OOOOOOOOOO.oo.XXXXXXXX. ", -" .oo.OOOOOOOOOO.oo.XXXXXXXX. ", -" .oo.OOOOOOOOOO.oo.XXXXXXXX. ", -" .oo.OOOOOOOOOO.oo.XXXXXXXX. ", -" .oo.OOOOOOOOOO.oo.XXXXXXXX. ", -" .oo.OOOOOOOOOO.oo.XXXXXXXX. ", -" .oo............oo.XXXXXXXX. ", -" .oooooooooooooooo.XXXXXXXX. ", -" .oooooooooooooooo.XXXXXXXX. ", -" .oo............oo.......... ", -" .oo.+++++++.OO.oo. ", -" .oo.+++++++.OO.oo. ", -" .oo.+++++++.OO.oo. ", -" .o.+++++++.OO.oo. ", -" ................ ", -" "}; diff --git a/etc/gnus/gnus-summary-save-article-up.xbm b/etc/gnus/gnus-summary-save-article-up.xbm deleted file mode 100644 index 94e51d1..0000000 --- a/etc/gnus/gnus-summary-save-article-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x10,0x81,0x04,0x01,0x45,0x28,0x40,0x50,0x88,0x42,0x15,0x05,0xa2,0xff,0xff, - 0x7f,0x88,0x03,0x00,0xf0,0xa2,0x0c,0x00,0x4c,0x88,0x30,0x00,0x43,0xc5,0xc0, - 0xc0,0x40,0x90,0x80,0x33,0xc0,0xa4,0x60,0xcc,0x40,0x82,0x10,0x00,0x41,0xd0, - 0x08,0x00,0x46,0x82,0x06,0x00,0xd8,0xfc,0xff,0x0f,0x60,0x2e,0x00,0x0d,0x40, - 0x34,0x02,0xfb,0x7f,0x36,0x10,0x0d,0x91,0xac,0x00,0x4b,0x24,0x34,0x00,0x2d, - 0x81,0x2d,0x48,0x4b,0x28,0x34,0x02,0x0d,0x85,0x2d,0x00,0xab,0x20,0xf4,0xff, - 0x0d,0x8a,0xa6,0xaa,0xaa,0x20,0x4c,0x55,0x0a,0x85,0xf5,0xff,0x5b,0x20,0x6c, - 0x35,0x8d,0x8a,0xad,0x36,0x2b,0x20,0xf4,0x2a,0x89,0x8a,0x6a,0x3b,0x5d,0x20, - 0xf8,0xff,0x0f,0x85,0x02,0x40,0xa2,0x20}; diff --git a/etc/gnus/gnus-summary-save-article-up.xpm b/etc/gnus/gnus-summary-save-article-up.xpm deleted file mode 100644 index fd4824b..0000000 --- a/etc/gnus/gnus-summary-save-article-up.xpm +++ /dev/null @@ -1,41 +0,0 @@ -/* XPM */ -static char * icon-save-mail_xpm[] = { -"32 32 6 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -"o c #999999999999", -"O c #E5E5E5E5E5E5", -"+ c #666666666666", -" ", -" ", -" ", -" ........................ ", -" ...XXXXXXXXXXXXXXXXXX... ", -" .XX..XXXXXXXXXXXXXX..XX. ", -" .XXXX..XXXXXXXXXX..XXXX. ", -" .XXXXXX..XXXXXX..XXXXXX. ", -" .XXXXXXX...XX..XXXXXXXX. ", -" .XXXXX..XXX..XX..XXXXXX. ", -" .XXXX.XXXXXXXXXXX.XXXXX. ", -" .XXX.XXXXXXXXXXXXX..XXX. ", -" .X..XXXXXXXXXXXXXXXX..X. ", -" ..................XXXXXXXXX.. ", -" .oo.OOOOOOOOOO.oo.XXXXXXXXXX. ", -" .oo.OOOOOOOOOO.oo............ ", -" .oo.OOOOOOOOOO.oo. ", -" .oo.OOOOOOOOOO.oo. ", -" .oo.OOOOOOOOOO.oo. ", -" .oo.OOOOOOOOOO.oo. ", -" .oo.OOOOOOOOOO.oo. ", -" .oo.OOOOOOOOOO.oo. ", -" .oo............oo. ", -" .oooooooooooooooo. ", -" .oooooooooooooooo. ", -" .oo............oo. ", -" .oo.+++++++.OO.oo. ", -" .oo.+++++++.OO.oo. ", -" .oo.+++++++.OO.oo. ", -" .o.+++++++.OO.oo. ", -" ................ ", -" "}; diff --git a/etc/gnus/gnus-uu-decode-uu-up.xbm b/etc/gnus/gnus-uu-decode-uu-up.xbm deleted file mode 100644 index 705eb76..0000000 --- a/etc/gnus/gnus-uu-decode-uu-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x00,0x08,0x10,0x01,0xaa,0x42,0x45,0x54,0x00,0x14,0x10,0x01,0x55,0x41,0x45, - 0x50,0x00,0x0a,0x88,0x0a,0xaa,0xa0,0x22,0x40,0x80,0xff,0xff,0x17,0xaa,0x95, - 0x54,0x43,0x80,0x2a,0xa5,0x0a,0xaa,0xfd,0x7f,0x53,0xc0,0x06,0x40,0x06,0x94, - 0x04,0x40,0x43,0xc2,0x05,0xc0,0x2a,0x90,0x86,0xc0,0x06,0xa2,0x64,0x4b,0x53, - 0x88,0x96,0x44,0x06,0xd2,0x45,0xc0,0x52,0x84,0x25,0xc1,0x06,0x90,0xe6,0x41, - 0x53,0x8a,0x05,0x42,0x06,0xa0,0x06,0xc4,0x52,0x95,0x04,0xc0,0x06,0xc0,0x05, - 0x40,0x53,0x94,0x06,0x40,0x06,0xa2,0x05,0xc0,0x52,0x88,0xfc,0xff,0x06,0xa2, - 0x95,0x12,0x53,0x88,0x4a,0xa9,0x06,0xa2,0xff,0xff,0x53,0x90,0x10,0x00,0x04, - 0x42,0x42,0x55,0x50,0x14,0x28,0x80,0x0a}; diff --git a/etc/gnus/gnus-uu-decode-uu-up.xpm b/etc/gnus/gnus-uu-decode-uu-up.xpm deleted file mode 100644 index 568315c..0000000 --- a/etc/gnus/gnus-uu-decode-uu-up.xpm +++ /dev/null @@ -1,39 +0,0 @@ -/* XPM */ -static char * icon-decode-view_xpm[] = { -"32 32 4 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #999999999999", -"o c #FFFFFFFFFFFF", -" ", -" ", -" ", -" ", -" ", -" ", -" ................... ", -" .XXXXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXXXX. ", -" .XX.............XX. ", -" .XX.ooooooooooo.XX. ", -" .XX.ooooooooooo.XX. ", -" .XX.ooooooooooo.XX. ", -" .XX.oooo.oooooo.XX. ", -" .XX.oo..o..o.oo.XX. ", -" .XX.o.oo.oo.ooo.XX. ", -" .XX.ooo.ooooooo.XX. ", -" .XX.oo.oo.ooooo.XX. ", -" .XX.oo....ooooo.XX. ", -" .XX.oooooo.oooo.XX. ", -" .XX.ooooooo.ooo.XX. ", -" .XX.ooooooooooo.XX. ", -" .XX.ooooooooooo.XX. ", -" .XX.ooooooooooo.XX. ", -" .XX.ooooooooooo.XX. ", -" .XX.............XX. ", -" .XXXXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXXXX. ", -" ................... ", -" ", -" ", -" "}; diff --git a/etc/gnus/gnus-uu-post-news-up.xbm b/etc/gnus/gnus-uu-post-news-up.xbm deleted file mode 100644 index e0528e9..0000000 --- a/etc/gnus/gnus-uu-post-news-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x11,0x11,0x19,0x51,0x4a,0x95,0x82,0x14,0x20,0x40,0x29,0x42,0x0a,0xd5,0x86, - 0x10,0x31,0x31,0x3b,0x53,0x08,0x9d,0xe8,0x10,0xa2,0x43,0x82,0x4b,0x88,0xff, - 0xff,0x03,0xb3,0xaa,0x54,0xbb,0x88,0x55,0xaa,0x02,0xa2,0xfc,0x7f,0x4b,0x88, - 0x06,0xc0,0x12,0xb1,0x05,0x40,0x56,0x8a,0x05,0x40,0x03,0xd0,0x86,0xc0,0xaa, - 0x85,0x64,0x4b,0x06,0xb1,0x95,0xc4,0x32,0x8a,0x46,0x40,0x4b,0xd0,0x24,0x41, - 0x03,0x84,0xe6,0xc1,0x56,0xd9,0x05,0x42,0x12,0x82,0x04,0x44,0x4b,0x94,0x07, - 0xc0,0x22,0xc1,0x04,0x40,0x16,0x95,0x05,0xc0,0x52,0xa0,0x06,0x40,0x13,0x8a, - 0xfd,0xff,0x46,0xd0,0x94,0x52,0x12,0x93,0x29,0xa5,0x5a,0xa4,0xff,0xff,0x03, - 0x10,0x02,0x08,0x55,0x85,0xa8,0xa2,0x00}; diff --git a/etc/gnus/gnus-uu-post-news-up.xpm b/etc/gnus/gnus-uu-post-news-up.xpm deleted file mode 100644 index f4a7e3a..0000000 --- a/etc/gnus/gnus-uu-post-news-up.xpm +++ /dev/null @@ -1,39 +0,0 @@ -/* XPM */ -static char * icon-post-pic_xpm[] = { -"32 32 4 1", -" c #000000000000", -". c #BFBFBFBFBFBF s backgroundToolBarColor", -"X c #999999999999", -"o c #FFFFFFFFFFFF", -" ... ... ... ... ... ... ... ...", -"................................", -"................ ...............", -".............. . .............", -" ... ... ... .. .. ... ... ...", -".......... ......... .........", -"........ ............. .......", -"....... ......", -" ... .. XXXXXXXXXXXXXXXXX .. ...", -"....... XXXXXXXXXXXXXXXXX ......", -"....... XX XX ......", -"....... XX ooooooooooo XX ......", -" ... .. XX ooooooooooo XX .. ...", -"....... XX ooooooooooo XX ......", -"....... XX oooo oooooo XX ......", -"....... XX oo o o oo XX ......", -" ... .. XX o oo oo ooo XX .. ...", -"....... XX ooo ooooooo XX ......", -"....... XX oo oo ooooo XX ......", -"....... XX oo ooooo XX ......", -" ... .. XX oooooo oooo XX .. ...", -"....... XX ooooooo ooo XX ......", -"....... XX ooooooooooo XX ......", -"....... XX ooooooooooo XX ......", -" ... .. XX ooooooooooo XX .. ...", -"....... XX ooooooooooo XX ......", -"....... XX XX ......", -"....... XXXXXXXXXXXXXXXXX ......", -" ... .. XXXXXXXXXXXXXXXXX .. ...", -"....... ......", -"................................", -"................................"}; diff --git a/etc/gnus/gnus.xbm b/etc/gnus/gnus.xbm deleted file mode 100644 index 58d1ac8..0000000 --- a/etc/gnus/gnus.xbm +++ /dev/null @@ -1,622 +0,0 @@ -#define noname_width 271 -#define noname_height 273 -static char noname_bits[] = { - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfa,0xff,0xff,0x7f,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x5f,0x49,0xe0,0xff, - 0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x97,0xaa,0x8a,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0x57,0x2a,0x41,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xa9,0x52,0x16,0xfe,0x7f,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x4a,0x49,0x05, - 0xf9,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x7f,0x95,0xaa,0x58,0xf4,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0x7f,0xa5,0x54,0x26,0xe1,0x7f,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0x54,0x49,0x49,0xe4,0x7f,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x5f,0x2a,0xa5, - 0x2a,0xd1,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2f,0xd5,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xaf,0x52,0x95,0x54,0xc4,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xab, - 0x24,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0x57,0x29,0xa9,0x92,0x11,0x7f,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0x57,0xd5,0xfa,0xff,0xff,0xab,0xea,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x97,0x4a,0x55,0x2a,0x41,0x7f, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x25,0x29,0xe5,0xff,0xff,0x95,0xa4,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xa7,0xa4, - 0x24,0xa5,0x14,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x4a,0xa5,0xd4,0xff, - 0x3f,0x52,0xa9,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x29,0x55,0x55,0x55,0x41,0x7e,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, - 0xa9,0x54,0xea,0xff,0xdf,0x2a,0x55,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0x55,0x55,0x4a,0x49,0x12,0x7e,0xff,0xff,0xff, - 0xff,0xff,0xff,0x7f,0x55,0xa5,0x92,0xff,0x23,0xa5,0x4a,0xd6,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xa5,0xa4,0x94,0xaa,0x42, - 0x7d,0xff,0xff,0xff,0xff,0xff,0xff,0x9f,0x4a,0x2a,0xa9,0xff,0xad,0x92,0x24, - 0xa9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2a, - 0x95,0x52,0x52,0x29,0x7c,0xff,0xff,0xff,0xff,0xff,0xff,0x5f,0x52,0x49,0x55, - 0xfe,0x91,0x54,0x55,0x55,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x7f,0x49,0x29,0x55,0x25,0x85,0x7c,0xff,0xff,0xff,0xff,0xff,0xff, - 0x4f,0x95,0xaa,0x92,0x7e,0x55,0x55,0xa9,0x4a,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2a,0x50,0x95,0xaa,0x24,0x7e,0xff,0xff, - 0xff,0xff,0xff,0xff,0x57,0x2a,0x95,0x54,0x79,0x95,0x92,0x92,0x94,0xfc,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xb9,0x62,0x29,0x49, - 0x85,0x7c,0xff,0xff,0xff,0xff,0xff,0xff,0x4b,0x49,0x49,0x95,0xba,0xa4,0x54, - 0xaa,0x52,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf, - 0x1a,0xf8,0xa7,0xaa,0x22,0x7c,0xff,0xff,0xff,0xff,0xff,0xff,0x55,0x55,0x52, - 0x2a,0x75,0x55,0xa5,0x24,0xa5,0xf2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xbf,0x5a,0xfd,0x57,0x92,0x94,0x7e,0xff,0xff,0xff,0xff,0xff, - 0xff,0x4a,0x4a,0x55,0x49,0x89,0x92,0x94,0xaa,0x94,0xf4,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x5f,0x1a,0xfc,0x2f,0x55,0x05,0x7c,0xff, - 0xff,0xff,0xff,0xff,0xff,0x55,0xa9,0x4a,0x55,0x2a,0x55,0x55,0x55,0x55,0xe5, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaf,0x4e,0xfd,0x5f, - 0x29,0xa5,0x7c,0xff,0xff,0xff,0xff,0xff,0xff,0xa4,0x54,0x52,0x4a,0x55,0xa9, - 0xa4,0x24,0xa5,0x94,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x2f,0x1d,0xfe,0x3f,0x95,0x04,0x7c,0xff,0xfd,0xff,0xff,0xff,0x3f,0x49,0xa5, - 0x54,0xa9,0xa4,0x92,0x4a,0x49,0x4a,0x55,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xaf,0x44,0xfe,0x5f,0xa9,0x52,0x7d,0xff,0xe5,0xff,0xff, - 0xff,0x5f,0x55,0x92,0x2a,0x95,0x52,0x4a,0x52,0xaa,0x52,0x4a,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x97,0x16,0xff,0xbf,0x4a,0x05,0x7c, - 0xff,0xd9,0xff,0xff,0xff,0x5f,0x95,0x42,0xa5,0x52,0x95,0xaa,0xaa,0xaa,0x94, - 0x54,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x57,0x43,0xfe, - 0xbf,0x54,0x52,0x7d,0x7f,0x25,0xff,0xff,0xff,0xa7,0xa4,0x28,0x92,0x54,0x4a, - 0xa5,0x4a,0x92,0xaa,0x4a,0xf9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xab,0x12,0xfe,0x7f,0xa5,0x02,0x7c,0x7f,0x55,0xfd,0xff,0xff,0x95,0x2a, - 0x82,0x54,0xa5,0x54,0x2a,0xa9,0x2a,0xa5,0x52,0xf5,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0x27,0x4b,0xff,0xff,0x4a,0x29,0x7d,0xff,0x92,0xfe, - 0xff,0xff,0x55,0x92,0x20,0xa8,0x94,0x2a,0xa5,0x94,0x52,0x29,0xa9,0xf4,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x97,0x01,0xff,0x7f,0x52,0x42, - 0x7c,0xff,0x25,0xf9,0xff,0x7f,0xaa,0x02,0x8a,0x40,0x29,0x49,0x09,0x41,0x4a, - 0x55,0x25,0xe5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x57,0x57, - 0xff,0xff,0x95,0x12,0x7d,0xff,0xa9,0xfa,0xff,0x7f,0x25,0xa9,0x20,0x2a,0xa5, - 0xaa,0x42,0x92,0x54,0x92,0x54,0x95,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xaf,0x83,0xff,0xff,0xa9,0x42,0x7e,0xff,0xaa,0xf4,0xff,0xaf,0x54, - 0x01,0x82,0x80,0xaa,0x54,0x14,0x08,0xa2,0xaa,0x4a,0xd2,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xef,0xcf,0xd7,0xff,0xff,0x52,0x12,0x7f,0xff,0x4a, - 0xea,0xff,0x57,0x92,0xaa,0x28,0x24,0x29,0x25,0x81,0x82,0x08,0x49,0x52,0x55, - 0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xdf,0xef,0xe7,0xff,0xff,0x2a, - 0x05,0x7e,0xff,0x55,0xd5,0xff,0xa5,0x2a,0x00,0x8e,0x10,0x4a,0x89,0x24,0x28, - 0xa0,0xaa,0x2a,0x49,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xe7,0xff, - 0xef,0xff,0xff,0xa5,0x50,0x7e,0xff,0x25,0xe5,0xff,0x2a,0xa5,0x52,0x7f,0x85, - 0x54,0x35,0x08,0x82,0x0a,0x55,0x95,0xaa,0xfc,0xff,0xff,0xff,0xcf,0xff,0xff, - 0xff,0xff,0xd7,0xff,0xff,0xff,0x7f,0x52,0x85,0x7e,0xff,0xab,0x94,0x1e,0x55, - 0x2a,0xc8,0xff,0x10,0x90,0x92,0xa0,0x08,0x20,0x24,0x52,0x25,0xfd,0xff,0xff, - 0xff,0xef,0xff,0xff,0xff,0xff,0xe9,0xff,0xff,0xff,0xff,0x94,0x10,0x7e,0xff, - 0x93,0xaa,0x6a,0x49,0x49,0xf2,0xff,0x85,0x52,0x09,0x0a,0xa2,0x4a,0x92,0x29, - 0xa9,0xf2,0xff,0xff,0xff,0xd3,0xff,0xff,0xff,0xff,0xeb,0xff,0xff,0xff,0x7f, - 0x55,0x25,0x7f,0xff,0x55,0x49,0x49,0x95,0x0a,0xf9,0xff,0x17,0x48,0x26,0x50, - 0x08,0x00,0xa9,0x4a,0x95,0xfa,0xff,0xff,0xff,0xeb,0xff,0xff,0xff,0xff,0xf2, - 0xff,0xff,0xff,0xff,0x92,0x80,0x7e,0xff,0xa7,0x54,0xaa,0xa4,0x52,0xfc,0xff, - 0xaf,0x42,0x89,0xfa,0xbf,0x54,0x20,0xa9,0xa4,0xd4,0xff,0xff,0xff,0xcb,0xff, - 0xff,0xff,0xff,0xf5,0xff,0xff,0xff,0xff,0x54,0x29,0x7f,0xff,0x4b,0xa5,0x92, - 0x2a,0x01,0xff,0xff,0x1f,0xa8,0x22,0xff,0xff,0x01,0xa5,0x2a,0x55,0xa9,0xff, - 0xff,0xff,0xd4,0xff,0xff,0xff,0x7f,0xfa,0xff,0xff,0xff,0x7f,0xa5,0x04,0x7f, - 0xff,0x57,0x2a,0x55,0xa9,0x54,0xfe,0xff,0x3f,0x05,0x89,0xff,0xff,0x5f,0x48, - 0x92,0x2a,0x95,0xff,0xff,0xff,0xea,0xff,0xff,0xff,0xff,0xd2,0xff,0xff,0xff, - 0x7f,0x2a,0x91,0x7f,0xff,0xa9,0x54,0x4a,0x52,0x02,0xff,0xff,0xff,0x50,0xd1, - 0xff,0xff,0x1f,0x81,0xaa,0xa4,0x52,0xfe,0xff,0x3f,0xe9,0xff,0xff,0xff,0x7f, - 0x1d,0xff,0xff,0xff,0xff,0x54,0x41,0x7f,0xff,0x93,0x92,0x52,0x95,0xc8,0xff, - 0xff,0xff,0x8b,0xc4,0xff,0xff,0x7f,0x24,0xa5,0x2a,0x49,0xf9,0xff,0x7f,0xd5, - 0xff,0xff,0xff,0xbf,0x4a,0xff,0xff,0xff,0xff,0x4a,0x14,0x7f,0xff,0x28,0xa5, - 0x94,0x2a,0xa0,0xff,0xff,0x7f,0x22,0xf0,0xff,0xff,0x7f,0x12,0x94,0xa4,0xaa, - 0xea,0xff,0xaf,0xea,0xff,0xff,0xff,0x5f,0x8e,0xff,0xff,0xff,0x7f,0xa9,0x40, - 0x7f,0xff,0x48,0x55,0x55,0x12,0xca,0xff,0xff,0xff,0x0a,0xf5,0xff,0xff,0xff, - 0x80,0x52,0x95,0x54,0xaa,0xfe,0x55,0xc4,0xff,0xff,0xff,0x5f,0xa5,0xff,0xff, - 0xff,0xff,0x94,0x14,0x7f,0xff,0x52,0x2a,0xa9,0x4a,0xe1,0xff,0xff,0xbf,0x24, - 0xf0,0xff,0xff,0xff,0x0b,0x28,0xa9,0x92,0x24,0x55,0x49,0xe5,0xd7,0xff,0xff, - 0xa7,0x8a,0xff,0xff,0xff,0x7f,0xa5,0xc0,0x7f,0xff,0x50,0x49,0x95,0x04,0xf8, - 0xff,0xff,0x5f,0x1f,0xfd,0xff,0xff,0xff,0x47,0x45,0x55,0xaa,0xaa,0x4a,0xaa, - 0xea,0xaf,0xff,0xff,0x2b,0xc3,0xff,0xff,0xff,0x7f,0x55,0x94,0x7f,0x7f,0x4a, - 0x55,0x52,0x51,0xfe,0xff,0xff,0x5f,0x4e,0xf8,0xff,0xff,0xff,0x1f,0x50,0x92, - 0x52,0x49,0xa9,0x92,0xe4,0xd3,0xff,0xff,0x4b,0xd5,0xff,0xff,0xff,0xff,0x94, - 0xc0,0x7f,0x3f,0xa0,0xa4,0xaa,0x04,0xfe,0xff,0xff,0xa7,0x1d,0xfd,0xff,0xff, - 0xff,0x9f,0x84,0xaa,0x4a,0xaa,0x24,0x55,0xf2,0x2b,0xff,0x7f,0xa9,0xc1,0xff, - 0xff,0xff,0x7f,0x4a,0x95,0x7f,0xbf,0x2a,0x95,0x24,0x50,0xff,0xff,0xff,0x97, - 0x5e,0xfe,0xff,0xff,0xff,0x3f,0x92,0x24,0x95,0x92,0xaa,0xa4,0xf2,0xcb,0xff, - 0x5f,0xd5,0xe5,0xff,0xff,0xff,0xff,0x52,0x80,0x7f,0x3f,0xa0,0x52,0x15,0x85, - 0xff,0xff,0xff,0xd7,0x38,0xfe,0xff,0xff,0xff,0xff,0x20,0xaa,0x52,0x55,0x55, - 0x55,0xf9,0x29,0xfd,0xab,0xa4,0xf0,0xff,0xff,0xff,0x7f,0x29,0xa9,0x7f,0xff, - 0x42,0x25,0x49,0xe8,0xff,0xff,0xff,0x69,0x7a,0xff,0xff,0xff,0xff,0xff,0x82, - 0x52,0xaa,0x24,0x89,0x4a,0xf8,0x55,0x2a,0x49,0x95,0xf5,0xff,0xff,0xff,0xbf, - 0x2a,0xc4,0x7f,0x7f,0x90,0x54,0x15,0xe2,0xff,0xff,0xff,0x25,0xbc,0xff,0xff, - 0xff,0xff,0xff,0x29,0x48,0x49,0xaa,0xaa,0xa4,0xfa,0x95,0x92,0x54,0x52,0xf0, - 0xff,0xff,0xff,0xbf,0x4a,0xd1,0x7f,0xff,0x05,0xaa,0x40,0xf8,0xff,0xff,0x7f, - 0xaa,0xfc,0xff,0xff,0xff,0xff,0xff,0x43,0xa9,0xaa,0x4a,0x52,0xa9,0xf8,0xa4, - 0xaa,0x52,0x95,0xfc,0xff,0xff,0xff,0x7f,0x52,0xc0,0x7f,0xff,0xa1,0x00,0x24, - 0xfa,0xff,0xff,0xff,0x0a,0xfe,0xff,0xff,0xff,0xff,0xff,0x17,0x92,0x24,0xa5, - 0x2a,0x55,0xfe,0xaa,0xa4,0x2a,0x29,0xf9,0xff,0xff,0xff,0xbf,0x2a,0xea,0x7f, - 0xff,0x05,0x92,0x90,0xfc,0xff,0xff,0xbf,0xa4,0xff,0xff,0xff,0xff,0xff,0xff, - 0x4f,0xa0,0xaa,0x54,0x49,0x25,0x7c,0x49,0x95,0xa4,0x12,0xfc,0xff,0xff,0xff, - 0x7f,0x8a,0xe0,0x7f,0xff,0xa3,0x04,0x05,0xfe,0xff,0xff,0xbf,0x06,0xff,0xff, - 0xff,0xff,0xff,0xff,0x1f,0x49,0x95,0x52,0xaa,0x12,0x7f,0x55,0x52,0x55,0x0a, - 0xfd,0xff,0xff,0xff,0x3f,0x29,0xe8,0x7f,0xff,0x0f,0x50,0x50,0xff,0xff,0xff, - 0x5f,0xca,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x04,0xa9,0x4a,0x25,0x45,0x3e, - 0xa9,0x2a,0xa9,0xa2,0xfc,0xff,0xff,0xff,0x7f,0x55,0xe1,0x7f,0xff,0x27,0x05, - 0xc4,0xff,0xff,0xff,0x9f,0x91,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x41,0x4a, - 0x29,0xa9,0x12,0x5e,0x95,0x94,0x4a,0x0a,0xfe,0xff,0xff,0xff,0xbf,0x12,0xf4, - 0x7f,0xff,0x8f,0x50,0xf1,0xff,0xff,0xff,0xa7,0xc2,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x14,0x92,0xaa,0x4a,0xa2,0xbf,0xa4,0x52,0x95,0x22,0xff,0xff,0xff, - 0xff,0x3f,0x45,0xf2,0x7f,0xff,0x3f,0x04,0xf4,0xff,0xff,0xff,0xd7,0xe8,0xff, - 0xff,0xff,0xff,0x5f,0xff,0xff,0x83,0xa8,0x94,0x54,0x09,0x2f,0x55,0x4a,0x52, - 0x49,0xff,0xff,0xff,0xff,0x5f,0x99,0xf0,0x7f,0xff,0x7f,0x51,0xfc,0xff,0xff, - 0xff,0x6b,0xf1,0xff,0xff,0xff,0xff,0x5f,0xfd,0xff,0x2b,0x2a,0xa9,0x12,0x20, - 0x5f,0xa9,0xaa,0x54,0x00,0xff,0xff,0xff,0xff,0x5f,0x15,0xf2,0x7f,0xff,0xff, - 0x8f,0xff,0xff,0xff,0xff,0x2b,0xfc,0xff,0xff,0xff,0xff,0x2f,0xfd,0xff,0x87, - 0xa0,0x4a,0xaa,0x8a,0x9f,0x4a,0x52,0x15,0xa9,0xff,0xff,0xff,0xff,0x5f,0x8a, - 0xfc,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x94,0xf8,0xff,0xff,0xff,0xff, - 0x57,0xf2,0xff,0x2f,0x82,0x52,0x05,0xd0,0x2f,0x95,0x4a,0x49,0x84,0xff,0xff, - 0xff,0xff,0xbf,0x24,0xf8,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x12,0xfd, - 0xff,0xff,0xff,0xff,0x4b,0xd5,0xff,0x9f,0x28,0x54,0x48,0xc5,0xbf,0x52,0x55, - 0x0a,0xe1,0xff,0xff,0xff,0xff,0x9f,0x4a,0xfa,0x7f,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x1a,0xfe,0xff,0xff,0xff,0xff,0x57,0xa9,0xff,0x3f,0x82,0x00,0x21, - 0xf0,0x5f,0x2a,0x49,0x21,0xc4,0xff,0xff,0xff,0xff,0xaf,0x1a,0xfd,0x7f,0xff, - 0xff,0xff,0xff,0xff,0xff,0x3f,0x85,0xff,0xff,0xff,0xff,0xff,0x29,0xa5,0xff, - 0xff,0x24,0x52,0x88,0xfc,0xbf,0x92,0x2a,0x09,0xf1,0xff,0xff,0xff,0xff,0x9f, - 0x4c,0xfc,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x15,0xff,0xff,0xff,0x7f, - 0xff,0xa5,0x4a,0xff,0xff,0x90,0x08,0x01,0xfe,0x3f,0x55,0x52,0x24,0xf4,0xff, - 0xff,0xff,0xff,0xaf,0x02,0xfd,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xc6, - 0xff,0xff,0xff,0xbf,0xfe,0x95,0x54,0xff,0xff,0x05,0x42,0xa8,0xfe,0xbf,0xa4, - 0x2a,0x41,0xf9,0xff,0xff,0xff,0xff,0x5f,0x55,0xfc,0x7f,0xff,0xff,0xff,0xff, - 0xff,0xff,0x4f,0xd0,0xff,0xff,0xff,0xbf,0x7c,0xaa,0x92,0xfc,0xff,0x53,0x08, - 0x01,0xff,0x1f,0x4a,0x01,0x04,0xfc,0xff,0xff,0xff,0xff,0x27,0x05,0xff,0x7f, - 0xff,0xff,0xff,0xff,0xff,0xff,0xaf,0xc5,0xff,0xff,0xff,0x4f,0xbf,0x52,0xaa, - 0xfe,0xff,0x07,0x42,0xea,0xff,0xbf,0x50,0x54,0x51,0xff,0xff,0xff,0xff,0xff, - 0x97,0x56,0xfe,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xaf,0xf0,0xff,0xff,0xff, - 0x2f,0x7f,0xa5,0x54,0xfd,0xff,0x3f,0x09,0xe0,0xff,0x1f,0x02,0x01,0x04,0xff, - 0xff,0xff,0xff,0xff,0xaf,0x02,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0x4b, - 0xf5,0xff,0xff,0xff,0xab,0x9f,0x94,0x92,0xfc,0xff,0xff,0x40,0xfd,0xff,0x9f, - 0x48,0x48,0xa1,0xff,0xff,0xff,0xff,0xff,0xa7,0x56,0xff,0x7f,0xff,0xff,0xff, - 0xff,0xff,0xff,0x6b,0xf8,0xff,0xff,0xff,0xa4,0x5f,0xa9,0x2a,0xfd,0xff,0xff, - 0xff,0xff,0xff,0x3f,0x22,0x21,0xc4,0xff,0xff,0xff,0xff,0xff,0x2f,0x03,0xff, - 0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0x2b,0xfa,0xff,0xff,0x7f,0xd5,0x2f,0xa5, - 0xa4,0xfa,0xff,0xff,0xff,0xff,0xff,0xbf,0x08,0x08,0xf9,0xff,0xff,0xff,0xff, - 0xff,0x97,0x4a,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0x94,0xfc,0xff,0xff, - 0x7f,0x69,0xac,0x2a,0x55,0xf9,0xff,0xff,0xff,0xff,0xff,0x7f,0xa2,0x22,0xf8, - 0xff,0xff,0xff,0xff,0xff,0x53,0x21,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff, - 0x15,0xfe,0xff,0xff,0x9f,0x2a,0x95,0x94,0x92,0xf4,0xff,0xff,0xff,0xff,0xff, - 0xff,0x08,0x88,0xfe,0xff,0xff,0xff,0xff,0xff,0x57,0x8b,0xff,0x7f,0xff,0xff, - 0xff,0xff,0xff,0x7f,0xa9,0xfe,0xff,0xff,0x5f,0x52,0xbc,0x52,0x55,0xf5,0xff, - 0xff,0xff,0xff,0xff,0xff,0x21,0x21,0xff,0xff,0xff,0xff,0xff,0xff,0x4b,0xa1, - 0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0x7f,0x0d,0xff,0xff,0xff,0x57,0x15,0x3f, - 0x55,0x49,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0x4b,0xc8,0xff,0xff,0xff,0xff, - 0xff,0xff,0xd7,0x89,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xbf,0xd6,0xff,0xff, - 0xff,0x4b,0x45,0x3f,0x49,0xaa,0xf4,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf9, - 0xff,0xff,0xff,0xff,0xff,0xff,0xc9,0xe2,0xff,0x7f,0xff,0xff,0xff,0xff,0xff, - 0x3f,0x81,0xff,0xff,0xff,0x29,0x11,0x5f,0x28,0x55,0xf5,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xab,0xc8,0xff,0x7f,0xff, - 0xff,0xff,0xff,0xff,0x5f,0xd6,0xff,0xff,0x7f,0xaa,0xc2,0x0f,0x55,0x49,0xea, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xa5, - 0xe2,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0x9f,0xe1,0xff,0xff,0xbf,0x4a,0xd1, - 0x5f,0x48,0xa5,0xf2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xe9,0xe0,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0x27,0xf4,0xff, - 0xff,0xbf,0x94,0xc4,0x07,0x91,0x2a,0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xca,0xea,0xff,0x7f,0xff,0xff,0xff,0xff, - 0xff,0xaf,0xf1,0xff,0xff,0x9f,0x52,0xe0,0x4b,0x44,0x52,0xe9,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x6a,0xe0,0xff,0x7f, - 0xff,0xff,0xff,0xff,0xff,0x4b,0xfc,0xff,0xff,0xab,0x2a,0xf5,0x0f,0x51,0xa5, - 0xf2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, - 0x69,0xe5,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0x55,0xf8,0xff,0xff,0x95,0x14, - 0xf0,0x5f,0x84,0x54,0xea,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0x7f,0x75,0xf0,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0x13,0xfd, - 0xff,0xff,0xa5,0x42,0xf9,0x7f,0x91,0x4a,0xf5,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xb2,0xfa,0xff,0x7f,0xff,0xff,0xff, - 0xff,0xff,0x54,0xfe,0xff,0x7f,0x52,0x12,0xfa,0xff,0x20,0xa5,0xe4,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0x34,0xf8,0xff, - 0x7f,0xff,0xff,0xff,0xff,0xff,0x25,0xff,0xff,0xaf,0xaa,0x48,0xfc,0xff,0x0b, - 0x29,0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x7f,0xb5,0xf8,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0x52,0xff,0xff,0x2f,0x49, - 0x02,0xfe,0xff,0x43,0xaa,0xea,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0x3f,0x3a,0xfa,0xff,0x7f,0xff,0xff,0xff,0xff,0x7f,0x4a, - 0xff,0xff,0xa5,0x2a,0xa9,0xff,0xff,0x17,0x25,0xe9,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0x9a,0xfc,0xff,0x7f,0xff,0xff, - 0xff,0xff,0xff,0x2a,0xff,0x7f,0x95,0x54,0x80,0xff,0xff,0x07,0xa9,0xea,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x5f,0x1d,0xfc, - 0xff,0x7f,0xff,0xff,0xff,0xff,0x3f,0xa9,0xfe,0x7f,0xa9,0x12,0xe5,0xff,0xff, - 0x5f,0x4a,0xf2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0x5f,0xad,0xfe,0xff,0x7f,0xff,0xff,0xff,0xff,0x7f,0x95,0xea,0x97,0x54, - 0x4a,0xf0,0xff,0xff,0x1f,0xa8,0xea,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0x5f,0x0e,0xfe,0xff,0x7f,0xff,0xff,0xff,0xff,0x5f, - 0x52,0x55,0xa9,0x92,0x02,0xfd,0xff,0xff,0x5f,0x53,0xf5,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaf,0x5e,0xfe,0xff,0x7f,0xff, - 0xff,0xff,0xff,0xbf,0x2a,0x49,0x4a,0x55,0x49,0xfc,0xff,0xff,0x3f,0x94,0xf8, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2f,0x0f, - 0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0x4f,0xa5,0xaa,0x92,0xa4,0x20,0xff,0xff, - 0xff,0xbf,0xa4,0xf2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x5f,0x57,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0x5f,0x52,0x52,0xaa, - 0x2a,0x0a,0xff,0xff,0xff,0x7f,0x54,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0x8f,0x07,0xff,0xff,0x7f,0xff,0xff,0xff,0xff, - 0xa7,0x94,0x4a,0x55,0x4a,0xa0,0xff,0xff,0xff,0xff,0xa8,0xfa,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x57,0x57,0xff,0xff,0x7f, - 0xff,0xff,0xff,0xff,0x2f,0x55,0xa9,0x92,0x12,0xe9,0xff,0xff,0xff,0x7f,0x24, - 0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaf, - 0x87,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0x57,0xa5,0x4a,0xaa,0x44,0xf4,0xff, - 0xff,0xff,0xff,0x55,0xf2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xa7,0xab,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xab,0x94,0xa4, - 0x92,0x12,0xf9,0xff,0xff,0xff,0xff,0xa8,0xfa,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xab,0x83,0xff,0xff,0x7f,0xff,0xff,0xff, - 0xff,0x47,0xa9,0x2a,0x55,0x40,0xfc,0xff,0xff,0xff,0xff,0x25,0xf5,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xe7,0xff,0xff,0xff,0xff,0xff,0xd7,0x97,0xff,0xff, - 0x7f,0xff,0xff,0xff,0xff,0x33,0x55,0xa9,0x24,0x15,0xfe,0xff,0xff,0xff,0xff, - 0x95,0xf2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xeb,0xff,0xff,0xff,0xff,0xff, - 0x93,0xc3,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0x57,0x25,0xa5,0x2a,0x40,0xff, - 0xff,0xff,0xff,0xff,0xa9,0xf4,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe3,0xff, - 0xff,0xff,0xff,0xff,0xe7,0xd5,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0x4b,0x92, - 0x54,0x92,0xd4,0xff,0xff,0xff,0xff,0xff,0x55,0xf5,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xe9,0xff,0xff,0xff,0xff,0xff,0xd5,0xc1,0xff,0xff,0x7f,0xff,0xff, - 0xff,0xff,0x97,0xaa,0x4a,0x05,0xe2,0xff,0xff,0xff,0xff,0xff,0x25,0xf1,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xe3,0xfd,0xff,0xff,0xff,0xff,0xd5,0xea,0xff, - 0xff,0x7f,0xff,0xff,0xff,0xff,0x57,0x55,0x25,0xa1,0xf0,0xff,0xff,0xff,0xff, - 0xff,0x95,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe8,0xfa,0xff,0xff,0xff, - 0xff,0xea,0xe0,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xa7,0x24,0x59,0x04,0xfa, - 0xff,0xff,0xff,0xff,0xff,0xa9,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe2, - 0xfd,0xff,0xff,0xff,0xff,0xc9,0xe9,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0x4f, - 0x52,0x05,0xa1,0xfc,0xff,0xff,0xff,0xff,0xff,0xa5,0xfa,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0x70,0xf9,0xff,0xff,0xff,0xff,0x74,0xe2,0xff,0xff,0x7f,0xff, - 0xff,0xff,0xff,0x47,0x95,0x92,0x04,0xff,0xff,0xff,0xff,0xff,0xff,0x95,0xf8, - 0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xe2,0xfa,0xff,0xff,0xff,0xff,0x72,0xe8, - 0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0x97,0xaa,0x20,0xd0,0xff,0xff,0xff,0xff, - 0xff,0xff,0x55,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xb8,0xfc,0xff,0xff, - 0xff,0xff,0xea,0xe2,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0x07,0x04,0x82,0xc2, - 0xff,0xff,0xff,0xff,0xff,0xff,0x29,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, - 0x71,0xfd,0xff,0xff,0xff,0x7f,0x2a,0xf8,0xff,0xff,0x7f,0xff,0xff,0xff,0xff, - 0x4f,0x91,0x28,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0x4b,0xfc,0xff,0xff,0xff, - 0xff,0xff,0xff,0x1f,0x54,0xfe,0xff,0xff,0xff,0x7f,0x75,0xf2,0xff,0xff,0x7f, - 0xff,0xff,0xff,0xff,0x27,0x44,0x82,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0x29, - 0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0x5f,0xb8,0xfc,0xff,0xff,0xff,0xbf,0x14, - 0xf1,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0x0f,0x11,0x20,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0x55,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x9a,0xfe,0xff, - 0xff,0xff,0x7f,0x5a,0xf8,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0x5f,0x40,0x85, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x09,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x4f,0x2d,0xfd,0xff,0xff,0xff,0x9f,0x12,0xf9,0xff,0xff,0x7f,0xff,0xff,0xff, - 0xff,0x3f,0x14,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x55,0xfe,0xff,0xff, - 0xff,0xff,0xff,0xff,0x07,0xa6,0xfe,0xff,0xff,0xff,0x5f,0x4d,0xfa,0xff,0xff, - 0x7f,0xff,0xff,0xff,0xff,0xff,0x40,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x09,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2b,0x4b,0xfe,0xff,0xff,0xff,0xbf, - 0x2c,0xf8,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xf5,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0x43,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x57,0xff, - 0xff,0xff,0xff,0x5f,0x0a,0xfe,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x89,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xd5,0xa9,0xff,0xff,0xff,0xff,0xaf,0x5a,0xfc,0xff,0xff,0x7f,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xa3,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0x81,0x95,0xff,0xff,0xff,0xff,0x9f,0x06,0xfd,0xff, - 0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xc9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xca,0xa5,0xff,0xff,0xff,0xff, - 0x2f,0x95,0xfc,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xc1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0xea, - 0xff,0xff,0xff,0xff,0xaf,0x26,0xfe,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xd5,0xff,0xff,0xff,0xff,0xff, - 0xff,0x7f,0xf5,0xf4,0xff,0xff,0xff,0xff,0xaf,0x86,0xfe,0xff,0xff,0x7f,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc1,0xff, - 0xff,0xff,0xff,0xff,0xff,0x7f,0x70,0xe5,0xff,0xff,0xff,0xff,0x4f,0x2e,0xfe, - 0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xeb,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xb2,0xfa,0xff,0xff,0xff, - 0xff,0x57,0x83,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xf3,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x78, - 0xf2,0xff,0xff,0xff,0xff,0xa7,0x22,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x5f,0x5d,0xfd,0xff,0xff,0xff,0xff,0x97,0x87,0xff,0xff,0xff,0x7f, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x3c,0xfd,0xff,0xff,0xff,0xff,0x53,0xa3, - 0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaf,0xac,0xfe,0xff,0xff, - 0xff,0xff,0x57,0x95,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f, - 0x9e,0xfe,0xff,0xff,0xff,0xff,0x97,0x81,0xff,0xff,0xff,0x7f,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xa7,0x57,0xfe,0xff,0xff,0xff,0xff,0xa9,0xa5,0xff,0xff,0xff, - 0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0xaf,0xff,0xff,0xff,0xff,0xff,0x4b, - 0x89,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xab,0x93,0xff,0xff, - 0xff,0xff,0xff,0x95,0xa2,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x83,0xab,0xff,0xff,0xff,0xff,0xff,0xd3,0xc8,0xff,0xff,0xff,0x7f,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff, - 0xff,0xff,0xff,0xff,0xe9,0xa5,0xff,0xff,0xff,0xff,0xff,0xa5,0xe1,0xff,0xff, - 0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0xd5,0xff,0xff,0xff,0xff,0xff, - 0xd5,0xc8,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xea,0xea,0xff, - 0xff,0xff,0xff,0xff,0x14,0xc1,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff, - 0xff,0xe0,0xe4,0xff,0xff,0xff,0xff,0xff,0x65,0xe8,0xff,0xff,0xff,0x7f,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xcf, - 0xff,0xff,0xff,0xff,0x3f,0x72,0xe9,0xff,0xff,0xff,0xff,0xff,0x6a,0xe1,0xff, - 0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xbf,0xb8,0xfa,0xff,0xff,0xff,0xff, - 0xff,0x52,0xea,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xd3,0xff,0xff,0xff,0xff,0x1f,0x7a,0xf5, - 0xff,0xff,0xff,0xff,0x7f,0x2a,0xe0,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xeb,0xff,0xff,0xff, - 0xff,0x8f,0x58,0xfa,0xff,0xff,0xff,0xff,0x7f,0x25,0xf5,0xff,0xff,0xff,0x7f, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xb5,0xff,0xff,0xdf,0xff,0x57,0x5e,0xfd,0xff,0xff,0xff,0xff,0xff,0x34,0xe0, - 0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xca,0xff,0xff,0x8f,0xff,0x07,0xac,0xfc,0xff,0xff,0xff, - 0xff,0x7f,0x2a,0xf5,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xd4,0xff,0xff,0x57,0xff,0x2b,0x2d, - 0xfd,0xff,0xff,0xff,0xff,0xff,0xb2,0xf0,0xff,0xff,0xff,0x7f,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xd2,0xff,0xff, - 0x07,0xff,0x43,0x4a,0xff,0xff,0xff,0xff,0xff,0xbf,0x2a,0xf8,0xff,0xff,0xff, - 0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x3f,0xc5,0xff,0xff,0x2b,0xfe,0x08,0xab,0xfe,0xff,0xff,0xff,0xff,0x7f,0xaa, - 0xf2,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xbf,0xea,0xff,0xff,0x83,0x36,0x20,0x55,0xff,0xff,0xff, - 0xff,0xff,0x3f,0x15,0xf0,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x4f,0xc2,0xff,0xff,0x48,0x4a,0x85, - 0x49,0xff,0xff,0xff,0xff,0xff,0x7f,0x59,0xfa,0xff,0xff,0xff,0x7f,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x5f,0xf5,0xff, - 0x7f,0x10,0x29,0x50,0xa5,0xff,0xff,0xff,0xff,0xff,0x3f,0x15,0xf9,0xff,0xff, - 0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0x97,0xe4,0xff,0x7f,0x05,0x95,0x42,0xd5,0xff,0xff,0xff,0xff,0xff,0x7f, - 0x35,0xfc,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xab,0xea,0xff,0xbf,0xa0,0x24,0xa8,0xd4,0xff,0xff, - 0xff,0xff,0xff,0x7f,0x19,0xf9,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x27,0xe5,0xff,0x3f,0x92,0xaa, - 0x50,0xe9,0xff,0xff,0xff,0xff,0xff,0x9f,0x4a,0xfc,0xff,0xff,0xff,0x7f,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xa9,0xe2, - 0xff,0x9f,0xa0,0xaa,0x2a,0xf5,0xff,0xff,0xff,0xff,0xff,0x5f,0x1a,0xf9,0xff, - 0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x95,0xf8,0xff,0x5f,0x4a,0x92,0x4a,0xf5,0xff,0xff,0xff,0xff,0xff, - 0xbf,0x4a,0xfc,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0x7f,0x52,0xf2,0xff,0x1f,0x20,0x49,0xa5,0xfa,0xff, - 0xff,0xff,0xff,0xff,0x5f,0x1a,0xfd,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaa,0xf8,0xff,0x47,0xa9, - 0x2a,0x29,0xf9,0xff,0xff,0xff,0xff,0xff,0xbf,0x0a,0xfc,0xff,0xff,0xff,0x7f, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x49, - 0xf2,0xff,0x17,0x92,0xaa,0xaa,0xfe,0xff,0xff,0xff,0xff,0xff,0x9f,0xac,0xfe, - 0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x9f,0x2a,0xf8,0xff,0x43,0xa8,0x24,0x25,0xff,0xff,0xff,0xff,0xff, - 0xff,0xaf,0x0a,0xfc,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0x94,0xfa,0xff,0x91,0x54,0xaa,0x52,0xff, - 0xff,0xff,0xff,0xff,0xff,0x2f,0x4d,0xfd,0xff,0xff,0xff,0x7f,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2f,0x45,0xfc,0xff,0x03, - 0x92,0x52,0xaa,0xff,0xff,0xff,0xff,0xff,0xff,0x5f,0x06,0xfc,0xff,0xff,0xff, - 0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaf, - 0x12,0xfe,0xff,0x50,0xaa,0x2a,0x95,0xff,0xff,0xff,0xff,0xff,0xff,0x4f,0xa5, - 0xfe,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xa7,0x44,0xff,0xff,0x0a,0x25,0xa5,0xa4,0xff,0xff,0xff,0xff, - 0xff,0xff,0x97,0x06,0xfc,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2b,0x15,0xff,0xff,0x40,0xa9,0x92,0xea, - 0xff,0xff,0xff,0xff,0xff,0xff,0x57,0x55,0xfd,0xff,0xff,0xff,0x7f,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x55,0xa1,0xff,0x7f, - 0x92,0x4a,0xaa,0xd4,0xff,0xff,0xff,0xff,0xff,0xff,0x57,0x06,0xfc,0xff,0xff, - 0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x95,0x8a,0xff,0x3f,0x84,0x54,0xa9,0xea,0xff,0xff,0xff,0xff,0xff,0xff,0x2f, - 0x25,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0x52,0xe0,0xff,0xbf,0x50,0xa9,0x4a,0xf2,0xff,0xff,0xff, - 0xff,0xff,0xff,0xa7,0x8e,0xfe,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xa9,0xea,0xff,0x3f,0x24,0x95,0x54, - 0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0x57,0x23,0xfe,0xff,0xff,0xff,0x7f,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0x4a,0xf0,0xff, - 0x9f,0x50,0x69,0x49,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0x4f,0x8b,0xff,0xff, - 0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x7f,0xa5,0xf4,0xff,0x0f,0x2d,0x75,0xaa,0xfa,0xff,0xff,0xff,0xff,0xff,0xff, - 0xaf,0x03,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0x9f,0x14,0xfa,0xff,0x2f,0xa8,0xfa,0x25,0xfd,0xff,0xff, - 0xff,0xff,0xff,0xff,0x97,0xd7,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaf,0xaa,0xfc,0xff,0x0f,0x4d,0xfd, - 0xa9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xcf,0x83,0xff,0xff,0xff,0xff,0x7f, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x5f,0x12,0xfc, - 0xff,0x27,0x92,0xfe,0xcb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xd7,0xd7,0xff, - 0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0x97,0x0a,0xff,0xff,0x83,0x56,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xef,0xc7,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xab,0x24,0xff,0xff,0x2b,0xaa,0xfe,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xe7,0xef,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x4b,0x45,0xff,0xff,0x05,0x95, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe7,0xff,0xff,0xff,0xff, - 0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x95,0x82, - 0xff,0xff,0x51,0xa9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7, - 0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xa9,0xe8,0xff,0xff,0x85,0xca,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0x7f,0x52,0xc1,0xff,0xff,0x90,0xd5,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x4d,0xe8,0xff,0xff,0xa5, - 0xe4,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x51, - 0xf2,0xff,0x7f,0x40,0xd5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x3f,0x95,0xf8,0xff,0x7f,0xa9,0xea,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0x4f,0x15,0xfa,0xff,0x3f,0xa4,0xf4,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaf,0xa4,0xfc,0xff,0x7f, - 0x71,0xe5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2f, - 0x15,0xfe,0xff,0x3f,0x94,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xa7,0x0a,0xff,0xff,0x1f,0x79,0xf2,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xab,0xa4,0xff,0xff,0x5f,0x8c,0xfa,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x53,0x82,0xff,0xff, - 0x1f,0x5c,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xa4,0x92,0xff,0xff,0xbf,0x56,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0x9a,0xc4,0xff,0xff,0x0f,0x2e,0xfd,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xa2,0xf0,0xff,0xff,0xaf,0xa7,0xfe, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x55,0xe4,0xff, - 0xff,0x0f,0x57,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xbf,0x54,0xf2,0xff,0xff,0x9f,0x4b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0x9f,0x92,0xf8,0xff,0xff,0xc7,0xab,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x5f,0x15,0xfe,0xff,0xff,0x97,0xd7, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xa7,0x94,0xfc, - 0xff,0xff,0xc7,0xe3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0x2f,0x05,0xfe,0xff,0xff,0xcf,0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0x53,0xa9,0xff,0xff,0xff,0xd3,0xeb,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x4b,0x05,0xff,0xff,0xff,0xe3, - 0xe5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x54,0xc2, - 0xff,0xff,0xff,0xeb,0xf9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x95,0xc8,0xff,0xff,0xff,0xf3,0xfa,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0x7f,0xa5,0xd2,0xff,0xff,0xff,0xff,0xf5,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xaa,0xe0,0xff,0xff,0xff, - 0xff,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x49, - 0xf8,0xff,0xff,0xff,0xff,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x9f,0x2a,0xf5,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0x5f,0x4a,0xf8,0xff,0xff,0xff,0xff,0xfc,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaf,0x14,0xfd,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x97, - 0x4a,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xab,0x04,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x95,0x52,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x53,0x85,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x54,0xa2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0x4a,0xc9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xa5,0xe0,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0x94,0xe4,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x5f,0x55,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xbf,0x12,0xf9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x4f,0x54,0xfa,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaf,0x0a,0xfc, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0x53,0x45,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0x97,0x14,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x4b,0x45,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x54,0x82, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x4a,0xe9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0x52,0xc1,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x55,0xe8,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0x24, - 0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x7f,0x55,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0x24,0xf9,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x15,0xfe,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x5f, - 0x49,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0x2f,0x95,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x5f,0x01,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2f,0xd5,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x57,0x81,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0x97,0xd4,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaf,0xe0,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x93,0xf4,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0x57,0xf2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0x2b,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x89,0xfc,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x55,0xfc, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x05,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0x49,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x22,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x89, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff, - 0xff,0xff,0x7f,0xe5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, - 0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xc1,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xe9,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, - 0xf2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff, - 0xff,0xff,0xff,0x9f,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xf9,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xfc,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff, - 0x6f,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff, - 0xff,0xff,0xff,0xff,0xbf,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff, - 0xff,0x9f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff, - 0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f}; diff --git a/etc/gnus/gnus.xpm b/etc/gnus/gnus.xpm deleted file mode 100644 index 0c9338f..0000000 --- a/etc/gnus/gnus.xpm +++ /dev/null @@ -1,284 +0,0 @@ -/* XPM */ -static char *gnus[] = { -/* width height num_colors chars_per_pixel */ -" 271 273 3 1", -/* colors */ -". s thing c #bf9900", -"# s shadow c #ffcc00", -"a s None c None", -/* pixels */ -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...aaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........######aaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.............#######aaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa................######aaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..................######aaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....................#######aaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......................#######aaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa........................#######aaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........................######aaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...........................######aaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa............................#######aaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...............aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..............................#######aaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..................aaaaaaaaaaaaaaaaaaaaaa...........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...............................#######aaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....................aaaaaaaaaaaaaaaaaaa...............aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...............................#######aaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......................aaaaaaaaaaaaaaaa....................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa................................########aaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......................aaaaaaaaaaaaaa........................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.................................#######aaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........................aaaaaaaaaaa............................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..................................########aaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...........................aaaaaaaaa..............................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...................................#######aaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.............................aaaaaaa................................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....................................#######aaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...............................aaaaa..................................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......######.......................#######aaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa................................aaaa...................................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa#######aa....................#######aaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..................................aa.....................................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aa######aaaaaaa.................#######aaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....................................a......................................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa#####aaaaaaaaa................#######aaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.............................................................................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaa...............#######aaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..............................................................................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa######aaaaaaaaaa...............#######aaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa................................................................................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa#####aaaaaaaaaaaa..............#######aaaaa", -"aaaaaaaaa..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..................................................................................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a######aaaaaaaaaaaa..............#######aaaaa", -"aaaaaaaaa....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....................................................................................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a######aaaaaaaaaaaaa.............#######aaaaa", -"aaaaaaaa.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaa..............####....................................................................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaa............########aaaaa", -"aaaaaaa.........aaaaaaaaaaaaaaaaaaaaaaaaaaa.............########...................................................................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a#######aaaaaaaaaaaaaa...........########aaaaa", -"aaaaaaa...........aaaaaaaaaaaaaaaaaaaaaaa.............############..................................................................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a######aaaaaaaaaaaaaaa...........########aaaaa", -"aaaaaaaa..........aaaaaaaaaaaaaaaaaaaaaa.............##############..................................................................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaaaa...........########aaaaa", -"aaaaaaaa...........aaaaaaaaaaaaaaaaaaaa............##################.......................##########................................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aa######aaaaaaaaaaaaaaaa..........########aaaaa", -"aaaaaaaa............aaaaaaaaaaaaaaaaaa............####################....................###############..............................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....aaa#####aaaaaaaaaaaaaaaaa..........#######aaaaaa", -"aaaaaaaa............aaaaaaaaaaaaaaaa..............#####################.................#####################..........................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..aaaaaa..aaaaa###aaaaaaaaaaaaaaaaaa..........#######aaaaaa", -"aaaaaaaa.............aaaaaaaaaaaaaa..............#######################...............#######################..........................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..aaaaaa..aaaaa##aaaaaaaaaaaaaaaaaaa..........#######aaaaaa", -"aaaaaaaaa.............aaaaaaaaaaa...............##########aa#############.............#########################..........................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...aaaaaaaaaaaaa##aaaaaaaaaaaaaaaaaaa..........#######aaaaaa", -"aaaaaaaaa.............aaaaaaaaa................#########aaaaaaa###########............##########################..........................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........########aaaaaa", -"aaaaaaaaa................aaaa..................#######aaaaaaaaaa###########..........############################..........................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........########aaaaaa", -"aaaaaaaaa.....................................######aaaaaaaaaaaaa###########.........#############################..........................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........########aaaaaa", -"aaaaaaaaa....................................######aaaaaaaaaaaaaaaa#########........###############################.........................aaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........########aaaaaa", -"aaaaaaaaaa.................................#######aaaaaaaaaaaaaaaaaa#########.......#######aaaaaaaaaaa##############..........................aaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#######aaaaaaa", -"aaaaaaaaaa................................#######aaaaaaaaaaaaaaaaaaaa########......#####aaaaaaaaaaaaaaaaa############..........................aaaaaaaaaaaaaaaaaaaaaaaaa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#######aaaaaaa", -"aaaaaaaaaa...............................########aaaaaaaaaaaaaaaaaaaaa########....#####aaaaaaaaaaaaaaaaaaaaa##########..........................aaaaaaaaaaaaaaaaaaaaaaa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....a#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#######aaaaaaa", -"aaaaaaaaa#..............................########aaaaaaaaaaaaaaaaaaaaaaaa#.####...#####aaaaaaaaaaaaaaaaaaaaaaa##########...........................aaaaaaaaaaaaaaaaaaaa.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....aa###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#######aaaaaaa", -"aaaaaaaaa#.............................########aaaaaaaaaaaaaaaaaaaaaaaaa...###..######aaaaaaaaaaaaaaaaaaaaaaaa##########...........................aaaaaaaaaaaaaaaaaaa......a#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....a####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........########aaaaaaa", -"aaaaaaaa###...........................#########aaaaaaaaaaaaaaaaaaaaaaaa....##########aaaaaaaaaaaaaaaaaaaaaaaaaa##########............................aaaaaaaaaaaaaaa........##aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aa###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........########aaaaaaa", -"aaaaaaaa###..........................#########aaaaaaaaaaaaaaaaaaaaaaaaa....#########aaaaaaaaaaaaaaaaaaaaaaaaaaaa##########...............................aaaaaaaa...........##aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........########aaaaaaa", -"aaaaaaaa###.........................#########aaaaaaaaaaaaaaaaaaaaaaaaa....a#########aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##########................................................##aaaaaa...aaaaaaaaaaaaaaaaaaaaa......a#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#######aaaaaaaa", -"aaaaaaa####........................#########aaaaaaaaaaaaaaaaaaaaaaaaa....aaa#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#########...............................................##aaaaaa....aaaaaaaaaaaaaaaaaaa.......a#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#######aaaaaaaa", -"aaaaaaa####.......................########aaaaaaaaaaaaaaaaaaaaaaaaaa.....aaa#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#########..............................................##aaaaa.....aaaaaaaaaaaaaaaaaa.......a#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#######aaaaaaaa", -"aaaaaa######....................#########aaaaaaaaaaaaaaaaaaaaaaaaaa.....a#aaa#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#########............................................##aaaaaa......aaaaaaaaaaaaaaa.........a#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#######aaaaaaaa", -"aaaaaa######...................#########aaaaaaaaaaaaaaaaaaaaaaaaaa......##aaa####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#########...........................................##aaaaa.......aaaaaaaaaaaaa..........aa####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#######aaaaaaaa", -"aaaaaa#######.................#########aaaaaaaaaaaaaaaaaaaaaaaaaaa.....a###aaa###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#########.........................................###aaaaa.........aaaaaaa..............a#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa........########aaaaaaaa", -"aaaaaaa#######...............#########aaaaaaaaaaaaaaaaaaaaaaaaaaa.....a####aaa##aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#########........................................##aaaaa...............................a####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#######aaaaaaaaa", -"aaaaaaa########............##########aaaaaaaaaaaaaaaaaaaaaaaaaaa.....a####aaaa#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#########.......................................##aaaaa...............................#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#######aaaaaaaaa", -"aaaaaaaa##########.......###########aaaaaaaaaaaaaaaaaaaaaaaaaaa......#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#########.....................................###aaaaa..............................#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#######aaaaaaaaa", -"aaaaaaaaa##########################aaaaaaaaaaaaaaaaaaaaaaaaaaaa.....#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#########....................................##aaaaa...............................#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa........########aaaaaaaaa", -"aaaaaaaaa#########################aaaaaaaaaaaaaaaaaaaaaaaaaaaa.....#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#########..................................###aaaaa..............................#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa........#######aaaaaaaaaa", -"aaaaaaaaaa#######################aaaaaaaaaaaaaaaaaaaaaaaaaaaa.....a#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#########...............................####aaaaa..............................######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa........#######aaaaaaaaaa", -"aaaaaaaaaaa#####################aaaaaaaaaaaaaaaaaaaaaaaaaaaaa....a#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#########.............................#####aaaaa.............................#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa........#######aaaaaaaaaa", -"aaaaaaaaaaa###################aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#########...........................######aaaa..............................######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......########aaaaaaaaaa", -"aaaaaaaaaaaa#################aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#########.........................######aaaaa.............................#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa........#######aaaaaaaaaaa", -"aaaaaaaaaaaaa###############aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....a#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...aaaaaaaaaaaaaaaaa#########.......................#######aaaa.............................#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa........#######aaaaaaaaaaa", -"aaaaaaaaaaaaaaa###########aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....a#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aaaaaaaaaaaaaaaa#########....................#########aaaa............................########aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a#######aaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaa###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....a#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......aaaaaaaaaaaaaaaa#########..................#########aaaaa..........................#########aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......#######aaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........aaaaaaaaaaaaaaa###########.............###########aaaaa.........................##########aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......#######aaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....a#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa............aaaaaaaaaaaaaaa##############....###############aaaaaaa.......................##########aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a#######aaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....a#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.............aaaaaaaaaaaaaaa##############################aaaaaaaaa.....................############aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a######aaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...............aaaaaaaaaaaaaaa############################aaaaaaaaaaa...................############aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a######aaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....a#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaa................aaaaaaaaaaaaaaaa##########################aaaaaaaaaaaa#................#############aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......#######aaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....a#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....aaaaaa.................aaaaaaaaaaaaaaaa########################aaaaaaaaaaaaa##..............#############aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaaaa...................aaaaaaaaaaaaaaaa######################aaaaaaaaaaaaa#####.........###############aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a######aaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....a#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaaaa....................aaaaaaaaaaaaaaaaa###################aaaaaaaaaaaaaaa########..##################aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a######aaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....a#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaaaaa....................aaaaaaaaaaaaaaaaaaa################aaaaaaaaaaaaaaaa###########################aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......aaaaa......................aaaaaaaaaaaaaaaaaaaaa###########aaaaaaaaaaaaaaaaaa##########################aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....a####aaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......aaaaa.......................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa########################aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....a#####aaaaaaaaaaaaaaaaaaaaaaaaaaaa.......aaaaaa.......................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######################aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a######aaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....#####aaaaaaaaaaaaaaaaaaaaaaaaaaaa........a###a.........................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####################aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....a####aaaaaaaaaaaaaaaaaaaaaaaaaaaa........a####a.........................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa##################aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....a#####aaaaaaaaaaaaaaaaaaaaaaaaaaa........a#####aaa.......................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa###############aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....a####aaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaa#.....................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa############aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aa######aaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....a####aaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaa##....................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....#####aaaaaaaaaaaaaaaaaaaaaaaaa..........######aaaaa#####..................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....a####aaaaaaaaaaaaaaaaaaaaaaaaa...........#####aaaaa#######..................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....####aaaaaaaaaaaaaaaaaaaaaaaaa...........#####aaaaaa#######..................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa#####aaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....####aaaaaaaaaaaaaaaaaaaaaaaaa...........######aaaaa#########.................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....####aaaaaaaaaaaaaaaaaaaaaaaa...........######aaaaa###########................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....####aaaaaaaaaaaaaaaaaaaaaaa............#######aaaaaaa##########...............aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa######aaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......####aaaaaaaaaaaaaaaaaaaaaa............#######aaaaaaaaa#########...............aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa#####aaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....####aaaaaaaaaaaaaaaaaaaaaa............#######aaaaaaaaaaaa########..............aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......###aaaaaaaaaaaaaaaaaaaaa............#########aaaaaaaaaaaaa#######..............aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa#####aaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......###aaaaaaaaaaaaaaaaaaa.............#########aaaaaaaaaaaaaaa#######.............aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa#####aaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa........#aaaaaaaaaaaaaaaaaaa.............#########aaaaaaaaaaaaaaaaa######.............aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aa######aaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa........#aaaaaaaaaaaaaaaaa..............#########aaaaaaaaaaaaaaaaaaa#####.............aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa#####aaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa........#aaaaaaaaaaaaaaa...............#########aaaaaaaaaaaaaaaaaaaa#####.............aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaa#####aaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...........aaaaaaaaaaaaa...............#########aaaaaaaaaaaaaaaaaaaaaa#####............aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aa######aaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...............aaaaa..................########aaaaaaaaaaaaaaaaaaaaaaaaa####............aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa#####aaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......................................########aaaaaaaaaaaaaaaaaaaaaaaaaa####...........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaa#####aaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....................................########aaaaaaaaaaaaaaaaaaaaaaaaaaaa###...........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaa####aaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....................................#########aaaaaaaaaaaaaaaaaaaaaaaaaaaaa####..........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....aaa#####aaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...................................#########aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa###..........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaa#####aaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...................................#########aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa###..........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaa#####aaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.................................#########aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa###..........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaa####aaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa................................#########aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa##..........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....aaa#####aaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa................................#########aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa##..........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaa#####aaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..............................##########aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#..........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaa#####aaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.............................##########aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#.........#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaa####aaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa............................##########aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#.........#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....aaa#####aaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...........................#########aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#.........#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaa#####aaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........................##########aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#........##aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaaa..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aa######aaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......................###########aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#........##aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#####aaa...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa#####aaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#...................############aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#........#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#####aaa...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa#####aaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa##................#############aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#.......##aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aa....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aa######aaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa###............##############aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#......###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aa....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa######aaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####.........###############aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#......###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aa.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa######aaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######..###################aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#.....###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aa....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#########################aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#.....###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#######a.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa######aaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa########################aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#.....###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aa.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#####################aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#....####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#######a......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa##################aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#....###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######a.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa##############aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#...####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aa.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa###########aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa##..####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#######a.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aa.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aa.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aa.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#####aaa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#####aaa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa##aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#####aaa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#####aaa.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aaa.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#####aaa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aaa.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#####aaa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#####aaa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#####aaa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aaa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aaa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#######aa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....a#aaaaaaaaaaaaaaaaaaaaaa#aaaaaaaaaaaaa#######aaa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....#aaaaaaaaaaaaaaaaaaaaaa###aaaaaaaaaaaa#######aa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......#aaaaaaaaaaaaaaaaaaaaa#####aaaaaaaaaa########a.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......#aaaaaaaaaaaaaaaaaaaaa#####aaaaaaaaa########a.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......#aaaaaaaaaaaaaaaaaaaa#######aaaaaaa#########a.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......##aaaaaaaaaaaaaaaaaaa########a..aa##########a.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa........##aaaaaaaaaaaaaaaaaa#########....##########a........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa........#aaaaaaaaaaaaaaaaaa#########......#########........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#aaaaaaaaaaaaaaaaaa#########......########a........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........##aaaaaaaaaaaaaaaaa#########.......#######.........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........##aaaaaaaaaaaaaaaaa########.........#####.........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........###aaaaaaaaaaaaaaaa########........................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........###aaaaaaaaaaaaaaaaa########.......................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........###aaaaaaaaaaaaaaaa########.......................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........####aaaaaaaaaaaaaaa#########.......................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaa########.......................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........####aaaaaaaaaaaaaaa#########......................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaa#########......................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaa########.......................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaa#########......................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaa########.......................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaa########.......................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaa########.......................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaa########.......................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaa#######........................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaa########.......................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........####aaaaaaaaaaaaaaaaa#######.........a..............aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aa######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaa#######a........aaa............aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aa######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaa#######........aaaaa..........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....aaa#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........####aaaaaaaaaaaaaaaaa#######a.......aaaaaaa.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....aaa#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaa######a........aaaaaaa.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...aaaaa###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaa#######a.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...aaaaa###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaa#######........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..aaaaaa##aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaa#######a.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaa##aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaa#######.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaaa######a.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaa#######a......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaaa#######.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaaa#######a.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........####aaaaaaaaaaaaaaaaaaaa#######.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaa#######a.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaaaa######aa.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........####aaaaaaaaaaaaaaaaaaaaa######a.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaa######aa.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaaaaa######a.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaaaaaa#####aa.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaa####aa.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaaaaaa#####aa.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaaaaaaa####aaa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaa####aa.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaa###aaa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaaaaaaaa####aaa.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........####aaaaaaaaaaaaaaaaaaaaaaaaa####aaa....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaa###aaa.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaaaaaaaaaa###aaa....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........####aaaaaaaaaaaaaaaaaaaaaaaaaa####aaa....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaaa###aaaa....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaaaa###aaa....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaa##aaaa....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaa#aaaaa....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..a####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..a####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.a####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aa###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa##aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa##aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa##aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" -}; -SIMPLE = T BITPIX = 8 NAXIS = 2 NAXIS1 = 271 NAXIS2 = 273 HISTORY Written by XV 3.10a END ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëŽëë½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëŽë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎뽽½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎뽽½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎Ž½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎Ž½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎Ž½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎Ž½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽ½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽ½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎Žëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎Žëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎Žëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëë½ëëëë뎎ŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½ëëë뎎ŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½ëë뎎ŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëë½½½ëëë뎎ŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½ëë뎎ŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëë½½½ëë뎎ŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëë½½½ëë뎎ŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½ëëëëëëëëëëëëëëëëëëëëëëëëë½½½½ëë뎎ŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëë½½½½ëë뎎ŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëë½½½ëë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëë½½½½ë뎎ŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëë½½½½ëë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëë½½½½½ë뎎ŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëë½½½½ë뎎ŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëë½½½½½ë뎎ŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëë½½½½½½ëŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½ëëëëëëëëëëëëëëëëëëëëë½½½½½½ëŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëë½½½½½½½ëŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½ëëëëëëëëëëëëëëëëëëëë½½½½½½½ŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëë½½½½½½½ëŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëë½½½½½½½ŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëë½½½½½½½ëŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëë½½½½½½ëŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëë½½½½½½½ŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëë½½½½½½½ëŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëŽëëëëëë½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëë½½½½½½½ŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ëëëëëë½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëë½½½½½½½ëŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎Žëëëëë½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëë½½½½½½ëŽŽŽŽŽŽŽŽëëëëëë뎎ŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎Žëëëëë½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½ëëëëëëëëëëëëëëëëë½½½½½½½ëŽŽŽŽŽŽŽëëëëëë뎎ŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëë½½½½½½½ŽŽŽŽŽŽŽŽëëëë뎎ŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëë½½½½½½½ëŽŽŽŽŽŽŽŽëë뎎ŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½ëëëëëëëëëëëëëëëëë½½½½½½½ŽŽŽŽŽŽŽŽŽëŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëë½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëë½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëë½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëë½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëë½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëë½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëë½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½ëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëë½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½ëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½ëëëëëëëëëëëëëëëë½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½ëëëëëëëëëëëëëëëëë½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½ëëëëëëëëëëëëëëëë½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½ëëëëëëëëëëëëëëëëë½½½½½½½½ŽŽŽŽŽŽŽŽŽ½½½½½ŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½ëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽ½½½½½½½ŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½ëëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽ½½½½½½½½ëŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽ½ëëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽ½½½½½½½½½ŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽ½½ëëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽ½½½½½½½½½½ëŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽ½½ëëëëëëëëëëëëëëëëëëë½½½½½½½½ëŽŽëë½½½½½½½½½½ëŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽ½ëëëëëëëëëëëëëëëëëëëë½½½½½½½ëëëëëëë½½½½½½½½½ëŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽ½ëëëëëëëëëëëëëëëëëëëëë½½½½½ëëëëëëëëë½½½½½½½½ëŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽ½ëëëëëëëëëëëëëëëëëëëëë½½½½½ëëëëëëëëëë½½½½½½½½ëŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽ½ëëëëëëëëëëëëëëëëëëëëëë½½½ëëëëëëëëëëëë½½½½½½½ë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½ëëëëëëëëëëëëëëëëëëëëëë½ëëëëëëëëëëëëë½½½½½½½ëë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½ë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎Žëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎Žëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëë뎎ŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëë뎎ŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëë뎎ŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½ŽŽ½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½ëŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뽎ŽŽ½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뽎ŽŽŽ½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뽎ŽŽŽ½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½ëŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뽎ŽŽŽŽ½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뽎ŽŽŽŽ½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½ëŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ŽŽ½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뽎ŽŽŽŽ½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½ŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뽎ŽŽŽŽŽ½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½ŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뽎ŽŽŽŽŽ½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뽎ŽŽŽŽŽŽ½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뽎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뽎ŽŽŽŽŽŽŽ½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëë뎎Žëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뽎ŽŽŽŽŽŽŽ½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëë뎎Žëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뽎ŽŽŽŽŽŽŽ½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½ëëë뎎ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뽎ŽŽŽŽŽŽŽŽ½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뽎ŽŽŽŽŽŽŽŽ½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뽎ŽŽŽŽŽŽŽŽ½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뽎ŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½ŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½ŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½ŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½ŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½ŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½ŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½ŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½ŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëë½½½½ŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëë½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽ½ëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëë½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽ½ëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëë½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽ½ëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëë½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽ½½½ëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëë½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽ½½½ëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëë½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽ½½½½ëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëë½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽ½½½½ëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽ½½½½ëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëë½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽ½½½½ëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽ½½½½½½ëëëëë½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽ½½½½ëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽ½½½½½½ëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽ½½½½ëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽ½½½½½ëëëëëë½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½½½½ëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽ½½½½½ëëëëë½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½½ëëëëë½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëë½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëë뽎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽë½½½½½ëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽë½½½½ëŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽë½½½ëŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½ëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëë½½½½½½½½ŽŽ½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëë½½½½½ŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëë½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëŽëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëë뽎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëë½½½½½½½½½½½½½½ŽŽŽŽ½½½½½½½½½½½½½½½ëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽ½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëë½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½ëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎Žëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½ëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½ëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½ëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½ëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½ëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½ëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëëëëë½½½½½½½½½½ŽŽŽŽŽŽŽ½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½ëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëë½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽë½½½½ëëëë½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½ëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëë½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽë½½½½ëëë½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½ëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëë½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽë½½½ëëë½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½ëëëë뎎ŽŽŽŽŽŽŽëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëë½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽ½½ëëë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½ëëëë뎎ŽŽŽŽŽëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽëë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëë½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽë½ëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½ëëëëë뎎ŽŽŽŽëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëë½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½ëëëë뎎ŽŽŽëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëë½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽëëë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½ëëëëë뎎ŽŽëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëë½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½ëëëëë뎎Žëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëë½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëë뎎ŽŽŽŽŽŽŽŽŽ½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëëë½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽ½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽ½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëë½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëëë뽎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëë뎎Ž½½½ŽŽ½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëëë뽎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëë뽎½½½½ŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽëë½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëëëëëëëëë½½½½½½½½ŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽë½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëë½½½½½½½½ŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëë½½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëë½½½½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½ëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½ëëëëëëëëëëëëë½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½½½½½½½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëë½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½½½½½½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎Žëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëë½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½½½½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎Žëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½ëë½½½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½½½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎Žëëëëëëëëëëëëë½½ëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ëëëëë뎎ëëëëë½½ëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ëëëëë뎎ëëëëë½½½ëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽëëë½½½½½ëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëë½½½½½½ëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½ëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëë뎎ŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½½ëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëë뎎ŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽ½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëë뎎ŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½ëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëë뎎ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½ëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½ëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½½ëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½ëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëë½½½½½½ëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½½½ë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽ½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎Žëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë diff --git a/etc/gnus/kill-group.pbm b/etc/gnus/kill-group.pbm deleted file mode 100644 index 5083144..0000000 Binary files a/etc/gnus/kill-group.pbm and /dev/null differ diff --git a/etc/gnus/kill-group.xpm b/etc/gnus/kill-group.xpm deleted file mode 100644 index de83fd9..0000000 --- a/etc/gnus/kill-group.xpm +++ /dev/null @@ -1,50 +0,0 @@ -/* XPM */ -static char *magick[] = { -/* columns rows colors chars-per-pixel */ -"24 24 20 1", -" c Gray0", -". c Gray6", -"X c Gray12", -"o c #2ff42ff42ff4", -"O c #3fff3fff3fff", -"+ c Gray28", -"@ c #53e353e353e3", -"# c #5fe25fe25fe2", -"$ c #67e767e767e7", -"% c #6fff6fff6fff", -"& c #77d777d777d7", -"* c Gray50", -"= c Gray56", -"- c #9fff9fff9fff", -"; c Gray70", -": c Gray75", -"> c Gray81", -", c #dfffdfffdfff", -"< c #efffefffefff", -"1 c Gray100", -/* pixels */ -"::::::::::::::::::::::::", -"::::::::::::::::::::::::", -"::::::::::::::::::::::::", -"::::#oOOOOOOOOOo+;::::::", -"::::#:111111111:O$::::::", -"::::#:1111-O%11:*>@:::::", -"::::#:111=X.o#<>OOo#::::", -"::::#:111 OX# :111:#::::", -"::::#:111 = :111:#::::", -"::::#:111>Xo.-1111:#::::", -"::::#:1111*:O11111:#::::", -"::::#:11%1*oO->111:#::::", -"::::#:1-O:,1:*O111:#::::", -"::::#:111****:1111:#::::", -"::::#:1111* 111111:#::::", -"::::#:1,:O-1O*:111:#::::", -"::::#:1:X1111*#111:#::::", -"::::#:11>1111,<111:#::::", -"::::#:111111111111:#::::", -"::::#:111111111111:#::::", -"::::#:111111111111:#::::", -"::::&oooooooooooooo&::::", -"::::::::::::::::::::::::", -"::::::::::::::::::::::::" -}; diff --git a/etc/gnus/mail-reply.pbm b/etc/gnus/mail-reply.pbm deleted file mode 100644 index 9ca7659..0000000 Binary files a/etc/gnus/mail-reply.pbm and /dev/null differ diff --git a/etc/gnus/mail-reply.xpm b/etc/gnus/mail-reply.xpm deleted file mode 100644 index 92f5dd5..0000000 --- a/etc/gnus/mail-reply.xpm +++ /dev/null @@ -1,51 +0,0 @@ -/* XPM */ -static char *magick[] = { -/* columns rows colors chars-per-pixel */ -"24 24 21 1", -" c Gray0", -". c Gray6", -"X c Gray12", -"o c #2ff02ff02ff0", -"O c #3fff3fff3fff", -"+ c Gray28", -"@ c #53f353f353f3", -"# c #5ff95ff95ff9", -"$ c #67e767e767e7", -"% c #6fff6fff6fff", -"& c #77dc77dc77dc", -"* c Gray50", -"= c Gray56", -"- c #9beb9beb9beb", -"; c #9fff9fff9fff", -": c Gray70", -"> c Gray75", -", c Gray81", -"< c #dfffdfffdfff", -"1 c #efffefffefff", -"2 c Gray100", -/* pixels */ -">>>>>>>>>>>>>>>==:>>>>>>", -">>>>>>>>>>>>>>&**$&>>>>>", -">>>>>>>>>>>>>&-22,-o->>>", -">>>>>>>>>=$O@$,,2222O>>>", -">>>>>>>=#*>2*>2O222>$>>>", -">>>>>>o&>222O2%,22,$:>>>", -">>>:$O2222<#2*>222=+:>>>", -">>&$>;;2;2*>2><22;**$&>>", -">>o.;,,2,,*1%222;;,O;o>>", -">>o2;O><2O2,%221#o%22o>>", -">>o222***O2;22;**<222o>>", -">>o2222<>.;2,O;,22222o>>", -">>o2221>#2;O%;;,22222o>>", -">>o222**<22222;*>2222o>>", -">>o22%,222222221*,222o>>", -">>o;O,22222222222%#<2o>>", -">>o;22222222222222<**o>>", -">>oOOOOOOOOOOOOOOOOX o>>", -">>>>>>>>>>>>>>>>>>>>>>>>", -">>>>>>>>>>>>>>>>>>>>>>>>", -">>>>>>>>>>>>>>>>>>>>>>>>", -">>>>>>>>>>>>>>>>>>>>>>>>", -">>>>>>>>>>>>>>>>>>>>>>>>", -">>>>>>>>>>>>>>>>>>>>>>>>" -}; diff --git a/etc/gnus/next-ur.pbm b/etc/gnus/next-ur.pbm deleted file mode 100644 index 678bbb0..0000000 Binary files a/etc/gnus/next-ur.pbm and /dev/null differ diff --git a/etc/gnus/next-ur.xpm b/etc/gnus/next-ur.xpm deleted file mode 100644 index 8c823f2..0000000 --- a/etc/gnus/next-ur.xpm +++ /dev/null @@ -1,66 +0,0 @@ -/* XPM */ -static char *magick[] = { -/* columns rows colors chars-per-pixel */ -"24 24 36 1", -" c Gray0", -". c Gray6", -"X c Gray9", -"o c Gray12", -"O c #23f323f323f3", -"+ c Gray15", -"@ c #2ff32ff32ff3", -"# c #399939993999", -"$ c #3fff3fff3fff", -"% c #433243324332", -"& c Gray28", -"* c #4ccc4ccc4ccc", -"= c #53ed53ed53ed", -"- c #5ff05ff05ff0", -"; c Gray40", -": c #67e767e767e7", -"> c #6ccc6ccc6ccc", -", c #6fff6fff6fff", -"< c Gray45", -"1 c #77f277f277f2", -"2 c #7bdb7bdb7bdb", -"3 c #7ccc7ccc7ccc", -"4 c Gray50", -"5 c #866586658665", -"6 c Gray56", -"7 c Gray60", -"8 c #9bd39bd39bd3", -"9 c #9fff9fff9fff", -"0 c Gray65", -"q c #a7c7a7c7a7c7", -"w c Gray70", -"e c Gray75", -"r c Gray81", -"t c #dfffdfffdfff", -"y c #efffefffefff", -"u c Gray100", -/* pixels */ -"wqewqewqewqewqewqewqewqe", -"q6eq6eq6eq6eq6eq6eq6eq6e", -"eeeeeeeeeeeeeeeeeeeeeeee", -"wqewqewqewq82$.wqewqewqe", -"q6eq6eq6e6@19u$-6eq6eq6e", -"eeeeeeee==eyr$9@eeeeeeee", -"wqewq82$ruuu or=qewqewqe", -"q6e6@19uuuu94eue-eq6eq6e", -"eeew&euuuuuruuuy18eeeeee", -"wqew-8uuuuuuuuuu92wqewqe", -"q6eq619uut44uuuuu$q6eq6e", -"eeeeee29,-e@uuuuur=eeeee", -"wqeee82$rye-$uuuuu=qewqe", -"q6eq-19uu- e$uuuuue-eq6e", -"ee==eyuuu -y99uuuuy18eee", -"w&euuuuu,uuue4uuuuu92wqe", -"q@euuuuuuuuut4tuuuueoq6e", -"eq=u9$$$ruuuu4@$$r$;6eee", -"wq=8,988%ruu8,98-+6qewqe", -"q6e+wq888$et+wq888X6eq6e", -"eee+88888.4-+88888@eeeee", -"wqeO#6884,uu*5885<&qewqe", -"q6eq@#** c #a7c7a7c7a7c7", -", c Gray70", -"< c Gray75", -"1 c Gray81", -"2 c #dfffdfffdfff", -"3 c #efffefffefff", -"4 c Gray100", -/* pixels */ -",><,><,><,><,><,><,><,><", -">-<>-<>-<>-<>-<>-<>-<>-<", -"<<<<<<<<<<<<<<<<<<<<<<<<", -",><,><,><,>;*O.,><,><,><", -">-<>-<>-<-o&:4O#-<>-<>-<", -"<<<<<<<<@@<31O:o<<<<<<<<", -",><,>;*O1444 X1@><,><,><", -">-<-o&:4444:=<4<#<>-<>-<", -"<<<,+<4444414443&;<<<<<<", -",><,#;4444444444:*,><,><", -">-<>-o44444444444O>-<>-<", -"<<<<<;%44444444441@<<<<<", -",><,><@24444444444@><,><", -">-<>-<-=4444444444<#<>-<", -"<<<<<<,$14444444443&;<<<", -",><,><,#;4444444444:*,><", -">-<>-<>-o4444444444-<", -"<<<<<<<<;%4444444%O$-<<<", -",><,><,><@24444<&;,><,><", -">-<>-<>-<-=42==#-<>-<>-<", -"<<<<<<<<<,$Oo+-<<<<<<<<<", -",><,><,><,><,><,><,><,><", -">-<>-<>-<>-<>-<>-<>-<>-<", -"<<<<<<<<<<<<<<<<<<<<<<<<" -}; diff --git a/etc/gnus/prev-ur.pbm b/etc/gnus/prev-ur.pbm deleted file mode 100644 index 4938919..0000000 Binary files a/etc/gnus/prev-ur.pbm and /dev/null differ diff --git a/etc/gnus/prev-ur.xpm b/etc/gnus/prev-ur.xpm deleted file mode 100644 index 7c3db24..0000000 --- a/etc/gnus/prev-ur.xpm +++ /dev/null @@ -1,65 +0,0 @@ -/* XPM */ -static char *magick[] = { -/* columns rows colors chars-per-pixel */ -"24 24 35 1", -" c Gray0", -". c Gray6", -"X c Gray9", -"o c Gray12", -"O c #23f323f323f3", -"+ c Gray15", -"@ c #2ff22ff22ff2", -"# c #399939993999", -"$ c #3fff3fff3fff", -"% c Gray28", -"& c #53ed53ed53ed", -"* c Gray35", -"= c #5b1a5b1a5b1a", -"- c Gray36", -"; c #5fef5fef5fef", -": c Gray40", -"> c #67e767e767e7", -", c #6ffa6ffa6ffa", -"< c Gray45", -"1 c #77ea77ea77ea", -"2 c #799979997999", -"3 c #7bdb7bdb7bdb", -"4 c Gray50", -"5 c Gray56", -"6 c Gray60", -"7 c #9bde9bde9bde", -"8 c #9fff9fff9fff", -"9 c #a7c7a7c7a7c7", -"0 c #acccacccaccc", -"q c Gray70", -"w c Gray75", -"e c Gray81", -"r c #dfffdfffdfff", -"t c #efffefffefff", -"y c Gray100", -/* pixels */ -"q9wq9wq9wq9wq9wq9wq9wq9w", -"95w95w95w95w95w95w95w95w", -"wwwwwwwwwwwwwwwwwwwwwwww", -"q9wq9wq9wq973$.q9wq9wq9w", -"95w95w95w5@18y$;5w95w95w", -"wwwwwwww&&wte$8@wwwwwwww", -"q9wq973$eyyy oe&9wq9wq9w", -"95w5@18yyyy84wyw;w95w95w", -"wwwq%wyyyyyeyyyt17wwwwww", -"q9wq;7yyyyyyyyyy45q9wq9w", -"95w9518yyr44yyyy4%%@995w", -"wwwww&.3;;w@yyye=<<#Owww", -"q9wq=;:$etw;$rt+w0777O9w", -"95w5+<8yy; wo44+77777X5w", -"ww&&wtyyy ;t@re+77777@ww", -"q%wyyyyy,yyyw4ye=<<#Oq9w", -"9@wyyyyyyyyyr4rywo;;995w", -"w9&yyyyyyyyyy4we$3wwwwww", -"q9&eyyyyyyyyyy,@wwq9wq9w", -"95w$yyyyyyyyyyy@ww95w95w", -"www38yyyyyyyyyy71wwwwwww", -"q9w54yyyyyyyyyye:qq9wq9w", -"95w9,ryyyyyyyyyy4595w95w", -"wwww9&yyyyyyyyyyr&wwwwww" -}; diff --git a/etc/gnus/reply-wo.pbm b/etc/gnus/reply-wo.pbm deleted file mode 100644 index def54da..0000000 Binary files a/etc/gnus/reply-wo.pbm and /dev/null differ diff --git a/etc/gnus/reply-wo.xpm b/etc/gnus/reply-wo.xpm deleted file mode 100644 index fb45d4c..0000000 --- a/etc/gnus/reply-wo.xpm +++ /dev/null @@ -1,65 +0,0 @@ -/* XPM */ -static char *magick[] = { -/* columns rows colors chars-per-pixel */ -"24 24 35 1", -" c Gray0", -". c Gray6", -"X c Gray9", -"o c Gray12", -"O c #23f323f323f3", -"+ c #2ffe2ffe2ffe", -"@ c #399939993999", -"# c #3fff3fff3fff", -"$ c Gray25", -"% c #499949994999", -"& c #4ccc4ccc4ccc", -"* c #519151915191", -"= c #53f353f353f3", -"- c Gray35", -"; c #5feb5feb5feb", -": c #67e767e767e7", -"> c #6fff6fff6fff", -", c Gray45", -"< c #77ef77ef77ef", -"1 c #7bdb7bdb7bdb", -"2 c Gray50", -"3 c Gray56", -"4 c Gray60", -"5 c #9bd39bd39bd3", -"6 c #9fff9fff9fff", -"7 c Gray64", -"8 c #a7c7a7c7a7c7", -"9 c Gray70", -"0 c #b998b998b998", -"q c #bcccbcccbccc", -"w c Gray75", -"e c Gray81", -"r c #dfffdfffdfff", -"t c #efffefffefff", -"y c Gray100", -/* pixels */ -"wwwwwwwwwwwwwwwwwwwwwwww", -"wwwwwwwwwwwwwwwwwwwwwwww", -"wwwwwwwwwwwwwwwwwwwwwwww", -"wwwwwwwwwww5+o1wwwwwwwww", -"wwwwwwwwww3O8wwww", -"wwwww<:226yy#yyyw2 ;wwww", -"www5+5e66yyy#6##2w X5www", -"w8=>ye#6yy2+#6yyr+9y>$8w", -"w;;yw2yw22#wyyyr#@9yy@;w", -"w;3#o+#2w3;tyyy+@3w##3;w", -"w;wyy>wry66yyr+%0;>yyw;w", -"w;wyyy222#yyr#;-2ryyyw;w", -"7=wyyyyrw.6y+ +wryyyyw=7", -"5&wyyyyye#o3.#6yyyyyyw&5", -"5&wyyyyw2yw26y66yyyyyw&5", -"5&wyyye2tyyyyyy66yyyyw&5", -"5&wyr;>yyyyyyyyy6#eyyw&5", -"5&wr2ryyyyyyyyyyyy2wyw&5", -"5&+;ryyyyyyyyyyyyyt2#+&5", -"5& wwwwwwwwwwwwwwwwww &5", -"5,&&&&&&&&&&&&&&&&&&&&,5", -"555555555555555555555555" -}; diff --git a/etc/gnus/reply.pbm b/etc/gnus/reply.pbm deleted file mode 100644 index ee181e6..0000000 Binary files a/etc/gnus/reply.pbm and /dev/null differ diff --git a/etc/gnus/reply.xpm b/etc/gnus/reply.xpm deleted file mode 100644 index 20dd102..0000000 --- a/etc/gnus/reply.xpm +++ /dev/null @@ -1,64 +0,0 @@ -/* XPM */ -static char *magick[] = { -/* columns rows colors chars-per-pixel */ -"24 24 34 1", -" c Gray0", -". c Gray6", -"X c Gray9", -"o c Gray12", -"O c #2ffb2ffb2ffb", -"+ c #399939993999", -"@ c #3fff3fff3fff", -"# c Gray25", -"$ c #499949994999", -"% c #4ccc4ccc4ccc", -"& c #519151915191", -"* c #53f353f353f3", -"= c Gray35", -"- c #5feb5feb5feb", -"; c #67e767e767e7", -": c #6fff6fff6fff", -"> c Gray45", -", c #77ef77ef77ef", -"< c Gray50", -"1 c Gray56", -"2 c #933293329332", -"3 c Gray60", -"4 c #9bd29bd29bd2", -"5 c #9fff9fff9fff", -"6 c Gray64", -"7 c #a7c7a7c7a7c7", -"8 c Gray70", -"9 c #b998b998b998", -"0 c #bcccbcccbccc", -"q c Gray75", -"w c Gray81", -"e c #dfffdfffdfff", -"r c #efffefffefff", -"t c Gray100", -/* pixels */ -"qqqqqqqqqqqqqqqqqqqqqqqq", -"qqqqqqqqqqqqqqqqqqqqqqqq", -"qqqqqqqqqqqqqqqqqqqqqqqq", -"qqqqqqqqqqqqqq4qqqqqqqqq", -"qqqqqqqqqqqqq1,-1qqqqqqq", -"qqqqqqqqq4OO4,rq,4qqqqqq", -"qqqqqq81*:tw:tttt:*7qqqq", -"qqqqq,;%%%%%%%%%%%%%%%%%%%%>4", -"444444444444444444444444" -}; diff --git a/etc/gnus/rot13.pbm b/etc/gnus/rot13.pbm deleted file mode 100644 index 104246c..0000000 Binary files a/etc/gnus/rot13.pbm and /dev/null differ diff --git a/etc/gnus/rot13.xpm b/etc/gnus/rot13.xpm deleted file mode 100644 index ad20c8a..0000000 --- a/etc/gnus/rot13.xpm +++ /dev/null @@ -1,50 +0,0 @@ -/* XPM */ -static char *magick[] = { -/* columns rows colors chars-per-pixel */ -"24 24 20 1", -" c Gray0", -". c Gray6", -"X c Gray12", -"o c #2ff52ff52ff5", -"O c #3fff3fff3fff", -"+ c Gray28", -"@ c #53e353e353e3", -"# c #5fe45fe45fe4", -"$ c #67e767e767e7", -"% c #6fff6fff6fff", -"& c #77d777d777d7", -"* c Gray50", -"= c Gray56", -"- c #9fff9fff9fff", -"; c Gray70", -": c Gray75", -"> c Gray81", -", c #dfffdfffdfff", -"< c #efffefffefff", -"1 c Gray100", -/* pixels */ -"::::::::::::::::::::::::", -"::::::::::::::::::::::::", -"::::::::::::::::::::::::", -"::::#oOOOOOOOOOo+;::::::", -"::::#:,*,,**11-#O$::::::", -"::::#:#:#:#:%--=*>@:::::", -"::::#:o:o:*%>*:>OOo#::::", -"::::#:X*X:O*-:**:1:#::::", -"::::#:>1><::11>:,1:#::::", -"::::#:>-111%111%11:#::::", -"::::#:*:-1:*1:*-11:#::::", -"::::#: *O>*:%*=--1:#::::", -"::::#:O* :*1O*o%11:#::::", -"::::#:O:X,**-*:111:#::::", -"::::#:>1>1,:1,<111:#::::", -"::::#:1,oo,1111111:#::::", -"::::#:,O##O*****:1:#::::", -"::::#:: :: *1:#::::", -"::::#:1-..-1:*O:*1:#::::", -"::::#:11--11,:O,:1:#::::", -"::::#:11111111>111:#::::", -"::::&oooooooooooooo&::::", -"::::::::::::::::::::::::", -"::::::::::::::::::::::::" -}; diff --git a/etc/gnus/save-aif.pbm b/etc/gnus/save-aif.pbm deleted file mode 100644 index 15829c2..0000000 Binary files a/etc/gnus/save-aif.pbm and /dev/null differ diff --git a/etc/gnus/save-aif.xpm b/etc/gnus/save-aif.xpm deleted file mode 100644 index c8bceb6..0000000 --- a/etc/gnus/save-aif.xpm +++ /dev/null @@ -1,55 +0,0 @@ -/* XPM */ -static char *magick[] = { -/* columns rows colors chars-per-pixel */ -"24 24 25 1", -" c Gray6", -". c #133313331333", -"X c #199919991999", -"o c Gray15", -"O c #2fef2fef2fef", -"+ c Gray20", -"@ c #398739873987", -"# c #3fff3fff3fff", -"$ c Gray28", -"% c #4ccc4ccc4ccc", -"& c #5fdf5fdf5fdf", -"* c #626262626262", -"= c Gray40", -"- c #72f272f272f2", -"; c Gray45", -": c #77d777d777d7", -"> c #7bdb7bdb7bdb", -", c #7ccc7ccc7ccc", -"< c Gray56", -"1 c Gray60", -"2 c #9fff9fff9fff", -"3 c #a7c7a7c7a7c7", -"4 c Gray75", -"5 c Gray90", -"6 c Gray100", -/* pixels */ -"444444444444444444444444", -"444444444444444444444444", -"4444444:OOOOOOOOOOO:4444", -"4444444&4666666666#2>444", -"4444444&4666666666#62:44", -"4444444&4666666666 ##O44", -"4444444&4666666666666O44", -"4444444&4666666666666O44", -"4444444&4666666666666O44", -"43<<<<<$<444444666666O44", -"4&@@@-------.%.666666O44", -"4&---5555555o1o666666O44", -"4&---5555555o1o666666O44", -"4&---5555555o1o666666O44", -"4&---5555555o1o666666O44", -"4&---5555555o1o666666O44", -"4&--@-------o1o666666O44", -"4&-<--------,1o666666O44", -"4&-<--------,1o444444O44", -"4&--X++++o@-o1o&&&&&&:44", -"4&--+====%-5o1o444444444", -"4:*-+====%-5o1o444444444", -"44:@X++++o@-.%.444444444", -"444<<<<<<<<<<<<444444444" -}; diff --git a/etc/gnus/save-art.pbm b/etc/gnus/save-art.pbm deleted file mode 100644 index 68fe0cb..0000000 Binary files a/etc/gnus/save-art.pbm and /dev/null differ diff --git a/etc/gnus/save-art.xpm b/etc/gnus/save-art.xpm deleted file mode 100644 index da4158c..0000000 --- a/etc/gnus/save-art.xpm +++ /dev/null @@ -1,62 +0,0 @@ -/* XPM */ -static char *magick[] = { -/* columns rows colors chars-per-pixel */ -"24 24 32 1", -" c Gray0", -". c #133313331333", -"X c #199919991999", -"o c Gray12", -"O c #23f323f323f3", -"+ c Gray15", -"@ c #2fef2fef2fef", -"# c Gray20", -"$ c #398739873987", -"% c #3fff3fff3fff", -"& c #4ccc4ccc4ccc", -"* c #53e353e353e3", -"= c #5fe65fe65fe6", -"- c #626262626262", -"; c Gray40", -": c #6fff6fff6fff", -"> c #72f272f272f2", -", c Gray45", -"< c #77d777d777d7", -"1 c #7ccc7ccc7ccc", -"2 c Gray50", -"3 c Gray56", -"4 c Gray60", -"5 c #9bcb9bcb9bcb", -"6 c #9fff9fff9fff", -"7 c #a7c7a7c7a7c7", -"8 c Gray75", -"9 c Gray81", -"0 c #dfffdfffdfff", -"q c Gray90", -"w c #efffefffefff", -"e c Gray100", -/* pixels */ -"888888888888888888888888", -"888888888888888888888888", -"88888*@@@@@@@@@@@@@@@@@4", -"88888@%28eeeeeeeeee08%o3", -"88888@e8228eeeeeee222e23", -"88888@eee82%eeee6%80ee23", -"88888@eeew8=%28%28eeee23", -"88888@eee220e82e826eee23", -"88888@ee:9eeeeeeee6%9e23", -"87333O3 3888888eeeee:==3", -"8=$$$>>>>>>>.&.eeeeee0%3", -"8=>>>qqqqqqq+4+%%%%%%%o3", -"8=>>>qqqqqqq+4+888888888", -"8=>>>qqqqqqq+4+888888888", -"8=>>>qqqqqqq+4+888888888", -"8=>>>qqqqqqq+4+888888888", -"8=>>$>>>>>>>+4+888888888", -"8=>3>>>>>>>>24+888888888", -"8=>3>>>>>>>>24+888888888", -"8=>>X####+$>+4+888888888", -"8=>>#;;;;&>q+4+888888888", -"8<->#;;;;&>q+4+888888888", -"88<$X####+$>.&.888888888", -"888333333333333888888888" -}; diff --git a/etc/gnus/subscribe.pbm b/etc/gnus/subscribe.pbm deleted file mode 100644 index fe6b392..0000000 Binary files a/etc/gnus/subscribe.pbm and /dev/null differ diff --git a/etc/gnus/subscribe.xpm b/etc/gnus/subscribe.xpm deleted file mode 100644 index 62db2da..0000000 --- a/etc/gnus/subscribe.xpm +++ /dev/null @@ -1,49 +0,0 @@ -/* XPM */ -static char *magick[] = { -/* columns rows colors chars-per-pixel */ -"24 24 19 1", -" c Gray6", -". c Gray12", -"X c #2ff42ff42ff4", -"o c #3fff3fff3fff", -"O c Gray28", -"+ c #53e353e353e3", -"@ c #5fe25fe25fe2", -"# c #67e767e767e7", -"$ c #6fff6fff6fff", -"% c #77d777d777d7", -"& c Gray50", -"* c Gray56", -"= c #9fff9fff9fff", -"- c Gray70", -"; c Gray75", -": c Gray81", -"> c #dfffdfffdfff", -", c #efffefffefff", -"< c Gray100", -/* pixels */ -";;;;;;;;;;;;;;;;;;;;;;;;", -";;;;;;;;;;;;;;;;;;;;;;;;", -";;;;;;;;;;;;;;;;;;;;;;;;", -";;;;@Xooooo oooXO-;;;;;;", -";;;;@;>;=<&&<:<;=< c #efffefffefff", -", c Gray100", -/* pixels */ -"------------------------", -"------------------------", -"------------------------", -"----@Xooooo oooXO=------", -"----@-,,,:-o,,,-o#------", -"----@-,,,@:o,,,-%;+-----", -"----@-;%@,,o,,,;ooX@----", -"----@@%o@%%.,,,,,,-@----", -"----@&-----X,,,,,,-@----", -"----@-,,,**o,,,,,,-@----", -"----@-:-**,o,,,,,,-@----", -"----@->%*,,o,,,,,,-@----", -"----@Xooooo ,,,,,,-@----", -"----@-,,,:-o,,,,,,-@----", -"----@-,,,@:o,,,,,,-@----", -"----@-;%@,,o,,,,,,-@----", -"----@@%o@%%.,,,,,,-@----", -"----@&-----X,,,,,,-@----", -"----@-,,,,,o,,,,,,-@----", -"----@-,,,,,o,,,,,,-@----", -"----@-,,,,,o,,,,,,-@----", -"----$XXXXXXXXXXXXXX$----", -"------------------------", -"------------------------" -}; diff --git a/etc/gnus/uu-decode.pbm b/etc/gnus/uu-decode.pbm deleted file mode 100644 index 2b7fada..0000000 Binary files a/etc/gnus/uu-decode.pbm and /dev/null differ diff --git a/etc/gnus/uu-decode.xpm b/etc/gnus/uu-decode.xpm deleted file mode 100644 index cdadff6..0000000 --- a/etc/gnus/uu-decode.xpm +++ /dev/null @@ -1,48 +0,0 @@ -/* XPM */ -static char *magick[] = { -/* columns rows colors chars-per-pixel */ -"24 24 18 1", -" c #2fef2fef2fef", -". c #3fff3fff3fff", -"X c #4ccc4ccc4ccc", -"o c #53e353e353e3", -"O c #566656665666", -"+ c #5fe35fe35fe3", -"@ c Gray45", -"# c #77d777d777d7", -"$ c Gray50", -"% c #866586658665", -"& c Gray56", -"* c Gray60", -"= c #9fff9fff9fff", -"- c Gray75", -"; c Gray81", -": c #dfffdfffdfff", -"> c #efffefffefff", -", c Gray100", -/* pixels */ -"------------------------", -"------------------------", -"------------------------", -"------------------------", -"-----#+++++++++++++&----", -"----- @@@@@@@@@@@@O+----", -"----- *%@@@@@@@@@&@+----", -"----- *X+$$$$$$$.@@+----", -"----- *X-,,,,,,,$@@+----", -"----- *X-,,;,,,,$@@+----", -"----- *X-:$$$-=,$@@+----", -"----- *X-+-+-$=,$@@+----", -"----- *X->$;;,,,$@@+----", -"----- *X--.$.,,,$@@+----", -"----- *X->--==,,$@@+----", -"----- *X-,,,,=;,$@@+----", -"----- *X-,,,,,,,$@@+----", -"----- *X-,,,,,,,$@@+----", -"----- *X&-------+@@+----", -"----- *@XXXXXXXXX%@+----", -"----- ************@+----", -"-----o #----", -"------------------------", -"------------------------" -}; diff --git a/etc/gnus/uu-post.pbm b/etc/gnus/uu-post.pbm deleted file mode 100644 index a5face7..0000000 Binary files a/etc/gnus/uu-post.pbm and /dev/null differ diff --git a/etc/gnus/uu-post.xpm b/etc/gnus/uu-post.xpm deleted file mode 100644 index b67fa8b..0000000 --- a/etc/gnus/uu-post.xpm +++ /dev/null @@ -1,57 +0,0 @@ -/* XPM */ -static char *magick[] = { -/* columns rows colors chars-per-pixel */ -"24 24 27 1", -" c Gray0", -". c #0bfb0bfb0bfb", -"X c Gray9", -"o c Gray12", -"O c #2fef2fef2fef", -"+ c #3fff3fff3fff", -"@ c Gray28", -"# c #4ccc4ccc4ccc", -"$ c #53e353e353e3", -"% c #566656665666", -"& c #5fe25fe25fe2", -"* c #6fff6fff6fff", -"= c Gray45", -"- c #77d777d777d7", -"; c Gray50", -": c #866586658665", -"> c Gray56", -", c Gray60", -"< c #9bcb9bcb9bcb", -"1 c #9fff9fff9fff", -"2 c #a7c7a7c7a7c7", -"3 c Gray70", -"4 c Gray75", -"5 c Gray81", -"6 c #dfffdfffdfff", -"7 c #efffefffefff", -"8 c Gray100", -/* pixels */ -"$44$44$44$44$44$44$44$44", -"444444444444-44444444444", -"4444444444-O-O,444444444", -"$44$44$2>O-4$4$@>3$44$44", -"444444&&&4444442&&-44444", -"44444$ XOOOOOOOOO..-4444", -"$44$4O,,,,,,,,,,,,=&4$44", -"44444O,=#########:=&4444", -"44444O,#>4444444&==&4444", -"$44$4O,#48888888;==&4$44", -"44444O,#48818888;==&4444", -"44444O,#45+1+1*8;==&4444", -"$44$4O,#4*6&8158;==&4$44", -"44444O,#46;61888;==&4444", -"44444O,#44o++888;==&4444", -"$44$4O,#48885;78;==&4$44", -"44444O,#48888468;==&4444", -"44444O,#48888888;==&4444", -"$44$4O,#48888888;==&4$44", -"44444O,#&;;;;;;;+==&4444", -"44444O,:=========>=&4444", -"$44$4O============%&4$44", -"44444-&&&&&&&&&&&&&>4444", -"444444444444444444444444" -}; diff --git a/etc/gnus/x-splash b/etc/gnus/x-splash deleted file mode 100644 index cbd1c2c..0000000 Binary files a/etc/gnus/x-splash and /dev/null differ diff --git a/etc/smilies/frown.pbm b/etc/smilies/frown.pbm deleted file mode 100644 index f51ea4f..0000000 Binary files a/etc/smilies/frown.pbm and /dev/null differ diff --git a/etc/smilies/smile.pbm b/etc/smilies/smile.pbm deleted file mode 100644 index f64e883..0000000 Binary files a/etc/smilies/smile.pbm and /dev/null differ diff --git a/etc/smilies/wry.pbm b/etc/smilies/wry.pbm deleted file mode 100644 index 5fa5e9f..0000000 Binary files a/etc/smilies/wry.pbm and /dev/null differ diff --git a/install-sh b/install-sh deleted file mode 100644 index e843669..0000000 --- a/install-sh +++ /dev/null @@ -1,250 +0,0 @@ -#!/bin/sh -# -# install - install a program, script, or datafile -# This comes from X11R5 (mit/util/scripts/install.sh). -# -# Copyright 1991 by the Massachusetts Institute of Technology -# -# Permission to use, copy, modify, distribute, and sell this software and its -# documentation for any purpose is hereby granted without fee, provided that -# the above copyright notice appear in all copies and that both that -# copyright notice and this permission notice appear in supporting -# documentation, and that the name of M.I.T. not be used in advertising or -# publicity pertaining to distribution of the software without specific, -# written prior permission. M.I.T. makes no representations about the -# suitability of this software for any purpose. It is provided "as is" -# without express or implied warranty. -# -# Calling this script install-sh is preferred over install.sh, to prevent -# `make' implicit rules from creating a file called install from it -# when there is no Makefile. -# -# This script is compatible with the BSD install script, but was written -# from scratch. It can only install one file at a time, a restriction -# shared with many OS's install programs. - - -# set DOITPROG to echo to test this script - -# Don't use :- since 4.3BSD and earlier shells don't like it. -doit="${DOITPROG-}" - - -# put in absolute paths if you don't have them in your path; or use env. vars. - -mvprog="${MVPROG-mv}" -cpprog="${CPPROG-cp}" -chmodprog="${CHMODPROG-chmod}" -chownprog="${CHOWNPROG-chown}" -chgrpprog="${CHGRPPROG-chgrp}" -stripprog="${STRIPPROG-strip}" -rmprog="${RMPROG-rm}" -mkdirprog="${MKDIRPROG-mkdir}" - -transformbasename="" -transform_arg="" -instcmd="$mvprog" -chmodcmd="$chmodprog 0755" -chowncmd="" -chgrpcmd="" -stripcmd="" -rmcmd="$rmprog -f" -mvcmd="$mvprog" -src="" -dst="" -dir_arg="" - -while [ x"$1" != x ]; do - case $1 in - -c) instcmd="$cpprog" - shift - continue;; - - -d) dir_arg=true - shift - continue;; - - -m) chmodcmd="$chmodprog $2" - shift - shift - continue;; - - -o) chowncmd="$chownprog $2" - shift - shift - continue;; - - -g) chgrpcmd="$chgrpprog $2" - shift - shift - continue;; - - -s) stripcmd="$stripprog" - shift - continue;; - - -t=*) transformarg=`echo $1 | sed 's/-t=//'` - shift - continue;; - - -b=*) transformbasename=`echo $1 | sed 's/-b=//'` - shift - continue;; - - *) if [ x"$src" = x ] - then - src=$1 - else - # this colon is to work around a 386BSD /bin/sh bug - : - dst=$1 - fi - shift - continue;; - esac -done - -if [ x"$src" = x ] -then - echo "install: no input file specified" - exit 1 -else - true -fi - -if [ x"$dir_arg" != x ]; then - dst=$src - src="" - - if [ -d $dst ]; then - instcmd=: - else - instcmd=mkdir - fi -else - -# Waiting for this to be detected by the "$instcmd $src $dsttmp" command -# might cause directories to be created, which would be especially bad -# if $src (and thus $dsttmp) contains '*'. - - if [ -f $src -o -d $src ] - then - true - else - echo "install: $src does not exist" - exit 1 - fi - - if [ x"$dst" = x ] - then - echo "install: no destination specified" - exit 1 - else - true - fi - -# If destination is a directory, append the input filename; if your system -# does not like double slashes in filenames, you may need to add some logic - - if [ -d $dst ] - then - dst="$dst"/`basename $src` - else - true - fi -fi - -## this sed command emulates the dirname command -dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` - -# Make sure that the destination directory exists. -# this part is taken from Noah Friedman's mkinstalldirs script - -# Skip lots of stat calls in the usual case. -if [ ! -d "$dstdir" ]; then -defaultIFS=' -' -IFS="${IFS-${defaultIFS}}" - -oIFS="${IFS}" -# Some sh's can't handle IFS=/ for some reason. -IFS='%' -set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` -IFS="${oIFS}" - -pathcomp='' - -while [ $# -ne 0 ] ; do - pathcomp="${pathcomp}${1}" - shift - - if [ ! -d "${pathcomp}" ] ; - then - $mkdirprog "${pathcomp}" - else - true - fi - - pathcomp="${pathcomp}/" -done -fi - -if [ x"$dir_arg" != x ] -then - $doit $instcmd $dst && - - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && - if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi -else - -# If we're going to rename the final executable, determine the name now. - - if [ x"$transformarg" = x ] - then - dstfile=`basename $dst` - else - dstfile=`basename $dst $transformbasename | - sed $transformarg`$transformbasename - fi - -# don't allow the sed command to completely eliminate the filename - - if [ x"$dstfile" = x ] - then - dstfile=`basename $dst` - else - true - fi - -# Make a temp file name in the proper directory. - - dsttmp=$dstdir/#inst.$$# - -# Move or copy the file name to the temp name - - $doit $instcmd $src $dsttmp && - - trap "rm -f ${dsttmp}" 0 && - -# and set any options; do chmod last to preserve setuid bits - -# If any of these fail, we abort the whole thing. If we want to -# ignore errors from any of these, just make sure not to ignore -# errors from the above "$doit $instcmd $src $dsttmp" command. - - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && - if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && - -# Now rename the file to the real destination. - - $doit $rmcmd -f $dstdir/$dstfile && - $doit $mvcmd $dsttmp $dstdir/$dstfile - -fi && - - -exit 0 diff --git a/lisp/ChangeLog b/lisp/ChangeLog deleted file mode 100644 index 5933326..0000000 --- a/lisp/ChangeLog +++ /dev/null @@ -1,5141 +0,0 @@ -2001-09-02 Benjamin Rutt - - * nnmbox.el (nnmbox-find-article): Fix infinite loop when - searching for an article that isn't in the mbox. - -2001-09-02 23:12:48 Lars Magne Ingebrigtsen - - * nnslashdot.el (nnslashdot-retrieve-headers-1): Get references - right, and get all the comments. - -2001-09-02 Simon Josefsson - Suggested by Dan Christensen - - * nnfolder.el (nnfolder-request-update-info): Fix message. - - * nnml.el (nnml-request-update-info): Ditto. - -2001-09-01 Simon Josefsson - - * nnml.el (nnml-request-expire-articles): Also bind - `nnml-current-group' and `nnml-article-file-alist' when using - expiry-target. (Otherwise nnml will be in a inconsistent internal - state causing all kind of problems.) - (nnml-request-expire-articles): If `nnml-article-to-file' or - `file-attributes' failes, return article as un-expirable instead - of treating it as expired. - -2001-08-31 Sam Steingold - - * imap.el (imap-mailbox-examine, imap-mailbox-examine-1): Fix a - typo: `exmine' --> `examine'. - -2001-08-30 13:00:00 ShengHuo ZHU - - * nndoc.el (nndoc-forward-type-p): It is not a digest. - -2001-08-30 11:00:00 ShengHuo ZHU - - * nnml.el (nnml-check-directory-twice): Remove. - (nnml-retrieve-headers): Ditto. - (nnml-article-to-file): Use nnheader-directory-files-is-safe. - -2001-08-30 Andrew Innes - - * nnheader.el (nnheader-directory-files-is-safe): No need to read - directory twice on Windows, or on GNU Emacs-21. - -2001-08-30 Andrew Innes - - * nnml.el (nnml-request-article): Use nnml-article-to-file-alist. - (nnml-request-rename-group): Ditto. - (nnml-active-number): Ditto. - (nnml-request-create-group): Use nnml-directory-articles. - (nnml-request-expire-articles): Use nnml-directory-articles, which - gets list from nov database if available. - (nnml-get-nov-buffer): New function. - (nnml-open-nov): Use it. - (nnml-update-file-alist): Use nnml-article-to-file-alist, which - gets alist from nov database if available. - (nnml-directory-articles): New function. - (nnml-article-to-file-alist): New function. - -2001-08-30 Andrew Innes - - * mm-decode.el (mm-display-external): Use `name' as filename, if - `filename' attribute is not present. - -2001-08-30 Andrew Innes - - * mail-source.el (mail-source-flash): New defcustom. - (mail-source-new-mail-p): Ring visible bell if appropriate. - (mail-source-start-idle-timer): Use unwind-protect to ensure idle - timer is cleared even if mail check signals an error. - -2001-08-29 10:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-move-article): Only update marks of - type 'list. - -2001-08-29 00:00:00 ShengHuo ZHU - - * flow-fill.el (fill-flowed): eol might be point-max. - -2001-08-27 Simon Josefsson - - * nnml.el (nnml-request-update-info): Fix message. - (nnml-open-marks): Ditto. - - * nnfolder.el (nnfolder-request-update-info): - (nnfolder-open-marks): Fix message. - -2001-08-25 Simon Josefsson - - * nnfolder.el (nnfolder-save-marks): Don't create directory named - after group in ~/. - -2001-08-25 Simon Josefsson - From Andreas Jaeger - - * nnfolder.el (nnfolder-open-marks): Fix typo. - * nnml.el (nnml-open-marks): Likewise. - -2001-08-25 Simon Josefsson - - Make nnfolder groups self-contained as far as marks are concerned. - - * nnfolder.el (nnfolder-marks-directory, nnfolder-marks-is-evil) - (nnfolder-marks, nnfolder-marks-file-suffix): New variables. - (nnfolder-open-server): Make marks directory. - (nnfolder-request-delete-group): Delete marks file. - (nnfolder-request-delete-group): Check of nov/marks file exist - before deleting. - (nnfolder-request-rename-group): Rename marks file. - (nnfolder-request-rename-group): Only rename nov/mark if they exists. - (nnfolder-request-set-mark, nnfolder-request-update-info) - (nnfolder-group-marks-pathname, nnfolder-save-marks) - (nnfolder-open-marks): New functions. - (top-level): Require gnus. - -2001-08-25 09:00:00 ShengHuo ZHU - - * nnweb.el (nnweb-type-definition): Use google raw file. - (nnweb-google-parse-1): Ditto. - (nnweb-google-identity): Ditto. - (nnweb-reference-wash-article): Move nnweb-decode-entities here. - (nnweb-altavista-wash-article): Ditto. - (nnweb-request-article): Remove nnweb-decode-entities. - - * nnml.el: Require 'gnus. - -2001-08-25 Simon Josefsson - - * nnml.el (nnml-marks-is-evil): Add doc. - -2001-08-25 Simon Josefsson - - * nnml.el (nnml-save-marks): Wrap saving marks in a - condition-case, to allow user to start Gnus if saving marks failed - for some reason. - -2001-08-24 16:05:38 Lars Magne Ingebrigtsen - - * gnus-spec.el (gnus-compile): Don't compile gnus-version. - - * gnus-group.el (gnus-update-group-mark-positions): Bind - gnus-group-update-hook to nil. - -2001-08-24 13:00:00 ShengHuo ZHU - - * mml.el (mml-generate-mime-1): Force as multibyte string. - -2001-08-24 12:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-insert-line) - (gnus-summary-prepare-threads): gnus-tmp-lines should be a string. - From Martin Kretzschmar - - * gnus-spec.el (gnus-correct-substring): Take optional END. - - * nnrss.el (nnrss-request-article): Remove \n. - (nnrss-retrieve-headers): Lines number is -1. - -2001-08-24 Simon Josefsson - - * gnus-group.el (gnus-info-clear-data): Call - nnfoo-request-set-mark to propagate marks. Fix bug: - `gnus-group-update-line' doesn't update read range unless we call - `gnus-get-unread-articles-in-group' first. - - * nnimap.el (nnimap-request-set-mark): Don't propagate seen flags - to server. - -2001-08-23 21:00:00 ShengHuo ZHU - - * gnus-util.el (gnus-create-info-command): Return an interactive - function. - -2001-08-23 19:00:00 ShengHuo ZHU - From Katsumi Yamaoka - - * gnus-spec.el (gnus-parse-complex-format): Use equal. - -2001-08-23 18:43:05 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-select-newsgroup): Use it. - - * gnus-util.el (gnus-not-ignore): New function. - - * lpath.el (featurep): Don't fbind char-int. - - * gnus-util.el (gnus-create-info-command): New function. - - * gnus-group.el (gnus-group-edit-group): Make C-c C-i go to the - right node. - - * gnus-sum.el (gnus-select-newsgroup): Clean up. - (gnus-summary-limit-children): Use 'identity instead of `all'. - (gnus-summary-limit-to-display-predicate): New command and - keystroke. - -2001-08-23 10:00:00 ShengHuo ZHU - - * nnrss.el (nnrss-group-alist): Use fm-releases.rdf. - - * gnus-spec.el (gnus-format-specs): Miss a right parenthesis. - -2001-08-23 18:43:05 Lars Magne Ingebrigtsen - - * gnus-spec.el: Add the Gnus version. - (gnus-update-format-specifications): If the Gnus version changes, - nix out the format spec cache. - - * gnus.el (gnus-continuum-version): Made into a command and - optionalize the VERSION. - - * gnus-spec.el (gnus-parse-complex-format): Remove %C specs from - the start of the lines. - -2001-08-22 00:06:52 Lars Magne Ingebrigtsen - - * gnus.el (gnus-visual-p): Define function before use of - function. - -2001-08-21 23:28:02 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-adjust-marked-articles): Use new variable. - (gnus-article-mark-to-type): New function. - (gnus-update-missing-marks): Only update marks of type 'list. - - * gnus.el (gnus-article-special-mark-lists): New variable. - -2001-08-21 12:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-limit-children): Check 'all. - (gnus-select-newsgroup): Still use 'all. - (gnus-summary-initial-limit): Comparing with 'all. - -2001-08-20 16:00:00 ShengHuo ZHU - - * gnus-start.el (gnus-activate-group): If dont-check, don't update - active. - -2001-08-20 15:00:00 ShengHuo ZHU - - * nnslashdot.el (nnslashdot-retrieve-headers-1): Replace - nnslashdot-*-retrieve-headers. - (nnslashdot-request-article): Fix for slashcode 2.2. - (nnslashdot-make-tuple): New. - (nnslashdot-read-groups): Use it. - -2001-08-20 01:34:03 Lars Magne Ingebrigtsen - - * gnus.el (gnus-expand-group-parameters): Don't alter the variable - list. - - * gnus-sum.el (gnus-summary-move-article): Don't select article. - -2001-08-20 Simon Josefsson - - * gnus-msg.el (gnus-inews-do-gcc): If archive server can't be - opened, error instead of continuing (and exploding later). - -2001-08-20 01:34:03 Lars Magne Ingebrigtsen - - * gnus.el (gnus-expand-group-parameters): Return the parameter - list. - - * gnus-sum.el (gnus-summary-show-article): Doc fix. - (gnus-summary-show-article): Guess at charset if required. - - * gnus-spec.el (gnus-correct-substring): Stopped one character - before we wanted. - -2001-08-19 Pavel Jan,Bm(Bk - - * earcon.el (earcon-auto-play): Remove unused option. - -2001-08-19 16:14:41 Lars Magne Ingebrigtsen - - * gnus-score.el (gnus-score-headers): Move the "Scoring..." - message down in levels, since it happens very fast. - - * smiley-ems.el (smiley-update-cache): Respect the symbol version - of smiley-regexp-alist. - - * mm-view.el (mm-inline-text): Ignore vcard errors. - - * gnus-art.el (gnus-ignored-headers): Added more junk headers. - - * gnus-score.el (gnus-all-score-files): Use append instead of - nconc. - - * gnus.el (gnus-splash-face): Doc fix. - - * mm-decode.el (mm-mailcap-command): Use - mm-path-name-rewrite-functions. - (mm-path-name-rewrite-functions): New variable. - - * gnus-spec.el (gnus-parse-complex-format): React to ?=. - (gnus-complex-form-to-spec): Insert tab. - (gnus-spec-tab): New function. - - * gnus-sum.el (gnus-select-newsgroup): Set the marks before - entering the group. - - * gnus-spec.el (gnus-complex-form-to-spec): Insert Lisp to match - the positional spec. - (gnus-parse-complex-format): React to %C. - - * gnus-ems.el (gnus-char-width): Moved here. - - * gnus-sum.el (gnus-select-newsgroup): Set - gnus-newsgroup-articles. - (gnus-unseen-mark): New variable. - (gnus-newsgroup-unseen): Ditto. - (gnus-newsgroup-seen): Ditto. - (gnus-adjust-marked-articles): Use them. - (gnus-update-marks): Use them. - (gnus-summary-update-secondary-mark): Display. - (gnus-summary-prepare-threads): Display. - - * gnus-msg.el (gnus-inews-group-method): Use and return the - method, not the server. - -2001-08-19 Simon Josefsson - - * gnus-srvr.el (gnus-server-agent-face): New. - (gnus-server-agent-face): New. - (gnus-server-mode): Turn on font-lock-mode. - - * gnus.el (gnus-server-visual): Add defgroup. - -2001-08-19 Simon Josefsson - From Joe Casadonte - - * gnus-srvr.el (gnus-server-opened-face, gnus-server-closed-face, - gnus-server-denied-face): New. - (gnus-server-opened-face, gnus-server-closed-face, - gnus-server-denied-face): New. - (gnus-server-font-lock-keywords): Add. - -2001-08-19 Simon Josefsson - - * nnml.el (nnml-request-set-mark): Return nil. - (nnml-save-marks): Use nnml-possibly-create-directory. - (nnml-open-marks): Only work in temp buffer when inserting/reading - .marks file. - -2001-08-18 19:00:00 ShengHuo ZHU - - * gnus.el (gnus-expand-group-parameters): Fix. - - * gnus-spec.el (gnus-char-width): New. - (gnus-correct-substring, gnus-correct-length): Use it. - - * message.el (message-required-mail-headers): Fix doc. - -2001-08-18 18:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-group-make-articles-read): gnus-request-set-mark. - - * mm-decode.el (mm-save-part-to-file): Insert the handle. - -2001-08-18 13:00:00 ShengHuo ZHU - - * nnslashdot.el (nnslashdot-threaded-retrieve-headers): - slashdot 2.2 (not fully fixed yet). - (nnslashdot-request-article): Ditto. - -2001-08-18 Simon Josefsson - - * gnus-util.el (gnus-remassoc, gnus-update-alist-soft): Moved from - nnimap. - - * nnimap.el (nnimap-remassoc, nnimap-update-alist-soft): Moved to - gnus-util. - (nnimap-request-update-info-internal): Use new functions. - - * nnml.el (nnml-request-set-mark, nnml-request-update-info): Use - new functions. - -2001-08-18 Simon Josefsson - - Make nnml groups self-contained as far as marks are concerned. - - * nnml.el (nnml-request-delete-group): Delete marks file. - (nnml-request-rename-group): Move marks file. - (nnml-marks-file-name, nnml-marks-is-evil, nnml-marks): New server - variables. - (nnml-request-set-mark, nnml-request-update-info): New server - functions. - (nnml-save-marks, nnml-open-marks): New functions. - -2001-08-18 Simon Josefsson - - * gnus-sum.el (gnus-summary-move-article): Use `add' instead of - `set' when setting marks. - -2001-08-17 22:00:00 ShengHuo ZHU - - * gnus.el (gnus-info-find-node): Take an argument. - - * gnus-art.el (gnus-button-handle-info): New. - (gnus-url-unhex-string): Replace "+" with " ". - -2001-08-17 21:00:00 ShengHuo ZHU - - * message.el (message-check-news-header-syntax): Check bad From. - -2001-08-18 00:14:45 Lars Magne Ingebrigtsen - - * gnus-spec.el (gnus-correct-length): New function. - (gnus-correct-substring): New function. - (gnus-tilde-max-form): Use it. - -2001-08-17 Nevin Kapur - - * nnmh.el: Docstring changes as below. - - * nnml.el: Docstring changes as below. - - * nnbabyl.el: Docstring changes as below. - - * nnmbox.el: Docstring changes as below. - - * nnfolder.el: Added docstrings identifying each virtual server - parameter. - -2001-08-18 Simon Josefsson - - * mml.el (mml-menu): Collapse Attach, Insert and Security submenu. - -2001-08-17 Bj,Av(Brn Torkelsson - - * message.el: rename "Abort Message" to "Postpone Message". - Remove "Attach file as MIME" from Message menu, it's already in - the MIME menu. - -2001-08-17 14:00:00 ShengHuo ZHU - - * smime.el (smime-point-at-eol): eval-and-compile. - (smime-make-temp-file): New. - (smime-sign-region, smime-encrypt-region, smime-decrypt-region): - Use it. - -2001-08-17 10:41:14 Lars Magne Ingebrigtsen - - * gnus-agent.el (gnus-agent-fetch-group): Go online if offline. - (gnus-agent-summary-fetch-group): New command and keystroke. - - * gnus-art.el (gnus-insert-mime-button): Tiny clean-up. - (gnus-mime-display-security): Make it respect - gnus-unbuttonized-mime-type-p. - - * gnus-sum.el (gnus-articles-to-read): Comments. - (gnus-article-marked-p): New function. - (gnus-summary-display-make-predicate): New function. - (gnus-select-newsgroup): Use them. - - * mm-decode.el (mm-save-part-to-file): Made it not error. - -2001-08-17 Simon Josefsson - - * imap.el (imap-wait-for-tag): If process-status isn't open or - run, return nil instead of sit-for looping. - -2001-08-17 10:41:14 Lars Magne Ingebrigtsen - - * lpath.el (featurep): fbind xml-parse-region. - - * gnus.el (gnus-message-archive-method): Default to "archive". - (gnus-message-archive-method): Doc fix. - (gnus-parameters-get-parameter): Cleaned up. - (gnus-expand-group-parameter): New function. - - * gnus-start.el (gnus-setup-news): Push the archive server only - the server list. - - * mml.el (mml-menu): Changed name to "Attachments". - - * mm-decode.el (mm-destroy-postponed-undisplay-list): Only message - when there is something to detroy. - -2001-05-21 17:11:46 Lars Magne Ingebrigtsen - - * gnus-srvr.el (gnus-server-browse-in-group-buffer): Default to - nil. - -2001-08-15 Kai Gro,A_(Bjohann - - * gnus-delay.el (gnus-delay-article): Allow "01:23" time spec, - which specifies a time today or tomorrow. - -2001-08-15 Simon Josefsson - From Pavel@Janik.cz (Pavel Jan,Bm(Bk) - - * gnus-agent.el (gnus-agent-make-mode-line-string) - (gnus-agent-toggle-plugged): Use new API. - -2001-08-14 Kai Gro,A_(Bjohann - - * gnus-delay.el (gnus-delay-send-drafts): Fix check whether - deadline has expired. - -2001-08-12 Simon Josefsson - Suggested by Kai.Grossjohann@CS.Uni-Dortmund.DE - - Support `recent' mark indicating newly arrived messages (to - separate from old but unread messages). - - * nnimap.el (nnimap-retrieve-groups): Push dummy article into - `nnmail-split-history' if recent is > 0. - (nnimap-request-update-info-internal): Update `recent' marks. - (nnimap-request-set-mark): Never set `recent' marks. - (nnimap-mark-to-predicate-alist, nnimap-mark-to-flag-alist): Add - recent. - - * gnus-sum.el (gnus-recent-mark): New mark. - (gnus-newsgroup-recent): New variable. - (gnus-summary-local-variables): Add gnus-newsgroup-recent. - (gnus-summary-prepare-threads): Mark recent articles. - (gnus-summary-add-mark): Support recent. - (gnus-summary-update-secondary-mark): Support recent. - - * gnus.el (gnus-article-mark-lists): Add recent. - -2001-08-12 Simon Josefsson - - * mm-bodies.el (mm-decode-content-transfer-encoding): Returns - whether successful decoding took place. Add doc. - -2001-08-12 Simon Josefsson - Suggested by Per Abrahamsen - - * gnus.el (gnus-summary-line-format, gnus-parameters): - * gnus-gl.el (gnus-summary-grouplens-line-format): - * gnus-salt.el (gnus-summary-pick-line-format): - * gnus-spec.el (gnus-format-specs): %n is 23 chars. - -2001-08-11 09:40:00 Karl Kleinpaste - Committed by Kai Gro,A_(Bjohann. - - * gnus-score.el (gnus-score-string): Fix `match' regexp - for `extra' header case. - -2001-08-10 23:00:00 ShengHuo ZHU - - * nnmbox.el (nnmbox-read-mbox): No warning. - -2001-08-10 21:00:00 ShengHuo ZHU - - * nndoc.el (nndoc-article-type): Fix doc. - (nndoc-generate-article-function): New. - (nndoc-dissection-function): New. - (nndoc-type-alist): Add oe-dbx. - (nndoc-oe-dbx-type-p): New. - (nndoc-oe-dbx-dissection): New. - (nndoc-oe-dbx-generate-article): New. - -2001-08-11 Kai Gro,A_(Bjohann - - * gnus-delay.el (gnus-delay-send-drafts): Cleaner way to check - whether deadline has been reached. Patch from Dan Nicolaescu - . - -2001-08-10 02:00:00 ShengHuo ZHU - - * gnus-ml.el (turn-on-gnus-mailing-list-mode): Use - gnus-group-find-parameter. Suggested by Janne Rinta-Manty - . - - * mail-source.el (mail-source-movemail): The error buffer is - modified, but nothing in it. - -2001-08-10 01:00:00 ShengHuo ZHU - - * message.el (message-bogus-system-names): New. - (message-make-fqdn): Use it. - -2001-08-09 15:00:00 ShengHuo ZHU - - * nndraft.el (nndraft-request-group): Use - nndraft-auto-save-file-name. - -2001-08-09 Simon Josefsson - - * mm-view.el (mm-view-pkcs7-decrypt): Operate in current buffer. - Don't ask whether to decrypt. Just leave result in buffer (don't - call mm). - - * mm-decode.el (mm-dissect-buffer): Possibly verify/decrypt single - parts as well. - (mm-inline-media-tests): Ignore application/{x-,}pkcs7-mime. - (mm-possibly-verify-or-decrypt): Support application/{x-,}pkcs7-mime. - -2001-08-09 Simon Josefsson - - * mm-decode.el (mm-insert-part): Return decoding success status. - (mm-save-part-to-file): Error if decoding failed. - -2001-08-09 10:00:00 ShengHuo ZHU - - * message.el (message-tab): Use indent-relative. - (message-mode): Don't bind indent-line-function to indent-relative. - -2001-08-09 Simon Josefsson - - * message.el (message-get-reply-headers): Fix string. Suggested by - Christoph Conrad . - -2001-08-08 15:00:00 ShengHuo ZHU - - * message.el (message-tab): Use the current value of - indent-line-function. - (message-mode): Bind indent-line-function to indent-relative. - -2001-08-08 Simon Josefsson - - * imap.el (imap-gssapi-auth-p, imap-kerberos4-auth-p): Also check - whether `imtest' is installed. - -2001-08-04 Nuutti Kotivuori - Committed by ShengHuo ZHU - - * gnus-sum.el (gnus-summary-show-article): Call - gnus-summary-update-secondary-secondary-mark. - * gnus-sum.el (gnus-summary-edit-article-done): Ditto. - * gnus-sum.el (gnus-summary-reparent-thread): Ditto. - -2001-08-07 16:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-make-menu-bar): Misc -> Gnus. - - * gnus-group.el (gnus-group-make-menu-bar): Ditto. - - * mm-uu.el (mm-uu-dissect): Autoload. From Gerd M,Av(Bllmann - . - - * gnus-art.el (gnus-output-to-file): Bind file-name-coding-system. - - * gnus-util.el (gnus-output-to-rmail): Ditto. - (gnus-output-to-mail): Ditto. - - * nnmail.el (nnmail-pathname-coding-system): Set default to nil. - -2001-08-06 Florian Weimer - - * message.el (message-indent-citation): Use - `message-yank-cited-prefix' for empty lines. - -2001-08-05 Florian Weimer - - * message.el (message-indent-citation): Quote only lines starting - with ">" using `message-yank-cited-prefix'. - -2001-08-05 Nuutti Kotivuori - - * gnus-cache.el (gnus-cache-possibly-enter-article): Use - gnus-cache-fully-p. - -2001-08-04 Simon Josefsson - - * gnus-cache.el (gnus-cache-possibly-update-active): Create active - file if it doesn't exist (by calling gnus-cache-read-active). - -2001-08-04 Simon Josefsson - - * gnus-cache.el (gnus-cache-possibly-enter-article): Revert. - (gnus-cache-passively-or-fully-p): Removed. - (gnus-cache-fully-p): Fix it. - - * mm-view.el (mm-pkcs7-signed-magic): Support more ASN.1 lengths. - -2001-08-04 Simon Josefsson - - * gnus-cache.el (gnus-cache-fully-p) - (gnus-cache-passively-or-fully-p): New functions. - (gnus-cache-possibly-enter-article): Cosmetic change, use - `g-c-p-o-f-p'. - (gnus-cache-possibly-enter-article): Use `g-c-p-u-a'; last change - was bogus (`g-c-p-a-a' does not change active info, just change - the functions parameters). - (gnus-cache-possibly-remove-articles-1): Make sure articles are - not removed in groups that match `gnus-uncacheable-groups'. - - Reported and modifications based on discussions with Nuutti - Kotivuori . - -2001-08-04 Nuutti Kotivuori - Committed by Simon Josefsson - - * gnus-cache.el (gnus-cache-possibly-update-active): New function; - calls `gnus-cache-update-active' if bounds has been extended. - -2001-08-04 10:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-mime-security-verify-or-decrypt): Insert - before remove. - (gnus-mime-security-show-details): Ditto. - -2001-08-04 Kai Gro,A_(Bjohann - - * nnmail.el (nnmail-split-fancy-with-parent): Correct `mapconcat' - syntax. Protect string-match against nil string and regexp. - -2001-08-03 19:00:00 ShengHuo ZHU - - * mm-util.el (mm-find-charset-region): Remove control-1. - -2001-08-03 17:00:00 ShengHuo ZHU - - * mm-decode.el (mm-readable-p): Emacs 20 takes one argument. - -2001-08-04 Simon Josefsson - - * smime.el (smime-sign-region, smime-encrypt-region): Fix details - buffer. Delete MIME-Version header. - -2001-08-03 Simon Josefsson - - * gnus-cache.el (gnus-cache-possibly-enter-article): The article - that is entered does not necessarily have the highest article - number in the group, so use `gnus-cache-possibly-alter-active' - instead of `gnus-cache-update-active'. - -2001-08-03 10:00:00 ShengHuo ZHU - - * mml2015.el (mml2015-gpg-extract-signature-details): Don't barf. - -2001-08-03 Simon Josefsson - - * mml.el (mml-menu): Rename from MML to Mime. Collapse Security - menu. - -2001-08-02 Katsumi Yamaoka - - * gnus.el (post-method): New group parameter. It also provides - the user option `gnus-post-method-alist' and the internal function - `gnus-parameter-post-method'. - - * gnus-msg.el (gnus-post-method): Bind the value of - `gnus-post-method' to the group parameter if it is defined. - -2001-08-02 Simon Josefsson - - * smime.el (smime-extra-arguments): Removed. - (smime-call-openssl-region): Don't use it. - -2001-08-02 Simon Josefsson - - * smime.el (smime-sign-region): Handle stderr. - (smime-encrypt-region): Ditto. - - * mm-view.el (mm-pkcs7-signed-magic): Make it a regexp. Don't - match the ASN.1 length bytes. - (mm-pkcs7-enveloped-magic): Ditto. - (mm-view-pkcs7-get-type): Don't regexp quote. - -2001-08-01 14:00:00 ShengHuo ZHU - From Andreas Fuchs - - * mml2015.el (mml2015-trust-boundaries-alist): Typo. - -2001-08-01 10:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-header-button-alist): References regexp. - -2001-08-01 Gerd Moellmann - - * mm-view.el (autoload): Don't autoload `diff-mode' if it's - already fboundp. Add INTERACTIVE arg to autoload form. - -2001-08-01 09:00:00 ShengHuo ZHU - - * nnslashdot.el (nnslashdot-init): Add as gnus buffer. - - * nnmail.el (nnmail-cache-open): Ditto. - -2001-07-31 21:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-button-fetch-group): Fix the regexp. - -2001-07-31 Katsumi Yamaoka - - * gnus-msg.el (gnus-post-method): Refer to `gnus-parameters'. - -2001-07-31 17:00:00 ShengHuo ZHU - Originally from Pavel Jan,Bm(Bk - - * gnus-agent.el (gnus-agent-make-mode-line-string): New. - (gnus-agent-toggle-plugged): Use it. - -2001-07-31 ShengHuo ZHU - - * gnus-start.el (gnus-startup-file-coding-system): Revert to binary. - (gnus-ding-file-coding-system): New variable. - (gnus-read-newsrc-el-file, gnus-save-newsrc-file) - (gnus-slave-save-newsrc): Use it. - -2001-07-31 Kai Gro,A_(Bjohann - - * gnus-delay.el (gnus-delay-initialize): Use standard define-key - syntax. - -2001-07-30 15:00:00 ShengHuo ZHU - Originally from Andreas Fuchs - - * mml2015.el (mml2015-trust-boundaries-alist) - (mml2015-gpg-pretty-print-fpr): New. - (mml2015-gpg-extract-signature-details): More details, rename from - `m-g-e-from'. - (mml2015-gpg-verify): Use them. - (mml2015-gpg-clear-verify): Use them. - -2001-07-31 Simon Josefsson - - * mml-smime.el (mml-smime-sign, mml-smime-encrypt): Goto end of - buffer when done. - -2001-07-30 Simon Josefsson - - * smime.el (smime-call-openssl-region): Revert previous change, - just pass on buf to `call-process-region'. - (smime-verify-region): Doc fix. Don't message stuff. Use - `smime-new-details-buffer'. Inserts error messages into buffer. - (smime-noverify-region): Ditto. - (smime-decrypt-region): Ditto. Handles stderr separately. - (smime-verify-buffer, smime-noverify-buffer) - (smime-decrypt-buffer): Doc fix. - (smime-new-details-buffer): New function. - (smime-pkcs7-region, smime-pkcs7-certificates-region) - (smime-pkcs7-email-region): Use `smime-new-details-buffer'. - (smime-sign-region, smime-encrypt-region): Don't use - `insert-buffer'. - - * mml-smime.el (mml-smime-verify): Fix security button strings. - -2001-07-30 12:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-mime-save-part-and-strip): Save - gnus-article-mime-handles. - -2001-07-29 Simon Josefsson - - * mail-source.el (top-level): Require message for message-directory. - (mail-source-directory): Change default to message-directory. - - * smime.el (smime-keys, smime-CA-directory, smime-CA-file) - (smime-certificate-directory, smime-openssl-program) - (smime-encrypt-cipher, smime-dns-server): Fix doc (leading "*"). - (smime-extra-arguments): New variable. - (smime-dns-server): Fix customize group. - (smime-call-openssl-region): Use `smime-extra-arguments'. - -2001-07-29 Simon Josefsson - From Vladimir Volovich - - * smime.el (smime-call-openssl-region): Ignore stderr. - -2001-07-29 Simon Josefsson - From Christoph Conrad - - * gnus-agent.el (gnus-agent-save-group-info): Don't destroy active - file. - -2001-07-29 Simon Josefsson - - * mm-view.el (mm-view-pkcs7-decrypt): Adhere to `mm-decrypt-option'. - - Support S/MIME decryption. - - * mm-decode.el (mm-inline-media-tests): - (mm-inlined-types): - (mm-automatic-display): - (mm-attachment-override-types): Add application/{x-,}pkcs7-mime. - - * mm-view.el (mm-pkcs7-signed-magic): - (mm-pkcs7-enveloped-magic): New variables. - (mm-view-pkcs7-get-type): New function; identify PKCS#7 type. - (mm-view-pkcs7): New function; mm viewer for PKCS#7 blobs. - (mm-view-pkcs7-decrypt): New function; mm viewer for encrypted - PKCS#7 blobs. - - * smime.el (smime-decrypt-region): Expand keyfile. - -2001-07-29 Simon Josefsson - - * nntp.el (nntp-open-ssl-stream): Don't mess with internal - `ssl.el' variables. - - * gnus-agent.el (gnus-agent-save-group-info): Delete everything - but line instead of narrowing to it, because `nnmail-parse-active' - calls widen. Thanks to Christoph Conrad - . - -2001-07-29 Kai Gro,A_(Bjohann - - * gnus.el (gnus-summary-line-format): Mention `gnus-sum-thread-*' - for %B spec. - - * gnus-sum.el (gnus-summary-prepare-threads): If - gnus-sum-thread-tree-root is nil, use subject instead. - (gnus-sum-thread-tree-root, gnus-sum-thread-tree-single-indent) - (gnus-sum-thread-tree-vertical, gnus-sum-thread-tree-indent) - (gnus-sum-thread-tree-leaf-with-other) - (gnus-sum-thread-tree-single-leaf): Documentation. - (gnus-sum-thread-tree-single-indent): Allow nil. - -2001-07-28 09:00:00 ShengHuo ZHU - - * message.el (message-fill-paragraph): Do nothing if the user - wants filladapt-mode. - -2001-07-27 23:00:00 ShengHuo ZHU - - * mm-decode.el (mm-image-type-from-buffer): New. - (mm-get-image): Use it. - -2001-07-27 18:00:00 ShengHuo ZHU - - * gnus.el (gnus-large-newsgroup): If it is nil, ... - - * gnus-art.el (gnus-mime-view-all-parts): buffer-read-only covers - mm-display-parts too. - -2001-07-27 12:00:00 ShengHuo ZHU - - * nnfolder.el (nnfolder-request-accept-article): Bind - nntp-server-buffer. - - * nnmail.el (nnmail-parse-active): Read from buffer instead of - nntp-server-buffer. - -2001-07-27 11:00:00 ShengHuo ZHU - - * message.el (message-check-news-header-syntax): Use - message-post-method. - (message-send-news): Bind message-post-method. - -2001-07-27 07:00:00 ShengHuo ZHU - - * mml.el (mml-tweak-type-alist): New. - (mml-tweak-function-alist): New. - (mml-tweak-part): New. - (mml-generate-mime-1): Use it. - -2001-07-26 22:00:00 ShengHuo ZHU - - * nnfolder.el (nnfolder-request-accept-article): Replace - nnfolder-request-list. - -2001-07-27 Simon Josefsson - - * nnimap.el (nnimap-open-server): Set nnimap-server-buffer if - nnoo-change-server failed to do it. - -2001-07-26 16:00:00 ShengHuo ZHU - - * gnus.el (gnus-parameters): Make it customizable. - -2001-07-26 15:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-mm-display-part): Narrow to point if eobp. - - * message.el (message-set-auto-save-file-name): More - poor-system-types. - - * mailcap.el (mailcap-parse-mimetypes): poor-system-types. - - * gnus-ems.el (nnheader-file-name-translation-alist): M$Windows-NT - supports +. - -2001-07-26 14:00:00 ShengHuo ZHU - - * mm-decode.el (mm-readable-p): New. - (mm-inline-media-tests): Fix the default testers. - -2001-07-26 Simon Josefsson - - * nnimap.el (nnimap-version): Bump version number. - -2001-07-26 10:00:00 ShengHuo ZHU - From Steven E. Harris - - * nnheader.el (nnheader-translate-file-chars): cygwin32 is running - in M$Windows too. - -2001-07-26 Kai Gro,A_(Bjohann - - * gnus-delay.el (gnus-delay-send-drafts): Don't `error'. - -2001-07-25 21:00:00 ShengHuo ZHU - - * gnus-bcklg.el (gnus-backlog-shutdown): Make interactive. - - * mm-decode.el (mm-get-image): Guess then use the type. - - * gnus-art.el (gnus-mime-view-part-as-type): Don't copy cache. - -2001-07-25 12:54:00 Danny Siu - - * gnus-sum.el (gnus-summary-prepare-threads): Shouldn't do tree - display (%B) for threads if threading is off. - -2001-07-25 14:00:00 ShengHuo ZHU - From Henrik Enberg - - * gnus-msg.el: Customization patch. - -2001-07-25 22:22:22 Raymond Scholz - - * nnmail.el (nnmail-split-fancy-with-parent-ignore-groups): New - variable. - (nnmail-split-fancy-with-parent): Ignore certain groups. - -2001-07-25 11:00:00 ShengHuo ZHU - - * gnus-util.el (gnus-byte-compile): New. - (gnus-use-byte-compile): New. - (gnus-make-sort-function): Use it. - - * nnmail.el (nnmail-get-new-mail): Use it. - - * gnus-agent.el (gnus-category-make-function): Simple function or - compiled function. - (gnus-agent-fetch-group-1): Don't use (caaddr predicate). - - * gnus-gl.el (bbb-build-rate-command): Remove quote before lambda. - * gnus-topic.el (gnus-topic-sort-topics-1): Ditto. - (gnus-topic-sort-topics-1): Use gnus-byte-compile. - - * message.el (message-check-news-header-syntax): Remove quote. - -2001-07-24 19:00:00 ShengHuo ZHU - - * message.el (message-use-mail-followup-to): `t' is not a - documented value. - -2001-07-24 13:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-display-arrow): Test fboundp. - -2001-07-24 12:00:00 ShengHuo ZHU - - * mm-encode.el (mm-encode-buffer): Don't use 7bit encoding if - there are long lines. - -2001-07-24 Katsumi Yamaoka - - * dgnushack.el (copy-list): New compiler macro. - -2001-07-24 09:00:00 ShengHuo ZHU - - * message.el (message-bounce): If no Return-Path, the whole - content is considered as the original message. - - * nnml.el (nnml-check-directory-twice): New. - (nnml-article-to-file): Use it. - (nnml-retrieve-headers): Hack it. - -2001-07-24 02:00:00 ShengHuo ZHU - - * gnus-win.el (gnus-buffer-configuration): New configure. - - * gnus-art.el (gnus-mm-display-part): Don't select-window if it is - not alive. - - * mm-decode.el (mm-remove-part): Don't murder the current window (nil). - (mm-display-external): Use display-term configure. - -2001-07-24 Kai Gro,A_(Bjohann - - * gnus-delay.el (gnus-delay-default-hour): New variable. - (gnus-delay-article): Allow specific date in YYYY-MM-DD format. - -2001-07-23 22:00:00 ShengHuo ZHU - From Karl Kleinpaste - - * gnus-sum.el (gnus-summary-line-format-alist): Add %B. - (gnus-summary-prepare-threads): Ditto. - - * gnus.el (gnus-summary-line-format): Add %B. - -2001-07-23 19:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-articles-to-read): Use gnus-group-decoded-name. - - * mm-util.el (mm-string-as-multibyte): New. - - * nnmh.el (nnmh-request-list-1): Encode, not decode! - -2001-07-23 18:00:00 ShengHuo ZHU - - * mm-util.el (mm-universal-coding-system): New. - - * gnus-start.el (gnus-startup-file-coding-system): Use it. - - * score-mode.el (score-mode-coding-system): Use it. - -2001-07-23 Katsumi Yamaoka - - * gnus-start.el (gnus-setup-news): Call - `gnus-check-bogus-newsgroups' just after the native server is - opened. - -2001-07-23 Kai Gro,A_(Bjohann - - * nnmail.el (nnmail-do-request-post): Util function to be used by - `nnchoke-request-post' for all nnmail-derived backends. - - * nnml.el (nnml-request-post): Use it. - - * gnus.el (gnus-valid-select-methods): nnml is a post-mail - backend, for it groks nnml-request-post. - - * gnus-group.el (gnus-group-highlight, gnus-group-highlight-line): - Treat `mail-post' backends like `mail' backends, not like `news' - backends. - -2001-07-22 09:00:00 ShengHuo ZHU - - * gnus-msg.el (gnus-setup-message): make-local-hook. - -2001-07-22 Kai Gro,A_(Bjohann - - * gnus-delay.el (gnus-delay-article): Fix `read-string' for - XEmacs. Allow more units. Submitted by Karl Kleinpaste - , slightly changed by Kai. - - * message.el (message-check-news-header-syntax): When checking - whether the groups exist, check the right server based on - `gnus-post-method'. - -2001-07-21 Kai Gro,A_(Bjohann - - * gnus-delay.el: New file. - -2001-07-21 13:00:00 ShengHuo ZHU - - * mm-util.el (mm-read-coding-system): Take two arguments. - - * gnus-sum.el (gnus-summary-show-article): Use - mm-read-coding-system. - - * gnus-art.el (article-de-quoted-unreadable): - (article-de-base64-unreadable, article-wash-html): - (gnus-mime-inline-part, gnus-mime-view-part-as-charset): Ditto. - -2001-07-21 Kai Gro,A_(Bjohann - - * nnml.el (nnml-request-post): New function. Can be used for - annotations in nnml groups. - -2001-07-19 Katsumi Yamaoka - - * nntp.el (nntp-request-newgroups): Use UTC date for NEWGROUPS - command. - - * gnus-start.el (gnus-find-new-newsgroups): Use - `message-make-date' instead of `current-time-string'. - (gnus-ask-server-for-new-groups): Ditto. - (gnus-check-first-time-used): Ditto. - -2001-07-20 11:00:00 ShengHuo ZHU - - * gnus-score.el (gnus-home-score-file): nnheader-translate-file-chars. - -2001-07-18 Per Abrahamsen - - * message.el (message-shorten-references): Change `maxcount' and - `cut' to obey USEFOR draft 5. - -2001-07-12 Colin Walters - - * gnus-sum.el (gnus-summary-display-arrow): New variable. - (gnus-summary-set-article-display-arrow): New function. - (gnus-summary-goto-subject): Use it. - -2001-07-18 12:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-import-article): Insert date if - doesn't exist. - -2001-07-18 11:00:00 ShengHuo ZHU - - * mml.el (mml-content-type-parameters): New. - (mml-content-disposition-parameters): New. - (mml-insert-mime-headers): Use them. - (mml-parse-1): Accept charset. - -2001-07-17 22:00:00 ShengHuo ZHU - - * gnus-group.el (gnus-group-select-group): Doc fix. - - * gnus-eform.el (gnus-edit-form-done): Return nil if end-of-file. - -2001-07-17 Katsumi Yamaoka - - * dgnushack.el (dgnushack-make-auto-load): Advise `make-autoload' - to handle `define-derived-mode'. - -2001-07-16 12:00:00 ShengHuo ZHU - From: Stefan Monnier - - * message.el (message-mode): Use define-derived-mode. - (message-tab): message-completion-alist. - - * imap.el (imap-interactive-login): Use make-local-variable. - (imap-open): Ditto. - (imap-authenticate): Ditto. - - * gnus-msg.el (gnus-setup-message): Change-major-mode-hook. - - * gnus-art.el (gnus-article-edit-mode): Use define-derived-mode. - -2001-07-16 Kai Gro,A_(Bjohann - - * message.el (message-citation-line-function): Refer to - gnus-cite-attribution-suffix. - -2001-07-15 Pavel Jan,Bm(Bk - - * gnus-art.el,...: Error convention changes. - -2001-07-13 20:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-rebuild-thread): Count hidden lines too. - -2001-07-13 20:00:00 ShengHuo ZHU - - * nnrss.el (nnrss-read-group-data): Nuke emacs-lisp-mode-hook. - (nnrss-read-server-data): Ditto. - -2001-07-13 12:00:00 ShengHuo ZHU - - * gnus-setup.el (gnus-use-installed-gnus): Typo. - * Cleanup files. - From Pavel@Janik.cz (Pavel Jan,Bm(Bk). - -2001-07-13 08:00:00 ShengHuo ZHU - - * gnus.el (gnus-summary-line-format): Add %o. - - * gnus-sum.el (gnus-summary-pipe-output): Don't configure as pipe - unless shell outputs something. - -2001-07-13 07:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-boring-article-headers): Better doc. - (article-hide-headers): Better regexp. - Suggested by Matt Swift . - - * nnheader.el (nnheader-max-head-length): Better doc. - (nnheader-header-value): Skip spaces. - (nnheader-parse-head): Remove space. - Suggested by Matt Swift . - - * gnus-sum.el (gnus-summary-show-raw-article): New function. - (gnus-get-newsgroup-headers): Remove space. - -2001-07-12 23:00:00 ShengHuo ZHU - - * gnus-msg.el (gnus-msg-treat-broken-reply-to): Add force. - (gnus-summary-reply): Use it. - (gnus-summary-reply-broken-reply-to): New. - (gnus-msg-force-broken-reply-to): New. - - * mm-view.el (mm-inline-text): Showing as text/plain when error. - -2001-07-12 21:00:00 ShengHuo ZHU - - * gnus-draft.el (gnus-draft-setup): Restore gnus-newsgroup-name. - -2001-07-12 15:00:00 ShengHuo ZHU - - * mm-decode.el (mm-external-terminal-program): New variable. - (mm-display-external): Use it. Use term to display when no - window-system. - -2001-07-12 Bj,Av(Brn Torkelsson - - * gnus-srvr.el (gnus-browse-make-menu-bar): Changed one of the - Browse->Next entries to Browse->Prev - -2001-07-11 22:00:00 ShengHuo ZHU - - * gnus-msg.el (gnus-inews-do-gcc): Don't test gnus-alive-p. - -2001-07-11 18:00:00 ShengHuo ZHU - - * mm-encode.el (mm-content-transfer-encoding-defaults): Use base64 - for the default encoding. - - * nnrss.el (nnrss-url-field): New field. - (nnrss-request-article): Add newsgroups. - - * nnfolder.el (nnfolder-read-folder): Force to use a multibyte buffer. - -2001-07-11 04:00:00 ShengHuo ZHU - - * nndraft.el (nndraft-request-restore-buffer): Don't remove Date. - - * gnus-draft.el (gnus-draft-edit-message): Remove Date here. - (gnus-draft-setup): Remove backlog. - -2001-07-10 Pavel Jan,Bm(Bk - - * gnus-logic.el, gnus-srvr.el, gnus-vm.el, nnheaderxm.el, nnoo.el: - Cleanup. - -2001-07-09 23:00:00 ShengHuo ZHU - - * gnus-msg.el (gnus-bug): Erase buffer. - - * nnfolder.el (nnfolder-possibly-change-group): Don't create group. - -2001-07-09 19:00:00 ShengHuo ZHU - - * mm-decode.el (mm-attachment-override-p): Fix typo. - -2001-03-19 05:28:00 Katsumi Yamaoka - - * gnus-kill.el (gnus-execute): Work with the extra headers. - * gnus-sum.el (gnus-summary-execute-command): Ditto. - -2001-07-09 17:00:00 ShengHuo ZHU - - * mm-view.el (mm-inline-text): w3-coding-system-for-mime-charset - may not defined. From: Raja R Harinath . - - * message.el (message-send-mail-real-function): New variable. - (message-send-mail-partially, message-send-mail): - - * nngateway.el (nngateway-request-post): Use it. - - * gnus-agent.el (gnus-agentize): Use it. - - * nnsoup.el (nnsoup-old-functions, nnsoup-set-variables) - (nnsoup-revert-variables): Use it. - -2001-07-09 Colin Walters - - * mm-decode.el (mm-inline-media-tests): Default to displaying as - text/plain if the type doesn't match any other media types. - (mm-inlined-types): Doc fix. - (mm-display-inline): Revert previous change (now handled by a - default type in `mm-inline-media-tests'. - (mm-inlinable-p): Revive. - (mm-display-part): Call `mm-inlinable-p'. - (mm-attachment-override-p): Ditto. - (mm-inlined-p): Doc fix. - - * gnus-art.el (gnus-mime-display-single): Call `mm-inlinable-p' as - well as `mm-inlined-p'. - -2001-07-09 13:00:00 ShengHuo ZHU - - * nntp.el (nntp-send-command, nntp-send-command-nodelete): - (nntp-send-command-and-decode): Use gnus-point-at-bol. - -2001-07-09 13:00:00 ShengHuo ZHU - From Paul Jarc - - * message.el (message-use-mail-followup-to): New variable. - (message-get-reply-headers): Use it. - -2001-07-04 Gerd Moellmann - - * nnheader.el (nnheader-init-server-buffer): Make sure the - *nntpd* buffer is made multibyte instead of a random buffer. - -2001-07-09 12:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-get-newsgroup-headers-xover): Get headers only - when it returns headers. - -2001-07-07 Simon Josefsson - - * rfc2047.el (rfc2047-encode-message-header): Skip header when - trying to fold. Thanks to Colin Walters - - -2001-07-06 Simon Josefsson - - * imap.el (imap-parse-address-list, imap-parse-flag-list) - (imap-parse-body-extension, imap-parse-body-ext, imap-parse-body): - Add information in `assert's. - - * nnimap.el (nnimap-possibly-change-group): Ignore uidvalidity - changes. (From nnimaps' point of view, `nnimap-verify-uidvalidity' - and `nnimap-group-overview-filename', should handle all - change-of-uidvalidity related issues. But there may be other - problems.) - -2001-07-05 Colin Walters - - * rfc2047.el (rfc2047-encode-message-header): Don't include the - header name when folding. - -2001-07-05 Colin Walters - - * mm-decode.el (mm-inlined-types): Document relationship with - `mm-inline-media-tests'. - (mm-display-inline): Default to displaying as plain text if no - inlining handler is available. - (mm-inlinable-p): Remove. - (mm-inlined-p): Don't call `mm-inlinable-p'. - (mm-automatic-display-p): Ditto. - (mm-attachment-override-p): Ditto. - -2001-07-04 Simon Josefsson - - * nnimap.el (nnimap-importantize-dormant): New variable. - (nnimap-request-update-info-internal): Use it. - (nnimap-request-set-mark): Ditto. - -2001-07-04 Didier Verna - - * nntp.el (nntp-send-command): don't pass a buffer argument to - `point'. Only XEmacs accepts this. - * nntp.el (nntp-send-command-nodelete): ditto. - * nntp.el (nntp-send-command-and-decode): ditto. - -2001-07-04 Didier Verna - - * nntp.el (nntp-open-connection-function): doc update. - * nntp.el (nntp-pre-command): New. - * nntp.el (nntp-via-rlogin-command): New. - * nntp.el (nntp-via-telnet-command): New. - * nntp.el (nntp-via-telnet-switches): New. - * nntp.el (nntp-via-user-name): New. - * nntp.el (nntp-via-user-password): New. - * nntp.el (nntp-via-address): New. - * nntp.el (nntp-via-envuser): New. - * nntp.el (nntp-via-shell-prompt): New. - * nntp.el (nntp-open-telnet-stream): New. - * nntp.el (nntp-open-via-rlogin-and-telnet): New. - * nntp.el (nntp-open-via-telnet-and-telnet): New. - * nntp.el (nntp-wait-for): check for possibly echo'ed commands. - * nntp.el (nntp-send-command): ditto. - * nntp.el (nntp-send-command-nodelete): ditto. - * nntp.el (nntp-send-command-and-decode): ditto. - -2001-06-30 YAGI Tatsuya - - * gnus-start.el (gnus-check-first-time-used): Use `if' instead of - `when'. - -2001-07-03 Simon Josefsson - From Nuutti Kotivuori - - * flow-fill.el (fill-flowed): Use (1+ (point-at-eol)) instead. - -2001-07-03 Simon Josefsson - - * flow-fill.el (fill-flowed): If `fill-region' inserts empty line, - remove it (workaround XEmacs `fill-region' bug). - -2001-07-01 Simon Josefsson - - * nnimap.el (nnimap-date-days-ago): Defeat locale. - -2001-06-28 11:00:00 ShengHuo ZHU - - * mml2015.el (mml2015-format-error): New function. - (mml2015-mailcrypt-decrypt, mml2015-mailcrypt-clear-decrypt) - (mml2015-mailcrypt-verify, mml2015-gpg-clear-verify) - (mml2015-mailcrypt-clear-verify, mml2015-gpg-verify): Use it. - -2001-06-26 22:00:00 ShengHuo ZHU - - * nnrss.el (nnrss-retrieve-headers): The description may not exist. - Suggested by Christoph Conrad . - - * gnus-sum.el (gnus-summary-set-local-parameters): Don't override - group variables. - -2001-06-25 10:00:00 ShengHuo ZHU - - * nnslashdot.el (nnslashdot-write-groups): Use gnus-prin1. - - * nnrss.el (nnrss-save-server-data): Bind print-level and print-length. - (nnrss-save-group-data): Ditto. - - * gnus-agent.el (gnus-agent-save-alist): Ditto. - -2001-06-25 Katsumi Yamaoka - - * message.el (message-do-send-housekeeping): Narrow to headers. - -2001-06-24 Simon Josefsson - - * rfc2047.el (rfc2047-fold-region): The check to skip WSP - insertion when breaking lines looked for " \t" instead of "[ \t]". - (rfc2047-encode-message-header): Fold lines even if - no QP encoding is done. - -2001-06-23 Simon Josefsson - From Samuel Tardieu - - * smime.el (smime-keys): Support additional certificates. - (smime-make-certfiles): New function. - (smime-sign-region): Use previous variables. - (smime-get-certfiles): New function. - (smime-sign-buffer): Use it. - (smime-verify-region): Support both CAfile and CApath. - -2001-06-23 Simon Josefsson - - * smime.el (smime-decrypt-region): Perhaps work. - -2001-06-22 10:00:00 ShengHuo ZHU - - * gnus-msg.el (gnus-copy-article-buffer): Typo. - -2001-04-06 Ralph Schleicher - - * mm-decode.el (mm-save-part): Rewrite file name. - (mm-file-name-rewrite-functions): New variable. - (mm-file-name-delete-whitespace): New function. - (mm-file-name-trim-whitespace): New function. - (mm-file-name-collapse-whitespace): New function. - (mm-file-name-replace-whitespace): New variable and function. - -2001-06-22 Simon Josefsson - - * message.el (message-make-date): Workaround locale for weekdays. - -2001-06-21 17:00:00 ShengHuo ZHU - - * message.el (message-goto-body): Return nil if not found. (revert!) - -2001-06-21 10:00:00 ShengHuo ZHU - From Fremlin - - * message.el (message-goto-body): Some messages have no header. - - * gnus-msg.el (gnus-copy-article-buffer): Use it. - -2001-06-21 Ralph Schleicher - - * nnultimate.el (nnultimate-retrieve-headers): Date fix. - -2001-06-21 10:00:00 ShengHuo ZHU - - * message.el (message-make-date): Add week day. - Suggested by Jason R. Mastaler . - -2001-06-19 Simon Josefsson - - * message.el (message-yank-prefix): Doc fix. - (message-yank-cited-prefix): Ditto. - (message-delete-not-region): Keep citation prefix on first line, - if possible and appropriate. - -2001-06-19 Simon Josefsson - - * imap.el (imap-process-connection-type): New variable. - (imap-kerberos4-open, imap-gssapi-open): Use it. This makes - recent `imtest's work completely (no line length issues), while - making making old `imtest's unusable. Thanks to NAGY Andras - for his work. - -2000-12-30 NAGY Andras - - * imap.el (imap-ssl-program): Add -quiet to shut up - OpenSSL/SSLeay's internal debug talk. - -2001-06-19 Matt Armstrong - - * imap.el (imap-parse-flag-list): Workaround bug in Courier IMAP - server. - -2001-06-19 10:00:00 ShengHuo ZHU - - * nnmail.el (nnmail-article-buffer): New variable. - (nnmail-split-incoming): Use it. - -2001-06-15 Eli Zaretskii - - * qp.el (quoted-printable-decode-region): If called interactively, - use coding-system-for-read. - -2001-06-16 09:00:00 ShengHuo ZHU - - * message.el (message-check-news-header-syntax): Check Reply-To. - -2001-06-16 08:00:00 ShengHuo ZHU - - * mml.el (mml-parse-1): Use message options. - - * message.el (message-do-fcc): Don't do anything if there is no - FCC. - -2001-06-16 Simon Josefsson - - * nnimap.el (nnimap-split-articles): Support 'junk to-groups. - (nnimap-expunge-search-string): New variable. - (nnimap-request-expire-articles): Use it. - -2001-06-15 19:00:00 ShengHuo ZHU - - * message.el (message-send-mail-with-qmail): wrong exit status is - 100 not 1. Reported by Paul Jarc . - -2001-06-15 09:00:00 ShengHuo ZHU - - * gnus-art.el (article-strip-multiple-blank-lines): Use - delete-region instead of replace-match. - -2001-06-14 16:00:00 ShengHuo ZHU - - * nnweb.el (nnweb-google-parse-1): Fix Google content regexp. - (nnweb-google-wash-article): Ditto. - -2001-06-14 Ferenc Wagner - - * nnweb.el (nnweb-google-parse-1): Fix Google url regexp. - -2001-06-13 Katsumi Yamaoka - - * gnus.el (gnus-define-group-parameter): Don't quote the defcustom - specs. - -2001-06-13 15:00:00 ShengHuo ZHU - - * gnus.el (gnus-email-address): Move it here. - - * gnus-art.el (article-de-quoted-unreadable): Read charset if - requested. - (article-de-base64-unreadable): Ditto. - (article-wash-html): Ditto. - -2001-06-12 14:00:00 ShengHuo ZHU - - * message.el (message-options-set-recipient): Don't add ", " - unless necessary. Suggested by Josh Huber . - -2001-06-12 12:00:00 ShengHuo ZHU - - * nnrss.el (nnrss-group-alist): Use |fr| instead of [fr]. - -2001-06-12 11:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-plain-save-name): Use file-relative-name. - From Marc Lefranc . - - * nnrss.el (nnrss-node-text): Node might be nil. - -2001-06-11 10:00:00 ShengHuo ZHU - - * gnus-uu.el (gnus-uu-save-article): Use mml tag instead of - part. From Katsumi Yamaoka . - - * nnrss.el (nnrss-group-alist): More items. - -2001-06-09 23:00:00 ShengHuo ZHU - - * nnrss.el (nnrss-node-text): Use cddr instead xml-node-children. - -2001-06-03 Dale Hagglund - - * gnus-mlspl.el (gnus-group-split-fancy): Fix generation of split - restrict clauses. - -2001-06-07 16:00:00 ShengHuo ZHU - - From Benjamin Rutt - - * message.el (message-wide-reply-confirm-recipients): New variable. - -2001-06-06 Mark Thomas - - * nnmail.el (nnmail-fix-eudora-headers): Change the In-Reply-To - fix so it works with XEmacs. - -2001-06-07 16:00:00 ShengHuo ZHU - - * nnrss.el (nnrss-retrieve-headers): Support description as extra - headers. - -2001-06-07 15:00:00 ShengHuo ZHU - - * nnrss.el: Fix a few bugs. - -2001-06-05 Simon Josefsson - - * mm-decode.el (mm-handle-set-external-undisplayer): Don't - generate compiler warnings. From Alex Schroeder . - -2001-06-04 Hrvoje Niksic - - * mm-decode.el (mm-pipe-part): Bind coding-system-for-write to - binary so that we don't transmit ISO 2022 garbage to the process. - This is needed under XEmacs. - -2001-06-03 Simon Josefsson - - * imap.el (imap-ssl-open): Require ssl. (Otherwise ssl.el is - autoloaded incorrectly below because ssl-program-* is bound.) - Thanks to Amos Gouaux for report. - -2001-06-02 Simon Josefsson - - * imap.el (imap-kerberos4-open): - (imap-gssapi-open): - (imap-ssl-open): - (imap-network-open): - (imap-shell-open): - (imap-starttls-open): Set buffer to workaround spurious - `accept-process-output' buffer changes. Thanks to Mats Lidell - for report and partial patch and Jake - Colman for report. - -2001-05-31 13:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-catchup): New argument. - (gnus-summary-catchup-from-here): New function. - -2001-05-30 Kai Gro,A_(Bjohann - - * mm-view.el (mm-inline-image-xemacs): Insert newline, then move - back, then insert glyph. (Before, the glyph was inserted first, - then the newline.) This works around a behavior in XEmacs where - it is not possible to insert a character after a glyph which is at - the end of a buffer. Patch by Lloyd Zusman . - -2001-05-28 Kai Gro,A_(Bjohann - - From Jaap-Henk Hoepman (jhh@xs4all.nl). - - * mm-decode.el (mm-keep-viewer-alive-types): New variable. - (mm-keep-viewer-alive-p, mm-handle-set-external-undisplayer, - mm-destroy-postponed-undisplay-list): New functions. - (mm-display-external): Use them. - -2001-05-27 Kai Gro,A_(Bjohann - - * gnus-salt.el (gnus-tree-highlight-node): Bind `default-high' and - `default-low' when evaluating `gnus-summary-highlight'. - From Raja R Harinath . - -2001-05-27 Simon Josefsson - - * message.el (message-yank-cited-prefix): New variable. - (message-indent-citation): Use it. - - * mml2015.el (mml2015-mailcrypt-verify): Store gpg stderr output - as details. - (mml2015-mailcrypt-clear-verify): Ditto. - -2001-05-24 Kai Gro,A_(Bjohann - From Nevin Kapur . - - * gnus-sum.el (gnus-summary-default-high-score, - gnus-summary-default-low-score): New variables. - (gnus-summary-highlight): Use them. - -2001-05-16 Didier Verna - - * message.el (message-mail): pass the 'send-actions argument to - `message-setup'. - -2001-05-16 Simon Josefsson - From Raymond Scholz - - * gnus-art.el (gnus-mime-view-part-as-charset): - (gnus-mime-internalize-part): Doc fixes. - -2001-05-11 Simon Josefsson - - * gnus-start.el (gnus-ignored-newsgroups): Also ignore NNTP type - status lines without any text ("^215$"). - -2001-05-06 21:00:00 ShengHuo ZHU - - * nnrss.el (nnrss-check-group): Reverse. - -2001-05-07 Simon Josefsson - - * message.el (message-get-reply-headers): - (message-followup): Fix typo, suggested by David Green - - -2001-05-05 15:00:00 ShengHuo ZHU - - * nnslashdot.el (nnslashdot-request-expire-articles): Fix. - - * nnrss.el (nnrss-open-server): Read server data when it is called. - (nnrss-request-expire-articles): Fix. - -2001-05-05 09:00:00 ShengHuo ZHU - - * message.el (message-do-send-housekeeping): mail-abbrevs may - rename buffer behind Gnus. - -2001-05-04 14:00:00 ShengHuo ZHU - - * nnrss.el (nnrss-check-group): Use nnheader-translate-file-chars. - (nnrss-group-alist): Add more resources. - (nnrss-check-group): Ignore errors. - -2001-05-04 00:00:00 ShengHuo ZHU - - * nnrss.el (nnrss-request-expire-articles): Correct the return value. - - * nnslashdot.el (nnslashdot-request-list): Add time. - (nnslashdot-request-expire-articles): New. - - * gnus-start.el (gnus-check-bogus-newsgroups): Remove bogus - secondary methods too. - -2001-05-03 23:00:00 ShengHuo ZHU - - * message.el (message-use-followup-to): Set default value to t. - -2001-05-03 Florian Weimer - - * message.el (message-dont-reply-to-names): Fix documentation. - (message-get-reply-headers): Use Mail-Followup-To only for wide - replies. - -2001-05-03 12:00:00 ShengHuo ZHU - - * nnrss.el (nnrss-request-expire-articles): Calculate # of days - correctly. - (nnrss-check-group): Use time. - -2001-05-01 19:21:19 Lars Magne Ingebrigtsen - - * gnus.el: Oort Gnus v0.03 is released. - -2001-05-01 19:06:21 Lars Magne Ingebrigtsen - - * nnultimate.el (nnultimate-topic-article-to-article): Use the - group. - -2001-04-24 19:50:14 Lars Magne Ingebrigtsen - - * gnus-srvr.el (gnus-server-insert-server-line): Add a space. - -2001-04-15 14:55:03 Lars Magne Ingebrigtsen - - * nnultimate.el (nnultimate-retrieve-headers): Return all - available headers. - - * gnus-sum.el (gnus-read-all-available-headers): New variable. - (gnus-get-newsgroup-headers-xover): Use it. - -2001-04-14 15:47:26 Lars Magne Ingebrigtsen - - * nnultimate.el (nnultimate-retrieve-headers): Clean up. - -2001-04-30 17:00:00 ShengHuo ZHU - - * nntp.el (nntp-retrieve-groups): Use throw instead of error. - -2001-04-29 09:00:00 ShengHuo ZHU - - * nnrss.el (nnrss-insert-w3): Use cache before I figure out how to - disable it. - - * gnus.el (gnus-info-nodes): Remove a few The's. - -2001-04-29 08:00:00 ShengHuo ZHU - - * mail-source.el (mail-source-movemail): Call-process may return a - signal description string. - - * gnus-start.el (gnus-read-newsrc-el-file): - gnus-newsrc-file-version may be nil. - - * nnmail.el (nnmail-get-new-mail): Use the exact file only. - Suggested by Michael Sperber [Mr. Preprocessor] - . - -2001-04-25 Per Abrahamsen - - * mm-uu.el (mm-uu-configure-list): Fixed customize type. - -2001-04-24 Hrvoje Niksic - - * mm-view.el (mm-display-inline-fontify): Allow XEmacs to fully - fontify HANDLE. - -2001-04-18 Simon Josefsson - - * smime.el (smime-ask-passphrase): Rework to return value. - (smime-sign-region): Rework to bind value and use it. - (smime-decrypt-region): Ditto. - -2001-04-18 Mathias Herberts - Committed by Simon Josefsson - - * smime.el (smime-ask-passphrase): New function. - (smime-sign-region): Use it. - (smime-encrypt-cipher): New variable. - (smime-decrypt-region): Ditto. - -2001-04-12 Jason Merrill - Committed by Simon Josefsson - - * imap.el (imap-shell-open): Erase the buffer *after* copying it into - the log. - -2001-04-14 01:14:42 Lars Magne Ingebrigtsen - - *gnus.el: Oort Gnus v0.02 is released. - -2001-04-14 00:48:42 Lars Magne Ingebrigtsen - - * gnus.el: Oort Gnus v0.01 is released. - -2001-04-13 22:01:46 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-highlight): Highlight read - undownloaded articles as read articles. - - * gnus-agent.el (gnus-agent-get-undownloaded-list): Clean up. - (gnus-agent-get-undownloaded-list): Mark all undownloaded - articles, even read ones, as such. - - * gnus-sum.el (gnus-summary-find-matching): Clean up. - (gnus-find-matching-articles): New function. - (gnus-summary-limit-include-matching-articles): New command. - (gnus-summary-limit-include-thread): Include articles that have - matching subjects. - (gnus-offer-save-summaries): Clean up. - -2001-04-13 Kai Gro,A_(Bjohann - - * nnmail.el (nnmail-split-fancy-with-parent): Add docstring. - -2001-04-12 19:00:00 ShengHuo ZHU - From Jason Merrill - - * gnus-sum.el (gnus-summary-insert-new-articles): Reverse the articles. - -2001-04-10 08:01:15 Katsumi Yamaoka - Committed by ShengHuo ZHU - - * gnus-msg.el (gnus-post-news): Fill the Newsgroups header by the - newsgroup names when the original article is a news message. - -2001-04-12 19:00:00 ShengHuo ZHU - - * message.el (message-cite-prefix-regexp): Use POSIX regexp if - supported. Suggest by Jim Meyering . - -2001-04-02 Nevin Kapur - Committed by Kai Gro,A_(Bjohann . - - * nnmail.el (nnmail-split-it): Added check for .* at the end of - regexp in nnmail-split-fancy. - -2001-04-10 Simon Josefsson - - * message.el (message-options-set-recipient): Look at Cc and Bcc too. - -2001-04-10 Colin Marquardt - - * message.el (message-send-mail): Improve the interaction with the - user. - -2001-04-10 Simon Josefsson - - * imap.el (imap-message-copy): Work around buggy servers that - doesn't send TRYCREATE tags. - -2001-04-09 01:15:54 Katsumi Yamaoka - - * gnus-start.el (gnus-read-newsrc-el-file): Work with Semi-gnusae. - -2001-04-05 21:43:25 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-update-summary-mark-positions): Use a valid - date. - -2001-04-04 16:13:17 Lars Magne Ingebrigtsen - - * gnus-group.el (gnus-group-quit): Check that the dribble buffer - lives. - -2001-04-02 00:40:12 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-parse-news-url): New function. - (gnus-button-handle-news): New function. - (gnus-button-alist): Point to new functions. - - * gnus-group.el (gnus-group-quit): Only mark buffer in non-empty. - - * gnus-start.el (gnus-read-newsrc-el-file): Nix out - gnus-format-specs. - - * message.el (message-check-news-header-syntax): Question even - when Gnus doesn't know the group names. - (message-send-news): Clean up. - - * gnus-start.el (gnus-dribble-read-file): Say whether Gnus was - exited on purpose without saving. - - * gnus-group.el (gnus-group-quit): Mark the dribble file as `Q'. - -2001-04-01 00:37:14 Lars Magne Ingebrigtsen - - * gnus-score.el (gnus-score-orphans): Clean up. - - * gnus-win.el (gnus-remove-some-windows): Leave one Gnus window. - - * gnus-sum.el (gnus-summary-exit): Kill the summary buffer a bit - later. - - * gnus-start.el (gnus-close-all-servers): Find the right items to - close. - - * qp.el (quoted-printable-decode-region): Just message - malformation; don't quit. - -2001-03-31 21:00:00 ShengHuo ZHU - From Gerd Moellmann . - - * gnus.el (gnus-interactive): A typo. - -2001-03-26 Juanma Barranquero - Committed by ShengHuo ZHU - - * gnus-util.el (gnus-delete-alist): Declare it as an alias of - `assq-delete-all', if that function exists; otherwise use the old - definition. Documentation changed to match the one in - `assq-delete-all'. - -2001-04-01 00:37:14 Lars Magne Ingebrigtsen - - * gnus-start.el (gnus-close-all-servers): New function. - - * gnus-srvr.el (gnus-server-close-all-servers): Clean up. - (gnus-server-remove-denials): Clean up. - - * gnus-sum.el (gnus-summary-sort-by-original): New command and - keystroke. - -2001-03-31 02:56:55 Lars Magne Ingebrigtsen - - * message.el (message-send-news): Message where we are sending. - (message-send-mail): Ditto. - - * gnus.el (gnus-server-string): New function. - - * gnus-sum.el (gnus-summary-up-thread): Doc fix. - - * mm-decode.el (mm-default-directory): Customized. - (mm-tmp-directory): Ditto. - - * gnus-sum.el (gnus-summary-catchup-and-exit): Doc fix. - (gnus-get-newsgroup-headers): Return -1 for articles without Lines - or Chars. - (gnus-summary-line-format-alist): ?l is now a string. - (gnus-summary-prepare-threads): Output ? for unknown lines. - (gnus-summary-insert-line): Ditto. - (gnus-summary-print-article): Unbalanced parentheses. - - * gnus-msg.el (gnus-inews-do-gcc): Check group to allow it to find - out whether new stuff has arrived. - -2001-03-31 02:14:38 Alan Shutko - - * gnus-sum.el: Let printing work on ttys on Emacs. - -2001-03-31 01:11:14 Lars Magne Ingebrigtsen - - * gnus-msg.el (gnus-post-news): Add an empty Newsgroups header - when forcing news. - - * gnus-sum.el (gnus-summary-mark-article-as-replied): Make into a - command. - -2001-03-31 01:04:54 Francis Litterio - - * message.el (message-set-auto-save-file-name): Don't use - asterisks under nt. - -2001-03-31 00:03:42 Lars Magne Ingebrigtsen - - * gnus-msg.el (gnus-inews-insert-draft-meta-information): Allow - lists of articles. - - * gnus-uu.el (gnus-uu-digest-mail-forward): Mark as forwarded. - - * gnus-msg.el (gnus-put-message): Clean up. - (gnus-summary-reply): Mark all replied-to articles as replied to. - (gnus-inews-add-send-actions): Also mark as forwarded. - (gnus-summary-mail-forward): Mark as forwarded. - - * gnus-sum.el (gnus-summary-mark-article-as-replied): Take a list - of articles. - (gnus-summary-mark-article-as-forwarded): Ditto. - - * gnus-msg.el (gnus-summary-resend-message): Mark article as - forwarded. - (gnus-summary-mail-forward): Clean up. - - * gnus.el (gnus-article-mark-lists): Added forward. - - * gnus-sum.el (gnus-forwarded-mark): New variable. - (gnus-summary-prepare-threads): Use it. - (gnus-summary-update-secondary-mark): Ditto. - (gnus-newsgroup-forwarded): New variable. - -2001-03-30 23:13:37 Lars Magne Ingebrigtsen - - * gnus-msg.el (gnus-summary-reply): Allow very wide replies. - (gnus-summary-very-wide-reply): New command and keystroke. - (gnus-summary-very-wide-reply-with-original): Ditto. - - * gnus-score.el (gnus-adaptive-word-length-limit): New variable. - (gnus-score-adaptive): Use it. - - * gnus-start.el (gnus-get-unread-articles): Clean up. - -2001-03-21 20:00:43 Lars Magne Ingebrigtsen - - * nnultimate.el (nnultimate-retrieve-headers): Work for other - boards. - -2001-03-21 Didier Verna - - * gnus-start.el: - * gnus-start.el (gnus-subscribe-newsgroup-hooks): New. - * gnus-start.el (gnus-subscribe-newsgroup): use it. - - -2001-03-15 09:47:23 Lars Magne Ingebrigtsen - - * nnultimate.el (nnultimate-retrieve-headers): Understand - long-form month names. - -2001-03-18 23:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-show-all-headers): - gnus-article-show-all-headers is broken. Use - gnus-summary-toggle-header instead. - - * mml2015.el (mml2015-gpg-extract-from): No error. - -2001-03-18 23:00:00 ShengHuo ZHU - From Bj,Ax(Brn Mork . - - * mml2015.el (mml2015-gpg-extract-from): New function. - (mml2015-gpg-verify): Use it. - (mml2015-gpg-clear-verify): Use it. - -2001-03-17 10:00:00 ShengHuo ZHU - - * message.el (message-setup-fill-variables): Use - fill-paragraph-function. - (message-fill-paragraph): Take an argument. - (message-newline-and-reformat): Take another argument. - -2001-03-16 20:00:00 ShengHuo ZHU - - * message.el (rmail-output): It is in rmailout.el not rmail.el. - -2001-03-16 16:00:00 ShengHuo ZHU - - * message.el (message-forward): local-variable-p takes an extra - argument in XEmacs. - -2001-03-16 Simon Josefsson - - * nnimap.el (nnimap-dont-use-nov-p): Renamed from - `nnimap-use-nov-p' (it really tested the negative). - (nnimap-retrieve-headers): Use it. - -2001-03-11 Kai Gro,A_(Bjohann - - * message.el (message-generate-headers-first): Update doc. - -2001-03-10 Matthias Wiehl - - * gnus.el (gnus-summary-line-format): Typo. - -2001-03-11 Simon Josefsson - - * mailcap.el (mailcap-mime-data): Add application/sieve. - (mailcap-mime-extensions): Add .siv, .xls. - -2001-03-14 20:00:00 ShengHuo ZHU - From Christoph Conrad - - * gnus-score.el (gnus-summary-lower-thread): Typo. - -2001-03-14 19:00:00 ShengHuo ZHU - - * message.el (message-forward-decoded-p): New variable. - (message-forward-subject-author-subject): Use it. - (message-make-forward-subject): Use it. - (message-forward): Use it. - - * gnus-uu.el (gnus-uu-digest-mail-forward): Use it. - - * mm-util.el, message.el, rfc2047.el, gnus-sum.el, gnus-score.el: - Sync with Emacs 21 (tag EMACS_PRETEST_21_0_100). - -;;Has been fixed -- zsh. -;;2001-03-05 Dave Love -;; -;; * mm-util.el (mm-mime-mule-charset-alist): Fix utf-8 case. -;; Move it after definition of mm-coding-system-p. -;; -2001-03-01 Dave Love - - * mm-util.el (mm-inhibit-file-name-handlers): Add - image-file-handler. - -2001-02-11 Dave Love - - * message.el (message-signature-file): Fix doc, :type. - -2001-02-08 Dave Love - - * rfc2047.el (rfc2047-fold-region): Don't forward-char at EOB. - (message-posting-charset): Defvar when compiling again. - (rfc2047-encodable-p): Require message. - - * gnus-sum.el (gnus-alter-articles-to-read-function): - * gnus-score.el (gnus-score-after-write-file-function): Fix :type. - -2001-03-08 20:00:00 ShengHuo ZHU - - * nnrss.el: New file. - -2001-03-08 02:41:36 Katsumi Yamaoka - Committed by ShengHuo ZHU - - * rfc2047.el (rfc2047-unfold-region): Fix arg of - `skip-chars-forward'. - -2001-03-07 13:00:00 ShengHuo ZHU - - * nndraft.el (nndraft-request-group): Restore auto save files if - the original files do not exist. - -2001-03-07 11:00:00 ShengHuo ZHU - - * gnus-score.el (gnus-score-find-bnews): Print messages on illegal - SCORE paths. - - * mm-decode.el (mm-dissect-buffer): Call - mail-extract-address-components only if necessary. - -2001-03-06 13:00:00 ShengHuo ZHU - - * gnus-score.el (gnus-score-find-bnews): Maybe there is no - directory part. - (gnus-score-search-global-directories): Use file-directory-p. - - * gnus-score.el (gnus-score-score-files-1): Use - gnus-kill-files-directory. - From Adrian Aichner . - -2001-03-05 08:00:00 ShengHuo ZHU - - * gnus.el (charset): Move here from gnus-sum.el. - -2001-03-04 11:00:00 ShengHuo ZHU - - * mml.el (mml-preview): Disable local map. - - * gnus-sum.el (gnus-summary-make-menu-bar): Make - gnus-article-post-menu here. - - * gnus-art.el (gnus-article-make-menu-bar): Make summary-menu bar - if it has not been made. - -2001-03-02 02:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-article-describe-key): Map key to event. - (gnus-article-describe-key-briefly): Ditto - -2001-03-01 23:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-limit-include-expunged): Fix. - -2001-03-01 22:00:00 ShengHuo ZHU - From Katsumi Yamaoka . - - * dgnushack.el (coerce, merge, subseq): defmacro. - -2001-03-01 22:00:00 ShengHuo ZHU - - * lpath.el (nndraft-request-group): Move it here from nndraft.el. - A fake defalias in nndraft.el results a not-activated bug in - uncompiled versions. - -2001-02-26 11:27:27 Paul Jarc - Committed by ShengHuo ZHU - - * gnus-util.el (gnus-split-references): Handle malformed References:. - -2001-02-26 08:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-article-mime-part-status): 1 part. - -2001-02-25 10:00:00 ShengHuo ZHU - From NAGY Andras . - - * gnus.el (gnus-parameters): Typo. - -2001-02-24 00:00:00 ShengHuo ZHU - - * gnus.el (gnus-read-method): Remove redundancy. - -2001-02-23 23:00:00 ShengHuo ZHU - - * nnslashdot.el (nnslashdot-backslash-url): New. - (nnslashdot-request-list): Use it. - -2001-02-23 22:00:00 ShengHuo ZHU - - * nnml.el (nnml-generate-active-info): Fix the case when there is - no file. - - * gnus-sum.el (gnus-summary-import-article): Display it. Enable edit. - (gnus-summary-create-article): New. - - * gnus-group.el (gnus-group-mark-article-read): New. - - * gnus-msg.el (gnus-inews-do-gcc): Use it. - - * gnus-art.el (gnus-article-edit-article): Set modified-p nil. - -2001-02-23 17:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-article-edit-done): Don't use - gnus-article-edit-exit. - (gnus-article-edit-exit): Confirm and insert original-article-buffer. - - * gnus.el (gnus-parameters): New. - Suggested by NAGY Andras . - (gnus-parameters-get-parameter): New. - (gnus-group-find-parameter): Use it. - -2001-02-23 Simon Josefsson - - * gnus-msg.el (gnus-post-method): Fix documentation to reflect - change of default value to `current'. - -2001-02-23 08:00:00 ShengHuo ZHU - - * nneething.el (nneething-get-head): Insert unreadable file too. - -2001-02-22 23:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-insert-articles): Remove fetched headers. - - * webmail.el (webmail-type-definition): Deja is bought by google. - -2001-02-22 22:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-fetch-headers): New. - (gnus-select-newsgroup): Use it. - (gnus-summary-insert-articles): New. - (gnus-summary-insert-old-articles): New. - (gnus-summary-insert-new-articles): New. - - * gnus-group.el (gnus-group-prepare-flat-list-dead): Use decoded-name. - (gnus-group-list-active): Ditto. - * gnus-sum.el (gnus-set-mode-line): Ditto. - (gnus-summary-read-group-1): Ditto. - -2001-02-21 15:00:00 ShengHuo ZHU - - * gnus-topic.el (gnus-topic-get-new-news-this-topic): Redraw the - current topic. - -2001-02-21 01:00:00 ShengHuo ZHU - - * smiley.el (gnus-smiley-display): Don't do widening. - - * smiley-ems.el (gnus-smiley-display): Don't do widening. Smiley - within body. - - * gnus-msg.el (gnus-inews-do-gcc): Activate group anyway. - - * gnus-art.el (gnus-mime-display-multipart-alternative-as-mixed): - New. - (gnus-mime-display-multipart-related-as-mixed): New. - (gnus-mime-display-part): Use them. - -2001-02-20 16:00:00 ShengHuo ZHU - - * gnus-start.el (gnus-setup-news): Allow gnus-group-line-format to be - something special. - -2001-02-20 00:00:00 ShengHuo ZHU - - * nnweb.el (nnweb-request-group): Set nnweb-group anyway. - (nnweb-request-article): Call reference if exists. - (nnweb-type-definition): Dejanews is bought by google.com. - Beta! - -2001-02-19 19:00:00 ShengHuo ZHU - - * gnus-draft.el (gnus-draft-reminder): "Confirm to exit?" - -2001-02-19 Kai Gro,A_(Bjohann - - * gnus-sum.el (gnus-thread-sort-functions): Doc fix. Refer to - gnus-article-sort-functions. - (gnus-article-sort-functions): Doc fix. Refer to - gnus-thread-sort-functions. - -2001-02-18 20:00:00 ShengHuo ZHU - From Paul Jarc . - - * message.el (message-get-reply-headers): More fixes. - -2001-02-17 Paul Jarc - Committed by ShengHuo ZHU - - * message.el (message-get-reply-headers): Fix bug with - Mail-Followup-To/to-address interaction. - -2001-02-17 13:00:00 ShengHuo ZHU - - * gnus-msg.el (gnus-configure-posting-styles): Match header in - gnus-article-copy. - -2001-02-16 22:00:00 ShengHuo ZHU - - * message.el (message-do-send-housekeeping): Rename to a better - name. - -2001-02-16 18:00:00 ShengHuo ZHU - - * message.el (message-cancel-news): Check article first, then ask - yes or no. - -2001-02-16 14:00:00 ShengHuo ZHU - - * mm-uu.el (mm-uu-type-alist): Add emacs-sources. - -2001-02-16 11:00:00 ShengHuo ZHU - - * gnus-range.el (gnus-range-normalize): New function. - -2001-02-15 NAGY Andras - - * imap.el (imap-gssapi-open): Set imap-c-l-s-first. - -2001-02-14 21:00:00 ShengHuo ZHU - - * gnus-srvr.el (gnus-server-regenerate-server): Use gnus-get-function. - - * nnagent.el (nnagent-request-regenerate): New. - - * nnfolder.el (nnfolder-request-regenerate): Deffoo. - - * nnml.el (nnml-generate-nov-databases): Accept argument - server. Don't open server if it is opened. - (nnml-request-regenerate): Use it. Change to deffoo. - -2001-02-14 Katsumi Yamaoka - Committed by ShengHuo ZHU - - * gnus.el (gnus-define-group-parameter): Fix. - -2001-02-14 15:00:00 ShengHuo ZHU - - * gnus.el (gnus-define-group-parameter): Improved. - - * gnus-sum.el (charset): Define parameter. - (ignored-charsets): Ditto. - (gnus-summary-setup-default-charset): Use them. - - * gnus-start.el (gnus-read-descriptions-file): Use them. - - * gnus-cus.el (gnus-group-parameters): Remove them. - -2001-02-14 00:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-print-article): Redo highlight. - -2001-02-13 21:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-read-group-1): Remove - gnus-summary-set-local-parameters. - (gnus-summary-setup-buffer): Put it here. - -2001-02-13 20:00:00 ShengHuo ZHU - - * gnus.el (to-address): Define parameter. - (to-list): Ditto. - * gnus-art.el (article-hide-boring-headers): Use them. - * gnus-msg.el (gnus-post-news): Ditto. - * gnus-cus.el (gnus-group-parameters): Remove them. - -2001-02-13 19:00:00 ShengHuo ZHU - - * gnus-draft.el (gnus-draft-reminder): New. - - * gnus-art.el (gnus-sender-save-name): New. - -2001-02-13 18:00:00 ShengHuo ZHU - - * mm-util.el (mm-mime-charset): Error message. - -2001-02-13 11:00:00 ShengHuo ZHU - - * message.el (message-check-news-body-syntax): Don't check mml lines. - -2001-02-12 11:00:00 ShengHuo ZHU - - * gnus-topic.el (gnus-subscribe-topics): Return nil if not - subscribe. - - * gnus-start.el (gnus-call-subscribe-functions): New. - (gnus-find-new-newsgroups): Use it. - (gnus-ask-server-for-new-groups): Use it. - (gnus-check-first-time-used): Use it. - (gnus-subscribe-newsgroup-method): Grok a list of functions. - (gnus-subscribe-options-newsgroup-method): Ditto. - (gnus-subscribe-hierarchically): Return gnus-subscribe-newsgroup's - return . - -2001-02-12 Kai Gro,A_(Bjohann - - * gnus-cus.el (gnus-score-customize): Doc fix. - -2001-02-11 Jesper Harder - - * dgnushack.el (my-getenv): Typo. - -2001-02-11 11:00:00 ShengHuo ZHU - - * dgnushack.el (dgnushack-make-load): Don't autoload smiley functions. - -2001-02-11 09:00:00 ShengHuo ZHU - - * gnus-group.el (gnus-group-suspend): Offer save summaries. - - * gnus-art.el (gnus-treat-leading-whitespace): New. - (gnus-treatment-function-alist): Use it. - (article-remove-leading-whitespace): New. - (gnus-article-make-menu-bar): Use it. - - * gnus-sum.el (gnus-summary-wash-empty-map): Add - remove-leading-whitespace. - (gnus-summary-wash-map): Bind strip-headers-in-body to `W a', - because of conflict. - -2001-02-09 23:00:00 ShengHuo ZHU - - * Makefile.in: Hack generating gnus-load.el. - * dgnushack.el: Ditto. - * gnus-load.el: Remove it. - -2001-02-09 20:00:00 ShengHuo ZHU - - * dgnushack.el : Add URLDIR. - - * Makefile.in (EMACS_COMP): Ditto. - -2001-02-09 19:00:00 ShengHuo ZHU - - * gnus-cus.el (gnus-score-customize): Error on no score file. - -2001-02-09 08:00:00 ShengHuo ZHU - - * mm-decode.el (mm-merge-handles): New function. - - * mm-view.el (mm-inline-message): Use it. - (mm-view-message): Ditto. - - * mm-partial.el (mm-inline-partial): Ditto. - - * mm-extern.el (mm-inline-external-body): Ditto. - - * gnus-art.el (gnus-mime-view-part): Ditto. - (gnus-mime-view-part-as-type): Ditto. - (gnus-mime-save-part-and-strip): Prevent users to strip in some - cases. - -2001-02-08 20:00:00 ShengHuo ZHU - - * message.el (message-cancel-news): Allow to shoot foot. - (message-supersede): Ditto. - -2001-02-08 Tommi Vainikainen - - * gnus-sum.el (gnus-simplify-subject-re): Use - message-subject-re-regexp. - -2001-02-08 18:00:00 ShengHuo ZHU - - * nnmail.el (nnmail-expiry-target-group): Bind - nnmail-cache-accepted-message-ids to nil. - - * gnus-xmas.el (gnus-xmas-article-display-xface): Use binary - coding system. - -2001-02-07 23:00:00 ShengHuo ZHU - - * qp.el (quoted-printable-encode-region): Make sure characters are - between 00 and FF. Don't check charset. - - * mm-encode.el (mm-encode-content-transfer-encoding): Use unibyte - in Emacs 20. - * rfc2047.el (rfc2047-q-encode-region): Ditto. - -2001-02-07 11:00:00 ShengHuo ZHU - - * message.el (message-make-forward-subject): Argument decoded. - (message-forward): Use it when digest. - - * gnus-uu.el (gnus-uu-grab-articles): Shoot down original article - buffer. - -2001-02-07 Kai Gro,A_(Bjohann - - * message.el (message-generate-headers-first): Doc fix. - -2001-02-07 10:00:00 ShengHuo ZHU - - * gnus-art.el (article-make-date-line): Error proof. - -2001-02-06 21:00:00 ShengHuo ZHU - - * gnus-group.el (gnus-group-listing-limit): New. - (gnus-group-prepare-flat-list-dead): Use old trick to speed up. - - * gnus-topic.el (gnus-group-prepare-topics): Use gnus-killed-hashtb. - -2001-02-06 18:00:00 ShengHuo ZHU - - * message.el (message-newline-and-reformat): Special case for - breaking at BOL. - -2001-02-06 Per Abrahamsen - - * gnus-uu.el (gnus-uu-save-article): Make the topics summary a - message/rfc822. - -2001-02-06 09:00:00 ShengHuo ZHU - - * message.el (message-encode-message-body): Don't insert - Content-Type if it is inside a mail. - -2001-02-06 02:00:00 ShengHuo ZHU - - * gnus-xmas.el (gnus-xmas-article-menu-add): Add - gnus-article-commands-menu. - - * gnus-sum.el (gnus-summary-make-menu-bar): Don't share menu bar - in Emacs. - - * gnus-start.el (gnus-read-descriptions-file): Use - gnus-group-name-charset and gnus-group-charset-alist. - -2001-02-04 23:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-mark-as-processable): Understand - active region. - - * gnus-start.el (gnus-group-change-level): Remove from both - gnus-zombie-list and gnus-killed-list. - -2001-02-04 11:00:00 ShengHuo ZHU - - * gnus-start.el (gnus-subscribe-options-newsgroup-method): Add - gnus-subscribe-topics. - - * gnus-cus.el (gnus-extra-topic-parameters): Fix doc. - -2001-02-04 11:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-article-make-menu-bar): Make - gnus-article-post-menu. - - * gnus-xmas.el (gnus-xmas-article-menu-add): Add post menu. - - * gnus-sum.el (gnus-summary-make-menu-bar): Use t if XEmacs. - - * gnus-group.el (gnus-group-make-menu-bar): Ditto. - - * message.el (message-mode-menu): Ditto. - - * gnus-art.el (defvar): eval-when-compile. - -2001-02-02 17:00:00 ShengHuo ZHU - - * gnus-agent.el (gnus-agentize): Fix doc. - -2001-02-02 Karl Kleinpaste - - * mml.el (mml-preview): Bind `q'. - -2001-02-02 12:00:00 ShengHuo ZHU - - * mm-util.el (mm-mime-mule-charset-alist): non-Mule case. - -2001-01-31 Dave Love - - * mm-util.el (mm-mime-mule-charset-alist) - (mm-find-mime-charset-region): Consider mule-utf-8. - -2001-01-31 Dave Love - - * gnus-art.el (gnus-article-x-face-command) - (gnus-treat-display-xface, gnus-treat-display-smileys): Add - :version. - -2001-01-26 Dave Love - - * mm-util.el (mm-multibyte-string-p): New. - -;; * qp.el: Remove un-logged bogus changes from 2000-12-20. -;; (quoted-printable-encode-region): Doc fix. Don't call -;; string-as-multibyte on class. Clarify line-folding. - (quoted-printable-encode-string): Make temp buffer inherit - string's multibyteness. - -2001-01-23 Gerd Moellmann - - * nnheader.el (toplevel): Don't require `gnus-util' at - compile-time; this creates a circular dependency, and prevents - a bootstrap. - -2001-01-22 Andreas Schwab - - * nnheader.el (gnus-delete-line): Autoload it as a macro. - -2001-01-31 18:00:00 ShengHuo ZHU - - * nnmail.el (nnmail-remove-list-identifiers): Use consp. - - * gnus-art.el (article-hide-list-identifiers): Ditto. - - * gnus-sum.el (gnus-summary-remove-list-identifiers): Ditto. - -2001-01-31 15:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-remove-list-identifiers): Similar. - - * gnus-art.el (article-hide-list-identifiers): Similar. - -2001-01-31 Karl Kleinpaste - - * nnmail.el (nnmail-remove-list-identifiers): Improved. - -2001-01-31 09:00:00 ShengHuo ZHU - - * gnus-score.el (gnus-summary-score-entry): match may be an integer. - -2001-01-30 10:00:00 ShengHuo ZHU - - * gnus-util.el (gnus-string-equal): New function. - - * gnus-art.el (article-hide-boring-headers): Use it. - -2001-01-27 Karl Kleinpaste - - * gnus-art.el (gnus-article-banner-alist): eGroups new banner. - -2001-01-27 00:00:00 ShengHuo ZHU - - * gnus-msg.el (gnus-msg-mail): Support switch-action. - -2001-01-26 08:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-summary-save-in-pipe): Prompt for saving - command if there is not last-saver. - -2001-01-24 19:00:00 ShengHuo ZHU - - * nntp.el (nntp-open-connection): 201 is possible. - -2001-01-24 18:00:00 ShengHuo ZHU - - * rfc2047.el (rfc2047-encode): MIME charset is not coding system. - (rfc2047-charset-encoding-alist): Add big5. - -2001-01-24 17:00:00 ShengHuo ZHU - - * gnus-agent.el (gnus-agent-add-server): Redraw the line. - (gnus-agent-remove-server): Ditto. - (autoload): gnus-server-update-server. - - * gnus-srvr.el (gnus-server-line-format): Add %a. - (gnus-server-line-format-alist): Add gnus-tmp-agent. - (gnus-server-insert-server-line): Use it. - -2001-01-24 09:00:00 ShengHuo ZHU - - * mm-util.el (mm-mime-mule-charset-alist): Preferred MIME names - GB2312 and Big5. - -2001-01-24 Simon Josefsson - - * mail-source.el (mail-sources): Add :program specifier to IMAP - mail source. - (mail-source-fetch-imap): Map :program to `imap-shell-program'. - -2001-01-24 08:00:00 ShengHuo ZHU - - * gnus-score.el (gnus-score-lower-thread): Fix a doc typo. - -2001-01-24 12:22:47 Lars Magne Ingebrigtsen - - * nntp.el (nntp-wait-for): Return the success code. - (nntp-open-connection): Use it. - -2001-01-11 11:49:02 Lars Magne Ingebrigtsen - - * gnus-int.el (gnus-check-server): Allow breaking the opening. - -2001-01-23 11:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-print-article): Remove process mark. - -2001-01-22 17:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-print-article): Take one prefix - argument. Allow to print several articles in one file. - -2001-01-21 12:00:00 ShengHuo ZHU - - * webmail.el (webmail-type-definition): netaddress changes. - -2001-01-21 00:00:00 ShengHuo ZHU - - * gnus.el: Fix copyright. Remove trailing spaces. - - * message.el (message-forward): Use mule4. - -2001-01-20 09:00:00 ShengHuo ZHU - - * mm-util.el (mm-string-as-unibyte): New. - - * message.el (message-forward): Use it. - -2001-01-19 23:00:00 ShengHuo ZHU - - * message.el (message-cite-original-without-signature): Don't peel - off the blank line. - (message-get-reply-headers): Add Cc if it is not in follow-to. - -2001-01-20 Simon Josefsson - - * mm-decode.el (mm-handle-multipart-from): Add. - (mm-dissect-buffer): Save From: header value. - (mm-security-from): Remove. - (mm-possibly-verify-or-decrypt): Don't set mm-security-from. - - * mml-smime.el (mml-smime-verify): Use `mm-handle-multipart-from' - instead of `mml-security-from'. Protect null from value. - -2001-01-20 Simon Josefsson - - * mailcap.el (mailcap-mime-data): Run `gnumeric' on - application/vnd.ms-excel attachments. - -2001-01-19 Simon Josefsson - - * gnus-art.el (gnus-button-alist): Add `?=' to mailto URL regexp. - -2001-01-19 13:00:00 ShengHuo ZHU - - * message.el (message-ignored-mail-headers): Ditto. - -2001-01-19 Simon Josefsson - - * message.el (message-ignored-news-headers): Only search beginning - of line. - -2001-01-19 Alberto Lusiani - - * message.el (message-send-mail): Content-Type may not be there. - -2001-01-18 23:00:00 ShengHuo ZHU - - * gnus-ems.el (gnus-article-display-xface): Add BUFFER. - * gnus-xmas.el (gnus-xmas-article-display-xface): Ditto. - - * gnus-art.el (article-display-x-face): Insert X-Face if there is - not. - -2001-01-18 19:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-read-group-1): Don't test dead - non-native groups. - -2001-01-18 18:00:00 ShengHuo ZHU - - * message.el (message-yank-original): Understand - universal-argument. - -2001-01-18 16:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-boring-article-headers): Add to-address. - (article-hide-boring-headers): Ditto. - - * mm-view.el (mm-inline-message): Insert a newline unless bolp. - -2001-01-18 08:00:00 ShengHuo ZHU - - * rfc2047.el (rfc2047-fold-region): Don't insert LWSP if there is - one. - -2001-01-16 Simon Josefsson - - * message.el (message-make-in-reply-to): Add comment to message-id - (old syntax, see 2000-08-02 change). - -2001-01-16 13:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-url-mailto): Use gnus-msg-mail. - (gnus-button-mailto): Setup message. Moved to gnus-msg.el. - (gnus-button-reply): Ditto. - -2001-01-16 Katsumi Yamaoka - - * gnus-art.el (article-display-x-face): Fix. - -2001-01-15 16:00:00 ShengHuo ZHU - - * gnus-art.el (article-display-x-face): Use - gnus-original-article-buffer. - -2001-01-15 Jack Twilley - - * message.el (message-add-header): Move to point-max. - -2001-01-15 Simon Josefsson - - * smime.el (smime-CA-directory, smime-CA-file): Change default to - nil, improve documentation. - (smime-certificate-directory): Comment out false hints (until it - is implemented). - - * mml-smime.el (mml-smime-sign): Place user in customize buffer if - there aren't any keys. - (mml-smime-verify): If smime-CA-{file,directory} set, also try to - verify certificate. Default is changed to only check integrity. - Improved security status texts. If a certificate doesn't contain - a email address, don't fail. - - * smime.el (smime-noverify-region): - (smime-noverify-buffer): New functions. Verifies integrity only. - -2001-01-12 22:00:00 ShengHuo ZHU - - * gnus-group.el (gnus-group-sort-by-score): Reverse order. - -2001-01-12 17:00:00 ShengHuo ZHU - - * gnus-win.el (gnus-configure-windows): switch-to-buffer in XEmacs. - (gnus-remove-some-windows): Ditto. - -2001-01-12 14:00:00 ShengHuo ZHU - - * gnus-art.el (article-make-date-line): 11th. - -2001-01-11 23:00:00 ShengHuo ZHU - - * mml2015.el (mml2015-gpg-encrypt): Remove CR. - (mml2015-gpg-sign): Ditto. - -2001-01-10 14:00:00 ShengHuo ZHU - - * gnus.el: Sync with EMACS_PRETEST_21_0_95. - * gnus.el (gnus-default-posting-charset): Bogus. Removed. - -2001-01-08 Dave Love - - * mm-encode.el (mm-qp-or-base64): Don't base64 for the sake of a - single character. - - * mm-util.el (mm-mime-mule-charset-alist): Add Latin-{8,9}. - - * message.el: Doc and message fixes. - (message-send-rename-function) - (message-make-forward-subject-function) - (message-send-mail-function, message-reply-to-function) - (message-wide-reply-to-function, message-followup-to-function) - (message-distribution-function, message-auto-save-directory): Fix - :type. - - * gnus/mml.el (mml-parse-1): Frob mml-confirmation-set when - proceeding after warnings. Amend multipart warning message. - -2001-01-04 Dave Love - - * gnus-util.el (nnmail-pathname-coding-system): Defvar when - compiling. - (gnus-make-directory): Require nnmail. - - * mm-decode.el (mm-inline-media-tests): Add - image/x-portable-bitmap. - (mm-get-image): Grok pbm. - -2001-01-10 Paul Stevenson - - * nnvirtual.el (nnvirtual-request-expire-articles): delq nil. - -2001-01-09 Didier Verna - - * dgnushack.el (dgnushack-compile): give a dummy value to - `gnus-xmas-glyph-directory' for the time of compilation. - * gnus-agent.el: moved some XEmacs specific hook add-ons from - `gnus-xmas-[re]define' to avoid loosing user custom settings. - * gnus-art.el: ditto. - * gnus-group.el: ditto. - * gnus-salt.el: ditto. - * gnus-sum.el: ditto. - * gnus-topic.el: ditto. - * gnus-xmas.el (gnus-xmas-define): see above. - * gnus-xmas.el (gnus-xmas-redefine): see above. - * gnus-xmas.el (gnus-xmas-glyph-directory): generate a - non-continuable error when the directory can't be found. - -2001-01-09 01:00:00 ShengHuo ZHU - - * mm-decode.el (mm-interactively-view-part): Don't copy-sequence - handle. - * gnus-art.el (gnus-mime-view-part): Copy it. - (gnus-mime-view-part-as-type): Add into gnus-article-mime-handles. - -2001-01-09 Michael Downes - - * gnus-sum.el (gnus-summary-read-group-1): More useful message. - -2001-01-08 23:00:00 ShengHuo ZHU - - * nnmail.el (nnmail-get-new-mail): Find group only if file is not - orig-file. Use ',source. - -2001-01-08 22:00:00 ShengHuo ZHU - - * gnus-xmas.el (gnus-xmas-modeline-glyph): - (gnus-xmas-group-startup-message): - Detect gnus-xmas-glyph-directory when it is nil. - -2001-01-08 09:00:00 ShengHuo ZHU - - * pop3.el (pop3-get-message-count): Andrew Innes - 's patch of 1999-12-01 was not fully committed. - -2001-01-05 06:49:37 Lars Magne Ingebrigtsen - - * gnus-agent.el (gnus-agent-fetch-session): Say what we quit. - - * time-date.el (time-to-number-of-days): New function. - -2001-01-04 11:06:14 Gregory Chernov - - * nnslashdot.el (nnslashdot-request-list): Always get the right - sid. - -2001-01-05 00:00:00 ShengHuo ZHU - - * message.el (message-minibuffer-local-map): New keymap. - (message-read-from-minibuffer): Use it. - * gnus-msg.el (gnus-summary-resend-message): Use it - -2001-01-04 22:00:00 ShengHuo ZHU - - * gnus-start.el (gnus-display-time-event-handler): New function. - (gnus-after-getting-new-news-hook): Use it. - -2001-01-03 07:26:58 Lars Magne Ingebrigtsen - - * message.el (message-ignored-mail-headers): Add draft header. - -2001-01-02 06:28:28 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-expire-articles): Don't save - excursion. - - * nnslashdot.el (nnslashdot-request-list): Get the right year. - -2001-01-01 00:52:44 Ed L. Cashin - - * gnus-sum.el (gnus-summary-expire-articles): Save excursion. - -2000-12-31 11:00:00 ShengHuo ZHU - - * qp.el (quoted-printable-decode-region): Don't backward-char. - -2000-12-31 03:57:31 Lars Magne Ingebrigtsen - - * gnus-draft.el: Mark articles as replied. - - * gnus-sum.el (gnus-summary-add-mark): New function. - - * gnus-group.el (gnus-add-mark): New function. - - * gnus-sum.el (gnus-summary-buffer-name): New function. - (gnus-summary-setup-buffer): Use it. - - * gnus-draft.el: Set things up with the right post method and - stuff. - - * message.el (message-ignored-news-headers): Remove X-Draft-From. - - * gnus-msg.el (gnus-inews-insert-draft-meta-information): New function. - - * gnus.el (gnus-draft-meta-information-header): New variable. - -2000-12-30 00:17:38 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-treatment-function-alist): Move the date - functions before the header sorting functions. - - * mm-uu.el (mm-uu-pgp-signed-extract-1): Unquote "- " quotes. - - * dgnushack.el (dgnushack-compile): Message whether there is w3. - Don't (push "/usr/share/emacs/site-lisp" load-path). - - * gnus-cite.el (gnus-article-fill-cited-article): Don't add space - to empty fill prefixes. - -2000-12-30 10:00:00 ShengHuo ZHU - - * nntp.el (nntp-open-connection): Kill pbuffer if process is nil. - Suggested by Christoph Conrad . - -2000-12-30 09:00:00 ShengHuo ZHU - - * nnheader.el (autoload): Autoload gnus-sorted-intersection. - - * nnml.el (autoload): Move to nnheader.el. - - * nnfolder.el (nnfolder-existing-articles): Reversed, i.e. sorted. - (nnfolder-request-expire-articles): Use gnus-sorted-intersection. - (nnfolder-retrieve-headers): Use intersection. Suggested by Jonas - Kvarnstr,Av(Bm . - -2000-12-30 00:17:38 Lars Magne Ingebrigtsen - - * gnus-art.el (article-make-date-line): Get the hours right. - (gnus-ignored-headers): More hiding. - - * nnmail.el (nnmail-expiry-wait): Not an integer. - - * message.el (message-goto-body): Only expand abbrev when called - interactively. - (message-make-lines): Use it. - -2000-12-29 20:00:00 ShengHuo ZHU - - * gnus-msg.el (gnus-inews-yank-articles): Reparse headers. - -2000-12-30 00:17:38 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-limit-include-expunged): Really - include the expunged articles. - - * gnus-group.el (gnus-group-sort-by-server): New function. - - * gnus.el (gnus-method-to-server-name): New function. - (gnus-group-prefixed-name): Use it. - - * gnus-group.el (gnus-group-sort-function): Doc fix. - (gnus-group-sort-groups-by-server): New command. - -2000-12-29 13:25:10 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-treat-date-english): New variable. - (article-date-english): New command. - (gnus-english-month-names): New variable. - (article-make-date-line): Do 'english. - - * gnus-cite.el (gnus-article-fill-cited-article): Add a space - after the fill prefix. - - * gnus-sum.el (gnus-summary-make-menu-bar): Removed "Enter - score...". - - * gnus-art.el (gnus-ignored-headers): Hide more headers. - - * message.el (message-mode-map): Bind comment-region. - - * gnus-art.el (gnus-mime-display-part): Let w3 display - multipart/related. - - * mm-bodies.el (mm-long-lines-p): New function. - (mm-body-encoding): Use it. - (mm-body-encoding): Encode articles with lines longer than 1000 - characters. - -2000-12-29 01:00:00 ShengHuo ZHU - - * mm-util.el (mm-enable-multibyte): Use - default-enable-multibyte-characters. - (mm-enable-multibyte-mule4): Ditto. - (mm-disable-multibyte): Test XEmacs. - (mm-disable-multibyte-mule4): Ditto. - (mm-with-unibyte-current-buffer): Simplified. - (mm-with-unibyte-current-buffer-mule4): Ditto. - -2000-12-28 19:44:56 Lars Magne Ingebrigtsen - - * nnheaderxm.el (nnheader-string-as-multibyte): New alias. - - * nnheader.el (nnheader-string-as-multibyte): New alias. - - * mm-view.el (mm-inline-text): Warn when bugging out in w3. - - * gnus-uu.el (gnus-message-process-mark): New function. - (gnus-uu-mark-by-regexp): Use it. - (gnus-new-processable): New function. - -2000-12-28 19:21:57 Inge Frick - - * gnus-sum.el (gnus-no-mark): New variable. - -2000-11-01 01:12:29 Lars Magne Ingebrigtsen - - * nnwfm.el (nnwfm-create-mapping): Remove quote marks and - backslashes. - -2000-12-26 Katsumi Yamaoka - - * gnus-art.el (gnus-article-banner-alist): Remove duplicate - definition. - -2000-12-25 00:00:00 ShengHuo ZHU - - * dgnushack.el (dgnushack-compile): elc is in the current directory. - - * qp.el (quoted-printable-encode-region): Don't check multibyte in - XEmacs. - -2000-12-25 Lloyd Zusman - - * mml.el (mml-read-tag): Save tag location. - -2000-12-25 Simon Josefsson - - * starttls.el: Sync with Emacs 21. - -2000-12-24 11:00:00 ShengHuo ZHU - - * message.el (message-mail): Support yank-action. - - * message.el (message-setup): Revoke the last change. - -2000-12-24 01:00:00 ShengHuo ZHU - - * message.el (message-setup): Use cons. Suggested by Johan Vromans - . - -2000-12-24 Simon Josefsson - - * mm-bodies.el (mm-decode-content-transfer-encoding): Preserve - mailing list junk at end of part. - -2000-12-23 Simon Josefsson - - * nnimap.el (nnimap-expiry-target): New function. - (nnimap-request-expire-articles): Use it. - -2000-12-22 21:00:00 ShengHuo ZHU - - * gnus.el (gnus-group-parameters-more): New variable. - * gnus-cus.el (gnus-group-customize): Use it. - - * gnus.el (gnus-define-group-parameter): New macro. - (auto-expire): Use it - (total-expire): Use it. - * gnus-art.el (banner): Use it. - - * mml.el (mml-parse): save-excursion. Suggested by Lloyd Zusman - . - -2000-12-22 12:00:00 ShengHuo ZHU - - * gnus-topic.el (gnus-topic-create-topic): Use list. - - * gnus-vm.el (gnus-summary-save-article-vm): Require gnus-art - before binding gnus-default-article-saver. - - * gnus-sum.el (gnus-summary-save-article): - (gnus-summary-pipe-output): - (gnus-summary-save-article-mail): - (gnus-summary-save-article-rmail): - (gnus-summary-save-article-file): - (gnus-summary-write-article-file): - (gnus-summary-save-article-body-file): Ditto. - - * gnus-mh.el (gnus-summary-save-article-folder): Ditto. - -2000-12-22 10:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-mime-security-button-map): - (gnus-mime-button-map): Add parent. - -2000-12-22 09:00:00 ShengHuo ZHU - - * messagexmas.el (message-xmas-redefine): New function. - - * message.el: Use it. - - * gnus-art.el (gnus-article-check-hidden-text): Return t. - - * gnus-util.el (gnus-remove-text-properties-when): Return t. - -2000-12-22 03:00:00 ShengHuo ZHU - - * mm-decode.el (mm-dissect-multipart): Avoid errors owing to - malformatted messages. - -2000-12-22 02:00:00 ShengHuo ZHU - - * mm-util.el (mm-image-load-path): New function. - - * gnus-group.el (gnus-group-make-tool-bar): Use it. - - * gnus-sum.el (gnus-summary-make-tool-bar): Use it. - - * message.el (message-tool-bar-map): Use it. - - * Makefile.in (install-el): New. - -2000-12-21 Katsumi Yamaoka - - * gnus-art.el (article-treat-dumbquotes): Quote \. - -2000-12-21 22:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-treat-emphasize): Don't treat emphasis if - Emacs 20 runs on a terminal. - -2000-12-21 14:00:00 ShengHuo ZHU - - * gnus-msg.el (gnus-bug): Revert to save-excursion. - - * mml.el (gnus-add-minor-mode): Autoload. - - * message.el (message-forward): Save-restriction. - -2000-12-21 Kai Gro,A_(Bjohann - - * gnus-art.el (article-treat-dumbquotes): More doc, provided by - Paul Stevenson - -2000-12-21 10:00:00 ShengHuo ZHU - - * gnus-ml.el (gnus-mailing-list-mode-map): Use C-c C-n prefix. - - * mml.el (gnus-ems): Don't require. - - * gnus.el (gnus-decode-rfc1522): Removed. - (gnus-set-text-properties): Define. - -2000-12-21 09:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-mime-*): handle may be nil. - - * gnus-sum.el (gnus-summary-mode): Turn on gnus-mailing-list-mode. - - * gnus.el (gnus-group-remove-excess-properties): Not defined - in gnus-xmas. - -2000-12-20 21:00:00 ShengHuo ZHU - - * message.el (message-mail-user-agent): Add :version. - -2000-12-21 Miles Bader - - * message.el (message-mode): Set `comment-start' to the yank prefix. - -2000-12-20 17:00:00 ShengHuo ZHU - - * message.el (message-mail-user-agent): New variable. - (message-setup): Renamed to message-setup-1. Support - mail-user-agent. - (message-mail-user-agent): New function. - (message-mail): Use it. - (message-reply): Use it. - (message-resend): Use it. - (message-mail-other-window): Use it. - (message-mail-other-frame): Use it. - - * gnus-msg.el (gnus-bug): Support mail-user-agent. - -2000-12-20 15:00:00 ShengHuo ZHU - - * message.el (message-tool-bar-map): Simplify. - (message-narrow-to-head-1): New function. - (message-narrow-to-head): Use it. - (message-reply): Ditto. - (message-cancel-news): Ditto. - (message-supersede): Ditto. - (message-make-forward-subject): Ditto. - (message-bounce): Ditto. - -2000-12-20 11:00:00 ShengHuo ZHU - - * uudecode.el (uudecode-decode-region-external): make-temp-file - may not be defined. - - * binhex.el (defalias): eval-and-compile. - - * message.el (message-tool-bar-map): New function. - (message-mode): Use it. - -2000-12-20 09:00:00 ShengHuo ZHU - - * nntp.el (nntp-find-connection): Remove the entry. - (nntp-retrieve-groups): (gnus-buffer-live-p buf). - -2000-12-20 05:00:00 ShengHuo ZHU - - * gnus-msg.el (gnus-summary-mail-forward): Use original buffer. - - * message.el (message-forward): Copy buffer in unibyte mode. - -2000-12-20 04:00:00 ShengHuo ZHU - - * message.el (message-make-forward-subject): Don't widen. Decode. - (message-forward): Don't decode subject. - -2000-12-20 Christoph Conrad - - * qp.el (quoted-printable-encode-region): Upcase QP. - -2000-12-20 03:00:00 ShengHuo ZHU - - * mm-decode.el (mm-possibly-verify-or-decrypt): Use - mail-extract-a-c instead. Don't depend on Gnus. - - * mml.el (gnus-ems): Require it. - - * gnus-msg.el (gnus-summary-mail-forward): - - * message.el (message-forward): Move mime-to-mml here. - -2000-12-20 02:00:00 ShengHuo ZHU - - * gnus-group.el, gnus-sum.el, message.el: Add :help unless Emacs. - * gnus-art.el (gnus-insert-mime-button): Simplify. - (gnus-mime-display-alternative): Ditto. - (gnus-insert-mime-security-button): Ditto. - -2000-12-20 01:00:00 ShengHuo ZHU - - * gnus-util.el (gnus-add-text-properties-when): In XEmacs, - text-property-not-all doesn't return nil when start=mark(end). - (gnus-remove-text-properties-when): Ditto. - -2000-12-20 00:00:00 ShengHuo ZHU - - * gnus-start.el (gnus-group-change-level): Remove group from - gnus-active-hashtb if real killed. - -2000-12-19 22:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-insert-mime-button): Emacs20 needs local-map. - (gnus-mime-display-alternative): Ditto. - (gnus-insert-mime-security-button): Ditto. - -2000-12-19 21:00:00 ShengHuo ZHU - - * gnus-start.el (gnus-group-change-level): Don't add it into - killed-list if it was killed. - -2000-12-19 19:00:00 ShengHuo ZHU - - * nnmbox.el (nnmbox-file-coding-system): Use binary. - (nnmbox-active-file-coding-system): Ditto. - - * gnus-cus.el (gnus-group-parameters): Add posting-style. - -2000-12-19 18:00:00 ShengHuo ZHU - - * gnus.el (gnus-version): - (gnus-version-number): Set to Oort Gnus 0.01. - - * gnus-art.el (gnus-mime-security-button-map): - (gnus-insert-mime-security-button): Fix for Emacs21. - -2000-12-19 17:00:00 ShengHuo ZHU - - * gnus-group.el, gnus-sum.el, message.el: Comment out :help in - easymenu, because XEmacs doesn't understand :help. - - * mm-uu.el: Require binhex. - -2000-12-19 16:00:00 ShengHuo ZHU - - * gnus.el: Merged. Emacs21 CVS tag is zsh-merge-ognus-1. - -2000-12-19 ShengHuo ZHU - - * mm-util.el (mm-charset-synonym-alist): Fix a typo. - -2000-12-18 Gerd Moellmann - - * *.xpm, *.pbm: Convert icons icons to size 24x24. - -2000-12-18 Dave Love - - * gnus-msg.el (news-setup, news-reply-mode): Don't autoload - (unused). - -2000-12-13 Miles Bader - - * smiley-ems.el (smiley-region): Bind `inhibit-point-motion-hooks' - to t, so that we don't get stuck while trying to smilefy - intangible text. - -2000-12-12 Gerd Moellmann - - * smiley-ems.el (smiley-regexp-alist): Make regexps match - at the end of the buffer. - (smiley-region): In the loop, move to the end of the submatch - matching the smiley instead of using the end of the match - of the whole regexp. - -2000-12-12 Eli Zaretskii - - * message.el (message-mode): Doc fix. - -2000-12-12 Gerd Moellmann - - * smiley-ems.el (smiley-region): Doc fix. - -2000-12-11 Miles Bader - - * gnus-sum.el (gnus-summary-recenter): When trying to keep the - bottom line visible, check to see if it's partially obscured, and - if so, either scroll one more line to make it fully visible, or - revert to showing the second line from the top. - -2000-12-07 Dave Love - - * mailcap.el (mailcap-download-directory) - * gnus-audio.el (gnus-audio-directory) - * smiley-ems.el (smiley-data-directory): Fix :type. - -2000-11-30 Dave Love - - * message.el (message-auto-save-directory): Use - file-name-as-directory. - (message-set-auto-save-file-name): Create - message-auto-save-directory if necessary. - (message-replace-chars-in-string): Removed -- unused. - (message-mail-alias-type): Customize. - (message-headers): Remove duplicate defgroup. - -2000-11-29 Dave Love - - * qp.el (quoted-printable-decode-region): Use error, not message - to report malformed text (like base64). Amend message. - -2000-11-29 Miles Bader - - * message.el (message-header-lines): Fontify tag. - -2000-11-27 Dave Love - - * nnlistserv.el: Ignore errors when requiring nnweb and avoid a - compiler warning. - -;2000-11-26 Dave Love -; -; * mm-uu.el (mm-uu-configure-list): Fix typo in :type. -; -2000-11-23 Dave Love - - * uu-post.pbm, uu-decode.pbm: new files from XPMs. - - * mm-uu.el (uudecode): Require. - (uudecode-decode-region, uudecode-decode-region-external): Don't - autoload. - (mm-uu-copy-to-buffer): Doc fix. - (mm-uu-decode-function, mm-uu-binhex-decode-function): Doc, custom - type fix. - - * mailcap.el: Doc fixes. - (mailcap-mime-data): Various adjustments. - (mailcap): New group. - (mailcap-download-directory): Customize. - (mailcap-generate-unique-filename, mailcap-binary-suffixes) - (mailcap-temporary-directory): Deleted (unused). - (mailcap-unescape-mime-test): Simplify slightly. - (mailcap-viewer-passes-test): Use functionp. - (mailcap-command-p): Aliased to executable-find. - - * rfc2047.el (rfc2047-encode-message-header): Don't encode if - default-enable-multibyte-characters is nil. - -2000-11-22 Gerd Moellmann - - * gnus-group.el (gnus-group-make-tool-bar): Fix a paren typo. - -2000-11-21 Dave Love - - * gnus-art.el (gnus-mime-button-map): Don't inherit from - gnus-article-mode-map. -; (gnus-mime-button-menu): Use mouse-set-point. - (gnus-insert-mime-button, gnus-mime-display-alternative) - (gnus-mime-display-alternative): Don't use local-map property. - -2000-11-17 Dave Love - - * uudecode.el (uudecode-insert-char): Fix bogus feature test. - (uudecode-decode-region-external): Doc fix. Use with-temp-buffer - and make-temp-file. - (uudecode-decode-region): Doc fix. - -2000-11-14 Dave Love - - * cu-exit.pbm, exit-summ.pbm, followup.pbm, fuwo.pbm: - * mail-reply.pbm, next-ur.pbm, post.pbm, prev-ur.pbm: - * reply-wo.pbm, reply.pbm, rot13.pbm, save-aif.pbm, save-art.pbm: - New files, derived from the XPMs. - -2000-11-10 Dave Love - - * gnus-agent.el (gnus-agent-confirmation-function): Add :version. - (gnus-agent-lib-file, gnus-agent-load-alist) - (gnus-agent-save-alist, gnus-agent-article-name): Use - expand-file-name. - - * gnus-group.el (gnus-group-name-charset-method-alist): Add - :version. - (nnkiboze-score-file): Defvar when compiling. - - * gnus-start.el (gnus-read-newsrc-file): Add :version. - - * gnus-art.el (gnus-article-banner-alist) - (gnus-emphasize-whitespace-regexp, gnus-ignored-mime-types) - (gnus-article-date-lapsed-new-header) - (gnus-article-mime-match-handle-function, gnus-mime-action-alist) - (gnus-treat-strip-list-identifiers, gnus-treat-date-iso8601) - (gnus-treat-strip-headers-in-body) - (gnus-treat-capitalize-sentences, gnus-treat-play-sounds) - (gnus-treat-translate): Add :version. - (gnus-article-mime-part-function): Fix defcustom. - - * nnmail.el (nnmail-expiry-target) - (nnmail-scan-directory-mail-source-once, nnmail-extra-headers) - (nnmail-split-header-length-limit): Add :version. - - * gnus-sum.el (gnus-auto-expirable-marks) - (gnus-inhibit-user-auto-expire, gnus-list-identifiers) - (gnus-extra-headers, gnus-ignored-from-addresses) - (gnus-newsgroup-ignored-charsets) - (gnus-group-highlight-words-alist) - (gnus-summary-show-article-charset-alist): Add :version. - - * catchup.pbm, describe-group.pbm, exit-gnus.pbm, get-news.pbm: - gnntg.pbm, kill-group.pbm, subscribe.pbm, unsubscribe.pbm: New - files, converted from the XPMs. - - * gnus-cache.el (gnus-cache-active-file): Don't use - file-name-as-directory on directory. - (gnus-cache-file-name): Use expand-file-name, not concat. Don't - use file-name-as-directory on directory. - - * time-date.el (timezone-make-date-arpa-standard): Autoload. - (date-to-time): Use it. - -; * message.el (message-mode) : -; : Use [:alnum:] in regexp range. -; (message-newline-and-reformat): Likewise. - (message-forward-as-mime, message-forward-ignored-headers) - (message-buffer-naming-style, message-default-charset) - (message-dont-reply-to-names, message-send-mail-partially-limit): - Add :version. - - * mm-util.el: Doc fixes. - (mm-mime-charset): Don't use the raw result of - mm-preferred-coding-system. - (mm-with-unibyte-buffer, mm-with-unibyte-current-buffer) - (mm-with-unibyte): Simplify. - - * gnus-int.el (gnus-start-news-server): Use expand-file-name, not - concat. - - * pop3.el (pop3-version): Deleted. - (pop3-make-date): New function, avoiding message-make-date. - (pop3-munge-message-separator): Use it. - -2000-11-09 Dave Love - - * gnus-group.el (gnus-group-make-directory-group) - (gnus-group-fetch-faq): Use expand-file-name. - (gnus-group-fetch-faq): Simplify completing-read form. - - * mm-bodies.el (mm-encode-body): Use mm-multibyte-p, don't just - test for Mule. - - * message.el (tool-bar-map): Defvar when compiling. - - * gnus-setup.el (running-xemacs, gnus-use-installed-tm) - (gnus-tm-lisp-directory): Deleted. - (gnus-use-installed-mailcrypt, gnus-emacs-lisp-directory): Use - (featurep 'xemacs). - (gnus-gnus-lisp-directory, gnus-mailcrypt-lisp-directory) - (gnus-mailcrypt-lisp-directory, gnus-bbdb-lisp-directory): Remove - version numbers from file names. - -2000-11-08 Dave Love - - * mm-view.el: Use featurep for XEmacs test. - (mm-inline-message): Test for `remove-specifier'; don't use - condition-case. - - * mm-bodies.el (mm-encode-body): Use mm-multibyte-p. - - * gnus-score.el (gnus-score-load-file): Use expand-file-name. - (gnus-score-find-bnews): Don't concat "". - - * cu-exit.xpm, prev-ur.xpm, next-ur.xpm, post.xpm, fuwo.xpm: - * followup.xpm, uu-post.xpm, uu-decode.xpm, mail-reply.xpm: - * reply.xpm, reply-wo.xpm, rot13.xpm, save-aif.xpm, save-art.xpm: - * exit-summ.xpm: New files, renamed from icons by Luis Fernandes. - - * gnus-sum.el: Put some defvars in eval-when-compile. - (gnus-summary-mode-hook): Add :options. - (gnus-summary-make-menu-bar): Add some :help, used by tool bar. - (gnus-summary-tool-bar-map): New variable. - (gnus-summary-make-tool-bar): New function. - (gnus-summary-mode): Put kill-all-local-variables first. - - * gnus-group.el (gnus-group-toolbar-map): New variable. - (gnus-group-make-tool-bar): Rewritten. - (gnus-group-mode): Put kill-all-local-variables first. - - * rfc2047.el: Require gnus-util. - - * nnml.el (gnus-sorted-intersection): Autoload. - - * nnheader.el: Wrap subst-char-in-string def in eval-and-compile. - Put some defvars in eval-when-compile. - (gnus-intersection, gnus-sorted-complement): Autoload. - - * imap.el (imap-point-at-eol): New, replacing gnus-point-at-eol. - - * mm-encode.el (mm-body-7-or-8): Autoload. - - * mm-decode.el (mm-insert-inline): Autoload. - - * mml.el: - * message.el: Put some defvars in eval-when-compile. - - * gnus-msg.el: Put some defvars in eval-when-compile. - (gnus-msg-mail): Move after gnus-setup-message. - - * smiley-ems.el (smiley-data-directory, smiley-regexp-alist): Doc fix. - -2000-11-07 Dave Love - - * gnus-util.el (nnheader): Don't require message (recursive - autoload). - - * uudecode.el: Avoid compiler warnings. - - * rfc2047.el: (rfc2047-fold-region): Use gnus-point-at-bol. - (rfc2047-charset-encoding-alist): Add iso-8859-1[45]. - -2000-11-06 Dave Love - - * gnus-salt.el (gnus-binary-mode): Fix call to gnus-add-minor-mode. - - * uudecode.el: Use (featurep 'xemacs). Require cl when compiling. - (uudecode-char-int): New alias, replacing char-int. - (uudecode-decode-region): Don't call buffer-disable-undo. - -; * mm-uu.el (mm-uu-configure): Unquote lambda. -; (mm-uu-configure-list): Doc fix. -; -; * earcon.el (running-xemacs): Don't define. -; -;2000-11-03 Stefan Monnier -; -; * message.el (message-font-lock-keywords): Match a final newline -; to help font-lock's multiline support. -; -2000-11-03 Dave Love - - * gnus-nocem.el (gnus-nocem-check-article-limit): Default to 500. - - * mm-partial.el (mm-inline-partial): Space-prefix temp buffer - name. - - * gnus-cus.el (gnus-group-parameters) : Fix custom type. - : Fix custom type, doc. - - * mm-decode.el (mm-display-external): Space-prefix temp buffer - name. Don't disable undo explicitly. - -;2000-11-02 Dave Love -; -; * message.el (message-font-lock-keywords): Use [:alpha:] for -; cite-prefix. - -2000-11-01 Dave Love - - * rfc2047.el (base64): Require unconditionally. - (message-posting-charset): Defvar when compiling. - (rfc2047-encode-message-header, rfc2047-encodable-p): Require - message. - - * gnus-sum.el (nnoo): Require. - (mm-uu-dissect): Autoload. - - * mml.el (mml-parse-1): Clarify message. - (mml-minibuffer-read-type): Use mailcap-mime-types. - -2000-11-01 Stefan Monnier - - * mml.el: Fix a typo in the requiring of CL. - -2000-11-01 Dave Love - - * utf7.el: Require cl when compiling. - - * binhex.el: Use (featurep 'xemacs). - (binhex-char-int): New alias, replacing char-int. Change callers. - (binhex-decode-region): Simplify work buffer code. - (binhex-decode-region-external): Use expand-file-name, not concat. - -2000-10-30 Dave Love - - * gnus-art.el: Fix 2000-10-27 change properly. - -2000-10-28 Miles Bader - - * gnus-art.el (gnus-read-save-file-name): Remove extraneous paren. - -2000-10-27 Dave Love - - * gnus-group.el (gnus-group-make-menu-bar): Add some :help - strings. - (gnus-group-make-tool-bar): New function. - (gnus-group-mode): Use it. - - * message.el (message-mode-menu): Add some :help strings. - (message-mode) [message-tool-bar-map]: Define tool-bar-map. - (featurep): Use (featurep 'xemacs). Install tool bar for Emacs. - - * catchup.xpm, exit-gnus.xpm, gnntg.xpm, subscribe.xpm: - * describe-group.xpm, get-news.xpm, kill-group.xpm: - * unsubscribe.xpm: New files. Renamed icons from Luis Fernandes. - - * mm-decode.el (mm-valid-and-fit-image-p): Don't test - display-graphic-p here. - -2000-10-27 Miles Bader - - * gnus-ems.el (gnus-ems-redefine): Use (featurep 'xemacs) instead - of the `gnus-xemacs' variable, as the latter has been removed. - * gnus-start.el (gnus-1, gnus-read-descriptions-file): Likewise. - * gnus-art.el (gnus-treat-display-xface) - (gnus-treat-display-smileys, gnus-treat-display-picons) - (gnus-article-read-summary-keys): Likewise. - -2000-10-26 Dave Love - - (defvar): Use rmail-spool-directory unconditionally. - -2000-10-18 Dave Love - - * mm-bodies.el (mm-uu-decode-function) - (mm-uu-binhex-decode-function): Defvar when compiling. - - * gnus-nocem.el (gnus-nocem-issuers): Update. - (gnus-nocem-check-from): New option. - (gnus-nocem-scan-groups): Use it. - (gnus-nocem-check-article): Bind gnus-newsgroup-name. - (gnus-nocem-check-article-limit): Add :version. - -2000-10-16 Stefan Monnier - - * ietf-drums.el (mm-util): Require CL when compiling. - -2000-10-15 Dave Love - - * qp.el: Require mm-util. - -2000-10-13 Dave Love - - * qp.el (quoted-printable-decode-region): Avoid invalid - coding-systems. - -2000-10-12 Gerd Moellmann - - * mm-bodies.el: Don't require `mm-uu' at compile-time; it leads - to a recursive load. - -2000-10-12 Dave Love - - * mm-util.el (mm-charset-synonym-alist): Add windows-1252. - - * gnus.el (gnus-group-startup-message): Check for PBM image. - -2000-10-09 Dave Love - - * mail-source.el (mail-source-fetch-imap): Bind - default-enable-multibyte-characters rather than using - mm-disable-multibyte. - -2000-10-05 Dave Love - - * qp.el (mm-decode-coding-region, mm-encode-coding-region): - Autoload. - (quoted-printable-decode-region): Rename arg which confused - charset with coding-system. Don't use nonascii-insert-offset. - Coding-system encode the region initially. Don't recognize `==' - as valid QP. Coding-system decode the region finally. - (quoted-printable-decode-string): Rename arg which confused - charset with coding-system. - - * mm-bodies.el: Require mm-uu, Don't require qp, uudecode. - (mm-encode-body): Apply mm-charset-to-coding-system to arg of - mm-encode-coding-region. - (mm-decode-body, mm-decode-string): Rename variables which - confused charset with coding-system. - (binhex-decode-region): Don't autoload. - (mm-body-encoding): Require message. - (mm-decode-content-transfer-encoding): Require mm-uu in relevant - cond branches. - - * gnus-art.el (article-de-quoted-unreadable) - (article-de-base64-unreadable): Fold search case - rather than downcasing string. Apply mm-charset-to-coding-system - to arg of quoted-printable-decode-region. - -2000-10-04 Dave Love - - * gnus-ems.el: Don't turn off compiler warnings in local vars. - Require ring when compiling. - (gnus-article-compface-xbm): New variable. - -2000-10-04 Dave Love - - * smiley-ems.el (smiley-regexp-alist, smiley-update-cache): Use - pbm images. - - * frown.pbm, smile.pbm, wry.pbm: New files. - - * frown.xbm, smile.xbm, wry.xbm: Deleted. - -2000-10-03 Dave Love - - * mail-source.el (mail-sources): Revert to nil. - - * nnmail (nnmail-spool-file): Revert to `((file))'. - - * qp.el: Don't require mm-util. - (quoted-printable-decode-region): Rewritten. - (quoted-printable-decode-string, quoted-printable-encode-region): - Doc fix. - (quoted-printable-encode-region): Barf on multibyte characters. - Maybe make the class multibyte. Upcase chars, not formatted - strings. Allow mm-use-ultra-safe-encoding to be unbound. - (quoted-printable-encode-string): Don't use - mm-with-unibyte-buffer. - -2000-09-29 Gerd Moellmann - - * smiley-ems.el (smiley-update-cache): Use `:ascent center'. - -2000-09-21 Dave Love - - * smiley-ems.el (smiley-region): Test if display-graphic-p bound - (for Emacs 20). Tidy somewhat. - -2000-09-21 Dave Love - - * gnus-ems.el (gnus-article-display-xface): Use unibyte for the - image processing. Rationalize logic somewhat. - -2000-09-20 Dave Love - - * gnus-start.el (gnus-1) : Don't test for X - specifically. - - * gnus.el (gnus-version-number): Avoid some redundant - autoloads. - -2000-09-20 Gerd Moellmann - - * gnus-ems.el (gnus-article-display-xface): Don't convert PBM - to XBM; we always have PBM support. - -2000-09-14 Dave Love - - * gnus.el (gnus-charset): - * mm-decode.el (mime-display): - * imap.el (imap) : Add :version. - -2000-09-13 Gerd Moellmann - - * parse-time.el: Fix author's mail address. - - * earcon.el, flow-fill.el, gnus-cite.el, gnus-gl.el, gnus-ml.el: - * gnus-mlspl.el, gnus-nocem.el, gnus-range.el, gnus-salt.el: - * gnus-setup.el, gnus-soup.el, gnus-undo.el, gnus-vm.el: - * messcompat.el, nnbabyl.el, nndir.el, nneething.el: - * nngateway.el, nnheaderxm.el, nnkiboze.el, nnlistserv.el: - * nnmbox.el, nnmh.el, nnoo.el, nnsoup.el, nnspool.el, rfc2045.el: - * rfc2231.el, uudecode.el: Fix copyright notice. - - * nnweb.el (toplevel): To make the file bootstrap in Emacs, - require `w3' at load-time only if not running in batch mode. - -2000-12-19 16:00:00 ShengHuo ZHU - - * gnus.el: Before merge with Emacs21. - -2000-12-19 Raymond Scholz - - * gnus-art.el (gnus-article-dumbquotes-map): Add EUR symbol. - -2000-12-19 Per Abrahamsen - - * mml.el (mml-mode-map): Change mml prefix from `M-m' to `C-c C-m' - to avoid conflict with the standard `back-to-indentation' - binding. - -2000-12-17 10:00:00 ShengHuo ZHU - - * mm-extern.el (mm-inline-external-body): g-a-m-h may be a handle. - - * mm-util.el (mm-enable-multibyte-mule4): Test charsetp. - (mm-disable-multibyte-mule4): Ditto. - (mm-with-unibyte-current-buffer-mule4): Ditto. - -2000-12-15 10:00:00 ShengHuo ZHU - - * pop3.el (pop3-movemail): Use binary. - (pop3-movemail-file-coding-system): Removed. - -2000-12-14 13:00:00 ShengHuo ZHU - - * mm-util.el (mm-charset-synonym-alist): Add cn-gb. - -2000-12-13 21:00:00 ShengHuo ZHU - - * nnspool.el (nnspool-lib-dir): Check whether /usr/lib/news/active - exists. - -2000-12-13 13:00:00 ShengHuo ZHU - - * gnus-msg.el (gnus-post-method): Use backend name when the - address is "". - -2000-12-08 10:00:00 ShengHuo ZHU - - * gnus-art.el (article-verify-x-pgp-sig): Don't test - mm-verify-option. - (gnus-treat-x-pgp-sig): Default value. - (gnus-ignored-headers): Redundant. - -2000-12-04 22:00:00 ShengHuo ZHU - - * gnus-win.el (gnus-configure-frame): Save selected window. - -2000-02-15 Andrew Innes - - * nnmbox.el: Require gnus-range. - (nnmbox-group-building-active-articles): New variable. - (nnmbox-group-active-articles): New variable; this is a cache of - all active articles by group and number. - (nnmbox-in-header-p): New function. - (nnmbox-find-article): New function. - (nnmbox-record-active-article): New function. - (nnmbox-record-deleted-article): New function. - (nnmbox-is-article-active-p): New function. - (nnmbox-retrieve-headers): Use nnmbox-find-article. - (nnmbox-request-article): Ditto. Also supply extra arg to - nnmbox-article-group-number. - (nnmbox-request-expire-articles): Ditto. - (nnmbox-request-move-article): Ditto. - (nnmbox-request-replace-article): Ditto. - (nnmbox-request-rename-group): Rename group entry in active - article cache. - (nnmbox-delete-mail): Update active article cache, unless article - is being replaced. - (nnmbox-possibly-change-newsgroup): Call nnmbox-read-mbox, rather - than partially duplicating it. - (nnmbox-article-group-number): Add extra `this-line' arg, to - handle articles belonging to multiple groups. - (nnmbox-save-mail): Update active article cache. - (nnmbox-read-mbox): Build active article cache when loading mbox. - Also do some repair work, if we find articles that are missing the - appropriate X-Gnus-Newsgroup lines in the header. We can usually - reconstruct these from Xref info. - -2000-12-04 18:00:00 ShengHuo ZHU - - * mail-source.el (mail-source-report-new-mail): Use - nnheader-run-at-time. - -2000-02-15 Andrew Innes - - * mail-source.el (mail-source-fetch-pop): Clear pop password when - an error is thrown, and then rethrow the error. - (mail-source-check-pop): Ditto. - (mail-source-start-idle-timer): Prevent multiple pop checks - running if the check takes a long time. - -2000-12-04 14:00:00 ShengHuo ZHU - - * gnus-msg.el (gnus-msg-mail): COMPOSEFUNC should return t if - succeed. - -2000-12-04 13:00:00 ShengHuo ZHU - - * gnus-win.el (gnus-configure-windows): Make sure - nntp-server-buffer is live. - (gnus-remove-some-windows): switch-to-buffer -> set-buffer. - -2000-11-21 Stefan Monnier - - * gnus-win.el (gnus-configure-windows): switch-to-buffer -> set-buffer. - -2000-12-04 Andreas Jaeger - - * gnus-msg.el (gnus-summary-mail-forward): Fix typos in description. - -2000-12-03 12:00:00 ShengHuo ZHU - - * mml2015.el (mml2015-fix-micalg): Alg might be nil. - -2000-12-01 Christopher Splinter - - * gnus-sum.el (gnus-summary-limit-to-age): Fix typo. - -2000-12-01 Simon Josefsson - - * mml-smime.el (mml-smime-verify): Fix address parsing. - -2000-12-01 Simon Josefsson - - * mml-smime.el (mml-smime-verify): Don't modify MM buffer. Handle - more than one certificate inside PKCS#7 blob. Better security - information (clamed / actual sender, openssl output, certificates - inside message). - - * smime.el (smime-verify-region): Output to /dev/null. - (smime-buffer-as-string-region): Don't parse empty lines. - -2000-11-30 23:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-mime-security-button-line-format-alist): Add - ?d and ?D. - (gnus-mime-security-show-details-inline): New variable. - (gnus-mime-security-show-details): Use them. - (gnus-insert-mime-security-button): Ditto. - - * mml2015.el (mml2015-gpg-verify): Set details when succeed. - Suggest by Michael Duggan (md5i@cs.cmu.edu). - (mml2015-gpg-clear-verify): Ditto. - (mml2015-gpg-decrypt-1): Ditto. - (mml2015-use): Prefer 'gpg. - -2000-11-30 19:00:00 ShengHuo ZHU - - * gnus-util.el (gnus-add-text-properties-when): New function. - (gnus-remove-text-properties-when): Ditto. - - * gnus-cite.el (gnus-article-hide-citation): Use them. - (gnus-article-toggle-cited-text): Use them. - - * gnus-art.el (gnus-signature-toggle): Use them. - (gnus-article-show-hidden-text): Ditto. - (gnus-article-hide-text): Ditto. - -2000-11-30 14:00:00 ShengHuo ZHU - - * mm-util.el (mm-find-charset-region): Remove eight-bit-*. - -2000-11-30 Simon Josefsson - - * smime.el (smime-point-at-eol): New alias. - (smime-buffer-as-string-region): Use it. - -2000-11-29 21:00:00 ShengHuo ZHU - - * nndraft.el (nndraft-request-restore-buffer): Remove Date field. - -2000-11-29 20:00:00 ShengHuo ZHU - - * nnfolder.el (nnfolder-request-expire-articles): expiry-target. - - * nnbabyl.el (nnbabyl-request-expire-articles): Ditto. - - * nnmbox.el (nnmbox-request-expire-articles): Ditto. - -2000-11-22 Jan Nieuwenhuizen - - * nnmh.el (nnmh-request-expire-articles): Implemented - expiry-target for nnmh backend. - -2000-11-30 Simon Josefsson - - * mm-decode.el (mm-security-from): New variable. - (mm-possibly-verify-or-decrypt): Use it rather than `from'. - - * mml-smime.el (mml-smime-verify): Use `mm-security-from' rather - than `from'. - -2000-11-30 Simon Josefsson - - * mml-smime.el (mml-smime-verify): Verify that certificate mail - address match sender address. - - * mm-decode.el (mm-possibly-verify-or-decrypt): Bind sender address. - - * smime.el (smime-verify-region): Don't copy buffer. - (smime-decrypt-buffer): Use expand-file-name on keyfile. - (smime-pkcs7-region): New function. - (smime-pkcs7-certificates-region): Ditto. - (smime-pkcs7-email-region): Ditto. - (smime-buffer-as-string-region): Ditto. - - * gnus-art.el (gnus-mime-security-show-details): Goto beginning of - buffer. - -2000-11-23 Jens Krinke - - * smime.el (smime-decrypt-region): Fix keyfile argument. - -2000-11-29 00:00:00 ShengHuo ZHU - - * nnmail.el (nnmail-cache-accepted-message-ids): Add doc. - -2000-11-28 17:00:00 ShengHuo ZHU - - * message.el (message-shoot-gnksa-feet): New variable. - (message-gnksa-enable-p): New function. - (message-send): Use it. - (message-check-news-body-syntax): Ditto. - -2000-11-28 Katsumi Yamaoka - - * message.el (message-make-message-id): Remove the redundancy. - -2000-11-22 17:00:00 ShengHuo ZHU - - * message.el (message-setup): Discourage using mc-install-*-mode. - - * gnus-setup.el (gnus-use-mailcrypt): Don't hook mail-crypt. - -2000-11-22 16:00:00 ShengHuo ZHU - - * gnus-cite.el (gnus-cite-parse): Guess citation length. - -2000-11-22 14:00:00 ShengHuo ZHU - - * gnus-ml.el (gnus-mailing-list-insinuate): New function. - -2000-11-22 13:00:00 ShengHuo ZHU - - * gnus-ml.el (gnus-mailing-list-archive): Find the real url. - -2000-11-22 11:00:00 ShengHuo ZHU - - * gnus-xmas.el (gnus-xmas-article-display-xface): Use - insert-buffer-substring. - - * message.el (message-send-mail): Use buffer-substring-no-properties. - (message-send-news): Ditto. - -2000-11-22 David Edmondson - - * imap.el (imap-wait-for-tag): Message read info. - -2000-11-21 20:00:00 ShengHuo ZHU - - * mml2015.el (mml2015-mailcrypt-encrypt): Ensure the part is encrypted. - (mml2015-mailcrypt-encrypt): Use unibyte-buffer. - (mml2015-gpg-encrypt): Ditto. - -2000-11-21 09:00:00 ShengHuo ZHU - - * mm-decode.el (mm-verify-option): Default value. - - * mml-sec.el (mml-secure-part): Error message. - -2000-11-20 18:00:00 ShengHuo ZHU - - * gnus-ml.el (gnus-mailing-list-archive): Use browse-url. - -2000-11-20 17:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-article-make-menu-bar): Use easy-menu-add. - -2000-11-20 16:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-article-describe-key): Use prompt. - (gnus-article-describe-key-briefly): Ditto. - -2000-11-20 15:00:00 ShengHuo ZHU - - * gnus-agent.el (gnus-agent-expire): Ignore corrupted history. - -2000-11-20 10:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-article-describe-key): New function. - (gnus-article-describe-key-briefly): New function. - -2000-11-19 23:00:00 ShengHuo ZHU - - * mm-decode.el (mm-decrypt-option): Doc typo. - - * gnus-art.el (gnus-article-read-summary-keys): lookup-key may - return a number. - -2000-11-19 21:00:00 ShengHuo ZHU - - * message.el (message-newline-and-reformat): Typo. - -2000-11-19 12:00:00 ShengHuo ZHU - - * gnus-art.el (article-verify-x-pgp-sig): Check whether - original-article-buffer exists. - - * rfc2047.el (rfc2047-q-encoding-alist): Match Resent-. - (rfc2047-header-encoding-alist): Addresses are different from text. - (rfc2047-encode-message-header): Ditto. - (rfc2047-dissect-region): Extra parameter. - (rfc2047-encode-region): Ditto. - (rfc2047-encode-string): Ditto. - -2000-11-19 00:00:00 ShengHuo ZHU - - * mm-uu.el (mm-uu-pgp-encrypted-extract-1): New function. - (mm-uu-pgp-encrypted-extract): Use it. - (mm-uu-pgp-signed-extract-1): New function. - (mm-uu-pgp-signed-extract): Use it. - - * gnus-art.el (gnus-mime-display-security): New function. - (gnus-mime-display-part): Use it. - (gnus-mime-security-verify-or-decrypt): New function. - (gnus-mime-security-press-button): New function. - (gnus-insert-mime-security-button): Use it. - - * mm-decode.el (mm-possibly-verify-or-decrypt): Use mm-h-m-c-p. - (mm-find-raw-part-by-type): Ditto. - (mm-verify-function-alist): Add x-gnus-pgp-signature handle. - (mm-decrypt-function-alist): Add x-gnus-pgp-encrypted handle. - (mm-destroy-parts): Kill nested multibyte buffer. - - * mml2015.el (mml2015-mailcrypt-verify): Use mm-h-m-c-p. - (mml2015-gpg-verify): Ditto. - -2000-11-18 Simon Josefsson - - * mml2015.el (mml2015-mailcrypt-clear-verify): New function. - (mml2015-function-alist): Use it. - - * mml-sec.el (mml-sign-alist): Update names. - (mml-encrypt-alist): Ditto. - (mml-secure-part-smime-sign): Moved to mml-smime.el - as `mml-smime-sign-query'. - (mml-secure-part-smime-encrypt-by-file): Moved to mml-smime.el as - `mml-smime-get-file-cert'. - (mml-secure-part-smime-encrypt-by-dns): Moved to mml-smime.el as - `mml-smime-get-dns-cert'. - (mml-secure-part-smime-encrypt): Moved to mml-smime.el as - `mml-smime-encrypt-query'. - (mml-smime-sign-buffer): Use mml-smime-sign. - (mml-smime-encrypt-buffer): Use mml-smime-encrypt. - - * mml-smime.el (mml-smime-sign): New function. - (mml-smime-encrypt): - (mml-smime-sign-query): - (mml-smime-get-file-cert): - (mml-smime-get-dns-cert): - (mml-smime-encrypt-query): Moved from mml-sec.el. - -2000-11-16 Simon Josefsson - - * mml2015.el (mml2015-gpg-clear-verify): New function. - (mml2015-function-alist): Add it. - -2000-11-17 14:21 ShengHuo ZHU - - * message.el (message-setup-fill-variables): Use - message-cite-prefix-regexp. - (message-newline-and-reformat): Check the end of citation, leading - WSP, break in the cite prefix. - (message-fill-paragraph): New function. - -2000-11-17 13:44 ShengHuo ZHU - - * lpath.el: Shut up. - -2000-11-17 Per Abrahamsen - - * gnus-msg.el (gnus-group-posting-charset-alist): No longer allow - raw 8-bit in headers in dk.* newsgroups. - -2000-11-17 08:02 ShengHuo ZHU - - * message.el (message-newline-and-reformat): Match extra WSPs. - -2000-11-16 23:31 ShengHuo ZHU - - * mml.el (mml-generate-mime-1): Ignore ascii. - -2000-11-16 Justin Sheehy - - * gnus-sum.el (gnus-summary-make-menu-bar): Fix menu items. - -2000-11-16 17:00 ShengHuo ZHU - - * message.el (message-cite-prefix-regexp): Prefix should not end - at space. - -2000-11-15 18:09 ShengHuo ZHU - - * message.el (message-mode-syntax-table): Add - as a word - constituent as in articles. - (message-setup-fill-variables): Add -_. as supercite-style prefix. - * gnus-art.el (gnus-article-mode-syntax-table): Remove ?-. - * gnus-cite.el (gnus-cite-parse): Match from the beginning of line. - -2000-11-15 13:21 ShengHuo ZHU - - * gnus-msg.el (gnus-inews-do-gcc): Expire the article. - -2000-11-12 David Edmondson - - * message.el (message-font-lock-keywords): use - message-cite-prefix-regexp. - -2000-11-15 Kai Gro,A_(Bjohann - - * gnus-group.el (gnus-group-jump-to-group-prompt): New variable by - Stein Arild Str,Ax(Bmme. - (gnus-group-jump-to-group): Use it. - (gnus-group-jump-to-group-prompt): Customize. - -2000-11-14 10:32:42 ShengHuo ZHU - - * mailcap.el (mailcap-possible-viewers): Match the entire string. - -2000-11-14 10:20:56 ShengHuo ZHU - - * mml2015.el (mml2015-mailcrypt-verify): replace-match is - incompatible. - (mml2015-mailcrypt-sign): Ditto. - -2000-11-14 10:12:05 ShengHuo ZHU - - * gnus-msg.el (gnus-inews-do-gcc): Update summary data when the - group is open. - -2000-11-14 00:48:52 ShengHuo ZHU - - * gnus-bcklg.el (gnus-backlog-enter-article): Don't enter - nnvirtual articles. - (gnus-backlog-request-article): Don't request nnvirtual articles. - -2000-11-13 22:08:09 ShengHuo ZHU - - * mml2015.el (mml2015-mailcrypt-sign): Remove "-" escape. - * mml.el (mml-generate-mime-1): Save cont. skip multipart attributes. - -2000-11-13 20:43:37 ShengHuo ZHU - - * mm-decode.el (mm-get-part): Don't call mm-insert-part. - * mml.el (mml-generate-mime-1): Use charset attribute. - * mm-bodies.el (mm-encode-body): Add parameter charset. - * mm-util.el (mm-mime-charset): Show error when find 8-bit characters. - -2000-11-13 16:09:09 ShengHuo ZHU - - * mml2015.el (mml2015-mailcrypt-decrypt): Handle quit. - (mml2015-mailcrypt-clear-decrypt): Ditto. - (mml2015-mailcrypt-verify): Ditto. - (mml2015-mailcrypt-clear-verify): Ditto. - (mml2015-gpg-verify): Ditto. - -2000-11-13 15:29:58 ShengHuo ZHU - - * smime.el (smime-openssl-program): Test the existence of openssl. - * mml-smime.el: Require mm-decode. - (mml-smime-verify-test): New function. - * mm-decode.el (mm-verify-function-alist): Use it. - -2000-11-13 09:50:29 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-repair-multipart): Fix Mime-Version - anyway. - -2000-11-13 Simon Josefsson - - * mm-uu.el (mm-uu-pgp-signed-extract): Explain why clear - verification doesn't work. - -2000-11-12 23:36:45 ShengHuo ZHU - - * gnus-msg.el (gnus-inews-mark-gcc-as-read): New variable. - (gnus-inews-do-gcc): Use it. - -2000-11-12 21:35:04 ShengHuo ZHU - - * rfc2231.el (rfc2231-encode-string): Insert semi-colon and - leading space. - * mm-extern.el (mm-inline-external-body): Report error when no - access-type. - -2000-11-12 19:48:30 ShengHuo ZHU - - * gnus-sum.el (gnus-select-newsgroup): Change the error message. - -2000-11-12 11:53:18 ShengHuo ZHU - - * gnus-art.el (gnus-mime-button-menu): Use select-window. - -2000-11-12 09:47:54 ShengHuo ZHU - - * gnus-art.el (gnus-mime-display-part): Display multipart/related - as multipart/mixed. - -2000-11-12 David Edmondson - - * message.el (message-cite-prefix-regexp): moved from gnus-cite.el - and replace `.' with `\w' to allow for different syntax tables - (from Vladimir Volovich). - * message.el (message-newline-and-reformat): use - `message-cite-prefix-regexp'. - * gnus-cite.el (gnus-supercite-regexp): use - `message-cite-prefix-regexp'. - * gnus-cite.el (gnus-cite-parse): use - `message-cite-prefix-regexp'. - -2000-11-12 08:52:46 ShengHuo ZHU - - * mml2015.el (mml2015-mailcrypt-verify): Replace armors with - PGP SIGNATURE. Escape leading "-"'s. - (mml2015-mailcrypt-sign): Replace armors with PGP MESSAGE. - -2000-11-11 15:55:35 ShengHuo ZHU - - * mm-uu.el (mm-uu-type-alist): Stricter shar regexp. - -2000-11-11 Simon Josefsson - - * mml2015.el (mml2015-gpg-verify): Set "OK" security status. - - * smime.el (smime-details-buffer): New variable. - (smime-sign-region): - (smime-encrypt-region): - (smime-verify-region): - (smime-decrypt-region): Copy OpenSSL output to the buffer. - - * mml-smime.el (mml-smime-verify): Support security info. - -2000-11-10 17:11:22 ShengHuo ZHU - - * mm-decode.el (mm-verify-option): Set default to nil. - (mm-decrypt-option): Ditto. - * gnus-art.el (article-verify-x-pgp-sig): New function. - -2000-11-10 09:01:25 ShengHuo ZHU - - * gnus-art.el (gnus-mime-display-alternative): Show button if no - preferred part. - -2000-11-07 Kai Gro,A_(Bjohann - - * gnus-sum.el (gnus-move-split-methods): Say that - `gnus-split-methods' uses file names, whereas this uses group - names. (Report from Nevin Kapur) - -2000-11-10 01:23:20 ShengHuo ZHU - - * mm-partial.el (mm-inline-partial): Insert MIME-Version. - -2000-11-09 17:02:50 ShengHuo ZHU - - * nnheader.el (nnheader-directory-files-is-safe): New variable. - (nnheader-directory-articles): Use it. - (nnheader-article-to-file-alist): Ditto. - -2000-11-09 16:20:37 ShengHuo ZHU - - * rfc2047.el (rfc2047-pad-base64): New function. - (rfc2047-decode): Use it. - -2000-11-09 08:53:04 ShengHuo ZHU - - * gnus-srvr.el (gnus-browse-foreign-server): Bind the original - select method. - -2000-11-08 19:58:58 ShengHuo ZHU - - * mml2015.el (mml2015-gpg-decrypt-1): - (mml2015-gpg-verify): buffer-string has no argument in Emacs. - -2000-11-08 16:37:02 ShengHuo ZHU - - * gnus-cache.el (gnus-cache-generate-nov-databases): Reopen cache. - -2000-11-08 08:38:30 ShengHuo ZHU - - * pop3.el (pop3-munge-message-separator): A message may have an - empty body. - -2000-11-07 18:02:26 ShengHuo ZHU - - * mm-uu.el (mm-uu-type-alist): Don't test pgp stuff. - (mm-uu-pgp-encrypted-extract): Clean mml2015 buffer. - (mm-uu-pgp-signed-extract): Use coding-system. - -2000-11-07 14:33:19 ShengHuo ZHU - - * gnus-art.el (gnus-mime-display-part): Show MIME security button. - (gnus-insert-mime-security-button): New function. - * mm-decode.el (mm-possibly-verify-or-decrypt): Add security info. - * mml2015.el: Add security info when verify or decrypt. - * mm-uu.el (mm-uu-pgp-signed-extract): Use multipart. - (mm-uu-pgp-encrypted-extract): Ditto. - -2000-11-07 08:49:36 ShengHuo ZHU - - * mm-decode.el (mm-display-parts): New function. - * gnus-art.el (gnus-mime-view-all-parts): Use it. Remove parts first. - -2000-02-02 Alexandre Oliva - - * gnus-mlspl.el: Documentation tweaks. - -2000-11-06 22:06:44 ShengHuo ZHU - - * mm-decode.el (mm-possibly-verify-or-decrypt): Fix. - * gnus-art.el (gnus-article-encrypt-body): Rename and support prefix - argument. - -2000-11-06 19:10:14 ShengHuo ZHU - - * rfc2231.el (rfc2231-encode-string): Use us-ascii if charset is nil. - -2000-11-06 18:17:53 ShengHuo ZHU - - * gnus-art.el (gnus-article-encrypt): New function. - (gnus-article-encrypt-protocol-alist): New variable. - (gnus-article-encrypt-protocol): New variable. - * mml2015.el (mml2015-self-encrypt): New function. - (mml2015-mailcrypt-encrypt): Set mc-pgp-always-sign. - -2000-11-06 16:02:52 ShengHuo ZHU - - * mm-uu.el (mm-uu-gpg-key-skip-to-last): New function. - (mm-uu-pgp-key-extract): Use application/pgp-keys, don't snarf, - let mailcap do it. - * mml2015.el: Remove snarf code. - * mm-decode.el: Remove snarf code. - -2000-11-06 14:03:10 ShengHuo ZHU - - * mml.el (mml-insert-mml-markup): Ignore internal stuff. - (mml-insert-mime): Understand gnus-decoded. - (mime-to-mml): New parameter handles. - * gnus-art.el (gnus-mime-save-part-and-strip): Use it. - * gnus-sum.el (gnus-summary-edit-article): Add argument `3'. - -2000-11-06 13:51:37 ShengHuo ZHU - - * mm-decode.el (mime-security): New group. - (mm-verify-function-alist): Add test function. - (mm-decrypt-function-alist): Ditto. - (mm-snarf-option): Set default value as nil. - (mm-find-part-by-type): Recursive parameter. - (mm-possibly-verify-or-decrypt): Support draft-ietf-openpgp-multsig. - * mml2015.el: Support draft-ietf-openpgp-multsig. - -2000-11-06 13:01:27 ShengHuo ZHU - - * gnus-art.el (gnus-mime-view-part-as-charset): New function. - (gnus-article-view-part-as-charset): New function. - -2000-11-05 22:34:07 ShengHuo ZHU - - * mm-decode.el (mm-verify-option): Default value. - (mm-possibly-verify-or-decrypt): Dealing with broken messages. - -2000-11-05 15:06:05 ShengHuo ZHU - - * nnvirtual.el (nnvirtual-request-expire-articles): Uncompress range. - -2000-11-05 Simon Josefsson - - * mml-smime.el (mml-smime-verify): Work in original multipart - buffert. - - * mm-decode.el (mm-handle-multipart-original-buffer): New macro. - (mm-handle-multipart-ctl-parameter): Ditto. - (mm-alist-to-plist): New function. - (mm-dissect-buffer): Store CTL parameters and copy original buffer - for multiparts. - (mm-destroy-parts): Destroy multipart buffert. - (mm-remove-part): Ditto. - - * mml-smime.el (mml-smime-sign): Not used. - (mml-smime-encrypt): Ditto. - - * mm-decode.el (mml-smime-verify): Autoload mml-smime. - - Verify S/MIME signature support. - - * mm-decode.el (mm-inline-media-tests): Add - application/{x-,}pkcs7-signature. - (mm-inlined-types): Ditto. - (mm-automatic-display): Ditto. - (mm-verify-function-alist): Ditto. Add name of method. - (mm-decrypt-function-alist): Add name of method. - (mm-find-part-by-type): Add documentation. - (mm-possibly-verify-or-decrypt): Use new format of - mm-{verify,decrypt}-function-alist. Use method names. - - * mml-smime.el (mml-smime-verify): New function. - -2000-11-04 20:38:50 ShengHuo ZHU - - * mm-view.el (mm-inline-text): Move point to the end of inserted text. - -2000-11-04 19:07:08 ShengHuo ZHU - - * mml2015.el (mml2015-function-alist): Clear verify and decrypt. - * mm-uu.el: Reorganized. Add gnatsweb, pgp-signed, pgp-encrypted. - * mm-decode.el (mm-snarf-option): New. - -2000-11-04 13:08:02 ShengHuo ZHU - - * mm-util.el (mm-subst-char-in-string): New function. - (mm-replace-chars-in-string): Use it. - * message.el (message-replace-chars-in-string): Use it. - * nnheader.el (nnheader-replace-chars-in-string): Use it. - * gnus-mh.el (mh-lib-progs): Shut up. - -2000-11-04 ShengHuo Zhu - - * base64.el, md5.el: Moved to contrib directory. - -2000-11-04 11:13:56 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-search-article-forward): Don't move - the last article when search. - -2000-11-04 10:34:29 ShengHuo ZHU - - * nnheader.el (nnheader-pathname-coding-system): Default iso-8859-1. - * nnmail.el (nnmail-pathname-coding-system): Ditto. - -2000-09-29 David Edmondson - - * message.el (message-newline-and-reformat): Typo. - -2000-11-04 10:11:05 ShengHuo ZHU - - * rfc2231.el (rfc2231-decode-encoded-string): Test mm-multibyte-p. - -2000-11-04 09:53:42 ShengHuo ZHU - - * nntp.el (nntp-decode-text): Delete bogus status lines. - -2000-11-03 Stefan Monnier - - * message.el (message-font-lock-keywords): Match a final newline - to help font-lock's multiline support. - -2000-11-04 09:11:44 ShengHuo ZHU - - * nnoo.el (nnoo-set): New function. - -2000-11-04 ShengHuo Zhu - - * gpg.el, gpg-ring.el: Moved to contrib directory. - -2000-11-04 Simon Josefsson - - * nnimap.el (nnimap-split-inbox): Typo. - -2000-11-03 10:46:44 ShengHuo ZHU - - * gnus-msg.el (gnus-msg-mail): Move it backwards. - -2000-11-03 Simon Josefsson - - * rfc2231.el (rfc2231-parse-qp-string): New function. - (require): rfc2047. - - * mail-parse.el (mail-header-parse-content-type): - (mail-header-parse-content-disposition): Support invalid QP - encoded strings, by using `rfc2231-parse-qp-string'. - -2000-11-03 08:58:08 ShengHuo ZHU - - * rfc2231.el (rfc2231-parse-string): Decode when there is no number. - (rfc2231-decode-encoded-string): Typo "> X 1". - (rfc2231-encode-string): Insert the name of charset. - * mail-parse.el (mail-header-encode-parameter): Use RFC2231. - -2000-11-02 23:35:50 ShengHuo ZHU - - * mm-decode.el (mm-save-part): Return the filename. - * gnus-sum.el (gnus-summary-edit-article): Remove a hack. - * gnus-art.el (gnus-mime-save-part-and-strip): New function. - (gnus-mime-action-alist): Use it. - (gnus-mime-button-commands): USe it. - * mm-extern.el (mm-extern-local-file): Error when the file is gone. - (mm-inline-external-body): unwind-protect. - -2000-11-02 21:08:49 ShengHuo ZHU - - * gnus-art.el (gnus-insert-mime-button): Show url. - -2000-11-02 19:51:19 ShengHuo ZHU - - * mml.el (mml-generate-mime-1): Support external url. - * nnwarchive.el (nnwarchive-mail-archive-article): Use external url. - -2000-11-02 16:53:32 ShengHuo ZHU - - * mm-partial.el (mm-inline-partial): Buffer name with a leading space. - * mm-decode.el (mm-display-external): Ditto. - * mm-extern.el: New file. - * mm-decode.el (mm-inline-media-tests): Hook it up. - (mm-inlined-types): Inline message/external-body. - -2000-11-02 Simon Josefsson - - * gnus-art.el (gnus-visible-headers): Add Mail-Followup-To. - - * message.el (message-get-reply-headers): Better handling when - Mail-Followup-To is very large. - -2000-11-02 13:27:56 ShengHuo ZHU - - * gnus-uu.el (gnus-uu-post-news): Comment out the redundancy. - * gnus-art.el (gnus-article-edit-done): - * gnus-sum.el (gnus-summary-edit-article-done): Move line - counting code here. - * gnus-msg.el (gnus-setup-message): Remove a hack. - -2000-11-02 09:33:01 ShengHuo ZHU - - * gnus-sum.el (gnus-newsgroup-variables): New variable. - (gnus-summary-mode): Make them local variables. - (gnus-set-global-variables): Globalize them. - (gnus-summary-exit): Kill them. - -2000-11-02 Hrvoje Niksic - - * rfc2047.el (rfc2047-encoded-word-regexp): Allow empty encoded - word. - -2000-11-01 10:07:13 ShengHuo ZHU - - * gnus-art.el (gnus-mime-display-part): Add to signed or encrypted. - gnus-article-wash-types. - * gnus-art.el (gnus-article-wash-status): Use them. - -2000-11-01 08:54:11 ShengHuo ZHU - - * mml.el (mml-read-tag): Remove spaces and LF. - -2000-11-01 08:01:03 ShengHuo ZHU - - * mml2015.el (mml2015-mailcrypt-encrypt): Use from and sign parameters. - * mml.el (mml-generate-mime-1): Add sender and recipients attributes. - -2000-11-01 07:39:24 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-force-verify-and-decrypt): New function. - -2000-10-31 22:06:13 ShengHuo ZHU - - * gnus-sum.el (gnus-article-charset): New variable. - (gnus-summary-display-article): Set it. - * gnus-msg.el (gnus-copy-article-buffer): Use it. - * gnus-art.el (gnus-article-mode): Make it local variable. - -2000-11-01 01:12:29 Lars Magne Ingebrigtsen - - * nnultimate.el (nnultimate-create-mapping): Use nreverse. - -2000-10-31 23:45:31 Lars Magne Ingebrigtsen - - * nnwfm.el: New file. - - * nnweb.el (nnweb-replace-in-string): New function. - -2000-10-31 17:32:02 ShengHuo ZHU - - * mml2015.el: Wrap gpg.el. - * gpg.el (gpg-verify): The last argument of apply is a list. - (gpg-encrypt): Add passphrase as a parameter. - -2000-10-31 17:28:45 ShengHuo ZHU - - * gpg.el: New file. - * gpg-ring.el: New file. - -2000-10-31 11:44:29 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-show-article): Fix the summary line. - -2000-10-31 Katsumi Yamaoka - - * gnus-sum.el (gnus-summary-insert-line): Work with quoted - double-quote characters. - (gnus-summary-prepare-threads): Ditto. - -2000-10-31 08:36:03 ShengHuo ZHU - - * gnus-art.el (gnus-mime-display-single): Forward line -1. - * mml.el (mml-read-tag): Don't skip the leading space. - * lpath.el (font-lock-set-defaults): Shut up. - -2000-10-31 00:04:35 ShengHuo ZHU - - * mml2015.el: Fix doc. Remove bogus mml2015-setup. - -2000-10-30 23:37:07 ShengHuo ZHU - - * qp.el (quoted-printable-encode-region): Replace leading - when - ultra safe. - * mml.el (mml-generate-mime-postprocess-function): Removed. - (mml-postprocess-alist): Removed. - (mml-generate-mime-1): Use ultra-safe when sign. - * mml2015.el (mml2015-fix-micalg): Uppercase. - (mml2015-verify): Insert LF. - (mml2015-mailcrypt-sign): Downcase; search backward. - -2000-10-16 11:36:52 Lars Magne Ingebrigtsen - - * nnultimate.el (nnultimate-forum-table-p): Be a bit more - restrictive. - (nnultimate-table-regexp): New variable. - (nnultimate-forum-table-p): Use it. - -2000-10-30 Ed L Cashin - - * gnus-sum.el (gnus-summary-expire-articles): Save point. - -2000-10-30 08:52:50 ShengHuo ZHU - - * mml-sec.el (mml-pgpmime-sign-buffer): Use mml2015-sign. - (mml-pgpmime-encrypt-buffer): Use mml2015-encrypt. - -2000-10-30 08:38:12 ShengHuo ZHU - - * mml2015.el: Shut up. - -2000-10-30 08:17:46 ShengHuo ZHU - - * gnus.el (gnus-server-browse-hashtb): Removed. - * gnus-group.el (gnus-group-prepare-flat-list-dead): Use gnus-active. - (gnus-group-insert-group-line-info): Use simplified method. - * gnus-srvr.el (gnus-browse-foreign-server): Use gnus-set-active. - -2000-10-30 01:52:40 ShengHuo ZHU - - * gnus-util.el (gnus-union): Renamed from gnus-agent-union, and - moved here. - * gnus-agent.el (gnus-agent-fetch-headers): Use it. - * gnus-group.el (gnus-group-prepare-flat): Use it. - * gnus-topic.el (gnus-group-prepare-topics): Use it. - -2000-10-30 01:23:49 ShengHuo ZHU - - * mml.el (mml-mode): Show menu in XEmacs. - -2000-10-30 00:49:33 ShengHuo ZHU - - * gnus-srvr.el (gnus-server-browse-in-group-buffer): New variable. - (gnus-server-read-server-in-server-buffer): New function. - (gnus-browse-foreign-server): Browse in group buffer. - * gnus-group.el (gnus-group-prepare-flat): List group not in list. - (gnus-group-prepare-flat-list-dead): Use gnus-group-insert-group-line. - * gnus-topic.el (gnus-group-prepare-topics): Ditto. - * gnus.el (gnus-server-browse-hashtb): New variable. - -2000-10-29 22:31:40 ShengHuo ZHU - - * nnfolder.el (nnfolder-open-nov): Use group. - -2000-10-29 17:23:15 ShengHuo ZHU - - * nnfolder.el: Add NOV. Set version to 2.0. - (nnfolder-nov-is-evil): If non-nil, nnfolder acts like 1.0. - -2000-10-29 10:35:08 ShengHuo ZHU - - * mml2015.el (mml2015-mailcrypt-sign): Use mc-sign-generic. - -2000-10-29 09:42:05 ShengHuo ZHU - - * gnus-srvr.el (gnus-browse-foreign-server): Show level mark. - (gnus-browse-unsubscribe-group): Unsubscribed is not killed. - -2000-10-29 08:28:58 ShengHuo ZHU - - * nnfolder.el (nnfolder-read-folder): Don't goto point-min. - -2000-10-28 19:11:01 ShengHuo ZHU - - * mm-decode.el (mm-verify-function-alist): New variable. - (mm-verify-option): New variable. - (mm-decrypt-function-alist): Ditto. - (mm-decrypt-option): Ditto. - (mm-find-raw-part-by-type): New function. - (mm-possibly-verify-or-decrypt): New function. - (mm-dissect-multipart): Use it. - * mml2015.el (mml2015-fix-micalg): New function. - (mml2015-decrypt): Use new interface. - (mml2015-verify): Use new interface. - (mml2015-setup): Make it bogus. - -2000-10-28 16:54:45 ShengHuo ZHU - - * mml.el (mml-generate-mime-postprocess-function): Set to - mml-postprocess. - (autoload): Autoload mml2015 and mml-smime. - (mml-postprocess-alist): Use mml2015-sign and mml2015-encrypt. - * mml2015.el (mml2015-encrypt): New function. - (mml2015-sign): New function. - (mml2015-encrypt-function): New variable. - (mml2015-sign-function): New variable. - (mml2015-mailcrypt-encrypt): Use message-recipients. - (mml2015-setup): Don't set mml-generate-mime-postprocess-function. - * mml-smime.el (mml-smime-setup): Ditto. - -2000-10-28 Simon Josefsson - - * imap.el (imap-parse-resp-text-code): Workaround bug in Stalker - Communigate Pro 3.3.1 server. - - * mml-sec.el (mml-smime-encrypt-buffer): Support certfiles stored - in buffers. - (mml-secure-dns-server): Removed. - (mml-secure-part-smime-encrypt-by-dns): Use DIG interface. Don't - write certificates to files. - - * smime.el (smime-dns-server): New variable. - (smime-mail-to-domain): - (smime-cert-by-dns): New functions. - - * dig.el: New file. - -2000-10-28 10:09:41 ShengHuo ZHU - - * message.el (message-options): New variable. - (message-options-set-recipient): New function. - (message-send): Use them. - * gnus-int.el (gnus-request-replace-article): Use them. - (gnus-request-accept-article): Ditto. - * mml.el (mml-preview): Use them. - * gnus-sum.el (gnus-summary-edit-article): Use them. - - * message.el (message-options-get): New function. - (message-options-get): New function. - * rfc2047.el (rfc2047-encode-message-header): Use them. - * mm-bodies.el (mm-encode-body): Use them. - -2000-10-28 Simon Josefsson - - * nnimap.el (nnimap-retrieve-which-headers): - (nnimap-request-article-part): Quote message-id. - - * smime.el (smime-CA-directory): Rename from `smime-CAs'. - (smime-CA-file): New variable. - (smime-call-openssl-region): Don't error. - (smime-sign-region): Return result value. - (smime-encrypt-region): Ditto. - (smime-verify-region): New function. - (smime-decrypt-region): Ditto. - (smime-verify-buffer): Ditto. - (smime-decrypt-buffer): Ditto. - - * mml.el: Require mml-sec. - (mml-generate-mime-1): Support "sign" and "encrypt" MML tags. - (mml-mode-map): Add "sign" and "encrypt" maps. - (mml-menu): Add security menu. - (mml-preview): Use generate-new-buffer. - - * mml-sec.el: New file. - -2000-10-28 03:43:03 ShengHuo ZHU - - * mm-decode.el (mm-find-part-by-type): Move it here. - * mml.el (mml-postprocess): Move it here. - (mml-postprocess-alist): Move it here. Merge them. - -2000-10-28 03:38:39 ShengHuo ZHU - - * rfc2047.el (rfc2047-encode-message-header): Make sure no - unencoded stuff in the header. - -2000-10-28 02:40:46 ShengHuo ZHU - - * gnus-group.el (gnus-group-listed-groups): New variable. - (gnus-group-list-option): New variable. - (gnus-group-list-limit-map): New keymap. - (gnus-group-list-flush-map): New keymap. - (gnus-group-list-plus-map): New keymap. - (gnus-group-prepare-logic): New function. - (gnus-group-prepare-flat): Merge with - gnus-group-prepare-flat-predicate. Use gnus-group-listed-groups. - (gnus-group-prepare-flat-list-dead): Ditto. - (gnus-group-list-matching): Use gnus-group-prepare-function. - (gnus-group-list-dormant): Ditto. - (gnus-group-list-cached): Ditto. - (gnus-group-listed-groups): New function. - (gnus-group-list-limit): New function. - (gnus-group-list-flush): New function. - (gnus-group-list-plus): New function. - * gnus-topic.el (gnus-group-prepare-topics): Accept predicate. - (gnus-topic-prepare-topic): Ditto. - -2000-10-27 Paul Jarc - - * message.el (message-insert-to, message-get-reply-headers): - (message-reply, message-followup): Mail-{Followup,Reply}-To. - -2000-10-27 19:45:58 ShengHuo ZHU - - * mml2015.el: New file. - * smime.el: New file. - * mml-smime.el: New file. - -2000-10-27 19:42:12 ShengHuo ZHU - - * ChangeLog: Moved to ChangeLog.1. - -;; Local Variables: -;; coding: iso-2022-7bit -;; End: diff --git a/lisp/ChangeLog.1 b/lisp/ChangeLog.1 deleted file mode 100644 index 3cfb883..0000000 --- a/lisp/ChangeLog.1 +++ /dev/null @@ -1,10100 +0,0 @@ -2000-10-27 Jason Rumney - - * gnus-art.el (gnus-signature-face): Use italic on any frame that - supports it. - -2000-10-27 14:19:53 ShengHuo ZHU - - * gnus-mlspl.el: Require cl when compiling. - * messagexmas.el: Ditto. - * mm-util.el: Ditto. - * rfc2047.el: Ditto. - * rfc2231.el: Ditto. - * smiley-ems.el: Ditto. - * uudecode.el: Ditto. - - * smiley-ems.el (smiley-region): Use mapcar. - -2000-10-27 Stefan Monnier - - * ietf-drums.el: Require cl when compiling. - -2000-10-27 Dave Love - - * mm-decode.el (mm-valid-and-fit-image-p): Don't test - window-system here. - - * gnus-art.el (gnus-article-x-face-command): Check - gnus-article-compface-xbm. - (gnus-treat-display-xface): Check for uncompface. - - * nnheader.el (nnheader-translate-file-chars): Only kludge things - under Doze with XEmacs. - -2000-10-26 Simon Josefsson - - * mail-source.el (mail-sources): IMAP predicate is a string. - (mail-sources): Add default values for IMAP mailbox, predicate and - fetchflag. - -2000-10-26 Dave Love - - * flow-fill.el: Require cl when compiling. - - * mail-source.el: Require imap when compiling and defvar - display-time-mail-function. Require mm-util. - (nnheader-cancel-timer): Autoload. - (mail-source-imap-authenticators, mail-source-imap-streams): New - variables. - (mail-sources): Use them. - -2000-10-25 20:13:02 ShengHuo ZHU - - * mm-decode.el (mm-viewer-completion-map): New. - (mm-interactively-view-part): Use it. - -2000-10-25 18:51:12 ShengHuo ZHU - - * rfc2047.el (rfc2047-q-encode-region): Don't break if a QP-word - could be fitted in one line. - -2000-10-25 Dirk Meyer - - * gnus-demon.el (gnus-demon-time-to-step): theHour was set to - seconds instead of hour. - -2000-10-25 Per Abrahamsen - - * mail-source.el (mail-sources): Better `:type'. - -2000-10-24 18:31:29 ShengHuo ZHU - - * gnus-art.el (gnus-request-article-this-buffer): - gnus-refer-article-method might be a single method. - * gnus-sum.el (gnus-refer-article-methods): The second could be - a named method. - -2000-10-23 Simon Josefsson - - * flow-fill.el (fill-flowed): Don't flow "-- " lines. - (fill-flowed): Make "quote-depth wins" rule work when first line - is at level 0. - -2000-10-21 11:23:21 ShengHuo ZHU - - * mm-util.el (mm-multibyte-p): Test (featurep 'xemacs). - -2000-10-21 10:54:57 ShengHuo ZHU - - * gnus-art.el (gnus-article-mime-total-parts): New function. - (gnus-mm-display-part): Use it. - (gnus-mime-display-single): Ditto. - (gnus-mime-display-alternative): Ditto. - -2000-10-21 09:38:27 ShengHuo ZHU - - * mailcap.el (mailcap-parse-mailcaps): Don't use parse-colon-path, - because they are files, not directories. - (mailcap-parse-mimetypes): Ditto. - -2000-10-20 19:55:59 ShengHuo ZHU - - * gnus-art.el (gnus-mime-inline-part): Check validity of charset. - -2000-10-18 Dave Love - - * mail-source.el (mm-util): Require. - (defvar): Use rmail-spool-directory unconditionally. - - * gnus-nocem.el (gnus-nocem-issuers): Update. - (gnus-nocem-check-from): New option. - (gnus-nocem-scan-groups): Use it. - (gnus-nocem-check-article): Bind gnus-newsgroup-name. - -2000-10-18 Miles Bader - - * gnus-nocem.el (gnus-nocem-check-article-limit): New variable. - (gnus-nocem-scan-groups): Obey `gnus-nocem-check-article-limit'. - -2000-10-18 Simon Josefsson - - * nnheader.el (nnheader-parse-head): Try both "from:" and "from: ". - - * gnus-sum.el (gnus-get-newsgroup-headers): Ditto. - -2000-10-17 Simon Josefsson - - * gnus-sum.el (gnus-get-newsgroup-headers): Search for "from:" - instead of "from: " for rfc822 compliance. - - * gnus-uu.el (gnus-uu-digest-mail-forward): Ditto. Insert SPC. - - * nnheader.el (nnheader-parse-head): Ditto. - -2000-10-13 Kai Gro,A_(Bjohann - - * mail-source.el (mail-source-keyword-map): Use - `rmail-spool-directory' as a default directory for the `file' - source, if the variable is defined. Fall back to hardcoded - "/usr/spool/mail/", as before. Suggestion by Steven E. Harris - . - -2000-10-13 12:01:15 ShengHuo ZHU - - * message.el (message-send-mail-partially): Replace the header - delimiter with a blank line. - -2000-10-13 Kai Gro,A_(Bjohann - - * gnus-sum.el (gnus-get-split-value): Use first match only (Ed L - Cashin ). - -2000-10-13 10:52:00 ShengHuo ZHU - - * gnus-ems.el (gnus-article-compface-xbm): Ignore errors. - -2000-10-11 John Wiegley - - * gnus-topic.el (gnus-topic-mode): Use `setq' to clear - `gnus-group-change-level-function', instead of `remove-hook', - because it's not a hook! - - * gnus-mlspl.el (gnus-group-split-update): Check the value of - `nnmail-crosspost', and use it to set the `no-crosspost' - argument when calling `gnus-group-split-fancy'. Otherwise, it - assumes that cross-posting is always OK, no matter what - `nmail-crosspost' is set to. - (gnus-group-split-fancy): The argument order in the - second-to-last `push' call was wrong, but since `no-crosspost' - was always nil, it was never being triggered. - - * gnus-art.el (gnus-treat-hide-citation-maybe): Added this - variable to correspond with `gnus-article-hide-citation-maybe'. - (gnus-treatment-function-alist): Added entry for the above - correlation. - -2000-10-12 08:26:30 ShengHuo ZHU - - * mm-util.el (mm-with-unibyte-current-buffer): Revert to old. - (mm-with-unibyte-current-buffer-mule4): New function. - * qp.el (quoted-printable-encode-region): Use it. - * rfc2047.el (rfc2047-decode): Ditto. - * webmail.el (webmail-init): Revert to use mm-disable-multibyte. - -2000-10-10 08:44:13 ShengHuo ZHU - - * rfc2047.el (rfc2047-fold-region): "=?=" is not a break point. - -2000-10-10 00:00:28 ShengHuo ZHU - - * webmail.el (webmail-init): Use mm-disable-multibyte-mule4. - -2000-10-09 22:50:05 ShengHuo ZHU - - * base64.el (base64-decode-region): Just give a message if the end - is not sane. - -2000-10-09 20:09:11 ShengHuo ZHU - - * rfc2047.el (rfc2047-encode-message-header): Move fold into - encode-region. - (rfc2047-dissect-region): Rewrite. - (rfc2047-encode-region): Rewrite. - (rfc2047-fold-region): Fold any line longer than 76. - (rfc2047-unfold-region): New function. - (rfc2047-decode-region): Use it. - (rfc2047-q-encode-region): Don't break at bob. - -2000-10-09 17:12:00 ShengHuo ZHU - - * nntp.el (nntp-open-connection): Kill process buffer when quit. - (nntp-connection-timeout): Add a note. SIGALRM is ignored in both - FSF Emacs 20 and XEmacs 21. - * gnus-agent.el (gnus-agent-fetch-session): Catch quit. - -2000-10-09 Dave Love - - * gnus-audio.el: Don't require cl. - (gnus-audio): New custom group. - (gnus-audio-inline-sound): Change to work with Emacs. - (gnus-audio-directory, gnus-audio-directory) - (gnus-audio-au-player): Customize. - (gnus-audio-play): Try external player if play-sound-file fails. - Use file-name-extension, not string-match. - - * gnus-art.el (article-de-quoted-unreadable) - (article-de-base64-unreadable): Fold search case rather than - downcasing string. Apply mm-charset-to-coding-system to arg of - quoted-printable-decode-region. - (gnus-article-dumbquotes-map): Fix dashes. - (gnus-button-mailto, gnus-button-embedded-url): Doc fix. - (gnus-button-reply): Just alias it. - -2000-10-09 Stefan Monnier - - * mm-encode.el: Require CL. At least, for `incf'. - - * nnfolder.el (nnfolder-ignore-active-file): Typos. - - * gnus-mh.el (gnus-summary-save-in-folder): Obey mh-lib-progs. - - * gnus-kill.el (gnus-kill): Typo. - -2000-10-09 Gerd Moellmann - - * smiley-ems.el (smiley-update-cache): Use `:ascent center'. - -2000-10-09 Simon Josefsson - - * nnimap.el (nnimap-group-overview-filename): Create directory for - newfile (when use long filenames is nil). Copy+delete file if - rename didn't work. - (nnimap-group-overview-filename): `rename-file' and `copy-file' - doesn't return anything useful, use ignore-errors instead. - -2000-10-08 13:05:11 ShengHuo ZHU - - * dgnushack.el (dgnushack-compile): Delete old elc files first. - -2000-10-08 10:59:13 ShengHuo ZHU - - * gnus-ems.el (gnus-kill-all-overlays): Move here. - * gnus-util.el (gnus-kill-all-overlays): Move out. - * gnus-sum.el (gnus-cache-write-active): Auto load. - * lpath.el: Shut up. - * nnweb.el (nnweb-url-retrieve-asynch): url-retrieve is - asynchronous in Exp version. - -2000-10-08 08:57:13 ShengHuo ZHU - - * gnus-art.el, gnus-ems.el, gnus-start.el: Remove gnus-xemacs. - * gnus-ems.el: Autoload smiley. - * gnus-art.el (gnus-treat-display-smileys): Default value in Emacs 21. - -2000-10-08 08:45:48 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-display-article): Enable multibyte. - (gnus-summary-select-article): Don't enable multibyte here. - (gnus-summary-goto-article): Ditto. - -2000-10-08 Christoph Conrad - - * gnus-draft.el (gnus-draft-send-message): Typo. - -2000-10-08 Simon Josefsson - - * nnimap.el (nnimap-verify-uidvalidity): Delete overview file when - uid validity changes. - (nnimap-group-overview-filename): Store uidvalidity in filenames. - Rename old files into new format. - -2000-10-07 15:49:39 ShengHuo ZHU - - * mm-util.el (mm-enable-multibyte-mule4): New. - (mm-disable-multibyte-mule4): New. - * gnus-sum.el (gnus-summary-mode): Use it. - (gnus-summary-select-article): Ditto. - (gnus-summary-goto-article): Use enable multibyte. - * rfc2047.el (rfc2047-decode): Use unibyte. - -2000-10-07 15:42:59 ShengHuo ZHU - - * gnus-logic.el (gnus-advanced-string): Use "" if nil. - -2000-10-07 10:31:05 ShengHuo ZHU - - * rfc2047.el (rfc2047-q-encode-region): Better calculation of - break point. - (rfc2047-fold-region): Don't break the first non-LWSP characters. - -2000-10-07 09:18:53 ShengHuo ZHU - - * gnus.el (gnus-agent-fetching): New variable. - * gnus-agent.el (gnus-agent-with-fetch): Bind it. - * gnus-score.el (gnus-score-body): Don't score body when - agent-fetching. - (gnus-score-followup): Don't score followup either. - -2000-10-07 08:19:17 ShengHuo ZHU - - * gnus-art.el: Define dynamic variables in eval-when-compile. - * message.el (message-sending-message): New variable. - (message-send): Use it. - * gnus-draft.el (gnus-draft-send-message): Ditto. - (gnus-group-send-drafts): Ditto. - -2000-10-06 Dave Love - - * gnus-audio.el: Don't require cl. - (gnus-audio): New custom group. - (gnus-audio-inline-sound): Change to work with Emacs. - (gnus-audio-directory, gnus-audio-directory) - (gnus-audio-au-player): Customize. - (gnus-audio-play): Try external player if play-sound-file fails. - Use file-name-extension, not string-match. - -2000-10-06 17:38:03 ShengHuo ZHU - - * gnus-art.el (gnus-article-prepare): Configure it again. - -2000-10-06 15:11:07 ShengHuo ZHU - - * message.el (message-default-charset): Default value for non-Mule - Emacsen. - -2000-10-06 14:28:50 ShengHuo ZHU - - * message.el (message-alternative-emails): New. - (message-use-alternative-email-as-from): New. - (message-setup): Use them. - -2000-10-06 13:46:47 ShengHuo ZHU - - * base64.el, dgnushack.el, gnus-spec.el, messagexmas.el - * gnus-xmas.el, nnheaderxm.el, nndraft.el: Use defalias. - - * gnus-xmas.el (gnus-xmas-define): Defalias gnus-overlay-buffer, - gnus-overlay-start. - * gnus.el: Ditto. - * gnus-art.el (gnus-insert-mime-button): Use them. - -2000-10-06 10:01:08 ShengHuo ZHU - - * mm-util.el (mm-with-unibyte-current-buffer): Don't set unibyte - if eight-bit-control is a charset, e.g. Mule 5.0 in Emacs 21. - -2000-10-06 09:38:54 ShengHuo ZHU - - * qp.el (quoted-printable-encode-region): Use - mm-with-unibyte-current-buffer within narrowed region. - -2000-10-06 08:56:33 ShengHuo ZHU - - * webmail.el (webmail-type-definition): Fix my-deja open url. - -2000-10-06 Emerick Rogul - - * message.el (message-setup-fill-variables): New variable. - (message-mode): Use it. - -2000-10-05 Dave Love - - * rfc2047.el (rfc2047-fold-region): Use gnus-point-at-bol. - (rfc2047-charset-encoding-alist): Add iso-8859-1[45]. - - * binhex.el: Use defalias, not fset. - - * rfc1843.el: Require cl when compiling. - -2000-10-05 12:25:08 ShengHuo ZHU - - * gnus-agent.el (gnus-agent-fetch-group-1): Score-param could be nil. - -2000-10-05 11:43:25 ShengHuo ZHU - - * rfc2047.el (rfc2047-encode-region): Merge only if regions are - adjacent. - -2000-10-05 09:41:33 ShengHuo ZHU - - * mm-util.el (mm-multibyte-p): In XEmacs, it is (feature 'mule). - (mm-find-charset-region): Merge conditions, delete ascii. - (mm-charset-after): Rewrite. - * mm-bodies.el (mm-encode-body): Use it. - -2000-10-05 09:04:32 ShengHuo ZHU - - * webmail.el (webmail-hotmail-list): Fix. - -2000-10-05 Stefan Monnier - - * nnimap.el (require): cl. - -2000-10-04 15:24:46 ShengHuo ZHU - - * gnus-art.el (gnus-article-prepare): Configure windows before - gnus-article-prepare-display is called. Otherwise, BBDB's popup - window might be overrided. - -2000-10-04 Dave Love - - * gnus-ems.el (gnus-article-display-xface) - [gnus-article-compface-xbm]: Fix. - (gnus-x-splash): Bind width, height. - -2000-10-04 11:45:04 ShengHuo ZHU - - * gnus-art.el (gnus-mime-inline-part): Use prefix argument only - when it is called interactively. - -2000-10-03 21:20:31 ShengHuo ZHU - - * gnus-art.el (gnus-mime-action-alist): New variable. - (gnus-mime-action-on-part): Use it. - (gnus-mime-button-commands): Add command ".". - -2000-10-03 20:37:42 ShengHuo ZHU - - * gnus-art.el (gnus-mime-inline-part): Support prefix argument. - -2000-10-03 Katsumi Yamaoka - - * lpath.el: "." is in the load-path because dgnushack.el. - -2000-10-03 Bjorn Torkelsson - - * uudecode.el: xemacs cleanup (use featurep ' xemacs) - - * nnheader.el: ditto - - * mm-util.el: ditto - - * message.el: ditto - - * binhex.el: ditto - - * gnus-audio.el: removed unnecessary xemacs test - - * earcon.el: ditto - -2000-10-03 19:55:55 Lars Magne Ingebrigtsen - - * nnweb.el (nnweb-decode-entities): Work for non-character - entities. - -2000-09-26 09:20:08 Lars Magne Ingebrigtsen - - * gnus.el: Message the quit parts. - -2000-10-03 08:08:29 ShengHuo ZHU - - * mail-source.el (mail-source-fetch-maildir): Don't insert - newlines. - -2000-10-02 20:14:27 ShengHuo ZHU - - * dgnushack.el (dgnushack-compile): Don't compile dgnushack.el, - lpath.el. Don't compile base64.el if there is builtin base64. - -2000-10-02 Bj,Av(Brn Torkelsson - - * base64.el (Repository): Use featurep for XEmacs test. - -2000-10-02 17:38:12 ShengHuo ZHU - - * nntp.el (nntp-retrieve-data): Don't ignore quit. - -2000-10-02 14:43:13 ShengHuo ZHU - - * gnus-art.el (gnus-article-banner-alist): New variable. - (article-strip-banner): Use it. - * gnus-cus.el (gnus-group-parameters): Allow symbol. - -2000-10-02 Dave Love - - * smiley-ems.el: New file. - - * gnus-ems.el (gnus-smiley-display): Autoload. - (mouse-set-point, set-face-foreground, set-face-background) - (x-popup-menu): Don't clobber these. - (gnus-article-compface-xbm): New variable. - (gnus-article-display-xface): Move graphic test. Use unibyte. - Obey gnus-article-compface-xbm. Use pbm, not xbm. - - * mml.el (require): Fix typo. - (mml-parse-1): Modify unknown encoding prompt. - - * mail-source.el (mail-sources): Revert to nil. - - * nnmail.el (nnmail-spool-file): Revert previous change. - - * gnus.el: Don't require custom, message. - (gnus-message-archive-method): Wrap initializer in progn and - require message here. - -2000-10-02 Gerd Moellmann - - * gnus.el (gnus-mode-line-buffer-identification) [Emacs]: Change - image's :ascent to 80. That gives a mode-line which is approx. - as tall as the normal one. - -2000-10-02 08:04:48 ShengHuo ZHU - - * webmail.el (webmail-hotmail-list): Fix. - -2000-10-01 20:55:53 ShengHuo ZHU - - Don't postpone GCC if none of GCC methods is agent-covered. This - fix presumes that the post-method must be agent-covered if any Gcc - method is agent-covered. - - * gnus-msg.el (gnus-inews-group-method): New function. - (gnus-inews-do-gcc): Use it. - * gnus-agent.el (gnus-agent-any-covered-gcc): New function. - (gnus-agent-possibly-save-gcc): Use it. - (gnus-agent-possibly-do-gcc): Ditto. - -2000-10-01 17:08:50 ShengHuo ZHU - - * mailcap.el (mailcap-mime-types): Use mailcap-mime-data. - * mml.el (mml-minibuffer-read-type): Use mailcap-mime-types. - -2000-10-01 13:07:21 ShengHuo ZHU - - * webmail.el (webmail-netscape-open, webmail-hotmail-article, - webmail-hotmail-list): Update. - -2000-10-01 08:36:09 ShengHuo ZHU - - * mail-source.el (mail-source-report-new-mail): Use - nnheader-cancel-timer. - -2000-10-01 08:35:38 ShengHuo ZHU - - * lpath.el (overlay-*): Shut up. - * dgnushack.el: Two implementations of smiley. - -2000-10-01 08:32:42 ShengHuo ZHU - - * gnus-ml.el: Usage. - (gnus-mailing-list-archive, gnus-mailing-list-owner, - gnus-mailing-list-post, gnus-mailing-list-unsubscribe, - gnus-mailing-list-subscribe, gnus-mailing-list-help): Bind list-*. - (gnus-mailing-list-menu): Define it. - (turn-on-gnus-mailing-list-mode, gnus-mailing-list-mode): Autoload. - - * gnus-xmas.el (gnus-xmas-mailing-list-menu-add): Move here. - -2000-09-30 18:52:51 ShengHuo ZHU - - * webmail.el (webmail-my-deja-*): Rewrite. - -2000-09-30 Simon Josefsson - - * nnimap.el (nnimap-request-accept-article): Remove \n's from - From_ lines. - -2000-08-05 Simon Josefsson - - Make GCC to remote groups work when unplugged - (postpone GCC until message is actually sent). - - * gnus-draft.el (gnus-draft-send): Call `gnus-agent-restore-gcc'. - - * gnus-agent.el (gnus-agent-possibly-do-gcc): - (gnus-agent-restore-gcc): - (gnus-agent-possibly-save-gcc): New functions. - - * gnus-msg.el (gnus-inews-add-send-actions): Use - `gnus-agent-possibly-do-gcc' if Agentized. - (gnus-inews-add-send-actions): Add `gnus-agent-possibly-save-gcc' - to `message-header-hook'. - - * gnus.el (gnus-agent-gcc-header): New variable. - -2000-07-13 Simon Josefsson - - Asks the user to synch flags with server when you plug in. - - * gnus-agent.el (gnus-agent-synchronize-flags): New variable. - (gnus-agent-possibly-synchronize-flags-server): New function, use it. - (gnus-agent-toggle-plugged): Call it. - (gnus-agent-synchronize-flags): Renamed from `gnus-agent-synchronize'. - (gnus-agent-group-mode-map): `g-a-s' -> `g-a-s-flags'. - (gnus-agent-possibly-synchronize-flags): New function. - (gnus-agent-possibly-synchronize-flags-server): New function. - -2000-09-30 Simon Josefsson - - * starttls.el: New file, by Daiki Ueno. - -2000-08-02 Stanislav Shalunov - - * message.el (message-make-in-reply-to): In-Reply-To is message-id - (see DRUMS). - -2000-09-29 Simon Josefsson - - * nntp.el (nntp-async-trigger): Fix authinfo in asynchronous - prefetch. - -2000-08-09 10:21:20 Katsumi Yamaoka - - * nntp.el (nntp-open-telnet): Wait for the telnet prompt before - sending a command; allow the rtelnet prompt as well. - -2000-09-29 Simon Josefsson - - * message.el (message-send): Make sure error is signalled if no - send method is specified. - -2000-09-29 Florian Weimer - - * qp.el (quoted-printable-encode-region): Wrap with - `mm-with-unibyte-current-buffer'. - -2000-09-29 12:12:49 ShengHuo ZHU - - * gnus-agent.el (gnus-agent-fetch-group-1): Reimplement Mike - McEwan's proposal. - -2000-09-29 12:06:40 ShengHuo ZHU - - * gnus-agent.el: Revoke Mike McEwan's 1998-09-05 patch due to - the GNU assignment issue. - -2000-09-29 09:56:34 ShengHuo ZHU - - * nndoc.el (nndoc-dissect-mime-parts-sub): Correctly mark body-begin. - -2000-09-29 09:14:08 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-enter-digest-group): Decode to-address. - -2000-09-28 Kai Gro,A_(Bjohann - - * gnus-art.el (article-strip-banner): Use - gnus-group-find-parameter rather than gnus-group-get-parameter, to - allow inheritance on the banner. - From elkin@tverd.astro.spbu.ru. - -2000-09-26 Richard M. Alderson III - - * gnus-art.el (gnus-read-save-file-name): expand-file-name. - -2000-09-26 Dave Love - - * gnus-draft.el: Don't require gnus-agent. - - * mm-view.el: Use featurep for XEmacs test. - (mm-inline-message): Test for `remove-specifier'; don't use - condition-case. - -2000-09-24 Simon Josefsson - - * nnimap.el (nnimap-request-accept-article): Remove From[^:] lines. - - * gnus-group.el (gnus-group-nnimap-edit-acl): Check if server - support ACL's. - - * nnimap.el (nnimap-acl-get): Check capability. - - * mail-source.el (mail-source-imap-file-coding-system): New variable. - (mail-source-fetch-imap): Use it. - - * rfc2104.el (rfc2104-hexstring-to-bitstring): New function. - (rfc2104-hash): Use it. - - * imap.el (imap-starttls-p): Check for starttls binary. - (imap-starttls-open): More verbose. - (imap-gssapi-auth): Ditto. - (imap-kerberos4-auth): Ditto. - (imap-cram-md5-auth): Ditto. - (imap-login-auth): Ditto. - (imap-anonymous-auth): Ditto. - (imap-digest-md5-auth): Ditto. - (imap-open): Ditto. - (imap-digest-md5-p): Check capability first. - -2000-09-24 Simon Josefsson - - * imap.el (imap-parse-flag-list): Correctly parse empty lists. - (imap-login-p): Support LOGINDISABLED. - -2000-09-23 Simon Josefsson - - * rfc2104.el: Add SHA-1 example. - -2000-09-22 Simon Josefsson - - * imap.el (imap-parse-body): Work around bug in Sun SIMS. - -2000-09-21 21:54:48 ShengHuo ZHU - - * lpath.el: Bind nnkiboze-score-file. - -2000-09-21 16:15:25 ShengHuo ZHU - - * gnus-score.el (gnus-score-use-all-scores): New variable. - (gnus-all-score-files): Use it. - * nnkiboze.el (nnkiboze-generate-group): Use it. Inhibit list groups. - (nnkiboze-enter-nov): Fix it when there is no xref. - (nnkiboze-generate-groups): List groups. - * gnus-group.el (gnus-group-make-kiboze-group): Use - nnkiboze-score-file. - - * nnkiboze.el (nnkiboze-request-article): Use - gnus-cache-request-article. - * gnus-group.el (gnus-group-make-kiboze-group): Fix prompt. - -2000-07-16 Dmitry Bely - - * nnheader.el (nnheader-translate-file-chars): Path splitting on NT. - -2000-09-20 18:33:00 ShengHuo ZHU - - * gnus-score.el (gnus-score-find-bnews): Use directory-sep-char. - -2000-09-20 17:37:46 ShengHuo ZHU - - * message.el (message-default-charset): Set default value in - non-MULE XEmacsen as iso-8859-1. - -2000-09-20 12:02:24 ShengHuo ZHU - - * gnus-demon.el: Use (featurep 'xemacs). - * gnus-agent.el: timer vs. itimer. - * mail-source.el: Ditto. - -2000-09-19 10:24:57 ShengHuo ZHU - - * gnus-group.el (gnus-group-make-kiboze-group): Makedir. - * nnheader.el (nnheader-parse-nov): Remove Xref in mail-header-xref. - * gnus-sum.el (gnus-nov-parse-line): Ditto. - * nnkiboze.el (nnkiboze-file-coding-system): New. - (nnkiboze-retrieve-headers): Use it. - (nnkiboze-request-group): Ditto. - (nnkiboze-close-group): Ditto. - (nnkiboze-generate-group): Ditto. - (nnkiboze-enter-nov): Insert first Xref properly. - -2000-09-19 Dave Love - - * nnmail.el (nnmail-cache-accepted-message-ids): Default to nil. - (nnmail-get-new-mail): Test `sources' in top-level conditional. - - * mail-source.el (mail-sources): Change default to '((file)). - Add useful custom type. - -2000-09-18 Kai Gro,A_(Bjohann - - * gnus-util.el (gnus-time-iso8601): Correct doc string (four digit - year). - (gnus-date-iso8601): Ditto. - -2000-09-18 09:05:46 ShengHuo ZHU - - * mail-source.el (mail-source-fetch-imap): Disable multibyte. - -2000-09-17 01:13:46 ShengHuo ZHU - - * rfc2047.el (rfc2047-q-encoding-alist): Remove = and _ from the - pattern. Avoid using 8 bit chars. - * qp.el (quoted-printable-encode-region): Avoid using 8 bit chars. - -2000-09-16 15:57:42 ShengHuo ZHU - - * smiley.el (smiley-buffer-ems, smiley-create-glyph-ems, - smiley-toggle-extent-ems, smiley-toggle-extents-ems, - smiley-toggle-buffer-ems): New functions for Emacs 21. Toggle - functions are not implemented yet. - - * dgnushack.el (dgnushack-compile): Remove smiley.el and - x-overlay.el from the FSF Emacs black list. - -2000-09-15 21:10:20 ShengHuo ZHU - - * mm-decode.el (mm-inlined-types): Add application/emacs-lisp. - (mm-inline-media-tests): Ditto. - (mm-automatic-display): Ditto. - * mm-view.el (mm-display-inline-fontify): Generalize from - mm-display-patch-inline. - (mm-display-patch-inline): Use it. - (mm-display-elisp-inline): Ditto. - -2000-09-15 14:03:00 ShengHuo ZHU - - * gnus-topic.el (gnus-topic-find-groups): Add recursive parameter. - (gnus-topic-unmark-topic): Ditto. - (gnus-topic-mark-topic): Ditto. - (gnus-topic-get-new-news-this-topic): Use it. - -2000-09-15 09:01:40 ShengHuo ZHU - - * gnus-art.el (gnus-treat-display-xface): By default, Emacs 21 - display xface. - -2000-08-23 02:54:46 Katsumi Yamaoka - - * gnus-group.el (gnus-group-rename-group): Inhibit renaming of - zombie or killed groups. - -2000-09-15 00:09:56 ShengHuo ZHU - - * mml.el (mml-preview): Reinsert unibyte content. - (mml-parse-1): Remove with-unibyte-current-buffer. - (mml-generate-mime-1): Ditto. - * gnus-msg.el (gnus-summary-mail-forward): Ditto. - * message.el (message-forward): Ditto. - -2000-09-14 23:13:50 ShengHuo ZHU - - * gnus-art.el (article-de-quoted-unreadable): Guess charset from - original article buffer. - (article-de-base64-unreadable): Ditto. - (article-wash-html): Ditto. - -2000-09-14 18:55:30 ShengHuo ZHU - - * gnus-msg.el (gnus-summary-mail-forward): Disable multibyte - unless forward-show-mml. - -2000-09-14 14:48:57 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-save-parts-type-history): New. - (gnus-summary-save-parts-last-directory): New. - (gnus-summary-save-parts): Save history. - -2000-09-14 Ben Gertzfield - - * gnus-sum.el (gnus-summary-save-parts-default-mime): New - variable. - (gnus-summary-save-parts): Use it. - -2000-09-14 11:31:28 ShengHuo ZHU - - * gnus-art.el (gnus-article-setup-buffer): Clean handle-alist. - * gnus-sum.el (gnus-summary-exit): Ditto. - (gnus-summary-exit-no-update): Ditto. - (gnus-summary-show-article): Ditto. - -2000-09-14 08:42:48 ShengHuo ZHU - - * nndoc.el (nndoc-dissect-mime-parts-sub): Remove - Content-Disposition. - -2000-09-13 23:58:40 ShengHuo ZHU - - * webmail.el: Hotmail updated. Add X-Gnus-Webmail. - -2000-09-13 21:41:25 ShengHuo ZHU - - * gnus-art.el (gnus-article-setup-buffer): Set - gnus-article-mime-handles to nil. - * gnus-sum.el (gnus-summary-exit): Ditto. - (gnus-summary-exit-no-update): Ditto. - (gnus-summary-show-article): Ditto. - (gnus-summary-save-parts): Use gnus-article-mime-handles if - dissected. - * mm-partial.el (mm-partial-find-parts): Remove redundancy. - -2000-09-13 16:59:33 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-sort): Sort loose threads too. - (gnus-sort-threads-1): New function. Sort threads recursively. - (gnus-sort-threads): Use it. - (gnus-sort-gathered-threads): Doc fix. - -2000-09-13 Dave Love - - * gnus-salt.el (gnus-binary-mode): Fix call to gnus-add-minor-mode. - - * gnus-ems.el (gnus-ems-redefine): Don't alias - gnus-summary-set-display-table. - - * message.el (message-user-agent): Don't wrap ignore-errors around - it. - - * mm-encode.el (mm-insert-multipart-headers): Avoid redundant - `format'. - (mm-content-transfer-encoding): Don't use cadar. - - * uudecode.el (uudecode-decoder-program) - (uudecode-decoder-switches): Customize. - - * gnus-score.el (gnus-home-score-file): Improve custom type. - - * gnus-cus.el (gnus-custom-mode): Conditionally set local - variables for Emacs 21. - (gnus-group-customize): Disable undo while laying out the buffer. - -2000-09-13 09:38:26 ShengHuo ZHU - - * gnus-util.el (gnus-write-active-file): Bind - coding-system-for-write. - -2000-09-13 09:14:57 ShengHuo ZHU - - * nnmail.el (nnmail-get-new-mail): Don't test nnmail-spool-file. - - * gnus-cache.el (gnus-jog-cache): Temporarily disable mail-sources. - * gnus-kill.el (gnus-batch-score): Ditto. - * gnus-move.el (gnus-change-server): Ditto. - * nnkiboze.el (nnkiboze-generate-groups): Ditto. - -2000-09-12 Simon Josefsson - - * gnus-sum.el (gnus-update-read-articles): Undo - `gnus-request-set-mark' operation. - -2000-09-11 Dave Love - - * Changelog: Use iso-2022 coding. - - * gnus-msg.el (gnus-msg-mail): New function. - (gnus-user-agent): New mail agent. - -2000-09-10 Dave Love - - * message.el: Require mail-abbrevs for XEmacs for a problem with - keybinding despite the autoloads for it. - -2000-09-08 Simon Josefsson - - * imap.el (imap-kerberos4-open): Erase more (fixes race condition?). - - * nnimap.el (nnimap-request-update-info-internal): Remove tick - marks from dormant articles. (See nnimap-request-set-mark.) - (nnimap-retrieve-headers-progress): Demule. - (nnimap-open-server): Call nnoo-change-server twice, once for - getting the nnimap-server-buffer and once for letting n-c-s set - the variables in that buffer. - -2000-09-08 David Edmondson - - * gnus.el (gnus-short-group-name): Guess separator. - -2000-09-07 Tadashi Watanabe - - * smiley.el (smiley-buffer, smiley-create-glyph): Work with GTK - XEmacs as well. - -2000-09-06 Francis Litterio - - * gnus-group.el (gnus-group-insert-group-line): Fix. - -2000-09-04 Dave Love - - * mm-decode.el (mime-display) : Add `multimedia' group. - (mm-get-image): Avoid the losing `make-glyph' from W3. - -2000-09-03 Simon Josefsson - - * gnus-sum.el (gnus-summary-delete-article): Check server. - -2000-09-01 Simon Josefsson - - * imap.el (imap-parse-flag-list): Rewrite. - - * nnimap.el (nnimap-retrieve-headers-from-file): Ignore errors. - - * imap.el (imap-parse-flag-list): Hack. - -2000-08-29 Dave Love - - * gnus-mlspl.el (gnus-group-split-fancy): Eschew mapcon. - - * dgnushack.el (mapcon, union): Remove compiler macros. - - * gnus-agent.el (gnus-agent-union): new function. - (gnus-agent-fetch-headers): Use it. - - * gnus.el (gnus-group-startup-message): Specify foreground and - background for xpm image. Centre image vertically. - From Katsumi Yamaoka with mods. - -2000-08-24 23:49:23 ShengHuo ZHU - - * message.el (message-send-mail): Narrow-to-headers. - -2000-08-24 Dave Love - - * gnus-art.el (gnus-insert-mime-button): Fix help-echo for Emacs - 21. - -2000-08-23 Dave Love - - * dgnushack.el: Remove `member-if' compiler macro. - -2000-08-21 Dave Love - - * nnimap.el (nnimap-request-newgroups): Eschew member-if. - -2000-08-21 10:09:47 ShengHuo ZHU - - * gnus-topic.el (gnus-topic-hide-topic): Use find-topology if - permanent is used. - (gnus-topic-show-topic): Read topic when to show permanent hidden - topic. - (gnus-topic-remove-topic): Revert to the old behavior, not using - hide. - -2000-08-21 Dave Love - - * gnus-ems.el (gnus-add-minor-mode): Add &rest arg. - (gnus-xemacs): Use featurep. - - * mm-util.el (mm-read-charset): Maybe use builtin. - (mm-replace-chars-in-string): Maybe use subst-char-in-string. - (mm-multibyte-p, mm-with-unibyte-current-buffer) - (mm-with-unibyte): Use featurep, not string-match. - (mm-with-unibyte-buffer): Simplify. - (mm-quote-arg): Maybe use shell-quote-argument. - - * mml.el (mml-make-string): Deleted (unused). - - * gnus.el (gnus-mode-line-buffer-identification): Supply - definition for Emacs 21. - - * gnus-salt.el: Small doc fixes. - (gnus-pick-mode, gnus-binary-mode): Supply a toggle-func arg to - gnus-add-minor-mode. - - * gnus-topic.el (gnus-topic-mode): Supply a toggle-func arg to - gnus-add-minor-mode. - -2000-08-20 Simon Josefsson - - * nnimap.el (nnimap-before-find-minmax-bugworkaround): New - function, thanks to Lloyd Zusman for debugging. - (nnimap-request-group): - (nnimap-request-list): - (nnimap-retrieve-groups): - (nnimap-request-newgroups): Use it. - - * nnimap.el (nnimap-request-article-part): Less verbose. - -2000-08-19 Andreas Jaeger - - * lpath.el ((string-match "XEmacs" emacs-version)): Remove - subst-char-in-string since we test elsewhere whether it's bound. - -2000-08-18 Dave Love - - * gnus-score.el (gnus-score-find-score-files-function): Fix doc, - custom type. - - * gnus-xmas.el (gnus-group-icon-create-glyph): Don't test - gnus-group-running-xemacs. - - * nnheader.el (nnheader-replace-chars-in-string): Use - subst-char-in-string if available. - - * gnus-art.el (gnus-read-save-file-name, gnus-plain-save-name) - (gnus-request-article-this-buffer): Use expand-file-name. - (gnus-mime-view-part-as-type): Simplify interactive spec. - (gnus-mime-button-map): Define it all in defvar. - -2000-08-17 Dave Love - - * gnus-group.el (gnus-group-running-xemacs): Deleted. - - * gnus-demon.el (gnus-demon): Bind use-dialog-box and - last-nonmenu-event. - - * uudecode.el (char-int): Use defalias, not fset. - - * score-mode.el: Don't require easymenu. Require mm-util. - (score-mode-coding-system): Use mm-auto-save-coding-system. - - * nneething.el (nneething-create-mapping): Don't use cadar & al. - (nneething-file-name): Use expand-file-name, not concat. - -2000-08-16 13:05:46 ShengHuo ZHU - - * nnslashdot.el (nnslashdot-threaded-retrieve-headers): - Failure proof for email addresses. - (nnslashdot-sane-retrieve-headers): Ditto. - -2000-08-14 20:08:40 Lars Magne Ingebrigtsen - - * message.el (message-send-mail): Only insert courtesy message - when text/plain. - -2000-08-14 19:55:04 Jesper Harder - - * message.el (message-cancel-news): Copy the From header from the - original article. - -2000-08-14 19:52:01 Lars Magne Ingebrigtsen - - * gnus-async.el (gnus-asynchronous): Removed. - -2000-08-14 16:12:11 ShengHuo ZHU - - * mail-source.el (mail-source-fetch-maildir): Use MMDF mail - format. - -2000-08-14 19:12:22 Rod Whitby - - * nnmail.el (nnmail-expiry-target-group): Fixed. - -2000-08-14 Rod Whitby - - * nnmail.el (nnmail-expiry-target-group): Fix the call to - gnus-request-accept-article so that body encoding is *not* done. - Encoding is not done on incoming mail, so why should it be done on - expired mail? - - -2000-08-14 Rod Whitby - - * nnml.el (nnml-request-expire-articles): Fix the calls to - nnml-request-article (the filename was being passed instead of the - article number) and nnmail-expiry-target-group - (nnml-current-directory is changed by nnml-request-accept-article, - causing it to be incorrect for the next article to be expired). - -2000-08-14 Rod Whitby - - * gnus-sum.el (gnus-summary-expire-articles): Fix the handling of - expiry-target group parameters. - -2000-08-13 18:53:08 Lars Magne Ingebrigtsen - - * gnus-topic.el (gnus-topic-select-group): Touch the dribble - buffer. - (gnus-topic-hide-topic): Take a PERMANENT parameter. - (gnus-topic-show-topic): Ditto. - - * gnus-dup.el (gnus-dup-suppress-articles): Do auto-expiry. - -2000-08-12 21:48:00 John H. Palmieri - - * mail-source.el (mail-source-incoming-file-prefix): New - variable. - -2000-08-12 20:29:53 Lars Magne Ingebrigtsen - - * gnus-start.el (gnus-check-first-time-used): Clean up a bit. - - * mailcap.el (mailcap-maybe-eval): Be even more warning. - -2000-08-11 Florian Weimer - - * message.el (message-syntax-checks): New check quotin-style: - Text must be written below quoted text. - (message-check-news-body-syntax): Check it. - -2000-08-11 Simon Josefsson - - * imap.el (imap-authenticator-alist): Fix typo. - (imap-gssapi-open): Copy krb4 fixes for modern imtest's, thanks to - Jonas Oberg for debugging. - -2000-08-11 Simon Josefsson - - * gnus-async.el (gnus-asynchronous): Disable by default. - -2000-08-10 20:22:09 Lars Magne Ingebrigtsen - - * mm-view.el (mm-inline-text): Bind fill-column. - - * nnvirtual.el (nnvirtual-request-expire-articles): Return the - list of unexpired articles. - - * gnus-group.el (gnus-group-expire-articles-1): Return the list of - un-expired articles. - - * gnus-sum.el (gnus-summary-reparent-thread): Narrow to the - headers. - - * gnus-topic.el (gnus-topic-kill-group): Move up one line so that - we update the right topic.. - - * mm-decode.el (mm-display-external): Put point at start. - -2000-08-10 Kai Gro,A_(Bjohann - - * nnmail.el (nnmail-expiry-target): More explicit documentation. - - * gnus-cus.el (gnus-group-parameters): Add parameter `expiry-wait'. - -2000-08-09 Simon Josefsson - - * imap.el (imap-parse-body): - (imap-parse-string-list): Add bug workarounds for Stalker - Communigate Pro 3.0 server. - (imap-body-lines): Remove bogus comment. - - * imap.el (imap-range-to-message-set): Move from nnimap.el. - - * nnimap.el (nnimap-retrieve-which-headers): - (nnimap-retrieve-headers-from-server): - (nnimap-request-set-mark): - (nnimap-request-expire-articles): Use `i-r-t-m-set' instead. - -2000-08-08 00:53:41 ShengHuo ZHU - - * message.el (message-dont-reply-to-names): - rmail-dont-reply-to-names may not be defined. - -2000-08-07 09:37:01 ShengHuo ZHU - - * gnus-group.el (gnus-group-iterate): Uncompiled function should - not use pop. - -2000-07-19 Dave Love - - * gnus-ems.el: Defalias some dummy funcs to `ignore'. - (gnus-x-splash): Use expand-file-name. Remove redundant facep - check. - (gnus-article-display-xface): Special-case for dark backgrounds. - -2000-07-19 Kim-Minh Kaplan - - * imap.el (imap-calculate-literal-size-first): New variable. - (imap-local-variables): Add it. - (imap-kerberos4-open): Set it. - (imap-send-command): Use it. - -2000-07-17 14:18:16 ShengHuo ZHU - - * mailcap.el (mailcap-mimetypes-parsed-p): New variable. - (mailcap-parse-mimetypes): Use it. - (mailcap-extension-to-mime): Parse mimetype. - (mailcap-mime-types): Ditto. - * mml.el (mml-minibuffer-read-type): Ditto. - -2000-07-16 18:25:07 ShengHuo ZHU - - * nndoc.el (nndoc-type-alist): Add outlook. - (nndoc-outlook-type-p): New function. - (nndoc-outlook-article-begin): Ditto. - -2000-07-16 Daiki Ueno - - * gnus-sum.el (gnus-restore-hidden-threads-configuration): Save - excursion. - -2000-07-15 Simon Josefsson - - * gnus-cus.el (gnus-group-parameters, banner): Type is regexp. - - * imap.el (imap): - (imap-kerberos4-program): - (imap-gssapi-program): - (imap-ssl-program): Customization. - (imap-shell-program): - (imap-shell-host): New variables. - (imap-streams): - (imap-stream-alist): Add shell. - (imap-shell-p): - (imap-shell-open): New functions. - (imap-open): Don't call authenticator if preauth. - (imap-authenticate): Return t if already authenticated. - -2000-07-14 Simon Josefsson - - * gnus.el (gnus-invalid-group-regexp): New variable. - (gnus-read-group): Use it. - -2000-07-14 12:40:51 ShengHuo ZHU - - * gnus-agent.el (gnus-agent-fetch-group-1): mark-below, - expunge-below and orphan-score are "group variables". - -2000-07-13 Simon Josefsson - - * gnus-srvr.el (gnus-browse-read-group): Don't pass fully - qualified group names to `gnus-group-read-ephemeral-group'. - -2000-07-13 07:40:39 Katsumi Yamaoka - - * dgnushack.el (srcdir): Define it before use it. - -2000-07-12 19:37:50 ShengHuo ZHU - - * gnus-sum.el: `W t' is toggle-header in info. - -2000-07-12 16:50:06 ShengHuo ZHU - - * lpath.el: Fbind subst-char-in-string. - -2000-07-12 15:48:29 ShengHuo ZHU - - * Makefile.in: Use W3DIR and lispdir. - * dgnushack.el: Ditto. - -2000-07-12 10:12:31 ShengHuo ZHU - - * gnus-art.el (article-de-base64-unreadable): Typo. - -2000-07-12 Simon Josefsson - - * gnus-agent.el (require): Require timer. - -2000-07-11 18:29:50 ShengHuo ZHU - - * message.el (message-bounce): Call mime-to-mml. - -2000-07-11 18:00:49 Lars Magne Ingebrigtsen - - * nnslashdot.el (nnslashdot-request-close): New function. - -2000-07-04 23:23:23 Lars Magne Ingebrigtsen - - * nnslashdot.el (nnslashdot-threaded-retrieve-headers): Get the - right line number for the article. - -2000-07-10 22:41:58 ShengHuo ZHU - - * nnslashdot.el (nnslashdot-threaded-retrieve-headers): Save point. - * webmail.el (webmail-fetch): Bind - url-http-silence-on-insecure-redirection. - -2000-07-10 11:43:22 ShengHuo ZHU - - * nnslashdot.el (nnslashdot-threaded-retrieve-headers): Use - unibyte. - (nnslashdot-sane-retrieve-headers): Ditto. - (nnslashdot-request-article): Ditto. - -2000-07-10 11:12:32 William M. Perry - - * mailcap.el (mailcap-parse-mimetype-file): - -2000-07-07 23:46:22 ShengHuo ZHU - - * nnweb.el (nnweb-insert): Stricter test. - * webmail.el (webmail-refresh-redirect): Ditto. - -2000-07-06 14:17:48 ShengHuo ZHU - - * mm-decode.el (mm-dissect-multipart): Match the EOL of boundary. - -2000-07-05 21:19:22 ShengHuo ZHU - - * nnheader.el (nnheader-insert-nov): Remove EOLs of all fields. - -2000-07-05 Dave Love - - * utf7.el: Doc and header fixes. - - * gnus-sum.el: Doc fixes. - - * gnus-util.el (gnus-point-at-eol, gnus-point-at-bol): Use - defalias, not fset. - - * flow-fill.el (fill-flowed-point-at-eol) - (fill-flowed-point-at-bol): Use defalias, not fset. - - * gnus-art.el: Don't alias article-mime-decode-quoted-printable. - (gnus-Plain-save-name): Delete -- apparently bogus. - -2000-07-03 00:12:26 Lars Magne Ingebrigtsen - - * nnsoup.el: Use expand-file-name throughout. - -2000-07-03 00:07:51 Kjetil Torgrim Homme - - * nnmail.el (nnmail-read-incoming-hook): New example. - -2000-07-02 23:17:23 Lars Magne Ingebrigtsen - - * mm-view.el (mm-inline-text): Check whether the text has already - been decoded. - -2000-07-04 15:17:05 ShengHuo ZHU - - * nnslashdot.el (nnslashdot-sid-strip): To strip or not to strip? - -2000-07-03 Stainless Steel Rat - - * gnus-sum.el (gnus-recenter): Fix horizontal recenter. - -2000-07-03 Simon Josefsson - - * gnus-sum.el (gnus-update-marks): Don't propagate download and - unsend flags. - -2000-07-03 Simon Josefsson - - * nnimap.el (nnimap-open-connection): Don't look up virtual server - name in authinfo (.authinfo now support ports, no need for the - hack). - (nnimap-split-find-rule): Fix. - (nnimap-open-connection): Look for nnimap-server-address in authinfo. - -2000-07-03 Paul Stodghill - - * message.el (message-unquote-tokens): Remove all quotes. - -2000-07-03 00:29:08 Julien Gilles - - * gnus-ml.el: New file. - -2000-07-02 16:11:25 Lars Magne Ingebrigtsen - - * nnultimate.el (nnultimate-request-close): New function. - - * gnus-start.el (gnus-clear-system): Clear nnmail-split-history. - -2000-06-18 Norbert Koch - - * Makefile.in: Better support for xemacs builds - -Sun Jul 2 15:11:35 2000 Lars Magne Ingebrigtsen - - * gnus.el: Gnus v5.8.7 is released. - -2000-05-19 06:32:52 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-insert-part): Characters doubly decoded. - -2000-07-01 10:23:08 Shenghuo ZHU - - * message.el (message-do-fcc): Encode MIME. - -2000-06-28 13:52:57 Shenghuo ZHU - - * lpath.el: Fbind image-size. - -2000-06-28 Simon Josefsson - - * nnimap.el (nnimap-split-rule): Update doc with extended syntax. - (nnimap-assoc-match): New function. - (nnimap-split-find-rule): Support extended syntax. - -2000-06-28 Simon Josefsson - - * nnimap.el (nnimap-open-connection): Use port stuff. - - * gnus-util.el (gnus-netrc-machine): Add defaultport parameter, - document port and defaultport. - -2000-06-27 Paul Stodghill - - * gnus-agent.el (gnus-agent-synchronize): Kill flags buffer. - -2000-06-26 Dave Love - - * mm-decode.el (mm-image-fit-p): Use `image-size' in Emacs. - - * message.el: Remove unnecessary `require'ments. Defvar - gnus-list-identifiers when compiling. Don't try to autoload - variable `gnus-list-identifiers'. Autoload - gnus-group-name-charset. - (message-fetch-field): Don't assume `format' removes text - properties. - (message-strip-list-identifiers, message-reply, message-followup): - Require gnus-sum. - (message-mode): Tidy XEmacs conditionals. - (message-replace-chars-in-string): Use subst-char-in-string when - available. - - * gnus-xmas.el (gnus-xmas-define) : - Define if necessary. - - * gnus-art.el (gnus-article-edit-exit): Don't assume `format' - removes text properties. - - * gnus-srvr.el (gnus-browse-group-name): Likewise. - - * gnus-msg.el (gnus-copy-article-buffer): Likewise. - - * gnus-score.el (gnus-summary-score-entry): Likewise. - -2000-06-26 11:18:57 Katsumi Yamaoka - - * nnimap.el (nnimap-request-post): Fix parenthesis. - -2000-06-26 Paul Stodghill - - * message.el (message-unquote-tokens): New function. - - * gnus-msg.el (gnus-inews-do-gcc): Unquote gcc tokens. - - * nnimap.el (nnimap-request-post): Ditto. - -2000-06-21 Simon Josefsson - - * gnus.el (gnus-asynchronous): Removed (defined in gnus-async.el). - - * nnimap.el (nnimap-callback): Update for IMAP4rev1 servers (see - patch commited 2000-04-02). - -2000-06-20 Simon Josefsson - - * imap.el (imap-mailbox-examine-1): New function. - (imap-message-copyuid-1): - (imap-message-appenduid-1): Use it, instead of - `imap-mailbox-examine' which would utf-7 encode mailbox name - twice. - -2000-06-19 Dave Love - - * mm-uu.el Don't require message. Require cl when compiling. - -2000-06-17 18:58:46 Shenghuo ZHU - - * gnus-sum.el (gnus-summary-local-variables): gnus-orphan-score is - a local variable. - * gnus-sum.el (gnus-orphan-score): Move here. - -2000-06-10 09:33:36 Shenghuo ZHU - - * message.el (message-forward): Remove show-mml condition. - (message-forward-ignored-headers): Remove X-Gnus headers. - -2000-06-08 Simon Josefsson - - * gnus-cus.el (gnus-extra-group-parameters): Add uidvalidity. - -2000-06-08 12:34:26 Urban Engberg - - * gnus-demon.el (gnus-demon-scan-mail): Bind nnmail-fetched-sources. - -2000-06-08 12:27:55 Shenghuo ZHU - - * message.el (message-syntax-checks): Add type. - -2000-06-07 Dave Love - - * mm-view.el (mm-inline-image-emacs): Don't specify string for - put-image. - (mm-inline-image): Defalias, not fset. - - * gnus.el (gnus-group-startup-message): Don't specify string for - insert-image. - - * gnus-ems.el (gnus-add-minor-mode): Make it an alias if - add-minor-mode is available. - (gnus-article-display-xface): Don't specify string for - insert-image. - -2000-06-06 13:28:53 Shenghuo ZHU - - * gnus-topic.el (gnus-topic-remove-topic): Set hidden. - (gnus-topic-insert-topic-line): Use shownp. - (gnus-topic-hide-topic): Don't use hidden. - (gnus-topic-show-topic): Don't use hidden. - -2000-06-05 22:25:12 Shenghuo ZHU - - * gnus-cache.el (gnus-cache-possibly-enter-article): Bind coding - system. - * gnus-soup.el (gnus-soup-write-prefixes): Ditto. - * gnus-start.el (gnus-slave-save-newsrc): Ditto. - * gnus-util.el (gnus-output-to-rmail): Ditto. - (gnus-output-to-mail): Ditto. - (gnus-write-buffer): Ditto. - * gnus-uu.el (gnus-uu-save-article): Ditto. - -2000-06-04 15:05:16 Shenghuo ZHU - - * message.el (message-read-from-minibuffer): Typo. - -2000-06-03 13:36:46 Shenghuo ZHU - - * gnus-art.el (article-decode-charset): Override non-MIME forward - charset. - -2000-06-02 12:04:26 Shenghuo ZHU - - * mml.el (mml-quote-region): Correct the regexp. - * gnus-msg.el (gnus-summary-reply): mml-quote it. - -2000-06-02 11:57:15 Shenghuo ZHU - - * message.el (message-forward): Insert raw text. - * mml.el (mml-parse-1): Get raw text in unibyte mode. - (mml-generate-mime-1): Insert raw text in unibyte mode. - -2000-06-01 Florian Weimer - - * mm-bodies.el (mm-body-encoding): Always encoded if - `mm-use-ultra-safe-encoding' is set. - -2000-05-31 14:50:52 Shenghuo ZHU - - * mml.el (ange-ftp-name-format): Typo. - -2000-05-30 Simon Josefsson - - * gnus-start.el (gnus-get-unread-articles): If - `gnus-activate-group' and/or `gnus-check-server' return nil, don't - try to do anything on that server. - -2000-05-25 Simon Josefsson - - * gnus-group.el (gnus-group-nnimap-edit-acl): Help text updated - from latest draft. - -2000-05-08 Simon Josefsson - - * gnus-group.el (gnus-group-expire-articles-1): Make sure server - is open. - -2000-05-24 Dave Love - - * mml.el (mml-parse-file-name): Fix ange-ftp part. - -2000-05-22 Didier Verna - - * gnus.el (gnus-redefine-select-method-widget): new function, call - it once. Add an "other" entry for unknown but editable backend - name symbols. - * gnus-start.el (gnus-declare-backend): use it. - -2000-05-19 Dave Love - - * gnus-art.el (gnus-article-next-page): Revert last change. - -2000-05-19 09:56:07 Shenghuo ZHU - - * gnus-agent.el (gnus-agent-open-history): Open history in binary mode. - -2000-05-19 Dave Love - - * gnus-art.el (gnus-mime-externalize-part): Bind mm-inlined-types, - not mm-inline-large-images. - -2000-05-19 01:45:40 Shenghuo ZHU - - * mml.el (mml-parse-1): Don't test multiple-charsets within mml tag. - -2000-05-18 Dave Love - - * gnus-art.el: Use defalias, not fset. - (gnus-article-x-face-command): Don't test for xbm. - (gnus-article-next-page): Redisplay before testing point in window. - -2000-05-17 21:16:54 Shenghuo ZHU - - * gnus-group.el (gnus-group-mode-map): Add M-SPACE. - * mml.el (mml-mode-map): Comment out mml-narrow-to-part. - -2000-05-17 21:13:38 Jim Davidson - - * gnus-sum.el (gnus-summary-save-article-rmail): Use - gnus-summary-save-in-rmail. - * message.el (message-output): Ditto. - -2000-05-17 22:37:25 Katsumi Yamaoka - - * gnus-art.el (gnus-emphasize-whitespace-regexp): Doc fix. - -2000-05-17 14:03:49 Shenghuo ZHU - - * rfc2047.el (rfc2047-encode-message-header): Encode if the method - is a charset. - * message.el (message-send-news): Check group name charset. - * gnus-msg.el (gnus-post-news): Decode group name. - (gnus-inews-do-gcc): Encode group name. - -2000-05-17 10:16:32 Karl Kleinpaste - - * gnus-art.el (gnus-emphasize-whitespace-regexp): New variable. - * gnus-util.el (gnus-put-text-property-excluding-newlines): Use it. - -2000-05-17 02:25:11 Shenghuo ZHU - - * gnus-group.el (gnus-group-mark-line-p): New function. - (gnus-group-goto-group): New parameter. - (gnus-group-remove-mark): Use it. - * gnus-topic.el (gnus-topic-move-group): Ditto. - (gnus-topic-remove-group): Ditto. - -2000-05-17 00:49:09 Shenghuo ZHU - - * gnus-group.el (gnus-group-list-dormant): New function. - -2000-05-16 23:20:42 Shenghuo ZHU - - * gnus-agent.el (gnus-agent-synchronize): Use - nnheader-insert-file-contents. - (gnus-agent-save-active-1): Ditto. - (gnus-agent-write-active): Ditto. - (gnus-agent-expire): Ditto. - * gnus-cache.el (gnus-cache-read-active): Ditto. - * gnus-start.el (gnus-master-read-slave-newsrc): Ditto. - * gnus-sum.el (gnus-summary-import-article): Ditto. - - * gnus-agent.el (gnus-agent-write-servers): Bind coding-system. - (gnus-agent-save-group-info): Ditto. - (gnus-agent-save-alist): Ditto. - * gnus-util.el (gnus-make-directory): Ditto. - - * gnus-agent.el (gnus-agent-save-group-info): Disable multibyte. - -2000-05-16 21:13:24 Shenghuo ZHU - - * mml.el (mml-generate-mime-preprocess-function): New variable. - (mml-generate-mime-postprocess-function): New variable. - (mml-generate-mime-1): Use them. - -2000-05-16 18:15:24 Shenghuo ZHU - - * gnus-group.el (gnus-group-apropos): Group name charset. - * gnus-sum.el (gnus-set-mode-line): Ditto. - * gnus-group.el (gnus-group-decoded-name): New function. - (gnus-group-edit-group): Use it. - * gnus-cus.el (gnus-group-customize): Use it. - -2000-05-16 17:55:57 Karl Kleinpaste - - * gnus-util.el (gnus-put-text-property-excluding-newlines): Improve. - -2000-05-16 16:22:17 Shenghuo ZHU - - * gnus-group.el (gnus-group-name-charset-method-alist): New variable. - (gnus-group-name-charset-group-alist): Ditto. - (gnus-group-name-charset): New function. - (gnus-group-name-decode): New function. - (gnus-group-insert-group-line): Use them. - (gnus-group-prepare-flat-list-dead): Ditto. - (gnus-group-list-active): Ditto. - (gnus-group-describe-all-groups): Ditto. - (gnus-group-prepare-flat-list-dead-predicate): Ditto. - * gnus-srvr.el: (gnus-browse-foreign-server): Decode group name and - add gnus-group property. - (gnus-browse-group-name): Read gnus-group property. - -2000-05-16 15:27:08 Shenghuo ZHU - - * nnfolder.el (nnfolder-possibly-change-group): Use - file-name-coding-system instead of pathname-coding-system. - * nnmail.el (nnmail-find-file): Ditto. - (nnmail-write-region): Ditto. - * nnmh.el (nnmh-retrieve-headers): Ditto. - (nnmh-request-article): Ditto. - (nnmh-request-group): Ditto. - (nnmh-request-list): Ditto. - (nnmh-possibly-change-directory): Ditto. - (nnmh-active-number): Ditto. - * nnml.el (nnml-possibly-change-directory): Ditto. - (nnml-request-list): Ditto. - (nnml-request-article): Ditto. - (nnml-retrieve-headers): Ditto. - -2000-05-16 Simon Josefsson - - * nnimap.el (nnimap-request-accept-article): Don't unselect - mailbox if no mailbox is selected. - -2000-05-15 Per Abrahamsen - - * gnus-art.el (gnus-button-url-regexp): Revert earlier change. - Recognize domain names starting with `www.' as starting an URL. - -2000-05-15 09:46:47 Shenghuo ZHU - - * mail-source.el (mail-source-fetch-maildir): Insert "From ". - (mail-source-keyword-map): Add "subdirs" for maildir. - -2000-05-14 16:19:28 Shenghuo ZHU - - * nnmail.el (nnmail-scan-directory-mail-source-once): New variable. - (nnmail-get-new-mail): Use it. - * gnus-start.el (gnus-get-unread-articles): Ditto. - -2000-05-14 14:02:12 Shenghuo ZHU - - * gnus-sum.el (gnus-summary-edit-article): Better support for - nndraft:drafts. - * nndraft.el (nndraft-request-replace-article): New function, - bind nnmail-file-coding-system. - -2000-05-14 Dave Love - - * nnheader.el: Replace uses of `fset' with `defalias'. - (jka-compr-compression-info-list): Only defvar when compiling. - -2000-05-14 12:30:28 Shenghuo ZHU - - * webmail.el (webmail-netaddress-article): Refresh redirect. - -2000-05-13 20:41:10 Shenghuo ZHU - - * mm-view.el (mm-inline-text): w3 might not recognize utf-8. - -2000-05-13 16:49:41 Shenghuo ZHU - - * webmail.el: Translate   to SP. - -2000-05-13 13:00:17 Robin S. Socha - - * message.el (message-bounce): Doc typo. - -2000-05-13 12:25:21 Shenghuo ZHU - - * gnus-soup.el (gnus-soup-encoding-type): u is USENET news format. - (gnus-soup-store): Ditto. - (gnus-soup-send-packet): Ditto. - * nnsoup.el (nnsoup-replies-format-type): Ditto. - (nnsoup-dissect-buffer): Ditto. - (nnsoup-narrow-to-article): Ditto. - (nnsoup-make-active): Ditto - -2000-05-13 12:03:29 Shenghuo ZHU - - * message.el (message-mode): Two parameters for local-variable-p. - -2000-05-13 00:54:46 Shenghuo ZHU - - * message.el (message-strip-list-identifiers): New function. - (message-reply): Use it and use message-strip-subject-re. - (message-followup): Ditto. - * gnus-art.el (article-hide-list-identifiers): Remove more. - * gnus-sum.el (gnus-summary-remove-list-identifiers): Ditto. - -2000-05-12 22:28:54 Shenghuo ZHU - - * gnus-uu.el (gnus-uu-digest-mail-forward): Bind - mail-parset-charset and use non-numeric argument. - -2000-05-12 20:54:11 Shenghuo ZHU - - * mml.el (mml-buffer-list): New variable. - (mml-generate-new-buffer): New function. - (mml-destroy-buffers): Ditto. - (mml-insert-mime): Use them. - * gnus-msg.el (gnus-setup-message): mml-buffer leaks. - * gnus-sum.el (gnus-summary-edit-article): Ditto. - * message.el (message-mode): Ditto. - * gnus-uu.el (gnus-uu-digest-headers): Keep MIME headers. - (gnus-uu-save-article): Support show-as-mml. - * message.el (message-forward): Ditto. - -2000-05-12 15:15:55 Shenghuo ZHU - - * nndoc.el (nndoc-type-alist): mime-digest head-begin. - (nndoc-mime-digest-type-p): Locate article head precisely. - * mml.el (mml-generate-default-type): New variable. - (mml-generate-mime-1): Use it. - (mml-insert-mime-headers): Use it. - * gnus-uu.el (gnus-uu-digest-buffer): New variable. - (gnus-uu-digest-mail-forward): Use it and call message-forward - with argument digest. - (gnus-uu-save-article): Support message-forward-as-mime. - * message.el (message-forward): Add parameter digest. - * mm-decode.el (mm-dissect-default-type): New variable. - (mm-dissect-buffer): Use it. - -2000-05-11 11:08:03 Shenghuo ZHU - - * mml.el (mml-parse-singlepart-with-multiple-charsets): Set space, - newline and paragraph to nil when got a non-ascii character. Test - paragraph before newline. - -2000-05-10 12:17:58 Shenghuo ZHU - - * qp.el (quoted-printable-encode-region): Bind tab-width to 1. Set - limit to 76. - -2000-05-10 09:11:48 Lars Magne Ingebrigtsen - - * nnslashdot.el (nnslashdot-sid-strip): New function. - (nnslashdot-threaded-retrieve-headers): New format. - (nnslashdot-sane-retrieve-headers): Ditto. - (nnslashdot-request-article): Ditto. - (nnslashdot-threaded-retrieve-headers): Thread properly. - (nnslashdot-request-article): Be more lenient. - (nnslashdot-threaded-retrieve-headers): Regexp search. - -2000-05-09 13:23:50 Shenghuo ZHU - - * gnus-sum.el (gnus-with-article): Define it before use it. - -2000-05-08 22:34:19 Shenghuo ZHU - - * message.el (message-supersede): Use mime-to-mml. - * mm-decode.el (mm-insert-part): Test the buffer if no encoding. - -2000-05-08 22:34:24 Katsumi Yamaoka - - * gnus-group.el (gnus-group-list-cached): Don't use - `subst-char-in-string'. - -2000-05-08 Dave Love - - * pop3.el (pop3-open-server): Fix creating name of trace buffer. - -2000-05-08 01:07:47 Shenghuo ZHU - - * mm-decode.el (mm-interactively-view-part): Append %s if the - method is a single word. - * nnwarchive.el (nnwarchive-type-definition): Typo. - -2000-05-07 17:24:01 Shenghuo ZHU - - * gnus-group.el (gnus-group-prepare-flat-list-dead-predicate): New - function. - (gnus-group-prepare-flat-predicate): Use it. - (gnus-group-list-cached): List dead groups. - -2000-05-07 10:50:02 Shenghuo ZHU - - * gnus-art.el (article-decode-charset): Don't decode message with - format. - -2000-05-07 Florian Weimer - - * mailcap.el (mailcap-maybe-eval): Honor user request not to - evaluate the Lisp code. - -2000-05-06 17:40:20 Shenghuo ZHU - - * gnus-art.el (article-wash-html): New function. - (gnus-article-wash-html): Bind. - (gnus-article-make-menu-bar): Menu item. - * gnus-sum.el (gnus-summary-wash-map): Bind 'h'. - (gnus-summary-make-menu-bar): Menu item. - * gnus.el: Autoload. - -2000-05-06 Florian Weimer - - * gnus-uu.el (gnus-uu-unshar-warning): New variable. - (gnus-uu-unshar-article): Use it. - - * mailcap.el (mailcap-maybe-eval-warning): New variable. - (mailcap-maybe-eval): Use it. - - * gnus-msg.el (gnus-group-posting-charset-alist): Speling mistake - in docstring. - - * mml.el (mml-generate-mime-1): Small comment. - -2000-05-05 12:27:53 Shenghuo ZHU - - * gnus-art.el (article-de-base64-unreadable): New function. - (gnus-article-de-base64-unreadable): Bind. - (gnus-article-make-menu-bar): Menu item. - * gnus-sum.el (gnus-summary-wash-map): Bind '6' and 'Z'. - (gnus-summary-make-menu-bar): Menu item. - * gnus.el: Autoload. - -2000-05-05 10:32:27 Shenghuo ZHU - - * gnus-sum.el (gnus-summary-show-article): Remove en/disable multibyte. - (gnus-summary-select-article): Add en/disable multibyte. - -2000-05-05 02:47:23 Shenghuo ZHU - - * gnus-sum.el (gnus-summary-edit-article): Enable multibyte. - (gnus-summary-edit-article): New feature: editing raw articles. - -2000-05-05 00:30:12 Shenghuo ZHU - - * rfc2047.el (rfc2047-encode-region): Insert a space before encoding. - Emacs MULE can not encode adjacent iso-2022-jp and cn-gb-2312. - * gnus-msg.el (gnus-summary-mail-forward): Use unibyte buffer. - Emacs MULE can not copy some 8bit characters in multibyte buffers. - * mm-decode.el (mm-insert-part): Ditto. - -2000-05-04 17:49:04 Shenghuo ZHU - - * nndoc.el (nndoc-type-alist): Extend forward regexp. - (nndoc-forward-type-p): Ditto. - -2000-05-04 17:13:04 Shenghuo ZHU - - * mm-util.el (mm-with-unibyte-current-buffer): Set the default - value of enable-multibyte-characters. - -2000-05-04 10:31:24 Shenghuo ZHU - - * gnus-sum.el (gnus-summary-show-article): En/disable multibyte. - -2000-05-03 Dave Love - - * gnus-ems.el (gnus-article-xface-ring-internal) - (gnus-article-xface-ring-size): New variable. - (gnus-article-display-xface): Use them to cache data. Don't try - to use XPM. Set up binary coding for PBM's sake. - -2000-05-03 14:23:38 Shenghuo ZHU - - * gnus-msg.el (gnus-inews-do-gcc): Set mail-parse-charset. - * gnus-int.el (gnus-request-accept-article): Ditto. - (gnus-request-replace-article): Ditto. - * mm-util.el (mm-mime-mule-charset-alist): Add a fake mule-charset. - -2000-05-03 14:11:23 Shenghuo ZHU - - * rfc2047.el (rfc2047-encode): Test the validity of coding-system. - -2000-05-03 11:35:15 Shenghuo ZHU - - * rfc2047.el (rfc2047-encode-message-header): Encode field by - field. - * mml.el (mml-to-mime): Use message-default-charset. - (mml-preview): Narrow to headers. - * message.el (message-send-mail): Use message-default-charset. - (message-send-news): Narrow to headers; - use message-default-charset. - -2000-05-03 08:09:14 Shenghuo ZHU - - * mm-bodies.el (mm-decode-content-transfer-encoding): A better junk - detect. - * mml.el (mml-parse-singlepart-with-multiple-charsets): Save - restriction. - (mml-parse-1): Warning message. - (mml-preview): Disable multibyte. - -2000-05-03 Dave Love - - * gnus.el (gnus-group-startup-message): Add newline before image. - -2000-05-02 21:34:10 Shenghuo ZHU - - * rfc2047.el (rfc2047-encode-message-header): Check the coding-system. - * message.el (message-send-mail): Use unibyte-buffer. - (message-send-mail): Ditto. - -Mon May 1 15:09:46 2000 Lars Magne Ingebrigtsen - - * gnus.el: Gnus v5.8.6 is released. - -2000-05-01 07:45:43 Shenghuo ZHU - - * mml.el (mml-parse-1): Set no-markup-p and warn to nil. - -2000-04-28 21:14:21 Shenghuo ZHU - - * rfc2047.el (rfc2047-q-encoding-alist): Encode HTAB. - -2000-04-28 16:37:09 Shenghuo ZHU - - * message.el (message-send-mail-partially): Use forward-line. - -2000-04-28 16:01:09 Shenghuo ZHU - - * gnus-art.el (gnus-mime-button-menu): Use call-interactively. - -2000-04-28 15:30:17 Shenghuo ZHU - - * mml.el (mml-generate-mime-1): Ignore 0x1b. - (mml-insert-mime): No markup only for text/plain. - (mime-to-mml): Remove MIME headers. - -2000-04-28 14:23:14 Shenghuo ZHU - - * mml.el (mml-preview): Set gnus-newsgroup-charset. - * rfc2047.el (rfc2047-encode-message-header): Encode non-ascii - as 8-bit. - * lpath.el: Fbind image functions. - -2000-04-28 Dave Love - - * gnus.el (gnus-group-startup-message): Maybe use image in Emacs - 21. - - * mailcap.el (mailcap-parse-mailcaps): Revert last change to - search order. Use parse-colon-path and remove some redundancy. - Doc fix. - (mailcap-parse-mimetypes): Code consistently with - mailcap-parse-mailcaps. Doc fix. - - * gnus-start.el (gnus-unload): Iterate over `features', not - `load-history'. - -2000-04-28 09:52:21 Shenghuo ZHU - - * mml.el (mml-parse-1): Don't create blank parts. - (mml-read-part): Fix mml tag. - (mml-insert-mime): Convert message/rfc822. - (mml-insert-mml-markup): Add mmlp parameter. - -2000-04-28 01:16:10 Shenghuo ZHU - - * message.el (message-send-mail-partially): Remove CTE. - -2000-04-28 00:31:53 Shenghuo ZHU - - * lpath.el: Fbind put-image for XEmacs. - * mm-view.el (mm-inline-image): Fset it. - -2000-04-27 23:23:37 Shenghuo ZHU - - * nndoc.el (nndoc-type-alist): Change forward regexp. - -2000-04-27 21:57:10 Shenghuo ZHU - - * message.el (message-send-mail-partially-limit): Change the - default value. - -2000-04-27 21:53:32 Erik Toubro Nielsen - - * gnus-util.el (gnus-extract-address-components): Name might be - "". - -2000-04-27 20:32:06 Shenghuo ZHU - - * gnus-msg.el (gnus-summary-mail-forward): Use ARG. - (gnus-summary-post-forward): Ditto. - * message.el (message-forward-show-mml): New variable. - (message-forward): Use it. - * mml.el (mml-parse-1): Add tag mml. - (mml-read-part): Ditto. - (mml-generate-mime): Support reentance. - (mml-generate-mime-1): Support mml tag. - -2000-04-27 Dave Love - - * gnus-art.el: Don't bother to require custom, browse-url. - (gnus-article-x-face-command): Include gnus-article-display-xface. - - * gnus-ems.el: Assume only (X)Emacs 20+. Simplify XEmacs checks. - Use defalias, not fset. - (gnus-article-display-xface): New function. - - * mm-view.el (mm-inline-image-emacs): Use put-image, remove-images. - - * mm-decode.el: Small doc fixes. Require cl when compiling. - (mm-xemacs-p): Deleted. - (mm-get-image-emacs, mm-get-image-xemacs): Deleted. - (mm-get-image): Amalgamate Emacs and XEmacs code here; for Emacs, - use create-image and don't special-case xbm. - (mm-valid-image-format-p): Use display-graphic-p. - -2000-04-27 15:27:54 Shenghuo ZHU - - * message.el (message-send-mail-partially-limit): New variable. - (message-send-mail-partially): New function. - (message-send-mail): Use it. - * mm-bodies.el (mm-decode-content-transfer-encoding): Remove - all blank lines inside of base64. - * mm-partial.el (mm-inline-partial): Add an option. Remove tail - blank lines. - -2000-04-27 10:03:36 Shenghuo ZHU - - * mml.el (mml-insert-tag): Match more special characters. - -2000-04-27 09:06:29 Shenghuo ZHU - - * gnus-msg.el (gnus-bug): Avoid attaching the external buffer. - -2000-04-27 00:58:43 Shenghuo ZHU - - * mm-decode.el (mm-inline-media-tests): Add message/partial. - (mm-inlined-types): Ditto. - * mm-partial.el: New file. - -2000-04-27 Dave Love - - * mailcap.el (mailcap-mime-data): Fix octet-stream syntax -- might - matter in Emacs 21. - -2000-04-26 Florian Weimer - - * mm-bodies.el (mm-encode-body): Remove reference to - mm-default-charset in comment. - -2000-04-24 00:56:00 Bj,Av(Brn Torkelsson - - * rfc2047.el (rfc2047-encode-message-header): Fixing typo. - -2000-04-26 12:27:41 Shenghuo ZHU - - * gnus-draft.el (gnus-draft-send): Move gnus-draft-setup inside of - let. - -2000-04-26 12:26:10 Pavel Janik ml. - - * gnus-draft.el (gnus-draft-setup): Fix comments. - -2000-04-26 10:06:12 Shenghuo ZHU - - * nnmbox.el (nnmbox-create-mbox): Use nnmbox-file-coding-system, - if nnmbox-file-coding-system-for-write is nil. - -2000-04-26 02:17:44 Shenghuo ZHU - - * gnus-msg.el (gnus-configure-posting-styles): Just remove the - header if nil. - -2000-04-26 00:23:46 Shenghuo ZHU - - * mm-view.el (mm-inline-text): Insert directly if decoded. - * mml.el (autoload): Typo. - -2000-04-25 22:46:36 Shenghuo ZHU - - * mml.el (mml-preview): Set up posting-charset. - * gnus-msg.el (gnus-group-posting-charset-alist): Add koi8-r. - -2000-04-25 21:23:54 Shenghuo ZHU - - * webmail.el: Fix yahoo mail. - -2000-04-25 20:12:17 Shenghuo ZHU - - * rfc2047.el (rfc2047-dissect-region): Don't include LWS ahead of - word if not necessary. - (rfc2047-encode-region): Put space between encoded words. - -2000-04-24 21:11:48 Shenghuo ZHU - - * gnus-util.el (gnus-netrc-machine): Another default to nntp. - -2000-04-24 18:14:12 Shenghuo ZHU - - * gnus-draft.el (gnus-draft-setup): Restore mml only when - required. - (gnus-draft-edit-message): Require restoration. - -2000-04-24 16:51:04 Shenghuo ZHU - - * gnus-score.el (gnus-score-headers): Copy gnus-newsgrou-scored - back. - -2000-04-24 16:01:15 Shenghuo ZHU - - * gnus-art.el (gnus-treat-article): Make sure that the summary - buffer is live. - -2000-04-24 15:42:53 Shenghuo ZHU - - * mailcap.el (mailcap-parse-mailcaps): Reorder. - (mailcap-parse-mailcap): Backwards parsing. - (mailcap-possible-viewers): Remove nreverse. - (mailcap-mime-info): Ditto. - (mailcap-add-mailcap-entry): Keep alternative viewer. - -Mon Apr 24 21:12:06 2000 Lars Magne Ingebrigtsen - - * gnus.el: Gnus v5.8.5 is released. - -2000-04-24 16:29:07 Lars Magne Ingebrigtsen - - * rfc2047.el (rfc2047-header-encoding-alist): Doc fix. - - * gnus-util.el (gnus-netrc-machine): Default to nntp. - - * mml.el (mml-generate-mime-1): Force 8bit on message/rfc822. - -2000-04-23 23:27:25 Shenghuo ZHU - - * mm-view.el (mm-inline-message): Disable prepare-hook. - -2000-04-23 00:32:32 Lars Magne Ingebrigtsen - - * gnus.el: Fix copyright statements. - - * gnus-sum.el (gnus-alter-articles-to-read-function): New - variable. - (gnus-articles-to-read): Use it. - - * message.el (message-get-reply-headers): Bind free variable. - -2000-04-23 01:14:28 Shenghuo ZHU - - * message.el (message-get-reply-headers): Fix to-address. - -2000-04-22 22:51:46 Shenghuo ZHU - - * webmail.el: Hotmail fix. Add a debug function. - -2000-04-23 00:32:32 Lars Magne Ingebrigtsen - - * gnus-sum.el (t): M-down and M-up. - -2000-04-22 20:22:03 Kai Gro,A_(Bjohann - - * gnus-sum.el: Doc fix. - -2000-04-22 10:25:56 Shenghuo ZHU - - * nnwarchive.el (nnwarchive-egroups-article): Remove < and >. - -2000-04-22 14:25:05 Lars Magne Ingebrigtsen - - * nnweb.el (nnweb-dejanews-create-mapping): Remove the context - string. - (nnweb-request-group): Don't scan twice. - (nnweb-request-scan): Don't nix out the hashtb. - - * message.el (message-get-reply-headers): Return a value. - -2000-04-22 14:12:41 David Aspinwall - - * gnus-art.el (gnus-button-url-regexp): New value to match naked - urls. - -2000-04-22 01:23:59 Lars Magne Ingebrigtsen - - * gnus-cache.el (gnus-summary-insert-cached-articles): Reverse the - order messages are inserted. - - * mml.el (mml-generate-mime-1): rfc2047-encode the heads of - message/rfc822 parts. - - * gnus-art.el (gnus-article-read-summary-keys): Check for - numerical values. - - * message.el (message-get-headers): Made into own function. - (message-reply): Use it. - (message-get-reply-headers): Renamed. - (message-widen-reply): New command. - -2000-04-21 20:52:09 Shenghuo ZHU - - * nntp.el (nntp-retrieve-data): Report the error and return nil. - -2000-04-21 19:38:43 Shenghuo ZHU - - * mm-bodies.el (mm-decode-content-transfer-encoding): Don't remove - non-base64 text at the end if not found. - -2000-03-01 Simon Josefsson - - * gnus-sum.el (gnus-read-move-group-name): - (gnus-summary-move-article): Use `gnus-group-method' to find out - what method the manually entered group belong to. - `gnus-group-name-to-method' doesn't return any method parameters - and `gnus-find-method-for-group' uses `gnus-group-name-to-method' - for new groups so they wouldn't work. - -2000-04-21 22:27:15 Lars Magne Ingebrigtsen - - * gnus-msg.el (gnus-configure-posting-styles): Allow nil values to - override. - -2000-04-21 21:58:20 Kai Gro,A_(Bjohann - - * nnmail.el (nnmail-cache-insert): Does some stuff that is - probably good to do, or something. I dunno. I just write these - ChangeLog entries, and my name is Lars. - -1999-12-06 Hrvoje Niksic - - * message.el (message-caesar-region): Use translate-region. - -2000-04-21 21:20:32 Mike Fabian - - * gnus-group.el (gnus-group-catchup-current): Doc fix. - -2000-04-21 20:36:21 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-setup-buffer): Don't kill local - variables, because that makes Emacs flash. - - * gnus-group.el (gnus-group-insert-group-line): Don't call - gnus-group-add-icon unconditionally. - - * gnus-xmas.el (gnus-group-add-icon): Moved here. - - * gnus-group.el (gnus-group-glyph-directory): Don't depend on - xmas. - (gnus-group-glyph-directory): Removed. - -2000-04-21 20:26:23 Jaap-Henk Hoepman - - * gnus-msg.el (gnus-inews-insert-archive-gcc): Don't do stuff if - gnus-newsgroup-name is "". - -2000-04-21 Florian Weimer - - * mm-util.el (mm-mime-mule-charset-alist): Add support for UTF-8 - in conjunction with MULE-UCS. - -1999-12-13 Per Abrahamsen - - * rfc2047.el (rfc2047-fold-region): Don't use the same break twice. - -1999-12-14 04:14:44 Katsumi Yamaoka - - * dgnushack.el (last, mapcon, member-if, union): New compiler - macros for emulating cl functions. - -1999-12-21 Jan Vroonhof - - * message.el (message-shorten-references): Only cater to broken - INN for news. This caters for broken smtpd. - -2000-04-21 18:20:10 Lars Magne Ingebrigtsen - - * mailcap.el (mailcap-mime-info): Use the first match; not the - last. - - * gnus-agent.el (gnus-category-kill): Save the category list. - -2000-04-21 16:41:50 Chris Brierley - - * gnus-sum.el (gnus-summary-move-article): Do something or other. - -2000-04-21 16:07:07 Lars Magne Ingebrigtsen - - * gnus-group.el (gnus-group-add-icon): Fixed indentation. - -2000-04-21 16:07:07 Lars Magne Ingebrigtsen - - * gnus-group.el (gnus-group-add-icon): Fixed indentation. - -2000-04-21 10:43:16 Shenghuo ZHU - - * gnus-group.el (gnus-group-prepare-flat-predicate): New function. - (gnus-group-list-cached): Use it. - -2000-04-21 16:07:07 Lars Magne Ingebrigtsen - - * gnus.el: Update all the copyright notices. - -2000-04-21 15:38:06 Vladimir Volovich - - * mm-bodies.el (mm-decode-content-transfer-encoding): Remove - non-base64 text at the end. - -2000-04-21 15:21:30 Katsumi Yamaoka - - * mm-bodies.el (mm-body-charset-encoding-alist): defcustomized. - -2000-04-21 15:15:41 Lars Magne Ingebrigtsen - - * nnheader.el: Don't autoload cancel-function-timers. - - * message.el (message-fetch-field): Fold case. - -2000-04-21 15:11:09 - - * message.el (message-forward-before-signature): New variable. - -2000-04-21 15:10:31 Alexandre Oliva - - * gnus-mlspl.el: Fix stuff. - -2000-04-21 14:41:09 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-update-article-line): Don't hide - subjects when unthreaded. - -2000-04-21 14:11:39 David S. Goldberg - - * gnus-art.el (gnus-boring-article-headers): Work on long CCs as - well. - -2000-04-21 14:06:43 Rui Zhu - - * gnus-art.el (gnus-article-mode): Fix variable name. - -2000-04-21 13:54:51 Lars Magne Ingebrigtsen - - * mm-view.el: Fix autoload. - - * flow-fill.el (flow-fill): Fix provide. - - * gnus-draft.el (gnus-draft-send): Bind message-setup-hook to - nil. - -2000-04-20 22:24:04 Shenghuo ZHU - - * gnus-win.el (gnus-configure-windows): Revert to switch-to-buffer. - -2000-04-21 05:22:18 Katsumi Yamaoka - - * gnus-util.el (gnus-netrc-machine): Didn't work. - -2000-04-20 21:22:10 Shenghuo ZHU - - * gnus-draft.el (gnus-draft-setup): Restore to mml. - -2000-04-21 01:24:41 Lars Magne Ingebrigtsen - - * flow-fill.el: Renamed from fill-flowed. - - * message.el (message-forward-ignored-headers): Default to - removing CTE. - -2000-04-21 00:48:48 - - * message.el (message-mode): Don't fill headers. - -2000-04-20 23:12:43 Lars Magne Ingebrigtsen - - * message.el (message-pipe-buffer-body): Use shell - -2000-02-21 Yoshiki Hayashi - - * nnvirtual.el (nnvirtual-request-article): - Bind gnus-override-method to nil. - (nnvirtual-request-update-mark): Don't update mark when - article is not there. - -2000-04-20 16:35:41 Shenghuo ZHU - - * mm-uu.el (mm-uu-dissect): Check forwarded message. - -2000-04-20 21:17:48 Lars Magne Ingebrigtsen - - * gnus-util.el (gnus-parse-netrc): Allow "port". - (gnus-netrc-machine): Take a port param. - (gnus-netrc-machine): - - * gnus-art.el (gnus-request-article-this-buffer): Allow - re-selecting referenced articles. - - * message.el (message-cancel-news): Allow editing. - (message-cancel-message): Add newline. - -2000-04-20 21:03:54 William M. Perry - - * mm-view.el (mm-inline-image-emacs): New function. - -2000-04-20 20:44:55 Lars Magne Ingebrigtsen - - * mail-source.el (mail-source-delete-incoming): Change default in - cvs. - -2000-04-20 20:43:34 Kim-Minh Kaplan - - * gnus-art.el (gnus-mime-view-part-as-type-internal): New - function. - -2000-04-20 14:45:20 Lars Magne Ingebrigtsen - - * nnml.el (nnml-request-expire-articles): Use it. - - * nnmail.el (nnmail-expiry-target): New variable. - (nnmail-expiry-target-group): New function. - -2000-04-20 02:36:31 Emerick Rogul - - * message.el (message-forward): Add non-MIME separators. - -2000-04-20 02:25:39 Lars Magne Ingebrigtsen - - * message.el (message-generate-headers): Respect the syntax check - spec. - - * gnus-sum.el (gnus-remove-thread-1): Show thread. - (gnus-remove-thread): Don't show all threads. - -Thu Apr 20 01:39:25 2000 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v5.8.4 is released. - -2000-04-19 Dave Love - - * mailcap.el (mailcap-parse-mimetypes): Add ...mime.types. - -2000-04-18 12:28:24 Shenghuo ZHU - - * nnwarchive.el (nnwarchive-type-definition): New egroups html. - (nnwarchive-egroups-*): Ditto. - (nnwarchive-url): Unibyte buffer and single line cookie. - -2000-04-14 18:50:04 Shenghuo ZHU - - * mm-util.el (mm-char-or-char-int-p): New alias. - * nnweb.el (nnweb-decode-entities): Check the validity of numeric - entities. - -2000-04-10 Daiki Ueno - - * 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 BrYan P. Johnson - - * gnus-group.el (gnus-group-line-format-alist): Added %E for - eyecandy. - (gnus-group-insert-group-line): Now groks %E and inserts icon in - group line using gnus-group-add-icon. - (gnus-group-icons): Added customize group. - (gnus-group-icon-list): Added variable. - (gnus-group-glyph-directory): Added variable. - (gnus-group-icon-cache): Added variable. - (gnus-group-running-xemacs): Added variable. - (gnus-group-add-icon): Added function. Add an icon to the current - line according to gnus-group-icon-list. - (gnus-group-icon-create-glyph): Added function. - -2000-01-05 17:31:52 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-select-article): Return whether we - selected something new. - (gnus-summary-search-article): Start searching at the window - point. - - * gnus-group.el (gnus-fetch-group): Complete over - gnus-active-hashtb. - -Wed Jan 5 17:06:41 2000 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v5.8.3 is released. - -2000-01-05 15:56:02 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-preserve-marks): New variable. - (gnus-summary-move-article): Use it. - (gnus-group-charset-alist): Added more entries. - -2000-01-03 01:18:36 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-inline-override-types): Removed duplicate. - - * gnus-uu.el (gnus-uu-mark-over): Use gnus-summary-default-score - as the default score. - - * gnus-score.el (gnus-score-delta-default): Changed name. - -2000-01-04 Simon Josefsson - - * imap.el (imap-parse-literal): - (imap-parse-flag-list): Don't care about props. - (imap-parse-string): Handle quoted characters. - -2000-01-02 08:37:03 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-goto-unread): Doc fix. - (gnus-summary-mark-article): Doc fix. - (gnus-summary-mark-forward): Doc fix. - (t): Changed keystroke for gnus-summary-customize-parameters. - - * gnus-art.el (gnus-article-mode-map): Use gnus-article-edit for - "e". - (gnus-article-mode-map): No, don't. - - * gnus-sum.el (gnus-summary-next-subject): Don't show the thread - of the final article. - - * mm-decode.el (mm-interactively-view-part): Error on no method. - -2000-01-02 06:10:32 Stefan Monnier - - * gnus-score.el (gnus-score-insert-help): Something. - - * gnus-art.el (gnus-button-alist): Exclude < from - - * nnwarchive.el: Changed file perms. - -1999-12-19 21:42:15 Lars Magne Ingebrigtsen - - * gnus-group.el (gnus-group-delete-groups): New command. - (gnus-group-delete-group): Extra no-prompt parameters. - -1999-12-14 10:18:30 Lars Magne Ingebrigtsen - - * nnslashdot.el (nnslashdot-request-article): Translate
into -

. - -1999-12-28 12:20:18 Shenghuo ZHU - - * webmail.el (webmail-hotmail-article): Don't insert message id. - -1999-12-28 Kai.Grossjohann@CS.Uni-Dortmund.DE (Kai Gro,A_(Bjohann) - - * nnimap.el (nnimap-split-fancy): New variable. - (nnimap-split-fancy): New function. - -1999-12-28 Simon Josefsson - - (nnimap-split-rule): Document symbol value. - -1999-12-28 Simon Josefsson - - * nnimap.el (nnimap-retrieve-headers-progress): Let - `nnheader-parse-head' parse article. - (nnimap-retrieve-headers-from-server): Don't request ENVELOPE, - request headers needed by `nnheader-parse-head'. - -1999-12-23 Florian Weimer - - * gnus-msg.el (gnus-group-posting-charset-alist): Correct default - value (crosspostings are handled), improve documentation. - - * smiley.el: Declare file coding system as iso-8859-1. - - * nnultimate.el: Dito. - - * message.el: Dito. - - * gnus-cite.el: Dito. - - * gnus-spec.el: Dito. - -1999-12-21 Florian Weimer - - * gnus-msg.el (gnus-group-posting-charset-alist): New layout. - (gnus-setup-message): No longer make `message-posting-charset' - buffer-local. - (gnus-setup-posting-charset): Reflect the new layout of - `gnus-group-posting-charset-alist' and `message-posting-charset'. - - * message.el (message-send-mail): Bind `message-this-is-mail' and - `message-posting-charset'. - (message-send-news): Dito, and honour new layout of - `message-posting-charset'. - (message-encode-message-body): Ignore `message-posting-charset'. - - * mm-bodies.el (mm-body-encoding): Consider - `message-posting-charset' when deciding whether to use 8bit. - - * rfc2047.el (rfc2047-encode-message-header): Back out change. - (rfc2047-encodable-p): Now solely for headers; use - `message-posting-charset'. - -1999-12-20 14:10:39 Shenghuo ZHU - - * nnwarchive.el (nnwarchive-type-definition): Set default value. - -1999-12-19 22:49:13 Shenghuo ZHU - - * nnagent.el (nnagent-server-opened): Optional. - (nnagent-status-message): Optional. - -1999-12-19 Simon Josefsson - - * gnus-cite.el (gnus-article-toggle-cited-text): Restore beg and - end (referenced by instructions in - `gnus-cited-opened-text-button-line-format-alist'). - -1999-12-18 Simon Josefsson - - * imap.el (imap-starttls-open): Typo. - -1999-12-18 16:43:37 Shenghuo ZHU - - * mm-util.el (mm-charset-after): Non-MULE case. - * mail-prsvr.el (mail-parse-mule-charset): New variable. - * rfc2047.el (rfc2047-dissect-region): Bind it. - -1999-12-18 Florian Weimer - - * mml.el (mml-generate-multipart-alist): Correct default value. - - * mm-encode.el (mm-use-ultra-safe-encoding): New variable. - (mm-safer-encoding): New function. - (mm-content-transfer-encoding): Use both. - - * mm-bodies.el (mm-body-encoding): Use mm-use-ultra-safe-encoding. - * qp.el (quoted-printable-encode-region): Dito. - -1999-12-18 14:08:48 Shenghuo ZHU - - * webmail.el (webmail-hotmail-article): Snarf the raw file. - -1999-12-18 14:08:12 Victor S. Miller - - * webmail.el (webmail-hotmail-list): raw=0. - -1999-12-18 11:14:51 Shenghuo ZHU - - * gnus-agent.el (gnus-agent-enter-history): Back-compatible in - group name. - -1999-12-18 11:02:00 Shenghuo ZHU - - * gnus-agent.el (gnus-agent-expire): Convert to symbol if stringp. - -1999-12-18 Simon Josefsson - - * imap.el: Don't autoload digest-md5. - (imap-starttls-open): Bind coding-system-for-{read,write}. - (imap-starttls-p): Check if we can find starttls.el. - (imap-digest-md5-p): Check if we can find digest-md5.el. - -1999-12-17 Daiki Ueno - - * base64.el (base64-encode-string): Accept 2nd argument - `no-line-break'. - - * imap.el: Require `digest-md5' when compiling; add autoload - settings for `digest-md5-parse-digest-challenge', - `digest-md5-digest-response', `starttls-open-stream' and - `starttls-negotiate'. - (imap-authenticators): Add `digest-md5'. - (imap-authenticator-alist): Setup for `digest-md5'. - (imap-digest-md5-p): New function. - (imap-digest-md5-auth): New function. - (imap-stream-alist): Add STARTTLS entry. - (imap-starttls-p): New function. - (imap-starttls-open): New function. - -1999-12-18 01:08:10 Shenghuo ZHU - - * gnus-agent.el (gnus-agent-enter-history): Bad group name. - -1999-12-17 19:36:47 Shenghuo ZHU - - * rfc2047.el (rfc2047-dissect-region): Use mapcar instead of - string-to-x function. - -1999-12-17 13:08:54 Shenghuo ZHU - - * rfc2047.el (rfc2047-fold-region): Fold a line more than once. - -1999-12-17 11:54:41 Shenghuo ZHU - - * webmail.el: Enhance hotmail-snarf. - -1999-12-17 10:38:10 Shenghuo ZHU - - * rfc2047.el (rfc2047-dissect-region): Rewrite. - -1999-12-16 22:59:22 Shenghuo ZHU - - * webmail.el (webmail-hotmail-list): Search no-error. - -1999-12-15 22:07:15 Shenghuo ZHU - - * nnwarchive.el: Support nov-is-evil. - * gnus-bcklg.el (gnus-backlog-request-article): Buffer is optional. - Set it if non-nil. - * gnus-agent.el (gnus-agent-fetch-articles): Use it. - -1999-12-15 08:55:19 Shenghuo ZHU - - * nnagent.el (nnagent-server-opened): Redefine. - (nnagent-status-message): Ditto. - -1999-12-14 23:37:44 Shenghuo ZHU - - * rfc1843.el (rfc1843-decode-region): Use - buffer-substring-no-properties. - * gnus-art.el (article-decode-HZ): New function. - -1999-12-14 22:07:26 Shenghuo ZHU - - * nnheader.el (nnheader-translate-file-chars): Only in full path. - -1999-12-14 16:21:45 Shenghuo ZHU - - * mm-util.el (mm-find-charset-region): mail-parse-charset is a - MIME charset not a MULE charset. - -1999-12-14 15:08:03 Shenghuo ZHU - - * gnus-ems.el: Translate more ugly characters. - * nnheader.el (nnheader-translate-file-chars): Don't translate - the second ':'. - -1999-12-14 10:40:33 Shenghuo ZHU - - * gnus-art.el (gnus-request-article-this-buffer): Use all refer - method if cannot find the article. - -1999-12-14 01:13:50 Shenghuo ZHU - - * gnus-art.el (gnus-request-article-this-buffer): Don't use refer - method if overrided. - -1999-12-13 23:38:53 Shenghuo ZHU - - * mail-source.el (mail-source-fetch-webmail): Parameter - dontexpunge. - -1999-12-13 23:31:17 Shenghuo ZHU - - * webmail.el: Support my-deja. Better error report. - -1999-12-13 18:59:33 Shenghuo ZHU - - * nnslashdot.el (nnslashdot-date-to-date): Error proof when input - is bad. - * gnus-sum.el (gnus-list-of-unread-articles): When (car read) - is not 1. - -1999-12-13 18:22:08 Shenghuo ZHU - - * nnslashdot.el (nnslashdot-request-article): A space. - -1999-12-13 17:20:25 Shenghuo ZHU - - * nnagent.el: Support different backend with same name. - -1999-12-13 13:14:42 Shenghuo ZHU - - * nnslashdot.el (nnslashdot-threaded-retrieve-headers): Support - archived group. - (nnslashdot-sane-retrieve-headers): Ditto. - (nnslashdot-request-article): Ditto. - -1999-12-13 11:41:32 Shenghuo ZHU - - * nnweb.el (nnweb-insert): Narrow to point. - -1999-12-13 10:59:42 Shenghuo ZHU - - * nnweb.el (nnweb-insert): Follow refresh url. - * nnslashdot.el: Use it. - -1999-12-13 10:39:53 Shenghuo ZHU - - * nnweb.el (nnweb-decode-entities): Decode numerical entities. - (nnweb-decode-entities-string): New function. - - * nnwarchive.el (nnwarchive-decode-entities-string): Rename to - nnweb-* and move to nnweb.el. - * nnwarchive.el: Use nnweb-decode-entities, etc. - * webmail.el: Ditto. - - * nnslashdot.el: Use nnweb-decode-entities-string. - (nnslashdot-decode-entities): Remove. - -1999-12-13 10:40:56 Eric Marsden - - * nnslashdot.el: Decode entities. - -1999-12-12 Dave Love - - * gnus-agent.el (gnus-category-edit-groups) - (gnus-category-edit-score, gnus-category-edit-predicate): Replace - expansion of setf, fixed. - -1999-12-12 12:50:30 Shenghuo ZHU - - * gnus-agent.el: Revoke last Dave Love's patch, because of - incompatibility of XEmacs. - -1999-12-12 12:27:03 Shenghuo ZHU - - * mm-uu.el: Change headers. - * rfc1843.el: Ditto. - * uudecode.el: Ditto. - -1999-12-07 Dave Love - - * gnus-agent.el (gnus-category-edit-predicate) - (gnus-category-edit-score, gnus-category-edit-score): Expand setf - inside backquote to avoid it at runtime. - -1999-12-07 Dave Love - - * binhex.el: Require cl when compiling. - -1999-12-04 Dave Love - - * gnus-cus.el (gnus-group-parameters): Allow nil for banner. - -1999-12-04 Dave Love - - * mm-util.el (mm-delete-duplicates): New function. - (mm-write-region): Use it. - - * mml.el (mml-minibuffer-read-type): Use mm-delete-duplicates. - - * mailcap.el (mailcap-mime-types): Require mm-util. Use - mm-delete-duplicates. - - * imap.el (imap-open, imap-debug): Avoid mapc. - - * nnvirtual.el (nnvirtual-create-mapping): Likewise. - - * gnus-sum.el (gnus-summary-exit-no-update): Avoid copy-list. - (gnus-multi-decode-encoded-word-string): Avoid mapc. - - * gnus-start.el (gnus-site-init-file): Avoid ignore-errors at - runtime. - - * gnus.el (gnus-select-method): Likewise. - - * nnheader.el (nnheader-nov-read-integer): Likewise. - - * mm-view.el (mm-inline-message): Require cl when compiling. - Avoid ignore-errors at runtime. - (mm-inline-text): Avoid mapc. - -1999-12-12 10:36:51 Shenghuo ZHU - - * gnus-art.el (article-decode-charset): Widen is bad. - -1999-12-12 10:17:42 Shenghuo ZHU - - * mm-util.el (mm-charset-after): `charset-after' may not be defined. - -1999-12-12 Florian Weimer - - * rfc2047.el (rfc2047-encodable-p): New parameter header used to - indicate that only US-ASCII is permitted. - (rfc2047-encode-message-header): Use it. Now, Gnus should never - use unencoded 8-bit characters in message headers. - -1999-12-12 03:08:15 Shenghuo ZHU - - * ietf-drums.el (ietf-drums-narrow-to-header): Make it work with - CRLF. - -1999-12-11 14:42:26 Shenghuo ZHU - - * webmail.el: Require url-cookie. - -1999-12-11 14:21:23 Shenghuo ZHU - - * nnwarchive.el (nnwarchive-make-caesar-translation-table): A - new function to make modified caesar table. - (nnwarchive-from-r13): Use it. - (nnwarchive-mail-archive-article): Improved. - -1999-12-11 12:30:20 Shenghuo ZHU - - * webmail.el (webmail-url): Use mm-with-unibyte-current-buffer. - -1999-12-10 16:22:24 Shenghuo ZHU - - * nnweb.el (nnweb-request-article): Return cons. - -1999-12-10 16:06:04 Shenghuo ZHU - - * gnus-sum.el (gnus-summary-setup-default-charset): Typo. - -1999-12-10 12:14:04 Shenghuo ZHU - - * mm-util.el (mm-with-unibyte): New macro. - * nnweb.el (nnweb-init): Use it. - -1999-12-09 20:39:49 Shenghuo ZHU - - * mm-util.el (mm-charset-after): New function. - (mm-find-mime-charset-region): Set charsets after - delete-duplicates and use find-coding-systems-region. - (mm-find-charset-region): Remove composition. - - * mm-bodies.el (mm-encode-body): Use mm-charset-after. - - * mml.el (mml-parse-singlepart-with-multiple-charsets): Ditto. - -1999-12-09 17:47:56 Shenghuo ZHU - - * mm-util.el (mm-find-mime-charset-region): Revoke last change. - * mml.el (mml-confirmation-set): New variable. - (mml-parse-1): Ask user to confirm. - -1999-12-09 Simon Josefsson - - * gnus-start.el (gnus-get-unread-articles): Make sure all methods - are scanned when we have directory mail-sources (the mail source - is modified in that case, so we must scan it for all - groups/methods). - -1999-12-09 12:05:28 Shenghuo ZHU - - * nnml.el (nnml-request-move-article): Save nnml-current-directory - and nnml-article-file-alist. - -1999-12-09 10:20:07 Shenghuo ZHU - - * gnus-group.el (gnus-group-get-new-news-this-group): Binding - nnmail-fetched-sources. - -1999-12-09 10:19:01 Shenghuo ZHU - - * mm-util.el (mm-find-charset-region): Use the last charset. - -1999-12-08 Per Abrahamsen - - * gnus.el (gnus-select-method): Made the option list prettier. - -1999-12-08 Florian Weimer - - * gnus-msg.el (gnus-group-posting-charset-alist): Use iso-8859-1 - for the `de' newsgroups hierarchy, as it is common practice there. - - -1999-12-07 16:17:12 Shenghuo ZHU - - * nnwarchive.el (nnwarchive-mail-archive-article): Fix - buffer-string arguments. Fix references. - -1999-12-07 15:04:18 Shenghuo ZHU - - * gnus-agent.el (gnus-agent-confirmation-function): New variable. - (gnus-agent-batch-fetch): Use it. - (gnus-agent-fetch-session): Use it. - -1999-12-07 12:32:43 Shenghuo ZHU - - * mm-util.el (mm-find-mime-charset-region): Delete nil. - -1999-12-07 11:45:10 Shenghuo ZHU - - * mm-util.el (mm-find-charset-region): Don't capitalize. Delete - nil. - -1999-12-07 Per Abrahamsen - - * nnslashdot.el (nnslashdot-request-list): There were two - top-level body-forms. Put a `progn' around them. - - * gnus.el (gnus-select-method): Use `condition-case' - instead of `ignore-errors', since cl may not be loaded when the - form is evaluated. - -1999-12-06 23:57:47 Shenghuo ZHU - - * nnwarchive.el: Support www.mail-archive.com. - -1999-12-06 23:55:55 Shenghuo ZHU - - * nnmail.el (nnmail-get-new-mail): Remove fetched sources before - do anything. - -1999-12-06 Simon Josefsson - - * utf7.el: New file, written by Jon K Hellan. - - * imap.el (imap-use-utf7): Renamed from `imap-utf7-p', change - default to t. - -1999-12-06 04:40:24 Lars Magne Ingebrigtsen - - * nnslashdot.el (nnslashdot-request-delete-group): New function. - - * gnus-sum.el (gnus-summary-refer-article): Work for lists with - current. - (gnus-refer-article-methods): New function. - (gnus-summary-refer-article): Use it. - -1999-11-13 Simon Josefsson - - * nnimap.el (nnimap-retrieve-groups): Return active format. - - * nnimap.el (nnimap-replace-in-string): Removed. - (nnimap-request-list): - (nnimap-retrieve-groups): - (nnimap-request-newgroups): Quote group instead of escaping SPC. - -1999-12-05 Simon Josefsson - - * imap.el: Use format-spec for ssl program. - * imap.el (imap-ssl-arguments): Removed. - (imap-ssl-open-{1,2}): Removed. - -1999-12-04 Per Abrahamsen - - * gnus-start.el (gnus-site-init-file): Use `condition-case' - instead of `ignore-errors', since cl may not be loaded when the - form is evaluated. - -1999-12-04 11:34:22 Shenghuo ZHU - - * mm-bodies.el (mm-8bit-char-regexps): Removed. - (mm-7bit-chars): New variable. - (mm-body-7-or-8): Use it in both cases. - -1999-12-04 Michael Welsh Duggan - - * gnus-start.el (gnus-site-init-file): Don't use cl macros in - defcustom definitions. - -1999-12-04 Simon Josefsson - - * mm-decode.el (mm-display-part): Let mm-display-external return - inline or external. - (mm-display-external): For copiousoutput methods, insert output in - buffer. - -1999-12-04 03:29:13 Shenghuo ZHU - - * nntp.el (nntp-retrieve-headers-with-xover): Goto the end of - buffer. - -1999-12-04 08:31:10 Lars Magne Ingebrigtsen - - * gnus-audio.el: An M too far. - - * gnus-msg.el (gnus-setup-message): One backtick too many. - - * gnus-art.el (gnus-mime-view-part-as-type): mailcap-mime-types is - a function, not a variable. - -1999-12-04 08:14:08 Max Froumentin - - * gnus-score.el (gnus-score-body): Widen before requesting. - -1999-12-04 08:06:13 Lars Magne Ingebrigtsen - - * gnus-group.el (gnus-group-prepare-flat): Comment fix. - -1999-12-04 03:01:55 Shenghuo ZHU - - * mail-source.el (mail-source-fetch-webmail): Bind - mail-source-string. - -1999-12-04 07:18:23 Matt Swift - - * gnus-uu.el (gnus-uu-mark-by-regexp): Doc fix. - (gnus-uu-unmark-by-regexp): Ditto. - - * gnus-group.el (gnus-group-catchup-current): Would bug out on - dead groups. - -1999-12-04 01:34:31 Lars Magne Ingebrigtsen - - * gnus-msg.el (gnus-setup-message): Allow the charset setting to - do their real thing. - - * nnmh.el (nnmh-be-safe): Doc fix. - - * gnus-sum.el (gnus-summary-exit): Write cache active file. - - * nntp.el (nntp-retrieve-headers-with-xover): Make sure the entire - status line has arrived before we count it. - - * mailcap.el (mailcap-mime-data): Removed save-file from audio/*. - - * gnus-sum.el (gnus-thread-header): Fixed after indent. - Whitespace problems. - - * gnus-win.el (gnus-configure-windows): Error fix. - - * gnus-demon.el (gnus-demon-add-nntp-close-connection): Add the - right function. - - * gnus.el: Fixed all the doc strings to match the FSF convetions. - Indent all functions. Fix all comments to match the comment - conventions. Double-space after full stop. - -1999-12-04 01:14:55 YAMAMOTO Kouji - - * nnmail.el (nnmail-split-it): I redefined nnmail-split-fancy's - value to divide received mails into my favorite groups and I met - an error. It takes place if the length of a element "VALUE" in - nnmail-split-fancy is less than two. - -1999-10-10 Robert Bihlmeyer - - * mml.el (mml-insert-part): New function. - -1999-09-29 04:48:14 Katsumi Yamaoka - - * lpath.el: Add `sc-cite-regexp'. - -1999-12-02 Dave Love - - * mm-decode.el: Customize. - -1999-12-03 Dave Love - - * nnslashdot.el, nnultimate.el: Don't lose at compile time when - the W3 stuff isn't available. - -1999-12-03 Dave Love - - * imap.el, mailcap.el, nnvirtual.el, rfc2104.el: Don't require cl - at runtime. - -1999-12-04 00:47:35 Dan Christensen - - * gnus-score.el (gnus-score-headers): Fix orphan scoring. - -1999-12-01 Andrew Innes - - * nnmbox.el (nnmbox-read-mbox): Count messages correctly, and - don't be fooled by "From nobody" lines added by respooling. - - * pop3.el (pop3-movemail): Write crashbox in binary. - (pop3-get-message-count): New function. - - * mail-source.el (mail-source-primary-source): New variable. - (mail-source-report-new-mail-interval): New variable. - (mail-source-idle-time-delay): New variable. - (mail-source-new-mail-available): New internal variable. - (mail-source-fetch-pop): Clear new mail flag, when mail from - primary source has been fetched. - (mail-source-check-pop): New function. - (mail-source-new-mail-p): New function. - (mail-source-start-idle-timer): New function. - (mail-source-report-new-mail): New function. - (mail-source-report-new-mail): New internal variable. - (mail-source-report-new-mail-timer): New internal variable. - (mail-source-report-new-mail-idle-timer): New internal variables. - -1999-12-04 00:39:34 Andreas Schwab - - * gnus-cus.el (gnus-group-customize): Customize fix. - -1999-12-04 00:38:24 Andrea Arcangeli - - * message.el (message-send-mail-with-sendmail): Use - message-make-address. - -Fri Dec 3 20:34:11 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v5.8.2 is released. - -Fri Dec 3 20:09:41 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v5.8.1 is released. - -1999-11-11 Hrvoje Niksic - - * mml.el (mml-insert-tag): Don't close the tag. - (mml-insert-empty-tag): New function. - (mml-attach-file): Use mml-insert-empty-tag instead of - mml-insert-tag. - (mml-attach-buffer): Ditto. - (mml-attach-external): Ditto. - (mml-insert-multipart): Ditto. - -1999-12-03 08:49:53 Shenghuo ZHU - - * nnfolder.el (nnfolder-request-article): Return -1 if not find - the article number. - -1999-12-03 01:12:41 Shenghuo ZHU - - * gnus.el (gnus-find-method-for-group): The method of a new group - is not the native one. - -1999-12-03 01:26:55 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-button-embedded-url): Always call browse-url. - -1999-12-02 18:00:15 Lars Magne Ingebrigtsen - - * nnultimate.el (nnultimate-retrieve-headers): Use - mm-with-unibyte-current-buffer. - (nnultimate-request-article): Ditto. - -1999-12-02 14:57:46 Shenghuo ZHU - - * nntp.el (nntp-retrieve-groups): Set to process buffer. - -1999-12-02 11:14:50 Shenghuo ZHU - - * mm-util.el (mm-with-unibyte-current-buffer): New macro. - * nnweb.el (nnweb-retrieve-headers): Use it. - (nnweb-request-article): Use it. - - * nnweb.el (nnweb-dejanews-create-mapping): Set a default date in - case matching failed. - -1999-12-02 John Wiegley - - * mail-source.el (mail-source-keyword-map): Add backslash to - Delete-flag. - -1999-12-02 07:24:35 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-group-charset-alist): Default nnweb groups to - Latin-1. - (gnus-group-charset-alist): No, don't. - - * nnweb.el (nnweb-init): Make the buffer unibyte. - -1999-12-01 23:02:48 Shenghuo ZHU - - * mail-source.el (mail-source-set-common-1): Fix to get the - default value. - -1999-12-02 00:27:46 Lars Magne Ingebrigtsen - - * nnslashdot.el (nnslashdot-read-groups): Unibyte. - - * nnultimate.el (nnultimate-request-list): Use unibyte. - - * gnus-uu.el (gnus-uu-grab-articles): Bind - gnus-display-mime-function to nil. - - * message.el (message-send-mail-with-sendmail): Use the - user-mail-address variable. - - * gnus-art.el (gnus-ignored-headers): More headers. - - * message.el (message-shorten-1): Use list. - -1999-12-01 21:59:36 Lars Magne Ingebrigtsen - - * gnus-msg.el (gnus-configure-posting-styles): Ignore nil - signatures. - - * nnweb.el (nnweb-dejanews-create-mapping): Get the data. - (nnweb-dejanews-create-mapping): Do the properish date. - -1999-12-01 17:41:21 Shenghuo ZHU - - * mail-source.el (mail-source-common-keyword-map): New variable. - (mail-source-bind-common): New macro. - (mail-source-fetch): Support plugged mail source. - * gnus-int.el (gnus-request-scan): Use them. - -1999-12-01 21:59:36 Lars Magne Ingebrigtsen - - * mm-view.el (mm-inline-message): Check whether charset is a - string. - - * nnslashdot.el (nnslashdot-request-post): Insert

's. - - * message.el (message-mode-map): Changed keystroke for - message-yank-buffer. - -1999-11-26 Hrvoje Niksic - - * message.el (message-shorten-references): Cut references to 31 - elements, then either fold them or shorten them to 988 characters. - (message-shorten-1): New function. - (message-cater-to-broken-inn): New variable. - -1999-12-01 21:47:10 Eric Marsden - - * nnslashdot.el (nnslashdot-lose): New function. - -1999-12-01 21:08:48 Lars Magne Ingebrigtsen - - * mm-view.el (mm-inline-message): Not the right type of charset is - being fetched here. Let the group charset rule. - (mm-inline-message): Ignore us-ascii. - -1999-11-24 Carsten Leonhardt - - * mail-source.el (mail-source-fetch-maildir): work around the - ommitted "file-regular-p" in efs/ange-ftp - -1999-12-01 19:59:25 Lars Magne Ingebrigtsen - - * mml.el (mml-generate-mime-1): Don't insert extra empty line. - (mml-generate-mime-1): Use the encoding param. - - * gnus-sum.el (gnus-summary-show-article): Don't bind gnus-visual. - - * gnus-cache.el (gnus-cache-possibly-enter-article): Require - gnus-art before binding its variables. - - * gnus-art.el (gnus-article-prepare-display): Run the prepare - after the MIME. - -1999-12-01 19:48:14 Rupa Schomaker - - * message.el (message-clone-locals): Use it. - - * gnus-msg.el (gnus-configure-posting-styles): Make - user-mail-address local. - -1999-11-20 Simon Josefsson - - * gnus-start.el (gnus-get-unread-articles): Scan each method only - once. - -1999-12-01 17:37:18 Lars Magne Ingebrigtsen - - * message.el (message-generate-new-buffer-clone-locals): Use varstr. - (message-clone-locals): Ditto. - - * gnus-sum.el (gnus-summary-enter-digest-group): Have the digest - group inherit reply-to or from. - -1999-12-01 13:04:09 Shenghuo ZHU - - * gnus-sum.el (gnus-summary-show-article): Support numbered ARG - for charset. - (gnus-summary-show-article-charset-alist): New variable. - - * mm-bodies.el (mm-decode-string): Support gnus-all and - gnus-unknown. - (mm-decode-body): Ditto. - * rfc2047.el (rfc2047-decode): Ditto. - -1999-12-01 17:37:18 Lars Magne Ingebrigtsen - - * mail-source.el (mail-source-delete-incoming): Change default to - t. - -Wed Dec 1 16:31:31 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.99 is released. - -1999-12-01 14:28:49 Lars Magne Ingebrigtsen - - * dgnushack.el (dgnushack-compile): No webmail under Emacs. - - * gnus-sum.el (gnus-summary-refer-article): Wrong interactive - spec. - - * gnus-msg.el (gnus-configure-posting-styles): Eval `eval'. - (gnus-configure-posting-styles): No, don't. - (gnus-configure-posting-styles): Allow overriding files. - - * gnus-art.el (gnus-header-button-alist): Use browse-url - directly. - - * mm-decode.el (mm-inline-media-tests): Check feature vcard. - - * gnus-msg.el (gnus-summary-yank-message): New command and - keystroke. - - * message.el (message-yank-buffer): New command. - (message-buffers): New function. - - * gnus-sum.el (gnus-summary-catchup-and-goto-next-group): Select - next group in a more normal fasion. - - * mml.el (mml-boundary-function): New variable. - (mml-compute-boundary): Use it. - - * nnmh.el (nnmh-active-number): Skip past files that have buffers - that exist for them. - - * gnus-async.el (gnus-async-prefetch-next): Cancel timers. - (gnus-async-timer): New variable. - -1999-11-30 02:07:18 Lars Magne Ingebrigtsen - - * nnultimate.el (nnultimate-request-list): Be more lenient with - root addresses. - -1999-11-28 20:22:37 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-treatment-function-alist): Do - gnus-treat-capitalize-sentences. - -1999-11-30 09:07:53 Shenghuo ZHU - - * webmail.el (webmail-hotmail-article): Hotmail changes the - format. - -1999-11-29 Simon Josefsson - - * mm-decode.el (mm-display-external): For `copiousoutput' methods, - switch to buffer after calling program. - (mm-display-external): Use `shell-command-switch' instead of "-c". - -1999-11-27 15:21:25 Lars Magne Ingebrigtsen - - * nnultimate.el (nnultimate-possibly-change-server): Don't always - read groups file. - - * nnslashdot.el (nnslashdot-request-article): Convert

to -

. - -1999-11-24 20:18:24 Lars Magne Ingebrigtsen - - * message.el (message-mode): Doc fix. - -1999-11-24 09:25:00 Shenghuo ZHU - - * gnus-art.el (article-emphasize): Check group variable. - * rfc1843.el (rfc1843-decode-article-body): Ditto. - -1999-11-24 00:11:27 Shenghuo ZHU - - * mm-decode.el (mm-save-part-to-file): Inhibit jka-compr for any - type. - -1999-11-23 17:21:05 Shenghuo ZHU - - * webmail.el: Support www.netaddress.com, i.e. usa.net. - -1999-11-23 Hrvoje Niksic - - * mml.el (mml-quote-region): Insert ! after the hash. - -1999-11-23 05:08:23 Shenghuo ZHU - - * gnus-group.el (gnus-group-warchive-address-history): Change to - nil. - -1999-11-23 02:33:13 Shenghuo ZHU - - * webmail.el: Support mail.yahoo.com. - - * mail-source.el (mail-source-fetch-webmail): Add password check. - (mail-source-keyword-map): Use `subtype'. - -1999-11-22 04:35:43 Shenghuo ZHU - - * mail-source.el (mail-source-keyword-map): Add webmail. - (mail-source-fetcher-alist): Ditto. - (mail-source-fetch-webmail): New function. - * webmail.el: New file. - -1999-11-21 12:20:02 Shenghuo ZHU - - * nnwarchive.el (nnwarchive-request-group): Print 0 if it is nil. - -1999-11-21 12:19:11 Shenghuo ZHU - - * mailcap.el (mailcap-parse-mailcap): Don't skip double semicolon. - -1999-11-20 12:54:25 Lars Magne Ingebrigtsen - - * nnultimate.el (nnultimate-request-list): Add fetch-time slot. - (nnultimate-prune-days): New function. - (nnultimate-create-mapping): Use it. - (nnultimate-request-group): Only fetch the groups list if it has - not been done before. - (nnultimate-retrieve-headers): Don't write groups. - (nnultimate-create-mapping): Off-by-one error. - -1999-11-19 12:17:25 Lars Magne Ingebrigtsen - - * nnslashdot.el (nnslashdot-sane-retrieve-headers): Fix to match - threaded subjects. - -1999-11-20 02:22:52 Shenghuo ZHU - - * nnwarchive.el: Lots of changes make agent happy. - -1999-11-19 21:37:41 Shenghuo ZHU - - * gnus-start.el (gnus-get-unread-articles): Assert group is in - hashtb. - -1999-11-19 19:53:08 Shenghuo ZHU - - * mm-decode.el (mm-display-external): Write region with binary - mode. - -1999-11-18 14:52:05 Shenghuo ZHU - - * nnweb.el (nnweb-dejanews-create-mapping): Bind `text'. - -1999-11-18 14:35:01 Shenghuo ZHU - - * mm-uu.el (mm-uu-dissect): Use fake charset `gnus-decoded'. - (mm-uu-test): Now it is in restricted region. - - * gnus-art.el (article-decode-charset): Don't mm-uu-test. - - * mm-view.el (mm-view-message): Fix buffer leak. - (mm-inline-message): Support 'gnus-decoded. - - * mm-bodies.el (mm-decode-body): Ditto. - - * rfc2047.el (rfc2047-decode-region): Ditto. - -1999-11-18 Matthias Andree - - * imap.el (require): Added autoload for base64-encode-string. - -1999-11-17 Per Abrahamsen - - * gnus.el (gnus-refer-article-method): Made list value - customizable. - -1999-11-17 13:09:37 Shenghuo ZHU - - * gnus-sum.el (gnus-summary-recenter): set-window-start with - NOFORCE in Emacs case. - -1999-11-17 13:04:01 Shenghuo ZHU - - * gnus-art.el (gnus-request-article-this-buffer): Set - gnus-newsgroup-name. - -1999-11-16 23:53:22 Shenghuo ZHU - - * gnus-xmas.el (gnus-xmas-summary-recenter): set-window-start with - NOFORCE. - -1999-11-17 Simon Josefsson - - * gnus-start.el (gnus-get-unread-articles): Check server before - scanning. - -1999-11-16 10:01:03 Lars Magne Ingebrigtsen - - * gnus.el (gnus-valid-select-methods): nnslashdot is news. - - * nnslashdot.el (nnslashdot-login-name): New variable. - (nnslashdot-password): Ditto. - (nnslashdot-request-post): New function. - - * gnus-art.el (gnus-treat-buttonize): More testing. - - * mm-encode.el: Another CVS test. - - * gnus-art.el (gnus-treat-emphasize): Change default. - (gnus-treat-buttonize): Ditto. - (gnus-treat-buttonize): This is a test. - - * gnus-sum.el (gnus-build-old-threads): Bind mail-parse-charset. - (gnus-build-sparse-threads): Ditto. - (gnus-build-all-threads): Ditto. - - * nnheader.el (make-full-mail-header): Make into a subst. - - * dgnushack.el (dgnushack-compile): Skip all w3-dependent files - unless w3 is supplied. - - * gnus.el (gnus-refer-article-method): Doc fix. - - * gnus-sum.el: Do not accept a prefix. - (gnus-summary-refer-article): Accept a list of select methods. - -1999-11-15 21:28:40 Shenghuo ZHU - - * Makefile.in: Change `^ *' to `\t'. - -1999-11-11 Matt Pharr - - * message.el (message-forward): Pay attention to prefix argument - again and forward all headers when it is set, regardless of the - value of message-forward-ignored-headers. - -1999-11-15 20:44:50 William M. Perry - - * dgnushack.el (dgnushack-compile): Vpath file. - - * Makefile.in (SHELL): VPATH support. - -1999-11-15 20:37:17 Lars Magne Ingebrigtsen - - * gnus-ems.el: Check for cygwin32. - -1999-11-14 18:15:28 Shenghuo ZHU - - * mm-decode.el (mm-display-external): Use 'non-viewer. - -1999-11-14 15:21:06 Shenghuo ZHU - - * base64.el (base64-encode-string): An alias for base64-encode for - compatibility. - -1999-11-14 01:58:18 Shenghuo ZHU - - * nntp.el (nntp-retrieve-groups): Erase nntp-sever-buffer before - nntp-inhibit-erase. - -1999-11-13 Simon Josefsson - - * gnus-start.el (gnus-get-unread-articles): Use - nnfoo-retrieve-groups to find new news, if available. - (gnus-read-active-file-2): New function. - (gnus-get-unread-articles): Use it. - (gnus-read-active-file-1): Ditto. - -1999-11-13 17:59:18 Lars Magne Ingebrigtsen - - * mm-util.el (mm-find-mime-charset-region): Make sure - find-coding-systems-for-charsets is fbound. - - * gnus-ems.el: Typo fix. - -1999-11-13 Florian Weimer - - * mm-util.el (mm-find-mime-charset-region): Use UTF-8 if - it's available and makes sense. - -1999-11-12 19:56:23 Fabrice POPINEAU - - * gnus-score.el (gnus-score-save): Translate score file. - -1999-11-13 Simon Josefsson - - * mail-source.el (mail-source-keyword-map): For IMAP mail source, - added fetchflag and dontexpunge keywords. - (mail-source-fetch-imap): Use them. - -1999-11-12 Per Abrahamsen - - * gnus-start.el (gnus-level-subscribed, gnus-level-unsubscribed, - gnus-level-zombie, gnus-level-killed): Changed from `defcustom' to - `defconst'. - - * gnus-cus.el (gnus-group-parameters): Changed from `defcustom' to - `defconst'. - Mention that it is both for group and topic parameters. - (gnus-extra-topic-parameters): New constant, including `subscribe' - parameter. - (gnus-extra-group-parameters): New constant. - (gnus-group-customize): Use them. - - * gnus.el (gnus-select-method): Added default value and tag. - (gnus-refer-article-method): Added `DejaNews' customization option. - -1999-11-12 05:04:43 Lars Magne Ingebrigtsen - - * gnus-int.el (gnus-server-opened): Ignore denied servers. - - * gnus-ems.el (gnus-mule-max-width-function): New backquote - syntax. - - * nndoc.el (nndoc-mime-digest-type-p): Reinstated. - - * nnslashdot.el (nnslashdot-group-number): Changed default. - - * nnweb.el (nnweb-dejanews-create-mapping): Work with new deja. - (nnweb-dejanews-wash-article): Removed. - (nnweb-type-definition): Fetch by id. - - * gnus-msg.el (gnus-configure-posting-styles): Don't insert unless - we mean it. - - * nnslashdot.el (nnslashdot-group-number): Doc fix. - (nnslashdot-request-list): Use Ultramode as well. - (nnslashdot-date-to-date): Be more lenient. - (nnslashdot-threaded): New function. - -1999-11-11 17:40:54 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-mime-internalize-part): Doc fix. - -1999-11-11 14:32:48 Steinar Bang - - * nnweb.el (nnweb-type-definition): /=dnc - -1999-11-11 10:58:38 Lars Magne Ingebrigtsen - - * nnultimate.el (nnultimate-retrieve-headers): Work with american - dates. - (nnultimate-retrieve-headers): Wrong ordering. - -1999-11-11 07:31:51 Matt Pharr - - * message.el (message-forward-as-mime): New variable. - -1999-11-11 05:24:13 Lars Magne Ingebrigtsen - - * gnus-util.el (gnus-dd-mmm): Beware buggy dates. - -1999-11-10 16:50:01 Shenghuo ZHU - - * mail-source.el (mail-source-movemail-and-remove): New function. - (mail-source-keyword-map): Add `function' for `maildir'. - (mail-source-fetch-maildir): Use it. - -1999-11-10 13:48:10 Shenghuo ZHU - - * nnwarchive.el: New file. - * gnus-group.el (gnus-group-make-warchive-group): New function. - * gnus.el (gnus-valid-select-methods): Add `nnwarchive'. - -1999-11-10 12:13:30 Lars Magne Ingebrigtsen - - * nnultimate.el (nnultimate-retrieve-headers): Work for multi-page - subjects. - -1999-11-10 11:33:23 Rajappa Iyer - - * gnus-salt.el (gnus-pick-article-or-thread): Don't move point. - -1999-11-10 05:22:56 Lars Magne Ingebrigtsen - - * nnultimate.el (nnultimate-open-server): Do address. - (nnultimate-forum-table-p): New function. - - * nnweb.el (nnweb-insert-html): Renamed. - (nnweb-insert): New function. - - * nnultimate.el (nnultimate-insert-html): New function. - - * nnslashdot.el (nnslashdot-retrieve-headers): Don't do anything - if nov is evil. - (nnslashdot-retrieve-headers): use the sane version instead. - -1999-11-09 00:13:25 Lars Magne Ingebrigtsen - - * nnslashdot.el (nnslashdot-request-article): Fold case. - - * nnultimate.el: New file. - - * nnslashdot.el (nnslashdot-retrieve-headers): Skip the article - unless wanted. - - * gnus-start.el (gnus-active-to-gnus-format): Catch errors. - (gnus-read-active-file-1): Separated into own function. - (gnus-read-active-file): Catch quits. - - * nnslashdot.el (nnslashdot-request-article): Search better on - first article. - (nnslashdot-request-list): Fold case. - (nnslashdot-retrieve-headers): Ditto. - -1999-11-08 05:33:15 Lars Magne Ingebrigtsen - - * gnus.el: Autoload gnus-subscribe-topics. - -1999-11-07 22:56:46 Shenghuo ZHU - - * gnus-agent.el (gnus-agent-save-group-info): Remove backslash - before dot. - * gnus-util.el (gnus-write-active-file): Ditto. - -1999-11-07 22:31:10 Shenghuo ZHU - - * nnheader.el (nnheader-replace-duplicate-chars-in-string): New - function. - * gnus-cache.el (gnus-cache-file-name): Use it. - * gnus-agent.el (gnus-agent-group-path): Use it. - * nnmail.el (nnmail-group-pathname): Use it. - -1999-11-07 21:07:55 Shenghuo ZHU - - * gnus-start.el (gnus-active-to-gnus-format): Don't insert backslash - if cooked. - * gnus-util.el (gnus-write-active-file): Write cooked active file. - * gnus-agent.el (gnus-agent-save-group-info): Ditto. - * gnus.el (gnus-short-group-name): "..." proof. - -1999-11-07 20:03:16 Shenghuo ZHU - - * gnus-srvr.el (gnus-browse-foreign-server): Keep using `read' to - support nnslashdot. - -1999-11-08 00:06:02 Lars Magne Ingebrigtsen - - * nnslashdot.el (nnslashdot-retrieve-headers): Don't fetch too - many articles. - (nnslashdot-generate-active): New function. - (nnslashdot-request-newgroups): Use it. - - * gnus-start.el (gnus-active-to-gnus-format): Intern strings group - names. - - * nnslashdot.el (nnslashdot-request-newgroups): New function. - (nnslashdot-request-list): Not moderated. - -1999-11-07 Simon Josefsson - - * nnimap.el (nnimap-open-server): Remove error signal if - nnimap-server-buffer is nil (the check should've been `boundp'). - - * imap.el (imap-log): - * nnimap.el (nnimap-debug): Disable debugging by default. - -1999-11-07 01:17:53 Lars Magne Ingebrigtsen - - * gnus-start.el (gnus-subscribe-newsgroup-method): Doc fix. - - * gnus-topic.el (gnus-subscribe-topic): New function. - - * nnslashdot.el (nnslashdot-request-list): Give out extended group - names. - - * gnus-start.el (gnus-ignored-newsgroups): Disregard bogus chars - if starting with a quote. - -1999-11-07 13:06:11 Shenghuo ZHU - - * gnus-srvr.el (gnus-browse-foreign-server): Support backslash in - group name. - -1999-11-07 01:17:53 Lars Magne Ingebrigtsen - - * nnslashdot.el: New file. - - * nnheader.el (nnheader-insert-header): New function. - - * gnus-art.el (gnus-mime-internalize-part): Bind - mm-inlined-types. - - * nndraft.el (nndraft-request-expire-articles): Do all the backup - files. - -1999-10-29 David S. Goldberg - - * emacs-mime.texi (Customization): Document mm-inline-override-types - -1999-10-29 David S. Goldberg - - * emacs-mime.texi (Customization): Document mm-inline-override-types - -1999-10-29 David S. Goldberg - - * emacs-mime.texi (Customization): Document mm-inline-override-types - -1999-10-26 Katsumi Yamaoka - - * smiley.el (gnus-smiley-display): Use `smiley-toggle-buffer'. - (smiley-toggle-buffer): New function. - (smiley-buffer): Don't quote the function. - (smiley-toggle-extents): Ditto. - -1999-11-07 01:00:32 Lars Magne Ingebrigtsen - - * gnus-topic.el (gnus-topic-goto-missing-topic): Work even in - empty buffers. - -1999-11-06 23:16:24 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-mode-map): Use the summary article - edit. - -1999-11-06 22:56:49 Jens-Ulrik Petersen - - * gnus-group.el (gnus-group-read-ephemeral-group): Doc fix. - -1999-11-06 21:40:30 Lars Magne Ingebrigtsen - - * gnus-uu.el (gnus-uu-mark-thread): Don't move point around. - -1999-10-07 Katsumi Yamaoka - - * gnus-art.el (gnus-treat-predicate): Examine whether the argument - is list or not before condition. - -1999-10-07 Yoshiki Hayashi - - * gnus-art.el (gnus-treat-predicate): Work for (typep "something"). - -1999-11-06 19:18:14 Kevin the Bandicoot - - * gnus-art.el (gnus-emphasis-alist): New value. - -1999-11-06 13:57:13 Shenghuo ZHU - - * gnus-srvr.el (gnus-browse-foreign-server): Use both `read' and - `buffer-substring'. - -1999-11-06 04:24:30 Lars Magne Ingebrigtsen - - * gnus-art.el (article-date-ut): Keep the updated timer. - (gnus-emphasis-underline-italic): Doc fix. - - * gnus-msg.el (gnus-post-method): Doc fix. - (gnus-post-method): Change default. - -1999-11-06 04:12:13 Francisco Solsona - - * message.el (message-newline-and-reformat): Improvements. - -1999-11-06 03:51:24 Lars Magne Ingebrigtsen - - * message.el (message-newline-and-reformat): Don't insert too many - newlines. - (message-newline-and-reformat): Work even if not sc. - - * mm-view.el (mm-inline-message): Insert a delimiter at the end. - - * mm-decode.el (mm-inline-media-tests): Only if diff mode. - -1999-11-06 03:48:02 Toby Speight - - * mm-view.el (mm-display-patch-inline): New function. - -1999-11-06 03:47:54 Robert Bihlmeyer - - * mm-view.el (mm-display-patch-inline): New function. - -1999-11-06 02:17:54 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-read-move-group-name): Subscribe to the - group. - - * message.el (message-forward): Narrow to the right header. - - * gnus-sum.el (gnus-summary-limit-to-age): Protect against bogus - dates. - - * gnus-msg.el (gnus-configure-posting-styles): Use the - user-full-name function. - - * mm-bodies.el (mm-body-encoding): Use the choosing function. - (mm-body-charset-encoding-alist): Default to nil. - - * message.el (message-elide-ellipsis): Fix typo. - (message-elide-region): Ditto. - (message-elide-region): Don't insert a newline first. - -1999-11-05 20:28:27 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-cut-thread): Also cut for numberp - gnus-fetch-old-headers. - (gnus-cut-threads): Ditto. - (gnus-summary-initial-limit): Ditto. - (gnus-summary-limit-children): Ditto. - - * gnus-msg.el (gnus-configure-posting-styles): Allow `header' - matches. - -1999-11-06 Simon Josefsson - - * gnus-art.el (article-decode-encoded-words): - (gnus-mime-display-single): Don't assume gnus-summary-buffer is - live. - - * gnus.el (gnus-read-method): Add methods from - `gnus-opened-servers' to completion. Map entered method/address - into existing methods if possible. - - * gnus-group.el (gnus-group-make-group): Simplify method. - - * gnus-srvr.el (gnus-browse-unsubscribe-group): Simplify method. - - * mml.el (mml-preview): Remove mail-header-separator before - encoding. - -1999-11-05 20:28:27 Lars Magne Ingebrigtsen - - * message.el (message-read-from-minibuffer): New function. - -Fri Nov 5 19:10:02 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.98 is released. - -1999-11-05 01:27:49 Shenghuo ZHU - - * gnus-agent.el (gnus-agent-expire): Remove bad line in NOV. - -1999-11-04 22:20:35 Shenghuo ZHU - - * mml.el (mml-generate-mime-1): Read attached binary file in - binary mode. - -1999-11-03 16:08:56 Shenghuo ZHU - - * gnus-sum.el (gnus-summary-toggle-header): Fix arg bug. - -1999-11-03 15:27:38 Shenghuo ZHU - - * mailcap.el (mailcap-viewer-lessp): Fix bug. - -1999-11-02 17:28:33 Shenghuo ZHU - - * gnus-sum.el (gnus-summary-search-article): Fix loop search bug. - -1999-10-31 21:24:59 Shenghuo ZHU - - * gnus-art.el (gnus-article-mime-match-handle-first): New function. - (gnus-article-mime-match-handle-function): New variable. - (gnus-article-view-part): Make `b' customizable. - -1999-10-29 14:30:07 Shenghuo ZHU - - * gnus-sum.el (gnus-article-get-xrefs): Test eobp. - -1999-09-27 Hrvoje Niksic - - * mm-decode.el (mm-attachment-override-types): Exclude text/plain. - -1999-10-26 23:27:44 Shenghuo ZHU - - * mm-decode.el (mm-dissect-buffer): CTE may come without CTL. - -1999-10-26 21:44:05 Shenghuo ZHU - - * gnus-srvr.el (gnus-browse-foreign-server): Use - `buffer-substring' instead of `read'. - -1999-10-23 Simon Josefsson - - * nnimap.el, imap.el, rfc2104.el: New files. - - * gnus.el (gnus-valid-select-methods): Add nnimap. - - * gnus-group.el (gnus-group-group-map): Add - gnus-group-nnimap-edit-acl, gnus-group-nnimap-expunge. - (gnus-group-nnimap-expunge): New function. - (gnus-group-nnimap-edit-acl): New function. - - * gnus-agent.el (gnus-agent-group-mode-map): Add - gnus-agent-synchronize. - (gnus-agent-synchronize): New function. - (gnus-agent-fetch-group-1): Check if server is open. - - * nnagent.el (nnagent-request-set-mark): Save marks. - - * mail-source.el (mail-source-keyword-map): New imap mail-source. - (mail-source-fetcher-alist): Map to imap fetcher function. - (mail-source-fetch-imap): New function. - - * gnus-art.el (article-hide-pgp): Hide all headers, not just - Hash:. - -1999-10-22 11:03:00 Shenghuo ZHU - - * gnus-topic.el (gnus-topic-sort-topics-1): New function. - (gnus-topic-sort-topics): New function. - (gnus-topic-make-menu-bar): Add sort-topics. - (gnus-topic-move): New function. - (gnus-topic-move-group): Move the topic if no group selected. - -1999-10-13 21:31:50 Shenghuo ZHU - - * gnus-art.el (gnus-article-setup-buffer): Fix buffer leak. - -1999-10-13 12:52:18 Shenghuo ZHU - - * mm-view.el (mm-inline-message): Fix leaving group bug. - -1999-10-07 17:59:49 Shenghuo ZHU - - * gnus-msg.el (gnus-post-method): Use normal method if current is - not available. - -1999-10-07 17:09:34 Shenghuo ZHU - - * nnmail.el (nnmail-insert-xref): Dealing with empty articles. - (nnmail-insert-lines): Ditto. - -1999-10-07 Shenghuo ZHU - - * nnfolder.el (nnfolder-insert-newsgroup-line): Insert a blank - line. - - * message.el (message-unsent-separator): One more separator. - -1999-10-06 Shenghuo ZHU - - * nnfolder.el (nnfolder-request-move-article): For empty article, - search till (point-max). - (nnfolder-retrieve-headers): Ditto. - (nnfolder-request-accept-article): Ditto. - (nnfolder-save-mail): Ditto. - (nnfolder-insert-newsgroup-line): Ditto. - -1999-10-05 Shenghuo ZHU - - * qp.el (quoted-printable-encode-region): Check eobp. - -1999-10-03 Shenghuo ZHU - - * nntp.el (nntp-retrieve-headers-with-xover): Fix hanging problem. - -1999-10-02 Shenghuo ZHU - - * nntp.el (nntp-send-xover-command): Wait for nothing if not - wait-for-reply. - -1999-09-29 Shenghuo ZHU - - * mm-uu.el (mm-uu-forward-begin-line): Change the regexp. - (mm-uu-forward-end-line): Ditto. - -1999-09-29 Didier Verna - - * binhex.el (binhex-decode-region): don't consider the value of - `enable-multibyte-characters' in XEmacs. - - * gnus-start.el (gnus-read-descriptions-file): ditto. - - * mm-util.el (mm-multibyte-p): ditto. - (mm-with-unibyte-buffer): ditto. - (mm-find-charset-region): use `mm-multibyte-p'. - - * mm-bodies.el (mm-decode-body): ditto. - (mm-decode-string): ditto. - - * lpath.el ((string-match "XEmacs" emacs-version)): Don't define - `enable-multibyte-characters' in XEmacs. - -1999-09-29 Shenghuo ZHU - - * mm-util.el (mm-binary-coding-system): Try binary first. - -1999-09-14 Shenghuo ZHU - - * rfc1843.el (rfc1843-decode-article-body): Don't decode twice. - -1999-09-10 Shenghuo ZHU - - * gnus-art.el (article-make-date-line): Add time-zone in iso8601 - format. - (article-date-ut): Find correct insert position. - -1999-09-03 Shenghuo ZHU - - * mm-uu.el (mm-uu-dissect): Do not dissect quoted-printable - forwarded message. - -1999-09-27 20:33:41 Lars Magne Ingebrigtsen - - * gnus-topic.el (gnus-topic-find-groups): Work for unactivated - groups. - - * message.el (message-resend): Use message mode when prompting. - - * gnus-art.el (article-hide-headers): Mark wash. - (article-emphasize): Ditto. - -1999-09-27 19:52:14 Vladimir Volovich - - * message.el (message-newline-and-reformat): Work for SC. - -1999-09-27 19:38:33 Lars Magne Ingebrigtsen - - * gnus-msg.el (gnus-group-posting-charset-alist): 2047 in de.*. - - * gnus-sum.el (gnus-newsgroup-ignored-charsets): Add x-unknown. - -1999-10-20 David S. Goldberg - - * mm-decode.el mm-inline-override-types: New variable - - * mm-decode.el (mm-inline-override-p): New function - - * mm-decode.el (mm-inlined-p): Use it - -1999-10-20 David S. Goldberg - - * mm-decode.el mm-inline-override-types: New variable - - * mm-decode.el (mm-inline-override-p): New function - - * mm-decode.el (mm-inlined-p): Use it - -Mon Sep 27 15:18:05 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.97 is released. - -1999-09-01 Brendan Kehoe - - * gnus-sum.el (gnus-summary-catchup-and-goto-next-group): Use - gnus-summary-next-group, not gnus-summary-next-article. Only give - 3 args. - -1999-09-25 08:07:57 Lars Magne Ingebrigtsen - - * gnus-agent.el (gnus-agent-fetch-group-1): Look in the group - buffer for params. - - * gnus-xmas.el (gnus-xmas-summary-recenter): Display one more - line. - - * message.el (message-forward-ignored-headers): New variable. - - * gnus-art.el (gnus-article-prepare-display): Nix out - gnus-article-wash-types. - - * gnus-agent.el (gnus-agent-create-buffer): New function. - (gnus-agent-fetch-group-1): Use it. - (gnus-agent-start-fetch): Ditto. - - * gnus-sum.el (gnus-summary-exit): Don't use - `gnus-use-adaptive-scoring'. - - * mail-source.el (mail-source-fetch-pop): Only store password when - successful. - - * gnus-nocem.el (gnus-nocem-scan-groups): Message better. - -1999-09-24 18:43:23 Lars Magne Ingebrigtsen - - * message.el (message-reply): Use it. - (message-dont-reply-to-names): New variable. - - * nntp.el (nntp-open-telnet): Don't erase-buffer. - - * mm-util.el (mm-preferred-coding-system): Typo fix. - - * message.el (message-bounce): Work for non-MIME. - - * gnus.el (gnus-short-group-name): Short the right parts of the - name. - -1999-09-24 18:17:48 Johan Kullstam - - * mm-encode.el (mm-qp-or-base64): New version. - -1999-09-10 Shenghuo ZHU - - * gnus-art.el (article-make-date-line): Fix time-zone bug. - -1999-09-09 Shenghuo ZHU - - * gnus-art.el (gnus-article-add-buttons): Don't delete markers out - of restricted region. - (gnus-mime-display-single): Set beg at correct point. - -1999-09-09 Shenghuo ZHU - - * nnmail.el (nnmail-process-maildir-mail-format): Typo. - -1999-09-09 Jens-Ulrik Petersen - - * gnus-msg.el (gnus-configure-posting-styles): Let - `gnus-posting-styles' have its say in posting-style: local - variable `styles' is already bound to `gnus-posting-styles' so - don't rebind it to nil. - -1999-09-24 18:10:56 Robert Bihlmeyer - - * gnus-score.el (gnus-summary-increase-score): Allow editing of - Message-ID. - -1999-09-08 Shenghuo ZHU - - * mm-encode.el (mm-encode-content-transfer-encoding): Fold - quoted-printable-encode-region. - - * qp.el (quoted-printable-encode-region): Assume charset - encoded. Fold every line in the region. - -1999-09-02 Shenghuo ZHU - - * gnus-srvr.el (gnus-browse-foreign-server): Read the first line - of active file. - -1999-09-01 Didier Verna - - * message.el (message-mode): allows whitespaces between multiple - instances of the fill character ">". - -1999-09-24 18:02:50 Kim-Minh Kaplan - - * mm-encode.el (mm-qp-or-base64): Fix. - -1999-09-01 12:18:01 Katsumi Yamaoka - - * message.el (message-send): Too much and. - -1999-09-24 17:58:07 Andreas Schwab - - * gnus-art.el (gnus-mime-view-part-as-type): Renamed. - -1999-08-28 12:44:20 Lars Magne Ingebrigtsen - - * gnus-score.el (gnus-score-headers): Work for nil scores. - -1999-08-27 20:46:11 Lars Magne Ingebrigtsen - - * gnus-cache.el (gnus-cache-write-active): Write full names. - - * gnus-util.el (gnus-write-active-file): Accept full name. - - * mm-decode.el (mm-inlinable-p): Use string-match on the types. - (mm-assoc-string-match): New function. - (mm-display-inline): Use it. - - * gnus-group.el (gnus-group-set-info): Work for nil group params. - - * gnus-msg.el (gnus-configure-posting-styles): Allow eval. - -1999-08-27 19:08:10 Florian Weimer - - * mml.el (mml-generate-multipart-alist): New variable. - -1999-08-27 15:30:02 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-treat-predicate): Work for (not 5). - -1999-08-27 Peter von der Ahe - - * message.el (message-send): More helpful error message if sending - fails - -1999-09-06 Robert Bihlmeyer - - * gnus-score.el (gnus-summary-increase-score): "Lars" was broken - in newer emacsen, where ?r isn't equal 114. - -Fri Aug 27 13:17:48 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.96 is released. - -1999-08-17 Simon Josefsson - - * gnus-start.el (gnus-groups-to-gnus-format): Only use agent - to get active info if method is covered by agent, otherwise - active info is lost. - -1999-08-17 Simon Josefsson - - * gnus-sum.el (gnus-summary-move-article): Report backend errors. - -1999-08-09 Dave Love - - * mm-util.el: Use `defalias', not `fset' for dummy functions. - -1999-08-09 Simon Josefsson - - * gnus-art.el (gnus-ignored-headers): Remove "X-Pgp-*" - (already matched by "^X-Pgp"), removed duplicate - X-Mailing-List, added several new junk headers. - -1999-08-01 Simon Josefsson - - * gnus-art.el (article-decode-charset): Don't assume - gnus-summary-buffer is live. - -1999-08-27 15:07:43 Paul Flinders - - * smiley.el (smiley-deformed-regexp-alist): Fix % smileys. - -1999-08-27 15:02:58 Florian Weimer - - * gnus-score.el (gnus-home-score-file): Work with absolute path - names. - -1999-07-17 Shenghuo ZHU - - * gnus-sum.el (gnus-articles-to-read): Return cached articles if - nothing else in the group. - -1999-07-16 Shenghuo ZHU - - * gnus-bcklg.el (gnus-backlog-enter-article): Check the size of - the article. - -1999-07-15 Shenghuo ZHU - - * mm-uu.el (mm-uu-dissect): Fix for base64 message. - -1999-07-15 Shenghuo ZHU - - * mm-uu.el (mm-uu-forward-end-line): Support forwarded message - from mutt. - -1999-07-14 Shenghuo ZHU - - * mm-bodies.el (mm-decode-content-transfer-encoding): Delete - whitespace. - -1999-07-14 Shenghuo ZHU - - * mm-util.el (mm-text-coding-system-for-write): New variable. - (mm-append-to-file): New function. - (mm-write-region): New function. - - * gnus-art.el (gnus-output-to-file): Use it. - * gnus-util.el (gnus-output-to-rmail): Ditto. - (gnus-output-to-mail): Ditto. - * gnus-uu.el (gnus-uu-binhex-article): Ditto. - -1999-07-14 Shenghuo ZHU - - * nnmail.el (nnmail-find-file): Use mm-auto-mode-alist. - - * nnheader.el (nnheader-insert-file-contents): Revert and use - mm-insert-file-contents. - (nnheader-find-file-noselect): Use mm-auto-mode-alist. - (nnheader-auto-mode-alist): Removed. - - * mm-util.el (mm-inhibit-file-name-handlers): New variable. - (mm-insert-file-contents): Add a new parameter for inserting - compressed file literally. - - * mml.el (mml-generate-mime-1): Insert non-text literally. - - * gnus.el: Change most mm-insert-file-contents back to nnheader. - -1999-07-13 Hrvoje Niksic - - * gnus-art.el (gnus-unbuttonized-mime-types): Fix docstring. - -1999-08-27 14:53:42 Oleg S. Tihonov - - * gnus-sum.el (gnus-group-charset-alist): Default fido7 to - koi8-r. - -1999-07-11 Shenghuo ZHU - - * mml.el (mml-insert-mime): Decode text. - (mml-to-mime): Narrow to headers-or-head. - -1999-07-11 Shenghuo ZHU - - * mm-view.el (mm-inline-text): Check - w3-meta-content-type-charset-regexp. - -1999-07-10 Simon Josefsson - - * gnus-agent.el (gnus-agent-fetch-group-1): Search topics for - predicate. - -1999-07-10 Alexandre Oliva - - * gnus-mlspl.el: Documentation fixes. - -1999-08-27 14:42:14 Rui Zhu - - * gnus-sum.el (gnus-summary-limit-to-age): Prompt better. - -1999-08-27 14:40:52 Michael Cook - - * gnus-art.el (gnus-article-setup-buffer): Kill all local - variables. - -1999-08-27 14:39:34 Hrvoje Niksic - - * nnmail.el (nnmail-get-new-mail): "Done". - -1999-08-27 14:38:14 Lars Magne Ingebrigtsen - - * gnus-group.el (gnus-group-kill-all-zombies): Only prompt when - interactive. - -1999-07-12 Shenghuo ZHU - - * gnus-art.el (article-decode-charset): Fix broken CT. - -1999-07-12 Shenghuo ZHU - - * gnus-agent.el (gnus-agent-fetch-group-1): Recreate agent - overview buffer if it is killed. - -1999-08-27 14:26:03 Eric Marsden - - * gnus-art.el (article-babel): New version. - -1999-08-27 14:22:39 Jon Kv - - * nnfolder.el (nnfolder-request-list-newsgroups): Faster expiry. - -1999-07-10 Mike McEwan - - * gnus.texi (More Threading): Document new variable - `gnus-sort-gathered-threads-function'. - -1999-07-10 Mike McEwan - - * gnus.texi (More Threading): Document new variable - `gnus-sort-gathered-threads-function'. - -1999-07-11 Andreas Jaeger - - * gnus-uu.el (gnus-uu-digest-mail-forward): Delete file after - usage. - -1999-07-10 Shenghuo ZHU - - * mm-util.el (mm-running-xemacs): Removed. - (mm-coding-system-p): New function. - (mm-binary-coding-system): Safe guess. - (mm-text-coding-system): Ditto. - (mm-auto-save-coding-system): Ditto. - -1999-07-11 11:02:03 Lars Magne Ingebrigtsen - - * mm-encode.el (mm-qp-or-base64): Also consider control chars. - (mm-qp-or-base64): Reversed logic. - - * mm-decode.el (mm-save-part-to-file): Let coding system be - binary. - -1999-07-15 Mike McEwan - - * gnus-agent.el (gnus-agent-fetch-group-1): Allow 'agent-score' to - be set in topic parameters. - -1999-07-10 Mike McEwan - - * gnus-sum.el (gnus-sort-gathered-threads-function): New variable. - (gnus-sort-gathered-threads): Allow the user to specify the - function to use when sorting gathered threads. - - * gnus-agent.el (gnus-agent-get-undownloaded-list): Don't - mark cached articles as `undownloaded'. - -Tue Jul 20 02:39:56 1999 Peter von der Ahe - - * gnus-sum.el (gnus-summary-exit): Allow gnus-use-adaptive-scoring - to have buffer local values. - -1999-07-25 Matt Pharr - - * gnus-group.el (gnus-group-make-doc-group): Notice when user - types 'g' for 'guess group type. - -1999-07-30 Simon Josefsson - - * nnmail.el (nnmail-remove-list-identifiers): Remove whitespace - after each regexp in nnmail-list-identifiers, not just after last - one. - - * gnus-sum.el (gnus-list-identifiers): New variable. - (gnus-summary-remove-list-identifiers): New function. - (gnus-select-newsgroup): Use it. - (gnus-summary-wash-hide-map): Bind - `gnus-article-hide-list-identifiers' to W W l. - (gnus-summary-make-menu-bar): Add list-identifiers command. - - * gnus-art.el (gnus-treat-strip-list-identifiers): New variable. - (gnus-treatment-function-alist): Add variable. - (article-hide-list-identifiers): New function. - (mapcar): Add function. - (gnus-article-hide): Use it. - -Fri Jul 9 22:21:16 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.95 is released. - -1999-07-09 21:46:05 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-mailcap-command): New function. - (mm-display-external): Use it. - - * gnus-art.el (article-make-date-line): Work for India. - - * mm-encode.el (mm-qp-or-base64): Typo. - - * gnus-topic.el (gnus-topic-goto-topic): Made into command. - -Fri Jul 9 19:28:29 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.94 is released. - -1999-07-09 21:19:23 Stainless Steel Rat - - * pop3.el: New version. - -1999-07-09 20:01:44 Lars Magne Ingebrigtsen - - * mm-encode.el (mm-qp-or-base64): New function. - (mm-content-transfer-encoding): Use it. - - * gnus-util.el (gnus-parse-netrc): Allow quoted names. - -1999-07-08 Shenghuo ZHU - - * mm-decode.el (mm-display-external): Fix typo and use 'non-viewer. - - * mailcap.el (mailcap-mailcap-entry-passes-test): Add needsterminal. - -1999-07-09 18:52:22 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-mime-view-part-as-media): New command and - keystroke. - - * mailcap.el (mailcap-mime-types): New function. - - * nnmh.el (nnmh-request-group): Update nnmh-group-alist. - - * message.el (message-goto-eoh): Really go to the end. - -1999-07-09 18:40:23 Puneet Goel - - * message.el (message-make-date): Do the right thing in with - sub-hour time zones. - -1999-07-09 18:36:21 Lars Magne Ingebrigtsen - - * gnus-group.el (gnus-group-make-menu-bar): Removed double bug - report. - -1999-07-08 Shenghuo ZHU - - * nnfolder.el (nnfolder-request-rename-group): Create directory. - -1999-07-08 Shenghuo ZHU - - * mailcap.el (mailcap-parse-mailcap): Skip \;. - (mailcap-parse-mailcap-extras): Fix "nonterminal;" and empty name, - and use t as default value. - -Wed Jul 7 18:40:30 1999 Shenghuo ZHU - - * gnus-sum.el (gnus-get-newsgroup-headers): Don't assume - gnus-summary-buffer is live. - -1999-07-09 17:44:03 Robert Pluim - - * mm-util.el (mm-enable-multibyte): Check whether var bound. - -1999-07-09 17:31:39 Lars Magne Ingebrigtsen - - * message.el (message-bounce): Do MIME bounces MIMEy. - - * gnus-sum.el (gnus-summary-read-group-1): Update mark positions. - -1999-07-08 08:41:10 Lars Magne Ingebrigtsen - - * mailcap.el (mailcap-mime-extensions): Changed patch to - text/x-patch. - - * mm-decode.el (mm-display-external): Wrong placement of paren. - -Wed Jul 7 13:09:51 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.93 is released. - -1999-07-08 Alexandre Oliva - - * gnus-cus.el (gnus-group-parameters): New entries for - gnus-group-split. - - * gnus-mlspl.el: Renamed functions and variables so as to - start with gnus-group-split. - * gnus.el: Adjust autoload entries. - -1999-07-07 ??:??:?? Alexandre Oliva - - * gnus-mlspl.el: Removed trailing t from comment and provide. - Renamed functions and variables to start with gnus-mlsplit. - Added autoload comments. - * gnus.el: Added autoload entries. - -1999-07-06 05:37:46 Alexandre Oliva - - * nnmail.el (nnmail-split-it): Search the regexp multiple times, - so that matches excluded by RESTRICTs do not cause the whole split - to be ignored. This also fixes a long-standing bug in which a - split with \N substitutions wouldn't cause cross-posting as - expected. - - * nnmail.el (nnmail-split-fancy): Document RESTRICT clauses. - (nnmail-split-it): Implement them. - - * nnmail.el (nnmail-split-fancy): Document ! splits. - -1999-07-07 10:41:11 Stainless Steel Rat - - * pop3.el: New version. - -1999-07-05 Simon Josefsson - - * gnus-srvr.el (gnus-browse-foreign-server): Use read. - -1999-07-07 10:37:26 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-mime-display-alternative): Do treatment. - -1999-07-06 Shenghuo ZHU - - * gnus-util.el (gnus-write-active-file): Use real name. - - * gnus-agent.el (gnus-agent-expire): Update active file - method by method. - -1999-07-06 Shenghuo ZHU - - * nndraft.el (nndraft-request-article): Use difference - coding-systems for queue and drafts. - - * gnus-sum.el (gnus-summary-setup-default-charset): Special-case - nndraft:drafts. - - * mm-util.el (mm-auto-save-coding-system): New coding system. - - * message.el (message-draft-coding-system): Use it. - -1999-07-06 Shenghuo ZHU - - * mm-uu.el: More customizable and less aggressive. - -1999-07-07 07:53:23 Lars Magne Ingebrigtsen - - * gnus-start.el (gnus-groups-to-gnus-format): Only gnus-active - when plugged. - - * mml.el (mml-generate-mime-1): Don't insert nofile files. - (mml-insert-mml-markup): Accept a nofile. - (mml-insert-mime): Insert nofile. - - * gnus-art.el (gnus-treat-strip-blank-lines): Removed. - - * mm-decode.el (mm-handle-media-type): New function. - (mm-handle-media-supertype): New function. - (mm-handle-media-subtype): New function. - Use new functions throughout. "/")) - -1999-05-18 03:03:50 Katsumi Yamaoka - - * gnus-art.el (gnus-treat-predicate): Typo. - -1999-07-07 06:21:36 Lars Magne Ingebrigtsen - - * gnus-score.el (gnus-summary-score-entry): Made un-interactive. - -1999-07-06 17:57:16 Lars Magne Ingebrigtsen - - * gnus-art.el (article-date-ut): UT! Default it! - -Tue Jul 6 10:59:24 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.92 is released. - -1999-07-06 12:30:59 Johannes Weinert - - * gnus-sum.el (gnus-summary-catchup-and-exit): Doc fix. - -1999-07-06 07:41:07 Lars Magne Ingebrigtsen - - * nntp.el (nntp-retrieve-groups): Don't do anything when not - connected. - - * gnus-start.el (gnus-active-to-gnus-format): Only save active - when plugged. - - * mm-view.el (mm-inline-message): Ignore remove-spec. - - * gnus-agent.el (gnus-agent-write-active): Check whether orig sym - is bound. - - * gnus-msg.el (gnus-summary-mail-forward): Rename From_ lines. - - * nndoc.el (nndoc-guess-type): Remove blank lines at the start. - - * nnfolder.el (nnfolder-read-folder): Remove blank lines at the - start. - - * message.el (message-fill-yanked-message): Remove `t' arg. - - * gnus-group.el (gnus-group-kill-group): Message killing of - groups. - - * mm-util.el (mm-preferred-coding-system): New function. - (mm-mime-charset): Use it. - - * mml.el (mml-generate-mime-1): Charset-encode message parts. - -1999-07-06 07:03:31 Alexandre Oliva - - * gnus-mlsplt.el: New file. - -1999-07-06 05:47:57 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-inline-Media-tests): Changed from forms to - functions. - (mm-attachment-override-p): Take a handle instead of a type. - (mm-inlined-p): Ditto. - (mm-automatic-display-p): Ditto, - (mm-inlinable-p): Ditto. - - * nndraft.el (nndraft-request-expire-articles): Delete backup - files. - - * mailcap.el (mailcap-parse-mailcap): Regexp-quote stuff. - - * gnus-sum.el (gnus-summary-limit-to-extra): Typo. - -1999-07-06 05:37:46 Alexandre Oliva - - * nnmail.el (nnmail-split-it): Allow .*. - -1999-07-05 05:04:57 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-inline-large-images-p): Renamed. - - * gnus-art.el (article-date-ut): Always look in the current buffer - for the Date header. - - * mml.el (mml-validate): New command. - - * mailcap.el (mailcap-possible-viewers): Revert to string-match - since we are dealing with regexps. - -Sun Jul 4 06:31:01 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.91 is released. - -1999-07-04 04:35:28 Lars Magne Ingebrigtsen - - * gnus-agent.el (gnus-agent-save-active-1): New function. - (gnus-agent-save-active): use it. - (gnus-agent-save-groups): Ditto. - - * gnus-cache.el (gnus-cache-write-active): Use it. - - * gnus-agent.el (gnus-agent-write-active): Use it. - - * gnus-util.el (gnus-write-active-file): New function. - - * gnus-agent.el (gnus-agent-write-active): New function to keep - lower boundaries and canceled groups. - (gnus-agent-save-groups): Use it. - (gnus-agent-save-active): Use it. - (gnus-agent-save-group-info): Only write active files. - (gnus-agent-expire): Update active file. - - * mm-decode.el (mm-inlinable-part-p): Removed. - (mm-user-display-methods): Default to nil. - (mm-user-display-methods): Removed. - (add-mime-display-method): Removed. - (mm-automatic-display): Renamed. - (mm-automatic-display-p): Use it. - (mm-inlined-types): New variable. - (mm-inlined-p): New function. - - * message.el (message-reply): Bind message-this-is-mail. - -1999-07-03 13:16:31 Michael Klingbeil - - * smiley.el (smiley-buffer): Fix for NT. - -1999-07-03 11:26:47 Lars Magne Ingebrigtsen - - * mm-encode.el (mm-encode-buffer): Check whether we have 7bit. - - * message.el (message-check-news-header-syntax): Protect against - nil froms. - - * mm-util.el (mm-auto-mode-alist): New. - - * mml.el (mml-generate-mime-1): Ditto. - - * gnus.el: Use mm-insert-file-contents throughout instead of - nnheader. - - * mm-util.el (mm-insert-file-contents): New function. - -Sat Jul 3 07:35:35 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.90 is released. - -1999-07-03 09:31:10 Sven Fischer - - * mailcap.el (mailcap-possible-viewers): Use string=. - -1999-07-01 Shenghuo ZHU - - * mm-uu.el (mm-uu-forward-begin-line): New variable. - (mm-uu-forward-end-line): New variable. - (mm-uu-begin-line): Handle forwarded message. - (mm-uu-identifier-alist): Ditto. - (mm-uu-dissect): Ditto. - -1999-06-29 Shenghuo ZHU - - * lpath.el: Two free variables. - -1999-07-02 Shenghuo ZHU - - * nnheader.el (nnheader-file-coding-system): Use raw-text. - * gnus-agent.el (gnus-agent-file-coding-system): Ditto. - * gnus-cache.el (gnus-cache-coding-system): Ditto. - - * nnfolder.el (nnfolder-file-coding-system): Use mm-text-coding-system. - (nnfolder-file-coding-system-for-write): New variable. - (nnfolder-active-file-coding-system): New variable. - (nnfolder-active-file-coding-system-for-write): New variable. - (nnfolder-save-active): New function. - (nnfolder-save-buffer): Use them. - (nnfolder-possibly-change-group): Ditto. - (nnfolder-request-list-newsgroups): Ditto. - (nnfolder-request-create-group): Ditto. - (nnfolder-request-expire-articles): Ditto. - (nnfolder-request-move-article): Ditto. - (nnfolder-request-accept-article): Ditto. - (nnfolder-request-delete-group): Ditto. - (nnfolder-request-rename-group): Ditto. - (nnfolder-possibly-change-folder): Ditto. - (nnfolder-read-folder): Ditto. - (nnfolder-request-list): Remove pathname-coding-system. - (nnfolder-possibly-change-group): Use nnmail-pathname-coding-system. - - * nnmail.el (nnmail-file-coding-system): Use raw-text. - (nnmail-file-coding-system-1): Removed. - (nnmail-find-file): Use nnmail-pathname-coding-system. - (nnmail-write-region): Ditto. - - * nnmbox.el (nnmbox-file-coding-system): New variable. - (nnmbox-file-coding-system-for-write): New variable. - (nnmbox-active-file-coding-system): New variable. - (nnmbox-active-file-coding-system-for-write): New variable. - (nnmbox-save-buffer): New function. - (nnmbox-save-active): New function. - (nnmbox-request-scan): Use them. - (nnmbox-request-expire-articles): Ditto. - (nnmbox-request-move-article): Ditto. - (nnmbox-request-accept-article): Ditto. - (nnmbox-request-replace-article): Ditto. - (nnmbox-request-delete-group): Ditto. - (nnmbox-request-rename-group): Ditto. - (nnmbox-request-create-group): Ditto. - - * mm-util.el (mm-text-coding-system): raw-text or -dos. - (mm-running-ntemacs): Removed. - - * nnml.el (nnml-file-coding-system): Use nnmail-file-coding-system. - -1999-07-02 Shenghuo ZHU - - * nnfolder.el (nnfolder-read-folder): Use nnheader-file-coding-system. - -1999-07-01 Shenghuo ZHU - - * qp.el (quoted-printable-encoding-characters): Support lower case. - -1999-07-01 Shenghuo ZHU - - * rfc2047.el (rfc2047-encode): Fold before B-encoding. - (rfc2047-b-encode-region): Encode line by line. - -1999-07-03 09:20:16 Lars Magne Ingebrigtsen - - * mm-util.el (mm-find-mime-charset-region): Fix. - -1999-06-30 KOSEKI Yoshinori - - * mm-util.el (mm-mime-mule-charset-alist): Fix iso-2022-jp(-2) bug. - (mm-find-mime-charset-region): Ditto. - -1999-07-03 09:15:35 Simon Josefsson - - * gnus-sum.el (gnus-summary-move-article): Fix something or - other. - -1999-06-29 Shenghuo ZHU - - * gnus-sum.el (gnus-newsgroup-ephemeral-charset): New variable. - (gnus-newsgroup-ephemeral-ignored-charsets): New variable. - (gnus-summary-enter-digest-group): Use them. - (gnus-summary-setup-default-charset): Ditto. - -1999-06-15 Shenghuo ZHU - - * base64.el (base64-run-command-on-region): Use unibyte buffer. - -1999-06-15 Shenghuo ZHU - - * gnus-msg.el (gnus-configure-posting-styles): Fix bug when - gnus-newsgroup-name is nil. - -1999-06-15 Shenghuo ZHU - - * rfc2047.el (rfc2047-encode): Chop the tail newline. - -1999-06-15 Shenghuo ZHU - - * gnus-art.el (article-emphasize): Use correct - gnus-article-emphasis-alist. - -1999-06-15 Shenghuo ZHU - - * mm-view.el (mm-inline-text): Fix text/html bug. - -Mon Jun 28 17:54:01 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.89 is released. - -1999-06-24 Shenghuo ZHU - - * nnmail.el (nnmail-file-coding-system-1): For NTEmacs in Windows. - * message.el (message-draft-coding-system): Ditto. - * mm-util.el (mm-running-ntemacs): Ditto. - -1999-06-23 Shenghuo ZHU - - * gnus-xmas.el (gnus-xmas-summary-recenter): A blank line may - cause problem. - -1999-06-23 Shenghuo ZHU - - * mm-view.el (mm-inline-text): Ignore error in w3-region. - -1999-06-23 Shenghuo ZHU - - * mml.el: require mm-decode. - -1999-06-23 Shenghuo ZHU - - * gnus-art.el (gnus-display-mime): Treat as head only if necessary. - -1999-06-23 Shenghuo ZHU - - * mm-view.el (mm-inline-image): Fix image undisplayer. - -1999-06-22 Shenghuo ZHU - - * mml.el (mml-insert-multipart): Error in compeling-read. - (mml-insert-tag): Match tags. - -1999-06-19 Shenghuo ZHU - - * gnus-cache.el (gnus-cache-braid-nov): Fix coding-system bug. - (gnus-cache-braid-heads): Ditto. - (gnus-cache-retrieve-headers): Ditto. - -1999-06-16 Shenghuo ZHU - - * gnus-draft.el (gnus-draft-send): Fix encoding bug. - -1999-06-16 10:17:29 Katsumi Yamaoka - - * gnus-art.el (gnus-article-read-summary-keys): Convert key events - to string under XEmacs. - -1999-06-28 19:34:03 Petersen Jens-Ulrik - - * gnus-start.el (gnus-find-new-newsgroups): Doc fix. - -1999-06-22 Shenghuo ZHU - - * mm-view.el (mm-inline-message): Fix message view bug. - * gnus-art.el (gnus-article-prepare): Ditto. - -1999-06-16 Shenghuo ZHU - - * gnus-cache.el (gnus-cache-possibly-enter-article): Fetch headers. - -Tue Jun 15 04:13:01 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.88 is released. - -1999-06-15 04:13:45 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-save-parts): Destroy handles after - usage. - - * nnmail.el (nnmail-get-new-mail): Save info. - -Mon Jun 14 01:15:59 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.87 is released. - -1999-06-14 02:46:05 Lars Magne Ingebrigtsen - - * mail-source.el (mail-source-fetch-file): Use prescript-delay. - (mail-source-run-script): New function. - (mail-source-fetch-pop): Use it. - -1999-06-13 09:52:11 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-setup-highlight-words): Moved here. - -Sun Jun 13 07:30:40 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.86 is released. - -1999-06-13 08:51:25 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-treat-translate): New variable. - (gnus-treat-predicate): Accept a list of regexps. - (gnus-article-treat-custom): Allow a list of regexps. - -1999-06-09 Markus Rost - - * gnus/gnus-group.el (gnus-permanently-visible-groups): Fix custom - type. - -1999-06-13 05:15:52 Lars Magne Ingebrigtsen - - * gnus-art.el (article-babel): Narrow a bit. - - * gnus-agent.el (gnus-agent-get-undownloaded-list): Was too slow. - -1999-06-12 Simon Josefsson - - (gnus-agent-get-undownloaded-list): Operate on all articles, not - only unread ones. - (gnus-agent-fetch-headers): Fetch headers from unread and marked - articles, not only unread ones. - -1999-06-13 03:01:35 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-limit-to-extra): New command and - keystroke. - - * gnus-art.el (gnus-article-x-face-command): Ditto. - - * gnus-uu.el (gnus-uu-default-view-rules): Default to "display". - - * gnus.el (gnus-method-simplify): Accept server names. - -1999-06-13 02:36:15 Per Abrahamsen - - * gnus-art.el (article-babel-prompt): New function. - (article-babel): New command. - -1999-06-13 01:01:52 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-part-wrapper): Go to part. - - * mml.el (mml-generate-mime-1): Don't insert literally. - - * gnus-util.el (gnus-parse-netrc): Skip lines with #'s. - (gnus-netrc-syntax-table): Removed. - (gnus-parse-netrc): Don't use syntax table; just use whitespace. - -Wed May 5 13:51:13 1999 Shenghuo ZHU - - * mm-view.el (mm-inline-text): Fix charset for text/html. - -Wed May 5 01:15:08 1999 Shenghuo ZHU - - * message.el (message-draft-coding-system): Use emacs-mule-dos. - -1999-06-12 07:29:39 Lars Magne Ingebrigtsen - - * nnmail.el (nnmail-split-incoming): Return the number of split - mails. - (nnmail-process-babyl-mail-format): Ditto. - (nnmail-process-unix-mail-format): Ditto. - (nnmail-process-mmdf-mail-format): Ditto. - (nnmail-process-maildir-mail-format): Ditto. - - * mail-source.el (mail-source-callback): Return the number from - the callback. - - * message.el (message-send-mail): Generate Lines. - - * mail-source.el (mail-source-call-script): New function. - (mail-source-call-script): New function. - -Sun May 2 02:00:27 1999 Shenghuo ZHU - - * gnus-sum.el (gnus-summary-setup-highlight-words): New function. - (gnus-select-newsgroup): Use it. - (gnus-group-highlight-words-alist): New variable. - (gnus-newsgroup-emphasis-alist): New variable. - (gnus-summary-local-variables): Use it. - * lpath.el: Use it. - * gnus-art.el (article-emphasize): Use it. - (gnus-emphasis-highlight-words): New face. - * gnus-cus.el (gnus-group-parameters): New parameter. - -Sun May 2 01:00:02 1999 Shenghuo ZHU - - * gnus-cache.el (gnus-cache-possibly-enter-article): Remove - parameter `headers'. - (gnus-cache-enter-article): Ditto. - (gnus-cache-update-article): Ditto. - * gnus-sum.el (gnus-summary-move-article): Ditto. - (gnus-summary-mark-article-as-unread): Ditto. - (gnus-summary-mark-article): Ditto. - -1999-06-12 03:59:56 Lars Magne Ingebrigtsen - - * gnus-msg.el (gnus-message-insert-stylings): Removed. - (gnus-posting-style-alist): Removed. - (gnus-message-style-insertions): Ditto. - (gnus-configure-posting-styles): Reimplementation. - - * mail-source.el (mail-source-fetch): Error the message. - - * gnus-msg.el (gnus-inews-do-gcc): Do mml and encoding. - -Sat Jun 12 00:19:57 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.85 is released. - -1999-04-20 Michael Cook - - * gnus-cite.el (gnus-cite-attribution-prefix): Tweak for MS - Outlook citation regex. - -1999-06-12 02:09:49 Lars Magne Ingebrigtsen - - * nndoc.el (nndoc-mime-parts-type-p): Accept space before - semicolon. - -1999-05-24 Simon Josefsson - - * gnus-range.el (gnus-remove-from-range): Document range1 - modification, protect range2. - -1999-05-24 Simon Josefsson - - * gnus-sum.el (gnus-update-marks): Protect lists from - gnus-remove-from-range, don't sort twice. - -1999-05-21 Simon Josefsson - - * gnus-start.el (gnus-read-descriptions-file): Protect if no - function in backend. - -1999-05-15 Simon Josefsson - - * gnus-sum.el (gnus-valid-move-group-p): Check for a - request-accept-article function in the backend instead of using - the 'respool capability. - -1999-04-18 Hrvoje Niksic - - * mm-bodies.el (mm-decode-content-transfer-encoding): Handle - spurious whitespace at eob. - -1999-06-12 02:02:06 Adrian Aichner - - * nnmail.el (nnmail-get-new-mail): Check right variable. - -1999-06-12 01:57:39 Karl Kleinpaste - - * mailcap.el (mailcap-mime-data): Fix rfc822. - -1999-06-11 23:48:50 TOZAWA Akihiko - - * nndoc.el (nndoc-nsmail-type-p): New function. - (nndoc-type-alist): Recognize nsmail. - -1999-05-12 Mike McEwan - - * gnus-art.el (gnus-treatment-function-alist): Display `x-face' - *before* `article-hide-headers' deletes the information. - -1999-05-22 00:26:46 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-save-parts): New command and - keystroke. - (gnus-summary-save-parts-1): New function. - (gnus-summary-iterate): Buggy. - - * mm-decode.el (mm-save-part-to-file): Made into own function. - -1999-05-11 05:53:16 Lars Magne Ingebrigtsen - - * gnus-group.el (gnus-group-set-info): Resist nils. - -1999-05-04 19:26:08 Lars Magne Ingebrigtsen - - * mailcap.el (mailcap-mime-data): Ditto. - - * gnus-uu.el (gnus-uu-default-view-rules): Ditto. - - * gnus-art.el (gnus-article-x-face-command): Default to ee. - -1999-05-02 Gareth Jones - - * gnus-art.el (article-make-date-line): Put X-Sent below Date if - gnus-article-date-lapsed-new-header is t. - -Sat May 1 20:27:43 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.84 is released. - -1999-05-01 22:23:21 Lars Magne Ingebrigtsen - - * gnus-msg.el (gnus-bug-message): Mime change. - -1999-04-22 Simon Josefsson - - * gnus-sum.el (gnus-update-marks): Process null mark lists. - -1999-04-21 Hrvoje Niksic - - * mm-bodies.el (mm-decode-content-transfer-encoding): Recognize - `x-uue'. - -1999-03-04 Aaron M. Ucko - - * mail-source.el (mail-source-fetch-pop): Only prompt for password - when authentication is 'password. - -1999-05-01 22:17:55 - - * gnus-win.el (gnus-configure-windows): Accept a setting. - -1999-04-21 20:51:13 Lars Magne Ingebrigtsen - - * mm-util.el (mm-quote-arg): Moved here. - - * mm-decode.el (mm-quote-arg): Quote more chars. - -1999-04-18 20:12:49 Lars Magne Ingebrigtsen - - * nnheader.el (nnheader-parse-head): Message-ID in In-Reply-To - with newlines would create buggy .nov files. - - * gnus-art.el (gnus-article-date-lapsed-new-header): Default to nil. - - * qp.el (quoted-printable-encode-region): Encode whitespace at the - end of lines. - - * message.el (message-mode): Doc fix. - - * gnus-art.el (article-hide-headers): Delete the hidden headers. - - * gnus-msg.el (gnus-setup-posting-charset): Default group to "". - - * gnus-art.el (article-date-ut): Rewrite. - - * mm-decode.el (mm-preferred-alternative-precedence): Reverse the - order. - - * gnus-msg.el (gnus-message-insert-stylings): Remove duplicate - headers. - - * gnus-art.el (gnus-article-date-lapsed-new-header): Doc fix. - -1999-04-18 Didier Verna - - * gnus-art.el (gnus-article-date-lapsed-new-header): new variable. - (article-date-ut): use it. - -1999-04-18 20:06:20 Lars Magne Ingebrigtsen - - * mail-source.el (mail-source-fetch-pop): Call script - asynchronously. - -Sun Apr 18 12:40:04 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.83 is released. - -1999-04-18 10:55:57 Lars Magne Ingebrigtsen - - * gnus-draft.el (gnus-draft-mode): Use mml minor mode. - - * gnus-cite.el (gnus-dissect-cited-text): Off-by-one error. - - * gnus-uu.el (gnus-uu-mark-thread): Save hidden threads. - - * gnus-art.el (gnus-mime-inline-part): Don't do a charset param. - - * gnus-msg.el (gnus-bug): Use application/x-emacs-lisp. - - * message.el (message-generate-headers): Accept continuation - headers. - -1999-04-18 10:48:57 Renaud Rioboo - - * gnus-demon.el (gnus-demon-time-to-step): Not strings. - -1999-04-18 08:21:52 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-treatment-function-alist): use - maybe-hide-headers. - - * message.el (message-inhibit-body-encoding): Typo. - (message-resend): Inhibit encoding. - - * gnus-sum.el (gnus-summary-toggle-header): Decode rfc2047. - - * gnus-art.el (article-remove-cr): Use re-search. - - * rfc2231.el (rfc2231-parse-string): Allow broken elm MIME - headers. - - * mm-decode.el (mm-quote-arg): Quote '. - - * gnus-ems.el (gnus-x-splash): Would place splash wrongly. - - * mm-decode.el (mm-insert-part): Use multibyte for text. - - * gnus-start.el (gnus-read-newsrc-file): New variable. - (gnus-read-newsrc-file): Use it. - -1999-04-17 18:51:54 Lars Magne Ingebrigtsen - - * nnvirtual.el (nnvirtual-request-expire-articles): New function. - - * gnus-group.el (gnus-group-expire-articles-1): Made into own - function. - -Sat Apr 17 16:41:30 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.82 is released. - -1999-04-15 Hrvoje Niksic - - * gnus-sum.el (gnus-group-charset-alist): Include Croatian groups - for iso8859-2. - -1999-04-17 18:23:50 Lars Magne Ingebrigtsen - - * mm-util.el (mm-charset-synonym-alist): Remove iso-2022-jp-2 from - synonym alist. - -1999-04-17 18:03:38 Adam P. Jenkins - - * gnus-sum.el (gnus-summary-local-variables): Mark as global. - -1999-04-17 18:02:05 Ettore Perazzoli - - * mail-source.el (mail-source-fetch): Ask before bugging out. - -1999-03-19 Hrvoje Niksic - - * uudecode.el (uudecode-decode-region-external): Don't assume - uudecode-temporary-file-directory ends with a slash. - -1999-03-18 Simon Josefsson - - * gnus-sum.el (gnus-update-marks): - (gnus-update-read-articles): - (gnus-summary-expire-articles): Check server. - -1999-03-16 Simon Josefsson - - * mml.el (mml-preview): New function. - -1999-04-17 17:10:21 William M. Perry - - * mail-source.el (mail-source-fetch-file): Return the right - value. - -1999-04-17 07:52:17 Lars Magne Ingebrigtsen - - * mml.el (mml-insert-parameter): New function. - (mml-insert-parameter-string): New function. - - * nnmail.el (nnmail-get-new-mail): Say how many new articles. - - * gnus-art.el (gnus-mime-multipart-functions): New variable. - (gnus-mime-display-part): Use it. - - * mm-decode.el (mm-alternative-precedence): Removed. - (mm-discouraged-alternatives): New variable. - (mm-preferred-alternative-precedence): New function. - - * nnmail.el (nnmail-get-new-mail): Use mail-sources. - - * mail-source.el (mail-sources): New variable. - - * gnus-art.el (article-remove-cr): Remove several trailing CRs. - - * mm-decode.el (mm-valid-image-format-p): New function. - (mm-inline-media-tests): Use it. - (mm-valid-and-fit-image-p): New function. - - * gnus-agent.el (gnus-agent-fetch-groups): Error when unplugged. - (gnus-agent-fetch-group): Ditto. - -1999-04-12 Didier Verna - - * nnmail.el (nnmail-article-group): in case of a group name - containing "\\n" constructs, be sure to pass the expanded value to - nn*-save-mail. - -Sat Apr 17 05:40:45 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.81 is released. - -1999-04-16 15:54:02 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-get-split-value): Reverse result. - -1999-04-03 00:17:24 Lars Magne Ingebrigtsen - - * gnus-start.el (gnus-always-read-dribble-file): Doc fix. - -1999-04-02 15:33:43 Lars Magne Ingebrigtsen - - * mml.el (mml-insert-tag): Insert concluding part. - - * message.el (message-send-mail): Encode later. - (message-send-news): Ditto. - - * nnfolder.el: Don't use mail delim. - -1999-03-28 19:14:27 Lars Magne Ingebrigtsen - - * gnus-cus.el (gnus-group-customize): Put point at min. - - * mm-view.el (mm-inline-text): Allow toggling html. - -1999-03-28 17:11:15 William M. Perry - - * mail-source.el: Added prescript and postscript to file. - -1999-03-28 13:46:00 Lars Magne Ingebrigtsen - - * nnmail.el: Reverted. - - * gnus-msg.el (gnus-setup-posting-charset): Didn't work. - (gnus-setup-posting-charset): Did work. - -1999-03-28 13:19:50 Jae-you Chung - - * gnus.el (gnus-short-group-name): Use - gnus-group-uncollapsed-levels. - -1999-03-28 13:11:43 Lars Magne Ingebrigtsen - - * gnus-cite.el (gnus-dissect-cited-text): Don't remove overlays. - -1999-03-26 13:18:45 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-treat-strip-headers-in-body): New variable. - (article-strip-headers-from-body): New command and keystroke. - -1999-03-14 16:09:10 Lars Magne Ingebrigtsen - - * mail-source.el (mail-source-fetch-pop): Check for symbol first. - - * nnheader.el (nnheader-insert-file-contents): Bind - enable-local-eval to nil. - (nnheader-find-file-noselect): Ditto. - - * nnmail.el (nnmail-article-group): Don't remove long lines. - (nnmail-remove-long-lines): New function. - (nnmail-split-header-length-limit): Removed. - - * mml.el (mml-generate-mime-1): Use unibyte buffers. - - * gnus-group.el (gnus-group-kill-all-zombies): Query user. - -1999-03-06 07:20:05 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-generic-mark): New function. - - * nnmail.el (nnmail-split-header-length-limit): Increased. - (nnmail-article-group): Allow nil. - - * gnus-cite.el (gnus-cite-parse-wrapper): Inhibit point-motion. - - * nndoc.el (nndoc-generate-mime-parts-head): Insert real headers - first. - - * mml.el (mml-minibuffer-read-type): Include types from - mailcap-mime-data. - - * nndraft.el (nndraft-request-article): Would clobber Japanese. - -1999-03-05 Hrvoje Niksic - - * mml.el (mml-insert-tag): New function. - (mml-read-file): Renamed to mml-minibuffer-read-file to avoid - confusion with functions like `mml-read-tag'. - (mml-read-type): Ditto with `mml-minibuffer-read-type'. - (mml-minibuffer-read-description): Ditto with - `mml-minibuffer-read-description'. - (mml-attach-buffer): New function. - (mml-mode-map): New entry for /. - (mml-minibuffer-read-type): Accept DEFAULT. - - * mml.el (mml-quote-region): Narrow the region. - - * message.el (message-mode-menu): message-mime-attach-file is now - mml-attach-file. - -1999-03-05 21:24:23 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-treatment-function-alist): Do emphasis earlier. - -1999-03-05 21:08:10 Robert Bihlmeyer - - * mml.el (mml-attach-buffer): New command. - -1999-02-27 Simon Josefsson - - * gnus-sum.el (gnus-update-marks): Call gnus-remove-from-range - with a proper range. Compress range. - - * gnus-range.el (gnus-remove-from-range): Protect arguments. - -1999-03-05 20:59:54 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-get-image): Create a temporary file for xbms. - -1999-03-04 04:20:25 Lars Magne Ingebrigtsen - - * gnus-picon.el (gnus-picons-x-face-file-name): Removed. - (gnus-picons-convert-x-face): Removed. - (gnus-picons-article-display-x-face): Removed. - (gnus-picons-x-face-sentinel): Ditto. - (gnus-picons-display-x-face): Ditto. - -Thu Mar 4 01:38:00 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.80 is released. - -1999-03-02 16:04:30 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-mm-display-part): Narrow to the part itself. - - * gnus-sum.el (gnus-with-article): Moved here. - - * mail-source.el (mail-source-fetch-pop): Ask for password even - when program. - -1999-02-28 13:16:12 Lars Magne Ingebrigtsen - - * gnus-msg.el (gnus-bug): Add description. - - * mml.el (mml-insert-mml-markup): Insert disposition. - - * message.el (message-send-mail): Always encode mail headers. - - * smiley.el (gnus-smiley-display): Goto body. - -1999-02-28 13:15:47 Petr Konecny - - * smiley.el (gnus-smiley-display): Don't search to blank line. - -1999-02-28 00:38:40 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-treat-article): Only run the highlight stuff - when requested. - - * nnmail.el (nnmail-current-spool): Removed. - - * gnus-salt.el (gnus-tree-inhibit): New varible. - - * gnus.el (mm-util): Required. - -1999-02-27 23:44:52 paul stevenson - - * gnus-sum.el (gnus-summary-toggle-header): Narrow to head first. - -1999-02-27 17:17:47 Lars Magne Ingebrigtsen - - * mail-source.el (mail-source-bind): Doc fix. - -1999-02-26 20:35:57 Lars Magne Ingebrigtsen - - * message.el (message-mode): Doc fix. - - * mm-encode.el (mm-content-transfer-encoding-defaults): Use 8bit - encoding. - - * gnus.el (gnus-methods-equal-p): Moved here. - - * mail-source.el: pop at 110. - - * pop3.el (pop3-movemail): Use write-region instead of - append-to-file to avoid excessive messaging. - -1999-02-27 lantz moore - - * nnmail.el (nnmail-get-new-mail): honor suffix for spool-files of - type directory. - -1999-03-04 Robert Bihlmeyer - - * gnus-art.el (article-hide-boring-headers): Field names must not - contain whitespace. - -Fri Feb 26 18:54:16 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.79 is released. - -1999-02-26 18:11:04 Lars Magne Ingebrigtsen - - * gnus-cite.el (gnus-cite-toggle): Don't remove highlighting. - - * mml.el (mml-mode): Don't use add-minor-mode. - - * message.el (messgage-inhibit-body-encoding): New variable. - (message-encode-message-body): Use it. - -Fri Feb 26 17:00:25 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.78 is released. - -1999-02-26 07:45:30 Lars Magne Ingebrigtsen - - * message.el (message-mode): Switch on MML mode. - - * mml.el: Included commands and functions. - (mml-mode-map): New keymap. - - * message.el: Removed the insertion commands and functions. - - * gnus-ems.el (gnus-mule-cite-add-face): Removed. - - * gnus-sum.el (gnus-summary-sort-by-chars): New command and - keystroke. - - * gnus-art.el (gnus-narrow-to-page): Revert. - - * gnus-cite.el (gnus-cite-delete-overlays): New function. - (gnus-cite-parse-maybe): Always reparse. - - * message.el (message-encode-message-body): Don't insert - "multipart warning". - - * gnus-art.el (gnus-article-treat-head-custom): New variable. - -1999-02-25 Miles Bader - - * mail-source.el (mail-source-fetch-pop): Return 1 for success. - - * nnmail.el: Require mm-util. - -1999-02-26 07:39:33 Justin Sheehy - - * nnmail.el (nnmail-get-new-mail): Only get mail for the one - group. - -1999-02-26 07:38:08 SeokChan LEE - - * mm-bodies.el (mm-body-charset-encoding-alist): Add euc-kr. - -1999-02-21 Simon Josefsson - - * gnus-msg.el (gnus-extended-version): Better regexp. - -1999-02-25 Didier Verna - - * nnmail.el (nnmail-split-it): new syntax: `(! FUNC SPLIT)'. FUNC - is called with the result of SPLIT and should return a new split. - - * gnus.texi: update the doc. - -1999-02-23 Didier Verna - - * gnus-picon.el (gnus-picons-display-bar-p): when picons are - displayed in the article buffer, output bars if - `gnus-picons-display-article-move-p'. - -1999-02-20 Aaron M. Ucko - - * mail-source.el (mail-source-fetch-pop): Typo. - -1999-02-26 07:15:12 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-toggle-header): Save restriction. - -1999-02-23 03:07:58 Lars Magne Ingebrigtsen - - * gnus-cite.el (gnus-cite-parse-wrapper): Always parse. - -1999-02-21 11:11:39 Lars Magne Ingebrigtsen - - * mml.el (mml-insert-buffer): New function. - - * message.el (message-forward): Insert the buffer in the buffer. - -Sun Feb 21 01:20:50 1999 Shenghuo ZHU - - * mm-view.el (mm-inline-message): Insert part in narrowed region. - -Sat Feb 20 23:09:40 1999 Shenghuo ZHU - - * gnus-sum.el (gnus-summary-toggle-header): Save restriction. - -Sat Feb 20 21:34:28 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.77 is released. - -1999-02-20 17:32:17 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-displaying-mime): New variable. - (article-narrow-to-head): New function. - - * mail-source.el (mail-source-fetch-pop): Include pre/postscript. - Default to pop instead of pop3. - -1999-02-19 16:16:04 Lars Magne Ingebrigtsen - - * gnus-art.el (article-hide-pgp): Goto body. - - * gnus-uu.el (gnus-uu-digest-mail-forward): Don't kill buffer. - - * gnus-cite.el: Don't use goto-line. - - * gnus-art.el (gnus-article-treat-html): Removed. - (gnus-treat-article): Save restriction. - -1999-02-17 Per Abrahamsen - - * message.el (message-send-mail): Don't untabify. - (message-mode): Don't use tabs for indentation. - -1999-02-19 14:54:13 Lars Magne Ingebrigtsen - - * message.el (message-send-mail): Don't untabify. - - * nnml.el (nnml-save-mail): Typo fix. - -1999-02-19 Per Abrahamsen - - * message.el (message-cite-function): Add - `message-cite-original-without-signature' customization option. - -1999-02-18 Per Abrahamsen - - * nnmail.el (nnmail-fix-eudora-headers): Mark as option to - `nnmail-prepare-incoming-header-hook'. - -1999-02-19 14:41:43 Justin Sheehy - - * gnus-util.el (gnus-make-sort-function-1): Typo fix. - -1999-02-19 14:40:37 Lars Magne Ingebrigtsen - - * gnus-group.el (gnus-group-get-new-news): Require nnmail. - -1999-02-18 Michael Cook - - * Recognize Microsoft Outlook's cite attribution conventions. - -1999-02-19 14:33:11 James H. Cloos, Jr. - - * gnus-sum.el: Bind M. - -1999-02-19 14:31:29 Neil Crellin - - * mail-source.el (mail-source-fetch-pop): Bind pop3-port. - -1999-02-15 Didier Verna - - * gnus-picon.el (gnus-group-display-picons): ensures that - `article-goto-body' really goes to the article body. - -1999-02-19 12:57:19 Lars Magne Ingebrigtsen - - * mm-view.el (mm-inline-text): Bind url-standalone-mode. - - * gnus-msg.el (gnus-summary-mail-forward): Create unique names. - - * mm-view.el (mm-view-message): Enable multibyte. - -1999-02-11 18:37:15 Lars Magne Ingebrigtsen - - * nnmail.el (nnmail-get-new-mail): Message later. - - * mm-util.el (mm-find-charset-region): Revert to checking - multibyte. - -1999-02-11 Matt Pharr - - * gnus-msg.el (gnus-bug): Encode environment info as a MIME - attachment. - -Thu Feb 11 04:58:51 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.76 is released. - -1999-02-06 Felix Lee - - * gnus.el (gnus-group-change-level-function): Typo. - -1999-02-11 05:47:51 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-nov-skip-field): Removed. - (gnus-nov-field): Ditto. - (gnus-nov-parse-extra): Ditto. - (gnus-nov-read-integer): Ditto. - -1999-02-05 09:44:20 Katsumi Yamaoka - - * nnheader.el (nnheader-nov-read-message-id): New macro. - (nnheader-parse-nov): Use it. - - * gnus-sum.el (gnus-nov-read-message-id): New macro. - (gnus-nov-parse-line): Use it; use `(eobp)' instead of - `(eq (char-after) ?\n)'. - -1999-02-11 05:16:26 Lars Magne Ingebrigtsen - - * gnus.el (gnus-other-frame): Always pop up a new frame. - -Wed Feb 10 01:03:43 1999 Shenghuo ZHU - - * gnus-range.el (gnus-range-add): Rewrite. - -1999-02-02 18:12:00 Carsten Leonhardt - - * nnmail.el (nnmail-split-incoming): Added detection of maildir - format. - (nnmail-process-maildir-mail-format): New function. - - * mail-source.el (mail-source-fetch-maildir): New function. - (mail-source-keyword-map): Add default for maildir method. - (mail-source-fetcher-alist): Changed "qmail" to "maildir". - -1999-02-10 02:29:28 Lars Magne Ingebrigtsen - - * mail-source.el (mail-source-fetcher-alist): Remove apop. - - * nndoc.el (nndoc-type-alist): Remove MIME-digest. - (nndoc-mime-digest-type-p): Removed. - -1999-02-09 15:25:52 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-read-summary-keys): Set the point - where it is supposed to be. - (gnus-treat-play-sounds): New variable. - - * gnus-sum.el (gnus-newsgroup-ignored-charsets): New variable. - - * gnus-art.el (article-display-x-face): Narrow to head. - (gnus-article-washed-types): New variable. - (article-hide-pgp): Is not a toggle. - (gnus-article-hide-text-type): Save types. - (article-decode-charset): Use it. - - * nnmail.el (nnmail-get-new-mail): Ignore procmail. - - * message.el (message-forward-start-separator): Removed. - (message-forward-end-separator): Removed. - (message-signature-before-forwarded-message): Removed. - (message-included-forward-headers): Removed. - (message-check-news-body-syntax): Don't check forward. - (message-forward): Use MIME. - - * nnvirtual.el (nnvirtual-request-article): Bind - gnus-article-decode-hook to nil. - -1999-02-06 16:55:25 Lars Magne Ingebrigtsen - - * mml.el (mml-parse-singlepart-with-multiple-charsets): Check for - us-ascii. - -1999-02-04 00:00:35 Lars Magne Ingebrigtsen - - * format-spec.el (format-spec): Be more robust. - - * message.el (message-encode-message-body): Default - mail-parse-charset to mail-parse-charset. - - * gnus-sum.el (gnus-summary-edit-article-done): Don't encode. - (gnus-summary-edit-article): Bind mail-parse-charset. - - * mml.el (mml-read-tag): Ignore white space after end of tag. - - * message.el (message-goto-body): Also work in separatorless - articles. - - * mml.el (mml-translate-from-mime): New function. - (mml-insert-mime): Ditto. - (mml-to-mime): New function. - (mime-to-mml): New name. - - * gnus-sum.el (gnus-summary-edit-article): Always select raw - article. - - * gnus-group.el (gnus-group-catchup-current): Unmark groups. - - * gnus-sum.el (gnus-summary-setup-default-charset): Don't - special-case nndraft groups. - -1999-02-03 16:44:19 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-get-newsgroup-headers): Bind charset. - (gnus-get-newsgroup-headers): Already bound. - - * message.el (message-encode-message-body): Use posting charset. - - * mm-bodies.el (mm-encode-body): Use MIME charsets. - (mm-body-encoding): Do CTE. - (mm-body-7-or-8): New function. - - * mm-util.el (mm-mime-charset): Always fall back on alist. - (mm-mime-mule-charset-alist): Include katakana-jisx0201. - (mm-mime-mule-charset-alist): Add arabic-*-column. - (mm-find-mime-charset-region): New function. - - * format-spec.el (format-spec-make): New function. - - * mail-source.el (format-spec): Required. - (mail-source-fetch-with-program): Removed. - (mail-source-fetch-with-program): New function. - - * format-spec.el: New file. - -1999-02-03 16:00:41 Tatsuya Ichikawa - - * mail-source.el (mail-source-fetch-with-program): Take optional - parameter. - -1999-02-03 00:31:21 Lars Magne Ingebrigtsen - - * gnus-start.el: Ignore some groups. - (gnus-setup-news): Bind nnmail-fetched-sources. - - * message.el (message-send-mail): Remove all tabs. - - * mm-util.el (mm-find-charset-region): Just check whether - find-charset-region is defined. - -1999-02-02 23:35:20 Lars Magne Ingebrigtsen - - * gnus-group.el (gnus-group-get-new-news): Use - nnmail-fetched-sources. - - * nnmail.el (nnmail-fetched-sources): New variable. - (nnmail-get-new-mail): Use it. - - * mail-source.el (mail-source-fetched-sources): New variable. - (mail-source-fetch): Use it. - -1999-02-02 23:20:20 Mark W. Eichin - - * gnus.el (gnus-getenv-nntpserver): if the file that - gnus-nntpserver-file names has a trailing newline, the - string-match will always match, and thus the file will never be - read. (^ matches start of "line", \\` matches start of "buffer", - which is what was intended...) - -1999-02-02 23:17:40 Kim-Minh Kaplan - - * gnus-picon.el (gnus-picons-parse-filenames): Quote group names. - -1999-01-28 04:15:46 Katsumi Yamaoka - - * gnus-start.el (gnus-read-active-file): Eliminate duplicated - select methods. - -1999-01-27 Simon Josefsson - - * gnus-range.el (gnus-remove-from-range): Sort second argument. - -1999-02-02 10:55:23 Scott Hofmann - - * nntp.el: Use mail-source-read-passwd instead of nnmail-read-passwd. - -Mon Feb 1 23:23:03 1999 Shenghuo ZHU - - * gnus-cus.el (gnus-group-parameters): Charset as symbol, and fix - a typo. - * gnus-sum.el (gnus-summary-setup-default-charset): Set nndraft's - charset to nil. - * gnus-agent.el (gnus-agent-queue-setup): Remove charset setting. - * gnus-start.el (gnus-start-draft-setup): Ditto. - -1999-02-02 22:13:14 Lars Magne Ingebrigtsen - - * mail-source.el (mail-source-fetch-directory): Use the predicate. - (mail-source-value): Don't do variables. - - * nnmail.el (nnmail-get-new-mail): Set the predicate. - - * gnus-sum.el (gnus-summary-toggle-header): Fix, and bound to t. - -1999-02-01 Michael Cook - - * Defenestrate spurious ?a. - -1999-02-02 21:59:51 Lars Magne Ingebrigtsen - - * mail-source.el (mail-source-fetch-pop): Instead use - :authentication. - -1999-02-01 Tatsuya Ichikawa - - * lisp/mail-source.el : Support APOP authentication scheme. - -1999-02-02 21:56:14 Tatsuya Ichikawa - - * pop3.el (pop3-movemail): Return t. - -1999-02-02 21:48:46 Lars Magne Ingebrigtsen - - * rfc2047.el (rfc2047-fold-region): New function. - (rfc2047-encode-message-header): Use it. - -1999-02-02 21:07:27 Hallvard B. Furuseth - - * gnus-sum.el (gnus-group-charset-alist): Add more. - -Mon Feb 1 21:18:00 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.75 is released. - -1999-02-01 21:54:26 Lars Magne Ingebrigtsen - - * gnus-art.el (article-display-x-face): Don't narrow to head. - -1999-02-01 21:48:39 Michael Cook - - * gnus-cite.el (gnus-cited-lines-visible): Accept a cons. - -1999-02-01 20:59:38 Lars Magne Ingebrigtsen - - * mail-source.el (mail-source-fetch-directory): Ignore - directories. - - * gnus-cus.el (gnus-group-parameters): Addition. - - * gnus-art.el (article-strip-banner): Do symbolic banners. - (article-strip-banner): New keystroke. - -1999-02-01 20:54:32 Michael Cook - - * gnus-art.el (article-strip-banner): New command. - -1999-02-01 20:53:45 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-treat-strip-banners): New variable. - -1999-01-28 05:34:56 Katsumi Yamaoka - - * mail-source.el (mail-source-read-passwd): Use `read-passwd' if it - has been exist. - -Thu Jan 28 01:38:34 1999 Shenghuo ZHU - - * message.el (message-draft-coding-system): Check coding-system. - * mm-util.el (mm-text-coding-system): Ditto. - -1999-01-28 12:11:31 Katsumi Yamaoka - - * mail-source.el (mail-source-fetch-pop): Save excursion. - -1999-01-28 08:14:21 Lars Magne Ingebrigtsen - - * mail-source.el (mail-source-movemail-args): Not constant. - (mail-source-movemail-args): Removed. - (mail-source-fetch-with-program): New function. - (mail-source-fetch-pop): Use program and function. - (mail-source-movemail-program): Removed. - - * gnus-art.el (gnus-treat-date-iso8601): New variable. - (gnus-treat-date-user-defined): New variable. - -1999-01-28 08:07:12 Per Abrahamsen - - * nnmail.el (nnmail-fix-eudora-headers): New function. - -1999-01-28 08:05:19 Lars Magne Ingebrigtsen - - * mm-bodies.el (mm-encode-body): Use mail-parse-charset. - -1999-01-27 08:06:38 Lars Magne Ingebrigtsen - - * smiley.el (smiley-deformed-regexp-alist): Removed =>. - (smiley-nosey-regexp-alist): Ditto. - - * gnus-art.el (gnus-treatment-function-alist): Do - gnus-article-add-buttons-to-head later. - (gnus-treat-capitalize-sentences): New variable. - (article-capitalize-sentences): New command and keystroke. - - * gnus-group.el (gnus-group-catchup-current): Do group. - - * message.el (message-default-charset): Add group. - -Wed Jan 27 05:24:53 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.74 is released. - -1999-01-27 05:56:29 Lars Magne Ingebrigtsen - - * gnus-art.el (article-fill-long-lines): Renamed. - (article-fill-long-lines): New keystroke. - -1999-01-26 06:35:07 Lars Magne Ingebrigtsen - - * gnus-msg.el (gnus-setup-posting-charset): Check for group. - - * gnus-group.el (gnus-group-catchup-current): Skip groups now - displayed. - (gnus-group-catchup-current): Be more robus. - - * gnus-sum.el (gnus-summary-select-article): Reselect for showing - headers. - -1999-01-25 Dave Love - - * message.el (message-mode-menu): Add message-mime-attach-file. - (message-mode): Doc fix. - -1999-01-26 05:24:19 Lars Magne Ingebrigtsen - - * nnmail.el (nnmail-check-duplication): Insert the mail source - string. - - * mail-source.el (mail-source-fetch-pop): Bind mail-source-string. - (mail-source-fetch-directory): Ditto. - (mail-source-fetch-file): Ditto. - (mail-source-string): New variable. - - * gnus-start.el (gnus-get-unread-articles): Nix out groups over - the level. - - * rfc2047.el (rfc2047-encodable-p): Convert to MIME charsets - before handling. - - * mm-util.el (mm-mime-charset): Use the parameters. - (mm-mime-charset): Removed region paremeters. - - * nnmail.el (nnmail-get-new-mail): Don't message the entire - source. - -1999-01-25 12:05:16 Lloyd Zusman - - * nnmail.el (nnmail-get-split-group): Quote right. - -1999-01-25 05:55:41 Lars Magne Ingebrigtsen - - * mail-source.el (mail-source-movemail): Would kill an arbitrary - buffer. - -1999-01-24 03:02:31 Lars Magne Ingebrigtsen - - * gnus-group.el (gnus-clear-inboxes-moved): Removed. - (gnus-group-mode): Don't hook. - - * mail-source.el (mail-source-bind): Doc fix. - (mail-source-bind): Take only one param. - - * gnus-art.el (gnus-treat-highlight-signature): typep. - - * mail-source.el (mail-source-movemail): Ignore empty file. - (mail-source-callback): Check before deleting. - - * message.el (message-mime-attach-file): Include name. - -1999-01-23 17:01:12 Lars Magne Ingebrigtsen - - * mm-util.el (mm-read-charset): Return a symbol. - - * mm-view.el (mm-inline-text): Insert signature separator. - - * gnus-art.el (gnus-treat-predicate): New function. - (gnus-treat-article): Allow all types to be checked. - - * gnus-util.el (gnus-or): New function. - (gnus-and): Ditto. - - * gnus-art.el (gnus-mime-display-single): Use override. - - * mm-decode.el (mm-attachment-override-types): New variable. - (mm-attachment-override-p): New function. - - * gnus-picon.el (gnus-group-display-picons): Don't go backward. - -1999-01-23 16:45:06 Andrew J. Cosgriff - - * mm-view.el (mm-inline-text): Do vcards. - -Sat Jan 23 14:23:27 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.73 is released. - -1999-01-23 11:38:36 Lars Magne Ingebrigtsen - - * nnmail.el (nnmail-spool-file): Changed to use mail-source. - (nnmail-crash-box, nnmail-use-procmail, nnmail-procmail-directory, - nnmail-procmail-suffix, nnmail-resplit-incoming): Removed. - (nnmail-movemail-program): Removed. - (nnmail-movemail-args): Removed. - (nnmail-pop-password-required): Ditto. - (nnmail-tmp-directory): Ditto. - (nnmail-delete-incoming): Removed. - (nnmail-pop-password, nnmail-moved-inboxes, - nnmail-internal-password, nnmail-move-inbox): Removed. - (nnmail-read-passwd): Ditto. - (nnmail-get-spool-files): Removed. - (nnmail-resplit-incoming): Reinstated. - - * mail-source.el: New file. - -1999-01-23 09:08:31 James H. Cloos, Jr. - - * gnus-art.el (gnus-article-mode-map): Bind backspace. - -1999-01-23 09:05:04 Lars Magne Ingebrigtsen - - * gnus-art.el (article-make-date-line): Fix iso8601 display. - -1999-01-20 02:53:52 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-treat-display-smileys): Check xpm. - - * gnus-picon.el (gnus-group-display-picons): Goto body. - - * gnus.el: Indented all functions; broke long lines; changed all - instances of illegal/legal to invalid/valid. Yes, I'm bored. - -Wed Jan 20 00:50:53 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.72 is released. - -1999-01-20 01:39:48 Lars Magne Ingebrigtsen - - * gnus.el: Cleaned up trailing whitespace. - - * mm-util.el (mm-read-charset): Work. - -1999-01-17 Matt Armstrong - - * gnus-score.el (gnus-score-find-bnews): Match regexp on the - nnheader-translate-file-chars'd group name. - -1999-01-20 01:30:30 Lars Magne Ingebrigtsen - - * message.el (message-encode-message-body): Fold case. - -1999-01-20 01:28:16 Alexei V. Barantsev - - * gnus-xmas.el (gnus-xmas-modeline-glyph): Backquote. - -1999-01-20 00:46:15 Lars Magne Ingebrigtsen - - * mailcap.el (mailcap-add): New function. - -1999-01-18 09:40:37 Lars Magne Ingebrigtsen - - * gnus-art.el (article-goto-body-goes-to-point-min-p): New variable. - (article-goto-body): Use it. - (gnus-treat-article): Ditto. - - * gnus-agent.el (gnus-agent-get-undownloaded-list): Remove the - downloaded articles from the downloadeble list. - -1999-01-16 17:31:08 Lars Magne Ingebrigtsen - - * message.el (message-encode-message-body): Bind - mail-parse-charset. - - * mm-util.el (mm-charset-synonym-alist): New variable. - (mm-charset-to-coding-system): Use it. - (mm-charset-coding-system-alist): Removed. - (mm-charset-to-coding-system): Don't use it. - (mm-find-charset-region): Use mail-parse-charset. - - * gnus-art.el (gnus-treatment-function-alist): Use - gnus-article-display-picons. - (gnus-treat-display-xface): Only do if we have xface feature. - (gnus-part-display-hook): New function. - (gnus-treat-article): Use it. - (gnus-treat-article): Use gnus-visual. - - * gnus-msg.el (gnus-setup-posting-charset): Check elem. - - * gnus-art.el (gnus-mm-display-part): Fix the MIME button after - displaying. - - * mm-decode.el (mm-insert-part): Use insert-buffer-substring. - - * gnus-score.el (gnus-score-find-bnews): Protect against invalid - regexp file names. - -Sat Jan 16 03:15:57 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.71 is released. - -1999-01-16 00:13:31 Lars Magne Ingebrigtsen - - * mm-view.el (mm-inline-image): Don't add a dot. - - * gnus-art.el (gnus-treat-article): New function. - - * gnus.el (gnus-article-display-hook): Removed. - - * gnus-art.el (gnus-article-treat-custom): New variable. - - * gnus-start.el (gnus-ignored-newsgroups-has-to-p): Removed. - - * gnus-msg.el (gnus-setup-posting-charset): Allow variables and - functions. - - * message.el (message-posting-charset): New variable. - (message-send-mail): Use it. - - * gnus-msg.el (gnus-group-posting-charset-alist): Moved here. - (gnus-setup-posting-charset): New function. - (gnus-setup-message): Use it. - - * message.el (message-encode-message-body): Just look for - Content-Type before inserting a new one. - -1999-01-15 23:08:47 Lars Magne Ingebrigtsen - - * rfc2047.el (rfc2047-default-charset): Removed. - - * mail-prsvr.el: New file. - (mail-parse-charset): New variable. - - * gnus-sum.el (gnus-newsgroup-charset): Changed name. - Changed name. - - * gnus.el (gnus-charset): New group. - - * nnmail.el (nnmail-pathname-coding-system): Default to binary. - - * gnus-sum.el (gnus-default-charset): Default to nil. - (gnus-newsgroup-iso-8859-1-forced-regexp): Removed. - (gnus-newsgroup-iso-8859-1-forced): Removed. - - * mm-util.el (mm-known-charsets): Removed. - (mm-default-coding-system): Removed. - (mm-default-charset): Removed. - (mm-read-charset): New function. - - * message.el (message-default-charset): Removed. - - * rfc2047.el (rfc2047-default-charset): Default to nil. - - * mm-util.el (mm-charset-iso-8859-1-forced): Removed. - -Fri Jan 15 20:50:38 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.70 is released. - -1999-01-15 00:06:04 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-save-part): Use mm-get-part. - (mm-insert-part): New function. - (mm-get-part): Use it. - (mm-get-image): Ditto. - (mm-display-external): Ditto. - - * mm-view.el (mm-inline-text): Ditto. - - * gnus-move.el (gnus-move-group-to-server): Protect against nil - ranges. - - * mm-decode.el (mm-display-external): Save the buffer. - (mm-remove-part): Kill it. - - * qp.el (quoted-printable-decode-region): Do the right thing at eobp. - - * nnagent.el (nnagent-request-set-mark): Defined stub. - -1999-01-14 23:05:31 Lars Magne Ingebrigtsen - - * gnus-score.el (gnus-score-load-score-alist): Bind - coding-system-for-read. - - * gnus-sum.el (gnus-summary-exit): Do adaptive scoring before - prepare-exit-hook. - - * mm-view.el (mm-setup-w3): Require w3. - -1999-01-13 Kiyokazu SUTO - - * lisp/nnspool.el (nnspool-retrieve-headers): Protect against empty - body. - -1999-01-14 21:17:35 Lars Magne Ingebrigtsen - - * mm-encode.el: Ditto. - - * mm-bodies.el (mm-decode-content-transfer-encoding): Message the - error. - - * mailcap.el (mailcap-mime-data): SAFER ps. - - * message.el (message-encode-message-body): Always insert a - Content-Type header. - - * mm-decode.el (mm-inline-media-tests): Default all text/* to be - shown inline. - - * mm-view.el (mm-inline-text): Handle all sorts of text. - - * mailcap.el (mailcap-mime-data): non-viewer for viewers that - don't view. - - * mm-decode.el (mm-display-external): Use it. - - * gnus-art.el (gnus-visible-headers): Added bcc, gcc, fcc. - - * mm-decode.el (mm-save-part): Removed double code. - -1999-01-12 Dave Love - - * mm-decode.el (mm-save-part): Avoid doubly-compressed - application/octet-stream .gz & al files with jka-compr. - -1999-01-12 Dave Love - - * gnus-ems.el (gnus-down-mouse-3): New variable. - * gnus-art.el (gnus-mime-button-map): Use it. - (gnus-mime-button-menu): Set the clicked-on buffer initially. - -1999-01-13 19:41:57 Lars Magne Ingebrigtsen - - * mailcap.el (mailcap-mime-data): Added ImageMagic and ee. - -1999-01-12 17:34:43 Lars Magne Ingebrigtsen - - * gnus-picon.el (gnus-picons-kill-buffer): Don't kill article - buffers. - - * gnus-sum.el (gnus-summary-exit): Destroy all MIME. - - * gnus-cache.el (gnus-cache-read-active): Reversed check. - -1999-01-12 17:18:25 Matt Armstrong - - * mml.el (mml-parameter-string): Strip directory component. - -1999-01-12 17:02:58 Lars Magne Ingebrigtsen - - * gnus.el (gnus-use-demon): Removed. - -1999-01-12 05:53:23 Katsumi Yamaoka - - * nnmail.el (nnmail-article-group): Don't infloop. - -1999-01-11 Colin Rafferty - - * gnus-art.el (article-update-date-lapsed): Made it work with - picons, and make it update on all visible frames. - (article-date-ut): Get summary-buffer's current-headers. - -1999-01-12 07:20:31 Lars Magne Ingebrigtsen - - * gnus-picon.el (gnus-picons-setup-buffer): Don't set major mode. - (gnus-picons-setup-p): New variable. - -1999-01-11 02:13:12 Lars Magne Ingebrigtsen - - * nnmail.el (nnmail-split-header-length-limit): Lowered to 512. - -1999-01-04 12:58:13 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-exit-no-update): Don't use run-hooks. - (gnus-summary-exit-no-update): Use mapcar. - -1999-01-02 14:36:32 Simon Josefsson - - * gnus-agent.el (gnus-category-write): Make directory. - -1998-09-26 19:39:31 Simon Josefsson - - * gnus-sum.el (gnus-update-read-articles): - (gnus-update-marks): Request backend update of mark. - -1999-01-03 15:29:52 Lars Magne Ingebrigtsen - - * mm-bodies.el (mm-body-encoding): Use mm-find. - -1999-01-03 15:28:27 Kim-Minh Kaplan - - * gnus-picon.el (gnus-article-display-picons): Fix. - -Sun Jan 3 13:32:02 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.69 is released. - -1999-01-03 06:45:10 Lars Magne Ingebrigtsen - - * gnus-picon.el (gnus-picons-setup-buffer): Run the hook. - - * gnus-agent.el (gnus-agent-remove-group): New command and - keystroke. - - * rfc2047.el (rfc2047-decode-region): Check for us-ascii. - -1999-01-02 14:12:41 Simon Josefsson - - * gnus-agent.el (gnus-agent-write-servers): Make directory. - -1998-12-26 02:38:01 Lars Magne Ingebrigtsen - - * mm-view.el (mm-inline-text): Bind current id. - - * mm-decode.el (mm-handle-id): New macro. - (mm-make-handle): Accept id. - (mm-dissect-singlepart): Use it. - -1998-12-23 Matt Pharr - - * message.el (message-cite-original-without-signature): Use - message-signature-separator when searching for signature in - message-cite-original-without-signature. - -1998-12-24 16:25:38 Simon Josefsson - - * gnus.el (gnus-server-to-method): Check named methods. - -1998-12-24 03:27:02 Lars Magne Ingebrigtsen - - * mm-view.el (mm-view-message): Goto point-min. - - * nnmail.el (nnmail-article-group): Don't delete lines, only - shorten them. - - * gnus-msg.el (gnus-configure-posting-styles): Also do nil - values. - - * nnheader.el (nnheader-temp-directory): New variable. - (nnheader-temp-directory): Removed. - -1998-12-22 Jack Vinson - - * mailcap.el (mailcap-parse-mailcaps): Add "~/.mailcaps" to the - list of files to check for mailcap entries under windows-nt. - -1998-12-24 03:02:15 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-maybe-hide-headers): Check whether the - summary buffer exists. - -1998-12-22 Aaron M. Ucko - - * nnsoup.el (nnsoup-store-reply): Remove code to deal with - irrelevant Sun sendmail bug. - (nnsoup-store-reply): Stop mucking with mail-header-separator. - - * message.el (message-send-news): Bind mail-header-separator to - "" when asking backend to post. - -1998-12-22 Karl Kleinpaste - - * mm-uu.el (mm-dissect-disposition): New variable. - (mm-uu-dissect): Use it. - -1998-12-21 21:34:22 Lars Magne Ingebrigtsen - - * mm-view.el (mm-inline-text): Bind url-current-object. - -1998-12-06 03:05:41 Simon Josefsson - - * gnus-range.el (gnus-remove-from-range): Rewrite. - -1998-12-09 SL Baur - - * gnus-picon.el (annotations): Remove bogus require 'xpm. - -1998-12-18 Hrvoje Niksic - - * message.el (message-encode-message-body): Insert `MIME-Version' - instead of `Mime-Version'. - -1998-12-04 Hrvoje Niksic - - * message.el (message-insert-mime-part): Add the attachment - disposition. - (message-insert-mime-part): Make TYPE and DESCRIPTION optional. - (message-mime-query-type): New function. - (message-mime-query-description): Ditto. - (message-mime-query-file): Ditto. - (message-insert-mime-part): Use them. - (message-mime-insert-external): Use the new stuff. - -1998-12-19 23:02:26 Lars Magne Ingebrigtsen - - * nnmail.el (nnmail-split-header-length-limit): New variable. - - * mm-decode.el (mm-dissect-buffer): Check syntax. - - * rfc2231.el (rfc2231-parse-string): Remove check for syntax. - - * rfc2047.el (rfc2047-encodable-p): Use mm-find-charset-region. - (rfc2047-dissect-region): Ditto. - -1998-12-17 18:36:43 Lars Magne Ingebrigtsen - - * mm-view.el (mm-view-message): Decode charset. - -1998-12-16 16:01:22 Lars Magne Ingebrigtsen - - * rfc2231.el (rfc2231-parse-string): Ignore syntactically invalid - CT headers. - -Wed Dec 16 01:44:40 1998 Shenghuo ZHU - - * mm-bodies.el (mm-decode-content-transfer-encoding): Use - mm-uu-*-function. - * mm-uu.el (mm-uu-dissect): Use x-uuencode. - -1998-12-16 10:20:52 Lars Magne Ingebrigtsen - - * message.el (message-send-mail): Do MML first. - (message-send-news): Ditto. - -1998-12-15 20:57:18 Lars Magne Ingebrigtsen - - * gnus-picon.el (gnus-picons-face): New face. - (gnus-picons-try-face): Use it. - -Tue Dec 15 19:17:43 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.68 is released. - -Tue Dec 15 18:28:24 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.67 is released. - -Tue Dec 15 17:31:44 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.66 is released. - -1998-12-13 11:00:43 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-insert-mime-button): Decode description. - -Sat Dec 5 16:50:49 1998 Shenghuo ZHU - - * gnus-art.el (article-decode-encoded-words): Rollback to 0.55. - (gnus-decode-header-methods): Ditto. - (gnus-decode-with-mail-decode-encoded-word-region): Ditto. - -1998-12-13 10:04:39 Lloyd Zusman - - * gnus-xmas.el (gnus-xmas-summary-recenter): Allow numbers. - -1998-12-13 09:32:38 Lars Magne Ingebrigtsen - - * mml.el (mml-insert-mime-headers): Encode description. - - * nnfolder.el (nnfolder-request-expire-articles): Go to the date - line. - - * gnus-sum.el (gnus-default-charset): Doc fix. - -Wed Dec 9 15:18:39 1998 Shenghuo ZHU - - * mm-decode.el (mm-display-part): Forward a line. - -Wed Dec 9 13:30:29 1998 Shenghuo ZHU - - * mm-util.el (mm-running-ntemacs): New variable. - (mm-text-coding-system): Ditto. - * nnmail.el (nnmail-incoming-coding-system): Ditto. - (nnmail-split-incoming): Use nnmail-incoming-coding-system. - -1998-12-13 08:52:45 Lars Magne Ingebrigtsen - - * gnus-picon.el (gnus-picons-network-display-internal): Don't set - buffer. - - * message.el (message-insert-headers): New command and keystroke. - -1998-12-07 23:42:14 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-inline-media-tests): Recognize x-xbitmap. - (mm-get-image): Ditto. - - * mm-bodies.el (mm-decode-content-transfer-encoding): Only for - base64, uudecode and binhex. - -Sun Dec 6 21:58:31 1998 Shenghuo ZHU - - * mm-bodies.el (mm-decode-content-transfer-encoding): Replace CRLF - in text/plain. - * mm-uu.el (mm-uu-dissect): Use inline. - -1998-12-07 23:19:14 Lars Magne Ingebrigtsen - - * mm-view.el (mm-view-message): New function. - - * mm-encode.el (mm-content-transfer-encoding-defaults): Changed to - qp. - -1998-12-07 Karl Kleinpaste - - * mm-encode.el (mm-content-transfer-encoding-defaults): Add an - entry for message/rfc822 as 8bit. - -1998-12-07 23:16:54 Lars Magne Ingebrigtsen - - * mailcap.el (mailcap-mime-extensions): Add patch. - -1998-12-05 Dale Hagglund - - * gnus-sum.el (gnus-summary-display-buttonized): Use prefix - argument to force all multipart/* to look like multipart/mixed. - - * gnus-art.el (gnus-mime-display-multipart-as-mixed): New - variable. - (gnus-mime-display-part): Use it. - -1998-12-07 22:46:37 Lars Magne Ingebrigtsen - - * gnus-draft.el (gnus-draft-send): Only disable checks for - non-interactive use. - (gnus-draft-send-message): Use it. - -Sun Dec 6 19:36:53 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.65 is released. - -1998-12-06 20:11:02 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-prepare-display): Don't init w3. - - * mm-view.el (mm-inline-text): Bind url-standalone-mode here. - -Sat Dec 5 18:35:42 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.64 is released. - -1998-12-05 18:51:13 Lars Magne Ingebrigtsen - - * mm-view.el (mm-setup-w3): Don't load. - - * gnus-msg.el (gnus-setup-message): Set group name. - (gnus-group-mail): Avoid leaking local vars. - - * message.el (message-attach-file): Renamed. - (message-mime-attach-file): Renamed again. - -1998-12-05 Hrvoje Niksic - - * gnus-art.el (article-decode-encoded-words): Bind - rfc2047-default-charset here. - - * gnus-art.el (gnus-insert-mime-button): Nix slashes in file name. - -1998-12-05 18:33:27 Lars Magne Ingebrigtsen - - * gnus-picon.el (gnus-picons-setup-buffer): Run picons hook. - (gnus-picons-setup-hook): New hook. - -1998-12-05 Per Abrahamsen - - * mailcap.el (mailcap-mime-data): Remove "*" from documentation - string. - (mailcap-mime-extensions): Ditto. Made first sentense fit a - line. - -1998-12-05 17:11:04 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-prepare-display): Setup w3. - (gnus-mime-view-part): Ditto. - (gnus-mime-inline-part): Dotii. - (gnus-mime-externalize-part): Daddo. - (gnus-mime-internalize-part): Tutti frutti. - (gnus-widget-press-button): Da da do. - - * mm-view.el (mm-setup-w3): Require url-vars. - -Fri Dec 4 12:13:12 1998 Shenghuo ZHU - - * message.el (message-draft-coding-system): Fix for XEmacs-NT. - * mm-util.el (mm-find-charset-region): Ditto. - -1998-12-05 16:30:01 Lars Magne Ingebrigtsen - - * message.el (message-send): Don't encode here. - (message-send-mail): But here. - (message-send-news): And here. - -1998-12-04 15:29:02 Lars Magne Ingebrigtsen - - * gnus-msg.el (gnus-message-insert-stylings): Don't insert twice. - -Fri Dec 4 04:09:15 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.63 is released. - -1998-12-04 04:59:20 Lars Magne Ingebrigtsen - - * mml.el (mml-base-boundary): Shorten. - - * message.el (message-insert-mime-part): Use default. - - * gnus-art.el (gnus-insert-mime-button): Bind gnus-tmp-type-long. - -1998-12-03 Per Abrahamsen - - * gnus-art.el (gnus-mime-display-alternative): Use (*) for radio - buttons, not [*]. - -1998-12-04 Hrvoje Niksic - - * gnus-art.el (gnus-insert-mime-button): Do proper help-echo. - -1998-12-04 04:48:37 Hrvoje Niksic - - * gnus-art.el (gnus-insert-mime-button): Fix. - -1998-12-03 Hrvoje Niksic - - * message.el (message-insert-mime-part): Nicify prompts. - (message-insert-mime-part): Really delete duplicates. - (message-insert-mime-part): Check against common errors. - (message-insert-mime-part): Fix docstring. - -1998-12-04 04:41:58 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-mime-internalize-part): Bugged out. - -1998-12-03 Hrvoje Niksic - - * gnus-art.el (gnus-mime-button-line-format): Nicify. - (gnus-insert-mime-button): Modify accordingly. - -1998-12-04 01:50:53 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-display-mime): Set window point. - - * mm-decode.el (mm-display-external): Only decode when not - saving. - (mm-alternative-precedence): Prefer multiparts. - (mm-inline-media-tests): Inline multiparts. - - * gnus-picon.el (gnus-picons-next-job-internal): Do bar if asked. - Ignore errors when requiring url. - - * mml.el (mml-quote-region): New command. - - * message.el (message-cite-original): Use it. - (message-cite-original-without-signature): Ditto. - -Thu Dec 3 12:53:58 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.62 is released. - -1998-12-03 13:38:36 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-mime-view-all-parts): Work with multiparts. - -1998-12-03 Hrvoje Niksic - - * mm-view.el (mm-inline-text): Use `point-min-marker' and - `point-max-marker'. - -1998-12-03 13:22:57 Lars Magne Ingebrigtsen - - * mailcap.el (mailcap-mime-extensions): Use image/xpm for xpms. - - * gnus-art.el (gnus-mime-display-single): Check for attachment - before other tests. - -1998-12-03 Didier Verna - - * gnus-msg.el (gnus-configure-posting-styles): find a - posting-style entry in the group parameters, if any, and honor it - at the end. - -1998-12-03 13:03:37 Felix Lee - - * nntp.el (nntp-after-change-function): Fix. - -1998-12-03 12:44:30 Mike McEwan - - * mml.el (mml-generate-mime-1): Insert literally. - -1998-12-03 00:23:17 Lars Magne Ingebrigtsen - - * mml.el (mml-insert-mime-headers): Removed debug. - -1998-12-02 22:22:03 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-show-article): Destroy parts when - prefixed. - - * mm-encode.el (mm-content-transfer-encoding-defaults): Default - application/emacs-lisp to 8bit. - -1998-12-03 Dale Hagglund - - * mm-decode.el (mm-quote-arg): Add quoting of '()', '<>', and '|'. - -Wed Dec 2 20:24:27 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.61 is released. - -1998-12-02 21:12:56 Lars Magne Ingebrigtsen - - * mml.el (mml-parse-1): Skipped parts. - (mml-insert-mime-headers): Nil is a list. - (mml-generate-mime-1): Don't insert literally. - (mml-read-tag): Drop text props. - (mml-read-part): Ditto. - (mml-parse-singlepart-with-multiple-charsets): Ditto. - -Wed Dec 2 20:07:16 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.60 is released. - -1998-12-02 20:11:28 Lars Magne Ingebrigtsen - - * mml.el (mml-parse-1): Don't throw contents away. - -1998-12-02 Hrvoje Niksic - - * mml.el (mml-compute-boundary-1): Regexp-quote the boundary. - -1998-12-02 18:42:24 Lars Magne Ingebrigtsen - - * mml.el (mml-parse-singlepart-with-multiple-charsets): New - function. - (mml-parse-1): Use it. - -Tue Dec 1 23:04:25 1998 Shenghuo ZHU - - * gnus-art.el (gnus-decode-with-mail-decode-encoded-word-region): - Use gnus-newsgroup-default-charset. - (article-decode-encoded-words): Remove charset codes. - * gnus-sum.el (gnus-newsgroup-default-charset): Use - gnus-default-charset. - -1998-12-02 03:14:20 Lars Magne Ingebrigtsen - - * message.el (message-send-mail): Don't encode here. - (message-send-news): Nor here. - (message-send): ... but here instead. - - * gnus-picon.el (gnus-picons-display-article-move-p): Changed - default to nil. - (gnus-article-display-picons): Replace From line. - (gnus-group-display-picons): Replace Newsgroups line. - (gnus-picons-display-glyph): Set baseline. - (gnus-group-display-picons): Piconize the entire Newsgroups line. - (gnus-picons-xbm-face): Revert to old, standard colors. - - * message.el (message-fetch-field): Remove text props. - - * gnus-art.el (gnus-article-normalized-header-length): New - variable. - (article-normalize-headers): New command and keystroke. - - * gnus-picon.el (gnus-picons-xbm-face): Changed colors. - -Wed Dec 2 01:43:48 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.59 is released. - -1998-12-02 01:38:31 Lars Magne Ingebrigtsen - - * mml.el (mml-insert-mime-headers): Beep at multiple charsets. - - * gnus-art.el (gnus-mime-copy-part): Set buffer-file-name. - -1998-11-30 Hrvoje Niksic - - * mml.el (mml-generate-mime-1): Handle unquoting end-tags. - -1998-12-02 00:15:30 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-all-images-fit): New variable. - (mm-image-fit-p): Use it. - - * gnus-art.el (gnus-mime-display-single): Use it. - (gnus-mime-internalize-part): New command and keystroke. - - * mm-decode.el (mm-user-automatic-external-display): New - variable. - (mm-automatic-external-display-p): New function. - - * gnus-picon.el (gnus-picons-xbm-face): Default to sensible - colors. - -1998-12-01 23:52:05 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-repair-multipart): Reselect article. - - * gnus-art.el (gnus-with-article): Work in the original article - buffer. - (gnus-with-article): Work in read-only groups. - -Tue Dec 1 00:15:36 1998 Shenghuo ZHU - - * mm-bodies.el (mm-decode-string): Return original string if not - decode. - -Mon Nov 30 23:38:02 1998 Shenghuo ZHU - - * mm-uu.el (mm-uu-dissect): Use mm-make-handle. - -1998-12-01 01:53:49 Francois Pinard - - * nndoc.el (nndoc-mime-parts-type-p): Do related. - -Tue Dec 1 00:46:20 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.58 is released. - -1998-11-30 Hrvoje Niksic - - * mm-decode.el (mm-get-image): Return a glyph, not an image - specifier. - -1998-11-29 Hrvoje Niksic - - * rfc2047.el (rfc2047-decode): Bind mm-default-charset. - -1998-12-01 01:23:35 Lars Magne Ingebrigtsen - - * mail-parse.el (rfc2045): Required. - -1998-12-01 00:59:53 William M. Perry - - * mm-view.el (mm-inline-text): Remove props. - -1998-12-01 00:18:47 Lars Magne Ingebrigtsen - - * mm-view.el (mm-setup-w3): Protect url-misc. - - * message.el (message-ignored-resent-headers): Remove - Gnus-Warning. - - * mml.el (mml-insert-mime-headers): Use encoding. - (mml-parameter-string): Ditto. - - * rfc2045.el: New file. - (rfc2045-encode-string): New function. - -1998-11-30 23:11:22 Lars Magne Ingebrigtsen - - * mail-parse.el (mail-header-encode-parameter): New function. - - * rfc2231.el (rfc2231-encode-string): New function. - -Mon Nov 30 13:52:50 1998 Shenghuo ZHU - - * mm-bodies.el (mm-decode-string): New function. - * mm-view.el (mm-inline-text): Use mm-decode-string. - -Mon Nov 30 21:57:00 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.57 is released. - -1998-11-23 Felix Lee - - * nntp.el (nntp-async-needs-kluge): new setting. - (nntp-async-timer): new var. - (nntp-async-process-list): new var. - (nntp-async-kluge): new function. - (nntp-async-timer-handler): new function. - (nntp-async-wait): new function. - (nntp-async-stop): new function. - (nntp-after-change-function): renamed, and split apart. - (nntp-async-trigger): new function. - (nntp-do-callback): new function. - (nntp-accept-process-output): add optional timeout arg. - - * gnus-async.el (gnus-async-request-fetched-article): fixed. - (gnus-async-wait-for-article): new function. - (gnus-async-with-semaphore): s/asynch/async/. - -1998-11-30 16:54:56 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-with-article): Don't encode. - (gnus-insert-mime-button): Fall back on filename from C-D. - (gnus-mime-display-single): Have dots right on text/plain - attachments. - - * mm-decode.el (mm-dissect-buffer): Respect Content-Disposition in - broken parts. - - * gnus-art.el (gnus-with-article): Flush cache and backlog. - - * mm-bodies.el (mm-decode-content-transfer-encoding): Also do - binhex. - - * gnus-sum.el (gnus-summary-reparent-thread): Use new macro. - (gnus-summary-repair-multipart): New command and keystroke. - - * gnus-art.el (gnus-with-article-buffer): New macro. - -Sun Nov 29 23:51:57 1998 Shenghuo ZHU - - * gnus-art.el (gnus-mime-inline-part): Do not get part when - undisplay the part. - -1998-11-30 03:38:35 Lars Magne Ingebrigtsen - - * gnus-util.el (gnus-make-sort-function-1): Allow lambdas. - - * mml.el (mml-read-part): Partition right. - - * mm-decode.el (mm-handle-set-cache): New macro. - (mm-handle-cache): Ditto. - (mm-make-handle): Ditto. - (mm-dissect-singlepart): Use it. - (mm-get-image): Use the cache. - -1998-11-29 23:44:44 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-mime-display-mixed): Rewrite. - (gnus-mime-display-single): Don't insert lines between parts. - -Sun Nov 29 04:55:40 1998 Shenghuo ZHU - - * nnmail.el (nnmail-file-coding-system-1): New variable. - * nnfolder.el (nnfolder-file-coding-system): Ditto. - (nnfolder-read-folder): Use nnfolder-file-coding-system. - * nnml.el (nnml-file-coding-system): New variable. - (nnml-request-article): Use nnml-file-coding-system. - -Sun Nov 29 15:12:52 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.56 is released. - -1998-11-29 00:52:53 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-mime-display-part): New function. - (gnus-mime-display-mixed): Use it. - - * mm-view.el (mm-setup-w3): Don't register. - - * message.el (message-cite-original): Cite parts. - -1998-11-28 23:51:25 Lars Magne Ingebrigtsen - - * mml.el (mml-parameter-string): New function. - (mml-insert-mime-headers): Separated into new function. - -1998-11-28 Hrvoje Niksic - - * mml.el (mml-make-boundary): Use `make-string'. - -1998-11-27 Hrvoje Niksic - - * binhex.el (binhex-insert-char): Ditto. - - * base64.el (base64-insert-char): Ditto. - - * uudecode.el (uudecode-insert-char): Code correctly. - -1998-11-28 01:08:19 Lars Magne Ingebrigtsen - - * mml.el (mml-generate-mime): Don't generate multiparts for - empties. - - * gnus-art.el (gnus-display-mime): Save excursion. - - * message.el (message-remove-first-header): New function. - (message-encode-message-body): Use it. - -Fri Nov 27 12:26:10 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.55 is released. - -1998-11-27 12:38:52 Lars Magne Ingebrigtsen - - * mm-view.el (mm-setup-w3): New function. - - * mm-decode.el (mm-content-id-get-contents): New function. - (mm-content-id-get-type): Ditto. - (mm-content-id-get-encoding): Ditto. - (mm-get-handle-by-content-id): Removed. - -1998-11-25 Colin Rafferty - - * message.el (message-generate-new-buffers): Fix tag. - -1998-11-25 10:43:28 Lars Magne Ingebrigtsen - - * message.el (message-buffer-name): Check for unique first. - - * gnus-art.el (gnus-unbuttonized-mime-type-p): use - gnus-inhibit-mime-unbuttonizing. - - * gnus-sum.el (t): Bind M-t. - (gnus-inhibit-unbuttonizing): New variable. - (gnus-summary-toggle-display-buttonized): New command. - - * gnus-art.el (gnus-display-mime): Select article window. - (article-strip-trailing-space): New command and keystroke. - - * nneething.el (nneething-include-files): New variable. - (nneething-create-mapping): Use it. - - * nntp.el (nntp-possibly-change-group): Use nntp-send-command. - - * nnvirtual.el (nnvirtual-request-update-mark): Only yodate - ayto-expirable marks. - -1998-11-24 21:00:02 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-mime-view-all-parts): Set buffer. - - * gnus-sum.el (gnus-summary-display-buttonized): Don't pass on - ARG. - - * gnus-art.el (gnus-article-mode-line-format): Doc fix. - -Tue Nov 24 14:57:41 1998 Shenghuo ZHU - - * mm-util.el (mm-binary-coding-system): New variable. - (mm-with-unibyte-buffer): Use mm-binary-coding-system. - * mm-decode.el (mm-display-external): Ditto. - -Tue Nov 24 10:43:06 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.54 is released. - -1998-11-24 11:21:32 Katsumi Yamaoka - - * gnus-sum.el (gnus-newsgroup-default-charset-alist): Note fj. - -1998-11-24 11:14:54 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-save-part): Unquote. - -1998-11-24 11:14:39 Matt Armstrong - - * mm-decode.el (mm-save-part): Bind coding system for write. - -1998-11-24 10:42:30 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-mode-line-format): New default. - (gnus-article-mime-part-status): New function. - - * message.el (message-send-news): Check the body syntax before - encoding. - - * gnus-art.el (gnus-unbuttonized-mime-type): New function. - (gnus-mime-display-single): Use it. - (gnus-mime-display-alternative): Ditto. - - * mm-decode.el: Check for whether we are running under a term. - -1998-11-22 08:12:25 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-preferred-alternative): Default to first - alternative. - (mm-preferred-alternative): No, we dont. - -Tue Nov 24 03:01:48 1998 Shenghuo ZHU - - * mm-decode.el (mm-display-external): Use binary instead of - no-conversion. - * gnus-agent.el (gnus-agent-file-coding-system): Ditto. - * nnheader.el (nnheader-file-coding-system): Ditto. - * mm-util.el (mm-with-unibyte-buffer): Use binary instead of nil. - -Mon Nov 23 01:51:57 1998 Shenghuo ZHU - - * gnus-sum.el (gnus-newsgroup-setup-default-charset): Use group - name without method. - -Mon Nov 23 01:26:40 1998 Shenghuo ZHU - - * gnus-sum.el (gnus-newsgroup-default-charset): Rename - coding-system -> default-charset. - (gnus-newsgroup-default-charset-alist): Ditto. - (gnus-summary-local-variables): Ditto. - (gnus-set-global-variables): Ditto. - (gnus-get-newsgroup-headers): Ditto. - (gnus-summary-from-or-to-or-newsgroups): Ditto. - (gnus-get-newsgroup-headers-xover): Ditto. - (gnus-newsgroup-setup-default-charset): Ditto. - (article-decode-mime-words): Ditto. - (article-decode-charset): Ditto. - (article-decode-encoded-words): Ditto. - (article-de-quoted-unreadable): Ditto. - (gnus-mime-view-all-parts): Ditto. - (gnus-mime-externalize-part): Ditto. - (gnus-mm-display-part): Ditto. - (gnus-mime-display-single): Ditto. - (gnus-mime-display-alternative): Ditto. - * lpath.el : Ditto. - -Mon Nov 23 00:54:33 1998 Shenghuo ZHU - - * rfc2047.el (rfc2047-decode-region): Do not decode nil charset. - * gnus-art.el (article-decode-charset): Overlay - rfc2047-default-charset. - * message.el (message-draft-coding-system): New variable. - (message-set-auto-save-file-name): Use message-draft-coding-system. - * nndraft.el (nndraft-request-article): Ditto. - * gnus-start.el (gnus-start-draft-setup): Set charset nil. - * gnus-agent.el (gnus-agent-queue-setup): Ditto. - -Sun Nov 22 04:42:22 1998 Shenghuo ZHU - - * mm-uu.el (mm-uu-test): New function. - (mm-uu-dissect): Inherit charset and cte from head. - * gnus-art.el (article-decode-charset): Use mm-uu-test. - -Sat Nov 21 09:57:01 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.53 is released. - -1998-11-21 05:54:19 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-get-image): New function. - (mm-image-fit-p): New function. - - * gnus-xmas.el (gnus-xmas-annotation-in-region-p): Ditto. - - * gnus-util.el (gnus-annotation-in-region-p): New definition. - - * gnus-art.el (gnus-article-insert-newline): New function. - (article-goto-body): New function. - -1998-11-20 10:34:04 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-mime-display-single): Insert blank line before - buttons. - - * gnus-sum.el (gnus-summary-display-buttonized): New command and - keystroke. - - * gnus-art.el (gnus-mime-display-single): Don't insert a blank - line between parts. - - * message.el (message-remove-header): Go to end if wanted. - -1998-11-20 Karl Kleinpaste - - * gnus-art.el (gnus-mime-display-alternative): Avoid window - movement with save-window-excursion. - -Fri Nov 20 03:50:30 1998 Shenghuo ZHU - - * gnus-art.el (gnus-mime-inline-part): Use argument as charset. - -Fri Nov 20 03:37:53 1998 Shenghuo ZHU - - * mm-bodies.el (mm-decode-body): Remove buffer-file-coding-system. - -Fri Nov 20 01:20:38 1998 Shenghuo ZHU - - * gnus-sum.el (gnus-summary-from-or-to-or-newsgroups): Use - gnus-newsgroup-coding-system. - (gnus-get-newsgroup-headers): Ditto. - (gnus-get-newsgroup-headers-xover): Ditto. - (gnus-set-global-variables): Ditto. - * gnus-art.el (article-decode-mime-words): Ditto. - (article-decode-charset): Ditto. - (article-decode-encoded-words): Ditto. - (article-de-quoted-unreadable): Ditto. - (gnus-mime-view-all-parts): Ditto. - (gnus-mime-externalize-part): Ditto. - (gnus-mm-display-part): Ditto. - (gnus-mime-display-alternative): Ditto. - (gnus-mime-display-single): Ditto. - * mm-view.el (mm-inline-text): Use default coding system. - -Fri Nov 20 00:54:37 1998 Shenghuo ZHU - - * gnus-sum.el (gnus-newsgroup-coding-system-alist): New variable. - (gnus-newsgroup-iso-8859-1-forced-regexp): New variable. - (gnus-newsgroup-coding-system): New local variable. - (gnus-newsgroup-iso-8859-1-forced): New local variable. - (gnus-summary-local-variables): Add two new local variables. - (gnus-newsgroup-setup-coding-system): New function. - (gnus-select-newsgroup): Setup coding system. - * lpath.el: Add two new variables. - * mm-util.el (mm-charset-iso-8859-1-forced): New variable. - (mm-charset-to-coding-system): Use mm-charset-iso-8859-1-forced. - * gnus-cus.el (gnus-group-parameters): Customizable - iso-8859-1-forced. - -Fri Nov 20 05:30:26 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.52 is released. - -1998-11-20 04:32:23 Lars Magne Ingebrigtsen - - * rfc2047.el (rfc2047-encode-message-header): Encode the default - encoding. - - * gnus-art.el (gnus-mime-display-single): Insert buttons for - undisplayed text types. - - * mm-decode.el (mm-automatic-display-p): Only prefer inlinable - types. - -1998-11-19 Felix Lee - - * nntp.el (nntp-after-change-function-callback): recover from C-g. - -1998-11-19 Felix Lee - - * gnus-async.el (gnus-asynch-obarray): rename to - gnus-async-hashtb, and don't buffer-local it. - - (gnus-async-article-callback): new function. - (gnus-make-async-article-function): use it. - - (gnus-async-current-prefetch-group): new var. - (gnus-async-current-prefetch-article): new var. - (gnus-async-request-fetched-article): are we fetching it already? - - (gnus-async-delete-prefected-entry): s/prefected/prefetched/ - -1998-11-20 02:49:21 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-show-article): Require. - - * message.el: Provide before hooks. - (message-send-news): Do MIME before headers. - - * gnus-art.el (gnus-article-check-buffer): New function. - (gnus-article-read-summary-keys): Use it. - - * mm-decode.el (mm-user-automatic-display): Display all inline - images. - - * gnus-art.el (gnus-mime-display-single): Don't buttonize so - much. - (gnus-unbuttonized-mime-types): New variable. - -1998-11-19 06:29:03 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-inhibit-user-auto-expire): Changed to t. - - * mm-decode.el (mm-quote-arg): Quote semicolons. - - * gnus-art.el (gnus-mime-display-single): Don't display - attachments. - (gnus-mime-externalize-part): New command and keystroke. - - * mm-decode.el (mm-dissect-buffer): Pass on the description info. - (mm-alternative-precedence): Changed order. - -1998-11-07 17:41:47 Simon Josefsson - - * gnus.el (gnus-method-simplify): New function. - (gnus-native-method-p): New function. - (gnus-secondary-method-p): Use gnus-method-equal. - - * gnus-start.el (gnus-group-change-level): Shorten select method. - -Thu Nov 19 04:48:42 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.51 is released. - -1998-11-19 04:02:34 Lars Magne Ingebrigtsen - - * gnus.el: Applied patches from 5.6.45. - - * gnus-score.el (gnus-score-find-trace): Print complete file - paths. - (gnus-score-find-trace): Truncate lines. - - * gnus.el (gnus-message-archive-group): Allow function. - - * message.el (message-encode-message-body): Remove Mime-Version - before inserting. - - * gnus-cus.el (gnus-group-customize): Optional topic. - - * gnus-sum.el (gnus-summary-customize-parameters): New command and - keystroke. - -Wed Nov 18 13:46:08 1998 Shenghuo ZHU - - * message.el (message-encode-message-body): Rewrite. - -1998-11-18 07:37:47 Lars Magne Ingebrigtsen - - * mml.el (mml-base-boundary): New variable. - (mml-make-boundary): New function. - - * gnus-cache.el (gnus-cache-coding-system): New variable. - (gnus-cache-request-article): Use it. - - * message.el (message-insert-mime-part): Delete duplicates. - -Wed Nov 18 11:52:19 1998 Shenghuo ZHU - - * gnus-art.el (gnus-mime-display-alternative): Set end of - multipart and display even when nothing is preferred. - -Wed Nov 18 05:06:44 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.50 is released. - -1998-11-18 04:42:01 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-inline-media-tests): Check that device-type is - fbound. - - * gnus-sum.el (gnus-summary-sort): Didn't do reverse. - -1998-11-07 23:39:48 Simon Josefsson - - * gnus.el (gnus-similar-server-opened): Compare backend. - -1998-11-08 03:37:42 Simon Josefsson - - * gnus-topic.el (gnus-topic-expire-articles): New function. - (gnus-topic-mode-map): Bind it. - - * gnus.texi (Topic Commands): New expiry command. Reordered. - -1998-11-10 Miles Bader - - * gnus-sum.el - (gnus-auto-expirable-marks): New variable. - (gnus-inhibit-user-auto-expire): New variable. - (gnus-summary-mark-article-as-read, gnus-summary-mark-article): - When looking to see if we should expire instead, check - gnus-auto-expirable-marks instead of using a hard-wired list. - (gnus-summary-mark-as-read-forward, - gnus-summary-mark-as-read-backward): - Pass gnus-inhibit-user-auto-expire for the no-expire argument to - gnus-summary-mark-forward, instead of `t'. - -1998-11-18 03:30:26 Lars Magne Ingebrigtsen - - * mml.el (mml-compute-boundary): New function. - (mml-compute-boundary-1): New function. - (mml-generate-mime-1): Use it. - -1998-11-18 Hrvoje Niksic - - * mml.el (mml-generate-mime-1): Always precede closing boundary - with newline. - -1998-11-18 02:36:37 Lars Magne Ingebrigtsen - - * mml.el (mml-generate-mime-1): Do right boundaries when several - multiparts. - - * mm-decode.el (mm-user-automatic-display): Default to inline - jpeg. - - * mml.el (mml-generate-mime-1): Encode non-text parts. - -Wed Nov 18 02:22:23 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.49 is released. - -1998-11-18 00:37:43 Lars Magne Ingebrigtsen - - * mm-view.el (mm-inline-text): Require w3-vars. - - * gnus-setup.el (gnus-use-tm): Removed. - - * gnus-art.el (gnus-article-goto-part): Don't beep. - (gnus-article-view-part): Check return value. - (gnus-mime-display-alternative): Don't display when there is - nothing to display. - - * mml.el (mml-generate-mime-1): Don't use a unibyte buffer. - (mml-generate-mime-1): Use unibyte for binaries. - - * gnus-art.el (gnus-display-mime): Call - gnus-article-mime-part-function. - (gnus-mime-part-function): New function. - (gnus-article-mime-part-function): New function. - - * mml.el (mml-generate-mime-1): Don't insert so many newlines. - -1998-11-16 06:44:19 Lars Magne Ingebrigtsen - - * mml.el (mml-generate-mime-1): Do it in unibyte buffers. - - * message.el (message-font-lock-keywords): Highlight MML. - (message-mml-face): New font. - -Mon Nov 16 23:34:12 1998 Shenghuo ZHU - - * gnus-art.el (gnus-display-mime): Clean up even when no handles. - (gnus-mm-display-part): Do not select-window if the article window - is not found. - -Mon Nov 16 02:26:40 1998 Shenghuo ZHU - - * gnus-sum.el (gnus-summary-move-article): Use no-encode for B m. - -Mon Nov 16 02:00:05 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.48 is released. - -1998-11-15 23:18:56 Lars Magne Ingebrigtsen - - * mm-bodies.el (mm-encode-body): Disbabled for nonmule. - - * mm-util.el (mm-find-charset-region): Bogus change for non-Mule. - - * message.el (message-cite-original-without-signature): Ditto. - (message-cite-original): Quote parts. - -Sun Nov 15 22:01:55 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.47 is released. - -1998-11-15 20:11:33 Lars Magne Ingebrigtsen - - * message.el (message-encode-message-body): Insert MIME warning. - - * mml.el (mml-read-tag): Look for #tag. - - * mm-util.el (mm-find-charset-region): Check whether - enable-multibyte-characters is bound. - -Sun Nov 15 02:01:31 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.46 is released. - -1998-11-15 01:54:40 Lars Magne Ingebrigtsen - - * message.el (message-encode-message-body): Insert headers at the - right spot. - -Sun Nov 15 01:13:41 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.45 is released. - -1998-11-15 00:28:49 Lars Magne Ingebrigtsen - - * nndraft.el (nndraft-save-mime-part): Removed. - (nndraft-get-mime-part): Ditto. - - * message.el (message-format-mime-old): Removed. - (message-encode-message-body): Removed. - (message-encode-message-body): Renamed. - -1998-11-14 18:27:19 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-get-newsgroup-headers): Translate \r's. - - * message.el (message-format-mime): Check message-mime-part. - - * mm-encode.el (mm-mime-file-types): Removed. - (mm-default-file-encoding): New definition. - -Sat Nov 14 01:29:39 1998 Shenghuo ZHU - - * mm-view.el (mm-inline-image): Use mm-insert-inline. - * gnus-art.el (gnus-mm-display-part): Go to correct position. - -Sat Nov 14 05:47:57 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.44 is released. - -1998-11-14 03:59:14 Lars Magne Ingebrigtsen - - * message.el (message-format-mime): New function. - - * nndraft.el (nndraft-save-mime-part): New function. - (nndraft-get-mime-part): New function. - - * mm-encode.el (mm-default-file-encoding): New function. - (mm-content-transfer-encoding): New function. - (mm-encode-buffer): New function. - - * message.el: New command. - (message-mime-part): New variable. - (message-insert-mime-part): New command. - - * mm-encode.el (mm-encode-content-transfer-encoding): New - function. - - * mm-util.el (mm-content-transfer-encoding-defaults): New - variable. - (mm-mime-file-types): Taken from TM. - -Sat Nov 14 01:51:06 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.43 is released. - -1998-11-07 Karl Kleinpaste - - * gnus-cus.el (gnus-score-customize): Add "Extra" element. - * gnus-score.el (gnus-score-default-header): Ditto. - (gnus-header-index): Ditto. - (gnus-summary-increase-score): Ditto, & process "extra" requests. - (gnus-summary-header): Handle extra headers. - (gnus-summary-score-entry): Ditto, & provide new score element. - (gnus-summary-score-effect): Ditto. - (gnus-score-string): Avoid "extra" string sort, & modify match in - "extra" case. - * gnus-sum.el (gnus-make-score-map): Add "extra" element. - -1998-11-13 20:30:40 Lars Magne Ingebrigtsen - - * message.el (message-resend): Bind message-required-mail-headers - to nil. - - * mm-view.el (mm-inline-text): Bind w3-strict-width. - - * nngateway.el (require): Require cl. - - * gnus-art.el (gnus-button-alist): Exclude more chars from news: - things. - -Wed Nov 11 02:15:06 1998 Shenghuo ZHU - - * gnus-agent.el (gnus-agent-fetch-headers): Create directory even - when no articles. - -1998-11-13 19:25:10 Lars Magne Ingebrigtsen - - * message.el (message-ignored-resent-headers): Remove X-Gnus. - -1998-11-10 Colin Rafferty - - * gnus-sum.el (gnus-ignored-from-addresses): Only quote - user-mail-address if non-nil. - -1998-11-13 18:50:18 Lars Magne Ingebrigtsen - - * gnus-util.el (gnus-make-sort-function): Do `reverse'. - (gnus-make-sort-function-1): Ditto. - - * gnus-art.el (gnus-mm-display-part): Switch to mm in right - window. - -1998-11-12 22:31:58 Lars Magne Ingebrigtsen - - * mm-util.el (mm-with-unibyte-buffer): Ditto. - - * binhex.el (binhex-decode-region): Quote. - -1998-11-10 05:32:28 Lars Magne Ingebrigtsen - - * gnus-art.el (article-decode-charset): Don't downcase charset. - - * gnus-sum.el (gnus-get-newsgroup-headers-xover): Translate CR's. - -Sun Nov 8 23:17:24 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.42 is released. - -Sun Nov 8 02:36:33 1998 Shenghuo ZHU - - * gnus-art.el (gnus-display-mime): Add id for alternative part. - -1998-11-08 02:24:47 Simon Josefsson - - * nntp.el (nntp-send-mode-reader): Revert. - -Sun Nov 8 00:45:13 1998 Shenghuo ZHU - - * gnus-agent.el (gnus-agent-fetch-articles): Use with-temp-buffer. - -Sat Nov 7 23:07:24 1998 Shenghuo ZHU - - * message.el (message-make-date): Fix for negative time zones. - -Sun Nov 8 01:00:16 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.41 is released. - -1998-11-08 00:52:38 Hrvoje Niksic - - * mm-decode.el (mm-dissect-multipart): Quote regexp. - -1998-10-29 Sudish Joseph - - * gnus.el (gnus-short-group-name): When shortening foreign select - methods, do not scan for plusses beyond the first colon. - -1998-11-07 Mike McEwan - - * gnus-agent.el (gnus-agent-save-group-info): Cater for group info - lines where `group' is the last thing on the line. - -1998-11-08 00:35:09 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-view-part): Do alternative. - (gnus-mime-display-alternative): Insert marker. - -1998-11-07 14:33:46 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-dissect-multipart): Quote regexp. - - * nnmail.el (nnmail-expired-article-p): Protect against bogus - dates. - - * gnus-cus.el (gnus-topic): Required. - - * nnheader.el (nnheader-parse-nov): Parse extra. - (nnheader-nov-parse-extra): New macro. - -1998-10-31 12:33:22 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-view-part): Internal move. - -1998-10-28 Per Abrahamsen - - * gnus-cus-new.el (gnus-custom-topic): New free variable. - (gnus-group-customize): Support editing topic parameters. - -1998-10-29 12:09:20 Karl Kleinpaste - - * gnus-sum.el (gnus-summary-from-or-to-or-newsgroups): Add - indicators. - -1998-10-29 11:31:11 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-mm-display-part): Return. - (gnus-article-view-part): Only go if external. - (gnus-article-dumbquotes-map): Do 205. - - * mm-decode.el (mm-display-part): Return what was done. - - * message.el (message-buffer-naming-style): New variable. - (message-generate-new-buffers): Extended. - (message-buffer-naming-style): Removed. - (message-buffer-name): Use it. - (message-do-send-housekeeping): Rename new styling. - - * gnus-sum.el (gnus-summary-recenter): Allow - gnus-auto-center-summary to be a number. - -Wed Nov 4 02:24:39 1998 Shenghuo ZHU - - * pop3.el (pop3-open-server): Use "binary" instead of - "no-conversion". - -Sun Nov 1 01:26:42 1998 Shenghuo ZHU - - * gnus-srvr.el (gnus-browse-foreign-server): Set - gnus-browse-current-method to the result of gnus-server-to-method. - -Thu Oct 29 01:47:44 1998 Shenghuo ZHU - - * gnus-util.el (gnus-pull): Another optional argument. - * nnweb.el (nnweb-request-delete-group): Delete from - nnweb-group-alist and update active file. - -Thu Oct 29 01:05:08 1998 Shenghuo ZHU - - * gnus-group.el (gnus-group-make-group): Accept group of new - method. - -Wed Oct 28 02:19:16 1998 Shenghuo ZHU - - * gnus-agent.el (gnus-agent-fetch-group-1): Update dribble. - -Tue Oct 27 11:59:31 1998 Shenghuo ZHU - - * mm-view.el (mm-inline-text): Postion of html portion. - -1998-10-29 10:26:54 Lars Magne Ingebrigtsen - - * nntp.el (nntp-list-active-group): Waited for short strings. - (nntp-send-mode-reader): Ditto. - (nntp-open-connection): Ditto. - - * gnus-int.el (gnus-request-group-articles): New function. - - * nntp.el (nntp-request-listgroup): New function. - (nntp-request-group-articles): Renamed. - -1998-10-27 10:37:52 Karl Kleinpaste - - * nnheader.el (nnheader-parse-nov): Supply extra. - -1998-10-26 23:03:48 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-button-push): Don't go to - gnus-article-buffer. - - * mm-view.el (mm-inline-image): Add a newline. - - * gnus-start.el (gnus-check-first-time-used): Check more. - -1998-10-26 23:03:29 Francois Felix Ingrand - - * gnus-start.el (gnus-check-first-time-used): Check current. - -1998-10-26 22:07:52 Lars Magne Ingebrigtsen - - * mm-util.el (mm-find-charset-region): New function. - - * ietf-drums.el (ietf-drums-narrow-to-header): Work when no header. - - * gnus-art.el (gnus-mime-button-menu): Fix. - -1998-10-26 22:07:43 Michael Welsh Duggan - - * gnus-art.el (gnus-mime-button-menu): New definition. - -1998-10-26 01:46:11 Lars Magne Ingebrigtsen - - * gnus-art.el (article-decode-charset): Downcase charset. - (article-decode-charset): Pass on type. - (article-decode-charset): Check nil charsets. - (article-remove-cr): Translate CR to LF. - (gnus-ignored-mime-types): Default to nil. - - * nnheader.el (nnheader-insert-nov): Work when not Xref. - - * gnus-sum.el (gnus-ignored-from-addresses): Default to - user-mail-address. - (gnus-nov-parse-extra): Didn't return right thing. - -1998-10-25 23:25:27 Lars Magne Ingebrigtsen - - * gnus-xmas.el: Use compiled-function-p. - -Mon Oct 26 14:37:19 1998 Shenghuo ZHU - - * mm-decode.el (mm-copy-Yo-buffer): Make it works when no header. - -Sun Oct 25 23:11:44 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.40 is released. - -1998-10-25 21:41:05 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-mark-forward): Show thread. - - * gnus-start.el (gnus-check-first-time-used): Ignore dribble. - - * gnus-agent.el (gnus-agent-fetch-group-1): Bind name. - - * nnml.el (nnml-possibly-create-directory): Check before making. - -1998-10-25 19:43:08 Kai Grossjohann - - * nnheader.el (nnheader-insert-nov): Don't infloop. - -1998-10-25 19:26:11 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-set-mode-line): Check that the spec has been - set up. - -1998-10-25 19:22:03 Joerg Lenneis - - * nneething.el (nneething-file-name): New definition. - -1998-10-25 17:56:23 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-treatment-function-alist): Fix. - (gnus-summary-save-in-rmail): Use gnus-output-to-rmail. - - * nndoc.el (nndoc-dissect-mime-parts-sub): Recognize first part. - -Sun Oct 25 06:23:13 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.39 is released. - -1998-10-25 00:34:39 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-ignored-mime-types): New variable. - (gnus-mime-display-single): Use it. - (gnus-treatment-function-alist): New variable. - - * gnus.el (gnus-mime): New group. - - * gnus-art.el (gnus-mime-display-alternative): Don't destroy - things for other parts. - (gnus-mime-display-alternative): Place point. - - * gnus.el: autoload gnus-uu-post-news. - - * mailcap.el (mailcap-mailcap-entry-passes-test): Also check - needsterm/DISPLAY. - - * mm-decode.el (mm-display-part): Default to inline text/.* - parts. - - * mm-bodies.el (mm-decode-content-transfer-encoding): Default to - 8bit. - - * gnus-art.el (gnus-mime-copy-part): Use normal-mode. - (gnus-mime-display-single): Inline all text parts. - (gnus-article-narrow-to-signature): Removed mime:: stubs. - -1998-10-24 21:38:37 Lars Magne Ingebrigtsen - - * nnml.el (nnml-possibly-create-directory): Rewrite. - (nnml-request-create-group): Change to right server. - - * gnus-xmas.el (gnus-xmas-define): Use byte-code-function-p. - - * gnus-sum.el (gnus-set-mode-line): Use truncate-string-to-width. - - * gnus.el: rmail-output-to-rmail-file autoload. - - * gnus-util.el (gnus-output-to-rmail): Didn't work if not in - Gnus. - - * nnheader.el (nnheader-parse-head): Checked wrong variable. - - * gnus-sum.el (gnus-summary-update-mark): Ignore nil'd marks. - -Tue Oct 20 23:37:43 1998 Shenghuo ZHU - - * gnus-art.el (gnus-mime-display-mixed): Multipart in - mixed part. - -Tue Oct 20 23:36:43 1998 Shenghuo ZHU - - * gnus-sum.el (gnus-summary-exit): Use mm-destroy-parts. - - * gnus-sum.el (gnus-summary-exit-no-update): Ditto. - -Tue Oct 20 16:22:51 1998 Shenghuo ZHU - - * mm-uu.el (mm-uu-dissect): Create pseudo multipart head. - -1998-10-24 20:51:53 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-valid-move-group-p): Make sure group has a - value. - - * gnus-art.el (gnus-article-hidden-text-p): Return nil when not - hidden. - - * gnus-spec.el (gnus-update-format-specifications): Use the - article mode line spec. - - * gnus-art.el (gnus-insert-mime-button): Put right type. - (gnus-insert-prev-page-button): Ditto. - (gnus-insert-next-page-button): Dutti. - - * pop3.el: New version installed. - -Sat Oct 24 16:48:51 1998 Shenghuo ZHU - - * mm-uu.el (mm-uu-dissect): Delete the begining spurious newline - and display last part. - -Sat Oct 24 20:31:55 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.38 is released. - -1998-10-24 07:54:58 Lars Magne Ingebrigtsen - - * gnus-art.el (article-mime-decode-quoted-printable-buffer): - Removed. - (article-de-quoted-unreadable): Narrow to default. - - * qp.el (quoted-printable-encode-region): Encode before QP-ing. - - * gnus-art.el (article-decode-charset): Decode even when broken - MIME. - - * gnus-sum.el (gnus-summary-from-or-to-or-newsgroups): Return - name. - - * gnus-msg.el (gnus-copy-article-buffer): Delete headers. - - * gnus-cache.el (gnus-cache-possibly-enter-article): Use - nnheader. - - * nnmail.el (nnmail-extra-headers): New variable. - - * nnheader.el (nnheader-insert-nov): Insert extra. - - * gnus.el (gnus-summary-line-format): Doc fix. - - * gnus-sum.el (gnus-get-newsgroup-headers): Parse extra. - (gnus-nov-parse-line): Ditto. - (gnus-nov-parse-extra): New macro. - (gnus-header): New function. - (gnus-update-summary-mark-positions): Change. - (gnus-ignored-from-addresses): New variable. - (gnus-summary-insert-from-or-to): New function. - - * gnus.el (gnus-extra-headers): New variable. - - * nnheader.el (make-mail-header): Expand. - (mail-header-extra): New macro. - (mail-header-set-extra): Ditto. - (make-full-mail-header): Expand. - -Sat Oct 24 07:41:42 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.37 is released. - -1998-10-24 07:29:11 Lars Magne Ingebrigtsen - - * mm-bodies.el (mm-decode-body): Check for multibyticity. - - * mm-util.el (mm-enable-multibyte): Don't always switch multibyte - on. - -1998-10-22 Didier Verna - - * gnus-spec.el (gnus-balloon-face-function): new function - (gnus-parse-format): understand the %< %> specifiers - (gnus-parse-complex-format): ditto. - -1998-10-24 06:31:33 Lars Magne Ingebrigtsen - - * gnus.el: Changed following-char to char-after throughout. - -1998-10-22 04:05:55 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-display-external): Protect more and message. - -Wed Oct 21 03:26:30 1998 Shenghuo ZHU - - * gnus-xmas.el (gnus-xmas-article-push-button): Go to the - position. - -Tue Oct 20 23:37:43 1998 Shenghuo ZHU - - * gnus-art.el (gnus-mime-display-mixed): Multipart in - mixed part. - -Tue Oct 20 23:36:43 1998 Shenghuo ZHU - - * gnus-sum.el (gnus-summary-exit): Use mm-destroy-parts. - - * gnus-sum.el (gnus-summary-exit-no-update): Ditto. - -Tue Oct 20 16:22:51 1998 Shenghuo ZHU - - * mm-uu.el (mm-uu-dissect): Create pseudo multipart head. - -1998-10-21 Hrvoje Niksic - - * mailcap.el (mailcap-save-binary-file): Use unwind-protect. - - * mm-decode.el (mm-display-external): Set undisplayer to mm - buffer, not the current buffer; use unwind-protect. - -1998-10-21 00:07:59 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-exit): Destroy parts. - (gnus-summary-exit-no-update): Ditto. - -1998-10-20 22:02:05 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-inline-media-tests): Look for w3. - - * mailcap.el (mailcap-mime-data): Inline html. - -Tue Oct 20 20:25:03 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.36 is released. - -1998-10-20 18:13:08 Lars Magne Ingebrigtsen - - * gnus-art.el (article-translate-strings): - (gnus-article-dumbquotes-map): Don't dot. - - * pop3.el (pop3-open-server): Set point right. - - * mm-decode.el (mm-dissect-multipart): Dissect hierarchically. - (mm-dissect-buffer): Ditto. - (mm-destroy-part): Ignore non-handles. - (mm-remove-part): Ditto. - (mm-destroy-parts): New function. - (mm-remove-parts): Ditto. - - * gnus-art.el (gnus-mm-display-part): Don't move point. - -Tue Oct 20 02:16:36 1998 Shenghuo ZHU - - * mm-uu.el : New file. - - * gnus-art.el (gnus-display-mime): Dissect uu stuffs. - - * mm-bodies.el (mm-decode-content-transfer-encoding): Encoding as - a function. - -1998-10-20 00:35:05 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-display-external): Check before selecting. - -Sat Sep 26 02:03:00 1998 Shenghuo ZHU - - * gnus-sum.el (gnus-multi-decode-encoded-word-string): Rewrite. - - * gnus-sum.el (gnus-decode-encoded-word-methods): New variable. - - * gnus-sum.el (gnus-decode-encoded-word-methods-cache): New - variable. - - * gnus-sum.el (gnus-encoded-word-method-alist): Deleted. - - * gnus-art.el (gnus-decode-header-methods): New variable. - - * gnus-art.el (gnus-decode-header-methods-cache): New variable. - - * gnus-art.el (gnus-multi-decode-header): New function. - -Tue Oct 20 00:24:16 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.35 is released. - -1998-10-20 00:00:36 Lars Magne Ingebrigtsen - - * uudecode.el (uudecode-decode-region-external): Insert - literally. - - * gnus-xmas.el (gnus-xmas-mime-button-menu): Moved here. - - * mm-bodies.el (mm-decode-body): Optional encoding. - -1998-10-19 23:57:57 Lars Magne Ingebrigtsen - - * gnus-ems.el (gnus-mouse-3): New variable. - - * binhex.el (binhex-decode-region-external): Don't use -internally. - -1998-10-16 14:54:02 Simon Josefsson - - * mailcap.el (mailcap-parse-mailcaps): Only open regular - files. - -1998-09-26 22:28:01 Simon Josefsson - - * gnus-group.el (gnus-add-marked-articles): Request backend update - of flags. - -1998-09-26 19:39:31 Simon Josefsson - - * gnus-sum.el (gnus-update-read-articles): - (gnus-update-marks): Request backend update of mark. - -1998-09-26 19:33:58 Simon Josefsson - - * gnus.texi (Optional Backend Functions): New item, - nnchoke-request-set-mark. - -1998-09-26 16:27:27 Simon Josefsson - - * gnus-range.el (gnus-remove-from-range): Don't add stuff in - list to range. - -1998-10-19 23:45:13 Simon Josefsson - - * gnus-sum.el (gnus-summary-exit-no-update): Don't expire. - -1998-10-14 SL Baur - - * gnus-sum.el: Move gnus-save-hidden-threads above where it is - first used. - -1998-10-10 SL Baur - - * mm-view.el: Require mm-decode for macros. - - * mm-decode.el (mm-handle-type): Move macro declarations above the - place where they are used. - -Sun Oct 18 13:59:07 1998 Kurt Swanson - - * gnus-msg.el (gnus-summary-mail-forward): Erase old forward - buffer. - -1998-10-19 23:38:11 Katsumi Yamaoka - - * nnagent.el (nnagent-open-server): Error message. - -1998-10-19 23:35:08 Joerg Lenneis - - * nnheader.el (nnheader-article-p): Recognize lower-case headers. - -1998-10-19 Hrvoje Niksic - - * score-mode.el (gnus-score-mode-map): Ditto. - - * message.el (message-mode-map): Ditto. - - * gnus-uu.el (gnus-uu-post-news): Ditto. - - * gnus-kill.el (gnus-kill-file-mode-map): Ditto. - - * gnus-eform.el (gnus-edit-form-mode-map): Ditto. - - * gnus-art.el (gnus-article-edit-mode-map): Use - `set-keymap-parent' rather than `copy-keymap'. - -1998-10-18 Hrvoje Niksic - - * gnus-art.el (gnus-mime-button-commands): New variable. - (gnus-mime-button-map): Initialize it from - `gnus-mime-button-commands'. - (gnus-mime-button-menu): New function. - (gnus-insert-mime-button): Use `gnus-mime-button-map'. - -1998-10-11 Hrvoje Niksic - - * message.el (message-insert-to): Make `nobody' and `poster' - synonymous to `never' and `always' in Mail-Copies-To. - (message-reply): Ditto. - (message-followup): Ditto. - -1998-10-19 23:17:41 Lars Magne Ingebrigtsen - - * mailcap.el (mailcap-mime-data): Save sound. - -1998-09-24 Hrvoje Niksic - - * message.el (message-ignored-supersedes-headers): Include - `NNTP-Posting-Date'. - -1998-10-19 01:25:27 Jonas Steverud - - * gnus-art.el (gnus-article-dumbquotes-table): New variable. - -1998-10-19 00:50:22 Lars Magne Ingebrigtsen - - * mm-bodies.el (mm-decode-content-transfer-encoding): Use - uudecode. - -1998-10-18 18:20:34 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-display-external): Don't switch on save. - -1998-10-18 18:14:06 Andy Piper - - * nnmail.el (nnmail-movemail-args): New variable. - -1998-10-18 00:17:02 Lars Magne Ingebrigtsen - - * gnus-art.el (article-translate-strings): - -1998-10-17 22:51:31 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-view-part): Use it. - (gnus-mm-display-part): New function. - (article-de-quoted-unreadable): Yse mm-default-coding-system. - - * mm-decode.el (mm-handle-displayed-p): New function. - - * gnus-art.el (gnus-mime-copy-part): Create better names. - (gnus-mime-button-line-format): Include dots spec. - -1998-10-15 Matt Pharr - - * gnus-msg.el (gnus-summary-mail-forward): Erase contents of old - forward buffer first. - -1998-10-17 21:16:46 Lars Magne Ingebrigtsen - - * gnus-util.el (gnus-set-window-start): New function. - - * message.el (message-send): Don't check changed. - -1998-10-12 15:26:41 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-setup-buffer): Set params. - - * mm-decode.el (mm-user-display-methods): Inline - "message/delivery-status". - -1998-10-11 07:06:38 Lars Magne Ingebrigtsen - - * message.el (message-auto-save-directory): Rename. - (message-mode): Dof fix. - - * gnus-art.el (gnus-summary-save-in-pipe): Default to "cat". - (gnus-summary-save-in-pipe): No, check gnus-last-shell-command. - - * nndoc.el (nndoc-mime-parts-type-p): Be a bit more forgiving. - - * message.el (message-make-date): Avoid locale. - - * gnus-art.el (gnus-article-edit-done): Allow update before doing - cache. - - * mm-decode.el (mm-display-inline): Goto point-min. - - * gnus-art.el (gnus-article-prepare-display): Not read-only. - - * mm-decode.el (mm-display-external): Reverse before sorting. - - * gnus-draft.el (gnus-draft-send): Allow mail. - -1998-10-10 -SL Baur - - * message.el (message-check): Move message-check macro above where - it is first used. - - * gnus-art.el (article-hide-pgp): Hide the PGP 5/GNUPG Hash: line. - -1998-10-11 06:45:37 Lloyd Zusman - - * gnus-sum.el (gnus-summary-make-menu-bar): Fix. - -Sun Oct 11 02:28:40 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.34 is released. - -1998-10-11 02:15:41 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-inline-media-tests): delivery-status. - - * mm-view.el (mm-inline-text): Provide default. - -1998-10-11 01:01:37 Lloyd Zusman - - * mailcap.el (mailcap-possible-viewers): Fix nils. - -1998-10-11 00:03:37 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-edit-exit): Don't do updates. - (article-update-date-lapsed): Record the buffer. - (article-update-date-lapsed): Do all windows that display article - buffers. - - * nnml.el (nnml-generate-nov-databases-1): Ditto. - - * gnus-score.el (gnus-score-score-files-1): Ignore dotted files. - - * gnus-art.el (gnus-insert-mime-button): Mark buttons as - annoations. - - * gnus-msg.el (gnus-summary-mail-forward): Decode properly. - -1998-10-10 22:07:03 Lars Magne Ingebrigtsen - - * gnus-agent.el (gnus-category-add): Change default category to - 'false. - - * nnvirtual.el (nnvirtual-update-read-and-marked): Don't nix out - scores. - - * gnus-draft.el (gnus-draft-send): Check server more. - - * gnus-art.el (gnus-article-view-part): New command and keystroke. - (gnus-article-goto-part): New function. - - * mm-view.el (mm-inline-text): Insert richtext properly. - - * gnus-art.el (gnus-insert-mime-button): Store handle in alist. - -1998-10-03 15:04:27 Lars Magne Ingebrigtsen - - * parse-time.el (parse-time-rules): Accept dates far into the past - and the future, and parse single-digit numbers as years. - -1998-10-02 04:46:46 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-display-external): Chop off directories. - -1998-10-01 07:33:35 Lars Magne Ingebrigtsen - - * uudecode.el (uu-decode-region-external): Use - insert-file-contents-literally. - - * gnus-cache.el (gnus-cache-generate-active): Translate _ to :. - -1998-10-01 07:02:11 Shenghuo ZHU - - * uudecode.el: New file. - - * mm-bodies.el (mm-decode-content-transfer-encoding): Do - x-uuencode. - -1998-10-01 05:19:35 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-mime-display-alternative): Set faces. - - * message.el (message-fetch-field): Unfold properly. - - * mm-bodies.el (mm-decode-content-transfer-encoding): Replace CRLF - in text/plain. - -1998-09-30 05:47:49 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-first-unread-subject): New command. - (gnus-auto-select-first): Removed. - (gnus-auto-select-first): Extended. - (gnus-summary-read-group-1): Use new value. - -1998-09-29 13:21:06 Lars Magne Ingebrigtsen - - * message.el (message-fix-before-sending): Space. - - * nnmail.el (nnmail-find-file): Don't erase. - -Wed Sep 30 23:49:03 1998 Shenghuo ZHU - - * gnus-agent.el (gnus-agent-fetch-headers): Do not decode headers. - -Wed Sep 30 23:46:29 1998 Shenghuo ZHU - - * gnus-soup.el (gnus-soup-add-article): Do not decode headers. - -Wed Sep 30 23:44:08 1998 Shenghuo ZHU - - * gnus-soup.el (gnus-soup-pack-packet): Pack only if necesary. - -Sat Sep 26 03:04:18 1998 Shenghuo ZHU - - * mm-util.el (mm-with-unibyte-buffer): Make it work in XEmacs - 20.4. - -1998-09-29 11:35:09 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-mime-view-all-parts): New command and - keystroke. - - * mm-decode.el (mm-display-external): Translate slashes. - - * nnmail.el (nnmail-find-file): Restrict auto-mode-alist. - - * nndraft.el (nndraft-retrieve-headers): Don't copy so much. - - * mm-decode.el (mm-quote-arg): Quote spaces. - (mm-display-external): Quote args. - -1998-09-24 22:27:55 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-inlinable-part-p): New function. - -1998-09-25 22:28:01 Simon Josefsson - - * mm-util.el (mm-disable-multibyte): New function. - -Thu Sep 24 20:28:31 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.33 is released. - -1998-09-24 18:47:31 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-insert-mime-button): Get buffer size. - - * mm-decode.el (mm-display-external): Don't switch for externals. - (mm-dissect-multipart): Don't include end-sep. - - * mm-util.el (mm-get-coding-system-list): New function. - (mm-coding-system-list): New variable. - -Thu Sep 24 02:08:10 1998 ZHU Shenghuo - - * gnus-cus.el (gnus-group-parameters): Add charset as a parameter - -Thu Sep 24 02:05:48 1998 ZHU Shenghuo - - * gnus-cus.el (gnus-group-customize): Use variable as cons not as - group - -Thu Sep 24 01:41:03 1998 ZHU Shenghuo - - * base64.el (base64-run-command-on-region): External base64 - decoder do not use coding system - -Thu Sep 24 01:39:44 1998 ZHU Shenghuo - - * mm-decode.el (mm-interactively-view-part): Typo. - -Thu Sep 24 01:37:30 1998 ZHU Shenghuo - - * mm-decode.el (mm-dissect-multipart): Display last part when the - article has no close-delimiter - -Thu Sep 24 01:28:54 1998 ZHU Shenghuo - - * mm-decode.el (mm-dissect-buffer): Display parts which have no - content-type. - -Thu Sep 24 01:23:57 1998 ZHU Shenghuo - - * gnus-art.el (gnus-display-mime): Typo. - -Thu Sep 24 02:29:57 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.32 is released. - -1998-09-24 00:27:11 Lars Magne Ingebrigtsen - - * gnus-kill.el (gnus-batch-score): Protect against errors. - - * gnus-art.el: Protect against broken headers. - - * mm-decode.el (mm-display-external): Respect needsterm. - (mm-display-external): Create buffer for external commands. - -1998-09-23 22:04:05 Lars Magne Ingebrigtsen - - * mailcap.el (mailcap-mime-info): Return the proper viewer. - - * mm-decode.el (mm-display-external): Use file name. - -1998-09-22 Markus Rost - - * gnus-util.el (gnus-output-to-rmail): adjust to - `rmail-output-to-rmail-file' - -1998-09-23 20:07:00 Lars Magne Ingebrigtsen - - * gnus-util.el (gnus-output-to-rmail): Reinstated function. - - * gnus-sum.el (gnus-select-newsgroup): Set global variables before - headers. - - * gnus-art.el (article-decode-charset): Fold case. - -1998-09-17 15:49:10 Simon Josefsson - - * mailcap.el (mailcap-save-binary-file): Goto point-min. - -1998-09-23 19:48:52 Aaron M. Ucko - - * nnmail.el (nnmail-check-duplication): Enter into duplicate list - after being stored. - -Tue Sep 15 16:15:16 1998 Kurt Swanson - - * gnus-salt.el (gnus-pick-setup-message): Return from whence ye - come. - -1998-09-23 19:42:03 Lars Magne Ingebrigtsen - - * gnus-xmas.el (wid-edit): Required. - - * gnus-ems.el (gnus-widget-button-keymap): New variable. - -Sun Sep 20 00:27:55 1998 ZHU Shenghuo - - * gnus-art.el (gnus-mime-inline-part): remove part if necessary - -1998-09-23 19:30:52 Matt Armstrong - - * gnus-art.el (article-decode-charset): Narrow to the correct - region. - - * mm-bodies.el: Fix autoload. - -1998-09-22 18:35:12 Lee Willis - - * gnus-art.el (gnus-mime-button-line-format): Doc fix. - -1998-09-22 14:53:35 Lars Magne Ingebrigtsen - - * rfc2047.el (rfc2047-decode): Use rfc2047-default-charset. - -1998-09-19 13:58:35 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-insert-mime-button): Specify keymap. - (gnus-article-add-button): Ditto. - - * gnus-sum.el (gnus-summary-insert-pseudos): Use mm. - - * gnus-art.el (gnus-article-prepare-display): Make article mode. - (gnus-article-prepare-display): Bind url-standalone-mode. - - * mm-decode.el (mm-remove-part): Also delete directory. - (mm-display-external): Create a private sub-dir. - - * mailcap.el (mailcap-binary-suffixes): New variable. - (mailcap-command-p): Use it. - -1998-09-16 10:38:21 Lars Magne Ingebrigtsen - - * nnmbox.el (nnmbox-request-group): Change server. - (nnmbox-possibly-change-newsgroup): Enable multibyte. - - * message.el (message-encode-message-body): Don't stomp MIME - headers. - - * gnus-sum.el (gnus-summary-edit-article-done): Don't encode - unless useful. - (gnus-summary-exit): Check for a live article buffer. - (gnus-summary-exit-no-update): Ditto. - - * gnus-int.el (gnus-request-replace-article): Accept no-encode - param. - - * gnus-sum.el (gnus-article-decoded-p): New variable. - - * mm-decode.el (mm-display-external): Use no-conv. - - * rfc2047.el (rfc2047-q-encode-region): Bound properly. - (rfc2047-charset-encoding-alist): Use B encoding for koi8-r. - - * gnus-art.el (gnus-article-mode-map): Bind button2 to - mouse-click. - -1998-09-15 14:38:02 Lars Magne Ingebrigtsen - - * gnus-agent.el (gnus-agent-expire): Protect against nil infos. - -Mon Sep 14 18:55:38 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.31 is released. - -1998-09-14 15:12:59 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-exit): Destroy MIME. - - * mm-decode.el (mm-display-part): Accept no-default. - - * gnus-art.el (gnus-insert-mime-button): buffer-size doesn't take - a parameter. - - * gnus-sum.el (gnus-summary-insert-line): Don't exclude faces. - (gnus-summary-prepare-threads): Ditto. - - * gnus.el (gnus-article-mode-map): Make sparse keymap. - - * gnus-art.el (gnus-mime-button-line-format-alist): Allow a %d spec. - (gnus-mime-button-line-format): Doc fix. - (gnus-insert-mime-button): Use it. - (gnus-article-add-button): Use widget-convert-button. - - * gnus.el ((featurep 'gnus-xmas)): Defalias gnus-decode-rfc1522 to - ignore. - - * mm-decode.el (mm-alternative-precedence): Ditto. - -1998-09-14 15:12:49 Conrad Sauerwald - - * mm-decode.el (mm-user-automatic-display): Use enriched. - -1998-09-14 15:09:12 Paul Fisher - - * mm-decode.el (mm-dissect-multipart): Have the part start on the - right place. - -1998-09-14 14:33:34 Lars Magne Ingebrigtsen - - * gnus-msg.el (gnus-inews-add-send-actions): Mark silently. - - * gnus-art.el (article-update-date-lapsed): Only update header if - buffer is dispalyed in frame. - (gnus-article-prepare-display): New function. - (gnus-article-prepare): Use it. - -1998-09-14 08:16:43 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-mime-inline-part): New command and keystroke. - - * mm-view.el (mm-insert-inline): New function. - - * mm-decode.el (mm-pipe-part): Bugged. - - * gnus-agent.el (gnus-agent-send-mail): Don't encode. - - * mm-bodies.el (mm-encode-body): Move over the body. - - * nnmbox.el (nnmbox-read-mbox): Enable multibyte. - - * rfc2047.el (rfc2047-q-encode-region): Would bug out. - -1998-09-13 Francois Pinard - - * nndoc.el: Make nndoc-dissection-alist simpler for MIME, adjust all - related functions. Handle message/rfc822 parts. Display subject on - multipart summary lines. Display name on sub-parts when available. - -1998-09-14 07:36:38 Hallvard B. Furuseth - - * mailcap.el (mailcap-command-p): New version. - -1998-09-13 Mike McEwan - - * gnus-agent.el (gnus-agent-expire): Stop expiry barfing on killed - groups. - -1998-09-13 18:34:06 Lars Magne Ingebrigtsen - - * message.el (message-make-date): Remove weekday name. - - * mm-decode.el (mm-dissect-buffer): Protect against broken - headers. - - * mailcap.el (mailcap-command-in-path-p): New function. - (mailcap-command-p): Renamed. - -1998-09-13 17:58:47 Hallvard B. Furuseth - - * rfc2047.el (eval): Autoload. - -1998-09-13 12:22:40 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-decode-encoded-word-functions): New variable. - (gnus-multi-decode-encoded-word-string): New function. - (gnus-encoded-word-method-alist): New variable. - (gnus-decode-encoded-word-functions): Removed. - -1998-09-13 Shenghuo ZHU - - * gnus-int.el (gnus-request-replace-article): Replace - message-narrow-to-headers with message-narrow-to-head - -1998-09-13 12:05:41 Lars Magne Ingebrigtsen - - * drums.el (drums-quote-string): Reversed match. - - * message.el (message-make-date): Use weekday name. - -Sun Sep 11 10:27:15 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.30 is released. - -1998-09-13 08:00:41 Lars Magne Ingebrigtsen - - * gnus-art.el (article-decode-encoded-words): Use it. - (gnus-decode-header-function): New variable. - - * gnus-sum.el (gnus-nov-parse-line): Use it. - (gnus-decode-encoded-word-function): New variable. - - * gnus-msg.el (gnus-copy-article-buffer): Decode the right - buffer. - - * gnus-art.el (gnus-insert-mime-button): Use widget. - (gnus-widget-press-button): New function. - (gnus-article-prev-button): Removed. - (gnus-article-next-button): Ditto. - (gnus-article-add-button): Ditto. - - * gnus.el (gnus-article-mode-map): Inherit from widget. - (gnus-article-mode-map): No, don't. - - * mm-decode.el (mm-dissect-buffer): Store Content-ID things. - (mm-content-id-alist): New variable. - (mm-get-content-id): New function. - - * gnus-art.el (gnus-request-article-this-buffer): Only decode - articles if we are fetching to the article buffer. - -1998-09-13 07:58:59 Shenghuo ZHU - - * gnus-sum.el (gnus-summary-move-article): Don't decode accepting - articles. - -1998-09-13 07:23:28 Lars Magne Ingebrigtsen - - * mm-util.el (mm-mime-charset): Try to use safe-charsets. - (mm-default-mime-charset): New variable. - - * rfc2047.el (rfc2047-dissect-region): Dissect using tspecials. - - * drums.el (drums-quote-string): Reversed test. - -1998-09-12 14:29:21 Lars Magne Ingebrigtsen - - * mm-util.el (mm-insert-rfc822-headers): Possibly not quote - string. - - * drums.el (drums-quote-string): New function. - - * rfc2047.el (rfc2047-encode-message-header): Goto point-min. - (rfc2047-b-encode-region): Chop lines. - (rfc2047-q-encode-region): Ditto. - -Sat Sep 12 13:27:15 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.29 is released. - -1998-09-12 12:46:30 Istvan Marko - - * mm-decode.el (mm-save-part): Message right. - -1998-09-12 11:30:01 Lars Magne Ingebrigtsen - - * drums.el (drums-parse-address): Returned a list instead of a - string. - (drums-remove-whitespace): Skip comments. - (drums-parse-addresses): Didn't work. - -Sat Sep 12 09:17:30 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.28 is released. - -1998-09-12 04:57:25 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-mime-button-map): Use the article keymap as a - starting point. - (article-decode-encoded-words): Rename. - - * message.el (message-narrow-to-headers-or-head): New function. - - * gnus-int.el (gnus-request-accept-article): Narrow to the right - region. - - * message.el (message-send-news): Encode body after checking - syntax. - - * gnus-art.el (gnus-mime-button-line-format): Allow descriptions. - - * mm-decode.el (mm-save-part): Use Content-Disposition filename. - - * gnus-art.el (gnus-display-mime): Respect disposition. - - * mm-decode.el (mm-preferred-alternative): Respect disposition. - - * gnus-art.el (article-strip-multiple-blank-lines): Don't delete - text with annotations. - - * message.el (message-make-date): Fix sign for negative time - zones. - - * mm-view.el (mm-inline-image): Insert a space at the end of the - image. - - * mail-parse.el: New file. - - * rfc2231.el: New file. - - * drums.el (drums-content-type-get): Removed. - (drums-parse-content-type): Ditto. - - * mailcap.el (mailcap-mime-data): Use symbols instead of strings. - -Fri Sep 11 18:23:34 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.27 is released. - -1998-09-11 12:42:07 Lars Magne Ingebrigtsen- - - * mm-decode.el (mm-alternative-precedence): New variable. - (mm-preferred-alternative): New function. - - * gnus-art.el (gnus-mime-copy-part): New command. - - * mm-decode.el (mm-get-part): New function. - - * mm-view.el: New file. - - * mm-decode.el (mm-dissect-buffer): Downcase cte. - (mm-display-part): Default to mailcap-save-binary-file. - -Fri Sep 11 12:32:50 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.26 is released. - -1998-09-11 08:25:33 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-interactively-view-part): New function. - - * gnus-art.el (gnus-mime-view-part): New command. - - * mm-decode.el (mm-last-shell-command): New variable. - - * mailcap.el (mailcap-mime-info): Allow returning all matches. - - * mm-decode.el (mm-save-part): New function. - - * gnus-art.el (article-decode-charset): Protect against buggy - content-types. - (gnus-mime-pipe-part): New command. - (gnus-mime-save-part): New command. - (gnus-mime-button-map): New keymap. - (gnus-mime-button-line-format): New variable. - (gnus-insert-mime-button): New function. - (gnus-display-mime): Use it. - - * gnus-util.el (gnus-dd-mmm): Removed length spec. - - * mm-decode.el (mm-inline-text): Decode charsets. - - * gnus-art.el (gnus-article-save): Comment fix. - - * gnus-int.el (gnus-start-news-server): When in batch, don't - prompt. - - * gnus-cache.el (gnus-cache-possibly-enter-article): Don't - decode. - - * mm-decode.el (mm-inline-media-tests): Add audio. - (mm-inline-audio): New function. - -1998-09-11 08:19:22 Katsumi Yamaoka - - * gnus-art.el (article-make-date-line): Didn't work. - - * parse-time.el (parse-time-string): One too many nils. - -Fri Sep 11 08:09:40 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.25 is released. - -1998-09-11 07:38:14 Lars Magne Ingebrigtsen - - * gnus-art.el (article-remove-trailing-blank-lines): Don't remove - annotations. - - * gnus.el ((featurep 'gnus-xmas)): New - 'gnus-annotation-in-region-p alias. - -1998-09-10 06:20:52 Lars Magne Ingebrigtsen - - * mm-util.el (mm-with-unibyte-buffer): New function. - - * gnus-uu.el (gnus-quote-arg-for-sh-or-csh): Renamed. - - * mm-decode.el (mm-inline-media-tests): New variable. - - * gnus-sum.el (gnus-summary-exit): Destroy handles. - - * gnus-art.el (gnus-article-mime-handles): New variable. - - * drums.el (drums-narrow-to-header): New function. - - * gnus-art.el (article-decode-charset): Use it. - - * drums.el (drums-content-type-get): New function. - - * mm-util.el (mm-content-type-charset): Removed. - - * drums.el (drums-syntax-table): @ is word. - (drums-parse-content-type): New function. - - * parse-time.el (parse-time-rules): Parse "Wed, 29 Apr 98 0:26:01 - EDT" times. - - * gnus-util.el (gnus-date-get-time): Use safe date. - - * gnus-sum.el (gnus-show-mime): Removed. - (gnus-summary-toggle-mime): Removed. - - * gnus-art.el (gnus-strict-mime): Removed. - (gnus-article-prepare): Don't do MIME. - (gnus-decode-encoded-word-method): Removed. - (gnus-show-mime-method): Removed. - -Thu Sep 10 04:03:29 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.24 is released. - -1998-09-10 01:58:24 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-show-article): Don't decode chars if - PREFIX. - - * parse-time.el (parse-time-rules): Accept times that look like - "h:mm". - - * message.el (message-make-date): Use zone properly. - - * gnus.el: Autoload gnus-batch. - - * gnus-art.el (article-de-quoted-unreadable): Do not do - gnus-article-decode-rfc1522. - - * gnus-msg.el (gnus-inews-do-gcc): Use it. - - * gnus-int.el (gnus-request-accept-article): Accept a no-encode - param. - - * message.el (message-encode-message-body): Check for us-ascii. - - * gnus-msg.el (gnus-extended-version): Move Gnus version comments - to the left. - -1998-09-09 13:18:13 Lars Magne Ingebrigtsen - - * gnus-art.el (article-decode-charset): Rename. - -Wed Sep 9 12:25:48 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.23 is released. - -1998-09-09 12:14:47 Lars Magne Ingebrigtsen - - * gnus-util.el (gnus-parent-id): Ditto. - (gnus-put-text-property-excluding-newlines): Ditto. - - * gnus-sum.el (gnus-dependencies-add-header): Make into subst. - -1998-09-08 Karl Kleinpaste - - * message.el (message-generate-headers): Generate User-Agent - instead of X-Mailer & X-Newsreader. - - * gnus-msg.el (gnus-extended-version): Reformat for USEFOR - User-Agent header format. - -Tue Sep 8 22:38:27 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.22 is released. - -1998-09-08 22:36:54 Lars Magne Ingebrigtsen - - * mm-util.el (mm-multibyte-p): Typo. - -Tue Sep 8 22:25:53 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.21 is released. - -1998-09-08 Hrvoje Niksic - - * gnus-art.el (article-treat-dumbquotes): Handle \224 correctly. - -1998-09-08 22:18:03 Lars Magne Ingebrigtsen - - * mm-util.el (mm-multibyte-p): New function. - -Tue Sep 8 21:43:03 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.20 is released. - -1998-09-08 11:40:45 Lars Magne Ingebrigtsen - - * rfc2047.el (rfc2047-decode-region): Only decode when in - multibyte. - - * nnheader.el (nnheader-pathname-coding-system): Changed to binary. - - * gnus-int.el (gnus-request-replace-article): Encode. - (gnus-request-accept-article): Encode. - - * gnus-art.el (gnus-request-article-this-buffer): Decode charsets - here. - - * gnus.el (gnus-article-display-hook): Take the charset functions - out. - - * time-date.el (safe-date-to-time): New function. - - * gnus-util.el (gnus-dd-mmm): Protect against bogus dates. - -Tue Sep 8 07:09:28 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.19 is released. - -1998-09-08 04:51:39 Lars Magne Ingebrigtsen - - * base64.el (base64-encode-region): Accept no-line-break. - - * mm-util.el (mm-mime-charset): New function. - - * gnus-draft.el (gnus-draft-edit-message): Delete article. - -Tue Sep 8 04:29:23 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.18 is released. - -1998-09-08 02:21:36 Lars Magne Ingebrigtsen - - * message.el (message-send-and-exit): Return t on success. - (message-make-date): Make a proper time zone. - - * gnus-draft.el (gnus-draft-send): Only remove article if the - sending is successful. - - * drums.el (drums-get-comment): Return the last comment. - (drums-parse-address): Parse old-style From headers. - -1998-09-07 SL Baur - - * gnus-sum.el (gnus-data-compute-positions): Move below - `gnus-save-hidden-threads' so the former is correctly detected as - a macro. - -1998-09-06 Dave Love - - * gnus/nnweb.el (require): Wrap requirement of w3 and url in - ignore-errors too, eval'd when compile. Require w3 stuff at load - time for nicer failure if it's not available. - -1998-09-08 00:38:39 Lars Magne Ingebrigtsen - - * time-date.el (time-to-seconds): Renamed. - - * parse-time.el (parse-time-string): Downcase before handling. - (parse-time-rules): Times without seconds have 0 seconds. - - * rfc2047.el (rfc2047-encode-region): New version. - (rfc2047-dissect-region): New function. - -1998-09-07 01:08:35 Lars Magne Ingebrigtsen - - * message.el (message-make-date): Use symbolic zone. - -1998-09-06 23:23:06 Lars Magne Ingebrigtsen - - * time-date.el (parse-time): Always use parse-time. - - * parse-time.el (parse-time-syntax): Use vectors. - -Sun Sep 6 21:19:26 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.17 is released. - -1998-09-06 05:45:17 Lars Magne Ingebrigtsen - - * time-date.el: Renamed from "date". - - * gnus.el: Removed all timezone dependencies. - - * score-mode.el: Removed. - (gnus-score-edit-insert-date): Use date. - - * date.el (float-to-time): New function. - - * nnspool.el (nnspool-seconds-since-epoch): Removed. - - * date.el (time-to-float): New function. - - * message.el (message-make-date): Use format-time-string. - (message-make-expires): Use make-date. - - * gnus-xmas.el (gnus-xmas-seconds-since-epoch): Removed. - - * gnus-util.el (gnus-dd-mmm): Use date. - (gnus-sortable-date): Ditto. - - * message.el (message-make-date): Take an optional time. - - * gnus: Applied patches from 5.6.43. - - * date.el (if): Use parse-time. - - * gnus-score.el (gnus-summary-score-entry): Make into a command - again. - - * gnus-group.el (gnus-group-get-new-news-this-group): Only call if - gnus-agent. - - * gnus.el (gnus-agent-meta-information-header): Moved here. - -1998-09-05 Mike McEwan - - * gnus-agent.el (gnus-agent-scoreable-headers): New variable. - (gnus-agent-fetch-group-1): Score article headers using normal - group score files if the download score rule of a category/group - is `file'. - (gnus-agent-fetch-group-1): Don't parse the entire .overview when - deciding what articles to download. - (gnus-agent-fetch-group-1): Don't push headers through scoring and - predicate processing if predicate is `true' or `false'. - -1998-09-06 01:56:02 Lars Magne Ingebrigtsen - - * gnus-score.el (gnus-score-load-score-alist): Bind coding system. - - * gnus-art.el (gnus-article-setup-buffer): Enable multibyte. - - * score-mode.el (score-mode-coding-system): New variable. - (gnus-score-edit-exit): Use it. - -1998-09-04 Jason R Mastaler - - * drums.el: Corrected typo. - -1998-09-05 23:24:43 Hallvard B. Furuseth - - * mm-bodies.el (mm-body-encoding): Faster version. - -1998-09-05 22:23:03 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-decode-charset): Only decode text - things. - - * message.el (message-output): Use rmail. - - * rfc2047.el (rfc2047-encoded-word-regexp): Allow spaces in the - word part. - - * mm-util.el (mm-charset-to-coding-system): Use - rfc2047-default-charset. - (mm-known-charsets): New variable. - - * message.el (message-caesar-region): Bugged out. - -1998-09-06 Mike McEwan - - * gnus-agent.el (gnus-agent-fetch-group-1): Allow lists when - specifying `agent-predicate' in a group's parameters. - -Sat Sep 5 21:55:01 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.16 is released. - -1998-09-05 17:30:11 Lars Magne Ingebrigtsen - - * nnmail.el (nnmail-expired-article-p): Use predicate. - - * date.el (time-less-p): Renamed. - - * gnus-art.el (gnus-article-decode-charset): Really fetch headers - from the headers. - - * rfc2047.el (rfc2047-decode-region): Use the mm decoding - functions. - - * gnus-group.el (gnus-group-sort-selected-flat): Didn't work at - all. - (gnus-group-sort-selected-groups-by-alphabet): Changed interface - to all functions. - -Sat Sep 5 01:45:52 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.15 is released. - -1998-09-05 00:21:22 Lars Magne Ingebrigtsen - - * date.el: New file. - - * gnus-util.el (gnus-encode-date): Removed. - (gnus-time-less): Ditto. - - * nnmail.el (nnmail-date-to-time): Removed. - (nnmail-time-less): Ditto. - (nnmail-days-to-time): Ditto. - (nnmail-time-since): Ditto. - - * drums.el: New file. - -1998-09-04 00:25:52 Lars Magne Ingebrigtsen - - * message.el (message-encode-message-body): Encode headers with - body encoding. - - * rfc2047.el (rfc2047-default-charset): Renamed. - (rfc2047-encodable-p): Use it. - - * base64.el (mm-util): Required. - -1998-09-03 16:28:30 Lars Magne Ingebrigtsen - - * gnus-msg.el (gnus-post-method): Peel off real info from opened - servers. - - * gnus-util.el (gnus-output-to-rmail): Removed. - - * gnus-art.el (gnus-summary-save-in-rmail): Use - gnus-output-to-rmailrmail-output-to-rmail-file. - - * rfc2047.el (rfc2047-decode-region): Fold case. - (rfc2047-decode): Use decode-string. - - * mm-util.el: Provide mm-char-int. - -Thu Sep 3 15:23:22 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.14 is released. - -1998-09-03 15:08:30 Lars Magne Ingebrigtsen - - * mm-bodies.el (mm-body-encoding): Go through the buffer to make - sure we have 7bit. - -1998-09-02 14:38:18 Lars Magne Ingebrigtsen - - * gnus-msg.el (gnus-post-method): Use opened servers, and remove - ducplicates. - (gnus-inews-insert-mime-headers): Removed. - - * message.el (message-caesar-region): Protect against MULE chars. - -1998-09-02 00:36:23 Hallvard B. Furuseth - - * mm-util.el (if): fset the right function. - -1998-09-02 00:31:53 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-decode-charset): Use real - read-coding-system. - -1998-09-01 17:58:40 Lars Magne Ingebrigtsen - - * mm-bodies.el (mm-decode-body): Protect against malformed - base64. - (mm-decode-body): Check that buffer-file-coding-system is - non-nil. - -Tue Sep 1 10:29:33 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.13 is released. - -1998-09-01 09:14:33 Lars Magne Ingebrigtsen - - * gnus-util.el (gnus-strip-whitespace): Already defined. - Removed. - - * gnus-art.el (gnus-article-decode-charset): Strip whitespace. - - * gnus-util.el (gnus-strip-whitespace): New function. - - * mm-util.el (mm-content-type-charset): Downcase. - -1998-08-31 23:04:29 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-decode-charset): Accept a prefix. - (gnus-article-decode-charset): Don't fetch all headers. - - * mm-util.el (mm-read-coding-system): New function. - - * mm-bodies.el (mm-decode-body): Check the right charset. - - * gnus-sum.el (gnus-summary-mode-line-format): Ditto. - - * gnus-art.el (gnus-article-mode-line-format): Use short group - format. - -Mon Aug 31 23:03:13 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.12 is released. - -1998-08-31 22:39:36 Lars Magne Ingebrigtsen - - * mm-bodies.el (mm-decode-body): Don't do charset unless MULE. - - * gnus-art.el (gnus-article-decode-charset): Supply cte. - (gnus-article-decode-charset): Always run. - - * mm-bodies.el (mm-decode-body): Decode cte. - -Mon Aug 31 22:14:50 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.11 is released. - -1998-08-31 14:27:25 Lars Magne Ingebrigtsen - - * message.el (message-encode-message-body): Ditto. - - * gnus-art.el (gnus-article-decode-mime-words): New command and - keystroke. - (gnus-article-decode-charset): Ditto. - (gnus-article-decode-charset): Only work under MULE. - - * mm-util.el (mm-content-type-charset): New function. - - * nnmail.el (nnmail-delete-incoming): Changed to nil. - - * message.el (message-send-mail): Insert MIME headers. - (message-check-news-body-syntax): Don't warn for escape sequences. - (message-check-news-body-syntax): Insert MIME headers. - - * mm-bodies.el (mm-body-encoding): New function. - - * message.el (message-encode-message-body): New function. - - * mm-bodies.el: New file. - - * mm-util.el (mm-narrow-to-head): New function. - - * rfc2047.el (rfc2047-encode): Use it. - - * mm-util.el: Provide mm-encode-coding-region. - - * gnus-sum.el (gnus-summary-mode): Enable multibyte. - - * gnus-util.el (gnus-set-work-buffer): Enable multibyte. - - * mm-util.el (mm-enable-multibyte): New function. - - * message.el (message-set-work-buffer): Set multibyte. - - * gnus.el (gnus-continuum-version): Be valid forever and ever. - - * gnus-util.el (gnus-point-at-eol): Removed. - (gnus-point-at-bol): Ditto. - - * base64.el (base64-decode-region): Commented out messaging. - -1998-08-31 Didier Verna - - * gnus-msg.el (gnus-group-mail): make it behave like - gnus-group-post-news with regards to the prefix (this enables the - use of posting styles). - -1998-08-31 12:53:32 Lars Magne Ingebrigtsen - - * gnus.el (gnus-article-display-hook): Added - gnus-article-decode-rfc1522 to hook. - -Mon Aug 31 12:43:46 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.10 is released. - -1998-08-31 11:45:13 Lars Magne Ingebrigtsen - - * nnfolder.el (nnfolder-delete-mail): Narrow to mail and allow - hook to be run. - -1998-08-30 17:59:07 Lars Magne Ingebrigtsen - - * rfc2047.el (rfc2047-encodable-p): Use find-charset-region. - - * mm-util.el (mm-charsets-in-region): Removed. - - * rfc2047.el: Renamed file. - - * gnus-msg.el (gnus-copy-article-buffer): Multibyte. - - * message.el (message-mode): Set multibyte. - - * mm-util.el (mm-charsets-in-region): Copied here. - - * gnus-util.el: Removed gnus-truncate-string. - - * gnus-art.el (gnus-article-decode-mime-words): Use 1522. - - * rfc1522.el (rfc1522-unencoded-charsets): New variable. - (rfc1522-encodable-p): New function. - (rfc1522-encode-message-header): Use it. - -Sun Aug 30 17:46:01 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.9 is released. - -1998-08-30 16:13:08 Lars Magne Ingebrigtsen - - * mm-util.el: Shadow encode-coding-string. - - * base64.el (base64-encode-region): Don't add newline. - - * rfc1522.el (rfc1522-narrow-to-field): Copied here. - - * mm-util.el: New file. - - * mm-decode.el: Somewhat depleted. - * mm-encode.el: Ditto. - - * rfc1522.el: New file. - - * mm-util.el (mm-replace-chars-in-string): Copied here. - - * mm-encode.el (mm-q-encode-region): New function. - - * qp.el (quoted-printable-encode-region): Take an optional CLASS - param. - - * mm-encode.el (mm-encode-word-region): Downcase. - -Sun Aug 30 15:28:01 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.8 is released. - -1998-08-30 12:23:03 Lars Magne Ingebrigtsen - - * message.el (message-send-mail): Encode headers. - - * qp.el (quoted-printable-encode-region): Encode 8-bit words. - (quoted-printable-encode-region): Upcase. - - * message.el (message-default-charset): New variable. - - * qp.el (quoted-printable-encode-region): Optional param FOLD. - - * message.el (message-narrow-to-field): Changed name. - - * mm-encode.el: New file. - - * message.el (message-narrow-to-header): New function. - - * gnus-art.el (gnus-article-decode-mime-words): Place point in the - right buffer. - -Sun Aug 30 12:15:54 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.7 is released. - -1998-08-30 01:26:12 Lars Magne Ingebrigtsen - - * gnus.el: Remove autoload for - gnus-article-mime-decode-quoted-printable. - - * mm-decode.el (mm-charset-to-coding-system): Allow iso-8859-1 to - be decoded in non-MULE Emacsen. - - * gnus-xmas.el (gnus-xmas-logo-color-alist): More brown. - -1998-08-29 SL Baur - - * gnus-xmas.el (gnus-xmas-logo-color-alist): Try shades of brown. - -1998-08-30 01:04:57 Lars Magne Ingebrigtsen - - * mm-decode.el: Check for coding-system-list. - -Sun Aug 30 00:59:15 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.6 is released. - -1998-08-30 00:36:28 Lars Magne Ingebrigtsen - - * nnheader.el (fboundp): Protect code-coding-string. - - * gnus-art.el (gnus-article-mode): Check that set-buffer-multibyte - is available. - -Sat Aug 29 23:24:31 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.5 is released. - -1998-08-29 22:38:35 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-mode): Make article buffer multibyte. - (gnus-hack-decode-rfc1522): Removed. - - * mm-decode.el (mm-charset-coding-system-alist): Check better. - -Sat Aug 29 22:20:39 1998 Lars Magne Ingebrigtsen - - * gnus.el: Gnus v0.4 is released. - -1998-08-29 20:53:29 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-decode-mime-words): New command and - keystroke. - - * qp.el (quoted-printable-decode-region): Don't use hexl. - - * gnus-xmas.el (gnus-xmas-logo-color-style): Changed to dino. - - * gnus-sum.el (gnus-parse-headers-hook): Default to nil. - (gnus-structured-field-decoder): Removed. - (gnus-unstructured-field-decoder): Ditto. - - * mm-decode.el: New file. - - * qp.el: New file. - - * gnus-art.el (article-mime-decode-quoted-printable): Removed. - - * gnus-ems.el (fboundp): Removed gnus-split-string. - - * gnus.el (gnus-splash-face): Doc fix. - - * gnus-ems.el (fboundp): Don't bind mail-file-babyl-p. - - * gnus-art.el (article-mime-decode-quoted-printable): Don't use - hexl. - - * nnheader.el (nnheader-temp-write): Removed. - -Sat Aug 29 20:34:17 1998 Lars Magne Ingebrigtsen - - * gnus.el: Gnus v0.3 is released. - -Sat Aug 29 19:32:06 1998 Lars Magne Ingebrigtsen - - * gnus.el: Gnus v0.2 is released. - -;; Local Variables: -;; coding: iso-2022-7bit -;; End: diff --git a/lisp/Makefile.in b/lisp/Makefile.in deleted file mode 100644 index 0bac6c5..0000000 --- a/lisp/Makefile.in +++ /dev/null @@ -1,119 +0,0 @@ -datadir = @datadir@ -lispdir = @lispdir@ -prefix = @prefix@ -srcdir = @srcdir@ -subdir = lisp -top_srcdir = @top_srcdir@ - -EMACS = @EMACS@ -FLAGS = -batch -q -no-site-file -l $(srcdir)/dgnushack.el -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -SHELL = /bin/sh -VPATH = @srcdir@ -PACKAGEDIR = @PACKAGEDIR@ -W3DIR = @W3@ -URLDIR = @URL@ -EMACS_COMP = URLDIR=$(URLDIR) W3DIR=$(W3DIR) lispdir=$(lispdir) srcdir=$(srcdir) $(EMACS) $(FLAGS) -GNUS_PRODUCT_NAME = @GNUS_PRODUCT_NAME@ -EXPORTING_FILES = $(EMACS_COMP) -f dgnushack-exporting-files 2>/dev/null - -# We should never use `COMMAND && ...' form, use `if COMMAND then ...' -# form instead. Because, as far as we know, FreeBSD's native make will -# be discontinued if COMMAND returns a non-zero exit status. - -all total: clean-some gnus-load.elc - $(EMACS_COMP) -f dgnushack-compile - -clean-some: - rm -f *.elc gnus-load.el - -warn: clean-some gnus-load.elc - $(EMACS_COMP) --eval '(dgnushack-compile t)' 2>&1 | egrep -v "variable G|inhibit-point-motion-hooks|coding-system|temp-results|variable gnus|variable nn|scroll-in-place|deactivate-mark|filladapt-mode|byte-code-function-p|print-quoted|ps-right-header|ps-left-header|article-inhibit|print-escape|ssl-program-arguments|message-log-max" - -# The "clever" rule is unsafe, since redefined macros are loaded from -# .elc files, and not the .el file. -clever some: gnus-load.elc - @if test -f $(srcdir)/gnus.elc; then \ - echo \ - "checking whether the all elc files should be recompiled..."; \ - RM_ELC=nil; \ - if test `$(EMACS) -batch -q -no-site-file \ - -eval '(prin1 (featurep (quote xemacs)))' \ - 2>/dev/null` = t; then \ - if test ! -f $(srcdir)/gnus-xmas.elc; then RM_ELC=t; fi; \ - else \ - if test -f $(srcdir)/gnus-xmas.elc; then RM_ELC=t; fi; \ - fi; \ - if test $$RM_ELC = t; then \ - echo " => maybe yes;" \ - "rm -f *.elc auto-autoloads.el custom-load.el"; \ - rm -f *.elc auto-autoloads.el custom-load.el; \ - else \ - echo " => maybe unnecessary"; \ - fi; \ - fi - $(EMACS_COMP) -f dgnushack-compile - -install: clever install-without-compiling - -install-without-compiling: - $(SHELL) $(top_srcdir)/mkinstalldirs $(lispdir) - @for p in `$(EXPORTING_FILES)`; do \ - echo " $(INSTALL_DATA) $$p $(lispdir)/$$p"; \ - $(INSTALL_DATA) $$p $(lispdir)/$$p; \ - if test -f $$p"c"; then \ - echo " $(INSTALL_DATA) $$p""c"" $(lispdir)/$$p""c"; \ - $(INSTALL_DATA) $$p"c" $(lispdir)/$$p"c"; \ - fi; \ - done - -# Rule for XEmacs package. -install-package-manifest: - $(EMACS_COMP) -f dgnushack-install-package-manifest \ - $(PACKAGEDIR) $(GNUS_PRODUCT_NAME) - -compose-package: gnus-load.elc - $(EMACS_COMP) -f dgnushack-compose-package - -remove-extra-files-in-package: - $(EMACS_COMP) -f dgnushack-remove-extra-files-in-package \ - $(PACKAGEDIR) $(GNUS_PRODUCT_NAME) -# - -install-el: - $(SHELL) $(top_srcdir)/mkinstalldirs $(lispdir) - cd $(srcdir) \ - && for p in *.el; do \ - echo " $(INSTALL_DATA) $$p $(lispdir)/$$p"; \ - $(INSTALL_DATA) $$p $(lispdir)/$$p; \ - done - -tags: - etags *.el - -separately: - rm -f *.elc ; for i in *.el; do $(EMACS) $(FLAGS) -f batch-byte-compile $$i; done - -pot: - xpot -drgnus -r`cat ./version` *.el > rgnus.pot - -gnus-load.elc: - $(EMACS_COMP) -f dgnushack-make-cus-load $(srcdir) - $(EMACS_COMP) -f dgnushack-make-auto-load $(srcdir) - $(EMACS_COMP) -f dgnushack-make-load - -clean: - rm -f *.orig *.rej *.elc *~ \ - auto-autoloads.el custom-load.el gnus-load.el dgnuskwds.el - -distclean: clean - rm -f Makefile dgnuspath.el - -Makefile: $(srcdir)/Makefile.in ../config.status - cd .. \ - && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/lisp/base64.el b/lisp/base64.el deleted file mode 100644 index 26415a2..0000000 --- a/lisp/base64.el +++ /dev/null @@ -1,54 +0,0 @@ -;;; base64.el --- Base64 encoding functions using MEL -;; Copyright (C) 2000, 2001 Free Software Foundation, Inc. - -;; Author: T-gnus development team -;; Keywords: extensions - -;; This file is part of T-gnus. - -;; 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, 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; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-and-compile - (defun base64-autoload-functionp (object) - (if (functionp object) - (let ((def object)) - (while (and (symbolp def) (fboundp def)) - (setq def (symbol-function def))) - (eq (car-safe def) 'autoload)))) - - (if (base64-autoload-functionp 'base64-decode-string) - (fmakunbound 'base64-decode-string)) - (if (base64-autoload-functionp 'base64-decode-region) - (fmakunbound 'base64-decode-region)) - (if (base64-autoload-functionp 'base64-encode-string) - (fmakunbound 'base64-encode-string)) - (if (base64-autoload-functionp 'base64-encode-region) - (fmakunbound 'base64-encode-region)) - - (require 'mel) - - (mel-find-function 'mime-decode-string "base64") - (mel-find-function 'mime-decode-region "base64") - (mel-find-function 'mime-encode-string "base64") - (mel-find-function 'mime-encode-region "base64")) - -(provide 'base64) - -;;; base64.el ends here diff --git a/lisp/binhex.el b/lisp/binhex.el deleted file mode 100644 index 6d8d434..0000000 --- a/lisp/binhex.el +++ /dev/null @@ -1,301 +0,0 @@ -;;; binhex.el --- elisp native binhex decode -;; Copyright (c) 1998, 1999, 2000 Free Software Foundation, Inc. - -;; Author: Shenghuo Zhu -;; Keywords: binhex news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(eval-and-compile - (defalias 'binhex-char-int - (if (fboundp 'char-int) - 'char-int - 'identity))) - -(defvar binhex-decoder-program "hexbin" - "*Non-nil value should be a string that names a uu decoder. -The program should expect to read binhex data on its standard -input and write the converted data to its standard output.") - -(defvar binhex-decoder-switches '("-d") - "*List of command line flags passed to the command named by binhex-decoder-program.") - -(defconst binhex-alphabet-decoding-alist - '(( ?\! . 0) ( ?\" . 1) ( ?\# . 2) ( ?\$ . 3) ( ?\% . 4) ( ?\& . 5) - ( ?\' . 6) ( ?\( . 7) ( ?\) . 8) ( ?\* . 9) ( ?\+ . 10) ( ?\, . 11) - ( ?\- . 12) ( ?0 . 13) ( ?1 . 14) ( ?2 . 15) ( ?3 . 16) ( ?4 . 17) - ( ?5 . 18) ( ?6 . 19) ( ?8 . 20) ( ?9 . 21) ( ?@ . 22) ( ?A . 23) - ( ?B . 24) ( ?C . 25) ( ?D . 26) ( ?E . 27) ( ?F . 28) ( ?G . 29) - ( ?H . 30) ( ?I . 31) ( ?J . 32) ( ?K . 33) ( ?L . 34) ( ?M . 35) - ( ?N . 36) ( ?P . 37) ( ?Q . 38) ( ?R . 39) ( ?S . 40) ( ?T . 41) - ( ?U . 42) ( ?V . 43) ( ?X . 44) ( ?Y . 45) ( ?Z . 46) ( ?\[ . 47) - ( ?\` . 48) ( ?a . 49) ( ?b . 50) ( ?c . 51) ( ?d . 52) ( ?e . 53) - ( ?f . 54) ( ?h . 55) ( ?i . 56) ( ?j . 57) ( ?k . 58) ( ?l . 59) - ( ?m . 60) ( ?p . 61) ( ?q . 62) ( ?r . 63))) - -(defun binhex-char-map (char) - (cdr (assq char binhex-alphabet-decoding-alist))) - -;;;###autoload -(defconst binhex-begin-line - "^:...............................................................$") -(defconst binhex-body-line - "^[^:]...............................................................$") -(defconst binhex-end-line ":$") - -(defvar binhex-temporary-file-directory - (cond ((fboundp 'temp-directory) (temp-directory)) - ((boundp 'temporary-file-directory) temporary-file-directory) - ("/tmp/"))) - -(if (featurep 'xemacs) - (defalias 'binhex-insert-char 'insert-char) - (defun binhex-insert-char (char &optional count ignored buffer) - (if (or (null buffer) (eq buffer (current-buffer))) - (insert-char char count) - (with-current-buffer buffer - (insert-char char count))))) - -(defvar binhex-crc-table - [0 4129 8258 12387 16516 20645 24774 28903 - 33032 37161 41290 45419 49548 53677 57806 61935 - 4657 528 12915 8786 21173 17044 29431 25302 - 37689 33560 45947 41818 54205 50076 62463 58334 - 9314 13379 1056 5121 25830 29895 17572 21637 - 42346 46411 34088 38153 58862 62927 50604 54669 - 13907 9842 5649 1584 30423 26358 22165 18100 - 46939 42874 38681 34616 63455 59390 55197 51132 - 18628 22757 26758 30887 2112 6241 10242 14371 - 51660 55789 59790 63919 35144 39273 43274 47403 - 23285 19156 31415 27286 6769 2640 14899 10770 - 56317 52188 64447 60318 39801 35672 47931 43802 - 27814 31879 19684 23749 11298 15363 3168 7233 - 60846 64911 52716 56781 44330 48395 36200 40265 - 32407 28342 24277 20212 15891 11826 7761 3696 - 65439 61374 57309 53244 48923 44858 40793 36728 - 37256 33193 45514 41451 53516 49453 61774 57711 - 4224 161 12482 8419 20484 16421 28742 24679 - 33721 37784 41979 46042 49981 54044 58239 62302 - 689 4752 8947 13010 16949 21012 25207 29270 - 46570 42443 38312 34185 62830 58703 54572 50445 - 13538 9411 5280 1153 29798 25671 21540 17413 - 42971 47098 34713 38840 59231 63358 50973 55100 - 9939 14066 1681 5808 26199 30326 17941 22068 - 55628 51565 63758 59695 39368 35305 47498 43435 - 22596 18533 30726 26663 6336 2273 14466 10403 - 52093 56156 60223 64286 35833 39896 43963 48026 - 19061 23124 27191 31254 2801 6864 10931 14994 - 64814 60687 56684 52557 48554 44427 40424 36297 - 31782 27655 23652 19525 15522 11395 7392 3265 - 61215 65342 53085 57212 44955 49082 36825 40952 - 28183 32310 20053 24180 11923 16050 3793 7920]) - -(defun binhex-update-crc (crc char &optional count) - (if (null count) (setq count 1)) - (while (> count 0) - (setq crc (logxor (logand (lsh crc 8) 65280) - (aref binhex-crc-table - (logxor (logand (lsh crc -8) 255) - char))) - count (1- count))) - crc) - -(defun binhex-verify-crc (buffer start end) - (with-current-buffer buffer - (let ((pos start) (crc 0) (last (- end 2))) - (while (< pos last) - (setq crc (binhex-update-crc crc (char-after pos)) - pos (1+ pos))) - (if (= crc (binhex-string-big-endian (buffer-substring last end))) - nil - (error "CRC error"))))) - -(defun binhex-string-big-endian (string) - (let ((ret 0) (i 0) (len (length string))) - (while (< i len) - (setq ret (+ (lsh ret 8) (binhex-char-int (aref string i))) - i (1+ i))) - ret)) - -(defun binhex-string-little-endian (string) - (let ((ret 0) (i 0) (shift 0) (len (length string))) - (while (< i len) - (setq ret (+ ret (lsh (binhex-char-int (aref string i)) shift)) - i (1+ i) - shift (+ shift 8))) - ret)) - -(defun binhex-header (buffer) - (with-current-buffer buffer - (let ((pos (point-min)) len) - (vector - (prog1 - (setq len (binhex-char-int (char-after pos))) - (setq pos (1+ pos))) - (buffer-substring pos (setq pos (+ pos len))) - (prog1 - (setq len (binhex-char-int (char-after pos))) - (setq pos (1+ pos))) - (buffer-substring pos (setq pos (+ pos 4))) - (buffer-substring pos (setq pos (+ pos 4))) - (binhex-string-big-endian - (buffer-substring pos (setq pos (+ pos 2)))) - (binhex-string-big-endian - (buffer-substring pos (setq pos (+ pos 4)))) - (binhex-string-big-endian - (buffer-substring pos (setq pos (+ pos 4)))))))) - -(defvar binhex-last-char) -(defvar binhex-repeat) - -(defun binhex-push-char (char &optional count ignored buffer) - (cond - (binhex-repeat - (if (eq char 0) - (binhex-insert-char (setq binhex-last-char 144) 1 - ignored buffer) - (binhex-insert-char binhex-last-char (- char 1) - ignored buffer) - (setq binhex-last-char nil)) - (setq binhex-repeat nil)) - ((= char 144) - (setq binhex-repeat t)) - (t - (binhex-insert-char (setq binhex-last-char char) 1 ignored buffer)))) - -(defun binhex-decode-region (start end &optional header-only) - "Binhex decode region between START and END. -If HEADER-ONLY is non-nil only decode header and return filename." - (interactive "r") - (let ((work-buffer nil) - (counter 0) - (bits 0) (tmp t) - (lim 0) inputpos - (non-data-chars " \t\n\r:") - file-name-length data-fork-start - header - binhex-last-char binhex-repeat) - (unwind-protect - (save-excursion - (goto-char start) - (when (re-search-forward binhex-begin-line end t) - (let (default-enable-multibyte-characters) - (setq work-buffer (generate-new-buffer " *binhex-work*"))) - (beginning-of-line) - (setq bits 0 counter 0) - (while tmp - (skip-chars-forward non-data-chars end) - (setq inputpos (point)) - (end-of-line) - (setq lim (point)) - (while (and (< inputpos lim) - (setq tmp (binhex-char-map (char-after inputpos)))) - (setq bits (+ bits tmp) - counter (1+ counter) - inputpos (1+ inputpos)) - (cond ((= counter 4) - (binhex-push-char (lsh bits -16) 1 nil work-buffer) - (binhex-push-char (logand (lsh bits -8) 255) 1 nil - work-buffer) - (binhex-push-char (logand bits 255) 1 nil - work-buffer) - (setq bits 0 counter 0)) - (t (setq bits (lsh bits 6))))) - (if (null file-name-length) - (with-current-buffer work-buffer - (setq file-name-length (char-after (point-min)) - data-fork-start (+ (point-min) - file-name-length 22)))) - (if (and (null header) - (with-current-buffer work-buffer - (>= (buffer-size) data-fork-start))) - (progn - (binhex-verify-crc work-buffer - 1 data-fork-start) - (setq header (binhex-header work-buffer)) - (if header-only (setq tmp nil counter 0)))) - (setq tmp (and tmp (not (eq inputpos end))))) - (cond - ((= counter 3) - (binhex-push-char (logand (lsh bits -16) 255) 1 nil - work-buffer) - (binhex-push-char (logand (lsh bits -8) 255) 1 nil - work-buffer)) - ((= counter 2) - (binhex-push-char (logand (lsh bits -10) 255) 1 nil - work-buffer)))) - (if header-only nil - (binhex-verify-crc work-buffer - data-fork-start - (+ data-fork-start (aref header 6) 2)) - (or (markerp end) (setq end (set-marker (make-marker) end))) - (goto-char start) - (insert-buffer-substring work-buffer - data-fork-start (+ data-fork-start - (aref header 6))) - (delete-region (point) end))) - (and work-buffer (kill-buffer work-buffer))) - (if header (aref header 1)))) - -(defun binhex-decode-region-external (start end) - "Binhex decode region between START and END using external decoder." - (interactive "r") - (let ((cbuf (current-buffer)) firstline work-buffer status - (file-name (expand-file-name - (concat (binhex-decode-region start end t) ".data") - binhex-temporary-file-directory))) - (save-excursion - (goto-char start) - (when (re-search-forward binhex-begin-line nil t) - (let ((cdir default-directory) default-process-coding-system) - (unwind-protect - (progn - (set-buffer (setq work-buffer - (generate-new-buffer " *binhex-work*"))) - (buffer-disable-undo work-buffer) - (insert-buffer-substring cbuf firstline end) - (cd binhex-temporary-file-directory) - (apply 'call-process-region - (point-min) - (point-max) - binhex-decoder-program - nil - nil - nil - binhex-decoder-switches)) - (cd cdir) (set-buffer cbuf))) - (if (and file-name (file-exists-p file-name)) - (progn - (goto-char start) - (delete-region start end) - (let (format-alist) - (insert-file-contents-literally file-name))) - (error "Can not binhex"))) - (and work-buffer (kill-buffer work-buffer)) - (ignore-errors - (if file-name (delete-file file-name)))))) - -(provide 'binhex) - -;;; binhex.el ends here diff --git a/lisp/dgnushack.el b/lisp/dgnushack.el deleted file mode 100644 index 3496035..0000000 --- a/lisp/dgnushack.el +++ /dev/null @@ -1,782 +0,0 @@ -;;; dgnushack.el --- a hack to set the load path for byte-compiling -;; Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Katsumi Yamaoka -;; Version: 4.19 -;; Keywords: news, path - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -;; Set coding priority of Shift-JIS to the bottom. -(if (featurep 'xemacs) - (defalias 'set-coding-priority 'ignore) - (defalias 'coding-priority-list 'ignore) - (defalias 'set-coding-priority-list 'ignore)) -(cond ((and (featurep 'xemacs) (featurep 'mule)) - (if (memq 'shift-jis (coding-priority-list)) - (set-coding-priority-list - (append (delq 'shift-jis (coding-priority-list)) '(shift-jis))))) - ((boundp 'MULE) - (put '*coding-category-sjis* 'priority (length *predefined-category*))) - ((featurep 'mule) - (if (memq 'coding-category-sjis coding-category-list) - (set-coding-priority - (append (delq 'coding-category-sjis - (copy-sequence coding-category-list)) - '(coding-category-sjis)))))) - -(defalias 'facep 'ignore) - -(require 'cl) -(unless (dolist (var nil t)) - ;; Override the macro `dolist' which may have been defined in egg.el. - (load "cl-macs" nil t)) - -(defvar srcdir (or (getenv "srcdir") ".")) - -(let ((urldir (getenv "URLDIR"))) - (unless (zerop (length urldir)) - (push (file-name-as-directory urldir) load-path))) - -(defvar dgnushack-w3-directory (let ((w3dir (getenv "W3DIR"))) - (unless (zerop (length w3dir)) - (file-name-as-directory w3dir)))) -(when dgnushack-w3-directory - (push dgnushack-w3-directory load-path)) - -;; If we are building w3 in a different directory than the source -;; directory, we must read *.el from source directory and write *.elc -;; into the building directory. For that, we define this function -;; before loading bytecomp. Bytecomp doesn't overwrite this function. -(defun byte-compile-dest-file (filename) - "Convert an Emacs Lisp source file name to a compiled file name. - In addition, remove directory name part from FILENAME." - (setq filename (byte-compiler-base-file-name filename)) - (setq filename (file-name-sans-versions filename)) - (setq filename (file-name-nondirectory filename)) - (if (memq system-type '(win32 w32 mswindows windows-nt)) - (setq filename (downcase filename))) - (cond ((eq system-type 'vax-vms) - (concat (substring filename 0 (string-match ";" filename)) "c")) - ((string-match emacs-lisp-file-regexp filename) - (concat (substring filename 0 (match-beginning 0)) ".elc")) - (t (concat filename ".elc")))) - -(require 'bytecomp) - -(when (boundp 'MULE) - (let (current-load-list) - ;; Make the function to be silent at compile-time. - (defun locate-library (library &optional nosuffix) - "Show the full path name of Emacs library LIBRARY. -This command searches the directories in `load-path' like `M-x load-library' -to find the file that `M-x load-library RET LIBRARY RET' would load. -Optional second arg NOSUFFIX non-nil means don't add suffixes `.elc' or `.el' -to the specified name LIBRARY (a la calling `load' instead of `load-library')." - (interactive "sLocate library: ") - (catch 'answer - (mapcar - '(lambda (dir) - (mapcar - '(lambda (suf) - (let ((try (expand-file-name (concat library suf) dir))) - (and (file-readable-p try) - (null (file-directory-p try)) - (progn - (or noninteractive - (message "Library is file %s" try)) - (throw 'answer try))))) - (if nosuffix '("") '(".elc" ".el" "")))) - load-path) - (or noninteractive - (message "No library %s in search path" library)) - nil)) - (byte-compile 'locate-library))) - -(unless (fboundp 'si:byte-optimize-form-code-walker) - (byte-optimize-form nil);; Load `byte-opt' or `byte-optimize'. - (setq max-specpdl-size 3000) - (defalias 'si:byte-optimize-form-code-walker - (symbol-function 'byte-optimize-form-code-walker)) - (defun byte-optimize-form-code-walker (form for-effect) - (if (and for-effect (memq (car-safe form) '(and or))) - ;; Fix bug in and/or forms. - (let ((fn (car form)) - (backwards (reverse (cdr form)))) - (while (and backwards - (null (setcar backwards - (byte-optimize-form (car backwards) t)))) - (setq backwards (cdr backwards))) - (if (and (cdr form) (null backwards)) - (byte-compile-log - " all subforms of %s called for effect; deleted" form)) - (if backwards - (let ((head backwards)) - (while (setq backwards (cdr backwards)) - (setcar backwards (byte-optimize-form (car backwards) - nil))) - (cons fn (nreverse head))))) - (si:byte-optimize-form-code-walker form for-effect))) - (byte-compile 'byte-optimize-form-code-walker)) - -(condition-case nil - (char-after) - (wrong-number-of-arguments - ;; Optimize byte code for `char-after'. - (put 'char-after 'byte-optimizer 'byte-optimize-char-after) - (defun byte-optimize-char-after (form) - (if (null (cdr form)) - '(char-after (point)) - form)))) - -(condition-case nil - (char-before) - (wrong-number-of-arguments - ;; Optimize byte code for `char-before'. - (put 'char-before 'byte-optimizer 'byte-optimize-char-before) - (defun byte-optimize-char-before (form) - (if (null (cdr form)) - '(char-before (point)) - form)))) - -(load (expand-file-name "dgnuspath.el" srcdir) nil nil t) - -(condition-case err - (load "~/.lpath.el" t nil t) - (error (message "Error in \"~/.lpath.el\" file: %s" err))) - -;; Don't load path-util until `char-after' and `char-before' have been -;; optimized because it requires `poe' and then modify the functions. - -;; If the APEL modules are installed under the non-standard directory, -;; for example "/var/home/john/lisp/apel-VERSION/", you should add that -;; name using the configure option "--with-addpath=". -;; And also the directory where the EMU modules are installed, for -;; example "/usr/local/share/mule/19.34/site-lisp/", it should be -;; included in the standard `load-path' or added by the configure -;; option "--with-addpath=". -(let ((path (or (locate-library "path-util") - (locate-library "apel/path-util")));; backward compat. - parent lpath) - (if path - (progn - (when (string-match "/$" (setq path (file-name-directory path))) - (setq path (substring path 0 (match-beginning 0)))) - ;; path == "/var/home/john/lisp/apel-VERSION" - (when (string-match "/$" (setq parent (file-name-directory path))) - (setq parent (substring path 0 (match-beginning 0)))) - ;; parent == "/var/home/john/lisp" - (if (setq lpath (or (member path load-path) - (member (file-name-as-directory path) load-path))) - (unless (or (member parent load-path) - (member (file-name-as-directory parent) load-path)) - (push parent (cdr lpath))) - (push path load-path) - (unless (or (member parent load-path) - (member (file-name-as-directory parent) load-path)) - (push parent (cdr load-path)))) - (require 'path-util)) - (error " -APEL modules are not found in %s. -Try to re-configure with --with-addpath=APEL_PATH and run make again. -" - load-path))) - -(unless (locate-library "mel") - (add-path "flim")) -(unless (module-installed-p 'mel) - ;; FLIM 1.14 may have installed in two "flim" subdirectories. - (push (expand-file-name "flim" - (file-name-directory (get-latest-path "^apel$" t))) - load-path) - (unless (module-installed-p 'mel) - (error " -FLIM modules does not found in %s. -Try to re-configure with --with-addpath=FLIM_PATH and run make again. -" - load-path))) -(add-path "semi") - -(push srcdir load-path) -(load (expand-file-name "lpath.el" srcdir) nil t t) - -(load (expand-file-name "gnus-clfns.el" srcdir) nil t t) - -(require 'custom) - -;; Bind functions defined by `defun-maybe'. -(put 'defun-maybe 'byte-hunk-handler 'byte-compile-file-form-defun-maybe) -(defun byte-compile-file-form-defun-maybe (form) - (if (and (not (fboundp (nth 1 form))) - (memq 'unresolved byte-compile-warnings)) - (setq byte-compile-function-environment - (cons (cons (nth 1 form) - (cons 'lambda (cdr (cdr form)))) - byte-compile-function-environment))) - form) - -(condition-case nil - :symbol-for-testing-whether-colon-keyword-is-available-or-not - (void-variable - (defun dgnushack-bind-colon-keywords () - "Bind all the colon keywords for old Emacsen." - (let ((cache (expand-file-name "dgnuskwds.el" srcdir)) - (makefile (expand-file-name "Makefile" srcdir)) - (buffer (get-buffer-create " *colon keywords*")) - keywords ignores files file dirs dir form elem make-backup-files) - (save-excursion - (set-buffer buffer) - (let (buffer-file-format - format-alist - insert-file-contents-post-hook - insert-file-contents-pre-hook - jam-zcat-filename-list - jka-compr-compression-info-list) - (if (and (file-exists-p cache) - (file-exists-p makefile) - (file-newer-than-file-p cache makefile)) - (progn - (insert-file-contents cache nil nil nil t) - (setq keywords (read buffer))) - (setq - ignores - '(:symbol-for-testing-whether-colon-keyword-is-available-or-not - ;; The following keywords will be bound by CUSTOM. - :get :group :initialize :link :load :options :prefix - :require :set :tag :type) - files (list (locate-library "semi-def") - (locate-library "mailcap") - (locate-library "mime-def") - (locate-library "path-util") - (locate-library "poem")) - dirs (list (file-name-as-directory (expand-file-name srcdir)))) - (while files - (when (setq file (pop files)) - (setq dir (file-name-directory file)) - (unless (member dir dirs) - (push dir dirs)))) - (message "Searching for all the colon keywords in:") - (while dirs - (setq dir (pop dirs)) - (message " %s..." dir) - (setq files (directory-files dir t - "\\.el\\(\\.gz\\|\\.bz2\\)?$")) - (while files - (setq file (pop files)) - (if (string-match "\\(\\.gz$\\)\\|\\.bz2$" file) - (let ((temp (expand-file-name "dgnustemp.el" srcdir))) - (when - (let* ((binary (if (boundp 'MULE) - '*noconv* - 'binary)) - (coding-system-for-read binary) - (coding-system-for-write binary) - (input-coding-system binary) - (output-coding-system binary) - (default-process-coding-system - (cons binary binary)) - call-process-hook) - (insert-file-contents file nil nil nil t) - (when - (condition-case code - (progn - (if (match-beginning 1) - (call-process-region - (point-min) (point-max) - "gzip" t buffer nil "-cd") - (call-process-region - (point-min) (point-max) - "bzip2" t buffer nil "-d")) - t) - (error - (erase-buffer) - (message "In file %s: %s" file code) - nil)) - (write-region (point-min) (point-max) temp - nil 'silent) - t)) - (unwind-protect - (insert-file-contents temp nil nil nil t) - (delete-file temp)))) - (insert-file-contents file nil nil nil t)) - (while (setq form (condition-case nil - (read buffer) - (error nil))) - (while form - (setq elem (pop form)) - (unless (memq (car-safe elem) - '(\` backquote - defcustom defface defgroup - define-widget quote)) - (while (consp elem) - (push (car elem) form) - (setq elem (cdr elem))) - (when (and elem - (symbolp elem) - (not (eq ': elem)) - (eq ?: (aref (symbol-name elem) 0)) - (not (memq elem ignores)) - (not (memq elem keywords))) - (push elem keywords))))))) - (setq keywords (sort keywords - (lambda (a b) - (string-lessp (symbol-name a) - (symbol-name b))))) - (erase-buffer) - (insert (format "%s" keywords)) - (write-region (point-min) (point) cache nil 'silent) - (message - "The following colon keywords will be bound at run-time:\n %s" - keywords)))) - (kill-buffer buffer) - (defconst dgnushack-colon-keywords keywords) - (while keywords - (set (car keywords) (car keywords)) - (setq keywords (cdr keywords))))) - (byte-compile 'dgnushack-bind-colon-keywords) - (dgnushack-bind-colon-keywords))) - -(if (boundp 'MULE) - (progn - (setq :version ':version - :set-after ':set-after) - (require 'custom) - (defadvice custom-handle-keyword - (around dont-signal-an-error-even-if-unsupported-keyword-is-given - activate) - "Don't signal an error even if unsupported keyword is given." - (if (not (memq (ad-get-arg 1) '(:version :set-after))) - ad-do-it)))) - -(when (boundp 'MULE) - (put 'custom-declare-face 'byte-optimizer - 'byte-optimize-ignore-unsupported-custom-keywords) - (put 'custom-declare-group 'byte-optimizer - 'byte-optimize-ignore-unsupported-custom-keywords) - (defun byte-optimize-ignore-unsupported-custom-keywords (form) - (if (or (memq ':version (nthcdr 4 form)) - (memq ':set-after (nthcdr 4 form))) - (let ((newform (list (car form) (nth 1 form) - (nth 2 form) (nth 3 form))) - (args (nthcdr 4 form))) - (while args - (or (memq (car args) '(:version :set-after)) - (setq newform (nconc newform (list (car args) - (car (cdr args)))))) - (setq args (cdr (cdr args)))) - newform) - form)) - - (put 'custom-declare-variable 'byte-hunk-handler - 'byte-compile-file-form-custom-declare-variable) - (defun byte-compile-file-form-custom-declare-variable (form) - ;; Bind defcustom'ed variables. - (if (memq 'free-vars byte-compile-warnings) - (setq byte-compile-bound-variables - (cons (nth 1 (nth 1 form)) byte-compile-bound-variables))) - (if (memq ':version (nthcdr 4 form)) - ;; Make the variable uncustomizable. - `(defvar ,(nth 1 (nth 1 form)) ,(nth 1 (nth 2 form)) - ,(substring (nth 3 form) (if (string-match "^[\t *]+" (nth 3 form)) - (match-end 0) - 0))) - ;; Ignore unsupported keyword(s). - (if (memq ':set-after (nthcdr 4 form)) - (let ((newform (list (car form) (nth 1 form) - (nth 2 form) (nth 3 form))) - (args (nthcdr 4 form))) - (while args - (or (eq (car args) ':set-after) - (setq newform (nconc newform (list (car args) - (car (cdr args)))))) - (setq args (cdr (cdr args)))) - newform) - form)))) - -;; Unknown variables and functions. -(unless (boundp 'buffer-file-coding-system) - (defvar buffer-file-coding-system (symbol-value 'file-coding-system))) -(unless (featurep 'xemacs) - (defalias 'Custom-make-dependencies 'ignore) - (defalias 'update-autoloads-from-directory 'ignore)) - -(defalias 'device-sound-enabled-p 'ignore) -(defalias 'play-sound-file 'ignore) -(defalias 'nndb-request-article 'ignore) -(defalias 'efs-re-read-dir 'ignore) -(defalias 'ange-ftp-re-read-dir 'ignore) -(defalias 'define-mail-user-agent 'ignore) - -(defconst dgnushack-unexporting-files - (append '("dgnushack.el" "dgnuspath.el" "dgnuskwds.el" "lpath.el") - (condition-case nil - (progn (require 'shimbun) nil) - (error '("nnshimbun.el"))) - (unless (or (condition-case code - (require 'w3-forms) - (error - (message "No w3: %s %s retrying..." code - (locate-library "w3-forms")) - nil)) - ;; Maybe mis-configured Makefile is used (e.g. - ;; configured for FSFmacs but XEmacs is running). - (let ((lp (delete dgnushack-w3-directory - (copy-sequence load-path)))) - (if (let ((load-path lp)) - (condition-case nil - (require 'w3-forms) - (error nil))) - ;; If success, fix `load-path' for compiling. - (progn - (setq load-path lp) - (message " => fixed; W3DIR=%s" - (file-name-directory - (locate-library "w3-forms"))) - t) - (message " => ignored") - nil))) - '("nnweb.el" "nnlistserv.el" "nnultimate.el" - "nnslashdot.el" "nnwarchive.el" "webmail.el" - "nnwfm.el" "nnrss.el")) - (condition-case nil - (progn (require 'bbdb) nil) - (error '("gnus-bbdb.el"))) - (unless (featurep 'xemacs) - '("gnus-xmas.el" "gnus-picon.el" "messagexmas.el" - "nnheaderxm.el" "smiley.el")) - (when (or (featurep 'xemacs) (<= emacs-major-version 20)) - '("smiley-ems.el")) - (when (and (fboundp 'base64-decode-string) - (subrp (symbol-function 'base64-decode-string))) - '("base64.el")) - (when (and (fboundp 'md5) (subrp (symbol-function 'md5))) - '("md5.el"))) - "Files which will not be installed.") - -(defconst dgnushack-exporting-files - (let ((files (directory-files srcdir nil "^[^=].*\\.el$" t))) - (dolist (file dgnushack-unexporting-files) - (setq files (delete file files))) - (sort files 'string-lessp)) - "Files which will be compiled and installed.") - -(defun dgnushack-exporting-files () - "Print name of files which will be installed." - (princ (mapconcat 'identity dgnushack-exporting-files " "))) - -(defun dgnushack-compile (&optional warn) - ;;(setq byte-compile-dynamic t) - (unless warn - (setq byte-compile-warnings - '(free-vars unresolved callargs redefine))) - (unless (locate-library "cus-edit") - (error "You do not seem to have Custom installed. -Fetch it from . -You also then need to add the following to the lisp/dgnushack.el file: - - (push \"~/lisp/custom\" load-path) - -Modify to suit your needs.")) - - ;; Show `load-path'. - (message "load-path=(\"%s\")" - (mapconcat 'identity load-path "\"\n \"")) - - (dolist (file dgnushack-exporting-files) - (setq file (expand-file-name file srcdir)) - (when (and (file-exists-p - (setq elc (concat (file-name-nondirectory file) "c"))) - (file-newer-than-file-p file elc)) - (delete-file elc))) - - (let ((files dgnushack-exporting-files) - ;;(byte-compile-generate-call-tree t) - file elc) - ;; Avoid barfing (from gnus-xmas) because the etc directory is not yet - ;; installed. - (when (featurep 'xemacs) - (setq gnus-xmas-glyph-directory "dummy")) - (while (setq file (pop files)) - (setq file (expand-file-name file srcdir)) - (when (or (not (file-exists-p - (setq elc (concat (file-name-nondirectory file) "c")))) - (file-newer-than-file-p file elc)) - (ignore-errors - (byte-compile-file file)))))) - -(defun dgnushack-recompile () - (require 'gnus) - (byte-recompile-directory "." 0)) - -(defvar dgnushack-gnus-load-file (expand-file-name "gnus-load.el" srcdir)) -(defvar dgnushack-cus-load-file (expand-file-name "cus-load.el" srcdir)) -(defvar dgnushack-auto-load-file (expand-file-name "auto-autoloads.el" srcdir)) - -(defun dgnushack-make-cus-load () - (when (condition-case nil - (load "cus-dep") - (error nil)) - (let ((cusload-base-file dgnushack-cus-load-file)) - (if (fboundp 'custom-make-dependencies) - (custom-make-dependencies) - (Custom-make-dependencies))))) - -(defun dgnushack-make-auto-load () - (require 'autoload) - (unless (make-autoload '(define-derived-mode child parent name - "docstring" body) - "file") - (defadvice make-autoload (around handle-define-derived-mode activate) - "Handle `define-derived-mode'." - (if (eq (car-safe (ad-get-arg 0)) 'define-derived-mode) - (setq ad-return-value - (list 'autoload - (list 'quote (nth 1 (ad-get-arg 0))) - (ad-get-arg 1) - (nth 4 (ad-get-arg 0)) - t nil)) - ad-do-it)) - (put 'define-derived-mode 'doc-string-elt 3)) - (let ((generated-autoload-file dgnushack-gnus-load-file) - (make-backup-files nil) - (autoload-package-name "gnus")) - (if (featurep 'xemacs) - (progn - (if (file-exists-p generated-autoload-file) - (delete-file generated-autoload-file)) - (if (file-exists-p dgnushack-auto-load-file) - (delete-file dgnushack-auto-load-file))) - (with-temp-file generated-autoload-file - (insert ?\014))) - (if (featurep 'xemacs) - (let ((si:message (symbol-function 'message))) - (defun message (fmt &rest args) - (cond ((and (string-equal "Generating autoloads for %s..." fmt) - (file-exists-p (file-name-nondirectory (car args)))) - (funcall si:message - fmt (file-name-nondirectory (car args)))) - ((string-equal "No autoloads found in %s" fmt)) - ((string-equal "Generating autoloads for %s...done" fmt)) - (t (apply si:message fmt args)))) - (unwind-protect - (batch-update-autoloads) - (fset 'message si:message))) - (batch-update-autoloads)))) - -(defun dgnushack-make-load () - (message (format "Generating %s..." dgnushack-gnus-load-file)) - (with-temp-file dgnushack-gnus-load-file - (if (file-exists-p dgnushack-cus-load-file) - (progn - (insert-file-contents dgnushack-cus-load-file) - (delete-file dgnushack-cus-load-file) - (goto-char (point-min)) - (search-forward ";;; Code:") - (forward-line) - (delete-region (point-min) (point)) - (unless (re-search-forward "\ -^[\t ]*(autoload[\t\n ]+\\('\\|(quote[\t\n ]+\\)custom-add-loads[\t\n ]" - nil t) - (insert "\n(autoload 'custom-add-loads \"cus-load\")\n")) - (goto-char (point-min)) - (insert "\ -;;; gnus-load.el --- automatically extracted custom dependencies and autoload -;; -;;; Code: -") - (goto-char (point-max)) - (if (search-backward "custom-versions-load-alist" nil t) - (forward-line -1) - (forward-line -1) - (while (eq (char-after) ?\;) - (forward-line -1)) - (forward-line)) - (delete-region (point) (point-max)) - (insert "\n")) - (insert "\ -;;; gnus-load.el --- automatically extracted autoload -;; -;;; Code: -")) - ;; smiley-* are duplicated. Remove them all. - (let ((point (point))) - (insert-file-contents dgnushack-gnus-load-file) - (goto-char point) - (while (search-forward "smiley-" nil t) - (beginning-of-line) - (if (looking-at "(autoload ") - (delete-region (point) (progn (forward-sexp) (point))) - (forward-line)))) - ;; - (goto-char (point-max)) - (when (search-backward "\n(provide " nil t) - (forward-line -1) - (delete-region (point) (point-max))) - (insert "\ - -\(provide 'gnus-load) - -;;; Local Variables: -;;; version-control: never -;;; no-byte-compile: t -;;; no-update-autoloads: t -;;; End: -;;; gnus-load.el ends here\n")) - (message (format "Compiling %s..." dgnushack-gnus-load-file)) - (byte-compile-file dgnushack-gnus-load-file)) - - -(defun dgnushack-compose-package () - "Re-split the file gnus-load.el into custom-load.el and -auto-autoloads.el. It is silly, should be improved!" - (message " -Re-splitting gnus-load.el into custom-load.el and auto-autoloads.el...") - (let ((customload (expand-file-name "custom-load.el" srcdir)) - (autoloads (expand-file-name "auto-autoloads.el" srcdir)) - start) - (with-temp-buffer - (insert-file-contents dgnushack-gnus-load-file) - (delete-file dgnushack-gnus-load-file) - (when (file-exists-p (concat dgnushack-gnus-load-file "c")) - (delete-file (concat dgnushack-gnus-load-file "c"))) - (while (prog1 - (looking-at "[\t ;]") - (forward-line 1))) - (setq start (point)) - (insert "\ -;;; custom-load.el --- automatically extracted custom dependencies\n -;;; Code:\n\n") - (goto-char (point-max)) - (while (progn - (forward-line -1) - (not (looking-at "[\t ]*(custom-add-loads[\t\n ]")))) - (forward-list 1) - (forward-line 1) - (insert "\n;;; custom-load.el ends here\n") - (write-region start (point) customload) - (while (looking-at "[\t ]*$") - (forward-line 1)) - (setq start (point)) - (if (re-search-forward "^[\t\n ]*(if[\t\n ]+(featurep[\t\n ]" nil t) - (let ((from (goto-char (match-beginning 0)))) - (delete-region from (progn - (forward-list 1) - (forward-line 1) - (point)))) - (while (looking-at "[\t ;]") - (forward-line 1))) - (insert "(if (featurep 'gnus-autoloads) (error \"Already loaded\"))\n") - (goto-char (point-max)) - (while (progn - (forward-line -1) - (not (looking-at "[\t ]*(provide[\t\n ]")))) - (insert "(provide 'gnus-autoloads)\n") - (write-region start (point) autoloads)) - (byte-compile-file customload) - (byte-compile-file autoloads)) - (message "\ -Re-splitting gnus-load.el into custom-load.el and auto-autoloads.el...done -\n")) - - -(defconst dgnushack-info-file-regexp-en - (let ((names '("gnus" "message" "emacs-mime")) - regexp name) - (while (setq name (pop names)) - (setq regexp (concat regexp "^" name "\\.info\\(-[0-9]+\\)?$" - (when names "\\|")))) - regexp) - "Regexp matching English info files.") - -(defconst dgnushack-info-file-regexp-ja - (let ((names '("gnus-ja" "message-ja")) - regexp name) - (while (setq name (pop names)) - (setq regexp (concat regexp "^" name "\\.info\\(-[0-9]+\\)?$" - (when names "\\|")))) - regexp) - "Regexp matching Japanese info files.") - -(defun dgnushack-remove-extra-files-in-package () - "Remove extra files in the lisp directory of the XEmacs package." - (let ((lisp-dir (expand-file-name (concat "lisp/" - ;; GNUS_PRODUCT_NAME - (cadr command-line-args-left) - "/") - ;; PACKAGEDIR - (car command-line-args-left)))) - (when (file-directory-p lisp-dir) - (let (files) - (dolist (file dgnushack-exporting-files) - (setq files (nconc files (list file (concat file "c"))))) - (dolist (file (directory-files lisp-dir nil nil t t)) - (unless (member file files) - (setq file (expand-file-name file lisp-dir)) - (message "Removing %s..." file) - (condition-case nil - (delete-file file) - (error nil)))))))) - -(defun dgnushack-install-package-manifest () - "Install MANIFEST file as an XEmacs package." - (let* ((package-dir (car command-line-args-left)) - (product-name (cadr command-line-args-left)) - (name (expand-file-name (concat "pkginfo/MANIFEST." product-name) - package-dir)) - make-backup-files) - (message "Generating %s..." name) - (with-temp-file name - (insert "pkginfo/MANIFEST." product-name "\n") - (let ((lisp-dir (concat "lisp/" product-name "/")) - (files (sort (directory-files "." nil "\\.elc?$" t) 'string-lessp)) - file) - (while (setq file (pop files)) - (unless (member file dgnushack-unexporting-files) - (insert lisp-dir file "\n"))) - (setq files - (sort (directory-files "../texi/" nil - (concat dgnushack-info-file-regexp-en - "\\|" - dgnushack-info-file-regexp-ja) - t) - 'string-lessp)) - (while (setq file (pop files)) - (insert "info/" file "\n")))))) - - -(define-compiler-macro describe-key-briefly (&whole form key &optional insert) - (if (condition-case nil - (progn - (describe-key-briefly '((())) nil) - t) - (wrong-number-of-arguments nil);; Old Emacsen. - (error t)) - form - (if insert - `(if ,insert - (insert (funcall 'describe-key-briefly ,key)) - (funcall 'describe-key-briefly ,key)) - `(funcall 'describe-key-briefly ,key)))) - -;;; dgnushack.el ends here diff --git a/lisp/dgnuspath.el.in b/lisp/dgnuspath.el.in deleted file mode 100644 index 3ee338f..0000000 --- a/lisp/dgnuspath.el.in +++ /dev/null @@ -1,18 +0,0 @@ -;; -*- Emacs-Lisp -*- -(let ((addpath - "@ADDITIONAL_LOAD_PATH@" - ) - path paths) - (while (string-match "[^\0-\37:]+" addpath) - (setq path (file-name-as-directory - (expand-file-name (match-string 0 addpath))) - addpath (substring addpath (match-end 0))) - (if (string-match "apel/$" path) - (progn - (if (file-directory-p path) - (setq paths (nconc paths (list path)))) - (setq path (substring path 0 (match-beginning 0))))) - (if (file-directory-p path) - (setq paths (nconc paths (list path))))) - (or (null paths) - (setq load-path (nconc paths load-path)))) diff --git a/lisp/dig.el b/lisp/dig.el deleted file mode 100644 index de6a769..0000000 --- a/lisp/dig.el +++ /dev/null @@ -1,169 +0,0 @@ -;;; dig.el --- Domain Name System dig interface -;; Copyright (c) 2000 Free Software Foundation, Inc. - -;; Author: Simon Josefsson -;; Keywords: DNS BIND dig - -;; This file is not a part of GNU Emacs, but the same permissions apply. - -;; GNU Emacs 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, or (at your -;; option) any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; This provide an interface for "dig". -;; -;; For interactive use, try M-x dig and type a hostname. Use `q' to quit -;; dig buffer. -;; -;; For use in elisp programs, call `dig-invoke' and use -;; `dig-extract-rr' to extract resource records. - -;;; Code: - -(eval-when-compile (require 'cl)) - -(defgroup dig nil - "Dig configuration.") - -(defcustom dig-program "dig" - "Name of dig (domain information groper) binary." - :type 'file - :group 'dig) - -(defcustom dig-dns-server nil - "DNS server to query. -If nil, use system defaults." - :type '(choice (const :tag "System defaults") - string) - :group 'dig) - -(defcustom dig-font-lock-keywords - '(("^;; [A-Z]+ SECTION:" 0 font-lock-keyword-face) - ("^;;.*" 0 font-lock-comment-face) - ("^; <<>>.*" 0 font-lock-type-face) - ("^;.*" 0 font-lock-function-name-face)) - "Default expressions to highlight in dig mode." - :type 'sexp - :group 'dig) - -(defun dig-invoke (domain &optional - query-type query-class query-option - dig-option server) - "Call dig with given arguments and return buffer containing output. -DOMAIN is a string with a DNS domain. QUERY-TYPE is an optional string -with a DNS type. QUERY-CLASS is an optional string with a DNS class. -QUERY-OPTION is an optional string with dig \"query options\". -DIG-OPTIONS is an optional string with parameters for the dig program. -SERVER is an optional string with a domain name server to query. - -Dig is an external program found in the BIND name server distribution, -and is a commonly available debugging tool." - (let (buf cmdline) - (setq buf (generate-new-buffer "*dig output*")) - (if dig-option (push dig-option cmdline)) - (if query-option (push query-option cmdline)) - (if query-class (push query-class cmdline)) - (if query-type (push query-type cmdline)) - (push domain cmdline) - (if server (push (concat "@" server) cmdline) - (if dig-dns-server (push (concat "@" dig-dns-server) cmdline))) - (apply 'call-process dig-program nil buf nil cmdline) - buf)) - -(defun dig-extract-rr (domain &optional type class) - "Extract resource records for DOMAIN, TYPE and CLASS from buffer. -Buffer should contain output generated by `dig-invoke'." - (save-excursion - (goto-char (point-min)) - (if (re-search-forward - (concat domain "\\.?[\t ]+[0-9wWdDhHmMsS]+[\t ]+" - (upcase (or class "IN")) "[\t ]+" (upcase (or type "A"))) - nil t) - (let (b e) - (end-of-line) - (setq e (point)) - (beginning-of-line) - (setq b (point)) - (when (search-forward " (" e t) - (search-forward " )")) - (end-of-line) - (setq e (point)) - (buffer-substring b e)) - (and (re-search-forward (concat domain "\\.?[\t ]+[0-9wWdDhHmMsS]+[\t ]+" - (upcase (or class "IN")) - "[\t ]+CNAME[\t ]+\\(.*\\)$") nil t) - (dig-extract-rr (match-string 1) type class))))) - -(defun dig-rr-get-pkix-cert (rr) - (let (b e str) - (string-match "[^\t ]+[\t ]+[0-9wWdDhHmMsS]+[\t ]+IN[\t ]+CERT[\t ]+\\(1\\|PKIX\\)[\t ]+[0-9]+[\t ]+[0-9]+[\t ]+(?" rr) - (setq b (match-end 0)) - (string-match ")" rr) - (setq e (match-beginning 0)) - (setq str (substring rr b e)) - (while (string-match "[\t \n\r]" str) - (setq str (replace-match "" nil nil str))) - str)) - -;; XEmacs does it like this. For Emacs, we have to set the -;; `font-lock-defaults' buffer-local variable. -(put 'dig-mode 'font-lock-defaults '(dig-font-lock-keywords t)) - -(put 'dig-mode 'mode-class 'special) - -(defvar dig-mode-map nil) -(unless dig-mode-map - (setq dig-mode-map (make-sparse-keymap)) - (suppress-keymap dig-mode-map) - - (define-key dig-mode-map "q" 'dig-exit)) - -(defun dig-mode () - "Major mode for displaying dig output." - (interactive) - (kill-all-local-variables) - (setq mode-name "dig") - (setq major-mode 'dig-mode) - (use-local-map dig-mode-map) - (buffer-disable-undo) - (unless (featurep 'xemacs) - (set (make-local-variable 'font-lock-defaults) - '(dig-font-lock-keywords t))) - (when (featurep 'font-lock) - (font-lock-set-defaults))) - -(defun dig-exit () - "Quit dig output buffer." - (interactive) - (kill-buffer (current-buffer))) - -(defun dig (domain &optional - query-type query-class query-option dig-option server) - "Query addresses of a DOMAIN using dig, by calling `dig-invoke'. -Optional arguments are passed to `dig-invoke'." - (interactive "sHost: ") - (switch-to-buffer - (dig-invoke domain query-type query-class query-option dig-option server)) - (goto-char (point-min)) - (and (search-forward ";; ANSWER SECTION:" nil t) - (forward-line)) - (dig-mode) - (setq buffer-read-only t) - (set-buffer-modified-p nil)) - -(provide 'dig) - -;;; dig.el ends here diff --git a/lisp/earcon.el b/lisp/earcon.el deleted file mode 100644 index ecd118f..0000000 --- a/lisp/earcon.el +++ /dev/null @@ -1,233 +0,0 @@ -;;; earcon.el --- Sound effects for messages - -;; Copyright (C) 1996, 2000 Free Software Foundation - -;; Author: Steven L. Baur - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: -;; This file provides access to sound effects in Gnus. - -;;; Code: - -(eval-when-compile (require 'cl)) -(require 'gnus) -(require 'gnus-audio) -(require 'gnus-art) - -(defgroup earcon nil - "Turn ** sounds ** into noise." - :group 'gnus-visual) - -(defcustom earcon-prefix "**" - "*String denoting the start of an earcon." - :type 'string - :group 'earcon) - -(defcustom earcon-suffix "**" - "String denoting the end of an earcon." - :type 'string - :group 'earcon) - -(defcustom earcon-regexp-alist - '(("boring" 1 "Boring.au") - ("evil[ \t]+laugh" 1 "Evil_Laugh.au") - ("gag\\|puke" 1 "Puke.au") - ("snicker" 1 "Snicker.au") - ("meow" 1 "catmeow.au") - ("sob\\|boohoo" 1 "cry.wav") - ("drum[ \t]*roll" 1 "drumroll.au") - ("blast" 1 "explosion.au") - ("flush\\|plonk!*" 1 "flush.au") - ("kiss" 1 "kiss.wav") - ("tee[ \t]*hee" 1 "laugh.au") - ("shoot" 1 "shotgun.wav") - ("yawn" 1 "snore.wav") - ("cackle" 1 "witch.au") - ("yell\\|roar" 1 "yell2.au") - ("whoop-de-doo" 1 "whistle.au")) - "*A list of regexps to map earcons to real sounds." - :type '(repeat (list regexp - (integer :tag "Match") - (string :tag "Sound"))) - :group 'earcon) -(defvar earcon-button-marker-list nil) -(make-variable-buffer-local 'earcon-button-marker-list) - -;;; FIXME!! clone of code from gnus-vis.el FIXME!! -(defun earcon-article-push-button (event) - "Check text under the mouse pointer for a callback function. -If the text under the mouse pointer has a `earcon-callback' property, -call it with the value of the `earcon-data' text property." - (interactive "e") - (set-buffer (window-buffer (posn-window (event-start event)))) - (let* ((pos (posn-point (event-start event))) - (data (get-text-property pos 'earcon-data)) - (fun (get-text-property pos 'earcon-callback))) - (if fun (funcall fun data)))) - -(defun earcon-article-press-button () - "Check text at point for a callback function. -If the text at point has a `earcon-callback' property, -call it with the value of the `earcon-data' text property." - (interactive) - (let* ((data (get-text-property (point) 'earcon-data)) - (fun (get-text-property (point) 'earcon-callback))) - (if fun (funcall fun data)))) - -(defun earcon-article-prev-button (n) - "Move point to N buttons backward. -If N is negative, move forward instead." - (interactive "p") - (earcon-article-next-button (- n))) - -(defun earcon-article-next-button (n) - "Move point to N buttons forward. -If N is negative, move backward instead." - (interactive "p") - (let ((function (if (< n 0) 'previous-single-property-change - 'next-single-property-change)) - (inhibit-point-motion-hooks t) - (backward (< n 0)) - (limit (if (< n 0) (point-min) (point-max)))) - (setq n (abs n)) - (while (and (not (= limit (point))) - (> n 0)) - ;; Skip past the current button. - (when (get-text-property (point) 'earcon-callback) - (goto-char (funcall function (point) 'earcon-callback nil limit))) - ;; Go to the next (or previous) button. - (gnus-goto-char (funcall function (point) 'earcon-callback nil limit)) - ;; Put point at the start of the button. - (when (and backward (not (get-text-property (point) 'earcon-callback))) - (goto-char (funcall function (point) 'earcon-callback nil limit))) - ;; Skip past intangible buttons. - (when (get-text-property (point) 'intangible) - (incf n)) - (decf n)) - (unless (zerop n) - (gnus-message 5 "No more buttons")) - n)) - -(defun earcon-article-add-button (from to fun &optional data) - "Create a button between FROM and TO with callback FUN and data DATA." - (and (boundp gnus-article-button-face) - gnus-article-button-face - (gnus-overlay-put (gnus-make-overlay from to) - 'face gnus-article-button-face)) - (gnus-add-text-properties - from to - (nconc (and gnus-article-mouse-face - (list gnus-mouse-face-prop gnus-article-mouse-face)) - (list 'gnus-callback fun) - (and data (list 'gnus-data data))))) - -(defun earcon-button-entry () - ;; Return the first entry in `gnus-button-alist' matching this place. - (let ((alist earcon-regexp-alist) - (case-fold-search t) - (entry nil)) - (while alist - (setq entry (pop alist)) - (if (looking-at (car entry)) - (setq alist nil) - (setq entry nil))) - entry)) - -(defun earcon-button-push (marker) - ;; Push button starting at MARKER. - (save-excursion - (set-buffer gnus-article-buffer) - (goto-char marker) - (let* ((entry (earcon-button-entry)) - (inhibit-point-motion-hooks t) - (fun 'gnus-audio-play) - (args (list (nth 2 entry)))) - (cond - ((fboundp fun) - (apply fun args)) - ((and (boundp fun) - (fboundp (symbol-value fun))) - (apply (symbol-value fun) args)) - (t - (gnus-message 1 "You must define `%S' to use this button" - (cons fun args))))))) - -;;; FIXME!! clone of code from gnus-vis.el FIXME!! - -;;;###interactive -(defun earcon-region (beg end) - "Play Sounds in the region between point and mark." - (interactive "r") - (earcon-buffer (current-buffer) beg end)) - -;;;###interactive -(defun earcon-buffer (&optional buffer st nd) - (interactive) - (save-excursion - ;; clear old markers. - (if (boundp 'earcon-button-marker-list) - (while earcon-button-marker-list - (set-marker (pop earcon-button-marker-list) nil)) - (setq earcon-button-marker-list nil)) - (and buffer (set-buffer buffer)) - (let ((buffer-read-only nil) - (inhibit-point-motion-hooks t) - (case-fold-search t) - (alist earcon-regexp-alist) - beg entry regexp) - (goto-char (point-min)) - (setq beg (point)) - (while (setq entry (pop alist)) - (setq regexp (concat (regexp-quote earcon-prefix) - ".*\\(" - (car entry) - "\\).*" - (regexp-quote earcon-suffix))) - (goto-char beg) - (while (re-search-forward regexp nil t) - (let* ((start (and entry (match-beginning 1))) - (end (and entry (match-end 1))) - (from (match-beginning 1))) - (earcon-article-add-button - start end 'earcon-button-push - (car (push (set-marker (make-marker) from) - earcon-button-marker-list))) - (gnus-audio-play (caddr entry)))))))) - -;;;###autoload -(defun gnus-earcon-display () - "Play sounds in message buffers." - (interactive) - (save-excursion - (set-buffer gnus-article-buffer) - (goto-char (point-min)) - ;; Skip headers - (unless (search-forward "\n\n" nil t) - (goto-char (point-max))) - (sit-for 0) - (earcon-buffer (current-buffer) (point)))) - -;;;*** - -(provide 'earcon) - -(run-hooks 'earcon-load-hook) - -;;; earcon.el ends here diff --git a/lisp/flow-fill.el b/lisp/flow-fill.el deleted file mode 100644 index 8a9bea0..0000000 --- a/lisp/flow-fill.el +++ /dev/null @@ -1,104 +0,0 @@ -;;; flow-fill.el --- interprete RFC2646 "flowed" text - -;; Copyright (C) 2000 Free Software Foundation, Inc. - -;; Author: Simon Josefsson -;; Keywords: mail - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. 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, implement basic `fill-region' (Emacs and XEmacs -;; implementations differ..) - -;;; 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 -;; 2000-10-23 don't flow "-- " lines, make "quote-depth wins" rule -;; work when first line is at level 0. - -;;; Code: - -(eval-when-compile (require 'cl)) - -(eval-and-compile - (defalias 'fill-flowed-point-at-bol - (if (fboundp 'point-at-bol) - 'point-at-bol - 'line-beginning-position)) - - (defalias '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)) sig) - (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 - (ignore-errors (backward-char 3)) - (setq sig (looking-at "-- ")) - (looking-at "[^-][^-] ")) - (save-excursion - (unless (eobp) - (forward-char 1) - (looking-at (format "^\\(%s\\)\\([^>]\\)" - (or quote " ?")))))) - (save-excursion - (replace-match (if (string= (match-string 2) " ") - "" "\\2"))) - (backward-delete-char -1) - (end-of-line)) - (unless sig - (let ((fill-prefix (when quote (concat quote " ")))) - (fill-region (fill-flowed-point-at-bol) - (min (1+ (fill-flowed-point-at-eol)) (point-max)) - 'left 'nosqueeze)))))))) - -(provide 'flow-fill) - -;;; flow-fill.el ends here diff --git a/lisp/format-spec.el b/lisp/format-spec.el deleted file mode 100644 index 6cd39ed..0000000 --- a/lisp/format-spec.el +++ /dev/null @@ -1,71 +0,0 @@ -;;; format-spec.el --- functions for formatting arbitrary formatting strings -;; Copyright (C) 1999, 2000 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: tools - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(defun format-spec (format specification) - "Return a string based on FORMAT and SPECIFICATION. -FORMAT is a string containing `format'-like specs like \"bash %u %k\", -while SPECIFICATION is an alist mapping from format spec characters -to values." - (with-temp-buffer - (insert format) - (goto-char (point-min)) - (while (search-forward "%" nil t) - (cond - ;; Quoted percent sign. - ((eq (char-after) ?%) - (delete-char 1)) - ;; Valid format spec. - ((looking-at "\\([-0-9.]*\\)\\([a-zA-Z]\\)") - (let* ((num (match-string 1)) - (spec (string-to-char (match-string 2))) - (val (cdr (assq spec specification)))) - (delete-region (1- (match-beginning 0)) (match-end 0)) - (unless val - (error "Invalid format character: %s" spec)) - (insert (format (concat "%" num "s") val)))) - ;; Signal an error on bogus format strings. - (t - (error "Invalid format string")))) - (buffer-string))) - -(defun format-spec-make (&rest pairs) - "Return an alist suitable for use in `format-spec' based on PAIRS. -PAIRS is a list where every other element is a character and a value, -starting with a character." - (let (alist) - (while pairs - (unless (cdr pairs) - (error "Invalid list of pairs")) - (push (cons (car pairs) (cadr pairs)) alist) - (setq pairs (cddr pairs))) - (nreverse alist))) - -(provide 'format-spec) - -;;; format-spec.el ends here diff --git a/lisp/gnus-agent.el b/lisp/gnus-agent.el deleted file mode 100644 index 1e6340a..0000000 --- a/lisp/gnus-agent.el +++ /dev/null @@ -1,1774 +0,0 @@ -;;; gnus-agent.el --- unplugged support for Semi-gnus -;; Copyright (C) 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Tatsuya Ichikawa -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'gnus-clfns)) - -(require 'gnus) -(require 'gnus-cache) -(require 'nnvirtual) -(require 'gnus-sum) -(require 'gnus-score) -(eval-when-compile - (if (featurep 'xemacs) - (require 'itimer) - (require 'timer)) - (require 'gnus-group)) - -(eval-and-compile - (autoload 'gnus-server-update-server "gnus-srvr")) - -(defcustom gnus-agent-directory (nnheader-concat gnus-directory "agent/") - "Where the Gnus agent will store its files." - :group 'gnus-agent - :type 'directory) - -(defcustom gnus-agent-plugged-hook nil - "Hook run when plugging into the network." - :group 'gnus-agent - :type 'hook) - -(defcustom gnus-agent-unplugged-hook nil - "Hook run when unplugging from the network." - :group 'gnus-agent - :type 'hook) - -(defcustom gnus-agent-handle-level gnus-level-subscribed - "Groups on levels higher than this variable will be ignored by the Agent." - :group 'gnus-agent - :type 'integer) - -(defcustom gnus-agent-expire-days 7 - "Read articles older than this will be expired." - :group 'gnus-agent - :type 'integer) - -(defcustom gnus-agent-expire-all nil - "If non-nil, also expire unread, ticked and dormant articles. -If nil, only read articles will be expired." - :group 'gnus-agent - :type 'boolean) - -(defcustom gnus-agent-group-mode-hook nil - "Hook run in Agent group minor modes." - :group 'gnus-agent - :type 'hook) - -;; Extracted from gnus-xmas-redefine in order to preserve user settings -(when (featurep 'xemacs) - (add-hook 'gnus-agent-group-mode-hook 'gnus-xmas-agent-group-menu-add)) - -(defcustom gnus-agent-summary-mode-hook nil - "Hook run in Agent summary minor modes." - :group 'gnus-agent - :type 'hook) - -;; Extracted from gnus-xmas-redefine in order to preserve user settings -(when (featurep 'xemacs) - (add-hook 'gnus-agent-summary-mode-hook 'gnus-xmas-agent-summary-menu-add)) - -(defcustom gnus-agent-server-mode-hook nil - "Hook run in Agent summary minor modes." - :group 'gnus-agent - :type 'hook) - -;; Extracted from gnus-xmas-redefine in order to preserve user settings -(when (featurep 'xemacs) - (add-hook 'gnus-agent-server-mode-hook 'gnus-xmas-agent-server-menu-add)) - -(defcustom gnus-agent-confirmation-function 'y-or-n-p - "Function to confirm when error happens." - :version "21.1" - :group 'gnus-agent - :type 'function) - -(defcustom gnus-agent-large-newsgroup nil - "*The number of articles which indicates a large newsgroup. -If the number of unread articles exceeds it, The number of articles to be -fetched will be limited to it. If not a positive integer, never consider it." - :group 'gnus-agent - :type '(choice (const nil) - (integer :tag "Number"))) - -(defcustom gnus-agent-synchronize-flags 'ask - "Indicate if flags are synchronized when you plug in. -If this is `ask' the hook will query the user." - :version "21.1" - :type '(choice (const :tag "Always" t) - (const :tag "Never" nil) - (const :tag "Ask" ask)) - :group 'gnus-agent) - -;;; Internal variables - -(defvar gnus-agent-history-buffers nil) -(defvar gnus-agent-buffer-alist nil) -(defvar gnus-agent-article-alist nil) -(defvar gnus-agent-group-alist nil) -(defvar gnus-agent-covered-methods nil) -(defvar gnus-category-alist nil) -(defvar gnus-agent-current-history nil) -(defvar gnus-agent-overview-buffer nil) -(defvar gnus-category-predicate-cache nil) -(defvar gnus-category-group-cache nil) -(defvar gnus-agent-spam-hashtb nil) -(defvar gnus-agent-file-name nil) -(defvar gnus-agent-send-mail-function nil) -(defvar gnus-agent-file-coding-system 'raw-text) - -;; Dynamic variables -(defvar gnus-headers) -(defvar gnus-score) - -;;; -;;; Setup -;;; - -(defun gnus-open-agent () - (setq gnus-agent t) - (gnus-agent-read-servers) - (gnus-category-read) - (gnus-agent-create-buffer) - (add-hook 'gnus-group-mode-hook 'gnus-agent-mode) - (add-hook 'gnus-summary-mode-hook 'gnus-agent-mode) - (add-hook 'gnus-server-mode-hook 'gnus-agent-mode)) - -(defun gnus-agent-create-buffer () - (if (gnus-buffer-live-p gnus-agent-overview-buffer) - t - (setq gnus-agent-overview-buffer - (gnus-get-buffer-create " *Gnus agent overview*")) - (with-current-buffer gnus-agent-overview-buffer - (set-buffer-multibyte t)) - nil)) - -(gnus-add-shutdown 'gnus-close-agent 'gnus) - -(defun gnus-close-agent () - (setq gnus-agent-covered-methods nil - gnus-category-predicate-cache nil - gnus-category-group-cache nil - gnus-agent-spam-hashtb nil) - (gnus-kill-buffer gnus-agent-overview-buffer)) - -;;; -;;; Utility functions -;;; - -(defun gnus-agent-read-file (file) - "Load FILE and do a `read' there." - (with-temp-buffer - (ignore-errors - (nnheader-insert-file-contents file) - (goto-char (point-min)) - (read (current-buffer))))) - -(defsubst gnus-agent-method () - (concat (symbol-name (car gnus-command-method)) "/" - (if (equal (cadr gnus-command-method) "") - "unnamed" - (cadr gnus-command-method)))) - -(defsubst gnus-agent-directory () - "Path of the Gnus agent directory." - (nnheader-concat gnus-agent-directory - (nnheader-translate-file-chars (gnus-agent-method)) "/")) - -(defun gnus-agent-lib-file (file) - "The full path of the Gnus agent library FILE." - (expand-file-name file - (file-name-as-directory - (expand-file-name "agent.lib" (gnus-agent-directory))))) - -;;; Fetching setup functions. - -(defun gnus-agent-start-fetch () - "Initialize data structures for efficient fetching." - (gnus-agent-open-history) - (setq gnus-agent-current-history (gnus-agent-history-buffer)) - (gnus-agent-create-buffer)) - -(defun gnus-agent-stop-fetch () - "Save all data structures and clean up." - (gnus-agent-save-history) - (gnus-agent-close-history) - (setq gnus-agent-spam-hashtb nil) - (save-excursion - (set-buffer nntp-server-buffer) - (widen))) - -(defmacro gnus-agent-with-fetch (&rest forms) - "Do FORMS safely." - `(unwind-protect - (let ((gnus-agent-fetching t)) - (gnus-agent-start-fetch) - ,@forms) - (gnus-agent-stop-fetch))) - -(put 'gnus-agent-with-fetch 'lisp-indent-function 0) -(put 'gnus-agent-with-fetch 'edebug-form-spec '(body)) - -;;; -;;; Mode infestation -;;; - -(defvar gnus-agent-mode-hook nil - "Hook run when installing agent mode.") - -(defvar gnus-agent-mode nil) -(defvar gnus-agent-mode-status '(gnus-agent-mode " Plugged")) - -(defun gnus-agent-mode () - "Minor mode for providing a agent support in Gnus buffers." - (let* ((buffer (progn (string-match "^gnus-\\(.*\\)-mode$" - (symbol-name major-mode)) - (match-string 1 (symbol-name major-mode)))) - (mode (intern (format "gnus-agent-%s-mode" buffer)))) - (set (make-local-variable 'gnus-agent-mode) t) - (set mode nil) - (set (make-local-variable mode) t) - ;; Set up the menu. - (when (gnus-visual-p 'agent-menu 'menu) - (funcall (intern (format "gnus-agent-%s-make-menu-bar" buffer)))) - (unless (assq 'gnus-agent-mode minor-mode-alist) - (push gnus-agent-mode-status minor-mode-alist)) - (unless (assq mode minor-mode-map-alist) - (push (cons mode (symbol-value (intern (format "gnus-agent-%s-mode-map" - buffer)))) - minor-mode-map-alist)) - (when (eq major-mode 'gnus-group-mode) - (gnus-agent-toggle-plugged gnus-plugged)) - (gnus-run-hooks 'gnus-agent-mode-hook - (intern (format "gnus-agent-%s-mode-hook" buffer))))) - -(defvar gnus-agent-group-mode-map (make-sparse-keymap)) -(gnus-define-keys gnus-agent-group-mode-map - "Ju" gnus-agent-fetch-groups - "Jc" gnus-enter-category-buffer - "Jj" gnus-agent-toggle-plugged - "Js" gnus-agent-fetch-session - "JY" gnus-agent-synchronize-flags - "JS" gnus-group-send-drafts - "Ja" gnus-agent-add-group - "Jr" gnus-agent-remove-group) - -(defun gnus-agent-group-make-menu-bar () - (unless (boundp 'gnus-agent-group-menu) - (easy-menu-define - gnus-agent-group-menu gnus-agent-group-mode-map "" - '("Agent" - ["Toggle plugged" gnus-agent-toggle-plugged t] - ["List categories" gnus-enter-category-buffer t] - ["Send drafts" gnus-group-send-drafts gnus-plugged] - ("Fetch" - ["All" gnus-agent-fetch-session gnus-plugged] - ["Group" gnus-agent-fetch-group gnus-plugged]))))) - -(defvar gnus-agent-summary-mode-map (make-sparse-keymap)) -(gnus-define-keys gnus-agent-summary-mode-map - "Jj" gnus-agent-toggle-plugged - "Ju" gnus-agent-summary-fetch-group - "J#" gnus-agent-mark-article - "J\M-#" gnus-agent-unmark-article - "@" gnus-agent-toggle-mark - "Jc" gnus-agent-catchup) - -(defun gnus-agent-summary-make-menu-bar () - (unless (boundp 'gnus-agent-summary-menu) - (easy-menu-define - gnus-agent-summary-menu gnus-agent-summary-mode-map "" - '("Agent" - ["Toggle plugged" gnus-agent-toggle-plugged t] - ["Mark as downloadable" gnus-agent-mark-article t] - ["Unmark as downloadable" gnus-agent-unmark-article t] - ["Toggle mark" gnus-agent-toggle-mark t] - ["Fetch downloadable" gnus-agent-summary-fetch-group t] - ["Catchup undownloaded" gnus-agent-catchup t])))) - -(defvar gnus-agent-server-mode-map (make-sparse-keymap)) -(gnus-define-keys gnus-agent-server-mode-map - "Jj" gnus-agent-toggle-plugged - "Ja" gnus-agent-add-server - "Jr" gnus-agent-remove-server) - -(defun gnus-agent-server-make-menu-bar () - (unless (boundp 'gnus-agent-server-menu) - (easy-menu-define - gnus-agent-server-menu gnus-agent-server-mode-map "" - '("Agent" - ["Toggle plugged" gnus-agent-toggle-plugged t] - ["Add" gnus-agent-add-server t] - ["Remove" gnus-agent-remove-server t])))) - -(defun gnus-agent-make-mode-line-string (string mouse-button mouse-func) - (if (and (fboundp 'propertize) - (fboundp 'make-mode-line-mouse-map)) - (propertize string 'local-map - (make-mode-line-mouse-map mouse-button mouse-func)) - string)) - -(defun gnus-agent-toggle-plugged (plugged) - "Toggle whether Gnus is unplugged or not." - (interactive (list (not gnus-plugged))) - (if plugged - (progn - (setq gnus-plugged plugged) - (gnus-agent-possibly-synchronize-flags) - (gnus-run-hooks 'gnus-agent-plugged-hook) - (setcar (cdr gnus-agent-mode-status) - (gnus-agent-make-mode-line-string " Plugged" - 'mouse-2 - 'gnus-agent-toggle-plugged))) - (gnus-agent-close-connections) - (setq gnus-plugged plugged) - (gnus-run-hooks 'gnus-agent-unplugged-hook) - (setcar (cdr gnus-agent-mode-status) - (gnus-agent-make-mode-line-string " Unplugged" - 'mouse-2 - 'gnus-agent-toggle-plugged))) - (force-mode-line-update)) - -(defun gnus-agent-close-connections () - "Close all methods covered by the Gnus agent." - (let ((methods gnus-agent-covered-methods)) - (while methods - (gnus-close-server (pop methods))))) - -;;;###autoload -(defun gnus-unplugged () - "Start Gnus unplugged." - (interactive) - (setq gnus-plugged nil) - (gnus)) - -;;;###autoload -(defun gnus-plugged () - "Start Gnus plugged." - (interactive) - (setq gnus-plugged t) - (gnus)) - -;;;###autoload -(defun gnus-agentize () - "Allow Gnus to be an offline newsreader. -The normal usage of this command is to put the following as the -last form in your `.gnus.el' file: - -\(gnus-agentize) - -This will modify the `gnus-setup-news-hook', and -`message-send-mail-real-function' variables, and install the Gnus agent -minor mode in all Gnus buffers." - (interactive) - (gnus-open-agent) - (add-hook 'gnus-setup-news-hook 'gnus-agent-queue-setup) - (unless gnus-agent-send-mail-function - (setq gnus-agent-send-mail-function (or - message-send-mail-real-function - message-send-mail-function) - message-send-mail-real-function 'gnus-agent-send-mail)) - (unless gnus-agent-covered-methods - (setq gnus-agent-covered-methods (list gnus-select-method)))) - -(defun gnus-agent-queue-setup () - "Make sure the queue group exists." - (unless (gnus-gethash "nndraft:queue" gnus-newsrc-hashtb) - (gnus-request-create-group "queue" '(nndraft "")) - (let ((gnus-level-default-subscribed 1)) - (gnus-subscribe-group "nndraft:queue" nil '(nndraft ""))) - (gnus-group-set-parameter - "nndraft:queue" 'gnus-dummy '((gnus-draft-mode))))) - -(defun gnus-agent-send-mail () - (if gnus-plugged - (funcall gnus-agent-send-mail-function) - (goto-char (point-min)) - (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "\n")) - (replace-match "\n") - (gnus-agent-insert-meta-information 'mail) - (gnus-request-accept-article "nndraft:queue" nil t t))) - -(defun gnus-agent-insert-meta-information (type &optional method) - "Insert meta-information into the message that says how it's to be posted. -TYPE can be either `mail' or `news'. If the latter, then METHOD can -be a select method." - (save-excursion - (message-remove-header gnus-agent-meta-information-header) - (goto-char (point-min)) - (insert gnus-agent-meta-information-header ": " - (symbol-name type) " " (format "%S" method) - "\n") - (forward-char -1) - (while (search-backward "\n" nil t) - (replace-match "\\n" t t)))) - -(defun gnus-agent-restore-gcc () - "Restore GCC field from saved header." - (save-excursion - (goto-char (point-min)) - (while (re-search-forward (concat gnus-agent-gcc-header ":") nil t) - (replace-match "Gcc:" 'fixedcase)))) - -(defun gnus-agent-any-covered-gcc () - (save-restriction - (message-narrow-to-headers) - (let* ((gcc (mail-fetch-field "gcc" nil t)) - (methods (and gcc - (mapcar 'gnus-inews-group-method - (message-unquote-tokens - (message-tokenize-header - gcc " ,"))))) - covered) - (while (and (not covered) methods) - (setq covered - (member (car methods) gnus-agent-covered-methods) - methods (cdr methods))) - covered))) - -(defun gnus-agent-possibly-save-gcc () - "Save GCC if Gnus is unplugged." - (when (and (not gnus-plugged) (gnus-agent-any-covered-gcc)) - (save-excursion - (goto-char (point-min)) - (let ((case-fold-search t)) - (while (re-search-forward "^gcc:" nil t) - (replace-match (concat gnus-agent-gcc-header ":") 'fixedcase)))))) - -(defun gnus-agent-possibly-do-gcc () - "Do GCC if Gnus is plugged." - (when (or gnus-plugged (not (gnus-agent-any-covered-gcc))) - (gnus-inews-do-gcc))) - -;;; -;;; Group mode commands -;;; - -(defun gnus-agent-fetch-groups (n) - "Put all new articles in the current groups into the Agent." - (interactive "P") - (unless gnus-plugged - (error "Groups can't be fetched when Gnus is unplugged")) - (gnus-group-iterate n 'gnus-agent-fetch-group)) - -(defun gnus-agent-fetch-group (group) - "Put all new articles in GROUP into the Agent." - (interactive (list (gnus-group-group-name))) - (let ((state gnus-plugged)) - (unwind-protect - (progn - (unless state - (gnus-agent-toggle-plugged gnus-plugged) - (unless group - (error "No group on the current line")) - (let ((gnus-command-method (gnus-find-method-for-group group))) - (gnus-agent-with-fetch - (gnus-agent-fetch-group-1 group gnus-command-method) - (gnus-message 5 "Fetching %s...done" group))))) - (when (and (not state) - gnus-plugged) - (gnus-agent-toggle-plugged gnus-plugged))))) - -(defun gnus-agent-add-group (category arg) - "Add the current group to an agent category." - (interactive - (list - (intern - (completing-read - "Add to category: " - (mapcar (lambda (cat) (list (symbol-name (car cat)))) - gnus-category-alist) - nil t)) - current-prefix-arg)) - (let ((cat (assq category gnus-category-alist)) - c groups) - (gnus-group-iterate arg - (lambda (group) - (when (cadddr (setq c (gnus-group-category group))) - (setf (cadddr c) (delete group (cadddr c)))) - (push group groups))) - (setf (cadddr cat) (nconc (cadddr cat) groups)) - (gnus-category-write))) - -(defun gnus-agent-remove-group (arg) - "Remove the current group from its agent category, if any." - (interactive "P") - (let (c) - (gnus-group-iterate arg - (lambda (group) - (when (cadddr (setq c (gnus-group-category group))) - (setf (cadddr c) (delete group (cadddr c)))))) - (gnus-category-write))) - -(defun gnus-agent-synchronize-flags () - "Synchronize unplugged flags with servers." - (interactive) - (save-excursion - (dolist (gnus-command-method gnus-agent-covered-methods) - (when (file-exists-p (gnus-agent-lib-file "flags")) - (gnus-agent-synchronize-flags-server gnus-command-method))))) - -(defun gnus-agent-possibly-synchronize-flags () - "Synchronize flags according to `gnus-agent-synchronize-flags'." - (interactive) - (save-excursion - (dolist (gnus-command-method gnus-agent-covered-methods) - (when (file-exists-p (gnus-agent-lib-file "flags")) - (gnus-agent-possibly-synchronize-flags-server gnus-command-method))))) - -(defun gnus-agent-synchronize-flags-server (method) - "Synchronize flags set when unplugged for server." - (let ((gnus-command-method method)) - (when (file-exists-p (gnus-agent-lib-file "flags")) - (set-buffer (get-buffer-create " *Gnus Agent flag synchronize*")) - (erase-buffer) - (nnheader-insert-file-contents (gnus-agent-lib-file "flags")) - (if (null (gnus-check-server gnus-command-method)) - (message "Couldn't open server %s" (nth 1 gnus-command-method)) - (while (not (eobp)) - (if (null (eval (read (current-buffer)))) - (progn (forward-line) - (kill-line -1)) - (write-file (gnus-agent-lib-file "flags")) - (error "Couldn't set flags from file %s" - (gnus-agent-lib-file "flags")))) - (delete-file (gnus-agent-lib-file "flags"))) - (kill-buffer nil)))) - -(defun gnus-agent-possibly-synchronize-flags-server (method) - "Synchronize flags for server according to `gnus-agent-synchronize-flags'." - (when (or (and gnus-agent-synchronize-flags - (not (eq gnus-agent-synchronize-flags 'ask))) - (and (eq gnus-agent-synchronize-flags 'ask) - (gnus-y-or-n-p (format "Synchronize flags on server `%s'? " - (cadr method))))) - (gnus-agent-synchronize-flags-server method))) - -;;; -;;; Server mode commands -;;; - -(defun gnus-agent-add-server (server) - "Enroll SERVER in the agent program." - (interactive (list (gnus-server-server-name))) - (unless server - (error "No server on the current line")) - (let ((method (gnus-server-get-method nil (gnus-server-server-name)))) - (when (member method gnus-agent-covered-methods) - (error "Server already in the agent program")) - (push method gnus-agent-covered-methods) - (gnus-server-update-server server) - (gnus-agent-write-servers) - (message "Entered %s into the Agent" server))) - -(defun gnus-agent-remove-server (server) - "Remove SERVER from the agent program." - (interactive (list (gnus-server-server-name))) - (unless server - (error "No server on the current line")) - (let ((method (gnus-server-get-method nil (gnus-server-server-name)))) - (unless (member method gnus-agent-covered-methods) - (error "Server not in the agent program")) - (setq gnus-agent-covered-methods - (delete method gnus-agent-covered-methods)) - (gnus-server-update-server server) - (gnus-agent-write-servers) - (message "Removed %s from the agent" server))) - -(defun gnus-agent-read-servers () - "Read the alist of covered servers." - (setq gnus-agent-covered-methods - (gnus-agent-read-file - (nnheader-concat gnus-agent-directory "lib/servers")))) - -(defun gnus-agent-write-servers () - "Write the alist of covered servers." - (gnus-make-directory (nnheader-concat gnus-agent-directory "lib")) - (let ((coding-system-for-write nnheader-file-coding-system) - (output-coding-system nnheader-file-coding-system) - (file-name-coding-system nnmail-pathname-coding-system) - (pathname-coding-system nnmail-pathname-coding-system)) - (with-temp-file (nnheader-concat gnus-agent-directory "lib/servers") - (prin1 gnus-agent-covered-methods (current-buffer))))) - -;;; -;;; Summary commands -;;; - -(defun gnus-agent-mark-article (n &optional unmark) - "Mark the next N articles as downloadable. -If N is negative, mark backward instead. If UNMARK is non-nil, remove -the mark instead. The difference between N and the actual number of -articles marked is returned." - (interactive "p") - (let ((backward (< n 0)) - (n (abs n))) - (while (and - (> n 0) - (progn - (gnus-summary-set-agent-mark - (gnus-summary-article-number) unmark) - (zerop (gnus-summary-next-subject (if backward -1 1) nil t)))) - (setq n (1- n))) - (when (/= 0 n) - (gnus-message 7 "No more articles")) - (gnus-summary-recenter) - (gnus-summary-position-point) - n)) - -(defun gnus-agent-unmark-article (n) - "Remove the downloadable mark from the next N articles. -If N is negative, unmark backward instead. The difference between N and -the actual number of articles unmarked is returned." - (interactive "p") - (gnus-agent-mark-article n t)) - -(defun gnus-agent-toggle-mark (n) - "Toggle the downloadable mark from the next N articles. -If N is negative, toggle backward instead. The difference between N and -the actual number of articles toggled is returned." - (interactive "p") - (gnus-agent-mark-article n 'toggle)) - -(defun gnus-summary-set-agent-mark (article &optional unmark) - "Mark ARTICLE as downloadable." - (let ((unmark (if (and (not (null unmark)) (not (eq t unmark))) - (memq article gnus-newsgroup-downloadable) - unmark))) - (if unmark - (progn - (setq gnus-newsgroup-downloadable - (delq article gnus-newsgroup-downloadable)) - (push article gnus-newsgroup-undownloaded)) - (setq gnus-newsgroup-undownloaded - (delq article gnus-newsgroup-undownloaded)) - (push article gnus-newsgroup-downloadable)) - (gnus-summary-update-mark - (if unmark gnus-undownloaded-mark gnus-downloadable-mark) - 'unread))) - -(defun gnus-agent-get-undownloaded-list () - "Mark all unfetched articles as read." - (let ((gnus-command-method (gnus-find-method-for-group gnus-newsgroup-name))) - (when (and (not gnus-plugged) - (gnus-agent-method-p gnus-command-method)) - (gnus-agent-load-alist gnus-newsgroup-name) - ;; First mark all undownloaded articles as undownloaded. - (dolist (article (mapcar (lambda (header) (mail-header-number header)) - gnus-newsgroup-headers)) - (unless (or (cdr (assq article gnus-agent-article-alist)) - (memq article gnus-newsgroup-downloadable) - (memq article gnus-newsgroup-cached)) - (push article gnus-newsgroup-undownloaded))) - ;; Then mark downloaded downloadable as not-downloadable, - ;; if you get my drift. - (dolist (article gnus-newsgroup-downloadable) - (when (cdr (assq article gnus-agent-article-alist)) - (setq gnus-newsgroup-downloadable - (delq article gnus-newsgroup-downloadable))))))) - -(defun gnus-agent-catchup () - "Mark all undownloaded articles as read." - (interactive) - (save-excursion - (while gnus-newsgroup-undownloaded - (gnus-summary-mark-article - (pop gnus-newsgroup-undownloaded) gnus-catchup-mark))) - (gnus-summary-position-point)) - -(defun gnus-agent-summary-fetch-group () - "Fetch the downloadable articles in the group." - (interactive) - (let ((articles gnus-newsgroup-downloadable) - (gnus-command-method (gnus-find-method-for-group gnus-newsgroup-name)) - (state gnus-plugged)) - (unwind-protect - (progn - (unless state - (gnus-agent-toggle-plugged t)) - (unless articles - (error "No articles to download")) - (gnus-agent-with-fetch - (gnus-agent-fetch-articles gnus-newsgroup-name articles)) - (save-excursion - (dolist (article articles) - (setq gnus-newsgroup-downloadable - (delq article gnus-newsgroup-downloadable)) - (gnus-summary-mark-article article gnus-unread-mark)))) - (when (and (not state) - gnus-plugged) - (gnus-agent-toggle-plugged nil))))) - -;;; -;;; Internal functions -;;; - -(defun gnus-agent-save-active (method) - (gnus-agent-save-active-1 method 'gnus-active-to-gnus-format)) - -(defun gnus-agent-save-active-1 (method function) - (when (gnus-agent-method-p method) - (let* ((gnus-command-method method) - (new (gnus-make-hashtable (count-lines (point-min) (point-max)))) - (file (gnus-agent-lib-file "active"))) - (funcall function nil new) - (gnus-agent-write-active file new) - (erase-buffer) - (insert-file-contents-as-coding-system gnus-agent-file-coding-system - file)))) - -(defun gnus-agent-write-active (file new) - (let ((orig (gnus-make-hashtable (count-lines (point-min) (point-max)))) - (file (gnus-agent-lib-file "active")) - elem osym) - (when (file-exists-p file) - (with-temp-buffer - (insert-file-contents-as-coding-system gnus-agent-file-coding-system - file) - (gnus-active-to-gnus-format nil orig)) - (mapatoms - (lambda (sym) - (when (and sym (boundp sym)) - (if (and (boundp (setq osym (intern (symbol-name sym) orig))) - (setq elem (symbol-value osym))) - (setcdr elem (cdr (symbol-value sym))) - (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 file orig t))) - -(defun gnus-agent-save-groups (method) - (gnus-agent-save-active-1 method 'gnus-groups-to-gnus-format)) - -(defun gnus-agent-save-group-info (method group active) - (when (gnus-agent-method-p method) - (let* ((gnus-command-method method) - (coding-system-for-write nnheader-file-coding-system) - (output-coding-system nnheader-file-coding-system) - (file-name-coding-system nnmail-pathname-coding-system) - (pathname-coding-system nnmail-pathname-coding-system) - (file (gnus-agent-lib-file "active")) - oactive-min) - (gnus-make-directory (file-name-directory file)) - (with-temp-file file - (when (file-exists-p file) - (nnheader-insert-file-contents file)) - (goto-char (point-min)) - (when (re-search-forward - (concat "^" (regexp-quote group) " ") nil t) - (save-excursion - (read (current-buffer)) ;; max - (setq oactive-min (read (current-buffer)))) ;; min - (gnus-delete-line)) - (insert (format "%S %d %d y\n" (intern group) - (cdr active) - (or oactive-min (car active)))) - (goto-char (point-max)) - (while (search-backward "\\." nil t) - (delete-char 1)))))) - -(defun gnus-agent-group-path (group) - "Translate GROUP into a path." - (if nnmail-use-long-file-names - (gnus-group-real-name group) - (nnheader-translate-file-chars - (nnheader-replace-chars-in-string - (nnheader-replace-duplicate-chars-in-string - (nnheader-replace-chars-in-string - (gnus-group-real-name group) - ?/ ?_) - ?. ?_) - ?. ?/)))) - - - -(defun gnus-agent-method-p (method) - "Say whether METHOD is covered by the agent." - (member method gnus-agent-covered-methods)) - -(defun gnus-agent-get-function (method) - (if (and (not gnus-plugged) - (gnus-agent-method-p method)) - (progn - (require 'nnagent) - 'nnagent) - (car method))) - -;;; History functions - -(defun gnus-agent-history-buffer () - (cdr (assoc (gnus-agent-method) gnus-agent-history-buffers))) - -(defun gnus-agent-open-history () - (save-excursion - (push (cons (gnus-agent-method) - (set-buffer (gnus-get-buffer-create - (format " *Gnus agent %s history*" - (gnus-agent-method))))) - gnus-agent-history-buffers) - (erase-buffer) - (insert "\n") - (let ((file (gnus-agent-lib-file "history"))) - (when (file-exists-p file) - (nnheader-insert-file-contents file)) - (set (make-local-variable 'gnus-agent-file-name) file)))) - -(defun gnus-agent-save-history () - (save-excursion - (set-buffer gnus-agent-current-history) - (gnus-make-directory (file-name-directory gnus-agent-file-name)) - (write-region-as-coding-system - gnus-agent-file-coding-system - (1+ (point-min)) (point-max) gnus-agent-file-name nil 'silent))) - -(defun gnus-agent-close-history () - (when (gnus-buffer-live-p gnus-agent-current-history) - (kill-buffer gnus-agent-current-history) - (setq gnus-agent-history-buffers - (delq (assoc (gnus-agent-method) gnus-agent-history-buffers) - gnus-agent-history-buffers)))) - -(defun gnus-agent-enter-history (id group-arts date) - (save-excursion - (set-buffer gnus-agent-current-history) - (goto-char (point-max)) - (let ((p (point))) - (insert id "\t" (number-to-string date) "\t") - (while group-arts - (insert (format "%S" (intern (caar group-arts))) - " " (number-to-string (cdr (pop group-arts))) - " ")) - (insert "\n") - (while (search-backward "\\." p t) - (delete-char 1))))) - -(defun gnus-agent-article-in-history-p (id) - (save-excursion - (set-buffer (gnus-agent-history-buffer)) - (goto-char (point-min)) - (search-forward (concat "\n" id "\t") nil t))) - -(defun gnus-agent-history-path (id) - (save-excursion - (set-buffer (gnus-agent-history-buffer)) - (goto-char (point-min)) - (when (search-forward (concat "\n" id "\t") nil t) - (let ((method (gnus-agent-method))) - (let (paths group) - (while (not (numberp (setq group (read (current-buffer))))) - (push (concat method "/" group) paths)) - (nreverse paths)))))) - -;;; -;;; Fetching -;;; - -(defun gnus-agent-fetch-articles (group articles) - "Fetch ARTICLES from GROUP and put them into the Agent." - (when articles - ;; Prune off articles that we have already fetched. - (while (and articles - (cdr (assq (car articles) gnus-agent-article-alist))) - (pop articles)) - (let ((arts articles)) - (while (cdr arts) - (if (cdr (assq (cadr arts) gnus-agent-article-alist)) - (setcdr arts (cddr arts)) - (setq arts (cdr arts))))) - (when articles - (let ((dir (concat - (gnus-agent-directory) - (gnus-agent-group-path group) "/")) - (date (time-to-days (current-time))) - (case-fold-search t) - pos crosses id elem) - (gnus-make-directory dir) - (gnus-message 7 "Fetching articles for %s..." group) - ;; Fetch the articles from the backend. - (if (gnus-check-backend-function 'retrieve-articles group) - (setq pos (gnus-retrieve-articles articles group)) - (with-temp-buffer - (let (article) - (while (setq article (pop articles)) - (when (or - (gnus-backlog-request-article group article - nntp-server-buffer) - (gnus-request-article article group)) - (goto-char (point-max)) - (push (cons article (point)) pos) - (insert-buffer-substring nntp-server-buffer))) - (copy-to-buffer nntp-server-buffer (point-min) (point-max)) - (setq pos (nreverse pos))))) - ;; Then save these articles into the Agent. - (save-excursion - (set-buffer nntp-server-buffer) - (while pos - (narrow-to-region (cdar pos) (or (cdadr pos) (point-max))) - (goto-char (point-min)) - (when (search-forward "\n\n" nil t) - (when (search-backward "\nXrefs: " nil t) - ;; Handle crossposting. - (skip-chars-forward "^ ") - (skip-chars-forward " ") - (setq crosses nil) - (while (looking-at "\\([^: \n]+\\):\\([0-9]+\\) +") - (push (cons (buffer-substring (match-beginning 1) - (match-end 1)) - (buffer-substring (match-beginning 2) - (match-end 2))) - crosses) - (goto-char (match-end 0))) - (gnus-agent-crosspost crosses (caar pos)))) - (goto-char (point-min)) - (if (not (re-search-forward "^Message-ID: *<\\([^>\n]+\\)>" nil t)) - (setq id "No-Message-ID-in-article") - (setq id (buffer-substring (match-beginning 1) (match-end 1)))) - (write-region-as-coding-system - gnus-agent-file-coding-system - (point-min) (point-max) - (concat dir (number-to-string (caar pos))) nil 'silent) - (when (setq elem (assq (caar pos) gnus-agent-article-alist)) - (setcdr elem t)) - (gnus-agent-enter-history - id (or crosses (list (cons group (caar pos)))) date) - (widen) - (pop pos))) - (gnus-agent-save-alist group))))) - -(defun gnus-agent-crosspost (crosses article) - (let (gnus-agent-article-alist group alist beg end) - (save-excursion - (set-buffer gnus-agent-overview-buffer) - (when (nnheader-find-nov-line article) - (forward-word 1) - (setq beg (point)) - (setq end (progn (forward-line 1) (point))))) - (while crosses - (setq group (caar crosses)) - (unless (setq alist (assoc group gnus-agent-group-alist)) - (push (setq alist (list group (gnus-agent-load-alist (caar crosses)))) - gnus-agent-group-alist)) - (setcdr alist (cons (cons (cdar crosses) t) (cdr alist))) - (save-excursion - (set-buffer (gnus-get-buffer-create (format " *Gnus agent overview %s*" - group))) - (when (= (point-max) (point-min)) - (push (cons group (current-buffer)) gnus-agent-buffer-alist) - (ignore-errors - (nnheader-insert-file-contents - (gnus-agent-article-name ".overview" group)))) - (nnheader-find-nov-line (string-to-number (cdar crosses))) - (insert (string-to-number (cdar crosses))) - (insert-buffer-substring gnus-agent-overview-buffer beg end)) - (pop crosses)))) - -(defun gnus-agent-flush-cache () - (save-excursion - (while gnus-agent-buffer-alist - (set-buffer (cdar gnus-agent-buffer-alist)) - (write-region-as-coding-system - gnus-agent-file-coding-system - (point-min) (point-max) - (gnus-agent-article-name ".overview" - (caar gnus-agent-buffer-alist)) - nil 'silent) - (pop gnus-agent-buffer-alist)) - (while gnus-agent-group-alist - (with-temp-file (caar gnus-agent-group-alist) - (princ (cdar gnus-agent-group-alist)) - (insert "\n")) - (pop gnus-agent-group-alist)))) - -(defun gnus-agent-fetch-headers (group &optional force) - (let* ((articles (gnus-list-of-unread-articles group)) - (len (length articles)) - (gnus-decode-encoded-word-function 'identity) - (file (gnus-agent-article-name ".overview" group)) - i) - ;; Check the number of articles is not too large. - (when (and (integerp gnus-agent-large-newsgroup) - (< 0 gnus-agent-large-newsgroup)) - (and (< 0 (setq i (- len gnus-agent-large-newsgroup))) - (setq articles (nthcdr i articles)))) - ;; add article with marks to list of article headers we want to fetch. - (dolist (arts (gnus-info-marks (gnus-get-info group))) - (setq articles (gnus-union (gnus-uncompress-sequence (cdr arts)) - articles))) - (setq articles (sort articles '<)) - ;; Remove known articles. - (when (gnus-agent-load-alist group) - (setq articles (gnus-sorted-intersection - articles - (gnus-uncompress-range - (cons (1+ (caar (last gnus-agent-article-alist))) - (cdr (gnus-active group))))))) - ;; Fetch them. - (gnus-make-directory (nnheader-translate-file-chars - (file-name-directory file) t)) - (when articles - (gnus-message 7 "Fetching headers for %s..." group) - (save-excursion - (set-buffer nntp-server-buffer) - (unless (eq 'nov (gnus-retrieve-headers articles group)) - (nnvirtual-convert-headers)) - ;; Save these headers for later processing. - (copy-to-buffer gnus-agent-overview-buffer (point-min) (point-max)) - (when (file-exists-p file) - (gnus-agent-braid-nov group articles file)) - (write-region-as-coding-system - gnus-agent-file-coding-system - (point-min) (point-max) file nil 'silent) - (gnus-agent-save-alist group articles nil) - (gnus-agent-enter-history - "last-header-fetched-for-session" - (list (cons group (nth (- (length articles) 1) articles))) - (time-to-days (current-time))) - articles)))) - -(defsubst gnus-agent-copy-nov-line (article) - (let (b e) - (set-buffer gnus-agent-overview-buffer) - (setq b (point)) - (if (eq article (read (current-buffer))) - (setq e (progn (forward-line 1) (point))) - (progn - (beginning-of-line) - (setq e b))) - (set-buffer nntp-server-buffer) - (insert-buffer-substring gnus-agent-overview-buffer b e))) - -(defun gnus-agent-braid-nov (group articles file) - (set-buffer gnus-agent-overview-buffer) - (goto-char (point-min)) - (set-buffer nntp-server-buffer) - (erase-buffer) - (nnheader-insert-file-contents file) - (goto-char (point-max)) - (if (or (= (point-min) (point-max)) - (progn - (forward-line -1) - (< (read (current-buffer)) (car articles)))) - ;; We have only headers that are after the older headers, - ;; so we just append them. - (progn - (goto-char (point-max)) - (insert-buffer-substring gnus-agent-overview-buffer)) - ;; We do it the hard way. - (nnheader-find-nov-line (car articles)) - (gnus-agent-copy-nov-line (car articles)) - (pop articles) - (while (and articles - (not (eobp))) - (while (and (not (eobp)) - (< (read (current-buffer)) (car articles))) - (forward-line 1)) - (beginning-of-line) - (unless (eobp) - (gnus-agent-copy-nov-line (car articles)) - (setq articles (cdr articles)))) - (when articles - (let (b e) - (set-buffer gnus-agent-overview-buffer) - (setq b (point) - e (point-max)) - (set-buffer nntp-server-buffer) - (insert-buffer-substring gnus-agent-overview-buffer b e))))) - -(defun gnus-agent-load-alist (group &optional dir) - "Load the article-state alist for GROUP." - (setq gnus-agent-article-alist - (gnus-agent-read-file - (if dir - (expand-file-name ".agentview" dir) - (gnus-agent-article-name ".agentview" group))))) - -(defun gnus-agent-save-alist (group &optional articles state dir) - "Save the article-state alist for GROUP." - (let ((file-name-coding-system nnmail-pathname-coding-system) - (pathname-coding-system nnmail-pathname-coding-system) - print-level print-length) - (with-temp-file (if dir - (expand-file-name ".agentview" dir) - (gnus-agent-article-name ".agentview" group)) - (princ (setq gnus-agent-article-alist - (nconc gnus-agent-article-alist - (mapcar (lambda (article) (cons article state)) - articles))) - (current-buffer)) - (insert "\n")))) - -(defun gnus-agent-article-name (article group) - (expand-file-name (if (stringp article) article (string-to-number article)) - (file-name-as-directory - (expand-file-name (gnus-agent-group-path group) - (gnus-agent-directory))))) - -;;;###autoload -(defun gnus-agent-batch-fetch () - "Start Gnus and fetch session." - (interactive) - (gnus) - (let ((gnus-agent-confirmation-function 'gnus-agent-batch-confirmation)) - (gnus-agent-fetch-session)) - (gnus-group-exit)) - -(defun gnus-agent-fetch-session () - "Fetch all articles and headers that are eligible for fetching." - (interactive) - (unless gnus-agent-covered-methods - (error "No servers are covered by the Gnus agent")) - (unless gnus-plugged - (error "Can't fetch articles while Gnus is unplugged")) - (let ((methods gnus-agent-covered-methods) - groups group gnus-command-method) - (save-excursion - (while methods - (condition-case err - (progn - (setq gnus-command-method (car methods)) - (when (or (gnus-server-opened gnus-command-method) - (gnus-open-server gnus-command-method)) - (setq groups (gnus-groups-from-server (car methods))) - (gnus-agent-with-fetch - (while (setq group (pop groups)) - (when (<= (gnus-group-level group) gnus-agent-handle-level) - (gnus-agent-fetch-group-1 group gnus-command-method)))))) - (error - (unless (funcall gnus-agent-confirmation-function - (format "Error (%s). Continue? " err)) - (error "Cannot fetch articles into the Gnus agent"))) - (quit - (unless (funcall gnus-agent-confirmation-function - (format "Quit fetching session (%s). Continue? " - err)) - (signal 'quit "Cannot fetch articles into the Gnus agent")))) - (pop methods)) - (gnus-message 6 "Finished fetching articles into the Gnus agent")))) - -(defun gnus-agent-fetch-group-1 (group method) - "Fetch GROUP." - (let ((gnus-command-method method) - (gnus-newsgroup-name group) - gnus-newsgroup-dependencies gnus-newsgroup-headers - gnus-newsgroup-scored gnus-headers gnus-score - gnus-use-cache articles arts - category predicate info marks score-param - (gnus-summary-expunge-below gnus-summary-expunge-below) - (gnus-summary-mark-below gnus-summary-mark-below) - (gnus-orphan-score gnus-orphan-score) - ;; Maybe some other gnus-summary local variables should also - ;; be put here. - ) - (unless (gnus-check-group group) - (error "Can't open server for %s" group)) - ;; Fetch headers. - (when (and (or (gnus-active group) - (gnus-activate-group group)) - (setq articles (gnus-agent-fetch-headers group)) - (let ((nntp-server-buffer gnus-agent-overview-buffer)) - ;; Parse them and see which articles we want to fetch. - (setq gnus-newsgroup-dependencies - (make-vector (length articles) 0)) - (setq gnus-newsgroup-headers - (gnus-get-newsgroup-headers-xover articles nil nil - group)) - ;; `gnus-agent-overview-buffer' may be killed for - ;; timeout reason. If so, recreate it. - (gnus-agent-create-buffer))) - (setq category (gnus-group-category group)) - (setq predicate - (gnus-get-predicate - (or (gnus-group-find-parameter group 'agent-predicate t) - (cadr category)))) - (if (memq predicate '(gnus-agent-true gnus-agent-false)) - ;; Simple implementation - (setq arts (and (eq predicate 'gnus-agent-true) articles)) - (setq arts nil) - (setq score-param - (or (gnus-group-get-parameter group 'agent-score t) - (caddr category))) - ;; Translate score-param into real one - (cond - ((not score-param)) - ((eq score-param 'file) - (setq score-param (gnus-all-score-files group))) - ((stringp (car score-param))) - (t - (setq score-param (list (list score-param))))) - (when score-param - (gnus-score-headers score-param)) - (while (setq gnus-headers (pop gnus-newsgroup-headers)) - (setq gnus-score - (or (cdr (assq (mail-header-number gnus-headers) - gnus-newsgroup-scored)) - gnus-summary-default-score)) - (when (funcall predicate) - (push (mail-header-number gnus-headers) - arts)))) - ;; Fetch the articles. - (when arts - (gnus-agent-fetch-articles group arts))) - ;; Perhaps we have some additional articles to fetch. - (setq arts (assq 'download (gnus-info-marks - (setq info (gnus-get-info group))))) - (when (cdr arts) - (gnus-agent-fetch-articles - group (gnus-uncompress-range (cdr arts))) - (setq marks (delq arts (gnus-info-marks info))) - (gnus-info-set-marks info marks) - (gnus-dribble-enter - (concat "(gnus-group-set-info '" - (gnus-prin1-to-string info) - ")"))))) - -;;; -;;; Agent Category Mode -;;; - -(defvar gnus-category-mode-hook nil - "Hook run in `gnus-category-mode' buffers.") - -(defvar gnus-category-line-format " %(%20c%): %g\n" - "Format of category lines.") - -(defvar gnus-category-mode-line-format "Gnus: %%b" - "The format specification for the category mode line.") - -(defvar gnus-agent-short-article 100 - "Articles that have fewer lines than this are short.") - -(defvar gnus-agent-long-article 200 - "Articles that have more lines than this are long.") - -(defvar gnus-agent-low-score 0 - "Articles that have a score lower than this have a low score.") - -(defvar gnus-agent-high-score 0 - "Articles that have a score higher than this have a high score.") - - -;;; Internal variables. - -(defvar gnus-category-buffer "*Agent Category*") - -(defvar gnus-category-line-format-alist - `((?c gnus-tmp-name ?s) - (?g gnus-tmp-groups ?d))) - -(defvar gnus-category-mode-line-format-alist - `((?u user-defined ?s))) - -(defvar gnus-category-line-format-spec nil) -(defvar gnus-category-mode-line-format-spec nil) - -(defvar gnus-category-mode-map nil) -(put 'gnus-category-mode 'mode-class 'special) - -(unless gnus-category-mode-map - (setq gnus-category-mode-map (make-sparse-keymap)) - (suppress-keymap gnus-category-mode-map) - - (gnus-define-keys gnus-category-mode-map - "q" gnus-category-exit - "k" gnus-category-kill - "c" gnus-category-copy - "a" gnus-category-add - "p" gnus-category-edit-predicate - "g" gnus-category-edit-groups - "s" gnus-category-edit-score - "l" gnus-category-list - - "\C-c\C-i" gnus-info-find-node - "\C-c\C-b" gnus-bug)) - -(defvar gnus-category-menu-hook nil - "*Hook run after the creation of the menu.") - -(defun gnus-category-make-menu-bar () - (gnus-turn-off-edit-menu 'category) - (unless (boundp 'gnus-category-menu) - (easy-menu-define - gnus-category-menu gnus-category-mode-map "" - '("Categories" - ["Add" gnus-category-add t] - ["Kill" gnus-category-kill t] - ["Copy" gnus-category-copy t] - ["Edit predicate" gnus-category-edit-predicate t] - ["Edit score" gnus-category-edit-score t] - ["Edit groups" gnus-category-edit-groups t] - ["Exit" gnus-category-exit t])) - - (gnus-run-hooks 'gnus-category-menu-hook))) - -(defun gnus-category-mode () - "Major mode for listing and editing agent categories. - -All normal editing commands are switched off. -\\ -For more in-depth information on this mode, read the manual -(`\\[gnus-info-find-node]'). - -The following commands are available: - -\\{gnus-category-mode-map}" - (interactive) - (when (gnus-visual-p 'category-menu 'menu) - (gnus-category-make-menu-bar)) - (kill-all-local-variables) - (gnus-simplify-mode-line) - (setq major-mode 'gnus-category-mode) - (setq mode-name "Category") - (gnus-set-default-directory) - (setq mode-line-process nil) - (use-local-map gnus-category-mode-map) - (buffer-disable-undo) - (setq truncate-lines t) - (setq buffer-read-only t) - (gnus-run-hooks 'gnus-category-mode-hook)) - -(defalias 'gnus-category-position-point 'gnus-goto-colon) - -(defun gnus-category-insert-line (category) - (let* ((gnus-tmp-name (car category)) - (gnus-tmp-groups (length (cadddr category)))) - (beginning-of-line) - (gnus-add-text-properties - (point) - (prog1 (1+ (point)) - ;; Insert the text. - (eval gnus-category-line-format-spec)) - (list 'gnus-category gnus-tmp-name)))) - -(defun gnus-enter-category-buffer () - "Go to the Category buffer." - (interactive) - (gnus-category-setup-buffer) - (gnus-configure-windows 'category) - (gnus-category-prepare)) - -(defun gnus-category-setup-buffer () - (unless (get-buffer gnus-category-buffer) - (save-excursion - (set-buffer (gnus-get-buffer-create gnus-category-buffer)) - (gnus-category-mode)))) - -(defun gnus-category-prepare () - (gnus-set-format 'category-mode) - (gnus-set-format 'category t) - (let ((alist gnus-category-alist) - (buffer-read-only nil)) - (erase-buffer) - (while alist - (gnus-category-insert-line (pop alist))) - (goto-char (point-min)) - (gnus-category-position-point))) - -(defun gnus-category-name () - (or (get-text-property (gnus-point-at-bol) 'gnus-category) - (error "No category on the current line"))) - -(defun gnus-category-read () - "Read the category alist." - (setq gnus-category-alist - (or (gnus-agent-read-file - (nnheader-concat gnus-agent-directory "lib/categories")) - (list (list 'default 'short nil nil))))) - -(defun gnus-category-write () - "Write the category alist." - (setq gnus-category-predicate-cache nil - gnus-category-group-cache nil) - (gnus-make-directory (nnheader-concat gnus-agent-directory "lib")) - (with-temp-file (nnheader-concat gnus-agent-directory "lib/categories") - (prin1 gnus-category-alist (current-buffer)))) - -(defun gnus-category-edit-predicate (category) - "Edit the predicate for CATEGORY." - (interactive (list (gnus-category-name))) - (let ((info (assq category gnus-category-alist))) - (gnus-edit-form - (cadr info) (format "Editing the predicate for category %s" category) - `(lambda (predicate) - (setcar (cdr (assq ',category gnus-category-alist)) predicate) - (gnus-category-write) - (gnus-category-list))))) - -(defun gnus-category-edit-score (category) - "Edit the score expression for CATEGORY." - (interactive (list (gnus-category-name))) - (let ((info (assq category gnus-category-alist))) - (gnus-edit-form - (caddr info) - (format "Editing the score expression for category %s" category) - `(lambda (groups) - (setcar (nthcdr 2 (assq ',category gnus-category-alist)) groups) - (gnus-category-write) - (gnus-category-list))))) - -(defun gnus-category-edit-groups (category) - "Edit the group list for CATEGORY." - (interactive (list (gnus-category-name))) - (let ((info (assq category gnus-category-alist))) - (gnus-edit-form - (cadddr info) (format "Editing the group list for category %s" category) - `(lambda (groups) - (setcar (nthcdr 3 (assq ',category gnus-category-alist)) groups) - (gnus-category-write) - (gnus-category-list))))) - -(defun gnus-category-kill (category) - "Kill the current category." - (interactive (list (gnus-category-name))) - (let ((info (assq category gnus-category-alist)) - (buffer-read-only nil)) - (gnus-delete-line) - (setq gnus-category-alist (delq info gnus-category-alist)) - (gnus-category-write))) - -(defun gnus-category-copy (category to) - "Copy the current category." - (interactive (list (gnus-category-name) (intern (read-string "New name: ")))) - (let ((info (assq category gnus-category-alist))) - (push (list to (gnus-copy-sequence (cadr info)) - (gnus-copy-sequence (caddr info)) nil) - gnus-category-alist) - (gnus-category-write) - (gnus-category-list))) - -(defun gnus-category-add (category) - "Create a new category." - (interactive "SCategory name: ") - (when (assq category gnus-category-alist) - (error "Category %s already exists" category)) - (push (list category 'false nil nil) - gnus-category-alist) - (gnus-category-write) - (gnus-category-list)) - -(defun gnus-category-list () - "List all categories." - (interactive) - (gnus-category-prepare)) - -(defun gnus-category-exit () - "Return to the group buffer." - (interactive) - (kill-buffer (current-buffer)) - (gnus-configure-windows 'group t)) - -;; To avoid having 8-bit characters in the source file. -(defvar gnus-category-not (list '! 'not (intern (format "%c" 172)))) - -(defvar gnus-category-predicate-alist - '((spam . gnus-agent-spam-p) - (short . gnus-agent-short-p) - (long . gnus-agent-long-p) - (low . gnus-agent-low-scored-p) - (high . gnus-agent-high-scored-p) - (true . gnus-agent-true) - (false . gnus-agent-false)) - "Mapping from short score predicate symbols to predicate functions.") - -(defun gnus-agent-spam-p () - "Say whether an article is spam or not." - (unless gnus-agent-spam-hashtb - (setq gnus-agent-spam-hashtb (gnus-make-hashtable 1000))) - (if (not (equal (mail-header-references gnus-headers) "")) - nil - (let ((string (gnus-simplify-subject (mail-header-subject gnus-headers)))) - (prog1 - (gnus-gethash string gnus-agent-spam-hashtb) - (gnus-sethash string t gnus-agent-spam-hashtb))))) - -(defun gnus-agent-short-p () - "Say whether an article is short or not." - (< (mail-header-lines gnus-headers) gnus-agent-short-article)) - -(defun gnus-agent-long-p () - "Say whether an article is long or not." - (> (mail-header-lines gnus-headers) gnus-agent-long-article)) - -(defun gnus-agent-low-scored-p () - "Say whether an article has a low score or not." - (< gnus-score gnus-agent-low-score)) - -(defun gnus-agent-high-scored-p () - "Say whether an article has a high score or not." - (> gnus-score gnus-agent-high-score)) - -(defun gnus-category-make-function (cat) - "Make a function from category CAT." - (let ((func (gnus-category-make-function-1 cat))) - (if (and (= (length func) 1) - (symbolp (car func))) - (car func) - (gnus-byte-compile `(lambda () ,func))))) - -(defun gnus-agent-true () - "Return t." - t) - -(defun gnus-agent-false () - "Return nil." - nil) - -(defun gnus-category-make-function-1 (cat) - "Make a function from category CAT." - (cond - ;; Functions are just returned as is. - ((or (symbolp cat) - (gnus-functionp cat)) - `(,(or (cdr (assq cat gnus-category-predicate-alist)) - cat))) - ;; More complex category. - ((consp cat) - `(,(cond - ((memq (car cat) '(& and)) - 'and) - ((memq (car cat) '(| or)) - 'or) - ((memq (car cat) gnus-category-not) - 'not)) - ,@(mapcar 'gnus-category-make-function-1 (cdr cat)))) - (t - (error "Unknown category type: %s" cat)))) - -(defun gnus-get-predicate (predicate) - "Return the predicate for CATEGORY." - (or (cdr (assoc predicate gnus-category-predicate-cache)) - (cdar (push (cons predicate - (gnus-category-make-function predicate)) - gnus-category-predicate-cache)))) - -(defun gnus-group-category (group) - "Return the category GROUP belongs to." - (unless gnus-category-group-cache - (setq gnus-category-group-cache (gnus-make-hashtable 1000)) - (let ((cs gnus-category-alist) - groups cat) - (while (setq cat (pop cs)) - (setq groups (cadddr cat)) - (while groups - (gnus-sethash (pop groups) cat gnus-category-group-cache))))) - (or (gnus-gethash group gnus-category-group-cache) - (assq 'default gnus-category-alist))) - -(defun gnus-agent-expire () - "Expire all old articles." - (interactive) - (let ((methods gnus-agent-covered-methods) - (day (- (time-to-days (current-time)) gnus-agent-expire-days)) - gnus-command-method sym group articles - history overview file histories elem art nov-file low info - unreads marked article orig lowest highest) - (save-excursion - (setq overview (gnus-get-buffer-create " *expire overview*")) - (while (setq gnus-command-method (pop methods)) - (when (file-exists-p (gnus-agent-lib-file "active")) - (with-temp-buffer - (insert-file-contents-as-coding-system - gnus-agent-file-coding-system (gnus-agent-lib-file "active")) - (gnus-active-to-gnus-format - gnus-command-method - (setq orig (gnus-make-hashtable - (count-lines (point-min) (point-max)))))) - (let ((expiry-hashtb (gnus-make-hashtable 1023))) - (gnus-agent-open-history) - (set-buffer - (setq gnus-agent-current-history - (setq history (gnus-agent-history-buffer)))) - (goto-char (point-min)) - (when (> (buffer-size) 1) - (goto-char (point-min)) - (while (not (eobp)) - (skip-chars-forward "^\t") - (if (let ((fetch-date (read (current-buffer)))) - (if (numberp fetch-date) - (> fetch-date day) - ;; History file is corrupted. - (gnus-message - 5 - (format "File %s is corrupted!" - (gnus-agent-lib-file "history"))) - (sit-for 1) - ;; Ignore it - t)) - ;; New article; we don't expire it. - (forward-line 1) - ;; Old article. Schedule it for possible nuking. - (while (not (eolp)) - (setq sym (let ((obarray expiry-hashtb) s) - (setq s (read (current-buffer))) - (if (stringp s) (intern s) s))) - (if (boundp sym) - (set sym (cons (cons (read (current-buffer)) (point)) - (symbol-value sym))) - (set sym (list (cons (read (current-buffer)) (point))))) - (skip-chars-forward " ")) - (forward-line 1))) - ;; We now have all articles that can possibly be expired. - (mapatoms - (lambda (sym) - (setq group (symbol-name sym) - articles (sort (symbol-value sym) 'car-less-than-car) - low (car (gnus-active group)) - info (gnus-get-info group) - unreads (ignore-errors - (gnus-list-of-unread-articles group)) - marked (nconc - (gnus-uncompress-range - (cdr (assq 'tick (gnus-info-marks info)))) - (gnus-uncompress-range - (cdr (assq 'dormant (gnus-info-marks info)))) - (gnus-uncompress-range - (cdr (assq 'save (gnus-info-marks info)))) - (gnus-uncompress-range - (cdr (assq 'reply (gnus-info-marks info))))) - nov-file (gnus-agent-article-name ".overview" group) - lowest nil - highest nil) - (gnus-agent-load-alist group) - (gnus-message 5 "Expiring articles in %s" group) - (set-buffer overview) - (erase-buffer) - (when (file-exists-p nov-file) - (nnheader-insert-file-contents nov-file)) - (goto-char (point-min)) - (setq article 0) - (while (setq elem (pop articles)) - (setq article (car elem)) - (when (or (null low) - (< article low) - gnus-agent-expire-all - (and (not (memq article unreads)) - (not (memq article marked)))) - ;; Find and nuke the NOV line. - (while (and (not (eobp)) - (or (not (numberp - (setq art (read (current-buffer))))) - (< art article))) - (if (and (numberp art) - (file-exists-p - (gnus-agent-article-name - (number-to-string art) group))) - (progn - (unless lowest - (setq lowest art)) - (setq highest art) - (forward-line 1)) - ;; Remove old NOV lines that have no articles. - (gnus-delete-line))) - (if (or (eobp) - (/= art article)) - (beginning-of-line) - (gnus-delete-line)) - ;; Nuke the article. - (when (file-exists-p - (setq file (gnus-agent-article-name - (number-to-string article) - group))) - (delete-file file)) - ;; Schedule the history line for nuking. - (push (cdr elem) histories))) - (gnus-make-directory (file-name-directory nov-file)) - (write-region-as-coding-system - gnus-agent-file-coding-system - (point-min) (point-max) nov-file nil 'silent) - ;; Delete the unwanted entries in the alist. - (setq gnus-agent-article-alist - (sort gnus-agent-article-alist 'car-less-than-car)) - (let* ((alist gnus-agent-article-alist) - (prev (cons nil alist)) - (first prev) - expired) - (while (and alist - (<= (caar alist) article)) - (if (or (not (cdar alist)) - (not (file-exists-p - (gnus-agent-article-name - (number-to-string - (caar alist)) - group)))) - (progn - (push (caar alist) expired) - (setcdr prev (setq alist (cdr alist)))) - (setq prev alist - alist (cdr alist)))) - (setq gnus-agent-article-alist (cdr first)) - (gnus-agent-save-alist group) - ;; Mark all articles up to the first article - ;; in `gnus-article-alist' as read. - (when (and info (caar gnus-agent-article-alist)) - (setcar (nthcdr 2 info) - (gnus-range-add - (nth 2 info) - (cons 1 (- (caar gnus-agent-article-alist) 1))))) - ;; Maybe everything has been expired from `gnus-article-alist' - ;; and so the above marking as read could not be conducted, - ;; or there are expired article within the range of the alist. - (when (and info - expired - (or (not (caar gnus-agent-article-alist)) - (> (car expired) - (caar gnus-agent-article-alist)))) - (setcar (nthcdr 2 info) - (gnus-add-to-range - (nth 2 info) - (nreverse expired)))) - (gnus-dribble-enter - (concat "(gnus-group-set-info '" - (gnus-prin1-to-string info) - ")"))) - (when lowest - (if (gnus-gethash group orig) - (setcar (gnus-gethash group orig) lowest) - (gnus-sethash group (cons lowest highest) orig)))) - expiry-hashtb) - (set-buffer history) - (setq histories (nreverse (sort histories '<))) - (while histories - (goto-char (pop histories)) - (gnus-delete-line)) - (gnus-agent-save-history) - (gnus-agent-close-history) - (gnus-write-active-file (gnus-agent-lib-file "active") orig)) - (gnus-message 4 "Expiry...done"))))))) - -;;;###autoload -(defun gnus-agent-batch () - (interactive) - (let ((init-file-user "") - (gnus-always-read-dribble-file t)) - (gnus)) - (gnus-group-send-drafts) - (gnus-agent-fetch-session)) - -(provide 'gnus-agent) - -;;; gnus-agent.el ends here diff --git a/lisp/gnus-art.el b/lisp/gnus-art.el deleted file mode 100644 index 79aaaae..0000000 --- a/lisp/gnus-art.el +++ /dev/null @@ -1,6257 +0,0 @@ -;;; gnus-art.el --- article mode commands for Semi-gnus -;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; MORIOKA Tomohiko -;; Katsumi Yamaoka -;; Keywords: mail, news, MIME - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'static)) - -(require 'path-util) -(require 'gnus) -(require 'gnus-sum) -(require 'gnus-spec) -(require 'gnus-int) -(require 'alist) -(require 'mime-view) -(require 'wid-edit) - -;; Avoid byte-compile warnings. -(eval-when-compile - (require 'mm-bodies) - (require 'mail-parse) - (require 'mm-decode) - (require 'mm-view) - (require 'mm-uu) - ) - -(autoload 'gnus-msg-mail "gnus-msg" nil t) -(autoload 'gnus-button-mailto "gnus-msg") -(autoload 'gnus-button-reply "gnus-msg" nil t) - -(defgroup gnus-article nil - "Article display." - :link '(custom-manual "(gnus)The Article Buffer") - :group 'gnus) - -(defgroup gnus-article-treat nil - "Treating article parts." - :link '(custom-manual "(gnus)Article Hiding") - :group 'gnus-article) - -(defgroup gnus-article-hiding nil - "Hiding article parts." - :link '(custom-manual "(gnus)Article Hiding") - :group 'gnus-article) - -(defgroup gnus-article-highlight nil - "Article highlighting." - :link '(custom-manual "(gnus)Article Highlighting") - :group 'gnus-article - :group 'gnus-visual) - -(defgroup gnus-article-signature nil - "Article signatures." - :link '(custom-manual "(gnus)Article Signature") - :group 'gnus-article) - -(defgroup gnus-article-headers nil - "Article headers." - :link '(custom-manual "(gnus)Hiding Headers") - :group 'gnus-article) - -(defgroup gnus-article-washing nil - "Special commands on articles." - :link '(custom-manual "(gnus)Article Washing") - :group 'gnus-article) - -(defgroup gnus-article-emphasis nil - "Fontisizing articles." - :link '(custom-manual "(gnus)Article Fontisizing") - :group 'gnus-article) - -(defgroup gnus-article-saving nil - "Saving articles." - :link '(custom-manual "(gnus)Saving Articles") - :group 'gnus-article) - -(defgroup gnus-article-mime nil - "Worshiping the MIME wonder." - :link '(custom-manual "(gnus)Using MIME") - :group 'gnus-article) - -(defgroup gnus-article-buttons nil - "Pushable buttons in the article buffer." - :link '(custom-manual "(gnus)Article Buttons") - :group 'gnus-article) - -(defgroup gnus-article-various nil - "Other article options." - :link '(custom-manual "(gnus)Misc Article") - :group 'gnus-article) - -(defcustom gnus-ignored-headers - '("^Path:" "^Expires:" "^Date-Received:" "^References:" "^Xref:" "^Lines:" - "^Relay-Version:" "^Message-ID:" "^Approved:" "^Sender:" "^Received:" - "^X-UIDL:" "^MIME-Version:" "^Return-Path:" "^In-Reply-To:" - "^Content-Type:" "^Content-Transfer-Encoding:" "^X-WebTV-Signature:" - "^X-MimeOLE:" "^X-MSMail-Priority:" "^X-Priority:" "^X-Loop:" - "^X-Authentication-Warning:" "^X-MIME-Autoconverted:" "^X-Face:" - "^X-Attribution:" "^X-Originating-IP:" "^Delivered-To:" - "^NNTP-[-A-Za-z]+:" "^Distribution:" "^X-no-archive:" "^X-Trace:" - "^X-Complaints-To:" "^X-NNTP-Posting-Host:" "^X-Orig.*:" - "^Abuse-Reports-To:" "^Cache-Post-Path:" "^X-Article-Creation-Date:" - "^X-Poster:" "^X-Mail2News-Path:" "^X-Server-Date:" "^X-Cache:" - "^Originator:" "^X-Problems-To:" "^X-Auth-User:" "^X-Post-Time:" - "^X-Admin:" "^X-UID:" "^Resent-[-A-Za-z]+:" "^X-Mailing-List:" - "^Precedence:" "^Original-[-A-Za-z]+:" "^X-filename:" "^X-Orcpt:" - "^Old-Received:" "^X-Pgp" "^X-Auth:" "^X-From-Line:" - "^X-Gnus-Article-Number:" "^X-Majordomo:" "^X-Url:" "^X-Sender:" - "^MBOX-Line" "^Priority:" "^X400-[-A-Za-z]+:" - "^Status:" "^X-Gnus-Mail-Source:" "^Cancel-Lock:" - "^X-FTN" "^X-EXP32-SerialNo:" "^Encoding:" "^Importance:" - "^Autoforwarded:" "^Original-Encoded-Information-Types:" "^X-Ya-Pop3:" - "^X-Face-Version:" "^X-Vms-To:" "^X-ML-NAME:" "^X-ML-COUNT:" - "^Mailing-List:" "^X-finfo:" "^X-md5sum:" "^X-md5sum-Origin:" - "^X-Sun-Charset:" "^X-Accept-Language:" "^X-Envelope-Sender:" - "^List-[A-Za-z]+:" "^X-Listprocessor-Version:" - "^X-Received:" "^X-Distribute:" "^X-Sequence:" "^X-Juno-Line-Breaks:" - "^X-Notes-Item:" "^X-MS-TNEF-Correlator:" "^x-uunet-gateway:" - "^X-Received:" "^Content-length:" "X-precedence:" - "^X-Authenticated-User:" "^X-Comment" "^X-Report:" "^X-Abuse-Info:" - "^X-HTTP-Proxy:" "^X-Mydeja-Info:" "^X-Copyright" "^X-No-Markup:" - "^X-Abuse-Info:" "^X-From_:" "^X-Accept-Language:" "^Errors-To:" - "^X-BeenThere:" "^X-Mailman-Version:" "^List-Help:" "^List-Post:" - "^List-Subscribe:" "^List-Id:" "^List-Unsubscribe:" "^List-Archive:" - "^X-Content-length:" "^X-Posting-Agent:" "^Original-Received:") - "*All headers that start with this regexp will be hidden. -This variable can also be a list of regexps of headers to be ignored. -If `gnus-visible-headers' is non-nil, this variable will be ignored." - :type '(choice :custom-show nil - regexp - (repeat regexp)) - :group 'gnus-article-hiding) - -(defcustom gnus-visible-headers - "^From:\\|^Newsgroups:\\|^Subject:\\|^Date:\\|^Followup-To:\\|^Reply-To:\\|^Organization:\\|^Summary:\\|^Keywords:\\|^To:\\|^[BGF]?Cc:\\|^Posted-To:\\|^Mail-Copies-To:\\|^Mail-Followup-To:\\|^Apparently-To:\\|^Gnus-Warning:\\|^Resent-From:\\|^X-Sent:" - "*All headers that do not match this regexp will be hidden. -This variable can also be a list of regexp of headers to remain visible. -If this variable is non-nil, `gnus-ignored-headers' will be ignored." - :type '(repeat :value-to-internal (lambda (widget value) - (custom-split-regexp-maybe value)) - :match (lambda (widget value) - (or (stringp value) - (widget-editable-list-match widget value))) - regexp) - :group 'gnus-article-hiding) - -(defcustom gnus-sorted-header-list - '("^From:" "^Subject:" "^Summary:" "^Keywords:" "^Newsgroups:" - "^Followup-To:" "^To:" "^Cc:" "^Date:" "^Organization:") - "*This variable is a list of regular expressions. -If it is non-nil, headers that match the regular expressions will -be placed first in the article buffer in the sequence specified by -this list." - :type '(repeat regexp) - :group 'gnus-article-hiding) - -(defcustom gnus-boring-article-headers '(empty followup-to reply-to) - "Headers that are only to be displayed if they have interesting data. -Possible values in this list are: - - 'empty Headers with no content. - 'newsgroups Newsgroup identical to Gnus group. - 'to-address To identical to To-address. - 'followup-to Followup-to identical to Newsgroups. - 'reply-to Reply-to identical to From. - 'date Date less than four days old. - 'long-to To and/or Cc longer than 1024 characters. - 'many-to Multiple To and/or Cc." - :type '(set (const :tag "Headers with no content." empty) - (const :tag "Newsgroups identical to Gnus group." newsgroups) - (const :tag "To identical to To-address." to-address) - (const :tag "Followup-to identical to Newsgroups." followup-to) - (const :tag "Reply-to identical to From." reply-to) - (const :tag "Date less than four days old." date) - (const :tag "To and/or Cc longer than 1024 characters." long-to) - (const :tag "Multiple To and/or Cc headers." many-to)) - :group 'gnus-article-hiding) - -(defcustom gnus-signature-separator '("^-- $" "^-- *$") - "Regexp matching signature separator. -This can also be a list of regexps. In that case, it will be checked -from head to tail looking for a separator. Searches will be done from -the end of the buffer." - :type '(repeat string) - :group 'gnus-article-signature) - -(defcustom gnus-signature-limit nil - "Provide a limit to what is considered a signature. -If it is a number, no signature may not be longer (in characters) than -that number. If it is a floating point number, no signature may be -longer (in lines) than that number. If it is a function, the function -will be called without any parameters, and if it returns nil, there is -no signature in the buffer. If it is a string, it will be used as a -regexp. If it matches, the text in question is not a signature." - :type '(choice (integer :value 200) - (number :value 4.0) - (function :value fun) - (regexp :value ".*")) - :group 'gnus-article-signature) - -(defcustom gnus-hidden-properties '(invisible t intangible t) - "Property list to use for hiding text." - :type 'sexp - :group 'gnus-article-hiding) - -;; Fixme: This isn't the right thing for mixed graphical and and -;; non-graphical frames in a session. -;; gnus-xmas.el overrides this for XEmacs. -(defcustom gnus-article-x-face-command - (cond - ((and (fboundp 'image-type-available-p) - (module-installed-p 'x-face-e21)) - 'x-face-decode-message-header) - ((and (fboundp 'image-type-available-p) - (image-type-available-p 'xbm)) - 'gnus-article-display-xface) - ((and (not (featurep 'xemacs)) - window-system - (module-installed-p 'x-face-mule)) - 'x-face-mule-gnus-article-display-x-face) - (gnus-article-compface-xbm - "{ echo '/* Width=48, Height=48 */'; uncompface; } | display -") - (t - "{ echo '/* Width=48, Height=48 */'; uncompface; } | icontopbm | \ -display -")) - "*String or function to be executed to display an X-Face header. -If it is a string, the command will be executed in a sub-shell -asynchronously. The compressed face will be piped to this command." - :type '(choice string - (function-item - :tag "x-face-decode-message-header (x-face-e21)" - x-face-decode-message-header) - (function-item gnus-article-display-xface) - (function-item x-face-mule-gnus-article-display-x-face) - function) - ;;:version "21.1" - :group 'gnus-article-washing) - -(defcustom gnus-article-x-face-too-ugly nil - "Regexp matching posters whose face shouldn't be shown automatically." - :type '(choice regexp (const nil)) - :group 'gnus-article-washing) - -(defcustom gnus-article-banner-alist nil - "Banner alist for stripping. -For example, - ((egroups . \"^[ \\t\\n]*-------------------+\\\\( \\\\(e\\\\|Yahoo! \\\\)Groups Sponsor -+\\\\)?....\\n\\\\(.+\\n\\\\)+\"))" - :version "21.1" - :type '(repeat (cons symbol regexp)) - :group 'gnus-article-washing) - -(gnus-define-group-parameter - banner - :variable-document - "Alist of regexps (to match group names) and banner." - :variable-group gnus-article-washing - :parameter-type - '(choice :tag "Banner" - :value nil - (const :tag "Remove signature" signature) - (symbol :tag "Item in `gnus-article-banner-alist'" none) - regexp - (const :tag "None" nil)) - :parameter-document - "If non-nil, specify how to remove `banners' from articles. - -Symbol `signature' means to remove signatures delimited by -`gnus-signature-separator'. Any other symbol is used to look up a -regular expression to match the banner in `gnus-article-banner-alist'. -A string is used as a regular expression to match the banner -directly.") - -(defcustom gnus-emphasis-alist - (let ((format - "\\(\\s-\\|^\\|[-\"]\\|\\s(\\)\\(%s\\(\\w+\\(\\s-+\\w+\\)*[.,]?\\)%s\\)\\(\\s-\\|[-,;:\"]\\s-\\|[?!.]+\\s-\\|\\s)\\)") - (types - '(("_" "_" underline) - ("/" "/" italic) - ("\\*" "\\*" bold) - ("_/" "/_" underline-italic) - ("_\\*" "\\*_" underline-bold) - ("\\*/" "/\\*" bold-italic) - ("_\\*/" "/\\*_" underline-bold-italic)))) - `(("\\(\\s-\\|^\\)\\(_\\(\\(\\w\\|_[^_]\\)+\\)_\\)\\(\\s-\\|[?!.,;]\\)" - 2 3 gnus-emphasis-underline) - ,@(mapcar - (lambda (spec) - (list - (format format (car spec) (car (cdr spec))) - 2 3 (intern (format "gnus-emphasis-%s" (nth 2 spec))))) - types))) - "*Alist that says how to fontify certain phrases. -Each item looks like this: - - (\"_\\\\(\\\\w+\\\\)_\" 0 1 'underline) - -The first element is a regular expression to be matched. The second -is a number that says what regular expression grouping used to find -the entire emphasized word. The third is a number that says what -regexp grouping should be displayed and highlighted. The fourth -is the face used for highlighting." - :type '(repeat (list :value ("" 0 0 default) - regexp - (integer :tag "Match group") - (integer :tag "Emphasize group") - face)) - :group 'gnus-article-emphasis) - -(defcustom gnus-emphasize-whitespace-regexp "^[ \t]+\\|[ \t]*\n" - "A regexp to describe whitespace which should not be emphasized. -Typical values are \"^[ \\t]+\\\\|[ \\t]*\\n\" and \"[ \\t]+\\\\|[ \\t]*\\n\". -The former avoids underlining of leading and trailing whitespace, -and the latter avoids underlining any whitespace at all." - :version "21.1" - :group 'gnus-article-emphasis - :type 'regexp) - -(defface gnus-emphasis-bold '((t (:bold t))) - "Face used for displaying strong emphasized text (*word*)." - :group 'gnus-article-emphasis) - -(defface gnus-emphasis-italic '((t (:italic t))) - "Face used for displaying italic emphasized text (/word/)." - :group 'gnus-article-emphasis) - -(defface gnus-emphasis-underline '((t (:underline t))) - "Face used for displaying underlined emphasized text (_word_)." - :group 'gnus-article-emphasis) - -(defface gnus-emphasis-underline-bold '((t (:bold t :underline t))) - "Face used for displaying underlined bold emphasized text (_*word*_)." - :group 'gnus-article-emphasis) - -(defface gnus-emphasis-underline-italic '((t (:italic t :underline t))) - "Face used for displaying underlined italic emphasized text (_/word/_)." - :group 'gnus-article-emphasis) - -(defface gnus-emphasis-bold-italic '((t (:bold t :italic t))) - "Face used for displaying bold italic emphasized text (/*word*/)." - :group 'gnus-article-emphasis) - -(defface gnus-emphasis-underline-bold-italic - '((t (:bold t :italic t :underline t))) - "Face used for displaying underlined bold italic emphasized text. -Esample: (_/*word*/_)." - :group 'gnus-article-emphasis) - -(defface gnus-emphasis-highlight-words - '((t (:background "black" :foreground "yellow"))) - "Face used for displaying highlighted words." - :group 'gnus-article-emphasis) - -(defcustom gnus-article-time-format "%a, %b %d %Y %T %Z" - "Format for display of Date headers in article bodies. -See `format-time-string' for the possible values. - -The variable can also be function, which should return a complete Date -header. The function is called with one argument, the time, which can -be fed to `format-time-string'." - :type '(choice string symbol) - :link '(custom-manual "(gnus)Article Date") - :group 'gnus-article-washing) - -(eval-and-compile - (autoload 'mail-extract-address-components "mail-extr")) - -(defcustom gnus-save-all-headers t - "*If non-nil, don't remove any headers before saving." - :group 'gnus-article-saving - :type 'boolean) - -(defcustom gnus-prompt-before-saving 'always - "*This variable says how much prompting is to be done when saving articles. -If it is nil, no prompting will be done, and the articles will be -saved to the default files. If this variable is `always', each and -every article that is saved will be preceded by a prompt, even when -saving large batches of articles. If this variable is neither nil not -`always', there the user will be prompted once for a file name for -each invocation of the saving commands." - :group 'gnus-article-saving - :type '(choice (item always) - (item :tag "never" nil) - (sexp :tag "once" :format "%t\n" :value t))) - -(defcustom gnus-saved-headers gnus-visible-headers - "Headers to keep if `gnus-save-all-headers' is nil. -If `gnus-save-all-headers' is non-nil, this variable will be ignored. -If that variable is nil, however, all headers that match this regexp -will be kept while the rest will be deleted before saving." - :group 'gnus-article-saving - :type 'regexp) - -(defcustom gnus-default-article-saver 'gnus-summary-save-in-rmail - "A function to save articles in your favourite format. -The function must be interactively callable (in other words, it must -be an Emacs command). - -Gnus provides the following functions: - -* gnus-summary-save-in-rmail (Rmail format) -* gnus-summary-save-in-mail (Unix mail format) -* gnus-summary-save-in-folder (MH folder) -* gnus-summary-save-in-file (article format) -* gnus-summary-save-in-vm (use VM's folder format) -* gnus-summary-write-to-file (article format -- overwrite)." - :group 'gnus-article-saving - :type '(radio (function-item gnus-summary-save-in-rmail) - (function-item gnus-summary-save-in-mail) - (function-item gnus-summary-save-in-folder) - (function-item gnus-summary-save-in-file) - (function-item gnus-summary-save-in-vm) - (function-item gnus-summary-write-to-file))) - -(defcustom gnus-rmail-save-name 'gnus-plain-save-name - "A function generating a file name to save articles in Rmail format. -The function is called with NEWSGROUP, HEADERS, and optional LAST-FILE." - :group 'gnus-article-saving - :type 'function) - -(defcustom gnus-mail-save-name 'gnus-plain-save-name - "A function generating a file name to save articles in Unix mail format. -The function is called with NEWSGROUP, HEADERS, and optional LAST-FILE." - :group 'gnus-article-saving - :type 'function) - -(defcustom gnus-folder-save-name 'gnus-folder-save-name - "A function generating a file name to save articles in MH folder. -The function is called with NEWSGROUP, HEADERS, and optional LAST-FOLDER." - :group 'gnus-article-saving - :type 'function) - -(defcustom gnus-file-save-name 'gnus-numeric-save-name - "A function generating a file name to save articles in article format. -The function is called with NEWSGROUP, HEADERS, and optional -LAST-FILE." - :group 'gnus-article-saving - :type 'function) - -(defcustom gnus-split-methods - '((gnus-article-archive-name) - (gnus-article-nndoc-name)) - "*Variable used to suggest where articles are to be saved. -For instance, if you would like to save articles related to Gnus in -the file \"gnus-stuff\", and articles related to VM in \"vm-stuff\", -you could set this variable to something like: - - '((\"^Subject:.*gnus\\|^Newsgroups:.*gnus\" \"gnus-stuff\") - (\"^Subject:.*vm\\|^Xref:.*vm\" \"vm-stuff\")) - -This variable is an alist where the where the key is the match and the -value is a list of possible files to save in if the match is non-nil. - -If the match is a string, it is used as a regexp match on the -article. If the match is a symbol, that symbol will be funcalled -from the buffer of the article to be saved with the newsgroup as the -parameter. If it is a list, it will be evaled in the same buffer. - -If this form or function returns a string, this string will be used as -a possible file name; and if it returns a non-nil list, that list will -be used as possible file names." - :group 'gnus-article-saving - :type '(repeat (choice (list :value (fun) function) - (cons :value ("" "") regexp (repeat string)) - (sexp :value nil)))) - -(defcustom gnus-article-display-method-for-mime - 'gnus-article-display-mime-message - "Function to display a MIME message. -The function is called from the article buffer." - :group 'gnus-article-mime - :type 'function) - -(defcustom gnus-article-display-method-for-traditional - 'gnus-article-display-traditional-message - "*Function to display a traditional message. -The function is called from the article buffer." - :group 'gnus-article-mime - :type 'function) - -(defcustom gnus-page-delimiter "^\^L" - "*Regexp describing what to use as article page delimiters. -The default value is \"^\^L\", which is a form linefeed at the -beginning of a line." - :type 'regexp - :group 'gnus-article-various) - -(defcustom gnus-article-mode-line-format "Gnus: %g [%w] %S%m" - "*The format specification for the article mode line. -See `gnus-summary-mode-line-format' for a closer description. - -The following additional specs are available: - -%w The article washing status. -%m The number of MIME parts in the article." - :type 'string - :group 'gnus-article-various) - -(defcustom gnus-article-mode-hook nil - "*A hook for Gnus article mode." - :type 'hook - :group 'gnus-article-various) - -(when (featurep 'xemacs) - ;; Extracted from gnus-xmas-define in order to preserve user settings - (when (fboundp 'turn-off-scroll-in-place) - (add-hook 'gnus-article-mode-hook 'turn-off-scroll-in-place)) - ;; Extracted from gnus-xmas-redefine in order to preserve user settings - (add-hook 'gnus-article-mode-hook 'gnus-xmas-article-menu-add)) - -(defcustom gnus-article-menu-hook nil - "*Hook run after the creation of the article mode menu." - :type 'hook - :group 'gnus-article-various) - -(defcustom gnus-article-prepare-hook nil - "*A hook called after an article has been prepared in the article buffer." - :type 'hook - :group 'gnus-article-various) - -(defcustom gnus-article-hide-pgp-hook nil - "*A hook called after successfully hiding a PGP signature." - :type 'hook - :group 'gnus-article-various) - -(defcustom gnus-article-button-face 'bold - "Face used for highlighting buttons in the article buffer. - -An article button is a piece of text that you can activate by pressing -`RET' or `mouse-2' above it." - :type 'face - :group 'gnus-article-buttons) - -(defcustom gnus-article-mouse-face 'highlight - "Face used for mouse highlighting in the article buffer. - -Article buttons will be displayed in this face when the cursor is -above them." - :type 'face - :group 'gnus-article-buttons) - -(defcustom gnus-signature-face 'gnus-signature-face - "Face used for highlighting a signature in the article buffer. -Obsolete; use the face `gnus-signature-face' for customizations instead." - :type 'face - :group 'gnus-article-highlight - :group 'gnus-article-signature) - -(defface gnus-signature-face - '((t - (:italic t))) - "Face used for highlighting a signature in the article buffer." - :group 'gnus-article-highlight - :group 'gnus-article-signature) - -(defface gnus-header-from-face - '((((class color) - (background dark)) - (:foreground "spring green")) - (((class color) - (background light)) - (:foreground "red3")) - (t - (:italic t))) - "Face used for displaying from headers." - :group 'gnus-article-headers - :group 'gnus-article-highlight) - -(defface gnus-header-subject-face - '((((class color) - (background dark)) - (:foreground "SeaGreen3")) - (((class color) - (background light)) - (:foreground "red4")) - (t - (:bold t :italic t))) - "Face used for displaying subject headers." - :group 'gnus-article-headers - :group 'gnus-article-highlight) - -(defface gnus-header-newsgroups-face - '((((class color) - (background dark)) - (:foreground "yellow" :italic t)) - (((class color) - (background light)) - (:foreground "MidnightBlue" :italic t)) - (t - (:italic t))) - "Face used for displaying newsgroups headers." - :group 'gnus-article-headers - :group 'gnus-article-highlight) - -(defface gnus-header-name-face - '((((class color) - (background dark)) - (:foreground "SeaGreen")) - (((class color) - (background light)) - (:foreground "maroon")) - (t - (:bold t))) - "Face used for displaying header names." - :group 'gnus-article-headers - :group 'gnus-article-highlight) - -(defface gnus-header-content-face - '((((class color) - (background dark)) - (:foreground "forest green" :italic t)) - (((class color) - (background light)) - (:foreground "indianred4" :italic t)) - (t - (:italic t))) - "Face used for displaying header content." - :group 'gnus-article-headers - :group 'gnus-article-highlight) - -(defcustom gnus-header-face-alist - '(("From" nil gnus-header-from-face) - ("Subject" nil gnus-header-subject-face) - ("Newsgroups:.*," nil gnus-header-newsgroups-face) - ("" gnus-header-name-face gnus-header-content-face)) - "*Controls highlighting of article header. - -An alist of the form (HEADER NAME CONTENT). - -HEADER is a regular expression which should match the name of an -header header and NAME and CONTENT are either face names or nil. - -The name of each header field will be displayed using the face -specified by the first element in the list where HEADER match the -header name and NAME is non-nil. Similarly, the content will be -displayed by the first non-nil matching CONTENT face." - :group 'gnus-article-headers - :group 'gnus-article-highlight - :type '(repeat (list (regexp :tag "Header") - (choice :tag "Name" - (item :tag "skip" nil) - (face :value default)) - (choice :tag "Content" - (item :tag "skip" nil) - (face :value default))))) - -(defcustom gnus-article-decode-hook nil - "*Hook run to decode charsets in articles." - :group 'gnus-article-headers - :type 'hook) - -(defcustom gnus-display-mime-function 'gnus-display-mime - "Function to display MIME articles." - :group 'gnus-article-mime - :type 'function) - -(defvar gnus-decode-header-function 'mail-decode-encoded-word-region - "Function used to decode headers.") - -(defvar gnus-article-dumbquotes-map - '(("\200" "EUR") - ("\202" ",") - ("\203" "f") - ("\204" ",,") - ("\205" "...") - ("\213" "<") - ("\214" "OE") - ("\221" "`") - ("\222" "'") - ("\223" "``") - ("\224" "\"") - ("\225" "*") - ("\226" "-") - ("\227" "--") - ("\231" "(TM)") - ("\233" ">") - ("\234" "oe") - ("\264" "'")) - "Table for MS-to-Latin1 translation.") - -(defcustom gnus-ignored-mime-types nil - "List of MIME types that should be ignored by Gnus." - :version "21.1" - :group 'gnus-article-mime - :type '(repeat regexp)) - -(defcustom gnus-unbuttonized-mime-types '(".*/.*") - "List of MIME types that should not be given buttons when rendered inline." - :version "21.1" - :group 'gnus-article-mime - :type '(repeat regexp)) - -(defcustom gnus-article-mime-part-function nil - "Function called with a MIME handle as the argument. -This is meant for people who want to do something automatic based -on parts -- for instance, adding Vcard info to a database." - :group 'gnus-article-mime - :type 'function) - -(defcustom gnus-mime-multipart-functions nil - "An alist of MIME types to functions to display them." - :version "21.1" - :group 'gnus-article-mime - :type 'alist) - -(defcustom gnus-article-date-lapsed-new-header nil - "Whether the X-Sent and Date headers can coexist. -When using `gnus-treat-date-lapsed', the \"X-Sent:\" header will -either replace the old \"Date:\" header (if this variable is nil), or -be added below it (otherwise)." - :version "21.1" - :group 'gnus-article-headers - :type 'boolean) - -(defcustom gnus-article-mime-match-handle-function 'undisplayed-alternative - "Function called with a MIME handle as the argument. -This is meant for people who want to view first matched part. -For `undisplayed-alternative' (default), the first undisplayed -part or alternative part is used. For `undisplayed', the first -undisplayed part is used. For a function, the first part which -the function return `t' is used. For `nil', the first part is -used." - :version "21.1" - :group 'gnus-article-mime - :type '(choice - (item :tag "first" :value nil) - (item :tag "undisplayed" :value undisplayed) - (item :tag "undisplayed or alternative" - :value undisplayed-alternative) - (function))) - -(defcustom gnus-mime-action-alist - '(("save to file" . gnus-mime-save-part) - ("save and strip" . gnus-mime-save-part-and-strip) - ("display as text" . gnus-mime-inline-part) - ("view the part" . gnus-mime-view-part) - ("pipe to command" . gnus-mime-pipe-part) - ("toggle display" . gnus-article-press-button) - ("toggle display" . gnus-article-view-part-as-charset) - ("view as type" . gnus-mime-view-part-as-type) - ("internalize type" . gnus-mime-internalize-part) - ("externalize type" . gnus-mime-externalize-part)) - "An alist of actions that run on the MIME attachment." - :group 'gnus-article-mime - :type '(repeat (cons (string :tag "name") - (function)))) - -(defcustom gnus-mime-action-alist - '(("save to file" . gnus-mime-save-part) - ("display as text" . gnus-mime-inline-part) - ("view the part" . gnus-mime-view-part) - ("pipe to command" . gnus-mime-pipe-part) - ("toggle display" . gnus-article-press-button) - ("view as type" . gnus-mime-view-part-as-type) - ("internalize type" . gnus-mime-internalize-part) - ("externalize type" . gnus-mime-externalize-part)) - "An alist of actions that run on the MIME attachment." - :version "21.1" - :group 'gnus-article-mime - :type '(repeat (cons (string :tag "name") - (function)))) - -;;; -;;; The treatment variables -;;; - -(defvar gnus-part-display-hook nil - "Hook called on parts that are to receive treatment.") - -(defvar gnus-article-treat-custom - '(choice (const :tag "Off" nil) - (const :tag "On" t) - (const :tag "Header" head) - (const :tag "Last" last) - (const :tag "Mime" mime) - (integer :tag "Less") - (repeat :tag "Groups" regexp) - (sexp :tag "Predicate"))) - -(defvar gnus-article-treat-head-custom - '(choice (const :tag "Off" nil) - (const :tag "Header" head))) - -(defvar gnus-article-treat-types '("text/plain") - "Parts to treat.") - -(defvar gnus-inhibit-treatment nil - "Whether to inhibit treatment.") - -(defcustom gnus-treat-highlight-signature '(or last (typep "text/x-vcard")) - "Highlight the signature. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) -(put 'gnus-treat-highlight-signature 'highlight t) - -(defcustom gnus-treat-buttonize 100000 - "Add buttons. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) -(put 'gnus-treat-buttonize 'highlight t) - -(defcustom gnus-treat-buttonize-head 'head - "Add buttons to the head. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-head-custom) -(put 'gnus-treat-buttonize-head 'highlight t) - -(defcustom gnus-treat-emphasize - (and (or window-system - (featurep 'xemacs) - (>= (string-to-number emacs-version) 21)) - 50000) - "Emphasize text. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) -(put 'gnus-treat-emphasize 'highlight t) - -(defcustom gnus-treat-strip-cr nil - "Remove carriage returns. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-leading-whitespace nil - "Remove leading whitespace in headers. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-hide-headers 'head - "Hide headers. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-head-custom) - -(defcustom gnus-treat-hide-boring-headers nil - "Hide boring headers. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-head-custom) - -(defcustom gnus-treat-hide-signature nil - "Hide the signature. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-fill-article nil - "Fill the article. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-hide-citation nil - "Hide cited text. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-hide-citation-maybe nil - "Hide cited text. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-hide-citation-maybe nil - "Hide cited text. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-strip-list-identifiers 'head - "Strip list identifiers from `gnus-list-identifiers`. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :version "21.1" - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-strip-pgp t - "Strip PGP signatures. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-strip-pem nil - "Strip PEM signatures. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-strip-banner t - "Strip banners from articles. -The banner to be stripped is specified in the `banner' group parameter. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-highlight-headers 'head - "Highlight the headers. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-head-custom) -(put 'gnus-treat-highlight-headers 'highlight t) - -(defcustom gnus-treat-highlight-citation t - "Highlight cited text. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) -(put 'gnus-treat-highlight-citation 'highlight t) - -(defcustom gnus-treat-date-ut nil - "Display the Date in UT (GMT). -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-head-custom) - -(defcustom gnus-treat-date-local nil - "Display the Date in the local timezone. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-head-custom) - -(defcustom gnus-treat-date-english nil - "Display the Date in a format that can be read aloud in English. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-head-custom) - -(defcustom gnus-treat-date-lapsed nil - "Display the Date header in a way that says how much time has elapsed. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-head-custom) - -(defcustom gnus-treat-date-original nil - "Display the date in the original timezone. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-head-custom) - -(defcustom gnus-treat-date-iso8601 nil - "Display the date in the ISO8601 format. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :version "21.1" - :group 'gnus-article-treat - :type gnus-article-treat-head-custom) - -(defcustom gnus-treat-date-user-defined nil - "Display the date in a user-defined format. -The format is defined by the `gnus-article-time-format' variable. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-head-custom) - -(defcustom gnus-treat-strip-headers-in-body t - "Strip the X-No-Archive header line from the beginning of the body. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :version "21.1" - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-strip-trailing-blank-lines nil - "Strip trailing blank lines. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-strip-leading-blank-lines nil - "Strip leading blank lines. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-strip-multiple-blank-lines nil - "Strip multiple blank lines. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-overstrike t - "Treat overstrike highlighting. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) -(put 'gnus-treat-overstrike 'highlight t) - -(defcustom gnus-treat-display-xface - (and (or (and (fboundp 'image-type-available-p) - (image-type-available-p 'xbm) - (string-match "^0x" (shell-command-to-string "uncompface"))) - (and (featurep 'xemacs) (featurep 'xface)) - (eq 'x-face-mule-gnus-article-display-x-face - gnus-article-x-face-command)) - 'head) - "Display X-Face headers. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - ;;:version "21.1" - :type gnus-article-treat-head-custom) -(put 'gnus-treat-display-xface 'highlight t) - -(defcustom gnus-treat-display-smileys - (if (or (and (featurep 'xemacs) - (featurep 'xpm)) - (and (fboundp 'image-type-available-p) - (image-type-available-p 'pbm)) - (and (not (featurep 'xemacs)) - window-system - (module-installed-p 'smiley-mule))) - t - nil) - "Display smileys. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - ;;:version "21.1" - :type gnus-article-treat-custom) -(put 'gnus-treat-display-smileys 'highlight t) - -(defcustom gnus-treat-display-picons (if (featurep 'xemacs) 'head nil) - "Display picons. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-head-custom) -(put 'gnus-treat-display-picons 'highlight t) - -(defcustom gnus-treat-capitalize-sentences nil - "Capitalize sentence-starting words. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :version "21.1" - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-fill-long-lines nil - "Fill long lines. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-play-sounds nil - "Play sounds. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :version "21.1" - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-decode-article-as-default-mime-charset nil - "Decode an article as `default-mime-charset'. For instance, if you want to -attempt to decode an article even if the value of `gnus-show-mime' is nil, -you could set this variable to something like: nil for don't decode, t for -decode the body, '(or header t) for the whole article, etc." - :group 'gnus-article-treat - :type '(radio (const :tag "Off" nil) - (const :tag "Decode body" t) - (const :tag "Decode all" (or head t)))) - -(defcustom gnus-treat-translate nil - "Translate articles from one language to another. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :version "21.1" - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-x-pgp-sig nil - "Verify X-PGP-Sig. -To automatically treat X-PGP-Sig, set it to head. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :group 'mime-security - :type gnus-article-treat-custom) - -(defvar gnus-article-encrypt-protocol-alist - '(("PGP" . mml2015-self-encrypt))) - -;; Set to nil if more than one protocol added to -;; gnus-article-encrypt-protocol-alist. -(defcustom gnus-article-encrypt-protocol "PGP" - "The protocol used for encrypt articles. -It is a string, such as \"PGP\". If nil, ask user." - :type 'string - :group 'mime-security) - -;;; Internal variables - -(defvar gnus-english-month-names - '("January" "February" "March" "April" "May" "June" "July" "August" - "September" "October" "November" "December")) - -(defvar article-goto-body-goes-to-point-min-p nil) -(defvar gnus-article-wash-types nil) -(defvar gnus-article-emphasis-alist nil) - -(defvar gnus-article-mime-handle-alist-1 nil) -(defvar gnus-treatment-function-alist - `((gnus-treat-decode-article-as-default-mime-charset - gnus-article-decode-article-as-default-mime-charset) - (gnus-treat-x-pgp-sig gnus-article-verify-x-pgp-sig) - (gnus-treat-strip-banner gnus-article-strip-banner) - (gnus-treat-strip-headers-in-body gnus-article-strip-headers-in-body) - (gnus-treat-buttonize gnus-article-add-buttons) - (gnus-treat-fill-article gnus-article-fill-cited-article) - (gnus-treat-fill-long-lines gnus-article-fill-long-lines) - (gnus-treat-strip-cr gnus-article-remove-cr) - (gnus-treat-display-xface gnus-article-display-x-face) - (gnus-treat-date-ut gnus-article-date-ut) - (gnus-treat-date-local gnus-article-date-local) - (gnus-treat-date-english gnus-article-date-english) - (gnus-treat-date-lapsed gnus-article-date-lapsed) - (gnus-treat-date-original gnus-article-date-original) - (gnus-treat-date-user-defined gnus-article-date-user) - (gnus-treat-date-iso8601 gnus-article-date-iso8601) - (gnus-treat-hide-headers gnus-article-maybe-hide-headers) - (gnus-treat-hide-boring-headers gnus-article-hide-boring-headers) - (gnus-treat-hide-signature gnus-article-hide-signature) - (gnus-treat-hide-citation gnus-article-hide-citation) - (gnus-treat-hide-citation-maybe gnus-article-hide-citation-maybe) - (gnus-treat-strip-list-identifiers gnus-article-hide-list-identifiers) - (gnus-treat-leading-whitespace gnus-article-remove-leading-whitespace) - (gnus-treat-strip-pgp gnus-article-hide-pgp) - (gnus-treat-strip-pem gnus-article-hide-pem) - (gnus-treat-highlight-headers gnus-article-highlight-headers) - (gnus-treat-emphasize gnus-article-emphasize) - (gnus-treat-highlight-citation gnus-article-highlight-citation) - (gnus-treat-highlight-signature gnus-article-highlight-signature) - (gnus-treat-strip-trailing-blank-lines - gnus-article-remove-trailing-blank-lines) - (gnus-treat-strip-leading-blank-lines - gnus-article-strip-leading-blank-lines) - (gnus-treat-strip-multiple-blank-lines - gnus-article-strip-multiple-blank-lines) - (gnus-treat-overstrike gnus-article-treat-overstrike) - (gnus-treat-buttonize-head gnus-article-add-buttons-to-head) - (gnus-treat-display-smileys ,(if (or (featurep 'xemacs) - (>= emacs-major-version 21)) - 'gnus-smiley-display - 'gnus-article-smiley-display)) - (gnus-treat-capitalize-sentences gnus-article-capitalize-sentences) - (gnus-treat-display-picons gnus-article-display-picons) - (gnus-treat-play-sounds gnus-earcon-display))) - -(defvar gnus-article-mime-handle-alist nil) -(defvar article-lapsed-timer nil) -(defvar gnus-article-current-summary nil) - -(defvar gnus-article-mode-syntax-table - (let ((table (copy-syntax-table text-mode-syntax-table))) - ;; This causes the citation match run O(2^n). - ;; (modify-syntax-entry ?- "w" table) - (modify-syntax-entry ?> ")" table) - (modify-syntax-entry ?< "(" table) - table) - "Syntax table used in article mode buffers. -Initialized from `text-mode-syntax-table.") - -(defvar gnus-save-article-buffer nil) - -(defvar gnus-article-mode-line-format-alist - (nconc '((?w (gnus-article-wash-status) ?s) - (?m (gnus-article-mime-part-status) ?s)) - gnus-summary-mode-line-format-alist)) - -(defvar gnus-number-of-articles-to-be-saved nil) - -(defvar gnus-inhibit-hiding nil) - -(defsubst gnus-article-hide-text (b e props) - "Set text PROPS on the B to E region, extending `intangible' 1 past B." - (gnus-add-text-properties-when 'article-type nil b e props) - (when (memq 'intangible props) - (put-text-property - (max (1- b) (point-min)) - b 'intangible (cddr (memq 'intangible props))))) - -(defsubst gnus-article-unhide-text (b e) - "Remove hidden text properties from region between B and E." - (remove-text-properties b e gnus-hidden-properties) - (when (memq 'intangible gnus-hidden-properties) - (put-text-property (max (1- b) (point-min)) - b 'intangible nil))) - -(defun gnus-article-hide-text-type (b e type) - "Hide text of TYPE between B and E." - (push type gnus-article-wash-types) - (gnus-article-hide-text - b e (cons 'article-type (cons type gnus-hidden-properties)))) - -(defun gnus-article-unhide-text-type (b e type) - "Unhide text of TYPE between B and E." - (setq gnus-article-wash-types - (delq type gnus-article-wash-types)) - (remove-text-properties - b e (cons 'article-type (cons type gnus-hidden-properties))) - (when (memq 'intangible gnus-hidden-properties) - (put-text-property (max (1- b) (point-min)) - b 'intangible nil))) - -(defun gnus-article-hide-text-of-type (type) - "Hide text of TYPE in the current buffer." - (save-excursion - (let ((b (point-min)) - (e (point-max))) - (while (setq b (text-property-any b e 'article-type type)) - (add-text-properties b (incf b) gnus-hidden-properties))))) - -(defun gnus-article-delete-text-of-type (type) - "Delete text of TYPE in the current buffer." - (save-excursion - (let ((b (point-min))) - (while (setq b (text-property-any b (point-max) 'article-type type)) - (delete-region - b (or (text-property-not-all b (point-max) 'article-type type) - (point-max))))))) - -(defun gnus-article-delete-invisible-text () - "Delete all invisible text in the current buffer." - (save-excursion - (let ((b (point-min))) - (while (setq b (text-property-any b (point-max) 'invisible t)) - (delete-region - b (or (text-property-not-all b (point-max) 'invisible t) - (point-max))))))) - -(defun gnus-article-text-type-exists-p (type) - "Say whether any text of type TYPE exists in the buffer." - (text-property-any (point-min) (point-max) 'article-type type)) - -(defsubst gnus-article-header-rank () - "Give the rank of the string HEADER as given by `gnus-sorted-header-list'." - (let ((list gnus-sorted-header-list) - (i 0)) - (while list - (when (looking-at (car list)) - (setq list nil)) - (setq list (cdr list)) - (incf i)) - i)) - -(defun article-hide-headers (&optional arg delete) - "Hide unwanted headers and possibly sort them as well." - (interactive (gnus-article-hidden-arg)) - ;; Lars said that this function might be inhibited. - (if (gnus-article-check-hidden-text 'headers arg) - (progn - ;; Show boring headers as well. - (gnus-article-show-hidden-text 'boring-headers) - (when (eq 1 (point-min)) - (set-window-start (get-buffer-window (current-buffer)) 1))) - (unless gnus-inhibit-hiding - (save-excursion - (save-restriction - (let ((inhibit-read-only t) - (case-fold-search t) - (max (1+ (length gnus-sorted-header-list))) - (ignored (when (not gnus-visible-headers) - (cond ((stringp gnus-ignored-headers) - gnus-ignored-headers) - ((listp gnus-ignored-headers) - (mapconcat 'identity gnus-ignored-headers - "\\|"))))) - (visible - (cond ((stringp gnus-visible-headers) - gnus-visible-headers) - ((and gnus-visible-headers - (listp gnus-visible-headers)) - (mapconcat 'identity gnus-visible-headers "\\|")))) - (inhibit-point-motion-hooks t) - beg) - ;; First we narrow to just the headers. - (article-narrow-to-head) - ;; Hide any "From " lines at the beginning of (mail) articles. - (while (looking-at "From ") - (forward-line 1)) - (unless (bobp) - (if delete - (delete-region (point-min) (point)) - (gnus-article-hide-text (point-min) (point) - (nconc (list 'article-type 'headers) - gnus-hidden-properties)))) - ;; Then treat the rest of the header lines. - ;; Then we use the two regular expressions - ;; `gnus-ignored-headers' and `gnus-visible-headers' to - ;; select which header lines is to remain visible in the - ;; article buffer. - (while (re-search-forward "^[^ \t:]*:" nil t) - (beginning-of-line) - ;; Mark the rank of the header. - (put-text-property - (point) (1+ (point)) 'message-rank - (if (or (and visible (looking-at visible)) - (and ignored - (not (looking-at ignored)))) - (gnus-article-header-rank) - (+ 2 max))) - (forward-line 1)) - (message-sort-headers-1) - (when (setq beg (text-property-any - (point-min) (point-max) 'message-rank (+ 2 max))) - ;; We delete or make invisible the unwanted headers. - (push 'headers gnus-article-wash-types) - (if delete - (progn - (add-text-properties - (point-min) (+ 5 (point-min)) - '(article-type headers dummy-invisible t)) - (delete-region beg (point-max))) - (gnus-article-hide-text-type beg (point-max) 'headers)))))))) - ) - -(defun article-hide-boring-headers (&optional arg) - "Toggle hiding of headers that aren't very interesting. -If given a negative prefix, always show; if given a positive prefix, -always hide." - (interactive (gnus-article-hidden-arg)) - (when (and (not (gnus-article-check-hidden-text 'boring-headers arg)) - (not gnus-show-all-headers)) - (save-excursion - (save-restriction - (let ((buffer-read-only nil) - (list gnus-boring-article-headers) - (inhibit-point-motion-hooks t) - elem) - (article-narrow-to-head) - (while list - (setq elem (pop list)) - (goto-char (point-min)) - (cond - ;; Hide empty headers. - ((eq elem 'empty) - (while (re-search-forward "^[^: \t]+:[ \t]*\n[^ \t]" nil t) - (forward-line -1) - (gnus-article-hide-text-type - (progn (beginning-of-line) (point)) - (progn - (end-of-line) - (if (re-search-forward "^[^ \t]" nil t) - (match-beginning 0) - (point-max))) - 'boring-headers))) - ;; Hide boring Newsgroups header. - ((eq elem 'newsgroups) - (when (gnus-string-equal - (gnus-fetch-field "newsgroups") - (gnus-group-real-name - (if (boundp 'gnus-newsgroup-name) - gnus-newsgroup-name - ""))) - (gnus-article-hide-header "newsgroups"))) - ((eq elem 'to-address) - (let ((to (message-fetch-field "to")) - (to-address - (gnus-parameter-to-address - (if (boundp 'gnus-newsgroup-name) - gnus-newsgroup-name "")))) - (when (and to to-address - (ignore-errors - (gnus-string-equal - ;; only one address in To - (nth 1 (mail-extract-address-components to)) - to-address))) - (gnus-article-hide-header "to")))) - ((eq elem 'followup-to) - (when (gnus-string-equal - (message-fetch-field "followup-to") - (message-fetch-field "newsgroups")) - (gnus-article-hide-header "followup-to"))) - ((eq elem 'reply-to) - (let ((from (message-fetch-field "from")) - (reply-to (message-fetch-field "reply-to"))) - (when (and - from reply-to - (ignore-errors - (gnus-string-equal - (nth 1 (mail-extract-address-components from)) - (nth 1 (mail-extract-address-components reply-to))))) - (gnus-article-hide-header "reply-to")))) - ((eq elem 'date) - (let ((date (message-fetch-field "date"))) - (when (and date - (< (days-between (current-time-string) date) - 4)) - (gnus-article-hide-header "date")))) - ((eq elem 'long-to) - (let ((to (message-fetch-field "to")) - (cc (message-fetch-field "cc"))) - (when (> (length to) 1024) - (gnus-article-hide-header "to")) - (when (> (length cc) 1024) - (gnus-article-hide-header "cc")))) - ((eq elem 'many-to) - (let ((to-count 0) - (cc-count 0)) - (goto-char (point-min)) - (while (re-search-forward "^to:" nil t) - (setq to-count (1+ to-count))) - (when (> to-count 1) - (while (> to-count 0) - (goto-char (point-min)) - (save-restriction - (re-search-forward "^to:" nil nil to-count) - (forward-line -1) - (narrow-to-region (point) (point-max)) - (gnus-article-hide-header "to")) - (setq to-count (1- to-count)))) - (goto-char (point-min)) - (while (re-search-forward "^cc:" nil t) - (setq cc-count (1+ cc-count))) - (when (> cc-count 1) - (while (> cc-count 0) - (goto-char (point-min)) - (save-restriction - (re-search-forward "^cc:" nil nil cc-count) - (forward-line -1) - (narrow-to-region (point) (point-max)) - (gnus-article-hide-header "cc")) - (setq cc-count (1- cc-count))))))))))))) - -(defun gnus-article-hide-header (header) - (save-excursion - (goto-char (point-min)) - (when (re-search-forward (concat "^" header ":") nil t) - (gnus-article-hide-text-type - (progn (beginning-of-line) (point)) - (progn - (end-of-line) - (if (re-search-forward "^[^ \t]" nil t) - (match-beginning 0) - (point-max))) - 'boring-headers)))) - -(defun article-toggle-headers (&optional arg) - "Toggle hiding of headers. If given a negative prefix, always show; -if given a positive prefix, always hide." - (interactive (gnus-article-hidden-arg)) - (let ((force (when (numberp arg) - (cond ((> arg 0) 'always-hide) - ((< arg 0) 'always-show)))) - (window (get-buffer-window gnus-article-buffer)) - (header-end (point-min)) - header-start field-end field-start - (inhibit-point-motion-hooks t) - (inhibit-read-only t)) - (save-restriction - (widen) - (while (and (setq header-start - (text-property-any header-end (point-max) - 'article-treated-header t)) - (setq header-end - (text-property-not-all header-start (point-max) - 'article-treated-header t))) - (setq field-end header-start) - (cond - (;; Hide exposed invisible fields. - (and (not (eq 'always-show force)) - (setq field-start - (text-property-any field-end header-end - 'exposed-invisible-field t))) - (while (and field-start - (setq field-end (text-property-not-all - field-start header-end - 'exposed-invisible-field t))) - (add-text-properties field-start field-end gnus-hidden-properties) - (setq field-start (text-property-any field-end header-end - 'exposed-invisible-field t))) - (put-text-property header-start header-end - 'exposed-invisible-field nil)) - (;; Expose invisible fields. - (and (not (eq 'always-hide force)) - (setq field-start - (text-property-any field-end header-end 'invisible t))) - (while (and field-start - (setq field-end (text-property-not-all - field-start header-end - 'invisible t))) - ;; If the invisible text is not terminated with newline, we - ;; won't expose it. Because it may be created by x-face-mule. - ;; BTW, XEmacs sometimes fail in putting a invisible text - ;; property with `gnus-article-hide-text' (really?). In that - ;; case, the invisible text might be started from the middle of - ;; a line so we will expose the sort of thing. - (when (or (not (or (eq header-start field-start) - (eq ?\n (char-before field-start)))) - (eq ?\n (char-before field-end))) - (remove-text-properties field-start field-end - gnus-hidden-properties) - (put-text-property field-start field-end - 'exposed-invisible-field t)) - (setq field-start (text-property-any field-end header-end - 'invisible t)))) - (;; Hide fields. - (not (eq 'always-show force)) - (narrow-to-region header-start header-end) - (article-hide-headers) - ;; Re-display X-Face image under XEmacs. - (when (and (featurep 'xemacs) - (gnus-functionp gnus-article-x-face-command)) - (let ((func (cadr (assq 'gnus-treat-display-xface - gnus-treatment-function-alist))) - (condition 'head)) - (when (and (not gnus-inhibit-treatment) - func - (gnus-treat-predicate gnus-treat-display-xface)) - (funcall func) - (put-text-property header-start header-end 'read-only nil)))) - (widen)) - )) - (goto-char (point-min)) - (when window - (set-window-start window (point-min)))))) - -(defvar gnus-article-normalized-header-length 40 - "Length of normalized headers.") - -(defun article-normalize-headers () - "Make all header lines 40 characters long." - (interactive) - (let ((buffer-read-only nil) - column) - (save-excursion - (save-restriction - (article-narrow-to-head) - (while (not (eobp)) - (cond - ((< (setq column (- (gnus-point-at-eol) (point))) - gnus-article-normalized-header-length) - (end-of-line) - (insert (make-string - (- gnus-article-normalized-header-length column) - ? ))) - ((> column gnus-article-normalized-header-length) - (gnus-put-text-property - (progn - (forward-char gnus-article-normalized-header-length) - (point)) - (gnus-point-at-eol) - 'invisible t)) - (t - ;; Do nothing. - )) - (forward-line 1)))))) - -(defun article-treat-dumbquotes () - "Translate M****s*** sm*rtq**t*s into proper text. -Note that this function guesses whether a character is a sm*rtq**t* or -not, so it should only be used interactively. - -Sm*rtq**t*s are M****s***'s unilateral extension to the character map -in an attempt to provide more quoting characters. If you see -something like \\222 or \\264 where you're expecting some kind of -apostrophe or quotation mark, then try this wash." - (interactive) - (article-translate-strings gnus-article-dumbquotes-map)) - -(defun article-translate-characters (from to) - "Translate all characters in the body of the article according to FROM and TO. -FROM is a string of characters to translate from; to is a string of -characters to translate to." - (save-excursion - (when (article-goto-body) - (let ((buffer-read-only nil) - (x (make-string 225 ?x)) - (i -1)) - (while (< (incf i) (length x)) - (aset x i i)) - (setq i 0) - (while (< i (length from)) - (aset x (aref from i) (aref to i)) - (incf i)) - (translate-region (point) (point-max) x))))) - -(defun article-translate-strings (map) - "Translate all string in the body of the article according to MAP. -MAP is an alist where the elements are on the form (\"from\" \"to\")." - (save-excursion - (when (article-goto-body) - (let ((buffer-read-only nil) - elem) - (while (setq elem (pop map)) - (save-excursion - (while (search-forward (car elem) nil t) - (replace-match (cadr elem))))))))) - -(defun article-treat-overstrike () - "Translate overstrikes into bold text." - (interactive) - (save-excursion - (when (article-goto-body) - (let ((buffer-read-only nil)) - (while (search-forward "\b" nil t) - (let ((next (char-after)) - start end previous) - (backward-char 2) - (setq start (point) - previous (char-after)) - (forward-char 3) - (setq end (point)) - (backward-char) - ;; We do the boldification/underlining by hiding the - ;; overstrikes and putting the proper text property - ;; on the letters. - (cond - ((eq next previous) - (gnus-article-hide-text-type start (point) 'overstrike) - (put-text-property (point) end 'face 'bold)) - ((eq next ?_) - (gnus-article-hide-text-type - (1- (point)) (1+ (point)) 'overstrike) - (put-text-property - start (1- (point)) 'face 'underline)) - ((eq previous ?_) - (gnus-article-hide-text-type start (point) 'overstrike) - (put-text-property - (point) end 'face 'underline))))))))) - -(defun article-fill-long-lines () - "Fill lines that are wider than the window width." - (interactive) - (save-excursion - (let ((buffer-read-only nil) - (width (window-width (get-buffer-window (current-buffer))))) - (save-restriction - (article-goto-body) - (let ((adaptive-fill-mode nil)) ;Why? -sm - (while (not (eobp)) - (end-of-line) - (when (>= (current-column) (min fill-column width)) - (narrow-to-region (point) (gnus-point-at-bol)) - (fill-paragraph nil) - (goto-char (point-max)) - (widen)) - (forward-line 1))))))) - -(defun article-capitalize-sentences () - "Capitalize the first word in each sentence." - (interactive) - (save-excursion - (let ((buffer-read-only nil) - (paragraph-start "^[\n\^L]")) - (article-goto-body) - (while (not (eobp)) - (capitalize-word 1) - (forward-sentence))))) - -(defun article-remove-cr () - "Remove trailing CRs and then translate remaining CRs into LFs." - (interactive) - (save-excursion - (let ((buffer-read-only nil)) - (goto-char (point-min)) - (while (re-search-forward "\r+$" nil t) - (replace-match "" t t)) - (goto-char (point-min)) - (while (search-forward "\r" nil t) - (replace-match "\n" t t))))) - -(defun article-remove-trailing-blank-lines () - "Remove all trailing blank lines from the article." - (interactive) - (save-excursion - (let ((buffer-read-only nil)) - (goto-char (point-max)) - (delete-region - (point) - (progn - (while (and (not (bobp)) - (looking-at "^[ \t]*$") - (not (gnus-annotation-in-region-p - (point) (gnus-point-at-eol)))) - (forward-line -1)) - (forward-line 1) - (point)))))) - -(defun article-display-x-face (&optional force) - "Look for an X-Face header and display it if present." - (interactive (list 'force)) - (save-excursion - ;; Delete the old process, if any. - (when (process-status "article-x-face") - (delete-process "article-x-face")) - (let ((inhibit-point-motion-hooks t) - x-faces - (case-fold-search t) - from last) - (save-restriction - (article-narrow-to-head) -;; (when (and buffer-read-only ;; When type `W f' -;; (progn -;; (goto-char (point-min)) -;; (not (re-search-forward "^X-Face:[\t ]*" nil t))) -;; (gnus-buffer-live-p gnus-original-article-buffer)) -;; (with-current-buffer gnus-original-article-buffer -;; (save-restriction -;; (article-narrow-to-head) -;; (while (re-search-forward "^X-Face:" nil t) -;; (setq x-faces -;; (concat -;; (or x-faces "") -;; (buffer-substring -;; (match-beginning 0) -;; (1- (re-search-forward -;; "^\\($\\|[^ \t]\\)" nil t)))))))) -;; (if x-faces -;; (let (point start bface eface buffer-read-only) -;; (goto-char (point-max)) -;; (forward-line -1) -;; (setq bface (get-text-property (gnus-point-at-bol) 'face) -;; eface (get-text-property (1- (gnus-point-at-eol)) 'face)) -;; (goto-char (point-max)) -;; (setq point (point)) -;; (insert x-faces) -;; (goto-char point) -;; (while (looking-at "\\([^:]+\\): *") -;; (put-text-property (match-beginning 1) (1+ (match-end 1)) -;; 'face bface) -;; (setq start (match-end 0)) -;; (forward-line 1) -;; (while (looking-at "[\t ]") -;; (forward-line 1)) -;; (put-text-property start (point) -;; 'face eface))))) - (goto-char (point-min)) - (setq from (message-fetch-field "from")) - (goto-char (point-min)) - (while (and gnus-article-x-face-command - (not last) - (or force - ;; Check whether this face is censored. - (not gnus-article-x-face-too-ugly) - (and gnus-article-x-face-too-ugly from - (not (string-match gnus-article-x-face-too-ugly - from)))) - ;; Has to be present. - (re-search-forward "^X-Face:[\t ]*" nil t)) - ;; This used to try to do multiple faces (`while' instead of - ;; `when' above), but (a) sending multiple EOFs to xv doesn't - ;; work (b) it can crash some versions of Emacs (c) are - ;; multiple faces really something to encourage? - (when (stringp gnus-article-x-face-command) - (setq last t)) - ;; We now have the area of the buffer where the X-Face is stored. - (save-excursion - (let ((beg (point)) - (end (1- (re-search-forward "^\\($\\|[^ \t]\\)" nil t)))) - ;; We display the face. - (if (symbolp gnus-article-x-face-command) - ;; The command is a lisp function, so we call it. - (if (gnus-functionp gnus-article-x-face-command) - (funcall gnus-article-x-face-command beg end) - (error "%s is not a function" gnus-article-x-face-command)) - ;; The command is a string, so we interpret the command - ;; as a, well, command, and fork it off. - (let ((process-connection-type nil)) - (process-kill-without-query - (start-process - "article-x-face" nil shell-file-name shell-command-switch - gnus-article-x-face-command)) - (process-send-region "article-x-face" beg end) - (process-send-eof "article-x-face")))))))))) - -(defun article-decode-mime-words () - "Decode all MIME-encoded words in the article." - (interactive) - (save-excursion - (set-buffer gnus-article-buffer) - (let ((inhibit-point-motion-hooks t) - buffer-read-only - (mail-parse-charset gnus-newsgroup-charset) - (mail-parse-ignored-charsets - (save-excursion (set-buffer gnus-summary-buffer) - gnus-newsgroup-ignored-charsets))) - (mail-decode-encoded-word-region (point-min) (point-max))))) - -(defun article-decode-charset (&optional prompt) - "Decode charset-encoded text in the article. -If PROMPT (the prefix), prompt for a coding system to use." - (interactive "P") - (let ((inhibit-point-motion-hooks t) (case-fold-search t) - buffer-read-only - (mail-parse-charset gnus-newsgroup-charset) - (mail-parse-ignored-charsets - (save-excursion (condition-case nil - (set-buffer gnus-summary-buffer) - (error)) - gnus-newsgroup-ignored-charsets)) - ct cte ctl charset format) - (save-excursion - (save-restriction - (article-narrow-to-head) - (setq ct (message-fetch-field "Content-Type" t) - cte (message-fetch-field "Content-Transfer-Encoding" t) - ctl (and ct (ignore-errors - (mail-header-parse-content-type ct))) - charset (cond - (prompt - (mm-read-coding-system "Charset to decode: ")) - (ctl - (mail-content-type-get ctl 'charset))) - format (and ctl (mail-content-type-get ctl 'format))) - (when cte - (setq cte (mail-header-strip cte))) - (if (and ctl (not (string-match "/" (car ctl)))) - (setq ctl nil)) - (goto-char (point-max))) - (forward-line 1) - (save-restriction - (narrow-to-region (point) (point-max)) - (when (and (eq mail-parse-charset 'gnus-decoded) - (eq (mm-body-7-or-8) '8bit)) - ;; The text code could have been decoded. - (setq charset mail-parse-charset)) - (when (and (or (not ctl) - (equal (car ctl) "text/plain")) - (not format)) ;; article with format will decode later. - (mm-decode-body - charset (and cte (intern (downcase - (gnus-strip-whitespace cte)))) - (car ctl))))))) - -(defun article-decode-encoded-words () - "Remove encoded-word encoding from headers." - (let (buffer-read-only) - (let ((charset (save-excursion - (set-buffer gnus-summary-buffer) - default-mime-charset))) - (mime-decode-header-in-buffer charset) - ))) - -(defun article-de-quoted-unreadable (&optional force read-charset) - "Translate a quoted-printable-encoded article. -If FORCE, decode the article whether it is marked as quoted-printable -or not. -If READ-CHARSET, ask for a coding system." - (interactive (list 'force current-prefix-arg)) - (save-excursion - (let ((buffer-read-only nil) type charset) - (if (gnus-buffer-live-p gnus-original-article-buffer) - (with-current-buffer gnus-original-article-buffer - (setq type - (gnus-fetch-field "content-transfer-encoding")) - (let* ((ct (gnus-fetch-field "content-type")) - (ctl (and ct - (ignore-errors - (mail-header-parse-content-type ct))))) - (setq charset (and ctl - (mail-content-type-get ctl 'charset))) - (if (stringp charset) - (setq charset (intern (downcase charset))))))) - (if read-charset - (setq charset (mm-read-coding-system "Charset: " charset))) - (unless charset - (setq charset gnus-newsgroup-charset)) - (when (or force - (and type (let ((case-fold-search t)) - (string-match "quoted-printable" type)))) - (article-goto-body) - (quoted-printable-decode-region - (point) (point-max) (mm-charset-to-coding-system charset)))))) - -(defun article-de-base64-unreadable (&optional force read-charset) - "Translate a base64 article. -If FORCE, decode the article whether it is marked as base64 not. -If READ-CHARSET, ask for a coding system." - (interactive (list 'force current-prefix-arg)) - (save-excursion - (let ((buffer-read-only nil) type charset) - (if (gnus-buffer-live-p gnus-original-article-buffer) - (with-current-buffer gnus-original-article-buffer - (setq type - (gnus-fetch-field "content-transfer-encoding")) - (let* ((ct (gnus-fetch-field "content-type")) - (ctl (and ct - (ignore-errors - (mail-header-parse-content-type ct))))) - (setq charset (and ctl - (mail-content-type-get ctl 'charset))) - (if (stringp charset) - (setq charset (intern (downcase charset))))))) - (if read-charset - (setq charset (mm-read-coding-system "Charset: " charset))) - (unless charset - (setq charset gnus-newsgroup-charset)) - (when (or force - (and type (let ((case-fold-search t)) - (string-match "base64" type)))) - (article-goto-body) - (save-restriction - (narrow-to-region (point) (point-max)) - (base64-decode-region (point-min) (point-max)) - (mm-decode-coding-region - (point-min) (point-max) (mm-charset-to-coding-system charset))))))) - -(eval-when-compile - (require 'rfc1843)) - -(defun article-decode-HZ () - "Translate a HZ-encoded article." - (interactive) - (require 'rfc1843) - (save-excursion - (let ((buffer-read-only nil)) - (rfc1843-decode-region (point-min) (point-max))))) - -(defun article-wash-html (&optional read-charset) - "Format an html article. -If READ-CHARSET, ask for a coding system." - (interactive "P") - (save-excursion - (let ((buffer-read-only nil) - charset) - (if (gnus-buffer-live-p gnus-original-article-buffer) - (with-current-buffer gnus-original-article-buffer - (let* ((ct (gnus-fetch-field "content-type")) - (ctl (and ct - (ignore-errors - (mail-header-parse-content-type ct))))) - (setq charset (and ctl - (mail-content-type-get ctl 'charset))) - (if (stringp charset) - (setq charset (intern (downcase charset))))))) - (if read-charset - (setq charset (mm-read-coding-system "Charset: " charset))) - (unless charset - (setq charset gnus-newsgroup-charset)) - (article-goto-body) - (save-window-excursion - (save-restriction - (narrow-to-region (point) (point-max)) - (mm-setup-w3) - (let ((w3-strict-width (window-width)) - (url-standalone-mode t)) - (condition-case var - (w3-region (point-min) (point-max)) - (error)))))))) - -(defun article-hide-list-identifiers () - "Remove list identifies from the Subject header. -The `gnus-list-identifiers' variable specifies what to do." - (interactive) - (let ((inhibit-point-motion-hooks t) - (regexp (if (consp gnus-list-identifiers) - (mapconcat 'identity gnus-list-identifiers " *\\|") - gnus-list-identifiers)) - buffer-read-only) - (when regexp - (save-excursion - (save-restriction - (article-narrow-to-head) - (goto-char (point-min)) - (while (re-search-forward - (concat "^Subject: +\\(R[Ee]: +\\)*\\(" regexp " *\\)") - nil t) - (delete-region (match-beginning 2) (match-end 0)) - (beginning-of-line)) - (when (re-search-forward - "^Subject: +\\(\\(R[Ee]: +\\)+\\)R[Ee]: +" nil t) - (delete-region (match-beginning 1) (match-end 1)))))))) - -(defun article-hide-pgp () - "Remove any PGP headers and signatures in the current article." - (interactive) - (save-excursion - (save-restriction - (let ((inhibit-point-motion-hooks t) - buffer-read-only beg end) - (article-goto-body) - ;; Hide the "header". - (when (re-search-forward "^-----BEGIN PGP SIGNED MESSAGE-----\n" nil t) - (push 'pgp gnus-article-wash-types) - (delete-region (match-beginning 0) (match-end 0)) - ;; Remove armor headers (rfc2440 6.2) - (delete-region (point) (or (re-search-forward "^[ \t]*\n" nil t) - (point))) - (setq beg (point)) - ;; Hide the actual signature. - (and (search-forward "\n-----BEGIN PGP SIGNATURE-----\n" nil t) - (setq end (1+ (match-beginning 0))) - (delete-region - end - (if (search-forward "\n-----END PGP SIGNATURE-----\n" nil t) - (match-end 0) - ;; Perhaps we shouldn't hide to the end of the buffer - ;; if there is no end to the signature? - (point-max)))) - ;; Hide "- " PGP quotation markers. - (when (and beg end) - (narrow-to-region beg end) - (goto-char (point-min)) - (while (re-search-forward "^- " nil t) - (delete-region - (match-beginning 0) (match-end 0))) - (widen)) - (gnus-run-hooks 'gnus-article-hide-pgp-hook)))))) - -(defun article-hide-pem (&optional arg) - "Toggle hiding of any PEM headers and signatures in the current article. -If given a negative prefix, always show; if given a positive prefix, -always hide." - (interactive (gnus-article-hidden-arg)) - (unless (gnus-article-check-hidden-text 'pem arg) - (save-excursion - (let (buffer-read-only end) - (goto-char (point-min)) - ;; Hide the horrendously ugly "header". - (when (and (search-forward - "\n-----BEGIN PRIVACY-ENHANCED MESSAGE-----\n" - nil t) - (setq end (1+ (match-beginning 0)))) - (push 'pem gnus-article-wash-types) - (gnus-article-hide-text-type - end - (if (search-forward "\n\n" nil t) - (match-end 0) - (point-max)) - 'pem) - ;; Hide the trailer as well - (when (search-forward "\n-----END PRIVACY-ENHANCED MESSAGE-----\n" - nil t) - (gnus-article-hide-text-type - (match-beginning 0) (match-end 0) 'pem))))))) - -(defun article-strip-banner () - "Strip the banner specified by the `banner' group parameter." - (interactive) - (save-excursion - (save-restriction - (let ((inhibit-point-motion-hooks t) - (banner (gnus-parameter-banner gnus-newsgroup-name)) - (gnus-signature-limit nil) - buffer-read-only beg end) - (when banner - (article-goto-body) - (cond - ((eq banner 'signature) - (when (gnus-article-narrow-to-signature) - (widen) - (forward-line -1) - (delete-region (point) (point-max)))) - ((symbolp banner) - (if (setq banner (cdr (assq banner gnus-article-banner-alist))) - (while (re-search-forward banner nil t) - (delete-region (match-beginning 0) (match-end 0))))) - ((stringp banner) - (while (re-search-forward banner nil t) - (delete-region (match-beginning 0) (match-end 0)))))))))) - -(defun article-babel () - "Translate article using an online translation service." - (interactive) - (require 'babel) - (save-excursion - (set-buffer gnus-article-buffer) - (when (article-goto-body) - (let* ((buffer-read-only nil) - (start (point)) - (end (point-max)) - (orig (buffer-substring start end)) - (trans (babel-as-string orig))) - (save-restriction - (narrow-to-region start end) - (delete-region start end) - (insert trans)))))) - -(defun article-hide-signature (&optional arg) - "Hide the signature in the current article. -If given a negative prefix, always show; if given a positive prefix, -always hide." - (interactive (gnus-article-hidden-arg)) - (save-excursion - (save-restriction - (if (interactive-p) - (progn - (widen) - (article-goto-body)) - (goto-char (point-min))) - (unless (gnus-article-check-hidden-text 'signature arg) - (let ((buffer-read-only nil) - (button (point))) - (while (setq button (text-property-any button (point-max) - 'gnus-callback - 'gnus-signature-toggle)) - (setq button (text-property-not-all button (point-max) - 'gnus-callback - 'gnus-signature-toggle)) - (when (and button (not (eobp))) - (gnus-article-hide-text-type - (1+ button) - (next-single-property-change (1+ button) 'mime-view-entity - nil (point-max)) - 'signature)))))))) - -(defun article-strip-headers-in-body () - "Strip offensive headers from bodies." - (interactive) - (save-excursion - (article-goto-body) - (let ((case-fold-search t)) - (when (looking-at "x-no-archive:") - (gnus-delete-line))))) - -(defun article-strip-leading-blank-lines () - "Remove all blank lines from the beginning of the article." - (interactive) - (save-excursion - (let ((inhibit-point-motion-hooks t) - buffer-read-only) - (when (article-goto-body) - (while (and (not (eobp)) - (looking-at "[ \t]*$")) - (gnus-delete-line)))))) - -(defun article-narrow-to-head () - "Narrow the buffer to the head of the message. -Point is left at the beginning of the narrowed-to region." - (narrow-to-region - (goto-char (point-min)) - (if (search-forward "\n\n" nil 1) - (1- (point)) - (point-max))) - (goto-char (point-min))) - -(defun article-goto-body () - "Place point at the start of the body." - (goto-char (point-min)) - (cond - ;; This variable is only bound when dealing with separate - ;; MIME body parts. - (article-goto-body-goes-to-point-min-p - t) - ((search-forward "\n\n" nil t) - t) - (t - (goto-char (point-max)) - nil))) - -(defun article-strip-multiple-blank-lines () - "Replace consecutive blank lines with one empty line." - (interactive) - (save-excursion - (let ((inhibit-point-motion-hooks t) - buffer-read-only) - ;; First make all blank lines empty. - (article-goto-body) - (while (re-search-forward "^[ \t]+$" nil t) - (unless (gnus-annotation-in-region-p - (match-beginning 0) (match-end 0)) - (replace-match "" nil t))) - ;; Then replace multiple empty lines with a single empty line. - (article-goto-body) - (while (re-search-forward "\n\n\\(\n+\\)" nil t) - (unless (gnus-annotation-in-region-p - (match-beginning 0) (match-end 0)) - (delete-region (match-beginning 1) (match-end 1))))))) - -(defun article-strip-leading-space () - "Remove all white space from the beginning of the lines in the article." - (interactive) - (save-excursion - (let ((inhibit-point-motion-hooks t) - buffer-read-only) - (article-goto-body) - (while (re-search-forward "^[ \t]+" nil t) - (replace-match "" t t))))) - -(defun article-strip-trailing-space () - "Remove all white space from the end of the lines in the article." - (interactive) - (save-excursion - (let ((inhibit-point-motion-hooks t) - buffer-read-only) - (article-goto-body) - (while (re-search-forward "[ \t]+$" nil t) - (replace-match "" t t))))) - -(defun article-strip-blank-lines () - "Strip leading, trailing and multiple blank lines." - (interactive) - (article-strip-leading-blank-lines) - (article-remove-trailing-blank-lines) - (article-strip-multiple-blank-lines)) - -(defun article-strip-all-blank-lines () - "Strip all blank lines." - (interactive) - (save-excursion - (let ((inhibit-point-motion-hooks t) - buffer-read-only) - (article-goto-body) - (while (re-search-forward "^[ \t]*\n" nil t) - (replace-match "" t t))))) - -(defun gnus-article-narrow-to-signature () - "Narrow to the signature; return t if a signature is found, else nil." - (let ((inhibit-point-motion-hooks t)) - (when (gnus-article-search-signature) - (forward-line 1) - ;; Check whether we have some limits to what we consider - ;; to be a signature. - (let ((limits (if (listp gnus-signature-limit) gnus-signature-limit - (list gnus-signature-limit))) - limit limited) - (while (setq limit (pop limits)) - (if (or (and (integerp limit) - (< (- (point-max) (point)) limit)) - (and (floatp limit) - (< (count-lines (point) (point-max)) limit)) - (and (gnus-functionp limit) - (funcall limit)) - (and (stringp limit) - (not (re-search-forward limit nil t)))) - () ; This limit did not succeed. - (setq limited t - limits nil))) - (unless limited - (narrow-to-region (point) (point-max)) - t))))) - -(defun gnus-article-search-signature () - "Search the current buffer for the signature separator. -Put point at the beginning of the signature separator." - (let ((cur (point))) - (goto-char (point-max)) - (if (if (stringp gnus-signature-separator) - (re-search-backward gnus-signature-separator nil t) - (let ((seps gnus-signature-separator)) - (while (and seps - (not (re-search-backward (car seps) nil t))) - (pop seps)) - seps)) - t - (goto-char cur) - nil))) - -(defun gnus-article-hidden-arg () - "Return the current prefix arg as a number, or 0 if no prefix." - (list (if current-prefix-arg - (prefix-numeric-value current-prefix-arg) - 0))) - -(defun gnus-article-check-hidden-text (type arg) - "Return nil if hiding is necessary. -Arg can be nil or a number. Nil and positive means hide, negative -means show, 0 means toggle." - (save-excursion - (save-restriction - (let ((hide (gnus-article-hidden-text-p type))) - (cond - ((or (null arg) - (> arg 0)) - nil) - ((< arg 0) - (gnus-article-show-hidden-text type) - t) - (t - (if (eq hide 'hidden) - (progn - (gnus-article-show-hidden-text type) - t) - nil))))))) - -(defun gnus-article-hidden-text-p (type) - "Say whether the current buffer contains hidden text of type TYPE." - (let ((pos (text-property-any (point-min) (point-max) 'article-type type))) - (while (and pos - (not (get-text-property pos 'invisible)) - (not (get-text-property pos 'dummy-invisible))) - (setq pos - (text-property-any (1+ pos) (point-max) 'article-type type))) - (if pos - 'hidden - nil))) - -(defun gnus-article-show-hidden-text (type &optional dummy) - "Show all hidden text of type TYPE. -Originally it is hide instead of DUMMY." - (let ((buffer-read-only nil) - (inhibit-point-motion-hooks t)) - (gnus-remove-text-properties-when - 'article-type type - (point-min) (point-max) - (cons 'article-type (cons type - gnus-hidden-properties))))) - -(defconst article-time-units - `((year . ,(* 365.25 24 60 60)) - (week . ,(* 7 24 60 60)) - (day . ,(* 24 60 60)) - (hour . ,(* 60 60)) - (minute . 60) - (second . 1)) - "Mapping from time units to seconds.") - -(defun article-date-ut (&optional type highlight header) - "Convert DATE date to universal time in the current article. -If TYPE is `local', convert to local time; if it is `lapsed', output -how much time has lapsed since DATE. For `lapsed', the value of -`gnus-article-date-lapsed-new-header' says whether the \"X-Sent:\" header -should replace the \"Date:\" one, or should be added below it." - (interactive (list 'ut t)) - (let* ((header (or header - (and (eq 1 (point-min)) - (mail-header-date (save-excursion - (set-buffer gnus-summary-buffer) - gnus-current-headers))) - (message-fetch-field "date") - "")) - (date (if (vectorp header) (mail-header-date header) - header)) - (inhibit-point-motion-hooks t) - bface eface date-pos) - (when (and date (not (string= date ""))) - (save-excursion - (save-restriction - (article-narrow-to-head) - (when (or (and (eq type 'lapsed) - gnus-article-date-lapsed-new-header - ;; Attempt to get the face of X-Sent first. - (re-search-forward "^X-Sent:[ \t]" nil t)) - (re-search-forward "^Date:[ \t]" nil t) - ;; If Date is missing, try again for X-Sent. - (re-search-forward "^X-Sent:[ \t]" nil t)) - (setq bface (get-text-property (gnus-point-at-bol) 'face) - date (or (get-text-property (gnus-point-at-bol) - 'original-date) - date) - eface (get-text-property (1- (gnus-point-at-eol)) - 'face))) - (let ((buffer-read-only nil)) - ;; Delete any old X-Sent headers. - (when (setq date-pos - (text-property-any (point-min) (point-max) - 'article-date-lapsed t)) - (goto-char (setq date-pos (set-marker (make-marker) date-pos))) - (delete-region (match-beginning 0) - (progn (forward-line 1) (point)))) - (goto-char (point-min)) - ;; Delete any old Date headers. - (while (re-search-forward "^Date:[ \t]" nil t) - (unless date-pos - (setq date-pos (match-beginning 0))) - (unless (and (eq type 'lapsed) - gnus-article-date-lapsed-new-header) - (delete-region (match-beginning 0) - (progn (message-next-header) (point))))) - (if date-pos - (progn - (goto-char date-pos) - (unless (bolp) - ;; Possibly, Date has been deleted. - (insert "\n")) - (when (and (eq type 'lapsed) - gnus-article-date-lapsed-new-header - (looking-at "Date:")) - (forward-line 1))) - (goto-char (point-min))) - (insert (article-make-date-line date type)) - (when (eq type 'lapsed) - (put-text-property (gnus-point-at-bol) (point) - 'article-date-lapsed t)) - (insert "\n") - (forward-line -1) - ;; Do highlighting. - (when (looking-at "\\([^:]+\\): *\\(.*\\)$") - (put-text-property (match-beginning 1) (1+ (match-end 1)) - 'original-date date) - (put-text-property (match-beginning 1) (1+ (match-end 1)) - 'face bface) - (put-text-property (match-beginning 2) (match-end 2) - 'face eface)))))))) - -(defun article-make-date-line (date type) - "Return a DATE line of TYPE." - (unless (memq type '(local ut original user iso8601 lapsed english)) - (error "Unknown conversion type: %s" type)) - (condition-case () - (let ((time (date-to-time date))) - (cond - ;; Convert to the local timezone. - ((eq type 'local) - (let ((tz (car (current-time-zone time)))) - (format "Date: %s %s%02d%02d" (current-time-string time) - (if (> tz 0) "+" "-") (/ (abs tz) 3600) - (/ (% (abs tz) 3600) 60)))) - ;; Convert to Universal Time. - ((eq type 'ut) - (concat "Date: " - (current-time-string - (let* ((e (parse-time-string date)) - (tm (apply 'encode-time e)) - (ms (car tm)) - (ls (- (cadr tm) (car (current-time-zone time))))) - (cond ((< ls 0) (list (1- ms) (+ ls 65536))) - ((> ls 65535) (list (1+ ms) (- ls 65536))) - (t (list ms ls))))) - " UT")) - ;; Get the original date from the article. - ((eq type 'original) - (concat "Date: " (if (string-match "\n+$" date) - (substring date 0 (match-beginning 0)) - date))) - ;; Let the user define the format. - ((eq type 'user) - (if (gnus-functionp gnus-article-time-format) - (funcall gnus-article-time-format time) - (concat - "Date: " - (format-time-string gnus-article-time-format time)))) - ;; ISO 8601. - ((eq type 'iso8601) - (let ((tz (car (current-time-zone time)))) - (concat - "Date: " - (format-time-string "%Y%m%dT%H%M%S" time) - (format "%s%02d%02d" - (if (> tz 0) "+" "-") (/ (abs tz) 3600) - (/ (% (abs tz) 3600) 60))))) - ;; Do an X-Sent lapsed format. - ((eq type 'lapsed) - ;; If the date is seriously mangled, the timezone functions are - ;; liable to bug out, so we ignore all errors. - (let* ((now (current-time)) - (real-time (subtract-time now time)) - (real-sec (and real-time - (+ (* (float (car real-time)) 65536) - (cadr real-time)))) - (sec (and real-time (abs real-sec))) - num prev) - (cond - ((null real-time) - "X-Sent: Unknown") - ((zerop sec) - "X-Sent: Now") - (t - (concat - "X-Sent: " - ;; This is a bit convoluted, but basically we go - ;; through the time units for years, weeks, etc, - ;; and divide things to see whether that results - ;; in positive answers. - (mapconcat - (lambda (unit) - (if (zerop (setq num (ffloor (/ sec (cdr unit))))) - ;; The (remaining) seconds are too few to - ;; be divided into this time unit. - "" - ;; It's big enough, so we output it. - (setq sec (- sec (* num (cdr unit)))) - (prog1 - (concat (if prev ", " "") (int-to-string - (floor num)) - " " (symbol-name (car unit)) - (if (> num 1) "s" "")) - (setq prev t)))) - article-time-units "") - ;; If dates are odd, then it might appear like the - ;; article was sent in the future. - (if (> real-sec 0) - " ago" - " in the future")))))) - ;; Display the date in proper English - ((eq type 'english) - (let ((dtime (decode-time time))) - (concat - "Date: the " - (number-to-string (nth 3 dtime)) - (let ((digit (% (nth 3 dtime) 10))) - (cond - ((memq (nth 3 dtime) '(11 12 13)) "th") - ((= digit 1) "st") - ((= digit 2) "nd") - ((= digit 3) "rd") - (t "th"))) - " of " - (nth (1- (nth 4 dtime)) gnus-english-month-names) - " " - (number-to-string (nth 5 dtime)) - " at " - (format "%02d" (nth 2 dtime)) - ":" - (format "%02d" (nth 1 dtime))))))) - (error - (format "Date: %s (from Oort)" date)))) - -(defun article-date-local (&optional highlight) - "Convert the current article date to the local timezone." - (interactive (list t)) - (article-date-ut 'local highlight)) - -(defun article-date-english (&optional highlight) - "Convert the current article date to something that is proper English." - (interactive (list t)) - (article-date-ut 'english highlight)) - -(defun article-date-original (&optional highlight) - "Convert the current article date to what it was originally. -This is only useful if you have used some other date conversion -function and want to see what the date was before converting." - (interactive (list t)) - (article-date-ut 'original highlight)) - -(defun article-date-lapsed (&optional highlight) - "Convert the current article date to time lapsed since it was sent." - (interactive (list t)) - (article-date-ut 'lapsed highlight)) - -(defun article-update-date-lapsed () - "Function to be run from a timer to update the lapsed time line." - (let (deactivate-mark) - (save-excursion - (ignore-errors - (walk-windows - (lambda (w) - (set-buffer (window-buffer w)) - (when (eq major-mode 'gnus-article-mode) - (goto-char (point-min)) - (when (re-search-forward "^X-Sent:" nil t) - (article-date-lapsed t)))) - nil 'visible))))) - -(defun gnus-start-date-timer (&optional n) - "Start a timer to update the X-Sent header in the article buffers. -The numerical prefix says how frequently (in seconds) the function -is to run." - (interactive "p") - (unless n - (setq n 1)) - (gnus-stop-date-timer) - (setq article-lapsed-timer - (nnheader-run-at-time 1 n 'article-update-date-lapsed))) - -(defun gnus-stop-date-timer () - "Stop the X-Sent timer." - (interactive) - (when article-lapsed-timer - (nnheader-cancel-timer article-lapsed-timer) - (setq article-lapsed-timer nil))) - -(defun article-date-user (&optional highlight) - "Convert the current article date to the user-defined format. -This format is defined by the `gnus-article-time-format' variable." - (interactive (list t)) - (article-date-ut 'user highlight)) - -(defun article-date-iso8601 (&optional highlight) - "Convert the current article date to ISO8601." - (interactive (list t)) - (article-date-ut 'iso8601 highlight)) - -(defun article-show-all () - "Show all hidden text in the article buffer." - (interactive) - (save-excursion - (widen) - (let ((buffer-read-only nil)) - (gnus-article-unhide-text (point-min) (point-max)) - (gnus-remove-text-with-property 'gnus-prev) - (gnus-remove-text-with-property 'gnus-next)))) - -(defun article-show-all-headers () - "Show all hidden headers in the article buffer." - (interactive) - (save-excursion - (save-restriction - (widen) - (article-narrow-to-head) - (let ((buffer-read-only nil)) - (gnus-article-unhide-text (point-min) (point-max)))))) - -(defun article-remove-leading-whitespace () - "Remove excessive whitespace from all headers." - (interactive) - (save-excursion - (save-restriction - (let ((buffer-read-only nil)) - (article-narrow-to-head) - (goto-char (point-min)) - (while (re-search-forward "^[^ :]+: \\([ \t]+\\)" nil t) - (delete-region (match-beginning 1) (match-end 1))))))) - -(defun article-emphasize (&optional arg) - "Emphasize text according to `gnus-emphasis-alist'." - (interactive (gnus-article-hidden-arg)) - (unless (gnus-article-check-hidden-text 'emphasis arg) - (save-excursion - (let ((alist (or - (condition-case nil - (with-current-buffer gnus-summary-buffer - gnus-article-emphasis-alist) - (error)) - gnus-emphasis-alist)) - (buffer-read-only nil) - (props (append '(article-type emphasis) - gnus-hidden-properties)) - regexp elem beg invisible visible face) - (article-goto-body) - (setq beg (point)) - (while (setq elem (pop alist)) - (goto-char beg) - (setq regexp (car elem) - invisible (nth 1 elem) - visible (nth 2 elem) - face (nth 3 elem)) - (while (re-search-forward regexp nil t) - (when (and (match-beginning visible) (match-beginning invisible)) - (push 'emphasis gnus-article-wash-types) - (gnus-article-hide-text - (match-beginning invisible) (match-end invisible) props) - (gnus-article-unhide-text-type - (match-beginning visible) (match-end visible) 'emphasis) - (gnus-put-text-property-excluding-newlines - (match-beginning visible) (match-end visible) 'face face) - (goto-char (match-end invisible))))))))) - -(defun gnus-article-setup-highlight-words (&optional highlight-words) - "Setup newsgroup emphasis alist." - (unless gnus-article-emphasis-alist - (let ((name (and gnus-newsgroup-name - (gnus-group-real-name gnus-newsgroup-name)))) - (make-local-variable 'gnus-article-emphasis-alist) - (setq gnus-article-emphasis-alist - (nconc - (let ((alist gnus-group-highlight-words-alist) elem highlight) - (while (setq elem (pop alist)) - (when (and name (string-match (car elem) name)) - (setq alist nil - highlight (copy-sequence (cdr elem))))) - highlight) - (copy-sequence highlight-words) - (if gnus-newsgroup-name - (copy-sequence (gnus-group-find-parameter - gnus-newsgroup-name 'highlight-words t))) - gnus-emphasis-alist))))) - -(eval-when-compile - (defvar gnus-summary-article-menu) - (defvar gnus-summary-post-menu)) - -;;; Saving functions. - -(defun gnus-article-save (save-buffer file &optional num) - "Save the currently selected article." - (unless gnus-save-all-headers - ;; Remove headers according to `gnus-saved-headers'. - (let ((gnus-visible-headers - (or gnus-saved-headers gnus-visible-headers)) - (gnus-article-buffer save-buffer)) - (save-excursion - (set-buffer save-buffer) - (article-hide-headers 1 t)))) - (save-window-excursion - (if (not gnus-default-article-saver) - (error "No default saver is defined") - ;; !!! Magic! The saving functions all save - ;; `gnus-save-article-buffer' (or so they think), but we - ;; bind that variable to our save-buffer. - (set-buffer gnus-article-buffer) - (let* ((gnus-save-article-buffer save-buffer) - (filename - (cond - ((not gnus-prompt-before-saving) 'default) - ((eq gnus-prompt-before-saving 'always) nil) - (t file))) - (gnus-number-of-articles-to-be-saved - (when (eq gnus-prompt-before-saving t) - num))) ; Magic - (set-buffer gnus-article-current-summary) - (funcall gnus-default-article-saver filename))))) - -(defun gnus-read-save-file-name (prompt &optional filename - function group headers variable) - (let ((default-name - (funcall function group headers (symbol-value variable))) - result) - (setq result - (expand-file-name - (cond - ((eq filename 'default) - default-name) - ((eq filename t) - default-name) - (filename filename) - (t - (let* ((split-name (gnus-get-split-value gnus-split-methods)) - (prompt - (format prompt - (if (and gnus-number-of-articles-to-be-saved - (> gnus-number-of-articles-to-be-saved 1)) - (format "these %d articles" - gnus-number-of-articles-to-be-saved) - "this article"))) - (file - ;; Let the split methods have their say. - (cond - ;; No split name was found. - ((null split-name) - (read-file-name - (concat prompt " (default " - (file-name-nondirectory default-name) ") ") - (file-name-directory default-name) - default-name)) - ;; A single group name is returned. - ((stringp split-name) - (setq default-name - (funcall function split-name headers - (symbol-value variable))) - (read-file-name - (concat prompt " (default " - (file-name-nondirectory default-name) ") ") - (file-name-directory default-name) - default-name)) - ;; A single split name was found - ((= 1 (length split-name)) - (let* ((name (expand-file-name - (car split-name) - gnus-article-save-directory)) - (dir (cond ((file-directory-p name) - (file-name-as-directory name)) - ((file-exists-p name) name) - (t gnus-article-save-directory)))) - (read-file-name - (concat prompt " (default " name ") ") - dir name))) - ;; A list of splits was found. - (t - (setq split-name (nreverse split-name)) - (let (result) - (let ((file-name-history - (nconc split-name file-name-history))) - (setq result - (expand-file-name - (read-file-name - (concat prompt " (`M-p' for defaults) ") - gnus-article-save-directory - (car split-name)) - gnus-article-save-directory))) - (car (push result file-name-history))))))) - ;; Create the directory. - (gnus-make-directory (file-name-directory file)) - ;; If we have read a directory, we append the default file name. - (when (file-directory-p file) - (setq file (expand-file-name (file-name-nondirectory - default-name) - (file-name-as-directory file)))) - ;; Possibly translate some characters. - (nnheader-translate-file-chars file)))))) - (gnus-make-directory (file-name-directory result)) - (set variable result))) - -(defun gnus-article-archive-name (group) - "Return the first instance of an \"Archive-name\" in the current buffer." - (let ((case-fold-search t)) - (when (re-search-forward "archive-name: *\\([^ \n\t]+\\)[ \t]*$" nil t) - (nnheader-concat gnus-article-save-directory - (match-string 1))))) - -(defun gnus-article-nndoc-name (group) - "If GROUP is an nndoc group, return the name of the parent group." - (when (eq (car (gnus-find-method-for-group group)) 'nndoc) - (gnus-group-get-parameter group 'save-article-group))) - -(defun gnus-summary-save-in-rmail (&optional filename) - "Append this article to Rmail file. -Optional argument FILENAME specifies file name. -Directory to save to is default to `gnus-article-save-directory'." - (setq filename (gnus-read-save-file-name - "Save %s in rmail file:" filename - gnus-rmail-save-name gnus-newsgroup-name - gnus-current-headers 'gnus-newsgroup-last-rmail)) - (gnus-eval-in-buffer-window gnus-save-article-buffer - (save-excursion - (save-restriction - (widen) - (gnus-output-to-rmail filename)))) - filename) - -(defun gnus-summary-save-in-mail (&optional filename) - "Append this article to Unix mail file. -Optional argument FILENAME specifies file name. -Directory to save to is default to `gnus-article-save-directory'." - (setq filename (gnus-read-save-file-name - "Save %s in Unix mail file:" filename - gnus-mail-save-name gnus-newsgroup-name - gnus-current-headers 'gnus-newsgroup-last-mail)) - (gnus-eval-in-buffer-window gnus-save-article-buffer - (save-excursion - (save-restriction - (widen) - (if (and (file-readable-p filename) - (mail-file-babyl-p filename)) - (rmail-output-to-rmail-file filename t) - (gnus-output-to-mail filename))))) - filename) - -(defun gnus-summary-save-in-file (&optional filename overwrite) - "Append this article to file. -Optional argument FILENAME specifies file name. -Directory to save to is default to `gnus-article-save-directory'." - (setq filename (gnus-read-save-file-name - "Save %s in file:" filename - gnus-file-save-name gnus-newsgroup-name - gnus-current-headers 'gnus-newsgroup-last-file)) - (gnus-eval-in-buffer-window gnus-save-article-buffer - (save-excursion - (save-restriction - (widen) - (when (and overwrite - (file-exists-p filename)) - (delete-file filename)) - (gnus-output-to-file filename)))) - filename) - -(defun gnus-summary-write-to-file (&optional filename) - "Write this article to a file. -Optional argument FILENAME specifies file name. -The directory to save in defaults to `gnus-article-save-directory'." - (gnus-summary-save-in-file nil t)) - -(defun gnus-summary-save-body-in-file (&optional filename) - "Append this article body to a file. -Optional argument FILENAME specifies file name. -The directory to save in defaults to `gnus-article-save-directory'." - (setq filename (gnus-read-save-file-name - "Save %s body in file:" filename - gnus-file-save-name gnus-newsgroup-name - gnus-current-headers 'gnus-newsgroup-last-file)) - (gnus-eval-in-buffer-window gnus-save-article-buffer - (save-excursion - (save-restriction - (widen) - (when (article-goto-body) - (narrow-to-region (point) (point-max))) - (gnus-output-to-file filename)))) - filename) - -(defun gnus-summary-save-in-pipe (&optional command) - "Pipe this article to subprocess." - (setq command - (cond ((and (eq command 'default) - gnus-last-shell-command) - gnus-last-shell-command) - ((stringp command) - command) - (t (read-string - (format - "Shell command on %s: " - (if (and gnus-number-of-articles-to-be-saved - (> gnus-number-of-articles-to-be-saved 1)) - (format "these %d articles" - gnus-number-of-articles-to-be-saved) - "this article")) - gnus-last-shell-command)))) - (when (string-equal command "") - (if gnus-last-shell-command - (setq command gnus-last-shell-command) - (error "A command is required"))) - (gnus-eval-in-buffer-window gnus-article-buffer - (save-restriction - (widen) - (shell-command-on-region (point-min) (point-max) command nil))) - (setq gnus-last-shell-command command)) - -;;; Article file names when saving. - -(defun gnus-capitalize-newsgroup (newsgroup) - "Capitalize NEWSGROUP name." - (when (not (zerop (length newsgroup))) - (concat (char-to-string (upcase (aref newsgroup 0))) - (substring newsgroup 1)))) - -(defun gnus-Numeric-save-name (newsgroup headers &optional last-file) - "Generate file name from NEWSGROUP, HEADERS, and optional LAST-FILE. -If variable `gnus-use-long-file-name' is non-nil, it is ~/News/News.group/num. -Otherwise, it is like ~/News/news/group/num." - (let ((default - (expand-file-name - (concat (if (gnus-use-long-file-name 'not-save) - (gnus-capitalize-newsgroup newsgroup) - (gnus-newsgroup-directory-form newsgroup)) - "/" (int-to-string (mail-header-number headers))) - gnus-article-save-directory))) - (if (and last-file - (string-equal (file-name-directory default) - (file-name-directory last-file)) - (string-match "^[0-9]+$" (file-name-nondirectory last-file))) - default - (or last-file default)))) - -(defun gnus-numeric-save-name (newsgroup headers &optional last-file) - "Generate file name from NEWSGROUP, HEADERS, and optional LAST-FILE. -If variable `gnus-use-long-file-name' is non-nil, it is -~/News/news.group/num. Otherwise, it is like ~/News/news/group/num." - (let ((default - (expand-file-name - (concat (if (gnus-use-long-file-name 'not-save) - newsgroup - (gnus-newsgroup-directory-form newsgroup)) - "/" (int-to-string (mail-header-number headers))) - gnus-article-save-directory))) - (if (and last-file - (string-equal (file-name-directory default) - (file-name-directory last-file)) - (string-match "^[0-9]+$" (file-name-nondirectory last-file))) - default - (or last-file default)))) - -(defun gnus-plain-save-name (newsgroup headers &optional last-file) - "Generate file name from NEWSGROUP, HEADERS, and optional LAST-FILE. -If variable `gnus-use-long-file-name' is non-nil, it is -~/News/news.group. Otherwise, it is like ~/News/news/group/news." - (or last-file - (expand-file-name - (if (gnus-use-long-file-name 'not-save) - newsgroup - (file-relative-name - (expand-file-name "news" (gnus-newsgroup-directory-form newsgroup)) - default-directory)) - gnus-article-save-directory))) - -(defun gnus-sender-save-name (newsgroup headers &optional last-file) - "Generate file name from sender." - (let ((from (mail-header-from headers))) - (expand-file-name - (if (and from (string-match "\\([^ <]+\\)@" from)) - (match-string 1 from) - "nobody") - gnus-article-save-directory))) - -(defun article-verify-x-pgp-sig () - "Verify X-PGP-Sig." - (interactive) - (if (gnus-buffer-live-p gnus-original-article-buffer) - (let ((sig (with-current-buffer gnus-original-article-buffer - (gnus-fetch-field "X-PGP-Sig"))) - items info headers) - (when (and sig - mml2015-use - (mml2015-clear-verify-function)) - (with-temp-buffer - (insert-buffer gnus-original-article-buffer) - (setq items (split-string sig)) - (message-narrow-to-head) - (let ((inhibit-point-motion-hooks t) - (case-fold-search t)) - ;; Don't verify multiple headers. - (setq headers (mapconcat (lambda (header) - (concat header ": " - (mail-fetch-field header) "\n")) - (split-string (nth 1 items) ",") ""))) - (delete-region (point-min) (point-max)) - (insert "-----BEGIN PGP SIGNED MESSAGE-----\n\n") - (insert "X-Signed-Headers: " (nth 1 items) "\n") - (insert headers) - (widen) - (forward-line) - (while (not (eobp)) - (if (looking-at "^-") - (insert "- ")) - (forward-line)) - (insert "\n-----BEGIN PGP SIGNATURE-----\n") - (insert "Version: " (car items) "\n\n") - (insert (mapconcat 'identity (cddr items) "\n")) - (insert "\n-----END PGP SIGNATURE-----\n") - (let ((mm-security-handle (list (format "multipart/signed")))) - (mml2015-clean-buffer) - (let ((coding-system-for-write (or gnus-newsgroup-charset - 'iso-8859-1))) - (funcall (mml2015-clear-verify-function))) - (setq info - (or (mm-handle-multipart-ctl-parameter - mm-security-handle 'gnus-details) - (mm-handle-multipart-ctl-parameter - mm-security-handle 'gnus-info))))) - (when info - (let (buffer-read-only bface eface) - (save-restriction - (message-narrow-to-head) - (goto-char (point-max)) - (forward-line -1) - (setq bface (get-text-property (gnus-point-at-bol) 'face) - eface (get-text-property (1- (gnus-point-at-eol)) 'face)) - (message-remove-header "X-Gnus-PGP-Verify") - (if (re-search-forward "^X-PGP-Sig:" nil t) - (forward-line) - (goto-char (point-max))) - (narrow-to-region (point) (point)) - (insert "X-Gnus-PGP-Verify: " info "\n") - (goto-char (point-min)) - (forward-line) - (while (not (eobp)) - (if (not (looking-at "^[ \t]")) - (insert " ")) - (forward-line)) - ;; Do highlighting. - (goto-char (point-min)) - (when (looking-at "\\([^:]+\\): *") - (put-text-property (match-beginning 1) (1+ (match-end 1)) - 'face bface) - (put-text-property (match-end 0) (point-max) - 'face eface))))))))) - -(eval-and-compile - (mapcar - (lambda (func) - (let (afunc gfunc) - (if (consp func) - (setq afunc (car func) - gfunc (cdr func)) - (setq afunc func - gfunc (intern (format "gnus-%s" func)))) - (defalias gfunc - (if (fboundp afunc) - `(lambda (&optional interactive &rest args) - ,(documentation afunc t) - (interactive (list t)) - (save-excursion - (set-buffer gnus-article-buffer) - (if interactive - (call-interactively ',afunc) - (apply ',afunc args)))))))) - '(article-hide-headers - article-verify-x-pgp-sig - article-hide-boring-headers - article-toggle-headers - article-treat-overstrike - article-fill-long-lines - article-capitalize-sentences - article-remove-cr - article-remove-leading-whitespace - article-display-x-face - article-de-quoted-unreadable - article-de-base64-unreadable - article-decode-HZ - article-wash-html - article-hide-list-identifiers - article-hide-pgp - article-strip-banner - article-babel - article-hide-pem - article-hide-signature - article-strip-headers-in-body - article-remove-trailing-blank-lines - article-strip-leading-blank-lines - article-strip-multiple-blank-lines - article-strip-leading-space - article-strip-trailing-space - article-strip-blank-lines - article-strip-all-blank-lines - article-date-local - article-date-english - article-date-iso8601 - article-date-original - article-date-ut - article-decode-mime-words - article-decode-charset - article-decode-encoded-words - article-date-user - article-date-lapsed - article-emphasize - article-treat-dumbquotes - article-normalize-headers - (article-show-all-headers . gnus-article-show-all-headers) - (article-show-all . gnus-article-show-all)))) - -;;; -;;; Gnus article mode -;;; - -(put 'gnus-article-mode 'mode-class 'special) - -(gnus-define-keys gnus-article-mode-map - " " gnus-article-goto-next-page - "\177" gnus-article-goto-prev-page - [delete] gnus-article-goto-prev-page - [backspace] gnus-article-goto-prev-page - "\C-c^" gnus-article-refer-article - "h" gnus-article-show-summary - "s" gnus-article-show-summary - "\C-c\C-m" gnus-article-mail - "?" gnus-article-describe-briefly - "e" gnus-summary-edit-article - "<" beginning-of-buffer - ">" end-of-buffer - "\C-c\C-i" gnus-info-find-node - "\C-c\C-b" gnus-bug - "\C-hk" gnus-article-describe-key - "\C-hc" gnus-article-describe-key-briefly - - "\C-d" gnus-article-read-summary-keys - "\M-*" gnus-article-read-summary-keys - "\M-#" gnus-article-read-summary-keys - "\M-^" gnus-article-read-summary-keys - "\M-g" gnus-article-read-summary-keys) - -;; Define almost undefined keys to `gnus-article-read-summary-keys'. -(let (keys) - (let ((key 32)) - (while (<= key 127) - (push (char-to-string key) keys) - (incf key)) - (dolist (elem (accessible-keymaps gnus-summary-mode-map)) - (setq key (car elem)) - (when (and (> (length key) 0) - (not (eq 'menu-bar (aref key 0))) - (symbolp (lookup-key gnus-summary-mode-map key))) - (push key keys)))) - (dolist (key keys) - (unless (lookup-key gnus-article-mode-map key) - (define-key gnus-article-mode-map key 'gnus-article-read-summary-keys)))) - -(defun gnus-article-make-menu-bar () - (unless (boundp 'gnus-article-commands-menu) - (gnus-summary-make-menu-bar)) - (gnus-turn-off-edit-menu 'article) - (unless (boundp 'gnus-article-article-menu) - (easy-menu-define - gnus-article-article-menu gnus-article-mode-map "" - '("Article" - ["Scroll forwards" gnus-article-goto-next-page t] - ["Scroll backwards" gnus-article-goto-prev-page t] - ["Show summary" gnus-article-show-summary t] - ["Fetch Message-ID at point" gnus-article-refer-article t] - ["Mail to address at point" gnus-article-mail t] - ["Send a bug report" gnus-bug t])) - - (easy-menu-define - gnus-article-treatment-menu gnus-article-mode-map "" - ;; Fixme: this should use :active (and maybe :visible). - '("Treatment" - ["Hide headers" gnus-article-toggle-headers t] - ["Hide signature" gnus-article-hide-signature t] - ["Hide citation" gnus-article-hide-citation t] - ["Treat overstrike" gnus-article-treat-overstrike t] - ["Remove carriage return" gnus-article-remove-cr t] - ["Remove leading whitespace" gnus-article-remove-leading-whitespace t] - ["Decode HZ" gnus-article-decode-HZ t])) - - ;; Note "Commands" menu is defined in gnus-sum.el for consistency - - ;; Note "Post" menu is defined in gnus-sum.el for consistency - - (gnus-run-hooks 'gnus-article-menu-hook))) - -;; Fixme: do something for the Emacs tool bar in Article mode a la -;; Summary. - -(defun gnus-article-mode () - "Major mode for displaying an article. - -All normal editing commands are switched off. - -The following commands are available in addition to all summary mode -commands: -\\ -\\[gnus-article-next-page]\t Scroll the article one page forwards -\\[gnus-article-prev-page]\t Scroll the article one page backwards -\\[gnus-article-refer-article]\t Go to the article referred to by an article id near point -\\[gnus-article-show-summary]\t Display the summary buffer -\\[gnus-article-mail]\t Send a reply to the address near point -\\[gnus-article-describe-briefly]\t Describe the current mode briefly -\\[gnus-info-find-node]\t Go to the Gnus info node" - (interactive) - (gnus-simplify-mode-line) - (setq mode-name "Article") - (setq major-mode 'gnus-article-mode) - (make-local-variable 'minor-mode-alist) - (unless (assq 'gnus-show-mime minor-mode-alist) - (push (list 'gnus-show-mime " MIME") minor-mode-alist)) - (use-local-map gnus-article-mode-map) - (when (gnus-visual-p 'article-menu 'menu) - (gnus-article-make-menu-bar)) - (gnus-update-format-specifications nil 'article-mode) - (set (make-local-variable 'page-delimiter) gnus-page-delimiter) - (make-local-variable 'gnus-page-broken) - (make-local-variable 'gnus-button-marker-list) - (make-local-variable 'gnus-article-current-summary) - (make-local-variable 'gnus-article-mime-handles) - (make-local-variable 'gnus-article-decoded-p) - (make-local-variable 'gnus-article-mime-handle-alist) - (make-local-variable 'gnus-article-wash-types) - (make-local-variable 'gnus-article-charset) - (make-local-variable 'gnus-article-ignored-charsets) - (gnus-set-default-directory) - (buffer-disable-undo) - (setq buffer-read-only t) - (set-syntax-table gnus-article-mode-syntax-table) - (gnus-run-hooks 'gnus-article-mode-hook)) - -(defun gnus-article-setup-buffer () - "Initialize the article buffer." - (let* ((name (if gnus-single-article-buffer "*Article*" - (concat "*Article " gnus-newsgroup-name "*"))) - (original - (progn (string-match "\\*Article" name) - (concat " *Original Article" - (substring name (match-end 0)))))) - (setq gnus-article-buffer name) - (setq gnus-original-article-buffer original) - (setq gnus-article-mime-handle-alist nil) - ;; This might be a variable local to the summary buffer. - (unless gnus-single-article-buffer - (save-excursion - (set-buffer gnus-summary-buffer) - (setq gnus-article-buffer name) - (setq gnus-original-article-buffer original) - (gnus-set-global-variables))) - (gnus-article-setup-highlight-words) - ;; Init original article buffer. - (save-excursion - (set-buffer (gnus-get-buffer-create gnus-original-article-buffer)) - (set-buffer-multibyte nil) - (setq major-mode 'gnus-original-article-mode) - (make-local-variable 'gnus-original-article)) - (if (get-buffer name) - (save-excursion - (set-buffer name) - (buffer-disable-undo) - (setq buffer-read-only t) - (unless (eq major-mode 'gnus-article-mode) - (gnus-article-mode)) - (current-buffer)) - (save-excursion - (set-buffer (gnus-get-buffer-create name)) - (gnus-article-mode) - (make-local-variable 'gnus-summary-buffer) - (gnus-summary-set-local-parameters gnus-newsgroup-name) - (current-buffer))))) - -;; Set article window start at LINE, where LINE is the number of lines -;; from the head of the article. -(defun gnus-article-set-window-start (&optional line) - (set-window-start - (get-buffer-window gnus-article-buffer t) - (save-excursion - (set-buffer gnus-article-buffer) - (goto-char (point-min)) - (if (not line) - (point-min) - (gnus-message 6 "Moved to bookmark") - (search-forward "\n\n" nil t) - (forward-line line) - (point))))) - -;;; @@ article filters -;;; - -(defun gnus-article-display-mime-message () - "Article display method for MIME message." - ;; called from `gnus-original-article-buffer'. - (let (charset all-headers) - (with-current-buffer gnus-summary-buffer - (setq charset default-mime-charset - all-headers gnus-have-all-headers)) - (make-local-variable 'default-mime-charset) - (setq default-mime-charset charset) - (with-current-buffer (get-buffer-create gnus-article-buffer) - (make-local-variable 'default-mime-charset) - (setq default-mime-charset charset)) - (mime-display-message mime-message-structure - gnus-article-buffer nil gnus-article-mode-map) - (when all-headers - (gnus-article-hide-headers nil -1))) - (run-hooks 'gnus-mime-article-prepare-hook)) - -(defun gnus-article-display-traditional-message () - "Article display method for traditional message." - (set-buffer gnus-article-buffer) - (let (buffer-read-only) - (erase-buffer) - (insert-buffer-substring gnus-original-article-buffer))) - -(defun gnus-article-make-full-mail-header (&optional number charset) - "Create a new mail header structure in a raw article buffer." - (unless (and number charset) - (save-current-buffer - (set-buffer gnus-summary-buffer) - (unless number - (setq number (or (cdr gnus-article-current) 0))) - (unless charset - (setq charset (or default-mime-charset 'x-ctext))))) - (goto-char (point-min)) - (let ((header-end (if (search-forward "\n\n" nil t) - (1- (point)) - (goto-char (point-max)))) - (chars (- (point-max) (point))) - (lines (count-lines (point) (point-max))) - (default-mime-charset charset) - xref) - (narrow-to-region (point-min) header-end) - (setq xref (std11-fetch-field "xref")) - (prog1 - (make-full-mail-header - number - (std11-fetch-field "subject") - (std11-fetch-field "from") - (std11-fetch-field "date") - (std11-fetch-field "message-id") - (std11-fetch-field "references") - chars - lines - (when xref (concat "Xref: " xref))) - (widen)))) - -(defun gnus-article-prepare (article &optional all-headers header) - "Prepare ARTICLE in article mode buffer. -ARTICLE should either be an article number or a Message-ID. -If ARTICLE is an id, HEADER should be the article headers. -If ALL-HEADERS is non-nil, no headers are hidden." - (save-excursion - ;; Make sure we start in a summary buffer. - (unless (eq major-mode 'gnus-summary-mode) - (set-buffer gnus-summary-buffer)) - (setq gnus-summary-buffer (current-buffer)) - (let* ((gnus-article (if header (mail-header-number header) article)) - (summary-buffer (current-buffer)) - (gnus-tmp-internal-hook gnus-article-internal-prepare-hook) - (group gnus-newsgroup-name) - result) - (save-excursion - (gnus-article-setup-buffer) - (set-buffer gnus-article-buffer) - ;; Deactivate active regions. - (when (and (boundp 'transient-mark-mode) - transient-mark-mode) - (setq mark-active nil)) - (if (not (setq result (let ((buffer-read-only nil)) - (gnus-request-article-this-buffer - article group)))) - ;; There is no such article. - (save-excursion - (when (and (numberp article) - (not (memq article gnus-newsgroup-sparse))) - (setq gnus-article-current - (cons gnus-newsgroup-name article)) - (set-buffer gnus-summary-buffer) - (setq gnus-current-article article) - (if (eq (gnus-article-mark article) gnus-undownloaded-mark) - (progn - (gnus-summary-set-agent-mark article) - (message "Message marked for downloading")) - (gnus-summary-mark-article article gnus-canceled-mark) - (unless (memq article gnus-newsgroup-sparse) - (gnus-error 1 "No such article (may have expired or been canceled)"))))) - (if (or (eq result 'pseudo) - (eq result 'nneething)) - (progn - (save-excursion - (set-buffer summary-buffer) - (push article gnus-newsgroup-history) - (setq gnus-last-article gnus-current-article - gnus-current-article 0 - gnus-current-headers nil - gnus-article-current nil) - (if (eq result 'nneething) - (gnus-configure-windows 'summary) - (gnus-configure-windows 'article)) - (gnus-set-global-variables)) - (let ((gnus-article-mime-handle-alist-1 - gnus-article-mime-handle-alist)) - (gnus-set-mode-line 'article))) - ;; The result from the `request' was an actual article - - ;; or at least some text that is now displayed in the - ;; article buffer. - (when (and (numberp article) - (not (eq article gnus-current-article))) - ;; Seems like a new article has been selected. - ;; `gnus-current-article' must be an article number. - (save-excursion - (set-buffer summary-buffer) - (push article gnus-newsgroup-history) - (setq gnus-last-article gnus-current-article - gnus-current-article article - gnus-current-headers - (gnus-summary-article-header gnus-current-article) - gnus-article-current - (cons gnus-newsgroup-name gnus-current-article)) - (unless (vectorp gnus-current-headers) - (setq gnus-current-headers nil)) - (gnus-summary-goto-subject gnus-current-article) - (when (gnus-summary-show-thread) - ;; If the summary buffer really was folded, the - ;; previous goto may not actually have gone to - ;; the right article, but the thread root instead. - ;; So we go again. - (gnus-summary-goto-subject gnus-current-article)) - (gnus-run-hooks 'gnus-mark-article-hook) - (gnus-set-mode-line 'summary) - (when (gnus-visual-p 'article-highlight 'highlight) - (gnus-run-hooks 'gnus-visual-mark-article-hook)) - ;; Set the global newsgroup variables here. - (gnus-set-global-variables) - (setq gnus-have-all-headers - (or all-headers gnus-show-all-headers)))) - (save-excursion - (gnus-configure-windows 'article)) - (when (or (numberp article) - (stringp article)) - (gnus-article-prepare-display) - ;; Do page break. - (goto-char (point-min)) - (setq gnus-page-broken - (when gnus-break-pages - (gnus-narrow-to-page) - t))) - (let ((gnus-article-mime-handle-alist-1 - gnus-article-mime-handle-alist)) - (gnus-set-mode-line 'article)) - (article-goto-body) - (set-window-point (get-buffer-window (current-buffer)) (point)) - (gnus-configure-windows 'article) - t)))))) - -(defun gnus-article-prepare-mime-display (&optional number) - (goto-char (point-min)) - (when (re-search-forward "^[^\t ]+:" nil t) - (goto-char (match-beginning 0))) - (let ((entity (if (eq 1 (point-min)) - (get-text-property 1 'mime-view-entity) - (get-text-property (point) 'mime-view-entity))) - last-entity child-entity next type) - (setq child-entity (mime-entity-children entity)) - (if child-entity - (setq last-entity (nth (1- (length child-entity)) - child-entity)) - (setq last-entity entity)) - (save-restriction - (narrow-to-region (point) - (if (search-forward "\n\n" nil t) - (point) - (point-max))) - (gnus-treat-article 'head) - (put-text-property (point-min) (point-max) 'article-treated-header t) - (goto-char (point-max))) - (while (and (not (eobp)) entity) - (setq next (set-marker - (make-marker) - (next-single-property-change (point) 'mime-view-entity - nil (point-max)))) - (let ((types (mime-entity-content-type entity))) - (while (eq 'multipart (mime-content-type-primary-type types)) - (setq entity (car (mime-entity-children entity)) - types (mime-entity-content-type entity))) - (when types - (setq type (format "%s/%s" - (mime-content-type-primary-type types) - (mime-content-type-subtype types))))) - (if (string-equal type "message/rfc822") - (progn - (setq next (point)) - (let ((children (mime-entity-children entity)) - last-children) - (when children - (setq last-children (nth (1- (length children)) children)) - (while - (and - (not (eq last-children - (get-text-property next 'mime-view-entity))) - (setq next - (next-single-property-change next - 'mime-view-entity - nil (point-max))))))) - (setq next (next-single-property-change next 'mime-view-entity - nil (point-max))) - (save-restriction - (narrow-to-region (point) next) - (gnus-article-prepare-mime-display) - (goto-char (point-max))) - (setq entity (get-text-property (point) 'mime-view-entity))) - (save-restriction - (narrow-to-region (point) next) - ;; Kludge. We have to count true number, but for now, - ;; part number is here only to achieve `last'. - (gnus-treat-article nil 1 - (if (eq entity last-entity) - 1 2) - type) - (goto-char (point-max))) - (setq entity (get-text-property next 'mime-view-entity)))))) - -;;;###autoload -(defun gnus-article-prepare-display () - "Make the current buffer look like a nice article." - (let ((gnus-article-buffer (current-buffer)) - buffer-read-only) - (unless (eq major-mode 'gnus-article-mode) - (gnus-article-mode)) - (setq buffer-read-only nil - gnus-button-marker-list nil - gnus-article-wash-types nil) - (save-restriction - (widen) - (static-if (featurep 'xemacs) - (map-extents (lambda (extent maparg) (delete-extent extent))) - (let ((lists (overlay-lists))) - (dolist (overlay (nconc (car lists) (cdr lists))) - (delete-overlay overlay))))) - (gnus-run-hooks 'gnus-tmp-internal-hook)) - (set-buffer gnus-original-article-buffer) - ;; Display message. - (setq mime-message-structure gnus-current-headers) - (mime-buffer-entity-set-buffer-internal mime-message-structure - gnus-original-article-buffer) - (mime-entity-set-representation-type-internal mime-message-structure - 'mime-buffer-entity) - (luna-send mime-message-structure 'initialize-instance - mime-message-structure) - (if gnus-show-mime - (let (mime-display-header-hook mime-display-text/plain-hook) - (funcall gnus-article-display-method-for-mime)) - (funcall gnus-article-display-method-for-traditional)) - ;; Call the treatment functions. - (let ((inhibit-read-only t)) - (save-restriction - (widen) - (if gnus-show-mime - (gnus-article-prepare-mime-display) - (narrow-to-region (goto-char (point-min)) - (if (search-forward "\n\n" nil t) - (point) - (point-max))) - (gnus-treat-article 'head) - (put-text-property (point-min) (point-max) 'article-treated-header t) - (goto-char (point-max)) - (widen) - (narrow-to-region (point) (point-max)) - (gnus-treat-article nil)) - (put-text-property (point-min) (point-max) 'read-only nil))) - (gnus-run-hooks 'gnus-article-prepare-hook)) - -(defun gnus-article-decode-article-as-default-mime-charset () - "Decode an article as `default-mime-charset'. It won't work if the -value of the variable `gnus-show-mime' is non-nil." - (unless gnus-show-mime - (set (make-local-variable 'default-mime-charset) - (with-current-buffer gnus-summary-buffer - default-mime-charset)) - (decode-mime-charset-region (point-min) (point-max) - default-mime-charset))) - -;;; -;;; Gnus MIME viewing functions -;;; - -(defvar gnus-mime-button-line-format "%{%([%p. %d%T]%)%}%e\n" - "The following specs can be used: -%t The MIME type -%T MIME type, along with additional info -%n The `name' parameter -%d The description, if any -%l The length of the encoded part -%p The part identifier number -%e Dots if the part isn't displayed") - -(defvar gnus-mime-button-line-format-alist - '((?t gnus-tmp-type ?s) - (?T gnus-tmp-type-long ?s) - (?n gnus-tmp-name ?s) - (?d gnus-tmp-description ?s) - (?p gnus-tmp-id ?s) - (?l gnus-tmp-length ?d) - (?e gnus-tmp-dots ?s))) - -(defvar gnus-mime-button-commands - '((gnus-article-press-button "\r" "Toggle Display") - (gnus-mime-view-part "v" "View Interactively...") - (gnus-mime-view-part-as-type "t" "View As Type...") - (gnus-mime-view-part-as-charset "C" "View As charset...") - (gnus-mime-save-part "o" "Save...") - (gnus-mime-save-part-and-strip "\C-o" "Save and Strip") - (gnus-mime-copy-part "c" "View As Text, In Other Buffer") - (gnus-mime-inline-part "i" "View As Text, In This Buffer") - (gnus-mime-internalize-part "E" "View Internally") - (gnus-mime-externalize-part "e" "View Externally") - (gnus-mime-pipe-part "|" "Pipe To Command...") - (gnus-mime-action-on-part "." "Take action on the part"))) - -(defun gnus-article-mime-part-status () - (with-current-buffer gnus-article-buffer - (let ((entity (get-text-property (point-min) 'mime-view-entity)) - children) - (if (and entity - (setq children (mime-entity-children entity)) - (setq children (length children))) - (if (eq 1 children) - " (1 part)" - (format " (%d parts)" children)) - "")))) - -(defvar gnus-mime-button-map - (let ((map (make-sparse-keymap))) - (unless (>= (string-to-number emacs-version) 21) - ;; XEmacs doesn't care. - (set-keymap-parent map gnus-article-mode-map)) - (define-key map gnus-mouse-2 'gnus-article-push-button) - (define-key map gnus-down-mouse-3 'gnus-mime-button-menu) - (dolist (c gnus-mime-button-commands) - (define-key map (cadr c) (car c))) - map)) - -(defun gnus-mime-button-menu (event) - "Construct a context-sensitive menu of MIME commands." - (interactive "e") - (save-window-excursion - (let ((pos (event-start event))) - (select-window (posn-window pos)) - (goto-char (posn-point pos)) - (gnus-article-check-buffer) - (let ((response (x-popup-menu - t `("MIME Part" - ("" ,@(mapcar (lambda (c) - (cons (caddr c) (car c))) - gnus-mime-button-commands)))))) - (if response - (call-interactively response)))))) - -(defun gnus-mime-view-all-parts (&optional handles) - "View all the MIME parts." - (interactive) - (save-current-buffer - (set-buffer gnus-article-buffer) - (let ((handles (or handles gnus-article-mime-handles)) - (mail-parse-charset gnus-newsgroup-charset) - (mail-parse-ignored-charsets - (with-current-buffer gnus-summary-buffer - gnus-newsgroup-ignored-charsets))) - (when handles - (mm-remove-parts handles) - (goto-char (point-min)) - (or (search-forward "\n\n") (goto-char (point-max))) - (let (buffer-read-only) - (delete-region (point) (point-max)) - (mm-display-parts handles)))))) - -(defun gnus-mime-save-part-and-strip () - "Save the MIME part under point then replace it with an external body." - (interactive) - (gnus-article-check-buffer) - (let* ((data (get-text-property (point) 'gnus-data)) - file param - (handles gnus-article-mime-handles)) - (if (mm-multiple-handles gnus-article-mime-handles) - (error "This function is not implemented")) - (setq file (and data (mm-save-part data))) - (when file - (with-current-buffer (mm-handle-buffer data) - (erase-buffer) - (insert "Content-Type: " (mm-handle-media-type data)) - (mml-insert-parameter-string (cdr (mm-handle-type data)) - '(charset)) - (insert "\n") - (insert "Content-ID: " (message-make-message-id) "\n") - (insert "Content-Transfer-Encoding: binary\n") - (insert "\n")) - (setcdr data - (cdr (mm-make-handle nil - `("message/external-body" - (access-type . "LOCAL-FILE") - (name . ,file))))) - (set-buffer gnus-summary-buffer) - (gnus-article-edit-article - `(lambda () - (erase-buffer) - (let ((mail-parse-charset (or gnus-article-charset - ',gnus-newsgroup-charset)) - (mail-parse-ignored-charsets - (or gnus-article-ignored-charsets - ',gnus-newsgroup-ignored-charsets)) - (mbl mml-buffer-list)) - (setq mml-buffer-list nil) - (insert-buffer gnus-original-article-buffer) - (mime-to-mml ',handles) - (setq gnus-article-mime-handles nil) - (let ((mbl1 mml-buffer-list)) - (setq mml-buffer-list mbl) - (set (make-local-variable 'mml-buffer-list) mbl1)) - ;; LOCAL argument of add-hook differs between GNU Emacs - ;; and XEmacs. make-local-hook makes sure they are local. - (make-local-hook 'kill-buffer-hook) - (add-hook 'kill-buffer-hook 'mml-destroy-buffers t t))) - `(lambda (no-highlight) - (let ((mail-parse-charset (or gnus-article-charset - ',gnus-newsgroup-charset)) - (message-options message-options) - (message-options-set-recipient) - (mail-parse-ignored-charsets - (or gnus-article-ignored-charsets - ',gnus-newsgroup-ignored-charsets))) - (mml-to-mime) - (mml-destroy-buffers) - (remove-hook 'kill-buffer-hook - 'mml-destroy-buffers t) - (kill-local-variable 'mml-buffer-list)) - (gnus-summary-edit-article-done - ,(or (mail-header-references gnus-current-headers) "") - ,(gnus-group-read-only-p) - ,gnus-summary-buffer no-highlight)))))) - -(defun gnus-mime-save-part () - "Save the MIME part under point." - (interactive) - (gnus-article-check-buffer) - (let ((data (get-text-property (point) 'gnus-data))) - (when data - (mm-save-part data)))) - -(defun gnus-mime-pipe-part () - "Pipe the MIME part under point to a process." - (interactive) - (gnus-article-check-buffer) - (let ((data (get-text-property (point) 'gnus-data))) - (when data - (mm-pipe-part data)))) - -(defun gnus-mime-view-part () - "Interactively choose a viewing method for the MIME part under point." - (interactive) - (gnus-article-check-buffer) - (let ((data (get-text-property (point) 'gnus-data))) - (when data - (setq gnus-article-mime-handles - (mm-merge-handles - gnus-article-mime-handles (setq data (copy-sequence data)))) - (mm-interactively-view-part data)))) - -(defun gnus-mime-view-part-as-type-internal () - (gnus-article-check-buffer) - (let* ((name (mail-content-type-get - (mm-handle-type (get-text-property (point) 'gnus-data)) - 'name)) - (def-type (and name (mm-default-file-encoding name)))) - (and def-type (cons def-type 0)))) - -(defun gnus-mime-view-part-as-type (&optional mime-type) - "Choose a MIME media type, and view the part as such." - (interactive) - (unless mime-type - (setq mime-type (completing-read - "View as MIME type: " - (mapcar #'list (mailcap-mime-types)) - nil nil - (gnus-mime-view-part-as-type-internal)))) - (gnus-article-check-buffer) - (let ((handle (get-text-property (point) 'gnus-data))) - (when handle - (setq handle - (mm-make-handle (mm-handle-buffer handle) - (cons mime-type (cdr (mm-handle-type handle))) - (mm-handle-encoding handle) - (mm-handle-undisplayer handle) - (mm-handle-disposition handle) - (mm-handle-description handle) - nil - (mm-handle-id handle))) - (setq gnus-article-mime-handles - (mm-merge-handles gnus-article-mime-handles handle)) - (gnus-mm-display-part handle)))) - -(defun gnus-mime-copy-part (&optional handle) - "Put the the MIME part under point into a new buffer." - (interactive) - (gnus-article-check-buffer) - (let* ((handle (or handle (get-text-property (point) 'gnus-data))) - (contents (and handle (mm-get-part handle))) - (base (and handle - (file-name-nondirectory - (or - (mail-content-type-get (mm-handle-type handle) 'name) - (mail-content-type-get (mm-handle-type handle) - 'filename) - "*decoded*")))) - (buffer (and base (generate-new-buffer base)))) - (when contents - (switch-to-buffer buffer) - (insert contents) - ;; We do it this way to make `normal-mode' set the appropriate mode. - (unwind-protect - (progn - (setq buffer-file-name (expand-file-name base)) - (normal-mode)) - (setq buffer-file-name nil)) - (goto-char (point-min))))) - -(defun gnus-mime-inline-part (&optional handle arg) - "Insert the MIME part under point into the current buffer." - (interactive (list nil current-prefix-arg)) - (gnus-article-check-buffer) - (let* ((handle (or handle (get-text-property (point) 'gnus-data))) - contents charset - (b (point)) - buffer-read-only) - (when handle - (if (and (not arg) (mm-handle-undisplayer handle)) - (mm-remove-part handle) - (setq contents (mm-get-part handle)) - (cond - ((not arg) - (setq charset (or (mail-content-type-get - (mm-handle-type handle) 'charset) - gnus-newsgroup-charset))) - ((numberp arg) - (if (mm-handle-undisplayer handle) - (mm-remove-part handle)) - (setq charset - (or (cdr (assq arg - gnus-summary-show-article-charset-alist)) - (mm-read-coding-system "Charset: "))))) - (forward-line 2) - (mm-insert-inline handle - (if (and charset - (setq charset (mm-charset-to-coding-system - charset)) - (not (eq charset 'ascii))) - (mm-decode-coding-string contents charset) - contents)) - (goto-char b))))) - -(defun gnus-mime-view-part-as-charset (&optional handle arg) - "Insert the MIME part under point into the current buffer using the -specified charset." - (interactive (list nil current-prefix-arg)) - (gnus-article-check-buffer) - (let* ((handle (or handle (get-text-property (point) 'gnus-data))) - contents charset - (b (point)) - buffer-read-only) - (when handle - (if (mm-handle-undisplayer handle) - (mm-remove-part handle)) - (let ((gnus-newsgroup-charset - (or (cdr (assq arg - gnus-summary-show-article-charset-alist)) - (mm-read-coding-system "Charset: "))) - (gnus-newsgroup-ignored-charsets 'gnus-all)) - (gnus-article-press-button))))) - -(defun gnus-mime-externalize-part (&optional handle) - "View the MIME part under point with an external viewer." - (interactive) - (gnus-article-check-buffer) - (let* ((handle (or handle (get-text-property (point) 'gnus-data))) - (mm-user-display-methods nil) - (mm-inlined-types nil) - (mail-parse-charset gnus-newsgroup-charset) - (mail-parse-ignored-charsets - (save-excursion (set-buffer gnus-summary-buffer) - gnus-newsgroup-ignored-charsets))) - (when handle - (if (mm-handle-undisplayer handle) - (mm-remove-part handle) - (mm-display-part handle))))) - -(defun gnus-mime-internalize-part (&optional handle) - "View the MIME part under point with an internal viewer. -If no internal viewer is available, use an external viewer." - (interactive) - (gnus-article-check-buffer) - (let* ((handle (or handle (get-text-property (point) 'gnus-data))) - (mm-inlined-types '(".*")) - (mm-inline-large-images t) - (mail-parse-charset gnus-newsgroup-charset) - (mail-parse-ignored-charsets - (save-excursion (set-buffer gnus-summary-buffer) - gnus-newsgroup-ignored-charsets))) - (when handle - (if (mm-handle-undisplayer handle) - (mm-remove-part handle) - (mm-display-part handle))))) - -(defun gnus-mime-action-on-part (&optional action) - "Do something with the MIME attachment at \(point\)." - (interactive - (list (completing-read "Action: " gnus-mime-action-alist))) - (gnus-article-check-buffer) - (let ((action-pair (assoc action gnus-mime-action-alist))) - (if action-pair - (funcall (cdr action-pair))))) - -(defun gnus-article-part-wrapper (n function) - (save-current-buffer - (set-buffer gnus-article-buffer) - (when (> n (length gnus-article-mime-handle-alist)) - (error "No such part")) - (gnus-article-goto-part n) - (let ((handle (cdr (assq n gnus-article-mime-handle-alist)))) - (funcall function handle)))) - -(defun gnus-article-pipe-part (n) - "Pipe MIME part N, which is the numerical prefix." - (interactive "p") - (gnus-article-part-wrapper n 'mm-pipe-part)) - -(defun gnus-article-save-part (n) - "Save MIME part N, which is the numerical prefix." - (interactive "p") - (gnus-article-part-wrapper n 'mm-save-part)) - -(defun gnus-article-interactively-view-part (n) - "View MIME part N interactively, which is the numerical prefix." - (interactive "p") - (gnus-article-part-wrapper n 'mm-interactively-view-part)) - -(defun gnus-article-copy-part (n) - "Copy MIME part N, which is the numerical prefix." - (interactive "p") - (gnus-article-part-wrapper n 'gnus-mime-copy-part)) - -(defun gnus-article-view-part-as-charset (n) - "Copy MIME part N, which is the numerical prefix." - (interactive "p") - (gnus-article-part-wrapper n 'gnus-mime-view-part-as-charset)) - -(defun gnus-article-externalize-part (n) - "View MIME part N externally, which is the numerical prefix." - (interactive "p") - (gnus-article-part-wrapper n 'gnus-mime-externalize-part)) - -(defun gnus-article-inline-part (n) - "Inline MIME part N, which is the numerical prefix." - (interactive "p") - (gnus-article-part-wrapper n 'gnus-mime-inline-part)) - -(defun gnus-article-mime-match-handle-first (condition) - (if condition - (let ((alist gnus-article-mime-handle-alist) ihandle n) - (while (setq ihandle (pop alist)) - (if (and (cond - ((functionp condition) - (funcall condition (cdr ihandle))) - ((eq condition 'undisplayed) - (not (or (mm-handle-undisplayer (cdr ihandle)) - (equal (mm-handle-media-type (cdr ihandle)) - "multipart/alternative")))) - ((eq condition 'undisplayed-alternative) - (not (mm-handle-undisplayer (cdr ihandle)))) - (t t)) - (gnus-article-goto-part (car ihandle)) - (or (not n) (< (car ihandle) n))) - (setq n (car ihandle)))) - (or n 1)) - 1)) - -(defun gnus-article-view-part (&optional n) - "View MIME part N, which is the numerical prefix." - (interactive "P") - (save-current-buffer - (set-buffer gnus-article-buffer) - (or (numberp n) (setq n (gnus-article-mime-match-handle-first - gnus-article-mime-match-handle-function))) - (when (> n (length gnus-article-mime-handle-alist)) - (error "No such part")) - (let ((handle (cdr (assq n gnus-article-mime-handle-alist)))) - (when (gnus-article-goto-part n) - (if (equal (car handle) "multipart/alternative") - (gnus-article-press-button) - (when (eq (gnus-mm-display-part handle) 'internal) - (gnus-set-window-start))))))) - -(defsubst gnus-article-mime-total-parts () - (if (bufferp (car gnus-article-mime-handles)) - 1 ;; single part - (1- (length gnus-article-mime-handles)))) - -(defun gnus-mm-display-part (handle) - "Display HANDLE and fix MIME button." - (let ((id (get-text-property (point) 'gnus-part)) - (point (point)) - buffer-read-only) - (forward-line 1) - (prog1 - (let ((window (selected-window)) - (mail-parse-charset gnus-newsgroup-charset) - (mail-parse-ignored-charsets - (save-excursion (set-buffer gnus-summary-buffer) - gnus-newsgroup-ignored-charsets))) - (save-excursion - (unwind-protect - (let ((win (get-buffer-window (current-buffer) t)) - (beg (point))) - (when win - (select-window win)) - (goto-char point) - (forward-line) - (if (mm-handle-displayed-p handle) - ;; This will remove the part. - (mm-display-part handle) - (save-restriction - (narrow-to-region (point) - (if (eobp) (point) (1+ (point)))) - (mm-display-part handle) - ;; We narrow to the part itself and - ;; then call the treatment functions. - (goto-char (point-min)) - (forward-line 1) - (narrow-to-region (point) (point-max)) - (gnus-treat-article - nil id - (gnus-article-mime-total-parts) - (mm-handle-media-type handle))))) - (if (window-live-p window) - (select-window window))))) - (goto-char point) - (delete-region (gnus-point-at-bol) (progn (forward-line 1) (point))) - (gnus-insert-mime-button - handle id (list (mm-handle-displayed-p handle))) - (goto-char point)))) - -(defun gnus-article-goto-part (n) - "Go to MIME part N." - (let ((point (text-property-any (point-min) (point-max) 'gnus-part n))) - (when point - (goto-char point)))) - -(defun gnus-insert-mime-button (handle gnus-tmp-id &optional displayed) - (let ((gnus-tmp-name - (or (mail-content-type-get (mm-handle-type handle) 'name) - (mail-content-type-get (mm-handle-disposition handle) 'filename) - (mail-content-type-get (mm-handle-type handle) 'url) - "")) - (gnus-tmp-type (mm-handle-media-type handle)) - (gnus-tmp-description - (mail-decode-encoded-word-string (or (mm-handle-description handle) - ""))) - (gnus-tmp-dots - (if (if displayed (car displayed) - (mm-handle-displayed-p handle)) - "" "...")) - (gnus-tmp-length (with-current-buffer (mm-handle-buffer handle) - (buffer-size))) - gnus-tmp-type-long b e) - (when (string-match ".*/" gnus-tmp-name) - (setq gnus-tmp-name (replace-match "" t t gnus-tmp-name))) - (setq gnus-tmp-type-long (concat gnus-tmp-type - (and (not (equal gnus-tmp-name "")) - (concat "; " gnus-tmp-name)))) - (unless (equal gnus-tmp-description "") - (setq gnus-tmp-type-long (concat " --- " gnus-tmp-type-long))) - (unless (bolp) - (insert "\n")) - (setq b (point)) - (gnus-eval-format - gnus-mime-button-line-format gnus-mime-button-line-format-alist - `(keymap ,gnus-mime-button-map - ,@(if (>= (string-to-number emacs-version) 21) - nil - (list 'local-map gnus-mime-button-map)) - gnus-callback gnus-mm-display-part - gnus-part ,gnus-tmp-id - article-type annotation - gnus-data ,handle)) - (setq e (point)) - (widget-convert-button - 'link b e - :mime-handle handle - :action 'gnus-widget-press-button - :button-keymap gnus-mime-button-map - :help-echo - (lambda (widget/window &optional overlay pos) - ;; Needed to properly clear the message due to a bug in - ;; wid-edit (XEmacs only). - (if (boundp 'help-echo-owns-message) - (setq help-echo-owns-message t)) - (format - "%S: %s the MIME part; %S: more options" - (aref gnus-mouse-2 0) - ;; XEmacs will get a single widget arg; Emacs 21 will get - ;; window, overlay, position. - (if (mm-handle-displayed-p - (if overlay - (with-current-buffer (gnus-overlay-buffer overlay) - (widget-get (widget-at (gnus-overlay-start overlay)) - :mime-handle)) - (widget-get widget/window :mime-handle))) - "hide" "show") - (aref gnus-down-mouse-3 0)))))) - -(defun gnus-widget-press-button (elems el) - (goto-char (widget-get elems :from)) - (gnus-article-press-button)) - -(defvar gnus-displaying-mime nil) - -(defun gnus-display-mime (&optional ihandles) - "Display the MIME parts." - (save-excursion - (save-selected-window - (let ((window (get-buffer-window gnus-article-buffer)) - (point (point))) - (when window - (select-window window) - ;; We have to do this since selecting the window - ;; may change the point. So we set the window point. - (set-window-point window point))) - (let* ((handles (or ihandles (mm-dissect-buffer) (mm-uu-dissect))) - buffer-read-only handle name type b e display) - (when (and (not ihandles) - (not gnus-displaying-mime)) - ;; Top-level call; we clean up. - (when gnus-article-mime-handles - (mm-destroy-parts gnus-article-mime-handles) - (setq gnus-article-mime-handle-alist nil));; A trick. - (setq gnus-article-mime-handles handles) - ;; We allow users to glean info from the handles. - (when gnus-article-mime-part-function - (gnus-mime-part-function handles))) - (if (and handles - (or (not (stringp (car handles))) - (cdr handles))) - (progn - (when (and (not ihandles) - (not gnus-displaying-mime)) - ;; Clean up for mime parts. - (article-goto-body) - (delete-region (point) (point-max))) - (let ((gnus-displaying-mime t)) - (gnus-mime-display-part handles))) - (save-restriction - (article-goto-body) - (narrow-to-region (point) (point-max)) - (gnus-treat-article nil 1 1) - (widen))) - (unless ihandles - ;; Highlight the headers. - (save-excursion - (save-restriction - (article-goto-body) - (narrow-to-region (point-min) (point)) - (gnus-treat-article 'head)))))))) - -(defvar gnus-mime-display-multipart-as-mixed nil) -(defvar gnus-mime-display-multipart-alternative-as-mixed nil) -(defvar gnus-mime-display-multipart-related-as-mixed nil) - -(defun gnus-mime-display-part (handle) - (cond - ;; Single part. - ((not (stringp (car handle))) - (gnus-mime-display-single handle)) - ;; User-defined multipart - ((cdr (assoc (car handle) gnus-mime-multipart-functions)) - (funcall (cdr (assoc (car handle) gnus-mime-multipart-functions)) - handle)) - ;; multipart/alternative - ((and (equal (car handle) "multipart/alternative") - (not (or gnus-mime-display-multipart-as-mixed - gnus-mime-display-multipart-alternative-as-mixed))) - (let ((id (1+ (length gnus-article-mime-handle-alist)))) - (push (cons id handle) gnus-article-mime-handle-alist) - (gnus-mime-display-alternative (cdr handle) nil nil id))) - ;; multipart/related - ((and (equal (car handle) "multipart/related") - (not (or gnus-mime-display-multipart-as-mixed - gnus-mime-display-multipart-related-as-mixed))) - ;;;!!!We should find the start part, but we just default - ;;;!!!to the first part. - ;;(gnus-mime-display-part (cadr handle)) - ;;;!!! Most multipart/related is an HTML message plus images. - ;;;!!! Unfortunately we are unable to let W3 display those - ;;;!!! included images, so we just display it as a mixed multipart. - ;;(gnus-mime-display-mixed (cdr handle)) - ;;;!!! No, w3 can display everything just fine. - (gnus-mime-display-part (cadr handle))) - ((equal (car handle) "multipart/signed") - (or (memq 'signed gnus-article-wash-types) - (push 'signed gnus-article-wash-types)) - (gnus-mime-display-security handle)) - ((equal (car handle) "multipart/encrypted") - (or (memq 'encrypted gnus-article-wash-types) - (push 'encrypted gnus-article-wash-types)) - (gnus-mime-display-security handle)) - ;; Other multiparts are handled like multipart/mixed. - (t - (gnus-mime-display-mixed (cdr handle))))) - -(defun gnus-mime-part-function (handles) - (if (stringp (car handles)) - (mapcar 'gnus-mime-part-function (cdr handles)) - (funcall gnus-article-mime-part-function handles))) - -(defun gnus-mime-display-mixed (handles) - (mapcar 'gnus-mime-display-part handles)) - -(defun gnus-mime-display-single (handle) - (let ((type (mm-handle-media-type handle)) - (ignored gnus-ignored-mime-types) - (not-attachment t) - (move nil) - display text) - (catch 'ignored - (progn - (while ignored - (when (string-match (pop ignored) type) - (throw 'ignored nil))) - (if (and (setq not-attachment - (and (not (mm-inline-override-p handle)) - (or (not (mm-handle-disposition handle)) - (equal (car (mm-handle-disposition handle)) - "inline") - (mm-attachment-override-p handle)))) - (mm-automatic-display-p handle) - (or (and - (mm-inlinable-p handle) - (mm-inlined-p handle)) - (mm-automatic-external-display-p type))) - (setq display t) - (when (equal (mm-handle-media-supertype handle) "text") - (setq text t))) - (let ((id (1+ (length gnus-article-mime-handle-alist))) - beg) - (push (cons id handle) gnus-article-mime-handle-alist) - (when (or (not display) - (not (gnus-unbuttonized-mime-type-p type))) - ;(gnus-article-insert-newline) - (gnus-insert-mime-button - handle id (list (or display (and not-attachment text)))) - (gnus-article-insert-newline) - ;(gnus-article-insert-newline) - ;; Remember modify the number of forward lines. - (setq move t)) - (setq beg (point)) - (cond - (display - (when move - (forward-line -1) - (setq beg (point))) - (let ((mail-parse-charset gnus-newsgroup-charset) - (mail-parse-ignored-charsets - (save-excursion (condition-case () - (set-buffer gnus-summary-buffer) - (error)) - gnus-newsgroup-ignored-charsets))) - (mm-display-part handle t)) - (goto-char (point-max))) - ((and text not-attachment) - (when move - (forward-line -1) - (setq beg (point))) - (gnus-article-insert-newline) - (mm-insert-inline handle (mm-get-part handle)) - (goto-char (point-max)))) - ;; Do highlighting. - (save-excursion - (save-restriction - (narrow-to-region beg (point)) - (gnus-treat-article - nil id - (gnus-article-mime-total-parts) - (mm-handle-media-type handle))))))))) - -(defun gnus-unbuttonized-mime-type-p (type) - "Say whether TYPE is to be unbuttonized." - (unless gnus-inhibit-mime-unbuttonizing - (catch 'found - (let ((types gnus-unbuttonized-mime-types)) - (while types - (when (string-match (pop types) type) - (throw 'found t))))))) - -(defun gnus-article-insert-newline () - "Insert a newline, but mark it as undeletable." - (gnus-put-text-property - (point) (progn (insert "\n") (point)) 'gnus-undeletable t)) - -(defun gnus-mime-display-alternative (handles &optional preferred ibegend id) - (let* ((preferred (or preferred (mm-preferred-alternative handles))) - (ihandles handles) - (point (point)) - handle buffer-read-only from props begend not-pref) - (save-window-excursion - (save-restriction - (when ibegend - (narrow-to-region (car ibegend) - (or (cdr ibegend) - (progn - (goto-char (car ibegend)) - (forward-line 2) - (point)))) - (delete-region (point-min) (point-max)) - (mm-remove-parts handles)) - (setq begend (list (point-marker))) - ;; Do the toggle. - (unless (setq not-pref (cadr (member preferred ihandles))) - (setq not-pref (car ihandles))) - (when (or ibegend - (not preferred) - (not (gnus-unbuttonized-mime-type-p - "multipart/alternative"))) - (gnus-add-text-properties - (setq from (point)) - (progn - (insert (format "%d. " id)) - (point)) - `(gnus-callback - (lambda (handles) - (unless ,(not ibegend) - (setq gnus-article-mime-handle-alist - ',gnus-article-mime-handle-alist)) - (gnus-mime-display-alternative - ',ihandles ',not-pref ',begend ,id)) - ,@(if (>= (string-to-number emacs-version) 21) - nil ;; XEmacs doesn't care - (list 'local-map gnus-mime-button-map)) - ,gnus-mouse-face-prop ,gnus-article-mouse-face - face ,gnus-article-button-face - keymap ,gnus-mime-button-map - gnus-part ,id - gnus-data ,handle)) - (widget-convert-button 'link from (point) - :action 'gnus-widget-press-button - :button-keymap gnus-widget-button-keymap) - ;; Do the handles - (while (setq handle (pop handles)) - (gnus-add-text-properties - (setq from (point)) - (progn - (insert (format "(%c) %-18s" - (if (equal handle preferred) ?* ? ) - (mm-handle-media-type handle))) - (point)) - `(gnus-callback - (lambda (handles) - (unless ,(not ibegend) - (setq gnus-article-mime-handle-alist - ',gnus-article-mime-handle-alist)) - (gnus-mime-display-alternative - ',ihandles ',handle ',begend ,id)) - ,@(if (>= (string-to-number emacs-version) 21) - nil ;; XEmacs doesn't care - (list 'local-map gnus-mime-button-map)) - ,gnus-mouse-face-prop ,gnus-article-mouse-face - face ,gnus-article-button-face - keymap ,gnus-mime-button-map - gnus-part ,id - gnus-data ,handle)) - (widget-convert-button 'link from (point) - :action 'gnus-widget-press-button - :button-keymap gnus-widget-button-keymap) - (insert " ")) - (insert "\n\n")) - (when preferred - (if (stringp (car preferred)) - (gnus-display-mime preferred) - (let ((mail-parse-charset gnus-newsgroup-charset) - (mail-parse-ignored-charsets - (save-excursion (set-buffer gnus-summary-buffer) - gnus-newsgroup-ignored-charsets))) - (mm-display-part preferred) - ;; Do highlighting. - (save-excursion - (save-restriction - (narrow-to-region (car begend) (point-max)) - (gnus-treat-article - nil (length gnus-article-mime-handle-alist) - (gnus-article-mime-total-parts) - (mm-handle-media-type handle)))))) - (goto-char (point-max)) - (setcdr begend (point-marker))))) - (when ibegend - (goto-char point)))) - -(defun gnus-article-wash-status () - "Return a string which display status of article washing." - (save-excursion - (set-buffer gnus-article-buffer) - (let ((cite (memq 'cite gnus-article-wash-types)) - (headers (memq 'headers gnus-article-wash-types)) - (boring (memq 'boring-headers gnus-article-wash-types)) - (pgp (memq 'pgp gnus-article-wash-types)) - (pem (memq 'pem gnus-article-wash-types)) - (signed (memq 'signed gnus-article-wash-types)) - (encrypted (memq 'encrypted gnus-article-wash-types)) - (signature (memq 'signature gnus-article-wash-types)) - (overstrike (memq 'overstrike gnus-article-wash-types)) - (emphasis (memq 'emphasis gnus-article-wash-types))) - (format "%c%c%c%c%c%c%c" - (if cite ?c ? ) - (if (or headers boring) ?h ? ) - (if (or pgp pem signed encrypted) ?p ? ) - (if signature ?s ? ) - (if overstrike ?o ? ) - (if gnus-show-mime ?m ? ) - (if emphasis ?e ? ))))) - -(defalias 'gnus-article-hide-headers-if-wanted 'gnus-article-maybe-hide-headers) - -(defun gnus-article-maybe-hide-headers () - "Hide unwanted headers if `gnus-have-all-headers' is nil. -Provided for backwards compatibility." - (when (and (or (not (gnus-buffer-live-p gnus-summary-buffer)) - (not (save-excursion (set-buffer gnus-summary-buffer) - gnus-have-all-headers))) - (not gnus-inhibit-hiding)) - (gnus-article-hide-headers))) - -;;; Article savers. - -(defun gnus-output-to-file (file-name) - "Append the current article to a file named FILE-NAME." - (let ((artbuf (current-buffer))) - (with-temp-buffer - (insert-buffer-substring artbuf) - ;; Append newline at end of the buffer as separator, and then - ;; save it to file. - (goto-char (point-max)) - (insert "\n") - (let ((file-name-coding-system nnmail-pathname-coding-system) - (pathname-coding-system nnmail-pathname-coding-system)) - (write-region-as-binary (point-min) (point-max) file-name 'append)) - t))) - -(defun gnus-narrow-to-page (&optional arg) - "Narrow the article buffer to a page. -If given a numerical ARG, move forward ARG pages." - (interactive "P") - (setq arg (if arg (prefix-numeric-value arg) 0)) - (save-excursion - (set-buffer gnus-article-buffer) - (goto-char (point-min)) - (widen) - ;; Remove any old next/prev buttons. - (when (gnus-visual-p 'page-marker) - (let ((buffer-read-only nil)) - (gnus-remove-text-with-property 'gnus-prev) - (gnus-remove-text-with-property 'gnus-next))) - (when - (cond ((< arg 0) - (re-search-backward page-delimiter nil 'move (1+ (abs arg)))) - ((> arg 0) - (re-search-forward page-delimiter nil 'move arg))) - (goto-char (match-end 0))) - (narrow-to-region - (point) - (if (re-search-forward page-delimiter nil 'move) - (match-beginning 0) - (point))) - (when (and (gnus-visual-p 'page-marker) - (not (= (point-min) 1))) - (save-excursion - (goto-char (point-min)) - (gnus-insert-prev-page-button))) - (when (and (gnus-visual-p 'page-marker) - (< (+ (point-max) 2) (buffer-size))) - (save-excursion - (goto-char (point-max)) - (gnus-insert-next-page-button))))) - -;; Article mode commands - -(defun gnus-article-goto-next-page () - "Show the next page of the article." - (interactive) - (when (gnus-article-next-page) - (goto-char (point-min)) - (gnus-article-read-summary-keys nil (gnus-character-to-event ?n)))) - -(defun gnus-article-goto-prev-page () - "Show the next page of the article." - (interactive) - (if (bobp) (gnus-article-read-summary-keys nil (gnus-character-to-event ?p)) - (gnus-article-prev-page nil))) - -(defun gnus-article-next-page (&optional lines) - "Show the next page of the current article. -If end of article, return non-nil. Otherwise return nil. -Argument LINES specifies lines to be scrolled up." - (interactive "p") - (let ((start (window-start)) - end-of-buffer end-of-page) - (save-excursion - (move-to-window-line -1) - (if (<= (point) start) - (progn - (forward-line 2) - (setq start (point))) - (forward-line 1) - (setq start nil)) - (unless (or (cond ((eq (1+ (buffer-size)) (point)) - (and (pos-visible-in-window-p) - (setq end-of-buffer t))) - ((eobp) - (setq end-of-page t))) - (not lines)) - (move-to-window-line lines) - (unless (search-backward "\n\n" nil t) - (setq start (point))))) - (cond (end-of-buffer t) - (end-of-page - (gnus-narrow-to-page 1) - nil) - (t - (if start - (set-window-start (selected-window) start) - (let (window-pixel-scroll-increment) - (scroll-up lines))) - nil)))) - -(defun gnus-article-prev-page (&optional lines) - "Show previous page of current article. -Argument LINES specifies lines to be scrolled down." - (interactive "p") - (let (beginning-of-buffer beginning-of-page) - (save-excursion - (move-to-window-line 0) - (cond ((eq 1 (point)) - (setq beginning-of-buffer t)) - ((bobp) - (setq beginning-of-page t)))) - (cond (beginning-of-buffer) - (beginning-of-page - (gnus-narrow-to-page -1)) - (t - (condition-case nil - (let (window-pixel-scroll-increment) - (scroll-down lines)) - (beginning-of-buffer - (goto-char (point-min)))))))) - -(defun gnus-article-refer-article () - "Read article specified by message-id around point." - (interactive) - (let ((point (point))) - (search-forward ">" nil t) ;Move point to end of "<....>". - (if (re-search-backward "\\(<[^<> \t\n]+>\\)" nil t) - (let ((message-id (match-string 1))) - (goto-char point) - (set-buffer gnus-summary-buffer) - (gnus-summary-refer-article message-id)) - (goto-char (point)) - (error "No references around point")))) - -(defun gnus-article-show-summary () - "Reconfigure windows to show summary buffer." - (interactive) - (if (not (gnus-buffer-live-p gnus-summary-buffer)) - (error "There is no summary buffer for this article buffer") - (gnus-article-set-globals) - (gnus-configure-windows 'article) - (gnus-summary-goto-subject gnus-current-article) - (gnus-summary-position-point))) - -(defun gnus-article-describe-briefly () - "Describe article mode commands briefly." - (interactive) - (gnus-message 6 (substitute-command-keys "\\\\[gnus-article-goto-next-page]:Next page \\[gnus-article-goto-prev-page]:Prev page \\[gnus-article-show-summary]:Show summary \\[gnus-info-find-node]:Run Info \\[gnus-article-describe-briefly]:This help"))) - -(defun gnus-article-summary-command () - "Execute the last keystroke in the summary buffer." - (interactive) - (let ((obuf (current-buffer)) - (owin (current-window-configuration)) - func) - (switch-to-buffer gnus-article-current-summary 'norecord) - (setq func (lookup-key (current-local-map) (this-command-keys))) - (call-interactively func) - (set-buffer obuf) - (set-window-configuration owin) - (set-window-point (get-buffer-window (current-buffer)) (point)))) - -(defun gnus-article-summary-command-nosave () - "Execute the last keystroke in the summary buffer." - (interactive) - (let (func) - (pop-to-buffer gnus-article-current-summary 'norecord) - (setq func (lookup-key (current-local-map) (this-command-keys))) - (call-interactively func))) - -(defun gnus-article-check-buffer () - "Beep if not in an article buffer." - (unless (eq (get-buffer gnus-article-buffer) (current-buffer)) - (error "Command invoked outside of a Gnus article buffer"))) - -(defun gnus-article-read-summary-keys (&optional arg key not-restore-window) - "Read a summary buffer key sequence and execute it from the article buffer." - (interactive "P") - (gnus-article-check-buffer) - (let ((nosaves - '("q" "Q" "c" "r" "R" "\C-c\C-f" "m" "a" "f" "F" - "Zc" "ZC" "ZE" "ZJ" "ZQ" "ZZ" "Zn" "ZR" "ZG" "ZN" "ZP" - "=" "^" "\M-^" "|")) - (nosave-but-article - '("A\r")) - (nosave-in-article - '("\C-d")) - (up-to-top - '("n" "Gn" "p" "Gp")) - keys new-sum-point) - (save-excursion - (set-buffer gnus-article-current-summary) - (let (gnus-pick-mode) - (push (or key last-command-event) unread-command-events) - (setq keys (static-if (featurep 'xemacs) - (events-to-keys (read-key-sequence nil)) - (read-key-sequence nil))))) - (message "") - - (if (or (member keys nosaves) - (member keys nosave-but-article) - (member keys nosave-in-article)) - (let (func) - (save-window-excursion - (pop-to-buffer gnus-article-current-summary 'norecord) - ;; We disable the pick minor mode commands. - (let (gnus-pick-mode) - (setq func (lookup-key (current-local-map) keys)))) - (if (or (not func) - (numberp func)) - (ding) - (unless (member keys nosave-in-article) - (set-buffer gnus-article-current-summary)) - (call-interactively func) - (setq new-sum-point (point))) - (when (member keys nosave-but-article) - (pop-to-buffer gnus-article-buffer 'norecord))) - ;; These commands should restore window configuration. - (let ((obuf (current-buffer)) - (owin (current-window-configuration)) - (opoint (point)) - (summary gnus-article-current-summary) - func in-buffer selected) - (if not-restore-window - (pop-to-buffer summary 'norecord) - (switch-to-buffer summary 'norecord)) - (setq in-buffer (current-buffer)) - ;; We disable the pick minor mode commands. - (if (and (setq func (let (gnus-pick-mode) - (lookup-key (current-local-map) keys))) - (functionp func)) - (progn - (call-interactively func) - (setq new-sum-point (point)) - (when (eq in-buffer (current-buffer)) - (setq selected (gnus-summary-select-article)) - (set-buffer obuf) - (unless not-restore-window - (set-window-configuration owin)) - (when (eq selected 'old) - (article-goto-body) - (set-window-start (get-buffer-window (current-buffer)) - 1) - (set-window-point (get-buffer-window (current-buffer)) - (point))) - (let ((win (get-buffer-window gnus-article-current-summary))) - (when win - (set-window-point win new-sum-point)))) ) - (switch-to-buffer gnus-article-buffer) - (ding)))))) - -(defun gnus-article-describe-key (key) - "Display documentation of the function invoked by KEY. KEY is a string." - (interactive "kDescribe key: ") - (gnus-article-check-buffer) - (if (eq (key-binding key) 'gnus-article-read-summary-keys) - (save-excursion - (set-buffer gnus-article-current-summary) - (let (gnus-pick-mode) - (if (featurep 'xemacs) - (progn - (push (elt key 0) unread-command-events) - (setq key (events-to-keys - (read-key-sequence "Describe key: ")))) - (setq unread-command-events - (mapcar - (lambda (x) (if (>= x 128) (list 'meta (- x 128)) x)) - key)) - (setq key (read-key-sequence "Describe key: ")))) - (describe-key key)) - (describe-key key))) - -(defun gnus-article-describe-key-briefly (key &optional insert) - "Display documentation of the function invoked by KEY. KEY is a string." - (interactive "kDescribe key: \nP") - (gnus-article-check-buffer) - (if (eq (key-binding key) 'gnus-article-read-summary-keys) - (save-excursion - (set-buffer gnus-article-current-summary) - (let (gnus-pick-mode) - (if (featurep 'xemacs) - (progn - (push (elt key 0) unread-command-events) - (setq key (events-to-keys - (read-key-sequence "Describe key: ")))) - (setq unread-command-events - (mapcar - (lambda (x) (if (>= x 128) (list 'meta (- x 128)) x)) - key)) - (setq key (read-key-sequence "Describe key: ")))) - (describe-key-briefly key insert)) - (describe-key-briefly key insert))) - -(defun gnus-article-hide (&optional arg force) - "Hide all the gruft in the current article. -This means that PGP stuff, signatures, cited text and (some) -headers will be hidden. -If given a prefix, show the hidden text instead." - (interactive (append (gnus-article-hidden-arg) (list 'force))) - (gnus-article-hide-headers arg) - (gnus-article-hide-list-identifiers arg) - (gnus-article-hide-pgp arg) - (gnus-article-hide-citation-maybe arg force) - (gnus-article-hide-signature arg)) - -(defun gnus-article-maybe-highlight () - "Do some article highlighting if article highlighting is requested." - (when (gnus-visual-p 'article-highlight 'highlight) - (gnus-article-highlight-some))) - -(defun gnus-check-group-server () - ;; Make sure the connection to the server is alive. - (unless (gnus-server-opened - (gnus-find-method-for-group gnus-newsgroup-name)) - (gnus-check-server (gnus-find-method-for-group gnus-newsgroup-name)) - (gnus-request-group gnus-newsgroup-name t))) - -(defun gnus-request-article-this-buffer (article group) - "Get an article and insert it into this buffer. -T-gnus change: Insert an article into `gnus-original-article-buffer'." - (let (do-update-line sparse-header) - ;; The current buffer is `gnus-article-buffer'. - (prog1 - (save-excursion - (erase-buffer) - (gnus-kill-all-overlays) - (setq group (or group gnus-newsgroup-name)) - - ;; Using `gnus-request-article' directly will insert the article into - ;; `nntp-server-buffer' - so we'll save some time by not having to - ;; copy it from the server buffer into the article buffer. - - ;; We only request an article by message-id when we do not have the - ;; headers for it, so we'll have to get those. - (when (stringp article) - (gnus-read-header article)) - - ;; If the article number is negative, that means that this article - ;; doesn't belong in this newsgroup (possibly), so we find its - ;; message-id and request it by id instead of number. - (when (and (numberp article) - gnus-summary-buffer - (get-buffer gnus-summary-buffer) - (gnus-buffer-exists-p gnus-summary-buffer)) - (save-excursion - (set-buffer gnus-summary-buffer) - (let ((header (gnus-summary-article-header article))) - (when (< article 0) - (cond - ((memq article gnus-newsgroup-sparse) - ;; This is a sparse gap article. - (setq do-update-line article) - (setq article (mail-header-id header)) - (setq sparse-header (gnus-read-header article)) - (setq gnus-newsgroup-sparse - (delq article gnus-newsgroup-sparse))) - ((vectorp header) - ;; It's a real article. - (setq article (mail-header-id header))) - (t - ;; It is an extracted pseudo-article. - (setq article 'pseudo) - (gnus-request-pseudo-article header)))) - - (let ((method (gnus-find-method-for-group - gnus-newsgroup-name))) - (when (and (eq (car method) 'nneething) - (vectorp header)) - (let ((dir (expand-file-name - (mail-header-subject header) - (file-name-as-directory - (or (cadr (assq 'nneething-address method)) - (nth 1 method)))))) - (when (file-directory-p dir) - (setq article 'nneething) - (gnus-group-enter-directory dir)))))))) - (setq gnus-original-article (cons group article)) - - (set-buffer gnus-original-article-buffer) - (cond - ;; Refuse to select canceled articles. - ((and (numberp article) - gnus-summary-buffer - (get-buffer gnus-summary-buffer) - (gnus-buffer-exists-p gnus-summary-buffer) - (eq (cdr (save-excursion - (set-buffer gnus-summary-buffer) - (assq article gnus-newsgroup-reads))) - gnus-canceled-mark)) - nil) - ;; Check the backlog. - ((and gnus-keep-backlog - (gnus-backlog-request-article group article (current-buffer))) - 'article) - ;; Check asynchronous pre-fetch. - ((gnus-async-request-fetched-article group article (current-buffer)) - (gnus-async-prefetch-next group article gnus-summary-buffer) - (when (and (numberp article) gnus-keep-backlog) - (gnus-backlog-enter-article group article (current-buffer))) - 'article) - ;; Check the cache. - ((and gnus-use-cache - (numberp article) - (gnus-cache-request-article article group)) - 'article) - ;; Get the article and put into the article buffer. - ((or (stringp article) - (numberp article)) - (let ((gnus-override-method gnus-override-method) - (methods (and (stringp article) - gnus-refer-article-method)) - result - (buffer-read-only nil)) - (if (or (not (listp methods)) - (and (symbolp (car methods)) - (assq (car methods) nnoo-definition-alist))) - (setq methods (list methods))) - (when (and (null gnus-override-method) - methods) - (setq gnus-override-method (pop methods))) - (while (not result) - (when (eq gnus-override-method 'current) - (setq gnus-override-method gnus-current-select-method)) - (erase-buffer) - (gnus-kill-all-overlays) - (let ((gnus-newsgroup-name group)) - (gnus-check-group-server)) - (when (gnus-request-article article group (current-buffer)) - (when (numberp article) - (gnus-async-prefetch-next group article - gnus-summary-buffer) - (when gnus-keep-backlog - (gnus-backlog-enter-article - group article (current-buffer)))) - (setq result 'article)) - (if (not result) - (if methods - (setq gnus-override-method (pop methods)) - (setq result 'done)))) - (and (eq result 'article) 'article))) - ;; It was a pseudo. - (t article))) - - ;; Associate this article with the current summary buffer. - (setq gnus-article-current-summary gnus-summary-buffer) - - ;; Decode charsets. - (run-hooks 'gnus-article-decode-hook) - ;; Mark article as decoded or not. - (setq gnus-article-decoded-p gnus-article-decode-hook) - - ;; Update sparse articles. - (when (and do-update-line - (or (numberp article) - (stringp article))) - (let ((buf (current-buffer))) - (set-buffer gnus-summary-buffer) - (gnus-summary-update-article do-update-line sparse-header) - (gnus-summary-goto-subject do-update-line nil t) - (set-window-point (get-buffer-window (current-buffer) t) - (point)) - (set-buffer buf)))))) - -;;; -;;; Article editing -;;; - -(defcustom gnus-article-edit-mode-hook nil - "Hook run in article edit mode buffers." - :group 'gnus-article-various - :type 'hook) - -(defcustom gnus-article-edit-article-setup-function - 'gnus-article-mime-edit-article-setup - "Function called to setup an editing article buffer." - :group 'gnus-article-various - :type 'function) - -(defvar gnus-article-edit-done-function nil) - -(defvar gnus-article-edit-mode-map nil) - -;; Should we be using derived.el for this? -(unless gnus-article-edit-mode-map - (setq gnus-article-edit-mode-map (make-sparse-keymap)) - (set-keymap-parent gnus-article-edit-mode-map text-mode-map) - - (gnus-define-keys gnus-article-edit-mode-map - "\C-c\C-c" gnus-article-edit-done - "\C-c\C-k" gnus-article-edit-exit) - - (gnus-define-keys (gnus-article-edit-wash-map - "\C-c\C-w" gnus-article-edit-mode-map) - "f" gnus-article-edit-full-stops)) - -(define-derived-mode gnus-article-edit-mode text-mode "Article Edit" - "Major mode for editing articles. -This is an extended text-mode. - -\\{gnus-article-edit-mode-map}" - (make-local-variable 'gnus-article-edit-done-function) - (make-local-variable 'gnus-prev-winconf) - (set (make-local-variable 'font-lock-defaults) - '(message-font-lock-keywords t)) - (setq buffer-read-only nil) - (buffer-enable-undo) - (widen)) - -(defun gnus-article-edit (&optional force) - "Edit the current article. -This will have permanent effect only in mail groups. -If FORCE is non-nil, allow editing of articles even in read-only -groups." - (interactive "P") - (when (and (not force) - (gnus-group-read-only-p)) - (error "The current newsgroup does not support article editing")) - (gnus-article-date-original) - (gnus-article-edit-article - 'ignore - `(lambda (no-highlight) - 'ignore - (gnus-summary-edit-article-done - ,(or (mail-header-references gnus-current-headers) "") - ,(gnus-group-read-only-p) ,gnus-summary-buffer no-highlight)))) - -(defun gnus-article-edit-article (start-func exit-func) - "Start editing the contents of the current article buffer." - (let ((winconf (current-window-configuration))) - (set-buffer gnus-article-buffer) - (gnus-article-edit-mode) - (funcall start-func) - (set-buffer-modified-p nil) - (gnus-configure-windows 'edit-article) - (setq gnus-article-edit-done-function exit-func) - (setq gnus-prev-winconf winconf) - (when gnus-article-edit-article-setup-function - (funcall gnus-article-edit-article-setup-function)) - (gnus-message 6 "C-c C-c to end edits; C-c C-k to exit"))) - -(defun gnus-article-edit-done (&optional arg) - "Update the article edits and exit." - (interactive "P") - (let ((func gnus-article-edit-done-function) - (buf (current-buffer)) - (start (window-start))) - (remove-hook 'gnus-article-mode-hook - 'gnus-article-mime-edit-article-unwind) - ;; We remove all text props from the article buffer. - (let ((content - (buffer-substring-no-properties (point-min) (point-max))) - (p (point))) - (erase-buffer) - (insert content) - (let ((winconf gnus-prev-winconf)) - (gnus-article-mode) - (set-window-configuration winconf) - ;; Tippy-toe some to make sure that point remains where it was. - (save-current-buffer - (set-buffer buf) - (set-window-start (get-buffer-window (current-buffer)) start) - (goto-char p)))) - (save-excursion - (set-buffer buf) - (let ((buffer-read-only nil)) - (funcall func arg)) - ;; The cache and backlog have to be flushed somewhat. - (when gnus-keep-backlog - (gnus-backlog-remove-article - (car gnus-article-current) (cdr gnus-article-current))) - ;; Flush original article as well. - (save-excursion - (when (get-buffer gnus-original-article-buffer) - (set-buffer gnus-original-article-buffer) - (setq gnus-original-article nil))) - (when gnus-use-cache - (gnus-cache-update-article - (car gnus-article-current) (cdr gnus-article-current)))) - (set-buffer buf) - (set-window-start (get-buffer-window buf) start) - (set-window-point (get-buffer-window buf) (point)))) - -(defun gnus-article-edit-exit () - "Exit the article editing without updating." - (interactive) - (when (or (not (buffer-modified-p)) - (yes-or-no-p "Article modified; kill anyway? ")) - (let ((curbuf (current-buffer)) - (p (point)) - (window-start (window-start))) - (erase-buffer) - (if (gnus-buffer-live-p gnus-original-article-buffer) - (insert-buffer gnus-original-article-buffer)) - (let ((winconf gnus-prev-winconf)) - (gnus-article-mode) - (set-window-configuration winconf) - ;; Tippy-toe some to make sure that point remains where it was. - (save-current-buffer - (set-buffer curbuf) - (set-window-start (get-buffer-window (current-buffer)) window-start) - (goto-char p)))))) - -(defun gnus-article-edit-full-stops () - "Interactively repair spacing at end of sentences." - (interactive) - (save-excursion - (goto-char (point-min)) - (search-forward-regexp "^$" nil t) - (let ((case-fold-search nil)) - (query-replace-regexp "\\([.!?][])}]* \\)\\([[({A-Z]\\)" "\\1 \\2")))) - -;;; -;;; Article editing with MIME-Edit -;;; - -(defcustom gnus-article-mime-edit-article-setup-hook nil - "Hook run after setting up a MIME editing article buffer." - :group 'gnus-article-various - :type 'hook) - -(defun gnus-article-mime-edit-article-unwind () - "Unwind `gnus-article-buffer' if article editing was given up." - (remove-hook 'gnus-article-mode-hook 'gnus-article-mime-edit-article-unwind) - (when (featurep 'font-lock) - (setq font-lock-defaults nil) - (font-lock-mode -1)) - (when mime-edit-mode-flag - (mime-edit-exit 'nomime 'no-error) - (message ""))) - -(defun gnus-article-mime-edit-article-setup () - "Convert current buffer to MIME-Edit buffer and turn on MIME-Edit mode -after replacing with the original article." - (setq gnus-show-mime t) - (setq gnus-article-edit-done-function - `(lambda (&rest args) - (when mime-edit-mode-flag - (let (mime-edit-insert-user-agent-field) - (mime-edit-exit)) - (message "")) - (goto-char (point-min)) - (let (case-fold-search) - (when (re-search-forward - (format "^%s$" (regexp-quote mail-header-separator)) - nil t) - (replace-match ""))) - (apply ,gnus-article-edit-done-function args) - (insert - (prog1 - (buffer-substring-no-properties (point-min) (point-max)) - (set-buffer (get-buffer-create gnus-original-article-buffer)) - (erase-buffer))) - (setq gnus-current-headers (gnus-article-make-full-mail-header)) - (set-buffer gnus-article-buffer) - (gnus-article-prepare-display))) - (substitute-key-definition 'gnus-article-edit-done - 'gnus-article-mime-edit-done - gnus-article-edit-mode-map) - (substitute-key-definition 'gnus-article-edit-exit - 'gnus-article-mime-edit-exit - gnus-article-edit-mode-map) - (erase-buffer) - (insert-buffer gnus-original-article-buffer) - (let ((ofn (symbol-function 'mime-edit-decode-single-part-in-buffer))) - (fset 'mime-edit-decode-single-part-in-buffer - (lambda (&rest args) - (if (let ((content-type (car args))) - (and (eq 'message (mime-content-type-primary-type - content-type)) - (eq 'rfc822 (mime-content-type-subtype content-type)))) - (setcar (cdr args) 'not-decode-text)) - (apply ofn args))) - (unwind-protect - (mime-edit-again) - (fset 'mime-edit-decode-single-part-in-buffer ofn))) - (when (featurep 'font-lock) - (set (make-local-variable 'font-lock-defaults) - '(message-font-lock-keywords t)) - (font-lock-set-defaults) - (turn-on-font-lock)) - (set-buffer-modified-p nil) - (delete-other-windows) - (add-hook 'gnus-article-mode-hook 'gnus-article-mime-edit-article-unwind) - (gnus-run-hooks 'gnus-article-mime-edit-article-setup-hook)) - -(defun gnus-article-mime-edit-done (&optional arg) - "Update the article MIME edits and exit." - (interactive "P") - (when (featurep 'font-lock) - (setq font-lock-defaults nil) - (font-lock-mode -1)) - (gnus-article-edit-done arg)) - -(defun gnus-article-mime-edit-exit () - "Exit the article MIME editing without updating." - (interactive) - (when (or (not (buffer-modified-p)) - (yes-or-no-p "Article modified; kill anyway? ")) - (when (featurep 'font-lock) - (setq font-lock-defaults nil) - (font-lock-mode -1)) - (when mime-edit-mode-flag - (let (mime-edit-insert-user-agent-field) - (mime-edit-exit)) - (message "")) - (goto-char (point-min)) - (let (case-fold-search) - (when (re-search-forward - (format "^%s$" (regexp-quote mail-header-separator)) nil t) - (replace-match ""))) - (let ((winconf gnus-prev-winconf)) - (insert (prog1 - (buffer-substring-no-properties (point-min) (point-max)) - (set-buffer (get-buffer-create gnus-original-article-buffer)) - (erase-buffer))) - (setq gnus-current-headers (gnus-article-make-full-mail-header)) - (set-buffer gnus-article-buffer) - (gnus-article-prepare-display) - (set-window-configuration winconf)))) - -;;; -;;; Article highlights -;;; - -;; Written by Per Abrahamsen . - -;;; Internal Variables: - -(defcustom gnus-button-url-regexp "\\b\\(\\(www\\.\\|\\(s?https?\\|ftp\\|file\\|gopher\\|news\\|telnet\\|wais\\|mailto\\|info\\):\\)\\(//[-a-zA-Z0-9_.]+:[0-9]*\\)?\\([-a-zA-Z0-9_=!?#$@~`%&*+|\\/:;.,]\\|\\w\\)+\\([-a-zA-Z0-9_=#$@~`%&*+|\\/]\\|\\w\\)\\)" - "Regular expression that matches URLs." - :group 'gnus-article-buttons - :type 'regexp) - -(defcustom gnus-button-alist - `(("<\\(url:[>\n\t ]*?\\)?\\(nntp\\|news\\):[>\n\t ]*\\([^>\n\t ]*@[^>\n\t ]*\\)>" - 0 t gnus-button-handle-news 3) - ("\\b\\(nntp\\|news\\):\\([^>\n\t ]*@[^>)!;:,\n\t ]*\\)" 0 t - gnus-button-handle-news 2) - ("\\(\\b<\\(url:[>\n\t ]*\\)?news:[>\n\t ]*\\(//\\)?\\([^>\n\t ]*\\)>\\)" - 1 t - gnus-button-fetch-group 4) - ("\\bnews:\\(//\\)?\\([^'\">\n\t ]+\\)" 0 t gnus-button-fetch-group 2) - ("\\bin\\( +article\\| +message\\)? +\\(<\\([^\n @<>]+@[^\n @<>]+\\)>\\)" 2 - t gnus-button-message-id 3) - ("\\( \n\t]+\\)>" 0 t gnus-url-mailto 2) - ("mailto:\\([-a-zA-Z.@_+0-9%=?]+\\)" 0 t gnus-url-mailto 1) - ("\\bmailto:\\([^ \n\t]+\\)" 0 t gnus-url-mailto 1) - ;; This is info - ("\\binfo:\\(//\\)?\\([^'\">\n\t ]+\\)" 0 t - gnus-button-handle-info 2) - ;; This is how URLs _should_ be embedded in text... - ("]*\\)>" 0 t gnus-button-embedded-url 1) - ;; Raw URLs. - (,gnus-button-url-regexp 0 t browse-url 0)) - "*Alist of regexps matching buttons in article bodies. - -Each entry has the form (REGEXP BUTTON FORM CALLBACK PAR...), where -REGEXP: is the string matching text around the button, -BUTTON: is the number of the regexp grouping actually matching the button, -FORM: is a lisp expression which must eval to true for the button to -be added, -CALLBACK: is the function to call when the user push this button, and each -PAR: is a number of a regexp grouping whose text will be passed to CALLBACK. - -CALLBACK can also be a variable, in that case the value of that -variable it the real callback function." - :group 'gnus-article-buttons - :type '(repeat (list regexp - (integer :tag "Button") - (sexp :tag "Form") - (function :tag "Callback") - (repeat :tag "Par" - :inline t - (integer :tag "Regexp group"))))) - -(defcustom gnus-header-button-alist - `(("^\\(References\\|Message-I[Dd]\\):" "<[^<>]+>" - 0 t gnus-button-message-id 0) - ("^\\(From\\|Reply-To\\):" ": *\\(.+\\)$" 1 t gnus-button-reply 1) - ("^\\(Cc\\|To\\):" "[^ \t\n<>,()\"]+@[^ \t\n<>,()\"]+" - 0 t gnus-button-mailto 0) - ("^X-[Uu][Rr][Ll]:" ,gnus-button-url-regexp 0 t browse-url 0) - ("^Subject:" ,gnus-button-url-regexp 0 t browse-url 0) - ("^[^:]+:" ,gnus-button-url-regexp 0 t browse-url 0) - ("^[^:]+:" "\\(<\\(url: \\)?news:\\([^>\n ]*\\)>\\)" 1 t - gnus-button-message-id 3)) - "*Alist of headers and regexps to match buttons in article heads. - -This alist is very similar to `gnus-button-alist', except that each -alist has an additional HEADER element first in each entry: - -\(HEADER REGEXP BUTTON FORM CALLBACK PAR) - -HEADER is a regexp to match a header. For a fuller explanation, see -`gnus-button-alist'." - :group 'gnus-article-buttons - :group 'gnus-article-headers - :type '(repeat (list (regexp :tag "Header") - regexp - (integer :tag "Button") - (sexp :tag "Form") - (function :tag "Callback") - (repeat :tag "Par" - :inline t - (integer :tag "Regexp group"))))) - -(defvar gnus-button-regexp nil) -(defvar gnus-button-marker-list nil) -;; Regexp matching any of the regexps from `gnus-button-alist'. - -(defvar gnus-button-last nil) -;; The value of `gnus-button-alist' when `gnus-button-regexp' was build. - -;;; Commands: - -(defun gnus-article-push-button (event) - "Check text under the mouse pointer for a callback function. -If the text under the mouse pointer has a `gnus-callback' property, -call it with the value of the `gnus-data' text property." - (interactive "e") - (set-buffer (window-buffer (posn-window (event-start event)))) - (let* ((pos (posn-point (event-start event))) - (data (get-text-property pos 'gnus-data)) - (fun (get-text-property pos 'gnus-callback))) - (goto-char pos) - (when fun - (funcall fun data)))) - -(defun gnus-article-press-button () - "Check text at point for a callback function. -If the text at point has a `gnus-callback' property, -call it with the value of the `gnus-data' text property." - (interactive) - (let* ((data (get-text-property (point) 'gnus-data)) - (fun (get-text-property (point) 'gnus-callback))) - (when fun - (funcall fun data)))) - -(defun gnus-article-prev-button (n) - "Move point to N buttons backward. -If N is negative, move forward instead." - (interactive "p") - (gnus-article-next-button (- n))) - -(defun gnus-article-next-button (n) - "Move point to N buttons forward. -If N is negative, move backward instead." - (interactive "p") - (let ((function (if (< n 0) 'previous-single-property-change - 'next-single-property-change)) - (inhibit-point-motion-hooks t) - (backward (< n 0)) - (limit (if (< n 0) (point-min) (point-max)))) - (setq n (abs n)) - (while (and (not (= limit (point))) - (> n 0)) - ;; Skip past the current button. - (when (get-text-property (point) 'gnus-callback) - (goto-char (funcall function (point) 'gnus-callback nil limit))) - ;; Go to the next (or previous) button. - (gnus-goto-char (funcall function (point) 'gnus-callback nil limit)) - ;; Put point at the start of the button. - (when (and backward (not (get-text-property (point) 'gnus-callback))) - (goto-char (funcall function (point) 'gnus-callback nil limit))) - ;; Skip past intangible buttons. - (when (get-text-property (point) 'intangible) - (incf n)) - (decf n)) - (unless (zerop n) - (gnus-message 5 "No more buttons")) - n)) - -(defun gnus-article-highlight (&optional force) - "Highlight current article. -This function calls `gnus-article-highlight-headers', -`gnus-article-highlight-citation', -`gnus-article-highlight-signature', and `gnus-article-add-buttons' to -do the highlighting. See the documentation for those functions." - (interactive (list 'force)) - (gnus-article-highlight-headers) - (gnus-article-highlight-citation force) - (gnus-article-highlight-signature) - (gnus-article-add-buttons force) - (gnus-article-add-buttons-to-head)) - -(defun gnus-article-highlight-some (&optional force) - "Highlight current article. -This function calls `gnus-article-highlight-headers', -`gnus-article-highlight-signature', and `gnus-article-add-buttons' to -do the highlighting. See the documentation for those functions." - (interactive (list 'force)) - (gnus-article-highlight-headers) - (gnus-article-highlight-signature) - (gnus-article-add-buttons)) - -(defun gnus-article-highlight-headers () - "Highlight article headers as specified by `gnus-header-face-alist'." - (interactive) - (save-excursion - (set-buffer gnus-article-buffer) - (save-restriction - (let ((alist gnus-header-face-alist) - (buffer-read-only nil) - (case-fold-search t) - (inhibit-point-motion-hooks t) - entry regexp header-face field-face from hpoints fpoints) - (article-narrow-to-head) - (while (setq entry (pop alist)) - (goto-char (point-min)) - (setq regexp (concat "^\\(" - (if (string-equal "" (nth 0 entry)) - "[^\t ]" - (nth 0 entry)) - "\\)") - header-face (nth 1 entry) - field-face (nth 2 entry)) - (while (and (re-search-forward regexp nil t) - (not (eobp))) - (beginning-of-line) - (setq from (point)) - (unless (search-forward ":" nil t) - (forward-char 1)) - (when (and header-face - (not (memq (point) hpoints))) - (push (point) hpoints) - (gnus-put-text-property from (point) 'face header-face)) - (when (and field-face - (not (memq (setq from (point)) fpoints))) - (push from fpoints) - (if (re-search-forward "^[^ \t]" nil t) - (forward-char -2) - (goto-char (point-max))) - (gnus-put-text-property from (point) 'face field-face)))))))) - -(defun gnus-article-highlight-signature () - "Highlight the signature in an article. -It does this by highlighting everything after -`gnus-signature-separator' using `gnus-signature-face'." - (interactive) - (when gnus-signature-face - (save-excursion - (set-buffer gnus-article-buffer) - (let ((buffer-read-only nil) - (inhibit-point-motion-hooks t)) - (save-restriction - (when (gnus-article-narrow-to-signature) - (gnus-overlay-put (gnus-make-overlay (point-min) (point-max)) - 'face gnus-signature-face))))))) - -(defun gnus-article-buttonize-signature () - "Add button to the signature." - (interactive) - (save-excursion - (set-buffer gnus-article-buffer) - (let ((buffer-read-only nil) - (inhibit-point-motion-hooks t)) - (when (gnus-article-search-signature) - (gnus-article-add-button (match-beginning 0) (match-end 0) - 'gnus-signature-toggle - (set-marker (make-marker) - (1+ (match-end 0)))))))) - -(defun gnus-button-in-region-p (b e prop) - "Say whether PROP exists in the region." - (text-property-not-all b e prop nil)) - -(defun gnus-article-add-buttons (&optional force) - "Find external references in the article and make buttons of them. -\"External references\" are things like Message-IDs and URLs, as -specified by `gnus-button-alist'." - (interactive (list 'force)) - (save-excursion - (set-buffer gnus-article-buffer) - (let ((buffer-read-only nil) - (inhibit-point-motion-hooks t) - (case-fold-search t) - (alist gnus-button-alist) - beg entry regexp) - ;; Remove all old markers. - (let (marker entry new-list) - (while (setq marker (pop gnus-button-marker-list)) - (if (or (< marker (point-min)) (>= marker (point-max))) - (push marker new-list) - (goto-char marker) - (when (setq entry (gnus-button-entry)) - (put-text-property (match-beginning (nth 1 entry)) - (match-end (nth 1 entry)) - 'gnus-callback nil)) - (set-marker marker nil))) - (setq gnus-button-marker-list new-list)) - ;; We skip the headers. - (article-goto-body) - (setq beg (point)) - (while (setq entry (pop alist)) - (setq regexp (car entry)) - (goto-char beg) - (while (re-search-forward regexp nil t) - (let* ((start (and entry (match-beginning (nth 1 entry)))) - (end (and entry (match-end (nth 1 entry)))) - (from (match-beginning 0))) - (when (and (or (eq t (nth 2 entry)) - (eval (nth 2 entry))) - (not (gnus-button-in-region-p - start end 'gnus-callback))) - ;; That optional form returned non-nil, so we add the - ;; button. - (gnus-article-add-button - start end 'gnus-button-push - (car (push (set-marker (make-marker) from) - gnus-button-marker-list)))))))))) - -;; Add buttons to the head of an article. -(defun gnus-article-add-buttons-to-head () - "Add buttons to the head of the article." - (interactive) - (save-excursion - (set-buffer gnus-article-buffer) - (save-restriction - (let ((buffer-read-only nil) - (inhibit-point-motion-hooks t) - (case-fold-search t) - (alist gnus-header-button-alist) - entry beg end) - (article-narrow-to-head) - (while alist - ;; Each alist entry. - (setq entry (car alist) - alist (cdr alist)) - (goto-char (point-min)) - (while (re-search-forward (car entry) nil t) - ;; Each header matching the entry. - (setq beg (match-beginning 0)) - (setq end (or (and (re-search-forward "^[^ \t]" nil t) - (match-beginning 0)) - (point-max))) - (goto-char beg) - (while (re-search-forward (nth 1 entry) end t) - ;; Each match within a header. - (let* ((entry (cdr entry)) - (start (match-beginning (nth 1 entry))) - (end (match-end (nth 1 entry))) - (form (nth 2 entry))) - (goto-char (match-end 0)) - (when (eval form) - (gnus-article-add-button - start end (nth 3 entry) - (buffer-substring (match-beginning (nth 4 entry)) - (match-end (nth 4 entry))))))) - (goto-char end))))))) - -;;; External functions: - -(defun gnus-article-add-button (from to fun &optional data) - "Create a button between FROM and TO with callback FUN and data DATA." - (when gnus-article-button-face - (gnus-overlay-put (gnus-make-overlay from to) - 'face gnus-article-button-face)) - (gnus-add-text-properties - from to - (nconc (and gnus-article-mouse-face - (list gnus-mouse-face-prop gnus-article-mouse-face)) - (list 'gnus-callback fun) - (and data (list 'gnus-data data)))) - (widget-convert-button 'link from to :action 'gnus-widget-press-button - ;; Quote `:button-keymap' for Mule 2.3 - ;; but it won't work. - ':button-keymap gnus-widget-button-keymap)) - -;;; Internal functions: - -(defun gnus-article-set-globals () - (save-excursion - (set-buffer gnus-summary-buffer) - (gnus-set-global-variables))) - -(defun gnus-signature-toggle (end) - (save-excursion - (set-buffer gnus-article-buffer) - (let ((buffer-read-only nil) - (inhibit-point-motion-hooks t) - (limit (next-single-property-change end 'mime-view-entity - nil (point-max)))) - (if (text-property-any end limit 'article-type 'signature) - (gnus-remove-text-properties-when - 'article-type 'signature end limit - (cons 'article-type (cons 'signature - gnus-hidden-properties))) - (gnus-add-text-properties-when - 'article-type nil end limit - (cons 'article-type (cons 'signature - gnus-hidden-properties))))))) - -(defun gnus-button-entry () - ;; Return the first entry in `gnus-button-alist' matching this place. - (let ((alist gnus-button-alist) - (entry nil)) - (while alist - (setq entry (pop alist)) - (if (looking-at (car entry)) - (setq alist nil) - (setq entry nil))) - entry)) - -(defun gnus-button-push (marker) - ;; Push button starting at MARKER. - (save-excursion - (goto-char marker) - (let* ((entry (gnus-button-entry)) - (inhibit-point-motion-hooks t) - (fun (nth 3 entry)) - (args (mapcar (lambda (group) - (let ((string (match-string group))) - (gnus-set-text-properties - 0 (length string) nil string) - string)) - (nthcdr 4 entry)))) - (cond - ((fboundp fun) - (apply fun args)) - ((and (boundp fun) - (fboundp (symbol-value fun))) - (apply (symbol-value fun) args)) - (t - (gnus-message 1 "You must define `%S' to use this button" - (cons fun args))))))) - -(defun gnus-parse-news-url (url) - (let (scheme server group message-id articles) - (with-temp-buffer - (insert url) - (goto-char (point-min)) - (when (looking-at "\\([A-Za-z]+\\):") - (setq scheme (match-string 1)) - (goto-char (match-end 0))) - (when (looking-at "//\\([^/]+\\)/") - (setq server (match-string 1)) - (goto-char (match-end 0))) - - (cond - ((looking-at "\\(.*@.*\\)") - (setq message-id (match-string 1))) - ((looking-at "\\([^/]+\\)/\\([-0-9]+\\)") - (setq group (match-string 1) - articles (split-string (match-string 2) "-"))) - ((looking-at "\\([^/]+\\)/?") - (setq group (match-string 1))) - (t - (error "Unknown news URL syntax")))) - (list scheme server group message-id articles))) - -(defun gnus-button-handle-news (url) - "Fetch a news URL." - (destructuring-bind (scheme server group message-id articles) - (gnus-parse-news-url url) - (cond - (message-id - (save-excursion - (set-buffer gnus-summary-buffer) - (if server - (let ((gnus-refer-article-method (list (list 'nntp server)))) - (gnus-summary-refer-article message-id)) - (gnus-summary-refer-article message-id)))) - (group - (gnus-button-fetch-group url))))) - -(defun gnus-button-handle-info (url) - "Fetch an info URL." - (if (string-match - "^\\([^:/]+\\)?/\\(.*\\)" - url) - (gnus-info-find-node - (concat "(" (or (gnus-url-unhex-string (match-string 1 url)) - "Gnus") - ")" - (gnus-url-unhex-string (match-string 2 url)))) - (error "Can't parse %s" url))) - -(defun gnus-button-message-id (message-id) - "Fetch MESSAGE-ID." - (save-excursion - (set-buffer gnus-summary-buffer) - (gnus-summary-refer-article message-id))) - -(defun gnus-button-fetch-group (address) - "Fetch GROUP specified by ADDRESS." - (if (not (string-match "[:/]" address)) - ;; This is just a simple group url. - (gnus-group-read-ephemeral-group address gnus-select-method) - (if (not - (string-match - "^\\([^:/]+\\)\\(:\\([^/]+\\)\\)?/\\([^/]+\\)\\(/\\([0-9]+\\)\\)?" - address)) - (error "Can't parse %s" address) - (gnus-group-read-ephemeral-group - (match-string 4 address) - `(nntp ,(match-string 1 address) - (nntp-address ,(match-string 1 address)) - (nntp-port-number ,(if (match-end 3) - (match-string 3 address) - "nntp"))) - nil nil nil - (and (match-end 6) (list (string-to-int (match-string 6 address)))))))) - -(defun gnus-url-parse-query-string (query &optional downcase) - (let (retval pairs cur key val) - (setq pairs (split-string query "&")) - (while pairs - (setq cur (car pairs) - pairs (cdr pairs)) - (if (not (string-match "=" cur)) - nil ; Grace - (setq key (gnus-url-unhex-string (substring cur 0 (match-beginning 0))) - val (gnus-url-unhex-string (substring cur (match-end 0) nil))) - (if downcase - (setq key (downcase key))) - (setq cur (assoc key retval)) - (if cur - (setcdr cur (cons val (cdr cur))) - (setq retval (cons (list key val) retval))))) - retval)) - -(defun gnus-url-unhex (x) - (if (> x ?9) - (if (>= x ?a) - (+ 10 (- x ?a)) - (+ 10 (- x ?A))) - (- x ?0))) - -(defun gnus-url-unhex-string (str &optional allow-newlines) - "Remove %XXX embedded spaces, etc in a url. -If optional second argument ALLOW-NEWLINES is non-nil, then allow the -decoding of carriage returns and line feeds in the string, which is normally -forbidden in URL encoding." - (setq str (or (nnheader-replace-chars-in-string str ?+ ? ) "")) - (let ((tmp "") - (case-fold-search t)) - (while (string-match "%[0-9a-f][0-9a-f]" str) - (let* ((start (match-beginning 0)) - (ch1 (gnus-url-unhex (elt str (+ start 1)))) - (code (+ (* 16 ch1) - (gnus-url-unhex (elt str (+ start 2)))))) - (setq tmp (concat - tmp (substring str 0 start) - (cond - (allow-newlines - (char-to-string code)) - ((or (= code ?\n) (= code ?\r)) - " ") - (t (char-to-string code)))) - str (substring str (match-end 0))))) - (setq tmp (concat tmp str)) - tmp)) - -(defun gnus-url-mailto (url) - ;; Send mail to someone - (when (string-match "mailto:/*\\(.*\\)" url) - (setq url (substring url (match-beginning 1) nil))) - (let (to args subject func) - (if (string-match (regexp-quote "?") url) - (setq to (gnus-url-unhex-string (substring url 0 (match-beginning 0))) - args (gnus-url-parse-query-string - (substring url (match-end 0) nil) t)) - (setq to (gnus-url-unhex-string url))) - (setq args (cons (list "to" to) args) - subject (cdr-safe (assoc "subject" args))) - (gnus-msg-mail) - (while args - (setq func (intern-soft (concat "message-goto-" (downcase (caar args))))) - (if (fboundp func) - (funcall func) - (message-position-on-field (caar args))) - (insert (mapconcat 'identity (cdar args) ", ")) - (setq args (cdr args))) - (if subject - (message-goto-body) - (message-goto-subject)))) - -(defun gnus-button-embedded-url (address) - "Activate ADDRESS with `browse-url'." - (browse-url (gnus-strip-whitespace address))) - -(eval-when-compile - ;; Silence the byte-compiler. - (autoload 'smiley-toggle-buffer "gnus-bitmap")) -(defun gnus-article-smiley-display () - "Display \"smileys\" as small graphical icons." - (smiley-toggle-buffer 1 (current-buffer) (point-min) (point-max))) - -;;; Next/prev buttons in the article buffer. - -(defvar gnus-next-page-line-format "%{%(Next page...%)%}\n") -(defvar gnus-prev-page-line-format "%{%(Previous page...%)%}\n") - -(defvar gnus-prev-page-map nil) -(unless gnus-prev-page-map - (setq gnus-prev-page-map (make-sparse-keymap)) - (define-key gnus-prev-page-map gnus-mouse-2 'gnus-button-prev-page) - (define-key gnus-prev-page-map "\r" 'gnus-button-prev-page)) - -(static-if (featurep 'xemacs) - (defun gnus-insert-prev-page-button () - (let ((buffer-read-only nil)) - (gnus-eval-format - gnus-prev-page-line-format nil - `(gnus-prev t local-map ,gnus-prev-page-map - gnus-callback gnus-article-button-prev-page - article-type annotation)))) - (defun gnus-insert-prev-page-button () - (let ((buffer-read-only nil) - (situation (get-text-property (point-min) 'mime-view-situation))) - (set-keymap-parent gnus-prev-page-map (current-local-map)) - (gnus-eval-format - gnus-prev-page-line-format nil - `(gnus-prev t local-map ,gnus-prev-page-map - gnus-callback gnus-article-button-prev-page - article-type annotation - mime-view-situation ,situation)))) - ) - -(defvar gnus-next-page-map nil) -(unless gnus-next-page-map - (setq gnus-next-page-map (make-sparse-keymap)) - (define-key gnus-next-page-map gnus-mouse-2 'gnus-button-next-page) - (define-key gnus-next-page-map "\r" 'gnus-button-next-page)) - -(defun gnus-button-next-page () - "Go to the next page." - (interactive) - (let ((win (selected-window))) - (select-window (get-buffer-window gnus-article-buffer t)) - (gnus-article-next-page) - (select-window win))) - -(defun gnus-button-prev-page () - "Go to the prev page." - (interactive) - (let ((win (selected-window))) - (select-window (get-buffer-window gnus-article-buffer t)) - (gnus-article-prev-page) - (select-window win))) - -(static-if (featurep 'xemacs) - (defun gnus-insert-next-page-button () - (let ((buffer-read-only nil)) - (gnus-eval-format gnus-next-page-line-format nil - `(gnus-next - t local-map ,gnus-next-page-map - gnus-callback gnus-article-button-next-page - article-type annotation)))) - (defun gnus-insert-next-page-button () - (let ((buffer-read-only nil) - (situation (get-text-property (point-min) 'mime-view-situation))) - (set-keymap-parent gnus-next-page-map (current-local-map)) - (gnus-eval-format gnus-next-page-line-format nil - `(gnus-next - t local-map ,gnus-next-page-map - gnus-callback gnus-article-button-next-page - article-type annotation - mime-view-situation ,situation)))) - ) - -(defun gnus-article-button-next-page (arg) - "Go to the next page." - (interactive "P") - (let ((win (selected-window))) - (select-window (get-buffer-window gnus-article-buffer t)) - (gnus-article-next-page) - (select-window win))) - -(defun gnus-article-button-prev-page (arg) - "Go to the prev page." - (interactive "P") - (let ((win (selected-window))) - (select-window (get-buffer-window gnus-article-buffer t)) - (gnus-article-prev-page) - (select-window win))) - -(defvar gnus-decode-header-methods - '(mail-decode-encoded-word-region) - "List of methods used to decode headers. - -This variable is a list of FUNCTION or (REGEXP . FUNCTION). If item -is FUNCTION, FUNCTION will be apply to all newsgroups. If item is a -(REGEXP . FUNCTION), FUNCTION will be only apply to thes newsgroups -whose names match REGEXP. - -For example: -((\"chinese\" . gnus-decode-encoded-word-region-by-guess) - mail-decode-encoded-word-region - (\"chinese\" . rfc1843-decode-region)) -") - -(defvar gnus-decode-header-methods-cache nil) - -(defun gnus-multi-decode-header (start end) - "Apply the functions from `gnus-encoded-word-methods' that match." - (unless (and gnus-decode-header-methods-cache - (eq gnus-newsgroup-name - (car gnus-decode-header-methods-cache))) - (setq gnus-decode-header-methods-cache (list gnus-newsgroup-name)) - (mapcar (lambda (x) - (if (symbolp x) - (nconc gnus-decode-header-methods-cache (list x)) - (if (and gnus-newsgroup-name - (string-match (car x) gnus-newsgroup-name)) - (nconc gnus-decode-header-methods-cache - (list (cdr x)))))) - gnus-decode-header-methods)) - (let ((xlist gnus-decode-header-methods-cache)) - (pop xlist) - (save-restriction - (narrow-to-region start end) - (while xlist - (funcall (pop xlist) (point-min) (point-max)))))) - -;;; -;;; Treatment top-level handling. -;;; - -(defun gnus-treat-article (condition &optional part-number total-parts type) - (let ((length (- (point-max) (point-min))) - (alist gnus-treatment-function-alist) - (article-goto-body-goes-to-point-min-p t) - (treated-type - (or (not type) - (catch 'found - (let ((list gnus-article-treat-types)) - (while list - (when (string-match (pop list) type) - (throw 'found t))))))) - (highlightp (gnus-visual-p 'article-highlight 'highlight)) - (entity (static-unless (featurep 'xemacs) - (when (eq 'head condition) - (get-text-property (point-min) 'mime-view-entity)))) - val elem buttonized) - (gnus-run-hooks 'gnus-part-display-hook) - (unless gnus-inhibit-treatment - (while (setq elem (pop alist)) - (setq val - (save-excursion - (if (gnus-buffer-live-p gnus-summary-buffer) - (set-buffer gnus-summary-buffer)) - (symbol-value (car elem)))) - (when (and (or (consp val) - treated-type) - (gnus-treat-predicate val) - (or (not (get (car elem) 'highlight)) - highlightp)) - (when (and (not buttonized) - (memq (car elem) - '(gnus-treat-hide-signature - gnus-treat-highlight-signature))) - (gnus-article-buttonize-signature) - (setq buttonized t)) - (save-restriction - (funcall (cadr elem))))) - ;; FSF Emacsen does not inherit the existing text properties - ;; in the new text, so we should do it for `mime-view-entity'. - (static-unless (featurep 'xemacs) - (when entity - (put-text-property (point-min) (point-max) - 'mime-view-entity entity)))))) - -;; Dynamic variables. -(eval-when-compile - (defvar part-number) - (defvar total-parts) - (defvar type) - (defvar condition) - (defvar length)) - -(defun gnus-treat-predicate (val) - (cond - ((null val) - nil) - ((and (listp val) - (stringp (car val))) - (apply 'gnus-or (mapcar `(lambda (s) - (string-match s ,(or gnus-newsgroup-name ""))) - val))) - ((listp val) - (let ((pred (pop val))) - (cond - ((eq pred 'or) - (apply 'gnus-or (mapcar 'gnus-treat-predicate val))) - ((eq pred 'and) - (apply 'gnus-and (mapcar 'gnus-treat-predicate val))) - ((eq pred 'not) - (not (gnus-treat-predicate (car val)))) - ((eq pred 'typep) - (equal (car val) type)) - (t - (error "%S is not a valid predicate" pred))))) - ((eq val 'mime) - gnus-show-mime) - (condition - (eq condition val)) - ((eq val t) - t) - ((eq val 'head) - nil) - ((eq val 'last) - (eq part-number total-parts)) - ((numberp val) - (< length val)) - (t - (error "%S is not a valid value" val)))) - -(defun gnus-article-encrypt-body (protocol &optional n) - "Encrypt the article body." - (interactive - (list - (or gnus-article-encrypt-protocol - (completing-read "Encrypt protocol: " - gnus-article-encrypt-protocol-alist - nil t)) - current-prefix-arg)) - (let ((func (cdr (assoc protocol gnus-article-encrypt-protocol-alist)))) - (unless func - (error (format "Can't find the encrypt protocol %s" protocol))) - (if (equal gnus-newsgroup-name "nndraft:drafts") - (error "Can't encrypt the article in group nndraft:drafts")) - (if (equal gnus-newsgroup-name "nndraft:queue") - (error "Don't encrypt the article in group nndraft:queue")) - (gnus-summary-iterate n - (save-excursion - (set-buffer gnus-summary-buffer) - (let ((mail-parse-charset gnus-newsgroup-charset) - (mail-parse-ignored-charsets gnus-newsgroup-ignored-charsets) - (summary-buffer gnus-summary-buffer) - references point) - (gnus-set-global-variables) - (when (gnus-group-read-only-p) - (error "The current newsgroup does not support article encrypt")) - (gnus-summary-show-article t) - (setq references - (or (mail-header-references gnus-current-headers) "")) - (set-buffer gnus-article-buffer) - (let* ((buffer-read-only nil) - (headers - (mapcar (lambda (field) - (and (save-restriction - (message-narrow-to-head) - (goto-char (point-min)) - (search-forward field nil t)) - (prog2 - (message-narrow-to-field) - (buffer-substring (point-min) (point-max)) - (delete-region (point-min) (point-max)) - (widen)))) - '("Content-Type:" "Content-Transfer-Encoding:" - "Content-Disposition:")))) - (message-narrow-to-head) - (message-remove-header "MIME-Version") - (goto-char (point-max)) - (setq point (point)) - (insert (apply 'concat headers)) - (widen) - (narrow-to-region point (point-max)) - (let ((message-options message-options)) - (message-options-set 'message-sender user-mail-address) - (message-options-set 'message-recipients user-mail-address) - (message-options-set 'message-sign-encrypt 'not) - (funcall func)) - (goto-char (point-min)) - (insert "MIME-Version: 1.0\n") - (widen) - (gnus-summary-edit-article-done - references nil summary-buffer t)) - (when gnus-keep-backlog - (gnus-backlog-remove-article - (car gnus-article-current) (cdr gnus-article-current))) - (save-excursion - (when (get-buffer gnus-original-article-buffer) - (set-buffer gnus-original-article-buffer) - (setq gnus-original-article nil))) - (when gnus-use-cache - (gnus-cache-update-article - (car gnus-article-current) (cdr gnus-article-current)))))))) - -(defvar gnus-mime-security-button-line-format "%{%([[%t:%i]%D]%)%}\n" - "The following specs can be used: -%t The security MIME type -%i Additional info -%d Details -%D Details if button is pressed") - -(defvar gnus-mime-security-button-end-line-format "%{%([[End of %t]%D]%)%}\n" - "The following specs can be used: -%t The security MIME type -%i Additional info -%d Details -%D Details if button is pressed") - -(defvar gnus-mime-security-button-line-format-alist - '((?t gnus-tmp-type ?s) - (?i gnus-tmp-info ?s) - (?d gnus-tmp-details ?s) - (?D gnus-tmp-pressed-details ?s))) - -(defvar gnus-mime-security-button-map - (let ((map (make-sparse-keymap))) - (unless (>= (string-to-number emacs-version) 21) - (set-keymap-parent map gnus-article-mode-map)) - (define-key map gnus-mouse-2 'gnus-article-push-button) - (define-key map "\r" 'gnus-article-press-button) - map)) - -(defvar gnus-mime-security-details-buffer nil) - -(defvar gnus-mime-security-button-pressed nil) - -(defvar gnus-mime-security-show-details-inline t - "If non-nil, show details in the article buffer.") - -(defun gnus-mime-security-verify-or-decrypt (handle) - (mm-remove-parts (cdr handle)) - (let ((region (mm-handle-multipart-ctl-parameter handle 'gnus-region)) - point buffer-read-only) - (if region - (goto-char (car region))) - (save-restriction - (narrow-to-region (point) (point)) - (with-current-buffer (mm-handle-multipart-original-buffer handle) - (let* ((mm-verify-option 'known) - (mm-decrypt-option 'known) - (nparts (mm-possibly-verify-or-decrypt (cdr handle) handle))) - (unless (eq nparts (cdr handle)) - (mm-destroy-parts (cdr handle)) - (setcdr handle nparts)))) - (setq point (point)) - (gnus-mime-display-security handle) - (goto-char (point-max))) - (when region - (delete-region (point) (cdr region)) - (set-marker (car region) nil) - (set-marker (cdr region) nil)) - (goto-char point))) - -(defun gnus-mime-security-show-details (handle) - (let ((details (mm-handle-multipart-ctl-parameter handle 'gnus-details))) - (if details - (if gnus-mime-security-show-details-inline - (let ((gnus-mime-security-button-pressed t) - (gnus-mime-security-button-line-format - (get-text-property (point) 'gnus-line-format)) - buffer-read-only) - (forward-char -1) - (while (eq (get-text-property (point) 'gnus-line-format) - gnus-mime-security-button-line-format) - (forward-char -1)) - (forward-char) - (save-restriction - (narrow-to-region (point) (point)) - (gnus-insert-mime-security-button handle)) - (delete-region (point) - (or (text-property-not-all - (point) (point-max) - 'gnus-line-format - gnus-mime-security-button-line-format) - (point-max)))) - (if (gnus-buffer-live-p gnus-mime-security-details-buffer) - (with-current-buffer gnus-mime-security-details-buffer - (erase-buffer) - t) - (setq gnus-mime-security-details-buffer - (gnus-get-buffer-create "*MIME Security Details*"))) - (with-current-buffer gnus-mime-security-details-buffer - (insert details) - (goto-char (point-min))) - (pop-to-buffer gnus-mime-security-details-buffer)) - (gnus-message 5 "No details.")))) - -(defun gnus-mime-security-press-button (handle) - (if (mm-handle-multipart-ctl-parameter handle 'gnus-info) - (gnus-mime-security-show-details handle) - (gnus-mime-security-verify-or-decrypt handle))) - -(defun gnus-insert-mime-security-button (handle &optional displayed) - (let* ((protocol (mm-handle-multipart-ctl-parameter handle 'protocol)) - (gnus-tmp-type - (concat - (or (nth 2 (assoc protocol mm-verify-function-alist)) - (nth 2 (assoc protocol mm-decrypt-function-alist)) - "Unknown") - (if (equal (car handle) "multipart/signed") - " Signed" " Encrypted") - " Part")) - (gnus-tmp-info - (or (mm-handle-multipart-ctl-parameter handle 'gnus-info) - "Undecided")) - (gnus-tmp-details - (mm-handle-multipart-ctl-parameter handle 'gnus-details)) - gnus-tmp-pressed-details - b e) - (setq gnus-tmp-details - (if gnus-tmp-details - (concat "\n" gnus-tmp-details) "")) - (setq gnus-tmp-pressed-details - (if gnus-mime-security-button-pressed gnus-tmp-details "")) - (unless (bolp) - (insert "\n")) - (setq b (point)) - (gnus-eval-format - gnus-mime-security-button-line-format - gnus-mime-security-button-line-format-alist - `(keymap ,gnus-mime-security-button-map - ,@(if (>= (string-to-number emacs-version) 21) - nil ;; XEmacs doesn't care - (list 'local-map gnus-mime-security-button-map)) - gnus-callback gnus-mime-security-press-button - gnus-line-format ,gnus-mime-security-button-line-format - article-type annotation - gnus-data ,handle)) - (setq e (point)) - (widget-convert-button - 'link b e - :mime-handle handle - :action 'gnus-widget-press-button - :button-keymap gnus-mime-security-button-map - :help-echo - (lambda (widget/window &optional overlay pos) - ;; Needed to properly clear the message due to a bug in - ;; wid-edit (XEmacs only). - (if (boundp 'help-echo-owns-message) - (setq help-echo-owns-message t)) - (format - "%S: show detail" - (aref gnus-mouse-2 0)))))) - -(defun gnus-mime-display-security (handle) - (save-restriction - (narrow-to-region (point) (point)) - (unless (gnus-unbuttonized-mime-type-p (car handle)) - (gnus-insert-mime-security-button handle)) - (gnus-mime-display-mixed (cdr handle)) - (unless (bolp) - (insert "\n")) - (unless (gnus-unbuttonized-mime-type-p (car handle)) - (let ((gnus-mime-security-button-line-format - gnus-mime-security-button-end-line-format)) - (gnus-insert-mime-security-button handle))) - (mm-set-handle-multipart-parameter - handle 'gnus-region - (cons (set-marker (make-marker) (point-min)) - (set-marker (make-marker) (point-max)))))) - - -;;; @ for mime-view -;;; - -(defun gnus-article-header-presentation-method (entity situation) - (mime-insert-header entity) - ) - -(set-alist 'mime-header-presentation-method-alist - 'gnus-original-article-mode - #'gnus-article-header-presentation-method) - -(defun gnus-mime-preview-quitting-method () - (mime-preview-kill-buffer) - (delete-other-windows) - (gnus-article-show-summary) - (gnus-summary-select-article gnus-show-all-headers t)) - -(set-alist 'mime-preview-quitting-method-alist - 'gnus-original-article-mode #'gnus-mime-preview-quitting-method) - -(set-alist 'mime-preview-following-method-alist - 'gnus-original-article-mode #'gnus-following-method) - -(set-alist 'mime-preview-over-to-previous-method-alist - 'gnus-original-article-mode - (lambda () - (if (> (point-min) 1) - (gnus-article-prev-page) - (gnus-article-read-summary-keys - nil (gnus-character-to-event ?P))))) - -(set-alist 'mime-preview-over-to-next-method-alist - 'gnus-original-article-mode' - (lambda () - (if (< (point-max) (buffer-size)) - (gnus-article-next-page) - (gnus-article-read-summary-keys - nil (gnus-character-to-event ?N))))) - - -;;; @ end -;;; - -(gnus-ems-redefine) - -(provide 'gnus-art) - -(run-hooks 'gnus-art-load-hook) - -;;; gnus-art.el ends here diff --git a/lisp/gnus-async.el b/lisp/gnus-async.el deleted file mode 100644 index e661658..0000000 --- a/lisp/gnus-async.el +++ /dev/null @@ -1,375 +0,0 @@ -;;; gnus-async.el --- asynchronous support for Gnus -;; Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus) -(require 'gnus-sum) -(require 'nntp) - -(defgroup gnus-asynchronous nil - "Support for asynchronous operations." - :group 'gnus) - -(defcustom gnus-asynchronous nil - "*If nil, inhibit all Gnus asynchronicity. -If non-nil, let the other asynch variables be heeded." - :group 'gnus-asynchronous - :type 'boolean) - -(defcustom gnus-use-article-prefetch 30 - "*If non-nil, prefetch articles in groups that allow this. -If a number, prefetch only that many articles forward; -if t, prefetch as many articles as possible." - :group 'gnus-asynchronous - :type '(choice (const :tag "off" nil) - (const :tag "all" t) - (integer :tag "some" 0))) - -(defcustom gnus-prefetched-article-deletion-strategy '(read exit) - "List of symbols that say when to remove articles from the prefetch buffer. -Possible values in this list are `read', which means that -articles are removed as they are read, and `exit', which means -that all articles belonging to a group are removed on exit -from that group." - :group 'gnus-asynchronous - :type '(set (const read) (const exit))) - -(defcustom gnus-use-header-prefetch nil - "*If non-nil, prefetch the headers to the next group." - :group 'gnus-asynchronous - :type 'boolean) - -(defcustom gnus-async-prefetch-article-p 'gnus-async-unread-p - "Function called to say whether an article should be prefetched or not. -The function is called with one parameter -- the article data. -It should return non-nil if the article is to be prefetched." - :group 'gnus-asynchronous - :type 'function) - -;;; Internal variables. - -(defvar gnus-async-prefetch-article-buffer " *Async Prefetch Article*") -(defvar gnus-async-article-alist nil) -(defvar gnus-async-article-semaphore '(nil)) -(defvar gnus-async-fetch-list nil) -(defvar gnus-async-hashtb nil) -(defvar gnus-async-current-prefetch-group nil) -(defvar gnus-async-current-prefetch-article nil) -(defvar gnus-async-timer nil) - -(defvar gnus-async-prefetch-headers-buffer " *Async Prefetch Headers*") -(defvar gnus-async-header-prefetched nil) - -;;; Utility functions. - -(defun gnus-group-asynchronous-p (group) - "Say whether GROUP is fetched from a server that supports asynchronicity." - (gnus-asynchronous-p (gnus-find-method-for-group group))) - -;;; Somewhat bogus semaphores. - -(defun gnus-async-get-semaphore (semaphore) - "Wait until SEMAPHORE is released." - (while (/= (length (nconc (symbol-value semaphore) (list nil))) 2) - (sleep-for 1))) - -(defun gnus-async-release-semaphore (semaphore) - "Release SEMAPHORE." - (setcdr (symbol-value semaphore) nil)) - -(defmacro gnus-async-with-semaphore (&rest forms) - `(unwind-protect - (progn - (gnus-async-get-semaphore 'gnus-async-article-semaphore) - ,@forms) - (gnus-async-release-semaphore 'gnus-async-article-semaphore))) - -(put 'gnus-async-with-semaphore 'lisp-indent-function 0) -(put 'gnus-async-with-semaphore 'edebug-form-spec '(body)) - -;;; -;;; Article prefetch -;;; - -(gnus-add-shutdown 'gnus-async-close 'gnus) -(defun gnus-async-close () - (gnus-kill-buffer gnus-async-prefetch-article-buffer) - (gnus-kill-buffer gnus-async-prefetch-headers-buffer) - (setq gnus-async-hashtb nil - gnus-async-article-alist nil - gnus-async-header-prefetched nil)) - -(defun gnus-async-set-buffer () - (nnheader-set-temp-buffer gnus-async-prefetch-article-buffer t) - (unless gnus-async-hashtb - (setq gnus-async-hashtb (gnus-make-hashtable 1023)))) - -(defun gnus-async-halt-prefetch () - "Stop prefetching." - (setq gnus-async-fetch-list nil)) - -(defun gnus-async-prefetch-next (group article summary) - "Possibly prefetch several articles starting with the article after ARTICLE." - (when (and (gnus-buffer-live-p summary) - gnus-asynchronous - (gnus-group-asynchronous-p group)) - (save-excursion - (set-buffer gnus-summary-buffer) - (let ((next (caadr (gnus-data-find-list article)))) - (when next - (if (not (fboundp 'run-with-idle-timer)) - ;; This is either an older Emacs or XEmacs, so we - ;; do this, which leads to slightly slower article - ;; buffer display. - (gnus-async-prefetch-article group next summary) - (when gnus-async-timer - (ignore-errors - (nnheader-cancel-timer 'gnus-async-timer))) - (setq gnus-async-timer - (run-with-idle-timer - 0.1 nil 'gnus-async-prefetch-article - group next summary)))))))) - -(defun gnus-async-prefetch-article (group article summary &optional next) - "Possibly prefetch several articles starting with ARTICLE." - (if (not (gnus-buffer-live-p summary)) - (gnus-async-with-semaphore - (setq gnus-async-fetch-list nil)) - (when (and gnus-asynchronous - (gnus-alive-p)) - (when next - (gnus-async-with-semaphore - (pop gnus-async-fetch-list))) - (let ((do-fetch next) - (do-message t)) ;(eq major-mode 'gnus-summary-mode))) - (when (and (gnus-group-asynchronous-p group) - (gnus-buffer-live-p summary) - (or (not next) - gnus-async-fetch-list)) - (gnus-async-with-semaphore - (unless next - (setq do-fetch (not gnus-async-fetch-list)) - ;; Nix out any outstanding requests. - (setq gnus-async-fetch-list nil) - ;; Fill in the new list. - (let ((n gnus-use-article-prefetch) - (data (gnus-data-find-list article)) - d) - (while (and (setq d (pop data)) - (if (numberp n) - (natnump (decf n)) - n)) - (unless (or (gnus-async-prefetched-article-entry - group (setq article (gnus-data-number d))) - (not (natnump article)) - (not (funcall gnus-async-prefetch-article-p d))) - ;; Not already fetched -- so we add it to the list. - (push article gnus-async-fetch-list))) - (setq gnus-async-fetch-list - (nreverse gnus-async-fetch-list)))) - - (when do-fetch - (setq article (car gnus-async-fetch-list)))) - - (when (and do-fetch article) - ;; We want to fetch some more articles. - (save-excursion - (set-buffer summary) - (let (mark) - (gnus-async-set-buffer) - (goto-char (point-max)) - (setq mark (point-marker)) - (let ((nnheader-callback-function - (gnus-make-async-article-function - group article mark summary next)) - (nntp-server-buffer - (get-buffer gnus-async-prefetch-article-buffer))) - (when do-message - (gnus-message 9 "Prefetching article %d in group %s" - article group)) - (setq gnus-async-current-prefetch-group group) - (setq gnus-async-current-prefetch-article article) - (gnus-request-article article group)))))))))) - -(defun gnus-make-async-article-function (group article mark summary next) - "Return a callback function." - `(lambda (arg) - (gnus-async-article-callback arg ,group ,article ,mark ,summary ,next))) - -(defun gnus-async-article-callback (arg group article mark summary next) - "Function called when an async article is done being fetched." - (save-excursion - (setq gnus-async-current-prefetch-article nil) - (when arg - (gnus-async-set-buffer) - (gnus-async-with-semaphore - (setq - gnus-async-article-alist - (cons (list (intern (format "%s-%d" group article) - gnus-async-hashtb) - mark (set-marker (make-marker) (point-max)) - group article) - gnus-async-article-alist)))) - (if (not (gnus-buffer-live-p summary)) - (gnus-async-with-semaphore - (setq gnus-async-fetch-list nil)) - (gnus-async-prefetch-article group next summary t)))) - -(defun gnus-async-unread-p (data) - "Return non-nil if DATA represents an unread article." - (gnus-data-unread-p data)) - -(defun gnus-async-request-fetched-article (group article buffer) - "See whether we have ARTICLE from GROUP and put it in BUFFER." - (when (numberp article) - (when (and (equal group gnus-async-current-prefetch-group) - (eq article gnus-async-current-prefetch-article)) - (gnus-async-wait-for-article article)) - (let ((entry (gnus-async-prefetched-article-entry group article))) - (when entry - (save-excursion - (gnus-async-set-buffer) - (copy-to-buffer buffer (cadr entry) (caddr entry)) - ;; Remove the read article from the prefetch buffer. - (when (memq 'read gnus-prefetched-article-deletion-strategy) - (gnus-async-delete-prefetched-entry entry)) - t))))) - -(defun gnus-async-wait-for-article (article) - "Wait until ARTICLE is no longer the currently-being-fetched article." - (save-excursion - (gnus-async-set-buffer) - (let ((proc (nntp-find-connection (current-buffer))) - (nntp-server-buffer (current-buffer)) - (nntp-have-messaged nil) - (tries 0)) - (condition-case nil - ;; FIXME: we could stop waiting after some - ;; timeout, but this is the wrong place to do it. - ;; rather than checking time-spent-waiting, we - ;; should check time-since-last-output, which - ;; needs to be done in nntp.el. - (while (eq article gnus-async-current-prefetch-article) - (incf tries) - (when (nntp-accept-process-output proc 1) - (setq tries 0)) - (when (and (not nntp-have-messaged) (eq 3 tries)) - (gnus-message 5 "Waiting for async article...") - (setq nntp-have-messaged t))) - (quit - ;; if the user interrupted on a slow/hung connection, - ;; do something friendly. - (when (< 3 tries) - (setq gnus-async-current-prefetch-article nil)) - (signal 'quit nil))) - (when nntp-have-messaged - (gnus-message 5 ""))))) - -(defun gnus-async-delete-prefetched-entry (entry) - "Delete ENTRY from buffer and alist." - (ignore-errors - (delete-region (cadr entry) (caddr entry)) - (set-marker (cadr entry) nil) - (set-marker (caddr entry) nil)) - (gnus-async-with-semaphore - (setq gnus-async-article-alist - (delq entry gnus-async-article-alist)))) - -(defun gnus-async-prefetch-remove-group (group) - "Remove all articles belonging to GROUP from the prefetch buffer." - (when (and (gnus-group-asynchronous-p group) - (memq 'exit gnus-prefetched-article-deletion-strategy)) - (let ((alist gnus-async-article-alist)) - (save-excursion - (gnus-async-set-buffer) - (while alist - (when (equal group (nth 3 (car alist))) - (gnus-async-delete-prefetched-entry (car alist))) - (pop alist)))))) - -(defun gnus-async-prefetched-article-entry (group article) - "Return the entry for ARTICLE in GROUP iff it has been prefetched." - (let ((entry (save-excursion - (gnus-async-set-buffer) - (assq (intern (format "%s-%d" group article) - gnus-async-hashtb) - gnus-async-article-alist)))) - ;; Perhaps something has emptied the buffer? - (if (and entry - (= (cadr entry) (caddr entry))) - (progn - (ignore-errors - (set-marker (cadr entry) nil) - (set-marker (caddr entry) nil)) - (setq gnus-async-article-alist - (delq entry gnus-async-article-alist)) - nil) - entry))) - -;;; -;;; Header prefetch -;;; - -(defun gnus-async-prefetch-headers (group) - "Prefetch the headers for group GROUP." - (save-excursion - (let (unread) - (when (and gnus-use-header-prefetch - gnus-asynchronous - (gnus-group-asynchronous-p group) - (listp gnus-async-header-prefetched) - (setq unread (gnus-list-of-unread-articles group))) - ;; Mark that a fetch is in progress. - (setq gnus-async-header-prefetched t) - (nnheader-set-temp-buffer gnus-async-prefetch-headers-buffer t) - (erase-buffer) - (let ((nntp-server-buffer (current-buffer)) - (nnheader-callback-function - `(lambda (arg) - (setq gnus-async-header-prefetched - ,(cons group unread))))) - (gnus-retrieve-headers unread group gnus-fetch-old-headers)))))) - -(defun gnus-async-retrieve-fetched-headers (articles group) - "See whether we have prefetched headers." - (when (and gnus-use-header-prefetch - (gnus-group-asynchronous-p group) - (listp gnus-async-header-prefetched) - (equal group (car gnus-async-header-prefetched)) - (equal articles (cdr gnus-async-header-prefetched))) - (save-excursion - (nnheader-set-temp-buffer gnus-async-prefetch-headers-buffer t) - (nntp-decode-text) - (copy-to-buffer nntp-server-buffer (point-min) (point-max)) - (erase-buffer) - (setq gnus-async-header-prefetched nil) - t))) - -(provide 'gnus-async) - -;;; gnus-async.el ends here diff --git a/lisp/gnus-audio.el b/lisp/gnus-audio.el deleted file mode 100644 index daa5cf4..0000000 --- a/lisp/gnus-audio.el +++ /dev/null @@ -1,149 +0,0 @@ -;;; gnus-audio.el --- Sound effects for Gnus -;; Copyright (C) 1996, 2000 Free Software Foundation - -;; Author: Steven L. Baur -;; Keywords: news, mail, multimedia - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; This file provides access to sound effects in Gnus. -;; This file is partially stripped to support earcons.el. - -;;; Code: - -(require 'nnheader) - -(defgroup gnus-audio nil - "Playing sound in Gnus." - :version "21.1" - :group 'gnus-visual - :group 'multimedia) - -(defvar gnus-audio-inline-sound - (or (if (fboundp 'device-sound-enabled-p) - (device-sound-enabled-p)) ; XEmacs - (fboundp 'play-sound)) ; Emacs 21 - "Non-nil means try to play sounds without using an external program.") - -(defcustom gnus-audio-directory (nnheader-find-etc-directory "sounds") - "The directory containing the Sound Files." - :type '(choice directory (const nil)) - :group 'gnus-audio) - -(defcustom gnus-audio-au-player "/usr/bin/showaudio" - "Executable program for playing sun AU format sound files." - :group 'gnus-audio - :type 'string) - -(defcustom gnus-audio-wav-player "/usr/local/bin/play" - "Executable program for playing WAV files." - :group 'gnus-audio - :type 'string) - -;;; The following isn't implemented yet. Wait for Millennium Gnus. -;;(defvar gnus-audio-effects-enabled t -;; "When t, Gnus will use sound effects.") -;;(defvar gnus-audio-enable-hooks nil -;; "Functions run when enabling sound effects.") -;;(defvar gnus-audio-disable-hooks nil -;; "Functions run when disabling sound effects.") -;;(defvar gnus-audio-theme-song nil -;; "Theme song for Gnus.") -;;(defvar gnus-audio-enter-group nil -;; "Sound effect played when selecting a group.") -;;(defvar gnus-audio-exit-group nil -;; "Sound effect played when exiting a group.") -;;(defvar gnus-audio-score-group nil -;; "Sound effect played when scoring a group.") -;;(defvar gnus-audio-busy-sound nil -;; "Sound effect played when going into a ... sequence.") - - -;;;###autoload -;;(defun gnus-audio-enable-sound () -;; "Enable Sound Effects for Gnus." -;; (interactive) -;; (setq gnus-audio-effects-enabled t) -;; (gnus-run-hooks gnus-audio-enable-hooks)) - -;;;###autoload - ;(defun gnus-audio-disable-sound () -;; "Disable Sound Effects for Gnus." -;; (interactive) -;; (setq gnus-audio-effects-enabled nil) -;; (gnus-run-hooks gnus-audio-disable-hooks)) - -;;;###autoload -(defun gnus-audio-play (file) - "Play a sound FILE through the speaker." - (interactive) - (let ((sound-file (if (file-exists-p file) - file - (expand-file-name file gnus-audio-directory)))) - (when (file-exists-p sound-file) - (cond ((and gnus-audio-inline-sound - (condition-case nil - ;; Even if we have audio, we may fail with the - ;; wrong sort of sound file. - (progn (play-sound-file sound-file) - t) - (error nil)))) - ;; If we don't have built-in sound, or playing it failed, - ;; try with external program. - ((equal "wav" (file-name-extension sound-file)) - (call-process gnus-audio-wav-player - sound-file - 0 - nil - sound-file)) - ((equal "au" (file-name-extension sound-file)) - (call-process gnus-audio-au-player - sound-file - 0 - nil - sound-file)))))) - - -;;; The following isn't implemented yet, wait for Red Gnus -;;(defun gnus-audio-startrek-sounds () -;; "Enable sounds from Star Trek the original series." -;; (interactive) -;; (setq gnus-audio-busy-sound "working.au") -;; (setq gnus-audio-enter-group "bulkhead_door.au") -;; (setq gnus-audio-exit-group "bulkhead_door.au") -;; (setq gnus-audio-score-group "ST_laser.au") -;; (setq gnus-audio-theme-song "startrek.au") -;; (add-hook 'gnus-select-group-hook 'gnus-audio-startrek-select-group) -;; (add-hook 'gnus-exit-group-hook 'gnus-audio-startrek-exit-group)) -;;;*** - -(defvar gnus-startup-jingle "Tuxedomoon.Jingle4.au" - "Name of the Gnus startup jingle file.") - -(defun gnus-play-jingle () - "Play the Gnus startup jingle, unless that's inhibited." - (interactive) - (gnus-audio-play gnus-startup-jingle)) - -(provide 'gnus-audio) - -(run-hooks 'gnus-audio-load-hook) - -;;; gnus-audio.el ends here diff --git a/lisp/gnus-bbdb.el b/lisp/gnus-bbdb.el deleted file mode 100644 index 1bd2cdc..0000000 --- a/lisp/gnus-bbdb.el +++ /dev/null @@ -1,651 +0,0 @@ -;; gnus-bbdb.el --- Interface to T-gnus - -;; Copyright (c) 1991,1992,1993 Jamie Zawinski . -;; Copyright (C) 1995,1996,1997 Shuhei KOBAYASHI -;; Copyright (C) 1997,1998 MORIOKA Tomohiko -;; Copyright (C) 1998,1999 Keiichi Suzuki - -;; Author: Keiichi Suzuki -;; Author: Shuhei KOBAYASHI -;; Keywords: BBDB, MIME, multimedia, multilingual, mail, news - -;; This file is part of T-gnus. - -;; 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, 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Code: - -(require 'bbdb) -(require 'bbdb-com) -(require 'gnus) -(require 'std11) -(eval-when-compile - (defvar bbdb-pop-up-elided-display) ; default unbound. - (require 'gnus-win) - (require 'cl)) - -(defvar gnus-bbdb/decode-field-body-function 'nnheader-decode-field-body - "*Field body decoder.") - -(defmacro gnus-bbdb/decode-field-body (field-body field-name) - `(or (and (functionp gnus-bbdb/decode-field-body-function) - (funcall gnus-bbdb/decode-field-body-function - ,field-body ,field-name)) - ,field-body)) - -;;;###autoload -(defun gnus-bbdb/update-record (&optional offer-to-create) - "returns the record corresponding to the current GNUS message, creating -or modifying it as necessary. A record will be created if -bbdb/news-auto-create-p is non-nil, or if OFFER-TO-CREATE is true and -the user confirms the creation." - (if bbdb-use-pop-up - (gnus-bbdb/pop-up-bbdb-buffer offer-to-create) - (let ((from (mime-entity-fetch-field gnus-current-headers "from"))) - (when from - (setq from (gnus-bbdb/extract-address-components - (gnus-bbdb/decode-field-body from 'From)))) - (when (and (car (cdr from)) - (string-match (bbdb-user-mail-names) - (car (cdr from)))) - ;; if logged-in user sent this, use recipients. - (let ((to (mime-entity-fetch-field gnus-current-headers "to"))) - (when to - (setq from - (gnus-bbdb/extract-address-components - (gnus-bbdb/decode-field-body to 'To)))))) - (when from - (save-excursion - (bbdb-annotate-message-sender from t - (or (bbdb-invoke-hook-for-value - bbdb/news-auto-create-p) - offer-to-create) - offer-to-create)))))) - -;;;###autoload -(defun gnus-bbdb/annotate-sender (string &optional replace) - "Add a line to the end of the Notes field of the BBDB record -corresponding to the sender of this message. If REPLACE is non-nil, -replace the existing notes entry (if any)." - (interactive (list (if bbdb-readonly-p - (error "The Insidious Big Brother Database is read-only.") - (read-string "Comments: ")))) - (bbdb-annotate-notes (gnus-bbdb/update-record t) string 'notes replace)) - -(defun gnus-bbdb/edit-notes (&optional arg) - "Edit the notes field or (with a prefix arg) a user-defined field -of the BBDB record corresponding to the sender of this message." - (interactive "P") - (let ((record (or (gnus-bbdb/update-record t) (error "")))) - (bbdb-display-records (list record)) - (if arg - (bbdb-record-edit-property record nil t) - (bbdb-record-edit-notes record t)))) - -;;;###autoload -(defun gnus-bbdb/show-sender () - "Display the contents of the BBDB for the sender of this message. -This buffer will be in bbdb-mode, with associated keybindings." - (interactive) - (let ((record (gnus-bbdb/update-record t))) - (if record - (bbdb-display-records (list record)) - (error "unperson")))) - - -(defun gnus-bbdb/pop-up-bbdb-buffer (&optional offer-to-create) - "Make the *BBDB* buffer be displayed along with the GNUS windows, -displaying the record corresponding to the sender of the current message." - (let* ((bbdb-gag-messages t) - (bbdb-electric-p nil) - (record - (let (bbdb-use-pop-up) - (gnus-bbdb/update-record offer-to-create))) - (bbdb-elided-display (bbdb-pop-up-elided-display))) - (save-current-buffer - ;; display the bbdb buffer iff there is a record for this article. - (cond - (record - (bbdb-pop-up-bbdb-buffer - (lambda (w) - (with-current-buffer (window-buffer w) - (memq major-mode - '(mime-view-mode gnus-article-mode))))) - (bbdb-display-records (list record))) - ((and (not bbdb-inside-electric-display) - (get-buffer-window bbdb-buffer-name)) - (delete-other-windows) - (if (assq 'article gnus-buffer-configuration) - (gnus-configure-windows 'article) - (gnus-configure-windows 'SelectArticle)) - (let ((w (get-buffer-window gnus-summary-buffer))) - (if w (select-window w)))))) - record)) - -;;;###autoload -(defun gnus-bbdb/split-mail (header-field bbdb-field - &optional regexp group) - "Mail split method for `nnmail-split-fancy'. -HEADER-FIELD is a regexp or list of regexps as mail header field name -for gathering mail addresses. If HEADER-FIELD is a string, then it's -used for just matching pattern. If HEADER-FIELD is a list of strings, -then these strings have priorities in the order. - -BBDB-FIELD is field name of BBDB. -Optional argument REGEXP is regexp string for matching BBDB-FIELD value. -If REGEXP is nil or not specified, then all BBDB-FIELD value is matched. - -If GROUP is nil or not specified, then BBDB-FIELD value is returned as -group name. If GROUP is a symbol `&', then list of all matching group's -BBDB-FIELD values is returned. Otherwise, GROUP is returned." - (if (listp header-field) - (if (eq group '&) - (gnus-bbdb/split-mail (mapconcat 'identity header-field "\\|") - bbdb-field regexp group) - (let (rest) - (while (and header-field - (null (setq rest (gnus-bbdb/split-mail - (car header-field) bbdb-field - regexp group)))) - (setq header-field (cdr header-field))) - rest)) - (let ((pat (concat "^\\(" header-field "\\):[ \t]")) - header-values) - (goto-char (point-min)) - (while (re-search-forward pat nil t) - (setq header-values (cons (buffer-substring (point) - (std11-field-end)) - header-values))) - (let ((address-regexp - (with-temp-buffer - (let (lal) - (while header-values - (setq lal (std11-parse-addresses-string - (pop header-values))) - (while lal - (gnus-bbdb/insert-address-regexp (pop lal))))) - (buffer-string)))) - (unless (zerop (length address-regexp)) - (gnus-bbdb/split-mail-1 address-regexp bbdb-field regexp group)))))) - -(defun gnus-bbdb/insert-address-regexp (address) - "Insert string of address part from parsed ADDRESS of RFC 822." - (cond ((eq (car address) 'group) - (setq address (cdr address)) - (while address - (gnus-bbdb/insert-address-regexp (pop address)))) - ((eq (car address) 'mailbox) - (unless (eq (point) (point-min)) - (insert "\\|")) - (let ((addr (nth 1 address))) - (insert (std11-addr-to-string - (if (eq (car addr) 'phrase-route-addr) - (nth 2 addr) - (cdr addr)))))))) - -(defun gnus-bbdb/split-mail-1 (address-regexp bbdb-field regexp group) - (let ((records (bbdb-search (bbdb-records) nil nil address-regexp)) - prop rest) - (or regexp (setq regexp "")) - (catch 'done - (cond - ((eq group '&) - (while records - (when (and (setq prop (bbdb-record-getprop (car records) bbdb-field)) - (string-match regexp prop) - (not (member prop rest))) - (setq rest (cons prop rest))) - (setq records (cdr records))) - (throw 'done (when rest (cons '& rest)))) - (t - (while records - (when (or (null bbdb-field) - (and (setq prop (bbdb-record-getprop (car records) - bbdb-field)) - (string-match regexp prop))) - (throw 'done (or group prop))) - (setq records (cdr records)))))))) - -;; -;; Announcing BBDB entries in the summary buffer -;; - -(defcustom gnus-bbdb/lines-and-from-length 18 - "*The number of characters used to display From: info in Gnus, if you have -set gnus-optional-headers to 'gnus-bbdb/lines-and-from." - :group 'bbdb-mua-specific-gnus - :type 'integer) - -(defcustom gnus-bbdb/summary-mark-known-posters t - "*If t, mark messages created by people with records in the BBDB. -In GNUS, this marking will take place in the subject list (assuming -`gnus-optional-headers' contains `gnus-bbdb/lines-and-from'). In Gnus, the -marking will take place in the Summary buffer if the format code defined by -`gnus-bbdb/summary-user-format-letter' is used in `gnus-summary-line-format'. -This variable has no effect on the marking controlled by -`gnus-bbdb/summary-in-bbdb-format-letter'." - :group 'bbdb-mua-specific-gnus - :type '(choice (const :tag "Mark known posters" t) - (const :tag "Do not mark known posters" nil))) -(static-when (and (fboundp 'defvaralias) - (subrp (symbol-function 'defvaralias))) - (defvaralias 'gnus-bbdb/mark-known-posters - 'gnus-bbdb/summary-mark-known-posters)) - -(defcustom gnus-bbdb/summary-known-poster-mark "+" - "This is the default character to prefix author names with if -gnus-bbdb/summary-mark-known-posters is t. If the poster's record has -an entry in the field named by bbdb-message-marker-field, then that will -be used instead." - :group 'bbdb-mua-specific-gnus - :type 'character) - -(defcustom gnus-bbdb/summary-show-bbdb-names t - "*If both this variable and `gnus-bbdb/summary-prefer-real-names' are true, -then for messages from authors who are in your database, the name -displayed will be the primary name in the database, rather than the -one in the From line of the message. This doesn't affect the names of -people who aren't in the database, of course. (`gnus-optional-headers' -must be `gnus-bbdb/lines-and-from' for GNUS users.)" - :group 'bbdb-mua-specific-gnus - :type 'boolean) -(static-when (and (fboundp 'defvaralias) - (subrp (symbol-function 'defvaralias))) - (defvaralias 'gnus-bbdb/header-show-bbdb-names - 'gnus-bbdb/summary-show-bbdb-names)) - -(defcustom gnus-bbdb/summary-prefer-bbdb-data t - "If t, then for posters who are in our BBDB, replace the information -provided in the From header with data from the BBDB." - :group 'bbdb-mua-specific-gnus - :type 'boolean) - -(defcustom gnus-bbdb/summary-prefer-real-names t - "If t, then display the poster's name from the BBDB if we have one, -otherwise display his/her primary net address if we have one. If it -is set to the symbol bbdb, then real names will be used from the BBDB -if present, otherwise the net address in the post will be used. If -gnus-bbdb/summary-prefer-bbdb-data is nil, then this has no effect. -See `gnus-bbdb/lines-and-from' for GNUS users, or -`gnus-bbdb/summary-user-format-letter' for Gnus users." - :group 'bbdb-mua-specific-gnus - :type '(choice (const :tag "Prefer real names" t) - (const :tag "Prefer network addresses" nil))) -(static-when (and (fboundp 'defvaralias) - (subrp (symbol-function 'defvaralias))) - (defvaralias 'gnus-bbdb/header-prefer-real-names - 'gnus-bbdb/summary-prefer-real-names)) - -(defcustom gnus-bbdb/summary-user-format-letter "B" - "This is the gnus-user-format-function- that will be used to insert -the information from the BBDB in the summary buffer (using -`gnus-bbdb/summary-get-author'). This format code is meant to replace -codes that insert sender names or addresses (like %A or %n). Unless -you've alread got other code using user format B, you might as well -stick with the default. Additionally, if the value of this variable -is nil, no format function will be installed for -`gnus-bbdb/summary-get-author'. See also -`gnus-bbdb/summary-in-bbdb-format-letter', which installs a format -code for `gnus-bbdb/summary-author-in-bbdb'" - :group 'bbdb-mua-specific-gnus - :type 'character) - -(defcustom gnus-bbdb/summary-in-bbdb-format-letter "b" - "This is the gnus-user-format-function- that will be used to insert -`gnus-bbdb/summary-known-poster-mark' (using -`gnus-bbdb/summary-author-in-bbdb') if the poster is in the BBDB, and -\" \" if not. If the value of this variable is nil, no format code -will be installed for `gnus-bbdb/summary-author-in-bbdb'. See also -`gnus-bbdb/summary-user-format-letter', which installs a format code -for `gnus-bbdb/summary-get-author'." - :group 'bbdb-mua-specific-gnus - :type 'character) - -(defcustom bbdb-message-marker-field 'mark-char - "*The field whose value will be used to mark messages by this user in Gnus." - :group 'bbdb-mua-specific-gnus - :type 'symbol) - -;;;###autoload -(defun gnus-bbdb/lines-and-from (header) - "Useful as the value of gnus-optional-headers in *GNUS* (not Gnus). -NOTE: This variable no longer seems to be present in Gnus. It seems -to have been replaced by `message-default-headers', which only takes -strings. In the future this should change." - (let* ((length gnus-bbdb/lines-and-from-length) - (lines (mail-header-lines header)) - (from (mail-header-from header)) - (data (and (or gnus-bbdb/summary-mark-known-posters - gnus-bbdb/summary-show-bbdb-names) - (condition-case () - (gnus-bbdb/extract-address-components from) - (error nil)))) - (name (car data)) - (net (car (cdr data))) - (record (and data - (bbdb-search-simple - name - (if (and net bbdb-canonicalize-net-hook) - (bbdb-canonicalize-address net) - net)))) - string L) - - (if (and record name (member (downcase name) (bbdb-record-net record))) - ;; bogon! - (setq record nil)) - - (setq name - (or (and gnus-bbdb/summary-prefer-bbdb-data - (or (and gnus-bbdb/summary-prefer-real-names - (and record (bbdb-record-name record))) - (and record (bbdb-record-net record) - (nth 0 (bbdb-record-net record))))) - (and gnus-bbdb/summary-prefer-real-names - (or (and (equal gnus-bbdb/summary-prefer-real-names 'bbdb) - net) - name)) - net from "**UNKNOWN**")) - ;; GNUS can't cope with extra square-brackets appearing in the summary. - (if (and name (string-match "[][]" name)) - (progn (setq name (copy-sequence name)) - (while (string-match "[][]" name) - (aset name (match-beginning 0) ? )))) - (setq string (format "%s%3d:%s" - (if (and record gnus-bbdb/summary-mark-known-posters) - (or (bbdb-record-getprop - record bbdb-message-marker-field) - "*") - " ") - lines (or name from)) - L (length string)) - (cond ((> L length) (substring string 0 length)) - ((< L length) (concat string (make-string (- length L) ? ))) - (t string)))) - -(defun gnus-bbdb/summary-get-author (header) - "Given a Gnus message header, returns the appropriate piece of -information to identify the author in a Gnus summary line, depending on -the settings of the various configuration variables. See the -documentation for the following variables for more details: - `gnus-bbdb/summary-mark-known-posters' - `gnus-bbdb/summary-known-poster-mark' - `gnus-bbdb/summary-prefer-bbdb-data' - `gnus-bbdb/summary-prefer-real-names' -This function is meant to be used with the user function defined in - `gnus-bbdb/summary-user-format-letter'" - (let* ((from (mail-header-from header)) - (data (and gnus-bbdb/summary-show-bbdb-names - (condition-case () - (gnus-bbdb/extract-address-components from) - (error nil)))) - (name (car data)) - (net (car (cdr data))) - (record (and data - (bbdb-search-simple - name - (if (and net bbdb-canonicalize-net-hook) - (bbdb-canonicalize-address net) - net))))) - (if (and record name (member (downcase name) (bbdb-record-net record))) - ;; bogon! - (setq record nil)) - (setq name - (or (and gnus-bbdb/summary-prefer-bbdb-data - (or (and gnus-bbdb/summary-prefer-real-names - (and record (bbdb-record-name record))) - (and record (bbdb-record-net record) - (nth 0 (bbdb-record-net record))))) - (and gnus-bbdb/summary-prefer-real-names - (or (and (equal gnus-bbdb/summary-prefer-real-names 'bbdb) - net) - name)) - net from "**UNKNOWN**")) - (format "%s%s" - (or (and record gnus-bbdb/summary-mark-known-posters - (or (bbdb-record-getprop - record bbdb-message-marker-field) - gnus-bbdb/summary-known-poster-mark)) - " ") - name))) - -;; DEBUG: (gnus-bbdb/summary-author-in-bbdb "From: simmonmt@acm.org") -(defun gnus-bbdb/summary-author-in-bbdb (header) - "Given a Gnus message header, returns a mark if the poster is in the BBDB, \" \" otherwise. The mark itself is the value of the field indicated by `bbdb-message-marker-field' (`mark-char' by default) if the indicated field is in the poster's record, and `gnus-bbdb/summary-known-poster-mark' otherwise." - (let* ((from (mail-header-from header)) - (data (condition-case () - (gnus-bbdb/extract-address-components from) - (error nil))) - (name (car data)) - (net (cadr data)) - record) - (if (and data - (setq record - (bbdb-search-simple - name (if (and net bbdb-canonicalize-net-hook) - (bbdb-canonicalize-address net) - net)))) - (or (bbdb-record-getprop - record bbdb-message-marker-field) - gnus-bbdb/summary-known-poster-mark) " "))) - -;; -;; Scoring -;; - -(defcustom gnus-bbdb/score-field 'gnus-score - "This variable contains the name of the BBDB field which should be -checked for a score to add to the net addresses in the same record." - :group 'bbdb-mua-specific-gnus-scoring - :type 'symbol) - -(defcustom gnus-bbdb/score-default nil - "If this is set, then every net address in the BBDB that does not have -an associated score field will be assigned this score. A value of nil -implies a default score of zero." - :group 'bbdb-mua-specific-gnus-scoring - :type '(choice (const :tag "Do not assign default score") - (integer :tag "Assign this default score" 0))) - -(defvar gnus-bbdb/score-default-internal nil - "Internal variable for detecting changes to -`gnus-bbdb/score-default'. You should not set this variable directly - -set `gnus-bbdb/score-default' instead.") - -(defvar gnus-bbdb/score-alist nil - "The text version of the scoring structure returned by -gnus-bbdb/score. This is built automatically from the BBDB.") - -(defvar gnus-bbdb/score-rebuild-alist t - "Set to t to rebuild gnus-bbdb/score-alist on the next call to -gnus-bbdb/score. This will be set automatically if you change a BBDB -record which contains a gnus-score field.") - -(defun gnus-bbdb/score-invalidate-alist (rec) - "This function is called through bbdb-after-change-hook, and sets -gnus-bbdb/score-rebuild-alist to t if the changed record contains a -gnus-score field." - (if (bbdb-record-getprop rec gnus-bbdb/score-field) - (setq gnus-bbdb/score-rebuild-alist t))) - -;;;###autoload -(defun gnus-bbdb/score (group) - "This returns a score alist for GNUS. A score pair will be made for -every member of the net field in records which also have a gnus-score -field. This allows the BBDB to serve as a supplemental global score -file, with the advantage that it can keep up with multiple and changing -addresses better than the traditionally static global scorefile." - (list (list - (condition-case nil - (read (gnus-bbdb/score-as-text group)) - (error (setq gnus-bbdb/score-rebuild-alist t) - (message "Problem building BBDB score table.") - (ding) (sit-for 2) - nil))))) - -(defun gnus-bbdb/score-as-text (group) - "Returns a SCORE file format string built from the BBDB." - (cond ((or (cond ((/= (or gnus-bbdb/score-default 0) - (or gnus-bbdb/score-default-internal 0)) - (setq gnus-bbdb/score-default-internal - gnus-bbdb/score-default) - t)) - (not gnus-bbdb/score-alist) - gnus-bbdb/score-rebuild-alist) - (setq gnus-bbdb/score-rebuild-alist nil) - (setq gnus-bbdb/score-alist - (concat "((touched nil) (\"from\"\n" - (mapconcat - (lambda (rec) - (let ((score (or (bbdb-record-getprop - rec - gnus-bbdb/score-field) - gnus-bbdb/score-default)) - (net (bbdb-record-net rec))) - (if (not (and score net)) nil - (mapconcat - (lambda (addr) - (concat "(\"" addr "\" " score ")\n")) - net "")))) - (bbdb-records) "") - "))")))) - gnus-bbdb/score-alist) - -(defun gnus-bbdb/extract-field-value-init () - (function gnus-bbdb/extract-field-value)) - -(defun gnus-bbdb/extract-field-value (field-name) - "Given the name of a field (like \"Subject\") this returns the value of -that field in the current message, or nil. This works whether you're in -Semi-gnus, Rmail, or VM. This works on multi-line fields, but if more than -one field of the same name is present, only the last is returned. It is -expected that the current buffer has a message in it, and (point) is at the -beginning of the message headers." - ;; we can't special-case VM here to use its cache, because the cache has - ;; divided real-names from addresses; the actual From: and Subject: fields - ;; exist only in the message. - (let (value) - (when (setq value (mime-entity-fetch-field - gnus-current-headers field-name)) - (gnus-bbdb/decode-field-body value field-name)))) - -;;; @ mail-extr -;;; - -(defvar gnus-bbdb/canonicalize-full-name-methods - '(gnus-bbdb/canonicalize-dots - gnus-bbdb/canonicalize-spaces)) - -(defun gnus-bbdb/extract-address-components (str) - (let* ((ret (std11-extract-address-components str)) - (phrase (car ret)) - (address (car (cdr ret))) - (methods gnus-bbdb/canonicalize-full-name-methods)) - (while (and phrase methods) - (setq phrase (funcall (car methods) phrase) - methods (cdr methods))) - (if (string= address "") (setq address nil)) - (if (string= phrase "") (setq phrase nil)) - (when (or phrase address) - (list phrase address)))) - -;;; @ full-name canonicalization methods -;;; - -(defun gnus-bbdb/canonicalize-spaces (str) - (let (dest) - (while (string-match "\\s +" str) - (setq dest (cons (substring str 0 (match-beginning 0)) dest)) - (setq str (substring str (match-end 0)))) - (or (string= str "") - (setq dest (cons str dest))) - (setq dest (nreverse dest)) - (mapconcat 'identity dest " "))) - -(defun gnus-bbdb/canonicalize-dots (str) - (let (dest) - (while (string-match "\\." str) - (setq dest (cons (substring str 0 (match-end 0)) dest)) - (setq str (substring str (match-end 0)))) - (or (string= str "") - (setq dest (cons str dest))) - (setq dest (nreverse dest)) - (mapconcat 'identity dest " "))) - -;; -;; Insinuation -;; - -;;;###autoload -(defun gnus-bbdb-insinuate () - "Call this function to hook BBDB into Semi-gnus." -;; (setq gnus-optional-headers 'gnus-bbdb/lines-and-from) - (when (boundp 'bbdb-extract-field-value-function-list) - (add-to-list 'bbdb-extract-field-value-function-list - 'gnus-bbdb/extract-field-value-init)) - (add-hook 'gnus-article-prepare-hook 'gnus-bbdb/update-record) - (add-hook 'gnus-save-newsrc-hook 'bbdb-offer-save) - (define-key gnus-summary-mode-map ":" 'gnus-bbdb/show-sender) - (define-key gnus-summary-mode-map ";" 'gnus-bbdb/edit-notes) - - ;; Set up user field for use in gnus-summary-line-format - (let ((get-author-user-fun (intern - (concat "gnus-user-format-function-" - gnus-bbdb/summary-user-format-letter))) - (in-bbdb-user-fun (intern - (concat "gnus-user-format-function-" - gnus-bbdb/summary-in-bbdb-format-letter)))) - ; The big one - whole name - (cond (gnus-bbdb/summary-user-format-letter - (if (and (fboundp get-author-user-fun) - (not (eq (symbol-function get-author-user-fun) - 'gnus-bbdb/summary-get-author))) - (bbdb-warn - (format "`gnus-user-format-function-%s' already seems to be in use. -Please redefine `gnus-bbdb/summary-user-format-letter' to a different letter." - gnus-bbdb/summary-user-format-letter)) - (fset get-author-user-fun 'gnus-bbdb/summary-get-author)))) - - ; One tick. One tick only, please - (cond (gnus-bbdb/summary-in-bbdb-format-letter - (if (and (fboundp in-bbdb-user-fun) - (not (eq (symbol-function in-bbdb-user-fun) - 'gnus-bbdb/summary-author-in-bbdb))) - (bbdb-warn - (format "`gnus-user-format-function-%s' already seems to be in use. -Redefine `gnus-bbdb/summary-in-bbdb-format-letter' to a different letter." - gnus-bbdb/summary-in-bbdb-format-letter)) - (fset in-bbdb-user-fun 'gnus-bbdb/summary-author-in-bbdb))))) - - ;; Scoring - (add-hook 'bbdb-after-change-hook 'gnus-bbdb/score-invalidate-alist) -; (setq gnus-score-find-score-files-function -; (if (boundp 'gnus-score-find-score-files-function) -; (cond ((functionp gnus-score-find-score-files-function) -; (list gnus-score-find-score-files-function -; 'gnus-bbdb/score)) -; ((listp gnus-score-find-score-files-function) -; (append gnus-score-find-score-files-function -; 'gnus-bbdb/score)) -; (t 'gnus-bbdb/score)) -; 'gnus-bbdb/score)) - ) - -;;;###autoload -(defun gnus-bbdb-insinuate-message () - "Call this function to hook BBDB into message-mode." - (define-key message-mode-map "\M-\t" 'bbdb-complete-name)) - -(provide 'gnus-bbdb) diff --git a/lisp/gnus-bcklg.el b/lisp/gnus-bcklg.el deleted file mode 100644 index 86ef4e5..0000000 --- a/lisp/gnus-bcklg.el +++ /dev/null @@ -1,162 +0,0 @@ -;;; gnus-bcklg.el --- backlog functions for Gnus -;; Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus) - -;;; -;;; Buffering of read articles. -;;; - -(defvar gnus-backlog-buffer " *Gnus Backlog*") -(defvar gnus-backlog-articles nil) -(defvar gnus-backlog-hashtb nil) - -(defun gnus-backlog-buffer () - "Return the backlog buffer." - (or (get-buffer gnus-backlog-buffer) - (save-excursion - (set-buffer (gnus-get-buffer-create gnus-backlog-buffer)) - (buffer-disable-undo) - (setq buffer-read-only t) - (get-buffer gnus-backlog-buffer)))) - -(defun gnus-backlog-setup () - "Initialize backlog variables." - (unless gnus-backlog-hashtb - (setq gnus-backlog-hashtb (gnus-make-hashtable 1024)))) - -(gnus-add-shutdown 'gnus-backlog-shutdown 'gnus) - -(defun gnus-backlog-shutdown () - "Clear all backlog variables and buffers." - (interactive) - (when (get-buffer gnus-backlog-buffer) - (kill-buffer gnus-backlog-buffer)) - (setq gnus-backlog-hashtb nil - gnus-backlog-articles nil)) - -(defun gnus-backlog-enter-article (group number buffer) - (when (and (numberp number) - (not (string-match "^nnvirtual" group))) - (gnus-backlog-setup) - (let ((ident (intern (concat group ":" (int-to-string number)) - gnus-backlog-hashtb)) - b) - (if (memq ident gnus-backlog-articles) - () ; It's already kept. - ;; Remove the oldest article, if necessary. - (and (numberp gnus-keep-backlog) - (>= (length gnus-backlog-articles) gnus-keep-backlog) - (gnus-backlog-remove-oldest-article)) - (push ident gnus-backlog-articles) - ;; Insert the new article. - (save-excursion - (set-buffer (gnus-backlog-buffer)) - (let (buffer-read-only) - (goto-char (point-max)) - (unless (bolp) - (insert "\n")) - (setq b (point)) - (insert-buffer-substring buffer) - ;; Tag the beginning of the article with the ident. - (if (> (point-max) b) - (gnus-put-text-property b (1+ b) 'gnus-backlog ident) - (gnus-error 3 "Article %d is blank" number)))))))) - -(defun gnus-backlog-remove-oldest-article () - (save-excursion - (set-buffer (gnus-backlog-buffer)) - (goto-char (point-min)) - (if (zerop (buffer-size)) - () ; The buffer is empty. - (let ((ident (get-text-property (point) 'gnus-backlog)) - buffer-read-only) - ;; Remove the ident from the list of articles. - (when ident - (setq gnus-backlog-articles (delq ident gnus-backlog-articles))) - ;; Delete the article itself. - (delete-region - (point) (next-single-property-change - (1+ (point)) 'gnus-backlog nil (point-max))))))) - -(defun gnus-backlog-remove-article (group number) - "Remove article NUMBER in GROUP from the backlog." - (when (numberp number) - (gnus-backlog-setup) - (let ((ident (intern (concat group ":" (int-to-string number)) - gnus-backlog-hashtb)) - beg end) - (when (memq ident gnus-backlog-articles) - ;; It was in the backlog. - (save-excursion - (set-buffer (gnus-backlog-buffer)) - (let (buffer-read-only) - (when (setq beg (text-property-any - (point-min) (point-max) 'gnus-backlog - ident)) - ;; Find the end (i. e., the beginning of the next article). - (setq end - (next-single-property-change - (1+ beg) 'gnus-backlog (current-buffer) (point-max))) - (delete-region beg end) - ;; Return success. - t)) - (setq gnus-backlog-articles (delq ident gnus-backlog-articles))))))) - -(defun gnus-backlog-request-article (group number &optional buffer) - (when (and (numberp number) - (not (string-match "^nnvirtual" group))) - (gnus-backlog-setup) - (let ((ident (intern (concat group ":" (int-to-string number)) - gnus-backlog-hashtb)) - beg end) - (when (memq ident gnus-backlog-articles) - ;; It was in the backlog. - (save-excursion - (set-buffer (gnus-backlog-buffer)) - (if (not (setq beg (text-property-any - (point-min) (point-max) 'gnus-backlog - ident))) - ;; It wasn't in the backlog after all. - (ignore - (setq gnus-backlog-articles (delq ident gnus-backlog-articles))) - ;; Find the end (i. e., the beginning of the next article). - (setq end - (next-single-property-change - (1+ beg) 'gnus-backlog (current-buffer) (point-max))))) - (save-excursion - (and buffer (set-buffer buffer)) - (let ((buffer-read-only nil)) - (erase-buffer) - (insert-buffer-substring gnus-backlog-buffer beg end))) - t)))) - -(provide 'gnus-bcklg) - -;;; gnus-bcklg.el ends here diff --git a/lisp/gnus-cache.el b/lisp/gnus-cache.el deleted file mode 100644 index e02b157..0000000 --- a/lisp/gnus-cache.el +++ /dev/null @@ -1,715 +0,0 @@ -;;; gnus-cache.el --- cache interface for Gnus -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Tatsuya Ichikawa -;; MORIOKA Tomohiko -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'gnus-clfns)) - -(require 'gnus) -(require 'gnus-int) -(require 'gnus-range) -(require 'gnus-start) -(eval-when-compile - (require 'gnus-sum)) - -(defcustom gnus-cache-active-file - (expand-file-name "active" gnus-cache-directory) - "*The cache active file." - :group 'gnus-cache - :type 'file) - -(defcustom gnus-cache-enter-articles '(ticked dormant) - "Classes of articles to enter into the cache." - :group 'gnus-cache - :type '(set (const ticked) (const dormant) (const unread) (const read))) - -(defcustom gnus-cache-remove-articles '(read) - "Classes of articles to remove from the cache." - :group 'gnus-cache - :type '(set (const ticked) (const dormant) (const unread) (const read))) - -(defcustom gnus-cacheable-groups nil - "*Groups that match this regexp will be cached. - -If you only want to cache your nntp groups, you could set this -variable to \"^nntp\". - -If a group matches both gnus-cacheable-groups and gnus-uncacheable-groups -it's not cached." - :group 'gnus-cache - :type '(choice (const :tag "off" nil) - regexp)) - -(defcustom gnus-uncacheable-groups nil - "*Groups that match this regexp will not be cached. - -If you want to avoid caching your nnml groups, you could set this -variable to \"^nnml\". - -If a group matches both gnus-cacheable-groups and gnus-uncacheable-groups -it's not cached." - :group 'gnus-cache - :type '(choice (const :tag "off" nil) - regexp)) - -(defvar gnus-cache-overview-coding-system 'raw-text - "Coding system used on Gnus cache files.") - -(defvar gnus-cache-coding-system 'raw-text - "Coding system used on Gnus cache files.") - - - -;;; Internal variables. - -(defvar gnus-cache-removable-articles nil) -(defvar gnus-cache-buffer nil) -(defvar gnus-cache-active-hashtb nil) -(defvar gnus-cache-active-altered nil) -(defvar gnus-cache-write-file-coding-system 'raw-text) - -(eval-and-compile - (autoload 'nnml-generate-nov-databases-1 "nnml") - (autoload 'nnvirtual-find-group-art "nnvirtual")) - - - -;;; Functions called from Gnus. - -(defun gnus-cache-open () - "Initialize the cache." - (when (or (file-exists-p gnus-cache-directory) - (and gnus-use-cache - (not (eq gnus-use-cache 'passive)))) - (gnus-cache-read-active))) - -;; Complexities of byte-compiling make this kludge necessary. Eeek. -(ignore-errors - (gnus-add-shutdown 'gnus-cache-close 'gnus)) - -(defun gnus-cache-close () - "Shut down the cache." - (gnus-cache-write-active) - (gnus-cache-save-buffers) - (setq gnus-cache-active-hashtb nil)) - -(defun gnus-cache-save-buffers () - ;; save the overview buffer if it exists and has been modified - ;; delete empty cache subdirectories - (when gnus-cache-buffer - (let ((buffer (cdr gnus-cache-buffer)) - (overview-file (gnus-cache-file-name - (car gnus-cache-buffer) ".overview"))) - ;; write the overview only if it was modified - (when (buffer-modified-p buffer) - (save-excursion - (set-buffer buffer) - (if (> (buffer-size) 0) - ;; Non-empty overview, write it to a file. - (gnus-write-buffer-as-coding-system - gnus-cache-overview-coding-system overview-file) - ;; Empty overview file, remove it - (when (file-exists-p overview-file) - (delete-file overview-file)) - ;; If possible, remove group's cache subdirectory. - (condition-case nil - ;; FIXME: we can detect the error type and warn the user - ;; of any inconsistencies (articles w/o nov entries?). - ;; for now, just be conservative...delete only if safe -- sj - (delete-directory (file-name-directory overview-file)) - (error nil))))) - ;; Kill the buffer -- it's either unmodified or saved. - (gnus-kill-buffer buffer) - (setq gnus-cache-buffer nil)))) - -(defun gnus-cache-possibly-enter-article - (group article headers ticked dormant unread &optional force) - (when (and (or force (not (eq gnus-use-cache 'passive))) - (numberp article) - (> article 0) ; This might be a dummy article. - (vectorp headers)) - (let ((number article) file) - ;; If this is a virtual group, we find the real group. - (when (gnus-virtual-group-p group) - (let ((result (nnvirtual-find-group-art - (gnus-group-real-name group) article))) - (setq group (car result) - number (cdr result)))) - (when (and number - (> number 0) ; Reffed article. - (or force - (and (gnus-cache-fully-p group) - (gnus-cache-member-of-class - gnus-cache-enter-articles ticked dormant unread))) - (not (file-exists-p (setq file (gnus-cache-file-name - group number))))) - ;; Possibly create the cache directory. - (gnus-make-directory (file-name-directory file)) - ;; Save the article in the cache. - (if (file-exists-p file) - t ; The article already is saved. - (save-excursion - (set-buffer nntp-server-buffer) - (require 'gnus-art) - (let ((gnus-use-cache nil) - (gnus-article-decode-hook nil)) - (gnus-request-article-this-buffer number group)) - (when (> (buffer-size) 0) - (gnus-write-buffer-as-coding-system - gnus-cache-write-file-coding-system file) - (setq headers (nnheader-parse-head t)) - (mail-header-set-number headers number) - (gnus-cache-change-buffer group) - (set-buffer (cdr gnus-cache-buffer)) - (goto-char (point-max)) - (forward-line -1) - (while (condition-case () - (when (not (bobp)) - (> (read (current-buffer)) number)) - (error - ;; The line was malformed, so we just remove it!! - (gnus-delete-line) - t)) - (forward-line -1)) - (if (bobp) - (if (not (eobp)) - (progn - (beginning-of-line) - (when (< (read (current-buffer)) number) - (forward-line 1))) - (beginning-of-line)) - (forward-line 1)) - (beginning-of-line) - (nnheader-insert-nov headers) - ;; Update the active info. - (set-buffer gnus-summary-buffer) - (gnus-cache-possibly-update-active group (cons number number)) - (push article gnus-newsgroup-cached) - (gnus-summary-update-secondary-mark article)) - t)))))) - -(defun gnus-cache-enter-remove-article (article) - "Mark ARTICLE for later possible removal." - (when article - (push article gnus-cache-removable-articles))) - -(defun gnus-cache-possibly-remove-articles () - "Possibly remove some of the removable articles." - (if (not (gnus-virtual-group-p gnus-newsgroup-name)) - (gnus-cache-possibly-remove-articles-1) - (let ((arts gnus-cache-removable-articles) - ga) - (while arts - (when (setq ga (nnvirtual-find-group-art - (gnus-group-real-name gnus-newsgroup-name) (pop arts))) - (let ((gnus-cache-removable-articles (list (cdr ga))) - (gnus-newsgroup-name (car ga))) - (gnus-cache-possibly-remove-articles-1))))) - (setq gnus-cache-removable-articles nil))) - -(defun gnus-cache-possibly-remove-articles-1 () - "Possibly remove some of the removable articles." - (when (gnus-cache-fully-p gnus-newsgroup-name) - (let ((articles gnus-cache-removable-articles) - (cache-articles gnus-newsgroup-cached) - article) - (gnus-cache-change-buffer gnus-newsgroup-name) - (while articles - (when (memq (setq article (pop articles)) cache-articles) - ;; The article was in the cache, so we see whether we are - ;; supposed to remove it from the cache. - (gnus-cache-possibly-remove-article - article (memq article gnus-newsgroup-marked) - (memq article gnus-newsgroup-dormant) - (or (memq article gnus-newsgroup-unreads) - (memq article gnus-newsgroup-unselected)))))) - ;; The overview file might have been modified, save it - ;; safe because we're only called at group exit anyway. - (gnus-cache-save-buffers))) - -(defun gnus-cache-request-article (article group) - "Retrieve ARTICLE in GROUP from the cache." - (let ((file (gnus-cache-file-name group article)) - (buffer-read-only nil)) - (when (file-exists-p file) - (erase-buffer) - (gnus-kill-all-overlays) - (let ((nnheader-file-coding-system gnus-cache-coding-system)) - (nnheader-insert-file-contents file)) - t))) - -(defun gnus-cache-possibly-alter-active (group active) - "Alter the ACTIVE info for GROUP to reflect the articles in the cache." - (when gnus-cache-active-hashtb - (let ((cache-active (gnus-gethash group gnus-cache-active-hashtb))) - (when cache-active - (when (< (car cache-active) (car active)) - (setcar active (car cache-active))) - (when (> (cdr cache-active) (cdr active)) - (setcdr active (cdr cache-active))))))) - -(defun gnus-cache-retrieve-headers (articles group &optional fetch-old) - "Retrieve the headers for ARTICLES in GROUP." - (let ((cached - (setq gnus-newsgroup-cached (gnus-cache-articles-in-group group)))) - (if (not cached) - ;; No cached articles here, so we just retrieve them - ;; the normal way. - (let ((gnus-use-cache nil)) - (gnus-retrieve-headers articles group fetch-old)) - (let ((uncached-articles (gnus-sorted-intersection - (gnus-sorted-complement articles cached) - articles)) - (cache-file (gnus-cache-file-name group ".overview")) - type) - ;; We first retrieve all the headers that we don't have in - ;; the cache. - (let ((gnus-use-cache nil)) - (when uncached-articles - (setq type (and articles - (gnus-retrieve-headers - uncached-articles group fetch-old))))) - (gnus-cache-save-buffers) - ;; Then we insert the cached headers. - (save-excursion - (cond - ((not (file-exists-p cache-file)) - ;; There are no cached headers. - type) - ((null type) - ;; There were no uncached headers (or retrieval was - ;; unsuccessful), so we use the cached headers exclusively. - (set-buffer nntp-server-buffer) - (erase-buffer) - (let ((nnheader-file-coding-system - gnus-cache-overview-coding-system)) - (nnheader-insert-file-contents cache-file)) - 'nov) - ((eq type 'nov) - ;; We have both cached and uncached NOV headers, so we - ;; braid them. - (gnus-cache-braid-nov group cached) - type) - (t - ;; We braid HEADs. - (gnus-cache-braid-heads group (gnus-sorted-intersection - cached articles)) - type))))))) - -(defun gnus-cache-enter-article (&optional n) - "Enter the next N articles into the cache. -If not given a prefix, use the process marked articles instead. -Returns the list of articles entered." - (interactive "P") - (let ((articles (gnus-summary-work-articles n)) - article out) - (while (setq article (pop articles)) - (gnus-summary-remove-process-mark article) - (if (natnump article) - (when (gnus-cache-possibly-enter-article - gnus-newsgroup-name article - (gnus-summary-article-header article) - nil nil nil t) - (push article out)) - (gnus-message 2 "Can't cache article %d" article)) - (gnus-summary-update-secondary-mark article)) - (gnus-summary-next-subject 1) - (gnus-summary-position-point) - (nreverse out))) - -(defun gnus-cache-remove-article (n) - "Remove the next N articles from the cache. -If not given a prefix, use the process marked articles instead. -Returns the list of articles removed." - (interactive "P") - (gnus-cache-change-buffer gnus-newsgroup-name) - (let ((articles (gnus-summary-work-articles n)) - article out) - (while articles - (setq article (pop articles)) - (gnus-summary-remove-process-mark article) - (when (gnus-cache-possibly-remove-article article nil nil nil t) - (push article out)) - (gnus-summary-update-secondary-mark article)) - (gnus-summary-next-subject 1) - (gnus-summary-position-point) - (nreverse out))) - -(defun gnus-cached-article-p (article) - "Say whether ARTICLE is cached in the current group." - (memq article gnus-newsgroup-cached)) - -(defun gnus-summary-insert-cached-articles () - "Insert all the articles cached for this group into the current buffer." - (interactive) - (let ((cached (sort (copy-sequence gnus-newsgroup-cached) '>)) - (gnus-verbose (max 6 gnus-verbose))) - (unless cached - (gnus-message 3 "No cached articles for this group")) - (while cached - (gnus-summary-goto-subject (pop cached) t)))) - -(defalias 'gnus-summary-limit-include-cached - 'gnus-summary-insert-cached-articles) - -;;; Internal functions. - -(defun gnus-cache-change-buffer (group) - (and gnus-cache-buffer - ;; See if the current group's overview cache has been loaded. - (or (string= group (car gnus-cache-buffer)) - ;; Another overview cache is current, save it. - (gnus-cache-save-buffers))) - ;; if gnus-cache buffer is nil, create it - (unless gnus-cache-buffer - ;; Create cache buffer - (save-excursion - (setq gnus-cache-buffer - (cons group - (set-buffer (gnus-get-buffer-create - " *gnus-cache-overview*")))) - ;; Insert the contents of this group's cache overview. - (erase-buffer) - (let ((file (gnus-cache-file-name group ".overview"))) - (when (file-exists-p file) - (nnheader-insert-file-contents file))) - ;; We have a fresh (empty/just loaded) buffer, - ;; mark it as unmodified to save a redundant write later. - (set-buffer-modified-p nil)))) - -;; Return whether an article is a member of a class. -(defun gnus-cache-member-of-class (class ticked dormant unread) - (or (and ticked (memq 'ticked class)) - (and dormant (memq 'dormant class)) - (and unread (memq 'unread class)) - (and (not unread) (not ticked) (not dormant) (memq 'read class)))) - -(defun gnus-cache-file-name (group article) - (expand-file-name - (if (stringp article) article (int-to-string article)) - (file-name-as-directory - (expand-file-name - (nnheader-translate-file-chars - (if (gnus-use-long-file-name 'not-cache) - group - (let ((group (nnheader-replace-duplicate-chars-in-string - (nnheader-replace-chars-in-string group ?/ ?_) - ?. ?_))) - ;; Translate the first colon into a slash. - (when (string-match ":" group) - (setq group (concat (substring group 0 (match-beginning 0)) - "/" (substring group (match-end 0))))) - (nnheader-replace-chars-in-string group ?. ?/))) - t) - gnus-cache-directory)))) - -(defun gnus-cache-update-article (group article) - "If ARTICLE is in the cache, remove it and re-enter it." - (gnus-cache-change-buffer group) - (when (gnus-cache-possibly-remove-article article nil nil nil t) - (let ((gnus-use-cache nil)) - (gnus-cache-possibly-enter-article - gnus-newsgroup-name article (gnus-summary-article-header article) - nil nil nil t)))) - -(defun gnus-cache-possibly-remove-article (article ticked dormant unread - &optional force) - "Possibly remove ARTICLE from the cache." - (let ((group gnus-newsgroup-name) - (number article) - file) - ;; If this is a virtual group, we find the real group. - (when (gnus-virtual-group-p group) - (let ((result (nnvirtual-find-group-art - (gnus-group-real-name group) article))) - (setq group (car result) - number (cdr result)))) - (setq file (gnus-cache-file-name group number)) - (when (and (file-exists-p file) - (or force - (gnus-cache-member-of-class - gnus-cache-remove-articles ticked dormant unread))) - (save-excursion - (delete-file file) - (set-buffer (cdr gnus-cache-buffer)) - (goto-char (point-min)) - (when (or (looking-at (concat (int-to-string number) "\t")) - (search-forward (concat "\n" (int-to-string number) "\t") - (point-max) t)) - (delete-region (progn (beginning-of-line) (point)) - (progn (forward-line 1) (point))))) - (setq gnus-newsgroup-cached - (delq article gnus-newsgroup-cached)) - (gnus-summary-update-secondary-mark article) - t))) - -(defun gnus-cache-articles-in-group (group) - "Return a sorted list of cached articles in GROUP." - (let ((dir (file-name-directory (gnus-cache-file-name group 1))) - articles) - (when (file-exists-p dir) - (setq articles - (sort (mapcar (lambda (name) (string-to-int name)) - (directory-files dir nil "^[0-9]+$" t)) - '<)) - ;; Update the cache active file, just to synch more. - (when articles - (gnus-cache-update-active group (car articles) t) - (gnus-cache-update-active group (car (last articles)))) - articles))) - -(defun gnus-cache-braid-nov (group cached &optional file) - (let ((cache-buf (gnus-get-buffer-create " *gnus-cache*")) - beg end) - (gnus-cache-save-buffers) - (save-excursion - (set-buffer cache-buf) - (erase-buffer) - (let ((nnheader-file-coding-system gnus-cache-overview-coding-system)) - (nnheader-insert-file-contents - (or file (gnus-cache-file-name group ".overview")))) - (goto-char (point-min)) - (insert "\n") - (goto-char (point-min))) - (set-buffer nntp-server-buffer) - (goto-char (point-min)) - (while cached - (while (and (not (eobp)) - (< (read (current-buffer)) (car cached))) - (forward-line 1)) - (beginning-of-line) - (save-excursion - (set-buffer cache-buf) - (if (search-forward (concat "\n" (int-to-string (car cached)) "\t") - nil t) - (setq beg (progn (beginning-of-line) (point)) - end (progn (end-of-line) (point))) - (setq beg nil))) - (when beg - (insert-buffer-substring cache-buf beg end) - (insert "\n")) - (setq cached (cdr cached))) - (kill-buffer cache-buf))) - -(defun gnus-cache-braid-heads (group cached) - (let ((cache-buf (gnus-get-buffer-create " *gnus-cache*"))) - (save-excursion - (set-buffer cache-buf) - (erase-buffer)) - (set-buffer nntp-server-buffer) - (goto-char (point-min)) - (while cached - (while (and (not (eobp)) - (looking-at "2.. +\\([0-9]+\\) ") - (< (progn (goto-char (match-beginning 1)) - (read (current-buffer))) - (car cached))) - (search-forward "\n.\n" nil 'move)) - (beginning-of-line) - (save-excursion - (set-buffer cache-buf) - (erase-buffer) - (let ((nnheader-file-coding-system gnus-cache-coding-system)) - (nnheader-insert-file-contents - (gnus-cache-file-name group (car cached)))) - (goto-char (point-min)) - (insert "220 ") - (princ (car cached) (current-buffer)) - (insert " Article retrieved.\n") - (search-forward "\n\n" nil 'move) - (delete-region (point) (point-max)) - (forward-char -1) - (insert ".")) - (insert-buffer-substring cache-buf) - (setq cached (cdr cached))) - (kill-buffer cache-buf))) - -;;;###autoload -(defun gnus-jog-cache () - "Go through all groups and put the articles into the cache. - -Usage: -$ emacs -batch -l ~/.emacs -l gnus -f gnus-jog-cache" - (interactive) - (let ((gnus-mark-article-hook nil) - (gnus-expert-user t) - (nnmail-spool-file nil) - (mail-sources nil) - (gnus-use-dribble-file nil) - (gnus-novice-user nil) - (gnus-large-newsgroup nil)) - ;; Start Gnus. - (gnus) - ;; Go through all groups... - (gnus-group-mark-buffer) - (gnus-group-iterate nil - (lambda (group) - (let (gnus-auto-select-next) - (gnus-summary-read-group group nil t) - ;; ... and enter the articles into the cache. - (when (eq major-mode 'gnus-summary-mode) - (gnus-uu-mark-buffer) - (gnus-cache-enter-article) - (kill-buffer (current-buffer)))))))) - -(defun gnus-cache-read-active (&optional force) - "Read the cache active file." - (gnus-make-directory gnus-cache-directory) - (if (or (not (file-exists-p gnus-cache-active-file)) - (zerop (nth 7 (file-attributes gnus-cache-active-file))) - force) - ;; There is no active file, so we generate one. - (gnus-cache-generate-active) - ;; We simply read the active file. - (save-excursion - (gnus-set-work-buffer) - (nnheader-insert-file-contents gnus-cache-active-file) - (gnus-active-to-gnus-format - nil (setq gnus-cache-active-hashtb - (gnus-make-hashtable - (count-lines (point-min) (point-max))))) - (setq gnus-cache-active-altered nil)))) - -(defun gnus-cache-write-active (&optional force) - "Write the active hashtb to the active file." - (when (or force - (and gnus-cache-active-hashtb - gnus-cache-active-altered)) - (gnus-write-active-file gnus-cache-active-file gnus-cache-active-hashtb t) - ;; Mark the active hashtb as unaltered. - (setq gnus-cache-active-altered nil))) - -(defun gnus-cache-possibly-update-active (group active) - "Update active info bounds of GROUP with ACTIVE if necessary. -The update is performed if ACTIVE contains a higher or lower bound -than the current." - (let ((lower t) (higher t)) - (if gnus-cache-active-hashtb - (let ((cache-active (gnus-gethash group gnus-cache-active-hashtb))) - (when cache-active - (unless (< (car active) (car cache-active)) - (setq lower nil)) - (unless (> (cdr active) (cdr cache-active)) - (setq higher nil)))) - (gnus-cache-read-active)) - (when lower - (gnus-cache-update-active group (car active) t)) - (when higher - (gnus-cache-update-active group (cdr active))))) - -(defun gnus-cache-update-active (group number &optional low) - "Update the upper bound of the active info of GROUP to NUMBER. -If LOW, update the lower bound instead." - (let ((active (gnus-gethash group gnus-cache-active-hashtb))) - (if (null active) - ;; We just create a new active entry for this group. - (gnus-sethash group (cons number number) gnus-cache-active-hashtb) - ;; Update the lower or upper bound. - (if low - (setcar active number) - (setcdr active number))) - ;; Mark the active hashtb as altered. - (setq gnus-cache-active-altered t))) - -;;;###autoload -(defun gnus-cache-generate-active (&optional directory) - "Generate the cache active file." - (interactive) - (let* ((top (null directory)) - (directory (expand-file-name (or directory gnus-cache-directory))) - (files (directory-files directory 'full)) - (group - (if top - "" - (string-match - (concat "^" (regexp-quote - (file-name-as-directory - (expand-file-name gnus-cache-directory)))) - (directory-file-name directory)) - (nnheader-replace-chars-in-string - (substring (directory-file-name directory) (match-end 0)) - ?/ ?.))) - nums alphs) - (when top - (gnus-message 5 "Generating the cache active file...") - (setq gnus-cache-active-hashtb (gnus-make-hashtable 123))) - (when (string-match "^\\(nn[^_]+\\)_" group) - (setq group (replace-match "\\1:" t t group))) - ;; Separate articles from all other files and directories. - (while files - (if (string-match "^[0-9]+$" (file-name-nondirectory (car files))) - (push (string-to-int (file-name-nondirectory (pop files))) nums) - (push (pop files) alphs))) - ;; If we have nums, then this is probably a valid group. - (when (setq nums (sort nums '<)) - (gnus-sethash group (cons (car nums) (gnus-last-element nums)) - gnus-cache-active-hashtb)) - ;; Go through all the other files. - (while alphs - (when (and (file-directory-p (car alphs)) - (not (string-match "^\\." - (file-name-nondirectory (car alphs))))) - ;; We descend directories. - (gnus-cache-generate-active (car alphs))) - (setq alphs (cdr alphs))) - ;; Write the new active file. - (when top - (gnus-cache-write-active t) - (gnus-message 5 "Generating the cache active file...done")))) - -;;;###autoload -(defun gnus-cache-generate-nov-databases (dir) - "Generate NOV files recursively starting in DIR." - (interactive (list gnus-cache-directory)) - (gnus-cache-close) - (let ((nnml-generate-active-function 'identity)) - (nnml-generate-nov-databases-1 dir)) - (gnus-cache-open)) - -(defun gnus-cache-move-cache (dir) - "Move the cache tree to somewhere else." - (interactive "FMove the cache tree to: ") - (rename-file gnus-cache-directory dir)) - -(defun gnus-cache-fully-p (&optional group) - "Returns non-nil if the cache should be fully used. -If GROUP is non-nil, also cater to `gnus-cacheable-groups' and -`gnus-uncacheable-groups'." - (and gnus-use-cache - (not (eq gnus-use-cache 'passive)) - (if (null group) - t - (and (or (not gnus-cacheable-groups) - (string-match gnus-cacheable-groups group)) - (or (not gnus-uncacheable-groups) - (not (string-match gnus-uncacheable-groups group))))))) - -(provide 'gnus-cache) - -;;; gnus-cache.el ends here diff --git a/lisp/gnus-cite.el b/lisp/gnus-cite.el deleted file mode 100644 index 657313b..0000000 --- a/lisp/gnus-cite.el +++ /dev/null @@ -1,1000 +0,0 @@ -;;; gnus-cite.el --- parse citations in articles for Gnus -*- coding: iso-latin-1 -*- - -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Per Abhiddenware - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'static)) - -(require 'gnus) -(require 'gnus-art) -(require 'gnus-range) -(require 'message) ; for message-cite-prefix-regexp - -;;; Customization: - -(defgroup gnus-cite nil - "Citation." - :prefix "gnus-cite-" - :link '(custom-manual "(gnus)Article Highlighting") - :group 'gnus-article) - -(defcustom gnus-cite-reply-regexp - "^\\(Subject: Re\\|In-Reply-To\\|References\\):" - "*If headers match this regexp it is reasonable to believe that -article has citations." - :group 'gnus-cite - :type 'string) - -(defcustom gnus-cite-always-check nil - "Check article always for citations. Set it t to check all articles." - :group 'gnus-cite - :type '(choice (const :tag "no" nil) - (const :tag "yes" t))) - -(defcustom gnus-cited-opened-text-button-line-format "%(%{[-]%}%)\n" - "Format of opened cited text buttons." - :group 'gnus-cite - :type 'string) - -(defcustom gnus-cited-closed-text-button-line-format "%(%{[+]%}%)\n" - "Format of closed cited text buttons." - :group 'gnus-cite - :type 'string) - -(defcustom gnus-cited-lines-visible nil - "The number of lines of hidden cited text to remain visible. -Or a pair (cons) of numbers which are the number of lines at the top -and bottom of the text, respectively, to remain visible." - :group 'gnus-cite - :type '(choice (const :tag "none" nil) - integer - (cons :tag "Top and Bottom" integer integer))) - -(defcustom gnus-cite-parse-max-size 25000 - "Maximum article size (in bytes) where parsing citations is allowed. -Set it to nil to parse all articles." - :group 'gnus-cite - :type '(choice (const :tag "all" nil) - integer)) - -(defcustom gnus-cite-max-prefix 20 - "Maximum possible length for a citation prefix." - :group 'gnus-cite - :type 'integer) - -(defcustom gnus-supercite-regexp - (concat "^\\(" message-cite-prefix-regexp "\\)? *" - ">>>>> +\"\\([^\"\n]+\\)\" +==") - "*Regexp matching normal Supercite attribution lines. -The first grouping must match prefixes added by other packages." - :group 'gnus-cite - :type 'regexp) - -(defcustom gnus-supercite-secondary-regexp "^.*\"\\([^\"\n]+\\)\" +==" - "Regexp matching mangled Supercite attribution lines. -The first regexp group should match the Supercite attribution." - :group 'gnus-cite - :type 'regexp) - -(defcustom gnus-cite-minimum-match-count 2 - "Minimum number of identical prefixes before we believe it's a citation." - :group 'gnus-cite - :type 'integer) - -(defcustom gnus-cite-attribution-prefix - "In article\\|in <\\|On \\(Mon\\|Tue\\|Wed\\|Thu\\|Fri\\|Sat\\|Sun\\),\\|-----Original Message-----" - "*Regexp matching the beginning of an attribution line." - :group 'gnus-cite - :type 'regexp) - -(defcustom gnus-cite-attribution-suffix - "\\(\\(wrote\\|writes\\|said\\|says\\|>\\)\\(:\\|\\.\\.\\.\\)\\|-----Original Message-----\\)[ \t]*$" - "*Regexp matching the end of an attribution line. -The text matching the first grouping will be used as a button." - :group 'gnus-cite - :type 'regexp) - -(defface gnus-cite-attribution-face '((t - (:italic t))) - "Face used for attribution lines.") - -(defcustom gnus-cite-attribution-face 'gnus-cite-attribution-face - "Face used for attribution lines. -It is merged with the face for the cited text belonging to the attribution." - :group 'gnus-cite - :type 'face) - -(defface gnus-cite-face-1 '((((class color) - (background dark)) - (:foreground "light blue")) - (((class color) - (background light)) - (:foreground "MidnightBlue")) - (t - (:italic t))) - "Citation face.") - -(defface gnus-cite-face-2 '((((class color) - (background dark)) - (:foreground "light cyan")) - (((class color) - (background light)) - (:foreground "firebrick")) - (t - (:italic t))) - "Citation face.") - -(defface gnus-cite-face-3 '((((class color) - (background dark)) - (:foreground "light yellow")) - (((class color) - (background light)) - (:foreground "dark green")) - (t - (:italic t))) - "Citation face.") - -(defface gnus-cite-face-4 '((((class color) - (background dark)) - (:foreground "light pink")) - (((class color) - (background light)) - (:foreground "OrangeRed")) - (t - (:italic t))) - "Citation face.") - -(defface gnus-cite-face-5 '((((class color) - (background dark)) - (:foreground "pale green")) - (((class color) - (background light)) - (:foreground "dark khaki")) - (t - (:italic t))) - "Citation face.") - -(defface gnus-cite-face-6 '((((class color) - (background dark)) - (:foreground "beige")) - (((class color) - (background light)) - (:foreground "dark violet")) - (t - (:italic t))) - "Citation face.") - -(defface gnus-cite-face-7 '((((class color) - (background dark)) - (:foreground "orange")) - (((class color) - (background light)) - (:foreground "SteelBlue4")) - (t - (:italic t))) - "Citation face.") - -(defface gnus-cite-face-8 '((((class color) - (background dark)) - (:foreground "magenta")) - (((class color) - (background light)) - (:foreground "magenta")) - (t - (:italic t))) - "Citation face.") - -(defface gnus-cite-face-9 '((((class color) - (background dark)) - (:foreground "violet")) - (((class color) - (background light)) - (:foreground "violet")) - (t - (:italic t))) - "Citation face.") - -(defface gnus-cite-face-10 '((((class color) - (background dark)) - (:foreground "medium purple")) - (((class color) - (background light)) - (:foreground "medium purple")) - (t - (:italic t))) - "Citation face.") - -(defface gnus-cite-face-11 '((((class color) - (background dark)) - (:foreground "turquoise")) - (((class color) - (background light)) - (:foreground "turquoise")) - (t - (:italic t))) - "Citation face.") - -(defcustom gnus-cite-face-list - '(gnus-cite-face-1 gnus-cite-face-2 gnus-cite-face-3 gnus-cite-face-4 - gnus-cite-face-5 gnus-cite-face-6 gnus-cite-face-7 gnus-cite-face-8 - gnus-cite-face-9 gnus-cite-face-10 gnus-cite-face-11) - "*List of faces used for highlighting citations. - -When there are citations from multiple articles in the same message, -Gnus will try to give each citation from each article its own face. -This should make it easier to see who wrote what." - :group 'gnus-cite - :type '(repeat face)) - -(defcustom gnus-cite-hide-percentage 50 - "Only hide excess citation if above this percentage of the body." - :group 'gnus-cite - :type 'number) - -(defcustom gnus-cite-hide-absolute 10 - "Only hide excess citation if above this number of lines in the body." - :group 'gnus-cite - :type 'integer) - -;;; Internal Variables: - -(defvar gnus-cite-article nil) -(defvar gnus-cite-overlay-list nil) - -(defvar gnus-cite-prefix-alist nil) -;; Alist of citation prefixes. -;; The cdr is a list of lines with that prefix. - -(defvar gnus-cite-attribution-alist nil) -;; Alist of attribution lines. -;; The car is a line number. -;; The cdr is the prefix for the citation started by that line. - -(defvar gnus-cite-loose-prefix-alist nil) -;; Alist of citation prefixes that have no matching attribution. -;; The cdr is a list of lines with that prefix. - -(defvar gnus-cite-loose-attribution-alist nil) -;; Alist of attribution lines that have no matching citation. -;; Each member has the form (WROTE IN PREFIX TAG), where -;; WROTE: is the attribution line number -;; IN: is the line number of the previous line if part of the same attribution, -;; PREFIX: Is the citation prefix of the attribution line(s), and -;; TAG: Is a Supercite tag, if any. - -(defvar gnus-cited-opened-text-button-line-format-alist - `((?b (marker-position beg) ?d) - (?e (marker-position end) ?d) - (?n (count-lines beg end) ?d) - (?l (- end beg) ?d))) -(defvar gnus-cited-opened-text-button-line-format-spec nil) -(defvar gnus-cited-closed-text-button-line-format-alist - gnus-cited-opened-text-button-line-format-alist) -(defvar gnus-cited-closed-text-button-line-format-spec nil) - - -;;; Commands: - -(defun gnus-article-highlight-citation (&optional force) - "Highlight cited text. -Each citation in the article will be highlighted with a different face. -The faces are taken from `gnus-cite-face-list'. -Attribution lines are highlighted with the same face as the -corresponding citation merged with `gnus-cite-attribution-face'. - -Text is considered cited if at least `gnus-cite-minimum-match-count' -lines matches `message-cite-prefix-regexp' with the same prefix. - -Lines matching `gnus-cite-attribution-suffix' and perhaps -`gnus-cite-attribution-prefix' are considered attribution lines." - (interactive (list 'force)) - (save-excursion - (set-buffer gnus-article-buffer) - (gnus-cite-parse-maybe force) - (let ((buffer-read-only nil) - (alist gnus-cite-prefix-alist) - (faces gnus-cite-face-list) - (inhibit-point-motion-hooks t) - face entry prefix skip numbers number face-alist) - ;; Loop through citation prefixes. - (while alist - (setq entry (car alist) - alist (cdr alist) - prefix (car entry) - numbers (cdr entry) - face (car faces) - faces (or (cdr faces) gnus-cite-face-list) - face-alist (cons (cons prefix face) face-alist)) - (while numbers - (setq number (car numbers) - numbers (cdr numbers)) - (and (not (assq number gnus-cite-attribution-alist)) - (not (assq number gnus-cite-loose-attribution-alist)) - (gnus-cite-add-face number prefix face)))) - ;; Loop through attribution lines. - (setq alist gnus-cite-attribution-alist) - (while alist - (setq entry (car alist) - alist (cdr alist) - number (car entry) - prefix (cdr entry) - skip (gnus-cite-find-prefix number) - face (cdr (assoc prefix face-alist))) - ;; Add attribution button. - (goto-char (point-min)) - (forward-line (1- number)) - (when (re-search-forward gnus-cite-attribution-suffix - (save-excursion (end-of-line 1) (point)) - t) - (gnus-article-add-button (match-beginning 1) (match-end 1) - 'gnus-cite-toggle prefix)) - ;; Highlight attribution line. - (gnus-cite-add-face number skip face) - (gnus-cite-add-face number skip gnus-cite-attribution-face)) - ;; Loop through attribution lines. - (setq alist gnus-cite-loose-attribution-alist) - (while alist - (setq entry (car alist) - alist (cdr alist) - number (car entry) - skip (gnus-cite-find-prefix number)) - (gnus-cite-add-face number skip gnus-cite-attribution-face))))) - -(defun gnus-dissect-cited-text () - "Dissect the article buffer looking for cited text." - (save-excursion - (set-buffer gnus-article-buffer) - (gnus-cite-parse-maybe nil t) - (let ((alist gnus-cite-prefix-alist) - prefix numbers number marks m) - ;; Loop through citation prefixes. - (while alist - (setq numbers (pop alist) - prefix (pop numbers)) - (while numbers - (setq number (pop numbers)) - (goto-char (point-min)) - (forward-line number) - (push (cons (point-marker) "") marks) - (while (and numbers - (= (1- number) (car numbers))) - (setq number (pop numbers))) - (goto-char (point-min)) - (forward-line (1- number)) - (push (cons (point-marker) prefix) marks))) - ;; Skip to the beginning of the body. - (article-goto-body) - (push (cons (point-marker) "") marks) - ;; Find the end of the body. - (goto-char (point-max)) - (gnus-article-search-signature) - (push (cons (point-marker) "") marks) - ;; Sort the marks. - (setq marks (sort marks 'car-less-than-car)) - (let ((omarks marks)) - (setq marks nil) - (while (cdr omarks) - (if (= (caar omarks) (caadr omarks)) - (progn - (unless (equal (cdar omarks) "") - (push (car omarks) marks)) - (unless (equal (cdadr omarks) "") - (push (cadr omarks) marks)) - (unless (and (equal (cdar omarks) "") - (equal (cdadr omarks) "") - (not (cddr omarks))) - (setq omarks (cdr omarks)))) - (push (car omarks) marks)) - (setq omarks (cdr omarks))) - (when (car omarks) - (push (car omarks) marks)) - (setq marks (setq m (nreverse marks))) - (while (cddr m) - (if (and (equal (cdadr m) "") - (equal (cdar m) (cdaddr m)) - (goto-char (caadr m)) - (forward-line 1) - (= (point) (caaddr m))) - (setcdr m (cdddr m)) - (setq m (cdr m)))) - marks)))) - -(defun gnus-article-fill-cited-article (&optional force width) - "Do word wrapping in the current article. -If WIDTH (the numerical prefix), use that text width when filling." - (interactive (list t current-prefix-arg)) - (save-excursion - (set-buffer gnus-article-buffer) - (let ((buffer-read-only nil) - (inhibit-point-motion-hooks t) - (marks (gnus-dissect-cited-text)) - (adaptive-fill-mode nil) - (filladapt-mode nil) - (fill-column (if width (prefix-numeric-value width) fill-column))) - (save-restriction - (while (cdr marks) - (narrow-to-region (caar marks) (caadr marks)) - (let ((adaptive-fill-regexp - (concat "^" (regexp-quote (cdar marks)) " *")) - (fill-prefix - (if (string= (cdar marks) "") "" - (concat (cdar marks) " ")))) - (fill-region (point-min) (point-max))) - (set-marker (caar marks) nil) - (setq marks (cdr marks))) - (when marks - (set-marker (caar marks) nil)) - ;; All this information is now incorrect. - (setq gnus-cite-prefix-alist nil - gnus-cite-attribution-alist nil - gnus-cite-loose-prefix-alist nil - gnus-cite-loose-attribution-alist nil - gnus-cite-article nil))))) - -(defun gnus-article-hide-citation (&optional arg force) - "Toggle hiding of all cited text except attribution lines. -See the documentation for `gnus-article-highlight-citation'. -If given a negative prefix, always show; if given a positive prefix, -always hide." - (interactive (append (gnus-article-hidden-arg) (list 'force))) - (gnus-set-format 'cited-opened-text-button t) - (gnus-set-format 'cited-closed-text-button t) - (save-excursion - (set-buffer gnus-article-buffer) - (let ((buffer-read-only nil) - marks - (inhibit-point-motion-hooks t) - (props (nconc (list 'article-type 'cite) - gnus-hidden-properties)) - (point (point-min)) - found beg end start) - (while (setq point - (text-property-any point (point-max) - 'gnus-callback - 'gnus-article-toggle-cited-text)) - (setq found t) - (goto-char point) - (gnus-article-toggle-cited-text - (get-text-property point 'gnus-data) arg) - (forward-line 1) - (setq point (point))) - (unless found - (setq marks (gnus-dissect-cited-text)) - (while marks - (setq beg nil - end nil) - (while (and marks (string= (cdar marks) "")) - (setq marks (cdr marks))) - (when marks - (setq beg (caar marks))) - (while (and marks (not (string= (cdar marks) ""))) - (setq marks (cdr marks))) - (when marks - (setq end (caar marks))) - ;; Skip past lines we want to leave visible. - (when (and beg end gnus-cited-lines-visible) - (goto-char beg) - (forward-line (if (consp gnus-cited-lines-visible) - (car gnus-cited-lines-visible) - gnus-cited-lines-visible)) - (if (>= (point) end) - (setq beg nil) - (setq beg (point-marker)) - (when (consp gnus-cited-lines-visible) - (goto-char end) - (forward-line (- (cdr gnus-cited-lines-visible))) - (if (<= (point) beg) - (setq beg nil) - (setq end (point-marker)))))) - (when (and beg end) - ;; We use markers for the end-points to facilitate later - ;; wrapping and mangling of text. - (setq beg (set-marker (make-marker) beg) - end (set-marker (make-marker) end)) - (gnus-add-text-properties-when 'article-type nil beg end props) - (goto-char beg) - (unless (save-excursion (search-backward "\n\n" nil t)) - (insert "\n")) - (put-text-property - (setq start (point-marker)) - (progn - (gnus-article-add-button - (point) - (progn (eval gnus-cited-closed-text-button-line-format-spec) - (point)) - `gnus-article-toggle-cited-text - (list (cons beg end) start)) - (point)) - 'article-type 'annotation) - (set-marker beg (point)))))))) - -(defun gnus-article-toggle-cited-text (args &optional arg) - "Toggle hiding the text in REGION. -ARG can be nil or a number. Positive means hide, negative -means show, nil means toggle." - (let* ((region (car args)) - (beg (car region)) - (end (cdr region)) - (start (cadr args)) - (hidden - (text-property-any beg (1- end) 'article-type 'cite)) - (inhibit-point-motion-hooks t) - buffer-read-only) - (when (or (null arg) - (zerop arg) - (and (> arg 0) (not hidden)) - (and (< arg 0) hidden)) - (if hidden - (gnus-remove-text-properties-when - 'article-type 'cite beg end - (cons 'article-type (cons 'cite - gnus-hidden-properties))) - (gnus-add-text-properties-when - 'article-type nil beg end - (cons 'article-type (cons 'cite - gnus-hidden-properties)))) - (save-excursion - (goto-char start) - (gnus-delete-line) - (put-text-property - (point) - (progn - (gnus-article-add-button - (point) - (progn (eval - (if hidden - gnus-cited-opened-text-button-line-format-spec - gnus-cited-closed-text-button-line-format-spec)) - (point)) - `gnus-article-toggle-cited-text - args) - (point)) - 'article-type 'annotation))))) - -(defun gnus-article-hide-citation-maybe (&optional arg force) - "Toggle hiding of cited text that has an attribution line. -If given a negative prefix, always show; if given a positive prefix, -always hide. -This will do nothing unless at least `gnus-cite-hide-percentage' -percent and at least `gnus-cite-hide-absolute' lines of the body is -cited text with attributions. When called interactively, these two -variables are ignored. -See also the documentation for `gnus-article-highlight-citation'." - (interactive (append (gnus-article-hidden-arg) '(force))) - (unless (gnus-article-check-hidden-text 'cite arg) - (save-excursion - (set-buffer gnus-article-buffer) - (gnus-cite-parse-maybe force) - (article-goto-body) - (let ((start (point)) - (atts gnus-cite-attribution-alist) - (buffer-read-only nil) - (inhibit-point-motion-hooks t) - (hidden 0) - total) - (goto-char (point-max)) - (gnus-article-search-signature) - (setq total (count-lines start (point))) - (while atts - (setq hidden (+ hidden (length (cdr (assoc (cdar atts) - gnus-cite-prefix-alist)))) - atts (cdr atts))) - (when (or force - (and (> (* 100 hidden) (* gnus-cite-hide-percentage total)) - (> hidden gnus-cite-hide-absolute))) - (setq atts gnus-cite-attribution-alist) - (while atts - (setq total (cdr (assoc (cdar atts) gnus-cite-prefix-alist)) - atts (cdr atts)) - (while total - (setq hidden (car total) - total (cdr total)) - (goto-char (point-min)) - (forward-line (1- hidden)) - (unless (assq hidden gnus-cite-attribution-alist) - (gnus-add-text-properties - (point) (progn (forward-line 1) (point)) - (nconc (list 'article-type 'cite) - gnus-hidden-properties)))))))))) - -(defun gnus-article-hide-citation-in-followups () - "Hide cited text in non-root articles." - (interactive) - (save-excursion - (set-buffer gnus-article-buffer) - (let ((article (cdr gnus-article-current))) - (unless (save-excursion - (set-buffer gnus-summary-buffer) - (gnus-article-displayed-root-p article)) - (gnus-article-hide-citation))))) - -;;; Internal functions: - -(defun gnus-cite-parse-maybe (&optional force no-overlay) - "Always parse the buffer." - (gnus-cite-localize) - ;;Reset parser information. - (setq gnus-cite-prefix-alist nil - gnus-cite-attribution-alist nil - gnus-cite-loose-prefix-alist nil - gnus-cite-loose-attribution-alist nil) - (unless no-overlay - (gnus-cite-delete-overlays)) - ;; Parse if not too large. - (if (and gnus-cite-parse-max-size - (> (buffer-size) gnus-cite-parse-max-size)) - () - (setq gnus-cite-article (cons (car gnus-article-current) - (cdr gnus-article-current))) - (gnus-cite-parse-wrapper))) - -(defun gnus-cite-delete-overlays () - (dolist (overlay gnus-cite-overlay-list) - (when (or (not (gnus-overlay-end overlay)) - (and (>= (gnus-overlay-end overlay) (point-min)) - (<= (gnus-overlay-end overlay) (point-max)))) - (setq gnus-cite-overlay-list (delete overlay gnus-cite-overlay-list)) - (gnus-delete-overlay overlay)))) - -(defun gnus-cite-parse-wrapper () - ;; Wrap chopped gnus-cite-parse. - (article-goto-body) - (let ((inhibit-point-motion-hooks t)) - (save-excursion - (gnus-cite-parse-attributions)) - (save-excursion - (gnus-cite-parse)) - (save-excursion - (gnus-cite-connect-attributions)))) - -(defun gnus-cite-parse () - ;; Parse and connect citation prefixes and attribution lines. - - ;; Parse current buffer searching for citation prefixes. - (let ((line (1+ (count-lines (point-min) (point)))) - (case-fold-search t) - (max (save-excursion - (goto-char (point-max)) - (gnus-article-search-signature) - (point))) - (prefix-regexp (concat "^\\(" message-cite-prefix-regexp "\\)")) - alist entry start begin end numbers prefix guess-limit mc-flag) - ;; Get all potential prefixes in `alist'. - (while (< (point) max) - ;; Each line. - (setq begin (point) - guess-limit (progn (skip-chars-forward "^> \t\r\n") (point)) - end (progn (beginning-of-line 2) (point)) - start end) - (goto-char begin) - ;; Ignore standard Supercite attribution prefix. - (when (and (< guess-limit (+ begin gnus-cite-max-prefix)) - (looking-at gnus-supercite-regexp)) - (if (match-end 1) - (setq end (1+ (match-end 1))) - (setq end (1+ begin)))) - ;; Ignore very long prefixes. - (when (> end (+ begin gnus-cite-max-prefix)) - (setq end (+ begin gnus-cite-max-prefix))) - (while (re-search-forward prefix-regexp (1- end) t) - ;; Each prefix. - (setq end (match-end 0) - prefix (buffer-substring begin end)) - (gnus-set-text-properties 0 (length prefix) nil prefix) - (setq entry (assoc prefix alist)) - (if entry - (setcdr entry (cons line (cdr entry))) - (push (list prefix line) alist)) - (goto-char begin)) - (goto-char start) - (setq line (1+ line))) - ;; We got all the potential prefixes. Now create - ;; `gnus-cite-prefix-alist' containing the oldest prefix for each - ;; line that appears at least gnus-cite-minimum-match-count - ;; times. First sort them by length. Longer is older. - (setq alist (sort alist (lambda (a b) - (> (length (car a)) (length (car b)))))) - (while alist - (setq entry (car alist) - prefix (car entry) - numbers (cdr entry) - alist (cdr alist)) - (cond ((null numbers) - ;; No lines with this prefix that wasn't also part of - ;; a longer prefix. - ) - ((< (length numbers) gnus-cite-minimum-match-count) - ;; Too few lines with this prefix. We keep it a bit - ;; longer in case it is an exact match for an attribution - ;; line, but we don't remove the line from other - ;; prefixes. - (push entry gnus-cite-prefix-alist)) - (t - (push entry - gnus-cite-prefix-alist) - ;; Remove articles from other prefixes. - (let ((loop alist) - current) - (while loop - (setq current (car loop) - loop (cdr loop)) - (setcdr current - (gnus-set-difference (cdr current) numbers))))))))) - -(defun gnus-cite-parse-attributions () - (let (al-alist) - ;; Parse attributions - (while (re-search-forward gnus-cite-attribution-suffix (point-max) t) - (let* ((start (match-beginning 0)) - (end (match-end 0)) - (wrote (count-lines (point-min) end)) - (prefix (gnus-cite-find-prefix wrote)) - ;; Check previous line for an attribution leader. - (tag (progn - (beginning-of-line 1) - (when (looking-at gnus-supercite-secondary-regexp) - (buffer-substring (match-beginning 1) - (match-end 1))))) - (in (progn - (goto-char start) - (and (re-search-backward gnus-cite-attribution-prefix - (save-excursion - (beginning-of-line 0) - (point)) - t) - (not (re-search-forward gnus-cite-attribution-suffix - start t)) - (count-lines (point-min) (1+ (point))))))) - (when (eq wrote in) - (setq in nil)) - (goto-char end) - ;; don't add duplicates - (let ((al (buffer-substring (save-excursion (beginning-of-line 0) - (1+ (point))) - end))) - (if (not (assoc al al-alist)) - (progn - (push (list wrote in prefix tag) - gnus-cite-loose-attribution-alist) - (push (cons al t) al-alist)))))))) - -(defun gnus-cite-connect-attributions () - ;; Connect attributions to citations - - ;; No citations have been connected to attribution lines yet. - (setq gnus-cite-loose-prefix-alist (append gnus-cite-prefix-alist nil)) - - ;; Parse current buffer searching for attribution lines. - ;; Find exact supercite citations. - (gnus-cite-match-attributions 'small nil - (lambda (prefix tag) - (when tag - (concat "\\`" - (regexp-quote prefix) "[ \t]*" - (regexp-quote tag) ">")))) - ;; Find loose supercite citations after attributions. - (gnus-cite-match-attributions 'small t - (lambda (prefix tag) - (when tag - (concat "\\<" - (regexp-quote tag) - "\\>")))) - ;; Find loose supercite citations anywhere. - (gnus-cite-match-attributions 'small nil - (lambda (prefix tag) - (when tag - (concat "\\<" - (regexp-quote tag) - "\\>")))) - ;; Find nested citations after attributions. - (gnus-cite-match-attributions 'small-if-unique t - (lambda (prefix tag) - (concat "\\`" (regexp-quote prefix) ".+"))) - ;; Find nested citations anywhere. - (gnus-cite-match-attributions 'small nil - (lambda (prefix tag) - (concat "\\`" (regexp-quote prefix) ".+"))) - ;; Remove loose prefixes with too few lines. - (let ((alist gnus-cite-loose-prefix-alist) - entry) - (while alist - (setq entry (car alist) - alist (cdr alist)) - (when (< (length (cdr entry)) gnus-cite-minimum-match-count) - (setq gnus-cite-prefix-alist - (delq entry gnus-cite-prefix-alist) - gnus-cite-loose-prefix-alist - (delq entry gnus-cite-loose-prefix-alist))))) - ;; Find flat attributions. - (gnus-cite-match-attributions 'first t nil) - ;; Find any attributions (are we getting desperate yet?). - (gnus-cite-match-attributions 'first nil nil)) - -(defun gnus-cite-match-attributions (sort after fun) - ;; Match all loose attributions and citations (SORT AFTER FUN) . - ;; - ;; If SORT is `small', the citation with the shortest prefix will be - ;; used, if it is `first' the first prefix will be used, if it is - ;; `small-if-unique' the shortest prefix will be used if the - ;; attribution line does not share its own prefix with other - ;; loose attribution lines, otherwise the first prefix will be used. - ;; - ;; If AFTER is non-nil, only citations after the attribution line - ;; will be considered. - ;; - ;; If FUN is non-nil, it will be called with the arguments (WROTE - ;; PREFIX TAG) and expected to return a regular expression. Only - ;; citations whose prefix matches the regular expression will be - ;; considered. - ;; - ;; WROTE is the attribution line number. - ;; PREFIX is the attribution line prefix. - ;; TAG is the Supercite tag on the attribution line. - (let ((atts gnus-cite-loose-attribution-alist) - (case-fold-search t) - att wrote in prefix tag regexp limit smallest best size) - (while atts - (setq att (car atts) - atts (cdr atts) - wrote (nth 0 att) - in (nth 1 att) - prefix (nth 2 att) - tag (nth 3 att) - regexp (if fun (funcall fun prefix tag) "") - size (cond ((eq sort 'small) t) - ((eq sort 'first) nil) - (t (< (length (gnus-cite-find-loose prefix)) 2))) - limit (if after wrote -1) - smallest 1000000 - best nil) - (let ((cites gnus-cite-loose-prefix-alist) - cite candidate numbers first compare) - (while cites - (setq cite (car cites) - cites (cdr cites) - candidate (car cite) - numbers (cdr cite) - first (apply 'min numbers) - compare (if size (length candidate) first)) - (and (> first limit) - regexp - (string-match regexp candidate) - (< compare smallest) - (setq best cite - smallest compare)))) - (if (null best) - () - (setq gnus-cite-loose-attribution-alist - (delq att gnus-cite-loose-attribution-alist)) - (push (cons wrote (car best)) gnus-cite-attribution-alist) - (when in - (push (cons in (car best)) gnus-cite-attribution-alist)) - (when (memq best gnus-cite-loose-prefix-alist) - (let ((loop gnus-cite-prefix-alist) - (numbers (cdr best)) - current) - (setq gnus-cite-loose-prefix-alist - (delq best gnus-cite-loose-prefix-alist)) - (while loop - (setq current (car loop) - loop (cdr loop)) - (if (eq current best) - () - (setcdr current (gnus-set-difference (cdr current) numbers)) - (when (null (cdr current)) - (setq gnus-cite-loose-prefix-alist - (delq current gnus-cite-loose-prefix-alist) - atts (delq current atts))))))))))) - -(defun gnus-cite-find-loose (prefix) - ;; Return a list of loose attribution lines prefixed by PREFIX. - (let* ((atts gnus-cite-loose-attribution-alist) - att line lines) - (while atts - (setq att (car atts) - line (car att) - atts (cdr atts)) - (when (string-equal (gnus-cite-find-prefix line) prefix) - (push line lines))) - lines)) - -(defun gnus-cite-add-face (number prefix face) - ;; At line NUMBER, ignore PREFIX and add FACE to the rest of the line. - (when face - (let ((inhibit-point-motion-hooks t) - from to overlay) - (goto-char (point-min)) - (when (zerop (forward-line (1- number))) - (static-if (or (featurep 'xemacs) - (and (eq emacs-major-version 20) - (>= emacs-minor-version 3)) - (>= emacs-major-version 21)) - (forward-char (length prefix)) - (move-to-column (string-width prefix))) - (skip-chars-forward " \t") - (setq from (point)) - (end-of-line 1) - (skip-chars-backward " \t") - (setq to (point)) - (when (< from to) - (push (setq overlay (gnus-make-overlay from to)) - gnus-cite-overlay-list) - (gnus-overlay-put overlay 'face face)))))) - -(defun gnus-cite-toggle (prefix) - (save-excursion - (set-buffer gnus-article-buffer) - (gnus-cite-parse-maybe nil t) - (let ((buffer-read-only nil) - (numbers (cdr (assoc prefix gnus-cite-prefix-alist))) - (inhibit-point-motion-hooks t) - number) - (while numbers - (setq number (car numbers) - numbers (cdr numbers)) - (goto-char (point-min)) - (forward-line (1- number)) - (cond ((get-text-property (point) 'invisible) - (remove-text-properties (point) (progn (forward-line 1) (point)) - gnus-hidden-properties)) - ((assq number gnus-cite-attribution-alist)) - (t - (gnus-add-text-properties - (point) (progn (forward-line 1) (point)) - (nconc (list 'article-type 'cite) - gnus-hidden-properties)))))))) - -(defun gnus-cite-find-prefix (line) - ;; Return citation prefix for LINE. - (let ((alist gnus-cite-prefix-alist) - (prefix "") - entry) - (while alist - (setq entry (car alist) - alist (cdr alist)) - (when (memq line (cdr entry)) - (setq prefix (car entry)))) - prefix)) - -(defun gnus-cite-localize () - "Make the citation variables local to the article buffer." - (let ((vars '(gnus-cite-article - gnus-cite-overlay-list gnus-cite-prefix-alist - gnus-cite-attribution-alist gnus-cite-loose-prefix-alist - gnus-cite-loose-attribution-alist))) - (while vars - (make-local-variable (pop vars))))) - -(gnus-ems-redefine) - -(provide 'gnus-cite) - -;; Local Variables: -;; coding: iso-8859-1 -;; End: - -;;; gnus-cite.el ends here diff --git a/lisp/gnus-clfns.el b/lisp/gnus-clfns.el deleted file mode 100644 index 123b9b1..0000000 --- a/lisp/gnus-clfns.el +++ /dev/null @@ -1,411 +0,0 @@ -;;; gnus-clfns.el --- compiler macros for emulating cl functions -;; Copyright (C) 2000, 2001 Free Software Foundation, Inc. - -;; Author: Kastsumi Yamaoka -;; Keywords: cl, compile - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; This module is for mainly avoiding cl runtime functions in FSF -;; Emacsen. Function should also be defined as an ordinary function -;; if it will not be provided in cl. - -;;; Code: - -(if (featurep 'xemacs) - nil - (eval-when-compile (require 'cl)) - (require 'pym) - - (define-compiler-macro butlast (&whole form x &optional n) - (if (and (fboundp 'butlast) - (subrp (symbol-function 'butlast))) - form - (if n - `(let ((x ,x) - (n ,n)) - (if (and n (<= n 0)) - x - (let ((m (length x))) - (or n (setq n 1)) - (and (< n m) - (progn - (if (> n 0) (setcdr (nthcdr (- (1- m) n) x) nil)) - x))))) - `(let* ((x ,x) - (m (length x))) - (and (< 1 m) - (progn - (setcdr (nthcdr (- m 2) x) nil) - x)))))) - - (define-compiler-macro coerce (&whole form x type) - (if (and (fboundp 'coerce) - (subrp (symbol-function 'coerce))) - form - `(let ((x ,x) - (type ,type)) - (cond ((eq type 'list) (if (listp x) x (append x nil))) - ((eq type 'vector) (if (vectorp x) x (vconcat x))) - ((eq type 'string) (if (stringp x) x (concat x))) - ((eq type 'array) (if (arrayp x) x (vconcat x))) - ((and (eq type 'character) (stringp x) (= (length x) 1)) - (aref x 0)) - ((and (eq type 'character) (symbolp x) - (= (length (symbol-name x)) 1)) - (aref (symbol-name x) 0)) - ((eq type 'float) (float x)) - ((typep x type) x) - (t (error "Can't coerce %s to type %s" x type)))))) - - (define-compiler-macro copy-list (&whole form list) - (if (and (fboundp 'copy-list) - (subrp (symbol-function 'copy-list))) - form - `(let ((list ,list)) - (if (consp list) - (let ((res nil)) - (while (consp list) (push (pop list) res)) - (prog1 (nreverse res) (setcdr res list))) - (car list))))) - - (define-compiler-macro last (&whole form x &optional n) - (if (and (fboundp 'last) - (subrp (symbol-function 'last))) - form - (if n - `(let* ((x ,x) - (n ,n) - (m 0) - (p x)) - (while (consp p) - (incf m) - (pop p)) - (if (<= n 0) - p - (if (< n m) - (nthcdr (- m n) x) - x))) - `(let ((x ,x)) - (while (consp (cdr x)) - (pop x)) - x)))) - - (define-compiler-macro merge (&whole form type seq1 seq2 pred &rest keys) - (if (and (fboundp 'merge) - (subrp (symbol-function 'merge))) - form - `(let ((type ,type) - (seq1 ,seq1) - (seq2 ,seq2) - (pred ,pred)) - (or (listp seq1) (setq seq1 (append seq1 nil))) - (or (listp seq2) (setq seq2 (append seq2 nil))) - (let ((res nil)) - (while (and seq1 seq2) - (if (funcall pred (car seq2) (car seq1)) - (push (pop seq2) res) - (push (pop seq1) res))) - (coerce (nconc (nreverse res) seq1 seq2) type))))) - - (define-compiler-macro string (&whole form &rest args) - (if (and (fboundp 'string) - (subrp (symbol-function 'string))) - form - (list 'concat (cons 'list args)))) - - (defun-maybe string (&rest args) - "Concatenate all the argument characters and make the result a string." - (concat args)) - - (define-compiler-macro string-to-list (&whole form string) - (cond ((fboundp 'string-to-list) - form) - ((fboundp 'string-to-char-list) - (list 'string-to-char-list string)) - (t - `(let* ((str ,string) - (len (length str)) - (idx 0) - c l) - (while (< idx len) - (setq c (sref str idx)) - (setq idx (+ idx (char-bytes c))) - (setq l (cons c l))) - (nreverse l))))) - - ;; 92.7.2 by K.Handa (imported from Mule 2.3) - (defun-maybe string-to-list (str) - (let ((len (length str)) - (idx 0) - c l) - (while (< idx len) - (setq c (sref str idx)) - (setq idx (+ idx (char-bytes c))) - (setq l (cons c l))) - (nreverse l))) - - (define-compiler-macro subseq (&whole form seq start &optional end) - (if (and (fboundp 'subseq) - (subrp (symbol-function 'subseq))) - form - (if end - `(let ((seq ,seq) - (start ,start) - (end ,end)) - (if (stringp seq) - (substring seq start end) - (let (len) - (if (< end 0) - (setq end (+ end (setq len (length seq))))) - (if (< start 0) - (setq start (+ start (or len (setq len (length seq)))))) - (cond ((listp seq) - (if (> start 0) - (setq seq (nthcdr start seq))) - (let ((res nil)) - (while (>= (setq end (1- end)) start) - (push (pop seq) res)) - (nreverse res))) - (t - (let ((res (make-vector (max (- end start) 0) nil)) - (i 0)) - (while (< start end) - (aset res i (aref seq start)) - (setq i (1+ i) - start (1+ start))) - res)))))) - `(let ((seq ,seq) - (start ,start)) - (if (stringp seq) - (substring seq start) - (let (len) - (if (< start 0) - (setq start (+ start (or len (setq len (length seq)))))) - (cond ((listp seq) - (if (> start 0) - (setq seq (nthcdr start seq))) - (copy-sequence seq)) - (t - (let* ((end (or len (length seq))) - (res (make-vector (max (- end start) 0) nil)) - (i 0)) - (while (< start end) - (aset res i (aref seq start)) - (setq i (1+ i) - start (1+ start))) - res))))))))) - ) - -;; A tool for the developers. - -(defvar cl-run-time-functions - '(Values - Values-list acons assoc-if assoc-if-not build-klist butlast ceiling* - coerce common-lisp-indent-function compiler-macroexpand concatenate - copy-list count count-if count-if-not delete* delete-duplicates delete-if - delete-if-not duplicate-symbols-p elt-satisfies-test-p equalp evenp every - extract-from-klist fill find find-if find-if-not floatp-safe floor* gcd - gensym gentemp get-setf-method getf hash-table-count hash-table-p - intersection isqrt keyword-argument-supplied-p keyword-of keywordp last - lcm ldiff lisp-indent-259 lisp-indent-do lisp-indent-function-lambda-hack - lisp-indent-report-bad-format lisp-indent-tagbody list-length - make-hash-table make-random-state map mapc mapcan mapcar* mapcon mapl - maplist member-if member-if-not merge mismatch mod* nbutlast nintersection - notany notevery nreconc nset-difference nset-exclusive-or nsublis nsubst - nsubst-if nsubst-if-not nsubstitute nsubstitute-if nsubstitute-if-not - nunion oddp pair-with-newsyms pairlis position position-if position-if-not - proclaim random* random-state-p rassoc* rassoc-if rassoc-if-not - reassemble-argslists reduce rem* remove remove* remove-duplicates - remove-if remove-if-not remq replace revappend round* safe-idiv search - set-difference set-exclusive-or setelt setnth setnthcdr signum some sort* - stable-sort sublis subseq subsetp subst subst-if subst-if-not substitute - substitute-if substitute-if-not tailp tree-equal truncate* union - unzip-lists zip-lists) - "A list of CL run-time functions. Some functions were built-in, nowadays.") - -;;;###autoload -(defun find-cl-run-time-functions (file-or-directory arg) - "Find CL run-time functions in the FILE-OR-DIRECTORY. You can alter -the behavior of this command with the prefix ARG as described below. - -By default, it searches for all the CL run-time functions listed in - the variable `cl-run-time-functions'. -With 1 or 3 \\[universal-argument]'s, the built-in functions in this Emacs\ - will not be - reported. -With 2 or 3 \\[universal-argument]'s, just the symbols will also be reported. - -You can use the `digit-argument' 1, 2 or 3 instead of\ - \\[universal-argument]'s." - (interactive (list (read-file-name "Find CL run-time functions in: " - nil default-directory t) - current-prefix-arg)) - (unless (interactive-p) - (error "You should invoke `M-x find-cl-run-time-functions' interactively")) - (let ((report-symbols (member arg '((16) (64) 2 3))) - files clfns working file lines form forms fns fn newform buffer - window scroll - buffer-file-format format-alist - insert-file-contents-post-hook insert-file-contents-pre-hook) - (cond ((file-directory-p file-or-directory) - (setq files (directory-files file-or-directory t "\\.el$")) - (dolist (file files) - (unless (file-exists-p file) - (setq files (delete file files)))) - (unless files - (message "No files found in: %s" file-or-directory)) - files) - ((file-exists-p file-or-directory) - (setq files (list file-or-directory))) - (t - (message "No such file or directory: %s" file-or-directory))) - (when files - (if (member arg '((4) (64) 1 3)) - (dolist (fn cl-run-time-functions) - (unless (and (fboundp fn) - (subrp (symbol-function fn))) - (push fn clfns))) - (setq clfns cl-run-time-functions)) - (set-buffer (setq working - (get-buffer-create - " *Searching for CL run-time functions*"))) - (let (emacs-lisp-mode-hook) - (emacs-lisp-mode)) - (while files - (setq file (pop files) - lines (list nil nil)) - (message "Searching for CL run-time functions in: %s..." - (file-name-nondirectory file)) - (insert-file-contents file nil nil nil t) - ;; XEmacs moves point to the beginning of the buffer after - ;; inserting a file, FSFmacs doesn't so if the fifth argument - ;; of `insert-file-contents' is specified. - (goto-char (point-min)) - ;; - (while (progn - (while (and (looking-at "[\t\v\f\r ]*\\(;.*\\)?$") - (zerop (forward-line 1)))) - (not (eobp))) - (setcar lines (if (bolp) - (1+ (count-lines (point-min) (point))) - (count-lines (point-min) (point)))) - (when (consp;; Ignore stand-alone symbols, strings, etc. - (setq form (condition-case nil - (read working) - (error nil)))) - (setcdr lines (list (count-lines (point-min) (point)))) - (setq forms (list form) - fns nil) - (while forms - (setq form (pop forms)) - (when (consp form) - (setq fn (pop form)) - (cond ((memq fn '(apply mapatoms mapcar mapconcat - mapextent symbol-function)) - (if (consp (car form)) - (when (memq (caar form) '(\` backquote quote)) - (setcar form (cdar form))) - (setq form (cdr form)))) - ((memq fn '(\` backquote quote)) - (if report-symbols - (progn - (setq form (car form) - newform nil) - (while form - (push (list (or (car-safe form) form)) - newform) - (setq form (cdr-safe form))) - (setq form (nreverse newform))) - (setq form nil))) - ((memq fn '(defadvice - defmacro defsubst defun - defmacro-maybe defmacro-maybe-cond - defsubst-maybe defun-maybe - defun-maybe-cond)) - (setq form (cddr form))) - ((memq fn '(defalias lambda fset)) - (setq form (cdr form))) - ((eq fn 'define-compiler-macro) - (setq form nil)) - ((eq fn 'dolist) - (setcar form (cadar form))) - ((memq fn '(let let*)) - (setq form - (append - (delq nil - (mapcar - (lambda (element) - (when (and (consp element) - (consp (cadr element))) - (cadr element))) - (car form))) - (cdr form)))) - ((eq fn 'sort) - (when (and (consp (cadr form)) - (memq (caadr form) '(\` backquote quote))) - (setcdr form (list (cdadr form))))) - ((and (memq fn clfns) - (listp form)) - (push fn fns))) - (setq forms (append form forms)))) - (when fns - (if buffer - (set-buffer buffer) - (display-buffer - (setq buffer (get-buffer-create - (concat "*CL run-time functions in: " - file-or-directory "*")))) - (set-buffer buffer) - (erase-buffer) - (setq window (get-buffer-window buffer t) - scroll (- 2 (window-height window)) - fill-column (max 16 (- (window-width window) 2)) - fill-prefix " ")) - (when file - (insert file "\n") - (setq file nil)) - (narrow-to-region - (point) - (progn - (insert fill-prefix - (mapconcat (lambda (fn) (format "%s" fn)) - (nreverse fns) " ")) - (point))) - (fill-region (point-min) (point-max)) - (goto-char (point-min)) - (widen) - (delete-char 14) - (insert (format "%5d - %5d:" (car lines) (cadr lines))) - (goto-char (point-max)) - (forward-line scroll) - (set-window-start window (point)) - (goto-char (point-max)) - (sit-for 0) - (set-buffer working))))) - (kill-buffer working) - (if buffer - (message "Done") - (message "No CL run-time functions found in: %s" - file-or-directory))))) - -(provide 'gnus-clfns) - -;;; gnus-clfns.el ends here diff --git a/lisp/gnus-cus.el b/lisp/gnus-cus.el deleted file mode 100644 index d32f65f..0000000 --- a/lisp/gnus-cus.el +++ /dev/null @@ -1,762 +0,0 @@ -;;; gnus-cus.el --- customization commands for Gnus -;; -;; Copyright (C) 1996,1999, 2000 Free Software Foundation, Inc. - -;; Author: Per Abrahamsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(require 'wid-edit) -(require 'gnus) -(require 'gnus-score) -(require 'gnus-topic) -(require 'gnus-art) - -;;; Widgets: - -(defun gnus-custom-mode () - "Major mode for editing Gnus customization buffers. - -The following commands are available: - -\\[widget-forward] Move to next button or editable field. -\\[widget-backward] Move to previous button or editable field. -\\[widget-button-click] Activate button under the mouse pointer. -\\[widget-button-press] Activate button under point. - -Entry to this mode calls the value of `gnus-custom-mode-hook' -if that value is non-nil." - (kill-all-local-variables) - (setq major-mode 'gnus-custom-mode - mode-name "Gnus Customize") - (use-local-map widget-keymap) - ;; Emacs 21 stuff: - (when (and (facep 'custom-button-face) - (facep 'custom-button-pressed-face)) - (set (make-local-variable 'widget-button-face) - 'custom-button-face) - (set (make-local-variable 'widget-button-pressed-face) - 'custom-button-pressed-face) - (set (make-local-variable 'widget-mouse-face) - 'custom-button-pressed-face)) - (when (and (boundp 'custom-raised-buttons) - (symbol-value 'custom-raised-buttons)) - (set (make-local-variable 'widget-push-button-prefix) "") - (set (make-local-variable 'widget-push-button-suffix) "") - (set (make-local-variable 'widget-link-prefix) "") - (set (make-local-variable 'widget-link-suffix) "")) - (gnus-run-hooks 'gnus-custom-mode-hook)) - -;;; Group Customization: - -(defconst gnus-group-parameters - '((extra-aliases (choice - :tag "Extra Aliases" - (list - :tag "List" - (editable-list - :inline t - (gnus-email-address :tag "Address"))) - (gnus-email-address :tag "Address")) "\ -Store messages posted from or to this address in this group. - -You must be using gnus-group-split for this to work. The VALUE of the -nnmail-split-fancy SPLIT generated for this group will match these -addresses.") - - (split-regexp (regexp :tag "gnus-group-split Regular Expression") "\ -Like gnus-group-split Address, but expects a regular expression.") - - (split-exclude (list :tag "gnus-group-split Restricts" - (editable-list - :inline t (regexp :tag "Restrict"))) "\ -Regular expression that cancels gnus-group-split matches. - -Each entry is added to the nnmail-split-fancy SPLIT as a separate -RESTRICT clause.") - - (split-spec (choice :tag "gnus-group-split Overrider" - (sexp :tag "Fancy Split") - (const :tag "Catch All" catch-all) - (const :tag "Ignore" nil)) "\ -Override all other gnus-group-split fields. - -In `Fancy Split', you can enter any nnmail-split-fancy SPLIT. Note -that the name of this group won't be automatically assumed, you have -to add it to the SPLITs yourself. This means you can use such splits -to split messages to other groups too. - -If you select `Catch All', this group will get postings for any -messages not matched in any other group. It overrides the variable -gnus-group-split-default-catch-all-group. - -Selecting `Ignore' forces no SPLIT to be generated for this group, -disabling all other gnus-group-split fields.") - - (broken-reply-to (const :tag "Broken Reply To" t) "\ -Ignore `Reply-To' headers in this group. - -That can be useful if you're reading a mailing list group where the -listserv has inserted `Reply-To' headers that point back to the -listserv itself. This is broken behavior. So there!") - - (to-group (string :tag "To Group") "\ -All posts will be sent to the specified group.") - - (gcc-self (choice :tag "GCC" - :value t - (const :tag "To current group" t) - (const none) - (string :format "%v" :hide-front-space t)) "\ -Specify default value for GCC header. - -If this symbol is present in the group parameter list and set to `t', -new composed messages will be `Gcc''d to the current group. If it is -present and set to `none', no `Gcc:' header will be generated, if it -is present and a string, this string will be inserted literally as a -`gcc' header (this symbol takes precedence over any default `Gcc' -rules as described later).") - - (expiry-wait (choice :tag "Expire Wait" - :value never - (const never) - (const immediate) - (number :hide-front-space t - :format "%v")) "\ -When to expire. - -Overrides any `nnmail-expiry-wait' and `nnmail-expiry-wait-function' -when expiring expirable messages. The value can either be a number of -days (not necessarily an integer) or the symbols `never' or -`immediate'.") - - (expiry-target (choice :tag "Expiry Target" - :value delete - (const delete) - (function :format "%v" nnmail-) - string) "\ -Where expired messages end up. - -Overrides `nnmail-expiry-target', which see.") - - (score-file (file :tag "Score File") "\ -Make the specified file into the current score file. -This means that all score commands you issue will end up in this file.") - - (adapt-file (file :tag "Adapt File") "\ -Make the specified file into the current adaptive file. -All adaptive score entries will be put into this file.") - - (admin-address (gnus-email-address :tag "Admin Address") "\ -Administration address for a mailing list. - -When unsubscribing to a mailing list you should never send the -unsubscription notice to the mailing list itself. Instead, you'd -send messages to the administrative address. This parameter allows -you to put the admin address somewhere convenient.") - - (display (choice :tag "Display" - :value default - (const all) - (const default)) "\ -Which articles to display on entering the group. - -`all' - Display all articles, both read and unread. - -`default' - Display the default visible articles, which normally includes - unread and ticked articles.") - - (comment (string :tag "Comment") "\ -An arbitrary comment on the group.") - - (visible (const :tag "Permanently visible" t) "\ -Always display this group, even when there are no unread articles -in it..") - - (highlight-words - (choice :tag "Highlight words" - :value nil - (repeat (list (regexp :tag "Highlight regexp") - (number :tag "Group for entire word" 0) - (number :tag "Group for displayed part" 0) - (symbol :tag "Face" - gnus-emphasis-highlight-words)))) - "highlight regexps. -See gnus-emphasis-alist.") - - (posting-style - (choice :tag "Posting style" - :value nil - (repeat (list - (choice :tag "Type" - :value nil - (const signature) - (const signature-file) - (const organization) - (const address) - (const name) - (const body)) - (string :format "%v")))) - "post style. -See gnus-posting-styles.")) - "Alist of valid group or topic parameters. - -Each entry has the form (NAME TYPE DOC), where NAME is the parameter -itself (a symbol), TYPE is the parameters type (a sexp widget), and -DOC is a documentation string for the parameter.") - -(defconst gnus-extra-topic-parameters - '((subscribe (regexp :tag "Subscribe") "\ -If `gnus-subscribe-newsgroup-method' or -`gnus-subscribe-options-newsgroup-method' is set to -`gnus-subscribe-topics', new groups that matches this regexp will -automatically be subscribed to this topic")) - "Alist of topic parameters that are not also group parameters. - -Each entry has the form (NAME TYPE DOC), where NAME is the parameter -itself (a symbol), TYPE is the parameters type (a sexp widget), and -DOC is a documentation string for the parameter.") - -(defconst gnus-extra-group-parameters - '((uidvalidity (string :tag "IMAP uidvalidity") "\ -Server-assigned value attached to IMAP groups, used to maintain consistency.")) - "Alist of group parameters that are not also topic parameters. - -Each entry has the form (NAME TYPE DOC), where NAME is the parameter -itself (a symbol), TYPE is the parameters type (a sexp widget), and -DOC is a documentation string for the parameter.") -(defvar gnus-custom-params) -(defvar gnus-custom-method) -(defvar gnus-custom-group) -(defvar gnus-custom-topic) - -(defun gnus-group-customize (group &optional topic) - "Edit the group or topic on the current line." - (interactive (list (gnus-group-group-name) (gnus-group-topic-name))) - (let (info - (types (mapcar (lambda (entry) - `(cons :format "%v%h\n" - :doc ,(nth 2 entry) - (const :format "" ,(nth 0 entry)) - ,(nth 1 entry))) - (append (reverse gnus-group-parameters-more) - gnus-group-parameters - (if group - gnus-extra-group-parameters - gnus-extra-topic-parameters))))) - (unless (or group topic) - (error "No group on current line")) - (when (and group topic) - (error "Both a group an topic on current line")) - (unless (or topic (setq info (gnus-get-info group))) - (error "Killed group; can't be edited")) - ;; Ready. - (kill-buffer (gnus-get-buffer-create "*Gnus Customize*")) - (switch-to-buffer (gnus-get-buffer-create "*Gnus Customize*")) - (gnus-custom-mode) - (make-local-variable 'gnus-custom-group) - (setq gnus-custom-group group) - (make-local-variable 'gnus-custom-topic) - (setq gnus-custom-topic topic) - (buffer-disable-undo) - (widget-insert "Customize the ") - (if group - (widget-create 'info-link - :help-echo "Push me to learn more." - :tag "group parameters" - "(gnus)Group Parameters") - (widget-create 'info-link - :help-echo "Push me to learn more." - :tag "topic parameters" - "(gnus)Topic Parameters")) - (widget-insert " for <") - (widget-insert (gnus-group-decoded-name (or group topic))) - (widget-insert "> and press ") - (widget-create 'push-button - :tag "done" - :help-echo "Push me when done customizing." - :action 'gnus-group-customize-done) - (widget-insert ".\n\n") - (make-local-variable 'gnus-custom-params) - (setq gnus-custom-params - (widget-create 'group - :value (if group - (gnus-info-params info) - (gnus-topic-parameters topic)) - `(set :inline t - :greedy t - :tag "Parameters" - :format "%t:\n%h%v" - :doc "\ -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) - '(repeat :inline t - :tag "Variables" - :format "%t:\n%h%v%i\n\n" - :doc "\ -Set variables local to the group you are entering. - -If you want to turn threading off in `news.answers', you could put -`(gnus-show-threads nil)' in the group parameters of that group. -`gnus-show-threads' will be made into a local variable in the summary -buffer you enter, and the form `nil' will be `eval'ed there. - -This can also be used as a group-specific hook function, if you'd -like. If you want to hear a beep when you enter a group, you could -put something like `(dummy-variable (ding))' in the parameters of that -group. `dummy-variable' will be set to the result of the `(ding)' -form, but who cares?" - (list :format "%v" :value (nil nil) - (symbol :tag "Variable") - (sexp :tag - "Value"))) - - '(repeat :inline t - :tag "Unknown entries" - sexp))) - (when group - (widget-insert "\n\nYou can also edit the ") - (widget-create 'info-link - :tag "select method" - :help-echo "Push me to learn more about select methods." - "(gnus)Select Methods") - (widget-insert " for the group.\n") - (setq gnus-custom-method - (widget-create 'sexp - :tag "Method" - :value (gnus-info-method info)))) - (use-local-map widget-keymap) - (widget-setup) - (buffer-enable-undo) - (goto-char (point-min)))) - -(defun gnus-group-customize-done (&rest ignore) - "Apply changes and bury the buffer." - (interactive) - (if gnus-custom-topic - (gnus-topic-set-parameters gnus-custom-topic - (widget-value gnus-custom-params)) - (gnus-group-edit-group-done 'params gnus-custom-group - (widget-value gnus-custom-params)) - (gnus-group-edit-group-done 'method gnus-custom-group - (widget-value gnus-custom-method))) - (bury-buffer)) - -;;; Score Customization: - -(defconst gnus-score-parameters - '((mark (number :tag "Mark") "\ -The value of this entry should be a number. -Any articles with a score lower than this number will be marked as read.") - - (expunge (number :tag "Expunge") "\ -The value of this entry should be a number. -Any articles with a score lower than this number will be removed from -the summary buffer.") - - (mark-and-expunge (number :tag "Mark-and-expunge") "\ -The value of this entry should be a number. -Any articles with a score lower than this number will be marked as -read and removed from the summary buffer.") - - (thread-mark-and-expunge (number :tag "Thread-mark-and-expunge") "\ -The value of this entry should be a number. -All articles that belong to a thread that has a total score below this -number will be marked as read and removed from the summary buffer. -`gnus-thread-score-function' says how to compute the total score -for a thread.") - - (files (repeat :inline t :tag "Files" file) "\ -The value of this entry should be any number of file names. -These files are assumed to be score files as well, and will be loaded -the same way this one was.") - - (exclude-files (repeat :inline t :tag "Exclude-files" file) "\ -The clue of this entry should be any number of files. -These files will not be loaded, even though they would normally be so, -for some reason or other.") - - (eval (sexp :tag "Eval" :value nil) "\ -The value of this entry will be `eval'el. -This element will be ignored when handling global score files.") - - (read-only (boolean :tag "Read-only" :value t) "\ -Read-only score files will not be updated or saved. -Global score files should feature this atom.") - - (orphan (number :tag "Orphan") "\ -The value of this entry should be a number. -Articles that do not have parents will get this number added to their -scores. Imagine you follow some high-volume newsgroup, like -`comp.lang.c'. Most likely you will only follow a few of the threads, -also want to see any new threads. - -You can do this with the following two score file entries: - - (orphan -500) - (mark-and-expunge -100) - -When you enter the group the first time, you will only see the new -threads. You then raise the score of the threads that you find -interesting (with `I T' or `I S'), and ignore (`C y') the rest. -Next time you enter the group, you will see new articles in the -interesting threads, plus any new threads. - -I.e.---the orphan score atom is for high-volume groups where there -exist a few interesting threads which can't be found automatically -by ordinary scoring rules.") - - (adapt (choice :tag "Adapt" - (const t) - (const ignore) - (sexp :format "%v" - :hide-front-space t)) "\ -This entry controls the adaptive scoring. -If it is `t', the default adaptive scoring rules will be used. If it -is `ignore', no adaptive scoring will be performed on this group. If -it is a list, this list will be used as the adaptive scoring rules. -If it isn't present, or is something other than `t' or `ignore', the -default adaptive scoring rules will be used. If you want to use -adaptive scoring on most groups, you'd set `gnus-use-adaptive-scoring' -to `t', and insert an `(adapt ignore)' in the groups where you do not -want adaptive scoring. If you only want adaptive scoring in a few -groups, you'd set `gnus-use-adaptive-scoring' to `nil', and insert -`(adapt t)' in the score files of the groups where you want it.") - - (adapt-file (file :tag "Adapt-file") "\ -All adaptive score entries will go to the file named by this entry. -It will also be applied when entering the group. This atom might -be handy if you want to adapt on several groups at once, using the -same adaptive file for a number of groups.") - - (local (repeat :tag "Local" - (group :value (nil nil) - (symbol :tag "Variable") - (sexp :tag "Value"))) "\ -The value of this entry should be a list of `(VAR VALUE)' pairs. -Each VAR will be made buffer-local to the current summary buffer, -and set to the value specified. This is a convenient, if somewhat -strange, way of setting variables in some groups if you don't like -hooks much.") - (touched (sexp :format "Touched\n") "Internal variable.")) - "Alist of valid symbolic score parameters. - -Each entry has the form (NAME TYPE DOC), where NAME is the parameter -itself (a symbol), TYPE is the parameters type (a sexp widget), and DOC is a -documentation string for the parameter.") - -(define-widget 'gnus-score-string 'group - "Edit score entries for string-valued headers." - :convert-widget 'gnus-score-string-convert) - -(defun gnus-score-string-convert (widget) - ;; Set args appropriately. - (let* ((tag (widget-get widget :tag)) - (item `(const :format "" :value ,(downcase tag))) - (match '(string :tag "Match")) - (score '(choice :tag "Score" - (const :tag "default" nil) - (integer :format "%v" - :hide-front-space t))) - (expire '(choice :tag "Expire" - (const :tag "off" nil) - (integer :format "%v" - :hide-front-space t))) - (type '(choice :tag "Type" - :value s - ;; I should really create a forgiving :match - ;; function for each type below, that only - ;; looked at the first letter. - (const :tag "Regexp" r) - (const :tag "Regexp (fixed case)" R) - (const :tag "Substring" s) - (const :tag "Substring (fixed case)" S) - (const :tag "Exact" e) - (const :tag "Exact (fixed case)" E) - (const :tag "Word" w) - (const :tag "Word (fixed case)" W) - (const :tag "default" nil))) - (group `(group ,match ,score ,expire ,type)) - (doc (concat (or (widget-get widget :doc) - (concat "Change score based on the " tag - " header.\n")) - " -You can have an arbitrary number of score entries for this header, -each score entry has four elements: - -1. The \"match element\". This should be the string to look for in the - header. - -2. The \"score element\". This number should be an integer in the - neginf to posinf interval. This number is added to the score - of the article if the match is successful. If this element is - not present, the `gnus-score-interactive-default-score' number - will be used instead. This is 1000 by default. - -3. The \"date element\". This date says when the last time this score - entry matched, which provides a mechanism for expiring the - score entries. It this element is not present, the score - entry is permanent. The date is represented by the number of - days since December 31, 1 ce. - -4. The \"type element\". This element specifies what function should - be used to see whether this score entry matches the article. - - There are the regexp, as well as substring types, and exact match, - and word match types. If this element is not present, Gnus will - assume that substring matching should be used. There is case - sensitive variants of all match types."))) - (widget-put widget :args `(,item - (repeat :inline t - :indent 0 - :tag ,tag - :doc ,doc - :format "%t:\n%h%v%i\n\n" - (choice :format "%v" - :value ("" nil nil s) - ,group - sexp))))) - widget) - -(define-widget 'gnus-score-integer 'group - "Edit score entries for integer-valued headers." - :convert-widget 'gnus-score-integer-convert) - -(defun gnus-score-integer-convert (widget) - ;; Set args appropriately. - (let* ((tag (widget-get widget :tag)) - (item `(const :format "" :value ,(downcase tag))) - (match '(integer :tag "Match")) - (score '(choice :tag "Score" - (const :tag "default" nil) - (integer :format "%v" - :hide-front-space t))) - (expire '(choice :tag "Expire" - (const :tag "off" nil) - (integer :format "%v" - :hide-front-space t))) - (type '(choice :tag "Type" - :value < - (const <) - (const >) - (const =) - (const >=) - (const <=))) - (group `(group ,match ,score ,expire ,type)) - (doc (concat (or (widget-get widget :doc) - (concat "Change score based on the " tag - " header."))))) - (widget-put widget :args `(,item - (repeat :inline t - :indent 0 - :tag ,tag - :doc ,doc - :format "%t:\n%h%v%i\n\n" - ,group)))) - widget) - -(define-widget 'gnus-score-date 'group - "Edit score entries for date-valued headers." - :convert-widget 'gnus-score-date-convert) - -(defun gnus-score-date-convert (widget) - ;; Set args appropriately. - (let* ((tag (widget-get widget :tag)) - (item `(const :format "" :value ,(downcase tag))) - (match '(string :tag "Match")) - (score '(choice :tag "Score" - (const :tag "default" nil) - (integer :format "%v" - :hide-front-space t))) - (expire '(choice :tag "Expire" - (const :tag "off" nil) - (integer :format "%v" - :hide-front-space t))) - (type '(choice :tag "Type" - :value regexp - (const regexp) - (const before) - (const at) - (const after))) - (group `(group ,match ,score ,expire ,type)) - (doc (concat (or (widget-get widget :doc) - (concat "Change score based on the " tag - " header.")) - " -For the Date header we have three kinda silly match types: `before', -`at' and `after'. I can't really imagine this ever being useful, but, -like, it would feel kinda silly not to provide this function. Just in -case. You never know. Better safe than sorry. Once burnt, twice -shy. Don't judge a book by its cover. Never not have sex on a first -date. (I have been told that at least one person, and I quote, -\"found this function indispensable\", however.) - -A more useful match type is `regexp'. With it, you can match the date -string using a regular expression. The date is normalized to ISO8601 -compact format first---`YYYYMMDDTHHMMSS'. If you want to match all -articles that have been posted on April 1st in every year, you could -use `....0401.........' as a match string, for instance. (Note that -the date is kept in its original time zone, so this will match -articles that were posted when it was April 1st where the article was -posted from. Time zones are such wholesome fun for the whole family, -eh?"))) - (widget-put widget :args `(,item - (repeat :inline t - :indent 0 - :tag ,tag - :doc ,doc - :format "%t:\n%h%v%i\n\n" - ,group)))) - widget) - -(defvar gnus-custom-scores) -(defvar gnus-custom-score-alist) - -(defun gnus-score-customize (file) - "Customize score file FILE. -When called interactively, FILE defaults to the current score file. -This can be changed using the `\\[gnus-score-change-score-file]' command." - (interactive (list gnus-current-score-file)) - (unless file - (error (format "No score file for %s" - (gnus-group-decoded-name gnus-newsgroup-name)))) - (let ((scores (gnus-score-load file)) - (types (mapcar (lambda (entry) - `(group :format "%v%h\n" - :doc ,(nth 2 entry) - (const :format "" ,(nth 0 entry)) - ,(nth 1 entry))) - gnus-score-parameters))) - ;; Ready. - (kill-buffer (gnus-get-buffer-create "*Gnus Customize*")) - (switch-to-buffer (gnus-get-buffer-create "*Gnus Customize*")) - (gnus-custom-mode) - (make-local-variable 'gnus-custom-score-alist) - (setq gnus-custom-score-alist scores) - (widget-insert "Customize the ") - (widget-create 'info-link - :help-echo "Push me to learn more." - :tag "score entries" - "(gnus)Score File Format") - (widget-insert " for\n\t") - (widget-insert file) - (widget-insert "\nand press ") - (widget-create 'push-button - :tag "done" - :help-echo "Push me when done customizing." - :action 'gnus-score-customize-done) - (widget-insert ".\n -Check the [ ] for the entries you want to apply to this score file, then -edit the value to suit your taste. Don't forget to mark the checkbox, -if you do all your changes will be lost. ") - (widget-create 'push-button - :action (lambda (&rest ignore) - (require 'gnus-audio) - (gnus-audio-play "Evil_Laugh.au")) - "Bhahahah!") - (widget-insert "\n\n") - (make-local-variable 'gnus-custom-scores) - (setq gnus-custom-scores - (widget-create 'group - :value scores - `(checklist :inline t - :greedy t - (gnus-score-string :tag "From") - (gnus-score-string :tag "Subject") - (gnus-score-string :tag "References") - (gnus-score-string :tag "Xref") - (gnus-score-string :tag "Extra") - (gnus-score-string :tag "Message-ID") - (gnus-score-integer :tag "Lines") - (gnus-score-integer :tag "Chars") - (gnus-score-date :tag "Date") - (gnus-score-string :tag "Head" - :doc "\ -Match all headers in the article. - -Using one of `Head', `Body', `All' will slow down scoring considerable. -") - (gnus-score-string :tag "Body" - :doc "\ -Match the body sans header of the article. - -Using one of `Head', `Body', `All' will slow down scoring considerable. -") - (gnus-score-string :tag "All" - :doc "\ -Match the entire article, including both headers and body. - -Using one of `Head', `Body', `All' will slow down scoring -considerable. -") - (gnus-score-string :tag - "Followup" - :doc "\ -Score all followups to the specified authors. - -This entry is somewhat special, in that it will match the `From:' -header, and affect the score of not only the matching articles, but -also all followups to the matching articles. This allows you -e.g. increase the score of followups to your own articles, or decrease -the score of followups to the articles of some known trouble-maker. -") - (gnus-score-string :tag "Thread" - :doc "\ -Add a score entry on all articles that are part of a thread. - -This match key works along the same lines as the `Followup' match key. -If you say that you want to score on a (sub-)thread that is started by -an article with a `Message-ID' X, then you add a `thread' match. This -will add a new `thread' match for each article that has X in its -`References' header. (These new `thread' matches will use the -`Message-ID's of these matching articles.) This will ensure that you -can raise/lower the score of an entire thread, even though some -articles in the thread may not have complete `References' headers. -Note that using this may lead to undeterministic scores of the -articles in the thread. -") - ,@types) - '(repeat :inline t - :tag "Unknown entries" - sexp))) - (use-local-map widget-keymap) - (widget-setup))) - -(defun gnus-score-customize-done (&rest ignore) - "Reset the score alist with the present value." - (let ((alist gnus-custom-score-alist) - (value (widget-value gnus-custom-scores))) - (setcar alist (car value)) - (setcdr alist (cdr value)) - (gnus-score-set 'touched '(t) alist)) - (bury-buffer)) - -;;; The End: - -(provide 'gnus-cus) - -;;; gnus-cus.el ends here diff --git a/lisp/gnus-delay.el b/lisp/gnus-delay.el deleted file mode 100644 index ac89011..0000000 --- a/lisp/gnus-delay.el +++ /dev/null @@ -1,161 +0,0 @@ -;;; gnus-delay.el --- Delayed posting of articles -*- coding: latin-1; -*- - -;; Copyright (C) 2001 Free Software Foundation, Inc. - -;; Author: Kai Großjohann -;; Keywords: mail, news, extensions - -;; This file 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, or (at your option) -;; any later version. - -;; This file 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 GNU Emacs; see the file COPYING. If not, write to -;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; Provide delayed posting of articles. - -;;; Code: - -(require 'nndraft) -(require 'gnus-draft) - -(defvar gnus-delay-group "delayed" - "Group name for storing delayed articles.") - -(defvar gnus-delay-header "X-Gnus-Delayed" - "Header name for storing info about delayed articles.") - -(defvar gnus-delay-default-delay "3d" - "*Default length of delay.") - -(defvar gnus-delay-default-hour 8 - "*If deadline is given as date, then assume this time of day.") - -(defun gnus-delay-article (delay) - "Delay this article by some time. -DELAY is a string, giving the length of the time. Possible values are: - -* for in minutes (`m'), hours (`h'), days (`d'), - weeks (`w'), months (`M'), or years (`Y'); - -* YYYY-MM-DD for a specific date. The time of day is given by the - variable `gnus-delay-default-hour', minute and second are zero. - -* hh:mm for a specific time. Use 24h format. If it is later than this - time, then the deadline is tomorrow, else today." - (interactive - (list (read-string - "Target date (YYYY-MM-DD) or length of delay (units in [mhdwMY]): " - gnus-delay-default-delay))) - (let (num unit days year month day hour minute deadline) - (cond ((string-match - "\\([0-9][0-9][0-9]?[0-9]?\\)-\\([0-9]+\\)-\\([0-9]+\\)" - delay) - (setq year (string-to-number (match-string 1 delay)) - month (string-to-number (match-string 2 delay)) - day (string-to-number (match-string 3 delay))) - (setq deadline - (message-make-date - (encode-time 0 0 ; second and minute - gnus-delay-default-hour - day month year)))) - ((string-match "\\([0-9]+\\):\\([0-9]+\\)" delay) - (setq hour (string-to-number (match-string 1 delay)) - minute (string-to-number (match-string 2 delay))) - ;; Use current time, except... - (setq deadline (apply 'vector (decode-time (current-time)))) - ;; ... for minute and hour. - (aset deadline 1 minute) - (aset deadline 2 hour) - ;; Convert to seconds. - (setq deadline (time-to-seconds (apply 'encode-time - (append deadline nil)))) - ;; If this time has passed already, add a day. - (when (< deadline (time-to-seconds (current-time))) - (setq deadline (+ 3600 deadline))) ;3600 secs/day - ;; Convert seconds to date header. - (setq deadline (message-make-date - (seconds-to-time deadline)))) - ((string-match "\\([0-9]+\\)\\s-*\\([mhdwMY]\\)" delay) - (setq num (match-string 1 delay)) - (setq unit (match-string 2 delay)) - ;; Start from seconds, then multiply into needed units. - (setq num (string-to-number num)) - (cond ((string= unit "Y") - (setq delay (* num 60 60 24 365))) - ((string= unit "M") - (setq delay (* num 60 60 24 30))) - ((string= unit "w") - (setq delay (* num 60 60 24 7))) - ((string= unit "d") - (setq delay (* num 60 60 24))) - ((string= unit "h") - (setq delay (* num 60 60))) - (t - (setq delay (* num 60)))) - (setq deadline (message-make-date - (seconds-to-time (+ (time-to-seconds (current-time)) - delay))))) - (t (error "Malformed delay `%s'" delay))) - (message-add-header (format "%s: %s" gnus-delay-header deadline))) - (set-buffer-modified-p t) - (nndraft-request-create-group gnus-delay-group) - (message-disassociate-draft) - (nndraft-request-associate-buffer gnus-delay-group) - (save-buffer 0) - (kill-buffer (current-buffer)) - (message-do-actions message-postpone-actions)) - -(defun gnus-delay-send-drafts () - "Send all the delayed messages that are due now." - (interactive) - (save-excursion - (let* ((group (format "nndraft:%s" gnus-delay-group)) - articles - article deadline) - (gnus-activate-group group) - (setq articles (nndraft-articles)) - (while (setq article (pop articles)) - (gnus-request-head article group) - (set-buffer nntp-server-buffer) - (goto-char (point-min)) - (if (re-search-forward - (concat "^" (regexp-quote gnus-delay-header) ":\\s-+") - nil t) - (progn - (setq deadline (nnheader-header-value)) - (setq deadline (apply 'encode-time (parse-time-string deadline))) - (setq deadline (time-since deadline)) - (when (and (>= (nth 0 deadline) 0) - (>= (nth 1 deadline) 0)) - (message "Sending delayed article %d" article) - (gnus-draft-send article group) - (message "Sending delayed article %d...done" article))) - (message "Delay header missing for article %d" article)))))) - -;;;###autoload -(defun gnus-delay-initialize (&optional no-keymap no-check) - "Initialize the gnus-delay package. -This sets up a key binding in `message-mode' to delay a message. -This tells Gnus to look for delayed messages after getting new news. - -Key binding is skipped if optional arg NO-KEYMAP is non-nil. -Checking delayed messages is skipped if optional arg NO-CHECK is non-nil." - (unless no-keymap - (require 'message) - (define-key message-mode-map "\C-c\n" 'gnus-delay-article)) - (unless no-check - (add-hook 'gnus-get-new-news-hook 'gnus-delay-send-drafts))) - -(provide 'gnus-delay) -;;; gnus-delay.el ends here diff --git a/lisp/gnus-demon.el b/lisp/gnus-demon.el deleted file mode 100644 index 2c73b37..0000000 --- a/lisp/gnus-demon.el +++ /dev/null @@ -1,325 +0,0 @@ -;;; gnus-demon.el --- daemonic Gnus behaviour - -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus) -(require 'gnus-int) -(require 'nnheader) -(require 'nntp) -(require 'nnmail) -(require 'gnus-util) -(eval-and-compile - (if (featurep 'xemacs) - (require 'itimer) - (require 'timer))) - -(defgroup gnus-demon nil - "Demonic behaviour." - :group 'gnus) - -(defcustom gnus-demon-handlers nil - "Alist of daemonic handlers to be run at intervals. -Each handler is a list on the form - -\(FUNCTION TIME IDLE) - -FUNCTION is the function to be called. -TIME is the number of `gnus-demon-timestep's between each call. -If nil, never call. If t, call each `gnus-demon-timestep'. -If IDLE is t, only call if Emacs has been idle for a while. If IDLE -is a number, only call when Emacs has been idle more than this number -of `gnus-demon-timestep's. If IDLE is nil, don't care about -idleness. If IDLE is a number and TIME is nil, then call once each -time Emacs has been idle for IDLE `gnus-demon-timestep's." - :group 'gnus-demon - :type '(repeat (list function - (choice :tag "Time" - (const :tag "never" nil) - (const :tag "one" t) - (integer :tag "steps" 1)) - (choice :tag "Idle" - (const :tag "don't care" nil) - (const :tag "for a while" t) - (integer :tag "steps" 1))))) - -(defcustom gnus-demon-timestep 60 - "*Number of seconds in each demon timestep." - :group 'gnus-demon - :type 'integer) - -;;; Internal variables. - -(defvar gnus-demon-timer nil) -(defvar gnus-demon-idle-has-been-called nil) -(defvar gnus-demon-idle-time 0) -(defvar gnus-demon-handler-state nil) -(defvar gnus-demon-last-keys nil) -(defvar gnus-inhibit-demon nil - "*If non-nil, no daemonic function will be run.") - -;;; Functions. - -(defun gnus-demon-add-handler (function time idle) - "Add the handler FUNCTION to be run at TIME and IDLE." - ;; First remove any old handlers that use this function. - (gnus-demon-remove-handler function) - ;; Then add the new one. - (push (list function time idle) gnus-demon-handlers) - (gnus-demon-init)) - -(defun gnus-demon-remove-handler (function &optional no-init) - "Remove the handler FUNCTION from the list of handlers." - (gnus-pull function gnus-demon-handlers) - (unless no-init - (gnus-demon-init))) - -(defun gnus-demon-init () - "Initialize the Gnus daemon." - (interactive) - (gnus-demon-cancel) - (when gnus-demon-handlers - ;; Set up the timer. - (setq gnus-demon-timer - (nnheader-run-at-time - gnus-demon-timestep gnus-demon-timestep 'gnus-demon)) - ;; Reset control variables. - (setq gnus-demon-handler-state - (mapcar - (lambda (handler) - (list (car handler) (gnus-demon-time-to-step (nth 1 handler)) - (nth 2 handler))) - gnus-demon-handlers)) - (setq gnus-demon-idle-time 0) - (setq gnus-demon-idle-has-been-called nil))) - -(gnus-add-shutdown 'gnus-demon-cancel 'gnus) - -(defun gnus-demon-cancel () - "Cancel any Gnus daemons." - (interactive) - (when gnus-demon-timer - (nnheader-cancel-timer gnus-demon-timer)) - (setq gnus-demon-timer nil - gnus-demon-idle-has-been-called nil) - (condition-case () - (nnheader-cancel-function-timers 'gnus-demon) - (error t))) - -(defun gnus-demon-is-idle-p () - "Whether Emacs is idle or not." - ;; We do this simply by comparing the 100 most recent keystrokes - ;; with the ones we had last time. If they are the same, one might - ;; guess that Emacs is indeed idle. This only makes sense if one - ;; calls this function seldom -- like once a minute, which is what - ;; we do here. - (let ((keys (recent-keys))) - (or (equal keys gnus-demon-last-keys) - (progn - (setq gnus-demon-last-keys keys) - nil)))) - -(defun gnus-demon-time-to-step (time) - "Find out how many seconds to TIME, which is on the form \"17:43\"." - (if (not (stringp time)) - time - (let* ((now (current-time)) - ;; obtain NOW as discrete components -- make a vector for speed - (nowParts (decode-time now)) - ;; obtain THEN as discrete components - (thenParts (parse-time-string time)) - (thenHour (elt thenParts 2)) - (thenMin (elt thenParts 1)) - ;; convert time as elements into number of seconds since EPOCH. - (then (encode-time 0 - thenMin - thenHour - ;; If THEN is earlier than NOW, make it - ;; same time tomorrow. Doc for encode-time - ;; says that this is OK. - (+ (elt nowParts 3) - (if (or (< thenHour (elt nowParts 2)) - (and (= thenHour (elt nowParts 2)) - (<= thenMin (elt nowParts 1)))) - 1 0)) - (elt nowParts 4) - (elt nowParts 5) - (elt nowParts 6) - (elt nowParts 7) - (elt nowParts 8))) - ;; calculate number of seconds between NOW and THEN - (diff (+ (* 65536 (- (car then) (car now))) - (- (cadr then) (cadr now))))) - ;; return number of timesteps in the number of seconds - (round (/ diff gnus-demon-timestep))))) - -(defun gnus-demon () - "The Gnus daemon that takes care of running all Gnus handlers." - ;; Increase or reset the time Emacs has been idle. - (if (gnus-demon-is-idle-p) - (incf gnus-demon-idle-time) - (setq gnus-demon-idle-time 0) - (setq gnus-demon-idle-has-been-called nil)) - ;; Disable all daemonic stuff if we're in the minibuffer - (when (and (not (window-minibuffer-p (selected-window))) - (not gnus-inhibit-demon)) - ;; Then we go through all the handler and call those that are - ;; sufficiently ripe. - (let ((handlers gnus-demon-handler-state) - (gnus-inhibit-demon t) - ;; Try to avoid dialog boxes, e.g. by Mailcrypt. - ;; Unfortunately, Emacs 20's `message-or-box...' doesn't - ;; obey `use-dialog-box'. - use-dialog-box (last-nonmenu-event 10) - handler time idle) - (while handlers - (setq handler (pop handlers)) - (cond - ((numberp (setq time (nth 1 handler))) - ;; These handlers use a regular timeout mechanism. We decrease - ;; the timer if it hasn't reached zero yet. - (unless (zerop time) - (setcar (nthcdr 1 handler) (decf time))) - (and (zerop time) ; If the timer now is zero... - ;; Test for appropriate idleness - (progn - (setq idle (nth 2 handler)) - (cond - ((null idle) t) ; Don't care about idle. - ((numberp idle) ; Numerical idle... - (< idle gnus-demon-idle-time)) ; Idle timed out. - (t (< 0 gnus-demon-idle-time)))) ; Or just need to be idle. - ;; So we call the handler. - (progn - (ignore-errors (funcall (car handler))) - ;; And reset the timer. - (setcar (nthcdr 1 handler) - (gnus-demon-time-to-step - (nth 1 (assq (car handler) gnus-demon-handlers))))))) - ;; These are only supposed to be called when Emacs is idle. - ((null (setq idle (nth 2 handler))) - ;; We do nothing. - ) - ((and (not (numberp idle)) - (gnus-demon-is-idle-p)) - ;; We want to call this handler each and every time that - ;; Emacs is idle. - (ignore-errors (funcall (car handler)))) - (t - ;; We want to call this handler only if Emacs has been idle - ;; for a specified number of timesteps. - (and (not (memq (car handler) gnus-demon-idle-has-been-called)) - (< idle gnus-demon-idle-time) - (gnus-demon-is-idle-p) - (progn - (ignore-errors (funcall (car handler))) - ;; Make sure the handler won't be called once more in - ;; this idle-cycle. - (push (car handler) gnus-demon-idle-has-been-called))))))))) - -(defun gnus-demon-add-nocem () - "Add daemonic NoCeM handling to Gnus." - (gnus-demon-add-handler 'gnus-demon-scan-nocem 60 30)) - -(defun gnus-demon-scan-nocem () - "Scan NoCeM groups for NoCeM messages." - (save-window-excursion - (gnus-nocem-scan-groups))) - -(defun gnus-demon-add-disconnection () - "Add daemonic server disconnection to Gnus." - (gnus-demon-add-handler 'gnus-demon-close-connections nil 30)) - -(defun gnus-demon-close-connections () - (save-window-excursion - (gnus-close-backends))) - -(defun gnus-demon-add-nntp-close-connection () - "Add daemonic nntp server disconnection to Gnus. -If no commands have gone out via nntp during the last five -minutes, the connection is closed." - (gnus-demon-add-handler 'gnus-demon-nntp-close-connections 5 nil)) - -(defun gnus-demon-nntp-close-connection () - (save-window-excursion - (when (time-less-p '(0 300) (time-since nntp-last-command-time)) - (nntp-close-server)))) - -(defun gnus-demon-add-scanmail () - "Add daemonic scanning of mail from the mail backends." - (gnus-demon-add-handler 'gnus-demon-scan-mail 120 60)) - -(defun gnus-demon-scan-mail () - (save-window-excursion - (let ((servers gnus-opened-servers) - server - (nnmail-fetched-sources (list t))) - (while (setq server (car (pop servers))) - (and (gnus-check-backend-function 'request-scan (car server)) - (or (gnus-server-opened server) - (gnus-open-server server)) - (gnus-request-scan nil server)))))) - -(defun gnus-demon-add-rescan () - "Add daemonic scanning of new articles from all backends." - (gnus-demon-add-handler 'gnus-demon-scan-news 120 60)) - -(defun gnus-demon-scan-news () - (let ((win (current-window-configuration))) - (unwind-protect - (save-window-excursion - (save-excursion - (when (gnus-alive-p) - (save-excursion - (set-buffer gnus-group-buffer) - (gnus-group-get-new-news))))) - (set-window-configuration win)))) - -(defun gnus-demon-add-scan-timestamps () - "Add daemonic updating of timestamps in empty newgroups." - (gnus-demon-add-handler 'gnus-demon-scan-timestamps nil 30)) - -(defun gnus-demon-scan-timestamps () - "Set the timestamp on all newsgroups with no unread and no ticked articles." - (when (gnus-alive-p) - (let ((cur-time (current-time)) - (newsrc (cdr gnus-newsrc-alist)) - info group unread has-ticked) - (while (setq info (pop newsrc)) - (setq group (gnus-info-group info) - unread (gnus-group-unread group) - has-ticked (cdr (assq 'tick (gnus-info-marks info)))) - (when (and (numberp unread) - (= unread 0) - (not has-ticked)) - (gnus-group-set-parameter group 'timestamp cur-time)))))) - -(provide 'gnus-demon) - -;;; gnus-demon.el ends here diff --git a/lisp/gnus-draft.el b/lisp/gnus-draft.el deleted file mode 100644 index dd93227..0000000 --- a/lisp/gnus-draft.el +++ /dev/null @@ -1,277 +0,0 @@ -;;; gnus-draft.el --- draft message support for Semi-gnus -;; Copyright (C) 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; MORIOKA Tomohiko -;; Tatsuya Ichikawa -;; Keywords: mail, news, MIME, offline - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(require 'gnus) -(require 'gnus-sum) -(require 'message) -(require 'gnus-msg) -(require 'nndraft) -(require 'gnus-agent) -(eval-when-compile (require 'cl)) - -;;; Draft minor mode - -(defvar gnus-draft-mode nil - "Minor mode for providing a draft summary buffers.") - -(defvar gnus-draft-mode-map nil) - -(unless gnus-draft-mode-map - (setq gnus-draft-mode-map (make-sparse-keymap)) - - (gnus-define-keys gnus-draft-mode-map - "Dt" gnus-draft-toggle-sending - "De" gnus-draft-edit-message - "Ds" gnus-draft-send-message - "DS" gnus-draft-send-all-messages)) - -(defun gnus-draft-make-menu-bar () - (unless (boundp 'gnus-draft-menu) - (easy-menu-define - gnus-draft-menu gnus-draft-mode-map "" - '("Drafts" - ["Toggle whether to send" gnus-draft-toggle-sending t] - ["Edit" gnus-draft-edit-message t] - ["Send selected message(s)" gnus-draft-send-message t] - ["Send all messages" gnus-draft-send-all-messages t] - ["Delete draft" gnus-summary-delete-article t])))) - -(defun gnus-draft-mode (&optional arg) - "Minor mode for providing a draft summary buffers. - -\\{gnus-draft-mode-map}" - (interactive "P") - (when (eq major-mode 'gnus-summary-mode) - (when (set (make-local-variable 'gnus-draft-mode) - (if (null arg) (not gnus-draft-mode) - (> (prefix-numeric-value arg) 0))) - ;; Set up the menu. - (when (gnus-visual-p 'draft-menu 'menu) - (gnus-draft-make-menu-bar)) - (gnus-add-minor-mode 'gnus-draft-mode " Draft" gnus-draft-mode-map) - (gnus-run-hooks 'gnus-draft-mode-hook)))) - -;;; Commands - -(defun gnus-draft-toggle-sending (article) - "Toggle whether to send an article or not." - (interactive (list (gnus-summary-article-number))) - (if (gnus-draft-article-sendable-p article) - (progn - (push article gnus-newsgroup-unsendable) - (gnus-summary-mark-article article gnus-unsendable-mark)) - (setq gnus-newsgroup-unsendable - (delq article gnus-newsgroup-unsendable)) - (gnus-summary-mark-article article gnus-unread-mark)) - (gnus-summary-position-point)) - -(defun gnus-draft-edit-message () - "Enter a mail/post buffer to edit and send the draft." - (interactive) - (let ((article (gnus-summary-article-number)) - (group gnus-newsgroup-name)) - (gnus-summary-mark-as-read article gnus-canceled-mark) - (gnus-draft-setup-for-editing article group) - (set-buffer-modified-p t) - (save-excursion - (save-restriction - (message-narrow-to-headers) - (message-remove-header "date"))) - (message-save-drafts) - (let ((gnus-verbose-backends nil)) - (gnus-request-expire-articles (list article) group t)) - (push - `((lambda () - (when (gnus-buffer-exists-p ,gnus-summary-buffer) - (save-excursion - (set-buffer ,gnus-summary-buffer) - (gnus-cache-possibly-remove-article ,article nil nil nil t))))) - message-send-actions))) - -(defun gnus-draft-send-message (&optional n) - "Send the current draft." - (interactive "P") - (let* ((articles (gnus-summary-work-articles n)) - (total (length articles)) - article) - (while (setq article (pop articles)) - (gnus-summary-remove-process-mark article) - (unless (memq article gnus-newsgroup-unsendable) - (let ((message-sending-message - (format "Sending message %d of %d..." - (- total (length articles)) total))) - (gnus-draft-send article gnus-newsgroup-name t)) - (gnus-summary-mark-article article gnus-canceled-mark))))) - -(defun gnus-draft-send (article &optional group interactive) - "Send message ARTICLE." - (let ((message-syntax-checks (if interactive nil - 'dont-check-for-anything-just-trust-me)) - (message-inhibit-body-encoding (or (not group) - (equal group "nndraft:queue") - message-inhibit-body-encoding)) - (message-send-hook (and group (not (equal group "nndraft:queue")) - message-send-hook)) - (message-setup-hook (and group (not (equal group "nndraft:queue")) - message-setup-hook)) - type method) - (gnus-draft-setup-for-sending article (or group "nndraft:queue")) - ;; We read the meta-information that says how and where - ;; this message is to be sent. - (save-restriction - (message-narrow-to-head) - (when (re-search-forward - (concat "^" (regexp-quote gnus-agent-meta-information-header) ":") - nil t) - (setq type (ignore-errors (read (current-buffer))) - method (ignore-errors (read (current-buffer)))) - (message-remove-header gnus-agent-meta-information-header))) - ;; Let Agent restore any GCC lines and have message.el perform them. - (gnus-agent-restore-gcc) - ;; Then we send it. If we have no meta-information, we just send - ;; it and let Message figure out how. - (when (let ((mail-header-separator "")) - (cond ((eq type 'news) - (mime-edit-maybe-split-and-send - (function - (lambda () - (interactive) - (funcall message-send-news-function method)))) - (funcall message-send-news-function method)) - ((eq type 'mail) - (mime-edit-maybe-split-and-send - (function - (lambda () - (interactive) - (funcall message-send-mail-function)))) - (funcall message-send-mail-function) - t))) - (let ((gnus-verbose-backends nil)) - (gnus-request-expire-articles - (list article) (or group "nndraft:queue") t))))) - -(defun gnus-draft-send-all-messages () - "Send all the sendable drafts." - (interactive) - (gnus-uu-mark-buffer) - (gnus-draft-send-message)) - -(defun gnus-group-send-drafts () - "Send all sendable articles from the queue group." - (interactive) - (gnus-activate-group "nndraft:queue") - (save-excursion - (let* ((articles (nndraft-articles)) - (unsendable (gnus-uncompress-range - (cdr (assq 'unsend - (gnus-info-marks - (gnus-get-info "nndraft:queue")))))) - (total (length articles)) - article) - (while (setq article (pop articles)) - (unless (memq article unsendable) - (let ((message-sending-message - (format "Sending message %d of %d..." - (- total (length articles)) total))) - (gnus-draft-send article))))))) - -;;;###autoload -(defun gnus-draft-reminder () - "Reminder user if there are unsent drafts." - (interactive) - (if (gnus-alive-p) - (let (active) - (catch 'continue - (dolist (group '("nndraft:drafts" "nndraft:queue")) - (setq active (gnus-activate-group group)) - (if (and active (>= (cdr active) (car active))) - (if (y-or-n-p "There are unsent drafts. Confirm to exit?") - (throw 'continue t) - (error "Stop!")))))))) - -;;; Utility functions - -(defcustom gnus-draft-decoding-function - #'mime-edit-decode-message-in-buffer - "*Function called to decode the message from network representation." - :group 'gnus-agent - :type 'function) - -;;;!!!If this is byte-compiled, it fails miserably. -;;;!!!This is because `gnus-setup-message' uses uninterned symbols. -;;;!!!This has been fixed in recent versions of Emacs and XEmacs, -;;;!!!but for the time being, we'll just run this tiny function uncompiled. - -(defun gnus-draft-setup-for-editing (narticle group) - (let (ga) - (gnus-setup-message 'forward - (let ((article narticle)) - (message-mail) - (erase-buffer) - (if (not (gnus-request-restore-buffer article group)) - (error "Couldn't restore the article") - (funcall gnus-draft-decoding-function) - ;; Insert the separator. - (goto-char (point-min)) - (search-forward "\n\n") - (forward-char -1) - (insert mail-header-separator) - (forward-line 1) - (setq ga (message-fetch-field gnus-draft-meta-information-header)) - (message-set-auto-save-file-name)))) - (gnus-backlog-remove-article group narticle) - (when (and ga - (ignore-errors (setq ga (car (read-from-string ga))))) - (setq gnus-newsgroup-name - (if (equal (car ga) "") nil (car ga))) - (setq message-post-method - `(lambda (arg) - (gnus-post-method arg ,(car ga)))) - (message-add-action - `(gnus-add-mark ,(car ga) 'replied ,(cadr ga)) - 'send)))) - -(defvar gnus-draft-send-draft-buffer " *send draft*") -(defun gnus-draft-setup-for-sending (narticle group) - (let ((article narticle)) - (if (not (get-buffer gnus-draft-send-draft-buffer)) - (get-buffer-create gnus-draft-send-draft-buffer)) - (set-buffer gnus-draft-send-draft-buffer) - (erase-buffer) - (if (not (gnus-request-restore-buffer article group)) - (error "Couldn't restore the article")))) - -(defun gnus-draft-article-sendable-p (article) - "Say whether ARTICLE is sendable." - (not (memq article gnus-newsgroup-unsendable))) - -(provide 'gnus-draft) - -;;; gnus-draft.el ends here diff --git a/lisp/gnus-dup.el b/lisp/gnus-dup.el deleted file mode 100644 index a2b5544..0000000 --- a/lisp/gnus-dup.el +++ /dev/null @@ -1,165 +0,0 @@ -;;; gnus-dup.el --- suppression of duplicate articles in Gnus -;; Copyright (C) 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; This package tries to mark articles as read the second time the -;; user reads a copy. This is useful if the server doesn't support -;; Xref properly, or if the user reads the same group from several -;; servers. - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus) -(require 'gnus-art) - -(defgroup gnus-duplicate nil - "Suppression of duplicate articles." - :group 'gnus) - -(defcustom gnus-save-duplicate-list nil - "*If non-nil, save the duplicate list when shutting down Gnus. -If nil, duplicate suppression will only work on duplicates -seen in the same session." - :group 'gnus-duplicate - :type 'boolean) - -(defcustom gnus-duplicate-list-length 10000 - "*The number of Message-IDs to keep in the duplicate suppression list." - :group 'gnus-duplicate - :type 'integer) - -(defcustom gnus-duplicate-file (nnheader-concat gnus-directory "suppression") - "*The name of the file to store the duplicate suppression list." - :group 'gnus-duplicate - :type 'file) - -;;; Internal variables - -(defvar gnus-dup-list nil) -(defvar gnus-dup-hashtb nil) - -(defvar gnus-dup-list-dirty nil) - -;;; -;;; Starting and stopping -;;; - -(gnus-add-shutdown 'gnus-dup-close 'gnus) - -(defun gnus-dup-close () - "Possibly save the duplicate suppression list and shut down the subsystem." - (gnus-dup-save) - (setq gnus-dup-list nil - gnus-dup-hashtb nil - gnus-dup-list-dirty nil)) - -(defun gnus-dup-open () - "Possibly read the duplicate suppression list and start the subsystem." - (if gnus-save-duplicate-list - (gnus-dup-read) - (setq gnus-dup-list nil)) - (setq gnus-dup-hashtb (gnus-make-hashtable gnus-duplicate-list-length)) - ;; Enter all Message-IDs into the hash table. - (let ((list gnus-dup-list) - (obarray gnus-dup-hashtb)) - (while list - (intern (pop list))))) - -(defun gnus-dup-read () - "Read the duplicate suppression list." - (setq gnus-dup-list nil) - (when (file-exists-p gnus-duplicate-file) - (load gnus-duplicate-file t t t))) - -(defun gnus-dup-save () - "Save the duplicate suppression list." - (when (and gnus-save-duplicate-list - gnus-dup-list-dirty) - (with-temp-file gnus-duplicate-file - (gnus-prin1 `(setq gnus-dup-list ',gnus-dup-list)))) - (setq gnus-dup-list-dirty nil)) - -;;; -;;; Interface functions -;;; - -(defun gnus-dup-enter-articles () - "Enter articles from the current group for future duplicate suppression." - (unless gnus-dup-list - (gnus-dup-open)) - (setq gnus-dup-list-dirty t) ; mark list for saving - (let ((data gnus-newsgroup-data) - datum msgid) - ;; Enter the Message-IDs of all read articles into the list - ;; and hash table. - (while (setq datum (pop data)) - (when (and (not (gnus-data-pseudo-p datum)) - (> (gnus-data-number datum) 0) - (not (memq (gnus-data-number datum) gnus-newsgroup-unreads)) - (not (= (gnus-data-mark datum) gnus-canceled-mark)) - (setq msgid (mail-header-id (gnus-data-header datum))) - (not (nnheader-fake-message-id-p msgid)) - (not (intern-soft msgid gnus-dup-hashtb))) - (push msgid gnus-dup-list) - (intern msgid gnus-dup-hashtb)))) - ;; Chop off excess Message-IDs from the list. - (let ((end (nthcdr gnus-duplicate-list-length gnus-dup-list))) - (when end - (setcdr end nil)))) - -(defun gnus-dup-suppress-articles () - "Mark duplicate articles as read." - (unless gnus-dup-list - (gnus-dup-open)) - (gnus-message 6 "Suppressing duplicates...") - (let ((headers gnus-newsgroup-headers) - (auto (and gnus-newsgroup-auto-expire - (memq gnus-duplicate-mark gnus-auto-expirable-marks))) - number header) - (while (setq header (pop headers)) - (when (and (intern-soft (mail-header-id header) gnus-dup-hashtb) - (gnus-summary-article-unread-p (mail-header-number header))) - (setq gnus-newsgroup-unreads - (delq (setq number (mail-header-number header)) - gnus-newsgroup-unreads)) - (if (not auto) - (push (cons number gnus-duplicate-mark) gnus-newsgroup-reads) - (push number gnus-newsgroup-expirable) - (push (cons number gnus-expirable-mark) gnus-newsgroup-reads))))) - (gnus-message 6 "Suppressing duplicates...done")) - -(defun gnus-dup-unsuppress-article (article) - "Stop suppression of ARTICLE." - (let ((id (mail-header-id (gnus-data-header (gnus-data-find article))))) - (when id - (setq gnus-dup-list-dirty t) - (setq gnus-dup-list (delete id gnus-dup-list)) - (unintern id gnus-dup-hashtb)))) - -(provide 'gnus-dup) - -;;; gnus-dup.el ends here diff --git a/lisp/gnus-eform.el b/lisp/gnus-eform.el deleted file mode 100644 index d55a6b5..0000000 --- a/lisp/gnus-eform.el +++ /dev/null @@ -1,133 +0,0 @@ -;;; gnus-eform.el --- a mode for editing forms for Gnus -;; Copyright (C) 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(require 'gnus) -(require 'gnus-win) - -;;; -;;; Editing forms -;;; - -(defgroup gnus-edit-form nil - "A mode for editing forms." - :group 'gnus) - -(defcustom gnus-edit-form-mode-hook nil - "Hook run in `gnus-edit-form-mode' buffers." - :group 'gnus-edit-form - :type 'hook) - -(defcustom gnus-edit-form-menu-hook nil - "Hook run when creating menus in `gnus-edit-form-mode' buffers." - :group 'gnus-edit-form - :type 'hook) - -;;; Internal variables - -(defvar gnus-edit-form-buffer "*Gnus edit form*") -(defvar gnus-edit-form-done-function nil) - -(defvar gnus-edit-form-mode-map nil) -(unless gnus-edit-form-mode-map - (setq gnus-edit-form-mode-map (make-sparse-keymap)) - (set-keymap-parent gnus-edit-form-mode-map emacs-lisp-mode-map) - (gnus-define-keys gnus-edit-form-mode-map - "\C-c\C-c" gnus-edit-form-done - "\C-c\C-k" gnus-edit-form-exit)) - -(defun gnus-edit-form-make-menu-bar () - (unless (boundp 'gnus-edit-form-menu) - (easy-menu-define - gnus-edit-form-menu gnus-edit-form-mode-map "" - '("Edit Form" - ["Exit and save changes" gnus-edit-form-done t] - ["Exit" gnus-edit-form-exit t])) - (gnus-run-hooks 'gnus-edit-form-menu-hook))) - -(defun gnus-edit-form-mode () - "Major mode for editing forms. -It is a slightly enhanced emacs-lisp-mode. - -\\{gnus-edit-form-mode-map}" - (interactive) - (when (gnus-visual-p 'group-menu 'menu) - (gnus-edit-form-make-menu-bar)) - (kill-all-local-variables) - (setq major-mode 'gnus-edit-form-mode) - (setq mode-name "Edit Form") - (use-local-map gnus-edit-form-mode-map) - (make-local-variable 'gnus-edit-form-done-function) - (make-local-variable 'gnus-prev-winconf) - (gnus-run-hooks 'gnus-edit-form-mode-hook)) - -(defun gnus-edit-form (form documentation exit-func) - "Edit FORM in a new buffer. -Call EXIT-FUNC on exit. Display DOCUMENTATION in the beginning -of the buffer." - (let ((winconf (current-window-configuration))) - (set-buffer (gnus-get-buffer-create gnus-edit-form-buffer)) - (gnus-configure-windows 'edit-form) - (gnus-edit-form-mode) - (setq gnus-prev-winconf winconf) - (setq gnus-edit-form-done-function exit-func) - (erase-buffer) - (insert documentation) - (unless (bolp) - (insert "\n")) - (goto-char (point-min)) - (while (not (eobp)) - (insert ";;; ") - (forward-line 1)) - (insert ";; Type `C-c C-c' after you've finished editing.\n") - (insert "\n") - (let ((p (point))) - (pp form (current-buffer)) - (insert "\n") - (goto-char p)))) - -(defun gnus-edit-form-done () - "Update changes and kill the current buffer." - (interactive) - (goto-char (point-min)) - (let ((form (condition-case nil - (read (current-buffer)) - (end-of-file nil))) - (func gnus-edit-form-done-function)) - (gnus-edit-form-exit) - (funcall func form))) - -(defun gnus-edit-form-exit () - "Kill the current buffer." - (interactive) - (let ((winconf gnus-prev-winconf)) - (kill-buffer (current-buffer)) - (set-window-configuration winconf))) - -(provide 'gnus-eform) - -;;; gnus-eform.el ends here diff --git a/lisp/gnus-ems.el b/lisp/gnus-ems.el deleted file mode 100644 index 1682e0f..0000000 --- a/lisp/gnus-ems.el +++ /dev/null @@ -1,347 +0,0 @@ -;;; gnus-ems.el --- functions for making Semi-gnus work under different Emacsen -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Tatsuya Ichikawa -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile - (require 'cl) - (require 'ring)) - -;;; Function aliases later to be redefined for XEmacs usage. - -(defvar gnus-mouse-2 [mouse-2]) -(defvar gnus-down-mouse-3 [down-mouse-3]) -(defvar gnus-down-mouse-2 [down-mouse-2]) -(defvar gnus-widget-button-keymap nil) -(defvar gnus-mode-line-modified - (if (or (featurep 'xemacs) - (< emacs-major-version 20)) - '("--**-" . "-----") - '("**" "--"))) - -(eval-and-compile - (autoload 'gnus-xmas-define "gnus-xmas") - (autoload 'gnus-xmas-redefine "gnus-xmas") - (autoload 'appt-select-lowest-window "appt")) - -(if (featurep 'xemacs) - (autoload 'gnus-smiley-display "smiley") - (autoload 'gnus-smiley-display "smiley-ems")) ; override XEmacs version - -(defun gnus-kill-all-overlays () - "Delete all overlays in the current buffer." - (let* ((overlayss (overlay-lists)) - (buffer-read-only nil) - (overlays (delq nil (nconc (car overlayss) (cdr overlayss))))) - (while overlays - (delete-overlay (pop overlays))))) - -;;; Mule functions. - -(eval-and-compile - (defalias 'gnus-char-width - (if (fboundp 'char-width) - 'char-width - (lambda (ch) 1)))) ;; A simple hack. - -(eval-and-compile - (if (featurep 'xemacs) - (gnus-xmas-define) - (defvar gnus-mouse-face-prop 'mouse-face - "Property used for highlighting mouse regions."))) - -(eval-and-compile - (let ((case-fold-search t)) - (cond - ((string-match "windows-nt\\|os/2\\|emx\\|cygwin32" - (symbol-name system-type)) - (setq nnheader-file-name-translation-alist - (append nnheader-file-name-translation-alist - (mapcar (lambda (c) (cons c ?_)) - '(?: ?* ?\" ?< ?> ??)) - (if (string-match "windows-nt\\|cygwin32" - (symbol-name system-type)) - nil - '((?+ . ?-))))))))) - -(defvar gnus-tmp-unread) -(defvar gnus-tmp-replied) -(defvar gnus-tmp-score-char) -(defvar gnus-tmp-indentation) -(defvar gnus-tmp-opening-bracket) -(defvar gnus-tmp-lines) -(defvar gnus-tmp-name) -(defvar gnus-tmp-closing-bracket) -(defvar gnus-tmp-subject-or-nil) -(defvar gnus-check-before-posting) - -(defun gnus-ems-redefine () - (cond - ((featurep 'xemacs) - (gnus-xmas-redefine)) - - ((featurep 'mule) - ;; Mule and new Emacs definitions - - ;; [Note] Now there are three kinds of mule implementations, - ;; original MULE, XEmacs/mule and Emacs 20+ including - ;; MULE features. Unfortunately these API are different. In - ;; particular, Emacs (including original MULE) and XEmacs are - ;; quite different. However, this version of Gnus doesn't support - ;; anything other than XEmacs 20+ and Emacs 20.3+. - - ;; Predicates to check are following: - ;; (boundp 'MULE) is t only if MULE (original; anything older than - ;; Mule 2.3) is running. - ;; (featurep 'mule) is t when every mule variants are running. - - ;; It is possible to detect XEmacs/mule by (featurep 'mule) and - ;; checking `emacs-version'. In this case, the implementation for - ;; XEmacs/mule may be shareable between XEmacs and XEmacs/mule. - - (defvar gnus-summary-display-table nil - "Display table used in summary mode buffers.") - - (defalias 'gnus-summary-set-display-table (lambda ())) - - (if (fboundp 'truncate-string-to-width) - (fset 'gnus-truncate-string 'truncate-string-to-width) - (fset 'gnus-truncate-string 'truncate-string)) - - (when (boundp 'gnus-check-before-posting) - (setq gnus-check-before-posting - (delq 'long-lines - (delq 'control-chars gnus-check-before-posting)))) - )) - (when (featurep 'mule) - (defun gnus-tilde-max-form (el max-width) - "Return a form that limits EL to MAX-WIDTH." - (let ((max (abs max-width))) - (if (symbolp el) - (if (< max-width 0) - `(let ((width (string-width ,el))) - (gnus-truncate-string ,el width (- width ,max))) - `(gnus-truncate-string ,el ,max)) - (if (< max-width 0) - `(let* ((val (eval ,el)) - (width (string-width val))) - (gnus-truncate-string val width (- width ,max))) - `(let ((val (eval ,el))) - (gnus-truncate-string val ,max)))))) - - (defun gnus-tilde-cut-form (el cut-width) - "Return a form that cuts CUT-WIDTH off of EL." - (let ((cut (abs cut-width))) - (if (symbolp el) - (if (< cut-width 0) - `(gnus-truncate-string ,el (- (string-width ,el) ,cut)) - `(gnus-truncate-string ,el (string-width ,el) ,cut)) - (if (< cut-width 0) - `(let ((val (eval ,el))) - (gnus-truncate-string val (- (string-width val) ,cut))) - `(let ((val (eval ,el))) - (gnus-truncate-string val (string-width val) ,cut)))))) - )) - -(defun gnus-region-active-p () - "Say whether the region is active." - (and (boundp 'transient-mark-mode) - transient-mark-mode - (boundp 'mark-active) - mark-active)) - -(if (fboundp 'add-minor-mode) - (defalias 'gnus-add-minor-mode 'add-minor-mode) - (defun gnus-add-minor-mode (mode name map &rest rest) - (set (make-local-variable mode) t) - (unless (assq mode minor-mode-alist) - (push `(,mode ,name) minor-mode-alist)) - (unless (assq mode minor-mode-map-alist) - (push (cons mode map) - minor-mode-map-alist)))) - -(defun gnus-x-splash () - "Show a splash screen using a pixmap in the current buffer." - (let ((dir (nnheader-find-etc-directory "gnus")) - pixmap file height beg i) - (save-excursion - (switch-to-buffer (gnus-get-buffer-create gnus-group-buffer)) - (let ((buffer-read-only nil) - width height) - (erase-buffer) - (when (and dir - (file-exists-p (setq file - (expand-file-name "x-splash" dir)))) - (with-temp-buffer - (insert-file-contents-as-binary file) - (goto-char (point-min)) - (ignore-errors - (setq pixmap (read (current-buffer)))))) - (when pixmap - (make-face 'gnus-splash) - (setq height (/ (car pixmap) (frame-char-height)) - width (/ (cadr pixmap) (frame-char-width))) - (set-face-foreground 'gnus-splash "Brown") - (set-face-stipple 'gnus-splash pixmap) - (insert-char ?\n (* (/ (window-height) 2 height) height)) - (setq i height) - (while (> i 0) - (insert-char ?\ (* (/ (window-width) 2 width) width)) - (setq beg (point)) - (insert-char ?\ width) - (set-text-properties beg (point) '(face gnus-splash)) - (insert ?\n) - (decf i)) - (goto-char (point-min)) - (sit-for 0)))))) - -(defvar gnus-article-xface-ring-internal nil - "Cache for face data.") - -;; Worth customizing? -(defvar gnus-article-xface-ring-size 6 - "Length of the ring used for `gnus-article-xface-ring-internal'.") - -(defvar gnus-article-compface-xbm - (condition-case () - (eq 0 (string-match "#define" - (shell-command-to-string "uncompface -X"))) - (error nil)) - "Non-nil means the compface program supports the -X option. -That produces XBM output.") - -(defun gnus-article-display-xface (beg end &optional buffer) - "Display an XFace header from between BEG and END in BUFFER. -Requires support for images in your Emacs and the external programs -`uncompface', and `icontopbm'. On a GNU/Linux system these -might be in packages with names like `compface' or `faces-xface' and -`netpbm' or `libgr-progs', for instance. See also -`gnus-article-compface-xbm'. - -This function is for Emacs 21+. See `gnus-xmas-article-display-xface' -for XEmacs." - ;; It might be worth converting uncompface's output in Lisp. - - (when (if (fboundp 'display-graphic-p) - (display-graphic-p)) - (unless gnus-article-xface-ring-internal ; Only load ring when needed. - (setq gnus-article-xface-ring-internal - (make-ring gnus-article-xface-ring-size))) - (save-excursion - (let* ((cur (current-buffer)) - (data (if buffer - (with-current-buffer buffer - (buffer-substring beg end)) - (buffer-substring beg end))) - (image (cdr-safe (assoc data (ring-elements - gnus-article-xface-ring-internal)))) - default-enable-multibyte-characters) - (unless image - (with-temp-buffer - (insert data) - (and (eq 0 (apply #'call-process-region (point-min) (point-max) - "uncompface" - 'delete '(t nil) nil - (if gnus-article-compface-xbm - '("-X")))) - (if gnus-article-compface-xbm - t - (goto-char (point-min)) - (progn (insert "/* Width=48, Height=48 */\n") t) - (eq 0 (call-process-region (point-min) (point-max) - "icontopbm" - 'delete '(t nil)))) - ;; Miles Bader says that faces don't look right as - ;; light on dark. - (if (eq 'dark (cdr-safe (assq 'background-mode - (frame-parameters)))) - (setq image (create-image (buffer-string) - (if gnus-article-compface-xbm - 'xbm - 'pbm) - t - :ascent 'center - :foreground "black" - :background "white")) - (setq image (create-image (buffer-string) - (if gnus-article-compface-xbm - 'xbm - 'pbm) - t - :ascent 'center))))) - (ring-insert gnus-article-xface-ring-internal (cons data image))) - (when image - (goto-char (point-min)) - (re-search-forward "^From:" nil 'move) - (insert-image image)))))) - -(defun-maybe assoc-ignore-case (key alist) - "Like `assoc', but assumes KEY is a string and ignores case when comparing." - (setq key (downcase key)) - (let (element) - (while (and alist (not element)) - (if (equal key (downcase (car (car alist)))) - (setq element (car alist))) - (setq alist (cdr alist))) - element)) - - -;;; Language support staffs. - -(defvar-maybe current-language-environment "English" - "The language environment.") - -(defvar-maybe language-info-alist nil - "Alist of language environment definitions.") - -(defun-maybe get-language-info (lang-env key) - "Return information listed under KEY for language environment LANG-ENV." - (if (symbolp lang-env) - (setq lang-env (symbol-name lang-env))) - (let ((lang-slot (assoc-ignore-case lang-env language-info-alist))) - (if lang-slot - (cdr (assq key (cdr lang-slot)))))) - -(defun-maybe set-language-info (lang-env key info) - "Modify part of the definition of language environment LANG-ENV." - (if (symbolp lang-env) - (setq lang-env (symbol-name lang-env))) - (let (lang-slot key-slot) - (setq lang-slot (assoc lang-env language-info-alist)) - (if (null lang-slot) ; If no slot for the language, add it. - (setq lang-slot (list lang-env) - language-info-alist (cons lang-slot language-info-alist))) - (setq key-slot (assq key lang-slot)) - (if (null key-slot) ; If no slot for the key, add it. - (progn - (setq key-slot (list key)) - (setcdr lang-slot (cons key-slot (cdr lang-slot))))) - (setcdr key-slot info))) - -(provide 'gnus-ems) - -;;; gnus-ems.el ends here diff --git a/lisp/gnus-gl.el b/lisp/gnus-gl.el deleted file mode 100644 index df12c92..0000000 --- a/lisp/gnus-gl.el +++ /dev/null @@ -1,860 +0,0 @@ -;;; gnus-gl.el --- an interface to GroupLens for Gnus - -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Brad Miller -;; Keywords: news, score - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; GroupLens software and documentation is copyright (c) 1995 by Paul -;; Resnick (Massachusetts Institute of Technology); Brad Miller, John -;; Riedl, Jon Herlocker, and Joseph Konstan (University of Minnesota), -;; and David Maltz (Carnegie-Mellon University). -;; -;; Permission to use, copy, modify, and distribute this documentation -;; for non-commercial and commercial purposes without fee is hereby -;; granted provided that this copyright notice and permission notice -;; appears in all copies and that the names of the individuals and -;; institutions holding this copyright are not used in advertising or -;; publicity pertaining to this software without specific, written -;; prior permission. The copyright holders make no representations -;; about the suitability of this software and documentation for any -;; purpose. It is provided ``as is'' without express or implied -;; warranty. -;; -;; The copyright holders request that they be notified of -;; modifications of this code. Please send electronic mail to -;; grouplens@cs.umn.edu for more information or to announce derived -;; works. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Author: Brad Miller -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;; User Documentation: -;; To use GroupLens you must load this file. -;; You must also register a pseudonym with the Better Bit Bureau. -;; http://www.cs.umn.edu/Research/GroupLens -;; -;; ---------------- For your .emacs or .gnus file ---------------- -;; -;; As of version 2.5, grouplens now works as a minor mode of -;; gnus-summary-mode. To get make that work you just need a couple of -;; hooks. -;; (setq gnus-use-grouplens t) -;; (setq grouplens-pseudonym "") -;; (setq grouplens-bbb-host "grouplens.cs.umn.edu") -;; -;; (setq gnus-summary-default-score 0) -;; -;; USING GROUPLENS -;; How do I Rate an article?? -;; Before you type n to go to the next article, hit a number from 1-5 -;; Type r in the summary buffer and you will be prompted. -;; Note that when you're in grouplens-minor-mode 'r' masks the -;; usual reply binding for 'r' -;; -;; What if, Gasp, I find a bug??? -;; Please type M-x gnus-gl-submit-bug-report. This will set up a -;; mail buffer with the state of variables and buffers that will help -;; me debug the problem. A short description up front would help too! -;; -;; How do I display the prediction for an article: -;; If you set the gnus-summary-line-format as shown above, the score -;; (prediction) will be shown automatically. -;; -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Programmer Notes -;; 10/9/95 -;; gnus-scores-articles contains the articles -;; When scoring is done, the call tree looks something like: -;; gnus-possibly-score-headers -;; ==> gnus-score-headers -;; ==> gnus-score-load-file -;; ==> get-all-mids (from the eval form) -;; -;; it would be nice to have one that gets called after all the other -;; headers have been scored. -;; we may want a variable gnus-grouplens-scale-factor -;; and gnus-grouplens-offset this would probably be either -3 or 0 -;; to make the scores centered around zero or not. -;; Notes 10/12/95 -;; According to Lars, Norse god of gnus, the simple way to insert a -;; call to an external function is to have a function added to the -;; variable gnus-score-find-files-function This new function -;; gnus-grouplens-score-alist will return a core alist that -;; has (("message-id" ("" score) ("" score)) -;; This seems like it would be pretty inefficient, though workable. -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; TODO -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;; 3. Add some more ways to rate messages -;; 4. Better error handling for token timeouts. -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; bugs -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus-score) -(require 'gnus) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; User variables -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(defvar gnus-summary-grouplens-line-format - "%U\%R\%z%l%I\%(%[%4L: %-23,23n%]%) %s\n" - "*The line format spec in summary GroupLens mode buffers.") - -(defvar grouplens-pseudonym "" - "User's pseudonym. -This pseudonym is obtained during the registration process") - -(defvar grouplens-bbb-host "grouplens.cs.umn.edu" - "Host where the bbbd is running.") - -(defvar grouplens-bbb-port 9000 - "Port where the bbbd is listening.") - -(defvar grouplens-newsgroups - '("comp.groupware" "comp.human-factors" "comp.lang.c++" - "comp.lang.java" "comp.os.linux.admin" "comp.os.linux.advocacy" - "comp.os.linux.announce" "comp.os.linux.answers" - "comp.os.linux.development" "comp.os.linux.development.apps" - "comp.os.linux.development.system" "comp.os.linux.hardware" - "comp.os.linux.help" "comp.os.linux.m68k" "comp.os.linux.misc" - "comp.os.linux.networking" "comp.os.linux.setup" "comp.os.linux.x" - "mn.general" "rec.arts.movies" "rec.arts.movies.current-films" - "rec.food.recipes" "rec.humor") - "*Groups that are part of the GroupLens experiment.") - -(defvar grouplens-prediction-display 'prediction-spot - "valid values are: - prediction-spot -- an * corresponding to the prediction between 1 and 5, - confidence-interval -- a numeric confidence interval - prediction-bar -- |##### | the longer the bar, the better the article, - confidence-bar -- | ----- } the prediction is in the middle of the bar, - confidence-spot -- ) * | the spot gets bigger with more confidence, - prediction-num -- plain-old numeric value, - confidence-plus-minus -- prediction +/i confidence") - -(defvar grouplens-score-offset 0 - "Offset the prediction by this value. -Setting this variable to -2 would have the following effect on -GroupLens scores: - - 1 --> -2 - 2 --> -1 - 3 --> 0 - 4 --> 1 - 5 --> 2 - -The reason is that a user might want to do this is to combine -GroupLens predictions with scores calculated by other score methods.") - -(defvar grouplens-score-scale-factor 1 - "This variable allows the user to magnify the effect of GroupLens scores. -The scale factor is applied after the offset.") - -(defvar gnus-grouplens-override-scoring 'override - "Tell GroupLens to override the normal Gnus scoring mechanism. -GroupLens scores can be combined with gnus scores in one of three ways. -'override -- just use grouplens predictions for grouplens groups -'combine -- combine grouplens scores with gnus scores -'separate -- treat grouplens scores completely separate from gnus") - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; Program global variables -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defvar grouplens-bbb-token nil - "Current session token number.") - -(defvar grouplens-bbb-process nil - "Process Id of current bbbd network stream process.") - -(defvar grouplens-bbb-buffer nil - "Buffer associated with the BBBD process.") - -(defvar grouplens-rating-alist nil - "Current set of message-id rating pairs.") - -(defvar grouplens-current-hashtable nil - "A hashtable to hold predictions from the BBB.") - -(defvar grouplens-current-group nil) - -;;(defvar bbb-alist nil) - -(defvar bbb-timeout-secs 10 - "Number of seconds to wait for some response from the BBB. -If this times out we give up and assume that something has died..." ) - -(defvar grouplens-previous-article nil - "Message-ID of the last article read.") - -(defvar bbb-read-point) -(defvar bbb-response-point) - -(defun bbb-renew-hash-table () - (setq grouplens-current-hashtable (make-vector 100 0))) - -(bbb-renew-hash-table) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; Utility Functions -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(defun bbb-connect-to-bbbd (host port) - (unless grouplens-bbb-buffer - (setq grouplens-bbb-buffer - (gnus-get-buffer-create (format " *BBBD trace: %s*" host))) - (save-excursion - (set-buffer grouplens-bbb-buffer) - (make-local-variable 'bbb-read-point) - (make-local-variable 'bbb-response-point) - (setq bbb-read-point (point-min)))) - - ;; if an old process is still running for some reason, kill it - (when grouplens-bbb-process - (ignore-errors - (when (eq 'open (process-status grouplens-bbb-process)) - (set-process-buffer grouplens-bbb-process nil) - (delete-process grouplens-bbb-process)))) - - ;; clear the trace buffer of old output - (save-excursion - (set-buffer grouplens-bbb-buffer) - (erase-buffer)) - - ;; open the connection to the server - (catch 'done - (condition-case error - (setq grouplens-bbb-process - (open-network-stream-as-binary - "BBBD" grouplens-bbb-buffer host port)) - (error (gnus-message 3 "Error: Failed to connect to BBB") - nil)) - (and (null grouplens-bbb-process) - (throw 'done nil)) - (save-excursion - (set-buffer grouplens-bbb-buffer) - (setq bbb-read-point (point-min)) - (or (bbb-read-response grouplens-bbb-process) - (throw 'done nil)))) - - ;; return the process - grouplens-bbb-process) - -(defun bbb-send-command (process command) - (goto-char (point-max)) - (insert command) - (insert "\r\n") - (setq bbb-read-point (point)) - (setq bbb-response-point (point)) - (set-marker (process-mark process) (point)) ; process output also comes here - (process-send-string process command) - (process-send-string process "\r\n") - (process-send-eof process)) - -(defun bbb-read-response (process) - "This function eats the initial response of OK or ERROR from the BBB." - (let ((case-fold-search nil) - match-end) - (goto-char bbb-read-point) - (while (and (not (search-forward "\r\n" nil t)) - (accept-process-output process bbb-timeout-secs)) - (goto-char bbb-read-point)) - (setq match-end (point)) - (goto-char bbb-read-point) - (setq bbb-read-point match-end) - (looking-at "OK"))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; Login Functions -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defun bbb-login () - "return the token number if login is successful, otherwise return nil." - (interactive) - (setq grouplens-bbb-token nil) - (if (not (equal grouplens-pseudonym "")) - (let ((bbb-process - (bbb-connect-to-bbbd grouplens-bbb-host grouplens-bbb-port))) - (if bbb-process - (save-excursion - (set-buffer (process-buffer bbb-process)) - (bbb-send-command bbb-process - (concat "login " grouplens-pseudonym)) - (if (bbb-read-response bbb-process) - (setq grouplens-bbb-token (bbb-extract-token-number)) - (gnus-message 3 "Error: GroupLens login failed"))))) - (gnus-message 3 "Error: you must set a pseudonym")) - grouplens-bbb-token) - -(defun bbb-extract-token-number () - (let ((token-pos (search-forward "token=" nil t))) - (when (looking-at "[0-9]+") - (buffer-substring token-pos (match-end 0))))) - -(gnus-add-shutdown 'bbb-logout 'gnus) - -(defun bbb-logout () - "logout of bbb session." - (when grouplens-bbb-token - (let ((bbb-process - (bbb-connect-to-bbbd grouplens-bbb-host grouplens-bbb-port))) - (when bbb-process - (save-excursion - (set-buffer (process-buffer bbb-process)) - (bbb-send-command bbb-process (concat "logout " grouplens-bbb-token)) - (bbb-read-response bbb-process)))))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; Get Predictions -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(defun bbb-build-mid-scores-alist (groupname) - "this function can be called as part of the function to return the list of score files to use. -See the gnus variable gnus-score-find-score-files-function. - -*Note:* If you want to use grouplens scores along with calculated scores, -you should see the offset and scale variables. At this point, I don't -recommend using both scores and grouplens predictions together." - (setq grouplens-current-group groupname) - (when (member groupname grouplens-newsgroups) - (setq grouplens-previous-article nil) - ;; scores-alist should be a list of lists: - ;; ((("message-id" ("" score1 nil s) (" score2 nil s)))) - ;;`((("message-id" . ,predict-list))) ; Yes, this is the return value - (list - (list - (list (append (list "message-id") - (bbb-get-predictions (bbb-get-all-mids) groupname))))))) - -(defun bbb-get-predictions (midlist groupname) - "Ask the bbb for predictions, and build up the score alist." - (gnus-message 5 "Fetching Predictions...") - (if grouplens-bbb-token - (let ((bbb-process (bbb-connect-to-bbbd grouplens-bbb-host - grouplens-bbb-port))) - (when bbb-process - (save-excursion - (set-buffer (process-buffer bbb-process)) - (bbb-send-command bbb-process - (bbb-build-predict-command midlist groupname - grouplens-bbb-token)) - (if (bbb-read-response bbb-process) - (bbb-get-prediction-response bbb-process) - (gnus-message 1 "Invalid Token, login and try again") - (ding))))) - (gnus-message 3 "Error: You are not logged in to a BBB") - (ding))) - -(defun bbb-get-all-mids () - (mapcar (function (lambda (x) (mail-header-id x))) gnus-newsgroup-headers)) - -(defun bbb-build-predict-command (mlist grpname token) - (concat "getpredictions " token " " grpname "\r\n" - (mapconcat 'identity mlist "\r\n") "\r\n.\r\n")) - -(defun bbb-get-prediction-response (process) - (let ((case-fold-search nil)) - (goto-char bbb-read-point) - (while (and (not (search-forward ".\r\n" nil t)) - (accept-process-output process bbb-timeout-secs)) - (goto-char bbb-read-point)) - (goto-char (+ bbb-response-point 4));; we ought to be right before OK - (bbb-build-response-alist))) - -;; build-response-alist assumes that the cursor has been positioned at -;; the first line of the list of mid/rating pairs. -(defun bbb-build-response-alist () - (let (resp mid pred) - (while - (cond - ((looking-at "\\(<.*>\\) :nopred=") - ;;(push `(,(bbb-get-mid) ,gnus-summary-default-score nil s) resp) - (forward-line 1) - t) - ((looking-at "\\(<.*>\\) :pred=\\([0-9]\.[0-9][0-9]\\) :conflow=\\([0-9]\.[0-9][0-9]\\) :confhigh=\\([0-9]\.[0-9][0-9]\\)") - (setq mid (bbb-get-mid) - pred (bbb-get-pred)) - (push `(,mid ,pred nil s) resp) - (gnus-sethash mid (list pred (bbb-get-confl) (bbb-get-confh)) - grouplens-current-hashtable) - (forward-line 1) - t) - ((looking-at "\\(<.*>\\) :pred=\\([0-9]\.[0-9][0-9]\\)") - (setq mid (bbb-get-mid) - pred (bbb-get-pred)) - (push `(,mid ,pred nil s) resp) - (gnus-sethash mid (list pred 0 0) grouplens-current-hashtable) - (forward-line 1) - t) - (t nil))) - resp)) - -;; these "get" functions assume that there is an active match lying -;; around. Where the first parenthesized expression is the -;; message-id, and the second is the prediction, the third and fourth -;; are the confidence interval -;; -;; Since gnus assumes that scores are integer values?? we round the -;; prediction. -(defun bbb-get-mid () - (buffer-substring (match-beginning 1) (match-end 1))) - -(defun bbb-get-pred () - (let ((tpred (string-to-number (buffer-substring (match-beginning 2) - (match-end 2))))) - (if (> tpred 0) - (round (* grouplens-score-scale-factor - (+ grouplens-score-offset tpred))) - 1))) - -(defun bbb-get-confl () - (string-to-number (buffer-substring (match-beginning 4) (match-end 4)))) - -(defun bbb-get-confh () - (string-to-number (buffer-substring (match-beginning 4) (match-end 4)))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; Prediction Display -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defconst grplens-rating-range 4.0) -(defconst grplens-maxrating 5) -(defconst grplens-minrating 1) -(defconst grplens-predstringsize 12) - -(defvar gnus-tmp-score) -(defun bbb-grouplens-score (header) - (if (eq gnus-grouplens-override-scoring 'separate) - (bbb-grouplens-other-score header) - (let* ((rate-string (make-string 12 ?\ )) - (mid (mail-header-id header)) - (hashent (gnus-gethash mid grouplens-current-hashtable)) - (iscore gnus-tmp-score) - (low (car (cdr hashent))) - (high (car (cdr (cdr hashent))))) - (aset rate-string 0 ?|) - (aset rate-string 11 ?|) - (unless (member grouplens-current-group grouplens-newsgroups) - (unless (equal grouplens-prediction-display 'prediction-num) - (cond ((< iscore 0) - (setq iscore 1)) - ((> iscore 5) - (setq iscore 5)))) - (setq low 0) - (setq high 0)) - (if (and (bbb-valid-score iscore) - (not (null mid))) - (cond - ;; prediction-spot - ((equal grouplens-prediction-display 'prediction-spot) - (setq rate-string (bbb-fmt-prediction-spot rate-string iscore))) - ;; confidence-interval - ((equal grouplens-prediction-display 'confidence-interval) - (setq rate-string (bbb-fmt-confidence-interval iscore low high))) - ;; prediction-bar - ((equal grouplens-prediction-display 'prediction-bar) - (setq rate-string (bbb-fmt-prediction-bar rate-string iscore))) - ;; confidence-bar - ((equal grouplens-prediction-display 'confidence-bar) - (setq rate-string (format "| %4.2f |" iscore))) - ;; confidence-spot - ((equal grouplens-prediction-display 'confidence-spot) - (setq rate-string (format "| %4.2f |" iscore))) - ;; prediction-num - ((equal grouplens-prediction-display 'prediction-num) - (setq rate-string (bbb-fmt-prediction-num iscore))) - ;; confidence-plus-minus - ((equal grouplens-prediction-display 'confidence-plus-minus) - (setq rate-string (bbb-fmt-confidence-plus-minus iscore low high)) - ) - (t (gnus-message 3 "Invalid prediction display type"))) - (aset rate-string 5 ?N) (aset rate-string 6 ?A)) - rate-string))) - -;; Gnus user format function that doesn't depend on -;; bbb-build-mid-scores-alist being used as the score function, but is -;; instead called from gnus-select-group-hook. -- LAB -(defun bbb-grouplens-other-score (header) - (if (not (member grouplens-current-group grouplens-newsgroups)) - ;; Return an empty string - "" - (let* ((rate-string (make-string 12 ?\ )) - (mid (mail-header-id header)) - (hashent (gnus-gethash mid grouplens-current-hashtable)) - (pred (or (nth 0 hashent) 0)) - (low (nth 1 hashent)) - (high (nth 2 hashent))) - ;; Init rate-string - (aset rate-string 0 ?|) - (aset rate-string 11 ?|) - (unless (equal grouplens-prediction-display 'prediction-num) - (cond ((< pred 0) - (setq pred 1)) - ((> pred 5) - (setq pred 5)))) - ;; If no entry in BBB hash mark rate string as NA and return - (cond - ((null hashent) - (aset rate-string 5 ?N) - (aset rate-string 6 ?A) - rate-string) - - ((equal grouplens-prediction-display 'prediction-spot) - (bbb-fmt-prediction-spot rate-string pred)) - - ((equal grouplens-prediction-display 'confidence-interval) - (bbb-fmt-confidence-interval pred low high)) - - ((equal grouplens-prediction-display 'prediction-bar) - (bbb-fmt-prediction-bar rate-string pred)) - - ((equal grouplens-prediction-display 'confidence-bar) - (format "| %4.2f |" pred)) - - ((equal grouplens-prediction-display 'confidence-spot) - (format "| %4.2f |" pred)) - - ((equal grouplens-prediction-display 'prediction-num) - (bbb-fmt-prediction-num pred)) - - ((equal grouplens-prediction-display 'confidence-plus-minus) - (bbb-fmt-confidence-plus-minus pred low high)) - - (t - (gnus-message 3 "Invalid prediction display type") - (aset rate-string 0 ?|) - (aset rate-string 11 ?|) - rate-string))))) - -(defun bbb-valid-score (score) - (or (equal grouplens-prediction-display 'prediction-num) - (and (>= score grplens-minrating) - (<= score grplens-maxrating)))) - -(defun bbb-requires-confidence (format-type) - (or (equal format-type 'confidence-plus-minus) - (equal format-type 'confidence-spot) - (equal format-type 'confidence-interval))) - -(defun bbb-have-confidence (clow chigh) - (not (or (null clow) - (null chigh)))) - -(defun bbb-fmt-prediction-spot (rate-string score) - (aset rate-string - (round (* (/ (- score grplens-minrating) grplens-rating-range) - (+ (- grplens-predstringsize 4) 1.49))) - ?*) - rate-string) - -(defun bbb-fmt-confidence-interval (score low high) - (if (bbb-have-confidence low high) - (format "|%4.2f-%4.2f |" low high) - (bbb-fmt-prediction-num score))) - -(defun bbb-fmt-confidence-plus-minus (score low high) - (if (bbb-have-confidence low high) - (format "|%3.1f+/-%4.2f|" score (/ (- high low) 2.0)) - (bbb-fmt-prediction-num score))) - -(defun bbb-fmt-prediction-bar (rate-string score) - (let* ((i 1) - (step (/ grplens-rating-range (- grplens-predstringsize 4))) - (half-step (/ step 2)) - (loc (- grplens-minrating half-step))) - (while (< i (- grplens-predstringsize 2)) - (if (> score loc) - (aset rate-string i ?#) - (aset rate-string i ?\ )) - (setq i (+ i 1)) - (setq loc (+ loc step))) - ) - rate-string) - -(defun bbb-fmt-prediction-num (score) - (format "| %4.2f |" score)) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; Put Ratings -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(defun bbb-put-ratings () - (if (and grouplens-bbb-token - grouplens-rating-alist - (member gnus-newsgroup-name grouplens-newsgroups)) - (let ((bbb-process (bbb-connect-to-bbbd grouplens-bbb-host - grouplens-bbb-port)) - (rate-command (bbb-build-rate-command grouplens-rating-alist))) - (if bbb-process - (save-excursion - (set-buffer (process-buffer bbb-process)) - (gnus-message 5 "Sending Ratings...") - (bbb-send-command bbb-process rate-command) - (if (bbb-read-response bbb-process) - (setq grouplens-rating-alist nil) - (gnus-message 1 - "Token timed out: call bbb-login and quit again") - (ding)) - (gnus-message 5 "Sending Ratings...Done")) - (gnus-message 3 "No BBB connection"))) - (setq grouplens-rating-alist nil))) - -(defun bbb-build-rate-command (rate-alist) - (concat "putratings " grouplens-bbb-token " " grouplens-current-group " \r\n" - (mapconcat (lambda (this) ; form (mid . (score . time)) - (concat (car this) - " :rating=" (cadr this) ".00" - " :time=" (cddr this))) - rate-alist "\r\n") - "\r\n.\r\n")) - -;; Interactive rating functions. -(defun bbb-summary-rate-article (rating &optional midin) - (interactive "nRating: ") - (when (member gnus-newsgroup-name grouplens-newsgroups) - (let ((mid (or midin (bbb-get-current-id)))) - (if (and rating - (>= rating grplens-minrating) - (<= rating grplens-maxrating) - mid) - (let ((oldrating (assoc mid grouplens-rating-alist))) - (if oldrating - (setcdr oldrating (cons rating 0)) - (push `(,mid . (,rating . 0)) grouplens-rating-alist)) - (gnus-summary-mark-article nil (int-to-string rating))) - (gnus-message 3 "Invalid rating"))))) - -(defun grouplens-next-unread-article (rating) - "Select unread article after current one." - (interactive "P") - (when rating - (bbb-summary-rate-article rating)) - (gnus-summary-next-unread-article)) - -(defun grouplens-best-unread-article (rating) - "Select unread article after current one." - (interactive "P") - (when rating - (bbb-summary-rate-article rating)) - (gnus-summary-best-unread-article)) - -(defun grouplens-summary-catchup-and-exit (rating) - "Mark all articles not marked as unread in this newsgroup as read, then exit. -If prefix argument ALL is non-nil, all articles are marked as read." - (interactive "P") - (when rating - (bbb-summary-rate-article rating)) - (if (numberp rating) - (gnus-summary-catchup-and-exit) - (gnus-summary-catchup-and-exit rating))) - -(defun grouplens-score-thread (score) - "Raise the score of the articles in the current thread with SCORE." - (interactive "nRating: ") - (let (e) - (save-excursion - (let ((articles (gnus-summary-articles-in-thread)) - article) - (while (setq article (pop articles)) - (gnus-summary-goto-subject article) - (bbb-summary-rate-article score - (mail-header-id - (gnus-summary-article-header article))))) - (setq e (point))) - (let ((gnus-summary-check-current t)) - (or (zerop (gnus-summary-next-subject 1 t)) - (goto-char e)))) - (gnus-summary-recenter) - (gnus-summary-position-point) - (gnus-set-mode-line 'summary)) - -(defun bbb-exit-group () - (bbb-put-ratings) - (bbb-renew-hash-table)) - -(defun bbb-get-current-id () - (if gnus-current-headers - (mail-header-id gnus-current-headers) - (gnus-message 3 "You must select an article before you rate it"))) - -(defun bbb-grouplens-group-p (group) - "Say whether GROUP is a GroupLens group." - (if (member group grouplens-newsgroups) " (GroupLens Enhanced)" "")) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; TIME SPENT READING -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defvar grouplens-current-starting-time nil) - -(defun grouplens-start-timer () - (setq grouplens-current-starting-time (current-time))) - -(defun grouplens-elapsed-time () - (let ((et (bbb-time-float (current-time)))) - (- et (bbb-time-float grouplens-current-starting-time)))) - -(defun bbb-time-float (timeval) - (+ (* (car timeval) 65536) - (cadr timeval))) - -(defun grouplens-do-time () - (when (member gnus-newsgroup-name grouplens-newsgroups) - (when grouplens-previous-article - (let ((elapsed-time (grouplens-elapsed-time)) - (oldrating (assoc grouplens-previous-article - grouplens-rating-alist))) - (if (not oldrating) - (push `(,grouplens-previous-article . (0 . ,elapsed-time)) - grouplens-rating-alist) - (setcdr oldrating (cons (cadr oldrating) elapsed-time))))) - (grouplens-start-timer) - (setq grouplens-previous-article (bbb-get-current-id)))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; BUG REPORTING -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(defconst gnus-gl-version "gnus-gl.el 2.50") -(defconst gnus-gl-maintainer-address "grouplens-bug@cs.umn.edu") -(defun gnus-gl-submit-bug-report () - "Submit via mail a bug report on gnus-gl." - (interactive) - (require 'reporter) - (reporter-submit-bug-report gnus-gl-maintainer-address - (concat "gnus-gl.el " gnus-gl-version) - (list 'grouplens-pseudonym - 'grouplens-bbb-host - 'grouplens-bbb-port - 'grouplens-newsgroups - 'grouplens-bbb-token - 'grouplens-bbb-process - 'grouplens-current-group - 'grouplens-previous-article) - nil - 'gnus-gl-get-trace)) - -(defun gnus-gl-get-trace () - "Insert the contents of the BBBD trace buffer." - (when grouplens-bbb-buffer - (insert-buffer-substring grouplens-bbb-buffer))) - -;; -;; GroupLens minor mode -;; - -(defvar gnus-grouplens-mode nil - "Minor mode for providing a GroupLens interface in Gnus summary buffers.") - -(defvar gnus-grouplens-mode-map nil) - -(unless gnus-grouplens-mode-map - (setq gnus-grouplens-mode-map (make-keymap)) - (gnus-define-keys - gnus-grouplens-mode-map - "n" grouplens-next-unread-article - "r" bbb-summary-rate-article - "k" grouplens-score-thread - "c" grouplens-summary-catchup-and-exit - "," grouplens-best-unread-article)) - -(defun gnus-grouplens-make-menu-bar () - (unless (boundp 'gnus-grouplens-menu) - (easy-menu-define - gnus-grouplens-menu gnus-grouplens-mode-map "" - '("GroupLens" - ["Login" bbb-login t] - ["Rate" bbb-summary-rate-article t] - ["Next article" grouplens-next-unread-article t] - ["Best article" grouplens-best-unread-article t] - ["Raise thread" grouplens-score-thread t] - ["Report bugs" gnus-gl-submit-bug-report t])))) - -(defun gnus-grouplens-mode (&optional arg) - "Minor mode for providing a GroupLens interface in Gnus summary buffers." - (interactive "P") - (when (and (eq major-mode 'gnus-summary-mode) - (member gnus-newsgroup-name grouplens-newsgroups)) - (make-local-variable 'gnus-grouplens-mode) - (setq gnus-grouplens-mode - (if (null arg) (not gnus-grouplens-mode) - (> (prefix-numeric-value arg) 0))) - (when gnus-grouplens-mode - (make-local-hook 'gnus-select-article-hook) - (add-hook 'gnus-select-article-hook 'grouplens-do-time nil 'local) - (make-local-hook 'gnus-exit-group-hook) - (add-hook 'gnus-exit-group-hook 'bbb-exit-group nil 'local) - (make-local-variable 'gnus-score-find-score-files-function) - - (cond - ((eq gnus-grouplens-override-scoring 'combine) - ;; either add bbb-buld-mid-scores-alist to a list - ;; or make a list - (if (listp gnus-score-find-score-files-function) - (setq gnus-score-find-score-files-function - (append 'bbb-build-mid-scores-alist - gnus-score-find-score-files-function)) - (setq gnus-score-find-score-files-function - (list gnus-score-find-score-files-function - 'bbb-build-mid-scores-alist)))) - ;; leave the gnus-score-find-score-files variable alone - ((eq gnus-grouplens-override-scoring 'separate) - (add-hook 'gnus-select-group-hook - (lambda () - (bbb-get-predictions (bbb-get-all-mids) - gnus-newsgroup-name)))) - ;; default is to override - (t - (setq gnus-score-find-score-files-function - 'bbb-build-mid-scores-alist))) - - ;; Change how summary lines look - (make-local-variable 'gnus-summary-line-format) - (make-local-variable 'gnus-summary-line-format-spec) - (setq gnus-summary-line-format gnus-summary-grouplens-line-format) - (setq gnus-summary-line-format-spec nil) - (gnus-update-format-specifications nil 'summary) - (gnus-update-summary-mark-positions) - - ;; Set up the menu. - (when (and menu-bar-mode - (gnus-visual-p 'grouplens-menu 'menu)) - (gnus-grouplens-make-menu-bar)) - (gnus-add-minor-mode - 'gnus-grouplens-mode " GroupLens" gnus-grouplens-mode-map) - (gnus-run-hooks 'gnus-grouplens-mode-hook)))) - -(provide 'gnus-gl) - -;;; gnus-gl.el ends here diff --git a/lisp/gnus-group.el b/lisp/gnus-group.el deleted file mode 100644 index 1b9fc0b..0000000 --- a/lisp/gnus-group.el +++ /dev/null @@ -1,4006 +0,0 @@ -;;; gnus-group.el --- group mode commands for Gnus -;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus) -(require 'gnus-start) -(require 'nnmail) -(require 'gnus-spec) -(require 'gnus-int) -(require 'gnus-range) -(require 'gnus-win) -(require 'gnus-undo) -(require 'time-date) -(require 'gnus-ems) - -(defcustom gnus-group-archive-directory - "*ftp@ftp.hpc.uh.edu:/pub/emacs/ding-list/" - "*The address of the (ding) archives." - :group 'gnus-group-foreign - :type 'directory) - -(defcustom gnus-group-recent-archive-directory - "*ftp@ftp.hpc.uh.edu:/pub/emacs/ding-list-recent/" - "*The address of the most recent (ding) articles." - :group 'gnus-group-foreign - :type 'directory) - -(defcustom gnus-no-groups-message "No gnus is bad news" - "*Message displayed by Gnus when no groups are available." - :group 'gnus-start - :type 'string) - -(defcustom gnus-keep-same-level nil - "*Non-nil means that the next newsgroup after the current will be on the same level. -When you type, for instance, `n' after reading the last article in the -current newsgroup, you will go to the next newsgroup. If this variable -is nil, the next newsgroup will be the next from the group -buffer. -If this variable is non-nil, Gnus will either put you in the -next newsgroup with the same level, or, if no such newsgroup is -available, the next newsgroup with the lowest possible level higher -than the current level. -If this variable is `best', Gnus will make the next newsgroup the one -with the best level." - :group 'gnus-group-levels - :type '(choice (const nil) - (const best) - (sexp :tag "other" t))) - -(defcustom gnus-group-goto-unread t - "*If non-nil, movement commands will go to the next unread and subscribed group." - :link '(custom-manual "(gnus)Group Maneuvering") - :group 'gnus-group-various - :type 'boolean) - -(defcustom gnus-goto-next-group-when-activating t - "*If non-nil, the \\\\[gnus-group-get-new-news-this-group] command will advance point to the next group." - :link '(custom-manual "(gnus)Scanning New Messages") - :group 'gnus-group-various - :type 'boolean) - -(defcustom gnus-permanently-visible-groups nil - "*Regexp to match groups that should always be listed in the group buffer. -This means that they will still be listed even when there are no -unread articles in the groups. - -If nil, no groups are permanently visible." - :group 'gnus-group-listing - :type '(choice regexp (const nil))) - -(defcustom gnus-list-groups-with-ticked-articles t - "*If non-nil, list groups that have only ticked articles. -If nil, only list groups that have unread articles." - :group 'gnus-group-listing - :type 'boolean) - -(defcustom gnus-group-default-list-level gnus-level-subscribed - "*Default listing level. -Ignored if `gnus-group-use-permanent-levels' is non-nil." - :group 'gnus-group-listing - :type 'integer) - -(defcustom gnus-group-list-inactive-groups t - "*If non-nil, inactive groups will be listed." - :group 'gnus-group-listing - :group 'gnus-group-levels - :type 'boolean) - -(defcustom gnus-group-sort-function 'gnus-group-sort-by-alphabet - "*Function used for sorting the group buffer. -This function will be called with group info entries as the arguments -for the groups to be sorted. Pre-made functions include -`gnus-group-sort-by-alphabet', `gnus-group-sort-by-real-name', -`gnus-group-sort-by-unread', `gnus-group-sort-by-level', -`gnus-group-sort-by-score', `gnus-group-sort-by-method', -`gnus-group-sort-by-server', and `gnus-group-sort-by-rank'. - -This variable can also be a list of sorting functions. In that case, -the most significant sort function should be the last function in the -list." - :group 'gnus-group-listing - :link '(custom-manual "(gnus)Sorting Groups") - :type '(radio (function-item gnus-group-sort-by-alphabet) - (function-item gnus-group-sort-by-real-name) - (function-item gnus-group-sort-by-unread) - (function-item gnus-group-sort-by-level) - (function-item gnus-group-sort-by-score) - (function-item gnus-group-sort-by-method) - (function-item gnus-group-sort-by-server) - (function-item gnus-group-sort-by-rank) - (function :tag "other" nil))) - -(defcustom gnus-group-line-format "%M\%S\%p\%P\%5y: %(%g%)%l\n" - "*Format of group lines. -It works along the same lines as a normal formatting string, -with some simple extensions. - -%M Only marked articles (character, \"*\" or \" \") -%S Whether the group is subscribed (character, \"U\", \"K\", \"Z\" or \" \") -%L Level of subscribedness (integer) -%N Number of unread articles (integer) -%I Number of dormant articles (integer) -%i Number of ticked and dormant (integer) -%T Number of ticked articles (integer) -%R Number of read articles (integer) -%t Estimated total number of articles (integer) -%y Number of unread, unticked articles (integer) -%G Group name (string) -%g Qualified group name (string) -%D Group description (string) -%s Select method (string) -%o Moderated group (char, \"m\") -%p Process mark (char) -%O Moderated group (string, \"(m)\" or \"\") -%P Topic indentation (string) -%m Whether there is new(ish) mail in the group (char, \"%\") -%w Number of new(ish) mails in the group (integer) -%l Whether there are GroupLens predictions for this group (string) -%n Select from where (string) -%z A string that look like `<%s:%n>' if a foreign select method is used -%d The date the group was last entered. -%E Icon as defined by `gnus-group-icon-list'. -%u User defined specifier. The next character in the format string should - be a letter. Gnus will call the function gnus-user-format-function-X, - where X is the letter following %u. The function will be passed the - current header as argument. The function should return a string, which - will be inserted into the buffer just like information from any other - group specifier. - -Text between %( and %) will be highlighted with `gnus-mouse-face' when -the mouse point move inside the area. There can only be one such area. - -Note that this format specification is not always respected. For -reasons of efficiency, when listing killed groups, this specification -is ignored altogether. If the spec is changed considerably, your -output may end up looking strange when listing both alive and killed -groups. - -If you use %o or %O, reading the active file will be slower and quite -a bit of extra memory will be used. %D will also worsen performance. -Also note that if you change the format specification to include any -of these specs, you must probably re-start Gnus to see them go into -effect." - :group 'gnus-group-visual - :type 'string) - -(defcustom gnus-group-mode-line-format "Gnus: %%b {%M\%:%S}" - "*The format specification for the group mode line. -It works along the same lines as a normal formatting string, -with some simple extensions: - -%S The native news server. -%M The native select method. -%: \":\" if %S isn't \"\"." - :group 'gnus-group-visual - :type 'string) - -(defcustom gnus-group-mode-hook nil - "Hook for Gnus group mode." - :group 'gnus-group-various - :options '(gnus-topic-mode) - :type 'hook) - -;; Extracted from gnus-xmas-redefine in order to preserve user settings -(when (featurep 'xemacs) - (add-hook 'gnus-group-mode-hook 'gnus-xmas-group-menu-add) - (add-hook 'gnus-group-mode-hook 'gnus-xmas-setup-group-toolbar)) - -(defcustom gnus-group-menu-hook nil - "Hook run after the creation of the group mode menu." - :group 'gnus-group-various - :type 'hook) - -(defcustom gnus-group-catchup-group-hook nil - "Hook run when catching up a group from the group buffer." - :group 'gnus-group-various - :link '(custom-manual "(gnus)Group Data") - :type 'hook) - -(defcustom gnus-group-update-group-hook nil - "Hook called when updating group lines." - :group 'gnus-group-visual - :type 'hook) - -(defcustom gnus-group-prepare-function 'gnus-group-prepare-flat - "*A function that is called to generate the group buffer. -The function is called with three arguments: The first is a number; -all group with a level less or equal to that number should be listed, -if the second is non-nil, empty groups should also be displayed. If -the third is non-nil, it is a number. No groups with a level lower -than this number should be displayed. - -The only current function implemented is `gnus-group-prepare-flat'." - :group 'gnus-group-listing - :type 'function) - -(defcustom gnus-group-prepare-hook nil - "Hook called after the group buffer has been generated. -If you want to modify the group buffer, you can use this hook." - :group 'gnus-group-listing - :type 'hook) - -(defcustom gnus-suspend-gnus-hook nil - "Hook called when suspending (not exiting) Gnus." - :group 'gnus-exit - :type 'hook) - -(defcustom gnus-exit-gnus-hook nil - "Hook called when exiting Gnus." - :group 'gnus-exit - :type 'hook) - -(defcustom gnus-after-exiting-gnus-hook nil - "Hook called after exiting Gnus." - :group 'gnus-exit - :type 'hook) - -(defcustom gnus-group-update-hook '(gnus-group-highlight-line) - "Hook called when a group line is changed. -The hook will not be called if `gnus-visual' is nil. - -The default function `gnus-group-highlight-line' will -highlight the line according to the `gnus-group-highlight' -variable." - :group 'gnus-group-visual - :type 'hook) - -(defcustom gnus-useful-groups - '(("(ding) mailing list mirrored at sunsite.auc.dk" - "emacs.ding" - (nntp "sunsite.auc.dk" - (nntp-address "sunsite.auc.dk"))) - ("gnus-bug archive" - "gnus-bug" - (nndir "/ftp@ftp.ifi.uio.no:/pub/emacs/gnus/gnus-bug/")) - ("Gnus help group" - "gnus-help" - (nndoc "gnus-help" - (nndoc-article-type mbox) - (eval `(nndoc-address - ,(let ((file (nnheader-find-etc-directory - "gnus-tut.txt" t))) - (unless file - (error "Couldn't find doc group")) - file)))))) - "*Alist of useful group-server pairs." - :group 'gnus-group-listing - :type '(repeat (list (string :tag "Description") - (string :tag "Name") - (sexp :tag "Method")))) - -(defcustom gnus-group-highlight - '(;; Mail. - ((and mailp (= unread 0) (eq level 1)) . - gnus-group-mail-1-empty-face) - ((and mailp (eq level 1)) . - gnus-group-mail-1-face) - ((and mailp (= unread 0) (eq level 2)) . - gnus-group-mail-2-empty-face) - ((and mailp (eq level 2)) . - gnus-group-mail-2-face) - ((and mailp (= unread 0) (eq level 3)) . - gnus-group-mail-3-empty-face) - ((and mailp (eq level 3)) . - gnus-group-mail-3-face) - ((and mailp (= unread 0)) . - gnus-group-mail-low-empty-face) - ((and mailp) . - gnus-group-mail-low-face) - ;; News. - ((and (= unread 0) (eq level 1)) . - gnus-group-news-1-empty-face) - ((and (eq level 1)) . - gnus-group-news-1-face) - ((and (= unread 0) (eq level 2)) . - gnus-group-news-2-empty-face) - ((and (eq level 2)) . - gnus-group-news-2-face) - ((and (= unread 0) (eq level 3)) . - gnus-group-news-3-empty-face) - ((and (eq level 3)) . - gnus-group-news-3-face) - ((and (= unread 0) (eq level 4)) . - gnus-group-news-4-empty-face) - ((and (eq level 4)) . - gnus-group-news-4-face) - ((and (= unread 0) (eq level 5)) . - gnus-group-news-5-empty-face) - ((and (eq level 5)) . - gnus-group-news-5-face) - ((and (= unread 0) (eq level 6)) . - gnus-group-news-6-empty-face) - ((and (eq level 6)) . - gnus-group-news-6-face) - ((and (= unread 0)) . - gnus-group-news-low-empty-face) - (t . - gnus-group-news-low-face)) - "*Controls the highlighting of group buffer lines. - -Below is a list of `Form'/`Face' pairs. When deciding how a a -particular group line should be displayed, each form is -evaluated. The content of the face field after the first true form is -used. You can change how those group lines are displayed by -editing the face field. - -It is also possible to change and add form fields, but currently that -requires an understanding of Lisp expressions. Hopefully this will -change in a future release. For now, you can use the following -variables in the Lisp expression: - -group: The name of the group. -unread: The number of unread articles in the group. -method: The select method used. -mailp: Whether it's a mail group or not. -level: The level of the group. -score: The score of the group. -ticked: The number of ticked articles." - :group 'gnus-group-visual - :type '(repeat (cons (sexp :tag "Form") face))) - -(defcustom gnus-new-mail-mark ?% - "Mark used for groups with new mail." - :group 'gnus-group-visual - :type 'character) - -(defgroup gnus-group-icons nil - "Add Icons to your group buffer. " - :group 'gnus-group-visual) - -(defcustom gnus-group-icon-list - nil - "*Controls the insertion of icons into group buffer lines. - -Below is a list of `Form'/`File' pairs. When deciding how a -particular group line should be displayed, each form is evaluated. -The icon from the file field after the first true form is used. You -can change how those group lines are displayed by editing the file -field. The File will either be found in the -`gnus-group-glyph-directory' or by designating absolute path to the -file. - -It is also possible to change and add form fields, but currently that -requires an understanding of Lisp expressions. Hopefully this will -change in a future release. For now, you can use the following -variables in the Lisp expression: - -group: The name of the group. -unread: The number of unread articles in the group. -method: The select method used. -mailp: Whether it's a mail group or not. -newsp: Whether it's a news group or not -level: The level of the group. -score: The score of the group. -ticked: The number of ticked articles." - :group 'gnus-group-icons - :type '(repeat (cons (sexp :tag "Form") file))) - -(defcustom gnus-group-name-charset-method-alist nil - "*Alist of method and the charset for group names. - -For example: - (((nntp \"news.com.cn\") . cn-gb-2312)) -" - :version "21.1" - :group 'gnus-charset - :type '(repeat (cons (sexp :tag "Method") (symbol :tag "Charset")))) - -(defcustom gnus-group-name-charset-group-alist nil - "*Alist of group regexp and the charset for group names. - -For example: - ((\"\\.com\\.cn:\" . cn-gb-2312)) -" - :group 'gnus-charset - :type '(repeat (cons (regexp :tag "Group") (symbol :tag "Charset")))) - -(defcustom gnus-group-jump-to-group-prompt nil - "Default prompt for `gnus-group-jump-to-group'. -If non-nil, the value should be a string, e.g. \"nnml:\", -in which case `gnus-group-jump-to-group' offers \"Group: nnml:\" -in the minibuffer prompt." - :group 'gnus-group-various - :type '(choice (string :tag "Prompt string") - (const :tag "Empty" nil))) - -(defvar gnus-group-listing-limit 1000 - "*A limit of the number of groups when listing. -If the number of groups is larger than the limit, list them in a -simple manner.") - -;;; Internal variables - -(defvar gnus-group-sort-alist-function 'gnus-group-sort-flat - "Function for sorting the group buffer.") - -(defvar gnus-group-sort-selected-function 'gnus-group-sort-selected-flat - "Function for sorting the selected groups in the group buffer.") - -(defvar gnus-group-indentation-function nil) -(defvar gnus-goto-missing-group-function nil) -(defvar gnus-group-update-group-function nil) -(defvar gnus-group-goto-next-group-function nil - "Function to override finding the next group after listing groups.") - -(defvar gnus-group-edit-buffer nil) - -(defvar gnus-group-line-format-alist - `((?M gnus-tmp-marked-mark ?c) - (?S gnus-tmp-subscribed ?c) - (?L gnus-tmp-level ?d) - (?N (cond ((eq number t) "*" ) - ((numberp number) - (int-to-string - (+ number - (gnus-range-length (cdr (assq 'dormant gnus-tmp-marked))) - (gnus-range-length (cdr (assq 'tick gnus-tmp-marked)))))) - (t number)) ?s) - (?R gnus-tmp-number-of-read ?s) - (?t gnus-tmp-number-total ?d) - (?y gnus-tmp-number-of-unread ?s) - (?I (gnus-range-length (cdr (assq 'dormant gnus-tmp-marked))) ?d) - (?T (gnus-range-length (cdr (assq 'tick gnus-tmp-marked))) ?d) - (?i (+ (gnus-range-length (cdr (assq 'dormant gnus-tmp-marked))) - (gnus-range-length (cdr (assq 'tick gnus-tmp-marked)))) ?d) - (?g gnus-tmp-group ?s) - (?G gnus-tmp-qualified-group ?s) - (?c (gnus-short-group-name gnus-tmp-group) ?s) - (?D gnus-tmp-newsgroup-description ?s) - (?o gnus-tmp-moderated ?c) - (?O gnus-tmp-moderated-string ?s) - (?p gnus-tmp-process-marked ?c) - (?s gnus-tmp-news-server ?s) - (?n gnus-tmp-news-method ?s) - (?P gnus-group-indentation ?s) - (?E gnus-tmp-group-icon ?s) - (?l gnus-tmp-grouplens ?s) - (?z gnus-tmp-news-method-string ?s) - (?m (gnus-group-new-mail gnus-tmp-group) ?c) - (?w (if (gnus-news-group-p gnus-tmp-group) - "" - (int-to-string - (length - (nnmail-new-mail-numbers (gnus-group-real-name gnus-tmp-group)) - ))) - ?s) - (?d (gnus-group-timestamp-string gnus-tmp-group) ?s) - (?u gnus-tmp-user-defined ?s))) - -(defvar gnus-group-mode-line-format-alist - `((?S gnus-tmp-news-server ?s) - (?M gnus-tmp-news-method ?s) - (?u gnus-tmp-user-defined ?s) - (?: gnus-tmp-colon ?s))) - -(defvar gnus-topic-topology nil - "The complete topic hierarchy.") - -(defvar gnus-topic-alist nil - "The complete topic-group alist.") - -(defvar gnus-group-marked nil) - -(defvar gnus-group-list-mode nil) - - -(defvar gnus-group-icon-cache nil) - -(defvar gnus-group-listed-groups nil) -(defvar gnus-group-list-option nil) - -;;; -;;; Gnus group mode -;;; - -(put 'gnus-group-mode 'mode-class 'special) - -(when t - (gnus-define-keys gnus-group-mode-map - " " gnus-group-read-group - "=" gnus-group-select-group - "\r" gnus-group-select-group - "\M-\r" gnus-group-quick-select-group - "\M- " gnus-group-visible-select-group - [(meta control return)] gnus-group-select-group-ephemerally - "j" gnus-group-jump-to-group - "n" gnus-group-next-unread-group - "p" gnus-group-prev-unread-group - "\177" gnus-group-prev-unread-group - [delete] gnus-group-prev-unread-group - [backspace] gnus-group-prev-unread-group - "N" gnus-group-next-group - "P" gnus-group-prev-group - "\M-n" gnus-group-next-unread-group-same-level - "\M-p" gnus-group-prev-unread-group-same-level - "," gnus-group-best-unread-group - "." gnus-group-first-unread-group - "u" gnus-group-unsubscribe-current-group - "U" gnus-group-unsubscribe-group - "c" gnus-group-catchup-current - "C" gnus-group-catchup-current-all - "\M-c" gnus-group-clear-data - "l" gnus-group-list-groups - "L" gnus-group-list-all-groups - "m" gnus-group-mail - "g" gnus-group-get-new-news - "\M-g" gnus-group-get-new-news-this-group - "R" gnus-group-restart - "r" gnus-group-read-init-file - "B" gnus-group-browse-foreign-server - "b" gnus-group-check-bogus-groups - "F" gnus-group-find-new-groups - "\C-c\C-d" gnus-group-describe-group - "\M-d" gnus-group-describe-all-groups - "\C-c\C-a" gnus-group-apropos - "\C-c\M-\C-a" gnus-group-description-apropos - "a" gnus-group-post-news - "\ek" gnus-group-edit-local-kill - "\eK" gnus-group-edit-global-kill - "\C-k" gnus-group-kill-group - "\C-y" gnus-group-yank-group - "\C-w" gnus-group-kill-region - "\C-x\C-t" gnus-group-transpose-groups - "\C-c\C-l" gnus-group-list-killed - "\C-c\C-x" gnus-group-expire-articles - "\C-c\M-\C-x" gnus-group-expire-all-groups - "V" gnus-version - "s" gnus-group-save-newsrc - "z" gnus-group-suspend - "q" gnus-group-exit - "Q" gnus-group-quit - "?" gnus-group-describe-briefly - "\C-c\C-i" gnus-info-find-node - "\M-e" gnus-group-edit-group-method - "^" gnus-group-enter-server-mode - gnus-mouse-2 gnus-mouse-pick-group - "<" beginning-of-buffer - ">" end-of-buffer - "\C-c\C-b" gnus-bug - "\C-c\C-s" gnus-group-sort-groups - "t" gnus-topic-mode - "\C-c\M-g" gnus-activate-all-groups - "\M-&" gnus-group-universal-argument - "#" gnus-group-mark-group - "\M-#" gnus-group-unmark-group) - - (gnus-define-keys (gnus-group-mark-map "M" gnus-group-mode-map) - "m" gnus-group-mark-group - "u" gnus-group-unmark-group - "w" gnus-group-mark-region - "b" gnus-group-mark-buffer - "r" gnus-group-mark-regexp - "U" gnus-group-unmark-all-groups) - - (gnus-define-keys (gnus-group-group-map "G" gnus-group-mode-map) - "d" gnus-group-make-directory-group - "h" gnus-group-make-help-group - "u" gnus-group-make-useful-group - "a" gnus-group-make-archive-group - "k" gnus-group-make-kiboze-group - "l" gnus-group-nnimap-edit-acl - "m" gnus-group-make-group - "E" gnus-group-edit-group - "e" gnus-group-edit-group-method - "p" gnus-group-edit-group-parameters - "v" gnus-group-add-to-virtual - "V" gnus-group-make-empty-virtual - "D" gnus-group-enter-directory - "f" gnus-group-make-doc-group - "w" gnus-group-make-web-group - "r" gnus-group-rename-group - "c" gnus-group-customize - "x" gnus-group-nnimap-expunge - "\177" gnus-group-delete-group - [delete] gnus-group-delete-group) - - (gnus-define-keys (gnus-group-soup-map "s" gnus-group-group-map) - "b" gnus-group-brew-soup - "w" gnus-soup-save-areas - "s" gnus-soup-send-replies - "p" gnus-soup-pack-packet - "r" nnsoup-pack-replies) - - (gnus-define-keys (gnus-group-sort-map "S" gnus-group-group-map) - "s" gnus-group-sort-groups - "a" gnus-group-sort-groups-by-alphabet - "u" gnus-group-sort-groups-by-unread - "l" gnus-group-sort-groups-by-level - "v" gnus-group-sort-groups-by-score - "r" gnus-group-sort-groups-by-rank - "m" gnus-group-sort-groups-by-method) - - (gnus-define-keys (gnus-group-sort-selected-map "P" gnus-group-group-map) - "s" gnus-group-sort-selected-groups - "a" gnus-group-sort-selected-groups-by-alphabet - "u" gnus-group-sort-selected-groups-by-unread - "l" gnus-group-sort-selected-groups-by-level - "v" gnus-group-sort-selected-groups-by-score - "r" gnus-group-sort-selected-groups-by-rank - "m" gnus-group-sort-selected-groups-by-method) - - (gnus-define-keys (gnus-group-list-map "A" gnus-group-mode-map) - "k" gnus-group-list-killed - "z" gnus-group-list-zombies - "s" gnus-group-list-groups - "u" gnus-group-list-all-groups - "A" gnus-group-list-active - "a" gnus-group-apropos - "d" gnus-group-description-apropos - "m" gnus-group-list-matching - "M" gnus-group-list-all-matching - "l" gnus-group-list-level - "c" gnus-group-list-cached - "?" gnus-group-list-dormant) - - (gnus-define-keys (gnus-group-list-limit-map "/" gnus-group-list-map) - "k" gnus-group-list-limit - "z" gnus-group-list-limit - "s" gnus-group-list-limit - "u" gnus-group-list-limit - "A" gnus-group-list-limit - "m" gnus-group-list-limit - "M" gnus-group-list-limit - "l" gnus-group-list-limit - "c" gnus-group-list-limit - "?" gnus-group-list-limit) - - (gnus-define-keys (gnus-group-list-flush-map "f" gnus-group-list-map) - "k" gnus-group-list-flush - "z" gnus-group-list-flush - "s" gnus-group-list-flush - "u" gnus-group-list-flush - "A" gnus-group-list-flush - "m" gnus-group-list-flush - "M" gnus-group-list-flush - "l" gnus-group-list-flush - "c" gnus-group-list-flush - "?" gnus-group-list-flush) - - (gnus-define-keys (gnus-group-list-plus-map "p" gnus-group-list-map) - "k" gnus-group-list-plus - "z" gnus-group-list-plus - "s" gnus-group-list-plus - "u" gnus-group-list-plus - "A" gnus-group-list-plus - "m" gnus-group-list-plus - "M" gnus-group-list-plus - "l" gnus-group-list-plus - "c" gnus-group-list-plus - "?" gnus-group-list-plus) - - (gnus-define-keys (gnus-group-score-map "W" gnus-group-mode-map) - "f" gnus-score-flush-cache) - - (gnus-define-keys (gnus-group-help-map "H" gnus-group-mode-map) - "d" gnus-group-describe-group - "f" gnus-group-fetch-faq - "v" gnus-version) - - (gnus-define-keys (gnus-group-sub-map "S" gnus-group-mode-map) - "l" gnus-group-set-current-level - "t" gnus-group-unsubscribe-current-group - "s" gnus-group-unsubscribe-group - "k" gnus-group-kill-group - "y" gnus-group-yank-group - "w" gnus-group-kill-region - "\C-k" gnus-group-kill-level - "z" gnus-group-kill-all-zombies)) - -(defun gnus-group-make-menu-bar () - (gnus-turn-off-edit-menu 'group) - (unless (boundp 'gnus-group-reading-menu) - - (easy-menu-define - gnus-group-reading-menu gnus-group-mode-map "" - `("Group" - ["Read" gnus-group-read-group (gnus-group-group-name)] - ["Select" gnus-group-select-group (gnus-group-group-name)] - ["See old articles" (gnus-group-select-group 'all) - :keys "C-u SPC" :active (gnus-group-group-name)] - ["Catch up" gnus-group-catchup-current :active (gnus-group-group-name) - ,@(if (featurep 'xemacs) nil - '(:help "Mark unread articles in the current group as read"))] - ["Catch up all articles" gnus-group-catchup-current-all - (gnus-group-group-name)] - ["Check for new articles" gnus-group-get-new-news-this-group - :active (gnus-group-group-name) - ,@(if (featurep 'xemacs) nil - '(:help "Check for new messages in current group"))] - ["Toggle subscription" gnus-group-unsubscribe-current-group - (gnus-group-group-name)] - ["Kill" gnus-group-kill-group :active (gnus-group-group-name) - ,@(if (featurep 'xemacs) nil - '(:help "Kill (remove) current group"))] - ["Yank" gnus-group-yank-group gnus-list-of-killed-groups] - ["Describe" gnus-group-describe-group :active (gnus-group-group-name) - ,@(if (featurep 'xemacs) nil - '(:help "Display description of the current group"))] - ["Fetch FAQ" gnus-group-fetch-faq (gnus-group-group-name)] - ;; Actually one should check, if any of the marked groups gives t for - ;; (gnus-check-backend-function 'request-expire-articles ...) - ["Expire articles" gnus-group-expire-articles - (or (and (gnus-group-group-name) - (gnus-check-backend-function - 'request-expire-articles - (gnus-group-group-name))) gnus-group-marked)] - ["Set group level" gnus-group-set-current-level - (gnus-group-group-name)] - ["Select quick" gnus-group-quick-select-group (gnus-group-group-name)] - ["Customize" gnus-group-customize (gnus-group-group-name)] - ("Edit" - ["Parameters" gnus-group-edit-group-parameters - (gnus-group-group-name)] - ["Select method" gnus-group-edit-group-method - (gnus-group-group-name)] - ["Info" gnus-group-edit-group (gnus-group-group-name)] - ["Local kill file" gnus-group-edit-local-kill (gnus-group-group-name)] - ["Global kill file" gnus-group-edit-global-kill t]))) - - (easy-menu-define - gnus-group-group-menu gnus-group-mode-map "" - '("Groups" - ("Listing" - ["List unread subscribed groups" gnus-group-list-groups t] - ["List (un)subscribed groups" gnus-group-list-all-groups t] - ["List killed groups" gnus-group-list-killed gnus-killed-list] - ["List zombie groups" gnus-group-list-zombies gnus-zombie-list] - ["List level..." gnus-group-list-level t] - ["Describe all groups" gnus-group-describe-all-groups t] - ["Group apropos..." gnus-group-apropos t] - ["Group and description apropos..." gnus-group-description-apropos t] - ["List groups matching..." gnus-group-list-matching t] - ["List all groups matching..." gnus-group-list-all-matching t] - ["List active file" gnus-group-list-active t] - ["List groups with cached" gnus-group-list-cached t] - ["List groups with dormant" gnus-group-list-dormant t]) - ("Sort" - ["Default sort" gnus-group-sort-groups t] - ["Sort by method" gnus-group-sort-groups-by-method t] - ["Sort by rank" gnus-group-sort-groups-by-rank t] - ["Sort by score" gnus-group-sort-groups-by-score t] - ["Sort by level" gnus-group-sort-groups-by-level t] - ["Sort by unread" gnus-group-sort-groups-by-unread t] - ["Sort by name" gnus-group-sort-groups-by-alphabet t]) - ("Sort process/prefixed" - ["Default sort" gnus-group-sort-selected-groups - (or (not (boundp 'gnus-topic-mode)) (not gnus-topic-mode))] - ["Sort by method" gnus-group-sort-selected-groups-by-method - (or (not (boundp 'gnus-topic-mode)) (not gnus-topic-mode))] - ["Sort by rank" gnus-group-sort-selected-groups-by-rank - (or (not (boundp 'gnus-topic-mode)) (not gnus-topic-mode))] - ["Sort by score" gnus-group-sort-selected-groups-by-score - (or (not (boundp 'gnus-topic-mode)) (not gnus-topic-mode))] - ["Sort by level" gnus-group-sort-selected-groups-by-level - (or (not (boundp 'gnus-topic-mode)) (not gnus-topic-mode))] - ["Sort by unread" gnus-group-sort-selected-groups-by-unread - (or (not (boundp 'gnus-topic-mode)) (not gnus-topic-mode))] - ["Sort by name" gnus-group-sort-selected-groups-by-alphabet - (or (not (boundp 'gnus-topic-mode)) (not gnus-topic-mode))]) - ("Mark" - ["Mark group" gnus-group-mark-group - (and (gnus-group-group-name) - (not (memq (gnus-group-group-name) gnus-group-marked)))] - ["Unmark group" gnus-group-unmark-group - (and (gnus-group-group-name) - (memq (gnus-group-group-name) gnus-group-marked))] - ["Unmark all" gnus-group-unmark-all-groups gnus-group-marked] - ["Mark regexp..." gnus-group-mark-regexp t] - ["Mark region" gnus-group-mark-region t] - ["Mark buffer" gnus-group-mark-buffer t] - ["Execute command" gnus-group-universal-argument - (or gnus-group-marked (gnus-group-group-name))]) - ("Subscribe" - ["Subscribe to a group" gnus-group-unsubscribe-group t] - ["Kill all newsgroups in region" gnus-group-kill-region t] - ["Kill all zombie groups" gnus-group-kill-all-zombies - gnus-zombie-list] - ["Kill all groups on level..." gnus-group-kill-level t]) - ("Foreign groups" - ["Make a foreign group" gnus-group-make-group t] - ["Add a directory group" gnus-group-make-directory-group t] - ["Add the help group" gnus-group-make-help-group t] - ["Add the archive group" gnus-group-make-archive-group t] - ["Make a doc group" gnus-group-make-doc-group t] - ["Make a web group" gnus-group-make-web-group t] - ["Make a kiboze group" gnus-group-make-kiboze-group t] - ["Make a virtual group" gnus-group-make-empty-virtual t] - ["Add a group to a virtual" gnus-group-add-to-virtual t] - ["Rename group" gnus-group-rename-group - (gnus-check-backend-function - 'request-rename-group (gnus-group-group-name))] - ["Delete group" gnus-group-delete-group - (gnus-check-backend-function - 'request-delete-group (gnus-group-group-name))]) - ("Move" - ["Next" gnus-group-next-group t] - ["Previous" gnus-group-prev-group t] - ["Next unread" gnus-group-next-unread-group t] - ["Previous unread" gnus-group-prev-unread-group t] - ["Next unread same level" gnus-group-next-unread-group-same-level t] - ["Previous unread same level" - gnus-group-prev-unread-group-same-level t] - ["Jump to group" gnus-group-jump-to-group t] - ["First unread group" gnus-group-first-unread-group t] - ["Best unread group" gnus-group-best-unread-group t]) - ["Delete bogus groups" gnus-group-check-bogus-groups t] - ["Find new newsgroups" gnus-group-find-new-groups t] - ["Transpose" gnus-group-transpose-groups - (gnus-group-group-name)] - ["Read a directory as a group..." gnus-group-enter-directory t])) - - (easy-menu-define - gnus-group-misc-menu gnus-group-mode-map "" - `("Gnus" - ("SOUP" - ["Pack replies" nnsoup-pack-replies (fboundp 'nnsoup-request-group)] - ["Send replies" gnus-soup-send-replies - (fboundp 'gnus-soup-pack-packet)] - ["Pack packet" gnus-soup-pack-packet (fboundp 'gnus-soup-pack-packet)] - ["Save areas" gnus-soup-save-areas (fboundp 'gnus-soup-pack-packet)] - ["Brew SOUP" gnus-group-brew-soup (fboundp 'gnus-soup-pack-packet)]) - ["Send a mail" gnus-group-mail t] - ["Post an article..." gnus-group-post-news t] - ["Check for new news" gnus-group-get-new-news - ,@(if (featurep 'xemacs) '(t) - '(:help "Get newly arrived articles")) - ] - ["Activate all groups" gnus-activate-all-groups t] - ["Restart Gnus" gnus-group-restart t] - ["Read init file" gnus-group-read-init-file t] - ["Browse foreign server" gnus-group-browse-foreign-server t] - ["Enter server buffer" gnus-group-enter-server-mode t] - ["Expire all expirable articles" gnus-group-expire-all-groups t] - ["Generate any kiboze groups" nnkiboze-generate-groups t] - ["Gnus version" gnus-version t] - ["Save .newsrc files" gnus-group-save-newsrc t] - ["Suspend Gnus" gnus-group-suspend t] - ["Clear dribble buffer" gnus-group-clear-dribble t] - ["Read manual" gnus-info-find-node t] - ["Flush score cache" gnus-score-flush-cache t] - ["Toggle topics" gnus-topic-mode t] - ["Send a bug report" gnus-bug t] - ["Exit from Gnus" gnus-group-exit - ,@(if (featurep 'xemacs) '(t) - '(:help "Quit reading news"))] - ["Exit without saving" gnus-group-quit t])) - - (gnus-run-hooks 'gnus-group-menu-hook))) - -(defvar gnus-group-toolbar-map nil) - -;; Emacs 21 tool bar. Should be no-op otherwise. -(defun gnus-group-make-tool-bar () - (if (and (fboundp 'tool-bar-add-item-from-menu) - (default-value 'tool-bar-mode) - (not gnus-group-toolbar-map)) - (setq gnus-group-toolbar-map - (let ((tool-bar-map (make-sparse-keymap)) - (load-path (mm-image-load-path))) - (tool-bar-add-item-from-menu - 'gnus-group-get-new-news "get-news" gnus-group-mode-map) - (tool-bar-add-item-from-menu - 'gnus-group-get-new-news-this-group "gnntg" gnus-group-mode-map) - (tool-bar-add-item-from-menu - 'gnus-group-catchup-current "catchup" gnus-group-mode-map) - (tool-bar-add-item-from-menu - 'gnus-group-describe-group "describe-group" gnus-group-mode-map) - (tool-bar-add-item "subscribe" 'gnus-group-subscribe 'subscribe - :help "Subscribe to the current group") - (tool-bar-add-item "unsubscribe" 'gnus-group-unsubscribe - 'unsubscribe - :help "Unsubscribe from the current group") - (tool-bar-add-item-from-menu - 'gnus-group-exit "exit-gnus" gnus-group-mode-map) - tool-bar-map))) - (if gnus-group-toolbar-map - (set (make-local-variable 'tool-bar-map) gnus-group-toolbar-map))) - -(defun gnus-group-mode () - "Major mode for reading news. - -All normal editing commands are switched off. -\\ -The group buffer lists (some of) the groups available. For instance, -`\\[gnus-group-list-groups]' will list all subscribed groups with unread articles, while `\\[gnus-group-list-zombies]' -lists all zombie groups. - -Groups that are displayed can be entered with `\\[gnus-group-read-group]'. To subscribe -to a group not displayed, type `\\[gnus-group-unsubscribe-group]'. - -For more in-depth information on this mode, read the manual (`\\[gnus-info-find-node]'). - -The following commands are available: - -\\{gnus-group-mode-map}" - (interactive) - (kill-all-local-variables) - (when (gnus-visual-p 'group-menu 'menu) - (gnus-group-make-menu-bar) - (gnus-group-make-tool-bar)) - (gnus-simplify-mode-line) - (setq major-mode 'gnus-group-mode) - (setq mode-name "Group") - (gnus-group-set-mode-line) - (setq mode-line-process nil) - (use-local-map gnus-group-mode-map) - (buffer-disable-undo) - (setq truncate-lines t) - (setq buffer-read-only t) - (gnus-set-default-directory) - (gnus-update-format-specifications nil 'group 'group-mode) - (gnus-update-group-mark-positions) - (when gnus-use-undo - (gnus-undo-mode 1)) - (when gnus-slave - (gnus-slave-mode)) - (gnus-run-hooks 'gnus-group-mode-hook)) - -(defun gnus-update-group-mark-positions () - (save-excursion - (let ((gnus-process-mark ?\200) - (gnus-group-update-hook nil) - (gnus-group-marked '("dummy.group")) - (gnus-active-hashtb (make-vector 10 0)) - (topic "")) - (gnus-set-active "dummy.group" '(0 . 0)) - (gnus-set-work-buffer) - (gnus-group-insert-group-line "dummy.group" 0 nil 0 nil) - (goto-char (point-min)) - (setq gnus-group-mark-positions - (list (cons 'process (and (search-forward "\200" nil t) - (- (point) 2)))))))) - -(defun gnus-mouse-pick-group (e) - "Enter the group under the mouse pointer." - (interactive "e") - (mouse-set-point e) - (gnus-group-read-group nil)) - -;; Look at LEVEL and find out what the level is really supposed to be. -;; If LEVEL is non-nil, LEVEL will be returned, if not, what happens -;; will depend on whether `gnus-group-use-permanent-levels' is used. -(defun gnus-group-default-level (&optional level number-or-nil) - (cond - (gnus-group-use-permanent-levels - (or (setq gnus-group-use-permanent-levels - (or level (if (numberp gnus-group-use-permanent-levels) - gnus-group-use-permanent-levels - (or gnus-group-default-list-level - gnus-level-subscribed)))) - gnus-group-default-list-level gnus-level-subscribed)) - (number-or-nil - level) - (t - (or level gnus-group-default-list-level gnus-level-subscribed)))) - -(defun gnus-group-setup-buffer () - (set-buffer (gnus-get-buffer-create gnus-group-buffer)) - (unless (eq major-mode 'gnus-group-mode) - (gnus-group-mode) - (when gnus-carpal - (gnus-carpal-setup-buffer 'group)))) - -(defsubst gnus-group-name-charset (method group) - (if (null method) - (setq method (gnus-find-method-for-group group))) - (let ((item (assoc method gnus-group-name-charset-method-alist)) - (alist gnus-group-name-charset-group-alist) - result) - (if item - (cdr item) - (while (setq item (pop alist)) - (if (string-match (car item) group) - (setq alist nil - result (cdr item)))) - result))) - -(defsubst gnus-group-name-decode (string charset) - (if (and string charset (featurep 'mule)) - (decode-coding-string string charset) - string)) - -(defun gnus-group-decoded-name (string) - (let ((charset (gnus-group-name-charset nil string))) - (gnus-group-name-decode string charset))) - -(defun gnus-group-list-groups (&optional level unread lowest) - "List newsgroups with level LEVEL or lower that have unread articles. -Default is all subscribed groups. -If argument UNREAD is non-nil, groups with no unread articles are also -listed. - -Also see the `gnus-group-use-permanent-levels' variable." - (interactive - (list (if current-prefix-arg - (prefix-numeric-value current-prefix-arg) - (or - (gnus-group-default-level nil t) - gnus-group-default-list-level - gnus-level-subscribed)))) - (unless level - (setq level (car gnus-group-list-mode) - unread (cdr gnus-group-list-mode))) - (setq level (gnus-group-default-level level)) - (gnus-group-setup-buffer) - (gnus-update-format-specifications nil 'group 'group-mode) - (let ((case-fold-search nil) - (props (text-properties-at (gnus-point-at-bol))) - (empty (= (point-min) (point-max))) - (group (gnus-group-group-name)) - number) - (set-buffer gnus-group-buffer) - (setq number (funcall gnus-group-prepare-function level unread lowest)) - (when (or (and (numberp number) - (zerop number)) - (zerop (buffer-size))) - ;; No groups in the buffer. - (gnus-message 5 gnus-no-groups-message)) - ;; We have some groups displayed. - (goto-char (point-max)) - (when (or (not gnus-group-goto-next-group-function) - (not (funcall gnus-group-goto-next-group-function - group props))) - (cond - (empty - (goto-char (point-min))) - ((not group) - ;; Go to the first group with unread articles. - (gnus-group-search-forward t)) - (t - ;; Find the right group to put point on. If the current group - ;; has disappeared in the new listing, try to find the next - ;; one. If no next one can be found, just leave point at the - ;; first newsgroup in the buffer. - (when (not (gnus-goto-char - (text-property-any - (point-min) (point-max) - 'gnus-group (gnus-intern-safe - group gnus-active-hashtb)))) - (let ((newsrc (cdddr (gnus-gethash group gnus-newsrc-hashtb)))) - (while (and newsrc - (not (gnus-goto-char - (text-property-any - (point-min) (point-max) 'gnus-group - (gnus-intern-safe - (caar newsrc) gnus-active-hashtb))))) - (setq newsrc (cdr newsrc))) - (unless newsrc - (goto-char (point-max)) - (forward-line -1))))))) - ;; Adjust cursor point. - (gnus-group-position-point))) - -(defun gnus-group-list-level (level &optional all) - "List groups on LEVEL. -If ALL (the prefix), also list groups that have no unread articles." - (interactive "nList groups on level: \nP") - (gnus-group-list-groups level all level)) - -(defun gnus-group-prepare-logic (group test) - (or (and gnus-group-listed-groups - (null gnus-group-list-option) - (member group gnus-group-listed-groups)) - (cond - ((null gnus-group-listed-groups) test) - ((null gnus-group-list-option) test) - (t (and (member group gnus-group-listed-groups) - (if (eq gnus-group-list-option 'flush) - (not test) - test)))))) - -(defun gnus-group-prepare-flat (level &optional predicate lowest regexp) - "List all newsgroups with unread articles of level LEVEL or lower. -If PREDICATE is a function, list groups that the function returns non-nil; -if it is t, list groups that have no unread articles. -If LOWEST is non-nil, list all newsgroups of level LOWEST or higher. -If REGEXP is a function, list dead groups that the function returns non-nil; -if it is a string, only list groups matching REGEXP." - (set-buffer gnus-group-buffer) - (let ((buffer-read-only nil) - (newsrc (cdr gnus-newsrc-alist)) - (lowest (or lowest 1)) - (not-in-list (and gnus-group-listed-groups - (copy-sequence gnus-group-listed-groups))) - info clevel unread group params) - (erase-buffer) - (when (or (< lowest gnus-level-zombie) - gnus-group-listed-groups) - ;; List living groups. - (while newsrc - (setq info (car newsrc) - group (gnus-info-group info) - params (gnus-info-params info) - newsrc (cdr newsrc) - unread (car (gnus-gethash group gnus-newsrc-hashtb))) - (if not-in-list - (setq not-in-list (delete group not-in-list))) - (and - (gnus-group-prepare-logic - group - (and unread ; This group might be unchecked - (or (not (stringp regexp)) - (string-match regexp group)) - (<= (setq clevel (gnus-info-level info)) level) - (>= clevel lowest) - (cond - ((functionp predicate) - (funcall predicate info)) - (predicate t) ; We list all groups? - (t - (or - (if (eq unread t) ; Unactivated? - gnus-group-list-inactive-groups - ; We list unactivated - (> unread 0)) - ; We list groups with unread articles - (and gnus-list-groups-with-ticked-articles - (cdr (assq 'tick (gnus-info-marks info)))) - ; And groups with tickeds - ;; Check for permanent visibility. - (and gnus-permanently-visible-groups - (string-match gnus-permanently-visible-groups group)) - (memq 'visible params) - (cdr (assq 'visible params))))))) - (gnus-group-insert-group-line - group (gnus-info-level info) - (gnus-info-marks info) unread (gnus-info-method info))))) - - ;; List dead groups. - (if (or gnus-group-listed-groups - (and (>= level gnus-level-zombie) - (<= lowest gnus-level-zombie))) - (gnus-group-prepare-flat-list-dead - (setq gnus-zombie-list (sort gnus-zombie-list 'string<)) - gnus-level-zombie ?Z - regexp)) - (if not-in-list - (dolist (group gnus-zombie-list) - (setq not-in-list (delete group not-in-list)))) - (if (or gnus-group-listed-groups - (and (>= level gnus-level-killed) (<= lowest gnus-level-killed))) - (gnus-group-prepare-flat-list-dead - (gnus-union - not-in-list - (setq gnus-killed-list (sort gnus-killed-list 'string<))) - gnus-level-killed ?K regexp)) - - (gnus-group-set-mode-line) - (setq gnus-group-list-mode (cons level predicate)) - (gnus-run-hooks 'gnus-group-prepare-hook) - t)) - -(defun gnus-group-prepare-flat-list-dead (groups level mark regexp) - ;; List zombies and killed lists somewhat faster, which was - ;; suggested by Jack Vinson . It does - ;; this by ignoring the group format specification altogether. - (let (group) - (if (> (length groups) gnus-group-listing-limit) - (while groups - (setq group (pop groups)) - (when (gnus-group-prepare-logic - group - (or (not regexp) - (and (stringp regexp) (string-match regexp group)) - (and (functionp regexp) (funcall regexp group)))) - (gnus-add-text-properties - (point) (prog1 (1+ (point)) - (insert " " mark " *: " - (gnus-group-decoded-name group) - "\n")) - (list 'gnus-group (gnus-intern-safe group gnus-active-hashtb) - 'gnus-unread t - 'gnus-level level)))) - (while groups - (setq group (pop groups)) - (when (gnus-group-prepare-logic - group - (or (not regexp) - (and (stringp regexp) (string-match regexp group)) - (and (functionp regexp) (funcall regexp group)))) - (gnus-group-insert-group-line - group level nil - (let ((active (gnus-active group))) - (if active - (if (zerop (cdr active)) - 0 - (- (1+ (cdr active)) (car active))) - nil)) - (gnus-method-simplify (gnus-find-method-for-group group)))))))) - -(defun gnus-group-update-group-line () - "Update the current line in the group buffer." - (let* ((buffer-read-only nil) - (group (gnus-group-group-name)) - (entry (and group (gnus-gethash group gnus-newsrc-hashtb))) - gnus-group-indentation) - (when group - (and entry - (not (gnus-ephemeral-group-p group)) - (gnus-dribble-enter - (concat "(gnus-group-set-info '" - (gnus-prin1-to-string (nth 2 entry)) - ")"))) - (setq gnus-group-indentation (gnus-group-group-indentation)) - (gnus-delete-line) - (gnus-group-insert-group-line-info group) - (forward-line -1) - (gnus-group-position-point)))) - -(defun gnus-group-insert-group-line-info (group) - "Insert GROUP on the current line." - (let ((entry (gnus-gethash group gnus-newsrc-hashtb)) - (gnus-group-indentation (gnus-group-group-indentation)) - active info) - (if entry - (progn - ;; (Un)subscribed group. - (setq info (nth 2 entry)) - (gnus-group-insert-group-line - group (gnus-info-level info) (gnus-info-marks info) - (or (car entry) t) (gnus-info-method info))) - ;; This group is dead. - (gnus-group-insert-group-line - group - (if (member group gnus-zombie-list) gnus-level-zombie gnus-level-killed) - nil - (if (setq active (gnus-active group)) - (if (zerop (cdr active)) - 0 - (- (1+ (cdr active)) (car active))) - nil) - (gnus-method-simplify (gnus-find-method-for-group group)))))) - -(defun gnus-group-insert-group-line (gnus-tmp-group gnus-tmp-level - gnus-tmp-marked number - gnus-tmp-method) - "Insert a group line in the group buffer." - (let* ((gnus-tmp-method - (gnus-server-get-method gnus-tmp-group gnus-tmp-method)) - (group-name-charset (gnus-group-name-charset gnus-tmp-method - gnus-tmp-group)) - (gnus-tmp-active (gnus-active gnus-tmp-group)) - (gnus-tmp-number-total - (if gnus-tmp-active - (1+ (- (cdr gnus-tmp-active) (car gnus-tmp-active))) - 0)) - (gnus-tmp-number-of-unread - (if (numberp number) (int-to-string (max 0 number)) - "*")) - (gnus-tmp-number-of-read - (if (numberp number) - (int-to-string (max 0 (- gnus-tmp-number-total number))) - "*")) - (gnus-tmp-subscribed - (cond ((<= gnus-tmp-level gnus-level-subscribed) ? ) - ((<= gnus-tmp-level gnus-level-unsubscribed) ?U) - ((= gnus-tmp-level gnus-level-zombie) ?Z) - (t ?K))) - (gnus-tmp-qualified-group - (gnus-group-name-decode (gnus-group-real-name gnus-tmp-group) - group-name-charset)) - (gnus-tmp-newsgroup-description - (if gnus-description-hashtb - (or (gnus-group-name-decode - (gnus-gethash gnus-tmp-group gnus-description-hashtb) - group-name-charset) "") - "")) - (gnus-tmp-moderated - (if (and gnus-moderated-hashtb - (gnus-gethash gnus-tmp-group gnus-moderated-hashtb)) - ?m ? )) - (gnus-tmp-moderated-string - (if (eq gnus-tmp-moderated ?m) "(m)" "")) - (gnus-tmp-group-icon "==&&==") - (gnus-tmp-news-server (or (cadr gnus-tmp-method) "")) - (gnus-tmp-news-method (or (car gnus-tmp-method) "")) - (gnus-tmp-news-method-string - (if gnus-tmp-method - (format "(%s:%s)" (car gnus-tmp-method) - (cadr gnus-tmp-method)) "")) - (gnus-tmp-marked-mark - (if (and (numberp number) - (zerop number) - (cdr (assq 'tick gnus-tmp-marked))) - ?* ? )) - (gnus-tmp-process-marked - (if (member gnus-tmp-group gnus-group-marked) - gnus-process-mark ? )) - (gnus-tmp-grouplens - (or (and gnus-use-grouplens - (bbb-grouplens-group-p gnus-tmp-group)) - "")) - (buffer-read-only nil) - header gnus-tmp-header) ; passed as parameter to user-funcs. - (beginning-of-line) - (gnus-add-text-properties - (point) - (prog1 (1+ (point)) - ;; Insert the text. - (eval gnus-group-line-format-spec)) - `(gnus-group ,(gnus-intern-safe gnus-tmp-group gnus-active-hashtb) - gnus-unread ,(if (numberp number) - (string-to-int gnus-tmp-number-of-unread) - t) - gnus-marked ,gnus-tmp-marked-mark - gnus-indentation ,gnus-group-indentation - gnus-level ,gnus-tmp-level)) - (forward-line -1) - (when (inline (gnus-visual-p 'group-highlight 'highlight)) - (gnus-run-hooks 'gnus-group-update-hook)) - (forward-line) - ;; Allow XEmacs to remove front-sticky text properties. - (gnus-group-remove-excess-properties))) - -(defun gnus-group-highlight-line () - "Highlight the current line according to `gnus-group-highlight'." - (let* ((list gnus-group-highlight) - (p (point)) - (end (progn (end-of-line) (point))) - ;; now find out where the line starts and leave point there. - (beg (progn (beginning-of-line) (point))) - (group (gnus-group-group-name)) - (entry (gnus-group-entry group)) - (unread (if (numberp (car entry)) (car entry) 0)) - (active (gnus-active group)) - (total (if active (1+ (- (cdr active) (car active))) 0)) - (info (nth 2 entry)) - (method (gnus-server-get-method group (gnus-info-method info))) - (marked (gnus-info-marks info)) - (mailp (apply 'append - (mapcar - (lambda (x) - (memq x (assoc (symbol-name - (car (or method gnus-select-method))) - gnus-valid-select-methods))) - '(mail post-mail)))) - (level (or (gnus-info-level info) gnus-level-killed)) - (score (or (gnus-info-score info) 0)) - (ticked (gnus-range-length (cdr (assq 'tick marked)))) - (group-age (gnus-group-timestamp-delta group)) - (inhibit-read-only t)) - ;; Eval the cars of the lists until we find a match. - (while (and list - (not (eval (caar list)))) - (setq list (cdr list))) - (let ((face (cdar list))) - (unless (eq face (get-text-property beg 'face)) - (gnus-put-text-property-excluding-characters-with-faces - beg end 'face - (setq face (if (boundp face) (symbol-value face) face))) - (gnus-extent-start-open beg))) - (goto-char p))) - -(defun gnus-group-update-group (group &optional visible-only) - "Update all lines where GROUP appear. -If VISIBLE-ONLY is non-nil, the group won't be displayed if it isn't -already." - ;; Can't use `save-excursion' here, so we do it manually. - (let ((buf (current-buffer)) - mark) - (set-buffer gnus-group-buffer) - (setq mark (point-marker)) - ;; The buffer may be narrowed. - (save-restriction - (widen) - (let ((ident (gnus-intern-safe group gnus-active-hashtb)) - (loc (point-min)) - found buffer-read-only) - ;; Enter the current status into the dribble buffer. - (let ((entry (gnus-gethash group gnus-newsrc-hashtb))) - (when (and entry - (not (gnus-ephemeral-group-p group))) - (gnus-dribble-enter - (concat "(gnus-group-set-info '" - (gnus-prin1-to-string (nth 2 entry)) - ")")))) - ;; Find all group instances. If topics are in use, each group - ;; may be listed in more than once. - (while (setq loc (text-property-any - loc (point-max) 'gnus-group ident)) - (setq found t) - (goto-char loc) - (let ((gnus-group-indentation (gnus-group-group-indentation))) - (gnus-delete-line) - (gnus-group-insert-group-line-info group) - (save-excursion - (forward-line -1) - (gnus-run-hooks 'gnus-group-update-group-hook))) - (setq loc (1+ loc))) - (unless (or found visible-only) - ;; No such line in the buffer, find out where it's supposed to - ;; go, and insert it there (or at the end of the buffer). - (if gnus-goto-missing-group-function - (funcall gnus-goto-missing-group-function group) - (let ((entry (cddr (gnus-gethash group gnus-newsrc-hashtb)))) - (while (and entry (car entry) - (not - (gnus-goto-char - (text-property-any - (point-min) (point-max) - 'gnus-group (gnus-intern-safe - (caar entry) gnus-active-hashtb))))) - (setq entry (cdr entry))) - (or entry (goto-char (point-max))))) - ;; Finally insert the line. - (let ((gnus-group-indentation (gnus-group-group-indentation))) - (gnus-group-insert-group-line-info group) - (save-excursion - (forward-line -1) - (gnus-run-hooks 'gnus-group-update-group-hook)))) - (when gnus-group-update-group-function - (funcall gnus-group-update-group-function group)) - (gnus-group-set-mode-line))) - (goto-char mark) - (set-marker mark nil) - (set-buffer buf))) - -(defun gnus-group-set-mode-line () - "Update the mode line in the group buffer." - (when (memq 'group gnus-updated-mode-lines) - ;; Yes, we want to keep this mode line updated. - (save-excursion - (set-buffer gnus-group-buffer) - (let* ((gformat (or gnus-group-mode-line-format-spec - (gnus-set-format 'group-mode))) - (gnus-tmp-news-server (cadr gnus-select-method)) - (gnus-tmp-news-method (car gnus-select-method)) - (gnus-tmp-colon (if (equal gnus-tmp-news-server "") "" ":")) - (max-len 60) - gnus-tmp-header ;Dummy binding for user-defined formats - ;; Get the resulting string. - (modified - (and gnus-dribble-buffer - (buffer-name gnus-dribble-buffer) - (buffer-modified-p gnus-dribble-buffer) - (save-excursion - (set-buffer gnus-dribble-buffer) - (not (zerop (buffer-size)))))) - (mode-string (eval gformat))) - ;; Say whether the dribble buffer has been modified. - (setq mode-line-modified - (if modified (car gnus-mode-line-modified) - (cdr gnus-mode-line-modified))) - ;; If the line is too long, we chop it off. - (when (> (length mode-string) max-len) - (setq mode-string (substring mode-string 0 (- max-len 4)))) - (prog1 - (setq mode-line-buffer-identification - (gnus-mode-line-buffer-identification - (list mode-string))) - (set-buffer-modified-p modified)))))) - -(defun gnus-group-group-name () - "Get the name of the newsgroup on the current line." - (let ((group (get-text-property (gnus-point-at-bol) 'gnus-group))) - (when group - (symbol-name group)))) - -(defun gnus-group-group-level () - "Get the level of the newsgroup on the current line." - (get-text-property (gnus-point-at-bol) 'gnus-level)) - -(defun gnus-group-group-indentation () - "Get the indentation of the newsgroup on the current line." - (or (get-text-property (gnus-point-at-bol) 'gnus-indentation) - (and gnus-group-indentation-function - (funcall gnus-group-indentation-function)) - "")) - -(defun gnus-group-group-unread () - "Get the number of unread articles of the newsgroup on the current line." - (get-text-property (gnus-point-at-bol) 'gnus-unread)) - -(defun gnus-group-new-mail (group) - (if (nnmail-new-mail-p (gnus-group-real-name group)) - gnus-new-mail-mark - ? )) - -(defun gnus-group-level (group) - "Return the estimated level of GROUP." - (or (gnus-info-level (gnus-get-info group)) - (and (member group gnus-zombie-list) gnus-level-zombie) - gnus-level-killed)) - -(defun gnus-group-search-forward (&optional backward all level first-too) - "Find the next newsgroup with unread articles. -If BACKWARD is non-nil, find the previous newsgroup instead. -If ALL is non-nil, just find any newsgroup. -If LEVEL is non-nil, find group with level LEVEL, or higher if no such -group exists. -If FIRST-TOO, the current line is also eligible as a target." - (let ((way (if backward -1 1)) - (low gnus-level-killed) - (beg (point)) - pos found lev) - (if (and backward (progn (beginning-of-line)) (bobp)) - nil - (unless first-too - (forward-line way)) - (while (and - (not (eobp)) - (not (setq - found - (and - (get-text-property (point) 'gnus-group) - (or all - (and - (let ((unread - (get-text-property (point) 'gnus-unread))) - (and (numberp unread) (> unread 0))) - (setq lev (get-text-property (point) - 'gnus-level)) - (<= lev gnus-level-subscribed))) - (or (not level) - (and (setq lev (get-text-property (point) - 'gnus-level)) - (or (= lev level) - (and (< lev low) - (< level lev) - (progn - (setq low lev) - (setq pos (point)) - nil)))))))) - (zerop (forward-line way))))) - (if found - (progn (gnus-group-position-point) t) - (goto-char (or pos beg)) - (and pos t)))) - -;;; Gnus group mode commands - -;; Group marking. - -(defun gnus-group-mark-line-p () - (save-excursion - (beginning-of-line) - (forward-char (or (cdr (assq 'process gnus-group-mark-positions)) 2)) - (eq (char-after) gnus-process-mark))) - -(defun gnus-group-mark-group (n &optional unmark no-advance) - "Mark the current group." - (interactive "p") - (let ((buffer-read-only nil) - group) - (while (and (> n 0) - (not (eobp))) - (when (setq group (gnus-group-group-name)) - ;; Go to the mark position. - (beginning-of-line) - (forward-char (or (cdr (assq 'process gnus-group-mark-positions)) 2)) - (subst-char-in-region - (point) (1+ (point)) (char-after) - (if unmark - (progn - (setq gnus-group-marked (delete group gnus-group-marked)) - ? ) - (setq gnus-group-marked - (cons group (delete group gnus-group-marked))) - gnus-process-mark))) - (unless no-advance - (gnus-group-next-group 1)) - (decf n)) - (gnus-summary-position-point) - n)) - -(defun gnus-group-unmark-group (n) - "Remove the mark from the current group." - (interactive "p") - (gnus-group-mark-group n 'unmark) - (gnus-group-position-point)) - -(defun gnus-group-unmark-all-groups () - "Unmark all groups." - (interactive) - (let ((groups gnus-group-marked)) - (save-excursion - (while groups - (gnus-group-remove-mark (pop groups))))) - (gnus-group-position-point)) - -(defun gnus-group-mark-region (unmark beg end) - "Mark all groups between point and mark. -If UNMARK, remove the mark instead." - (interactive "P\nr") - (let ((num (count-lines beg end))) - (save-excursion - (goto-char beg) - (- num (gnus-group-mark-group num unmark))))) - -(defun gnus-group-mark-buffer (&optional unmark) - "Mark all groups in the buffer. -If UNMARK, remove the mark instead." - (interactive "P") - (gnus-group-mark-region unmark (point-min) (point-max))) - -(defun gnus-group-mark-regexp (regexp) - "Mark all groups that match some regexp." - (interactive "sMark (regexp): ") - (let ((alist (cdr gnus-newsrc-alist)) - group) - (while alist - (when (string-match regexp (setq group (gnus-info-group (pop alist)))) - (gnus-group-set-mark group)))) - (gnus-group-position-point)) - -(defun gnus-group-remove-mark (group &optional test-marked) - "Remove the process mark from GROUP and move point there. -Return nil if the group isn't displayed." - (if (gnus-group-goto-group group nil test-marked) - (save-excursion - (gnus-group-mark-group 1 'unmark t) - t) - (setq gnus-group-marked - (delete group gnus-group-marked)) - nil)) - -(defun gnus-group-set-mark (group) - "Set the process mark on GROUP." - (if (gnus-group-goto-group group) - (save-excursion - (gnus-group-mark-group 1 nil t)) - (setq gnus-group-marked (cons group (delete group gnus-group-marked))))) - -(defun gnus-group-universal-argument (arg &optional groups func) - "Perform any command on all groups according to the process/prefix convention." - (interactive "P") - (if (eq (setq func (or func - (key-binding - (read-key-sequence - (substitute-command-keys - "\\\\[gnus-group-universal-argument]"))))) - 'undefined) - (gnus-error 1 "Undefined key") - (gnus-group-iterate arg - (lambda (group) - (command-execute func)))) - (gnus-group-position-point)) - -(defun gnus-group-process-prefix (n) - "Return a list of groups to work on. -Take into consideration N (the prefix) and the list of marked groups." - (cond - (n - (setq n (prefix-numeric-value n)) - ;; There is a prefix, so we return a list of the N next - ;; groups. - (let ((way (if (< n 0) -1 1)) - (n (abs n)) - group groups) - (save-excursion - (while (> n 0) - (if (setq group (gnus-group-group-name)) - (push group groups)) - (setq n (1- n)) - (gnus-group-next-group way))) - (nreverse groups))) - ((gnus-region-active-p) - ;; Work on the region between point and mark. - (let ((max (max (point) (mark))) - groups) - (save-excursion - (goto-char (min (point) (mark))) - (while - (and - (push (gnus-group-group-name) groups) - (zerop (gnus-group-next-group 1)) - (< (point) max))) - (nreverse groups)))) - (gnus-group-marked - ;; No prefix, but a list of marked articles. - (reverse gnus-group-marked)) - (t - ;; Neither marked articles or a prefix, so we return the - ;; current group. - (let ((group (gnus-group-group-name))) - (and group (list group)))))) - -;;; !!!Surely gnus-group-iterate should be a macro instead? I can't -;;; imagine why I went through these contortions... -(eval-and-compile - (let ((function (make-symbol "gnus-group-iterate-function")) - (window (make-symbol "gnus-group-iterate-window")) - (groups (make-symbol "gnus-group-iterate-groups")) - (group (make-symbol "gnus-group-iterate-group"))) - (eval - `(defun gnus-group-iterate (arg ,function) - "Iterate FUNCTION over all process/prefixed groups. -FUNCTION will be called with the group name as the parameter -and with point over the group in question." - (let ((,groups (gnus-group-process-prefix arg)) - (,window (selected-window)) - ,group) - (while ,groups - (setq ,group (car ,groups) - ,groups (cdr ,groups)) - (select-window ,window) - (gnus-group-remove-mark ,group) - (save-selected-window - (save-excursion - (funcall ,function ,group))))))))) - -(put 'gnus-group-iterate 'lisp-indent-function 1) - -;; Selecting groups. - -(defun gnus-group-read-group (&optional all no-article group select-articles) - "Read news in this newsgroup. -If the prefix argument ALL is non-nil, already read articles become -readable. IF ALL is a number, fetch this number of articles. If the -optional argument NO-ARTICLE is non-nil, no article will be -auto-selected upon group entry. If GROUP is non-nil, fetch that -group." - (interactive "P") - (let ((no-display (eq all 0)) - (group (or group (gnus-group-group-name))) - number active marked entry) - (when (eq all 0) - (setq all nil)) - (unless group - (error "No group on current line")) - (setq marked (gnus-info-marks - (nth 2 (setq entry (gnus-gethash - group gnus-newsrc-hashtb))))) - ;; This group might be a dead group. In that case we have to get - ;; the number of unread articles from `gnus-active-hashtb'. - (setq number - (cond ((numberp all) all) - (entry (car entry)) - ((setq active (gnus-active group)) - (- (1+ (cdr active)) (car active))))) - (gnus-summary-read-group - group (or all (and (numberp number) - (zerop (+ number (gnus-range-length - (cdr (assq 'tick marked))) - (gnus-range-length - (cdr (assq 'dormant marked))))))) - no-article nil no-display nil select-articles))) - -(defun gnus-group-select-group (&optional all) - "Select this newsgroup. -No article is selected automatically. -If the group is opened, just switch the summary buffer. -If ALL is non-nil, already read articles become readable. -If ALL is a number, fetch this number of articles." - (interactive "P") - (gnus-group-read-group all t)) - -(defun gnus-group-quick-select-group (&optional all) - "Select the current group \"quickly\". -This means that no highlighting or scoring will be performed. -If ALL (the prefix argument) is 0, don't even generate the summary -buffer. - -This might be useful if you want to toggle threading -before entering the group." - (interactive "P") - (require 'gnus-score) - (let (gnus-visual - gnus-score-find-score-files-function - gnus-home-score-file - gnus-apply-kill-hook - gnus-summary-expunge-below) - (gnus-group-read-group all t))) - -(defun gnus-group-visible-select-group (&optional all) - "Select the current group without hiding any articles." - (interactive "P") - (let ((gnus-inhibit-limiting t)) - (gnus-group-read-group all t))) - -(defun gnus-group-select-group-ephemerally () - "Select the current group without doing any processing whatsoever. -You will actually be entered into a group that's a copy of -the current group; no changes you make while in this group will -be permanent." - (interactive) - (require 'gnus-score) - (let* (gnus-visual - gnus-score-find-score-files-function gnus-apply-kill-hook - gnus-summary-expunge-below gnus-show-threads gnus-suppress-duplicates - gnus-summary-mode-hook gnus-select-group-hook - (group (gnus-group-group-name)) - (method (gnus-find-method-for-group group))) - (gnus-group-read-ephemeral-group - (gnus-group-prefixed-name group method) method))) - -;;;###autoload -(defun gnus-fetch-group (group) - "Start Gnus if necessary and enter GROUP. -Returns whether the fetching was successful or not." - (interactive (list (completing-read "Group name: " gnus-active-hashtb))) - (unless (get-buffer gnus-group-buffer) - (gnus-no-server)) - (gnus-group-read-group nil nil group)) - -;;;###autoload -(defun gnus-fetch-group-other-frame (group) - "Pop up a frame and enter GROUP." - (interactive "P") - (let ((window (get-buffer-window gnus-group-buffer))) - (cond (window - (select-frame (window-frame window))) - ((= (length (frame-list)) 1) - (select-frame (make-frame))) - (t - (other-frame 1)))) - (gnus-fetch-group group)) - -(defvar gnus-ephemeral-group-server 0) - -;; Enter a group that is not in the group buffer. Non-nil is returned -;; if selection was successful. -(defun gnus-group-read-ephemeral-group (group method &optional activate - quit-config request-only - select-articles) - "Read GROUP from METHOD as an ephemeral group. -If ACTIVATE, request the group first. -If QUIT-CONFIG, use that window configuration when exiting from the -ephemeral group. -If REQUEST-ONLY, don't actually read the group; just request it. -If SELECT-ARTICLES, only select those articles. - -Return the name of the group if selection was successful." - ;; Transform the select method into a unique server. - (when (stringp method) - (setq method (gnus-server-to-method method))) - (setq method - `(,(car method) ,(concat (cadr method) "-ephemeral") - (,(intern (format "%s-address" (car method))) ,(cadr method)) - ,@(cddr method))) - (let ((group (if (gnus-group-foreign-p group) group - (gnus-group-prefixed-name group method)))) - (gnus-sethash - group - `(-1 nil (,group - ,gnus-level-default-subscribed nil nil ,method - ((quit-config . - ,(if quit-config quit-config - (cons gnus-summary-buffer - gnus-current-window-configuration)))))) - gnus-newsrc-hashtb) - (push method gnus-ephemeral-servers) - (set-buffer gnus-group-buffer) - (unless (gnus-check-server method) - (error "Unable to contact server: %s" (gnus-status-message method))) - (when activate - (gnus-activate-group group 'scan) - (unless (gnus-request-group group) - (error "Couldn't request group: %s" - (nnheader-get-report (car method))))) - (if request-only - group - (condition-case () - (when (gnus-group-read-group t t group select-articles) - group) - ;;(error nil) - (quit - (message "Quit reading the ephemeral group") - nil))))) - -(defun gnus-group-jump-to-group (group) - "Jump to newsgroup GROUP." - (interactive - (list (completing-read - "Group: " gnus-active-hashtb nil - (gnus-read-active-file-p) - gnus-group-jump-to-group-prompt - 'gnus-group-history))) - - (when (equal group "") - (error "Empty group name")) - - (unless (gnus-ephemeral-group-p group) - ;; Either go to the line in the group buffer... - (unless (gnus-group-goto-group group) - ;; ... or insert the line. - (gnus-group-update-group group) - (gnus-group-goto-group group))) - ;; Adjust cursor point. - (gnus-group-position-point)) - -(defun gnus-group-goto-group (group &optional far test-marked) - "Goto to newsgroup GROUP. -If FAR, it is likely that the group is not on the current line. -If TEST-MARKED, the line must be marked." - (when group - (beginning-of-line) - (cond - ;; It's quite likely that we are on the right line, so - ;; we check the current line first. - ((and (not far) - (eq (get-text-property (point) 'gnus-group) - (gnus-intern-safe group gnus-active-hashtb)) - (or (not test-marked) (gnus-group-mark-line-p))) - (point)) - ;; Previous and next line are also likely, so we check them as well. - ((and (not far) - (save-excursion - (forward-line -1) - (and (eq (get-text-property (point) 'gnus-group) - (gnus-intern-safe group gnus-active-hashtb)) - (or (not test-marked) (gnus-group-mark-line-p))))) - (forward-line -1) - (point)) - ((and (not far) - (save-excursion - (forward-line 1) - (and (eq (get-text-property (point) 'gnus-group) - (gnus-intern-safe group gnus-active-hashtb)) - (or (not test-marked) (gnus-group-mark-line-p))))) - (forward-line 1) - (point)) - (test-marked - (goto-char (point-min)) - (let (found) - (while (and (not found) - (gnus-goto-char - (text-property-any - (point) (point-max) - 'gnus-group - (gnus-intern-safe group gnus-active-hashtb)))) - (if (gnus-group-mark-line-p) - (setq found t) - (forward-line 1))) - found)) - (t - ;; Search through the entire buffer. - (gnus-goto-char - (text-property-any - (point-min) (point-max) - 'gnus-group (gnus-intern-safe group gnus-active-hashtb))))))) - -(defun gnus-group-next-group (n &optional silent) - "Go to next N'th newsgroup. -If N is negative, search backward instead. -Returns the difference between N and the number of skips actually -done." - (interactive "p") - (gnus-group-next-unread-group n t nil silent)) - -(defun gnus-group-next-unread-group (n &optional all level silent) - "Go to next N'th unread newsgroup. -If N is negative, search backward instead. -If ALL is non-nil, choose any newsgroup, unread or not. -If LEVEL is non-nil, choose the next group with level LEVEL, or, if no -such group can be found, the next group with a level higher than -LEVEL. -Returns the difference between N and the number of skips actually -made." - (interactive "p") - (let ((backward (< n 0)) - (n (abs n))) - (while (and (> n 0) - (gnus-group-search-forward - backward (or (not gnus-group-goto-unread) all) level)) - (setq n (1- n))) - (when (and (/= 0 n) - (not silent)) - (gnus-message 7 "No more%s newsgroups%s" (if all "" " unread") - (if level " on this level or higher" ""))) - n)) - -(defun gnus-group-prev-group (n) - "Go to previous N'th newsgroup. -Returns the difference between N and the number of skips actually -done." - (interactive "p") - (gnus-group-next-unread-group (- n) t)) - -(defun gnus-group-prev-unread-group (n) - "Go to previous N'th unread newsgroup. -Returns the difference between N and the number of skips actually -done." - (interactive "p") - (gnus-group-next-unread-group (- n))) - -(defun gnus-group-next-unread-group-same-level (n) - "Go to next N'th unread newsgroup on the same level. -If N is negative, search backward instead. -Returns the difference between N and the number of skips actually -done." - (interactive "p") - (gnus-group-next-unread-group n t (gnus-group-group-level)) - (gnus-group-position-point)) - -(defun gnus-group-prev-unread-group-same-level (n) - "Go to next N'th unread newsgroup on the same level. -Returns the difference between N and the number of skips actually -done." - (interactive "p") - (gnus-group-next-unread-group (- n) t (gnus-group-group-level)) - (gnus-group-position-point)) - -(defun gnus-group-best-unread-group (&optional exclude-group) - "Go to the group with the highest level. -If EXCLUDE-GROUP, do not go to that group." - (interactive) - (goto-char (point-min)) - (let ((best 100000) - unread best-point) - (while (not (eobp)) - (setq unread (get-text-property (point) 'gnus-unread)) - (when (and (numberp unread) (> unread 0)) - (when (and (get-text-property (point) 'gnus-level) - (< (get-text-property (point) 'gnus-level) best) - (or (not exclude-group) - (not (equal exclude-group (gnus-group-group-name))))) - (setq best (get-text-property (point) 'gnus-level)) - (setq best-point (point)))) - (forward-line 1)) - (when best-point - (goto-char best-point)) - (gnus-summary-position-point) - (and best-point (gnus-group-group-name)))) - -(defun gnus-group-first-unread-group () - "Go to the first group with unread articles." - (interactive) - (prog1 - (let ((opoint (point)) - unread) - (goto-char (point-min)) - (if (or (eq (setq unread (gnus-group-group-unread)) t) ; Not active. - (and (numberp unread) ; Not a topic. - (not (zerop unread))) ; Has unread articles. - (zerop (gnus-group-next-unread-group 1))) ; Next unread group. - (point) ; Success. - (goto-char opoint) - nil)) ; Not success. - (gnus-group-position-point))) - -(defun gnus-group-enter-server-mode () - "Jump to the server buffer." - (interactive) - (gnus-enter-server-buffer)) - -(defun gnus-group-make-group (name &optional method address args) - "Add a new newsgroup. -The user will be prompted for a NAME, for a select METHOD, and an -ADDRESS." - (interactive - (list - (gnus-read-group "Group name: ") - (gnus-read-method "From method: "))) - - (when (stringp method) - (setq method (or (gnus-server-to-method method) method))) - (let* ((meth (gnus-method-simplify - (when (and method - (not (gnus-server-equal method gnus-select-method))) - (if address (list (intern method) address) - method)))) - (nname (if method (gnus-group-prefixed-name name meth) name)) - backend info) - (when (gnus-gethash nname gnus-newsrc-hashtb) - (error "Group %s already exists" nname)) - ;; Subscribe to the new group. - (gnus-group-change-level - (setq info (list t nname gnus-level-default-subscribed nil nil meth)) - gnus-level-default-subscribed gnus-level-killed - (and (gnus-group-group-name) - (gnus-gethash (gnus-group-group-name) - gnus-newsrc-hashtb)) - t) - ;; Make it active. - (gnus-set-active nname (cons 1 0)) - (unless (gnus-ephemeral-group-p name) - (gnus-dribble-enter - (concat "(gnus-group-set-info '" - (gnus-prin1-to-string (cdr info)) ")"))) - ;; Insert the line. - (gnus-group-insert-group-line-info nname) - (forward-line -1) - (gnus-group-position-point) - - ;; Load the backend and try to make the backend create - ;; the group as well. - (when (assoc (symbol-name (setq backend (car (gnus-server-get-method - nil meth)))) - gnus-valid-select-methods) - (require backend)) - (gnus-check-server meth) - (when (gnus-check-backend-function 'request-create-group nname) - (gnus-request-create-group nname nil args)) - t)) - -(defun gnus-group-delete-groups (&optional arg) - "Delete the current group. Only meaningful with editable groups." - (interactive "P") - (let ((n (length (gnus-group-process-prefix arg)))) - (when (gnus-yes-or-no-p - (if (= n 1) - "Delete this 1 group? " - (format "Delete these %d groups? " n))) - (gnus-group-iterate arg - (lambda (group) - (gnus-group-delete-group group nil t)))))) - -(defun gnus-group-delete-group (group &optional force no-prompt) - "Delete the current group. Only meaningful with editable groups. -If FORCE (the prefix) is non-nil, all the articles in the group will -be deleted. This is \"deleted\" as in \"removed forever from the face -of the Earth\". There is no undo. The user will be prompted before -doing the deletion." - (interactive - (list (gnus-group-group-name) - current-prefix-arg)) - (unless group - (error "No group to rename")) - (unless (gnus-check-backend-function 'request-delete-group group) - (error "This backend does not support group deletion")) - (prog1 - (if (and (not no-prompt) - (not (gnus-yes-or-no-p - (format - "Do you really want to delete %s%s? " - group (if force " and all its contents" ""))))) - () ; Whew! - (gnus-message 6 "Deleting group %s..." group) - (if (not (gnus-request-delete-group group force)) - (gnus-error 3 "Couldn't delete group %s" group) - (gnus-message 6 "Deleting group %s...done" group) - (gnus-group-goto-group group) - (gnus-group-kill-group 1 t) - (gnus-sethash group nil gnus-active-hashtb) - t)) - (gnus-group-position-point))) - -(defun gnus-group-rename-group (group new-name) - "Rename group from GROUP to NEW-NAME. -When used interactively, GROUP is the group under point -and NEW-NAME will be prompted for." - (interactive - (list - (gnus-group-group-name) - (progn - (unless (gnus-check-backend-function - 'request-rename-group (gnus-group-group-name)) - (error "This backend does not support renaming groups")) - (gnus-read-group "Rename group to: " - (gnus-group-real-name (gnus-group-group-name)))))) - - (unless (gnus-check-backend-function 'request-rename-group group) - (error "This backend does not support renaming groups")) - (unless group - (error "No group to rename")) - (when (equal (gnus-group-real-name group) new-name) - (error "Can't rename to the same name")) - - ;; We find the proper prefixed name. - (setq new-name - (if (gnus-group-native-p group) - ;; Native group. - new-name - ;; Foreign group. - (gnus-group-prefixed-name - (gnus-group-real-name new-name) - (gnus-info-method (gnus-get-info group))))) - - (gnus-message 6 "Renaming group %s to %s..." group new-name) - (prog1 - (if (progn - (gnus-group-goto-group group) - (not (when (< (gnus-group-group-level) gnus-level-zombie) - (gnus-request-rename-group group new-name)))) - (gnus-error 3 "Couldn't rename group %s to %s" group new-name) - ;; We rename the group internally by killing it... - (gnus-group-kill-group) - ;; ... changing its name ... - (setcar (cdar gnus-list-of-killed-groups) new-name) - ;; ... and then yanking it. Magic! - (gnus-group-yank-group) - (gnus-set-active new-name (gnus-active group)) - (gnus-message 6 "Renaming group %s to %s...done" group new-name) - new-name) - (setq gnus-killed-list (delete group gnus-killed-list)) - (gnus-set-active group nil) - (gnus-dribble-touch) - (gnus-group-position-point))) - -(defun gnus-group-edit-group (group &optional part) - "Edit the group on the current line." - (interactive (list (gnus-group-group-name))) - (let ((part (or part 'info)) - info) - (unless group - (error "No group on current line")) - (unless (setq info (gnus-get-info group)) - (error "Killed group; can't be edited")) - (ignore-errors - (gnus-close-group group)) - (gnus-edit-form - ;; Find the proper form to edit. - (cond ((eq part 'method) - (or (gnus-info-method info) "native")) - ((eq part 'params) - (gnus-info-params info)) - (t info)) - ;; The proper documentation. - (format - "Editing the %s for `%s'." - (cond - ((eq part 'method) "select method") - ((eq part 'params) "group parameters") - (t "group info")) - (gnus-group-decoded-name group)) - `(lambda (form) - (gnus-group-edit-group-done ',part ,group form))) - (local-set-key - "\C-c\C-i" - (gnus-create-info-command - (cond - ((eq part 'method) - "(gnus)Select Methods") - ((eq part 'params) - "(gnus)Group Parameters") - (t - "(gnus)Group Info")))))) - -(defun gnus-group-edit-group-method (group) - "Edit the select method of GROUP." - (interactive (list (gnus-group-group-name))) - (gnus-group-edit-group group 'method)) - -(defun gnus-group-edit-group-parameters (group) - "Edit the group parameters of GROUP." - (interactive (list (gnus-group-group-name))) - (gnus-group-edit-group group 'params)) - -(defun gnus-group-edit-group-done (part group form) - "Update variables." - (let* ((method (cond ((eq part 'info) (nth 4 form)) - ((eq part 'method) form) - (t nil))) - (info (cond ((eq part 'info) form) - ((eq part 'method) (gnus-get-info group)) - (t nil))) - (new-group (if info - (if (or (not method) - (gnus-server-equal - gnus-select-method method)) - (gnus-group-real-name (car info)) - (gnus-group-prefixed-name - (gnus-group-real-name (car info)) method)) - nil))) - (when (and new-group - (not (equal new-group group))) - (when (gnus-group-goto-group group) - (gnus-group-kill-group 1)) - (gnus-activate-group new-group)) - ;; Set the info. - (if (not (and info new-group)) - (gnus-group-set-info form (or new-group group) part) - (setq info (gnus-copy-sequence info)) - (setcar info new-group) - (unless (gnus-server-equal method "native") - (unless (nthcdr 3 info) - (nconc info (list nil nil))) - (unless (nthcdr 4 info) - (nconc info (list nil))) - (gnus-info-set-method info method)) - (gnus-group-set-info info)) - (gnus-group-update-group (or new-group group)) - (gnus-group-position-point))) - -(defun gnus-group-make-useful-group (group method) - "Create one of the groups described in `gnus-useful-groups'." - (interactive - (let ((entry (assoc (completing-read "Create group: " gnus-useful-groups - nil t) - gnus-useful-groups))) - (list (cadr entry) (caddr entry)))) - (setq method (gnus-copy-sequence method)) - (let (entry) - (while (setq entry (memq (assq 'eval method) method)) - (setcar entry (eval (cadar entry))))) - (gnus-group-make-group group method)) - -(defun gnus-group-make-help-group () - "Create the Gnus documentation group." - (interactive) - (let ((name (gnus-group-prefixed-name "gnus-help" '(nndoc "gnus-help"))) - (file (nnheader-find-etc-directory "gnus-tut.txt" t))) - (when (gnus-gethash name gnus-newsrc-hashtb) - (error "Documentation group already exists")) - (if (not file) - (gnus-message 1 "Couldn't find doc group") - (gnus-group-make-group - (gnus-group-real-name name) - (list 'nndoc "gnus-help" - (list 'nndoc-address file) - (list 'nndoc-article-type 'mbox))))) - (gnus-group-position-point)) - -(defun gnus-group-make-doc-group (file type) - "Create a group that uses a single file as the source." - (interactive - (list (read-file-name "File name: ") - (and current-prefix-arg 'ask))) - (when (eq type 'ask) - (let ((err "") - char found) - (while (not found) - (message - "%sFile type (mbox, babyl, digest, forward, mmdf, guess) [mbdfag]: " - err) - (setq found (cond ((= (setq char (read-char)) ?m) 'mbox) - ((= char ?b) 'babyl) - ((= char ?d) 'digest) - ((= char ?f) 'forward) - ((= char ?a) 'mmfd) - ((= char ?g) 'guess) - (t (setq err (format "%c unknown. " char)) - nil)))) - (setq type found))) - (let* ((file (expand-file-name file)) - (name (gnus-generate-new-group-name - (gnus-group-prefixed-name - (file-name-nondirectory file) '(nndoc ""))))) - (gnus-group-make-group - (gnus-group-real-name name) - (list 'nndoc file - (list 'nndoc-address file) - (list 'nndoc-article-type (or type 'guess)))))) - -(defvar nnweb-type-definition) -(defvar gnus-group-web-type-history nil) -(defvar gnus-group-web-search-history nil) -(defun gnus-group-make-web-group (&optional solid) - "Create an ephemeral nnweb group. -If SOLID (the prefix), create a solid group." - (interactive "P") - (require 'nnweb) - (let* ((group - (if solid (gnus-read-group "Group name: ") - (message-unique-id))) - (default-type (or (car gnus-group-web-type-history) - (symbol-name (caar nnweb-type-definition)))) - (type - (gnus-string-or - (completing-read - (format "Search engine type (default %s): " default-type) - (mapcar (lambda (elem) (list (symbol-name (car elem)))) - nnweb-type-definition) - nil t nil 'gnus-group-web-type-history) - default-type)) - (search - (read-string - "Search string: " - (cons (or (car gnus-group-web-search-history) "") 0) - 'gnus-group-web-search-history)) - (method - `(nnweb ,group (nnweb-search ,search) - (nnweb-type ,(intern type)) - (nnweb-ephemeral-p t)))) - (if solid - (gnus-group-make-group group "nnweb" "" `(,(intern type) ,search)) - (gnus-group-read-ephemeral-group - group method t - (cons (current-buffer) - (if (eq major-mode 'gnus-summary-mode) 'summary 'group)))))) - -(defvar nnwarchive-type-definition) -(defvar gnus-group-warchive-type-history nil) -(defvar gnus-group-warchive-login-history nil) -(defvar gnus-group-warchive-address-history nil) - -(defun gnus-group-make-warchive-group () - "Create a nnwarchive group." - (interactive) - (require 'nnwarchive) - (let* ((group (gnus-read-group "Group name: ")) - (default-type (or (car gnus-group-warchive-type-history) - (symbol-name (caar nnwarchive-type-definition)))) - (type - (gnus-string-or - (completing-read - (format "Warchive type (default %s): " default-type) - (mapcar (lambda (elem) (list (symbol-name (car elem)))) - nnwarchive-type-definition) - nil t nil 'gnus-group-warchive-type-history) - default-type)) - (address (read-string "Warchive address: " - nil 'gnus-group-warchive-address-history)) - (default-login (or (car gnus-group-warchive-login-history) - user-mail-address)) - (login - (gnus-string-or - (read-string - (format "Warchive login (default %s): " user-mail-address) - default-login 'gnus-group-warchive-login-history) - user-mail-address)) - (method - `(nnwarchive ,address - (nnwarchive-type ,(intern type)) - (nnwarchive-login ,login)))) - (gnus-group-make-group group method))) - -(defun gnus-group-make-archive-group (&optional all) - "Create the (ding) Gnus archive group of the most recent articles. -Given a prefix, create a full group." - (interactive "P") - (let ((group (gnus-group-prefixed-name - (if all "ding.archives" "ding.recent") '(nndir "")))) - (when (gnus-gethash group gnus-newsrc-hashtb) - (error "Archive group already exists")) - (gnus-group-make-group - (gnus-group-real-name group) - (list 'nndir (if all "hpc" "edu") - (list 'nndir-directory - (if all gnus-group-archive-directory - gnus-group-recent-archive-directory)))) - (gnus-group-add-parameter group (cons 'to-address "ding@gnus.org")))) - -(defun gnus-group-make-directory-group (dir) - "Create an nndir group. -The user will be prompted for a directory. The contents of this -directory will be used as a newsgroup. The directory should contain -mail messages or news articles in files that have numeric names." - (interactive - (list (read-file-name "Create group from directory: "))) - (unless (file-exists-p dir) - (error "No such directory")) - (unless (file-directory-p dir) - (error "Not a directory")) - (let ((ext "") - (i 0) - group) - (while (or (not group) (gnus-gethash group gnus-newsrc-hashtb)) - (setq group - (gnus-group-prefixed-name - (expand-file-name ext dir) - '(nndir ""))) - (setq ext (format "<%d>" (setq i (1+ i))))) - (gnus-group-make-group - (gnus-group-real-name group) - (list 'nndir (gnus-group-real-name group) (list 'nndir-directory dir))))) - -(eval-when-compile (defvar nnkiboze-score-file)) -(defun gnus-group-make-kiboze-group (group address scores) - "Create an nnkiboze group. -The user will be prompted for a name, a regexp to match groups, and -score file entries for articles to include in the group." - (interactive - (list - (read-string "nnkiboze group name: ") - (read-string "Source groups (regexp): ") - (let ((headers (mapcar (lambda (group) (list group)) - '("subject" "from" "number" "date" "message-id" - "references" "chars" "lines" "xref" - "followup" "all" "body" "head"))) - scores header regexp regexps) - (while (not (equal "" (setq header (completing-read - "Match on header: " headers nil t)))) - (setq regexps nil) - (while (not (equal "" (setq regexp (read-string - (format "Match on %s (regexp): " - header))))) - (push (list regexp nil nil 'r) regexps)) - (push (cons header regexps) scores)) - scores))) - (gnus-group-make-group group "nnkiboze" address) - (let* ((nnkiboze-current-group group) - (score-file (car (nnkiboze-score-file ""))) - (score-dir (file-name-directory score-file))) - (unless (file-exists-p score-dir) - (make-directory score-dir)) - (with-temp-file score-file - (let (emacs-lisp-mode-hook) - (pp scores (current-buffer)))))) - -(defun gnus-group-add-to-virtual (n vgroup) - "Add the current group to a virtual group." - (interactive - (list current-prefix-arg - (completing-read "Add to virtual group: " gnus-newsrc-hashtb nil t - "nnvirtual:"))) - (unless (eq (car (gnus-find-method-for-group vgroup)) 'nnvirtual) - (error "%s is not an nnvirtual group" vgroup)) - (gnus-close-group vgroup) - (let* ((groups (gnus-group-process-prefix n)) - (method (gnus-info-method (gnus-get-info vgroup)))) - (setcar (cdr method) - (concat - (nth 1 method) "\\|" - (mapconcat - (lambda (s) - (gnus-group-remove-mark s) - (concat "\\(^" (regexp-quote s) "$\\)")) - groups "\\|")))) - (gnus-group-position-point)) - -(defun gnus-group-make-empty-virtual (group) - "Create a new, fresh, empty virtual group." - (interactive "sCreate new, empty virtual group: ") - (let* ((method (list 'nnvirtual "^$")) - (pgroup (gnus-group-prefixed-name group method))) - ;; Check whether it exists already. - (when (gnus-gethash pgroup gnus-newsrc-hashtb) - (error "Group %s already exists" pgroup)) - ;; Subscribe the new group after the group on the current line. - (gnus-subscribe-group pgroup (gnus-group-group-name) method) - (gnus-group-update-group pgroup) - (forward-line -1) - (gnus-group-position-point))) - -(defun gnus-group-enter-directory (dir) - "Enter an ephemeral nneething group." - (interactive "DDirectory to read: ") - (let* ((method (list 'nneething dir '(nneething-read-only t))) - (leaf (gnus-group-prefixed-name - (file-name-nondirectory (directory-file-name dir)) - method)) - (name (gnus-generate-new-group-name leaf))) - (unless (gnus-group-read-ephemeral-group - name method t - (cons (current-buffer) - (if (eq major-mode 'gnus-summary-mode) - 'summary 'group))) - (error "Couldn't enter %s" dir)))) - -(eval-and-compile - (autoload 'nnimap-expunge "nnimap") - (autoload 'nnimap-acl-get "nnimap") - (autoload 'nnimap-acl-edit "nnimap")) - -(defun gnus-group-nnimap-expunge (group) - "Expunge deleted articles in current nnimap GROUP." - (interactive (list (gnus-group-group-name))) - (let ((mailbox (gnus-group-real-name group)) method) - (unless group - (error "No group on current line")) - (unless (gnus-get-info group) - (error "Killed group; can't be edited")) - (unless (eq 'nnimap (car (setq method (gnus-find-method-for-group group)))) - (error "%s is not an nnimap group" group)) - (nnimap-expunge mailbox (cadr method)))) - -(defun gnus-group-nnimap-edit-acl (group) - "Edit the Access Control List of current nnimap GROUP." - (interactive (list (gnus-group-group-name))) - (let ((mailbox (gnus-group-real-name group)) method acl) - (unless group - (error "No group on current line")) - (unless (gnus-get-info group) - (error "Killed group; can't be edited")) - (unless (eq (car (setq method (gnus-find-method-for-group group))) 'nnimap) - (error "%s is not an nnimap group" group)) - (unless (setq acl (nnimap-acl-get mailbox (cadr method))) - (error "Server does not support ACL's")) - (gnus-edit-form acl (format "Editing the access control list for `%s'. - - An access control list is a list of (identifier . rights) elements. - - The identifier string specifies the corresponding user. The - identifier \"anyone\" is reserved to refer to the universal identity. - - Rights is a string listing a (possibly empty) set of alphanumeric - characters, each character listing a set of operations which is being - controlled. Letters are reserved for ``standard'' rights, listed - below. Digits are reserved for implementation or site defined rights. - - l - lookup (mailbox is visible to LIST/LSUB commands) - r - read (SELECT the mailbox, perform CHECK, FETCH, PARTIAL, - SEARCH, COPY from mailbox) - s - keep seen/unseen information across sessions (STORE \\SEEN flag) - w - write (STORE flags other than \\SEEN and \\DELETED) - i - insert (perform APPEND, COPY into mailbox) - p - post (send mail to submission address for mailbox, - not enforced by IMAP4 itself) - c - create and delete mailbox (CREATE new sub-mailboxes in any - implementation-defined hierarchy, RENAME or DELETE mailbox) - d - delete messages (STORE \\DELETED flag, perform EXPUNGE) - a - administer (perform SETACL)" group) - `(lambda (form) - (nnimap-acl-edit - ,mailbox ',method ',acl form))))) - -;; Group sorting commands -;; Suggested by Joe Hildebrand . - -(defun gnus-group-sort-groups (func &optional reverse) - "Sort the group buffer according to FUNC. -When used interactively, the sorting function used will be -determined by the `gnus-group-sort-function' variable. -If REVERSE (the prefix), reverse the sorting order." - (interactive (list gnus-group-sort-function current-prefix-arg)) - (funcall gnus-group-sort-alist-function - (gnus-make-sort-function func) reverse) - (gnus-group-list-groups) - (gnus-dribble-touch)) - -(defun gnus-group-sort-flat (func reverse) - ;; We peel off the dummy group from the alist. - (when func - (when (equal (gnus-info-group (car gnus-newsrc-alist)) "dummy.group") - (pop gnus-newsrc-alist)) - ;; Do the sorting. - (setq gnus-newsrc-alist - (sort gnus-newsrc-alist func)) - (when reverse - (setq gnus-newsrc-alist (nreverse gnus-newsrc-alist))) - ;; Regenerate the hash table. - (gnus-make-hashtable-from-newsrc-alist))) - -(defun gnus-group-sort-groups-by-alphabet (&optional reverse) - "Sort the group buffer alphabetically by group name. -If REVERSE, sort in reverse order." - (interactive "P") - (gnus-group-sort-groups 'gnus-group-sort-by-alphabet reverse)) - -(defun gnus-group-sort-groups-by-unread (&optional reverse) - "Sort the group buffer by number of unread articles. -If REVERSE, sort in reverse order." - (interactive "P") - (gnus-group-sort-groups 'gnus-group-sort-by-unread reverse)) - -(defun gnus-group-sort-groups-by-level (&optional reverse) - "Sort the group buffer by group level. -If REVERSE, sort in reverse order." - (interactive "P") - (gnus-group-sort-groups 'gnus-group-sort-by-level reverse)) - -(defun gnus-group-sort-groups-by-score (&optional reverse) - "Sort the group buffer by group score. -If REVERSE, sort in reverse order." - (interactive "P") - (gnus-group-sort-groups 'gnus-group-sort-by-score reverse)) - -(defun gnus-group-sort-groups-by-rank (&optional reverse) - "Sort the group buffer by group rank. -If REVERSE, sort in reverse order." - (interactive "P") - (gnus-group-sort-groups 'gnus-group-sort-by-rank reverse)) - -(defun gnus-group-sort-groups-by-method (&optional reverse) - "Sort the group buffer alphabetically by backend name. -If REVERSE, sort in reverse order." - (interactive "P") - (gnus-group-sort-groups 'gnus-group-sort-by-method reverse)) - -(defun gnus-group-sort-groups-by-server (&optional reverse) - "Sort the group buffer alphabetically by server name. -If REVERSE, sort in reverse order." - (interactive "P") - (gnus-group-sort-groups 'gnus-group-sort-by-server reverse)) - -;;; Selected group sorting. - -(defun gnus-group-sort-selected-groups (n func &optional reverse) - "Sort the process/prefixed groups." - (interactive (list current-prefix-arg gnus-group-sort-function)) - (let ((groups (gnus-group-process-prefix n))) - (funcall gnus-group-sort-selected-function - groups (gnus-make-sort-function func) reverse) - (gnus-group-list-groups))) - -(defun gnus-group-sort-selected-flat (groups func reverse) - (let (entries infos) - ;; First find all the group entries for these groups. - (while groups - (push (nthcdr 2 (gnus-gethash (pop groups) gnus-newsrc-hashtb)) - entries)) - ;; Then sort the infos. - (setq infos - (sort - (mapcar - (lambda (entry) (car entry)) - (setq entries (nreverse entries))) - func)) - (when reverse - (setq infos (nreverse infos))) - ;; Go through all the infos and replace the old entries - ;; with the new infos. - (while infos - (setcar (car entries) (pop infos)) - (pop entries)) - ;; Update the hashtable. - (gnus-make-hashtable-from-newsrc-alist))) - -(defun gnus-group-sort-selected-groups-by-alphabet (&optional n reverse) - "Sort the group buffer alphabetically by group name. -Obeys the process/prefix convention. If REVERSE (the symbolic prefix), -sort in reverse order." - (interactive (gnus-interactive "P\ny")) - (gnus-group-sort-selected-groups n 'gnus-group-sort-by-alphabet reverse)) - -(defun gnus-group-sort-selected-groups-by-unread (&optional n reverse) - "Sort the group buffer by number of unread articles. -Obeys the process/prefix convention. If REVERSE (the symbolic prefix), -sort in reverse order." - (interactive (gnus-interactive "P\ny")) - (gnus-group-sort-selected-groups n 'gnus-group-sort-by-unread reverse)) - -(defun gnus-group-sort-selected-groups-by-level (&optional n reverse) - "Sort the group buffer by group level. -Obeys the process/prefix convention. If REVERSE (the symbolic prefix), -sort in reverse order." - (interactive (gnus-interactive "P\ny")) - (gnus-group-sort-selected-groups n 'gnus-group-sort-by-level reverse)) - -(defun gnus-group-sort-selected-groups-by-score (&optional n reverse) - "Sort the group buffer by group score. -Obeys the process/prefix convention. If REVERSE (the symbolic prefix), -sort in reverse order." - (interactive (gnus-interactive "P\ny")) - (gnus-group-sort-selected-groups n 'gnus-group-sort-by-score reverse)) - -(defun gnus-group-sort-selected-groups-by-rank (&optional n reverse) - "Sort the group buffer by group rank. -Obeys the process/prefix convention. If REVERSE (the symbolic prefix), -sort in reverse order." - (interactive (gnus-interactive "P\ny")) - (gnus-group-sort-selected-groups n 'gnus-group-sort-by-rank reverse)) - -(defun gnus-group-sort-selected-groups-by-method (&optional n reverse) - "Sort the group buffer alphabetically by backend name. -Obeys the process/prefix convention. If REVERSE (the symbolic prefix), -sort in reverse order." - (interactive (gnus-interactive "P\ny")) - (gnus-group-sort-selected-groups n 'gnus-group-sort-by-method reverse)) - -;;; Sorting predicates. - -(defun gnus-group-sort-by-alphabet (info1 info2) - "Sort alphabetically." - (string< (gnus-info-group info1) (gnus-info-group info2))) - -(defun gnus-group-sort-by-real-name (info1 info2) - "Sort alphabetically on real (unprefixed) names." - (string< (gnus-group-real-name (gnus-info-group info1)) - (gnus-group-real-name (gnus-info-group info2)))) - -(defun gnus-group-sort-by-unread (info1 info2) - "Sort by number of unread articles." - (let ((n1 (car (gnus-gethash (gnus-info-group info1) gnus-newsrc-hashtb))) - (n2 (car (gnus-gethash (gnus-info-group info2) gnus-newsrc-hashtb)))) - (< (or (and (numberp n1) n1) 0) - (or (and (numberp n2) n2) 0)))) - -(defun gnus-group-sort-by-level (info1 info2) - "Sort by level." - (< (gnus-info-level info1) (gnus-info-level info2))) - -(defun gnus-group-sort-by-method (info1 info2) - "Sort alphabetically by backend name." - (string< (symbol-name (car (gnus-find-method-for-group - (gnus-info-group info1) info1))) - (symbol-name (car (gnus-find-method-for-group - (gnus-info-group info2) info2))))) - -(defun gnus-group-sort-by-server (info1 info2) - "Sort alphabetically by server name." - (string< (gnus-method-to-server-name - (gnus-find-method-for-group - (gnus-info-group info1) info1)) - (gnus-method-to-server-name - (gnus-find-method-for-group - (gnus-info-group info2) info2)))) - -(defun gnus-group-sort-by-score (info1 info2) - "Sort by group score." - (> (gnus-info-score info1) (gnus-info-score info2))) - -(defun gnus-group-sort-by-rank (info1 info2) - "Sort by level and score." - (let ((level1 (gnus-info-level info1)) - (level2 (gnus-info-level info2))) - (or (< level1 level2) - (and (= level1 level2) - (> (gnus-info-score info1) (gnus-info-score info2)))))) - -;;; Clearing data - -(defun gnus-group-clear-data (&optional arg) - "Clear all marks and read ranges from the current group." - (interactive "P") - (gnus-group-iterate arg - (lambda (group) - (let (info) - (gnus-info-clear-data (setq info (gnus-get-info group))) - (gnus-get-unread-articles-in-group info (gnus-active group) t) - (when (gnus-group-goto-group group) - (gnus-group-update-group-line)))))) - -(defun gnus-group-clear-data-on-native-groups () - "Clear all marks and read ranges from all native groups." - (interactive) - (when (gnus-yes-or-no-p "Really clear all data from almost all groups? ") - (let ((alist (cdr gnus-newsrc-alist)) - info) - (while (setq info (pop alist)) - (when (gnus-group-native-p (gnus-info-group info)) - (gnus-info-clear-data info))) - (gnus-get-unread-articles) - (gnus-dribble-touch) - (when (gnus-y-or-n-p - "Move the cache away to avoid problems in the future? ") - (call-interactively 'gnus-cache-move-cache))))) - -(defun gnus-info-clear-data (info) - "Clear all marks and read ranges from INFO." - (let ((group (gnus-info-group info)) - action) - (dolist (el (gnus-info-marks info)) - (push `(,(cdr el) add (,(car el))) action)) - (push `(,(gnus-info-read info) add (read)) action) - (gnus-undo-register - `(progn - (gnus-request-set-mark ,group ',action) - (gnus-info-set-marks ',info ',(gnus-info-marks info) t) - (gnus-info-set-read ',info ',(gnus-info-read info)) - (when (gnus-group-goto-group ,group) - (gnus-get-unread-articles-in-group ',info ',(gnus-active group) t) - (gnus-group-update-group-line)))) - (setq action (mapcar (lambda (el) (list (nth 0 el) 'del (nth 2 el))) - action)) - (gnus-request-set-mark group action) - (gnus-info-set-read info nil) - (when (gnus-info-marks info) - (gnus-info-set-marks info nil)))) - -;; Group catching up. - -(defun gnus-group-catchup-current (&optional n all) - "Mark all unread articles in the current newsgroup as read. -If prefix argument N is numeric, the next N newsgroups will be -caught up. If ALL is non-nil, marked articles will also be marked as -read. Cross references (Xref: header) of articles are ignored. -The number of newsgroups that this function was unable to catch -up is returned." - (interactive "P") - (let ((groups (gnus-group-process-prefix n)) - (ret 0) - group) - (unless groups (error "No groups selected")) - (if (not - (or (not gnus-interactive-catchup) ;Without confirmation? - gnus-expert-user - (gnus-y-or-n-p - (format - (if all - "Do you really want to mark all articles in %s as read? " - "Mark all unread articles in %s as read? ") - (if (= (length groups) 1) - (car groups) - (format "these %d groups" (length groups))))))) - n - (while (setq group (pop groups)) - (gnus-group-remove-mark group) - ;; Virtual groups have to be given special treatment. - (let ((method (gnus-find-method-for-group group))) - (when (eq 'nnvirtual (car method)) - (nnvirtual-catchup-group - (gnus-group-real-name group) (nth 1 method) all))) - (if (>= (gnus-group-level group) gnus-level-zombie) - (gnus-message 2 "Dead groups can't be caught up") - (if (prog1 - (gnus-group-goto-group group) - (gnus-group-catchup group all)) - (gnus-group-update-group-line) - (setq ret (1+ ret))))) - (gnus-group-next-unread-group 1) - ret))) - -(defun gnus-group-catchup-current-all (&optional n) - "Mark all articles in current newsgroup as read. -Cross references (Xref: header) of articles are ignored." - (interactive "P") - (gnus-group-catchup-current n 'all)) - -(defun gnus-group-catchup (group &optional all) - "Mark all articles in GROUP as read. -If ALL is non-nil, all articles are marked as read. -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) - ;; Do auto-expirable marks if that's required. - (when (gnus-group-auto-expirable-p group) - (gnus-add-marked-articles - group 'expire (gnus-list-of-unread-articles group)) - (when all - (let ((marks (nth 3 (nth 2 entry)))) - (gnus-add-marked-articles - group 'expire (gnus-uncompress-range (cdr (assq 'tick marks)))) - (gnus-add-marked-articles - group 'expire (gnus-uncompress-range (cdr (assq 'tick marks))))))) - (when entry - (gnus-update-read-articles group nil) - ;; Also nix out the lists of marks and dormants. - (when all - (gnus-add-marked-articles group 'tick nil nil 'force) - (gnus-add-marked-articles group 'dormant nil nil 'force)) - (let ((gnus-newsgroup-name group)) - (gnus-run-hooks 'gnus-group-catchup-group-hook)) - num)))) - -(defun gnus-group-expire-articles (&optional n) - "Expire all expirable articles in the current newsgroup." - (interactive "P") - (let ((groups (gnus-group-process-prefix n)) - group) - (unless groups - (error "No groups to expire")) - (while (setq group (pop groups)) - (gnus-group-remove-mark group) - (gnus-group-expire-articles-1 group) - (gnus-dribble-touch) - (gnus-group-position-point)))) - -(defun gnus-group-expire-articles-1 (group) - (when (gnus-check-backend-function 'request-expire-articles group) - (gnus-message 6 "Expiring articles in %s..." group) - (let* ((info (gnus-get-info group)) - (expirable (if (gnus-group-total-expirable-p group) - (cons nil (gnus-list-of-read-articles group)) - (assq 'expire (gnus-info-marks info)))) - (expiry-wait (gnus-group-find-parameter group 'expiry-wait)) - (nnmail-expiry-target - (or (gnus-group-find-parameter group 'expiry-target) - nnmail-expiry-target))) - (when expirable - (gnus-check-group group) - (setcdr - expirable - (gnus-compress-sequence - (if expiry-wait - ;; We set the expiry variables to the group - ;; parameter. - (let ((nnmail-expiry-wait-function nil) - (nnmail-expiry-wait expiry-wait)) - (gnus-request-expire-articles - (gnus-uncompress-sequence (cdr expirable)) group)) - ;; Just expire using the normal expiry values. - (gnus-request-expire-articles - (gnus-uncompress-sequence (cdr expirable)) group)))) - (gnus-close-group group)) - (gnus-message 6 "Expiring articles in %s...done" group) - ;; Return the list of un-expired articles. - (cdr expirable)))) - -(defun gnus-group-expire-all-groups () - "Expire all expirable articles in all newsgroups." - (interactive) - (save-excursion - (gnus-message 5 "Expiring...") - (let ((gnus-group-marked (mapcar (lambda (info) (gnus-info-group info)) - (cdr gnus-newsrc-alist)))) - (gnus-group-expire-articles nil))) - (gnus-group-position-point) - (gnus-message 5 "Expiring...done")) - -(defun gnus-group-set-current-level (n level) - "Set the level of the next N groups to LEVEL." - (interactive - (list - current-prefix-arg - (string-to-int - (let ((s (read-string - (format "Level (default %s): " - (or (gnus-group-group-level) - gnus-level-default-subscribed))))) - (if (string-match "^\\s-*$" s) - (int-to-string (or (gnus-group-group-level) - gnus-level-default-subscribed)) - s))))) - (unless (and (>= level 1) (<= level gnus-level-killed)) - (error "Invalid level: %d" level)) - (let ((groups (gnus-group-process-prefix n)) - group) - (while (setq group (pop groups)) - (gnus-group-remove-mark group) - (gnus-message 6 "Changed level of %s from %d to %d" - group (or (gnus-group-group-level) gnus-level-killed) - level) - (gnus-group-change-level - group level (or (gnus-group-group-level) gnus-level-killed)) - (gnus-group-update-group-line))) - (gnus-group-position-point)) - -(defun gnus-group-unsubscribe (&optional n) - "Unsubscribe the current group." - (interactive "P") - (gnus-group-unsubscribe-current-group n 'unsubscribe)) - -(defun gnus-group-subscribe (&optional n) - "Subscribe the current group." - (interactive "P") - (gnus-group-unsubscribe-current-group n 'subscribe)) - -(defun gnus-group-unsubscribe-current-group (&optional n do-sub) - "Toggle subscription of the current group. -If given numerical prefix, toggle the N next groups." - (interactive "P") - (let ((groups (gnus-group-process-prefix n)) - group) - (while groups - (setq group (car groups) - groups (cdr groups)) - (gnus-group-remove-mark group) - (gnus-group-unsubscribe-group - group - (cond - ((eq do-sub 'unsubscribe) - gnus-level-default-unsubscribed) - ((eq do-sub 'subscribe) - gnus-level-default-subscribed) - ((<= (gnus-group-group-level) gnus-level-subscribed) - gnus-level-default-unsubscribed) - (t - gnus-level-default-subscribed)) - t) - (gnus-group-update-group-line)) - (gnus-group-next-group 1))) - -(defun gnus-group-unsubscribe-group (group &optional level silent) - "Toggle subscription to GROUP. -Killed newsgroups are subscribed. If SILENT, don't try to update the -group line." - (interactive - (list (completing-read - "Group: " gnus-active-hashtb nil - (gnus-read-active-file-p) - nil - 'gnus-group-history))) - (let ((newsrc (gnus-gethash group gnus-newsrc-hashtb))) - (cond - ((string-match "^[ \t]*$" group) - (error "Empty group name")) - (newsrc - ;; Toggle subscription flag. - (gnus-group-change-level - newsrc (if level level (if (<= (gnus-info-level (nth 2 newsrc)) - gnus-level-subscribed) - (1+ gnus-level-subscribed) - gnus-level-default-subscribed))) - (unless silent - (gnus-group-update-group group))) - ((and (stringp group) - (or (not (gnus-read-active-file-p)) - (gnus-active group))) - ;; Add new newsgroup. - (gnus-group-change-level - group - (if level level gnus-level-default-subscribed) - (or (and (member group gnus-zombie-list) - gnus-level-zombie) - gnus-level-killed) - (when (gnus-group-group-name) - (gnus-gethash (gnus-group-group-name) gnus-newsrc-hashtb))) - (unless silent - (gnus-group-update-group group))) - (t (error "No such newsgroup: %s" group))) - (gnus-group-position-point))) - -(defun gnus-group-transpose-groups (n) - "Move the current newsgroup up N places. -If given a negative prefix, move down instead. The difference between -N and the number of steps taken is returned." - (interactive "p") - (unless (gnus-group-group-name) - (error "No group on current line")) - (gnus-group-kill-group 1) - (prog1 - (forward-line (- n)) - (gnus-group-yank-group) - (gnus-group-position-point))) - -(defun gnus-group-kill-all-zombies (&optional dummy) - "Kill all zombie newsgroups. -The optional DUMMY should always be nil." - (interactive (list (not (gnus-yes-or-no-p "Really kill all zombies? ")))) - (unless dummy - (setq gnus-killed-list (nconc gnus-zombie-list gnus-killed-list)) - (setq gnus-zombie-list nil) - (gnus-dribble-touch) - (gnus-group-list-groups))) - -(defun gnus-group-kill-region (begin end) - "Kill newsgroups in current region (excluding current point). -The killed newsgroups can be yanked by using \\[gnus-group-yank-group]." - (interactive "r") - (let ((lines - ;; Count lines. - (save-excursion - (count-lines - (progn - (goto-char begin) - (beginning-of-line) - (point)) - (progn - (goto-char end) - (beginning-of-line) - (point)))))) - (goto-char begin) - (beginning-of-line) ;Important when LINES < 1 - (gnus-group-kill-group lines))) - -(defun gnus-group-kill-group (&optional n discard) - "Kill the next N groups. -The killed newsgroups can be yanked by using \\[gnus-group-yank-group]. -However, only groups that were alive can be yanked; already killed -groups or zombie groups can't be yanked. -The return value is the name of the group that was killed, or a list -of groups killed." - (interactive "P") - (let ((buffer-read-only nil) - (groups (gnus-group-process-prefix n)) - group entry level out) - (if (< (length groups) 10) - ;; This is faster when there are few groups. - (while groups - (push (setq group (pop groups)) out) - (gnus-group-remove-mark group) - (setq level (gnus-group-group-level)) - (gnus-delete-line) - (when (and (not discard) - (setq entry (gnus-gethash group gnus-newsrc-hashtb))) - (gnus-undo-register - `(progn - (gnus-group-goto-group ,(gnus-group-group-name)) - (gnus-group-yank-group))) - (push (cons (car entry) (nth 2 entry)) - gnus-list-of-killed-groups)) - (gnus-group-change-level - (if entry entry group) gnus-level-killed (if entry nil level)) - (message "Killed group %s" group)) - ;; If there are lots and lots of groups to be killed, we use - ;; this thing instead. - (let (entry) - (setq groups (nreverse groups)) - (while groups - (gnus-group-remove-mark (setq group (pop groups))) - (gnus-delete-line) - (push group gnus-killed-list) - (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)) - (cond - ((setq entry (gnus-gethash group gnus-newsrc-hashtb)) - (push (cons (car entry) (nth 2 entry)) - gnus-list-of-killed-groups) - (setcdr (cdr entry) (cdddr entry))) - ((member group gnus-zombie-list) - (setq gnus-zombie-list (delete group gnus-zombie-list)))) - ;; There may be more than one instance displayed. - (while (gnus-group-goto-group group) - (gnus-delete-line))) - (gnus-make-hashtable-from-newsrc-alist))) - - (gnus-group-position-point) - (if (< (length out) 2) (car out) (nreverse out)))) - -(defun gnus-group-yank-group (&optional arg) - "Yank the last newsgroups killed with \\[gnus-group-kill-group], inserting it before the current newsgroup. -The numeric ARG specifies how many newsgroups are to be yanked. The -name of the newsgroup yanked is returned, or (if several groups are -yanked) a list of yanked groups is returned." - (interactive "p") - (setq arg (or arg 1)) - (let (info group prev out) - (while (>= (decf arg) 0) - (when (not (setq info (pop gnus-list-of-killed-groups))) - (error "No more newsgroups to yank")) - (push (setq group (nth 1 info)) out) - ;; Find which newsgroup to insert this one before - search - ;; backward until something suitable is found. If there are no - ;; other newsgroups in this buffer, just make this newsgroup the - ;; first newsgroup. - (setq prev (gnus-group-group-name)) - (gnus-group-change-level - info (gnus-info-level (cdr info)) gnus-level-killed - (and prev (gnus-gethash prev gnus-newsrc-hashtb)) - t) - (gnus-group-insert-group-line-info group) - (gnus-undo-register - `(when (gnus-group-goto-group ,group) - (gnus-group-kill-group 1)))) - (forward-line -1) - (gnus-group-position-point) - (if (< (length out) 2) (car out) (nreverse out)))) - -(defun gnus-group-kill-level (level) - "Kill all groups that is on a certain LEVEL." - (interactive "nKill all groups on level: ") - (cond - ((= level gnus-level-zombie) - (setq gnus-killed-list - (nconc gnus-zombie-list gnus-killed-list)) - (setq gnus-zombie-list nil)) - ((and (< level gnus-level-zombie) - (> level 0) - (or gnus-expert-user - (gnus-yes-or-no-p - (format - "Do you really want to kill all groups on level %d? " - level)))) - (let* ((prev gnus-newsrc-alist) - (alist (cdr prev))) - (while alist - (if (= (gnus-info-level (car alist)) level) - (progn - (push (gnus-info-group (car alist)) gnus-killed-list) - (setcdr prev (cdr alist))) - (setq prev alist)) - (setq alist (cdr alist))) - (gnus-make-hashtable-from-newsrc-alist) - (gnus-group-list-groups))) - (t - (error "Can't kill; invalid level: %d" level)))) - -(defun gnus-group-list-all-groups (&optional arg) - "List all newsgroups with level ARG or lower. -Default is gnus-level-unsubscribed, which lists all subscribed and most -unsubscribed groups." - (interactive "P") - (gnus-group-list-groups (or arg gnus-level-unsubscribed) t)) - -;; Redefine this to list ALL killed groups if prefix arg used. -;; Rewritten by engstrom@src.honeywell.com (Eric Engstrom). -(defun gnus-group-list-killed (&optional arg) - "List all killed newsgroups in the group buffer. -If ARG is non-nil, list ALL killed groups known to Gnus. This may -entail asking the server for the groups." - (interactive "P") - ;; Find all possible killed newsgroups if arg. - (when arg - (gnus-get-killed-groups)) - (if (not gnus-killed-list) - (gnus-message 6 "No killed groups") - (let (gnus-group-list-mode) - (funcall gnus-group-prepare-function - gnus-level-killed t gnus-level-killed)) - (goto-char (point-min))) - (gnus-group-position-point)) - -(defun gnus-group-list-zombies () - "List all zombie newsgroups in the group buffer." - (interactive) - (if (not gnus-zombie-list) - (gnus-message 6 "No zombie groups") - (let (gnus-group-list-mode) - (funcall gnus-group-prepare-function - gnus-level-zombie t gnus-level-zombie)) - (goto-char (point-min))) - (gnus-group-position-point)) - -(defun gnus-group-list-active () - "List all groups that are available from the server(s)." - (interactive) - ;; First we make sure that we have really read the active file. - (unless (gnus-read-active-file-p) - (let ((gnus-read-active-file t) - (gnus-agent nil)) ; Trick the agent into ignoring the active file. - (gnus-read-active-file))) - ;; Find all groups and sort them. - (let ((groups - (sort - (let (list) - (mapatoms - (lambda (sym) - (and (boundp sym) - (symbol-value sym) - (push (symbol-name sym) list))) - gnus-active-hashtb) - list) - 'string<)) - (buffer-read-only nil) - group) - (erase-buffer) - (while groups - (setq group (pop groups)) - (gnus-add-text-properties - (point) (prog1 (1+ (point)) - (insert " *: " - (gnus-group-decoded-name group) - "\n")) - (list 'gnus-group (gnus-intern-safe group gnus-active-hashtb) - 'gnus-unread t - 'gnus-level (inline (gnus-group-level group))))) - (goto-char (point-min)))) - -(defun gnus-activate-all-groups (level) - "Activate absolutely all groups." - (interactive (list gnus-level-unsubscribed)) - (let ((gnus-activate-level level) - (gnus-activate-foreign-newsgroups level)) - (gnus-group-get-new-news))) - -(defun gnus-group-get-new-news (&optional arg) - "Get newly arrived articles. -If ARG is a number, it specifies which levels you are interested in -re-scanning. If ARG is non-nil and not a number, this will force -\"hard\" re-reading of the active files from all servers." - (interactive "P") - (require 'nnmail) - (let ((gnus-inhibit-demon t) - ;; Binding this variable will inhibit multiple fetchings - ;; of the same mail source. - (nnmail-fetched-sources (list t))) - (gnus-run-hooks 'gnus-get-new-news-hook) - - ;; Read any slave files. - (unless gnus-slave - (gnus-master-read-slave-newsrc)) - - ;; We might read in new NoCeM messages here. - (when (and gnus-use-nocem - (null arg)) - (gnus-nocem-scan-groups)) - ;; If ARG is not a number, then we read the active file. - (when (and arg (not (numberp arg))) - (let ((gnus-read-active-file t)) - (gnus-read-active-file)) - (setq arg nil) - - ;; If the user wants it, we scan for new groups. - (when (eq gnus-check-new-newsgroups 'always) - (gnus-find-new-newsgroups))) - - (setq arg (gnus-group-default-level arg t)) - (if (and gnus-read-active-file (not arg)) - (progn - (gnus-read-active-file) - (gnus-get-unread-articles arg)) - (let ((gnus-read-active-file (if arg nil gnus-read-active-file))) - (gnus-get-unread-articles arg))) - (gnus-run-hooks 'gnus-after-getting-new-news-hook) - (gnus-group-list-groups (and (numberp arg) - (max (car gnus-group-list-mode) arg)))) - ;; Update modeline. - (when (and gnus-agent (not (interactive-p))) - (gnus-agent-toggle-plugged gnus-plugged))) - -(defun gnus-group-get-new-news-this-group (&optional n dont-scan) - "Check for newly arrived news in the current group (and the N-1 next groups). -The difference between N and the number of newsgroup checked is returned. -If N is negative, this group and the N-1 previous groups will be checked." - (interactive "P") - (let* ((groups (gnus-group-process-prefix n)) - (ret (if (numberp n) (- n (length groups)) 0)) - (beg (unless n - (point))) - group method - (gnus-inhibit-demon t) - ;; Binding this variable will inhibit multiple fetchings - ;; of the same mail source. - (nnmail-fetched-sources (list t))) - (gnus-run-hooks 'gnus-get-new-news-hook) - (while (setq group (pop groups)) - (gnus-group-remove-mark group) - ;; Bypass any previous denials from the server. - (gnus-remove-denial (setq method (gnus-find-method-for-group group))) - (if (gnus-activate-group group (if dont-scan nil 'scan)) - (progn - (gnus-get-unread-articles-in-group - (gnus-get-info group) (gnus-active group) t) - (unless (gnus-virtual-group-p group) - (gnus-close-group group)) - (when gnus-agent - (gnus-agent-save-group-info - method (gnus-group-real-name group) (gnus-active group))) - (gnus-group-update-group group)) - (if (eq (gnus-server-status (gnus-find-method-for-group group)) - 'denied) - (gnus-error 3 "Server denied access") - (gnus-error 3 "%s error: %s" group (gnus-status-message group))))) - (when beg - (goto-char beg)) - (when gnus-goto-next-group-when-activating - (gnus-group-next-unread-group 1 t)) - (gnus-summary-position-point) - ret)) - -(defun gnus-group-fetch-faq (group &optional faq-dir) - "Fetch the FAQ for the current group. -If given a prefix argument, prompt for the FAQ dir -to use." - (interactive - (list - (gnus-group-group-name) - (when current-prefix-arg - (completing-read - "Faq dir: " (and (listp gnus-group-faq-directory) - (mapcar #'list - gnus-group-faq-directory)))))) - (unless group - (error "No group name given")) - (let ((dirs (or faq-dir gnus-group-faq-directory)) - dir found file) - (unless (listp dirs) - (setq dirs (list dirs))) - (while (and (not found) - (setq dir (pop dirs))) - (let ((name (gnus-group-real-name group))) - (setq file (expand-file-name name dir))) - (if (not (file-exists-p file)) - (gnus-message 1 "No such file: %s" file) - (let ((enable-local-variables nil)) - (find-file file) - (setq found t)))))) - -(defun gnus-group-describe-group (force &optional group) - "Display a description of the current newsgroup." - (interactive (list current-prefix-arg (gnus-group-group-name))) - (let* ((method (gnus-find-method-for-group group)) - (mname (gnus-group-prefixed-name "" method)) - desc) - (when (and force - gnus-description-hashtb) - (gnus-sethash mname nil gnus-description-hashtb)) - (unless group - (error "No group name given")) - (when (or (and gnus-description-hashtb - ;; We check whether this group's method has been - ;; queried for a description file. - (gnus-gethash mname gnus-description-hashtb)) - (setq desc (gnus-group-get-description group)) - (gnus-read-descriptions-file method)) - (gnus-message 1 - (or desc (gnus-gethash group gnus-description-hashtb) - "No description available"))))) - -;; Suggested by Per Abrahamsen . -(defun gnus-group-describe-all-groups (&optional force) - "Pop up a buffer with descriptions of all newsgroups." - (interactive "P") - (when force - (setq gnus-description-hashtb nil)) - (when (not (or gnus-description-hashtb - (gnus-read-all-descriptions-files))) - (error "Couldn't request descriptions file")) - (let ((buffer-read-only nil) - b) - (erase-buffer) - (mapatoms - (lambda (group) - (setq b (point)) - (let ((charset (gnus-group-name-charset nil (symbol-name group)))) - (insert (format " *: %-20s %s\n" - (gnus-group-name-decode - (symbol-name group) charset) - (gnus-group-name-decode - (symbol-value group) charset)))) - (gnus-add-text-properties - b (1+ b) (list 'gnus-group group - 'gnus-unread t 'gnus-marked nil - 'gnus-level (1+ gnus-level-subscribed)))) - gnus-description-hashtb) - (goto-char (point-min)) - (gnus-group-position-point))) - -;; Suggested by Daniel Quinlan . -(defun gnus-group-apropos (regexp &optional search-description) - "List all newsgroups that have names that match a regexp." - (interactive "sGnus apropos (regexp): ") - (let ((prev "") - (obuf (current-buffer)) - groups des) - ;; Go through all newsgroups that are known to Gnus. - (mapatoms - (lambda (group) - (and (symbol-name group) - (string-match regexp (symbol-name group)) - (symbol-value group) - (push (symbol-name group) groups))) - gnus-active-hashtb) - ;; Also go through all descriptions that are known to Gnus. - (when search-description - (mapatoms - (lambda (group) - (and (string-match regexp (symbol-value group)) - (push (symbol-name group) groups))) - gnus-description-hashtb)) - (if (not groups) - (gnus-message 3 "No groups matched \"%s\"." regexp) - ;; Print out all the groups. - (save-excursion - (pop-to-buffer "*Gnus Help*") - (buffer-disable-undo) - (erase-buffer) - (setq groups (sort groups 'string<)) - (while groups - ;; Groups may be entered twice into the list of groups. - (when (not (string= (car groups) prev)) - (setq prev (car groups)) - (let ((charset (gnus-group-name-charset nil prev))) - (insert (gnus-group-name-decode prev charset) "\n") - (when (and gnus-description-hashtb - (setq des (gnus-gethash (car groups) - gnus-description-hashtb))) - (insert " " (gnus-group-name-decode des charset) "\n")))) - (setq groups (cdr groups))) - (goto-char (point-min)))) - (pop-to-buffer obuf))) - -(defun gnus-group-description-apropos (regexp) - "List all newsgroups that have names or descriptions that match a regexp." - (interactive "sGnus description apropos (regexp): ") - (when (not (or gnus-description-hashtb - (gnus-read-all-descriptions-files))) - (error "Couldn't request descriptions file")) - (gnus-group-apropos regexp t)) - -;; Suggested by Per Abrahamsen . -(defun gnus-group-list-matching (level regexp &optional all lowest) - "List all groups with unread articles that match REGEXP. -If the prefix LEVEL is non-nil, it should be a number that says which -level to cut off listing groups. -If ALL, also list groups with no unread articles. -If LOWEST, don't list groups with level lower than LOWEST. - -This command may read the active file." - (interactive "P\nsList newsgroups matching: ") - ;; First make sure active file has been read. - (when (and level - (> (prefix-numeric-value level) gnus-level-killed)) - (gnus-get-killed-groups)) - (funcall gnus-group-prepare-function - (or level gnus-level-subscribed) (and all t) (or lowest 1) regexp) - (goto-char (point-min)) - (gnus-group-position-point)) - -(defun gnus-group-list-all-matching (level regexp &optional lowest) - "List all groups that match REGEXP. -If the prefix LEVEL is non-nil, it should be a number that says which -level to cut off listing groups. -If LOWEST, don't list groups with level lower than LOWEST." - (interactive "P\nsList newsgroups matching: ") - (when level - (setq level (prefix-numeric-value level))) - (gnus-group-list-matching (or level gnus-level-killed) regexp t lowest)) - -;; Suggested by Jack Vinson . -(defun gnus-group-save-newsrc (&optional force) - "Save the Gnus startup files. -If FORCE, force saving whether it is necessary or not." - (interactive "P") - (gnus-save-newsrc-file force)) - -(defun gnus-group-restart (&optional arg) - "Force Gnus to read the .newsrc file." - (interactive "P") - (when (gnus-yes-or-no-p - (format "Are you sure you want to restart Gnus? ")) - (gnus-save-newsrc-file) - (gnus-clear-system) - (gnus))) - -(defun gnus-group-read-init-file () - "Read the Gnus elisp init file." - (interactive) - (gnus-read-init-file) - (gnus-message 5 "Read %s" gnus-init-file)) - -(defun gnus-group-check-bogus-groups (&optional silent) - "Check bogus newsgroups. -If given a prefix, don't ask for confirmation before removing a bogus -group." - (interactive "P") - (gnus-check-bogus-newsgroups (and (not silent) (not gnus-expert-user))) - (gnus-group-list-groups)) - -(defun gnus-group-find-new-groups (&optional arg) - "Search for new groups and add them. -Each new group will be treated with `gnus-subscribe-newsgroup-method.' -With 1 C-u, use the `ask-server' method to query the server for new -groups. -With 2 C-u's, use most complete method possible to query the server -for new groups, and subscribe the new groups as zombies." - (interactive "p") - (gnus-find-new-newsgroups (or arg 1)) - (gnus-group-list-groups)) - -(defun gnus-group-edit-global-kill (&optional article group) - "Edit the global kill file. -If GROUP, edit that local kill file instead." - (interactive "P") - (setq gnus-current-kill-article article) - (gnus-kill-file-edit-file group) - (gnus-message - 6 - (substitute-command-keys - (format "Editing a %s kill file (Type \\[gnus-kill-file-exit] to exit)" - (if group "local" "global"))))) - -(defun gnus-group-edit-local-kill (article group) - "Edit a local kill file." - (interactive (list nil (gnus-group-group-name))) - (gnus-group-edit-global-kill article group)) - -(defun gnus-group-force-update () - "Update `.newsrc' file." - (interactive) - (gnus-save-newsrc-file)) - -(defun gnus-group-suspend () - "Suspend the current Gnus session. -In fact, cleanup buffers except for group mode buffer. -The hook gnus-suspend-gnus-hook is called before actually suspending." - (interactive) - (gnus-run-hooks 'gnus-suspend-gnus-hook) - (gnus-offer-save-summaries) - ;; Kill Gnus buffers except for group mode buffer. - (let ((group-buf (get-buffer gnus-group-buffer))) - (mapcar (lambda (buf) - (unless (member buf (list group-buf gnus-dribble-buffer)) - (gnus-kill-buffer buf))) - (gnus-buffers)) - (gnus-kill-gnus-frames) - (when group-buf - (bury-buffer group-buf) - (delete-windows-on group-buf t)))) - -(defun gnus-group-clear-dribble () - "Clear all information from the dribble buffer." - (interactive) - (gnus-dribble-clear) - (gnus-message 7 "Cleared dribble buffer")) - -(defun gnus-group-exit () - "Quit reading news after updating .newsrc.eld and .newsrc. -The hook `gnus-exit-gnus-hook' is called before actually exiting." - (interactive) - (when - (or noninteractive ;For gnus-batch-kill - (not gnus-interactive-exit) ;Without confirmation - gnus-expert-user - (gnus-y-or-n-p "Are you sure you want to quit reading news? ")) - (gnus-run-hooks 'gnus-exit-gnus-hook) - ;; Offer to save data from non-quitted summary buffers. - (gnus-offer-save-summaries) - ;; Save the newsrc file(s). - (gnus-save-newsrc-file) - ;; Kill-em-all. - (gnus-close-backends) - ;; Reset everything. - (gnus-clear-system) - ;; Allow the user to do things after cleaning up. - (gnus-run-hooks 'gnus-after-exiting-gnus-hook))) - -(defun gnus-group-quit () - "Quit reading news without updating .newsrc.eld or .newsrc. -The hook `gnus-exit-gnus-hook' is called before actually exiting." - (interactive) - (when (or noninteractive ;For gnus-batch-kill - (zerop (buffer-size)) - (not (gnus-server-opened gnus-select-method)) - gnus-expert-user - (not gnus-current-startup-file) - (gnus-yes-or-no-p - (format "Quit reading news without saving %s? " - (file-name-nondirectory gnus-current-startup-file)))) - (gnus-run-hooks 'gnus-exit-gnus-hook) - (gnus-configure-windows 'group t) - (when (and (gnus-buffer-live-p gnus-dribble-buffer) - (not (zerop (save-excursion - (set-buffer gnus-dribble-buffer) - (buffer-size))))) - (gnus-dribble-enter - ";;; Gnus was exited on purpose without saving the .newsrc files.")) - (gnus-dribble-save) - (gnus-close-backends) - (gnus-clear-system) - (gnus-kill-buffer gnus-group-buffer) - ;; Allow the user to do things after cleaning up. - (gnus-run-hooks 'gnus-after-exiting-gnus-hook))) - -(defun gnus-group-describe-briefly () - "Give a one line description of the group mode commands." - (interactive) - (gnus-message 7 (substitute-command-keys "\\\\[gnus-group-read-group]:Select \\[gnus-group-next-unread-group]:Forward \\[gnus-group-prev-unread-group]:Backward \\[gnus-group-exit]:Exit \\[gnus-info-find-node]:Run Info \\[gnus-group-describe-briefly]:This help"))) - -(defun gnus-group-browse-foreign-server (method) - "Browse a foreign news server. -If called interactively, this function will ask for a select method - (nntp, nnspool, etc.) and a server address (eg. nntp.some.where). -If not, METHOD should be a list where the first element is the method -and the second element is the address." - (interactive - (list (let ((how (completing-read - "Which backend: " - (append gnus-valid-select-methods gnus-server-alist) - nil t (cons "nntp" 0) 'gnus-method-history))) - ;; We either got a backend name or a virtual server name. - ;; If the first, we also need an address. - (if (assoc how gnus-valid-select-methods) - (list (intern how) - ;; Suggested by mapjph@bath.ac.uk. - (completing-read - "Address: " - (mapcar (lambda (server) (list server)) - gnus-secondary-servers))) - ;; We got a server name. - how)))) - (gnus-browse-foreign-server method)) - -(defun gnus-group-set-info (info &optional method-only-group part) - (when (or info part) - (let* ((entry (gnus-gethash - (or method-only-group (gnus-info-group info)) - gnus-newsrc-hashtb)) - (part-info info) - (info (if method-only-group (nth 2 entry) info)) - method) - (when method-only-group - (unless entry - (error "Trying to change non-existent group %s" method-only-group)) - ;; We have received parts of the actual group info - either the - ;; select method or the group parameters. We first check - ;; whether we have to extend the info, and if so, do that. - (let ((len (length info)) - (total (if (eq part 'method) 5 6))) - (when (< len total) - (setcdr (nthcdr (1- len) info) - (make-list (- total len) nil))) - ;; Then we enter the new info. - (setcar (nthcdr (1- total) info) part-info))) - (unless entry - ;; This is a new group, so we just create it. - (save-excursion - (set-buffer gnus-group-buffer) - (setq method (gnus-info-method info)) - (when (gnus-server-equal method "native") - (setq method nil)) - (save-excursion - (set-buffer gnus-group-buffer) - (if method - ;; It's a foreign group... - (gnus-group-make-group - (gnus-group-real-name (gnus-info-group info)) - (if (stringp method) method - (prin1-to-string (car method))) - (and (consp method) - (nth 1 (gnus-info-method info)))) - ;; It's a native group. - (gnus-group-make-group (gnus-info-group info)))) - (gnus-message 6 "Note: New group created") - (setq entry - (gnus-gethash (gnus-group-prefixed-name - (gnus-group-real-name (gnus-info-group info)) - (or (gnus-info-method info) gnus-select-method)) - gnus-newsrc-hashtb)))) - ;; Whether it was a new group or not, we now have the entry, so we - ;; can do the update. - (if entry - (progn - (setcar (nthcdr 2 entry) info) - (when (and (not (eq (car entry) t)) - (gnus-active (gnus-info-group info))) - (setcar entry (length - (gnus-list-of-unread-articles (car info)))))) - (error "No such group: %s" (gnus-info-group info)))))) - -(defun gnus-group-set-method-info (group select-method) - (gnus-group-set-info select-method group 'method)) - -(defun gnus-group-set-params-info (group params) - (gnus-group-set-info params group 'params)) - -(defun gnus-add-marked-articles (group type articles &optional info force) - ;; Add ARTICLES of TYPE to the info of GROUP. - ;; If INFO is non-nil, use that info. If FORCE is non-nil, don't - ;; add, but replace marked articles of TYPE with ARTICLES. - (let ((info (or info (gnus-get-info group))) - marked m) - (or (not info) - (and (not (setq marked (nthcdr 3 info))) - (or (null articles) - (setcdr (nthcdr 2 info) - (list (list (cons type (gnus-compress-sequence - articles t))))))) - (and (not (setq m (assq type (car marked)))) - (or (null articles) - (setcar marked - (cons (cons type (gnus-compress-sequence articles t) ) - (car marked))))) - (if force - (if (null articles) - (setcar (nthcdr 3 info) - (gnus-delete-alist type (car marked))) - (setcdr m (gnus-compress-sequence articles t))) - (setcdr m (gnus-compress-sequence - (sort (nconc (gnus-uncompress-range (cdr m)) - (copy-sequence articles)) '<) t)))))) - -(defun gnus-add-mark (group mark article) - "Mark ARTICLE in GROUP with MARK, whether the group is displayed or not." - (let ((buffer (gnus-summary-buffer-name group))) - (if (gnus-buffer-live-p buffer) - (save-excursion - (set-buffer (get-buffer buffer)) - (gnus-summary-add-mark article mark)) - (gnus-add-marked-articles group (cdr (assq mark gnus-article-mark-lists)) - (list article))))) - -;;; -;;; Group timestamps -;;; - -(defun gnus-group-set-timestamp () - "Change the timestamp of the current group to the current time. -This function can be used in hooks like `gnus-select-group-hook' -or `gnus-group-catchup-group-hook'." - (when gnus-newsgroup-name - (let ((time (current-time))) - (setcdr (cdr time) nil) - (gnus-group-set-parameter gnus-newsgroup-name 'timestamp time)))) - -(defsubst gnus-group-timestamp (group) - "Return the timestamp for GROUP." - (gnus-group-get-parameter group 'timestamp t)) - -(defun gnus-group-timestamp-delta (group) - "Return the offset in seconds from the timestamp for GROUP to the current time, as a floating point number." - (let* ((time (or (gnus-group-timestamp group) - (list 0 0))) - (delta (subtract-time (current-time) time))) - (+ (* (nth 0 delta) 65536.0) - (nth 1 delta)))) - -(defun gnus-group-timestamp-string (group) - "Return a string of the timestamp for GROUP." - (let ((time (gnus-group-timestamp group))) - (if (not time) - "" - (gnus-time-iso8601 time)))) - -(defun gnus-group-list-cached (level &optional lowest) - "List all groups with cached articles. -If the prefix LEVEL is non-nil, it should be a number that says which -level to cut off listing groups. -If LOWEST, don't list groups with level lower than LOWEST. - -This command may read the active file." - (interactive "P") - (when level - (setq level (prefix-numeric-value level))) - (when (or (not level) (>= level gnus-level-zombie)) - (gnus-cache-open)) - (funcall gnus-group-prepare-function - (or level gnus-level-subscribed) - #'(lambda (info) - (let ((marks (gnus-info-marks info))) - (assq 'cache marks))) - lowest - #'(lambda (group) - (or (gnus-gethash group - gnus-cache-active-hashtb) - ;; Cache active file might use "." - ;; instead of ":". - (gnus-gethash - (mapconcat 'identity - (split-string group ":") - ".") - gnus-cache-active-hashtb)))) - (goto-char (point-min)) - (gnus-group-position-point)) - -(defun gnus-group-list-dormant (level &optional lowest) - "List all groups with dormant articles. -If the prefix LEVEL is non-nil, it should be a number that says which -level to cut off listing groups. -If LOWEST, don't list groups with level lower than LOWEST. - -This command may read the active file." - (interactive "P") - (when level - (setq level (prefix-numeric-value level))) - (when (or (not level) (>= level gnus-level-zombie)) - (gnus-cache-open)) - (funcall gnus-group-prepare-function - (or level gnus-level-subscribed) - #'(lambda (info) - (let ((marks (gnus-info-marks info))) - (assq 'dormant marks))) - lowest - 'ignore) - (goto-char (point-min)) - (gnus-group-position-point)) - -(defun gnus-group-listed-groups () - "Return a list of listed groups." - (let (point groups) - (goto-char (point-min)) - (while (setq point (text-property-not-all (point) (point-max) - 'gnus-group nil)) - (goto-char point) - (push (symbol-name (get-text-property point 'gnus-group)) groups) - (forward-char 1)) - groups)) - -(defun gnus-group-list-plus (&optional args) - "List groups plus the current selection." - (interactive "P") - (let ((gnus-group-listed-groups (gnus-group-listed-groups)) - (gnus-group-list-mode gnus-group-list-mode) ;; Save it. - func) - (push last-command-event unread-command-events) - (if (featurep 'xemacs) - (push (make-event 'key-press '(key ?A)) unread-command-events) - (push ?A unread-command-events)) - (let (gnus-pick-mode keys) - (setq keys (if (featurep 'xemacs) - (events-to-keys (read-key-sequence nil)) - (read-key-sequence nil))) - (setq func (lookup-key (current-local-map) keys))) - (if (or (not func) - (numberp func)) - (ding) - (call-interactively func)))) - -(defun gnus-group-list-flush (&optional args) - "Flush groups from the current selection." - (interactive "P") - (let ((gnus-group-list-option 'flush)) - (gnus-group-list-plus args))) - -(defun gnus-group-list-limit (&optional args) - "List groups limited within the current selection." - (interactive "P") - (let ((gnus-group-list-option 'limit)) - (gnus-group-list-plus args))) - -(defun gnus-group-mark-article-read (group article) - "Mark ARTICLE read." - (gnus-activate-group group) - (let ((buffer (gnus-summary-buffer-name group)) - (mark gnus-read-mark)) - (unless - (and - (get-buffer buffer) - (with-current-buffer buffer - (when gnus-newsgroup-prepared - (when (and gnus-newsgroup-auto-expire - (memq mark gnus-auto-expirable-marks)) - (setq mark gnus-expirable-mark)) - (setq mark (gnus-request-update-mark - group article mark)) - (gnus-mark-article-as-read article mark) - (setq gnus-newsgroup-active (gnus-active group)) - t))) - (gnus-group-make-articles-read group - (list article)) - (when (gnus-group-auto-expirable-p group) - (gnus-add-marked-articles - group 'expire (list article)))))) - -(provide 'gnus-group) - -;;; gnus-group.el ends here diff --git a/lisp/gnus-i18n.el b/lisp/gnus-i18n.el deleted file mode 100644 index c71b1e2..0000000 --- a/lisp/gnus-i18n.el +++ /dev/null @@ -1,95 +0,0 @@ -;;; gnus-i18n.el --- Internationalization for Gnus - -;; Copyright (C) 1996,1997 Free Software Foundation, Inc. - -;; Author: MORIOKA Tomohiko -;; Created: 1997/11/27 -;; Keywords: internationalization, news, mail - -;; This file is not part of GNU Emacs yet. - -;; 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, 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Code: - -;;; @ newsgroup default charset -;;; - -(defvar gnus-newsgroup-default-charset-alist - '(("\\(^\\|:\\)\\(fj\\|tnn\\|japan\\)\\." . iso-2022-jp-2) - ("\\(^\\|:\\)han\\." . euc-kr) - ("\\(^\\|:\\)relcom\\." . koi8-r) - ("\\(^\\|:\\)alt\\.chinese\\.text\\.big5" . cn-big5) - ("\\(^\\|:\\)hk\\(star\\)?\\." . cn-big5) - ("\\(^\\|:\\)tw\\." . cn-big5) - ("\\(^\\|:\\)alt\\.chinese" . hz-gb-2312) - ) - "Alist of newsgroup patterns vs. corresponding default MIME charset. -Each element looks like (REGEXP . SYMBOL). REGEXP is pattern for -newsgroup name. SYMBOL is MIME charset or coding-system.") - -(defun gnus-set-newsgroup-default-charset (newsgroup charset) - "Set CHARSET for the NEWSGROUP as default MIME charset." - (let* ((ng-regexp (concat "^" (regexp-quote newsgroup) "\\($\\|\\.\\)")) - (pair (assoc ng-regexp gnus-newsgroup-default-charset-alist)) - ) - (if pair - (setcdr pair charset) - (setq gnus-newsgroup-default-charset-alist - (cons (cons ng-regexp charset) - gnus-newsgroup-default-charset-alist)) - ))) - - -;;; @ localization -;;; - -(defun gnus-set-summary-default-charset () - "Set up `default-mime-charset' of summary buffer. -It is specified by variable `gnus-newsgroup-default-charset-alist' -\(cf. function `gnus-set-newsgroup-default-charset')." - (if (buffer-live-p gnus-summary-buffer) - (let ((charset - (catch 'found - (let ((group - (save-excursion - (set-buffer gnus-summary-buffer) - gnus-newsgroup-name)) - (alist gnus-newsgroup-default-charset-alist)) - (while alist - (let ((pair (car alist))) - (if (string-match (car pair) group) - (throw 'found (cdr pair)) - )) - (setq alist (cdr alist))) - )))) - (if charset - (progn - (save-excursion - (set-buffer gnus-summary-buffer) - (make-local-variable 'default-mime-charset) - (setq default-mime-charset charset)) - (make-local-variable 'default-mime-charset) - (setq default-mime-charset charset)) - (kill-local-variable 'default-mime-charset))))) - - -;;; @ end -;;; - -(provide 'gnus-i18n) - -;;; gnus-i18n.el ends here diff --git a/lisp/gnus-int.el b/lisp/gnus-int.el deleted file mode 100644 index 0fb9a18..0000000 --- a/lisp/gnus-int.el +++ /dev/null @@ -1,534 +0,0 @@ -;;; gnus-int.el --- backend interface functions for Gnus -;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; MORIOKA Tomohiko -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus) - -(defcustom gnus-open-server-hook nil - "Hook called just before opening connection to the news server." - :group 'gnus-start - :type 'hook) - -;;; -;;; Server Communication -;;; - -(defun gnus-start-news-server (&optional confirm) - "Open a method for getting news. -If CONFIRM is non-nil, the user will be asked for an NNTP server." - (let (how) - (if gnus-current-select-method - ;; Stream is already opened. - nil - ;; Open NNTP server. - (unless gnus-nntp-service - (setq gnus-nntp-server nil)) - (when confirm - ;; Read server name with completion. - (setq gnus-nntp-server - (completing-read "NNTP server: " - (mapcar (lambda (server) (list server)) - (cons (list gnus-nntp-server) - gnus-secondary-servers)) - nil nil gnus-nntp-server))) - - (when (and gnus-nntp-server - (stringp gnus-nntp-server) - (not (string= gnus-nntp-server ""))) - (setq gnus-select-method - (cond ((or (string= gnus-nntp-server "") - (string= gnus-nntp-server "::")) - (list 'nnspool (system-name))) - ((string-match "^:" gnus-nntp-server) - (list 'nnmh gnus-nntp-server - (list 'nnmh-directory - (file-name-as-directory - (expand-file-name - (substring gnus-nntp-server 1) "~/"))) - (list 'nnmh-get-new-mail nil))) - (t - (list 'nntp gnus-nntp-server))))) - - (setq how (car gnus-select-method)) - (cond - ((eq how 'nnspool) - (require 'nnspool) - (gnus-message 5 "Looking up local news spool...")) - ((eq how 'nnmh) - (require 'nnmh) - (gnus-message 5 "Looking up mh spool...")) - (t - (require 'nntp))) - (setq gnus-current-select-method gnus-select-method) - (gnus-run-hooks 'gnus-open-server-hook) - (or - ;; gnus-open-server-hook might have opened it - (gnus-server-opened gnus-select-method) - (gnus-open-server gnus-select-method) - gnus-batch-mode - (gnus-y-or-n-p - (format - "%s (%s) open error: '%s'. Continue? " - (car gnus-select-method) (cadr gnus-select-method) - (gnus-status-message gnus-select-method))) - (gnus-error 1 "Couldn't open server on %s" - (nth 1 gnus-select-method)))))) - -(defun gnus-check-group (group) - "Try to make sure that the server where GROUP exists is alive." - (let ((method (gnus-find-method-for-group group))) - (or (gnus-server-opened method) - (gnus-open-server method)))) - -(defun gnus-check-server (&optional method silent) - "Check whether the connection to METHOD is down. -If METHOD is nil, use `gnus-select-method'. -If it is down, start it up (again)." - (let ((method (or method gnus-select-method))) - ;; Transform virtual server names into select methods. - (when (stringp method) - (setq method (gnus-server-to-method method))) - (if (gnus-server-opened method) - ;; The stream is already opened. - t - ;; Open the server. - (unless silent - (gnus-message 5 "Opening %s server%s..." (car method) - (if (equal (nth 1 method) "") "" - (format " on %s" (nth 1 method))))) - (gnus-run-hooks 'gnus-open-server-hook) - (prog1 - (condition-case () - (gnus-open-server method) - (quit (message "Quit gnus-check-server") - nil)) - (unless silent - (message "")))))) - -(defun gnus-get-function (method function &optional noerror) - "Return a function symbol based on METHOD and FUNCTION." - ;; Translate server names into methods. - (unless method - (error "Attempted use of a nil select method")) - (when (stringp method) - (setq method (gnus-server-to-method method))) - ;; Check cache of constructed names. - (let* ((method-sym (if gnus-agent - (gnus-agent-get-function method) - (car method))) - (method-fns (get method-sym 'gnus-method-functions)) - (func (let ((method-fnlist-elt (assq function method-fns))) - (unless method-fnlist-elt - (setq method-fnlist-elt - (cons function - (intern (format "%s-%s" method-sym function)))) - (put method-sym 'gnus-method-functions - (cons method-fnlist-elt method-fns))) - (cdr method-fnlist-elt)))) - ;; Maybe complain if there is no function. - (unless (fboundp func) - (unless (car method) - (error "Trying to require a method that doesn't exist")) - (require (car method)) - (when (not (fboundp func)) - (if noerror - (setq func nil) - (error "No such function: %s" func)))) - func)) - - -;;; -;;; Interface functions to the backends. -;;; - -(defun gnus-open-server (gnus-command-method) - "Open a connection to GNUS-COMMAND-METHOD." - (when (stringp gnus-command-method) - (setq gnus-command-method (gnus-server-to-method gnus-command-method))) - (let ((elem (assoc gnus-command-method gnus-opened-servers))) - ;; If this method was previously denied, we just return nil. - (if (eq (nth 1 elem) 'denied) - (progn - (gnus-message 1 "Denied server") - nil) - ;; Open the server. - (let ((result - (funcall (gnus-get-function gnus-command-method 'open-server) - (nth 1 gnus-command-method) - (nthcdr 2 gnus-command-method)))) - ;; If this hasn't been opened before, we add it to the list. - (unless elem - (setq elem (list gnus-command-method nil) - gnus-opened-servers (cons elem gnus-opened-servers))) - ;; Set the status of this server. - (setcar (cdr elem) (if result 'ok 'denied)) - ;; Return the result from the "open" call. - result)))) - -(defun gnus-close-server (gnus-command-method) - "Close the connection to GNUS-COMMAND-METHOD." - (when (stringp gnus-command-method) - (setq gnus-command-method (gnus-server-to-method gnus-command-method))) - (funcall (gnus-get-function gnus-command-method 'close-server) - (nth 1 gnus-command-method))) - -(defun gnus-request-list (gnus-command-method) - "Request the active file from GNUS-COMMAND-METHOD." - (when (stringp gnus-command-method) - (setq gnus-command-method (gnus-server-to-method gnus-command-method))) - (funcall (gnus-get-function gnus-command-method 'request-list) - (nth 1 gnus-command-method))) - -(defun gnus-request-list-newsgroups (gnus-command-method) - "Request the newsgroups file from GNUS-COMMAND-METHOD." - (when (stringp gnus-command-method) - (setq gnus-command-method (gnus-server-to-method gnus-command-method))) - (funcall (gnus-get-function gnus-command-method 'request-list-newsgroups) - (nth 1 gnus-command-method))) - -(defun gnus-request-newgroups (date gnus-command-method) - "Request all new groups since DATE from GNUS-COMMAND-METHOD." - (when (stringp gnus-command-method) - (setq gnus-command-method (gnus-server-to-method gnus-command-method))) - (let ((func (gnus-get-function gnus-command-method 'request-newgroups t))) - (when func - (funcall func date (nth 1 gnus-command-method))))) - -(defun gnus-server-opened (gnus-command-method) - "Check whether a connection to GNUS-COMMAND-METHOD has been opened." - (unless (eq (gnus-server-status gnus-command-method) - 'denied) - (when (stringp gnus-command-method) - (setq gnus-command-method (gnus-server-to-method gnus-command-method))) - (funcall (inline (gnus-get-function gnus-command-method 'server-opened)) - (nth 1 gnus-command-method)))) - -(defun gnus-status-message (gnus-command-method) - "Return the status message from GNUS-COMMAND-METHOD. -If GNUS-COMMAND-METHOD is a string, it is interpreted as a group name. The method -this group uses will be queried." - (let ((gnus-command-method - (if (stringp gnus-command-method) - (gnus-find-method-for-group gnus-command-method) - gnus-command-method))) - (funcall (gnus-get-function gnus-command-method 'status-message) - (nth 1 gnus-command-method)))) - -(defun gnus-request-regenerate (gnus-command-method) - "Request a data generation from GNUS-COMMAND-METHOD." - (when (stringp gnus-command-method) - (setq gnus-command-method (gnus-server-to-method gnus-command-method))) - (funcall (gnus-get-function gnus-command-method 'request-regenerate) - (nth 1 gnus-command-method))) - -(defun gnus-request-group (group &optional dont-check gnus-command-method) - "Request GROUP. If DONT-CHECK, no information is required." - (let ((gnus-command-method - (or gnus-command-method (inline (gnus-find-method-for-group group))))) - (when (stringp gnus-command-method) - (setq gnus-command-method - (inline (gnus-server-to-method gnus-command-method)))) - (funcall (inline (gnus-get-function gnus-command-method 'request-group)) - (gnus-group-real-name group) (nth 1 gnus-command-method) - dont-check))) - -(defun gnus-list-active-group (group) - "Request active information on GROUP." - (let ((gnus-command-method (gnus-find-method-for-group group)) - (func 'list-active-group)) - (when (gnus-check-backend-function func group) - (funcall (gnus-get-function gnus-command-method func) - (gnus-group-real-name group) (nth 1 gnus-command-method))))) - -(defun gnus-request-group-description (group) - "Request a description of GROUP." - (let ((gnus-command-method (gnus-find-method-for-group group)) - (func 'request-group-description)) - (when (gnus-check-backend-function func group) - (funcall (gnus-get-function gnus-command-method func) - (gnus-group-real-name group) (nth 1 gnus-command-method))))) - -(defun gnus-request-group-articles (group) - "Request a list of existing articles in GROUP." - (let ((gnus-command-method (gnus-find-method-for-group group)) - (func 'request-group-articles)) - (when (gnus-check-backend-function func group) - (funcall (gnus-get-function gnus-command-method func) - (gnus-group-real-name group) (nth 1 gnus-command-method))))) - -(defun gnus-close-group (group) - "Request the GROUP be closed." - (let ((gnus-command-method (inline (gnus-find-method-for-group group)))) - (funcall (gnus-get-function gnus-command-method 'close-group) - (gnus-group-real-name group) (nth 1 gnus-command-method)))) - -(defun gnus-retrieve-headers (articles group &optional fetch-old) - "Request headers for ARTICLES in GROUP. -If FETCH-OLD, retrieve all headers (or some subset thereof) in the group." - (let ((gnus-command-method (gnus-find-method-for-group group))) - (if (and gnus-use-cache (numberp (car articles))) - (gnus-cache-retrieve-headers articles group fetch-old) - (funcall (gnus-get-function gnus-command-method 'retrieve-headers) - articles (gnus-group-real-name group) - (nth 1 gnus-command-method) fetch-old)))) - -(defun gnus-retrieve-articles (articles group) - "Request ARTICLES in GROUP." - (let ((gnus-command-method (gnus-find-method-for-group group))) - (funcall (gnus-get-function gnus-command-method 'retrieve-articles) - articles (gnus-group-real-name group) - (nth 1 gnus-command-method)))) - -(defun gnus-retrieve-groups (groups gnus-command-method) - "Request active information on GROUPS from GNUS-COMMAND-METHOD." - (when (stringp gnus-command-method) - (setq gnus-command-method (gnus-server-to-method gnus-command-method))) - (funcall (gnus-get-function gnus-command-method 'retrieve-groups) - groups (nth 1 gnus-command-method))) - -(defun gnus-request-type (group &optional article) - "Return the type (`post' or `mail') of GROUP (and ARTICLE)." - (let ((gnus-command-method (gnus-find-method-for-group group))) - (if (not (gnus-check-backend-function - 'request-type (car gnus-command-method))) - 'unknown - (funcall (gnus-get-function gnus-command-method 'request-type) - (gnus-group-real-name group) article)))) - -(defun gnus-request-set-mark (group action) - "Set marks on articles in the backend." - (let ((gnus-command-method (gnus-find-method-for-group group))) - (if (not (gnus-check-backend-function - 'request-set-mark (car gnus-command-method))) - action - (funcall (gnus-get-function gnus-command-method 'request-set-mark) - (gnus-group-real-name group) action - (nth 1 gnus-command-method))))) - -(defun gnus-request-update-mark (group article mark) - "Allow the backend to change the mark the user tries to put on an article." - (let ((gnus-command-method (gnus-find-method-for-group group))) - (if (not (gnus-check-backend-function - 'request-update-mark (car gnus-command-method))) - mark - (funcall (gnus-get-function gnus-command-method 'request-update-mark) - (gnus-group-real-name group) article mark)))) - -(defun gnus-request-article (article group &optional buffer) - "Request the ARTICLE in GROUP. -ARTICLE can either be an article number or an article Message-ID. -If BUFFER, insert the article in that group." - (let ((gnus-command-method (gnus-find-method-for-group group))) - (funcall (gnus-get-function gnus-command-method 'request-article) - article (gnus-group-real-name group) - (nth 1 gnus-command-method) buffer))) - -(defun gnus-request-head (article group) - "Request the head of ARTICLE in GROUP." - (let* ((gnus-command-method (gnus-find-method-for-group group)) - (head (gnus-get-function gnus-command-method 'request-head t)) - res clean-up) - (cond - ;; Check the cache. - ((and gnus-use-cache - (numberp article) - (gnus-cache-request-article article group)) - (setq res (cons group article) - clean-up t)) - ;; Use `head' function. - ((fboundp head) - (setq res (funcall head article (gnus-group-real-name group) - (nth 1 gnus-command-method)))) - ;; Use `article' function. - (t - (setq res (gnus-request-article article group) - clean-up t))) - (when clean-up - (save-excursion - (set-buffer nntp-server-buffer) - (goto-char (point-min)) - (when (search-forward "\n\n" nil t) - (delete-region (1- (point)) (point-max))) - (nnheader-fold-continuation-lines))) - res)) - -(defun gnus-request-body (article group) - "Request the body of ARTICLE in GROUP." - (let* ((gnus-command-method (gnus-find-method-for-group group)) - (head (gnus-get-function gnus-command-method 'request-body t)) - res clean-up) - (cond - ;; Check the cache. - ((and gnus-use-cache - (numberp article) - (gnus-cache-request-article article group)) - (setq res (cons group article) - clean-up t)) - ;; Use `head' function. - ((fboundp head) - (setq res (funcall head article (gnus-group-real-name group) - (nth 1 gnus-command-method)))) - ;; Use `article' function. - (t - (setq res (gnus-request-article article group) - clean-up t))) - (when clean-up - (save-excursion - (set-buffer nntp-server-buffer) - (goto-char (point-min)) - (when (search-forward "\n\n" nil t) - (delete-region (point-min) (1- (point)))))) - res)) - -(defun gnus-request-post (gnus-command-method) - "Post the current buffer using GNUS-COMMAND-METHOD." - (when (stringp gnus-command-method) - (setq gnus-command-method (gnus-server-to-method gnus-command-method))) - (funcall (gnus-get-function gnus-command-method 'request-post) - (nth 1 gnus-command-method))) - -(defun gnus-request-scan (group gnus-command-method) - "Request a SCAN being performed in GROUP from GNUS-COMMAND-METHOD. -If GROUP is nil, all groups on GNUS-COMMAND-METHOD are scanned." - (let ((gnus-command-method - (if group (gnus-find-method-for-group group) gnus-command-method)) - (gnus-inhibit-demon t) - (mail-source-plugged gnus-plugged)) - (if (or gnus-plugged (not (gnus-agent-method-p gnus-command-method))) - (funcall (gnus-get-function gnus-command-method 'request-scan) - (and group (gnus-group-real-name group)) - (nth 1 gnus-command-method))))) - -(defsubst gnus-request-update-info (info gnus-command-method) - "Request that GNUS-COMMAND-METHOD update INFO." - (when (stringp gnus-command-method) - (setq gnus-command-method (gnus-server-to-method gnus-command-method))) - (when (gnus-check-backend-function - 'request-update-info (car gnus-command-method)) - (funcall (gnus-get-function gnus-command-method 'request-update-info) - (gnus-group-real-name (gnus-info-group info)) - info (nth 1 gnus-command-method)))) - -(defun gnus-request-expire-articles (articles group &optional force) - (let ((gnus-command-method (gnus-find-method-for-group group))) - (funcall (gnus-get-function gnus-command-method 'request-expire-articles) - articles (gnus-group-real-name group) (nth 1 gnus-command-method) - force))) - -(defun gnus-request-move-article - (article group server accept-function &optional last) - (let ((gnus-command-method (gnus-find-method-for-group group))) - (funcall (gnus-get-function gnus-command-method 'request-move-article) - article (gnus-group-real-name group) - (nth 1 gnus-command-method) accept-function last))) - -(defun gnus-request-accept-article (group &optional gnus-command-method last - no-encode) - ;; Make sure there's a newline at the end of the article. - (when (stringp gnus-command-method) - (setq gnus-command-method (gnus-server-to-method gnus-command-method))) - (when (and (not gnus-command-method) - (stringp group)) - (setq gnus-command-method (gnus-group-name-to-method group))) - (goto-char (point-max)) - (unless (bolp) - (insert "\n")) - (let ((func (car (or gnus-command-method - (gnus-find-method-for-group group))))) - (funcall (intern (format "%s-request-accept-article" func)) - (if (stringp group) (gnus-group-real-name group) group) - (cadr gnus-command-method) - last))) - -(defun gnus-request-replace-article (article group buffer &optional no-encode) - (let ((func (car (gnus-group-name-to-method group)))) - (funcall (intern (format "%s-request-replace-article" func)) - article (gnus-group-real-name group) buffer))) - -(defun gnus-request-associate-buffer (group) - (let ((gnus-command-method (gnus-find-method-for-group group))) - (funcall (gnus-get-function gnus-command-method 'request-associate-buffer) - (gnus-group-real-name group)))) - -(defun gnus-request-restore-buffer (article group) - "Request a new buffer restored to the state of ARTICLE." - (let ((gnus-command-method (gnus-find-method-for-group group))) - (funcall (gnus-get-function gnus-command-method 'request-restore-buffer) - article (gnus-group-real-name group) - (nth 1 gnus-command-method)))) - -(defun gnus-request-create-group (group &optional gnus-command-method args) - (when (stringp gnus-command-method) - (setq gnus-command-method (gnus-server-to-method gnus-command-method))) - (let ((gnus-command-method - (or gnus-command-method (gnus-find-method-for-group group)))) - (funcall (gnus-get-function gnus-command-method 'request-create-group) - (gnus-group-real-name group) (nth 1 gnus-command-method) args))) - -(defun gnus-request-delete-group (group &optional force) - (let ((gnus-command-method (gnus-find-method-for-group group))) - (funcall (gnus-get-function gnus-command-method 'request-delete-group) - (gnus-group-real-name group) force (nth 1 gnus-command-method)))) - -(defun gnus-request-rename-group (group new-name) - (let ((gnus-command-method (gnus-find-method-for-group group))) - (funcall (gnus-get-function gnus-command-method 'request-rename-group) - (gnus-group-real-name group) - (gnus-group-real-name new-name) (nth 1 gnus-command-method)))) - -(defun gnus-close-backends () - ;; Send a close request to all backends that support such a request. - (let ((methods gnus-valid-select-methods) - (gnus-inhibit-demon t) - func gnus-command-method) - (while (setq gnus-command-method (pop methods)) - (when (fboundp (setq func (intern - (concat (car gnus-command-method) - "-request-close")))) - (funcall func))))) - -(defun gnus-asynchronous-p (gnus-command-method) - (let ((func (gnus-get-function gnus-command-method 'asynchronous-p t))) - (when (fboundp func) - (funcall func)))) - -(defun gnus-remove-denial (gnus-command-method) - (when (stringp gnus-command-method) - (setq gnus-command-method (gnus-server-to-method gnus-command-method))) - (let* ((elem (assoc gnus-command-method gnus-opened-servers)) - (status (cadr elem))) - ;; If this hasn't been opened before, we add it to the list. - (when (eq status 'denied) - ;; Set the status of this server. - (setcar (cdr elem) 'closed)))) - -(provide 'gnus-int) - -;;; gnus-int.el ends here diff --git a/lisp/gnus-kill.el b/lisp/gnus-kill.el deleted file mode 100644 index 1ead0ac..0000000 --- a/lisp/gnus-kill.el +++ /dev/null @@ -1,730 +0,0 @@ -;;; gnus-kill.el --- kill commands for Gnus -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Masanobu UMEDA -;; Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus) -(require 'gnus-art) -(require 'gnus-range) - -(defcustom gnus-kill-file-mode-hook nil - "Hook for Gnus kill file mode." - :group 'gnus-score-kill - :type 'hook) - -(defcustom gnus-kill-expiry-days 7 - "*Number of days before expiring unused kill file entries." - :group 'gnus-score-kill - :group 'gnus-score-expire - :type 'integer) - -(defcustom gnus-kill-save-kill-file nil - "*If non-nil, will save kill files after processing them." - :group 'gnus-score-kill - :type 'boolean) - -(defcustom gnus-winconf-kill-file nil - "What does this do, Lars? -I don't know, Per." - :group 'gnus-score-kill - :type 'sexp) - -(defcustom gnus-kill-killed t - "*If non-nil, Gnus will apply kill files to already killed articles. -If it is nil, Gnus will never apply kill files to articles that have -already been through the scoring process, which might very well save lots -of time." - :group 'gnus-score-kill - :type 'boolean) - - - -(defmacro gnus-raise (field expression level) - `(gnus-kill ,field ,expression - (function (gnus-summary-raise-score ,level)) t)) - -(defmacro gnus-lower (field expression level) - `(gnus-kill ,field ,expression - (function (gnus-summary-raise-score (- ,level))) t)) - -;;; -;;; Gnus Kill File Mode -;;; - -(defvar gnus-kill-file-mode-map nil) - -(unless gnus-kill-file-mode-map - (gnus-define-keymap (setq gnus-kill-file-mode-map - (copy-keymap emacs-lisp-mode-map)) - "\C-c\C-k\C-s" gnus-kill-file-kill-by-subject - "\C-c\C-k\C-a" gnus-kill-file-kill-by-author - "\C-c\C-k\C-t" gnus-kill-file-kill-by-thread - "\C-c\C-k\C-x" gnus-kill-file-kill-by-xref - "\C-c\C-a" gnus-kill-file-apply-buffer - "\C-c\C-e" gnus-kill-file-apply-last-sexp - "\C-c\C-c" gnus-kill-file-exit)) - -(defun gnus-kill-file-mode () - "Major mode for editing kill files. - -If you are using this mode - you probably shouldn't. Kill files -perform badly and paint with a pretty broad brush. Score files, on -the other hand, are vastly faster (40x speedup) and give you more -control over what to do. - -In addition to Emacs-Lisp Mode, the following commands are available: - -\\{gnus-kill-file-mode-map} - - A kill file contains Lisp expressions to be applied to a selected -newsgroup. The purpose is to mark articles as read on the basis of -some set of regexps. A global kill file is applied to every newsgroup, -and a local kill file is applied to a specified newsgroup. Since a -global kill file is applied to every newsgroup, for better performance -use a local one. - - A kill file can contain any kind of Emacs Lisp expressions expected -to be evaluated in the Summary buffer. Writing Lisp programs for this -purpose is not so easy because the internal working of Gnus must be -well-known. For this reason, Gnus provides a general function which -does this easily for non-Lisp programmers. - - The `gnus-kill' function executes commands available in Summary Mode -by their key sequences. `gnus-kill' should be called with FIELD, -REGEXP and optional COMMAND and ALL. FIELD is a string representing -the header field or an empty string. If FIELD is an empty string, the -entire article body is searched for. REGEXP is a string which is -compared with FIELD value. COMMAND is a string representing a valid -key sequence in Summary mode or Lisp expression. COMMAND defaults to -'(gnus-summary-mark-as-read nil \"X\"). Make sure that COMMAND is -executed in the Summary buffer. If the second optional argument ALL -is non-nil, the COMMAND is applied to articles which are already -marked as read or unread. Articles which are marked are skipped over -by default. - - For example, if you want to mark articles of which subjects contain -the string `AI' as read, a possible kill file may look like: - - (gnus-kill \"Subject\" \"AI\") - - If you want to mark articles with `D' instead of `X', you can use -the following expression: - - (gnus-kill \"Subject\" \"AI\" \"d\") - -In this example it is assumed that the command -`gnus-summary-mark-as-read-forward' is assigned to `d' in Summary Mode. - - It is possible to delete unnecessary headers which are marked with -`X' in a kill file as follows: - - (gnus-expunge \"X\") - - If the Summary buffer is empty after applying kill files, Gnus will -exit the selected newsgroup normally. If headers which are marked -with `D' are deleted in a kill file, it is impossible to read articles -which are marked as read in the previous Gnus sessions. Marks other -than `D' should be used for articles which should really be deleted. - -Entry to this mode calls emacs-lisp-mode-hook and -gnus-kill-file-mode-hook with no arguments, if that value is non-nil." - (interactive) - (kill-all-local-variables) - (use-local-map gnus-kill-file-mode-map) - (set-syntax-table emacs-lisp-mode-syntax-table) - (setq major-mode 'gnus-kill-file-mode) - (setq mode-name "Kill") - (lisp-mode-variables nil) - (gnus-run-hooks 'emacs-lisp-mode-hook 'gnus-kill-file-mode-hook)) - -(defun gnus-kill-file-edit-file (newsgroup) - "Begin editing a kill file for NEWSGROUP. -If NEWSGROUP is nil, the global kill file is selected." - (interactive "sNewsgroup: ") - (let ((file (gnus-newsgroup-kill-file newsgroup))) - (gnus-make-directory (file-name-directory file)) - ;; Save current window configuration if this is first invocation. - (or (and (get-file-buffer file) - (get-buffer-window (get-file-buffer file))) - (setq gnus-winconf-kill-file (current-window-configuration))) - ;; Hack windows. - (let ((buffer (find-file-noselect file))) - (cond ((get-buffer-window buffer) - (pop-to-buffer buffer)) - ((eq major-mode 'gnus-group-mode) - (gnus-configure-windows 'group) ;Take all windows. - (pop-to-buffer buffer)) - ((eq major-mode 'gnus-summary-mode) - (gnus-configure-windows 'article) - (pop-to-buffer gnus-article-buffer) - (bury-buffer gnus-article-buffer) - (switch-to-buffer buffer)) - (t ;No good rules. - (find-file-other-window file)))) - (gnus-kill-file-mode))) - -;; Fix by Sudish Joseph . -(defun gnus-kill-set-kill-buffer () - (let* ((file (gnus-newsgroup-kill-file gnus-newsgroup-name)) - (buffer (find-file-noselect file))) - (set-buffer buffer) - (gnus-kill-file-mode) - (bury-buffer buffer))) - -(defun gnus-kill-file-enter-kill (field regexp &optional dont-move) - ;; Enter kill file entry. - ;; FIELD: String containing the name of the header field to kill. - ;; REGEXP: The string to kill. - (save-excursion - (let (string) - (unless (eq major-mode 'gnus-kill-file-mode) - (gnus-kill-set-kill-buffer)) - (unless dont-move - (goto-char (point-max))) - (insert (setq string (format "(gnus-kill %S %S)\n" field regexp))) - (gnus-kill-file-apply-string string)))) - -(defun gnus-kill-file-kill-by-subject () - "Kill by subject." - (interactive) - (gnus-kill-file-enter-kill - "Subject" - (if (vectorp gnus-current-headers) - (regexp-quote - (gnus-simplify-subject (mail-header-subject gnus-current-headers))) - "") - t)) - -(defun gnus-kill-file-kill-by-author () - "Kill by author." - (interactive) - (gnus-kill-file-enter-kill - "From" - (if (vectorp gnus-current-headers) - (regexp-quote (mail-header-from gnus-current-headers)) - "") t)) - -(defun gnus-kill-file-kill-by-thread () - "Kill by author." - (interactive) - (gnus-kill-file-enter-kill - "References" - (if (vectorp gnus-current-headers) - (regexp-quote (mail-header-id gnus-current-headers)) - ""))) - -(defun gnus-kill-file-kill-by-xref () - "Kill by Xref." - (interactive) - (let ((xref (and (vectorp gnus-current-headers) - (mail-header-xref gnus-current-headers))) - (start 0) - group) - (if xref - (while (string-match " \\([^ \t]+\\):" xref start) - (setq start (match-end 0)) - (when (not (string= - (setq group - (substring xref (match-beginning 1) (match-end 1))) - gnus-newsgroup-name)) - (gnus-kill-file-enter-kill - "Xref" (concat " " (regexp-quote group) ":") t))) - (gnus-kill-file-enter-kill "Xref" "" t)))) - -(defun gnus-kill-file-raise-followups-to-author (level) - "Raise score for all followups to the current author." - (interactive "p") - (let ((name (mail-header-from gnus-current-headers)) - string) - (save-excursion - (gnus-kill-set-kill-buffer) - (goto-char (point-min)) - (setq name (read-string (concat "Add " level - " to followup articles to: ") - (regexp-quote name))) - (setq - string - (format - "(gnus-kill %S %S '(gnus-summary-temporarily-raise-by-thread %S))\n" - "From" name level)) - (insert string) - (gnus-kill-file-apply-string string)) - (gnus-message - 6 "Added temporary score file entry for followups to %s." name))) - -(defun gnus-kill-file-apply-buffer () - "Apply current buffer to current newsgroup." - (interactive) - (if (and gnus-current-kill-article - (get-buffer gnus-summary-buffer)) - ;; Assume newsgroup is selected. - (gnus-kill-file-apply-string (buffer-string)) - (ding) (gnus-message 2 "No newsgroup is selected."))) - -(defun gnus-kill-file-apply-string (string) - "Apply STRING to current newsgroup." - (interactive) - (let ((string (concat "(progn \n" string "\n)"))) - (save-excursion - (save-window-excursion - (pop-to-buffer gnus-summary-buffer) - (eval (car (read-from-string string))))))) - -(defun gnus-kill-file-apply-last-sexp () - "Apply sexp before point in current buffer to current newsgroup." - (interactive) - (if (and gnus-current-kill-article - (get-buffer gnus-summary-buffer)) - ;; Assume newsgroup is selected. - (let ((string - (buffer-substring - (save-excursion (forward-sexp -1) (point)) (point)))) - (save-excursion - (save-window-excursion - (pop-to-buffer gnus-summary-buffer) - (eval (car (read-from-string string)))))) - (ding) (gnus-message 2 "No newsgroup is selected."))) - -(defun gnus-kill-file-exit () - "Save a kill file, then return to the previous buffer." - (interactive) - (save-buffer) - (let ((killbuf (current-buffer))) - ;; We don't want to return to article buffer. - (when (get-buffer gnus-article-buffer) - (bury-buffer gnus-article-buffer)) - ;; Delete the KILL file windows. - (delete-windows-on killbuf) - ;; Restore last window configuration if available. - (when gnus-winconf-kill-file - (set-window-configuration gnus-winconf-kill-file)) - (setq gnus-winconf-kill-file nil) - ;; Kill the KILL file buffer. Suggested by tale@pawl.rpi.edu. - (kill-buffer killbuf))) - -;; For kill files - -(defun gnus-Newsgroup-kill-file (newsgroup) - "Return the name of a kill file for NEWSGROUP. -If NEWSGROUP is nil, return the global kill file instead." - (cond ((or (null newsgroup) - (string-equal newsgroup "")) - ;; The global kill file is placed at top of the directory. - (expand-file-name gnus-kill-file-name gnus-kill-files-directory)) - (gnus-use-long-file-name - ;; Append ".KILL" to capitalized newsgroup name. - (expand-file-name (concat (gnus-capitalize-newsgroup newsgroup) - "." gnus-kill-file-name) - gnus-kill-files-directory)) - (t - ;; Place "KILL" under the hierarchical directory. - (expand-file-name (concat (gnus-newsgroup-directory-form newsgroup) - "/" gnus-kill-file-name) - gnus-kill-files-directory)))) - -(defun gnus-expunge (marks) - "Remove lines marked with MARKS." - (save-excursion - (set-buffer gnus-summary-buffer) - (gnus-summary-limit-to-marks marks 'reverse))) - -(defun gnus-apply-kill-file-unless-scored () - "Apply .KILL file, unless a .SCORE file for the same newsgroup exists." - (cond ((file-exists-p (gnus-score-file-name gnus-newsgroup-name)) - ;; Ignores global KILL. - (when (file-exists-p (gnus-newsgroup-kill-file gnus-newsgroup-name)) - (gnus-message 3 "Note: Ignoring %s.KILL; preferring .SCORE" - gnus-newsgroup-name)) - 0) - ((or (file-exists-p (gnus-newsgroup-kill-file nil)) - (file-exists-p (gnus-newsgroup-kill-file gnus-newsgroup-name))) - (gnus-apply-kill-file-internal)) - (t - 0))) - -(defun gnus-apply-kill-file-internal () - "Apply a kill file to the current newsgroup. -Returns the number of articles marked as read." - (let* ((kill-files (list (gnus-newsgroup-kill-file nil) - (gnus-newsgroup-kill-file gnus-newsgroup-name))) - (unreads (length gnus-newsgroup-unreads)) - (gnus-summary-inhibit-highlight t) - beg) - (setq gnus-newsgroup-kill-headers nil) - ;; If there are any previously scored articles, we remove these - ;; from the `gnus-newsgroup-headers' list that the score functions - ;; will see. This is probably pretty wasteful when it comes to - ;; conses, but is, I think, faster than having to assq in every - ;; single score function. - (let ((files kill-files)) - (while files - (if (file-exists-p (car files)) - (let ((headers gnus-newsgroup-headers)) - (if gnus-kill-killed - (setq gnus-newsgroup-kill-headers - (mapcar (lambda (header) (mail-header-number header)) - headers)) - (while headers - (unless (gnus-member-of-range - (mail-header-number (car headers)) - gnus-newsgroup-killed) - (push (mail-header-number (car headers)) - gnus-newsgroup-kill-headers)) - (setq headers (cdr headers)))) - (setq files nil)) - (setq files (cdr files))))) - (if (not gnus-newsgroup-kill-headers) - () - (save-window-excursion - (save-excursion - (while kill-files - (if (not (file-exists-p (car kill-files))) - () - (gnus-message 6 "Processing kill file %s..." (car kill-files)) - (find-file (car kill-files)) - (goto-char (point-min)) - - (if (consp (ignore-errors (read (current-buffer)))) - (gnus-kill-parse-gnus-kill-file) - (gnus-kill-parse-rn-kill-file)) - - (gnus-message - 6 "Processing kill file %s...done" (car kill-files))) - (setq kill-files (cdr kill-files))))) - - (gnus-set-mode-line 'summary) - - (if beg - (let ((nunreads (- unreads (length gnus-newsgroup-unreads)))) - (or (eq nunreads 0) - (gnus-message 6 "Marked %d articles as read" nunreads)) - nunreads) - 0)))) - -;; Parse a Gnus killfile. -(defun gnus-score-insert-help (string alist idx) - (save-excursion - (pop-to-buffer "*Score Help*") - (buffer-disable-undo) - (erase-buffer) - (insert string ":\n\n") - (while alist - (insert (format " %c: %s\n" (caar alist) (nth idx (car alist)))) - (setq alist (cdr alist))))) - -(defun gnus-kill-parse-gnus-kill-file () - (goto-char (point-min)) - (gnus-kill-file-mode) - (let (beg form) - (while (progn - (setq beg (point)) - (setq form (ignore-errors (read (current-buffer))))) - (unless (listp form) - (error "Invalid kill entry (possibly rn kill file?): %s" form)) - (if (or (eq (car form) 'gnus-kill) - (eq (car form) 'gnus-raise) - (eq (car form) 'gnus-lower)) - (progn - (delete-region beg (point)) - (insert (or (eval form) ""))) - (save-excursion - (set-buffer gnus-summary-buffer) - (ignore-errors (eval form))))) - (and (buffer-modified-p) - gnus-kill-save-kill-file - (save-buffer)) - (set-buffer-modified-p nil))) - -;; Parse an rn killfile. -(defun gnus-kill-parse-rn-kill-file () - (goto-char (point-min)) - (gnus-kill-file-mode) - (let ((mod-to-header - '((?a . "") - (?h . "") - (?f . "from") - (?: . "subject"))) - ;;(com-to-com - ;; '((?m . " ") - ;; (?j . "X"))) - pattern modifier commands) - (while (not (eobp)) - (if (not (looking-at "[ \t]*/\\([^/]*\\)/\\([ahfcH]\\)?:\\([a-z=:]*\\)")) - () - (setq pattern (buffer-substring (match-beginning 1) (match-end 1))) - (setq modifier (if (match-beginning 2) (char-after (match-beginning 2)) - ?s)) - (setq commands (buffer-substring (match-beginning 3) (match-end 3))) - - ;; The "f:+" command marks everything *but* the matches as read, - ;; so we simply first match everything as read, and then unmark - ;; PATTERN later. - (when (string-match "\\+" commands) - (gnus-kill "from" ".") - (setq commands "m")) - - (gnus-kill - (or (cdr (assq modifier mod-to-header)) "subject") - pattern - (if (string-match "m" commands) - '(gnus-summary-mark-as-unread nil " ") - '(gnus-summary-mark-as-read nil "X")) - nil t)) - (forward-line 1)))) - -;; Kill changes and new format by suggested by JWZ and Sudish Joseph -;; . -(defun gnus-kill (field regexp &optional exe-command all silent) - "If FIELD of an article matches REGEXP, execute COMMAND. -Optional 1st argument COMMAND is default to - (gnus-summary-mark-as-read nil \"X\"). -If optional 2nd argument ALL is non-nil, articles marked are also applied to. -If FIELD is an empty string (or nil), entire article body is searched for. -COMMAND must be a lisp expression or a string representing a key sequence." - ;; We don't want to change current point nor window configuration. - (let ((old-buffer (current-buffer))) - (save-excursion - (save-window-excursion - ;; Selected window must be summary buffer to execute keyboard - ;; macros correctly. See command_loop_1. - (switch-to-buffer gnus-summary-buffer 'norecord) - (goto-char (point-min)) ;From the beginning. - (let ((kill-list regexp) - (date (current-time-string)) - (command (or exe-command '(gnus-summary-mark-as-read - nil gnus-kill-file-mark))) - kill kdate prev) - (if (listp kill-list) - ;; It is a list. - (if (not (consp (cdr kill-list))) - ;; It's of the form (regexp . date). - (if (zerop (gnus-execute field (car kill-list) - command nil (not all))) - (when (> (days-between date (cdr kill-list)) - gnus-kill-expiry-days) - (setq regexp nil)) - (setcdr kill-list date)) - (while (setq kill (car kill-list)) - (if (consp kill) - ;; It's a temporary kill. - (progn - (setq kdate (cdr kill)) - (if (zerop (gnus-execute - field (car kill) command nil (not all))) - (when (> (days-between date kdate) - gnus-kill-expiry-days) - ;; Time limit has been exceeded, so we - ;; remove the match. - (if prev - (setcdr prev (cdr kill-list)) - (setq regexp (cdr regexp)))) - ;; Successful kill. Set the date to today. - (setcdr kill date))) - ;; It's a permanent kill. - (gnus-execute field kill command nil (not all))) - (setq prev kill-list) - (setq kill-list (cdr kill-list)))) - (gnus-execute field kill-list command nil (not all)))))) - (switch-to-buffer old-buffer) - (when (and (eq major-mode 'gnus-kill-file-mode) regexp (not silent)) - (gnus-pp-gnus-kill - (nconc (list 'gnus-kill field - (if (consp regexp) (list 'quote regexp) regexp)) - (when (or exe-command all) - (list (list 'quote exe-command))) - (if all (list t) nil)))))) - -(defun gnus-pp-gnus-kill (object) - (if (or (not (consp (nth 2 object))) - (not (consp (cdr (nth 2 object)))) - (and (eq 'quote (car (nth 2 object))) - (not (consp (cdadr (nth 2 object)))))) - (concat "\n" (gnus-prin1-to-string object)) - (save-excursion - (set-buffer (gnus-get-buffer-create "*Gnus PP*")) - (buffer-disable-undo) - (erase-buffer) - (insert (format "\n(%S %S\n '(" (nth 0 object) (nth 1 object))) - (let ((klist (cadr (nth 2 object))) - (first t)) - (while klist - (insert (if first (progn (setq first nil) "") "\n ") - (gnus-prin1-to-string (car klist))) - (setq klist (cdr klist)))) - (insert ")") - (and (nth 3 object) - (insert "\n " - (if (and (consp (nth 3 object)) - (not (eq 'quote (car (nth 3 object))))) - "'" "") - (gnus-prin1-to-string (nth 3 object)))) - (when (nth 4 object) - (insert "\n t")) - (insert ")") - (prog1 - (buffer-substring (point-min) (point-max)) - (kill-buffer (current-buffer)))))) - -(defun gnus-execute-1 (function regexp form header) - (save-excursion - (let (did-kill) - (if (null header) - nil ;Nothing to do. - (if function - ;; Compare with header field. - (let (value) - (and header - (progn - (setq value (funcall function header)) - ;; Number (Lines:) or symbol must be converted to string. - (unless (stringp value) - (setq value (gnus-prin1-to-string value))) - (setq did-kill (string-match regexp value))) - (cond ((stringp form) ;Keyboard macro. - (execute-kbd-macro form)) - ((gnus-functionp form) - (funcall form)) - (t - (eval form))))) - ;; Search article body. - (let ((gnus-current-article nil) ;Save article pointer. - (gnus-last-article nil) - (gnus-break-pages nil) ;No need to break pages. - (gnus-mark-article-hook nil)) ;Inhibit marking as read. - (gnus-message - 6 "Searching for article: %d..." (mail-header-number header)) - (gnus-article-setup-buffer) - (gnus-article-prepare (mail-header-number header) t) - (when (save-excursion - (set-buffer gnus-article-buffer) - (goto-char (point-min)) - (setq did-kill (re-search-forward regexp nil t))) - (cond ((stringp form) ;Keyboard macro. - (execute-kbd-macro form)) - ((gnus-functionp form) - (funcall form)) - (t - (eval form))))))) - did-kill))) - -(defun gnus-execute (field regexp form &optional backward unread) - "If FIELD of article header matches REGEXP, execute lisp FORM (or a string). -If FIELD is an empty string (or nil), entire article body is searched for. -If optional 1st argument BACKWARD is non-nil, do backward instead. -If optional 2nd argument UNREAD is non-nil, articles which are -marked as read or ticked are ignored." - (save-excursion - (let ((killed-no 0) - function article header extras) - (cond - ;; Search body. - ((or (null field) - (string-equal field "")) - (setq function nil)) - ;; Get access function of header field. - ((cond ((fboundp - (setq function - (intern-soft - (concat "mail-header-" (downcase field))))) - (setq function `(lambda (h) (,function h)))) - ((when (setq extras - (member (downcase field) - (mapcar (lambda (header) - (downcase (symbol-name header))) - gnus-extra-headers))) - (setq function - `(lambda (h) - (gnus-extra-header - (quote ,(nth (- (length gnus-extra-headers) - (length extras)) - gnus-extra-headers)) - h))))))) - ;; Signal error. - (t - (error "Unknown header field: \"%s\"" field))) - ;; Starting from the current article. - (while (or - ;; First article. - (and (not article) - (setq article (gnus-summary-article-number))) - ;; Find later articles. - (setq article - (gnus-summary-search-forward unread nil backward))) - (and (or (null gnus-newsgroup-kill-headers) - (memq article gnus-newsgroup-kill-headers)) - (vectorp (setq header (gnus-summary-article-header article))) - (gnus-execute-1 function regexp form header) - (setq killed-no (1+ killed-no)))) - ;; Return the number of killed articles. - killed-no))) - -;;;###autoload -(defalias 'gnus-batch-kill 'gnus-batch-score) -;;;###autoload -(defun gnus-batch-score () - "Run batched scoring. -Usage: emacs -batch -l ~/.emacs -l gnus -f gnus-batch-score" - (interactive) - (let* ((gnus-newsrc-options-n - (gnus-newsrc-parse-options - (concat "options -n " - (mapconcat 'identity command-line-args-left " ")))) - (gnus-expert-user t) - (nnmail-spool-file nil) - (mail-sources nil) - (gnus-use-dribble-file nil) - (gnus-batch-mode t) - info group newsrc entry - ;; Disable verbose message. - gnus-novice-user gnus-large-newsgroup - gnus-options-subscribe gnus-auto-subscribed-groups - gnus-options-not-subscribe) - ;; Eat all arguments. - (setq command-line-args-left nil) - (gnus-slave) - ;; Apply kills to specified newsgroups in command line arguments. - (setq newsrc (cdr gnus-newsrc-alist)) - (while (setq info (pop newsrc)) - (setq group (gnus-info-group info) - entry (gnus-gethash group gnus-newsrc-hashtb)) - (when (and (<= (gnus-info-level info) gnus-level-subscribed) - (and (car entry) - (or (eq (car entry) t) - (not (zerop (car entry)))))) - (ignore-errors - (gnus-summary-read-group group nil t nil t)) - (when (eq (current-buffer) (get-buffer gnus-summary-buffer)) - (gnus-summary-exit)))) - ;; Exit Emacs. - (switch-to-buffer gnus-group-buffer) - (gnus-group-save-newsrc))) - -(provide 'gnus-kill) - -;;; gnus-kill.el ends here diff --git a/lisp/gnus-logic.el b/lisp/gnus-logic.el deleted file mode 100644 index 9d2c009..0000000 --- a/lisp/gnus-logic.el +++ /dev/null @@ -1,230 +0,0 @@ -;;; gnus-logic.el --- advanced scoring code for Gnus -;; Copyright (C) 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus) -(require 'gnus-score) -(require 'gnus-util) - -;;; Internal variables. - -(defvar gnus-advanced-headers nil) - -;; To avoid having 8-bit characters in the source file. -(defvar gnus-advanced-not (intern (format "%c" 172))) - -(defconst gnus-advanced-index - ;; Name to index alist. - '(("number" 0 gnus-advanced-integer) - ("subject" 1 gnus-advanced-string) - ("from" 2 gnus-advanced-string) - ("date" 3 gnus-advanced-date) - ("message-id" 4 gnus-advanced-string) - ("references" 5 gnus-advanced-string) - ("chars" 6 gnus-advanced-integer) - ("lines" 7 gnus-advanced-integer) - ("xref" 8 gnus-advanced-string) - ("head" nil gnus-advanced-body) - ("body" nil gnus-advanced-body) - ("all" nil gnus-advanced-body))) - -(eval-and-compile - (autoload 'parse-time-string "parse-time")) - -(defun gnus-score-advanced (rule &optional trace) - "Apply advanced scoring RULE to all the articles in the current group." - (let ((headers gnus-newsgroup-headers) - gnus-advanced-headers score) - (while (setq gnus-advanced-headers (pop headers)) - (when (gnus-advanced-score-rule (car rule)) - ;; This rule was successful, so we add the score to - ;; this article. - (if (setq score (assq (mail-header-number gnus-advanced-headers) - gnus-newsgroup-scored)) - (setcdr score - (+ (cdr score) - (or (nth 1 rule) - gnus-score-interactive-default-score))) - (push (cons (mail-header-number gnus-advanced-headers) - (or (nth 1 rule) - gnus-score-interactive-default-score)) - gnus-newsgroup-scored) - (when trace - (push (cons "A file" rule) - gnus-score-trace))))))) - -(defun gnus-advanced-score-rule (rule) - "Apply RULE to `gnus-advanced-headers'." - (let ((type (car rule))) - (cond - ;; "And" rule. - ((or (eq type '&) (eq type 'and)) - (pop rule) - (if (not rule) - t ; Empty rule is true. - (while (and rule - (gnus-advanced-score-rule (car rule))) - (pop rule)) - ;; If all the rules were true, then `rule' should be nil. - (not rule))) - ;; "Or" rule. - ((or (eq type '|) (eq type 'or)) - (pop rule) - (if (not rule) - nil - (while (and rule - (not (gnus-advanced-score-rule (car rule)))) - (pop rule)) - ;; If one of the rules returned true, then `rule' should be non-nil. - rule)) - ;; "Not" rule. - ((or (eq type '!) (eq type 'not) (eq type gnus-advanced-not)) - (not (gnus-advanced-score-rule (nth 1 rule)))) - ;; This is a `1-'-type redirection rule. - ((and (symbolp type) - (string-match "^[0-9]+-$\\|^\\^+$" (symbol-name type))) - (let ((gnus-advanced-headers - (gnus-parent-headers - gnus-advanced-headers - (if (string-match "^\\([0-9]+\\)-$" (symbol-name type)) - ;; 1- type redirection. - (string-to-number - (substring (symbol-name type) - (match-beginning 0) (match-end 0))) - ;; ^^^ type redirection. - (length (symbol-name type)))))) - (when gnus-advanced-headers - (gnus-advanced-score-rule (nth 1 rule))))) - ;; Plain scoring rule. - ((stringp type) - (gnus-advanced-score-article rule)) - ;; Bug-out time! - (t - (error "Unknown advanced score type: %s" rule))))) - -(defun gnus-advanced-score-article (rule) - ;; `rule' is a semi-normal score rule, so we find out - ;; what function that's supposed to do the actual - ;; processing. - (let* ((header (car rule)) - (func (assoc (downcase header) gnus-advanced-index))) - (if (not func) - (error "No such header: %s" rule) - ;; Call the score function. - (funcall (caddr func) (or (cadr func) header) - (cadr rule) (caddr rule))))) - -(defun gnus-advanced-string (index match type) - "See whether string MATCH of TYPE matches `gnus-advanced-headers' in INDEX." - (let* ((type (or type 's)) - (case-fold-search (not (eq (downcase (symbol-name type)) - (symbol-name type)))) - (header (or (aref gnus-advanced-headers index) ""))) - (cond - ((memq type '(r R regexp Regexp)) - (string-match match header)) - ((memq type '(s S string String)) - (string-match (regexp-quote match) header)) - ((memq type '(e E exact Exact)) - (string= match header)) - ((memq type '(f F fuzzy Fuzzy)) - (string-match (regexp-quote (gnus-simplify-subject-fuzzy match)) - header)) - (t - (error "No such string match type: %s" type))))) - -(defun gnus-advanced-integer (index match type) - (if (not (memq type '(< > <= >= =))) - (error "No such integer score type: %s" type) - (funcall type match (or (aref gnus-advanced-headers index) 0)))) - -(defun gnus-advanced-date (index match type) - (let ((date (apply 'encode-time (parse-time-string - (aref gnus-advanced-headers index)))) - (match (apply 'encode-time (parse-time-string match)))) - (cond - ((eq type 'at) - (equal date match)) - ((eq type 'before) - (time-less-p match date)) - ((eq type 'after) - (time-less-p date match)) - (t - (error "No such date score type: %s" type))))) - -(defun gnus-advanced-body (header match type) - (when (string= header "all") - (setq header "article")) - (save-excursion - (set-buffer nntp-server-buffer) - (let* ((request-func (cond ((string= "head" header) - 'gnus-request-head) - ((string= "body" header) - 'gnus-request-body) - (t 'gnus-request-article))) - ofunc article) - ;; Not all backends support partial fetching. In that case, - ;; we just fetch the entire article. - (unless (gnus-check-backend-function - (intern (concat "request-" header)) - gnus-newsgroup-name) - (setq ofunc request-func) - (setq request-func 'gnus-request-article)) - (setq article (mail-header-number gnus-advanced-headers)) - (gnus-message 7 "Scoring article %s..." article) - (when (funcall request-func article gnus-newsgroup-name) - (goto-char (point-min)) - ;; If just parts of the article is to be searched and the - ;; backend didn't support partial fetching, we just narrow - ;; to the relevant parts. - (when ofunc - (if (eq ofunc 'gnus-request-head) - (narrow-to-region - (point) - (or (search-forward "\n\n" nil t) (point-max))) - (narrow-to-region - (or (search-forward "\n\n" nil t) (point)) - (point-max)))) - (let* ((case-fold-search (not (eq (downcase (symbol-name type)) - (symbol-name type)))) - (search-func - (cond ((memq type '(r R regexp Regexp)) - 're-search-forward) - ((memq type '(s S string String)) - 'search-forward) - (t - (error "Invalid match type: %s" type))))) - (goto-char (point-min)) - (prog1 - (funcall search-func match nil t) - (widen))))))) - -(provide 'gnus-logic) - -;;; gnus-logic.el ends here diff --git a/lisp/gnus-mailcap.el b/lisp/gnus-mailcap.el deleted file mode 100644 index 0dae2a9..0000000 --- a/lisp/gnus-mailcap.el +++ /dev/null @@ -1,963 +0,0 @@ -;;; mailcap.el --- MIME media types configuration -;; Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. - -;; Author: William M. Perry -;; Lars Magne Ingebrigtsen -;; Keywords: news, mail, multimedia - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; Provides configuration of MIME media types from directly from Lisp -;; and via the usual mailcap mechanism (RFC 1524). Deals with -;; mime.types similarly. - -;;; Code: - -(eval-when-compile (require 'cl)) -(require 'mail-parse) -(require 'mm-util) - -(defgroup mailcap nil - "Definition of viewers for MIME types." - :version "21.1" - :group 'mime) - -(defvar mailcap-parse-args-syntax-table - (let ((table (copy-syntax-table emacs-lisp-mode-syntax-table))) - (modify-syntax-entry ?' "\"" table) - (modify-syntax-entry ?` "\"" table) - (modify-syntax-entry ?{ "(" table) - (modify-syntax-entry ?} ")" table) - table) - "A syntax table for parsing sgml attributes.") - -;; Postpone using defcustom for this as it's so big and we essentially -;; have to have two copies of the data around then. Perhaps just -;; customize the Lisp viewers and rely on the normal configuration -;; files for the rest? -- fx -(defvar mailcap-mime-data - '(("application" - ("vnd.ms-excel" - (viewer . "gnumeric %s") - (test . (getenv "DISPLAY")) - (type . "application/vnd.ms-excel")) - ("x-x509-ca-cert" - (viewer . ssl-view-site-cert) - (test . (fboundp 'ssl-view-site-cert)) - (type . "application/x-x509-ca-cert")) - ("x-x509-user-cert" - (viewer . ssl-view-user-cert) - (test . (fboundp 'ssl-view-user-cert)) - (type . "application/x-x509-user-cert")) - ("octet-stream" - (viewer . mailcap-save-binary-file) - (non-viewer . t) - (type . "application/octet-stream")) -;;; XEmacs says `ns' device-type not implemented. -;; ("dvi" -;; (viewer . "open %s") -;; (type . "application/dvi") -;; (test . (eq (mm-device-type) 'ns))) - ("dvi" - (viewer . "xdvi %s") - (test . (eq (mm-device-type) 'x)) - ("needsx11") - (type . "application/dvi")) - ("dvi" - (viewer . "dvitty %s") - (test . (not (getenv "DISPLAY"))) - (type . "application/dvi")) - ("emacs-lisp" - (viewer . mailcap-maybe-eval) - (type . "application/emacs-lisp")) - ("x-tar" - (viewer . mailcap-save-binary-file) - (non-viewer . t) - (type . "application/x-tar")) - ("x-latex" - (viewer . tex-mode) - (test . (fboundp 'tex-mode)) - (type . "application/x-latex")) - ("x-tex" - (viewer . tex-mode) - (test . (fboundp 'tex-mode)) - (type . "application/x-tex")) - ("latex" - (viewer . tex-mode) - (test . (fboundp 'tex-mode)) - (type . "application/latex")) - ("tex" - (viewer . tex-mode) - (test . (fboundp 'tex-mode)) - (type . "application/tex")) - ("texinfo" - (viewer . texinfo-mode) - (test . (fboundp 'texinfo-mode)) - (type . "application/tex")) - ("zip" - (viewer . mailcap-save-binary-file) - (non-viewer . t) - (type . "application/zip") - ("copiousoutput")) - ;; Prefer free viewers. - ("pdf" - (viewer . "gv %s") - (type . "application/pdf") - (test . window-system)) - ("pdf" - (viewer . "xpdf %s") - (type . "application/pdf") - (test . (eq (mm-device-type) 'x))) - ("pdf" - (viewer . "acroread %s") - (type . "application/pdf")) -;;; XEmacs says `ns' device-type not implemented. -;; ("postscript" -;; (viewer . "open %s") -;; (type . "application/postscript") -;; (test . (eq (mm-device-type) 'ns))) - ("postscript" - (viewer . "gv -safer %s") - (type . "application/postscript") - (test . window-system) - ("needsx11")) - ("postscript" - (viewer . "ghostview -dSAFER %s") - (type . "application/postscript") - (test . (eq (mm-device-type) 'x)) - ("needsx11")) - ("postscript" - (viewer . "ps2ascii %s") - (type . "application/postscript") - (test . (not (getenv "DISPLAY"))) - ("copiousoutput")) - ("sieve" - (viewer . sieve-mode) - (test . (fboundp 'sieve-mode)) - (type . "application/sieve"))) - ("audio" - ("x-mpeg" - (viewer . "maplay %s") - (type . "audio/x-mpeg")) - (".*" - (viewer . "showaudio") - (type . "audio/*"))) - ("message" - ("rfc-*822" - (viewer . mm-view-message) - (test . (and (featurep 'gnus) - (gnus-alive-p))) - (type . "message/rfc822")) - ("rfc-*822" - (viewer . vm-mode) - (test . (fboundp 'vm-mode)) - (type . "message/rfc822")) - ("rfc-*822" - (viewer . w3-mode) - (test . (fboundp 'w3-mode)) - (type . "message/rfc822")) - ("rfc-*822" - (viewer . view-mode) - (type . "message/rfc822"))) - ("image" - ("x-xwd" - (viewer . "xwud -in %s") - (type . "image/x-xwd") - ("compose" . "xwd -frame > %s") - (test . (eq (mm-device-type) 'x)) - ("needsx11")) - ("x11-dump" - (viewer . "xwud -in %s") - (type . "image/x-xwd") - ("compose" . "xwd -frame > %s") - (test . (eq (mm-device-type) 'x)) - ("needsx11")) - ("windowdump" - (viewer . "xwud -in %s") - (type . "image/x-xwd") - ("compose" . "xwd -frame > %s") - (test . (eq (mm-device-type) 'x)) - ("needsx11")) -;;; XEmacs says `ns' device-type not implemented. -;; (".*" -;; (viewer . "aopen %s") -;; (type . "image/*") -;; (test . (eq (mm-device-type) 'ns))) - (".*" - (viewer . "display %s") - (type . "image/*") - (test . (eq (mm-device-type) 'x)) - ("needsx11")) - (".*" - (viewer . "ee %s") - (type . "image/*") - (test . (eq (mm-device-type) 'x)) - ("needsx11"))) - ("text" - ("plain" - (viewer . w3-mode) - (test . (fboundp 'w3-mode)) - (type . "text/plain")) - ("plain" - (viewer . view-mode) - (test . (fboundp 'view-mode)) - (type . "text/plain")) - ("plain" - (viewer . fundamental-mode) - (type . "text/plain")) - ("enriched" - (viewer . enriched-decode-region) - (test . (fboundp 'enriched-decode)) - (type . "text/enriched")) - ("html" - (viewer . mm-w3-prepare-buffer) - (test . (fboundp 'w3-prepare-buffer)) - (type . "text/html"))) - ("video" - ("mpeg" - (viewer . "mpeg_play %s") - (type . "video/mpeg") - (test . (eq (mm-device-type) 'x)) - ("needsx11"))) - ("x-world" - ("x-vrml" - (viewer . "webspace -remote %s -URL %u") - (type . "x-world/x-vrml") - ("description" - "VRML document"))) - ("archive" - ("tar" - (viewer . tar-mode) - (type . "archive/tar") - (test . (fboundp 'tar-mode))))) - "The mailcap structure is an assoc list of assoc lists. -1st assoc list is keyed on the major content-type -2nd assoc list is keyed on the minor content-type (which can be a regexp) - -Which looks like: ------------------ - ((\"application\" - (\"postscript\" . )) - (\"text\" - (\"plain\" . ))) - -Where is another assoc list of the various information -related to the mailcap RFC 1524. This is keyed on the lowercase -attribute name (viewer, test, etc). This looks like: - ((viewer . VIEWERINFO) - (test . TESTINFO) - (xxxx . \"STRING\") - FLAG) - -Where VIEWERINFO specifies how the content-type is viewed. Can be -a string, in which case it is run through a shell, with -appropriate parameters, or a symbol, in which case the symbol is -`funcall'ed, with the buffer as an argument. - -TESTINFO is a test for the viewer's applicability, or nil. If nil, it -means the viewer is always valid. If it is a Lisp function, it is -called with a list of items from any extra fields from the -Content-Type header as argument to return a boolean value for the -validity. Otherwise, if it is a non-function Lisp symbol or list -whose car is a symbol, it is `eval'led to yield the validity. If it -is a string or list of strings, it represents a shell command to run -to return a true or false shell value for the validity.") - -(defcustom mailcap-download-directory nil - "*Directory to which `mailcap-save-binary-file' downloads files by default. -Nil means your home directory." - :type '(choice (const :tag "Home directory" nil) - directory) - :group 'mailcap) - -(defvar mailcap-poor-system-types - '(ms-dos ms-windows windows-nt win32 w32 mswindows) - "Systems that don't have a Unix-like directory hierarchy.") - -;;; -;;; Utility functions -;;; - -(defun mailcap-save-binary-file () - (goto-char (point-min)) - (unwind-protect - (let ((file (read-file-name - "Filename to save as: " - (or mailcap-download-directory "~/"))) - (require-final-newline nil)) - (write-region (point-min) (point-max) file)) - (kill-buffer (current-buffer)))) - -(defvar mailcap-maybe-eval-warning - "*** WARNING *** - -This MIME part contains untrusted and possibly harmful content. -If you evaluate the Emacs Lisp code contained in it, a lot of nasty -things can happen. Please examine the code very carefully before you -instruct Emacs to evaluate it. You can browse the buffer containing -the code using \\[scroll-other-window]. - -If you are unsure what to do, please answer \"no\"." - "Text of warning message displayed by `mailcap-maybe-eval'. -Make sure that this text consists only of few text lines. Otherwise, -Gnus might fail to display all of it.") - -(defun mailcap-maybe-eval () - "Maybe evaluate a buffer of Emacs Lisp code." - (let ((lisp-buffer (current-buffer))) - (goto-char (point-min)) - (when - (save-window-excursion - (delete-other-windows) - (let ((buffer (get-buffer-create (generate-new-buffer-name - "*Warning*")))) - (unwind-protect - (with-current-buffer buffer - (insert (substitute-command-keys - mailcap-maybe-eval-warning)) - (goto-char (point-min)) - (display-buffer buffer) - (yes-or-no-p "This is potentially dangerous emacs-lisp code, evaluate it? ")) - (kill-buffer buffer)))) - (eval-buffer (current-buffer))) - (when (buffer-live-p lisp-buffer) - (with-current-buffer lisp-buffer - (emacs-lisp-mode))))) - - -;;; -;;; The mailcap parser -;;; - -(defun mailcap-replace-regexp (regexp to-string) - ;; Quiet replace-regexp. - (goto-char (point-min)) - (while (re-search-forward regexp nil t) - (replace-match to-string t nil))) - -(defvar mailcap-parsed-p nil) - -(defun mailcap-parse-mailcaps (&optional path force) - "Parse out all the mailcaps specified in a path string PATH. -Components of PATH are separated by the `path-separator' character -appropriate for this system. If FORCE, re-parse even if already -parsed. If PATH is omitted, use the value of environment variable -MAILCAPS if set; otherwise (on Unix) use the path from RFC 1524, plus -/usr/local/etc/mailcap." - (interactive (list nil t)) - (when (or (not mailcap-parsed-p) - force) - (cond - (path nil) - ((getenv "MAILCAPS") (setq path (getenv "MAILCAPS"))) - ((memq system-type mailcap-poor-system-types) - (setq path '("~/.mailcap" "~/mail.cap" "~/etc/mail.cap"))) - (t (setq path - ;; This is per RFC 1524, specifically - ;; with /usr before /usr/local. - '("~/.mailcap" "/etc/mailcap" "/usr/etc/mailcap" - "/usr/local/etc/mailcap")))) - (let ((fnames (reverse - (if (stringp path) - (delete "" (split-string path path-separator)) - path))) - fname) - (while fnames - (setq fname (car fnames)) - (if (and (file-readable-p fname) - (file-regular-p fname)) - (mailcap-parse-mailcap fname)) - (setq fnames (cdr fnames)))) - (setq mailcap-parsed-p t))) - -(defun mailcap-parse-mailcap (fname) - "Parse out the mailcap file specified by FNAME." - (let (major ; The major mime type (image/audio/etc) - minor ; The minor mime type (gif, basic, etc) - save-pos ; Misc saved positions used in parsing - viewer ; How to view this mime type - info ; Misc info about this mime type - ) - (with-temp-buffer - (insert-file-contents fname) - (set-syntax-table mailcap-parse-args-syntax-table) - (mailcap-replace-regexp "#.*" "") ; Remove all comments - (mailcap-replace-regexp "\\\\[ \t]*\n" " ") ; And collapse spaces - (mailcap-replace-regexp "\n+" "\n") ; And blank lines - (goto-char (point-max)) - (skip-chars-backward " \t\n") - (delete-region (point) (point-max)) - (while (not (bobp)) - (skip-chars-backward " \t\n") - (beginning-of-line) - (setq save-pos (point) - info nil) - (skip-chars-forward "^/; \t\n") - (downcase-region save-pos (point)) - (setq major (buffer-substring save-pos (point))) - (skip-chars-forward " \t") - (setq minor "") - (when (eq (char-after) ?/) - (forward-char) - (skip-chars-forward " \t") - (setq save-pos (point)) - (skip-chars-forward "^; \t\n") - (downcase-region save-pos (point)) - (setq minor - (cond - ((eq ?* (or (char-after save-pos) 0)) ".*") - ((= (point) save-pos) ".*") - (t (regexp-quote (buffer-substring save-pos (point))))))) - (skip-chars-forward " \t") - ;;; Got the major/minor chunks, now for the viewers/etc - ;;; The first item _must_ be a viewer, according to the - ;;; RFC for mailcap files (#1524) - (setq viewer "") - (when (eq (char-after) ?\;) - (forward-char) - (skip-chars-forward " \t") - (setq save-pos (point)) - (skip-chars-forward "^;\n") - ;; skip \; - (while (eq (char-before) ?\\) - (backward-delete-char 1) - (forward-char) - (skip-chars-forward "^;\n")) - (if (eq (or (char-after save-pos) 0) ?') - (setq viewer (progn - (narrow-to-region (1+ save-pos) (point)) - (goto-char (point-min)) - (prog1 - (read (current-buffer)) - (goto-char (point-max)) - (widen)))) - (setq viewer (buffer-substring save-pos (point))))) - (setq save-pos (point)) - (end-of-line) - (unless (equal viewer "") - (setq info (nconc (list (cons 'viewer viewer) - (cons 'type (concat major "/" - (if (string= minor ".*") - "*" minor)))) - (mailcap-parse-mailcap-extras save-pos (point)))) - (mailcap-mailcap-entry-passes-test info) - (mailcap-add-mailcap-entry major minor info)) - (beginning-of-line))))) - -(defun mailcap-parse-mailcap-extras (st nd) - "Grab all the extra stuff from a mailcap entry." - (let ( - name ; From name= - value ; its value - results ; Assoc list of results - name-pos ; Start of XXXX= position - val-pos ; Start of value position - done ; Found end of \'d ;s? - ) - (save-restriction - (narrow-to-region st nd) - (goto-char (point-min)) - (skip-chars-forward " \n\t;") - (while (not (eobp)) - (setq done nil) - (setq name-pos (point)) - (skip-chars-forward "^ \n\t=;") - (downcase-region name-pos (point)) - (setq name (buffer-substring name-pos (point))) - (skip-chars-forward " \t\n") - (if (not (eq (char-after (point)) ?=)) ; There is no value - (setq value t) - (skip-chars-forward " \t\n=") - (setq val-pos (point)) - (if (memq (char-after val-pos) '(?\" ?')) - (progn - (setq val-pos (1+ val-pos)) - (condition-case nil - (progn - (forward-sexp 1) - (backward-char 1)) - (error (goto-char (point-max))))) - (while (not done) - (skip-chars-forward "^;") - (if (eq (char-after (1- (point))) ?\\ ) - (progn - (subst-char-in-region (1- (point)) (point) ?\\ ? ) - (skip-chars-forward ";")) - (setq done t)))) - (setq value (buffer-substring val-pos (point)))) - (setq results (cons (cons name value) results)) - (skip-chars-forward " \";\n\t")) - results))) - -(defun mailcap-mailcap-entry-passes-test (info) - "Return non-nil iff mailcap entry INFO passes its test clause. -Also return non-nil if no test clause is present." - (let ((test (assq 'test info)) ; The test clause - status) - (setq status (and test (split-string (cdr test) " "))) - (if (and (or (assoc "needsterm" info) - (assoc "needsterminal" info) - (assoc "needsx11" info)) - (not (getenv "DISPLAY"))) - (setq status nil) - (cond - ((and (equal (nth 0 status) "test") - (equal (nth 1 status) "-n") - (or (equal (nth 2 status) "$DISPLAY") - (equal (nth 2 status) "\"$DISPLAY\""))) - (setq status (if (getenv "DISPLAY") t nil))) - ((and (equal (nth 0 status) "test") - (equal (nth 1 status) "-z") - (or (equal (nth 2 status) "$DISPLAY") - (equal (nth 2 status) "\"$DISPLAY\""))) - (setq status (if (getenv "DISPLAY") nil t))) - (test nil) - (t nil))) - (and test (listp test) (setcdr test status)))) - -;;; -;;; The action routines. -;;; - -(defun mailcap-possible-viewers (major minor) - "Return a list of possible viewers from MAJOR for minor type MINOR." - (let ((exact '()) - (wildcard '())) - (while major - (cond - ((equal (car (car major)) minor) - (setq exact (cons (cdr (car major)) exact))) - ((and minor (string-match (concat "^" (car (car major)) "$") minor)) - (setq wildcard (cons (cdr (car major)) wildcard)))) - (setq major (cdr major))) - (nconc exact wildcard))) - -(defun mailcap-unescape-mime-test (test type-info) - (let (save-pos save-chr subst) - (cond - ((symbolp test) test) - ((and (listp test) (symbolp (car test))) test) - ((or (stringp test) - (and (listp test) (stringp (car test)) - (setq test (mapconcat 'identity test " ")))) - (with-temp-buffer - (insert test) - (goto-char (point-min)) - (while (not (eobp)) - (skip-chars-forward "^%") - (if (/= (- (point) - (progn (skip-chars-backward "\\\\") - (point))) - 0) ; It is an escaped % - (progn - (delete-char 1) - (skip-chars-forward "%.")) - (setq save-pos (point)) - (skip-chars-forward "%") - (setq save-chr (char-after (point))) - ;; Escapes: - ;; %s: name of a file for the body data - ;; %t: content-type - ;; %{ -;; Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Send mail using mh-e. - -;; The following mh-e interface is all cooperative works of -;; tanaka@flab.fujitsu.CO.JP (TANAKA Hiroshi), kawabe@sra.CO.JP -;; (Yoshikatsu Kawabe), and shingu@casund.cpr.canon.co.jp (Toshiaki -;; SHINGU). - -;;; Code: - -(require 'gnus) -(require 'mh-e) -(require 'mh-comp) -(require 'gnus-msg) -(require 'gnus-sum) - -(eval-when-compile - (defvar mh-lib-progs)) - -(defun gnus-summary-save-article-folder (&optional arg) - "Append the current article to an mh folder. -If N is a positive number, save the N next articles. -If N is a negative number, save the N previous articles. -If N is nil and any articles have been marked with the process mark, -save those articles instead." - (interactive "P") - (require 'gnus-art) - (let ((gnus-default-article-saver 'gnus-summary-save-in-folder)) - (gnus-summary-save-article arg))) - -(defun gnus-summary-save-in-folder (&optional folder) - "Save this article to MH folder (using `rcvstore' in MH library). -Optional argument FOLDER specifies folder name." - ;; Thanks to yuki@flab.Fujitsu.JUNET and ohm@kaba.junet. - (mh-find-path) - (let ((folder - (cond ((and (eq folder 'default) - gnus-newsgroup-last-folder) - gnus-newsgroup-last-folder) - (folder folder) - (t (mh-prompt-for-folder - "Save article in" - (funcall gnus-folder-save-name gnus-newsgroup-name - gnus-current-headers gnus-newsgroup-last-folder) - t)))) - (errbuf (gnus-get-buffer-create " *Gnus rcvstore*")) - ;; Find the rcvstore program. - (exec-path (cond - ((and (boundp 'mh-lib-progs) mh-lib-progs) - (cons mh-lib-progs exec-path)) - (mh-lib (cons mh-lib exec-path)) - (t exec-path)))) - (with-current-buffer gnus-original-article-buffer - (save-restriction - (widen) - (unwind-protect - (call-process-region - (point-min) (point-max) "rcvstore" nil errbuf nil folder) - (set-buffer errbuf) - (if (zerop (buffer-size)) - (message "Article saved in folder: %s" folder) - (message "%s" (buffer-string))) - (kill-buffer errbuf)))) - (setq gnus-newsgroup-last-folder folder))) - -(defun gnus-Folder-save-name (newsgroup headers &optional last-folder) - "Generate folder name from NEWSGROUP, HEADERS, and optional LAST-FOLDER. -If variable `gnus-use-long-file-name' is nil, it is +News.group. -Otherwise, it is like +news/group." - (or last-folder - (concat "+" - (if gnus-use-long-file-name - (gnus-capitalize-newsgroup newsgroup) - (gnus-newsgroup-directory-form newsgroup))))) - -(defun gnus-folder-save-name (newsgroup headers &optional last-folder) - "Generate folder name from NEWSGROUP, HEADERS, and optional LAST-FOLDER. -If variable `gnus-use-long-file-name' is nil, it is +news.group. -Otherwise, it is like +news/group." - (or last-folder - (concat "+" - (if gnus-use-long-file-name - newsgroup - (gnus-newsgroup-directory-form newsgroup))))) - -(provide 'gnus-mh) - -;;; gnus-mh.el ends here diff --git a/lisp/gnus-ml.el b/lisp/gnus-ml.el deleted file mode 100644 index 6bd3e2d..0000000 --- a/lisp/gnus-ml.el +++ /dev/null @@ -1,201 +0,0 @@ -;;; gnus-ml.el --- Mailing list minor mode for Gnus - -;; Copyright (C) 2000 Free Software Foundation, Inc. - -;; Author: Julien Gilles -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; implement (small subset of) RFC 2369 - -;;; Code: - -(require 'gnus) -(require 'gnus-msg) -(eval-when-compile (require 'cl)) - -;;; Mailing list minor mode - -(defvar gnus-mailing-list-mode nil - "Minor mode for providing mailing-list commands.") - -(defvar gnus-mailing-list-mode-map nil) - -(defvar gnus-mailing-list-menu) - -(unless gnus-mailing-list-mode-map - (setq gnus-mailing-list-mode-map (make-sparse-keymap)) - - (gnus-define-keys gnus-mailing-list-mode-map - "\C-c\C-nh" gnus-mailing-list-help - "\C-c\C-ns" gnus-mailing-list-subscribe - "\C-c\C-nu" gnus-mailing-list-unsubscribe - "\C-c\C-np" gnus-mailing-list-post - "\C-c\C-no" gnus-mailing-list-owner - "\C-c\C-na" gnus-mailing-list-archive - )) - -(defun gnus-mailing-list-make-menu-bar () - (unless (boundp 'gnus-mailing-list-menu) - (easy-menu-define - gnus-mailing-list-menu gnus-mailing-list-mode-map "" - '("Mailing-Lists" - ["Get help" gnus-mailing-list-help t] - ["Subscribe" gnus-mailing-list-subscribe t] - ["Unsubscribe" gnus-mailing-list-unsubscribe t] - ["Post a message" gnus-mailing-list-post t] - ["Mail to owner" gnus-mailing-list-owner t] - ["Browse archive" gnus-mailing-list-archive t])))) - -;;;###autoload -(defun turn-on-gnus-mailing-list-mode () - (when (gnus-group-find-parameter gnus-newsgroup-name 'to-list) - (gnus-mailing-list-mode 1))) - -;;;###autoload -(defun gnus-mailing-list-insinuate (&optional force) - "Setup group parameters from List-Post header. -If FORCE is non-nil, replace the old ones." - (interactive "P") - (let ((list-post - (with-current-buffer gnus-original-article-buffer - (gnus-fetch-field "list-post")))) - (if list-post - (if (and (not force) - (gnus-group-get-parameter gnus-newsgroup-name 'to-list)) - (gnus-message 1 "to-list is non-nil.") - (if (string-match "]*\\)>" list-post) - (setq list-post (match-string 1 list-post))) - (gnus-group-add-parameter gnus-newsgroup-name - (cons 'to-list list-post)) - (gnus-mailing-list-mode 1)) - (gnus-message 1 "no list-post in this message.")))) - -;;;###autoload -(defun gnus-mailing-list-mode (&optional arg) - "Minor mode for providing mailing-list commands. - -\\{gnus-mailing-list-mode-map}" - (interactive "P") - (when (eq major-mode 'gnus-summary-mode) - (when (set (make-local-variable 'gnus-mailing-list-mode) - (if (null arg) (not gnus-mailing-list-mode) - (> (prefix-numeric-value arg) 0))) - ;; Set up the menu. - (when (gnus-visual-p 'mailing-list-menu 'menu) - (gnus-mailing-list-make-menu-bar)) - (gnus-add-minor-mode 'gnus-mailing-list-mode " Mailing-List" gnus-mailing-list-mode-map) - (gnus-run-hooks 'gnus-mailing-list-mode-hook)))) - -;;; Commands - -(defun gnus-mailing-list-help () - "Get help from mailing list server." - (interactive) - (let ((list-help - (with-current-buffer gnus-original-article-buffer - (gnus-fetch-field "list-help")))) - (cond (list-help (gnus-mailing-list-message list-help)) - (t (gnus-message 1 "no list-help in this group"))))) - -(defun gnus-mailing-list-subscribe () - "Subscribe" - (interactive) - (let ((list-subscribe - (with-current-buffer gnus-original-article-buffer - (gnus-fetch-field "list-subscribe")))) - (cond (list-subscribe (gnus-mailing-list-message list-subscribe)) - (t (gnus-message 1 "no list-subscribe in this group"))))) - -(defun gnus-mailing-list-unsubscribe () - "Unsubscribe" - (interactive) - (let ((list-unsubscribe - (with-current-buffer gnus-original-article-buffer - (gnus-fetch-field "list-unsubscribe")))) - (cond (list-unsubscribe (gnus-mailing-list-message list-unsubscribe)) - (t (gnus-message 1 "no list-unsubscribe in this group"))))) - -(defun gnus-mailing-list-post () - "Post message (really useful ?)" - (interactive) - (let ((list-post - (with-current-buffer gnus-original-article-buffer - (gnus-fetch-field "list-post")))) - (cond (list-post (gnus-mailing-list-message list-post)) - (t (gnus-message 1 "no list-post in this group"))))) - -(defun gnus-mailing-list-owner () - "Mail to the owner" - (interactive) - (let ((list-owner - (with-current-buffer gnus-original-article-buffer - (gnus-fetch-field "list-owner")))) - (cond (list-owner (gnus-mailing-list-message list-owner)) - (t (gnus-message 1 "no list-owner in this group"))))) - -(defun gnus-mailing-list-archive () - "Browse archive" - (interactive) - (require 'browse-url) - (let ((list-archive - (with-current-buffer gnus-original-article-buffer - (gnus-fetch-field "list-archive")))) - (cond (list-archive - (if (string-match "<\\(http:[^>]*\\)>" list-archive) - (browse-url (match-string 1 list-archive)) - (browse-url list-archive))) - (t (gnus-message 1 "no list-archive in this group"))))) - -;;; Utility functions - -(defun gnus-mailing-list-message (address) - "" - (let ((mailto "") - (to ()) - (subject "None") - (body "") - ) - (cond - ((string-match "]*\\)>" address) - (let ((args (match-string 1 address))) - (cond ; with param - ((string-match "\\(.*\\)\\?\\(.*\\)" args) - (setq mailto (match-string 1 args)) - (let ((param (match-string 2 args))) - (if (string-match "subject=\\([^&]*\\)" param) - (setq subject (match-string 1 param))) - (if (string-match "body=\\([^&]*\\)" param) - (setq body (match-string 1 param))) - (if (string-match "to=\\([^&]*\\)" param) - (push (match-string 1 param) to)) - )) - (t (setq mailto args))))) ; without param - - ; other case -;; Keywords: news, 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, 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; see the file COPYING. If not, write to -;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(require 'gnus) -(require 'gnus-sum) -(require 'gnus-group) -(require 'nnmail) - -(defvar gnus-group-split-updated-hook nil - "Hook called just after nnmail-split-fancy is updated by -gnus-group-split-update.") - -(defvar gnus-group-split-default-catch-all-group "mail.misc" - "Group name (or arbitrary fancy split) with default splitting rules. -Used by gnus-group-split and gnus-group-split-update as a fallback -split, in case none of the group-based splits matches.") - -;;;###autoload -(defun gnus-group-split-setup (&optional auto-update catch-all) - "Set up the split for nnmail-split-fancy. -Sets things up so that nnmail-split-fancy is used for mail -splitting, and defines the variable nnmail-split-fancy according with -group parameters. - -If AUTO-UPDATE is non-nil (prefix argument accepted, if called -interactively), it makes sure nnmail-split-fancy is re-computed before -getting new mail, by adding gnus-group-split-update to -nnmail-pre-get-new-mail-hook. - -A non-nil CATCH-ALL replaces the current value of -gnus-group-split-default-catch-all-group. This variable is only used -by gnus-group-split-update, and only when its CATCH-ALL argument is -nil. This argument may contain any fancy split, that will be added as -the last split in a `|' split produced by gnus-group-split-fancy, -unless overridden by any group marked as a catch-all group. Typical -uses are as simple as the name of a default mail group, but more -elaborate fancy splits may also be useful to split mail that doesn't -match any of the group-specified splitting rules. See -gnus-group-split-fancy for details." - (interactive "P") - (setq nnmail-split-methods 'nnmail-split-fancy) - (when catch-all - (setq gnus-group-split-default-catch-all-group catch-all)) - (gnus-group-split-update) - (when auto-update - (add-hook 'nnmail-pre-get-new-mail-hook 'gnus-group-split-update))) - -;;;###autoload -(defun gnus-group-split-update (&optional catch-all) - "Computes nnmail-split-fancy from group params and CATCH-ALL, by -calling (gnus-group-split-fancy nil nil CATCH-ALL). - -If CATCH-ALL is nil, gnus-group-split-default-catch-all-group is used -instead. This variable is set by gnus-group-split-setup." - (interactive) - (setq nnmail-split-fancy - (gnus-group-split-fancy - nil (null nnmail-crosspost) - (or catch-all gnus-group-split-default-catch-all-group))) - (run-hooks 'gnus-group-split-updated-hook)) - -;;;###autoload -(defun gnus-group-split () - "Uses information from group parameters in order to split mail. -See gnus-group-split-fancy for more information. - -gnus-group-split is a valid value for nnmail-split-methods." - (let (nnmail-split-fancy) - (gnus-group-split-update) - (nnmail-split-fancy))) - -;;;###autoload -(defun gnus-group-split-fancy - (&optional groups no-crosspost catch-all) - "Uses information from group parameters in order to split mail. It -can be embedded into nnmail-split-fancy lists with the SPLIT - -\(: gnus-group-split-fancy GROUPS NO-CROSSPOST CATCH-ALL\) - -GROUPS may be a regular expression or a list of group names, that will -be used to select candidate groups. If it is ommited or nil, all -existing groups are considered. - -if NO-CROSSPOST is ommitted or nil, a & split will be returned, -otherwise, a | split, that does not allow crossposting, will be -returned. - -For each selected group, a SPLIT is composed like this: if SPLIT-SPEC -is specified, this split is returned as-is (unless it is nil: in this -case, the group is ignored). Otherwise, if TO-ADDRESS, TO-LIST and/or -EXTRA-ALIASES are specified, a regexp that matches any of them is -constructed (extra-aliases may be a list). Additionally, if -SPLIT-REGEXP is specified, the regexp will be extended so that it -matches this regexp too, and if SPLIT-EXCLUDE is specified, RESTRICT -clauses will be generated. - -If CATCH-ALL is nil, no catch-all handling is performed, regardless of -catch-all marks in group parameters. Otherwise, if there is no -selected group whose SPLIT-REGEXP matches the empty string, nor is -there a selected group whose SPLIT-SPEC is 'catch-all, this fancy -split (say, a group name) will be appended to the returned SPLIT list, -as the last element of a '| SPLIT. - -For example, given the following group parameters: - -nnml:mail.bar: -\((to-address . \"bar@femail.com\") - (split-regexp . \".*@femail\\\\.com\")) -nnml:mail.foo: -\((to-list . \"foo@nowhere.gov\") - (extra-aliases \"foo@localhost\" \"foo-redist@home\") - (split-exclude \"bugs-foo\" \"rambling-foo\") - (admin-address . \"foo-request@nowhere.gov\")) -nnml:mail.others: -\((split-spec . catch-all)) - -Calling (gnus-group-split-fancy nil nil \"mail.misc\") returns: - -\(| (& (any \"\\\\(bar@femail\\\\.com\\\\|.*@femail\\\\.com\\\\)\" - \"mail.bar\") - (any \"\\\\(foo@nowhere\\\\.gov\\\\|foo@localhost\\\\|foo-redist@home\\\\)\" - - \"bugs-foo\" - \"rambling-foo\" \"mail.foo\")) - \"mail.others\")" - (let* ((newsrc (cdr gnus-newsrc-alist)) - split) - (dolist (info newsrc) - (let ((group (gnus-info-group info)) - (params (gnus-info-params info))) - ;; For all GROUPs that match the specified GROUPS - (when (or (not groups) - (and (listp groups) - (memq group groups)) - (and (stringp groups) - (string-match groups group))) - (let ((split-spec (assoc 'split-spec params)) group-clean) - ;; Remove backend from group name - (setq group-clean (string-match ":" group)) - (setq group-clean - (if group-clean - (substring group (1+ group-clean)) - group)) - (if split-spec - (when (setq split-spec (cdr split-spec)) - (if (eq split-spec 'catch-all) - ;; Emit catch-all only when requested - (when catch-all - (setq catch-all group-clean)) - ;; Append split-spec to the main split - (push split-spec split))) - ;; Let's deduce split-spec from other params - (let ((to-address (cdr (assoc 'to-address params))) - (to-list (cdr (assoc 'to-list params))) - (extra-aliases (cdr (assoc 'extra-aliases params))) - (split-regexp (cdr (assoc 'split-regexp params))) - (split-exclude (cdr (assoc 'split-exclude params)))) - (when (or to-address to-list extra-aliases split-regexp) - ;; regexp-quote to-address, to-list and extra-aliases - ;; and add them all to split-regexp - (setq split-regexp - (concat - "\\(" - (mapconcat - 'identity - (append - (and to-address (list (regexp-quote to-address))) - (and to-list (list (regexp-quote to-list))) - (and extra-aliases - (if (listp extra-aliases) - (mapcar 'regexp-quote extra-aliases) - (list extra-aliases))) - (and split-regexp (list split-regexp))) - "\\|") - "\\)")) - ;; Now create the new SPLIT - (push (append - (list 'any split-regexp) - ;; Generate RESTRICTs for SPLIT-EXCLUDEs. - (if (listp split-exclude) - (apply #'append - (mapcar (lambda (arg) (list '- arg)) - split-exclude)) - (list '- split-exclude)) - (list group-clean)) - split) - ;; If it matches the empty string, it is a catch-all - (when (string-match split-regexp "") - (setq catch-all nil))))))))) - ;; Add catch-all if not crossposting - (if (and catch-all no-crosspost) - (push catch-all split)) - ;; Move it to the tail, while arranging that SPLITs appear in the - ;; same order as groups. - (setq split (reverse split)) - ;; Decide whether to accept cross-postings or not. - (push (if no-crosspost '| '&) split) - ;; Even if we can cross-post, catch-all should not get - ;; cross-posts. - (if (and catch-all (not no-crosspost)) - (setq split (list '| split catch-all))) - split)) - -(provide 'gnus-mlspl) - -;;; gnus-mlspl.el ends here diff --git a/lisp/gnus-move.el b/lisp/gnus-move.el deleted file mode 100644 index 36839c8..0000000 --- a/lisp/gnus-move.el +++ /dev/null @@ -1,185 +0,0 @@ -;;; gnus-move.el --- commands for moving Gnus from one server to another -;; Copyright (C) 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus) -(require 'gnus-start) -(require 'gnus-int) -(require 'gnus-range) - -;;; -;;; Moving by comparing Message-ID's. -;;; - -;;;###autoload -(defun gnus-change-server (from-server to-server) - "Move from FROM-SERVER to TO-SERVER. -Update the .newsrc.eld file to reflect the change of nntp server." - (interactive - (list gnus-select-method (gnus-read-method "Move to method: "))) - - ;; First start Gnus. - (let ((gnus-activate-level 0) - (mail-sources nil) - (nnmail-spool-file nil)) - (gnus)) - - (save-excursion - ;; Go through all groups and translate. - (let ((newsrc gnus-newsrc-alist) - (nntp-nov-gap nil) - info) - (while (setq info (pop newsrc)) - (when (gnus-group-native-p (gnus-info-group info)) - (gnus-move-group-to-server info from-server to-server)))))) - -(defun gnus-move-group-to-server (info from-server to-server) - "Move group INFO from FROM-SERVER to TO-SERVER." - (let ((group (gnus-info-group info)) - to-active hashtb type mark marks - to-article to-reads to-marks article - act-articles) - (gnus-message 7 "Translating %s..." group) - (when (gnus-request-group group nil to-server) - (setq to-active (gnus-parse-active) - hashtb (gnus-make-hashtable 1024) - act-articles (gnus-uncompress-range to-active)) - ;; Fetch the headers from the `to-server'. - (when (and to-active - act-articles - (setq type (gnus-retrieve-headers - act-articles - group to-server))) - ;; Convert HEAD headers. I don't care. - (when (eq type 'headers) - (nnvirtual-convert-headers)) - ;; Create a mapping from Message-ID to article number. - (set-buffer nntp-server-buffer) - (goto-char (point-min)) - (while (looking-at - "^[0-9]+\t[^\t]*\t[^\t]*\t[^\t]*\t\\([^\t]*\\)\t") - (gnus-sethash - (buffer-substring (match-beginning 1) (match-end 1)) - (read (current-buffer)) - hashtb) - (forward-line 1)) - ;; Then we read the headers from the `from-server'. - (when (and (gnus-request-group group nil from-server) - (gnus-active group) - (gnus-uncompress-range - (gnus-active group)) - (setq type (gnus-retrieve-headers - (gnus-uncompress-range - (gnus-active group)) - group from-server))) - ;; Make it easier to map marks. - (let ((mark-lists (gnus-info-marks info)) - ms type m) - (while mark-lists - (setq type (caar mark-lists) - ms (gnus-uncompress-range (cdr (pop mark-lists)))) - (while ms - (if (setq m (assq (car ms) marks)) - (setcdr m (cons type (cdr m))) - (push (list (car ms) type) marks)) - (pop ms)))) - ;; Convert. - (when (eq type 'headers) - (nnvirtual-convert-headers)) - ;; Go through the headers and map away. - (set-buffer nntp-server-buffer) - (goto-char (point-min)) - (while (looking-at - "^[0-9]+\t[^\t]*\t[^\t]*\t[^\t]*\t\\([^\t]*\\)\t") - (when (setq to-article - (gnus-gethash - (buffer-substring (match-beginning 1) (match-end 1)) - hashtb)) - ;; Add this article to the list of read articles. - (push to-article to-reads) - ;; See if there are any marks and then add them. - (when (setq mark (assq (read (current-buffer)) marks)) - (setq marks (delq mark marks)) - (setcar mark to-article) - (push mark to-marks)) - (forward-line 1))) - ;; Now we know what the read articles are and what the - ;; article marks are. We transform the information - ;; into the Gnus info format. - (setq to-reads - (gnus-range-add - (gnus-compress-sequence - (and (setq to-reads (delq nil to-reads)) - (sort to-reads '<)) - t) - (cons 1 (1- (car to-active))))) - (gnus-info-set-read info to-reads) - ;; Do the marks. I'm sure y'all understand what's - ;; going on down below, so I won't bother with any - ;; further comments. - (let ((mlists gnus-article-mark-lists) - lists ms a) - (while mlists - (push (list (cdr (pop mlists))) lists)) - (while (setq ms (pop marks)) - (setq article (pop ms)) - (while ms - (setcdr (setq a (assq (pop ms) lists)) - (cons article (cdr a))))) - (setq a lists) - (while a - (setcdr (car a) (gnus-compress-sequence - (and (cdar a) (sort (cdar a) '<)))) - (pop a)) - (gnus-info-set-marks info lists t))))) - (gnus-message 7 "Translating %s...done" group))) - -(defun gnus-group-move-group-to-server (info from-server to-server) - "Move the group on the current line from FROM-SERVER to TO-SERVER." - (interactive - (let ((info (gnus-get-info (gnus-group-group-name)))) - (list info (gnus-find-method-for-group (gnus-info-group info)) - (gnus-read-method (format "Move group %s to method: " - (gnus-info-group info)))))) - (save-excursion - (gnus-move-group-to-server info from-server to-server) - ;; We have to update the group info to point use the right server. - (gnus-info-set-method info to-server t) - ;; We also have to change the name of the group and stuff. - (let* ((group (gnus-info-group info)) - (new-name (gnus-group-prefixed-name - (gnus-group-real-name group) to-server))) - (gnus-info-set-group info new-name) - (gnus-sethash new-name (gnus-gethash group gnus-newsrc-hashtb) - gnus-newsrc-hashtb) - (gnus-sethash group nil gnus-newsrc-hashtb)))) - -(provide 'gnus-move) - -;;; gnus-move.el ends here diff --git a/lisp/gnus-msg.el b/lisp/gnus-msg.el deleted file mode 100644 index ad0fef6..0000000 --- a/lisp/gnus-msg.el +++ /dev/null @@ -1,1681 +0,0 @@ -;;; gnus-msg.el --- mail and post interface for Semi-gnus -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Masanobu UMEDA -;; Lars Magne Ingebrigtsen -;; MORIOKA Tomohiko -;; Shuhei KOBAYASHI -;; Katsumi Yamaoka -;; Kiyokazu SUTO -;; Keywords: mail, news, MIME - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'static)) - -(require 'gnus) -(require 'gnus-ems) -(require 'message) -(require 'gnus-art) - -(defcustom gnus-post-method 'current - "*Preferred method for posting USENET news. - -If this variable is `current' (which is the default), Gnus will use -the \"current\" select method when posting. If it is nil, Gnus will -use the native select method when posting. - -This method will not be used in mail groups and the like, only in -\"real\" newsgroups. - -If not nil nor `native', the value must be a valid method as discussed -in the documentation of `gnus-select-method'. It can also be a list of -methods. If that is the case, the user will be queried for what select -method to use when posting." - :group 'gnus-group-foreign - :type `(choice (const nil) - (const current) - (const native) - (sexp :tag "Methods" ,gnus-select-method))) - -(defcustom gnus-outgoing-message-group nil - "*All outgoing messages will be put in this group. -If you want to store all your outgoing mail and articles in the group -\"nnml:archive\", you set this variable to that value. This variable -can also be a list of group names. - -If you want to have greater control over what group to put each -message in, you can set this variable to a function that checks the -current newsgroup name and then returns a suitable group name (or list -of names)." - :group 'gnus-message - :type '(choice (string :tag "Group") - (function))) - -(defcustom gnus-mailing-list-groups nil - "*Regexp matching groups that are really mailing lists. -This is useful when you're reading a mailing list that has been -gatewayed to a newsgroup, and you want to followup to an article in -the group." - :group 'gnus-message - :type 'regexp) - -(defcustom gnus-add-to-list nil - "*If non-nil, add a `to-list' parameter automatically." - :group 'gnus-message - :type 'boolean) - -(defcustom gnus-crosspost-complaint - "Hi, - -You posted the article below with the following Newsgroups header: - -Newsgroups: %s - -The %s group, at least, was an inappropriate recipient -of this message. Please trim your Newsgroups header to exclude this -group before posting in the future. - -Thank you. - -" - "Format string to be inserted when complaining about crossposts. -The first %s will be replaced by the Newsgroups header; -the second with the current group name." - :group 'gnus-message - :type 'string) - -(defcustom gnus-message-setup-hook '(gnus-maybe-setup-default-charset) - "Hook run after setting up a message buffer." - :group 'gnus-message - :type 'hook) - -(defcustom gnus-bug-create-help-buffer t - "*Should we create the *Gnus Help Bug* buffer?" - :group 'gnus-message - :type 'boolean) - -(defcustom gnus-posting-styles nil - "*Alist of styles to use when posting." - :group 'gnus-message - :type '(repeat (cons (choice (regexp) - (function) - (variable) - (sexp)) - (repeat (list - (choice (const signature) - (const signature-file) - (const organization) - (const address) - (const name) - (const body) - (string :tag "Header")) - (choice (string) - (function) - (variable) - (sexp))))))) - -(defcustom gnus-inews-mark-gcc-as-read nil - "If non-nil, automatically mark Gcc articles as read." - :group 'gnus-message - :type 'boolean) - -(defcustom gnus-group-posting-charset-alist - '(("^\\(no\\|fr\\)\\.[^,]*\\(,[ \t\n]*\\(no\\|fr\\)\\.[^,]*\\)*$" iso-8859-1 (iso-8859-1)) - ("^\\(fido7\\|relcom\\)\\.[^,]*\\(,[ \t\n]*\\(fido7\\|relcom\\)\\.[^,]*\\)*$" koi8-r (koi8-r)) - (message-this-is-mail nil nil) - (message-this-is-news nil t)) - "Alist of regexps and permitted unencoded charsets for posting. -Each element of the alist has the form (TEST HEADER BODY-LIST), where -TEST is either a regular expression matching the newsgroup header or a -variable to query, -HEADER is the charset which may be left unencoded in the header (nil -means encode all charsets), -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 -nil (always encode using quoted-printable) or t (always use 8bit). - -Note that any value other than nil for HEADER infringes some RFCs, so -use this option with care." - :type '(repeat (list :tag "Permitted unencoded charsets" - (choice :tag "Where" - (regexp :tag "Group") - (const :tag "Mail message" - :value message-this-is-mail) - (const :tag "News article" - :value message-this-is-news)) - (choice :tag "Header" - (const :tag "None" nil) - (symbol :tag "Charset")) - (choice :tag "Body" - (const :tag "Any" :value t) - (const :tag "None" :value nil) - (repeat :tag "Charsets" - (symbol :tag "Charset"))))) - :group 'gnus-charset) - -;;; Internal variables. - -(defvar gnus-inhibit-posting-styles nil - "Inhibit the use of posting styles.") - -(defvar gnus-message-buffer "*Mail Gnus*") -(defvar gnus-article-copy nil) -(defvar gnus-check-before-posting nil) -(defvar gnus-last-posting-server nil) -(defvar gnus-message-group-art nil) - -(defvar gnus-msg-force-broken-reply-to nil) - -(defconst gnus-bug-message - (format "Sending a bug report to the Gnus Towers. -======================================== - -This gnus is the %s%s. -If you think the bug is a Semi-gnus bug, send a bug report to Semi-gnus -Developers. (the addresses below are mailing list addresses) - -======================================== - -The buffer below is a mail buffer. When you press `C-c C-c', it will -be sent to the Gnus Bug Exterminators. - -The thing near the bottom of the buffer is how the environment -settings will be included in the mail. Please do not delete that. -They will tell the Bug People what your environment is, so that it -will be easier to locate the bugs. - -If you have found a bug that makes Emacs go \"beep\", set -debug-on-error to t (`M-x set-variable RET debug-on-error RET t RET') -and include the backtrace in your bug report. - -Please describe the bug in annoying, painstaking detail. - -Thank you for your help in stamping out bugs. -" - gnus-product-name - (if (string= gnus-product-name "Semi-gnus") - "" - ", a modified version of Semi-gnus"))) - -(eval-and-compile - (autoload 'gnus-uu-post-news "gnus-uu" nil t) - (autoload 'news-setup "rnewspost") - (autoload 'news-reply-mode "rnewspost") - (autoload 'rmail-dont-reply-to "mail-utils") - (autoload 'rmail-output "rmailout")) - - -;;; -;;; Gnus Posting Functions -;;; - -(gnus-define-keys (gnus-summary-send-map "S" gnus-summary-mode-map) - "p" gnus-summary-post-news - "f" gnus-summary-followup - "F" gnus-summary-followup-with-original - "c" gnus-summary-cancel-article - "s" gnus-summary-supersede-article - "r" gnus-summary-reply - "y" gnus-summary-yank-message - "R" gnus-summary-reply-with-original - "w" gnus-summary-wide-reply - "W" gnus-summary-wide-reply-with-original - "v" gnus-summary-very-wide-reply - "V" gnus-summary-very-wide-reply-with-original - "n" gnus-summary-followup-to-mail - "N" gnus-summary-followup-to-mail-with-original - "m" gnus-summary-mail-other-window - "u" gnus-uu-post-news - "\M-c" gnus-summary-mail-crosspost-complaint - "Br" gnus-summary-reply-broken-reply-to - "BR" gnus-summary-reply-broken-reply-to-with-original - "om" gnus-summary-mail-forward - "op" gnus-summary-post-forward - "Om" gnus-summary-digest-mail-forward - "Op" gnus-summary-digest-post-forward) - -(gnus-define-keys (gnus-send-bounce-map "D" gnus-summary-send-map) - "b" gnus-summary-resend-bounced-mail - ;; "c" gnus-summary-send-draft - "r" gnus-summary-resend-message) - -;;; Internal functions. - -(defvar gnus-article-reply nil) -(defmacro gnus-setup-message (config &rest forms) - (let ((winconf (make-symbol "gnus-setup-message-winconf")) - (buffer (make-symbol "gnus-setup-message-buffer")) - (article (make-symbol "gnus-setup-message-article")) - (group (make-symbol "gnus-setup-message-group"))) - `(let ((,winconf (current-window-configuration)) - (,buffer (buffer-name (current-buffer))) - (,article gnus-article-reply) - (,group gnus-newsgroup-name) - (message-header-setup-hook - (copy-sequence message-header-setup-hook)) - (message-mode-hook (copy-sequence message-mode-hook)) - (message-startup-parameter-alist - '((reply-buffer . gnus-copy-article-buffer) - (original-buffer . gnus-original-article-buffer) - (user-agent . Gnus)))) - (add-hook 'message-header-setup-hook 'gnus-inews-insert-gcc) - (add-hook 'message-header-setup-hook 'gnus-inews-insert-archive-gcc) - (add-hook 'message-mode-hook 'gnus-configure-posting-styles) - (unwind-protect - (progn - ,@forms) - (gnus-inews-add-send-actions ,winconf ,buffer ,article ,config) - (gnus-inews-insert-draft-meta-information ,group ,article) - (setq gnus-message-buffer (current-buffer)) - (set (make-local-variable 'gnus-message-group-art) - (cons ,group ,article)) - (set (make-local-variable 'gnus-newsgroup-name) ,group) - (gnus-run-hooks 'gnus-message-setup-hook)) - (gnus-add-buffer) - (gnus-configure-windows ,config t) - (set-buffer-modified-p nil)))) - -(defun gnus-inews-insert-draft-meta-information (group article) - (save-excursion - (when (and group - (not (string= group "")) - (not (message-fetch-field gnus-draft-meta-information-header))) - (goto-char (point-min)) - (insert gnus-draft-meta-information-header ": (\"" group "\" " - (if article (number-to-string - (if (listp article) - (car article) - article)) "\"\"") - ")\n")))) - -;;;###autoload -(defun gnus-msg-mail (&optional to subject other-headers continue - switch-action yank-action send-actions) - "Start editing a mail message to be sent. -Like `message-mail', but with Gnus paraphernalia, particularly the -Gcc: header for archiving purposes." - (interactive) - (let ((buf (current-buffer)) - mail-buf) - (gnus-setup-message 'message - (message-mail to subject other-headers continue - nil yank-action send-actions)) - (when switch-action - (setq mail-buf (current-buffer)) - (switch-to-buffer buf) - (apply switch-action mail-buf nil))) - ;; COMPOSEFUNC should return t if succeed. Undocumented ??? - t) - -;;;###autoload -(defun gnus-button-mailto (address) - "Mail to ADDRESS." - (set-buffer (gnus-copy-article-buffer)) - (gnus-setup-message 'message - (message-reply address))) - -;;;###autoload -(defun gnus-button-reply (&optional to-address wide) - "Like `message-reply'." - (interactive) - (gnus-setup-message 'message - (message-reply to-address wide))) - -;;;###autoload -(define-mail-user-agent 'gnus-user-agent - 'gnus-msg-mail 'message-send-and-exit - 'message-kill-buffer 'message-send-hook) - -(defun gnus-setup-posting-charset (group) - (let ((alist gnus-group-posting-charset-alist) - (group (or group "")) - elem) - (when group - (catch 'found - (while (setq elem (pop alist)) - (when (or (and (stringp (car elem)) - (string-match (car elem) group)) - (and (gnus-functionp (car elem)) - (funcall (car elem) group)) - (and (symbolp (car elem)) - (symbol-value (car elem)))) - (throw 'found (cons (cadr elem) (caddr elem))))))))) - -(defun gnus-inews-add-send-actions (winconf buffer article &optional config) - (make-local-hook 'message-sent-hook) - (add-hook 'message-sent-hook (if gnus-agent 'gnus-agent-possibly-do-gcc - 'gnus-inews-do-gcc) nil t) - (when gnus-agent - (make-local-hook 'message-header-hook) - (add-hook 'message-header-hook 'gnus-agent-possibly-save-gcc nil t)) - (setq message-post-method - `(lambda (arg) - (gnus-post-method arg ,gnus-newsgroup-name))) - (setq message-user-agent (gnus-extended-version)) - (when (not message-use-multi-frames) - (message-add-action - `(set-window-configuration ,winconf) 'exit 'postpone 'kill)) - (message-add-action - `(when (gnus-buffer-exists-p ,buffer) - (save-excursion - (set-buffer ,buffer) - ,(when article - (if (eq config 'forward) - `(gnus-summary-mark-article-as-forwarded ',article) - `(gnus-summary-mark-article-as-replied ',article))))) - 'send)) - -(put 'gnus-setup-message 'lisp-indent-function 1) -(put 'gnus-setup-message 'edebug-form-spec '(form body)) - -;;; Post news commands of Gnus group mode and summary mode - -(defun gnus-group-mail (&optional arg) - "Start composing a mail. -If ARG, use the group under the point to find a posting style. -If ARG is 1, prompt for a group name to find the posting style." - (interactive "P") - ;; We can't `let' gnus-newsgroup-name here, since that leads - ;; to local variables leaking. - (let ((group gnus-newsgroup-name) - (buffer (current-buffer))) - (unwind-protect - (progn - (setq gnus-newsgroup-name - (if arg - (if (= 1 (prefix-numeric-value arg)) - (completing-read "Use posting style of group: " - gnus-active-hashtb nil - (gnus-read-active-file-p)) - (gnus-group-group-name)) - "")) - (gnus-setup-message 'message (message-mail))) - (save-excursion - (set-buffer buffer) - (setq gnus-newsgroup-name group))))) - -(defun gnus-group-post-news (&optional arg) - "Start composing a news message. -If ARG, post to the group under point. -If ARG is 1, prompt for a group name." - (interactive "P") - ;; Bind this variable here to make message mode hooks work ok. - (let ((gnus-newsgroup-name - (if arg - (if (= 1 (prefix-numeric-value arg)) - (completing-read "Newsgroup: " gnus-active-hashtb nil - (gnus-read-active-file-p)) - (gnus-group-group-name)) - ""))) - (gnus-post-news 'post gnus-newsgroup-name))) - -(defun gnus-summary-post-news () - "Start composing a news message." - (interactive) - (gnus-post-news 'post gnus-newsgroup-name)) - -(defun gnus-summary-followup (yank &optional force-news) - "Compose a followup to an article. -If prefix argument YANK is non-nil, original article is yanked automatically." - (interactive - (list (and current-prefix-arg - (gnus-summary-work-articles 1)))) - (when yank - (gnus-summary-goto-subject (car yank))) - (save-window-excursion - (gnus-summary-select-article)) - (let ((headers (gnus-summary-article-header (gnus-summary-article-number))) - (gnus-newsgroup-name gnus-newsgroup-name)) - ;; Send a followup. - (gnus-post-news nil gnus-newsgroup-name - headers gnus-article-buffer - yank nil force-news))) - -(defun gnus-summary-followup-with-original (n &optional force-news) - "Compose a followup to an article and include the original article." - (interactive "P") - (gnus-summary-followup (gnus-summary-work-articles n) force-news)) - -(defun gnus-summary-followup-to-mail (&optional arg) - "Followup to the current mail message via news." - (interactive - (list (and current-prefix-arg - (gnus-summary-work-articles 1)))) - (gnus-summary-followup arg t)) - -(defun gnus-summary-followup-to-mail-with-original (&optional arg) - "Followup to the current mail message via news." - (interactive "P") - (gnus-summary-followup (gnus-summary-work-articles arg) t)) - -(defun gnus-inews-yank-articles (articles) - (let ((more-than-one (cdr articles)) - (cur (current-buffer)) - refs beg article window) - (message-goto-body) - (while (setq article (pop articles)) - (save-window-excursion - (set-buffer gnus-summary-buffer) - (gnus-summary-select-article nil nil nil article) - (gnus-summary-remove-process-mark article)) - - ;; Gathering references. - (when more-than-one - (setq refs (message-list-references - refs - (mail-header-references gnus-current-headers) - (mail-header-message-id gnus-current-headers))) - (when message-use-multi-frames - (when (setq window (get-buffer-window cur t)) - (select-frame (window-frame window))))) - - (gnus-copy-article-buffer) - (let ((message-reply-buffer gnus-article-copy) - (message-reply-headers - (with-current-buffer gnus-article-copy - ;; The headers are decoded. - (nnheader-parse-head t)))) - (message-yank-original) - (setq beg (or beg (mark t)))) - (when articles - (insert "\n"))) - (push-mark) - - ;; Replace with the gathered references. - (when refs - (push-mark beg) - (save-restriction - (message-narrow-to-headers) - (let ((case-fold-search t)) - (if (re-search-forward "^References:\\([\t ]+.+\n\\)+" nil t) - (replace-match "") - (goto-char (point-max)))) - (mail-header-format - (list (or (assq 'References message-header-format-alist) - '(References . message-shorten-references))) - (list (cons 'References - (mapconcat 'identity (nreverse refs) " ")))) - (backward-delete-char 1)) - (setq beg (mark t)) - (pop-mark)) - - (goto-char beg))) - -(defun gnus-summary-cancel-article (&optional n symp) - "Cancel an article you posted. -Uses the process-prefix convention. If given the symbolic -prefix `a', cancel using the standard posting method; if not -post using the current select method." - (interactive (gnus-interactive "P\ny")) - (let ((articles (gnus-summary-work-articles n)) - (message-post-method - `(lambda (arg) - (gnus-post-method (not (eq symp 'a)) ,gnus-newsgroup-name))) - article) - (while (setq article (pop articles)) - (when (gnus-summary-select-article t nil nil article) - (when (gnus-eval-in-buffer-window gnus-article-buffer - (save-excursion - (set-buffer gnus-original-article-buffer) - (message-cancel-news))) - (gnus-summary-mark-as-read article gnus-canceled-mark) - (gnus-cache-remove-article 1)) - (gnus-article-hide-headers-if-wanted)) - (gnus-summary-remove-process-mark article)))) - -(defun gnus-summary-supersede-article () - "Compose an article that will supersede a previous article. -This is done simply by taking the old article and adding a Supersedes -header line with the old Message-ID." - (interactive) - (let ((article (gnus-summary-article-number)) - (gnus-message-setup-hook '(gnus-maybe-setup-default-charset))) - (gnus-setup-message 'reply-yank - (gnus-summary-select-article t) - (set-buffer gnus-original-article-buffer) - (message-supersede) - (push - `((lambda () - (when (gnus-buffer-exists-p ,gnus-summary-buffer) - (save-excursion - (set-buffer ,gnus-summary-buffer) - (gnus-cache-possibly-remove-article ,article nil nil nil t) - (gnus-summary-mark-as-read ,article gnus-canceled-mark))))) - message-send-actions)))) - - - -(defun gnus-copy-article-buffer (&optional article-buffer) - ;; make a copy of the article buffer with all text properties removed - ;; this copy is in the buffer gnus-article-copy. - ;; if ARTICLE-BUFFER is nil, gnus-article-buffer is used - ;; this buffer should be passed to all mail/news reply/post routines. - (setq gnus-article-copy (gnus-get-buffer-create " *gnus article copy*")) - (let ((article-buffer (or article-buffer gnus-article-buffer)) - end beg) - (if (not (and (get-buffer article-buffer) - (gnus-buffer-exists-p article-buffer))) - (error "Can't find any article buffer") - (save-excursion - (set-buffer article-buffer) - (let ((gnus-newsgroup-charset (or gnus-article-charset - gnus-newsgroup-charset)) - (gnus-newsgroup-ignored-charsets - (or gnus-article-ignored-charsets - gnus-newsgroup-ignored-charsets))) - (save-restriction - ;; Copy over the (displayed) article buffer, delete - ;; hidden text and remove text properties. - (widen) - (let ((inhibit-read-only t)) - (copy-to-buffer gnus-article-copy (point-min) (point-max)) - (set-buffer gnus-article-copy) - ;; Encode bitmap smileys to ordinary text. - ;; Possibly, the original text might be restored. - (static-unless (featurep 'xemacs) - (when (featurep 'smiley-mule) - (smiley-encode-buffer))) - (gnus-article-delete-text-of-type 'annotation) - (gnus-remove-text-with-property 'gnus-prev) - (gnus-remove-text-with-property 'gnus-next) - (gnus-remove-text-with-property 'x-face-mule-bitmap-image) - (insert - (prog1 - (static-if (featurep 'xemacs) - ;; Revome smiley extents for (possibly) XEmacs 21.1. - (format "%s" - (buffer-substring-no-properties (point-min) - (point-max))) - (buffer-substring-no-properties (point-min) (point-max))) - (erase-buffer)))) - ;; Find the original headers. - (set-buffer gnus-original-article-buffer) - (goto-char (point-min)) - (while (looking-at message-unix-mail-delimiter) - (forward-line 1)) - (setq beg (point)) - (setq end (or (message-goto-body) beg)) - ;; Delete the headers from the displayed articles. - (set-buffer gnus-article-copy) - (delete-region (goto-char (point-min)) - (or (message-goto-body) (point-max))) - ;; Insert the original article headers. - (insert-buffer-substring gnus-original-article-buffer beg end) - (article-decode-encoded-words)))) - gnus-article-copy))) - -(defun gnus-post-news (post &optional group header article-buffer yank subject - force-news) - (when article-buffer - (gnus-copy-article-buffer)) - (let ((gnus-article-reply (and article-buffer (gnus-summary-article-number))) - (add-to-list gnus-add-to-list)) - (gnus-setup-message (cond (yank 'reply-yank) - (article-buffer 'reply) - (t 'message)) - (let* ((group (or group gnus-newsgroup-name)) - (charset (gnus-group-name-charset nil group)) - (pgroup group) - to-address to-group mailing-list to-list - newsgroup-p) - (when group - (setq to-address (gnus-parameter-to-address group) - to-group (gnus-group-find-parameter group 'to-group) - to-list (gnus-parameter-to-list group) - newsgroup-p (gnus-group-find-parameter group 'newsgroup) - mailing-list (when gnus-mailing-list-groups - (string-match gnus-mailing-list-groups group)) - group (gnus-group-name-decode (gnus-group-real-name group) - charset))) - (if (or (and to-group - (gnus-news-group-p to-group)) - newsgroup-p - force-news - (and (gnus-news-group-p - (or pgroup gnus-newsgroup-name) - (if header (mail-header-number header) - gnus-current-article)) - (not mailing-list) - (not to-list) - (not to-address))) - ;; This is news. - (if post - (message-news (or to-group group)) - (set-buffer gnus-article-copy) - (gnus-msg-treat-broken-reply-to) - (message-followup (if (or newsgroup-p force-news) - (if (save-restriction - (article-narrow-to-head) - (message-fetch-field "newsgroups")) - nil - "") - to-group))) - ;; The is mail. - (if post - (progn - (message-mail (or to-address to-list)) - ;; Arrange for mail groups that have no `to-address' to - ;; get that when the user sends off the mail. - (when (and (not to-list) - (not to-address) - add-to-list) - (push (list 'gnus-inews-add-to-address pgroup) - message-send-actions))) - (set-buffer gnus-article-copy) - (gnus-msg-treat-broken-reply-to) - (message-wide-reply to-address))) - (when yank - (gnus-inews-yank-articles yank)))))) - -(defun gnus-msg-treat-broken-reply-to (&optional force) - "Remove the Reply-to header iff broken-reply-to." - (when (or force - (gnus-group-find-parameter - gnus-newsgroup-name 'broken-reply-to)) - (save-restriction - (message-narrow-to-head) - (message-remove-header "reply-to")))) - -(defun gnus-post-method (arg group &optional silent) - "Return the posting method based on GROUP and ARG. -If SILENT, don't prompt the user." - (let ((gnus-post-method (or (gnus-parameter-post-method group) - gnus-post-method)) - (group-method (gnus-find-method-for-group group))) - (cond - ;; If the group-method is nil (which shouldn't happen) we use - ;; the default method. - ((null group-method) - (or (and (null (eq gnus-post-method 'active)) gnus-post-method) - gnus-select-method message-post-method)) - ;; We want the inverse of the default - ((and arg (not (eq arg 0))) - (if (eq gnus-post-method 'active) - gnus-select-method - group-method)) - ;; We query the user for a post method. - ((or arg - (and gnus-post-method - (not (eq gnus-post-method 'current)) - (listp (car gnus-post-method)))) - (let* ((methods - ;; Collect all methods we know about. - (append - (when (and gnus-post-method - (not (eq gnus-post-method 'current))) - (if (listp (car gnus-post-method)) - gnus-post-method - (list gnus-post-method))) - gnus-secondary-select-methods - (mapcar 'cdr gnus-server-alist) - (mapcar 'car gnus-opened-servers) - (list gnus-select-method) - (list group-method))) - method-alist post-methods method) - ;; Weed out all mail methods. - (while methods - (setq method (gnus-server-get-method "" (pop methods))) - (when (and (or (gnus-method-option-p method 'post) - (gnus-method-option-p method 'post-mail)) - (not (member method post-methods))) - (push method post-methods))) - ;; Create a name-method alist. - (setq method-alist - (mapcar - (lambda (m) - (if (equal (cadr m) "") - (list (symbol-name (car m)) m) - (list (concat (cadr m) " (" (symbol-name (car m)) ")") m))) - post-methods)) - ;; Query the user. - (cadr - (assoc - (setq gnus-last-posting-server - (if (and silent - gnus-last-posting-server) - ;; Just use the last value. - gnus-last-posting-server - (completing-read - "Posting method: " method-alist nil t - (cons (or gnus-last-posting-server "") 0)))) - method-alist)))) - ;; Override normal method. - ((and (eq gnus-post-method 'current) - (not (eq (car group-method) 'nndraft)) - (gnus-get-function group-method 'request-post t) - (not arg)) - group-method) - ((and gnus-post-method - (not (eq gnus-post-method 'current))) - gnus-post-method) - ;; Use the normal select method. - (t gnus-select-method)))) - - -(defun gnus-message-make-user-agent (&optional include-mime-info max-column - newline-product) - "Return a user-agent info. If INCLUDE-MIME-INFO is non-nil and the -variable `mime-edit-user-agent-value' is bound, the value will be -included in the return value. If MAX-COLUMN is specified, the return -value will be folded up as it were filled. NEWLINE-PRODUCT specifies -whether a newline should be inserted in front of each product-token. -If the value is t or `hard', it works strictly. Otherwise, if it is -non-nil (e.g. `soft'), it works semi-strictly. - -Here is an example of how to use this function: - -\(add-hook 'gnus-message-setup-hook - (lambda nil - (setq message-user-agent nil) - (save-excursion - (save-restriction - (message-narrow-to-headers) - (goto-char (point-max)) - (insert \"User-Agent: \" - (gnus-message-make-user-agent t 76 'soft) - \"\\n\"))))) -" - (let ((user-agent (if (and include-mime-info - (boundp 'mime-edit-user-agent-value)) - (concat (gnus-extended-version) - " " - mime-edit-user-agent-value) - (gnus-extended-version)))) - (when max-column - (unless (natnump max-column) - (setq max-column 76)) - (with-temp-buffer - (set-buffer-multibyte t) - (insert (mapconcat 'identity (split-string user-agent) " ")) - (goto-char (point-min)) - (let ((bol t) - start agent agents width element swidth) - (while (re-search-forward "\\([^ ]+\\) ?" nil t) - (setq start (match-beginning 0)) - (if (eq (char-after start) ?\() - (progn - (goto-char start) - (forward-list) - (push (buffer-substring start (point)) agent)) - (when agent - (push (nreverse agent) agents)) - (setq agent (list (match-string 1))))) - (when agent - (push (nreverse agent) agents)) - (setq agents (nreverse agents)) - (if (> (+ 12 (string-width (caar agents))) max-column) - (setq user-agent "\n" - width 0) - (setq user-agent "" - width 11)) - (while agents - (setq agent (car agents) - agents (cdr agents)) - (when (and (not bol) - (or (memq newline-product '(t hard)) - (and newline-product - (> (+ width 1 - (string-width (mapconcat 'identity - agent " "))) - max-column)))) - (setq user-agent (concat user-agent "\n") - width 0 - bol t)) - (while agent - (setq element (car agent) - swidth (string-width element) - agent (cdr agent)) - (if bol - (setq user-agent (if (member user-agent '("" "\n")) - (concat user-agent element) - (concat user-agent " " element)) - width (+ width 1 swidth) - bol nil) - (if (> (+ width 1 swidth) max-column) - (setq user-agent (concat user-agent "\n " element) - width (1+ swidth)) - (setq user-agent (concat user-agent " " element) - width (+ width 1 swidth))))))))) - user-agent)) - - -;;; -;;; Gnus Mail Functions -;;; - -;;; Mail reply commands of Gnus summary mode - -(defun gnus-summary-reply (&optional yank wide very-wide) - "Start composing a mail reply to the current message. -If prefix argument YANK is non-nil, the original article is yanked -automatically. -If WIDE, make a wide reply. -If VERY-WIDE, make a very wide reply." - (interactive - (list (and current-prefix-arg - (gnus-summary-work-articles 1)))) - ;; Stripping headers should be specified with mail-yank-ignored-headers. - (when yank - (gnus-summary-goto-subject (car yank))) - (let ((gnus-article-reply (or yank (gnus-summary-article-number))) - (headers "")) - (gnus-setup-message (if yank 'reply-yank 'reply) - (if (not very-wide) - (gnus-summary-select-article) - (dolist (article very-wide) - (gnus-summary-select-article nil nil nil article) - (save-excursion - (set-buffer (gnus-copy-article-buffer)) - (gnus-msg-treat-broken-reply-to) - (save-restriction - (message-narrow-to-head) - (setq headers (concat headers (buffer-string))))))) - (set-buffer (gnus-copy-article-buffer)) - (gnus-msg-treat-broken-reply-to gnus-msg-force-broken-reply-to) - (save-restriction - (message-narrow-to-head) - (when very-wide - (erase-buffer) - (insert headers)) - (goto-char (point-max))) - (message-reply nil wide) - (when yank - (gnus-inews-yank-articles yank))))) - -(defun gnus-summary-reply-with-original (n &optional wide) - "Start composing a reply mail to the current message. -The original article will be yanked." - (interactive "P") - (gnus-summary-reply (gnus-summary-work-articles n) wide)) - -(defun gnus-summary-reply-broken-reply-to (&optional yank wide very-wide) - "Like `gnus-summary-reply' except removing reply-to field. -If prefix argument YANK is non-nil, the original article is yanked -automatically. -If WIDE, make a wide reply. -If VERY-WIDE, make a very wide reply." - (interactive - (list (and current-prefix-arg - (gnus-summary-work-articles 1)))) - (let ((gnus-msg-force-broken-reply-to t)) - (gnus-summary-reply yank wide very-wide))) - -(defun gnus-summary-reply-broken-reply-to-with-original (n &optional wide) - "Like `gnus-summary-reply-with-original' except removing reply-to field. -The original article will be yanked." - (interactive "P") - (gnus-summary-reply-broken-reply-to (gnus-summary-work-articles n) wide)) - -(defun gnus-summary-wide-reply (&optional yank) - "Start composing a wide reply mail to the current message. -If prefix argument YANK is non-nil, the original article is yanked -automatically." - (interactive - (list (and current-prefix-arg - (gnus-summary-work-articles 1)))) - (gnus-summary-reply yank t)) - -(defun gnus-summary-wide-reply-with-original (n) - "Start composing a wide reply mail to the current message. -The original article will be yanked." - (interactive "P") - (gnus-summary-reply-with-original n t)) - -(defun gnus-summary-very-wide-reply (&optional yank) - "Start composing a very wide reply mail to the current message. -If prefix argument YANK is non-nil, the original article is yanked -automatically." - (interactive - (list (and current-prefix-arg - (gnus-summary-work-articles 1)))) - (gnus-summary-reply yank t (gnus-summary-work-articles yank))) - -(defun gnus-summary-very-wide-reply-with-original (n) - "Start composing a very wide reply mail to the current message. -The original article will be yanked." - (interactive "P") - (gnus-summary-reply - (gnus-summary-work-articles n) t (gnus-summary-work-articles n))) - -(defun gnus-summary-mail-forward (&optional full-headers post) - "Forward the current message to another user. -If FULL-HEADERS (the prefix), include full headers when forwarding." - (interactive "P") - (gnus-setup-message 'forward - (gnus-summary-select-article) - (let ((charset default-mime-charset)) - (set-buffer gnus-original-article-buffer) - (make-local-variable 'default-mime-charset) - (setq default-mime-charset charset)) - (let ((message-included-forward-headers - (if full-headers "" message-included-forward-headers))) - (message-forward post)))) - -(defun gnus-summary-digest-mail-forward (&optional n post) - "Digests and forwards all articles in this series. -If N is a positive number, forward the N next articles. -If N is a negative number, forward the N previous articles. -If N is nil and any articles have been marked with the process mark, -forward those articles instead. -Optional POST will use news to forward instead of mail." - (interactive "P") - (let ((articles (gnus-summary-work-articles n)) - (topics "Topics:\n") - subject article frame) - (when (car articles) - (gnus-setup-message 'forward - (gnus-summary-select-article) - (if (cdr articles) - (setq articles (sort articles '<) - subject "Digested Articles") - (with-current-buffer gnus-original-article-buffer - (setq subject (message-make-forward-subject)))) - (if post - (message-news nil subject) - (message-mail nil subject)) - (when (and message-use-multi-frames (cdr articles)) - (setq frame (window-frame (get-buffer-window (current-buffer))))) - (message-goto-body) - (while (setq article (pop articles)) - (save-window-excursion - (set-buffer gnus-summary-buffer) - (gnus-summary-select-article nil nil nil article) - (setq topics (concat topics " " - (mail-header-subject gnus-current-headers) - "\n")) - (gnus-summary-remove-process-mark article)) - (when frame - (select-frame frame)) - (insert (mime-make-tag "message" "rfc822") "\n") - (narrow-to-region (point) (point)) - (insert-buffer-substring gnus-original-article-buffer) - (save-restriction - (article-narrow-to-head) - (message-remove-header message-included-forward-headers t nil t)) - (goto-char (point-max)) - (widen)) - (push-mark) - (message-goto-body) - (insert topics) - (message-goto-body) - (mime-edit-enclose-digest-region (point)(mark t)))))) - -(defun gnus-summary-digest-post-forward (&optional n) - "Digest and forwards all articles in this series to a newsgroup. -If N is a positive number, forward the N next articles. -If N is a negative number, forward the N previous articles. -If N is nil and any articles have been marked with the process mark, -forward those articles instead." - (interactive "P") - (gnus-summary-digest-mail-forward n t)) - -(defun gnus-summary-resend-message (address n) - "Resend the current article to ADDRESS." - (interactive - (list (message-read-from-minibuffer "Resend message(s) to: ") - current-prefix-arg)) - (let ((articles (gnus-summary-work-articles n)) - article) - (while (setq article (pop articles)) - (gnus-summary-select-article nil nil nil article) - (save-excursion - (set-buffer gnus-original-article-buffer) - (message-resend address)) - (gnus-summary-mark-article-as-forwarded article)))) - -(defun gnus-summary-post-forward (&optional full-headers) - "Forward the current article to a newsgroup. -If FULL-HEADERS (the prefix), include full headers when forwarding." - (interactive "P") - (gnus-summary-mail-forward full-headers t)) - -(defvar gnus-nastygram-message - "The following article was inappropriately posted to %s.\n\n" - "Format string to insert in nastygrams. -The current group name will be inserted at \"%s\".") - -(defun gnus-summary-mail-nastygram (n) - "Send a nastygram to the author of the current article." - (interactive "P") - (when (or gnus-expert-user - (gnus-y-or-n-p - "Really send a nastygram to the author of the current article? ")) - (let ((group gnus-newsgroup-name)) - (gnus-summary-reply-with-original n) - (set-buffer gnus-message-buffer) - (message-goto-body) - (insert (format gnus-nastygram-message group)) - (message-send-and-exit)))) - -(defun gnus-summary-mail-crosspost-complaint (n) - "Send a complaint about crossposting to the current article(s)." - (interactive "P") - (let ((articles (gnus-summary-work-articles n)) - article) - (while (setq article (pop articles)) - (set-buffer gnus-summary-buffer) - (gnus-summary-goto-subject article) - (let ((group (gnus-group-real-name gnus-newsgroup-name)) - newsgroups followup-to) - (gnus-summary-select-article) - (set-buffer gnus-original-article-buffer) - (if (and (<= (length (message-tokenize-header - (setq newsgroups - (mail-fetch-field "newsgroups")) - ", ")) - 1) - (or (not (setq followup-to (mail-fetch-field "followup-to"))) - (not (member group (message-tokenize-header - followup-to ", "))))) - (if followup-to - (gnus-message 1 "Followup-to restricted") - (gnus-message 1 "Not a crossposted article")) - (set-buffer gnus-summary-buffer) - (gnus-summary-reply-with-original 1) - (set-buffer gnus-message-buffer) - (message-goto-body) - (insert (format gnus-crosspost-complaint newsgroups group)) - (message-goto-subject) - (re-search-forward " *$") - (replace-match " (crosspost notification)" t t) - (gnus-deactivate-mark) - (when (gnus-y-or-n-p "Send this complaint? ") - (message-send-and-exit))))))) - -(defun gnus-summary-mail-other-window () - "Compose mail in other window." - (interactive) - (gnus-setup-message 'message - (message-mail))) - -(defun gnus-mail-parse-comma-list () - (let (accumulated - beg) - (skip-chars-forward " ") - (while (not (eobp)) - (setq beg (point)) - (skip-chars-forward "^,") - (while (zerop - (save-excursion - (save-restriction - (let ((i 0)) - (narrow-to-region beg (point)) - (goto-char beg) - (logand (progn - (while (search-forward "\"" nil t) - (incf i)) - (if (zerop i) 2 i)) - 2))))) - (skip-chars-forward ",") - (skip-chars-forward "^,")) - (skip-chars-backward " ") - (push (buffer-substring beg (point)) - accumulated) - (skip-chars-forward "^,") - (skip-chars-forward ", ")) - accumulated)) - -(defun gnus-inews-add-to-address (group) - (let ((to-address (mail-fetch-field "to"))) - (when (and to-address - (gnus-alive-p)) - ;; This mail group doesn't have a `to-list', so we add one - ;; here. Magic! - (when (gnus-y-or-n-p - (format "Do you want to add this as `to-list': %s " to-address)) - (gnus-group-add-parameter group (cons 'to-list to-address)))))) - -(defun gnus-put-message () - "Put the current message in some group and return to Gnus." - (interactive) - (let ((reply gnus-article-reply) - (winconf gnus-prev-winconf) - (group gnus-newsgroup-name)) - (unless (and group - (not (gnus-group-read-only-p group))) - (setq group (read-string "Put in group: " nil (gnus-writable-groups)))) - - (when (gnus-gethash group gnus-newsrc-hashtb) - (error "No such group: %s" group)) - (save-excursion - (save-restriction - (widen) - (message-narrow-to-headers) - (let ((gnus-deletable-headers nil)) - (message-generate-headers - (if (message-news-p) - message-required-news-headers - message-required-mail-headers))) - (goto-char (point-max)) - (insert "Gcc: " group "\n") - (widen))) - (gnus-inews-do-gcc) - (when (and (get-buffer gnus-group-buffer) - (gnus-buffer-exists-p (car-safe reply)) - (cdr reply)) - (set-buffer (car reply)) - (gnus-summary-mark-article-as-replied (cdr reply))) - (when winconf - (set-window-configuration winconf)))) - -(defun gnus-article-mail (yank) - "Send a reply to the address near point. -If YANK is non-nil, include the original article." - (interactive "P") - (let ((address - (buffer-substring - (save-excursion (re-search-backward "[ \t\n]" nil t) (1+ (point))) - (save-excursion (re-search-forward "[ \t\n]" nil t) (1- (point)))))) - (when address - (message-reply address) - (when yank - (gnus-inews-yank-articles (list (cdr gnus-article-current))))))) - -(defvar nntp-server-type) -(defun gnus-bug () - "Send a bug report to the Gnus maintainers." - (interactive) - (unless (gnus-alive-p) - (error "Gnus has been shut down")) - (gnus-setup-message (if (message-mail-user-agent) 'message 'bug) - (unless (message-mail-user-agent) - (message-pop-to-buffer "*Gnus Bug*") - (delete-other-windows) - (when gnus-bug-create-help-buffer - (switch-to-buffer "*Gnus Help Bug*") - (erase-buffer) - (insert gnus-bug-message) - (goto-char (point-min)) - (sit-for 0) - (set-buffer "*Gnus Bug*"))) - (let ((message-this-is-mail t)) - (message-setup `((To . ,gnus-maintainer) (Subject . "")))) - (when gnus-bug-create-help-buffer - (push `(gnus-bug-kill-buffer) message-send-actions)) - (goto-char (point-min)) - (re-search-forward (concat "^" (regexp-quote mail-header-separator) "$")) - (forward-line 1) - (insert gnus-product-name " " gnus-version-number - " (r" gnus-revision-number ") " - "based on " gnus-original-product-name " v" - gnus-original-version-number "\n" - (emacs-version) "\n") - (when (and (boundp 'nntp-server-type) - (stringp nntp-server-type)) - (insert nntp-server-type)) - (insert "\n\n\n\n\n") - (let (mime-content-types) - (mime-edit-insert-tag "text" "plain" "; type=emacs-lisp")) - (insert (with-temp-buffer - (gnus-debug) - (buffer-string))) - (let (mime-content-types) - (mime-edit-insert-tag "text" "plain")) - (goto-char (point-min)) - (search-forward "Subject: " nil t) - (message ""))) - -(defun gnus-bug-kill-buffer () - (when (get-buffer "*Gnus Help Bug*") - (kill-buffer "*Gnus Help Bug*"))) - -(defun gnus-summary-yank-message (buffer n) - "Yank the current article into a composed message." - (interactive - (list (completing-read "Buffer: " (mapcar 'list (message-buffers)) nil t) - current-prefix-arg)) - (when (gnus-buffer-live-p buffer) - (let ((summary-frame (selected-frame)) - (message-frame (when (static-if (featurep 'xemacs) - (device-on-window-system-p) - window-system) - (let ((window (get-buffer-window buffer t))) - (when window - (window-frame window))))) - (separator (concat "^" (regexp-quote mail-header-separator) - "\n"))) - (gnus-summary-iterate n - (gnus-summary-select-article) - (gnus-copy-article-buffer) - (when (frame-live-p message-frame) - (raise-frame message-frame) - (select-frame message-frame)) - (with-current-buffer buffer - (when (save-excursion - (beginning-of-line) - (let (case-fold-search) - (and (not (re-search-backward separator nil t)) - (re-search-forward separator nil t)))) - (goto-char (match-end 0))) - (message-yank-buffer gnus-article-copy)) - (select-frame summary-frame)) - (when (frame-live-p message-frame) - (select-frame message-frame))))) - -(defun gnus-debug () - "Attempts to go through the Gnus source file and report what variables have been changed. -The source file has to be in the Emacs load path." - (interactive) - (let ((files '("gnus.el" "gnus-sum.el" "gnus-group.el" - "gnus-art.el" "gnus-start.el" "gnus-async.el" - "gnus-msg.el" "gnus-score.el" "gnus-win.el" "gnus-topic.el" - "nnmail.el" "nntp.el" "message.el")) - (point (point)) - file expr olist sym) - (gnus-message 4 "Please wait while we snoop your variables...") - ;; Go through all the files looking for non-default values for variables. - (save-excursion - (sit-for 0) - (set-buffer (gnus-get-buffer-create " *gnus bug info*")) - (while files - (erase-buffer) - (when (and (setq file (locate-library (pop files))) - (file-exists-p file)) - (insert-file-contents file) - (goto-char (point-min)) - (if (not (re-search-forward "^;;* *Internal variables" nil t)) - (gnus-message 4 "Malformed sources in file %s" file) - (narrow-to-region (point-min) (point)) - (goto-char (point-min)) - (while (setq expr (ignore-errors (read (current-buffer)))) - (ignore-errors - (and (memq (car expr) '(defvar defcustom defvoo)) - (stringp (nth 3 expr)) - (or (not (boundp (nth 1 expr))) - (not (equal (eval (nth 2 expr)) - (symbol-value (nth 1 expr))))) - (push (nth 1 expr) olist))))))) - (kill-buffer (current-buffer))) - (when (setq olist (nreverse olist)) - (insert ";----------------- Environment follows ------------------\n\n")) - (while olist - (if (boundp (car olist)) - (condition-case () - (pp `(setq ,(car olist) - ,(if (or (consp (setq sym (symbol-value (car olist)))) - (and (symbolp sym) - (not (or (eq sym nil) - (eq sym t))))) - (list 'quote (symbol-value (car olist))) - (symbol-value (car olist)))) - (current-buffer)) - (error - (format "(setq %s 'whatever)\n" (car olist)))) - (insert ";; (makeunbound '" (symbol-name (car olist)) ")\n")) - (setq olist (cdr olist))) - ;; Remove any control chars - they seem to cause trouble for some - ;; mailers. (Byte-compiled output from the stuff above.) - (goto-char point) - (while (re-search-forward "[\000-\010\013-\037\200-\237]" nil t) - (replace-match (format "\\%03o" (string-to-char (match-string 0))) - t t)) - ;; Break MIME tags purposely. - (goto-char point) - (while (re-search-forward mime-edit-tag-regexp nil t) - (goto-char (1+ (match-beginning 0))) - (insert "X")))) - -;;; Treatment of rejected articles. -;;; Bounced mail. - -(defun gnus-summary-resend-bounced-mail (&optional fetch) - "Re-mail the current message. -This only makes sense if the current message is a bounce message than -contains some mail you have written which has been bounced back to -you. -If FETCH, try to fetch the article that this is a reply to, if indeed -this is a reply." - (interactive "P") - (gnus-summary-select-article t) - (set-buffer gnus-original-article-buffer) - (let ((gnus-message-setup-hook '(gnus-maybe-setup-default-charset))) - (gnus-setup-message 'compose-bounce - (let* ((references (mail-fetch-field "references")) - (parent (and references (gnus-parent-id references)))) - (message-bounce) - ;; If there are references, we fetch the article we answered to. - (and fetch parent - (gnus-summary-refer-article parent) - (gnus-summary-show-all-headers)))))) - -;;; Gcc handling. - -(defun gnus-inews-group-method (group) - (cond - ;; If the group doesn't exist, we assume - ;; it's an archive group... - ((and (null (gnus-get-info group)) - (eq (car (gnus-server-to-method gnus-message-archive-method)) - (car (gnus-server-to-method (gnus-group-method group))))) - gnus-message-archive-method) - ;; Use the method. - ((gnus-info-method (gnus-get-info group)) - (gnus-info-method (gnus-get-info group))) - ;; Find the method. - (t (gnus-server-to-method (gnus-group-method group))))) - -;; Do Gcc handling, which copied the message over to some group. -(defun gnus-inews-do-gcc (&optional gcc) - (interactive) - (save-excursion - (save-restriction - (message-narrow-to-headers) - (let ((gcc (or gcc (mail-fetch-field "gcc" nil t))) - (coding-system-for-write 'raw-text) - (output-coding-system 'raw-text) - groups group method group-art) - (when gcc - (message-remove-header "gcc") - (widen) - (setq groups (message-unquote-tokens - (message-tokenize-header gcc " ,"))) - ;; Copy the article over to some group(s). - (while (setq group (pop groups)) - (unless (gnus-check-server - (setq method (gnus-inews-group-method group))) - (error "Can't open server %s" (if (stringp method) method - (car method)))) - (unless (gnus-request-group group nil method) - (gnus-request-create-group group method)) - (save-excursion - (nnheader-set-temp-buffer " *acc*") - (insert-buffer-substring message-encoding-buffer) - (gnus-run-hooks 'gnus-before-do-gcc-hook) - (goto-char (point-min)) - (when (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "$") - nil t) - (replace-match "" t t )) - (unless (setq group-art - (gnus-request-accept-article group method t t)) - (gnus-message 1 "Couldn't store article in group %s: %s" - group (gnus-status-message method)) - (sit-for 2)) - (when (and group-art gnus-inews-mark-gcc-as-read) - (gnus-group-mark-article-read group (cdr group-art))) - (kill-buffer (current-buffer))))))))) - -(defun gnus-inews-insert-gcc () - "Insert Gcc headers based on `gnus-outgoing-message-group'." - (save-excursion - (save-restriction - (message-narrow-to-headers) - (let* ((group gnus-outgoing-message-group) - (gcc (cond - ((gnus-functionp group) - (funcall group)) - ((or (stringp group) (list group)) - group)))) - (when gcc - (insert "Gcc: " - (if (stringp gcc) gcc - (mapconcat 'identity gcc " ")) - "\n")))))) - -(defun gnus-inews-insert-archive-gcc (&optional group) - "Insert the Gcc to say where the article is to be archived." - (let* ((var gnus-message-archive-group) - (group (or group gnus-newsgroup-name "")) - (gcc-self-val - (and gnus-newsgroup-name - (not (equal gnus-newsgroup-name "")) - (gnus-group-find-parameter - gnus-newsgroup-name 'gcc-self))) - result - (groups - (cond - ((null gnus-message-archive-method) - ;; Ignore. - nil) - ((stringp var) - ;; Just a single group. - (list var)) - ((null var) - ;; We don't want this. - nil) - ((and (listp var) (stringp (car var))) - ;; A list of groups. - var) - ((gnus-functionp var) - ;; A function. - (funcall var group)) - (t - ;; An alist of regexps/functions/forms. - (while (and var - (not - (setq result - (cond - ((stringp (caar var)) - ;; Regexp. - (when (string-match (caar var) group) - (cdar var))) - ((gnus-functionp (car var)) - ;; Function. - (funcall (car var) group)) - (t - (eval (car var))))))) - (setq var (cdr var))) - result))) - name) - (when (or groups gcc-self-val) - (when (stringp groups) - (setq groups (list groups))) - (save-excursion - (save-restriction - (message-narrow-to-headers) - (goto-char (point-max)) - (insert "Gcc: ") - (if gcc-self-val - ;; Use the `gcc-self' param value instead. - (progn - (insert - (if (stringp gcc-self-val) - gcc-self-val - group)) - (if (not (eq gcc-self-val 'none)) - (insert "\n") - (progn - (beginning-of-line) - (kill-line)))) - ;; Use the list of groups. - (while (setq name (pop groups)) - (insert (if (string-match ":" name) - name - (gnus-group-prefixed-name - name gnus-message-archive-method))) - (when groups - (insert " "))) - (insert "\n"))))))) - -;;; Posting styles. - -(defun gnus-configure-posting-styles () - "Configure posting styles according to `gnus-posting-styles'." - (unless gnus-inhibit-posting-styles - (let ((group (or gnus-newsgroup-name "")) - (styles gnus-posting-styles) - style match variable attribute value v results - filep name address element) - ;; If the group has a posting-style parameter, add it at the end with a - ;; regexp matching everything, to be sure it takes precedence over all - ;; the others. - (when gnus-newsgroup-name - (let ((tmp-style (gnus-group-find-parameter group 'posting-style t))) - (when tmp-style - (setq styles (append styles (list (cons ".*" tmp-style))))))) - ;; Go through all styles and look for matches. - (dolist (style styles) - (setq match (pop style)) - (goto-char (point-min)) - (when (cond - ((stringp match) - ;; Regexp string match on the group name. - (string-match match group)) - ((eq match 'header) - (and (gnus-buffer-live-p gnus-article-copy) - (with-current-buffer gnus-article-copy - (let ((header (message-fetch-field (pop style)))) - (and header - (string-match (pop style) header)))))) - ((or (symbolp match) - (gnus-functionp match)) - (cond - ((gnus-functionp match) - ;; Function to be called. - (funcall match)) - ((boundp match) - ;; Variable to be checked. - (symbol-value match)))) - ((listp match) - ;; This is a form to be evaled. - (eval match))) - ;; We have a match, so we set the variables. - (dolist (attribute style) - (setq element (pop attribute) - variable nil - filep nil) - (setq value - (cond - ((eq (car attribute) ':file) - (setq filep t) - (cadr attribute)) - ((eq (car attribute) :value) - (cadr attribute)) - (t - (car attribute)))) - ;; We get the value. - (setq v - (cond - ((stringp value) - value) - ((or (symbolp value) - (gnus-functionp value)) - (cond ((gnus-functionp value) - (funcall value)) - ((boundp value) - (symbol-value value)))) - ((listp value) - (eval value)))) - ;; Translate obsolescent value. - (when (eq element 'signature-file) - (setq element 'signature - filep t)) - ;; Get the contents of file elems. - (when (and filep v) - (setq v (with-temp-buffer - (insert-file-contents v) - (buffer-string)))) - (setq results (delq (assoc element results) results)) - (push (cons element v) results)))) - ;; Now we have all the styles, so we insert them. - (setq name (assq 'name results) - address (assq 'address results)) - (setq results (delq name (delq address results))) - (make-local-variable 'message-setup-hook) - (dolist (result results) - (add-hook 'message-setup-hook - (cond - ((eq 'eval (car result)) - 'ignore) - ((eq 'body (car result)) - `(lambda () - (save-excursion - (message-goto-body) - (insert ,(cdr result))))) - ((eq 'signature (car result)) - (set (make-local-variable 'message-signature) nil) - (set (make-local-variable 'message-signature-file) nil) - (if (not (cdr result)) - 'ignore - `(lambda () - (save-excursion - (let ((message-signature ,(cdr result))) - (when message-signature - (message-insert-signature))))))) - (t - (let ((header - (if (symbolp (car result)) - (capitalize (symbol-name (car result))) - (car result)))) - `(lambda () - (save-excursion - (message-remove-header ,header) - (let ((value ,(cdr result))) - (when value - (message-goto-eoh) - (insert ,header ": " value "\n")))))))))) - (when (or name address) - (add-hook 'message-setup-hook - `(lambda () - (set (make-local-variable 'user-mail-address) - ,(or (cdr address) user-mail-address)) - (let ((user-full-name ,(or (cdr name) (user-full-name))) - (user-mail-address - ,(or (cdr address) user-mail-address))) - (save-excursion - (message-remove-header "From") - (message-goto-eoh) - (insert "From: " (message-make-from) "\n"))))))))) - - -;;; @ for MIME Edit mode -;;; - -(defun gnus-maybe-setup-default-charset () - (let ((charset - (and (boundp 'gnus-summary-buffer) - (buffer-live-p gnus-summary-buffer) - (save-excursion - (set-buffer gnus-summary-buffer) - default-mime-charset)))) - (if charset - (progn - (make-local-variable 'default-mime-charset) - (setq default-mime-charset charset) - )))) - - -;;; @ for MIME view mode -;;; - -(defun gnus-following-method (buf) - (gnus-setup-message 'reply-yank - (set-buffer buf) - (if (message-news-p) - (message-followup) - (message-reply nil 'wide)) - (let ((message-reply-buffer buf)) - (message-yank-original)) - (message-goto-body)) - (kill-buffer buf)) - - -;;; Allow redefinition of functions. - -(gnus-ems-redefine) - -(provide 'gnus-msg) - -;;; gnus-msg.el ends here diff --git a/lisp/gnus-nocem.el b/lisp/gnus-nocem.el deleted file mode 100644 index 0ae227c..0000000 --- a/lisp/gnus-nocem.el +++ /dev/null @@ -1,390 +0,0 @@ -;;; gnus-nocem.el --- NoCeM pseudo-cancellation treatment - -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'gnus-clfns)) - -(require 'gnus) -(require 'nnmail) -(require 'gnus-art) -(require 'gnus-sum) -(require 'gnus-range) - -(defgroup gnus-nocem nil - "NoCeM pseudo-cancellation treatment" - :group 'gnus-score) - -(defcustom gnus-nocem-groups - '("news.lists.filters" "news.admin.net-abuse.bulletins" - "alt.nocem.misc" "news.admin.net-abuse.announce") - "*List of groups that will be searched for NoCeM messages." - :group 'gnus-nocem - :type '(repeat (string :tag "Group"))) - -(defcustom gnus-nocem-issuers - '("AutoMoose-1" ; CancelMoose[tm] - "clewis@ferret.ocunix" ; Chris Lewis - "cosmo.roadkill" - "SpamHippo" - "hweede@snafu.de") - "*List of NoCeM issuers to pay attention to. - -This can also be a list of `(ISSUER CONDITION ...)' elements. - -See for an -issuer registry." - :group 'gnus-nocem - :type '(repeat (choice string sexp))) - -(defcustom gnus-nocem-directory - (nnheader-concat gnus-article-save-directory "NoCeM/") - "*Directory where NoCeM files will be stored." - :group 'gnus-nocem - :type 'directory) - -(defcustom gnus-nocem-expiry-wait 15 - "*Number of days to keep NoCeM headers in the cache." - :group 'gnus-nocem - :type 'integer) - -(defcustom gnus-nocem-verifyer 'mc-verify - "*Function called to verify that the NoCeM message is valid. -One likely value is `mc-verify'. If the function in this variable -isn't bound, the message will be used unconditionally." - :group 'gnus-nocem - :type '(radio (function-item mc-verify) - (function :tag "other"))) - -(defcustom gnus-nocem-liberal-fetch nil - "*If t try to fetch all messages which have @@NCM in the subject. -Otherwise don't fetch messages which have references or whose message-id -matches an previously scanned and verified nocem message." - :group 'gnus-nocem - :type 'boolean) - -(defcustom gnus-nocem-check-article-limit 500 - "*If non-nil, the maximum number of articles to check in any NoCeM group." - :group 'gnus-nocem - :version "21.1" - :type '(choice (const :tag "unlimited" nil) - (integer 1000))) - -(defcustom gnus-nocem-check-from t - "Non-nil means check for valid issuers in message bodies. -Otherwise don't bother fetching articles unless their author matches a -valid issuer, which is much faster if you are selective about the issuers." - :group 'gnus-nocem - :version "21.1" - :type 'boolean) - -;;; Internal variables - -(defvar gnus-nocem-active nil) -(defvar gnus-nocem-alist nil) -(defvar gnus-nocem-touched-alist nil) -(defvar gnus-nocem-hashtb nil) -(defvar gnus-nocem-seen-message-ids nil) - -;;; Functions - -(defun gnus-nocem-active-file () - (concat (file-name-as-directory gnus-nocem-directory) "active")) - -(defun gnus-nocem-cache-file () - (concat (file-name-as-directory gnus-nocem-directory) "cache")) - -;; -;; faster lookups for group names: -;; - -(defvar gnus-nocem-real-group-hashtb nil - "Real-name mappings of subscribed groups.") - -(defun gnus-fill-real-hashtb () - "Fill up a hash table with the real-name mappings from the user's active file." - (setq gnus-nocem-real-group-hashtb (gnus-make-hashtable - (length gnus-newsrc-alist))) - (mapcar (lambda (group) - (setq group (gnus-group-real-name (car group))) - (gnus-sethash group t gnus-nocem-real-group-hashtb)) - gnus-newsrc-alist)) - -(defun gnus-nocem-scan-groups () - "Scan all NoCeM groups for new NoCeM messages." - (interactive) - (let ((groups gnus-nocem-groups) - (gnus-inhibit-demon t) - group active gactive articles check-headers) - (gnus-make-directory gnus-nocem-directory) - ;; Load any previous NoCeM headers. - (gnus-nocem-load-cache) - ;; Get the group name mappings: - (gnus-fill-real-hashtb) - ;; Read the active file if it hasn't been read yet. - (and (file-exists-p (gnus-nocem-active-file)) - (not gnus-nocem-active) - (ignore-errors - (load (gnus-nocem-active-file) t t t))) - ;; Go through all groups and see whether new articles have - ;; arrived. - (while (setq group (pop groups)) - (if (not (setq gactive (gnus-activate-group group))) - () ; This group doesn't exist. - (setq active (nth 1 (assoc group gnus-nocem-active))) - (when (and (not (< (cdr gactive) (car gactive))) ; Empty group. - (or (not active) - (< (cdr active) (cdr gactive)))) - ;; Ok, there are new articles in this group, se we fetch the - ;; headers. - (save-excursion - (let ((dependencies (make-vector 10 nil)) - headers header) - (with-temp-buffer - (setq headers - (if (eq 'nov - (gnus-retrieve-headers - (setq articles - (gnus-uncompress-range - (cons - (if active (1+ (cdr active)) - (car gactive)) - (cdr gactive)))) - group)) - (gnus-get-newsgroup-headers-xover - articles nil dependencies) - (gnus-get-newsgroup-headers dependencies))) - (while (setq header (pop headers)) - ;; We take a closer look on all articles that have - ;; "@@NCM" in the subject. Unless we already read - ;; this cross posted message. Nocem messages - ;; are not allowed to have references, so we can - ;; ignore scanning followups. - (and (string-match "@@NCM" (mail-header-subject header)) - (and gnus-nocem-check-from - (let ((case-fold-search t)) - (catch 'ok - (mapcar - (lambda (author) - (if (consp author) - (setq author (car author))) - (if (string-match - author (mail-header-from header)) - (throw 'ok t))) - gnus-nocem-issuers) - nil))) - (or gnus-nocem-liberal-fetch - (and (or (string= "" (mail-header-references - header)) - (null (mail-header-references header))) - (not (member (mail-header-message-id header) - gnus-nocem-seen-message-ids)))) - (push header check-headers))) - (let* ((i 0) - (check-headers - (last check-headers gnus-nocem-check-article-limit)) - (len (length check-headers))) - (dolist (h check-headers) - (gnus-message - 7 "Checking article %d in %s for NoCeM (%d of %d)..." - (mail-header-number h) group (incf i) len) - (gnus-nocem-check-article group h))))))) - (setq gnus-nocem-active - (cons (list group gactive) - (delq (assoc group gnus-nocem-active) - gnus-nocem-active))))) - ;; Save the results, if any. - (gnus-nocem-save-cache) - (gnus-nocem-save-active))) - -(defun gnus-nocem-check-article (group header) - "Check whether the current article is an NCM article and that we want it." - ;; Get the article. - (let ((date (mail-header-date header)) - (gnus-newsgroup-name group) - issuer b e type) - (when (or (not date) - (time-less-p - (time-since (date-to-time date)) - (days-to-time gnus-nocem-expiry-wait))) - (gnus-request-article-this-buffer (mail-header-number header) group) - (goto-char (point-min)) - (when (re-search-forward "-----BEGIN PGP MESSAGE-----" nil t) - (delete-region (point-min) (match-beginning 0))) - (when (re-search-forward "-----END PGP MESSAGE-----\n?" nil t) - (delete-region (match-end 0) (point-max))) - (goto-char (point-min)) - ;; The article has to have proper NoCeM headers. - (when (and (setq b (search-forward "\n@@BEGIN NCM HEADERS\n" nil t)) - (setq e (search-forward "\n@@BEGIN NCM BODY\n" nil t))) - ;; We get the name of the issuer. - (narrow-to-region b e) - (setq issuer (mail-fetch-field "issuer") - type (mail-fetch-field "issuer")) - (widen) - (if (not (gnus-nocem-message-wanted-p issuer type)) - (message "invalid NoCeM issuer: %s" issuer) - (and (gnus-nocem-verify-issuer issuer) ; She is who she says she is. - (gnus-nocem-enter-article) ; We gobble the message. - (push (mail-header-message-id header) ; But don't come back for - gnus-nocem-seen-message-ids))))))) ; second helpings. - -(defun gnus-nocem-message-wanted-p (issuer type) - (let ((issuers gnus-nocem-issuers) - wanted conditions condition) - (cond - ;; Do the quick check first. - ((member issuer issuers) - t) - ((setq conditions (cdr (assoc issuer issuers))) - ;; Check whether we want this type. - (while (setq condition (pop conditions)) - (cond - ((stringp condition) - (setq wanted (string-match condition type))) - ((and (consp condition) - (eq (car condition) 'not) - (stringp (cadr condition))) - (setq wanted (not (string-match (cadr condition) type)))) - (t - (error "Invalid NoCeM condition: %S" condition)))) - wanted)))) - -(defun gnus-nocem-verify-issuer (person) - "Verify using PGP that the canceler is who she says she is." - (if (fboundp gnus-nocem-verifyer) - (ignore-errors - (funcall gnus-nocem-verifyer)) - ;; If we don't have Mailcrypt, then we use the message anyway. - t)) - -(defun gnus-nocem-enter-article () - "Enter the current article into the NoCeM cache." - (goto-char (point-min)) - (let ((b (search-forward "\n@@BEGIN NCM BODY\n" nil t)) - (e (search-forward "\n@@END NCM BODY\n" nil t)) - (buf (current-buffer)) - ncm id group) - (when (and b e) - (narrow-to-region b (1+ (match-beginning 0))) - (goto-char (point-min)) - (while (search-forward "\t" nil t) - (cond - ((not (ignore-errors - (setq group (let ((obarray gnus-active-hashtb)) (read buf))))) - ;; An error. - ) - ((not (symbolp group)) - ;; Ignore invalid entries. - ) - ((not (boundp group)) - ;; Make sure all entries in the hashtb are bound. - (set group nil)) - (t - (when (gnus-gethash (gnus-group-real-name (symbol-name group)) - gnus-nocem-real-group-hashtb) - ;; Valid group. - (beginning-of-line) - (while (eq (char-after) ?\t) - (forward-line -1)) - (setq id (buffer-substring (point) (1- (search-forward "\t")))) - (unless (gnus-gethash id gnus-nocem-hashtb) - ;; only store if not already present - (gnus-sethash id t gnus-nocem-hashtb) - (push id ncm)) - (forward-line 1) - (while (eq (char-after) ?\t) - (forward-line 1)))))) - (when ncm - (setq gnus-nocem-touched-alist t) - (push (cons (let ((time (current-time))) (setcdr (cdr time) nil) time) - ncm) - gnus-nocem-alist)) - t))) - -(defun gnus-nocem-load-cache () - "Load the NoCeM cache." - (interactive) - (unless gnus-nocem-alist - ;; The buffer doesn't exist, so we create it and load the NoCeM - ;; cache. - (when (file-exists-p (gnus-nocem-cache-file)) - (load (gnus-nocem-cache-file) t t t) - (gnus-nocem-alist-to-hashtb)))) - -(defun gnus-nocem-save-cache () - "Save the NoCeM cache." - (when (and gnus-nocem-alist - gnus-nocem-touched-alist) - (with-temp-file (gnus-nocem-cache-file) - (gnus-prin1 `(setq gnus-nocem-alist ',gnus-nocem-alist))) - (setq gnus-nocem-touched-alist nil))) - -(defun gnus-nocem-save-active () - "Save the NoCeM active file." - (with-temp-file (gnus-nocem-active-file) - (gnus-prin1 `(setq gnus-nocem-active ',gnus-nocem-active)))) - -(defun gnus-nocem-alist-to-hashtb () - "Create a hashtable from the Message-IDs we have." - (let* ((alist gnus-nocem-alist) - (pprev (cons nil alist)) - (prev pprev) - (expiry (days-to-time gnus-nocem-expiry-wait)) - entry) - (setq gnus-nocem-hashtb (gnus-make-hashtable (* (length alist) 51))) - (while (setq entry (car alist)) - (if (not (time-less-p (time-since (car entry)) expiry)) - ;; This entry has expired, so we remove it. - (setcdr prev (cdr alist)) - (setq prev alist) - ;; This is ok, so we enter it into the hashtable. - (setq entry (cdr entry)) - (while entry - (gnus-sethash (car entry) t gnus-nocem-hashtb) - (setq entry (cdr entry)))) - (setq alist (cdr alist))))) - -(gnus-add-shutdown 'gnus-nocem-close 'gnus) - -(defun gnus-nocem-close () - "Clear internal NoCeM variables." - (setq gnus-nocem-alist nil - gnus-nocem-hashtb nil - gnus-nocem-active nil - gnus-nocem-touched-alist nil - gnus-nocem-seen-message-ids nil - gnus-nocem-real-group-hashtb nil)) - -(defun gnus-nocem-unwanted-article-p (id) - "Say whether article ID in the current group is wanted." - (and gnus-nocem-hashtb - (gnus-gethash id gnus-nocem-hashtb))) - -(provide 'gnus-nocem) - -;;; gnus-nocem.el ends here diff --git a/lisp/gnus-offline.el b/lisp/gnus-offline.el deleted file mode 100644 index fd97d06..0000000 --- a/lisp/gnus-offline.el +++ /dev/null @@ -1,978 +0,0 @@ -;;; gnus-offline.el --- To process mail & news at offline environment. - -;;; Copyright (C) 1998, 2001 Tatsuya Ichikawa -;;; Copyright (C) 1998, 2001 Yukihiro Ito -;;; Author: Tatsuya Ichikawa -;;; Yukihiro Ito -;;; Hidekazu Nakamura -;;; Tsukamoto Tetsuo - -;;; Version: 2.20 -;;; Keywords: news , mail , offline , gnus -;;; -;;; SPECIAL THANKS -;;; Keiichi Suzuki -;;; KORIYAMA Naohiro -;;; Katsumi Yamaoka - -;;; This file is part of Semi-gnus. -;;; -;;; GNU Emacs 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, or (at your option) -;;; any later version. - -;;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;;; Boston, MA 02111-1307, USA. -;;; -;;;; Commentary: -;;; Note. -;;; This file works only with after version of Emacs 19.30. -;;; This file needs miee.el and SEMI. -;;; If you set gnus-offline-drafts-queue-type to 'agent , you don't need -;;; miee.el -;;; You must use T-gnus 6.12.0 or later. -;;; -;;; How to use. -;;; -;;; Add following code at the end in your .emacs -;;; -;;; (load "gnus-ofsetup") -;;; (gnus-setup-for-offline) -;;; -;;; If you use gnus-agent as souper , put gnus-agent setup code in you .gnus.el -;;; -;;; If you use nnspool as souper , put following code in your .emacs before -;;; gnus-offline setting. -;;; -;;; Then , put hang.exe in exec-path directory. -;;; -;;; In Gnus group buffer , type g to get all news and mail. -;;; Then send mail and news in spool directory. -;;; -;;; Variables. -;;; gnus-offline-dialup-program-arguments -;;; ... List of dialup program arguments. -;;; gnus-offline-hangup-program-arguments -;;; ... List of hangup program arguments. -;;; gnus-offline-mail-treat-environ ... toggle sending mail online/offline. -;;; gnus-offline-articles-to-fetch ... toggle fetch articles. -;;; both->mail->news->both... -;;; gnus-offline-load-hook ... hook before gnus-offline load. -;;; gnus-offline-before-online-hook ... hook before all online jobs. -;;; gnus-offline-after-online-hook ... hook after all online jobs. -;;; gnus-offline-interval-time ... Interval time to do all online jobs. -;;; (minutes) -;;; gnus-offline-dialup-function ... Function to diualup. -;;; gnus-offline-hangup-function ... Function to hangup. - -;;; Code: - -(eval '(run-hooks 'gnus-offline-load-hook)) - -(eval-when-compile (require 'cl)) - -(eval-when-compile - (require 'static) - (require 'gnus-agent) - (require 'gnus-group)) -(require 'custom) -(require 'easymenu) -(provide 'gnus-offline) - -(defgroup gnus-offline nil - "Offline backend utility for Gnus." - :prefix "gnus-offline-" - :group 'gnus - :group 'mail - :group 'news) - -(defconst gnus-offline-version-number "2.20") -(defconst gnus-offline-codename -;; "Beta5" ; Beta -;; "This is the time" ; 2.00 -;; "A matter of trust" -;; "Modern Woman" -;; "Ahhhhhhh!!" ; 2.10b1 - "Cup of life" ; 2.20 -;; "Code of silence" - ) - -(defconst gnus-offline-version (format "Gnus offline backend utiliy v%s" - gnus-offline-version-number)) - -(eval-when-compile - (defvar nnagent-version) - (defvar nnspool-version) - (defvar msspool-news-server) - (defvar msspool-news-service) - (defvar miee-popup-menu)) - -(if (featurep 'meadow) - (define-process-argument-editing "/hang\\.exe\\'" - (lambda (x) - (general-process-argument-editing-function - x nil t t nil t t)))) - -(defcustom gnus-offline-auto-ppp '(connect disconnect) - "*This variable decides whether to connect and/or disconnect automatically." - :group 'gnus-offline - :type '(choice - (const :tag "Connection and Disconnection" (connect disconnect)) - (const :tag "Connection Only" (connect)) - (const :tag "Do Everything Manually" nil))) - -(defcustom gnus-offline-load-hook nil - "*Hook to be run after the gnus-offline package has been loaded." - :group 'gnus-offline - :type 'hook) - -(defcustom gnus-offline-before-online-hook nil - "*Hook to be run before all online jobs." - :group 'gnus-offline - :type 'hook) - -(defcustom gnus-offline-after-online-hook nil - "*Hook to be run after all online jobs." - :group 'gnus-offline - :type 'hook) - -(defcustom gnus-offline-mail-treat-environ 'offline - "*If online , gnus-offline send all mail under online environ. -If offline , gnus-offline send all mail temporary to spool dir." - :group 'gnus-offline - :type '(choice (const offline) - (const online))) - -(defcustom gnus-offline-articles-to-fetch 'both - "*If both , gnus-offline fetch mail and news articles. -If mail , gnus-offline only fetch mail articles. - If news , gnus-offline only fetch news articles." - :group 'gnus-offline - :type '(choice (const both) - (const mail) - (const news))) - -(defcustom gnus-offline-mail-group-level 1 - "*Group level for mail group." - :group 'gnus-offline - :type 'integer) - -(defcustom gnus-offline-after-empting-spool-hook nil - "*Hook to be run before empting spool." - :group 'gnus-offline - :type 'hook) - -(defcustom gnus-offline-before-empting-spool-hook nil - "*Hook to be run after empting spool." - :group 'gnus-offline - :type 'hook) - -(defcustom gnus-offline-dialup-function 'gnus-offline-connect-server - "*Function to dialup." - :group 'gnus-offline - :type 'function) - -(defcustom gnus-offline-hangup-function 'gnus-offline-hangup-line - "*Function to hangup." - :group 'gnus-offline - :type 'function) - -(defcustom gnus-offline-auto-expire t - "*Non-nil means expire articles on every session." - :group 'gnus-offline - :type 'boolean) - -;; These variables should be customized using `gnus-offline-customize', -;; not by `customize'. - -(defvar gnus-offline-dialup-program nil - "*Program name for dialup.") - -(defvar gnus-offline-hangup-program nil - "*Program name for hangup.") - -(defvar gnus-offline-dialup-program-arguments nil - "*Program arguments of gnus-offline-dialup-program.") - -(defvar gnus-offline-hangup-program-arguments nil - "*Program arguments of gnus-offline-hangup-program.") - -(defvar gnus-offline-interval-time 0 - "*Interval time(minutes) to do online jobs. -If set to 0 , timer call is disabled.") - -(defvar gnus-offline-drafts-queue-type 'agent - "*Queuing function used for draft messages.") - -(defvar gnus-offline-MTA-type 'smtp - "*Type of MTA, sendmail or smtp.el.") - -;;; Internal variables. -(defvar gnus-offline-connected nil - "*If value is t , dialup line is connected status. -If value is nil , dialup line is disconnected status.") - -(defvar gnus-offline-news-fetch-method nil - "*Method to fetch news articles.") - -(defvar gnus-offline-mail-fetch-method nil - "*Method to fetch mail articles.") - -(defvar gnus-offline-header-string - (format "%s - \"%s\"" - gnus-offline-version - gnus-offline-codename) - "*Header string for gnus-offline.") - -(defvar gnus-offline-stored-group-level nil - "*Mail Group level before changing.") - -(defvar gnus-offline-mail-source nil - "*mail-sources save variable.") - -(defvar gnus-offline-lang) - -(defvar gnus-offline-resource-en - '((error-check-1 - . "WARNING!!: gnus-agent.el or nnagent.el is not loaded. -Please check your .emacs or .gnus.el to work gnus-agent fine.") - (error-check-2 ."WARNING!!: nnspool.el is not loaded. -Please check your .emacs or .gnus.el to work nnspool fine.") - (connect-server-1 . "Dialing ...") - (connect-server-2 . "Dialing ... done.") - (get-new-news-function-1 . "Set to online status.") - (hangup-line-1 . "Hang up line ... ") - (hangup-line-2 . "Hang up line ... done.") - (after-jobs-done-1 . "All online jobs has done.") - (set-auto-ppp-1 . "Connect and disconnect automatically.") - (set-auto-ppp-2 . "Connect automatically.") - (set-auto-ppp-3 . "Connect and disconnect manually.") - (set-auto-ppp-menu-1 . "Automatically Connect/Disconnect") - (set-auto-ppp-menu-2 . "Automatically Connect") - (set-auto-ppp-menu-3 . "Manually Connect/Disconnect") - (toggle-on/off-send-mail-1 . "Sending mail immidiately.") - (toggle-on/off-send-mail-2 . "Sending mail temporary to spool directory.") - (toggle-articles-to-fetch-1 . "Articles fetch from server.") - (toggle-articles-to-fetch-2 . "Only Mail") - (toggle-articles-to-fetch-3 . "Only News") - (toggle-articles-to-fetch-4 . "Mail/News both") - (empting-spool-1 . "Sending mails in spool ...") - (empting-spool-2 . "Sending mails in spool ... done.") - (empting-spool-3 . "Posting news in spool ...") - (empting-spool-4 . "Posting news in spool ... done.") - (empting-spool-5 . "Sending messages in spool ...") - (empting-spool-6 . "Sending messages in spool ... done.") - (interval-time-1 . "Interval time (now %d minutes) : ") - (interval-time-2 . "Retrieving message logic by timer is disabled.") - (interval-time-3 . "Interval time set to %d minutes") - (menu-miee-1 . "Post news in spool") - (menu-miee-2 . "Send mails in spool") - (menu-miee-3 . "Message Offline") - (menu-miee-4 . "Message Online") - (menu-1 . "Toggle articles to fetch") - (menu-2 . "Toggle online/offline send mail") - (menu-3 . "Set auto PPP") - (menu-4 . "Expire articles") - (menu-5 . "Set interval time") - (menu-6 . "Hang up Line.") - (menu-7 . "Customize options..."))) - -(defvar gnus-offline-resource-ja - '((error-check-1 - . "$B7Y9p(B!!: gnus-agent.el $B$^$?$O(B nnagent.el $B$,%m!<%I$5$l$F$$$^$;$s!#(B -.emacs $B$^$?$O(B .gnus.el $B$N(B gnus-agent $B$N@_Dj$r@5$7$/$7$F$/$@$5$$!#(B") - (error-check-2 ."$B7Y9p(B!!: nnspool.el $B$,%m!<%I$5$l$F$$$^$;$s!#(B -.emacs $B$^$?$O(B .gnus.el $B$N(B nnspool $B$N@_Dj$r@5$7$/$7$F$/$@$5$$!#(B") - (connect-server-1 . "$B@\B3$7$F$$$^$9(B...") - (connect-server-2 . "$B@\B3$7$F$$$^$9(B...$B40N;!#(B") - (get-new-news-function-1 . "$B%*%s%i%$%s>uBV$G$9!#(B") - (set-auto-ppp-1 . "$B<+F0E*$K(B PPP $B@\B3!&@ZCG$7$^$9!#(B") - (set-auto-ppp-2 . "$B<+F0E*$K(B PPP $B@\B3$7$^$9!#(B") - (set-auto-ppp-3 . "$B@\Aw?.$7$^$9!#(B") - (toggle-on/off-send-mail-2 . "$B%a!<%k$O%-%e!<$KAw$i$l$^$9!#(B") - (toggle-articles-to-fetch-1 . "$BJ}$G$9!#(B") - (empting-spool-1 . "$B%-%e!<$N%a!<%k$rAw?.Cf(B...") - (empting-spool-2 . "$B%-%e!<$N%a!<%k$rAw?.Cf(B... $B40N;!#(B") - (empting-spool-3 . "$B%-%e!<$N%K%e!<%95-;v$rAw?.Cf(B...") - (empting-spool-4 . "$B%-%e!<$N%K%e!<%95-;v$rAw?.Cf(B... $B40N;!#(B") - (empting-spool-5 . "$B%-%e!<$N%a%C%;!<%8$rAw?.Cf(B...") - (empting-spool-6 . "$B%-%e!<$N%a%C%;!<%8$rAw?.Cf(B... $B40N;!#(B") - (interval-time-1 . "$BAwuBV$X(B") - (menu-miee-4 . "Online $B>uBV$X(B") - (menu-1 . "$BC$9(B") - (menu-5 . "$B5-;v mail -> news -> both -;; -(defun gnus-offline-toggle-articles-to-fetch () - "*Set articles to fetch... both(Mail/News) -> mail only -> News only -> both" - (interactive) - (let ((string (gnus-offline-gettext 'toggle-articles-to-fetch-1)) - str) - (cond ((eq gnus-offline-articles-to-fetch 'both) - (setq gnus-offline-articles-to-fetch 'mail - str (gnus-offline-gettext 'toggle-articles-to-fetch-2))) - ((eq gnus-offline-articles-to-fetch 'mail) - (setq gnus-offline-articles-to-fetch 'news - str (gnus-offline-gettext 'toggle-articles-to-fetch-3))) - (t - (setq gnus-offline-articles-to-fetch 'both - str (gnus-offline-gettext 'toggle-articles-to-fetch-4)))) - (message "%s %s" string str))) -;; -;; Send mail and Post news using Miee or gnus-agent. -;; -(defun gnus-offline-empting-spool () - "*Send all drafts on queue." - (run-hooks 'gnus-offline-before-empting-spool-hook) - (if (eq gnus-offline-drafts-queue-type 'miee) - ;; Send queued message by miee.el. - (progn - (if (eq gnus-offline-mail-treat-environ 'offline) - (progn - (message "%s" (gnus-offline-gettext 'empting-spool-1)) - ;; Using miee to send mail. - (mail-spool-send) - (message "%s" (gnus-offline-gettext 'empting-spool-2)))) - (message "%s" (gnus-offline-gettext 'empting-spool-3)) - ;; Using miee to post news. - (if (and (not (stringp msspool-news-server)) - (not msspool-news-service)) - (progn - (setq msspool-news-server (nth 1 gnus-select-method)) - (setq msspool-news-service 119))) - (news-spool-post) - (message "%s" (gnus-offline-gettext 'empting-spool-4))) - ;; Send queued message by gnus-agent - (message "%s" (gnus-offline-gettext 'empting-spool-5)) - (gnus-group-send-drafts) - (message "%s" (gnus-offline-gettext 'empting-spool-6))) - ;; - (run-hooks 'gnus-offline-after-empting-spool-hook)) -;; -;; Set interval time -;; -(defun gnus-offline-set-interval-time () - "*Set interval time for gnus-daemon." - (interactive) - (setq gnus-offline-interval-time - (string-to-int (read-from-minibuffer - (format (gnus-offline-gettext 'interval-time-1) - gnus-offline-interval-time) - nil))) - (if (< gnus-offline-interval-time 2) - (progn - (message "%s" (gnus-offline-gettext 'interval-time-2)) - (setq gnus-offline-interval-time 0)) - (message - (format (gnus-offline-gettext 'interval-time-3) - gnus-offline-interval-time))) - (gnus-offline-processed-by-timer)) - -;; -;; Menu. -;; -(defun gnus-offline-define-menu-and-key () - "*Set key and menu." - (cond ((eq gnus-offline-drafts-queue-type 'miee) - (static-cond - ((featurep 'xemacs) - (add-hook 'gnus-group-mode-hook 'gnus-offline-define-menu-on-miee)) - (t - (gnus-offline-define-menu-on-miee)))) - (t - (add-hook 'gnus-group-mode-hook 'gnus-offline-define-menu-on-agent))) - ;; - (add-hook 'gnus-group-mode-hook - #'(lambda () - (local-set-key "\C-coh" 'gnus-offline-set-unplugged-state) - (local-set-key "\C-cof" 'gnus-offline-toggle-articles-to-fetch) - (local-set-key "\C-coo" 'gnus-offline-toggle-on/off-send-mail) - (local-set-key "\C-cox" 'gnus-offline-set-auto-ppp) - (local-set-key "\C-cos" 'gnus-offline-set-interval-time) - (if (eq gnus-offline-news-fetch-method 'nnagent) - (local-set-key "\C-coe" 'gnus-agent-expire)) - (static-unless (featurep 'xemacs) - (local-set-key - (if (eq system-type 'windows-nt) [S-mouse-2] [mouse-3]) - 'gnus-offline-popup-menu))))) - -;; -;; -(defun gnus-offline-popup (menu &optional title) - (static-cond - ((featurep 'xemacs) - (popup-menu menu)) - (t - (let ((menu-func (or (and (fboundp 'easy-menu-create-menu) - 'easy-menu-create-menu) - 'easy-menu-create-keymaps)) - keymap pop func) - (static-cond ((< emacs-major-version 20) - ;; For Emacsen from 19.34 down to 19.28. - ;; Seems the first item in MENU will be ignored. - (or (keymapp menu) - (setq menu - (append (list "" ;; This will be ignored. - (or title "Popup Menu") - "-----" - "-----") - (cdr menu)))) - (setq keymap - (if (keymapp menu) - (append (list 'keymap - (if title - `(nil ,title) - '(nil "Popup Menu")) - '(nil "") - '(nil "")) - (cdr menu)) - (funcall menu-func (car menu) (cdr menu))))) - (t - (setq keymap - (if (keymapp menu) - menu - (funcall menu-func (car menu) (cdr menu)))))) - ;; Display the popup menu. - (if (and (setq pop (x-popup-menu t keymap)) - (setq func (lookup-key keymap - (apply 'vector pop)))) - (funcall func)))))) - -(defun gnus-offline-get-menu-items (list) - (let (result) - (dolist (elem list) - (setq result - (nconc result - (list (if (listp elem) - (progn - (setcar elem (gnus-offline-gettext (car elem))) - (vconcat elem)) - elem))))) - result)) - -(defvar gnus-offline-menu - (gnus-offline-get-menu-items - '((menu-1 gnus-offline-toggle-articles-to-fetch t) - (menu-2 gnus-offline-toggle-on/off-send-mail t) - (menu-3 gnus-offline-set-auto-ppp t) - "----" - (menu-4 gnus-agent-expire - (eq gnus-offline-news-fetch-method 'nnagent)) - (menu-5 gnus-offline-set-interval-time t) - "----" - (menu-6 gnus-offline-set-unplugged-state gnus-offline-connected) - "----" - (menu-7 gnus-ofsetup-customize t)))) - -(defun gnus-offline-define-menu-on-miee () - "*Set and change menu bar on MIEE menu." - (let ((miee-menu - (gnus-offline-get-menu-items - '((menu-miee-1 news-spool-post t) - (menu-miee-2 mail-spool-send t) - "----" - (menu-miee-3 message-offline-state (not message-offline-state)) - (menu-miee-4 message-online-state message-offline-state) - "----"))) - menu) - (setq menu - (easy-menu-change - nil "Miee" - (append miee-menu - (list (cons "Gnus Offline" gnus-offline-menu))))) - (static-if (featurep 'xemacs) - (easy-menu-add menu)))) -;; -;; define menu without miee. -;; -(defun gnus-offline-define-menu-on-agent () - "*Set menu bar on OFFLINE menu." - (easy-menu-define - gnus-offline-menu-on-agent gnus-group-mode-map "Gnus offline Menu" - (cons "Offline" gnus-offline-menu)) - (static-if (featurep 'xemacs) - (easy-menu-add gnus-offline-menu-on-agent))) -;; -;; Popup menu within the group buffer (under Emacs). -;; -(static-unless (featurep 'xemacs) - (defun gnus-offline-popup-menu (event) - "Popup menu for Gnus Offline." - (interactive "e") - (apply 'gnus-offline-popup - (if (boundp 'miee-popup-menu) - (list (or (assq 'keymap - (assq 'Miee (assq 'menu-bar global-map))) - miee-popup-menu) - "Miee") - (list (symbol-value 'gnus-offline-menu-on-agent) - "Offline"))))) - -;; -;; Timer Function -(defun gnus-offline-processed-by-timer () - "*Set timer interval." - (let ((func (lambda () (call-interactively 'gnus-group-get-new-news))) - (time gnus-offline-interval-time)) - (cond ((and (> time 0) (not gnus-offline-connected)) - ;; Timer call - (gnus-demon-add-handler func time time)) - ((= gnus-offline-interval-time 0) - (gnus-demon-remove-handler func t))))) -;; -;; Code for making Gnus and Gnus Offline cooperate with each other. -;; - -;; Display `X-Gnus-Offline-Backend' message header aesthetically. -(eval-after-load "eword-decode" - '(mime-set-field-decoder 'X-Gnus-Offline-Backend nil nil)) - -;; Enable key and menu definitions here. -(eval '(funcall 'gnus-offline-define-menu-and-key)) - -;; -;; -;;; gnus-offline.el ends here diff --git a/lisp/gnus-ofsetup.el b/lisp/gnus-ofsetup.el deleted file mode 100644 index 4125f8a..0000000 --- a/lisp/gnus-ofsetup.el +++ /dev/null @@ -1,761 +0,0 @@ -;;; gnus-ofsetup.el --- Setup advisor for Offline reading for Mail/News. - -;; Copyright (C) 1998, 2001 Tatsuya Ichikawa - -;; Author: Tatsuya Ichikawa -;; Tsukamoto Tetsuo -;; -;; This file is part of Semi-gnus. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. -;; - -;;; Commentary: - -;; How to use. -;; -;; M-x load[RET]gnus-ofsetup -;; M-x gnus-setup-for-offline -;; - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'read-passwd) - -(eval-and-compile - (defvar gnus-offline-lang - (cond ((and (featurep 'meadow) - (string= current-language-environment "Japanese")) - "ja_complete") - ((and (boundp 'current-language-environment) - (string= current-language-environment "Japanese")) - "ja") - (t - "en")) - "This variable decides which language will be used for display.")) - -(eval-when-compile - (require 'gnus) - (require 'gnus-offline)) - -(defvar gnus-offline-setting-file - (let ((user (user-login-name)) - (real-user (user-real-login-name))) - (if (string= user real-user) - "~/.gnus-offline.el" - ;; Seems it is after "su". - (let ((file (concat "~" user "/.gnus-offline.el")) - (real-file (concat "~" real-user "/.gnus-offline.el"))) - (cond ((file-exists-p real-file) - real-file) - ((file-exists-p file) - file) - (t - real-file)))))) - -(eval-when-compile - (defvar gnus-ofsetup-prepare-for-miee - '(;; Spool directory setting - MIEE. - (setq mail-spool (or mail-spool "/usr/spool/mail.out")) - (setq news-spool (or news-spool "/usr/spool/news.out")) - (condition-case nil - (progn - (if (not (file-exists-p mail-spool)) - (make-directory mail-spool t)) - (if (not (file-exists-p news-spool)) - (make-directory news-spool t))) - (error - (error (gnus-ofsetup-gettext 'prepare-miee-1)))))) - - (defvar gnus-ofsetup-update-setting-file - '((save-excursion - (set-buffer (get-buffer-create "* Setting")) - (erase-buffer) - (insert ";;\n") - (insert ";; This file is created by gnus-ofsetup.el\n") - (insert ";; Creation date : " (current-time-string) "\n") - (insert ";;\n") - - ;; write Basic setting - (insert "(setq gnus-offline-news-fetch-method '" - (prin1-to-string news-method) ")\n") - (insert "(setq gnus-offline-mail-fetch-method '" - (prin1-to-string mail-method) ")\n") - - ;; write dialup/hangup program and options. - (insert "(setq gnus-offline-dialup-program " - (prin1-to-string dialup-program) ")\n") - (if (stringp dialup-program) - (insert "(setq gnus-offline-dialup-program-arguments '" - (prin1-to-string dialup-program-arguments) ")\n")) - (insert "(setq gnus-offline-hangup-program " - (prin1-to-string hangup-program) ")\n") - (if (stringp hangup-program) - (insert "(setq gnus-offline-hangup-program-arguments '" - (prin1-to-string hangup-program-arguments) ")\n")) - - (if (integerp interval) - (insert "(setq gnus-offline-interval-time " - (prin1-to-string interval) ")\n")) - - ;; write setting about MIEE. - (when use-miee - (insert "(setq sendmail-to-spool-directory " - (prin1-to-string mail-spool) ")\n") - (insert "(setq news-spool-request-post-directory " - (prin1-to-string news-spool) ")\n") - (insert "(if (not (boundp 'miee-version)) - (load \"miee\"))\n") - (insert "(setq message-send-news-function 'gnspool-request-post)\n")) - - ;; write setting about nnspool and gnus-agent. - (if (eq news-method 'nnspool) - (insert "(message-offline-state)\n") - (insert "(setq gnus-agent-directory " - (prin1-to-string agent-directory) ")\n")) - - ;; write setting about queue type -- MIEE or nnagent. - (insert "(setq gnus-offline-drafts-queue-type '" - (prin1-to-string drafts-queue-type) ")\n") - (insert "(setq gnus-offline-MTA-type '" - (prin1-to-string MTA-type) ")\n") - - ;; Write setting about hooks. - (when (eq news-method 'nnspool) - (insert (format "%s %s %s\n" - "(add-hook" - "'after-getting-news-hook" - "'gnus-offline-nnspool-hangup-line)")) - (insert (format "%s %s %s\n" - "(add-hook" - "'gnus-before-startup-hook" - "(lambda () (setq nnmail-spool-file nil) - (setq mail-sources nil)))"))) - - ;; Write stting about mail-source.el - (insert "(setq gnus-offline-mail-source '" - (prin1-to-string mail-source) ")\n") - (insert "(setq mail-sources gnus-offline-mail-source)\n") - (if save-passwd - (insert "(add-hook 'gnus-setup-news-hook - (lambda () - (add-to-list 'gnus-variable-list 'mail-source-password-cache)))\n")) - - ;; - (write-region (point-min) (point-max) gnus-offline-setting-file)) - (kill-buffer "* Setting"))) - - (defmacro gnus-ofsetup-prepare (list) - (let ((forms (symbol-value list))) - `(progn ,@forms)))) - -(defvar gnus-ofsetup-resource-en - '((prepare-miee-1 - . "Making directories failed. Set mail/news spool directories properly.") - (completing-read-symbol-1 . " (TAB to completion): ") - (setup-1 . "Method for offline News reading") - (setup-2 . "Agent directory: ") - (setup-3 . "Dialup program (give a null string if you do not use): ") - (setup-4 . "Dialup program options: ") - (setup-5 . "Hangup program (give a null string if you do not use): ") - (setup-6 . "Hangup program options: ") - (setup-7 . "Select MTA type for sending mail") - (setup-8 . "Use MIEE post/send message ") - (setup-9 . "News spool directory for sending: ") - (setup-10 . "Mail spool directory for sending: ") - (setup-11 . "How many mail sources will get mails from? : ") - (setup-12 . "What type of the mail source? ") - (setup-13 . "Mail Account name : ") - (setup-14 . "Mail server : ") - (setup-15 . "Authentification Method ") - (setup-16 . "Do you use pop3.el to fetch mail? ") - (setup-17 . "movemail program name: ") - (setup-18 . "movemail options: ") - (setup-19 . "What network stream? ") - (setup-20 . "File: ") - (setup-21 . "Directory: ") - (setup-22 . "Do you save password information to newsrc file? ") - - (param-news-method-1 . "News Method") - (param-news-method-2 . "Gnus Agent") - (param-news-method-3 . "nnspool") - (param-news-method-4 . "\ -Method to fetch news articles.") - (param-dialup-program-1 . "Dialup Program") - (param-dialup-program-2 . "Use program..") - (param-dialup-program-3 . "Don't use a program.") - (param-dialup-program-4 . "\ -Program which does dial.") - (param-dialup-program-arg-1 . "Dialup Program Arguments") - (param-dialup-program-arg-2 . "Argument") - (param-dialup-program-arg-3 . "\ -Program arguments of gnus-offline-dialup-program.") - (param-hangup-program-1 . "Hangup Program") - (param-hangup-program-2 . "Use program..") - (param-hangup-program-3 . "Don't use a program.") - (param-hangup-program-4 . "\ -Program which does hangup.") - (param-hangup-program-arg-1 . "Hangup Program Arguments") - (param-hangup-program-arg-2 . "Argument") - (param-hangup-program-arg-3 . "\ -Program arguments of gnus-offline-hangup-program.") - (param-interval-1 . "Interval between Jobs") - (param-interval-2 . "\ -Interval time(minutes) to do online jobs. -If set to 0 , timer call is disabled.") - (param-drafts-queue-type-1 . "Drafts Queue Type") - (param-drafts-queue-type-2 . "Gnus Draft for queuing.") - (param-drafts-queue-type-3 . "I prefer MIEE for queuing.") - (param-drafts-queue-type-4 . "\ -Type of queue used for draft messages. - -If the select method for news is nnspool, you must choose MIEE. -MIEE is another library for offline messaging. It isn't part of -Semi-gnus. If you want to know about MIEE, see README-offline.{en,ja}.") - (param-mail-spool-1 . "Mail Spool Directory for MIEE") - (param-news-spool-1 . "News Spool Directory for MIEE") - (param-MTA-type-1 . "MTA Type") - (param-MTA-type-2 . "Use smtp.el") - (param-MTA-type-3 . "Use sendmail") - (param-MTA-type-4 . "\ -Type of MTA used for sending mail.") - (param-save-passwd-1 . "Save Password in Startup File") - (param-save-passwd-2 . "OK, I'm sure it's safe.") - (param-save-passwd-3 . "No way, it's too dangerous!") - (param-save-passwd-4 . "\ -Whether you want your POP passwords written in .newsrc.eld or not.") - (param-mail-source-1 . "Mail Sources") - (param-mail-source-2 . "\ -Information of mail sources. Actually, a list of `Mail Source Specifiers'. - -The format of this variable is just the same as `mail-sources' (or -`nnmail-spool-file' which seems obsolete). - -`Mail Source Specifiers' can take a lot of keywords. For example, -if you want to use movemail instead of pop3.el which comes with -Gnus, you can set a specifier using the kerword :program as shown -below: - - (pop :program \"movemail -pf po:%u %t %p\") - -If you want to know more about mail source specifiers and keywords, -click the button below.") - (customize-1 . "Customize the Gnus Offline Parameters, and press ") - (customize-2 . "done") - (customize-3 . "Push me when done customizing.") - (customize-4 . "Parameters") - (customize-5 . "\ -These parameters will be saved in ~/.gnus-offline.el. - -Note: Touching these parameters may require Gnus or even Emacs to be -restarted.") - (customize-6 . "Push me to learn more.") - (customize-done-1 . "(No changes need to be saved)") - (customize-done-2 - . "Invalid parameters. Check the news method and drafts queue type."))) - -(defvar gnus-ofsetup-resource-ja - '((prepare-miee-1 - . "$B%G%#%l%/%H%j$,:n$l$^$;$s!#%9%W!<%k$N@_Dj$r@5$7$/$7$F$/$@$5$$!#(B") - (completing-read-symbol-1 . "(TAB $B$GJd40$7$^$9(B): ") - (setup-1 . "$B%*%U%i%$%s$G%K%e!<%9$rFI$`J}K!$rA*$s$G$/$@$5$$(B ") - (setup-2 . "Gnus Agent $B$N%G%#%l%/%H%j(B: ") - (setup-3 - . "$B%@%$%d%k@\B3%W%m%0%i%`L>(B ($B;H$o$J$$>l9g$O6uJ8;zNs$rJV$7$F2<$5$$(B): ") - (setup-4 . "$B%@%$%d%k@\B3%W%m%0%i%`$N0z?t(B: ") - (setup-5 - . "$B%@%$%d%k@ZCG%W%m%0%i%`L>(B ($B;H$o$J$$>l9g$O6uJ8;zNs$rJV$7$F2<$5$$(B): ") - (setup-6 . "$B%@%$%d%k@ZCG%W%m%0%i%`$N0z?t(B: ") - (setup-7 . "$B%a!<%kAw?.$K;H$&(B MTA $B$rA*$s$G2<$5$$(B ") - (setup-8 . "$B%a%C%;!<%8$NAw?.$K(B MIEE $B$r;H$$$^$9$+(B? ") - (setup-9 . "$B%K%e!<%9$N%9%W!<%k%G%#%l%/%H%j(B: ") - (setup-10 . "$B%a!<%k$N%9%W!<%k%G%#%l%/%H%j(B: ") - (setup-11 . "$B@_Dj$9$k%a!<%k(B: ") - (setup-14 . "$B$=$N%"%+%&%s%H$N$"$k%a!<%k%5!<%PL>(B: ") - (setup-15 . "$BG'>ZJ}<0$O(B? ") - (setup-16 . "$B%a!<%k$NA0(B: ") - (setup-18 . "movemail $B%W%m%0%i%`$KEO$90z?t(B: ") - (setup-19 . "$B@\B3J}<0$O(B? ") - (setup-20 . "$B%U%!%$%k(B: ") - (setup-21 . "$B%G%#%l%/%H%j(B: ") - (setup-22 . "newsrc $B%U%!%$%k$K(B POP $B%Q%9%o!<%I$rJ]B8$7$^$9$+(B? ") - - (param-news-method-4 . "\ -$B%K%e!<%95-;v$rl9g!"(BMIEE $B$r;XDj$9$kI,MW$,$"$j$^$9!#(B -MIEE $B$O%*%U%i%$%s$G$N%a!<%k(B/$B%K%e!<%9Aw?.5!G=$rDs6!$9$k%i%$%V%i%j$G$9$,!"(B -Semi-gnus $B$K$OIUB0$7$F$$$^$;$s!#(BMIEE $B$K$D$$$FCN$j$?$$>l9g$O(B -README-offline.{en,ja} $B$r;2>H$7$F$/$@$5$$!#(B") - (param-MTA-type-4 . "\ -MTA $B$O%a!<%k$NAw?.$rl9g$K$O!"(B:program $B$r$$$&%-!<%o!<(B -$B%I$r;XDj$7$F0J2<$NMM$K5-=R$7$^$9!#(B - - (pop :program \"movemail -pf po:%u %t %p\") - -mail source specifier $B$H$+>e5-$N$h$&$J%-!<%o!<%I$K$D$$$F$b$C$H$h$/(B -$BCN$j$?$$>l9g$O!"0J2<$N%\%?%s$r%/%j%C%/$7$F$/$@$5$$!#(B(Info $B$N3:Ev2U=j(B -$B$X$N%j%s%/$K$J$C$F$$$^$9!#(B)" ) - - (customize-1 - . "Gnus Offline $B$N%Q%i%a!<%?!#=*$o$C$?$i1&$N%\%?%s$r2!$7$F$/$@$5$$!#(B") - (customize-2 . "done") - (customize-3 . "$B@_Dj$7=*$o$C$?$i%\%/$r2!$7$F$M!#(B") - (customize-4 . "$B%Q%i%a!<%?(B") - (customize-5 . "\ -$B$3$l$i$N%Q%i%a!<%?$O(B ~/.gnus-offline.el $B$KJ]B8$5$l$^$9!#(B - -$BCm0U(B: $B$3$l$i$N%Q%i%a!<%?$NJQ99$O>l9g$K$h$C$F$O(B Gnus ($B$5$i$K>l9g$K(B -$B$h$C$F$O(B Emacs) $B$N:F5/F0$rI,MW$H$9$k$3$H$,$"$j$^$9!#(B") - (customize-6 . "$B$b$C$HCN$j$?$$>l9g$O%\%/$r2!$7$F$M!#(B") - (customize-done-1 . "($BJ]B8$9$Y$-JQ99$O$"$j$^$;$s(B)") - (customize-done-2 - . "$B%K%e!<%99VFI$7$F$/$@$5$$!#(B") - )) - -(defvar gnus-ofsetup-resource-ja_complete - (append - gnus-ofsetup-resource-ja - '((param-news-method-1 . "$B%K%e!<%99VFIJ}K!(B") - (param-news-method-2 . "Gnus Agent") - (param-news-method-3 . "nnspool") - (param-dialup-program-1 . "$B%@%$%d%k@\B3%W%m%0%i%`(B") - (param-dialup-program-2 . "$B%W%m%0%i%`$r;H$&(B..") - (param-dialup-program-3 . "$B%W%m%0%i%`$O;XDj$7$J$$(B") - (param-dialup-program-arg-1 . "$B%@%$%d%k@\B3%W%m%0%i%`$N0z?t(B") - (param-dialup-program-arg-2 . "$B0z?t(B") - (param-hangup-program-1 . "$B%@%$%d%k@ZCG%W%m%0%i%`(B") - (param-hangup-program-2 . "$B%W%m%0%i%`$r;H$&(B..") - (param-hangup-program-3 . "$B%W%m%0%i%`$O;XDj$7$J$$(B") - (param-hangup-program-arg-1 . "$B%@%$%d%k@ZCG%W%m%0%i%`$N0z?t(B") - (param-hangup-program-arg-2 . "$B0z?t(B") - (param-interval-1 . "$B<+F0AwpJs(B")))) - -(defsubst gnus-ofsetup-gettext (symbol &optional lang) - (setq lang (or lang gnus-offline-lang)) - (or - (cdr (assq symbol (symbol-value - (intern (format "gnus-ofsetup-resource-%s" lang))))) - (cdr (assq symbol gnus-ofsetup-resource-en)))) - -(defun gnus-ofsetup-completing-read-symbol (msg &rest syms) - (intern - (completing-read (concat - msg - (gnus-ofsetup-gettext 'completing-read-symbol-1)) - (mapcar - #'(lambda (sym) - (list (symbol-name sym))) - syms) - nil t nil))) - -(defun gnus-setup-for-offline (&optional force) - "*Set up Gnus for offline environment." - (interactive "P") - (unless (and (file-exists-p gnus-offline-setting-file) (not force)) - (let (news-method - mail-method agent-directory drafts-queue-type news-spool mail-spool - use-miee MTA-type dialup-program dialup-program-arguments - hangup-program hangup-program-arguments interval - num-of-address i n mail-source save-passwd) - (setq news-method - (gnus-ofsetup-completing-read-symbol - (gnus-ofsetup-gettext 'setup-1) - 'nnagent 'nnspool)) - ;; Setting for gnus-agent. - (if (eq news-method 'nnagent) - (setq agent-directory - (read-from-minibuffer - (gnus-ofsetup-gettext 'setup-2) "~/News/agent"))) - (setq mail-method 'nnmail) - (setq dialup-program - (read-file-name - (gnus-ofsetup-gettext 'setup-3) - nil nil t)) - (if (string-match "^[ \t]*$" dialup-program) - (setq dialup-program nil) - (setq dialup-program-arguments - (delete "" (split-string - (read-from-minibuffer - (gnus-ofsetup-gettext 'setup-4)) - "[\t ]+")))) - (setq hangup-program - (read-file-name - (gnus-ofsetup-gettext 'setup-5) - nil nil t)) - (if (string-match "^[ \t]*$" hangup-program) - (setq hangup-program nil) - (setq hangup-program-arguments - (delete "" (split-string - (read-from-minibuffer - (gnus-ofsetup-gettext 'setup-6)) - "[\t ]+")))) - (setq MTA-type (gnus-ofsetup-completing-read-symbol - (gnus-ofsetup-gettext 'setup-7) - 'smtp 'sendmail)) - (if (eq news-method 'nnspool) - (setq use-miee t) - (setq use-miee (y-or-n-p (gnus-ofsetup-gettext 'setup-8)))) - (if use-miee - (progn - ;; Setting for MIEE. - (setq news-spool - (read-from-minibuffer - (gnus-ofsetup-gettext 'setup-9) - "/usr/spool/news.out")) - (setq mail-spool - (read-from-minibuffer - (gnus-ofsetup-gettext 'setup-10) - "/usr/spool/mail.out")) - (setq drafts-queue-type 'miee) - (gnus-ofsetup-prepare gnus-ofsetup-prepare-for-miee)) - ;; Set drafts type gnus-agent. - (setq drafts-queue-type 'agent)) - ;; Create a list of mail source specifiers. - (setq num-of-address - (read-from-minibuffer (gnus-ofsetup-gettext 'setup-11))) - (setq i (setq n (string-to-int num-of-address))) - ;; - (while (> i 0) - (let* ((j (- n (1- i))) - (type (gnus-ofsetup-completing-read-symbol - (format "<%d of %d> %s" j n - (gnus-ofsetup-gettext 'setup-12)) - 'pop 'imap 'file 'directory 'maildir)) - user server authentication stream islisp source - prog args program path) - ;; Prepare. - (when (or (string= type "pop") (string= type "imap")) - (setq user (read-from-minibuffer - (format "<%d of %d> %s" j n - (gnus-ofsetup-gettext 'setup-13)))) - (setq server (read-from-minibuffer - (format "<%d of %d> %s" j n - (gnus-ofsetup-gettext 'setup-14))))) - (when (string= type "pop") - (setq authentication (gnus-ofsetup-completing-read-symbol - (format "<%d of %d> %s" j n - (gnus-ofsetup-gettext 'setup-15)) - 'password 'apop)) - (setq islisp (y-or-n-p - (format "<%d of %d> %s" j n - (gnus-ofsetup-gettext 'setup-16)))) - (unless islisp - (setq prog (read-file-name - (format "<%d of %d> %s" j n - (gnus-ofsetup-gettext 'setup-17)) - exec-directory "movemail")) - (setq args (read-from-minibuffer - (format "<%d of %d> %s" j n - (gnus-ofsetup-gettext 'setup-18) "-pf"))) - (setq program (format "%s %s %s %s %s" - prog args "po:%u" "%t" "%p")))) - (when (string= type "imap") - (setq stream (gnus-ofsetup-completing-read-symbol - (format "<%d of %d> %s" j n - (gnus-ofsetup-gettext 'setup-19)) - 'kerberos4 'starttls 'ssl 'network)) - (setq authentication (gnus-ofsetup-completing-read-symbol - (format "<%d of %d> %s" j n - (gnus-ofsetup-gettext 'setup-14)) - 'kerberos4 'digest-md5 'cram-md5 'login - 'anonymous))) - (when (string= type "file") - (setq path (read-file-name - (format "<%d of %d> %s" j n - (gnus-ofsetup-gettext 'setup-20))))) - (when (or (string= type "directory") (string= type "maildir")) - (setq path (read-file-name - (format "<%d of %d> %s" j n - (gnus-ofsetup-gettext 'setup-21))))) - ;; Now set a mail source specifier. - (setq source (list type)) - (let (value) - (dolist (symbol '(path user server authentication stream program)) - (when (setq value (symbol-value symbol)) - (setq source (nconc source - (list (make-symbol (format ":%s" symbol)) - value)))))) - (setq mail-source (nconc mail-source (list source)))) - (setq i (1- i))) - (setq save-passwd - (y-or-n-p (gnus-ofsetup-gettext 'setup-22))) - ;; - (gnus-ofsetup-prepare gnus-ofsetup-update-setting-file))) - (load gnus-offline-setting-file)) - - -;; Suppport for customizing gnus-ofsetup parameters. - -(defvar sendmail-to-spool-directory) -(defvar news-spool-request-post-directory) - -(defun gnus-ofsetup-find-parameters () - "Return the each current value of gnus-offline parameters." - `((news-method - (choice :tag ,(gnus-ofsetup-gettext 'param-news-method-1) - :value ,gnus-offline-news-fetch-method - (const :tag ,(gnus-ofsetup-gettext 'param-news-method-2) - nnagent) - (const :tag ,(gnus-ofsetup-gettext 'param-news-method-3) - nnspool)) - ,(gnus-ofsetup-gettext 'param-news-method-4)) - - (dialup-program - (choice :tag ,(gnus-ofsetup-gettext 'param-dialup-program-1) - :value ,gnus-offline-dialup-program - (string :tag ,(gnus-ofsetup-gettext 'param-dialup-program-2)) - (const :tag ,(gnus-ofsetup-gettext - 'param-dialup-program-3) nil)) - ,(gnus-ofsetup-gettext 'param-dialup-program-4)) - - (dialup-program-arguments - (repeat :tag ,(gnus-ofsetup-gettext 'param-dialup-program-arg-1) - :value ,gnus-offline-dialup-program-arguments - (string :tag ,(gnus-ofsetup-gettext - 'param-dialup-program-arg-2))) - ,(gnus-ofsetup-gettext 'param-dialup-program-arg-3)) - - (hangup-program - (choice :tag ,(gnus-ofsetup-gettext 'param-hangup-program-1) - :value ,gnus-offline-hangup-program - (string :tag ,(gnus-ofsetup-gettext 'param-hangup-program-2)) - (const :tag ,(gnus-ofsetup-gettext 'param-hangup-program-3) - nil)) - ,(gnus-ofsetup-gettext 'param-hangup-program-4)) - - (hangup-program-arguments - (repeat :tag ,(gnus-ofsetup-gettext 'param-hangup-program-arg-1) - :value ,gnus-offline-hangup-program-arguments - (string :tag ,(gnus-ofsetup-gettext - 'param-hangup-program-arg-2))) - ,(gnus-ofsetup-gettext 'param-hangup-program-arg-3)) - - (interval - (integer :tag ,(gnus-ofsetup-gettext 'param-interval-1) - :value ,gnus-offline-interval-time) - ,(gnus-ofsetup-gettext 'param-interval-2)) - - (drafts-queue-type - (choice :tag ,(gnus-ofsetup-gettext 'param-drafts-queue-type-1) - :value ,gnus-offline-drafts-queue-type - (const :tag ,(gnus-ofsetup-gettext 'param-drafts-queue-type-2) - agent) - (const :tag ,(gnus-ofsetup-gettext 'param-drafts-queue-type-3) - miee)) - ,(gnus-ofsetup-gettext 'param-drafts-queue-type-4)) - - (mail-spool - (directory :tag ,(gnus-ofsetup-gettext 'param-mail-spool-1) - :value ,(cond ((and (boundp 'sendmail-to-spool-directory) - sendmail-to-spool-directory) - sendmail-to-spool-directory) - (t - "/usr/spool/mail.out")))) - - (news-spool - (directory :tag ,(gnus-ofsetup-gettext 'param-news-spool-1) - :value ,(cond ((and (boundp 'news-spool-request-post-directory) - news-spool-request-post-directory) - news-spool-request-post-directory) - (t - "/usr/spool/news.out")))) - - (MTA-type - (choice :tag ,(gnus-ofsetup-gettext 'param-MTA-type-1) - :value ,gnus-offline-MTA-type - (const :tag ,(gnus-ofsetup-gettext 'param-MTA-type-2) smtp) - (const :tag ,(gnus-ofsetup-gettext 'param-MTA-type-3) - sendmail)) - ,(gnus-ofsetup-gettext 'param-MTA-type-4)) - - (save-passwd - (choice :tag ,(gnus-ofsetup-gettext 'param-save-passwd-1) - :value ,(if (memq 'mail-source-password-cache gnus-variable-list) - t - nil) - (const :tag ,(gnus-ofsetup-gettext 'param-save-passwd-2) t) - (const :tag ,(gnus-ofsetup-gettext 'param-save-passwd-3) nil)) - ,(gnus-ofsetup-gettext 'param-save-passwd-4)) - - (mail-source - (sexp :tag ,(gnus-ofsetup-gettext 'param-mail-source-1) - :value ,gnus-offline-mail-source) - ,(gnus-ofsetup-gettext 'param-mail-source-2)))) - -(defvar gnus-ofsetup-params) - -(defun gnus-ofsetup-customize () - "Edit the gnus-offline parameters." - (interactive) - (let* ((params (gnus-ofsetup-find-parameters)) - (types (mapcar #'(lambda (entry) - `(cons :format "%v%h\n" - :doc ,(nth 2 entry) - (const :format "" ,(nth 0 entry)) - ,(nth 1 entry))) - params))) - (kill-buffer (gnus-get-buffer-create "*Gnus Offline Customize*")) - (switch-to-buffer (gnus-get-buffer-create "*Gnus Offline Customize*")) - (gnus-custom-mode) - (widget-insert (gnus-ofsetup-gettext 'customize-1)) - (widget-create 'push-button - :tag (gnus-ofsetup-gettext 'customize-2) - :help-echo (gnus-ofsetup-gettext 'customize-3) - :action 'gnus-ofsetup-customize-done) - (widget-insert "\n\n") - (make-local-variable 'gnus-ofsetup-params) - (setq gnus-ofsetup-params - (widget-create 'group - `(set :inline t - :greedy t - :tag ,(gnus-ofsetup-gettext 'customize-4) - :format "%t:\n%h%v" - :doc ,(gnus-ofsetup-gettext 'customize-5) - ,@types))) - - (widget-create 'info-link - :help-echo (gnus-ofsetup-gettext 'customize-6) - :tag " mail sources" - (if (string-match "^ja" gnus-offline-lang) - "(gnus-ja)Mail Sources" - "(gnus)Mail Sources")) - - (use-local-map widget-keymap) - (local-set-key "q" 'bury-buffer) - (widget-setup) - (goto-char (point-min)))) - -(defun gnus-ofsetup-customize-done (&rest ignore) - "Apply changes and bury the buffer." - (interactive) - (let ((params (widget-value gnus-ofsetup-params)) - (news-method gnus-offline-news-fetch-method) - (mail-method gnus-offline-mail-fetch-method) - (agent-directory gnus-agent-directory) - (dialup-program gnus-offline-dialup-program) - (dialup-program-arguments gnus-offline-dialup-program-arguments) - (hangup-program gnus-offline-hangup-program) - (hangup-program-arguments gnus-offline-hangup-program-arguments) - (drafts-queue-type gnus-offline-drafts-queue-type) - (interval gnus-offline-interval-time) - (use-miee (and (boundp 'miee-version) - (or (eq gnus-offline-news-fetch-method 'nnspool) - (eq gnus-offline-drafts-queue-type 'miee)))) - (mail-spool (or (and (boundp 'sendmail-to-spool-directory) - sendmail-to-spool-directory) - "/usr/spool/mail.out")) - (news-spool (or (and (boundp 'news-spool-request-post-directory) - news-spool-request-post-directory) - "/usr/spool/news.out")) - (MTA-type gnus-offline-MTA-type) - (mail-source gnus-offline-mail-source) - (save-passwd (and (memq 'mail-source-password-cache gnus-variable-list) - t))) - (if (null params) - (gnus-message 4 (gnus-ofsetup-gettext 'customize-done-1)) - (let (symbol value) - (dolist (elem params) - (setq symbol (car elem) - value (cdr elem)) - (set symbol value) - (cond ((eq symbol 'news-method) - (if (eq value 'nnspool) - (setq use-miee t))) - ((eq symbol 'drafts-queue-type) - (setq use-miee (eq value 'miee))) - ((eq symbol 'save-passwd) - (if value - (add-to-list 'gnus-variable-list - 'mail-source-password-cache) - (setq gnus-variable-list - (delq 'mail-source-password-cache - gnus-variable-list))))))) - (if (and (eq news-method 'nnspool) - (not (eq drafts-queue-type 'miee))) - (error (gnus-ofsetup-gettext 'customize-done-2))) - (if use-miee - (gnus-ofsetup-prepare gnus-ofsetup-prepare-for-miee)) - (gnus-ofsetup-prepare gnus-ofsetup-update-setting-file) - (load gnus-offline-setting-file))) - (bury-buffer) - (switch-to-buffer gnus-group-buffer)) - - -;;; Code for making Gnus and Gnus Offline cooperate with each other. - -;; Advice. -(defadvice gnus (around gnus-ofsetup-advice activate preactivate) - "Setup offline environment when Gnus is invoked." - (require 'gnus-offline) ad-do-it (gnus-offline-setup)) - -;; Miscellaneous settings. - -(setq gnus-nntp-service nil) -(setq gnus-nntp-server nil) -(eval-after-load "gnus-start" - '(add-hook 'gnus-after-getting-new-news-hook 'gnus-offline-after-get-new-news)) -(eval-after-load "message" - '(add-hook 'message-send-hook 'gnus-offline-message-add-header)) -(setq mail-source-read-passwd 'read-pw-read-passwd) -(add-hook 'gnus-setup-news-hook 'read-pw-set-mail-source-passwd-cache) - -(provide 'gnus-ofsetup) - -;;; gnus-ofsetup.el ends here diff --git a/lisp/gnus-picon.el b/lisp/gnus-picon.el deleted file mode 100644 index 9a4c9ba..0000000 --- a/lisp/gnus-picon.el +++ /dev/null @@ -1,757 +0,0 @@ -;;; gnus-picon.el --- displaying pretty icons in Gnus - -;; Copyright (C) 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Wes Hardaker -;; Keywords: news xpm annotation glyph faces - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus) -;; (require 'xpm) -(require 'annotations) -(require 'custom) -(require 'gnus-art) -(require 'gnus-win) - -;;; User variables: - -(defgroup picons nil - "Show pictures of people, domains, and newsgroups (XEmacs). -For this to work, you must switch on the `gnus-treat-display-picons' -variable." - :group 'gnus-visual) - -(defcustom gnus-picons-display-where 'picons - "Where to display the group and article icons. -Valid values are `article' and `picons'." - :type '(choice symbol string) - :group 'picons) - -(defcustom gnus-picons-has-modeline-p t - "*Whether the picons window should have a modeline. -This is only useful if `gnus-picons-display-where' is `picons'." - :type 'boolean - :group 'picons) - -(defcustom gnus-picons-database "/usr/local/faces" - "*Defines the location of the faces database. -For information on obtaining this database of pretty pictures, please -see http://www.cs.indiana.edu/picons/ftp/index.html" - :type 'directory - :group 'picons) - -(defcustom gnus-picons-news-directories '("news") - "*List of directories to search for newsgroups faces." - :type '(repeat string) - :group 'picons) -(define-obsolete-variable-alias 'gnus-picons-news-directory - 'gnus-picons-news-directories) - -(defcustom gnus-picons-user-directories '("local" "users" "usenix" "misc") - "*List of directories to search for user faces." - :type '(repeat string) - :group 'picons) - -(defcustom gnus-picons-domain-directories '("domains") - "*List of directories to search for domain faces. -Some people may want to add \"unknown\" to this list." - :type '(repeat string) - :group 'picons) - -(defcustom gnus-picons-refresh-before-display nil - "*If non-nil, display the article buffer before computing the picons." - :type 'boolean - :group 'picons) - -(defcustom gnus-picons-group-excluded-groups nil - "*If this regexp matches the group name, group picons will be disabled." - :type 'regexp - :group 'picons) - -(defcustom gnus-picons-display-as-address t - "*If t display textual email addresses along with pictures." - :type 'boolean - :group 'picons) - -(defcustom gnus-picons-file-suffixes - (when (featurep 'x) - (let ((types (list "xbm"))) - (when (featurep 'gif) - (setq types (cons "gif" types))) - (when (featurep 'xpm) - (setq types (cons "xpm" types))) - types)) - "*List of suffixes on picon file names to try." - :type '(repeat string) - :group 'picons) - -(defcustom gnus-picons-display-article-move-p nil - "*Whether to move point to first empty line when displaying picons. -This has only an effect if `gnus-picons-display-where' has value `article'." - :type 'boolean - :group 'picons) - -(defcustom gnus-picons-clear-cache-on-shutdown t - "*Whether to clear the picons cache when exiting gnus. -Gnus caches every picons it finds while it is running. This saves -some time in the search process but eats some memory. If this -variable is set to nil, Gnus will never clear the cache itself; you -will have to manually call `gnus-picons-clear-cache' to clear it. -Otherwise the cache will be cleared every time you exit Gnus." - :type 'boolean - :group 'picons) - -(defcustom gnus-picons-piconsearch-url nil - "*The url to query for picons. Setting this to nil will disable it. -The only publicly available address currently known is -http://www.cs.indiana.edu:800/piconsearch. If you know of any other, -please tell me so that we can list it." - :type '(choice (const :tag "Disable" :value nil) - (const :tag "www.cs.indiana.edu" - :value "http://www.cs.indiana.edu:800/piconsearch") - (string)) - :group 'picons) - -(defface gnus-picons-xbm-face '((t (:foreground "black" :background "white"))) - "Face to show xbm picons in." - :group 'picons) - -(defface gnus-picons-face '((t (:foreground "black" :background "white"))) - "Face to show picons in." - :group 'picons) - -(defcustom gnus-picons-setup-hook nil - "Hook run in Picons buffers." - :group 'picons - :type 'hook) - -;;; Internal variables: - -(defvar gnus-picons-setup-p nil) -(defvar gnus-picons-processes-alist nil - "Picons processes currently running and their environment.") -(defvar gnus-picons-glyph-alist nil - "Picons glyphs cache. -List of pairs (KEY . GLYPH) where KEY is either a filename or an URL.") -(defvar gnus-picons-url-alist nil - "Picons file names cache. -List of pairs (KEY . NAME) where KEY is (USER HOST DBS) and NAME is an URL.") - -(defvar gnus-picons-jobs-alist nil - "List of jobs that still need be done. -This is a list of (SYM-ANN TAG ARGS...) where SYM-ANN three annotations list, -TAG is one of `picon' or `search' indicating that the job should query a -picon or do a search for picons file names, and ARGS is some additionnal -arguments necessary for the job.") - -(defvar gnus-picons-job-already-running nil - "Lock to ensure only one stream of http requests is running.") - -;;; Functions: - -(defun gnus-picons-remove-all () - "Removes all picons from the Gnus display(s)." - (interactive) - (map-extents (function (lambda (ext unused) (delete-annotation ext) nil)) - nil nil nil nil nil 'gnus-picon) - (setq gnus-picons-jobs-alist '()) - ;; notify running job that it may have been preempted - (if (and (listp gnus-picons-job-already-running) - gnus-picons-job-already-running) - (setq gnus-picons-job-already-running t))) - -(defun gnus-get-buffer-name (variable) - "Returns the buffer name associated with the contents of a variable." - (let ((buf (gnus-get-buffer-create - (gnus-window-to-buffer-helper - (cdr (assq variable gnus-window-to-buffer)))))) - (and buf - (buffer-name buf)))) - -(defun gnus-picons-buffer-name () - (cond ((or (stringp gnus-picons-display-where) - (bufferp gnus-picons-display-where)) - gnus-picons-display-where) - ((eq gnus-picons-display-where 'picons) - (if gnus-single-article-buffer - "*Picons*" - (concat "*Picons " gnus-newsgroup-name "*"))) - (t - (gnus-get-buffer-name gnus-picons-display-where)))) - -(defun gnus-picons-kill-buffer () - (let ((buf (get-buffer (gnus-picons-buffer-name)))) - (when (and (buffer-live-p buf) - (string-match "Picons" (buffer-name buf))) - (kill-buffer buf)))) - -(defun gnus-picons-setup-buffer () - (let ((name (gnus-picons-buffer-name))) - (save-excursion - (if (and (get-buffer name) - (with-current-buffer name - gnus-picons-setup-p)) - (set-buffer name) - (set-buffer (gnus-get-buffer-create name)) - (buffer-disable-undo) - (setq buffer-read-only t) - (run-hooks 'gnus-picons-setup-hook) - (set (make-local-variable 'gnus-picons-setup-p) t) - (add-hook 'gnus-summary-prepare-exit-hook 'gnus-picons-kill-buffer)) - (current-buffer)))) - -(defun gnus-picons-set-buffer () - (set-buffer (gnus-picons-setup-buffer)) - (goto-char (point-min)) - (if (and (eq gnus-picons-display-where 'article) - gnus-picons-display-article-move-p) - (if (search-forward "\n\n" nil t) - (forward-line -1) - (goto-char (point-max))) - (setq buffer-read-only t) - (unless gnus-picons-has-modeline-p - (set-specifier has-modeline-p - (list (list (current-buffer) - (cons nil gnus-picons-has-modeline-p))))))) - -(defun gnus-picons-prepare-for-annotations () - "Prepare picons buffer for putting annotations." - ;; let drawing catch up - (when gnus-picons-refresh-before-display - (sit-for 0)) - (gnus-picons-set-buffer) - (gnus-picons-remove-all)) - -(defun gnus-picons-make-annotation (&rest args) - (let ((annot (apply 'make-annotation args))) - (set-extent-property annot 'gnus-picon t) - (set-extent-property annot 'duplicable t) - annot)) - -(defun gnus-article-display-picons () - "Display faces for an author and her domain in gnus-picons-display-where." - (interactive) - (let (from at-idx) - (when (and (featurep 'xpm) - (or (not (fboundp 'device-type)) (equal (device-type) 'x)) - (setq from (mail-fetch-field "from")) - (setq from (downcase (or (cadr - (funcall gnus-extract-address-components - from)) - ""))) - (or (setq at-idx (string-match "@" from)) - (setq at-idx (length from)))) - (save-excursion - (let ((username (downcase (substring from 0 at-idx))) - (addrs (if (eq at-idx (length from)) - (if gnus-local-domain - (message-tokenize-header gnus-local-domain ".")) - (message-tokenize-header (substring from (1+ at-idx)) - ".")))) - (gnus-picons-prepare-for-annotations) - (gnus-group-display-picons) - (unless gnus-picons-display-article-move-p - (let ((buffer-read-only nil) - (case-fold-search t)) - (when (re-search-forward "^From *: *" nil t) - (when (search-forward from (gnus-point-at-eol) t) - (gnus-put-text-property - (match-beginning 0) (match-end 0) - 'invisible t))))) - (if (null gnus-picons-piconsearch-url) - (progn - (gnus-picons-display-pairs (gnus-picons-lookup-pairs - addrs - gnus-picons-domain-directories) - gnus-picons-display-as-address - "." t) - (if (and gnus-picons-display-as-address addrs) - (gnus-picons-make-annotation - [string :data "@"] nil 'text nil nil nil t)) - (gnus-picons-display-picon-or-name - (gnus-picons-lookup-user username addrs) - username t)) - (push (list 'gnus-article-annotations 'search username addrs - gnus-picons-domain-directories t (point-marker)) - gnus-picons-jobs-alist) - (gnus-picons-next-job))))))) - -(defun gnus-group-display-picons () - "Display icons for the group in the `gnus-picons-display-where' buffer." - (interactive) - (when (and (featurep 'xpm) - (or (not (fboundp 'device-type)) (equal (device-type) 'x)) - (or (null gnus-picons-group-excluded-groups) - (not (string-match gnus-picons-group-excluded-groups - gnus-newsgroup-name)))) - (let* ((newsgroups (mail-fetch-field "newsgroups")) - (groups - (if (or gnus-picons-display-article-move-p - (not newsgroups)) - (list (gnus-group-real-name gnus-newsgroup-name)) - (split-string newsgroups ","))) - group) - (save-excursion - (gnus-picons-prepare-for-annotations) - (while (setq group (pop groups)) - (unless gnus-picons-display-article-move-p - (let ((buffer-read-only nil) - (case-fold-search t)) - (goto-char (point-min)) - (if (and (re-search-forward "^Newsgroups *: *" nil t) - (search-forward group (gnus-point-at-eol) t)) - (gnus-put-text-property - (match-beginning 0) (match-end 0) - 'invisible t) - (let ((article-goto-body-goes-to-point-min-p nil)) - (article-goto-body)) - (unless (bobp) - (backward-char 1))))) - (if (null gnus-picons-piconsearch-url) - (gnus-picons-display-pairs - (gnus-picons-lookup-pairs - (reverse (split-string group "\\.")) - gnus-picons-news-directories) - t ".") - (push (list 'gnus-group-annotations 'search nil - (split-string group "\\.") - (if (listp gnus-picons-news-directories) - gnus-picons-news-directories - (list gnus-picons-news-directories)) - nil (point-marker)) - gnus-picons-jobs-alist) - (gnus-picons-next-job)) - - (add-hook 'gnus-summary-exit-hook 'gnus-picons-remove-all)))))) - -(defun gnus-picons-lookup-internal (addrs dir) - (setq dir (expand-file-name dir gnus-picons-database)) - (gnus-picons-try-face (dolist (part (reverse addrs) dir) - (setq dir (expand-file-name part dir))))) - -(defun gnus-picons-lookup (addrs dirs) - "Lookup the picon for ADDRS in databases DIRS. -Returns the picon filename or NIL if none found." - (let (result) - (while (and dirs (null result)) - (setq result (gnus-picons-lookup-internal addrs (pop dirs)))) - result)) - -(defun gnus-picons-lookup-user-internal (user domains) - (let ((dirs gnus-picons-user-directories) - domains-tmp dir picon) - (while (and dirs (null picon)) - (setq domains-tmp domains - dir (pop dirs)) - (while (and domains-tmp - (null (setq picon (gnus-picons-lookup-internal - (cons user domains-tmp) dir)))) - (pop domains-tmp)) - ;; Also make a try in MISC subdir - (unless picon - (setq picon (gnus-picons-lookup-internal (list user "MISC") dir)))) - picon)) - -(defun gnus-picons-lookup-user (user domains) - "Lookup the picon for USER at DOMAINS. -USER is a string containing a name. -DOMAINS is a list of strings from the fully qualified domain name." - (or (gnus-picons-lookup-user-internal user domains) - (gnus-picons-lookup-user-internal "unknown" domains))) - -(defun gnus-picons-lookup-pairs (domains directories) - "Lookup picons for DOMAINS and all its parents in DIRECTORIES. -Returns a list of PAIRS whose CAR is the picon filename or NIL if -none, and whose CDR is the corresponding element of DOMAINS." - (let (picons) - (setq directories (if (listp directories) - directories - (list directories))) - (while domains - (push (list (gnus-picons-lookup (cons "unknown" domains) directories) - (pop domains)) - picons)) - picons)) - -(defun gnus-picons-display-picon-or-name (picon name &optional right-p) - (cond (picon (gnus-picons-display-glyph picon name right-p)) - (gnus-picons-display-as-address (list (gnus-picons-make-annotation - (vector 'string :data name) - nil 'text - nil nil nil right-p))))) - -(defun gnus-picons-display-pairs (pairs &optional bar-p dot-p right-p) - "Display picons in list PAIRS." - (let ((domain-p (and gnus-picons-display-as-address dot-p)) - pair picons) - (when (and bar-p domain-p right-p - gnus-picons-display-article-move-p) - (setq picons (gnus-picons-display-glyph - (let ((gnus-picons-file-suffixes '("xbm"))) - (gnus-picons-try-face - gnus-xmas-glyph-directory "bar.")) - nil right-p))) - (while (setq pair (pop pairs)) - (setq picons (nconc picons - (gnus-picons-display-picon-or-name - (car pair) (cadr pair) right-p) - (if (and domain-p pairs) - (list (gnus-picons-make-annotation - (vector 'string :data dot-p) - nil 'text nil nil nil right-p)))))) - picons)) - -(defun gnus-picons-try-face (dir &optional filebase) - (let* ((dir (file-name-as-directory dir)) - (filebase (or filebase "face.")) - (key (concat dir filebase)) - (glyph (cdr (assoc key gnus-picons-glyph-alist))) - (suffixes gnus-picons-file-suffixes) - f suf) - (while (setq suf (pop suffixes)) - (when (file-exists-p (setq f (expand-file-name - (concat filebase suf) - dir))) - (setq suffixes nil - glyph (make-glyph f)) - (if (equal suf "xbm") - (set-glyph-face glyph 'gnus-picons-xbm-face) - (set-glyph-face glyph 'gnus-picons-face)) - (push (cons key glyph) gnus-picons-glyph-alist))) - glyph)) - -(defun gnus-picons-display-glyph (glyph &optional part rightp) - (set-glyph-baseline glyph 70) - (let ((new (gnus-picons-make-annotation - glyph (point) 'text nil nil nil rightp))) - (when (and part gnus-picons-display-as-address) - (set-annotation-data - new (cons new (make-glyph (vector 'string :data part)))) - (set-annotation-action new 'gnus-picons-action-toggle)) - (nconc - (list new) - (if (and (eq major-mode 'gnus-article-mode) - (not gnus-picons-display-as-address) - (not part)) - (list (gnus-picons-make-annotation [string :data " "] (point) - 'text nil nil nil rightp)))))) - -(defun gnus-picons-action-toggle (data) - "Toggle annotation." - (interactive "e") - (let* ((annot (car data)) - (glyph (annotation-glyph annot))) - (set-annotation-glyph annot (cdr data)) - (set-annotation-data annot (cons annot glyph)))) - -(defun gnus-picons-clear-cache () - "Clear the picons cache." - (interactive) - (setq gnus-picons-glyph-alist nil - gnus-picons-url-alist nil)) - -(gnus-add-shutdown 'gnus-picons-close 'gnus) - -(defun gnus-picons-close () - "Shut down the picons." - (if gnus-picons-clear-cache-on-shutdown - (gnus-picons-clear-cache))) - -;;; Query a remote DB. This requires some stuff from w3 ! - -(eval-and-compile - (ignore-errors - (require 'url) - (require 'w3-forms))) - -(defun gnus-picons-url-retrieve (url fn arg) - (let ((old-asynch (default-value 'url-be-asynchronous)) - (url-working-buffer (generate-new-buffer " *picons*")) - (url-package-name "Gnus") - (url-package-version gnus-version-number) - url-request-method) - (setq-default url-be-asynchronous t) - (save-excursion - (set-buffer url-working-buffer) - (setq url-be-asynchronous t - url-current-callback-data arg - url-current-callback-func fn) - (url-retrieve url t)) - (setq-default url-be-asynchronous old-asynch))) - -(defun gnus-picons-make-glyph (type) - "Make a TYPE glyph using current buffer as data. Handles xbm nicely." - (cond ((null type) nil) - ((eq type 'xbm) (let ((fname (make-temp-name "/tmp/picon"))) - (write-region (point-min) (point-max) fname - nil 'quiet) - (prog1 (make-glyph (vector 'xbm :file fname)) - (delete-file fname)))) - (t (make-glyph (vector type :data (buffer-string)))))) - -;;; Parsing of piconsearch result page. - -;; Assumes: -;; 1 - each value field has the form: "key = value" -;; 2 - a "

" separates the keywords from the results -;; 3 - every results begins by the path within the database at the beginning -;; of the line in raw text. -;; 3b - and the href following it is the preferred image type. - -;; if 1 or 2 is not met, it will probably cause an error. The other -;; will go undetected - -(defun gnus-picons-parse-value (name) - (goto-char (point-min)) - (if (re-search-forward (concat "" - (regexp-quote name) - " *= * *\\([^ <][^<]*\\) *") - nil t) - (buffer-substring (match-beginning 1) (match-end 1)))) - -(defun gnus-picons-parse-filenames () - ;; returns an alist of ((USER ADDRS DB) . URL) - (let ((case-fold-search t) - (user (gnus-picons-parse-value "user")) - (host (gnus-picons-parse-value "host")) - (dbs (message-tokenize-header (gnus-picons-parse-value "db") " ")) - start-re cur-db cur-host cur-user types res) - ;; now point will be somewhere in the header. Find beginning of - ;; entries - (when (and user host dbs) - (setq start-re - (concat - ;; dbs - "^\\(" (mapconcat 'regexp-quote dbs "\\|") "\\)/" - ;; host - "\\(\\(" (mapconcat 'regexp-quote - (message-tokenize-header host ".") "/\\|") - "/\\|MISC/\\)*\\)" - ;; user - "\\(" (regexp-quote user) "\\|unknown\\)/" - "face\\.")) - (re-search-forward "

[ \t\n]*") - (while (re-search-forward start-re nil t) - (setq cur-db (buffer-substring (match-beginning 1) (match-end 1)) - cur-host (buffer-substring (match-beginning 2) (match-end 2)) - cur-user (buffer-substring (match-beginning 4) (match-end 4)) - cur-host (nreverse (message-tokenize-header cur-host "/"))) - ;; XXX - KLUDGE: there is a blank picon in news/MISC/unknown - (unless (and (string-equal cur-db "news") - (string-equal cur-user "unknown") - (equal cur-host '("MISC"))) - ;; ok now we have found an entry (USER HOST DB), find the - ;; corresponding picon URL - (save-restriction - ;; restrict region to this entry - (narrow-to-region (point) (search-forward "
")) - (goto-char (point-min)) - (setq types gnus-picons-file-suffixes) - (while (and types - (not (re-search-forward - (concat " -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -;;; List and range functions - -(defsubst gnus-range-normalize (range) - "Normalize RANGE. -If RANGE is a single range, return (RANGE). Otherwise, return RANGE." - (if (listp (cdr range)) (list range) range)) - -(defun gnus-last-element (list) - "Return last element of LIST." - (while (cdr list) - (setq list (cdr list))) - (car list)) - -(defun gnus-copy-sequence (list) - "Do a complete, total copy of a list." - (let (out) - (while (consp list) - (if (consp (car list)) - (push (gnus-copy-sequence (pop list)) out) - (push (pop list) out))) - (if list - (nconc (nreverse out) list) - (nreverse out)))) - -(defun gnus-set-difference (list1 list2) - "Return a list of elements of LIST1 that do not appear in LIST2." - (let ((list1 (copy-sequence list1))) - (while list2 - (setq list1 (delq (car list2) list1)) - (setq list2 (cdr list2))) - list1)) - -(defun gnus-sorted-complement (list1 list2) - "Return a list of elements that are in LIST1 or LIST2 but not both. -Both lists have to be sorted over <." - (let (out) - (if (or (null list1) (null list2)) - (or list1 list2) - (while (and list1 list2) - (cond ((= (car list1) (car list2)) - (setq list1 (cdr list1) - list2 (cdr list2))) - ((< (car list1) (car list2)) - (setq out (cons (car list1) out)) - (setq list1 (cdr list1))) - (t - (setq out (cons (car list2) out)) - (setq list2 (cdr list2))))) - (nconc (nreverse out) (or list1 list2))))) - -(defun gnus-intersection (list1 list2) - (let ((result nil)) - (while list2 - (when (memq (car list2) list1) - (setq result (cons (car list2) result))) - (setq list2 (cdr list2))) - result)) - -(defun gnus-sorted-intersection (list1 list2) - ;; LIST1 and LIST2 have to be sorted over <. - (let (out) - (while (and list1 list2) - (cond ((= (car list1) (car list2)) - (setq out (cons (car list1) out) - list1 (cdr list1) - list2 (cdr list2))) - ((< (car list1) (car list2)) - (setq list1 (cdr list1))) - (t - (setq list2 (cdr list2))))) - (nreverse out))) - -(defun gnus-set-sorted-intersection (list1 list2) - ;; LIST1 and LIST2 have to be sorted over <. - ;; This function modifies LIST1. - (let* ((top (cons nil list1)) - (prev top)) - (while (and list1 list2) - (cond ((= (car list1) (car list2)) - (setq prev list1 - list1 (cdr list1) - list2 (cdr list2))) - ((< (car list1) (car list2)) - (setcdr prev (cdr list1)) - (setq list1 (cdr list1))) - (t - (setq list2 (cdr list2))))) - (setcdr prev nil) - (cdr top))) - -(defun gnus-compress-sequence (numbers &optional always-list) - "Convert list of numbers to a list of ranges or a single range. -If ALWAYS-LIST is non-nil, this function will always release a list of -ranges." - (let* ((first (car numbers)) - (last (car numbers)) - result) - (if (null numbers) - nil - (if (not (listp (cdr numbers))) - numbers - (while numbers - (cond ((= last (car numbers)) nil) ;Omit duplicated number - ((= (1+ last) (car numbers)) ;Still in sequence - (setq last (car numbers))) - (t ;End of one sequence - (setq result - (cons (if (= first last) first - (cons first last)) - result)) - (setq first (car numbers)) - (setq last (car numbers)))) - (setq numbers (cdr numbers))) - (if (and (not always-list) (null result)) - (if (= first last) (list first) (cons first last)) - (nreverse (cons (if (= first last) first (cons first last)) - result))))))) - -(defalias 'gnus-uncompress-sequence 'gnus-uncompress-range) -(defun gnus-uncompress-range (ranges) - "Expand a list of ranges into a list of numbers. -RANGES is either a single range on the form `(num . num)' or a list of -these ranges." - (let (first last result) - (cond - ((null ranges) - nil) - ((not (listp (cdr ranges))) - (setq first (car ranges)) - (setq last (cdr ranges)) - (while (<= first last) - (setq result (cons first result)) - (setq first (1+ first))) - (nreverse result)) - (t - (while ranges - (if (atom (car ranges)) - (when (numberp (car ranges)) - (setq result (cons (car ranges) result))) - (setq first (caar ranges)) - (setq last (cdar ranges)) - (while (<= first last) - (setq result (cons first result)) - (setq first (1+ first)))) - (setq ranges (cdr ranges))) - (nreverse result))))) - -(defun gnus-add-to-range (ranges list) - "Return a list of ranges that has all articles from both RANGES and LIST. -Note: LIST has to be sorted over `<'." - (if (not ranges) - (gnus-compress-sequence list t) - (setq list (copy-sequence list)) - (unless (listp (cdr ranges)) - (setq ranges (list ranges))) - (let ((out ranges) - ilist lowest highest temp) - (while (and ranges list) - (setq ilist list) - (setq lowest (or (and (atom (car ranges)) (car ranges)) - (caar ranges))) - (while (and list (cdr list) (< (cadr list) lowest)) - (setq list (cdr list))) - (when (< (car ilist) lowest) - (setq temp list) - (setq list (cdr list)) - (setcdr temp nil) - (setq out (nconc (gnus-compress-sequence ilist t) out))) - (setq highest (or (and (atom (car ranges)) (car ranges)) - (cdar ranges))) - (while (and list (<= (car list) highest)) - (setq list (cdr list))) - (setq ranges (cdr ranges))) - (when list - (setq out (nconc (gnus-compress-sequence list t) out))) - (setq out (sort out (lambda (r1 r2) - (< (or (and (atom r1) r1) (car r1)) - (or (and (atom r2) r2) (car r2)))))) - (setq ranges out) - (while ranges - (if (atom (car ranges)) - (when (cdr ranges) - (if (atom (cadr ranges)) - (when (= (1+ (car ranges)) (cadr ranges)) - (setcar ranges (cons (car ranges) - (cadr ranges))) - (setcdr ranges (cddr ranges))) - (when (= (1+ (car ranges)) (caadr ranges)) - (setcar (cadr ranges) (car ranges)) - (setcar ranges (cadr ranges)) - (setcdr ranges (cddr ranges))))) - (when (cdr ranges) - (if (atom (cadr ranges)) - (when (= (1+ (cdar ranges)) (cadr ranges)) - (setcdr (car ranges) (cadr ranges)) - (setcdr ranges (cddr ranges))) - (when (= (1+ (cdar ranges)) (caadr ranges)) - (setcdr (car ranges) (cdadr ranges)) - (setcdr ranges (cddr ranges)))))) - (setq ranges (cdr ranges))) - out))) - -(defun gnus-remove-from-range (range1 range2) - "Return a range that has all articles from RANGE2 removed from RANGE1. -The returned range is always a list. RANGE2 can also be a unsorted -list of articles. RANGE1 is modified by side effects, RANGE2 is not -modified." - (if (or (null range1) (null range2)) - range1 - (let (out r1 r2 r1_min r1_max r2_min r2_max - (range2 (gnus-copy-sequence range2))) - (setq range1 (if (listp (cdr range1)) range1 (list range1)) - range2 (sort (if (listp (cdr range2)) range2 (list range2)) - (lambda (e1 e2) - (< (if (consp e1) (car e1) e1) - (if (consp e2) (car e2) e2)))) - r1 (car range1) - r2 (car range2) - r1_min (if (consp r1) (car r1) r1) - r1_max (if (consp r1) (cdr r1) r1) - r2_min (if (consp r2) (car r2) r2) - r2_max (if (consp r2) (cdr r2) r2)) - (while (and range1 range2) - (cond ((< r2_max r1_min) ; r2 < r1 - (pop range2) - (setq r2 (car range2) - r2_min (if (consp r2) (car r2) r2) - r2_max (if (consp r2) (cdr r2) r2))) - ((and (<= r2_min r1_min) (<= r1_max r2_max)) ; r2 overlap r1 - (pop range1) - (setq r1 (car range1) - r1_min (if (consp r1) (car r1) r1) - r1_max (if (consp r1) (cdr r1) r1))) - ((and (<= r2_min r1_min) (<= r2_max r1_max)) ; r2 overlap min r1 - (pop range2) - (setq r1_min (1+ r2_max) - r2 (car range2) - r2_min (if (consp r2) (car r2) r2) - r2_max (if (consp r2) (cdr r2) r2))) - ((and (<= r1_min r2_min) (<= r2_max r1_max)) ; r2 contained in r1 - (if (eq r1_min (1- r2_min)) - (push r1_min out) - (push (cons r1_min (1- r2_min)) out)) - (pop range2) - (if (< r2_max r1_max) ; finished with r1? - (setq r1_min (1+ r2_max)) - (pop range1) - (setq r1 (car range1) - r1_min (if (consp r1) (car r1) r1) - r1_max (if (consp r1) (cdr r1) r1))) - (setq r2 (car range2) - r2_min (if (consp r2) (car r2) r2) - r2_max (if (consp r2) (cdr r2) r2))) - ((and (<= r2_min r1_max) (<= r1_max r2_max)) ; r2 overlap max r1 - (if (eq r1_min (1- r2_min)) - (push r1_min out) - (push (cons r1_min (1- r2_min)) out)) - (pop range1) - (setq r1 (car range1) - r1_min (if (consp r1) (car r1) r1) - r1_max (if (consp r1) (cdr r1) r1))) - ((< r1_max r2_min) ; r2 > r1 - (pop range1) - (if (eq r1_min r1_max) - (push r1_min out) - (push (cons r1_min r1_max) out)) - (setq r1 (car range1) - r1_min (if (consp r1) (car r1) r1) - r1_max (if (consp r1) (cdr r1) r1))))) - (when r1 - (if (eq r1_min r1_max) - (push r1_min out) - (push (cons r1_min r1_max) out)) - (pop range1)) - (while range1 - (push (pop range1) out)) - (nreverse out)))) - -(defun gnus-member-of-range (number ranges) - (if (not (listp (cdr ranges))) - (and (>= number (car ranges)) - (<= number (cdr ranges))) - (let ((not-stop t)) - (while (and ranges - (if (numberp (car ranges)) - (>= number (car ranges)) - (>= number (caar ranges))) - not-stop) - (when (if (numberp (car ranges)) - (= number (car ranges)) - (and (>= number (caar ranges)) - (<= number (cdar ranges)))) - (setq not-stop nil)) - (setq ranges (cdr ranges))) - (not not-stop)))) - -(defun gnus-range-length (range) - "Return the length RANGE would have if uncompressed." - (length (gnus-uncompress-range range))) - -(defun gnus-sublist-p (list sublist) - "Test whether all elements in SUBLIST are members of LIST." - (let ((sublistp t)) - (while sublist - (unless (memq (pop sublist) list) - (setq sublistp nil - sublist nil))) - sublistp)) - -(defun gnus-range-add (range1 range2) - "Add RANGE2 to RANGE1 (nondestructively)." - (unless (listp (cdr range1)) - (setq range1 (list range1))) - (unless (listp (cdr range2)) - (setq range2 (list range2))) - (let ((item1 (pop range1)) - (item2 (pop range2)) - range item selector) - (while (or item1 item2) - (setq selector - (cond - ((null item1) nil) - ((null item2) t) - ((and (numberp item1) (numberp item2)) (< item1 item2)) - ((numberp item1) (< item1 (car item2))) - ((numberp item2) (< (car item1) item2)) - (t (< (car item1) (car item2))))) - (setq item - (or - (let ((tmp1 item) (tmp2 (if selector item1 item2))) - (cond - ((null tmp1) tmp2) - ((null tmp2) tmp1) - ((and (numberp tmp1) (numberp tmp2)) - (cond - ((eq tmp1 tmp2) tmp1) - ((eq (1+ tmp1) tmp2) (cons tmp1 tmp2)) - ((eq (1+ tmp2) tmp1) (cons tmp2 tmp1)) - (t nil))) - ((numberp tmp1) - (cond - ((and (>= tmp1 (car tmp2)) (<= tmp1 (cdr tmp2))) tmp2) - ((eq (1+ tmp1) (car tmp2)) (cons tmp1 (cdr tmp2))) - ((eq (1- tmp1) (cdr tmp2)) (cons (car tmp2) tmp1)) - (t nil))) - ((numberp tmp2) - (cond - ((and (>= tmp2 (car tmp1)) (<= tmp2 (cdr tmp1))) tmp1) - ((eq (1+ tmp2) (car tmp1)) (cons tmp2 (cdr tmp1))) - ((eq (1- tmp2) (cdr tmp1)) (cons (car tmp1) tmp2)) - (t nil))) - ((< (1+ (cdr tmp1)) (car tmp2)) nil) - ((< (1+ (cdr tmp2)) (car tmp1)) nil) - (t (cons (min (car tmp1) (car tmp2)) - (max (cdr tmp1) (cdr tmp2)))))) - (progn - (if item (push item range)) - (if selector item1 item2)))) - (if selector - (setq item1 (pop range1)) - (setq item2 (pop range2)))) - (if item (push item range)) - (reverse range))) - -(provide 'gnus-range) - -;;; gnus-range.el ends here diff --git a/lisp/gnus-salt.el b/lisp/gnus-salt.el deleted file mode 100644 index b76bac2..0000000 --- a/lisp/gnus-salt.el +++ /dev/null @@ -1,1052 +0,0 @@ -;;; gnus-salt.el --- alternate summary mode interfaces for Gnus - -;; Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus) -(require 'gnus-sum) - -;;; -;;; gnus-pick-mode -;;; - -(defvar gnus-pick-mode nil - "Minor mode for providing a pick-and-read interface in Gnus -summary buffers.") - -(defcustom gnus-pick-display-summary nil - "*Display summary while reading." - :type 'boolean - :group 'gnus-summary-pick) - -(defcustom gnus-pick-mode-hook nil - "Hook run in summary pick mode buffers." - :type 'hook - :group 'gnus-summary-pick) - -(when (featurep 'xemacs) - (add-hook 'gnus-pick-mode-hook 'gnus-xmas-pick-menu-add)) - -(defcustom gnus-mark-unpicked-articles-as-read nil - "*If non-nil, mark all unpicked articles as read." - :type 'boolean - :group 'gnus-summary-pick) - -(defcustom gnus-pick-elegant-flow t - "If non-nil, `gnus-pick-start-reading' runs - `gnus-summary-next-group' when no articles have been picked." - :type 'boolean - :group 'gnus-summary-pick) - -(defcustom gnus-summary-pick-line-format - "%-5P %U\%R\%z\%I\%(%[%4L: %-23,23n%]%) %s\n" - "*The format specification of the lines in pick buffers. -It accepts the same format specs that `gnus-summary-line-format' does." - :type 'string - :group 'gnus-summary-pick) - -;;; Internal variables. - -(defvar gnus-pick-mode-map nil) - -(unless gnus-pick-mode-map - (setq gnus-pick-mode-map (make-sparse-keymap)) - - (gnus-define-keys gnus-pick-mode-map - " " gnus-pick-next-page - "u" gnus-pick-unmark-article-or-thread - "." gnus-pick-article-or-thread - gnus-down-mouse-2 gnus-pick-mouse-pick-region - "\r" gnus-pick-start-reading)) - -(defun gnus-pick-make-menu-bar () - (unless (boundp 'gnus-pick-menu) - (easy-menu-define - gnus-pick-menu gnus-pick-mode-map "" - '("Pick" - ("Pick" - ["Article" gnus-summary-mark-as-processable t] - ["Thread" gnus-uu-mark-thread t] - ["Region" gnus-uu-mark-region t] - ["Regexp" gnus-uu-mark-by-regexp t] - ["Buffer" gnus-uu-mark-buffer t]) - ("Unpick" - ["Article" gnus-summary-unmark-as-processable t] - ["Thread" gnus-uu-unmark-thread t] - ["Region" gnus-uu-unmark-region t] - ["Regexp" gnus-uu-unmark-by-regexp t] - ["Buffer" gnus-summary-unmark-all-processable t]) - ["Start reading" gnus-pick-start-reading t] - ["Switch pick mode off" gnus-pick-mode gnus-pick-mode])))) - -(defun gnus-pick-mode (&optional arg) - "Minor mode for providing a pick-and-read interface in Gnus summary buffers. - -\\{gnus-pick-mode-map}" - (interactive "P") - (when (eq major-mode 'gnus-summary-mode) - (if (not (set (make-local-variable 'gnus-pick-mode) - (if (null arg) (not gnus-pick-mode) - (> (prefix-numeric-value arg) 0)))) - (remove-hook 'gnus-message-setup-hook 'gnus-pick-setup-message) - ;; Make sure that we don't select any articles upon group entry. - (set (make-local-variable 'gnus-auto-select-first) nil) - ;; Change line format. - (setq gnus-summary-line-format gnus-summary-pick-line-format) - (setq gnus-summary-line-format-spec nil) - (gnus-update-format-specifications nil 'summary) - (gnus-update-summary-mark-positions) - (add-hook 'gnus-message-setup-hook 'gnus-pick-setup-message) - (set (make-local-variable 'gnus-summary-goto-unread) 'never) - ;; Set up the menu. - (when (gnus-visual-p 'pick-menu 'menu) - (gnus-pick-make-menu-bar)) - (gnus-add-minor-mode 'gnus-pick-mode " Pick" gnus-pick-mode-map - nil 'gnus-pick-mode) - (gnus-run-hooks 'gnus-pick-mode-hook)))) - -(defun gnus-pick-setup-message () - "Make Message do the right thing on exit." - (when (and (gnus-buffer-live-p gnus-summary-buffer) - (save-excursion - (set-buffer gnus-summary-buffer) - gnus-pick-mode)) - (message-add-action - '(gnus-configure-windows ,gnus-current-window-configuration t) - 'send 'exit 'postpone 'kill))) - -(defvar gnus-pick-line-number 1) -(defun gnus-pick-line-number () - "Return the current line number." - (if (bobp) - (setq gnus-pick-line-number 1) - (incf gnus-pick-line-number))) - -(defun gnus-pick-start-reading (&optional catch-up) - "Start reading the picked articles. -If given a prefix, mark all unpicked articles as read." - (interactive "P") - (if gnus-newsgroup-processable - (progn - (gnus-summary-limit-to-articles nil) - (when (or catch-up gnus-mark-unpicked-articles-as-read) - (gnus-summary-limit-mark-excluded-as-read)) - (gnus-summary-first-article) - (gnus-configure-windows - (if gnus-pick-display-summary 'article 'pick) t)) - (if gnus-pick-elegant-flow - (progn - (when (or catch-up gnus-mark-unpicked-articles-as-read) - (gnus-summary-catchup nil t)) - (if (gnus-group-quit-config gnus-newsgroup-name) - (gnus-summary-exit) - (gnus-summary-next-group))) - (error "No articles have been picked")))) - -(defun gnus-pick-goto-article (arg) - "Go to the article number indicated by ARG. -If ARG is an invalid article number, then stay on current line." - (let (pos) - (save-excursion - (goto-char (point-min)) - (when (zerop (forward-line (1- (prefix-numeric-value arg)))) - (setq pos (point)))) - (if (not pos) - (gnus-error 2 "No such line: %s" arg) - (goto-char pos)))) - -(defun gnus-pick-article (&optional arg) - "Pick the article on the current line. -If ARG, pick the article on that line instead." - (interactive "P") - (when arg - (gnus-pick-goto-article arg)) - (gnus-summary-mark-as-processable 1)) - -(defun gnus-pick-article-or-thread (&optional arg) - "If `gnus-thread-hide-subtree' is t, then pick the thread on the current line. -Otherwise pick the article on the current line. -If ARG, pick the article/thread on that line instead." - (interactive "P") - (when arg - (gnus-pick-goto-article arg)) - (if gnus-thread-hide-subtree - (progn - (save-excursion - (gnus-uu-mark-thread)) - (forward-line 1)) - (gnus-summary-mark-as-processable 1))) - -(defun gnus-pick-unmark-article-or-thread (&optional arg) - "If `gnus-thread-hide-subtree' is t, then unmark the thread on current line. -Otherwise unmark the article on current line. -If ARG, unmark thread/article on that line instead." - (interactive "P") - (when arg - (gnus-pick-goto-article arg)) - (if gnus-thread-hide-subtree - (save-excursion - (gnus-uu-unmark-thread)) - (gnus-summary-unmark-as-processable 1))) - -(defun gnus-pick-mouse-pick (e) - (interactive "e") - (mouse-set-point e) - (save-excursion - (gnus-summary-mark-as-processable 1))) - -(defun gnus-pick-mouse-pick-region (start-event) - "Pick articles that the mouse is dragged over. -This must be bound to a button-down mouse event." - (interactive "e") - (mouse-minibuffer-check start-event) - (let* ((echo-keystrokes 0) - (start-posn (event-start start-event)) - (start-point (posn-point start-posn)) - (start-line (1+ (count-lines 1 start-point))) - (start-window (posn-window start-posn)) - (bounds (gnus-window-edges start-window)) - (top (nth 1 bounds)) - (bottom (if (window-minibuffer-p start-window) - (nth 3 bounds) - ;; Don't count the mode line. - (1- (nth 3 bounds)))) - (click-count (1- (event-click-count start-event)))) - (setq mouse-selection-click-count click-count) - (setq mouse-selection-click-count-buffer (current-buffer)) - (mouse-set-point start-event) - ;; In case the down click is in the middle of some intangible text, - ;; use the end of that text, and put it in START-POINT. - (when (< (point) start-point) - (goto-char start-point)) - (gnus-pick-article) - (setq start-point (point)) - ;; end-of-range is used only in the single-click case. - ;; It is the place where the drag has reached so far - ;; (but not outside the window where the drag started). - (let (event end end-point (end-of-range (point))) - (track-mouse - (while (progn - (setq event (cdr (gnus-read-event-char))) - (or (mouse-movement-p event) - (eq (car-safe event) 'switch-frame))) - (if (eq (car-safe event) 'switch-frame) - nil - (setq end (event-end event) - end-point (posn-point end)) - - (cond - ;; Are we moving within the original window? - ((and (eq (posn-window end) start-window) - (integer-or-marker-p end-point)) - ;; Go to START-POINT first, so that when we move to END-POINT, - ;; if it's in the middle of intangible text, - ;; point jumps in the direction away from START-POINT. - (goto-char start-point) - (goto-char end-point) - (gnus-pick-article) - ;; In case the user moved his mouse really fast, pick - ;; articles on the line between this one and the last one. - (let* ((this-line (1+ (count-lines 1 end-point))) - (min-line (min this-line start-line)) - (max-line (max this-line start-line))) - (while (< min-line max-line) - (goto-line min-line) - (gnus-pick-article) - (setq min-line (1+ min-line))) - (setq start-line this-line)) - (when (zerop (% click-count 3)) - (setq end-of-range (point)))) - (t - (let ((mouse-row (cdr (cdr (mouse-position))))) - (cond - ((null mouse-row)) - ((< mouse-row top) - (mouse-scroll-subr start-window (- mouse-row top))) - ((>= mouse-row bottom) - (mouse-scroll-subr start-window - (1+ (- mouse-row bottom))))))))))) - (when (consp event) - (let ((fun (key-binding (vector (car event))))) - ;; Run the binding of the terminating up-event, if possible. - ;; In the case of a multiple click, it gives the wrong results, - ;; because it would fail to set up a region. - (when nil - ;; (and (= (mod mouse-selection-click-count 3) 0) (fboundp fun)) - ;; In this case, we can just let the up-event execute normally. - (let ((end (event-end event))) - ;; Set the position in the event before we replay it, - ;; because otherwise it may have a position in the wrong - ;; buffer. - (setcar (cdr end) end-of-range) - ;; Delete the overlay before calling the function, - ;; because delete-overlay increases buffer-modified-tick. - (push event unread-command-events)))))))) - -(defun gnus-pick-next-page () - "Go to the next page. If at the end of the buffer, start reading articles." - (interactive) - (let ((scroll-in-place nil)) - (condition-case nil - (scroll-up) - (end-of-buffer (gnus-pick-start-reading))))) - -;;; -;;; gnus-binary-mode -;;; - -(defvar gnus-binary-mode nil - "Minor mode for providing a binary group interface in Gnus summary buffers.") - -(defvar gnus-binary-mode-hook nil - "Hook run in summary binary mode buffers.") - -(defvar gnus-binary-mode-map nil) - -(unless gnus-binary-mode-map - (setq gnus-binary-mode-map (make-sparse-keymap)) - - (gnus-define-keys - gnus-binary-mode-map - "g" gnus-binary-show-article)) - -(defun gnus-binary-make-menu-bar () - (unless (boundp 'gnus-binary-menu) - (easy-menu-define - gnus-binary-menu gnus-binary-mode-map "" - '("Pick" - ["Switch binary mode off" gnus-binary-mode t])))) - -(defun gnus-binary-mode (&optional arg) - "Minor mode for providing a binary group interface in Gnus summary buffers." - (interactive "P") - (when (eq major-mode 'gnus-summary-mode) - (make-local-variable 'gnus-binary-mode) - (setq gnus-binary-mode - (if (null arg) (not gnus-binary-mode) - (> (prefix-numeric-value arg) 0))) - (when gnus-binary-mode - ;; Make sure that we don't select any articles upon group entry. - (make-local-variable 'gnus-auto-select-first) - (setq gnus-auto-select-first nil) - (make-local-variable 'gnus-summary-display-article-function) - (setq gnus-summary-display-article-function 'gnus-binary-display-article) - ;; Set up the menu. - (when (gnus-visual-p 'binary-menu 'menu) - (gnus-binary-make-menu-bar)) - (gnus-add-minor-mode 'gnus-binary-mode " Binary" - gnus-binary-mode-map nil 'gnus-binary-mode) - (gnus-run-hooks 'gnus-binary-mode-hook)))) - -(defun gnus-binary-display-article (article &optional all-header) - "Run ARTICLE through the binary decode functions." - (when (gnus-summary-goto-subject article) - (let ((gnus-view-pseudos 'automatic)) - (gnus-uu-decode-uu)))) - -(defun gnus-binary-show-article (&optional arg) - "Bypass the binary functions and show the article." - (interactive "P") - (let (gnus-summary-display-article-function) - (gnus-summary-show-article arg))) - -;;; -;;; gnus-tree-mode -;;; - -(defcustom gnus-tree-line-format "%(%[%3,3n%]%)" - "Format of tree elements." - :type 'string - :group 'gnus-summary-tree) - -(defcustom gnus-tree-minimize-window t - "If non-nil, minimize the tree buffer window. -If a number, never let the tree buffer grow taller than that number of -lines." - :type '(choice boolean - integer) - :group 'gnus-summary-tree) - -(defcustom gnus-selected-tree-face 'modeline - "*Face used for highlighting selected articles in the thread tree." - :type 'face - :group 'gnus-summary-tree) - -(defvar gnus-tree-brackets '((?\[ . ?\]) (?\( . ?\)) - (?\{ . ?\}) (?< . ?>)) - "Brackets used in tree nodes.") - -(defvar gnus-tree-parent-child-edges '(?- ?\\ ?|) - "Characters used to connect parents with children.") - -(defcustom gnus-tree-mode-line-format "Gnus: %%b %S %Z" - "*The format specification for the tree mode line." - :type 'string - :group 'gnus-summary-tree) - -(defcustom gnus-generate-tree-function 'gnus-generate-vertical-tree - "*Function for generating a thread tree. -Two predefined functions are available: -`gnus-generate-horizontal-tree' and `gnus-generate-vertical-tree'." - :type '(radio (function-item gnus-generate-vertical-tree) - (function-item gnus-generate-horizontal-tree) - (function :tag "Other" nil)) - :group 'gnus-summary-tree) - -(defcustom gnus-tree-mode-hook nil - "*Hook run in tree mode buffers." - :type 'hook - :group 'gnus-summary-tree) - -(when (featurep 'xemacs) - (add-hook 'gnus-tree-mode-hook 'gnus-xmas-tree-menu-add) - (add-hook 'gnus-tree-mode-hook 'gnus-xmas-switch-horizontal-scrollbar-off)) - - -;;; Internal variables. - -(defvar gnus-tree-line-format-alist - `((?n gnus-tmp-name ?s) - (?f gnus-tmp-from ?s) - (?N gnus-tmp-number ?d) - (?\[ gnus-tmp-open-bracket ?c) - (?\] gnus-tmp-close-bracket ?c) - (?s gnus-tmp-subject ?s))) - -(defvar gnus-tree-mode-line-format-alist gnus-summary-mode-line-format-alist) - -(defvar gnus-tree-mode-line-format-spec nil) -(defvar gnus-tree-line-format-spec nil) - -(defvar gnus-tree-node-length nil) -(defvar gnus-selected-tree-overlay nil) - -(defvar gnus-tree-displayed-thread nil) -(defvar gnus-tree-inhibit nil) - -(defvar gnus-tree-mode-map nil) -(put 'gnus-tree-mode 'mode-class 'special) - -(unless gnus-tree-mode-map - (setq gnus-tree-mode-map (make-keymap)) - (suppress-keymap gnus-tree-mode-map) - (gnus-define-keys - gnus-tree-mode-map - "\r" gnus-tree-select-article - gnus-mouse-2 gnus-tree-pick-article - "\C-?" gnus-tree-read-summary-keys - "h" gnus-tree-show-summary - - "\C-c\C-i" gnus-info-find-node) - - (substitute-key-definition - 'undefined 'gnus-tree-read-summary-keys gnus-tree-mode-map)) - -(defun gnus-tree-make-menu-bar () - (unless (boundp 'gnus-tree-menu) - (easy-menu-define - gnus-tree-menu gnus-tree-mode-map "" - '("Tree" - ["Select article" gnus-tree-select-article t])))) - -(defun gnus-tree-mode () - "Major mode for displaying thread trees." - (interactive) - (gnus-set-format 'tree-mode) - (gnus-set-format 'tree t) - (when (gnus-visual-p 'tree-menu 'menu) - (gnus-tree-make-menu-bar)) - (kill-all-local-variables) - (gnus-simplify-mode-line) - (setq mode-name "Tree") - (setq major-mode 'gnus-tree-mode) - (use-local-map gnus-tree-mode-map) - (buffer-disable-undo) - (setq buffer-read-only t) - (setq truncate-lines t) - (save-excursion - (gnus-set-work-buffer) - (gnus-tree-node-insert (make-mail-header "") nil) - (setq gnus-tree-node-length (1- (point)))) - (gnus-run-hooks 'gnus-tree-mode-hook)) - -(defun gnus-tree-read-summary-keys (&optional arg) - "Read a summary buffer key sequence and execute it." - (interactive "P") - (unless gnus-tree-inhibit - (let ((buf (current-buffer)) - (gnus-tree-inhibit t) - win) - (set-buffer gnus-article-buffer) - (gnus-article-read-summary-keys arg nil t) - (when (setq win (get-buffer-window buf)) - (select-window win) - (when gnus-selected-tree-overlay - (goto-char (or (gnus-overlay-end gnus-selected-tree-overlay) 1))) - (gnus-tree-minimize))))) - -(defun gnus-tree-show-summary () - "Reconfigure windows to show summary buffer." - (interactive) - (if (not (gnus-buffer-live-p gnus-summary-buffer)) - (error "There is no summary buffer for this tree buffer") - (gnus-configure-windows 'article) - (gnus-summary-goto-subject gnus-current-article))) - -(defun gnus-tree-select-article (article) - "Select the article under point, if any." - (interactive (list (gnus-tree-article-number))) - (let ((buf (current-buffer))) - (when article - (save-excursion - (set-buffer gnus-summary-buffer) - (gnus-summary-goto-article article)) - (select-window (get-buffer-window buf))))) - -(defun gnus-tree-pick-article (e) - "Select the article under the mouse pointer." - (interactive "e") - (mouse-set-point e) - (gnus-tree-select-article (gnus-tree-article-number))) - -(defun gnus-tree-article-number () - (get-text-property (point) 'gnus-number)) - -(defun gnus-tree-article-region (article) - "Return a cons with BEG and END of the article region." - (let ((pos (text-property-any - (point-min) (point-max) 'gnus-number article))) - (when pos - (cons pos (next-single-property-change pos 'gnus-number))))) - -(defun gnus-tree-goto-article (article) - (let ((pos (text-property-any - (point-min) (point-max) 'gnus-number article))) - (when pos - (goto-char pos)))) - -(defun gnus-tree-recenter () - "Center point in the tree window." - (let ((selected (selected-window)) - (tree-window (get-buffer-window gnus-tree-buffer t))) - (when tree-window - (select-window tree-window) - (when gnus-selected-tree-overlay - (goto-char (or (gnus-overlay-end gnus-selected-tree-overlay) 1))) - (let* ((top (cond ((< (window-height) 4) 0) - ((< (window-height) 7) 1) - (t 2))) - (height (1- (window-height))) - (bottom (save-excursion (goto-char (point-max)) - (forward-line (- height)) - (point)))) - ;; Set the window start to either `bottom', which is the biggest - ;; possible valid number, or the second line from the top, - ;; whichever is the least. - (set-window-start - tree-window (min bottom (save-excursion - (forward-line (- top)) (point))))) - (select-window selected)))) - -(defun gnus-get-tree-buffer () - "Return the tree buffer properly initialized." - (save-excursion - (set-buffer (gnus-get-buffer-create gnus-tree-buffer)) - (unless (eq major-mode 'gnus-tree-mode) - (gnus-tree-mode)) - (current-buffer))) - -(defun gnus-tree-minimize () - (when (and gnus-tree-minimize-window - (not (one-window-p))) - (let ((windows 0) - tot-win-height) - (walk-windows (lambda (window) (incf windows))) - (setq tot-win-height - (- (frame-height) - (* window-min-height (1- windows)) - 2)) - (let* ((window-min-height 2) - (height (count-lines (point-min) (point-max))) - (min (max (1- window-min-height) height)) - (tot (if (numberp gnus-tree-minimize-window) - (min gnus-tree-minimize-window min) - min)) - (win (get-buffer-window (current-buffer))) - (wh (and win (1- (window-height win))))) - (setq tot (min tot tot-win-height)) - (when (and win - (not (eq tot wh))) - (let ((selected (selected-window))) - (when (ignore-errors (select-window win)) - (enlarge-window (- tot wh)) - (select-window selected)))))))) - -;;; Generating the tree. - -(defun gnus-tree-node-insert (header sparse &optional adopted) - (let* ((dummy (stringp header)) - (header (if (vectorp header) header - (progn - (setq header (make-mail-header "*****")) - (mail-header-set-number header 0) - (mail-header-set-lines header 0) - (mail-header-set-chars header 0) - header))) - (gnus-tmp-from (mail-header-from header)) - (gnus-tmp-subject (mail-header-subject header)) - (gnus-tmp-number (mail-header-number header)) - (gnus-tmp-name - (cond - ((string-match "(.+)" gnus-tmp-from) - (substring gnus-tmp-from - (1+ (match-beginning 0)) (1- (match-end 0)))) - ((string-match "<[^>]+> *$" gnus-tmp-from) - (let ((beg (match-beginning 0))) - (or (and (string-match "^\"[^\"]*\"" gnus-tmp-from) - (substring gnus-tmp-from (1+ (match-beginning 0)) - (1- (match-end 0)))) - (substring gnus-tmp-from 0 beg)))) - ((memq gnus-tmp-number sparse) - "***") - (t gnus-tmp-from))) - (gnus-tmp-open-bracket - (cond ((memq gnus-tmp-number sparse) - (caadr gnus-tree-brackets)) - (dummy (caaddr gnus-tree-brackets)) - (adopted (car (nth 3 gnus-tree-brackets))) - (t (caar gnus-tree-brackets)))) - (gnus-tmp-close-bracket - (cond ((memq gnus-tmp-number sparse) - (cdadr gnus-tree-brackets)) - (adopted (cdr (nth 3 gnus-tree-brackets))) - (dummy - (cdaddr gnus-tree-brackets)) - (t (cdar gnus-tree-brackets)))) - (buffer-read-only nil) - beg end) - (gnus-add-text-properties - (setq beg (point)) - (setq end (progn (eval gnus-tree-line-format-spec) (point))) - (list 'gnus-number gnus-tmp-number)) - (when (or t (gnus-visual-p 'tree-highlight 'highlight)) - (gnus-tree-highlight-node gnus-tmp-number beg end)))) - -(defun gnus-tree-highlight-node (article beg end) - "Highlight current line according to `gnus-summary-highlight'." - (let ((list gnus-summary-highlight) - face) - (save-excursion - (set-buffer gnus-summary-buffer) - (let* ((score (or (cdr (assq article gnus-newsgroup-scored)) - gnus-summary-default-score 0)) - (default gnus-summary-default-score) - (default-high gnus-summary-default-high-score) - (default-low gnus-summary-default-low-score) - (mark (or (gnus-summary-article-mark article) gnus-unread-mark))) - ;; Eval the cars of the lists until we find a match. - (while (and list - (not (eval (caar list)))) - (setq list (cdr list))))) - (unless (eq (setq face (cdar list)) (get-text-property beg 'face)) - (gnus-put-text-property-excluding-characters-with-faces - beg end 'face - (if (boundp face) (symbol-value face) face))))) - -(defun gnus-tree-indent (level) - (insert (make-string (1- (* (1+ gnus-tree-node-length) level)) ? ))) - -(defvar gnus-tmp-limit) -(defvar gnus-tmp-sparse) -(defvar gnus-tmp-indent) - -(defun gnus-generate-tree (thread) - "Generate a thread tree for THREAD." - (save-excursion - (set-buffer (gnus-get-tree-buffer)) - (let ((buffer-read-only nil) - (gnus-tmp-indent 0)) - (erase-buffer) - (funcall gnus-generate-tree-function thread 0) - (gnus-set-mode-line 'tree) - (goto-char (point-min)) - (gnus-tree-minimize) - (gnus-tree-recenter) - (let ((selected (selected-window))) - (when (get-buffer-window (set-buffer gnus-tree-buffer) t) - (select-window (get-buffer-window (set-buffer gnus-tree-buffer) t)) - (gnus-horizontal-recenter) - (select-window selected)))))) - -(defun gnus-generate-horizontal-tree (thread level &optional dummyp adopted) - "Generate a horizontal tree." - (let* ((dummy (stringp (car thread))) - (do (or dummy - (and (car thread) - (memq (mail-header-number (car thread)) - gnus-tmp-limit)))) - col beg) - (if (not do) - ;; We don't want this article. - (setq thread (cdr thread)) - (if (not (bolp)) - ;; Not the first article on the line, so we insert a "-". - (insert (car gnus-tree-parent-child-edges)) - ;; If the level isn't zero, then we insert some indentation. - (unless (zerop level) - (gnus-tree-indent level) - (insert (cadr gnus-tree-parent-child-edges)) - (setq col (- (setq beg (point)) (gnus-point-at-bol) 1)) - ;; Draw "|" lines upwards. - (while (progn - (forward-line -1) - (forward-char col) - (eq (char-after) ? )) - (delete-char 1) - (insert (caddr gnus-tree-parent-child-edges))) - (goto-char beg))) - (setq dummyp nil) - ;; Insert the article node. - (gnus-tree-node-insert (pop thread) gnus-tmp-sparse adopted)) - (if (null thread) - ;; End of the thread, so we go to the next line. - (unless (bolp) - (insert "\n")) - ;; Recurse downwards in all children of this article. - (while thread - (gnus-generate-horizontal-tree - (pop thread) (if do (1+ level) level) - (or dummyp dummy) dummy))))) - -(defsubst gnus-tree-indent-vertical () - (let ((len (- (* (1+ gnus-tree-node-length) gnus-tmp-indent) - (- (point) (gnus-point-at-bol))))) - (when (> len 0) - (insert (make-string len ? ))))) - -(defsubst gnus-tree-forward-line (n) - (while (>= (decf n) 0) - (unless (zerop (forward-line 1)) - (end-of-line) - (insert "\n"))) - (end-of-line)) - -(defun gnus-generate-vertical-tree (thread level &optional dummyp adopted) - "Generate a vertical tree." - (let* ((dummy (stringp (car thread))) - (do (or dummy - (and (car thread) - (memq (mail-header-number (car thread)) - gnus-tmp-limit)))) - beg) - (if (not do) - ;; We don't want this article. - (setq thread (cdr thread)) - (if (not (save-excursion (beginning-of-line) (bobp))) - ;; Not the first article on the line, so we insert a "-". - (progn - (gnus-tree-indent-vertical) - (insert (make-string (/ gnus-tree-node-length 2) ? )) - (insert (caddr gnus-tree-parent-child-edges)) - (gnus-tree-forward-line 1)) - ;; If the level isn't zero, then we insert some indentation. - (unless (zerop gnus-tmp-indent) - (gnus-tree-forward-line (1- (* 2 level))) - (gnus-tree-indent-vertical) - (delete-char -1) - (insert (cadr gnus-tree-parent-child-edges)) - (setq beg (point)) - (forward-char -1) - ;; Draw "-" lines leftwards. - (while (and (> (point) 1) - (eq (char-after (1- (point))) ? )) - (delete-char -1) - (insert (car gnus-tree-parent-child-edges)) - (forward-char -1)) - (goto-char beg) - (gnus-tree-forward-line 1))) - (setq dummyp nil) - ;; Insert the article node. - (gnus-tree-indent-vertical) - (gnus-tree-node-insert (pop thread) gnus-tmp-sparse adopted) - (gnus-tree-forward-line 1)) - (if (null thread) - ;; End of the thread, so we go to the next line. - (progn - (goto-char (point-min)) - (end-of-line) - (incf gnus-tmp-indent)) - ;; Recurse downwards in all children of this article. - (while thread - (gnus-generate-vertical-tree - (pop thread) (if do (1+ level) level) - (or dummyp dummy) dummy))))) - -;;; Interface functions. - -(defun gnus-possibly-generate-tree (article &optional force) - "Generate the thread tree for ARTICLE if it isn't displayed already." - (when (save-excursion - (set-buffer gnus-summary-buffer) - (and gnus-use-trees - gnus-show-threads - (vectorp (gnus-summary-article-header article)))) - (save-excursion - (let ((top (save-excursion - (set-buffer gnus-summary-buffer) - (gnus-cut-thread - (gnus-remove-thread - (mail-header-id - (gnus-summary-article-header article)) - t)))) - (gnus-tmp-limit gnus-newsgroup-limit) - (gnus-tmp-sparse gnus-newsgroup-sparse)) - (when (or force - (not (eq top gnus-tree-displayed-thread))) - (gnus-generate-tree top) - (setq gnus-tree-displayed-thread top)))))) - -(defun gnus-tree-open (group) - (gnus-get-tree-buffer)) - -(defun gnus-tree-close (group) - (gnus-kill-buffer gnus-tree-buffer)) - -(defun gnus-highlight-selected-tree (article) - "Highlight the selected article in the tree." - (let ((buf (current-buffer)) - region) - (set-buffer gnus-tree-buffer) - (when (setq region (gnus-tree-article-region article)) - (when (or (not gnus-selected-tree-overlay) - (gnus-extent-detached-p gnus-selected-tree-overlay)) - ;; Create a new overlay. - (gnus-overlay-put - (setq gnus-selected-tree-overlay (gnus-make-overlay 1 2)) - 'face gnus-selected-tree-face)) - ;; Move the overlay to the article. - (gnus-move-overlay - gnus-selected-tree-overlay (goto-char (car region)) (cdr region)) - (gnus-tree-minimize) - (gnus-tree-recenter) - (let ((selected (selected-window))) - (when (get-buffer-window (set-buffer gnus-tree-buffer) t) - (select-window (get-buffer-window (set-buffer gnus-tree-buffer) t)) - (gnus-horizontal-recenter) - (select-window selected)))) - ;; If we remove this save-excursion, it updates the wrong mode lines?!? - (save-excursion - (set-buffer gnus-tree-buffer) - (gnus-set-mode-line 'tree)) - (set-buffer buf))) - -(defun gnus-tree-highlight-article (article face) - (save-excursion - (set-buffer (gnus-get-tree-buffer)) - (let (region) - (when (setq region (gnus-tree-article-region article)) - (gnus-put-text-property (car region) (cdr region) 'face face) - (set-window-point - (get-buffer-window (current-buffer) t) (cdr region)))))) - -;;; -;;; gnus-carpal -;;; - -(defvar gnus-carpal-group-buffer-buttons - '(("next" . gnus-group-next-unread-group) - ("prev" . gnus-group-prev-unread-group) - ("read" . gnus-group-read-group) - ("select" . gnus-group-select-group) - ("catch-up" . gnus-group-catchup-current) - ("new-news" . gnus-group-get-new-news-this-group) - ("toggle-sub" . gnus-group-unsubscribe-current-group) - ("subscribe" . gnus-group-unsubscribe-group) - ("kill" . gnus-group-kill-group) - ("yank" . gnus-group-yank-group) - ("describe" . gnus-group-describe-group) - "list" - ("subscribed" . gnus-group-list-groups) - ("all" . gnus-group-list-all-groups) - ("killed" . gnus-group-list-killed) - ("zombies" . gnus-group-list-zombies) - ("matching" . gnus-group-list-matching) - ("post" . gnus-group-post-news) - ("mail" . gnus-group-mail) - ("rescan" . gnus-group-get-new-news) - ("browse-foreign" . gnus-group-browse-foreign) - ("exit" . gnus-group-exit))) - -(defvar gnus-carpal-summary-buffer-buttons - '("mark" - ("read" . gnus-summary-mark-as-read-forward) - ("tick" . gnus-summary-tick-article-forward) - ("clear" . gnus-summary-clear-mark-forward) - ("expirable" . gnus-summary-mark-as-expirable) - "move" - ("scroll" . gnus-summary-next-page) - ("next-unread" . gnus-summary-next-unread-article) - ("prev-unread" . gnus-summary-prev-unread-article) - ("first" . gnus-summary-first-unread-article) - ("best" . gnus-summary-best-unread-article) - "article" - ("headers" . gnus-summary-toggle-header) - ("uudecode" . gnus-uu-decode-uu) - ("enter-digest" . gnus-summary-enter-digest-group) - ("fetch-parent" . gnus-summary-refer-parent-article) - "mail" - ("move" . gnus-summary-move-article) - ("copy" . gnus-summary-copy-article) - ("respool" . gnus-summary-respool-article) - "threads" - ("lower" . gnus-summary-lower-thread) - ("kill" . gnus-summary-kill-thread) - "post" - ("post" . gnus-summary-post-news) - ("mail" . gnus-summary-mail) - ("followup" . gnus-summary-followup-with-original) - ("reply" . gnus-summary-reply-with-original) - ("cancel" . gnus-summary-cancel-article) - "misc" - ("exit" . gnus-summary-exit) - ("fed-up" . gnus-summary-catchup-and-goto-next-group))) - -(defvar gnus-carpal-server-buffer-buttons - '(("add" . gnus-server-add-server) - ("browse" . gnus-server-browse-server) - ("list" . gnus-server-list-servers) - ("kill" . gnus-server-kill-server) - ("yank" . gnus-server-yank-server) - ("copy" . gnus-server-copy-server) - ("exit" . gnus-server-exit))) - -(defvar gnus-carpal-browse-buffer-buttons - '(("subscribe" . gnus-browse-unsubscribe-current-group) - ("exit" . gnus-browse-exit))) - -(defvar gnus-carpal-group-buffer "*Carpal Group*") -(defvar gnus-carpal-summary-buffer "*Carpal Summary*") -(defvar gnus-carpal-server-buffer "*Carpal Server*") -(defvar gnus-carpal-browse-buffer "*Carpal Browse*") - -(defvar gnus-carpal-attached-buffer nil) - -(defvar gnus-carpal-mode-hook nil - "*Hook run in carpal mode buffers.") - -(defvar gnus-carpal-button-face 'bold - "*Face used on carpal buttons.") - -(defvar gnus-carpal-header-face 'bold-italic - "*Face used on carpal buffer headers.") - -(defvar gnus-carpal-mode-map nil) -(put 'gnus-carpal-mode 'mode-class 'special) - -(if gnus-carpal-mode-map - nil - (setq gnus-carpal-mode-map (make-keymap)) - (suppress-keymap gnus-carpal-mode-map) - (define-key gnus-carpal-mode-map " " 'gnus-carpal-select) - (define-key gnus-carpal-mode-map "\r" 'gnus-carpal-select) - (define-key gnus-carpal-mode-map gnus-mouse-2 'gnus-carpal-mouse-select)) - -(defun gnus-carpal-mode () - "Major mode for clicking buttons. - -All normal editing commands are switched off. -\\ -The following commands are available: - -\\{gnus-carpal-mode-map}" - (interactive) - (kill-all-local-variables) - (setq mode-line-modified (cdr gnus-mode-line-modified)) - (setq major-mode 'gnus-carpal-mode) - (setq mode-name "Gnus Carpal") - (setq mode-line-process nil) - (use-local-map gnus-carpal-mode-map) - (buffer-disable-undo) - (setq buffer-read-only t) - (make-local-variable 'gnus-carpal-attached-buffer) - (gnus-run-hooks 'gnus-carpal-mode-hook)) - -(defun gnus-carpal-setup-buffer (type) - (let ((buffer (symbol-value (intern (format "gnus-carpal-%s-buffer" type))))) - (if (get-buffer buffer) - () - (save-excursion - (set-buffer (gnus-get-buffer-create buffer)) - (gnus-carpal-mode) - (setq gnus-carpal-attached-buffer - (intern (format "gnus-%s-buffer" type))) - (let ((buttons (symbol-value - (intern (format "gnus-carpal-%s-buffer-buttons" - type)))) - (buffer-read-only nil) - button) - (while buttons - (setq button (car buttons) - buttons (cdr buttons)) - (if (stringp button) - (gnus-set-text-properties - (point) - (prog2 (insert button) (point) (insert " ")) - (list 'face gnus-carpal-header-face)) - (gnus-set-text-properties - (point) - (prog2 (insert (car button)) (point) (insert " ")) - (list 'gnus-callback (cdr button) - 'face gnus-carpal-button-face - gnus-mouse-face-prop 'highlight)))) - (let ((fill-column (- (window-width) 2))) - (fill-region (point-min) (point-max))) - (set-window-point (get-buffer-window (current-buffer)) - (point-min))))))) - -(defun gnus-carpal-select () - "Select the button under point." - (interactive) - (let ((func (get-text-property (point) 'gnus-callback))) - (if (null func) - () - (pop-to-buffer (symbol-value gnus-carpal-attached-buffer)) - (call-interactively func)))) - -(defun gnus-carpal-mouse-select (event) - "Select the button under the mouse pointer." - (interactive "e") - (mouse-set-point event) - (gnus-carpal-select)) - -;;; Allow redefinition of functions. -(gnus-ems-redefine) - -(provide 'gnus-salt) - -;;; gnus-salt.el ends here diff --git a/lisp/gnus-score.el b/lisp/gnus-score.el deleted file mode 100644 index 497d93b..0000000 --- a/lisp/gnus-score.el +++ /dev/null @@ -1,3008 +0,0 @@ -;;; gnus-score.el --- scoring code for Gnus -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Per Abrahamsen -;; Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'gnus-clfns)) - -(require 'gnus) -(require 'gnus-sum) -(require 'gnus-range) -(require 'message) -(require 'score-mode) - -(defcustom gnus-global-score-files nil - "List of global score files and directories. -Set this variable if you want to use people's score files. One entry -for each score file or each score file directory. Gnus will decide -by itself what score files are applicable to which group. - -Say you want to use the single score file -\"/ftp.gnus.org@ftp:/pub/larsi/ding/score/soc.motss.SCORE\" and all -score files in the \"/ftp.some-where:/pub/score\" directory. - - (setq gnus-global-score-files - '(\"/ftp.gnus.org:/pub/larsi/ding/score/soc.motss.SCORE\" - \"/ftp.some-where:/pub/score\"))" - :group 'gnus-score-files - :type '(repeat file)) - -(defcustom gnus-score-file-single-match-alist nil - "Alist mapping regexps to lists of score files. -Each element of this alist should be of the form - (\"REGEXP\" [ \"SCORE-FILE-1\" ] [ \"SCORE-FILE-2\" ] ... ) - -If the name of a group is matched by REGEXP, the corresponding scorefiles -will be used for that group. -The first match found is used, subsequent matching entries are ignored (to -use multiple matches, see gnus-score-file-multiple-match-alist). - -These score files are loaded in addition to any files returned by -gnus-score-find-score-files-function (which see)." - :group 'gnus-score-files - :type '(repeat (cons regexp (repeat file)))) - -(defcustom gnus-score-file-multiple-match-alist nil - "Alist mapping regexps to lists of score files. -Each element of this alist should be of the form - (\"REGEXP\" [ \"SCORE-FILE-1\" ] [ \"SCORE-FILE-2\" ] ... ) - -If the name of a group is matched by REGEXP, the corresponding scorefiles -will be used for that group. -If multiple REGEXPs match a group, the score files corresponding to each -match will be used (for only one match to be used, see -gnus-score-file-single-match-alist). - -These score files are loaded in addition to any files returned by -gnus-score-find-score-files-function (which see)." - :group 'gnus-score-files - :type '(repeat (cons regexp (repeat file)))) - -(defcustom gnus-score-file-suffix "SCORE" - "Suffix of the score files." - :group 'gnus-score-files - :type 'string) - -(defcustom gnus-adaptive-file-suffix "ADAPT" - "Suffix of the adaptive score files." - :group 'gnus-score-files - :group 'gnus-score-adapt - :type 'string) - -(defcustom gnus-score-find-score-files-function 'gnus-score-find-bnews - "Function used to find score files. -The function will be called with the group name as the argument, and -should return a list of score files to apply to that group. The score -files do not actually have to exist. - -Predefined values are: - -gnus-score-find-single: Only apply the group's own score file. -gnus-score-find-hierarchical: Also apply score files from parent groups. -gnus-score-find-bnews: Apply score files whose names matches. - -See the documentation to these functions for more information. - -This variable can also be a list of functions to be called. Each -function is given the group name as argument and should either return -a list of score files, or a list of score alists. - -If functions other than these pre-defined functions are used, -the `a' symbolic prefix to the score commands will always use -\"all.SCORE\"." - :group 'gnus-score-files - :type '(radio (function-item gnus-score-find-single) - (function-item gnus-score-find-hierarchical) - (function-item gnus-score-find-bnews) - (repeat :tag "List of functions" - (choice (function :tag "Other" :value 'ignore) - (function-item gnus-score-find-single) - (function-item gnus-score-find-hierarchical) - (function-item gnus-score-find-bnews))) - (function :tag "Other" :value 'ignore))) - -(defcustom gnus-score-interactive-default-score 1000 - "*Scoring commands will raise/lower the score with this number as the default." - :group 'gnus-score-default - :type 'integer) - -(defcustom gnus-score-expiry-days 7 - "*Number of days before unused score file entries are expired. -If this variable is nil, no score file entries will be expired." - :group 'gnus-score-expire - :type '(choice (const :tag "never" nil) - number)) - -(defcustom gnus-update-score-entry-dates t - "*In non-nil, update matching score entry dates. -If this variable is nil, then score entries that provide matches -will be expired along with non-matching score entries." - :group 'gnus-score-expire - :type 'boolean) - -(defcustom gnus-decay-scores nil - "*If non-nil, decay non-permanent scores." - :group 'gnus-score-decay - :type 'boolean) - -(defcustom gnus-decay-score-function 'gnus-decay-score - "*Function called to decay a score. -It is called with one parameter -- the score to be decayed." - :group 'gnus-score-decay - :type '(radio (function-item gnus-decay-score) - (function :tag "Other"))) - -(defcustom gnus-score-decay-constant 3 - "*Decay all \"small\" scores with this amount." - :group 'gnus-score-decay - :type 'integer) - -(defcustom gnus-score-decay-scale .05 - "*Decay all \"big\" scores with this factor." - :group 'gnus-score-decay - :type 'number) - -(defcustom gnus-home-score-file nil - "Variable to control where interactive score entries are to go. -It can be: - - * A string - This file file will be used as the home score file. - - * A function - The result of this function will be used as the home score file. - The function will be passed the name of the group as its - parameter. - - * A list - The elements in this list can be: - - * `(regexp file-name ...)' - If the `regexp' matches the group name, the first `file-name' will - will be used as the home score file. (Multiple filenames are - allowed so that one may use gnus-score-file-single-match-alist to - set this variable.) - - * A function. - If the function returns non-nil, the result will be used - as the home score file. The function will be passed the - name of the group as its parameter. - - * A string. Use the string as the home score file. - - The list will be traversed from the beginning towards the end looking - for matches." - :group 'gnus-score-files - :type '(choice string - (repeat (choice string - (cons regexp (repeat file)) - (function :value fun))) - (function-item gnus-hierarchial-home-score-file) - (function-item gnus-current-home-score-file) - (function :value fun))) - -(defcustom gnus-home-adapt-file nil - "Variable to control where new adaptive score entries are to go. -This variable allows the same syntax as `gnus-home-score-file'." - :group 'gnus-score-adapt - :group 'gnus-score-files - :type '(choice string - (repeat (choice string - (cons regexp (repeat file)) - (function :value fun))) - (function :value fun))) - -(defcustom gnus-default-adaptive-score-alist - '((gnus-kill-file-mark) - (gnus-unread-mark) - (gnus-read-mark (from 3) (subject 30)) - (gnus-catchup-mark (subject -10)) - (gnus-killed-mark (from -1) (subject -20)) - (gnus-del-mark (from -2) (subject -15))) - "*Alist of marks and scores." - :group 'gnus-score-adapt - :type '(repeat (cons (symbol :tag "Mark") - (repeat (list (choice :tag "Header" - (const from) - (const subject) - (symbol :tag "other")) - (integer :tag "Score")))))) - -(defcustom gnus-adaptive-word-length-limit nil - "*Words of a length lesser than this limit will be ignored when doing adaptive scoring." - :group 'gnus-score-adapt - :type 'integer) - -(defcustom gnus-ignored-adaptive-words nil - "List of words to be ignored when doing adaptive word scoring." - :group 'gnus-score-adapt - :type '(repeat string)) - -(defcustom gnus-default-ignored-adaptive-words - '("a" "i" "the" "to" "of" "and" "in" "is" "it" "for" "that" "if" "you" - "this" "be" "on" "with" "not" "have" "are" "or" "as" "from" "can" - "but" "by" "at" "an" "will" "no" "all" "was" "do" "there" "my" "one" - "so" "we" "they" "what" "would" "any" "which" "about" "get" "your" - "use" "some" "me" "then" "name" "like" "out" "when" "up" "time" - "other" "more" "only" "just" "end" "also" "know" "how" "new" "should" - "been" "than" "them" "he" "who" "make" "may" "people" "these" "now" - "their" "here" "into" "first" "could" "way" "had" "see" "work" "well" - "were" "two" "very" "where" "while" "us" "because" "good" "same" - "even" "much" "most" "many" "such" "long" "his" "over" "last" "since" - "right" "before" "our" "without" "too" "those" "why" "must" "part" - "being" "current" "back" "still" "go" "point" "value" "each" "did" - "both" "true" "off" "say" "another" "state" "might" "under" "start" - "try" "re") - "*Default list of words to be ignored when doing adaptive word scoring." - :group 'gnus-score-adapt - :type '(repeat string)) - -(defcustom gnus-default-adaptive-word-score-alist - `((,gnus-read-mark . 30) - (,gnus-catchup-mark . -10) - (,gnus-killed-mark . -20) - (,gnus-del-mark . -15)) - "*Alist of marks and scores." - :group 'gnus-score-adapt - :type '(repeat (cons (character :tag "Mark") - (integer :tag "Score")))) - -(defcustom gnus-adaptive-word-minimum nil - "If a number, this is the minimum score value that can be assigned to a word." - :group 'gnus-score-adapt - :type '(choice (const nil) integer)) - -(defcustom gnus-adaptive-word-no-group-words nil - "If t, don't adaptively score words included in the group name." - :group 'gnus-score-adapt - :type 'boolean) - -(defcustom gnus-score-mimic-keymap nil - "*Have the score entry functions pretend that they are a keymap." - :group 'gnus-score-default - :type 'boolean) - -(defcustom gnus-score-exact-adapt-limit 10 - "*Number that says how long a match has to be before using substring matching. -When doing adaptive scoring, one normally uses fuzzy or substring -matching. However, if the header one matches is short, the possibility -for false positives is great, so if the length of the match is less -than this variable, exact matching will be used. - -If this variable is nil, exact matching will always be used." - :group 'gnus-score-adapt - :type '(choice (const nil) integer)) - -(defcustom gnus-score-uncacheable-files "ADAPT$" - "All score files that match this regexp will not be cached." - :group 'gnus-score-adapt - :group 'gnus-score-files - :type 'regexp) - -(defcustom gnus-score-default-header nil - "Default header when entering new scores. - -Should be one of the following symbols. - - a: from - s: subject - b: body - h: head - i: message-id - t: references - x: xref - e: `extra' (non-standard overview) - l: lines - d: date - f: followup - -If nil, the user will be asked for a header." - :group 'gnus-score-default - :type '(choice (const :tag "from" a) - (const :tag "subject" s) - (const :tag "body" b) - (const :tag "head" h) - (const :tag "message-id" i) - (const :tag "references" t) - (const :tag "xref" x) - (const :tag "extra" e) - (const :tag "lines" l) - (const :tag "date" d) - (const :tag "followup" f) - (const :tag "ask" nil))) - -(defcustom gnus-score-default-type nil - "Default match type when entering new scores. - -Should be one of the following symbols. - - s: substring - e: exact string - f: fuzzy string - r: regexp string - b: before date - a: after date - n: this date - <: less than number - >: greater than number - =: equal to number - -If nil, the user will be asked for a match type." - :group 'gnus-score-default - :type '(choice (const :tag "substring" s) - (const :tag "exact string" e) - (const :tag "fuzzy string" f) - (const :tag "regexp string" r) - (const :tag "before date" b) - (const :tag "after date" a) - (const :tag "this date" n) - (const :tag "less than number" <) - (const :tag "greater than number" >) - (const :tag "equal than number" =) - (const :tag "ask" nil))) - -(defcustom gnus-score-default-fold nil - "Use case folding for new score file entries iff not nil." - :group 'gnus-score-default - :type 'boolean) - -(defcustom gnus-score-default-duration nil - "Default duration of effect when entering new scores. - -Should be one of the following symbols. - - t: temporary - p: permanent - i: immediate - -If nil, the user will be asked for a duration." - :group 'gnus-score-default - :type '(choice (const :tag "temporary" t) - (const :tag "permanent" p) - (const :tag "immediate" i) - (const :tag "ask" nil))) - -(defcustom gnus-score-after-write-file-function nil - "Function called with the name of the score file just written to disk." - :group 'gnus-score-files - :type '(choice (const nil) function)) - -(defcustom gnus-score-thread-simplify nil - "If non-nil, subjects will simplified as in threading." - :group 'gnus-score-various - :type 'boolean) - - - -;; Internal variables. - -(defvar gnus-score-use-all-scores t - "If nil, only `gnus-score-find-score-files-function' is used.") - -(defvar gnus-adaptive-word-syntax-table - (let ((table (copy-syntax-table (standard-syntax-table))) - (numbers '(?0 ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9))) - (while numbers - (modify-syntax-entry (pop numbers) " " table)) - (modify-syntax-entry ?' "w" table) - table) - "Syntax table used when doing adaptive word scoring.") - -(defvar gnus-scores-exclude-files nil) -(defvar gnus-internal-global-score-files nil) -(defvar gnus-score-file-list nil) - -(defvar gnus-short-name-score-file-cache nil) - -(defvar gnus-score-help-winconf nil) -(defvar gnus-adaptive-score-alist gnus-default-adaptive-score-alist) -(defvar gnus-adaptive-word-score-alist gnus-default-adaptive-word-score-alist) -(defvar gnus-score-trace nil) -(defvar gnus-score-edit-buffer nil) - -(defvar gnus-score-alist nil - "Alist containing score information. -The keys can be symbols or strings. The following symbols are defined. - -touched: If this alist has been modified. -mark: Automatically mark articles below this. -expunge: Automatically expunge articles below this. -files: List of other score files to load when loading this one. -eval: Sexp to be evaluated when the score file is loaded. - -String entries have the form (HEADER (MATCH TYPE SCORE DATE) ...) -where HEADER is the header being scored, MATCH is the string we are -looking for, TYPE is a flag indicating whether it should use regexp or -substring matching, SCORE is the score to add and DATE is the date -of the last successful match.") - -(defvar gnus-score-cache nil) -(defvar gnus-scores-articles nil) -(defvar gnus-score-index nil) - - -(defconst gnus-header-index - ;; Name to index alist. - `(("number" - ,(luna-class-slot-index (luna-find-class 'mime-gnus-entity) - 'location) - gnus-score-integer) - ("subject" - ,(luna-class-slot-index (luna-find-class 'mime-gnus-entity) - 'subject) - gnus-score-string) - ("from" - ,(luna-class-slot-index (luna-find-class 'mime-gnus-entity) - 'from) - gnus-score-string) - ("date" - ,(luna-class-slot-index (luna-find-class 'mime-gnus-entity) - 'date) - gnus-score-date) - ("message-id" - ,(luna-class-slot-index (luna-find-class 'mime-gnus-entity) - 'id) - gnus-score-string) - ("references" - ,(luna-class-slot-index (luna-find-class 'mime-gnus-entity) - 'references) - gnus-score-string) - ("chars" - ,(luna-class-slot-index (luna-find-class 'mime-gnus-entity) - 'chars) - gnus-score-integer) - ("lines" - ,(luna-class-slot-index (luna-find-class 'mime-gnus-entity) - 'lines) - gnus-score-integer) - ("xref" - ,(luna-class-slot-index (luna-find-class 'mime-gnus-entity) - 'xref) - gnus-score-string) -;; ("extra" 16 gnus-score-string) - ("extra" -1 gnus-score-body) - ("head" -1 gnus-score-body) - ("body" -1 gnus-score-body) - ("all" -1 gnus-score-body) - ("followup" - ,(luna-class-slot-index (luna-find-class 'mime-gnus-entity) - 'from) - gnus-score-followup) - ("thread" - ,(luna-class-slot-index (luna-find-class 'mime-gnus-entity) - 'references) - gnus-score-thread))) - -;;; Summary mode score maps. - -(gnus-define-keys (gnus-summary-score-map "V" gnus-summary-mode-map) - "s" gnus-summary-set-score - "S" gnus-summary-current-score - "c" gnus-score-change-score-file - "C" gnus-score-customize - "m" gnus-score-set-mark-below - "x" gnus-score-set-expunge-below - "R" gnus-summary-rescore - "e" gnus-score-edit-current-scores - "f" gnus-score-edit-file - "F" gnus-score-flush-cache - "t" gnus-score-find-trace - "w" gnus-score-find-favourite-words) - -;; Summary score file commands - -;; Much modification of the kill (ahem, score) code and lots of the -;; functions are written by Per Abrahamsen . - -(defun gnus-summary-lower-score (&optional score symp) - "Make a score entry based on the current article. -The user will be prompted for header to score on, match type, -permanence, and the string to be used. The numerical prefix will be -used as score." - (interactive (gnus-interactive "P\ny")) - (gnus-summary-increase-score (- (gnus-score-delta-default score)) symp)) - -(defun gnus-score-kill-help-buffer () - (when (get-buffer "*Score Help*") - (kill-buffer "*Score Help*") - (when gnus-score-help-winconf - (set-window-configuration gnus-score-help-winconf)))) - -(defun gnus-summary-increase-score (&optional score symp) - "Make a score entry based on the current article. -The user will be prompted for header to score on, match type, -permanence, and the string to be used. The numerical prefix will be -used as score." - (interactive (gnus-interactive "P\ny")) - (let* ((nscore (gnus-score-delta-default score)) - (prefix (if (< nscore 0) ?L ?I)) - (increase (> nscore 0)) - (char-to-header - '((?a "from" nil nil string) - (?s "subject" nil nil string) - (?b "body" "" nil body-string) - (?h "head" "" nil body-string) - (?i "message-id" nil nil string) - (?r "references" "message-id" nil string) - (?x "xref" nil nil string) - (?e "extra" nil nil string) - (?l "lines" nil nil number) - (?d "date" nil nil date) - (?f "followup" nil nil string) - (?t "thread" "message-id" nil string))) - (char-to-type - '((?s s "substring" string) - (?e e "exact string" string) - (?f f "fuzzy string" string) - (?r r "regexp string" string) - (?z s "substring" body-string) - (?p r "regexp string" body-string) - (?b before "before date" date) - (?a after "after date" date) - (?n at "this date" date) - (?< < "less than number" number) - (?> > "greater than number" number) - (?= = "equal to number" number))) - (current-score-file gnus-current-score-file) - (char-to-perm - (list (list ?t (current-time-string) "temporary") - '(?p perm "permanent") '(?i now "immediate"))) - (mimic gnus-score-mimic-keymap) - (hchar (and gnus-score-default-header - (aref (symbol-name gnus-score-default-header) 0))) - (tchar (and gnus-score-default-type - (aref (symbol-name gnus-score-default-type) 0))) - (pchar (and gnus-score-default-duration - (aref (symbol-name gnus-score-default-duration) 0))) - entry temporary type match extra) - - (unwind-protect - (progn - - ;; First we read the header to score. - (while (not hchar) - (if mimic - (progn - (sit-for 1) - (message "%c-" prefix)) - (message "%s header (%s?): " (if increase "Increase" "Lower") - (mapconcat (lambda (s) (char-to-string (car s))) - char-to-header ""))) - (setq hchar (read-char)) - (when (or (= hchar ??) (= hchar ?\C-h)) - (setq hchar nil) - (gnus-score-insert-help "Match on header" char-to-header 1))) - - (gnus-score-kill-help-buffer) - (unless (setq entry (assq (downcase hchar) char-to-header)) - (if mimic (error "%c %c" prefix hchar) - (error "Invalid header type"))) - - (when (/= (downcase hchar) hchar) - ;; This was a majuscule, so we end reading and set the defaults. - (if mimic (message "%c %c" prefix hchar) (message "")) - (setq tchar (or tchar ?s) - pchar (or pchar ?t))) - - (let ((legal-types - (delq nil - (mapcar (lambda (s) - (if (eq (nth 4 entry) - (nth 3 s)) - s nil)) - char-to-type)))) - ;; We continue reading - the type. - (while (not tchar) - (if mimic - (progn - (sit-for 1) (message "%c %c-" prefix hchar)) - (message "%s header '%s' with match type (%s?): " - (if increase "Increase" "Lower") - (nth 1 entry) - (mapconcat (lambda (s) (char-to-string (car s))) - legal-types ""))) - (setq tchar (read-char)) - (when (or (= tchar ??) (= tchar ?\C-h)) - (setq tchar nil) - (gnus-score-insert-help "Match type" legal-types 2))) - - (gnus-score-kill-help-buffer) - (unless (setq type (nth 1 (assq (downcase tchar) legal-types))) - (if mimic (error "%c %c" prefix hchar) - (error "Invalid match type")))) - - (when (/= (downcase tchar) tchar) - ;; It was a majuscule, so we end reading and use the default. - (if mimic (message "%c %c %c" prefix hchar tchar) - (message "")) - (setq pchar (or pchar ?t))) - - ;; We continue reading. - (while (not pchar) - (if mimic - (progn - (sit-for 1) (message "%c %c %c-" prefix hchar tchar)) - (message "%s permanence (%s?): " (if increase "Increase" "Lower") - (mapconcat (lambda (s) (char-to-string (car s))) - char-to-perm ""))) - (setq pchar (read-char)) - (when (or (= pchar ??) (= pchar ?\C-h)) - (setq pchar nil) - (gnus-score-insert-help "Match permanence" char-to-perm 2))) - - (gnus-score-kill-help-buffer) - (if mimic (message "%c %c %c" prefix hchar tchar pchar) - (message "")) - (unless (setq temporary (cadr (assq pchar char-to-perm))) - ;; Deal with der(r)ided superannuated paradigms. - (when (and (eq (1+ prefix) 77) - (eq (+ hchar 12) 109) - (eq (1- tchar) 113) - (eq (- pchar 4) 111)) - (error "You rang?")) - (if mimic - (error "%c %c %c %c" prefix hchar tchar pchar) - (error "Invalid match duration")))) - ;; Always kill the score help buffer. - (gnus-score-kill-help-buffer)) - - ;; If scoring an extra (non-standard overview) header, - ;; we must find out which header is in question. - (setq extra - (and gnus-extra-headers - (equal (nth 1 entry) "extra") - (intern ; need symbol - (gnus-completing-read - (symbol-name (car gnus-extra-headers)) ; default response - "Score extra header:" ; prompt - (mapcar (lambda (x) ; completion list - (cons (symbol-name x) x)) - gnus-extra-headers) - nil ; no completion limit - t)))) ; require match - ;; extra is now nil or a symbol. - - ;; We have all the data, so we enter this score. - (setq match (if (string= (nth 2 entry) "") "" - (gnus-summary-header (or (nth 2 entry) (nth 1 entry)) - nil extra))) - - ;; Modify the match, perhaps. - (cond - ((equal (nth 1 entry) "xref") - (when (string-match "^Xref: *" match) - (setq match (substring match (match-end 0)))) - (when (string-match "^[^:]* +" match) - (setq match (substring match (match-end 0)))))) - - (when (memq type '(r R regexp Regexp)) - (setq match (regexp-quote match))) - - ;; Change score file to the "all.SCORE" file. - (when (eq symp 'a) - (save-excursion - (set-buffer gnus-summary-buffer) - (gnus-score-load-file - ;; This is a kludge; yes... - (cond - ((eq gnus-score-find-score-files-function - 'gnus-score-find-hierarchical) - (gnus-score-file-name "")) - ((eq gnus-score-find-score-files-function 'gnus-score-find-single) - current-score-file) - (t - (gnus-score-file-name "all")))))) - - (gnus-summary-score-entry - (nth 1 entry) ; Header - match ; Match - type ; Type - (if (eq score 's) nil score) ; Score - (if (eq temporary 'perm) ; Temp - nil - temporary) - (not (nth 3 entry)) ; Prompt - nil ; not silent - extra) ; non-standard overview. - - (when (eq symp 'a) - ;; We change the score file back to the previous one. - (save-excursion - (set-buffer gnus-summary-buffer) - (gnus-score-load-file current-score-file))))) - -(defun gnus-score-insert-help (string alist idx) - (setq gnus-score-help-winconf (current-window-configuration)) - (save-excursion - (set-buffer (gnus-get-buffer-create "*Score Help*")) - (buffer-disable-undo) - (delete-windows-on (current-buffer)) - (erase-buffer) - (insert string ":\n\n") - (let ((max -1) - (list alist) - (i 0) - n width pad format) - ;; find the longest string to display - (while list - (setq n (length (nth idx (car list)))) - (unless (> max n) - (setq max n)) - (setq list (cdr list))) - (setq max (+ max 4)) ; %c, `:', SPACE, a SPACE at end - (setq n (/ (1- (window-width)) max)) ; items per line - (setq width (/ (1- (window-width)) n)) ; width of each item - ;; insert `n' items, each in a field of width `width' - (while alist - (if (< i n) - () - (setq i 0) - (delete-char -1) ; the `\n' takes a char - (insert "\n")) - (setq pad (- width 3)) - (setq format (concat "%c: %-" (int-to-string pad) "s")) - (insert (format format (caar alist) (nth idx (car alist)))) - (setq alist (cdr alist)) - (setq i (1+ i)))) - ;; display ourselves in a small window at the bottom - (gnus-appt-select-lowest-window) - (split-window) - (pop-to-buffer "*Score Help*") - (let ((window-min-height 1)) - (shrink-window-if-larger-than-buffer)) - (select-window (get-buffer-window gnus-summary-buffer t)))) - -(defun gnus-summary-header (header &optional no-err extra) - ;; Return HEADER for current articles, or error. - (let ((article (gnus-summary-article-number)) - headers) - (if article - (if (and (setq headers (gnus-summary-article-header article)) - (vectorp headers)) - (if extra ; `header' must be "extra" - (or (cdr (assq extra (mail-header-extra headers))) "") - (aref headers (nth 1 (assoc header gnus-header-index)))) - (if no-err - nil - (error "Pseudo-articles can't be scored"))) - (if no-err - (error "No article on current line") - nil)))) - -(defun gnus-newsgroup-score-alist () - (or - (let ((param-file (gnus-group-find-parameter - gnus-newsgroup-name 'score-file))) - (when param-file - (gnus-score-load param-file))) - (gnus-score-load - (gnus-score-file-name gnus-newsgroup-name))) - gnus-score-alist) - -(defsubst gnus-score-get (symbol &optional alist) - ;; Get SYMBOL's definition in ALIST. - (cdr (assoc symbol - (or alist - gnus-score-alist - (gnus-newsgroup-score-alist))))) - -(defun gnus-summary-score-entry (header match type score date - &optional prompt silent extra) - "Enter score file entry. -HEADER is the header being scored. -MATCH is the string we are looking for. -TYPE is the match type: substring, regexp, exact, fuzzy. -SCORE is the score to add. -DATE is the expire date, or nil for no expire, or 'now for immediate expire. -If optional argument `PROMPT' is non-nil, allow user to edit match. -If optional argument `SILENT' is nil, show effect of score entry. -If optional argument `EXTRA' is non-nil, it's a non-standard overview header." - ;; Regexp is the default type. - (when (eq type t) - (setq type 'r)) - ;; Simplify matches... - (cond ((or (eq type 'r) (eq type 's) (eq type nil)) - (setq match (if match (gnus-simplify-subject-re match) ""))) - ((eq type 'f) - (setq match (gnus-simplify-subject-fuzzy match)))) - (let ((score (gnus-score-delta-default score)) - (header (downcase header)) - new) - (set-text-properties 0 (length header) nil header) - (when prompt - (setq match (read-string - (format "Match %s on %s, %s: " - (cond ((eq date 'now) - "now") - ((stringp date) - "temp") - (t "permanent")) - header - (if (< score 0) "lower" "raise")) - (if (numberp match) - (int-to-string match) - match)))) - - ;; If this is an integer comparison, we transform from string to int. - (if (eq (nth 2 (assoc header gnus-header-index)) 'gnus-score-integer) - (if (stringp match) - (setq match (string-to-int match))) - (set-text-properties 0 (length match) nil match)) - - (unless (eq date 'now) - ;; Add the score entry to the score file. - (when (= score gnus-score-interactive-default-score) - (setq score nil)) - (let ((old (gnus-score-get header)) - elem) - (setq new - (cond - (extra - (list match score - (and date (if (numberp date) date - (date-to-day date))) - type (symbol-name extra))) - (type - (list match score - (and date (if (numberp date) date - (date-to-day date))) - type)) - (date (list match score (date-to-day date))) - (score (list match score)) - (t (list match)))) - ;; We see whether we can collapse some score entries. - ;; This isn't quite correct, because there may be more elements - ;; later on with the same key that have matching elems... Hm. - (if (and old - (setq elem (assoc match old)) - (eq (nth 3 elem) (nth 3 new)) - (or (and (numberp (nth 2 elem)) (numberp (nth 2 new))) - (and (not (nth 2 elem)) (not (nth 2 new))))) - ;; Yup, we just add this new score to the old elem. - (setcar (cdr elem) (+ (or (nth 1 elem) - gnus-score-interactive-default-score) - (or (nth 1 new) - gnus-score-interactive-default-score))) - ;; Nope, we have to add a new elem. - (gnus-score-set header (if old (cons new old) (list new)) nil t)) - (gnus-score-set 'touched '(t)))) - - ;; Score the current buffer. - (unless silent - (if (and (>= (nth 1 (assoc header gnus-header-index)) 0) - (eq (nth 2 (assoc header gnus-header-index)) - 'gnus-score-string)) - (gnus-summary-score-effect header match type score extra) - (gnus-summary-rescore))) - - ;; Return the new scoring rule. - new)) - -(defun gnus-summary-score-effect (header match type score extra) - "Simulate the effect of a score file entry. -HEADER is the header being scored. -MATCH is the string we are looking for. -TYPE is the score type. -SCORE is the score to add. -EXTRA is the possible non-standard header." - (interactive (list (completing-read "Header: " - gnus-header-index - (lambda (x) (fboundp (nth 2 x))) - t) - (read-string "Match: ") - (y-or-n-p "Use regexp match? ") - (prefix-numeric-value current-prefix-arg))) - (save-excursion - (unless (and (stringp match) (> (length match) 0)) - (error "No match")) - (goto-char (point-min)) - (let ((regexp (cond ((eq type 'f) - (gnus-simplify-subject-fuzzy match)) - ((eq type 'r) - match) - ((eq type 'e) - (concat "\\`" (regexp-quote match) "\\'")) - (t - (regexp-quote match))))) - (while (not (eobp)) - (let ((content (gnus-summary-header header 'noerr extra)) - (case-fold-search t)) - (and content - (when (if (eq type 'f) - (string-equal (gnus-simplify-subject-fuzzy content) - regexp) - (string-match regexp content)) - (gnus-summary-raise-score score)))) - (beginning-of-line 2)))) - (gnus-set-mode-line 'summary)) - -(defun gnus-summary-score-crossposting (score date) - ;; Enter score file entry for current crossposting. - ;; SCORE is the score to add. - ;; DATE is the expire date. - (let ((xref (gnus-summary-header "xref")) - (start 0) - group) - (unless xref - (error "This article is not crossposted")) - (while (string-match " \\([^ \t]+\\):" xref start) - (setq start (match-end 0)) - (when (not (string= - (setq group - (substring xref (match-beginning 1) (match-end 1))) - gnus-newsgroup-name)) - (gnus-summary-score-entry - "xref" (concat " " group ":") nil score date t))))) - - -;;; -;;; Gnus Score Files -;;; - -;; All score code written by Per Abrahamsen . - -;; Added by Per Abrahamsen . -(defun gnus-score-set-mark-below (score) - "Automatically mark articles with score below SCORE as read." - (interactive - (list (or (and current-prefix-arg (prefix-numeric-value current-prefix-arg)) - (string-to-int (read-string "Mark below: "))))) - (setq score (or score gnus-summary-default-score 0)) - (gnus-score-set 'mark (list score)) - (gnus-score-set 'touched '(t)) - (setq gnus-summary-mark-below score) - (gnus-score-update-lines)) - -(defun gnus-score-update-lines () - "Update all lines in the summary buffer." - (save-excursion - (goto-char (point-min)) - (while (not (eobp)) - (gnus-summary-update-line) - (forward-line 1)))) - -(defun gnus-score-update-all-lines () - "Update all lines in the summary buffer, even the hidden ones." - (save-excursion - (goto-char (point-min)) - (let (hidden) - (while (not (eobp)) - (when (gnus-summary-show-thread) - (push (point) hidden)) - (gnus-summary-update-line) - (forward-line 1)) - ;; Re-hide the hidden threads. - (while hidden - (goto-char (pop hidden)) - (gnus-summary-hide-thread))))) - -(defun gnus-score-set-expunge-below (score) - "Automatically expunge articles with score below SCORE." - (interactive - (list (or (and current-prefix-arg (prefix-numeric-value current-prefix-arg)) - (string-to-int (read-string "Set expunge below: "))))) - (setq score (or score gnus-summary-default-score 0)) - (gnus-score-set 'expunge (list score)) - (gnus-score-set 'touched '(t))) - -(defun gnus-score-followup-article (&optional score) - "Add SCORE to all followups to the article in the current buffer." - (interactive "P") - (setq score (gnus-score-delta-default score)) - (when (gnus-buffer-live-p gnus-summary-buffer) - (save-excursion - (save-restriction - (message-narrow-to-headers) - (let ((id (mail-fetch-field "message-id"))) - (when id - (set-buffer gnus-summary-buffer) - (gnus-summary-score-entry - "references" (concat id "[ \t]*$") 'r - score (current-time-string) nil t))))))) - -(defun gnus-score-followup-thread (&optional score) - "Add SCORE to all later articles in the thread the current buffer is part of." - (interactive "P") - (setq score (gnus-score-delta-default score)) - (when (gnus-buffer-live-p gnus-summary-buffer) - (save-excursion - (save-restriction - (goto-char (point-min)) - (let ((id (mail-fetch-field "message-id"))) - (when id - (set-buffer gnus-summary-buffer) - (gnus-summary-score-entry - "references" id 's - score (current-time-string)))))))) - -(defun gnus-score-set (symbol value &optional alist warn) - ;; Set SYMBOL to VALUE in ALIST. - (let* ((alist - (or alist - gnus-score-alist - (gnus-newsgroup-score-alist))) - (entry (assoc symbol alist))) - (cond ((gnus-score-get 'read-only alist) - ;; This is a read-only score file, so we do nothing. - (when warn - (gnus-message 4 "Note: read-only score file; entry discarded"))) - (entry - (setcdr entry value)) - ((null alist) - (error "Empty alist")) - (t - (setcdr alist - (cons (cons symbol value) (cdr alist))))))) - -(defun gnus-summary-raise-score (n) - "Raise the score of the current article by N." - (interactive "p") - (gnus-summary-set-score (+ (gnus-summary-article-score) - (or n gnus-score-interactive-default-score )))) - -(defun gnus-summary-set-score (n) - "Set the score of the current article to N." - (interactive "p") - (save-excursion - (gnus-summary-show-thread) - (let ((buffer-read-only nil)) - ;; Set score. - (gnus-summary-update-mark - (if (= n (or gnus-summary-default-score 0)) ? ;Whitespace - (if (< n (or gnus-summary-default-score 0)) - gnus-score-below-mark gnus-score-over-mark)) - 'score)) - (let* ((article (gnus-summary-article-number)) - (score (assq article gnus-newsgroup-scored))) - (if score (setcdr score n) - (push (cons article n) gnus-newsgroup-scored))) - (gnus-summary-update-line))) - -(defun gnus-summary-current-score () - "Return the score of the current article." - (interactive) - (gnus-message 1 "%s" (gnus-summary-article-score))) - -(defun gnus-score-change-score-file (file) - "Change current score alist." - (interactive - (list (read-file-name "Change to score file: " gnus-kill-files-directory))) - (gnus-score-load-file file) - (gnus-set-mode-line 'summary)) - -(defvar gnus-score-edit-exit-function) -(defun gnus-score-edit-current-scores (file) - "Edit the current score alist." - (interactive (list gnus-current-score-file)) - (if (not gnus-current-score-file) - (error "No current score file") - (let ((winconf (current-window-configuration))) - (when (buffer-name gnus-summary-buffer) - (gnus-score-save)) - (gnus-make-directory (file-name-directory file)) - (setq gnus-score-edit-buffer (find-file-noselect file)) - (gnus-configure-windows 'edit-score) - (gnus-score-mode) - (setq gnus-score-edit-exit-function 'gnus-score-edit-done) - (make-local-variable 'gnus-prev-winconf) - (setq gnus-prev-winconf winconf)) - (gnus-message - 4 (substitute-command-keys - "\\\\[gnus-score-edit-exit] to save edits")))) - -(defun gnus-score-edit-file (file) - "Edit a score file." - (interactive - (list (read-file-name "Edit score file: " gnus-kill-files-directory))) - (gnus-make-directory (file-name-directory file)) - (when (buffer-name gnus-summary-buffer) - (gnus-score-save)) - (let ((winconf (current-window-configuration))) - (setq gnus-score-edit-buffer (find-file-noselect file)) - (gnus-configure-windows 'edit-score) - (gnus-score-mode) - (setq gnus-score-edit-exit-function 'gnus-score-edit-done) - (make-local-variable 'gnus-prev-winconf) - (setq gnus-prev-winconf winconf)) - (gnus-message - 4 (substitute-command-keys - "\\\\[gnus-score-edit-exit] to save edits"))) - -(defun gnus-score-load-file (file) - ;; Load score file FILE. Returns a list a retrieved score-alists. - (let* ((file (expand-file-name - (or (and (string-match - (concat "^" (regexp-quote - (expand-file-name - gnus-kill-files-directory))) - (expand-file-name file)) - file) - (expand-file-name file gnus-kill-files-directory)))) - (cached (assoc file gnus-score-cache)) - (global (member file gnus-internal-global-score-files)) - lists alist) - (if cached - ;; The score file was already loaded. - (setq alist (cdr cached)) - ;; We load the score file. - (setq gnus-score-alist nil) - (setq alist (gnus-score-load-score-alist file)) - ;; We add '(touched) to the alist to signify that it hasn't been - ;; touched (yet). - (unless (assq 'touched alist) - (push (list 'touched nil) alist)) - ;; If it is a global score file, we make it read-only. - (and global - (not (assq 'read-only alist)) - (push (list 'read-only t) alist)) - (push (cons file alist) gnus-score-cache)) - (let ((a alist) - found) - (while a - ;; Downcase all header names. - (cond - ((stringp (caar a)) - (setcar (car a) (downcase (caar a))) - (setq found t)) - ;; Advanced scoring. - ((consp (caar a)) - (setq found t))) - (pop a)) - ;; If there are actual scores in the alist, we add it to the - ;; return value of this function. - (when found - (setq lists (list alist)))) - ;; Treat the other possible atoms in the score alist. - (let ((mark (car (gnus-score-get 'mark alist))) - (expunge (car (gnus-score-get 'expunge alist))) - (mark-and-expunge (car (gnus-score-get 'mark-and-expunge alist))) - (files (gnus-score-get 'files alist)) - (exclude-files (gnus-score-get 'exclude-files alist)) - (orphan (car (gnus-score-get 'orphan alist))) - (adapt (gnus-score-get 'adapt alist)) - (thread-mark-and-expunge - (car (gnus-score-get 'thread-mark-and-expunge alist))) - (adapt-file (car (gnus-score-get 'adapt-file alist))) - (local (gnus-score-get 'local alist)) - (decay (car (gnus-score-get 'decay alist))) - (eval (car (gnus-score-get 'eval alist)))) - ;; Perform possible decays. - (when (and gnus-decay-scores - (or cached (file-exists-p file)) - (or (not decay) - (gnus-decay-scores alist decay))) - (gnus-score-set 'touched '(t) alist) - (gnus-score-set 'decay (list (time-to-days (current-time))) alist)) - ;; We do not respect eval and files atoms from global score - ;; files. - (when (and files (not global)) - (setq lists (apply 'append lists - (mapcar (lambda (file) - (gnus-score-load-file file)) - (if adapt-file (cons adapt-file files) - files))))) - (when (and eval (not global)) - (eval eval)) - ;; We then expand any exclude-file directives. - (setq gnus-scores-exclude-files - (nconc - (apply - 'nconc - (mapcar - (lambda (sfile) - (list - (expand-file-name sfile (file-name-directory file)) - (expand-file-name sfile gnus-kill-files-directory))) - exclude-files)) - gnus-scores-exclude-files)) - (when local - (save-excursion - (set-buffer gnus-summary-buffer) - (while local - (and (consp (car local)) - (symbolp (caar local)) - (progn - (make-local-variable (caar local)) - (set (caar local) (nth 1 (car local))))) - (setq local (cdr local))))) - (when orphan - (setq gnus-orphan-score orphan)) - (setq gnus-adaptive-score-alist - (cond ((equal adapt '(t)) - (setq gnus-newsgroup-adaptive t) - gnus-default-adaptive-score-alist) - ((equal adapt '(ignore)) - (setq gnus-newsgroup-adaptive nil)) - ((consp adapt) - (setq gnus-newsgroup-adaptive t) - adapt) - (t - ;;(setq gnus-newsgroup-adaptive gnus-use-adaptive-scoring) - gnus-default-adaptive-score-alist))) - (setq gnus-thread-expunge-below - (or thread-mark-and-expunge gnus-thread-expunge-below)) - (setq gnus-summary-mark-below - (or mark mark-and-expunge gnus-summary-mark-below)) - (setq gnus-summary-expunge-below - (or expunge mark-and-expunge gnus-summary-expunge-below)) - (setq gnus-newsgroup-adaptive-score-file - (or adapt-file gnus-newsgroup-adaptive-score-file))) - (setq gnus-current-score-file file) - (setq gnus-score-alist alist) - lists)) - -(defun gnus-score-load (file) - ;; Load score FILE. - (let ((cache (assoc file gnus-score-cache))) - (if cache - (setq gnus-score-alist (cdr cache)) - (setq gnus-score-alist nil) - (gnus-score-load-score-alist file) - (unless gnus-score-alist - (setq gnus-score-alist (copy-alist '((touched nil))))) - (push (cons file gnus-score-alist) gnus-score-cache)))) - -(defun gnus-score-remove-from-cache (file) - (setq gnus-score-cache - (delq (assoc file gnus-score-cache) gnus-score-cache))) - -(defun gnus-score-load-score-alist (file) - "Read score FILE." - (let (alist) - (if (not (file-readable-p file)) - ;; Couldn't read file. - (setq gnus-score-alist nil) - ;; Read file. - (with-temp-buffer - (insert-file-contents-as-coding-system - score-mode-coding-system file) - (goto-char (point-min)) - ;; Only do the loading if the score file isn't empty. - (when (save-excursion (re-search-forward "[()0-9a-zA-Z]" nil t)) - (setq alist - (condition-case () - (read (current-buffer)) - (error - (gnus-error 3.2 "Problem with score file %s" file)))))) - (cond - ((and alist - (atom alist)) - ;; Bogus score file. - (error "Invalid syntax with score file %s" file)) - ((eq (car alist) 'setq) - ;; This is an old-style score file. - (setq gnus-score-alist (gnus-score-transform-old-to-new alist))) - (t - (setq gnus-score-alist alist))) - ;; Check the syntax of the score file. - (setq gnus-score-alist - (gnus-score-check-syntax gnus-score-alist file))))) - -(defun gnus-score-check-syntax (alist file) - "Check the syntax of the score ALIST." - (cond - ((null alist) - nil) - ((not (consp alist)) - (gnus-message 1 "Score file is not a list: %s" file) - (ding) - nil) - (t - (let ((a alist) - sr err s type) - (while (and a (not err)) - (setq - err - (cond - ((not (listp (car a))) - (format "Invalid score element %s in %s" (car a) file)) - ((stringp (caar a)) - (cond - ((not (listp (setq sr (cdar a)))) - (format "Invalid header match %s in %s" (nth 1 (car a)) file)) - (t - (setq type (caar a)) - (while (and sr (not err)) - (setq s (pop sr)) - (setq - err - (cond - ((if (member (downcase type) '("lines" "chars")) - (not (numberp (car s))) - (not (stringp (car s)))) - (format "Invalid match %s in %s" (car s) file)) - ((and (cadr s) (not (integerp (cadr s)))) - (format "Non-integer score %s in %s" (cadr s) file)) - ((and (caddr s) (not (integerp (caddr s)))) - (format "Non-integer date %s in %s" (caddr s) file)) - ((and (cadddr s) (not (symbolp (cadddr s)))) - (format "Non-symbol match type %s in %s" (cadddr s) file))))) - err))))) - (setq a (cdr a))) - (if err - (progn - (ding) - (gnus-message 3 err) - (sit-for 2) - nil) - alist))))) - -(defun gnus-score-transform-old-to-new (alist) - (let* ((alist (nth 2 alist)) - out entry) - (when (eq (car alist) 'quote) - (setq alist (nth 1 alist))) - (while alist - (setq entry (car alist)) - (if (stringp (car entry)) - (let ((scor (cdr entry))) - (push entry out) - (while scor - (setcar scor - (list (caar scor) (nth 2 (car scor)) - (and (nth 3 (car scor)) - (date-to-day (nth 3 (car scor)))) - (if (nth 1 (car scor)) 'r 's))) - (setq scor (cdr scor)))) - (push (if (not (listp (cdr entry))) - (list (car entry) (cdr entry)) - entry) - out)) - (setq alist (cdr alist))) - (cons (list 'touched t) (nreverse out)))) - -(defun gnus-score-save () - ;; Save all score information. - (let ((cache gnus-score-cache) - entry score file) - (save-excursion - (setq gnus-score-alist nil) - (nnheader-set-temp-buffer " *Gnus Scores*") - (while cache - (current-buffer) - (setq entry (pop cache) - file (nnheader-translate-file-chars (car entry) t) - score (cdr entry)) - (if (or (not (equal (gnus-score-get 'touched score) '(t))) - (gnus-score-get 'read-only score) - (and (file-exists-p file) - (not (file-writable-p file)))) - () - (setq score (setcdr entry (gnus-delete-alist 'touched score))) - (erase-buffer) - (let (emacs-lisp-mode-hook) - (if (string-match - (concat (regexp-quote gnus-adaptive-file-suffix) "$") - file) - ;; This is an adaptive score file, so we do not run - ;; it through `pp'. These files can get huge, and - ;; are not meant to be edited by human hands. - (gnus-prin1 score) - ;; This is a normal score file, so we print it very - ;; prettily. - (let ((lisp-mode-syntax-table score-mode-syntax-table)) - (pp score (current-buffer))))) - (gnus-make-directory (file-name-directory file)) - ;; If the score file is empty, we delete it. - (if (zerop (buffer-size)) - (delete-file file) - ;; There are scores, so we write the file. - (when (file-writable-p file) - (gnus-write-buffer-as-coding-system - score-mode-coding-system file) - (when gnus-score-after-write-file-function - (funcall gnus-score-after-write-file-function file))))) - (and gnus-score-uncacheable-files - (string-match gnus-score-uncacheable-files file) - (gnus-score-remove-from-cache file))) - (kill-buffer (current-buffer))))) - -(defun gnus-score-load-files (score-files) - "Load all score files in SCORE-FILES." - ;; Load the score files. - (let (scores) - (while score-files - (if (stringp (car score-files)) - ;; It is a string, which means that it's a score file name, - ;; so we load the score file and add the score alist to - ;; the list of alists. - (setq scores (nconc (gnus-score-load-file (car score-files)) scores)) - ;; It is an alist, so we just add it to the list directly. - (setq scores (nconc (car score-files) scores))) - (setq score-files (cdr score-files))) - ;; Prune the score files that are to be excluded, if any. - (when gnus-scores-exclude-files - (let ((s scores) - c) - (while s - (and (setq c (rassq (car s) gnus-score-cache)) - (member (car c) gnus-scores-exclude-files) - (setq scores (delq (car s) scores))) - (setq s (cdr s))))) - scores)) - -(defun gnus-score-headers (score-files &optional trace) - ;; Score `gnus-newsgroup-headers'. - (let (scores news) - ;; PLM: probably this is not the best place to clear orphan-score - (setq gnus-orphan-score nil - gnus-scores-articles nil - gnus-scores-exclude-files nil - scores (gnus-score-load-files score-files)) - (setq news scores) - ;; Do the scoring. - (while news - (setq scores news - news nil) - (when (and gnus-summary-default-score - scores) - (let* ((entries gnus-header-index) - (now (date-to-day (current-time-string))) - (expire (and gnus-score-expiry-days - (- now gnus-score-expiry-days))) - (headers gnus-newsgroup-headers) - (current-score-file gnus-current-score-file) - entry header new) - (gnus-message 7 "Scoring...") - ;; Create articles, an alist of the form `(HEADER . SCORE)'. - (while (setq header (pop headers)) - ;; WARNING: The assq makes the function O(N*S) while it could - ;; be written as O(N+S), where N is (length gnus-newsgroup-headers) - ;; and S is (length gnus-newsgroup-scored). - (unless (assq (mail-header-number header) gnus-newsgroup-scored) - (setq gnus-scores-articles ;Total of 2 * N cons-cells used. - (cons (cons header (or gnus-summary-default-score 0)) - gnus-scores-articles)))) - - (save-excursion - (set-buffer (gnus-get-buffer-create "*Headers*")) - (buffer-disable-undo) - (when (gnus-buffer-live-p gnus-summary-buffer) - (message-clone-locals gnus-summary-buffer)) - - ;; Set the global variant of this variable. - (setq gnus-current-score-file current-score-file) - ;; score orphans - (when gnus-orphan-score - (setq gnus-score-index - (nth 1 (assoc "references" gnus-header-index))) - (gnus-score-orphans gnus-orphan-score)) - ;; Run each header through the score process. - (while entries - (setq entry (pop entries) - header (nth 0 entry) - gnus-score-index (nth 1 (assoc header gnus-header-index))) - (when (< 0 (apply 'max (mapcar - (lambda (score) - (length (gnus-score-get header score))) - scores))) - ;; Call the scoring function for this type of "header". - (when (setq new (funcall (nth 2 entry) scores header - now expire trace)) - (push new news)))) - (when (gnus-buffer-live-p gnus-summary-buffer) - (let ((scored gnus-newsgroup-scored)) - (with-current-buffer gnus-summary-buffer - (setq gnus-newsgroup-scored scored)))) - ;; Remove the buffer. - (kill-buffer (current-buffer))) - - ;; Add articles to `gnus-newsgroup-scored'. - (while gnus-scores-articles - (when (or (/= gnus-summary-default-score - (cdar gnus-scores-articles)) - gnus-save-score) - (push (cons (mail-header-number (caar gnus-scores-articles)) - (cdar gnus-scores-articles)) - gnus-newsgroup-scored)) - (setq gnus-scores-articles (cdr gnus-scores-articles))) - - (let (score) - (while (setq score (pop scores)) - (while score - (when (consp (caar score)) - (gnus-score-advanced (car score) trace)) - (pop score)))) - - (gnus-message 7 "Scoring...done")))))) - -(defun gnus-score-lower-thread (thread score-adjust) - "Lower the score on THREAD with SCORE-ADJUST. -THREAD is expected to contain a list of the form `(PARENT [CHILD1 -CHILD2 ...])' where PARENT is a header array and each CHILD is a list -of the same form as THREAD. The empty list `nil' is valid. For each -article in the tree, the score of the corresponding entry in -GNUS-NEWSGROUP-SCORED is adjusted by SCORE-ADJUST." - (while thread - (let ((head (car thread))) - (if (listp head) - ;; handle a child and its descendants - (gnus-score-lower-thread head score-adjust) - ;; handle the parent - (let* ((article (mail-header-number head)) - (score (assq article gnus-newsgroup-scored))) - (if score (setcdr score (+ (cdr score) score-adjust)) - (push (cons article score-adjust) gnus-newsgroup-scored))))) - (setq thread (cdr thread)))) - -(defun gnus-score-orphans (score) - "Score orphans. -A root is an article with no references. An orphan is an article -which has references, but is not connected via its references to a -root article. This function finds all the orphans, and adjusts their -score in GNUS-NEWSGROUP-SCORED by SCORE." - ;; gnus-make-threads produces a list, where each entry is a "thread" - ;; as described in the gnus-score-lower-thread docs. This function - ;; will be called again (after limiting has been done) if the display - ;; is threaded. It would be nice to somehow save this info and use - ;; it later. - (dolist (thread (gnus-make-threads)) - (let ((id (aref (car thread) gnus-score-index))) - ;; If the parent of the thread is not a root, lower the score of - ;; it and its descendants. Note that some roots seem to satisfy - ;; (eq id nil) and some (eq id ""); not sure why. - (when (and id - (not (string= id ""))) - (gnus-score-lower-thread thread score))))) - -(defun gnus-score-integer (scores header now expire &optional trace) - (let ((gnus-score-index (nth 1 (assoc header gnus-header-index))) - entries alist) - ;; Find matches. - (while scores - (setq alist (car scores) - scores (cdr scores) - entries (assoc header alist)) - (while (cdr entries) ;First entry is the header index. - (let* ((rest (cdr entries)) - (kill (car rest)) - (match (nth 0 kill)) - (type (or (nth 3 kill) '>)) - (score (or (nth 1 kill) gnus-score-interactive-default-score)) - (date (nth 2 kill)) - (found nil) - (match-func (if (or (eq type '>) (eq type '<) (eq type '<=) - (eq type '>=) (eq type '=)) - type - (error "Invalid match type: %s" type))) - (articles gnus-scores-articles)) - ;; Instead of doing all the clever stuff that - ;; `gnus-score-string' does to minimize searches and stuff, - ;; I will assume that people generally will put so few - ;; matches on numbers that any cleverness will take more - ;; time than one would gain. - (while articles - (when (funcall match-func - (or (aref (caar articles) gnus-score-index) 0) - match) - (when trace - (push (cons (car-safe (rassq alist gnus-score-cache)) kill) - gnus-score-trace)) - (setq found t) - (setcdr (car articles) (+ score (cdar articles)))) - (setq articles (cdr articles))) - ;; Update expire date - (cond ((null date)) ;Permanent entry. - ((and found gnus-update-score-entry-dates) ;Match, update date. - (gnus-score-set 'touched '(t) alist) - (setcar (nthcdr 2 kill) now)) - ((and expire (< date expire)) ;Old entry, remove. - (gnus-score-set 'touched '(t) alist) - (setcdr entries (cdr rest)) - (setq rest entries))) - (setq entries rest))))) - nil) - -(defun gnus-score-date (scores header now expire &optional trace) - (let ((gnus-score-index (nth 1 (assoc header gnus-header-index))) - entries alist match match-func article) - ;; Find matches. - (while scores - (setq alist (car scores) - scores (cdr scores) - entries (assoc header alist)) - (while (cdr entries) ;First entry is the header index. - (let* ((rest (cdr entries)) - (kill (car rest)) - (type (or (nth 3 kill) 'before)) - (score (or (nth 1 kill) gnus-score-interactive-default-score)) - (date (nth 2 kill)) - (found nil) - (articles gnus-scores-articles) - l) - (cond - ((eq type 'after) - (setq match-func 'string< - match (gnus-date-iso8601 (nth 0 kill)))) - ((eq type 'before) - (setq match-func 'gnus-string> - match (gnus-date-iso8601 (nth 0 kill)))) - ((eq type 'at) - (setq match-func 'string= - match (gnus-date-iso8601 (nth 0 kill)))) - ((eq type 'regexp) - (setq match-func 'string-match - match (nth 0 kill))) - (t (error "Invalid match type: %s" type))) - ;; Instead of doing all the clever stuff that - ;; `gnus-score-string' does to minimize searches and stuff, - ;; I will assume that people generally will put so few - ;; matches on numbers that any cleverness will take more - ;; time than one would gain. - (while (setq article (pop articles)) - (when (and - (setq l (aref (car article) gnus-score-index)) - (funcall match-func match (gnus-date-iso8601 l))) - (when trace - (push (cons (car-safe (rassq alist gnus-score-cache)) kill) - gnus-score-trace)) - (setq found t) - (setcdr article (+ score (cdr article))))) - ;; Update expire date - (cond ((null date)) ;Permanent entry. - ((and found gnus-update-score-entry-dates) ;Match, update date. - (gnus-score-set 'touched '(t) alist) - (setcar (nthcdr 2 kill) now)) - ((and expire (< date expire)) ;Old entry, remove. - (gnus-score-set 'touched '(t) alist) - (setcdr entries (cdr rest)) - (setq rest entries))) - (setq entries rest))))) - nil) - -(defun gnus-score-body (scores header now expire &optional trace) - (if gnus-agent-fetching - nil - (save-excursion - (setq gnus-scores-articles - (sort gnus-scores-articles - (lambda (a1 a2) - (< (mail-header-number (car a1)) - (mail-header-number (car a2)))))) - (set-buffer nntp-server-buffer) - (save-restriction - (let* ((buffer-read-only nil) - (articles gnus-scores-articles) - (all-scores scores) - (request-func (cond ((string= "head" header) - 'gnus-request-head) - ((string= "body" header) - 'gnus-request-body) - (t 'gnus-request-article))) - entries alist ofunc article last) - (when articles - (setq last (mail-header-number (caar (last articles)))) - ;; Not all backends support partial fetching. In that case, - ;; we just fetch the entire article. - (unless (gnus-check-backend-function - (and (string-match "^gnus-" (symbol-name request-func)) - (intern (substring (symbol-name request-func) - (match-end 0)))) - gnus-newsgroup-name) - (setq ofunc request-func) - (setq request-func 'gnus-request-article)) - (while articles - (setq article (mail-header-number (caar articles))) - (gnus-message 7 "Scoring article %s of %s..." article last) - (widen) - (when (funcall request-func article gnus-newsgroup-name) - (goto-char (point-min)) - ;; If just parts of the article is to be searched, but the - ;; backend didn't support partial fetching, we just narrow - ;; to the relevant parts. - (when ofunc - (if (eq ofunc 'gnus-request-head) - (narrow-to-region - (point) - (or (search-forward "\n\n" nil t) (point-max))) - (narrow-to-region - (or (search-forward "\n\n" nil t) (point)) - (point-max)))) - (setq scores all-scores) - ;; Find matches. - (while scores - (setq alist (pop scores) - entries (assoc header alist)) - (while (cdr entries) ;First entry is the header index. - (let* ((rest (cdr entries)) - (kill (car rest)) - (match (nth 0 kill)) - (type (or (nth 3 kill) 's)) - (score (or (nth 1 kill) - gnus-score-interactive-default-score)) - (date (nth 2 kill)) - (found nil) - (case-fold-search - (not (or (eq type 'R) (eq type 'S) - (eq type 'Regexp) (eq type 'String)))) - (search-func - (cond ((or (eq type 'r) (eq type 'R) - (eq type 'regexp) (eq type 'Regexp)) - 're-search-forward) - ((or (eq type 's) (eq type 'S) - (eq type 'string) (eq type 'String)) - 'search-forward) - (t - (error "Invalid match type: %s" type))))) - (goto-char (point-min)) - (when (funcall search-func match nil t) - ;; Found a match, update scores. - (setcdr (car articles) (+ score (cdar articles))) - (setq found t) - (when trace - (push - (cons (car-safe (rassq alist gnus-score-cache)) kill) - gnus-score-trace))) - ;; Update expire date - (unless trace - (cond - ((null date)) ;Permanent entry. - ((and found gnus-update-score-entry-dates) - ;; Match, update date. - (gnus-score-set 'touched '(t) alist) - (setcar (nthcdr 2 kill) now)) - ((and expire (< date expire)) ;Old entry, remove. - (gnus-score-set 'touched '(t) alist) - (setcdr entries (cdr rest)) - (setq rest entries)))) - (setq entries rest))))) - (setq articles (cdr articles))))))) - nil)) - -(defun gnus-score-thread (scores header now expire &optional trace) - (gnus-score-followup scores header now expire trace t)) - -(defun gnus-score-followup (scores header now expire &optional trace thread) - (if gnus-agent-fetching - ;; FIXME: It seems doable in fetching mode. - nil - ;; Insert the unique article headers in the buffer. - (let ((gnus-score-index (nth 1 (assoc header gnus-header-index))) - (current-score-file gnus-current-score-file) - (all-scores scores) - ;; gnus-score-index is used as a free variable. - alike last this art entries alist articles - new news) - - ;; Change score file to the adaptive score file. All entries that - ;; this function makes will be put into this file. - (save-excursion - (set-buffer gnus-summary-buffer) - (gnus-score-load-file - (or gnus-newsgroup-adaptive-score-file - (gnus-score-file-name - gnus-newsgroup-name gnus-adaptive-file-suffix)))) - - (setq gnus-scores-articles (sort gnus-scores-articles - 'gnus-score-string<) - articles gnus-scores-articles) - - (erase-buffer) - (while articles - (setq art (car articles) - this (aref (car art) gnus-score-index) - articles (cdr articles)) - (if (equal last this) - (push art alike) - (when last - (insert last ?\n) - (put-text-property (1- (point)) (point) 'articles alike)) - (setq alike (list art) - last this))) - (when last ; Bwadr, duplicate code. - (insert last ?\n) - (put-text-property (1- (point)) (point) 'articles alike)) - - ;; Find matches. - (while scores - (setq alist (car scores) - scores (cdr scores) - entries (assoc header alist)) - (while (cdr entries) ;First entry is the header index. - (let* ((rest (cdr entries)) - (kill (car rest)) - (match (nth 0 kill)) - (type (or (nth 3 kill) 's)) - (score (or (nth 1 kill) gnus-score-interactive-default-score)) - (date (nth 2 kill)) - (found nil) - (mt (aref (symbol-name type) 0)) - (case-fold-search - (not (or (= mt ?R) (= mt ?S) (= mt ?E) (= mt ?F)))) - (dmt (downcase mt)) - (search-func - (cond ((= dmt ?r) 're-search-forward) - ((or (= dmt ?e) (= dmt ?s) (= dmt ?f)) 'search-forward) - (t (error "Invalid match type: %s" type)))) - arts art) - (goto-char (point-min)) - (if (= dmt ?e) - (while (funcall search-func match nil t) - (and (= (progn (beginning-of-line) (point)) - (match-beginning 0)) - (= (progn (end-of-line) (point)) - (match-end 0)) - (progn - (setq found (setq arts (get-text-property - (point) 'articles))) - ;; Found a match, update scores. - (while arts - (setq art (car arts) - arts (cdr arts)) - (gnus-score-add-followups - (car art) score all-scores thread)))) - (end-of-line)) - (while (funcall search-func match nil t) - (end-of-line) - (setq found (setq arts (get-text-property (point) 'articles))) - ;; Found a match, update scores. - (while (setq art (pop arts)) - (when (setq new (gnus-score-add-followups - (car art) score all-scores thread)) - (push new news))))) - ;; Update expire date - (cond ((null date)) ;Permanent entry. - ((and found gnus-update-score-entry-dates) - ;Match, update date. - (gnus-score-set 'touched '(t) alist) - (setcar (nthcdr 2 kill) now)) - ((and expire (< date expire)) ;Old entry, remove. - (gnus-score-set 'touched '(t) alist) - (setcdr entries (cdr rest)) - (setq rest entries))) - (setq entries rest)))) - ;; We change the score file back to the previous one. - (save-excursion - (set-buffer gnus-summary-buffer) - (gnus-score-load-file current-score-file)) - (list (cons "references" news))))) - -(defun gnus-score-add-followups (header score scores &optional thread) - "Add a score entry to the adapt file." - (save-excursion - (set-buffer gnus-summary-buffer) - (let* ((id (mail-header-id header)) - (scores (car scores)) - entry dont) - ;; Don't enter a score if there already is one. - (while (setq entry (pop scores)) - (and (equal "references" (car entry)) - (or (null (nth 3 (cadr entry))) - (eq 's (nth 3 (cadr entry)))) - (assoc id entry) - (setq dont t))) - (unless dont - (gnus-summary-score-entry - (if thread "thread" "references") - id 's score (current-time-string) nil t))))) - -(defun gnus-score-string (score-list header now expire &optional trace) - ;; Score ARTICLES according to HEADER in SCORE-LIST. - ;; Update matching entries to NOW and remove unmatched entries older - ;; than EXPIRE. - - ;; Insert the unique article headers in the buffer. - (let ((gnus-score-index (nth 1 (assoc header gnus-header-index))) - ;; gnus-score-index is used as a free variable. - (simplify (and gnus-score-thread-simplify - (string= "subject" header))) - alike last this art entries alist articles - fuzzies arts words kill) - - ;; Sorting the articles costs os O(N*log N) but will allow us to - ;; only match with each unique header. Thus the actual matching - ;; will be O(M*U) where M is the number of strings to match with, - ;; and U is the number of unique headers. It is assumed (but - ;; untested) this will be a net win because of the large constant - ;; factor involved with string matching. - (setq gnus-scores-articles - ;; We cannot string-sort the extra headers list. *sigh* - (if (= gnus-score-index 9) - gnus-scores-articles - (sort gnus-scores-articles 'gnus-score-string<)) - articles gnus-scores-articles) - - (erase-buffer) - (while (setq art (pop articles)) - (setq this (aref (car art) gnus-score-index)) - - ;; If we're working with non-standard headers, we are stuck - ;; with working on them as a group. What a hassle. - ;; Just wait 'til you see what horrors we commit against `match'... - (if (= gnus-score-index 9) - (setq this (prin1-to-string this))) ; ick. - - (if simplify - (setq this (gnus-map-function gnus-simplify-subject-functions this))) - (if (equal last this) - ;; O(N*H) cons-cells used here, where H is the number of - ;; headers. - (push art alike) - (when last - ;; Insert the line, with a text property on the - ;; terminating newline referring to the articles with - ;; this line. - (insert last ?\n) - (put-text-property (1- (point)) (point) 'articles alike)) - (setq alike (list art) - last this))) - (when last ; Bwadr, duplicate code. - (insert last ?\n) - (put-text-property (1- (point)) (point) 'articles alike)) - - ;; Go through all the score alists and pick out the entries - ;; for this header. - (while score-list - (setq alist (pop score-list) - ;; There's only one instance of this header for - ;; each score alist. - entries (assoc header alist)) - (while (cdr entries) ;First entry is the header index. - (let* ((kill (cadr entries)) - (type (or (nth 3 kill) 's)) - (score (or (nth 1 kill) gnus-score-interactive-default-score)) - (date (nth 2 kill)) - (extra (nth 4 kill)) ; non-standard header; string. - (found nil) - (mt (aref (symbol-name type) 0)) - (case-fold-search (not (memq mt '(?R ?S ?E ?F)))) - (dmt (downcase mt)) - ;; Assume user already simplified regexp and fuzzies - (match (if (and simplify (not (memq dmt '(?f ?r)))) - (gnus-map-function - gnus-simplify-subject-functions - (nth 0 kill)) - (nth 0 kill))) - (search-func - (cond ((= dmt ?r) 're-search-forward) - ((or (= dmt ?e) (= dmt ?s) (= dmt ?f)) 'search-forward) - ((= dmt ?w) nil) - (t (error "Invalid match type: %s" type))))) - - ;; Evil hackery to make match usable in non-standard headers. - (when extra - (setq match (concat "[ (](" extra " \\. \"[^)]*" - match "[^\"]*\")[ )]") - search-func 're-search-forward)) ; XXX danger?!? - - (cond - ;; Fuzzy matches. We save these for later. - ((= dmt ?f) - (push (cons entries alist) fuzzies) - (setq entries (cdr entries))) - ;; Word matches. Save these for even later. - ((= dmt ?w) - (push (cons entries alist) words) - (setq entries (cdr entries))) - ;; Exact matches. - ((= dmt ?e) - ;; Do exact matching. - (goto-char (point-min)) - (while (and (not (eobp)) - (funcall search-func match nil t)) - ;; Is it really exact? - (and (eolp) - (= (gnus-point-at-bol) (match-beginning 0)) - ;; Yup. - (progn - (setq found (setq arts (get-text-property - (point) 'articles))) - ;; Found a match, update scores. - (if trace - (while (setq art (pop arts)) - (setcdr art (+ score (cdr art))) - (push - (cons - (car-safe (rassq alist gnus-score-cache)) - kill) - gnus-score-trace)) - (while (setq art (pop arts)) - (setcdr art (+ score (cdr art))))))) - (forward-line 1)) - ;; Update expiry date - (if trace - (setq entries (cdr entries)) - (cond - ;; Permanent entry. - ((null date) - (setq entries (cdr entries))) - ;; We have a match, so we update the date. - ((and found gnus-update-score-entry-dates) - (gnus-score-set 'touched '(t) alist) - (setcar (nthcdr 2 kill) now) - (setq entries (cdr entries))) - ;; This entry has expired, so we remove it. - ((and expire (< date expire)) - (gnus-score-set 'touched '(t) alist) - (setcdr entries (cddr entries))) - ;; No match; go to next entry. - (t - (setq entries (cdr entries)))))) - ;; Regexp and substring matching. - (t - (goto-char (point-min)) - (when (string= match "") - (setq match "\n")) - (while (and (not (eobp)) - (funcall search-func match nil t)) - (goto-char (match-beginning 0)) - (end-of-line) - (setq found (setq arts (get-text-property (point) 'articles))) - ;; Found a match, update scores. - (if trace - (while (setq art (pop arts)) - (setcdr art (+ score (cdr art))) - (push (cons (car-safe (rassq alist gnus-score-cache)) kill) - gnus-score-trace)) - (while (setq art (pop arts)) - (setcdr art (+ score (cdr art))))) - (forward-line 1)) - ;; Update expiry date - (if trace - (setq entries (cdr entries)) - (cond - ;; Permanent entry. - ((null date) - (setq entries (cdr entries))) - ;; We have a match, so we update the date. - ((and found gnus-update-score-entry-dates) - (gnus-score-set 'touched '(t) alist) - (setcar (nthcdr 2 kill) now) - (setq entries (cdr entries))) - ;; This entry has expired, so we remove it. - ((and expire (< date expire)) - (gnus-score-set 'touched '(t) alist) - (setcdr entries (cddr entries))) - ;; No match; go to next entry. - (t - (setq entries (cdr entries)))))))))) - - ;; Find fuzzy matches. - (when fuzzies - ;; Simplify the entire buffer for easy matching. - (gnus-simplify-buffer-fuzzy) - (while (setq kill (cadaar fuzzies)) - (let* ((match (nth 0 kill)) - (type (nth 3 kill)) - (score (or (nth 1 kill) gnus-score-interactive-default-score)) - (date (nth 2 kill)) - (mt (aref (symbol-name type) 0)) - (case-fold-search (not (= mt ?F))) - found) - (goto-char (point-min)) - (while (and (not (eobp)) - (search-forward match nil t)) - (when (and (= (gnus-point-at-bol) (match-beginning 0)) - (eolp)) - (setq found (setq arts (get-text-property (point) 'articles))) - (if trace - (while (setq art (pop arts)) - (setcdr art (+ score (cdr art))) - (push (cons - (car-safe (rassq (cdar fuzzies) gnus-score-cache)) - kill) - gnus-score-trace)) - ;; Found a match, update scores. - (while (setq art (pop arts)) - (setcdr art (+ score (cdr art)))))) - (forward-line 1)) - ;; Update expiry date - (if (not trace) - (cond - ;; Permanent. - ((null date) - ;; Do nothing. - ) - ;; Match, update date. - ((and found gnus-update-score-entry-dates) - (gnus-score-set 'touched '(t) (cdar fuzzies)) - (setcar (nthcdr 2 kill) now)) - ;; Old entry, remove. - ((and expire (< date expire)) - (gnus-score-set 'touched '(t) (cdar fuzzies)) - (setcdr (caar fuzzies) (cddaar fuzzies))))) - (setq fuzzies (cdr fuzzies))))) - - (when words - ;; Enter all words into the hashtb. - (let ((hashtb (gnus-make-hashtable - (* 10 (count-lines (point-min) (point-max)))))) - (gnus-enter-score-words-into-hashtb hashtb) - (while (setq kill (cadaar words)) - (let* ((score (or (nth 1 kill) gnus-score-interactive-default-score)) - (date (nth 2 kill)) - found) - (when (setq arts (intern-soft (nth 0 kill) hashtb)) - (setq arts (symbol-value arts)) - (setq found t) - (if trace - (while (setq art (pop arts)) - (setcdr art (+ score (cdr art))) - (push (cons - (car-safe (rassq (cdar words) gnus-score-cache)) - kill) - gnus-score-trace)) - ;; Found a match, update scores. - (while (setq art (pop arts)) - (setcdr art (+ score (cdr art)))))) - ;; Update expiry date - (if (not trace) - (cond - ;; Permanent. - ((null date) - ;; Do nothing. - ) - ;; Match, update date. - ((and found gnus-update-score-entry-dates) - (gnus-score-set 'touched '(t) (cdar words)) - (setcar (nthcdr 2 kill) now)) - ;; Old entry, remove. - ((and expire (< date expire)) - (gnus-score-set 'touched '(t) (cdar words)) - (setcdr (caar words) (cddaar words))))) - (setq words (cdr words)))))) - nil)) - -(defun gnus-enter-score-words-into-hashtb (hashtb) - ;; Find all the words in the buffer and enter them into - ;; the hashtable. - (let ((syntab (syntax-table)) - word val) - (goto-char (point-min)) - (unwind-protect - (progn - (set-syntax-table gnus-adaptive-word-syntax-table) - (while (re-search-forward "\\b\\w+\\b" nil t) - (setq val - (gnus-gethash - (setq word (downcase (buffer-substring - (match-beginning 0) (match-end 0)))) - hashtb)) - (gnus-sethash - word - (append (get-text-property (gnus-point-at-eol) 'articles) val) - hashtb))) - (set-syntax-table syntab)) - ;; Make all the ignorable words ignored. - (let ((ignored (append gnus-ignored-adaptive-words - (if gnus-adaptive-word-no-group-words - (message-tokenize-header - (gnus-group-real-name gnus-newsgroup-name) - ".")) - gnus-default-ignored-adaptive-words))) - (while ignored - (gnus-sethash (pop ignored) nil hashtb))))) - -(defun gnus-score-string< (a1 a2) - ;; Compare headers in articles A2 and A2. - ;; The header index used is the free variable `gnus-score-index'. - (string-lessp (aref (car a1) gnus-score-index) - (aref (car a2) gnus-score-index))) - -(defun gnus-current-score-file-nondirectory (&optional score-file) - (let ((score-file (or score-file gnus-current-score-file))) - (if score-file - (gnus-short-group-name (file-name-nondirectory score-file)) - "none"))) - -(defun gnus-score-adaptive () - "Create adaptive score rules for this newsgroup." - (when gnus-newsgroup-adaptive - ;; We change the score file to the adaptive score file. - (save-excursion - (set-buffer gnus-summary-buffer) - (gnus-score-load-file - (or gnus-newsgroup-adaptive-score-file - (gnus-home-score-file gnus-newsgroup-name t) - (gnus-score-file-name - gnus-newsgroup-name gnus-adaptive-file-suffix)))) - ;; Perform ordinary line scoring. - (when (or (not (listp gnus-newsgroup-adaptive)) - (memq 'line gnus-newsgroup-adaptive)) - (save-excursion - (let* ((malist (gnus-copy-sequence gnus-adaptive-score-alist)) - (alist malist) - (date (current-time-string)) - (data gnus-newsgroup-data) - elem headers match func) - ;; First we transform the adaptive rule alist into something - ;; that's faster to process. - (while malist - (setq elem (car malist)) - (when (symbolp (car elem)) - (setcar elem (symbol-value (car elem)))) - (setq elem (cdr elem)) - (while elem - (when (fboundp - (setq func - (intern - (concat "mail-header-" - (if (eq (caar elem) 'followup) - "message-id" - (downcase (symbol-name (caar elem)))))))) - (setcdr (car elem) - (cons (if (eq (caar elem) 'followup) - "references" - (symbol-name (caar elem))) - (cdar elem))) - (setcar (car elem) - `(lambda (h) - (,func h)))) - (setq elem (cdr elem))) - (setq malist (cdr malist))) - ;; Then we score away. - (while data - (setq elem (cdr (assq (gnus-data-mark (car data)) alist))) - (if (or (not elem) - (gnus-data-pseudo-p (car data))) - () - (when (setq headers (gnus-data-header (car data))) - (while elem - (setq match (funcall (caar elem) headers)) - (gnus-summary-score-entry - (nth 1 (car elem)) match - (cond - ((numberp match) - '=) - ((equal (nth 1 (car elem)) "date") - 'a) - (t - ;; Whether we use substring or exact matches is - ;; controlled here. - (if (or (not gnus-score-exact-adapt-limit) - (< (length match) gnus-score-exact-adapt-limit)) - 'e - (if (equal (nth 1 (car elem)) "subject") - 'f 's)))) - (nth 2 (car elem)) date nil t) - (setq elem (cdr elem))))) - (setq data (cdr data)))))) - - ;; Perform adaptive word scoring. - (when (and (listp gnus-newsgroup-adaptive) - (memq 'word gnus-newsgroup-adaptive)) - (with-temp-buffer - (let* ((hashtb (gnus-make-hashtable 1000)) - (date (date-to-day (current-time-string))) - (data gnus-newsgroup-data) - (syntab (syntax-table)) - word d score val) - (unwind-protect - (progn - (set-syntax-table gnus-adaptive-word-syntax-table) - ;; Go through all articles. - (while (setq d (pop data)) - (when (and - (not (gnus-data-pseudo-p d)) - (setq score - (cdr (assq - (gnus-data-mark d) - gnus-adaptive-word-score-alist)))) - ;; This article has a mark that should lead to - ;; adaptive word rules, so we insert the subject - ;; and find all words in that string. - (insert (mail-header-subject (gnus-data-header d))) - (downcase-region (point-min) (point-max)) - (goto-char (point-min)) - (while (re-search-forward "\\b\\w+\\b" nil t) - ;; Put the word and score into the hashtb. - (setq val (gnus-gethash (setq word (match-string 0)) - hashtb)) - (when (or (not gnus-adaptive-word-length-limit) - (> (length word) - gnus-adaptive-word-length-limit)) - (setq val (+ score (or val 0))) - (if (and gnus-adaptive-word-minimum - (< val gnus-adaptive-word-minimum)) - (setq val gnus-adaptive-word-minimum)) - (gnus-sethash word val hashtb))) - (erase-buffer)))) - (set-syntax-table syntab)) - ;; Make all the ignorable words ignored. - (let ((ignored (append gnus-ignored-adaptive-words - (if gnus-adaptive-word-no-group-words - (message-tokenize-header - (gnus-group-real-name - gnus-newsgroup-name) - ".")) - gnus-default-ignored-adaptive-words))) - (while ignored - (gnus-sethash (pop ignored) nil hashtb))) - ;; Now we have all the words and scores, so we - ;; add these rules to the ADAPT file. - (set-buffer gnus-summary-buffer) - (mapatoms - (lambda (word) - (when (symbol-value word) - (gnus-summary-score-entry - "subject" (symbol-name word) 'w (symbol-value word) - date nil t))) - hashtb)))))) - -(defun gnus-score-edit-done () - (let ((bufnam (buffer-file-name (current-buffer))) - (winconf gnus-prev-winconf)) - (when winconf - (set-window-configuration winconf)) - (gnus-score-remove-from-cache bufnam) - (gnus-score-load-file bufnam))) - -(defun gnus-score-find-trace () - "Find all score rules that applies to the current article." - (interactive) - (let ((old-scored gnus-newsgroup-scored)) - (let ((gnus-newsgroup-headers - (list (gnus-summary-article-header))) - (gnus-newsgroup-scored nil) - trace) - (save-excursion - (nnheader-set-temp-buffer "*Score Trace*")) - (setq gnus-score-trace nil) - (gnus-possibly-score-headers 'trace) - (if (not (setq trace gnus-score-trace)) - (gnus-error - 1 "No score rules apply to the current article (default score %d)." - gnus-summary-default-score) - (set-buffer "*Score Trace*") - (setq truncate-lines t) - (while trace - (insert (format "%S -> %s\n" (cdar trace) - (or (caar trace) "(non-file rule)"))) - (setq trace (cdr trace))) - (goto-char (point-min)) - (gnus-configure-windows 'score-trace))) - (set-buffer gnus-summary-buffer) - (setq gnus-newsgroup-scored old-scored))) - -(defun gnus-score-find-favourite-words () - "List words used in scoring." - (interactive) - (let ((alists (gnus-score-load-files (gnus-all-score-files))) - alist rule rules kill) - ;; Go through all the score alists for this group - ;; and find all `w' rules. - (while (setq alist (pop alists)) - (while (setq rule (pop alist)) - (when (and (stringp (car rule)) - (equal "subject" (downcase (pop rule)))) - (while (setq kill (pop rule)) - (when (memq (nth 3 kill) '(w W word Word)) - (push (cons (or (nth 1 kill) - gnus-score-interactive-default-score) - (car kill)) - rules)))))) - (setq rules (sort rules (lambda (r1 r2) - (string-lessp (cdr r1) (cdr r2))))) - ;; Add up words that have appeared several times. - (let ((r rules)) - (while (cdr r) - (if (equal (cdar r) (cdadr r)) - (progn - (setcar (car r) (+ (caar r) (caadr r))) - (setcdr r (cddr r))) - (pop r)))) - ;; Insert the words. - (nnheader-set-temp-buffer "*Score Words*") - (if (not (setq rules (sort rules (lambda (r1 r2) (> (car r1) (car r2)))))) - (gnus-error 3 "No word score rules") - (while rules - (insert (format "%-5d: %s\n" (caar rules) (cdar rules))) - (pop rules)) - (goto-char (point-min)) - (gnus-configure-windows 'score-words)))) - -(defun gnus-summary-rescore () - "Redo the entire scoring process in the current summary." - (interactive) - (gnus-score-save) - (setq gnus-score-cache nil) - (setq gnus-newsgroup-scored nil) - (gnus-possibly-score-headers) - (gnus-score-update-all-lines)) - -(defun gnus-score-flush-cache () - "Flush the cache of score files." - (interactive) - (gnus-score-save) - (setq gnus-score-cache nil - gnus-score-alist nil - gnus-short-name-score-file-cache nil) - (gnus-message 6 "The score cache is now flushed")) - -(gnus-add-shutdown 'gnus-score-close 'gnus) - -(defvar gnus-score-file-alist-cache nil) - -(defun gnus-score-close () - "Clear all internal score variables." - (setq gnus-score-cache nil - gnus-internal-global-score-files nil - gnus-score-file-list nil - gnus-score-file-alist-cache nil)) - -;; Summary score marking commands. - -(defun gnus-summary-raise-same-subject-and-select (score) - "Raise articles which has the same subject with SCORE and select the next." - (interactive "p") - (let ((subject (gnus-summary-article-subject))) - (gnus-summary-raise-score score) - (while (gnus-summary-find-subject subject) - (gnus-summary-raise-score score)) - (gnus-summary-next-article t))) - -(defun gnus-summary-raise-same-subject (score) - "Raise articles which has the same subject with SCORE." - (interactive "p") - (let ((subject (gnus-summary-article-subject))) - (gnus-summary-raise-score score) - (while (gnus-summary-find-subject subject) - (gnus-summary-raise-score score)) - (gnus-summary-next-subject 1 t))) - -(defun gnus-score-delta-default (level) - (if level (prefix-numeric-value level) - gnus-score-interactive-default-score)) - -(defun gnus-summary-raise-thread (&optional score) - "Raise the score of the articles in the current thread with SCORE." - (interactive "P") - (setq score (gnus-score-delta-default score)) - (let (e) - (save-excursion - (let ((articles (gnus-summary-articles-in-thread))) - (while articles - (gnus-summary-goto-subject (car articles)) - (gnus-summary-raise-score score) - (setq articles (cdr articles)))) - (setq e (point))) - (let ((gnus-summary-check-current t)) - (unless (zerop (gnus-summary-next-subject 1 t)) - (goto-char e)))) - (gnus-summary-recenter) - (gnus-summary-position-point) - (gnus-set-mode-line 'summary)) - -(defun gnus-summary-lower-same-subject-and-select (score) - "Raise articles which has the same subject with SCORE and select the next." - (interactive "p") - (gnus-summary-raise-same-subject-and-select (- score))) - -(defun gnus-summary-lower-same-subject (score) - "Raise articles which has the same subject with SCORE." - (interactive "p") - (gnus-summary-raise-same-subject (- score))) - -(defun gnus-summary-lower-thread (&optional score) - "Lower score of articles in the current thread with SCORE." - (interactive "P") - (gnus-summary-raise-thread (- (gnus-score-delta-default score)))) - -;;; Finding score files. - -(defun gnus-score-score-files (group) - "Return a list of all possible score files." - ;; Search and set any global score files. - (when gnus-global-score-files - (unless gnus-internal-global-score-files - (gnus-score-search-global-directories gnus-global-score-files))) - ;; Fix the kill-file dir variable. - (setq gnus-kill-files-directory - (file-name-as-directory gnus-kill-files-directory)) - ;; If we can't read it, there are no score files. - (if (not (file-exists-p (expand-file-name gnus-kill-files-directory))) - (setq gnus-score-file-list nil) - (if (not (gnus-use-long-file-name 'not-score)) - ;; We do not use long file names, so we have to do some - ;; directory traversing. - (setq gnus-score-file-list - (cons nil - (or gnus-short-name-score-file-cache - (prog2 - (gnus-message 6 "Finding all score files...") - (setq gnus-short-name-score-file-cache - (gnus-score-score-files-1 - gnus-kill-files-directory)) - (gnus-message 6 "Finding all score files...done"))))) - ;; We want long file names. - (when (or (not gnus-score-file-list) - (not (car gnus-score-file-list)) - (gnus-file-newer-than gnus-kill-files-directory - (car gnus-score-file-list))) - (setq gnus-score-file-list - (cons (nth 5 (file-attributes gnus-kill-files-directory)) - (nreverse - (directory-files - gnus-kill-files-directory t - (gnus-score-file-regexp))))))) - (cdr gnus-score-file-list))) - -(defun gnus-score-score-files-1 (dir) - "Return all possible score files under DIR." - (let ((files (list (expand-file-name dir))) - (regexp (gnus-score-file-regexp)) - (case-fold-search nil) - seen out file) - (while (setq file (pop files)) - (cond - ;; Ignore files that start with a dot. - ((string-match "^\\." (file-name-nondirectory file)) - nil) - ;; Add subtrees of directory to also be searched. - ((and (file-directory-p file) - (not (member (file-truename file) seen))) - (push (file-truename file) seen) - (setq files (nconc (directory-files file t nil t) files))) - ;; Add files to the list of score files. - ((string-match regexp file) - (push file out)))) - (or out - ;; Return a dummy value. - (list (expand-file-name "this.file.does.not.exist.SCORE" - gnus-kill-files-directory))))) - -(defun gnus-score-file-regexp () - "Return a regexp that match all score files." - (concat "\\(" (regexp-quote gnus-score-file-suffix ) - "\\|" (regexp-quote gnus-adaptive-file-suffix) "\\)\\'")) - -(defun gnus-score-find-bnews (group) - "Return a list of score files for GROUP. -The score files are those files in the ~/News/ directory which matches -GROUP using BNews sys file syntax." - (let* ((sfiles (append (gnus-score-score-files group) - gnus-internal-global-score-files)) - (kill-dir (file-name-as-directory - (expand-file-name gnus-kill-files-directory))) - (klen (length kill-dir)) - (score-regexp (gnus-score-file-regexp)) - (trans (cdr (assq ?: nnheader-file-name-translation-alist))) - (group-trans (nnheader-translate-file-chars group t)) - ofiles not-match regexp) - (save-excursion - (set-buffer (gnus-get-buffer-create "*gnus score files*")) - (buffer-disable-undo) - ;; Go through all score file names and create regexp with them - ;; as the source. - (while sfiles - (erase-buffer) - (insert (car sfiles)) - (goto-char (point-min)) - ;; First remove the suffix itself. - (when (re-search-forward (concat "." score-regexp) nil t) - (replace-match "" t t) - (goto-char (point-min)) - (if (looking-at (regexp-quote kill-dir)) - ;; If the file name was just "SCORE", `klen' is one character - ;; too much. - (delete-char (min (1- (point-max)) klen)) - (goto-char (point-max)) - (if (search-backward (string directory-sep-char) nil t) - (delete-region (1+ (point)) (point-min)) - (gnus-message 1 "Can't find directory separator in %s" - (car sfiles)))) - ;; If short file names were used, we have to translate slashes. - (goto-char (point-min)) - (let ((regexp (concat - "[/:" (if trans (char-to-string trans)) "]"))) - (while (re-search-forward regexp nil t) - (replace-match "." t t))) - ;; Kludge to get rid of "nntp+" problems. - (goto-char (point-min)) - (when (looking-at "nn[a-z]+\\+") - (search-forward "+") - (forward-char -1) - (insert "\\") - (forward-char 1)) - ;; Kludge to deal with "++". - (while (search-forward "+" nil t) - (replace-match "\\+" t t)) - ;; Translate "all" to ".*". - (goto-char (point-min)) - (while (search-forward "all" nil t) - (replace-match ".*" t t)) - (goto-char (point-min)) - ;; Deal with "not."s. - (if (looking-at "not.") - (progn - (setq not-match t) - (setq regexp - (concat "^" (buffer-substring 5 (point-max)) "$"))) - (setq regexp (concat "^" (buffer-substring 1 (point-max)) "$")) - (setq not-match nil)) - ;; Finally - if this resulting regexp matches the group name, - ;; we add this score file to the list of score files - ;; applicable to this group. - (when (or (and not-match - (ignore-errors - (not (string-match regexp group-trans)))) - (and (not not-match) - (ignore-errors (string-match regexp group-trans)))) - (push (car sfiles) ofiles))) - (setq sfiles (cdr sfiles))) - (kill-buffer (current-buffer)) - ;; Slight kludge here - the last score file returned should be - ;; the local score file, whether it exists or not. This is so - ;; that any score commands the user enters will go to the right - ;; file, and not end up in some global score file. - (let ((localscore (gnus-score-file-name group))) - (setq ofiles (cons localscore (delete localscore ofiles)))) - (gnus-sort-score-files (nreverse ofiles))))) - -(defun gnus-score-find-single (group) - "Return list containing the score file for GROUP." - (list (or gnus-newsgroup-adaptive-score-file - (gnus-score-file-name group gnus-adaptive-file-suffix)) - (gnus-score-file-name group))) - -(defun gnus-score-find-hierarchical (group) - "Return list of score files for GROUP. -This includes the score file for the group and all its parents." - (let* ((prefix (gnus-group-real-prefix group)) - (all (list nil)) - (group (gnus-group-real-name group)) - (start 0)) - (while (string-match "\\." group (1+ start)) - (setq start (match-beginning 0)) - (push (substring group 0 start) all)) - (push group all) - (setq all - (nconc - (mapcar (lambda (group) - (gnus-score-file-name group gnus-adaptive-file-suffix)) - (setq all (nreverse all))) - (mapcar 'gnus-score-file-name all))) - (if (equal prefix "") - all - (mapcar - (lambda (file) - (nnheader-translate-file-chars - (concat (file-name-directory file) prefix - (file-name-nondirectory file)))) - all)))) - -(defun gnus-score-file-rank (file) - "Return a number that says how specific score FILE is. -Destroys the current buffer." - (if (member file gnus-internal-global-score-files) - 0 - (when (string-match - (concat "^" (regexp-quote - (expand-file-name - (file-name-as-directory gnus-kill-files-directory)))) - file) - (setq file (substring file (match-end 0)))) - (insert file) - (goto-char (point-min)) - (let ((beg (point)) - elems) - (while (re-search-forward "[./]" nil t) - (push (buffer-substring beg (1- (point))) - elems)) - (erase-buffer) - (setq elems (delete "all" elems)) - (length elems)))) - -(defun gnus-sort-score-files (files) - "Sort FILES so that the most general files come first." - (with-temp-buffer - (let ((alist - (mapcar - (lambda (file) - (cons (inline (gnus-score-file-rank file)) file)) - files))) - (mapcar - (lambda (f) (cdr f)) - (sort alist 'car-less-than-car))))) - -(defun gnus-score-find-alist (group) - "Return list of score files for GROUP. -The list is determined from the variable gnus-score-file-alist." - (let ((alist gnus-score-file-multiple-match-alist) - score-files) - ;; if this group has been seen before, return the cached entry - (if (setq score-files (assoc group gnus-score-file-alist-cache)) - (cdr score-files) ;ensures caching groups with no matches - ;; handle the multiple match alist - (while alist - (when (string-match (caar alist) group) - (setq score-files - (nconc score-files (copy-sequence (cdar alist))))) - (setq alist (cdr alist))) - (setq alist gnus-score-file-single-match-alist) - ;; handle the single match alist - (while alist - (when (string-match (caar alist) group) - ;; progn used just in case ("regexp") has no files - ;; and score-files is still nil. -sj - ;; this can be construed as a "stop searching here" feature :> - ;; and used to simplify regexps in the single-alist - (setq score-files - (nconc score-files (copy-sequence (cdar alist)))) - (setq alist nil)) - (setq alist (cdr alist))) - ;; cache the score files - (push (cons group score-files) gnus-score-file-alist-cache) - score-files))) - -(defun gnus-all-score-files (&optional group) - "Return a list of all score files for the current group." - (let ((funcs gnus-score-find-score-files-function) - (group (or group gnus-newsgroup-name)) - score-files) - (when group - ;; Make sure funcs is a list. - (and funcs - (not (listp funcs)) - (setq funcs (list funcs))) - (when gnus-score-use-all-scores - ;; Get the initial score files for this group. - (when funcs - (setq score-files (nreverse (gnus-score-find-alist group)))) - ;; Add any home adapt files. - (let ((home (gnus-home-score-file group t))) - (when home - (push home score-files) - (setq gnus-newsgroup-adaptive-score-file home))) - ;; Check whether there is a `adapt-file' group parameter. - (let ((param-file (gnus-group-find-parameter group 'adapt-file))) - (when param-file - (push param-file score-files) - (setq gnus-newsgroup-adaptive-score-file param-file)))) - ;; Go through all the functions for finding score files (or actual - ;; scores) and add them to a list. - (while funcs - (when (gnus-functionp (car funcs)) - (setq score-files - (append score-files - (nreverse (funcall (car funcs) group))))) - (setq funcs (cdr funcs))) - (when gnus-score-use-all-scores - ;; Add any home score files. - (let ((home (gnus-home-score-file group))) - (when home - (push home score-files))) - ;; Check whether there is a `score-file' group parameter. - (let ((param-file (gnus-group-find-parameter group 'score-file))) - (when param-file - (push param-file score-files)))) - ;; Expand all files names. - (let ((files score-files)) - (while files - (when (stringp (car files)) - (setcar files (expand-file-name - (car files) gnus-kill-files-directory))) - (pop files))) - (setq score-files (nreverse score-files)) - ;; Remove any duplicate score files. - (while (and score-files - (member (car score-files) (cdr score-files))) - (pop score-files)) - (let ((files score-files)) - (while (cdr files) - (if (member (cadr files) (cddr files)) - (setcdr files (cddr files)) - (pop files)))) - ;; Do the scoring if there are any score files for this group. - score-files))) - -(defun gnus-possibly-score-headers (&optional trace) - "Do scoring if scoring is required." - (let ((score-files (gnus-all-score-files))) - (when score-files - (gnus-score-headers score-files trace)))) - -(defun gnus-score-file-name (newsgroup &optional suffix) - "Return the name of a score file for NEWSGROUP." - (let ((suffix (or suffix gnus-score-file-suffix))) - (nnheader-translate-file-chars - (cond - ((or (null newsgroup) - (string-equal newsgroup "")) - ;; The global score file is placed at top of the directory. - (expand-file-name suffix gnus-kill-files-directory)) - ((gnus-use-long-file-name 'not-score) - ;; Append ".SCORE" to newsgroup name. - (expand-file-name (concat (gnus-newsgroup-savable-name newsgroup) - "." suffix) - gnus-kill-files-directory)) - (t - ;; Place "SCORE" under the hierarchical directory. - (expand-file-name (concat (gnus-newsgroup-directory-form newsgroup) - "/" suffix) - gnus-kill-files-directory)))))) - -(defun gnus-score-search-global-directories (files) - "Scan all global score directories for score files." - ;; Set the variable `gnus-internal-global-score-files' to all - ;; available global score files. - (interactive (list gnus-global-score-files)) - (let (out) - (while files - ;; #### /$ Unix-specific? - (if (file-directory-p (car files)) - (setq out (nconc (directory-files - (car files) t - (concat (gnus-score-file-regexp) "$")))) - (push (car files) out)) - (setq files (cdr files))) - (setq gnus-internal-global-score-files out))) - -(defun gnus-score-default-fold-toggle () - "Toggle folding for new score file entries." - (interactive) - (setq gnus-score-default-fold (not gnus-score-default-fold)) - (if gnus-score-default-fold - (gnus-message 1 "New score file entries will be case insensitive.") - (gnus-message 1 "New score file entries will be case sensitive."))) - -;;; Home score file. - -(defun gnus-home-score-file (group &optional adapt) - "Return the home score file for GROUP. -If ADAPT, return the home adaptive file instead." - (let ((list (if adapt gnus-home-adapt-file gnus-home-score-file)) - elem found) - ;; Make sure we have a list. - (unless (listp list) - (setq list (list list))) - ;; Go through the list and look for matches. - (while (and (not found) - (setq elem (pop list))) - (setq found - (cond - ;; Simple string. - ((stringp elem) - elem) - ;; Function. - ((gnus-functionp elem) - (funcall elem group)) - ;; Regexp-file cons. - ((consp elem) - (when (string-match (gnus-globalify-regexp (car elem)) group) - (replace-match (cadr elem) t nil group)))))) - (when found - (setq found (nnheader-translate-file-chars found)) - (if (file-name-absolute-p found) - found - (nnheader-concat gnus-kill-files-directory found))))) - -(defun gnus-hierarchial-home-score-file (group) - "Return the score file of the top-level hierarchy of GROUP." - (if (string-match "^[^.]+\\." group) - (concat (match-string 0 group) gnus-score-file-suffix) - ;; Group name without any dots. - (concat group (if (gnus-use-long-file-name 'not-score) "." "/") - gnus-score-file-suffix))) - -(defun gnus-hierarchial-home-adapt-file (group) - "Return the adapt file of the top-level hierarchy of GROUP." - (if (string-match "^[^.]+\\." group) - (concat (match-string 0 group) gnus-adaptive-file-suffix) - ;; Group name without any dots. - (concat group (if (gnus-use-long-file-name 'not-score) "." "/") - gnus-adaptive-file-suffix))) - -(defun gnus-current-home-score-file (group) - "Return the \"current\" regular score file." - (car (nreverse (gnus-score-find-alist group)))) - -;;; -;;; Score decays -;;; - -(defun gnus-decay-score (score) - "Decay SCORE according to `gnus-score-decay-constant' and `gnus-score-decay-scale'." - (floor - (- score - (* (if (< score 0) -1 1) - (min (abs score) - (max gnus-score-decay-constant - (* (abs score) - gnus-score-decay-scale))))))) - -(defun gnus-decay-scores (alist day) - "Decay non-permanent scores in ALIST." - (let ((times (- (time-to-days (current-time)) day)) - kill entry updated score n) - (unless (zerop times) ;Done decays today already? - (while (setq entry (pop alist)) - (when (stringp (car entry)) - (setq entry (cdr entry)) - (while (setq kill (pop entry)) - (when (nth 2 kill) - (setq updated t) - (setq score (or (nth 1 kill) - gnus-score-interactive-default-score) - n times) - (while (natnump (decf n)) - (setq score (funcall gnus-decay-score-function score))) - (setcdr kill (cons score - (cdr (cdr kill))))))))) - ;; Return whether this score file needs to be saved. By Je-haysuss! - updated)) - -(defun gnus-score-regexp-bad-p (regexp) - "Test whether REGEXP is safe for Gnus scoring. -A regexp is unsafe if it matches newline or a buffer boundary. - -If the regexp is good, return nil. If the regexp is bad, return a -cons cell (SYM . STRING), where the symbol SYM is `new' or `bad'. -In the `new' case, the string is a safe replacement for REGEXP. -In the `bad' case, the string is a unsafe subexpression of REGEXP, -and we do not have a simple replacement to suggest. - -See `(Gnus)Scoring Tips' for examples of good regular expressions." - (let (case-fold-search) - (and - ;; First, try a relatively fast necessary condition. - ;; Notice ranges (like [^:] or [\t-\r]), \s>, \Sw, \W, \', \`: - (string-match "\n\\|\\\\[SsW`']\\|\\[\\^\\|[\0-\n]-" regexp) - ;; Now break the regexp into tokens, and check each: - (let ((tail regexp) ; remaining regexp to check - tok ; current token - bad ; nil, or bad subexpression - new ; nil, or replacement regexp so far - end) ; length of current token - (while (and (not bad) - (string-match - "\\`\\(\\\\[sS]?.\\|\\[\\^?]?[^]]*]\\|[^\\]\\)" - tail)) - (setq end (match-end 0) - tok (substring tail 0 end) - tail (substring tail end)) - (if;; Is token `bad' (matching newline or buffer ends)? - (or (member tok '("\n" "\\W" "\\`" "\\'")) - ;; This next handles "[...]", "\\s.", and "\\S.": - (and (> end 2) (string-match tok "\n"))) - (let ((newtok - ;; Try to suggest a replacement for tok ... - (cond ((string-equal tok "\\`") "^") ; or "\\(^\\)" - ((string-equal tok "\\'") "$") ; or "\\($\\)" - ((string-match "\\[\\^" tok) ; very common - (concat (substring tok 0 -1) "\n]"))))) - (if newtok - (setq new - (concat - (or new - ;; good prefix so far: - (substring regexp 0 (- (+ (length tail) end)))) - newtok)) - ;; No replacement idea, so give up: - (setq bad tok))) - ;; tok is good, may need to extend new - (and new (setq new (concat new tok))))) - ;; Now return a value: - (cond - (bad (cons 'bad bad)) - (new (cons 'new new)) - (t nil)))))) - -(provide 'gnus-score) - -;;; gnus-score.el ends here diff --git a/lisp/gnus-setup.el b/lisp/gnus-setup.el deleted file mode 100644 index 4f7634d..0000000 --- a/lisp/gnus-setup.el +++ /dev/null @@ -1,194 +0,0 @@ -;;; gnus-setup.el --- Initialization & Setup for Gnus 5 - -;; Copyright (C) 1995, 1996, 2000 Free Software Foundation, Inc. - -;; Author: Steven L. Baur -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: -;; My head is starting to spin with all the different mail/news packages. -;; Stop The Madness! - -;; Given that Emacs Lisp byte codes may be diverging, it is probably best -;; not to byte compile this, and just arrange to have the .el loaded out -;; of .emacs. - -;;; Code: - -(eval-when-compile (require 'cl)) - -(defvar gnus-use-installed-gnus t - "*If non-nil use installed version of Gnus.") - -(defvar gnus-use-installed-mailcrypt (featurep 'xemacs) - "*If non-nil use installed version of mailcrypt.") - -(defvar gnus-emacs-lisp-directory (if (featurep 'xemacs) - "/usr/local/lib/xemacs/" - "/usr/local/share/emacs/") - "Directory where Emacs site lisp is located.") - -(defvar gnus-gnus-lisp-directory (concat gnus-emacs-lisp-directory - "gnus/lisp/") - "Directory where Gnus Emacs lisp is found.") - -(defvar gnus-mailcrypt-lisp-directory (concat gnus-emacs-lisp-directory - "site-lisp/mailcrypt/") - "Directory where Mailcrypt Emacs Lisp is found.") - -(defvar gnus-bbdb-lisp-directory (concat gnus-emacs-lisp-directory - "site-lisp/bbdb/") - "Directory where Big Brother Database is found.") - -(defvar gnus-use-mhe nil - "Set this if you want to use MH-E for mail reading.") -(defvar gnus-use-rmail nil - "Set this if you want to use RMAIL for mail reading.") -(defvar gnus-use-sendmail t - "Set this if you want to use SENDMAIL for mail reading.") -(defvar gnus-use-vm nil - "Set this if you want to use the VM package for mail reading.") -(defvar gnus-use-sc nil - "Set this if you want to use Supercite.") -(defvar gnus-use-mailcrypt t - "Set this if you want to use Mailcrypt for dealing with PGP messages.") -(defvar gnus-use-bbdb nil - "Set this if you want to use the Big Brother DataBase.") - -(when (and (not gnus-use-installed-gnus) - (null (member gnus-gnus-lisp-directory load-path))) - (push gnus-gnus-lisp-directory load-path)) - -;;; We can't do this until we know where Gnus is. -(require 'message) - -;;; Mailcrypt by -;;; Jin Choi -;;; Patrick LoPresti - -(when gnus-use-mailcrypt - (when (and (not gnus-use-installed-mailcrypt) - (null (member gnus-mailcrypt-lisp-directory load-path))) - (setq load-path (cons gnus-mailcrypt-lisp-directory load-path))) - (autoload 'mc-install-write-mode "mailcrypt" nil t) - (autoload 'mc-install-read-mode "mailcrypt" nil t) -;;; (add-hook 'message-mode-hook 'mc-install-write-mode) -;;; (add-hook 'gnus-summary-mode-hook 'mc-install-read-mode) - (when gnus-use-mhe - (add-hook 'mh-folder-mode-hook 'mc-install-read-mode) - (add-hook 'mh-letter-mode-hook 'mc-install-write-mode))) - -;;; BBDB by -;;; Jamie Zawinski - -(when gnus-use-bbdb - ;; bbdb will never be installed with emacs. - (when (null (member gnus-bbdb-lisp-directory load-path)) - (setq load-path (cons gnus-bbdb-lisp-directory load-path))) - (autoload 'bbdb "bbdb-com" - "Insidious Big Brother Database" t) - (autoload 'bbdb-name "bbdb-com" - "Insidious Big Brother Database" t) - (autoload 'bbdb-company "bbdb-com" - "Insidious Big Brother Database" t) - (autoload 'bbdb-net "bbdb-com" - "Insidious Big Brother Database" t) - (autoload 'bbdb-notes "bbdb-com" - "Insidious Big Brother Database" t) - - (when gnus-use-vm - (autoload 'bbdb-insinuate-vm "bbdb-vm" - "Hook BBDB into VM" t)) - - (when gnus-use-rmail - (autoload 'bbdb-insinuate-rmail "bbdb-rmail" - "Hook BBDB into RMAIL" t) - (add-hook 'rmail-mode-hook 'bbdb-insinuate-rmail)) - - (when gnus-use-mhe - (autoload 'bbdb-insinuate-mh "bbdb-mh" - "Hook BBDB into MH-E" t) - (add-hook 'mh-folder-mode-hook 'bbdb-insinuate-mh)) - - (autoload 'bbdb-insinuate-gnus "bbdb-gnus" - "Hook BBDB into Gnus" t) - (add-hook 'gnus-startup-hook 'bbdb-insinuate-gnus) - - (when gnus-use-sendmail - (autoload 'bbdb-insinuate-sendmail "bbdb" - "Insidious Big Brother Database" t) - (add-hook 'mail-setup-hook 'bbdb-insinuate-sendmail) - (add-hook 'message-setup-hook 'bbdb-insinuate-sendmail))) - -(when gnus-use-sc - (add-hook 'mail-citation-hook 'sc-cite-original) - (setq message-cite-function 'sc-cite-original) - (autoload 'sc-cite-original "supercite")) - -;;;### (autoloads (gnus gnus-slave gnus-no-server) "gnus" "lisp/gnus.el" (12473 2137)) -;;; Generated autoloads from lisp/gnus.el - -;; Don't redo this if autoloads already exist -(unless (fboundp 'gnus) - (autoload 'gnus-slave-no-server "gnus" "\ -Read network news as a slave without connecting to local server." t nil) - - (autoload 'gnus-no-server "gnus" "\ -Read network news. -If ARG is a positive number, Gnus will use that as the -startup level. If ARG is nil, Gnus will be started at level 2. -If ARG is non-nil and not a positive number, Gnus will -prompt the user for the name of an NNTP server to use. -As opposed to `gnus', this command will not connect to the local server." t nil) - - (autoload 'gnus-slave "gnus" "\ -Read news as a slave." t nil) - - (autoload 'gnus "gnus" "\ -Read network news. -If ARG is non-nil and a positive number, Gnus will use that as the -startup level. If ARG is non-nil and not a positive number, Gnus will -prompt the user for the name of an NNTP server to use." t nil) - -;;;*** - -;;; These have moved out of gnus.el into other files. -;;; FIX FIX FIX: should other things be in gnus-setup? or these not in it? - (autoload 'gnus-update-format "gnus-spec" "\ -Update the format specification near point." t nil) - - (autoload 'gnus-fetch-group "gnus-group" "\ -Start Gnus if necessary and enter GROUP. -Returns whether the fetching was successful or not." t nil) - - (defalias 'gnus-batch-kill 'gnus-batch-score) - - (autoload 'gnus-batch-score "gnus-kill" "\ -Run batched scoring. -Usage: emacs -batch -l gnus -f gnus-batch-score ... -Newsgroups is a list of strings in Bnews format. If you want to score -the comp hierarchy, you'd say \"comp.all\". If you would not like to -score the alt hierarchy, you'd say \"!alt.all\"." t nil)) - -(provide 'gnus-setup) - -(run-hooks 'gnus-setup-load-hook) - -;;; gnus-setup.el ends here diff --git a/lisp/gnus-soup.el b/lisp/gnus-soup.el deleted file mode 100644 index 9b974a8..0000000 --- a/lisp/gnus-soup.el +++ /dev/null @@ -1,576 +0,0 @@ -;;; gnus-soup.el --- SOUP packet writing support for Gnus - -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Per Abrahamsen -;; Lars Magne Ingebrigtsen -;; Keywords: news, mail - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus) -(require 'gnus-art) -(require 'message) -(require 'gnus-start) -(require 'gnus-range) - -;;; User Variables: - -(defvar gnus-soup-directory (nnheader-concat gnus-home-directory "SoupBrew/") - "*Directory containing an unpacked SOUP packet.") - -(defvar gnus-soup-replies-directory - (nnheader-concat gnus-soup-directory "SoupReplies/") - "*Directory where Gnus will do processing of replies.") - -(defvar gnus-soup-prefix-file "gnus-prefix" - "*Name of the file where Gnus stores the last used prefix.") - -(defvar gnus-soup-packer "tar cf - %s | gzip > $HOME/Soupout%d.tgz" - "Format string command for packing a SOUP packet. -The SOUP files will be inserted where the %s is in the string. -This string MUST contain both %s and %d. The file number will be -inserted where %d appears.") - -(defvar gnus-soup-unpacker "gunzip -c %s | tar xvf -" - "*Format string command for unpacking a SOUP packet. -The SOUP packet file name will be inserted at the %s.") - -(defvar gnus-soup-packet-directory gnus-home-directory - "*Where gnus-soup will look for REPLIES packets.") - -(defvar gnus-soup-packet-regexp "Soupin" - "*Regular expression matching SOUP REPLIES packets in `gnus-soup-packet-directory'.") - -(defvar gnus-soup-ignored-headers "^Xref:" - "*Regexp to match headers to be removed when brewing SOUP packets.") - -;;; Internal Variables: - -(defvar gnus-soup-encoding-type ?u - "*Soup encoding type. -`u' is USENET news format, `m' is Unix mbox format, and `M' is MMDF mailbox -format.") - -(defvar gnus-soup-index-type ?c - "*Soup index type. -`n' means no index file and `c' means standard Cnews overview -format.") - -(defvar gnus-soup-areas nil) -(defvar gnus-soup-last-prefix nil) -(defvar gnus-soup-prev-prefix nil) -(defvar gnus-soup-buffers nil) - -;;; Access macros: - -(defmacro gnus-soup-area-prefix (area) - `(aref ,area 0)) -(defmacro gnus-soup-set-area-prefix (area prefix) - `(aset ,area 0 ,prefix)) -(defmacro gnus-soup-area-name (area) - `(aref ,area 1)) -(defmacro gnus-soup-area-encoding (area) - `(aref ,area 2)) -(defmacro gnus-soup-area-description (area) - `(aref ,area 3)) -(defmacro gnus-soup-area-number (area) - `(aref ,area 4)) -(defmacro gnus-soup-area-set-number (area value) - `(aset ,area 4 ,value)) - -(defmacro gnus-soup-encoding-format (encoding) - `(aref ,encoding 0)) -(defmacro gnus-soup-encoding-index (encoding) - `(aref ,encoding 1)) -(defmacro gnus-soup-encoding-kind (encoding) - `(aref ,encoding 2)) - -(defmacro gnus-soup-reply-prefix (reply) - `(aref ,reply 0)) -(defmacro gnus-soup-reply-kind (reply) - `(aref ,reply 1)) -(defmacro gnus-soup-reply-encoding (reply) - `(aref ,reply 2)) - -;;; Commands: - -(defun gnus-soup-send-replies () - "Unpack and send all replies in the reply packet." - (interactive) - (let ((packets (directory-files - gnus-soup-packet-directory t gnus-soup-packet-regexp))) - (while packets - (when (gnus-soup-send-packet (car packets)) - (delete-file (car packets))) - (setq packets (cdr packets))))) - -(defun gnus-soup-add-article (n) - "Add the current article to SOUP packet. -If N is a positive number, add the N next articles. -If N is a negative number, add the N previous articles. -If N is nil and any articles have been marked with the process mark, -move those articles instead." - (interactive "P") - (let* ((articles (gnus-summary-work-articles n)) - (tmp-buf (gnus-get-buffer-create "*soup work*")) - (area (gnus-soup-area gnus-newsgroup-name)) - (prefix (gnus-soup-area-prefix area)) - headers) - (buffer-disable-undo tmp-buf) - (save-excursion - (while articles - ;; Put the article in a buffer. - (set-buffer tmp-buf) - (when (gnus-request-article-this-buffer - (car articles) gnus-newsgroup-name) - (setq headers (nnheader-parse-head t)) - (save-restriction - (message-narrow-to-head) - (message-remove-header gnus-soup-ignored-headers t)) - (gnus-soup-store gnus-soup-directory prefix headers - gnus-soup-encoding-type - gnus-soup-index-type) - (gnus-soup-area-set-number - area (1+ (or (gnus-soup-area-number area) 0)))) - ;; Mark article as read. - (set-buffer gnus-summary-buffer) - (gnus-summary-remove-process-mark (car articles)) - (gnus-summary-mark-as-read (car articles) gnus-souped-mark) - (setq articles (cdr articles))) - (kill-buffer tmp-buf)) - (gnus-soup-save-areas) - (gnus-set-mode-line 'summary))) - -(defun gnus-soup-pack-packet () - "Make a SOUP packet from the SOUP areas." - (interactive) - (gnus-soup-read-areas) - (if (file-exists-p gnus-soup-directory) - (if (directory-files gnus-soup-directory nil "\\.MSG$") - (gnus-soup-pack gnus-soup-directory gnus-soup-packer) - (message "No files to pack.")) - (message "No such directory: %s" gnus-soup-directory))) - -(defun gnus-group-brew-soup (n) - "Make a soup packet from the current group. -Uses the process/prefix convention." - (interactive "P") - (let ((groups (gnus-group-process-prefix n))) - (while groups - (gnus-group-remove-mark (car groups)) - (gnus-soup-group-brew (car groups) t) - (setq groups (cdr groups))) - (gnus-soup-save-areas))) - -(defun gnus-brew-soup (&optional level) - "Go through all groups on LEVEL or less and make a soup packet." - (interactive "P") - (let ((level (or level gnus-level-subscribed)) - (newsrc (cdr gnus-newsrc-alist))) - (while newsrc - (when (<= (nth 1 (car newsrc)) level) - (gnus-soup-group-brew (caar newsrc) t)) - (setq newsrc (cdr newsrc))) - (gnus-soup-save-areas))) - -;;;###autoload -(defun gnus-batch-brew-soup () - "Brew a SOUP packet from groups mention on the command line. -Will use the remaining command line arguments as regular expressions -for matching on group names. - -For instance, if you want to brew on all the nnml groups, as well as -groups with \"emacs\" in the name, you could say something like: - -$ emacs -batch -f gnus-batch-brew-soup ^nnml \".*emacs.*\" - -Note -- this function hasn't been implemented yet." - (interactive) - nil) - -;;; Internal Functions: - -;; Store the current buffer. -(defun gnus-soup-store (directory prefix headers format index) - ;; Create the directory, if needed. - (gnus-make-directory directory) - (let* ((msg-buf (nnheader-find-file-noselect - (concat directory prefix ".MSG"))) - (idx-buf (if (= index ?n) - nil - (nnheader-find-file-noselect - (concat directory prefix ".IDX")))) - (article-buf (current-buffer)) - from head-line beg type) - (setq gnus-soup-buffers (cons msg-buf (delq msg-buf gnus-soup-buffers))) - (buffer-disable-undo msg-buf) - (when idx-buf - (push idx-buf gnus-soup-buffers) - (buffer-disable-undo idx-buf)) - (save-excursion - ;; Make sure the last char in the buffer is a newline. - (goto-char (point-max)) - (unless (= (current-column) 0) - (insert "\n")) - ;; Find the "from". - (goto-char (point-min)) - (setq from - (gnus-mail-strip-quoted-names - (or (mail-fetch-field "from") - (mail-fetch-field "really-from") - (mail-fetch-field "sender")))) - (goto-char (point-min)) - ;; Depending on what encoding is supposed to be used, we make - ;; a soup header. - (setq head-line - (cond - ((or (= gnus-soup-encoding-type ?u) - (= gnus-soup-encoding-type ?n)) ;;Gnus back compatibility. - (format "#! rnews %d\n" (buffer-size))) - ((= gnus-soup-encoding-type ?m) - (while (search-forward "\nFrom " nil t) - (replace-match "\n>From " t t)) - (concat "From " (or from "unknown") - " " (current-time-string) "\n")) - ((= gnus-soup-encoding-type ?M) - "\^a\^a\^a\^a\n") - (t (error "Unsupported type: %c" gnus-soup-encoding-type)))) - ;; Insert the soup header and the article in the MSG buf. - (set-buffer msg-buf) - (goto-char (point-max)) - (insert head-line) - (setq beg (point)) - (insert-buffer-substring article-buf) - ;; Insert the index in the IDX buf. - (cond ((= index ?c) - (set-buffer idx-buf) - (gnus-soup-insert-idx beg headers)) - ((/= index ?n) - (error "Unknown index type: %c" type))) - ;; Return the MSG buf. - msg-buf))) - -(defun gnus-soup-group-brew (group &optional not-all) - "Enter GROUP and add all articles to a SOUP package. -If NOT-ALL, don't pack ticked articles." - (let ((gnus-expert-user t) - (gnus-large-newsgroup nil) - (entry (gnus-gethash group gnus-newsrc-hashtb))) - (when (or (null entry) - (eq (car entry) t) - (and (car entry) - (> (car entry) 0)) - (and (not not-all) - (gnus-range-length (cdr (assq 'tick (gnus-info-marks - (nth 2 entry))))))) - (when (gnus-summary-read-group group nil t) - (setq gnus-newsgroup-processable - (reverse - (if (not not-all) - (append gnus-newsgroup-marked gnus-newsgroup-unreads) - gnus-newsgroup-unreads))) - (gnus-soup-add-article nil) - (gnus-summary-exit))))) - -(defun gnus-soup-insert-idx (offset header) - ;; [number subject from date id references chars lines xref] - (goto-char (point-max)) - (insert - (format "%d\t%s\t%s\t%s\t%s\t%s\t%d\t%s\t\t\n" - offset - (or (mail-header-subject header) "(none)") - (or (mail-header-from header) "(nobody)") - (or (mail-header-date header) "") - (or (mail-header-id header) - (concat "soup-dummy-id-" - (mapconcat - (lambda (time) (int-to-string time)) - (current-time) "-"))) - (or (mail-header-references header) "") - (or (mail-header-chars header) 0) - (or (mail-header-lines header) "0")))) - -(defun gnus-soup-save-areas () - "Write all SOUP buffers." - (interactive) - (gnus-soup-write-areas) - (save-excursion - (let (buf) - (while gnus-soup-buffers - (setq buf (car gnus-soup-buffers) - gnus-soup-buffers (cdr gnus-soup-buffers)) - (if (not (buffer-name buf)) - () - (set-buffer buf) - (when (buffer-modified-p) - (save-buffer)) - (kill-buffer (current-buffer))))) - (gnus-soup-write-prefixes))) - -(defun gnus-soup-write-prefixes () - (let ((prefixes gnus-soup-last-prefix) - prefix) - (save-excursion - (gnus-set-work-buffer) - (while (setq prefix (pop prefixes)) - (erase-buffer) - (insert (format "(setq gnus-soup-prev-prefix %d)\n" (cdr prefix))) - (gnus-write-buffer-as-coding-system - nnheader-text-coding-system - (concat (car prefix) gnus-soup-prefix-file)))))) - -(defun gnus-soup-pack (dir packer) - (let* ((files (mapconcat 'identity - '("AREAS" "*.MSG" "*.IDX" "INFO" - "LIST" "REPLIES" "COMMANDS" "ERRORS") - " ")) - (packer (if (< (string-match "%s" packer) - (string-match "%d" packer)) - (format packer files - (string-to-int (gnus-soup-unique-prefix dir))) - (format packer - (string-to-int (gnus-soup-unique-prefix dir)) - files))) - (dir (expand-file-name dir))) - (gnus-make-directory dir) - (setq gnus-soup-areas nil) - (gnus-message 4 "Packing %s..." packer) - (if (zerop (call-process shell-file-name - nil nil nil shell-command-switch - (concat "cd " dir " ; " packer))) - (progn - (call-process shell-file-name nil nil nil shell-command-switch - (concat "cd " dir " ; rm " files)) - (gnus-message 4 "Packing...done" packer)) - (error "Couldn't pack packet")))) - -(defun gnus-soup-parse-areas (file) - "Parse soup area file FILE. -The result is a of vectors, each containing one entry from the AREA file. -The vector contain five strings, - [prefix name encoding description number] -though the two last may be nil if they are missing." - (let (areas) - (when (file-exists-p file) - (save-excursion - (set-buffer (nnheader-find-file-noselect file 'force)) - (buffer-disable-undo) - (goto-char (point-min)) - (while (not (eobp)) - (push (vector (gnus-soup-field) - (gnus-soup-field) - (gnus-soup-field) - (and (eq (preceding-char) ?\t) - (gnus-soup-field)) - (and (eq (preceding-char) ?\t) - (string-to-int (gnus-soup-field)))) - areas) - (when (eq (preceding-char) ?\t) - (beginning-of-line 2))) - (kill-buffer (current-buffer)))) - areas)) - -(defun gnus-soup-parse-replies (file) - "Parse soup REPLIES file FILE. -The result is a of vectors, each containing one entry from the REPLIES -file. The vector contain three strings, [prefix name encoding]." - (let (replies) - (save-excursion - (set-buffer (nnheader-find-file-noselect file)) - (buffer-disable-undo) - (goto-char (point-min)) - (while (not (eobp)) - (push (vector (gnus-soup-field) (gnus-soup-field) - (gnus-soup-field)) - replies) - (when (eq (preceding-char) ?\t) - (beginning-of-line 2))) - (kill-buffer (current-buffer))) - replies)) - -(defun gnus-soup-field () - (prog1 - (buffer-substring (point) (progn (skip-chars-forward "^\t\n") (point))) - (forward-char 1))) - -(defun gnus-soup-read-areas () - (or gnus-soup-areas - (setq gnus-soup-areas - (gnus-soup-parse-areas (concat gnus-soup-directory "AREAS"))))) - -(defun gnus-soup-write-areas () - "Write the AREAS file." - (interactive) - (when gnus-soup-areas - (with-temp-file (concat gnus-soup-directory "AREAS") - (let ((areas gnus-soup-areas) - area) - (while (setq area (pop areas)) - (insert - (format - "%s\t%s\t%s%s\n" - (gnus-soup-area-prefix area) - (gnus-soup-area-name area) - (gnus-soup-area-encoding area) - (if (or (gnus-soup-area-description area) - (gnus-soup-area-number area)) - (concat "\t" (or (gnus-soup-area-description - area) "") - (if (gnus-soup-area-number area) - (concat "\t" (int-to-string - (gnus-soup-area-number area))) - "")) "")))))))) - -(defun gnus-soup-write-replies (dir areas) - "Write a REPLIES file in DIR containing AREAS." - (with-temp-file (concat dir "REPLIES") - (let (area) - (while (setq area (pop areas)) - (insert (format "%s\t%s\t%s\n" - (gnus-soup-reply-prefix area) - (gnus-soup-reply-kind area) - (gnus-soup-reply-encoding area))))))) - -(defun gnus-soup-area (group) - (gnus-soup-read-areas) - (let ((areas gnus-soup-areas) - (real-group (gnus-group-real-name group)) - area result) - (while areas - (setq area (car areas) - areas (cdr areas)) - (when (equal (gnus-soup-area-name area) real-group) - (setq result area))) - (unless result - (setq result - (vector (gnus-soup-unique-prefix) - real-group - (format "%c%c%c" - gnus-soup-encoding-type - gnus-soup-index-type - (if (gnus-member-of-valid 'mail group) ?m ?n)) - nil nil) - gnus-soup-areas (cons result gnus-soup-areas))) - result)) - -(defun gnus-soup-unique-prefix (&optional dir) - (let* ((dir (file-name-as-directory (or dir gnus-soup-directory))) - (entry (assoc dir gnus-soup-last-prefix)) - gnus-soup-prev-prefix) - (if entry - () - (when (file-exists-p (concat dir gnus-soup-prefix-file)) - (ignore-errors - (load (concat dir gnus-soup-prefix-file) nil t t))) - (push (setq entry (cons dir (or gnus-soup-prev-prefix 0))) - gnus-soup-last-prefix)) - (setcdr entry (1+ (cdr entry))) - (gnus-soup-write-prefixes) - (int-to-string (cdr entry)))) - -(defun gnus-soup-unpack-packet (dir unpacker packet) - "Unpack PACKET into DIR using UNPACKER. -Return whether the unpacking was successful." - (gnus-make-directory dir) - (gnus-message 4 "Unpacking: %s" (format unpacker packet)) - (prog1 - (zerop (call-process - shell-file-name nil nil nil shell-command-switch - (format "cd %s ; %s" (expand-file-name dir) - (format unpacker packet)))) - (gnus-message 4 "Unpacking...done"))) - -(defun gnus-soup-send-packet (packet) - (gnus-soup-unpack-packet - gnus-soup-replies-directory gnus-soup-unpacker packet) - (let ((replies (gnus-soup-parse-replies - (concat gnus-soup-replies-directory "REPLIES")))) - (save-excursion - (while replies - (let* ((msg-file (concat gnus-soup-replies-directory - (gnus-soup-reply-prefix (car replies)) - ".MSG")) - (msg-buf (and (file-exists-p msg-file) - (nnheader-find-file-noselect msg-file))) - (tmp-buf (gnus-get-buffer-create " *soup send*")) - beg end) - (cond - ((and (/= (gnus-soup-encoding-format - (gnus-soup-reply-encoding (car replies))) - ?u) - (/= (gnus-soup-encoding-format - (gnus-soup-reply-encoding (car replies))) - ?n)) ;; Gnus back compatibility. - (error "Unsupported encoding")) - ((null msg-buf) - t) - (t - (buffer-disable-undo msg-buf) - (set-buffer msg-buf) - (goto-char (point-min)) - (while (not (eobp)) - (unless (looking-at "#! *rnews +\\([0-9]+\\)") - (error "Bad header")) - (forward-line 1) - (setq beg (point) - end (+ (point) (string-to-int - (buffer-substring - (match-beginning 1) (match-end 1))))) - (switch-to-buffer tmp-buf) - (erase-buffer) - (insert-buffer-substring msg-buf beg end) - (goto-char (point-min)) - (search-forward "\n\n") - (forward-char -1) - (insert mail-header-separator) - (setq message-user-agent (gnus-extended-version)) - (cond - ((string= (gnus-soup-reply-kind (car replies)) "news") - (gnus-message 5 "Sending news message to %s..." - (mail-fetch-field "newsgroups")) - (sit-for 1) - (let ((message-syntax-checks - 'dont-check-for-anything-just-trust-me)) - (funcall message-send-news-function))) - ((string= (gnus-soup-reply-kind (car replies)) "mail") - (gnus-message 5 "Sending mail to %s..." - (mail-fetch-field "to")) - (sit-for 1) - (message-send-mail)) - (t - (error "Unknown reply kind"))) - (set-buffer msg-buf) - (goto-char end)) - (delete-file (buffer-file-name)) - (kill-buffer msg-buf) - (kill-buffer tmp-buf) - (gnus-message 4 "Sent packet")))) - (setq replies (cdr replies))) - t))) - -(provide 'gnus-soup) - -;;; gnus-soup.el ends here diff --git a/lisp/gnus-spec.el b/lisp/gnus-spec.el deleted file mode 100644 index 0171a91..0000000 --- a/lisp/gnus-spec.el +++ /dev/null @@ -1,712 +0,0 @@ -;;; gnus-spec.el --- format spec functions for Gnus -*- coding: iso-latin-1 -*- -;; Copyright (C) 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Katsumi Yamaoka -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'alist) -(require 'gnus) - -(defcustom gnus-use-correct-string-widths t - "*If non-nil, use correct functions for dealing with wide characters." - :group 'gnus-format - :type 'boolean) - -;;; Internal variables. - -(defvar gnus-summary-mark-positions nil) -(defvar gnus-group-mark-positions nil) -(defvar gnus-group-indentation "") - -;; Format specs. The chunks below are the machine-generated forms -;; that are to be evaled as the result of the default format strings. -;; We write them in here to get them byte-compiled. That way the -;; default actions will be quite fast, while still retaining the full -;; flexibility of the user-defined format specs. - -;; First we have lots of dummy defvars to let the compiler know these -;; are really dynamic variables. - -(defvar gnus-tmp-unread) -(defvar gnus-tmp-replied) -(defvar gnus-tmp-score-char) -(defvar gnus-tmp-indentation) -(defvar gnus-tmp-opening-bracket) -(defvar gnus-tmp-lines) -(defvar gnus-tmp-name) -(defvar gnus-tmp-closing-bracket) -(defvar gnus-tmp-subject-or-nil) -(defvar gnus-tmp-subject) -(defvar gnus-tmp-marked) -(defvar gnus-tmp-marked-mark) -(defvar gnus-tmp-subscribed) -(defvar gnus-tmp-process-marked) -(defvar gnus-tmp-number-of-unread) -(defvar gnus-tmp-group-name) -(defvar gnus-tmp-group) -(defvar gnus-tmp-article-number) -(defvar gnus-tmp-unread-and-unselected) -(defvar gnus-tmp-news-method) -(defvar gnus-tmp-news-server) -(defvar gnus-tmp-article-number) -(defvar gnus-mouse-face) -(defvar gnus-mouse-face-prop) - -(defun gnus-summary-line-format-spec () - (insert gnus-tmp-unread gnus-tmp-replied - gnus-tmp-score-char gnus-tmp-indentation) - (gnus-put-text-property - (point) - (progn - (insert - gnus-tmp-opening-bracket - (format "%4d: %-20s" - gnus-tmp-lines - (if (> (length gnus-tmp-name) 20) - (substring gnus-tmp-name 0 20) - gnus-tmp-name)) - gnus-tmp-closing-bracket) - (point)) - gnus-mouse-face-prop gnus-mouse-face) - (insert " " gnus-tmp-subject-or-nil "\n")) - -(defvar gnus-summary-line-format-spec - (gnus-byte-code 'gnus-summary-line-format-spec)) - -(defun gnus-summary-dummy-line-format-spec () - (insert "* ") - (gnus-put-text-property - (point) - (progn - (insert ": :") - (point)) - gnus-mouse-face-prop gnus-mouse-face) - (insert " " gnus-tmp-subject "\n")) - -(defvar gnus-summary-dummy-line-format-spec - (gnus-byte-code 'gnus-summary-dummy-line-format-spec)) - -(defun gnus-group-line-format-spec () - (insert gnus-tmp-marked-mark gnus-tmp-subscribed - gnus-tmp-process-marked - gnus-group-indentation - (format "%5s: " gnus-tmp-number-of-unread)) - (gnus-put-text-property - (point) - (progn - (insert gnus-tmp-group "\n") - (1- (point))) - gnus-mouse-face-prop gnus-mouse-face)) -(defvar gnus-group-line-format-spec - (gnus-byte-code 'gnus-group-line-format-spec)) - -(defvar gnus-format-specs - `((group ("%M\%S\%p\%P\%5y: %(%g%)%l\n" ,gnus-group-line-format-spec)) - (summary-dummy ("* %(: :%) %S\n" - ,gnus-summary-dummy-line-format-spec)) - (summary ("%U\%R\%z\%I\%(%[%4L: %-23,23n%]%) %s\n" - ,gnus-summary-line-format-spec))) - "Alist of format specs.") - -(defvar gnus-format-specs-compiled nil - "Alist of compiled format specs. Each element should be the form: -\(TYPE (FORMAT-STRING-1 . COMPILED-FUNCTION-1) - : - (FORMAT-STRING-n . COMPILED-FUNCTION-n)).") - -(defvar gnus-article-mode-line-format-spec nil) -(defvar gnus-summary-mode-line-format-spec nil) -(defvar gnus-group-mode-line-format-spec nil) - -;;; Phew. All that gruft is over with, fortunately. - -;;;###autoload -(defun gnus-update-format (var) - "Update the format specification near point." - (interactive - (list - (save-excursion - (eval-defun nil) - ;; Find the end of the current word. - (re-search-forward "[ \t\n]" nil t) - ;; Search backward. - (when (re-search-backward "\\(gnus-[-a-z]+-line-format\\)" nil t) - (match-string 1))))) - (let* ((type (intern (progn (string-match "gnus-\\([-a-z]+\\)-line" var) - (match-string 1 var)))) - (value (symbol-value (intern var))) - (spec (set - (intern (format "%s-spec" var)) - (gnus-parse-format - value (symbol-value (intern (format "%s-alist" var))) - (not (string-match "mode" var))))) - (entry (assq type gnus-format-specs))) - (if entry - (let ((elem (assoc value entry))) - (if elem - (setcdr elem spec) - (setcdr entry (cons (cons value elem) (cdr entry))))) - (push (list type (cons value spec)) gnus-format-specs)) - (gnus-product-variable-touch 'gnus-format-specs) - - (pop-to-buffer "*Gnus Format*") - (erase-buffer) - (lisp-interaction-mode) - (insert (pp-to-string spec)))) - -(put 'gnus-search-or-regist-spec 'lisp-indent-function 1) -(defmacro gnus-search-or-regist-spec (mspec &rest body) - (let ((specs (nth 0 mspec)) (type (nth 1 mspec)) (format (nth 2 mspec)) - (spec (nth 3 mspec)) (entry (nth 4 mspec)) (elem (nth 5 mspec))) - `(let* ((,entry (assq ,type ,specs)) - (,elem (assoc ,format (cdr ,entry)))) - (or (cdr ,elem) - (when (progn ,@body) - (if ,entry - (if ,elem - (setcdr ,elem ,spec) - (setcdr ,entry (cons (cons ,format ,spec) (cdr ,entry)))) - (push (list ,type (cons ,format ,spec)) ,specs)) - (gnus-product-variable-touch (quote ,specs))) - ,spec)))) - -(defun gnus-update-format-specification-1 (type format val) - (set (intern (format "gnus-%s-line-format-spec" type)) - (gnus-search-or-regist-spec (gnus-format-specs-compiled - type format val entry elem) - (when (and gnus-compile-user-specs val) - (setq val (prog1 - (progn - (fset 'gnus-tmp-func `(lambda () ,val)) - (require 'bytecomp) - (let (byte-compile-warnings) - (byte-compile 'gnus-tmp-func)) - (gnus-byte-code 'gnus-tmp-func)) - (when (get-buffer "*Compile-Log*") - (bury-buffer "*Compile-Log*")) - (when (get-buffer "*Compile-Log-Show*") - (bury-buffer "*Compile-Log-Show*")))))))) - -(defun gnus-update-format-specifications (&optional force &rest types) - "Update all (necessary) format specifications." - ;; Make the indentation array. - ;; See whether all the stored info needs to be flushed. - (when force - (message "%s" "Force update format specs.") - (setq gnus-format-specs nil - gnus-format-specs-compiled nil) - (gnus-product-variable-touch 'gnus-format-specs - 'gnus-format-specs-compiled)) - - ;; Go through all the formats and see whether they need updating. - (let (type val) - (save-excursion - (while (setq type (pop types)) - ;; Jump to the proper buffer to find out the value of the - ;; variable, if possible. (It may be buffer-local.) - (let* ((new-format - (let ((buffer (intern (format "gnus-%s-buffer" type)))) - (when (and (boundp buffer) - (setq val (symbol-value buffer)) - (gnus-buffer-exists-p val)) - (set-buffer val)) - (symbol-value - (intern (format "gnus-%s-line-format" type)))))) - (or (gnus-update-format-specification-1 type new-format nil) - ;; This is a new format. - (gnus-update-format-specification-1 - type new-format - (gnus-search-or-regist-spec (gnus-format-specs - type new-format val entry elem) - (setq val (if (stringp new-format) - ;; This is a "real" format. - (gnus-parse-format - new-format - (symbol-value - (intern (format "gnus-%s-line-format-alist" - type))) - (not (string-match "mode$" - (symbol-name type)))) - ;; This is a function call or something. - new-format)))))))))) - -(defvar gnus-mouse-face-0 'highlight) -(defvar gnus-mouse-face-1 'highlight) -(defvar gnus-mouse-face-2 'highlight) -(defvar gnus-mouse-face-3 'highlight) -(defvar gnus-mouse-face-4 'highlight) - -(defun gnus-mouse-face-function (form type) - `(gnus-put-text-property - (point) (progn ,@form (point)) - gnus-mouse-face-prop - ,(if (equal type 0) - 'gnus-mouse-face - `(quote ,(symbol-value (intern (format "gnus-mouse-face-%d" type))))))) - -(defvar gnus-face-0 'bold) -(defvar gnus-face-1 'italic) -(defvar gnus-face-2 'bold-italic) -(defvar gnus-face-3 'bold) -(defvar gnus-face-4 'bold) - -(defun gnus-face-face-function (form type) - `(gnus-add-text-properties - (point) (progn ,@form (point)) - '(gnus-face t face ,(symbol-value (intern (format "gnus-face-%d" type)))))) - -;;; Avoid byte-compile warning. -(defun gnus-tilde-pad-form (el pad-width) - "Dummy function except for XEmacs-mule. It will be redefined -by `gnus-xmas-redefine'." - (let ((val (if (symbolp el) (eval el) el))) - (` (, val)))) - -(defun gnus-balloon-face-function (form type) - `(gnus-put-text-property - (point) (progn ,@form (point)) - 'balloon-help - ,(intern (format "gnus-balloon-face-%d" type)))) - -(defun gnus-spec-tab (column) - (if (> column 0) - `(insert (make-string (max (- ,column (current-column)) 0) ? )) - `(progn - (if (> (current-column) ,(abs column)) - (delete-region (point) - (- (point) (- (current-column) ,(abs column)))) - (insert (make-string (max (- ,(abs column) (current-column)) 0) - ? )))))) - -(defun gnus-correct-length (string) - "Return the correct width of STRING." - (let ((length 0)) - (mapcar (lambda (char) (incf length (gnus-char-width char))) string) - length)) - -(defun gnus-correct-substring (string start &optional end) - (let ((wstart 0) - (wend 0) - (seek 0) - (length (length string))) - ;; Find the start position. - (while (and (< seek length) - (< wstart start)) - (incf wstart (gnus-char-width (aref string seek))) - (incf seek)) - (setq wend wstart - wstart seek) - ;; Find the end position. - (while (and (< seek length) - (or (not end) - (<= wend end))) - (incf wend (gnus-char-width (aref string seek))) - (incf seek)) - (setq wend seek) - (substring string wstart (1- wend)))) - -(defun gnus-tilde-max-form (el max-width) - "Return a form that limits EL to MAX-WIDTH." - (let ((max (abs max-width))) - (if (symbolp el) - `(if (> (,(if gnus-use-correct-string-widths - 'gnus-correct-length - 'length) ,el) - ,max) - ,(if (< max-width 0) - `(,(if gnus-use-correct-string-widths - 'gnus-correct-substring - 'substring) - ,el (- (,(if gnus-use-correct-string-widths - 'gnus-correct-length - 'length) - el) ,max)) - `(,(if gnus-use-correct-string-widths - 'gnus-correct-substring - 'substring) - ,el 0 ,max)) - ,el) - `(let ((val (eval ,el))) - (if (> (,(if gnus-use-correct-string-widths - 'gnus-correct-length - 'length) val) ,max) - ,(if (< max-width 0) - `(,(if gnus-use-correct-string-widths - 'gnus-correct-substring - 'substring) - val (- (,(if gnus-use-correct-string-widths - 'gnus-correct-length - 'length) val) ,max)) - `(,(if gnus-use-correct-string-widths - 'gnus-correct-substring - 'substring) - val 0 ,max)) - val))))) - -(defun gnus-tilde-cut-form (el cut-width) - "Return a form that cuts CUT-WIDTH off of EL." - (let ((cut (abs cut-width))) - (if (symbolp el) - `(if (> (,(if gnus-use-correct-string-widths - 'gnus-correct-length - 'length) ,el) ,cut) - ,(if (< cut-width 0) - `(,(if gnus-use-correct-string-widths - 'gnus-correct-substring - 'substring) ,el 0 - (- (,(if gnus-use-correct-string-widths - 'gnus-correct-length - 'length) el) ,cut)) - `(,(if gnus-use-correct-string-widths - 'gnus-correct-substring - 'substring) ,el ,cut)) - ,el) - `(let ((val (eval ,el))) - (if (> (,(if gnus-use-correct-string-widths - 'gnus-correct-length - 'length) val) ,cut) - ,(if (< cut-width 0) - `(,(if gnus-use-correct-string-widths - 'gnus-correct-substring - 'substring) val 0 - (- (,(if gnus-use-correct-string-widths - 'gnus-correct-length - 'length) val) ,cut)) - `(,(if gnus-use-correct-string-widths - 'gnus-correct-substring - 'substring) val ,cut)) - val))))) - -(defun gnus-tilde-ignore-form (el ignore-value) - "Return a form that is blank when EL is IGNORE-VALUE." - (if (symbolp el) - `(if (equal ,el ,ignore-value) - "" ,el) - `(let ((val (eval ,el))) - (if (equal val ,ignore-value) - "" val)))) - -(defun gnus-parse-format (format spec-alist &optional insert) - ;; This function parses the FORMAT string with the help of the - ;; SPEC-ALIST and returns a list that can be eval'ed to return the - ;; string. If the FORMAT string contains the specifiers %( and %) - ;; the text between them will have the mouse-face text property. - ;; If the FORMAT string contains the specifiers %[ and %], the text between - ;; them will have the balloon-help text property. - (if (string-match - "\\`\\(.*\\)%[0-9]?[{(«]\\(.*\\)%[0-9]?[»})]\\(.*\n?\\)\\'" - format) - (gnus-parse-complex-format format spec-alist) - ;; This is a simple format. - (gnus-parse-simple-format format spec-alist insert))) - -(defun gnus-parse-complex-format (format spec-alist) - (save-excursion - (gnus-set-work-buffer) - (insert format) - (goto-char (point-min)) - (while (re-search-forward "\"" nil t) - (replace-match "\\\"" nil t)) - (goto-char (point-min)) - (insert "(\"") - ;; Convert all font specs into font spec lists. - (while (re-search-forward "%\\([0-9]+\\)?\\([«»{}()]\\)" nil t) - (let ((number (if (match-beginning 1) - (match-string 1) "0")) - (delim (aref (match-string 2) 0))) - (if (or (= delim ?\() - (= delim ?\{) - (= delim ?\«)) - (replace-match (concat "\"(" - (cond ((= delim ?\() "mouse") - ((= delim ?\{) "face") - (t "balloon")) - " " number " \"") - t t) - (replace-match "\")\"")))) - (goto-char (point-max)) - (insert "\")") - ;; Convert point position commands. - (goto-char (point-min)) - (while (re-search-forward "%\\([-0-9]+\\)?C" nil t) - (replace-match "\"(point)\"" t t)) - ;; Convert TAB commands. - (goto-char (point-min)) - (while (re-search-forward "%\\([-0-9]+\\)=" nil t) - (replace-match (format "\"(tab %s)\"" (match-string 1)) t t)) - ;; Convert the buffer into the spec. - (goto-char (point-min)) - (let ((form (read (current-buffer)))) - ;; If the first element is '(point), we just remove it. - (when (equal (car form) '(point)) - (pop form)) - (cons 'progn (gnus-complex-form-to-spec form spec-alist))))) - -(defun gnus-complex-form-to-spec (form spec-alist) - (delq nil - (mapcar - (lambda (sform) - (cond - ((stringp sform) - (gnus-parse-simple-format sform spec-alist t)) - ((eq (car sform) 'point) - `(gnus-put-text-property (1- (point)) (point) 'gnus-position t)) - ((eq (car sform) 'tab) - (gnus-spec-tab (cadr sform))) - (t - (funcall (intern (format "gnus-%s-face-function" (car sform))) - (gnus-complex-form-to-spec (cddr sform) spec-alist) - (nth 1 sform))))) - form))) - -(defun gnus-parse-simple-format (format spec-alist &optional insert) - ;; This function parses the FORMAT string with the help of the - ;; SPEC-ALIST and returns a list that can be eval'ed to return a - ;; string. - (let ((xemacs-mule-p (and (featurep 'xemacs) (featurep 'mule))) - max-width - spec flist fstring elem result dontinsert user-defined - type value pad-width spec-beg cut-width ignore-value - tilde-form tilde elem-type) - (save-excursion - (gnus-set-work-buffer) - (insert format) - (goto-char (point-min)) - (while (search-forward "%" nil t) - (setq user-defined nil - spec-beg nil - pad-width nil - max-width nil - cut-width nil - ignore-value nil - tilde-form nil) - (setq spec-beg (1- (point))) - - ;; Parse this spec fully. - (while - (cond - ((looking-at "\\([-.0-9]+\\)\\(,[-0-9]+\\)?") - (setq pad-width (string-to-number (match-string 1))) - (when (match-beginning 2) - (setq max-width (string-to-number (buffer-substring - (1+ (match-beginning 2)) - (match-end 2))))) - (goto-char (match-end 0))) - ((looking-at "~") - (forward-char 1) - (setq tilde (read (current-buffer)) - type (car tilde) - value (cadr tilde)) - (cond - ((memq type '(pad pad-left)) - (setq pad-width value)) - ((eq type 'pad-right) - (setq pad-width (- value))) - ((memq type '(max-right max)) - (setq max-width value)) - ((eq type 'max-left) - (setq max-width (- value))) - ((memq type '(cut cut-left)) - (setq cut-width value)) - ((eq type 'cut-right) - (setq cut-width (- value))) - ((eq type 'ignore) - (setq ignore-value - (if (stringp value) value (format "%s" value)))) - ((eq type 'form) - (setq tilde-form value)) - (t - (error "Unknown tilde type: %s" tilde))) - t) - (t - nil))) - ;; User-defined spec -- find the spec name. - (when (eq (setq spec (char-after)) ?u) - (forward-char 1) - (setq user-defined (char-after))) - (forward-char 1) - (delete-region spec-beg (point)) - - ;; Now we have all the relevant data on this spec, so - ;; we start doing stuff. - (insert "%") - (if (eq spec ?%) - ;; "%%" just results in a "%". - (insert "%") - (cond - ;; Do tilde forms. - ((eq spec ?@) - (setq elem (list tilde-form ?s))) - ;; Treat user defined format specifiers specially. - (user-defined - (setq elem - (list - (list (intern (format "gnus-user-format-function-%c" - user-defined)) - 'gnus-tmp-header) - ?s))) - ;; Find the specification from `spec-alist'. - ((setq elem (cdr (assq spec spec-alist)))) - (t - (setq elem '("*" ?s)))) - (setq elem-type (cadr elem)) - ;; Insert the new format elements. - (and pad-width (not xemacs-mule-p) - (insert (number-to-string pad-width))) - ;; Create the form to be evaled. - (if (or max-width cut-width ignore-value - (and pad-width xemacs-mule-p)) - (progn - (insert ?s) - (let ((el (car elem))) - (cond ((= (cadr elem) ?c) - (setq el (list 'char-to-string el))) - ((= (cadr elem) ?d) - (setq el (list 'int-to-string el)))) - (when ignore-value - (setq el (gnus-tilde-ignore-form el ignore-value))) - (when cut-width - (setq el (gnus-tilde-cut-form el cut-width))) - (when max-width - (setq el (gnus-tilde-max-form el max-width))) - (and pad-width xemacs-mule-p - (setq el (gnus-tilde-pad-form el pad-width))) - (push el flist))) - (insert elem-type) - (push (car elem) flist)))) - (setq fstring (buffer-string))) - - ;; Do some postprocessing to increase efficiency. - (setq - result - (cond - ;; Emptyness. - ((string= fstring "") - nil) - ;; Not a format string. - ((not (string-match "%" fstring)) - (list fstring)) - ;; A format string with just a single string spec. - ((string= fstring "%s") - (list (car flist))) - ;; A single character. - ((string= fstring "%c") - (list (car flist))) - ;; A single number. - ((string= fstring "%d") - (setq dontinsert) - (if insert - (list `(princ ,(car flist))) - (list `(int-to-string ,(car flist))))) - ;; Just lots of chars and strings. - ((string-match "\\`\\(%[cs]\\)+\\'" fstring) - (nreverse flist)) - ;; A single string spec at the beginning of the spec. - ((string-match "\\`%[sc][^%]+\\'" fstring) - (list (car flist) (substring fstring 2))) - ;; A single string spec in the middle of the spec. - ((string-match "\\`\\([^%]+\\)%[sc]\\([^%]+\\)\\'" fstring) - (list (match-string 1 fstring) (car flist) (match-string 2 fstring))) - ;; A single string spec in the end of the spec. - ((string-match "\\`\\([^%]+\\)%[sc]\\'" fstring) - (list (match-string 1 fstring) (car flist))) - ;; A more complex spec. - (t - (list (cons 'format (cons fstring (nreverse flist))))))) - - (if insert - (when result - (if dontinsert - result - (cons 'insert result))) - (cond ((stringp result) - result) - ((consp result) - (cons 'concat result)) - (t ""))))) - -(defun gnus-eval-format (format &optional alist props) - "Eval the format variable FORMAT, using ALIST. -If PROPS, insert the result." - (let ((form (gnus-parse-format format alist props))) - (if props - (gnus-add-text-properties (point) (progn (eval form) (point)) props) - (eval form)))) - -(defun gnus-compile () - "Byte-compile the user-defined format specs." - (interactive) - (require 'bytecomp) - (let ((entries gnus-format-specs) - (byte-compile-warnings '(unresolved callargs redefine)) - entry type compiled-function) - (save-excursion - (gnus-message 7 "Compiling format specs...") - - (while entries - (setq entry (pop entries) - type (car entry)) - (if (memq type '(gnus-version version)) - (setq gnus-format-specs (delq entry gnus-format-specs)) - (let ((form (caddr entry))) - (when (and (listp form) - ;; Under GNU Emacs, it's (byte-code ...) - (not (eq 'byte-code (car form))) - ;; Under XEmacs, it's (funcall #) - (not (and (eq 'funcall (car form)) - (byte-code-function-p (cadr form))))) - (defalias 'gnus-tmp-func `(lambda () ,form)) - (byte-compile 'gnus-tmp-func) - (setq compiled-function (gnus-byte-code 'gnus-tmp-func)) - (set (intern (format "gnus-%s-line-format-spec" type)) - compiled-function) - (let ((elem (cdr (assq type gnus-format-specs-compiled)))) - (if elem - (set-alist 'elem (cadr entry) compiled-function) - (setq elem (list (cadr entry) compiled-function))) - (set-alist 'gnus-format-specs-compiled type elem)))))) - - (push (cons 'version emacs-version) gnus-format-specs) - (gnus-message 7 "Compiling user specs...done")))) - -(defun gnus-set-format (type &optional insertable) - (set (intern (format "gnus-%s-line-format-spec" type)) - (gnus-parse-format - (symbol-value (intern (format "gnus-%s-line-format" type))) - (symbol-value (intern (format "gnus-%s-line-format-alist" type))) - insertable))) - -(gnus-ems-redefine) - -(provide 'gnus-spec) - -;; Local Variables: -;; coding: iso-8859-1 -;; End: - -;;; gnus-spec.el ends here diff --git a/lisp/gnus-srvr.el b/lisp/gnus-srvr.el deleted file mode 100644 index bc9df3d..0000000 --- a/lisp/gnus-srvr.el +++ /dev/null @@ -1,912 +0,0 @@ -;;; gnus-srvr.el --- virtual server support for Gnus -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus) -(require 'gnus-spec) -(require 'gnus-group) -(require 'gnus-int) -(require 'gnus-range) - -(defvar gnus-server-mode-hook nil - "Hook run in `gnus-server-mode' buffers.") - -(defconst gnus-server-line-format " {%(%h:%w%)} %s%a\n" - "Format of server lines. -It works along the same lines as a normal formatting string, -with some simple extensions. - -The following specs are understood: - -%h backend -%n name -%w address -%s status -%a agent covered") - -(defvar gnus-server-mode-line-format "Gnus: %%b" - "The format specification for the server mode line.") - -(defvar gnus-server-exit-hook nil - "*Hook run when exiting the server buffer.") - -(defvar gnus-server-browse-in-group-buffer nil - "Whether browse server in group buffer.") - -;;; Internal variables. - -(defvar gnus-inserted-opened-servers nil) - -(defvar gnus-server-line-format-alist - `((?h gnus-tmp-how ?s) - (?n gnus-tmp-name ?s) - (?w gnus-tmp-where ?s) - (?s gnus-tmp-status ?s) - (?a gnus-tmp-agent ?s))) - -(defvar gnus-server-mode-line-format-alist - `((?S gnus-tmp-news-server ?s) - (?M gnus-tmp-news-method ?s) - (?u gnus-tmp-user-defined ?s))) - -(defvar gnus-server-line-format-spec nil) -(defvar gnus-server-mode-line-format-spec nil) -(defvar gnus-server-killed-servers nil) - -(defvar gnus-server-mode-map) - -(defvar gnus-server-menu-hook nil - "*Hook run after the creation of the server mode menu.") - -(defun gnus-server-make-menu-bar () - (gnus-turn-off-edit-menu 'server) - (unless (boundp 'gnus-server-server-menu) - (easy-menu-define - gnus-server-server-menu gnus-server-mode-map "" - '("Server" - ["Add" gnus-server-add-server t] - ["Browse" gnus-server-read-server t] - ["Scan" gnus-server-scan-server t] - ["List" gnus-server-list-servers t] - ["Kill" gnus-server-kill-server t] - ["Yank" gnus-server-yank-server t] - ["Copy" gnus-server-copy-server t] - ["Edit" gnus-server-edit-server t] - ["Regenerate" gnus-server-regenerate-server t] - ["Exit" gnus-server-exit t])) - - (easy-menu-define - gnus-server-connections-menu gnus-server-mode-map "" - '("Connections" - ["Open" gnus-server-open-server t] - ["Close" gnus-server-close-server t] - ["Deny" gnus-server-deny-server t] - "---" - ["Open All" gnus-server-open-all-servers t] - ["Close All" gnus-server-close-all-servers t] - ["Reset All" gnus-server-remove-denials t])) - - (gnus-run-hooks 'gnus-server-menu-hook))) - -(defvar gnus-server-mode-map nil) -(put 'gnus-server-mode 'mode-class 'special) - -(unless gnus-server-mode-map - (setq gnus-server-mode-map (make-sparse-keymap)) - (suppress-keymap gnus-server-mode-map) - - (gnus-define-keys gnus-server-mode-map - " " gnus-server-read-server-in-server-buffer - "\r" gnus-server-read-server - gnus-mouse-2 gnus-server-pick-server - "q" gnus-server-exit - "l" gnus-server-list-servers - "k" gnus-server-kill-server - "y" gnus-server-yank-server - "c" gnus-server-copy-server - "a" gnus-server-add-server - "e" gnus-server-edit-server - "s" gnus-server-scan-server - - "O" gnus-server-open-server - "\M-o" gnus-server-open-all-servers - "C" gnus-server-close-server - "\M-c" gnus-server-close-all-servers - "D" gnus-server-deny-server - "R" gnus-server-remove-denials - - "n" next-line - "p" previous-line - - "g" gnus-server-regenerate-server - - "\C-c\C-i" gnus-info-find-node - "\C-c\C-b" gnus-bug)) - -(defface gnus-server-agent-face - '((((class color) (background light)) (:foreground "PaleTurquoise" :bold t)) - (((class color) (background dark)) (:foreground "PaleTurquoise" :bold t)) - (t (:bold t))) - "Face used for displaying AGENTIZED servers" - :group 'gnus-server-visual) - -(defface gnus-server-opened-face - '((((class color) (background light)) (:foreground "Green3" :bold t)) - (((class color) (background dark)) (:foreground "Green1" :bold t)) - (t (:bold t))) - "Face used for displaying OPENED servers" - :group 'gnus-server-visual) - -(defface gnus-server-closed-face - '((((class color) (background light)) (:foreground "Steel Blue" :italic t)) - (((class color) (background dark)) - (:foreground "Light Steel Blue" :italic t)) - (t (:italic t))) - "Face used for displaying CLOSED servers" - :group 'gnus-server-visual) - -(defface gnus-server-denied-face - '((((class color) (background light)) (:foreground "Red" :bold t)) - (((class color) (background dark)) (:foreground "Pink" :bold t)) - (t (:inverse-video t :bold t))) - "Face used for displaying DENIED servers" - :group 'gnus-server-visual) - -(defcustom gnus-server-agent-face 'gnus-server-agent-face - "Face name to use on AGENTIZED servers." - :group 'gnus-server-visual - :type 'face) - -(defcustom gnus-server-opened-face 'gnus-server-opened-face - "Face name to use on OPENED servers." - :group 'gnus-server-visual - :type 'face) - -(defcustom gnus-server-closed-face 'gnus-server-closed-face - "Face name to use on CLOSED servers." - :group 'gnus-server-visual - :type 'face) - -(defcustom gnus-server-denied-face 'gnus-server-denied-face - "Face name to use on DENIED servers." - :group 'gnus-server-visual - :type 'face) - -(defvar gnus-server-font-lock-keywords - (list - '("(\\(agent\\))" 1 gnus-server-agent-face) - '("(\\(opened\\))" 1 gnus-server-opened-face) - '("(\\(closed\\))" 1 gnus-server-closed-face) - '("(\\(denied\\))" 1 gnus-server-denied-face))) - -(defun gnus-server-mode () - "Major mode for listing and editing servers. - -All normal editing commands are switched off. -\\ -For more in-depth information on this mode, read the manual -(`\\[gnus-info-find-node]'). - -The following commands are available: - -\\{gnus-server-mode-map}" - (interactive) - (when (gnus-visual-p 'server-menu 'menu) - (gnus-server-make-menu-bar)) - (kill-all-local-variables) - (gnus-simplify-mode-line) - (setq major-mode 'gnus-server-mode) - (setq mode-name "Server") - (gnus-set-default-directory) - (setq mode-line-process nil) - (use-local-map gnus-server-mode-map) - (buffer-disable-undo) - (setq truncate-lines t) - (setq buffer-read-only t) - (if (featurep 'xemacs) - (put 'gnus-server-mode 'font-lock-defaults '(gnus-server-font-lock-keywords t)) - (set (make-local-variable 'font-lock-defaults) - '(gnus-server-font-lock-keywords t))) - (gnus-run-hooks 'gnus-server-mode-hook)) - -(defun gnus-server-insert-server-line (gnus-tmp-name method) - (let* ((gnus-tmp-how (car method)) - (gnus-tmp-where (nth 1 method)) - (elem (assoc method gnus-opened-servers)) - (gnus-tmp-status (cond ((eq (nth 1 elem) 'denied) - "(denied)") - ((or (gnus-server-opened method) - (eq (nth 1 elem) 'ok)) - "(opened)") - (t - "(closed)"))) - (gnus-tmp-agent (if (and gnus-agent - (member method - gnus-agent-covered-methods)) - " (agent)" - ""))) - (beginning-of-line) - (gnus-add-text-properties - (point) - (prog1 (1+ (point)) - ;; Insert the text. - (eval gnus-server-line-format-spec)) - (list 'gnus-server (intern gnus-tmp-name))))) - -(defun gnus-enter-server-buffer () - "Set up the server buffer." - (gnus-server-setup-buffer) - (gnus-configure-windows 'server) - (gnus-server-prepare)) - -(defun gnus-server-setup-buffer () - "Initialize the server buffer." - (unless (get-buffer gnus-server-buffer) - (save-excursion - (set-buffer (gnus-get-buffer-create gnus-server-buffer)) - (gnus-server-mode) - (when gnus-carpal - (gnus-carpal-setup-buffer 'server))))) - -(defun gnus-server-prepare () - (gnus-set-format 'server-mode) - (gnus-set-format 'server t) - (let ((alist gnus-server-alist) - (buffer-read-only nil) - (opened gnus-opened-servers) - done server op-ser) - (erase-buffer) - (setq gnus-inserted-opened-servers nil) - ;; First we do the real list of servers. - (while alist - (unless (member (cdar alist) done) - (push (cdar alist) done) - (cdr (setq server (pop alist))) - (when (and server (car server) (cdr server)) - (gnus-server-insert-server-line (car server) (cdr server)))) - (when (member (cdar alist) done) - (pop alist))) - ;; Then we insert the list of servers that have been opened in - ;; this session. - (while opened - (when (and (not (member (caar opened) done)) - ;; Just ignore ephemeral servers. - (not (member (caar opened) gnus-ephemeral-servers))) - (push (caar opened) done) - (gnus-server-insert-server-line - (setq op-ser (format "%s:%s" (caaar opened) (nth 1 (caar opened)))) - (caar opened)) - (push (list op-ser (caar opened)) gnus-inserted-opened-servers)) - (setq opened (cdr opened)))) - (goto-char (point-min)) - (gnus-server-position-point)) - -(defun gnus-server-server-name () - (let ((server (get-text-property (gnus-point-at-bol) 'gnus-server))) - (and server (symbol-name server)))) - -(defalias 'gnus-server-position-point 'gnus-goto-colon) - -(defconst gnus-server-edit-buffer "*Gnus edit server*") - -(defun gnus-server-update-server (server) - (save-excursion - (set-buffer gnus-server-buffer) - (let* ((buffer-read-only nil) - (entry (assoc server gnus-server-alist)) - (oentry (assoc (gnus-server-to-method server) - gnus-opened-servers))) - (when entry - (gnus-dribble-enter - (concat "(gnus-server-set-info \"" server "\" '" - (prin1-to-string (cdr entry)) ")\n"))) - (when (or entry oentry) - ;; Buffer may be narrowed. - (save-restriction - (widen) - (when (gnus-server-goto-server server) - (gnus-delete-line)) - (if entry - (gnus-server-insert-server-line (car entry) (cdr entry)) - (gnus-server-insert-server-line - (format "%s:%s" (caar oentry) (nth 1 (car oentry))) - (car oentry))) - (gnus-server-position-point)))))) - -(defun gnus-server-set-info (server info) - ;; Enter a select method into the virtual server alist. - (when (and server info) - (gnus-dribble-enter - (concat "(gnus-server-set-info \"" server "\" '" - (prin1-to-string info) ")")) - (let* ((server (nth 1 info)) - (entry (assoc server gnus-server-alist))) - (if entry (setcdr entry info) - (setq gnus-server-alist - (nconc gnus-server-alist (list (cons server info)))))))) - -;;; Interactive server functions. - -(defun gnus-server-kill-server (server) - "Kill the server on the current line." - (interactive (list (gnus-server-server-name))) - (unless (gnus-server-goto-server server) - (if server (error "No such server: %s" server) - (error "No server on the current line"))) - (unless (assoc server gnus-server-alist) - (error "Read-only server %s" server)) - (gnus-dribble-touch) - (let ((buffer-read-only nil)) - (gnus-delete-line)) - (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 () - "Yank the previously killed server." - (interactive) - (unless gnus-server-killed-servers - (error "No killed servers to be yanked")) - (let ((alist gnus-server-alist) - (server (gnus-server-server-name)) - (killed (car gnus-server-killed-servers))) - (if (not server) - (setq gnus-server-alist (nconc gnus-server-alist (list killed))) - (if (string= server (caar gnus-server-alist)) - (push killed gnus-server-alist) - (while (and (cdr alist) - (not (string= server (caadr alist)))) - (setq alist (cdr alist))) - (if alist - (setcdr alist (cons killed (cdr alist))) - (setq gnus-server-alist (list killed))))) - (gnus-server-update-server (car killed)) - (setq gnus-server-killed-servers (cdr gnus-server-killed-servers)) - (gnus-server-position-point))) - -(defun gnus-server-exit () - "Return to the group buffer." - (interactive) - (gnus-run-hooks 'gnus-server-exit-hook) - (kill-buffer (current-buffer)) - (gnus-configure-windows 'group t)) - -(defun gnus-server-list-servers () - "List all available servers." - (interactive) - (let ((cur (gnus-server-server-name))) - (gnus-server-prepare) - (if cur (gnus-server-goto-server cur) - (goto-char (point-max)) - (forward-line -1)) - (gnus-server-position-point))) - -(defun gnus-server-set-status (method status) - "Make METHOD have STATUS." - (let ((entry (assoc method gnus-opened-servers))) - (if entry - (setcar (cdr entry) status) - (push (list method status) gnus-opened-servers)))) - -(defun gnus-opened-servers-remove (method) - "Remove METHOD from the list of opened servers." - (setq gnus-opened-servers (delq (assoc method gnus-opened-servers) - gnus-opened-servers))) - -(defun gnus-server-open-server (server) - "Force an open of SERVER." - (interactive (list (gnus-server-server-name))) - (let ((method (gnus-server-to-method server))) - (unless method - (error "No such server: %s" server)) - (gnus-server-set-status method 'ok) - (prog1 - (or (gnus-open-server method) - (progn (message "Couldn't open %s" server) nil)) - (gnus-server-update-server server) - (gnus-server-position-point)))) - -(defun gnus-server-open-all-servers () - "Open all servers." - (interactive) - (let ((servers gnus-inserted-opened-servers)) - (while servers - (gnus-server-open-server (car (pop servers)))))) - -(defun gnus-server-close-server (server) - "Close SERVER." - (interactive (list (gnus-server-server-name))) - (let ((method (gnus-server-to-method server))) - (unless method - (error "No such server: %s" server)) - (gnus-server-set-status method 'closed) - (prog1 - (gnus-close-server method) - (gnus-server-update-server server) - (gnus-server-position-point)))) - -(defun gnus-server-close-all-servers () - "Close all servers." - (interactive) - (dolist (server gnus-inserted-opened-servers) - (gnus-server-close-server (car server)))) - -(defun gnus-server-deny-server (server) - "Make sure SERVER will never be attempted opened." - (interactive (list (gnus-server-server-name))) - (let ((method (gnus-server-to-method server))) - (unless method - (error "No such server: %s" server)) - (gnus-server-set-status method 'denied)) - (gnus-server-update-server server) - (gnus-server-position-point) - t) - -(defun gnus-server-remove-denials () - "Make all denied servers into closed servers." - (interactive) - (dolist (server gnus-opened-servers) - (when (eq (nth 1 server) 'denied) - (setcar (nthcdr 1 server) 'closed))) - (gnus-server-list-servers)) - -(defun gnus-server-copy-server (from to) - (interactive - (list - (or (gnus-server-server-name) - (error "No server on the current line")) - (read-string "Copy to: "))) - (unless from - (error "No server on current line")) - (unless (and to (not (string= to ""))) - (error "No name to copy to")) - (when (assoc to gnus-server-alist) - (error "%s already exists" to)) - (unless (gnus-server-to-method from) - (error "%s: no such server" from)) - (let ((to-entry (cons from (gnus-copy-sequence - (gnus-server-to-method from))))) - (setcar to-entry to) - (setcar (nthcdr 2 to-entry) to) - (push to-entry gnus-server-killed-servers) - (gnus-server-yank-server))) - -(defun gnus-server-add-server (how where) - (interactive - (list (intern (completing-read "Server method: " - gnus-valid-select-methods nil t)) - (read-string "Server name: "))) - (when (assq where gnus-server-alist) - (error "Server with that name already defined")) - (push (list where how where) gnus-server-killed-servers) - (gnus-server-yank-server)) - -(defun gnus-server-goto-server (server) - "Jump to a server line." - (interactive - (list (completing-read "Goto server: " gnus-server-alist nil t))) - (let ((to (text-property-any (point-min) (point-max) - 'gnus-server (intern server)))) - (when to - (goto-char to) - (gnus-server-position-point)))) - -(defun gnus-server-edit-server (server) - "Edit the server on the current line." - (interactive (list (gnus-server-server-name))) - (unless server - (error "No server on current line")) - (unless (assoc server gnus-server-alist) - (error "This server can't be edited")) - (let ((info (cdr (assoc server gnus-server-alist)))) - (gnus-close-server info) - (gnus-edit-form - info "Editing the server." - `(lambda (form) - (gnus-server-set-info ,server form) - (gnus-server-list-servers) - (gnus-server-position-point))))) - -(defun gnus-server-scan-server (server) - "Request a scan from the current server." - (interactive (list (gnus-server-server-name))) - (let ((method (gnus-server-to-method server))) - (if (not (gnus-get-function method 'request-scan)) - (error "Server %s can't scan" (car method)) - (gnus-message 3 "Scanning %s..." server) - (gnus-request-scan nil method) - (gnus-message 3 "Scanning %s...done" server)))) - -(defun gnus-server-read-server-in-server-buffer (server) - "Browse a server in server buffer." - (interactive (list (gnus-server-server-name))) - (let (gnus-server-browse-in-group-buffer) - (gnus-server-read-server server))) - -(defun gnus-server-read-server (server) - "Browse a server." - (interactive (list (gnus-server-server-name))) - (let ((buf (current-buffer))) - (prog1 - (gnus-browse-foreign-server server buf) - (save-excursion - (set-buffer buf) - (gnus-server-update-server (gnus-server-server-name)) - (gnus-server-position-point))))) - -(defun gnus-server-pick-server (e) - (interactive "e") - (mouse-set-point e) - (gnus-server-read-server (gnus-server-server-name))) - - -;;; -;;; Browse Server Mode -;;; - -(defvar gnus-browse-menu-hook nil - "*Hook run after the creation of the browse mode menu.") - -(defvar gnus-browse-mode-hook nil) -(defvar gnus-browse-mode-map nil) -(put 'gnus-browse-mode 'mode-class 'special) - -(unless gnus-browse-mode-map - (setq gnus-browse-mode-map (make-keymap)) - (suppress-keymap gnus-browse-mode-map) - - (gnus-define-keys - gnus-browse-mode-map - " " gnus-browse-read-group - "=" gnus-browse-select-group - "n" gnus-browse-next-group - "p" gnus-browse-prev-group - "\177" gnus-browse-prev-group - [delete] gnus-browse-prev-group - "N" gnus-browse-next-group - "P" gnus-browse-prev-group - "\M-n" gnus-browse-next-group - "\M-p" gnus-browse-prev-group - "\r" gnus-browse-select-group - "u" gnus-browse-unsubscribe-current-group - "l" gnus-browse-exit - "L" gnus-browse-exit - "q" gnus-browse-exit - "Q" gnus-browse-exit - "\C-c\C-c" gnus-browse-exit - "?" gnus-browse-describe-briefly - - "\C-c\C-i" gnus-info-find-node - "\C-c\C-b" gnus-bug)) - -(defun gnus-browse-make-menu-bar () - (gnus-turn-off-edit-menu 'browse) - (unless (boundp 'gnus-browse-menu) - (easy-menu-define - gnus-browse-menu gnus-browse-mode-map "" - '("Browse" - ["Subscribe" gnus-browse-unsubscribe-current-group t] - ["Read" gnus-browse-read-group t] - ["Select" gnus-browse-select-group t] - ["Next" gnus-browse-next-group t] - ["Prev" gnus-browse-prev-group t] - ["Exit" gnus-browse-exit t])) - (gnus-run-hooks 'gnus-browse-menu-hook))) - -(defvar gnus-browse-current-method nil) -(defvar gnus-browse-return-buffer nil) - -(defvar gnus-browse-buffer "*Gnus Browse Server*") - -(defun gnus-browse-foreign-server (server &optional return-buffer) - "Browse the server SERVER." - (setq gnus-browse-current-method (gnus-server-to-method server)) - (setq gnus-browse-return-buffer return-buffer) - (let* ((method gnus-browse-current-method) - (orig-select-method gnus-select-method) - (gnus-select-method method) - groups group) - (gnus-message 5 "Connecting to %s..." (nth 1 method)) - (cond - ((not (gnus-check-server method)) - (gnus-message - 1 "Unable to contact server %s: %s" (nth 1 method) - (gnus-status-message method)) - nil) - ((not - (prog2 - (gnus-message 6 "Reading active file...") - (gnus-request-list method) - (gnus-message 6 "Reading active file...done"))) - (gnus-message - 1 "Couldn't request list: %s" (gnus-status-message method)) - nil) - (t - (save-excursion - (set-buffer nntp-server-buffer) - (let ((cur (current-buffer))) - (goto-char (point-min)) - (unless (string= gnus-ignored-newsgroups "") - (delete-matching-lines gnus-ignored-newsgroups)) - (while (not (eobp)) - (ignore-errors - (push (cons - (if (eq (char-after) ?\") - (read cur) - (let ((p (point)) (name "")) - (skip-chars-forward "^ \t\\\\") - (setq name (buffer-substring p (point))) - (while (eq (char-after) ?\\) - (setq p (1+ (point))) - (forward-char 2) - (skip-chars-forward "^ \t\\\\") - (setq name (concat name (buffer-substring - p (point))))) - name)) - (let ((last (read cur))) - (cons (read cur) last))) - groups)) - (forward-line)))) - (setq groups (sort groups - (lambda (l1 l2) - (string< (car l1) (car l2))))) - (if gnus-server-browse-in-group-buffer - (let* ((gnus-select-method orig-select-method) - (gnus-group-listed-groups - (mapcar (lambda (group) - (let ((name - (gnus-group-prefixed-name - (car group) method))) - (gnus-set-active name (cdr group)) - name)) - groups))) - (gnus-configure-windows 'group) - (funcall gnus-group-prepare-function - gnus-level-killed 'ignore 1 'ingore)) - (gnus-get-buffer-create gnus-browse-buffer) - (when gnus-carpal - (gnus-carpal-setup-buffer 'browse)) - (gnus-configure-windows 'browse) - (buffer-disable-undo) - (let ((buffer-read-only nil)) - (erase-buffer)) - (gnus-browse-mode) - (setq mode-line-buffer-identification - (list - (format - "Gnus: %%b {%s:%s}" (car method) (cadr method)))) - (let ((buffer-read-only nil) charset) - (while groups - (setq group (car groups)) - (setq charset (gnus-group-name-charset method group)) - (gnus-add-text-properties - (point) - (prog1 (1+ (point)) - (insert - (format "%c%7d: %s\n" - (let ((level - (let ((gnus-select-method orig-select-method)) - (gnus-group-level - (gnus-group-prefixed-name (car group) - method))))) - (cond - ((<= level gnus-level-subscribed) ? ) - ((<= level gnus-level-unsubscribed) ?U) - ((= level gnus-level-zombie) ?Z) - (t ?K))) - (max 0 (- (1+ (cddr group)) (cadr group))) - (gnus-group-name-decode (car group) charset)))) - (list 'gnus-group (car group))) - (setq groups (cdr groups)))) - (switch-to-buffer (current-buffer))) - (goto-char (point-min)) - (gnus-group-position-point) - (gnus-message 5 "Connecting to %s...done" (nth 1 method)) - t)))) - -(defun gnus-browse-mode () - "Major mode for browsing a foreign server. - -All normal editing commands are switched off. - -\\ -The only things you can do in this buffer is - -1) `\\[gnus-browse-unsubscribe-current-group]' to subscribe to a group. -The group will be inserted into the group buffer upon exit from this -buffer. - -2) `\\[gnus-browse-read-group]' to read a group ephemerally. - -3) `\\[gnus-browse-exit]' to return to the group buffer." - (interactive) - (kill-all-local-variables) - (when (gnus-visual-p 'browse-menu 'menu) - (gnus-browse-make-menu-bar)) - (gnus-simplify-mode-line) - (setq major-mode 'gnus-browse-mode) - (setq mode-name "Browse Server") - (setq mode-line-process nil) - (use-local-map gnus-browse-mode-map) - (buffer-disable-undo) - (setq truncate-lines t) - (gnus-set-default-directory) - (setq buffer-read-only t) - (gnus-run-hooks 'gnus-browse-mode-hook)) - -(defun gnus-browse-read-group (&optional no-article) - "Enter the group at the current line." - (interactive) - (let ((group (gnus-browse-group-name))) - (if (or (not (gnus-get-info group)) - (gnus-ephemeral-group-p group)) - (unless (gnus-group-read-ephemeral-group - (gnus-group-real-name group) gnus-browse-current-method nil - (cons (current-buffer) 'browse)) - (error "Couldn't enter %s" group)) - (unless (gnus-group-read-group nil no-article group) - (error "Couldn't enter %s" group))))) - -(defun gnus-browse-select-group () - "Select the current group." - (interactive) - (gnus-browse-read-group 'no)) - -(defun gnus-browse-next-group (n) - "Go to the next group." - (interactive "p") - (prog1 - (forward-line n) - (gnus-group-position-point))) - -(defun gnus-browse-prev-group (n) - "Go to the next group." - (interactive "p") - (gnus-browse-next-group (- n))) - -(defun gnus-browse-unsubscribe-current-group (arg) - "(Un)subscribe to the next ARG groups." - (interactive "p") - (when (eobp) - (error "No group at current line")) - (let ((ward (if (< arg 0) -1 1)) - (arg (abs arg))) - (while (and (> arg 0) - (not (eobp)) - (gnus-browse-unsubscribe-group) - (zerop (gnus-browse-next-group ward))) - (decf arg)) - (gnus-group-position-point) - (when (/= 0 arg) - (gnus-message 7 "No more newsgroups")) - arg)) - -(defun gnus-browse-group-name () - (save-excursion - (beginning-of-line) - (let ((name (get-text-property (point) 'gnus-group))) - (when (re-search-forward ": \\(.*\\)$" (gnus-point-at-eol) t) - (gnus-group-prefixed-name - (or name - (match-string-no-properties 1)) - gnus-browse-current-method))))) - -(defun gnus-browse-unsubscribe-group () - "Toggle subscription of the current group in the browse buffer." - (let ((sub nil) - (buffer-read-only nil) - group) - (save-excursion - (beginning-of-line) - ;; If this group it killed, then we want to subscribe it. - (unless (eq (char-after) ? ) - (setq sub t)) - (setq group (gnus-browse-group-name)) - ;;;; - ;;(when (and sub - ;; (cadr (gnus-gethash group gnus-newsrc-hashtb))) - ;;(error "Group already subscribed")) - (if sub - (progn - ;; Make sure the group has been properly removed before we - ;; subscribe to it. - (gnus-kill-ephemeral-group group) - (gnus-group-change-level - (list t group gnus-level-default-subscribed - nil nil (if (gnus-server-equal - gnus-browse-current-method "native") - nil - (gnus-method-simplify - gnus-browse-current-method))) - gnus-level-default-subscribed (gnus-group-level group) - (and (car (nth 1 gnus-newsrc-alist)) - (gnus-gethash (car (nth 1 gnus-newsrc-alist)) - gnus-newsrc-hashtb)) - t) - (delete-char 1) - (insert ? )) - (gnus-group-change-level - group gnus-level-unsubscribed gnus-level-default-subscribed) - (delete-char 1) - (insert ?U))) - t)) - -(defun gnus-browse-exit () - "Quit browsing and return to the group buffer." - (interactive) - (when (eq major-mode 'gnus-browse-mode) - (kill-buffer (current-buffer))) - ;; Insert the newly subscribed groups in the group buffer. - (save-excursion - (set-buffer gnus-group-buffer) - (gnus-group-list-groups nil)) - (if gnus-browse-return-buffer - (gnus-configure-windows 'server 'force) - (gnus-configure-windows 'group 'force))) - -(defun gnus-browse-describe-briefly () - "Give a one line description of the group mode commands." - (interactive) - (gnus-message 6 - (substitute-command-keys "\\\\[gnus-group-next-group]:Forward \\[gnus-group-prev-group]:Backward \\[gnus-browse-exit]:Exit \\[gnus-info-find-node]:Run Info \\[gnus-browse-describe-briefly]:This help"))) - -(defun gnus-server-regenerate-server () - "Issue a command to the server to regenerate all its data structures." - (interactive) - (let ((server (gnus-server-server-name))) - (unless server - (error "No server on the current line")) - (condition-case () - (gnus-get-function (gnus-server-to-method server) - 'request-regenerate) - (error - (error "This backend doesn't support regeneration"))) - (gnus-message 5 "Requesting regeneration of %s..." server) - (unless (gnus-open-server server) - (error "Couldn't open server")) - (if (gnus-request-regenerate server) - (gnus-message 5 "Requesting regeneration of %s...done" server) - (gnus-message 5 "Couldn't regenerate %s" server)))) - -(provide 'gnus-srvr) - -;;; gnus-srvr.el ends here diff --git a/lisp/gnus-start.el b/lisp/gnus-start.el deleted file mode 100644 index 85762a9..0000000 --- a/lisp/gnus-start.el +++ /dev/null @@ -1,2882 +0,0 @@ -;;; gnus-start.el --- startup functions for Gnus -;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'static)) - -(require 'gnus) -(require 'gnus-win) -(require 'gnus-int) -(require 'gnus-spec) -(require 'gnus-range) -(require 'gnus-util) -(require 'message) - -(defcustom gnus-startup-file (nnheader-concat gnus-home-directory ".newsrc") - "Your `.newsrc' file. -`.newsrc-SERVER' will be used instead if that exists." - :group 'gnus-start - :type 'file) - -(defcustom gnus-product-directory - (nnheader-concat gnus-directory (concat "." gnus-product-name)) - "Product depend data files directory." - :group 'gnus-start - :type '(choice directory (const nil))) - -(defcustom gnus-init-file (nnheader-concat gnus-home-directory ".gnus") - "Your Gnus Emacs-Lisp startup file name. -If a file with the `.el' or `.elc' suffixes exists, it will be read instead." - :group 'gnus-start - :type 'file) - -(defcustom gnus-site-init-file - (condition-case nil - (concat (file-name-directory - (directory-file-name installation-directory)) - "site-lisp/gnus-init") - (error nil)) - "The site-wide Gnus Emacs-Lisp startup file name, or nil if none. -If a file with the `.el' or `.elc' suffixes exists, it will be read instead." - :group 'gnus-start - :type '(choice file (const nil))) - -(defcustom gnus-default-subscribed-newsgroups nil - "List of newsgroups to subscribe, when a user runs Gnus the first time. -The value should be a list of strings. -If it is t, Gnus will not do anything special the first time it is -started; it'll just use the normal newsgroups subscription methods." - :group 'gnus-start - :type '(choice (repeat string) (const :tag "Nothing special" t))) - -(defcustom gnus-use-dribble-file t - "*Non-nil means that Gnus will use a dribble file to store user updates. -If Emacs should crash without saving the .newsrc files, complete -information can be restored from the dribble file." - :group 'gnus-dribble-file - :type 'boolean) - -(defcustom gnus-dribble-directory nil - "*The directory where dribble files will be saved. -If this variable is nil, the directory where the .newsrc files are -saved will be used." - :group 'gnus-dribble-file - :type '(choice directory (const nil))) - -(defcustom gnus-check-new-newsgroups 'ask-server - "*Non-nil means that Gnus will run `gnus-find-new-newsgroups' at startup. -This normally finds new newsgroups by comparing the active groups the -servers have already reported with those Gnus already knows, either alive -or killed. - -When any of the following are true, `gnus-find-new-newsgroups' will instead -ask the servers (primary, secondary, and archive servers) to list new -groups since the last time it checked: - 1. This variable is `ask-server'. - 2. This variable is a list of select methods (see below). - 3. `gnus-read-active-file' is nil or `some'. - 4. A prefix argument is given to `gnus-find-new-newsgroups' interactively. - -Thus, if this variable is `ask-server' or a list of select methods or -`gnus-read-active-file' is nil or `some', then the killed list is no -longer necessary, so you could safely set `gnus-save-killed-list' to nil. - -This variable can be a list of select methods which Gnus will query with -the `ask-server' method in addition to the primary, secondary, and archive -servers. - -Eg. - (setq gnus-check-new-newsgroups - '((nntp \"some.server\") (nntp \"other.server\"))) - -If this variable is nil, then you have to tell Gnus explicitly to -check for new newsgroups with \\\\[gnus-find-new-newsgroups]." - :group 'gnus-start - :type '(choice (const :tag "no" nil) - (const :tag "by brute force" t) - (const :tag "ask servers" ask-server) - (repeat :menu-tag "ask additional servers" - :tag "ask additional servers" - :value ((nntp "")) - (sexp :format "%v")))) - -(defcustom gnus-check-bogus-newsgroups nil - "*Non-nil means that Gnus will check and remove bogus newsgroup at startup. -If this variable is nil, then you have to tell Gnus explicitly to -check for bogus newsgroups with \\\\[gnus-group-check-bogus-groups]." - :group 'gnus-start-server - :type 'boolean) - -(defcustom gnus-read-active-file 'some - "*Non-nil means that Gnus will read the entire active file at startup. -If this variable is nil, Gnus will only know about the groups in your -`.newsrc' file. - -If this variable is `some', Gnus will try to only read the relevant -parts of the active file from the server. Not all servers support -this, and it might be quite slow with other servers, but this should -generally be faster than both the t and nil value. - -If you set this variable to nil or `some', you probably still want to -be told about new newsgroups that arrive. To do that, set -`gnus-check-new-newsgroups' to `ask-server'. This may not work -properly with all servers." - :group 'gnus-start-server - :type '(choice (const nil) - (const some) - (const t))) - -(defconst gnus-level-subscribed 5 - "Groups with levels less than or equal to this variable are subscribed.") - -(defconst gnus-level-unsubscribed 7 - "Groups with levels less than or equal to this variable are unsubscribed. -Groups with levels less than `gnus-level-subscribed', which should be -less than this variable, are subscribed.") - -(defconst gnus-level-zombie 8 - "Groups with this level are zombie groups.") - -(defconst gnus-level-killed 9 - "Groups with this level are killed.") - -(defcustom gnus-level-default-subscribed 3 - "*New subscribed groups will be subscribed at this level." - :group 'gnus-group-levels - :type 'integer) - -(defcustom gnus-level-default-unsubscribed 6 - "*New unsubscribed groups will be unsubscribed at this level." - :group 'gnus-group-levels - :type 'integer) - -(defcustom gnus-activate-level (1+ gnus-level-subscribed) - "*Groups higher than this level won't be activated on startup. -Setting this variable to something low might save lots of time when -you have many groups that you aren't interested in." - :group 'gnus-group-levels - :type 'integer) - -(defcustom gnus-activate-foreign-newsgroups 4 - "*If nil, Gnus will not check foreign newsgroups at startup. -If it is non-nil, it should be a number between one and nine. Foreign -newsgroups that have a level lower or equal to this number will be -activated on startup. For instance, if you want to active all -subscribed newsgroups, but not the rest, you'd set this variable to -`gnus-level-subscribed'. - -If you subscribe to lots of newsgroups from different servers, startup -might take a while. By setting this variable to nil, you'll save time, -but you won't be told how many unread articles there are in the -groups." - :group 'gnus-group-levels - :type '(choice integer - (const :tag "none" nil))) - -(defcustom gnus-read-newsrc-file t - "*Non-nil means that Gnus will read the `.newsrc' file. -Gnus always reads its own startup file, which is called -\".newsrc.eld\". The file called \".newsrc\" is in a format that can -be readily understood by other newsreaders. If you don't plan on -using other newsreaders, set this variable to nil to save some time on -entry." - :version "21.1" - :group 'gnus-newsrc - :type 'boolean) - -(defcustom gnus-save-newsrc-file t - "*Non-nil means that Gnus will save the `.newsrc' file. -Gnus always saves its own startup file, which is called -\".newsrc.eld\". The file called \".newsrc\" is in a format that can -be readily understood by other newsreaders. If you don't plan on -using other newsreaders, set this variable to nil to save some time on -exit." - :group 'gnus-newsrc - :type 'boolean) - -(defcustom gnus-save-killed-list t - "*If non-nil, save the list of killed groups to the startup file. -If you set this variable to nil, you'll save both time (when starting -and quitting) and space (both memory and disk), but it will also mean -that Gnus has no record of which groups are new and which are old, so -the automatic new newsgroups subscription methods become meaningless. - -You should always set `gnus-check-new-newsgroups' to `ask-server' or -nil if you set this variable to nil. - -This variable can also be a regexp. In that case, all groups that do -not match this regexp will be removed before saving the list." - :group 'gnus-newsrc - :type 'boolean) - -(defcustom gnus-ignored-newsgroups - (mapconcat 'identity - '("^to\\." ; not "real" groups - "^[0-9. \t]+\\( \\|$\\)" ; all digits in name - "^[\"][]\"[#'()]" ; bogus characters - ) - "\\|") - "*A regexp to match uninteresting newsgroups in the active file. -Any lines in the active file matching this regular expression are -removed from the newsgroup list before anything else is done to it, -thus making them effectively non-existent." - :group 'gnus-group-new - :type 'regexp) - -(defcustom gnus-subscribe-newsgroup-method 'gnus-subscribe-zombies - "*Function(s) called with a group name when new group is detected. -A few pre-made functions are supplied: `gnus-subscribe-randomly' -inserts new groups at the beginning of the list of groups; -`gnus-subscribe-alphabetically' inserts new groups in strict -alphabetic order; `gnus-subscribe-hierarchically' inserts new groups -in hierarchical newsgroup order; `gnus-subscribe-interactively' asks -for your decision; `gnus-subscribe-killed' kills all new groups; -`gnus-subscribe-zombies' will make all new groups into zombies; -`gnus-subscribe-topics' will enter groups into the topics that -claim them." - :group 'gnus-group-new - :type '(radio (function-item gnus-subscribe-randomly) - (function-item gnus-subscribe-alphabetically) - (function-item gnus-subscribe-hierarchically) - (function-item gnus-subscribe-interactively) - (function-item gnus-subscribe-killed) - (function-item gnus-subscribe-zombies) - (function-item gnus-subscribe-topics) - function - (repeat function))) - -(defcustom gnus-subscribe-newsgroup-hooks nil - "*Hooks run after you subscribe to a new group. The hooks will be called -with new group's name as argument." - :group 'gnus-group-new - :type 'hook) - -(defcustom gnus-subscribe-options-newsgroup-method - 'gnus-subscribe-alphabetically - "*Function(s) called to subscribe newsgroups mentioned on \"options -n\" lines. -If, for instance, you want to subscribe to all newsgroups in the -\"no\" and \"alt\" hierarchies, you'd put the following in your -.newsrc file: - -options -n no.all alt.all - -Gnus will the subscribe all new newsgroups in these hierarchies with -the subscription method in this variable." - :group 'gnus-group-new - :type '(radio (function-item gnus-subscribe-randomly) - (function-item gnus-subscribe-alphabetically) - (function-item gnus-subscribe-hierarchically) - (function-item gnus-subscribe-interactively) - (function-item gnus-subscribe-killed) - (function-item gnus-subscribe-zombies) - (function-item gnus-subscribe-topics) - function - (repeat function))) - -(defcustom gnus-subscribe-hierarchical-interactive nil - "*If non-nil, Gnus will offer to subscribe hierarchically. -When a new hierarchy appears, Gnus will ask the user: - -'alt.binaries': Do you want to subscribe to this hierarchy? ([d]ys): - -If the user pressed `d', Gnus will descend the hierarchy, `y' will -subscribe to all newsgroups in the hierarchy and `s' will skip this -hierarchy in its entirety." - :group 'gnus-group-new - :type 'boolean) - -(defcustom gnus-auto-subscribed-groups - "nnml\\|^nnfolder\\|^nnmbox\\|^nnmh\\|^nnbabyl" - "*All new groups that match this regexp will be subscribed automatically. -Note that this variable only deals with new groups. It has no effect -whatsoever on old groups. - -New groups that match this regexp will not be handled by -`gnus-subscribe-newsgroup-method'. Instead, they will -be subscribed using `gnus-subscribe-options-newsgroup-method'." - :group 'gnus-group-new - :type 'regexp) - -(defcustom gnus-options-subscribe nil - "*All new groups matching this regexp will be subscribed unconditionally. -Note that this variable deals only with new newsgroups. This variable -does not affect old newsgroups. - -New groups that match this regexp will not be handled by -`gnus-subscribe-newsgroup-method'. Instead, they will -be subscribed using `gnus-subscribe-options-newsgroup-method'." - :group 'gnus-group-new - :type '(choice regexp - (const :tag "none" nil))) - -(defcustom gnus-options-not-subscribe nil - "*All new groups matching this regexp will be ignored. -Note that this variable deals only with new newsgroups. This variable -does not affect old (already subscribed) newsgroups." - :group 'gnus-group-new - :type '(choice regexp - (const :tag "none" nil))) - -(defcustom gnus-modtime-botch nil - "*Non-nil means .newsrc should be deleted prior to save. -Its use is due to the bogus appearance that .newsrc was modified on -disc." - :group 'gnus-newsrc - :type 'boolean) - -(defcustom gnus-check-bogus-groups-hook nil - "A hook run after removing bogus groups." - :group 'gnus-start-server - :type 'hook) - -(defcustom gnus-startup-hook nil - "A hook called at startup. -This hook is called after Gnus is connected to the NNTP server." - :group 'gnus-start - :type 'hook) - -(defcustom gnus-before-startup-hook nil - "A hook called at before startup. -This hook is called as the first thing when Gnus is started." - :group 'gnus-start - :type 'hook) - -(defcustom gnus-started-hook nil - "A hook called as the last thing after startup." - :group 'gnus-start - :type 'hook) - -(defcustom gnus-setup-news-hook nil - "A hook after reading the .newsrc file, but before generating the buffer." - :group 'gnus-start - :type 'hook) - -(defcustom gnus-get-new-news-hook nil - "A hook run just before Gnus checks for new news." - :group 'gnus-group-new - :type 'hook) - -(defcustom gnus-after-getting-new-news-hook - '(gnus-display-time-event-handler) - "A hook run after Gnus checks for new news when Gnus is already running." - :group 'gnus-group-new - :type 'hook) - -(defcustom gnus-save-newsrc-hook nil - "A hook called before saving any of the newsrc files." - :group 'gnus-newsrc - :type 'hook) - -(defcustom gnus-save-quick-newsrc-hook nil - "A hook called just before saving the quick newsrc file. -Can be used to turn version control on or off." - :group 'gnus-newsrc - :type 'hook) - -(defcustom gnus-save-standard-newsrc-hook nil - "A hook called just before saving the standard newsrc file. -Can be used to turn version control on or off." - :group 'gnus-newsrc - :type 'hook) - -(defcustom gnus-always-read-dribble-file nil - "Unconditionally read the dribble file." - :group 'gnus-newsrc - :type 'boolean) - -(defvar gnus-startup-file-coding-system (static-if (boundp 'MULE) - '*ctext* - 'ctext) - "*Coding system for startup file.") - -(defvar gnus-ding-file-coding-system gnus-startup-file-coding-system - "*Coding system for ding file.") -;; Note that the ding file for T-gnus ought not to have byte-codes. - -;;; Internal variables - -(defvar gnus-newsrc-file-version nil) -(defvar gnus-override-subscribe-method nil) -(defvar gnus-dribble-buffer nil) -(defvar gnus-newsrc-options nil - "Options line in the .newsrc file.") - -(defvar gnus-newsrc-options-n nil - "List of regexps representing groups to be subscribed/ignored unconditionally.") - -(defvar gnus-newsrc-last-checked-date nil - "Date Gnus last asked server for new newsgroups.") - -(defvar gnus-current-startup-file nil - "Startup file for the current host.") - -;; Byte-compiler warning. -(defvar gnus-group-line-format) - -;; Suggested by Brian Edmonds . -(defvar gnus-init-inhibit nil) -(defun gnus-read-init-file (&optional inhibit-next) - ;; Don't load .gnus if the -q option was used. - (when init-file-user - (if gnus-init-inhibit - (setq gnus-init-inhibit nil) - (setq gnus-init-inhibit inhibit-next) - (let ((files (list gnus-site-init-file gnus-init-file)) - file) - (while files - (and (setq file (pop files)) - (or (and (file-exists-p file) - ;; Don't try to load a directory. - (not (file-directory-p file))) - (file-exists-p (concat file ".el")) - (file-exists-p (concat file ".elc"))) - (condition-case var - (load file nil t) - (error - (error "Error in %s: %s" file var))))))))) - -;; For subscribing new newsgroup - -(defun gnus-subscribe-hierarchical-interactive (groups) - (let ((groups (sort groups 'string<)) - prefixes prefix start ans group starts) - (while groups - (setq prefixes (list "^")) - (while (and groups prefixes) - (while (not (string-match (car prefixes) (car groups))) - (setq prefixes (cdr prefixes))) - (setq prefix (car prefixes)) - (setq start (1- (length prefix))) - (if (and (string-match "[^\\.]\\." (car groups) start) - (cdr groups) - (setq prefix - (concat "^" (substring (car groups) 0 (match-end 0)))) - (string-match prefix (cadr groups))) - (progn - (push prefix prefixes) - (message "Descend hierarchy %s? ([y]nsq): " - (substring prefix 1 (1- (length prefix)))) - (while (not (memq (setq ans (read-char-exclusive)) - '(?y ?\n ?\r ?n ?s ?q))) - (ding) - (message "Descend hierarchy %s? ([y]nsq): " - (substring prefix 1 (1- (length prefix))))) - (cond ((= ans ?n) - (while (and groups - (string-match prefix - (setq group (car groups)))) - (push group gnus-killed-list) - (gnus-sethash group group gnus-killed-hashtb) - (setq groups (cdr groups))) - (setq starts (cdr starts))) - ((= ans ?s) - (while (and groups - (string-match prefix - (setq group (car groups)))) - (gnus-sethash group group gnus-killed-hashtb) - (gnus-subscribe-alphabetically (car groups)) - (setq groups (cdr groups))) - (setq starts (cdr starts))) - ((= ans ?q) - (while groups - (setq group (car groups)) - (push group gnus-killed-list) - (gnus-sethash group group gnus-killed-hashtb) - (setq groups (cdr groups)))) - (t nil))) - (message "Subscribe %s? ([n]yq)" (car groups)) - (while (not (memq (setq ans (read-char-exclusive)) - '(?y ?\n ?\r ?q ?n))) - (ding) - (message "Subscribe %s? ([n]yq)" (car groups))) - (setq group (car groups)) - (cond ((= ans ?y) - (gnus-subscribe-alphabetically (car groups)) - (gnus-sethash group group gnus-killed-hashtb)) - ((= ans ?q) - (while groups - (setq group (car groups)) - (push group gnus-killed-list) - (gnus-sethash group group gnus-killed-hashtb) - (setq groups (cdr groups)))) - (t - (push group gnus-killed-list) - (gnus-sethash group group gnus-killed-hashtb))) - (setq groups (cdr groups))))))) - -(defun gnus-subscribe-randomly (newsgroup) - "Subscribe new NEWSGROUP by making it the first newsgroup." - (gnus-subscribe-newsgroup newsgroup)) - -(defun gnus-subscribe-alphabetically (newgroup) - "Subscribe new NEWSGROUP and insert it in alphabetical order." - (let ((groups (cdr gnus-newsrc-alist)) - before) - (while (and (not before) groups) - (if (string< newgroup (caar groups)) - (setq before (caar groups)) - (setq groups (cdr groups)))) - (gnus-subscribe-newsgroup newgroup before))) - -(defun gnus-subscribe-hierarchically (newgroup) - "Subscribe new NEWSGROUP and insert it in hierarchical newsgroup order." - ;; Basic ideas by mike-w@cs.aukuni.ac.nz (Mike Williams) - (save-excursion - (set-buffer (nnheader-find-file-noselect gnus-current-startup-file)) - (prog1 - (let ((groupkey newgroup) before) - (while (and (not before) groupkey) - (goto-char (point-min)) - (let ((groupkey-re - (concat "^\\(" (regexp-quote groupkey) ".*\\)[!:]"))) - (while (and (re-search-forward groupkey-re nil t) - (progn - (setq before (match-string 1)) - (string< before newgroup))))) - ;; Remove tail of newsgroup name (eg. a.b.c -> a.b) - (setq groupkey - (when (string-match "^\\(.*\\)\\.[^.]+$" groupkey) - (substring groupkey (match-beginning 1) (match-end 1))))) - (gnus-subscribe-newsgroup newgroup before)) - (kill-buffer (current-buffer))))) - -(defun gnus-subscribe-interactively (group) - "Subscribe the new GROUP interactively. -It is inserted in hierarchical newsgroup order if subscribed. If not, -it is killed." - (if (gnus-y-or-n-p (format "Subscribe new newsgroup: %s " group)) - (gnus-subscribe-hierarchically group) - (push group gnus-killed-list))) - -(defun gnus-subscribe-zombies (group) - "Make the new GROUP into a zombie group." - (push group gnus-zombie-list)) - -(defun gnus-subscribe-killed (group) - "Make the new GROUP a killed group." - (push group gnus-killed-list)) - -(defun gnus-subscribe-newsgroup (newsgroup &optional next) - "Subscribe new NEWSGROUP. -If NEXT is non-nil, it is inserted before NEXT. Otherwise it is made -the first newsgroup." - (save-excursion - (goto-char (point-min)) - ;; We subscribe the group by changing its level to `subscribed'. - (gnus-group-change-level - newsgroup gnus-level-default-subscribed - gnus-level-killed (gnus-gethash (or next "dummy.group") - gnus-newsrc-hashtb)) - (gnus-message 5 "Subscribe newsgroup: %s" newsgroup) - (run-hook-with-args 'gnus-subscribe-newsgroup-hooks newsgroup) - t)) - -(defun gnus-read-active-file-p () - "Say whether the active file has been read from `gnus-select-method'." - (memq gnus-select-method gnus-have-read-active-file)) - -;;; General various misc type functions. - -;; Silence byte-compiler. -(defvar gnus-current-headers) -(defvar gnus-thread-indent-array) -(defvar gnus-newsgroup-name) -(defvar gnus-newsgroup-headers) -(defvar gnus-group-list-mode) -(defvar gnus-group-mark-positions) -(defvar gnus-newsgroup-data) -(defvar gnus-newsgroup-unreads) -(defvar nnoo-state-alist) -(defvar gnus-current-select-method) - -(defun gnus-clear-quick-file-variables () - "Clear all variables in quick startup files." - (let ((variables gnus-variable-list)) - ;; Clear Gnus variables. - (while variables - (set (car variables) nil) - (setq variables (cdr variables)))) - (let ((files gnus-product-variable-file-list)) - (while files - (let ((variables (nthcdr 3 (car files)))) - (while variables - (set (car variables) nil) - (setq variables (cdr variables)))) - (setq files (cdr files))))) - -(defun gnus-close-all-servers () - "Close all servers." - (interactive) - (dolist (server gnus-opened-servers) - (gnus-close-server (car server)))) - -(defun gnus-clear-system () - "Clear all variables and buffers." - ;; Clear gnus variables. - (gnus-clear-quick-file-variables) - ;; Clear other internal variables. - (setq gnus-list-of-killed-groups nil - gnus-have-read-active-file nil - gnus-newsrc-alist nil - gnus-newsrc-hashtb nil - gnus-killed-list nil - gnus-zombie-list nil - gnus-killed-hashtb nil - gnus-active-hashtb nil - gnus-moderated-hashtb nil - gnus-description-hashtb nil - gnus-current-headers nil - gnus-thread-indent-array nil - gnus-newsgroup-headers nil - gnus-newsgroup-name nil - gnus-server-alist nil - gnus-group-list-mode nil - gnus-opened-servers nil - gnus-group-mark-positions nil - gnus-newsgroup-data nil - gnus-newsgroup-unreads nil - nnoo-state-alist nil - gnus-current-select-method nil - nnmail-split-history nil - gnus-ephemeral-servers nil) - (gnus-shutdown 'gnus) - ;; Kill the startup file. - (and gnus-current-startup-file - (get-file-buffer gnus-current-startup-file) - (kill-buffer (get-file-buffer gnus-current-startup-file))) - ;; Clear the dribble buffer. - (gnus-dribble-clear) - ;; Kill global KILL file buffer. - (when (get-file-buffer (gnus-newsgroup-kill-file nil)) - (kill-buffer (get-file-buffer (gnus-newsgroup-kill-file nil)))) - (gnus-kill-buffer nntp-server-buffer) - ;; Kill Gnus buffers. - (let ((buffers (gnus-buffers))) - (when buffers - (mapcar 'kill-buffer buffers))) - ;; Remove Gnus frames. - (gnus-kill-gnus-frames)) - -(defun gnus-no-server-1 (&optional arg slave) - "Read network news. -If ARG is a positive number, Gnus will use that as the -startup level. If ARG is nil, Gnus will be started at level 2. -If ARG is non-nil and not a positive number, Gnus will -prompt the user for the name of an NNTP server to use. -As opposed to `gnus', this command will not connect to the local server." - (interactive "P") - (let ((val (or arg (1- gnus-level-default-subscribed)))) - (gnus val t slave) - (make-local-variable 'gnus-group-use-permanent-levels) - (setq gnus-group-use-permanent-levels val))) - -(defun gnus-1 (&optional arg dont-connect slave) - "Read network news. -If ARG is non-nil and a positive number, Gnus will use that as the -startup level. If ARG is non-nil and not a positive number, Gnus will -prompt the user for the name of an NNTP server to use." - (interactive "P") - - (if (gnus-alive-p) - (progn - (switch-to-buffer gnus-group-buffer) - (gnus-group-get-new-news - (and (numberp arg) - (> arg 0) - (max (car gnus-group-list-mode) arg)))) - - (gnus-clear-system) - (gnus-splash) - (gnus-run-hooks 'gnus-before-startup-hook) - (nnheader-init-server-buffer) - (setq gnus-slave slave) - (gnus-read-init-file) - - (when gnus-simple-splash - (setq gnus-simple-splash nil) - (cond - ((featurep 'xemacs) - (gnus-xmas-splash)) - ((and window-system - (= (frame-height) (1+ (window-height)))) - (gnus-x-splash)))) - - (let ((level (and (numberp arg) (> arg 0) arg)) - did-connect) - (unwind-protect - (progn - (unless dont-connect - (setq did-connect - (gnus-start-news-server (and arg (not level)))))) - (if (and (not dont-connect) - (not did-connect)) - (gnus-group-quit) - (gnus-run-hooks 'gnus-startup-hook) - ;; NNTP server is successfully open. - - ;; Find the current startup file name. - (setq gnus-current-startup-file - (gnus-make-newsrc-file gnus-startup-file)) - - ;; Read the dribble file. - (when (or gnus-slave gnus-use-dribble-file) - (gnus-dribble-read-file)) - - ;; Allow using GroupLens predictions. - (when gnus-use-grouplens - (bbb-login) - (add-hook 'gnus-summary-mode-hook 'gnus-grouplens-mode)) - - ;; Do the actual startup. - (gnus-setup-news nil level dont-connect) - (gnus-run-hooks 'gnus-setup-news-hook) - (gnus-start-draft-setup) - ;; Generate the group buffer. - (gnus-group-list-groups level) - (gnus-group-first-unread-group) - (gnus-configure-windows 'group) - (gnus-group-set-mode-line) - ;; For reading Info. - (set-language-info "Japanese" 'gnus-info "gnus-ja") - (gnus-run-hooks 'gnus-started-hook)))))) - -(defun gnus-start-draft-setup () - "Make sure the draft group exists." - (gnus-request-create-group "drafts" '(nndraft "")) - (unless (gnus-gethash "nndraft:drafts" gnus-newsrc-hashtb) - (let ((gnus-level-default-subscribed 1)) - (gnus-subscribe-group "nndraft:drafts" nil '(nndraft ""))) - (gnus-group-set-parameter - "nndraft:drafts" 'gnus-dummy '((gnus-draft-mode))))) - -;;;###autoload -(defun gnus-unload () - "Unload all Gnus features. -\(For some value of `all' or `Gnus'.) Currently, features whose names -have prefixes `gnus-', `nn', `mm-' or `rfc' are unloaded. Use -cautiously -- unloading may cause trouble." - (interactive) - (dolist (feature features) - (if (string-match "^\\(gnus-\\|nn\\|mm-\\|rfc\\)" (symbol-name feature)) - (unload-feature feature 'force)))) - - -;;; -;;; Dribble file -;;; - -(defvar gnus-dribble-ignore nil) -(defvar gnus-dribble-eval-file nil) - -(defun gnus-dribble-file-name () - "Return the dribble file for the current .newsrc." - (concat - (if gnus-dribble-directory - (concat (file-name-as-directory gnus-dribble-directory) - (file-name-nondirectory gnus-current-startup-file)) - gnus-current-startup-file) - "-dribble")) - -(defun gnus-dribble-enter (string) - "Enter STRING into the dribble buffer." - (when (and (not gnus-dribble-ignore) - gnus-dribble-buffer - (buffer-name gnus-dribble-buffer)) - (let ((obuf (current-buffer))) - (set-buffer gnus-dribble-buffer) - (goto-char (point-max)) - (insert string "\n") - (set-window-point (get-buffer-window (current-buffer)) (point-max)) - (bury-buffer gnus-dribble-buffer) - (save-excursion - (set-buffer gnus-group-buffer) - (gnus-group-set-mode-line)) - (set-buffer obuf)))) - -(defun gnus-dribble-touch () - "Touch the dribble buffer." - (gnus-dribble-enter "")) - -(defun gnus-dribble-read-file () - "Read the dribble file from disk." - (let ((dribble-file (gnus-dribble-file-name))) - (save-excursion - (set-buffer (setq gnus-dribble-buffer - (gnus-get-buffer-create - (file-name-nondirectory dribble-file)))) - (erase-buffer) - (setq buffer-file-name dribble-file) - (auto-save-mode t) - (buffer-disable-undo) - (bury-buffer (current-buffer)) - (set-buffer-modified-p nil) - (let ((auto (make-auto-save-file-name)) - (gnus-dribble-ignore t) - (purpose nil) - modes) - (when (or (file-exists-p auto) (file-exists-p dribble-file)) - ;; Load whichever file is newest -- the auto save file - ;; or the "real" file. - (if (file-newer-than-file-p auto dribble-file) - (nnheader-insert-file-contents auto) - (nnheader-insert-file-contents dribble-file)) - (unless (zerop (buffer-size)) - (set-buffer-modified-p t)) - ;; Set the file modes to reflect the .newsrc file modes. - (save-buffer) - (when (and (file-exists-p gnus-current-startup-file) - (file-exists-p dribble-file) - (setq modes (file-modes gnus-current-startup-file))) - (set-file-modes dribble-file modes)) - (goto-char (point-min)) - (when (search-forward "Gnus was exited on purpose" nil t) - (setq purpose t)) - ;; Possibly eval the file later. - (when (or gnus-always-read-dribble-file - (gnus-y-or-n-p - (if purpose - "Gnus exited on purpose without saving; read auto-save file anyway? " - "Gnus auto-save file exists. Do you want to read it? "))) - (setq gnus-dribble-eval-file t))))))) - -(defun gnus-dribble-eval-file () - (when gnus-dribble-eval-file - (setq gnus-dribble-eval-file nil) - (save-excursion - (let ((gnus-dribble-ignore t)) - (set-buffer gnus-dribble-buffer) - (eval-buffer (current-buffer)))))) - -(defun gnus-dribble-delete-file () - (when (file-exists-p (gnus-dribble-file-name)) - (delete-file (gnus-dribble-file-name))) - (when gnus-dribble-buffer - (save-excursion - (set-buffer gnus-dribble-buffer) - (let ((auto (make-auto-save-file-name))) - (when (file-exists-p auto) - (delete-file auto)) - (erase-buffer) - (set-buffer-modified-p nil))))) - -(defun gnus-dribble-save () - (when (and gnus-dribble-buffer - (buffer-name gnus-dribble-buffer)) - (save-excursion - (set-buffer gnus-dribble-buffer) - (save-buffer)))) - -(defun gnus-dribble-clear () - (when (gnus-buffer-exists-p gnus-dribble-buffer) - (save-excursion - (set-buffer gnus-dribble-buffer) - (erase-buffer) - (set-buffer-modified-p nil) - (setq buffer-saved-size (buffer-size))))) - - -;;; -;;; Active & Newsrc File Handling -;;; - -(defun gnus-setup-news (&optional rawfile level dont-connect) - "Setup news information. -If RAWFILE is non-nil, the .newsrc file will also be read. -If LEVEL is non-nil, the news will be set up at level LEVEL." - (require 'nnmail) - (let ((init (not (and gnus-newsrc-alist gnus-active-hashtb (not rawfile)))) - ;; Binding this variable will inhibit multiple fetchings - ;; of the same mail source. - (nnmail-fetched-sources (list t))) - - (when init - ;; Clear some variables to re-initialize news information. - (setq gnus-newsrc-alist nil - gnus-active-hashtb nil) - ;; Read the newsrc file and create `gnus-newsrc-hashtb'. - (gnus-read-newsrc-file rawfile)) - - ;; Make sure the archive server is available to all and sundry. - (when gnus-message-archive-method - (unless (assoc "archive" gnus-server-alist) - (push `("archive" - (nnfolder - "archive" - (nnfolder-directory - ,(nnheader-concat message-directory "archive")) - (nnfolder-active-file - ,(nnheader-concat message-directory "archive/active")) - (nnfolder-get-new-mail nil) - (nnfolder-inhibit-expiry t))) - gnus-server-alist))) - - ;; If we don't read the complete active file, we fill in the - ;; hashtb here. - (when (or (null gnus-read-active-file) - (eq gnus-read-active-file 'some)) - (gnus-update-active-hashtb-from-killed)) - - ;; Read the active file and create `gnus-active-hashtb'. - ;; If `gnus-read-active-file' is nil, then we just create an empty - ;; hash table. The partial filling out of the hash table will be - ;; done in `gnus-get-unread-articles'. - (and gnus-read-active-file - (not level) - (gnus-read-active-file nil dont-connect)) - - (unless gnus-active-hashtb - (setq gnus-active-hashtb (gnus-make-hashtable 4096))) - - ;; Initialize the cache. - (when gnus-use-cache - (gnus-cache-open)) - - ;; Possibly eval the dribble file. - (and init - (or gnus-use-dribble-file gnus-slave) - (gnus-dribble-eval-file)) - - ;; Slave Gnusii should then clear the dribble buffer. - (when (and init gnus-slave) - (gnus-dribble-clear)) - - (gnus-update-format-specifications) - - ;; See whether we need to read the description file. - (when (and (boundp 'gnus-group-line-format) - (stringp gnus-group-line-format) - (let ((case-fold-search nil)) - (string-match "%[-,0-9]*D" gnus-group-line-format)) - (not gnus-description-hashtb) - (not dont-connect) - gnus-read-active-file) - (gnus-read-all-descriptions-files)) - - ;; Find new newsgroups and treat them. - (when (and init gnus-check-new-newsgroups (not level) - (gnus-check-server gnus-select-method) - (not gnus-slave) - gnus-plugged) - (gnus-find-new-newsgroups)) - - ;; Check and remove bogus newsgroups. - (when (and init gnus-check-bogus-newsgroups - gnus-read-active-file (not level) - (gnus-server-opened gnus-select-method)) - (gnus-check-bogus-newsgroups)) - - ;; We might read in new NoCeM messages here. - (when (and gnus-use-nocem - (not level) - (not dont-connect)) - (gnus-nocem-scan-groups)) - - ;; Read any slave files. - (gnus-master-read-slave-newsrc) - - ;; Find the number of unread articles in each non-dead group. - (let ((gnus-read-active-file (and (not level) gnus-read-active-file))) - (gnus-get-unread-articles level)))) - -(defun gnus-call-subscribe-functions (method group) - "Call METHOD to subscribe GROUP. -If no function returns `non-nil', call `gnus-subscribe-zombies'." - (unless (cond - ((gnus-functionp method) - (funcall method group)) - ((listp method) - (catch 'found - (dolist (func method) - (if (funcall func group) - (throw 'found t))) - nil)) - (t nil)) - (gnus-subscribe-zombies group))) - -(defun gnus-find-new-newsgroups (&optional arg) - "Search for new newsgroups and add them. -Each new newsgroup will be treated with `gnus-subscribe-newsgroup-method'. -The `-n' option line from .newsrc is respected. - -With 1 C-u, use the `ask-server' method to query the server for new -groups. -With 2 C-u's, use most complete method possible to query the server -for new groups, and subscribe the new groups as zombies." - (interactive "p") - (let* ((gnus-subscribe-newsgroup-method - gnus-subscribe-newsgroup-method) - (check (cond - ((or (and (= (or arg 1) 4) - (not (listp gnus-check-new-newsgroups))) - (null gnus-read-active-file) - (eq gnus-read-active-file 'some)) - 'ask-server) - ((= (or arg 1) 16) - (setq gnus-subscribe-newsgroup-method - 'gnus-subscribe-zombies) - t) - (t gnus-check-new-newsgroups)))) - (unless (gnus-check-first-time-used) - (if (or (consp check) - (eq check 'ask-server)) - ;; Ask the server for new groups. - (gnus-ask-server-for-new-groups) - ;; Go through the active hashtb and look for new groups. - (let ((groups 0) - group new-newsgroups) - (gnus-message 5 "Looking for new newsgroups...") - (unless gnus-have-read-active-file - (gnus-read-active-file)) - (setq gnus-newsrc-last-checked-date (message-make-date)) - (unless gnus-killed-hashtb - (gnus-make-hashtable-from-killed)) - ;; Go though every newsgroup in `gnus-active-hashtb' and compare - ;; with `gnus-newsrc-hashtb' and `gnus-killed-hashtb'. - (mapatoms - (lambda (sym) - (if (or (null (setq group (symbol-name sym))) - (not (boundp sym)) - (null (symbol-value sym)) - (gnus-gethash group gnus-killed-hashtb) - (gnus-gethash group gnus-newsrc-hashtb)) - () - (let ((do-sub (gnus-matches-options-n group))) - (cond - ((eq do-sub 'subscribe) - (setq groups (1+ groups)) - (gnus-sethash group group gnus-killed-hashtb) - (gnus-call-subscribe-functions - gnus-subscribe-options-newsgroup-method group)) - ((eq do-sub 'ignore) - nil) - (t - (setq groups (1+ groups)) - (gnus-sethash group group gnus-killed-hashtb) - (if gnus-subscribe-hierarchical-interactive - (push group new-newsgroups) - (gnus-call-subscribe-functions - gnus-subscribe-newsgroup-method group))))))) - gnus-active-hashtb) - (when new-newsgroups - (gnus-subscribe-hierarchical-interactive new-newsgroups)) - (if (> groups 0) - (gnus-message 5 "%d new newsgroup%s arrived." - groups (if (> groups 1) "s have" " has")) - (gnus-message 5 "No new newsgroups."))))))) - -(defun gnus-matches-options-n (group) - ;; Returns `subscribe' if the group is to be unconditionally - ;; subscribed, `ignore' if it is to be ignored, and nil if there is - ;; no match for the group. - - ;; First we check the two user variables. - (cond - ((and gnus-options-subscribe - (string-match gnus-options-subscribe group)) - 'subscribe) - ((and gnus-auto-subscribed-groups - (string-match gnus-auto-subscribed-groups group)) - 'subscribe) - ((and gnus-options-not-subscribe - (string-match gnus-options-not-subscribe group)) - 'ignore) - ;; Then we go through the list that was retrieved from the .newsrc - ;; file. This list has elements on the form - ;; `(REGEXP . {ignore,subscribe})'. The first match found (the list - ;; is in the reverse order of the options line) is returned. - (t - (let ((regs gnus-newsrc-options-n)) - (while (and regs - (not (string-match (caar regs) group))) - (setq regs (cdr regs))) - (and regs (cdar regs)))))) - -(defun gnus-ask-server-for-new-groups () - (let* ((new-date (message-make-date)) - (date (or gnus-newsrc-last-checked-date new-date)) - (methods (cons gnus-select-method - (nconc - (when (gnus-archive-server-wanted-p) - (list "archive")) - (append - (and (consp gnus-check-new-newsgroups) - gnus-check-new-newsgroups) - gnus-secondary-select-methods)))) - (groups 0) - group new-newsgroups got-new method hashtb - gnus-override-subscribe-method) - (unless gnus-killed-hashtb - (gnus-make-hashtable-from-killed)) - ;; Go through both primary and secondary select methods and - ;; request new newsgroups. - (while (setq method (gnus-server-get-method nil (pop methods))) - (setq new-newsgroups nil - gnus-override-subscribe-method method) - (when (and (gnus-check-server method) - (gnus-request-newgroups date method)) - (save-excursion - (setq got-new t - hashtb (gnus-make-hashtable 100)) - (set-buffer nntp-server-buffer) - ;; Enter all the new groups into a hashtable. - (gnus-active-to-gnus-format method hashtb 'ignore)) - ;; Now all new groups from `method' are in `hashtb'. - (mapatoms - (lambda (group-sym) - (if (or (null (setq group (symbol-name group-sym))) - (not (boundp group-sym)) - (null (symbol-value group-sym)) - (gnus-gethash group gnus-newsrc-hashtb) - (member group gnus-zombie-list) - (member group gnus-killed-list)) - ;; The group is already known. - () - ;; Make this group active. - (when (symbol-value group-sym) - (gnus-set-active group (symbol-value group-sym))) - ;; Check whether we want it or not. - (let ((do-sub (gnus-matches-options-n group))) - (cond - ((eq do-sub 'subscribe) - (incf groups) - (gnus-sethash group group gnus-killed-hashtb) - (gnus-call-subscribe-functions - gnus-subscribe-options-newsgroup-method group)) - ((eq do-sub 'ignore) - nil) - (t - (incf groups) - (gnus-sethash group group gnus-killed-hashtb) - (if gnus-subscribe-hierarchical-interactive - (push group new-newsgroups) - (gnus-call-subscribe-functions - gnus-subscribe-newsgroup-method group))))))) - hashtb)) - (when new-newsgroups - (gnus-subscribe-hierarchical-interactive new-newsgroups))) - (if (> groups 0) - (gnus-message 5 "%d new newsgroup%s arrived" - groups (if (> groups 1) "s have" " has")) - (gnus-message 5 "No new newsgroups")) - (when got-new - (setq gnus-newsrc-last-checked-date new-date)) - got-new)) - -(defun gnus-check-first-time-used () - (catch 'ended - ;; First check if any of the following files exist. If they do, - ;; it's not the first time the user has used Gnus. - (dolist (file (list gnus-current-startup-file - (concat gnus-current-startup-file ".el") - (concat gnus-current-startup-file ".eld") - gnus-startup-file - (concat gnus-startup-file ".el") - (concat gnus-startup-file ".eld"))) - (when (file-exists-p file) - (throw 'ended nil))) - (gnus-message 6 "First time user; subscribing you to default groups") - (unless (gnus-read-active-file-p) - (let ((gnus-read-active-file t)) - (gnus-read-active-file))) - (setq gnus-newsrc-last-checked-date (message-make-date)) - ;; Subscribe to the default newsgroups. - (let ((groups (or gnus-default-subscribed-newsgroups - gnus-backup-default-subscribed-newsgroups)) - group) - (if (eq groups t) - ;; If t, we subscribe (or not) all groups as if they were new. - (mapatoms - (lambda (sym) - (when (setq group (symbol-name sym)) - (let ((do-sub (gnus-matches-options-n group))) - (cond - ((eq do-sub 'subscribe) - (gnus-sethash group group gnus-killed-hashtb) - (gnus-call-subscribe-functions - gnus-subscribe-options-newsgroup-method group)) - ((eq do-sub 'ignore) - nil) - (t - (push group gnus-killed-list)))))) - gnus-active-hashtb) - (dolist (group groups) - ;; Only subscribe the default groups that are activated. - (when (gnus-active group) - (gnus-group-change-level - group gnus-level-default-subscribed gnus-level-killed))) - (save-excursion - (set-buffer gnus-group-buffer) - (gnus-group-make-help-group)) - (when gnus-novice-user - (gnus-message 7 "`A k' to list killed groups")))))) - -(defun gnus-subscribe-group (group &optional previous method) - "Subcribe GROUP and put it after PREVIOUS." - (gnus-group-change-level - (if method - (list t group gnus-level-default-subscribed nil nil method) - group) - gnus-level-default-subscribed gnus-level-killed previous t) - t) - -;; `gnus-group-change-level' is the fundamental function for changing -;; subscription levels of newsgroups. This might mean just changing -;; from level 1 to 2, which is pretty trivial, from 2 to 6 or back -;; again, which subscribes/unsubscribes a group, which is equally -;; trivial. Changing from 1-7 to 8-9 means that you kill a group, and -;; from 8-9 to 1-7 means that you remove the group from the list of -;; killed (or zombie) groups and add them to the (kinda) subscribed -;; groups. And last but not least, moving from 8 to 9 and 9 to 8, -;; which is trivial. -;; ENTRY can either be a string (newsgroup name) or a list (if -;; FROMKILLED is t, it's a list on the format (NUM INFO-LIST), -;; otherwise it's a list in the format of the `gnus-newsrc-hashtb' -;; entries. -;; LEVEL is the new level of the group, OLDLEVEL is the old level and -;; PREVIOUS is the group (in hashtb entry format) to insert this group -;; after. -(defun gnus-group-change-level (entry level &optional oldlevel - previous fromkilled) - (let (group info active num) - ;; Glean what info we can from the arguments - (if (consp entry) - (if fromkilled (setq group (nth 1 entry)) - (setq group (car (nth 2 entry)))) - (setq group entry)) - (when (and (stringp entry) - oldlevel - (< oldlevel gnus-level-zombie)) - (setq entry (gnus-gethash entry gnus-newsrc-hashtb))) - (if (and (not oldlevel) - (consp entry)) - (setq oldlevel (gnus-info-level (nth 2 entry))) - (setq oldlevel (or oldlevel gnus-level-killed))) - (when (stringp previous) - (setq previous (gnus-gethash previous gnus-newsrc-hashtb))) - - (if (and (>= oldlevel gnus-level-zombie) - (gnus-gethash group gnus-newsrc-hashtb)) - ;; We are trying to subscribe a group that is already - ;; subscribed. - () ; Do nothing. - - (unless (gnus-ephemeral-group-p group) - (gnus-dribble-enter - (format "(gnus-group-change-level %S %S %S %S %S)" - group level oldlevel (car (nth 2 previous)) fromkilled))) - - ;; Then we remove the newgroup from any old structures, if needed. - ;; If the group was killed, we remove it from the killed or zombie - ;; list. If not, and it is in fact going to be killed, we remove - ;; it from the newsrc hash table and assoc. - (cond - ((>= oldlevel gnus-level-zombie) - ;; oldlevel could be wrong. - (setq gnus-zombie-list (delete group gnus-zombie-list)) - (setq gnus-killed-list (delete group gnus-killed-list))) - (t - (when (and (>= level gnus-level-zombie) - entry) - (gnus-sethash (car (nth 2 entry)) nil gnus-newsrc-hashtb) - (when (nth 3 entry) - (setcdr (gnus-gethash (car (nth 3 entry)) - gnus-newsrc-hashtb) - (cdr entry))) - (setcdr (cdr entry) (cdddr entry))))) - - ;; Finally we enter (if needed) the list where it is supposed to - ;; go, and change the subscription level. If it is to be killed, - ;; we enter it into the killed or zombie list. - (cond - ((>= level gnus-level-zombie) - ;; Remove from the hash table. - (gnus-sethash group nil gnus-newsrc-hashtb) - ;; We do not enter foreign groups into the list of dead - ;; groups. - (unless (gnus-group-foreign-p group) - (if (= level gnus-level-zombie) - (push group gnus-zombie-list) - (if (= oldlevel gnus-level-killed) - ;; Remove from active hashtb. - (unintern group gnus-active-hashtb) - ;; Don't add it into killed-list if it was killed. - (push group gnus-killed-list))))) - (t - ;; If the list is to be entered into the newsrc assoc, and - ;; it was killed, we have to create an entry in the newsrc - ;; hashtb format and fix the pointers in the newsrc assoc. - (if (< oldlevel gnus-level-zombie) - ;; It was alive, and it is going to stay alive, so we - ;; just change the level and don't change any pointers or - ;; hash table entries. - (setcar (cdaddr entry) level) - (if (listp entry) - (setq info (cdr entry) - num (car entry)) - (setq active (gnus-active group)) - (setq num - (if active (- (1+ (cdr active)) (car active)) t)) - ;; Shorten the select method if possible, if we need to - ;; store it at all (native groups). - (let ((method (gnus-method-simplify - (or gnus-override-subscribe-method - (gnus-group-method group))))) - (if method - (setq info (list group level nil nil method)) - (setq info (list group level nil))))) - (unless previous - (setq previous - (let ((p gnus-newsrc-alist)) - (while (cddr p) - (setq p (cdr p))) - p))) - (setq entry (cons info (cddr previous))) - (if (cdr previous) - (progn - (setcdr (cdr previous) entry) - (gnus-sethash group (cons num (cdr previous)) - gnus-newsrc-hashtb)) - (setcdr previous entry) - (gnus-sethash group (cons num previous) - gnus-newsrc-hashtb)) - (when (cdr entry) - (setcdr (gnus-gethash (caadr entry) gnus-newsrc-hashtb) entry)) - (gnus-dribble-enter - (format - "(gnus-group-set-info '%S)" info))))) - (when gnus-group-change-level-function - (funcall gnus-group-change-level-function - group level oldlevel previous))))) - -(defun gnus-kill-newsgroup (newsgroup) - "Obsolete function. Kills a newsgroup." - (gnus-group-change-level - (gnus-gethash newsgroup gnus-newsrc-hashtb) gnus-level-killed)) - -(defun gnus-check-bogus-newsgroups (&optional confirm) - "Remove bogus newsgroups. -If CONFIRM is non-nil, the user has to confirm the deletion of every -newsgroup." - (let ((newsrc (cdr gnus-newsrc-alist)) - bogus group entry info) - (gnus-message 5 "Checking bogus newsgroups...") - (unless (gnus-read-active-file-p) - (gnus-read-active-file t)) - (when (gnus-read-active-file-p) - ;; Find all bogus newsgroup that are subscribed. - (while newsrc - (setq info (pop newsrc) - group (gnus-info-group info)) - (unless (or (gnus-active group) ; Active - (and (gnus-info-method info) - (not (gnus-secondary-method-p - (gnus-info-method info))))) ; Foreign - ;; Found a bogus newsgroup. - (push group bogus))) - (if confirm - (map-y-or-n-p - "Remove bogus group %s? " - (lambda (group) - ;; Remove all bogus subscribed groups by first killing them, and - ;; then removing them from the list of killed groups. - (when (setq entry (gnus-gethash group gnus-newsrc-hashtb)) - (gnus-group-change-level entry gnus-level-killed) - (setq gnus-killed-list (delete group gnus-killed-list)))) - bogus '("group" "groups" "remove")) - (while (setq group (pop bogus)) - ;; Remove all bogus subscribed groups by first killing them, and - ;; then removing them from the list of killed groups. - (when (setq entry (gnus-gethash group gnus-newsrc-hashtb)) - (gnus-group-change-level entry gnus-level-killed) - (setq gnus-killed-list (delete group gnus-killed-list))))) - ;; Then we remove all bogus groups from the list of killed and - ;; zombie groups. They are removed without confirmation. - (let ((dead-lists '(gnus-killed-list gnus-zombie-list)) - killed) - (while dead-lists - (setq killed (symbol-value (car dead-lists))) - (while killed - (unless (gnus-active (setq group (pop killed))) - ;; The group is bogus. - ;; !!!Slow as hell. - (set (car dead-lists) - (delete group (symbol-value (car dead-lists)))))) - (setq dead-lists (cdr dead-lists)))) - (gnus-run-hooks 'gnus-check-bogus-groups-hook) - (gnus-message 5 "Checking bogus newsgroups...done")))) - -(defun gnus-check-duplicate-killed-groups () - "Remove duplicates from the list of killed groups." - (interactive) - (let ((killed gnus-killed-list)) - (while killed - (gnus-message 9 "%d" (length killed)) - (setcdr killed (delete (car killed) (cdr killed))) - (setq killed (cdr killed))))) - -;; We want to inline a function from gnus-cache, so we cheat here: -(eval-when-compile - (defvar gnus-cache-active-hashtb) - (defun gnus-cache-possibly-alter-active (group active) - "Alter the ACTIVE info for GROUP to reflect the articles in the cache." - (when gnus-cache-active-hashtb - (let ((cache-active (gnus-gethash group gnus-cache-active-hashtb))) - (when cache-active - (when (< (car cache-active) (car active)) - (setcar active (car cache-active))) - (when (> (cdr cache-active) (cdr active)) - (setcdr active (cdr cache-active)))))))) - -(defun gnus-activate-group (group &optional scan dont-check method) - ;; Check whether a group has been activated or not. - ;; If SCAN, request a scan of that group as well. - (let ((method (or method (inline (gnus-find-method-for-group group)))) - active) - (and (inline (gnus-check-server method)) - ;; We escape all bugs and quit here to make it possible to - ;; continue if a group is so out-there that it reports bugs - ;; and stuff. - (progn - (and scan - (gnus-check-backend-function 'request-scan (car method)) - (gnus-request-scan group method)) - t) - (condition-case () - (inline (gnus-request-group group dont-check method)) - ;;(error nil) - (quit - (message "Quit activating %s" group) - nil)) - (unless dont-check - (setq active (gnus-parse-active)) - ;; If there are no articles in the group, the GROUP - ;; command may have responded with the `(0 . 0)'. We - ;; ignore this if we already have an active entry - ;; for the group. - (if (and (zerop (car active)) - (zerop (cdr active)) - (gnus-active group)) - (gnus-active group) - (gnus-set-active group active) - ;; Return the new active info. - active))))) - -(defun gnus-get-unread-articles-in-group (info active &optional update) - (when active - ;; Allow the backend to update the info in the group. - (when (and update - (gnus-request-update-info - info (inline (gnus-find-method-for-group - (gnus-info-group info))))) - (gnus-activate-group (gnus-info-group info) nil t)) - - (let* ((range (gnus-info-read info)) - (num 0)) - ;; If a cache is present, we may have to alter the active info. - (when (and gnus-use-cache info) - (inline (gnus-cache-possibly-alter-active - (gnus-info-group info) active))) - ;; Modify the list of read articles according to what articles - ;; are available; then tally the unread articles and add the - ;; number to the group hash table entry. - (cond - ((zerop (cdr active)) - (setq num 0)) - ((not range) - (setq num (- (1+ (cdr active)) (car active)))) - ((not (listp (cdr range))) - ;; Fix a single (num . num) range according to the - ;; active hash table. - ;; Fix by Carsten Bormann . - (and (< (cdr range) (car active)) (setcdr range (1- (car active)))) - (and (> (cdr range) (cdr active)) (setcdr range (cdr active))) - ;; Compute number of unread articles. - (setq num (max 0 (- (cdr active) (- (1+ (cdr range)) (car range)))))) - (t - ;; The read list is a list of ranges. Fix them according to - ;; the active hash table. - ;; First peel off any elements that are below the lower - ;; active limit. - (while (and (cdr range) - (>= (car active) - (or (and (atom (cadr range)) (cadr range)) - (caadr range)))) - (if (numberp (car range)) - (setcar range - (cons (car range) - (or (and (numberp (cadr range)) - (cadr range)) - (cdadr range)))) - (setcdr (car range) - (or (and (numberp (nth 1 range)) (nth 1 range)) - (cdadr range)))) - (setcdr range (cddr range))) - ;; Adjust the first element to be the same as the lower limit. - (when (and (not (atom (car range))) - (< (cdar range) (car active))) - (setcdr (car range) (1- (car active)))) - ;; Then we want to peel off any elements that are higher - ;; than the upper active limit. - (let ((srange range)) - ;; Go past all valid elements. - (while (and (cdr srange) - (<= (or (and (atom (cadr srange)) - (cadr srange)) - (caadr srange)) - (cdr active))) - (setq srange (cdr srange))) - (when (cdr srange) - ;; Nuke all remaining invalid elements. - (setcdr srange nil)) - - ;; Adjust the final element. - (when (and (not (atom (car srange))) - (> (cdar srange) (cdr active))) - (setcdr (car srange) (cdr active)))) - ;; Compute the number of unread articles. - (while range - (setq num (+ num (- (1+ (or (and (atom (car range)) (car range)) - (cdar range))) - (or (and (atom (car range)) (car range)) - (caar range))))) - (setq range (cdr range))) - (setq num (max 0 (- (cdr active) num))))) - ;; Set the number of unread articles. - (when info - (setcar (gnus-gethash (gnus-info-group info) gnus-newsrc-hashtb) num)) - num))) - -;; Go though `gnus-newsrc-alist' and compare with `gnus-active-hashtb' -;; and compute how many unread articles there are in each group. -(defun gnus-get-unread-articles (&optional level) - (let* ((newsrc (cdr gnus-newsrc-alist)) - (level (or level gnus-activate-level (1+ gnus-level-subscribed))) - (foreign-level - (min - (cond ((and gnus-activate-foreign-newsgroups - (not (numberp gnus-activate-foreign-newsgroups))) - (1+ gnus-level-subscribed)) - ((numberp gnus-activate-foreign-newsgroups) - gnus-activate-foreign-newsgroups) - (t 0)) - level)) - scanned-methods info group active method retrieve-groups) - (gnus-message 5 "Checking new news...") - - (while newsrc - (setq active (gnus-active (setq group (gnus-info-group - (setq info (pop newsrc)))))) - - ;; Check newsgroups. If the user doesn't want to check them, or - ;; they can't be checked (for instance, if the news server can't - ;; be reached) we just set the number of unread articles in this - ;; newsgroup to t. This means that Gnus thinks that there are - ;; unread articles, but it has no idea how many. - - ;; To be more explicit: - ;; >0 for an active group with messages - ;; 0 for an active group with no unread messages - ;; nil for non-foreign groups that the user has requested not be checked - ;; t for unchecked foreign groups or bogus groups, or groups that can't - ;; be checked, for one reason or other. - (if (and (setq method (gnus-info-method info)) - (not (inline - (gnus-server-equal - gnus-select-method - (setq method (gnus-server-get-method nil method))))) - (not (gnus-secondary-method-p method))) - ;; These groups are foreign. Check the level. - (when (and (<= (gnus-info-level info) foreign-level) - (setq active (gnus-activate-group group 'scan))) - ;; Let the Gnus agent save the active file. - (when (and gnus-agent gnus-plugged active) - (gnus-agent-save-group-info - method (gnus-group-real-name group) active)) - (unless (inline (gnus-virtual-group-p group)) - (inline (gnus-close-group group))) - (when (fboundp (intern (concat (symbol-name (car method)) - "-request-update-info"))) - (inline (gnus-request-update-info info method)))) - ;; These groups are native or secondary. - (cond - ;; We don't want these groups. - ((> (gnus-info-level info) level) - (setq active 'ignore)) - ;; Activate groups. - ((not gnus-read-active-file) - (if (gnus-check-backend-function 'retrieve-groups group) - ;; if server support gnus-retrieve-groups we push - ;; the group onto retrievegroups for later checking - (if (assoc method retrieve-groups) - (setcdr (assoc method retrieve-groups) - (cons group (cdr (assoc method retrieve-groups)))) - (push (list method group) retrieve-groups)) - ;; hack: `nnmail-get-new-mail' changes the mail-source depending - ;; on the group, so we must perform a scan for every group - ;; if the users has any directory mail sources. - ;; hack: if `nnmail-scan-directory-mail-source-once' is non-nil, - ;; for it scan all spool files even when the groups are - ;; not required. - (if (and - (or nnmail-scan-directory-mail-source-once - (null (assq 'directory - (or mail-sources - (if (listp nnmail-spool-file) - nnmail-spool-file - (list nnmail-spool-file)))))) - (member method scanned-methods)) - (setq active (gnus-activate-group group)) - (setq active (gnus-activate-group group 'scan)) - (push method scanned-methods)) - (when active - (gnus-close-group group)))))) - - ;; Get the number of unread articles in the group. - (cond - ((eq active 'ignore) - ;; Don't do anything. - ) - (active - (inline (gnus-get-unread-articles-in-group info active t))) - (t - ;; The group couldn't be reached, so we nix out the number of - ;; unread articles and stuff. - (gnus-set-active group nil) - (let ((tmp (gnus-gethash group gnus-newsrc-hashtb))) - (when tmp - (setcar tmp t)))))) - - ;; iterate through groups on methods which support gnus-retrieve-groups - ;; and fetch a partial active file and use it to find new news. - (dolist (rg retrieve-groups) - (let ((method (or (car rg) gnus-select-method)) - (groups (cdr rg))) - (when (gnus-check-server method) - ;; Request that the backend scan its incoming messages. - (when (gnus-check-backend-function 'request-scan (car method)) - (gnus-request-scan nil method)) - (gnus-read-active-file-2 - (mapcar (lambda (group) (gnus-group-real-name group)) groups) - method) - (dolist (group groups) - (cond - ((setq active (gnus-active (gnus-info-group - (setq info (gnus-get-info group))))) - (inline (gnus-get-unread-articles-in-group info active t))) - (t - ;; The group couldn't be reached, so we nix out the number of - ;; unread articles and stuff. - (gnus-set-active group nil) - (setcar (gnus-gethash group gnus-newsrc-hashtb) t))))))) - - (gnus-message 5 "Checking new news...done"))) - -;; Create a hash table out of the newsrc alist. The `car's of the -;; alist elements are used as keys. -(defun gnus-make-hashtable-from-newsrc-alist () - (let ((alist gnus-newsrc-alist) - (ohashtb gnus-newsrc-hashtb) - prev) - (setq gnus-newsrc-hashtb (gnus-make-hashtable (length alist))) - (setq alist - (setq prev (setq gnus-newsrc-alist - (if (equal (caar gnus-newsrc-alist) - "dummy.group") - gnus-newsrc-alist - (cons (list "dummy.group" 0 nil) alist))))) - (while alist - (gnus-sethash - (caar alist) - ;; Preserve number of unread articles in groups. - (cons (and ohashtb (car (gnus-gethash (caar alist) ohashtb))) - prev) - gnus-newsrc-hashtb) - (setq prev alist - alist (cdr alist))))) - -(defun gnus-make-hashtable-from-killed () - "Create a hash table from the killed and zombie lists." - (let ((lists '(gnus-killed-list gnus-zombie-list)) - list) - (setq gnus-killed-hashtb - (gnus-make-hashtable - (+ (length gnus-killed-list) (length gnus-zombie-list)))) - (while lists - (setq list (symbol-value (pop lists))) - (while list - (gnus-sethash (car list) (pop list) gnus-killed-hashtb))))) - -(defun gnus-parse-active () - "Parse active info in the nntp server buffer." - (save-excursion - (set-buffer nntp-server-buffer) - (goto-char (point-min)) - ;; Parse the result we got from `gnus-request-group'. - (when (looking-at "[0-9]+ [0-9]+ \\([0-9]+\\) [0-9]+") - (goto-char (match-beginning 1)) - (cons (read (current-buffer)) - (read (current-buffer)))))) - -(defun gnus-make-articles-unread (group articles) - "Mark ARTICLES in GROUP as unread." - (let* ((info (nth 2 (or (gnus-gethash group gnus-newsrc-hashtb) - (gnus-gethash (gnus-group-real-name group) - gnus-newsrc-hashtb)))) - (ranges (gnus-info-read info)) - news article) - (while articles - (when (gnus-member-of-range - (setq article (pop articles)) ranges) - (push article news))) - (when news - (gnus-info-set-read - info (gnus-remove-from-range (gnus-info-read info) (nreverse news))) - (gnus-group-update-group group t)))) - -;; Enter all dead groups into the hashtb. -(defun gnus-update-active-hashtb-from-killed () - (let ((hashtb (setq gnus-active-hashtb (gnus-make-hashtable 4096))) - (lists (list gnus-killed-list gnus-zombie-list)) - killed) - (while lists - (setq killed (car lists)) - (while killed - (gnus-sethash (car killed) nil hashtb) - (setq killed (cdr killed))) - (setq lists (cdr lists))))) - -(defun gnus-get-killed-groups () - "Go through the active hashtb and mark all unknown groups as killed." - ;; First make sure active file has been read. - (unless (gnus-read-active-file-p) - (let ((gnus-read-active-file t)) - (gnus-read-active-file))) - (unless gnus-killed-hashtb - (gnus-make-hashtable-from-killed)) - ;; Go through all newsgroups that are known to Gnus - enlarge kill list. - (mapatoms - (lambda (sym) - (let ((groups 0) - (group (symbol-name sym))) - (if (or (null group) - (gnus-gethash group gnus-killed-hashtb) - (gnus-gethash group gnus-newsrc-hashtb)) - () - (let ((do-sub (gnus-matches-options-n group))) - (if (or (eq do-sub 'subscribe) (eq do-sub 'ignore)) - () - (setq groups (1+ groups)) - (push group gnus-killed-list) - (gnus-sethash group group gnus-killed-hashtb)))))) - gnus-active-hashtb) - (gnus-dribble-touch)) - -;; Get the active file(s) from the backend(s). -(defun gnus-read-active-file (&optional force not-native) - (gnus-group-set-mode-line) - (let ((methods - (mapcar - (lambda (m) (if (stringp m) (gnus-server-get-method nil m) m)) - (append - (if (and (not not-native) - (gnus-check-server gnus-select-method)) - ;; The native server is available. - (cons gnus-select-method gnus-secondary-select-methods) - ;; The native server is down, so we just do the - ;; secondary ones. - gnus-secondary-select-methods) - ;; Also read from the archive server. - (when (gnus-archive-server-wanted-p) - (list "archive"))))) - method) - (setq gnus-have-read-active-file nil) - (save-excursion - (set-buffer nntp-server-buffer) - (while (setq method (pop methods)) - ;; Only do each method once, in case the methods appear more - ;; than once in this list. - (unless (member method methods) - (condition-case () - (gnus-read-active-file-1 method force) - ;; We catch C-g so that we can continue past servers - ;; that do not respond. - (quit - (message "Quit reading the active file") - nil))))))) - -(defun gnus-read-active-file-1 (method force) - (let (where mesg) - (setq where (nth 1 method) - mesg (format "Reading active file%s via %s..." - (if (and where (not (zerop (length where)))) - (concat " from " where) "") - (car method))) - (gnus-message 5 mesg) - (when (gnus-check-server method) - ;; Request that the backend scan its incoming messages. - (when (gnus-check-backend-function 'request-scan (car method)) - (gnus-request-scan nil method)) - (cond - ((and (eq gnus-read-active-file 'some) - (gnus-check-backend-function 'retrieve-groups (car method)) - (not force)) - (let ((newsrc (cdr gnus-newsrc-alist)) - (gmethod (gnus-server-get-method nil method)) - groups info) - (while (setq info (pop newsrc)) - (when (inline - (gnus-server-equal - (inline - (gnus-find-method-for-group - (gnus-info-group info) info)) - gmethod)) - (push (gnus-group-real-name (gnus-info-group info)) - groups))) - (gnus-read-active-file-2 groups method))) - ((null method) - t) - (t - (if (not (gnus-request-list method)) - (unless (equal method gnus-message-archive-method) - (gnus-error 1 "Cannot read active file from %s server" - (car method))) - (gnus-message 5 mesg) - (gnus-active-to-gnus-format method gnus-active-hashtb nil t) - ;; We mark this active file as read. - (push method gnus-have-read-active-file) - (gnus-message 5 "%sdone" mesg))))))) - -(defun gnus-read-active-file-2 (groups method) - "Read an active file for GROUPS in METHOD using gnus-retrieve-groups." - (when groups - (save-excursion - (set-buffer nntp-server-buffer) - (gnus-check-server method) - (let ((list-type (gnus-retrieve-groups groups method))) - (cond ((not list-type) - (gnus-error - 1.2 "Cannot read partial active file from %s server." - (car method))) - ((eq list-type 'active) - (gnus-active-to-gnus-format method gnus-active-hashtb nil t)) - (t - (gnus-groups-to-gnus-format method gnus-active-hashtb t))))))) - -;; Read an active file and place the results in `gnus-active-hashtb'. -(defun gnus-active-to-gnus-format (&optional method hashtb ignore-errors - real-active) - (unless method - (setq method gnus-select-method)) - (let ((cur (current-buffer)) - (hashtb (or hashtb - (if (and gnus-active-hashtb - (not (equal method gnus-select-method))) - gnus-active-hashtb - (setq gnus-active-hashtb - (if (equal method gnus-select-method) - (gnus-make-hashtable - (count-lines (point-min) (point-max))) - (gnus-make-hashtable 4096))))))) - ;; Delete unnecessary lines. - (goto-char (point-min)) - (cond - ((string= gnus-ignored-newsgroups "") - (delete-matching-lines "^to\\.")) - (t - (delete-matching-lines (concat "^to\\.\\|" gnus-ignored-newsgroups)))) - - (goto-char (point-min)) - (unless (re-search-forward "[\\\"]" nil t) - ;; Make the group names readable as a lisp expression even if they - ;; contain special characters. - (goto-char (point-max)) - (while (re-search-backward "[][';?()#]" nil t) - (insert ?\\))) - - ;; Let the Gnus agent save the active file. - (when (and gnus-agent real-active gnus-plugged) - (gnus-agent-save-active method)) - - ;; If these are groups from a foreign select method, we insert the - ;; group prefix in front of the group names. - (when (not (gnus-server-equal - (gnus-server-get-method nil method) - (gnus-server-get-method nil gnus-select-method))) - (let ((prefix (gnus-group-prefixed-name "" method))) - (goto-char (point-min)) - (while (and (not (eobp)) - (progn - (when (= (following-char) ?\") - (forward-char 1)) - (insert prefix) - (zerop (forward-line 1))))))) - ;; Store the active file in a hash table. - (goto-char (point-min)) - (let (group max min) - (while (not (eobp)) - (condition-case err - (progn - (narrow-to-region (point) (gnus-point-at-eol)) - ;; group gets set to a symbol interned in the hash table - ;; (what a hack!!) - jwz - (setq group (let ((obarray hashtb)) (read cur))) - ;; ### The extended group name scheme makes - ;; the previous optimization strategy sort of pointless... - (when (stringp group) - (setq group (intern group hashtb))) - (if (and (numberp (setq max (read cur))) - (numberp (setq min (read cur))) - (progn - (skip-chars-forward " \t") - (not - (or (eq (char-after) ?=) - (eq (char-after) ?x) - (eq (char-after) ?j))))) - (progn - (set group (cons min max)) - ;; if group is moderated, stick in moderation table - (when (eq (char-after) ?m) - (unless gnus-moderated-hashtb - (setq gnus-moderated-hashtb (gnus-make-hashtable))) - (gnus-sethash (symbol-name group) t - gnus-moderated-hashtb))) - (set group nil))) - (error - (and group - (symbolp group) - (set group nil)) - (unless ignore-errors - (gnus-message 3 "Warning - invalid active: %s" - (buffer-substring - (gnus-point-at-bol) (gnus-point-at-eol)))))) - (widen) - (forward-line 1))))) - -(defun gnus-groups-to-gnus-format (method &optional hashtb real-active) - ;; Parse a "groups" active file. - (let ((cur (current-buffer)) - (hashtb (or hashtb - (if (and method gnus-active-hashtb) - gnus-active-hashtb - (setq gnus-active-hashtb - (gnus-make-hashtable - (count-lines (point-min) (point-max))))))) - (prefix (and method - (not (gnus-server-equal - (gnus-server-get-method nil method) - (gnus-server-get-method nil gnus-select-method))) - (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)) - (progn - (gnus-agent-save-groups method) - (gnus-active-to-gnus-format method hashtb nil real-active)) - - (goto-char (point-min)) - ;; We split this into to separate loops, one with the prefix - ;; and one without to speed the reading up somewhat. - (if prefix - (let (min max opoint group) - (while (not (eobp)) - (condition-case () - (progn - (read cur) (read cur) - (setq min (read cur) - max (read cur) - opoint (point)) - (skip-chars-forward " \t") - (insert prefix) - (goto-char opoint) - (set (let ((obarray hashtb)) (read cur)) - (cons min max))) - (error (and group (symbolp group) (set group nil)))) - (forward-line 1))) - (let (min max group) - (while (not (eobp)) - (condition-case () - (when (eq (char-after) ?2) - (read cur) (read cur) - (setq min (read cur) - max (read cur)) - (set (setq group (let ((obarray hashtb)) (read cur))) - (cons min max))) - (error (and group (symbolp group) (set group nil)))) - (forward-line 1))))))) - -(defun gnus-read-newsrc-file (&optional force) - "Read startup file. -If FORCE is non-nil, the .newsrc file is read." - ;; Reset variables that might be defined in the .newsrc.eld file. - (gnus-clear-quick-file-variables) - (let* ((newsrc-file gnus-current-startup-file) - (quick-file (concat newsrc-file ".el"))) - (save-excursion - ;; We always load the .newsrc.eld file. If always contains - ;; much information that can not be gotten from the .newsrc - ;; file (ticked articles, killed groups, foreign methods, etc.) - (gnus-read-newsrc-el-file quick-file) - - (when (and gnus-read-newsrc-file - (file-exists-p gnus-current-startup-file) - (or force - (and (file-newer-than-file-p newsrc-file quick-file) - (file-newer-than-file-p newsrc-file - (concat quick-file "d"))) - (not gnus-newsrc-alist))) - ;; We read the .newsrc file. Note that if there if a - ;; .newsrc.eld file exists, it has already been read, and - ;; the `gnus-newsrc-hashtb' has been created. While reading - ;; the .newsrc file, Gnus will only use the information it - ;; can find there for changing the data already read - - ;; i. e., reading the .newsrc file will not trash the data - ;; already read (except for read articles). - (save-excursion - (gnus-message 5 "Reading %s..." newsrc-file) - (set-buffer (nnheader-find-file-noselect newsrc-file)) - (buffer-disable-undo) - (gnus-newsrc-to-gnus-format) - (kill-buffer (current-buffer)) - (gnus-message 5 "Reading %s...done" newsrc-file)))))) - -(defun gnus-read-newsrc-el-file (file) - (let ((ding-file (concat file "d"))) - ;; We always, always read the .eld file. - (gnus-message 5 "Reading %s..." ding-file) - (let (gnus-newsrc-assoc) - (when (file-exists-p ding-file) - (with-temp-buffer - (condition-case nil - (progn - (insert-file-contents-as-coding-system - gnus-ding-file-coding-system ding-file) - (eval-region (point-min) (point-max))) - (error - (ding) - (or (not (or (zerop (buffer-size)) - (eq 'binary gnus-startup-file-coding-system) - (gnus-re-read-newsrc-el-file ding-file))) - (gnus-yes-or-no-p - (format "Error in %s; continue? " ding-file)) - (error "Error in %s" ding-file))))) - (when gnus-newsrc-assoc - (setq gnus-newsrc-alist gnus-newsrc-assoc)))) - (gnus-make-hashtable-from-newsrc-alist) - (when (file-newer-than-file-p file ding-file) - ;; Old format quick file - (gnus-message 5 "Reading %s..." file) - ;; The .el file is newer than the .eld file, so we read that one - ;; as well. - (gnus-read-old-newsrc-el-file file))) - (when (and gnus-product-directory - (file-directory-p gnus-product-directory)) - (let ((list gnus-product-variable-file-list)) - (while list - (apply 'gnus-product-read-variable-file-1 (car list)) - (setq list (cdr list)))))) - -(defun gnus-re-read-newsrc-el-file (file) - "Attempt to re-read .newsrc.eld file. Returns `nil' if successful. -The backup file \".newsrc.eld_\" will be created before re-reading." - (message "Error in %s; retrying..." file) - (if (and - (condition-case nil - (let ((backup (concat file "_"))) - (copy-file file backup 'ok-if-already-exists 'keep-time) - (message " (The backup file %s has been created)" backup) - t) - (error nil)) - (progn - (insert-file-contents-as-binary file nil nil nil 'replace) - (when (re-search-forward - "^[\t ]*([\t\n\r ]*setq[\t\n\r ]+gnus-format-specs" nil t) - (delete-region (goto-char (match-beginning 0)) (forward-list 1)) - (decode-coding-region (point-min) (point-max) - gnus-startup-file-coding-system) - (condition-case nil - (progn - (eval-region (point-min) (point-max)) - t) - (error nil))))) - (prog1 - nil - (message "Error in %s; retrying...done" file)) - (message "Error in %s; retrying...failed" file) - t)) - -(defun gnus-product-read-variable-file-1 (file checking-methods coding - &rest variables) - (let (error gnus-product-file-version method file-ver) - (when (or - (condition-case err - (let ((coding-system-for-read coding) - (input-coding-system coding)) - (load (expand-file-name file gnus-product-directory) t nil t) - nil) - (error - (message "%s" err) - (setq error t))) - (and (assq 'emacs-version checking-methods) - (not (string= emacs-version - (cdr (assq 'emacs-version - gnus-product-file-version))))) - (and (setq method (assq 'product-version checking-methods)) - (or (not (setq file-ver - (cdr (assq 'product-version - gnus-product-file-version)))) - (< (product-version-compare file-ver (cadr method)) 0)))) - (unless error - (message "\"%s\" seems to have mismatched contents, updating..." - file)) - (while variables - (set (car variables) nil) - (gnus-product-variable-touch (car variables)) - (setq variables (cdr variables)))))) - -;; Parse the old-style quick startup file -(defun gnus-read-old-newsrc-el-file (file) - (let (newsrc killed marked group m info) - (prog1 - (let ((gnus-killed-assoc nil) - gnus-marked-assoc gnus-newsrc-alist gnus-newsrc-assoc) - (prog1 - (ignore-errors - (load file t t t)) - (setq newsrc gnus-newsrc-assoc - killed gnus-killed-assoc - marked gnus-marked-assoc))) - (setq gnus-newsrc-alist nil) - (while (setq group (pop newsrc)) - (if (setq info (gnus-get-info (car group))) - (progn - (gnus-info-set-read info (cddr group)) - (gnus-info-set-level - info (if (nth 1 group) gnus-level-default-subscribed - gnus-level-default-unsubscribed)) - (push info gnus-newsrc-alist)) - (push (setq info - (list (car group) - (if (nth 1 group) gnus-level-default-subscribed - gnus-level-default-unsubscribed) - (cddr group))) - gnus-newsrc-alist)) - ;; Copy marks into info. - (when (setq m (assoc (car group) marked)) - (unless (nthcdr 3 info) - (nconc info (list nil))) - (gnus-info-set-marks - info (list (cons 'tick (gnus-compress-sequence - (sort (cdr m) '<) t)))))) - (setq newsrc killed) - (while newsrc - (setcar newsrc (caar newsrc)) - (setq newsrc (cdr newsrc))) - (setq gnus-killed-list killed)) - ;; The .el file version of this variable does not begin with - ;; "options", while the .eld version does, so we just add it if it - ;; isn't there. - (when - gnus-newsrc-options - (when (not (string-match "^ *options" gnus-newsrc-options)) - (setq gnus-newsrc-options (concat "options " gnus-newsrc-options))) - (when (not (string-match "\n$" gnus-newsrc-options)) - (setq gnus-newsrc-options (concat gnus-newsrc-options "\n"))) - ;; Finally, if we read some options lines, we parse them. - (unless (string= gnus-newsrc-options "") - (gnus-newsrc-parse-options gnus-newsrc-options))) - - (setq gnus-newsrc-alist (nreverse gnus-newsrc-alist)) - (gnus-make-hashtable-from-newsrc-alist))) - -(defun gnus-make-newsrc-file (file) - "Make server dependent file name by catenating FILE and server host name." - (let* ((file (expand-file-name file nil)) - (real-file (concat file "-" (nth 1 gnus-select-method)))) - (if (or (file-exists-p real-file) - (file-exists-p (concat real-file ".el")) - (file-exists-p (concat real-file ".eld"))) - real-file - file))) - -(defun gnus-newsrc-to-gnus-format () - (setq gnus-newsrc-options "") - (setq gnus-newsrc-options-n nil) - - (unless gnus-active-hashtb - (setq gnus-active-hashtb (gnus-make-hashtable 4096))) - (let ((buf (current-buffer)) - (already-read (> (length gnus-newsrc-alist) 1)) - group subscribed options-symbol newsrc Options-symbol - symbol reads num1) - (goto-char (point-min)) - ;; We intern the symbol `options' in the active hashtb so that we - ;; can `eq' against it later. - (set (setq options-symbol (intern "options" gnus-active-hashtb)) nil) - (set (setq Options-symbol (intern "Options" gnus-active-hashtb)) nil) - - (while (not (eobp)) - ;; We first read the first word on the line by narrowing and - ;; then reading into `gnus-active-hashtb'. Most groups will - ;; already exist in that hashtb, so this will save some string - ;; space. - (narrow-to-region - (point) - (progn (skip-chars-forward "^ \t!:\n") (point))) - (goto-char (point-min)) - (setq symbol - (and (/= (point-min) (point-max)) - (let ((obarray gnus-active-hashtb)) (read buf)))) - (widen) - ;; Now, the symbol we have read is either `options' or a group - ;; name. If it is an options line, we just add it to a string. - (cond - ((or (eq symbol options-symbol) - (eq symbol Options-symbol)) - (setq gnus-newsrc-options - ;; This concating is quite inefficient, but since our - ;; thorough studies show that approx 99.37% of all - ;; .newsrc files only contain a single options line, we - ;; don't give a damn, frankly, my dear. - (concat gnus-newsrc-options - (buffer-substring - (gnus-point-at-bol) - ;; Options may continue on the next line. - (or (and (re-search-forward "^[^ \t]" nil 'move) - (progn (beginning-of-line) (point))) - (point))))) - (forward-line -1)) - (symbol - ;; Group names can be just numbers. - (when (numberp symbol) - (setq symbol (intern (int-to-string symbol) gnus-active-hashtb))) - (unless (boundp symbol) - (set symbol nil)) - ;; It was a group name. - (setq subscribed (eq (char-after) ?:) - group (symbol-name symbol) - reads nil) - (if (eolp) - ;; If the line ends here, this is clearly a buggy line, so - ;; we put point a the beginning of line and let the cond - ;; below do the error handling. - (beginning-of-line) - ;; We skip to the beginning of the ranges. - (skip-chars-forward "!: \t")) - ;; We are now at the beginning of the list of read articles. - ;; We read them range by range. - (while - (cond - ((looking-at "[0-9]+") - ;; We narrow and read a number instead of buffer-substring/ - ;; string-to-int because it's faster. narrow/widen is - ;; faster than save-restriction/narrow, and save-restriction - ;; produces a garbage object. - (setq num1 (progn - (narrow-to-region (match-beginning 0) (match-end 0)) - (read buf))) - (widen) - ;; If the next character is a dash, then this is a range. - (if (eq (char-after) ?-) - (progn - ;; We read the upper bound of the range. - (forward-char 1) - (if (not (looking-at "[0-9]+")) - ;; This is a buggy line, by we pretend that - ;; it's kinda OK. Perhaps the user should be - ;; dinged? - (push num1 reads) - (push - (cons num1 - (progn - (narrow-to-region (match-beginning 0) - (match-end 0)) - (read buf))) - reads) - (widen))) - ;; It was just a simple number, so we add it to the - ;; list of ranges. - (push num1 reads)) - ;; If the next char in ?\n, then we have reached the end - ;; of the line and return nil. - (not (eq (char-after) ?\n))) - ((eq (char-after) ?\n) - ;; End of line, so we end. - nil) - (t - ;; Not numbers and not eol, so this might be a buggy - ;; line... - (unless (eobp) - ;; If it was eob instead of ?\n, we allow it. - ;; The line was buggy. - (setq group nil) - (gnus-error 3.1 "Mangled line: %s" - (buffer-substring (gnus-point-at-bol) - (gnus-point-at-eol)))) - nil)) - ;; Skip past ", ". Spaces are invalid in these ranges, but - ;; we allow them, because it's a common mistake to put a - ;; space after the comma. - (skip-chars-forward ", ")) - - ;; We have already read .newsrc.eld, so we gently update the - ;; data in the hash table with the information we have just - ;; read. - (when group - (let ((info (gnus-get-info group)) - level) - (if info - ;; There is an entry for this file in the alist. - (progn - (gnus-info-set-read info (nreverse reads)) - ;; We update the level very gently. In fact, we - ;; only change it if there's been a status change - ;; from subscribed to unsubscribed, or vice versa. - (setq level (gnus-info-level info)) - (cond ((and (<= level gnus-level-subscribed) - (not subscribed)) - (setq level (if reads - gnus-level-default-unsubscribed - (1+ gnus-level-default-unsubscribed)))) - ((and (> level gnus-level-subscribed) subscribed) - (setq level gnus-level-default-subscribed))) - (gnus-info-set-level info level)) - ;; This is a new group. - (setq info (list group - (if subscribed - gnus-level-default-subscribed - (if reads - (1+ gnus-level-subscribed) - gnus-level-default-unsubscribed)) - (nreverse reads)))) - (push info newsrc))))) - (forward-line 1)) - - (setq newsrc (nreverse newsrc)) - - (if (not already-read) - () - ;; We now have two newsrc lists - `newsrc', which is what we - ;; have read from .newsrc, and `gnus-newsrc-alist', which is - ;; what we've read from .newsrc.eld. We have to merge these - ;; lists. We do this by "attaching" any (foreign) groups in the - ;; gnus-newsrc-alist to the (native) group that precedes them. - (let ((rc (cdr gnus-newsrc-alist)) - (prev gnus-newsrc-alist) - entry mentry) - (while rc - (or (null (nth 4 (car rc))) ; It's a native group. - (assoc (caar rc) newsrc) ; It's already in the alist. - (if (setq entry (assoc (caar prev) newsrc)) - (setcdr (setq mentry (memq entry newsrc)) - (cons (car rc) (cdr mentry))) - (push (car rc) newsrc))) - (setq prev rc - rc (cdr rc))))) - - (setq gnus-newsrc-alist newsrc) - ;; We make the newsrc hashtb. - (gnus-make-hashtable-from-newsrc-alist) - - ;; Finally, if we read some options lines, we parse them. - (unless (string= gnus-newsrc-options "") - (gnus-newsrc-parse-options gnus-newsrc-options)))) - -;; Parse options lines to find "options -n !all rec.all" and stuff. -;; The return value will be a list on the form -;; ((regexp1 . ignore) -;; (regexp2 . subscribe)...) -;; When handling new newsgroups, groups that match a `ignore' regexp -;; will be ignored, and groups that match a `subscribe' regexp will be -;; subscribed. A line like -;; options -n !all rec.all -;; will lead to a list that looks like -;; (("^rec\\..+" . subscribe) -;; ("^.+" . ignore)) -;; So all "rec.*" groups will be subscribed, while all the other -;; groups will be ignored. Note that "options -n !all rec.all" is very -;; different from "options -n rec.all !all". -(defun gnus-newsrc-parse-options (options) - (let (out eol) - (save-excursion - (gnus-set-work-buffer) - (insert (regexp-quote options)) - ;; First we treat all continuation lines. - (goto-char (point-min)) - (while (re-search-forward "\n[ \t]+" nil t) - (replace-match " " t t)) - ;; Then we transform all "all"s into ".+"s. - (goto-char (point-min)) - (while (re-search-forward "\\ball\\b" nil t) - (replace-match ".+" t t)) - (goto-char (point-min)) - ;; We remove all other options than the "-n" ones. - (while (re-search-forward "[ \t]-[^n][^-]*" nil t) - (replace-match " ") - (forward-char -1)) - (goto-char (point-min)) - - ;; We are only interested in "options -n" lines - we - ;; ignore the other option lines. - (while (re-search-forward "[ \t]-n" nil t) - (setq eol - (or (save-excursion - (and (re-search-forward "[ \t]-n" (gnus-point-at-eol) t) - (- (point) 2))) - (gnus-point-at-eol))) - ;; Search for all "words"... - (while (re-search-forward "[^ \t,\n]+" eol t) - (if (eq (char-after (match-beginning 0)) ?!) - ;; If the word begins with a bang (!), this is a "not" - ;; spec. We put this spec (minus the bang) and the - ;; symbol `ignore' into the list. - (push (cons (concat - "^" (buffer-substring - (1+ (match-beginning 0)) - (match-end 0)) - "\\($\\|\\.\\)") - 'ignore) - out) - ;; There was no bang, so this is a "yes" spec. - (push (cons (concat "^" (match-string 0) "\\($\\|\\.\\)") - 'subscribe) - out)))) - - (setq gnus-newsrc-options-n out)))) - -(defun gnus-save-newsrc-file (&optional force) - "Save .newsrc file." - ;; Note: We cannot save .newsrc file if all newsgroups are removed - ;; from the variable gnus-newsrc-alist. - (when (and (or gnus-newsrc-alist gnus-killed-list) - gnus-current-startup-file) - (save-excursion - (if (and (or gnus-use-dribble-file gnus-slave) - (not force) - (or (not gnus-dribble-buffer) - (not (buffer-name gnus-dribble-buffer)) - (zerop (save-excursion - (set-buffer gnus-dribble-buffer) - (buffer-size))))) - (gnus-message 4 "(No changes need to be saved)") - (gnus-run-hooks 'gnus-save-newsrc-hook) - (if gnus-slave - (gnus-slave-save-newsrc) - ;; Save .newsrc. - (when gnus-save-newsrc-file - (gnus-message 8 "Saving %s..." gnus-current-startup-file) - (gnus-gnus-to-newsrc-format) - (gnus-message 8 "Saving %s...done" gnus-current-startup-file)) - ;; Save .newsrc.eld. - (set-buffer (gnus-get-buffer-create " *Gnus-newsrc*")) - (make-local-variable 'version-control) - (setq version-control 'never) - (setq buffer-file-name - (concat gnus-current-startup-file ".eld")) - (setq default-directory (file-name-directory buffer-file-name)) - (buffer-disable-undo) - (erase-buffer) - (gnus-message 5 "Saving %s.eld..." gnus-current-startup-file) - (gnus-gnus-to-quick-newsrc-format) - (gnus-run-hooks 'gnus-save-quick-newsrc-hook) - (save-buffer-as-coding-system gnus-ding-file-coding-system) - (kill-buffer (current-buffer)) - (gnus-message - 5 "Saving %s.eld...done" gnus-current-startup-file)) - (gnus-dribble-delete-file) - (gnus-group-set-mode-line)))) - (when gnus-product-directory - (gnus-product-save-variable-file))) - -;; Call the function above at C-x C-c. -(defadvice save-buffers-kill-emacs (before save-gnus-newsrc-file-maybe - activate preactivate) - "Save .newsrc and .newsrc.eld when Emacs is killed." - (when (gnus-alive-p) - (gnus-run-hooks 'gnus-exit-gnus-hook) - (gnus-offer-save-summaries) - (gnus-save-newsrc-file))) - -(defun gnus-gnus-to-quick-newsrc-format () - "Insert Gnus variables such as gnus-newsrc-alist in lisp format." - (let ((print-quoted t) - (print-escape-newlines t)) - - (insert ";; -*- emacs-lisp -*-\n") - (insert ";; Gnus startup file.\n") - (insert "\ -;; Never delete this file -- if you want to force Gnus to read the -;; .newsrc file (if you have one), touch .newsrc instead.\n") - (insert "(setq gnus-newsrc-file-version " - (prin1-to-string gnus-version) ")\n") - (let* ((gnus-killed-list - (if (and gnus-save-killed-list - (stringp gnus-save-killed-list)) - (gnus-strip-killed-list) - gnus-killed-list)) - (variables - (if gnus-save-killed-list gnus-variable-list - ;; Remove the `gnus-killed-list' from the list of variables - ;; to be saved, if required. - (delq 'gnus-killed-list (copy-sequence gnus-variable-list)))) - ;; Peel off the "dummy" group. - (gnus-newsrc-alist (cdr gnus-newsrc-alist)) - variable) - ;; Insert the variables into the file. - (while variables - (when (and (boundp (setq variable (pop variables))) - (symbol-value variable)) - (insert "(setq " (symbol-name variable) " '") - (gnus-prin1 (symbol-value variable)) - (insert ")\n")))))) - -(defun gnus-product-variable-touch (&rest variables) - (while variables - (put (pop variables) 'gnus-product-variable 'dirty))) - -(defun gnus-product-variables-dirty-p (variables) - (catch 'done - (while variables - (when (eq (get (car variables) 'gnus-product-variable) 'dirty) - (throw 'done t)) - (setq variables (cdr variables))))) - -(defun gnus-product-save-variable-file (&optional force) - "Save all product variables to files, when need to be saved." - (let ((list gnus-product-variable-file-list)) - (gnus-make-directory gnus-product-directory) - (while list - (apply 'gnus-product-save-variable-file-1 force (car list)) - (setq list (cdr list))))) - -(defun gnus-product-save-variable-file-1 (force file checking-methods coding - &rest variables) - "Save a product variable file, when need to be saved." - (when (or force - (gnus-product-variables-dirty-p variables)) - (let ((product (product-find 'gnus-vers))) - (set-buffer (gnus-get-buffer-create " *gnus-product*")) - (make-local-variable 'version-control) - (setq version-control 'never) - (setq file (expand-file-name file gnus-product-directory) - buffer-file-name file - default-directory (file-name-directory file)) - (buffer-disable-undo) - (erase-buffer) - (gnus-message 5 "Saving %s..." file) - (apply 'gnus-product-quick-file-format product checking-methods coding - variables) - (save-buffer-as-coding-system coding) - (kill-buffer (current-buffer)) - (while variables - (put (car variables) 'gnus-product-variable nil) - (setq variables (cdr variables))) - (gnus-message - 5 "Saving %s...done" file)))) - -(defun gnus-product-quick-file-format (product checking-methods - coding &rest variables) - "Insert gnus product depend variables in lisp format." - (let ((print-quoted t) - (print-escape-newlines t) - variable param) - (insert (format ";; -*- Mode: emacs-lisp; coding: %s -*-\n" coding)) - (insert (format ";; %s startup file.\n" (product-name product))) - (when (setq param (cdr (assq 'product-version checking-methods))) - (insert "(or (>= (product-version-compare " - "(product-version (product-find 'gnus-vers))\n" - "\t\t\t\t '" (apply 'prin1-to-string param) ")\n" - "\t0)\n" - " (error \"This file was created by later version of " - "gnus.\"))\n")) - (insert "(setq gnus-product-file-version \n" - " '((product-version . " - (prin1-to-string (product-version product)) ")\n" - "\t(emacs-version . " (prin1-to-string emacs-version) ")))\n") - (while variables - (when (and (boundp (setq variable (pop variables))) - (symbol-value variable)) - (insert "(setq " (symbol-name variable) " '") - (gnus-prin1 (symbol-value variable)) - (insert ")\n"))))) - -(defun gnus-strip-killed-list () - "Return the killed list minus the groups that match `gnus-save-killed-list'." - (let ((list gnus-killed-list) - olist) - (while list - (when (string-match gnus-save-killed-list (car list)) - (push (car list) olist)) - (pop list)) - (nreverse olist))) - -(defun gnus-gnus-to-newsrc-format () - ;; Generate and save the .newsrc file. - (save-excursion - (set-buffer (create-file-buffer gnus-current-startup-file)) - (let ((newsrc (cdr gnus-newsrc-alist)) - (standard-output (current-buffer)) - info ranges range method) - (setq buffer-file-name gnus-current-startup-file) - (setq default-directory (file-name-directory buffer-file-name)) - (buffer-disable-undo) - (erase-buffer) - ;; Write options. - (when gnus-newsrc-options - (insert gnus-newsrc-options)) - ;; Write subscribed and unsubscribed. - (while (setq info (pop newsrc)) - ;; Don't write foreign groups to .newsrc. - (when (or (null (setq method (gnus-info-method info))) - (equal method "native") - (inline (gnus-server-equal method gnus-select-method))) - (insert (gnus-info-group info) - (if (> (gnus-info-level info) gnus-level-subscribed) - "!" ":")) - (when (setq ranges (gnus-info-read info)) - (insert " ") - (if (not (listp (cdr ranges))) - (if (= (car ranges) (cdr ranges)) - (princ (car ranges)) - (princ (car ranges)) - (insert "-") - (princ (cdr ranges))) - (while (setq range (pop ranges)) - (if (or (atom range) (= (car range) (cdr range))) - (princ (or (and (atom range) range) (car range))) - (princ (car range)) - (insert "-") - (princ (cdr range))) - (when ranges - (insert ","))))) - (insert "\n"))) - (make-local-variable 'version-control) - (setq version-control 'never) - ;; It has been reported that sometime the modtime on the .newsrc - ;; file seems to be off. We really do want to overwrite it, so - ;; we clear the modtime here before saving. It's a bit odd, - ;; though... - ;; sometimes the modtime clear isn't sufficient. most brute force: - ;; delete the silly thing entirely first. but this fails to provide - ;; such niceties as .newsrc~ creation. - (if gnus-modtime-botch - (delete-file gnus-startup-file) - (clear-visited-file-modtime)) - (gnus-run-hooks 'gnus-save-standard-newsrc-hook) - (save-buffer) - (kill-buffer (current-buffer))))) - - -;;; -;;; Slave functions. -;;; - -(defvar gnus-slave-mode nil) - -(defun gnus-slave-mode () - "Minor mode for slave Gnusae." - (gnus-add-minor-mode 'gnus-slave-mode " Slave" (make-sparse-keymap)) - (gnus-run-hooks 'gnus-slave-mode-hook)) - -(defun gnus-slave-save-newsrc () - (save-excursion - (set-buffer gnus-dribble-buffer) - (let ((slave-name - (make-temp-name (concat gnus-current-startup-file "-slave-"))) - (modes (ignore-errors - (file-modes (concat gnus-current-startup-file ".eld"))))) - (gnus-write-buffer-as-coding-system gnus-ding-file-coding-system - slave-name) - (when modes - (set-file-modes slave-name modes))))) - -(defun gnus-master-read-slave-newsrc () - (let ((slave-files - (directory-files - (file-name-directory gnus-current-startup-file) - t (concat - "^" (regexp-quote - (concat - (file-name-nondirectory gnus-current-startup-file) - "-slave-"))) - t)) - file) - (if (not slave-files) - () ; There are no slave files to read. - (gnus-message 7 "Reading slave newsrcs...") - (save-excursion - (set-buffer (gnus-get-buffer-create " *gnus slave*")) - (setq slave-files - (sort (mapcar (lambda (file) - (list (nth 5 (file-attributes file)) file)) - slave-files) - (lambda (f1 f2) - (or (< (caar f1) (caar f2)) - (< (nth 1 (car f1)) (nth 1 (car f2))))))) - (while slave-files - (erase-buffer) - (setq file (nth 1 (car slave-files))) - (nnheader-insert-file-contents file) - (when (condition-case () - (progn - (eval-buffer (current-buffer)) - t) - (error - (gnus-error 3.2 "Possible error in %s" file) - nil)) - (unless gnus-slave ; Slaves shouldn't delete these files. - (ignore-errors - (delete-file file)))) - (setq slave-files (cdr slave-files)))) - (gnus-dribble-touch) - (gnus-message 7 "Reading slave newsrcs...done")))) - - -;;; -;;; Group description. -;;; - -(defun gnus-read-all-descriptions-files () - (let ((methods (cons gnus-select-method - (nconc - (when (gnus-archive-server-wanted-p) - (list "archive")) - gnus-secondary-select-methods)))) - (while methods - (gnus-read-descriptions-file (car methods)) - (setq methods (cdr methods))) - t)) - -(defun gnus-read-descriptions-file (&optional method) - (let ((method (or method gnus-select-method)) - group) - (when (stringp method) - (setq method (gnus-server-to-method method))) - ;; We create the hashtable whether we manage to read the desc file - ;; to avoid trying to re-read after a failed read. - (unless gnus-description-hashtb - (setq gnus-description-hashtb - (gnus-make-hashtable (length gnus-active-hashtb)))) - ;; Mark this method's desc file as read. - (gnus-sethash (gnus-group-prefixed-name "" method) "Has read" - gnus-description-hashtb) - - (gnus-message 5 "Reading descriptions file via %s..." (car method)) - (cond - ((null (gnus-get-function method 'request-list-newsgroups t)) - t) - ((not (gnus-check-server method)) - (gnus-message 1 "Couldn't open server") - nil) - ((not (gnus-request-list-newsgroups method)) - (gnus-message 1 "Couldn't read newsgroups descriptions") - nil) - (t - (save-excursion - (save-restriction - (set-buffer nntp-server-buffer) - (goto-char (point-min)) - (when (or (search-forward "\n.\n" nil t) - (goto-char (point-max))) - (beginning-of-line) - (narrow-to-region (point-min) (point))) - ;; If these are groups from a foreign select method, we insert the - ;; group prefix in front of the group names. - (and method (not (inline - (gnus-server-equal - (gnus-server-get-method nil method) - (gnus-server-get-method - nil gnus-select-method)))) - (let ((prefix (gnus-group-prefixed-name "" method))) - (goto-char (point-min)) - (while (and (not (eobp)) - (progn (insert prefix) - (zerop (forward-line 1))))))) - (goto-char (point-min)) - (while (not (eobp)) - ;; If we get an error, we set group to 0, which is not a - ;; symbol... - (setq group - (condition-case () - (let ((obarray gnus-description-hashtb)) - ;; Group is set to a symbol interned in this - ;; hash table. - (read nntp-server-buffer)) - (error 0))) - (skip-chars-forward " \t") - ;; ... which leads to this line being effectively ignored. - (when (symbolp group) - (let* ((str (buffer-substring - (point) (progn (end-of-line) (point)))) - (name (symbol-name group)) - (charset - (or (gnus-group-name-charset method name) - (gnus-parameter-charset name)))) - (when (and str charset (featurep 'mule)) - (setq str (decode-coding-string str charset))) - (set group str))) - (forward-line 1)))) - (gnus-message 5 "Reading descriptions file...done") - t)))) - -(defun gnus-group-get-description (group) - "Get the description of a group by sending XGTITLE to the server." - (when (gnus-request-group-description group) - (save-excursion - (set-buffer nntp-server-buffer) - (goto-char (point-min)) - (when (looking-at "[^ \t]+[ \t]+\\(.*\\)") - (match-string 1))))) - -;;;###autoload -(defun gnus-declare-backend (name &rest abilities) - "Declare backend NAME with ABILITIES as a Gnus backend." - (setq gnus-valid-select-methods - (nconc gnus-valid-select-methods - (list (apply 'list name abilities)))) - (gnus-redefine-select-method-widget)) - -(defun gnus-set-default-directory () - "Set the default directory in the current buffer to `gnus-default-directory'. -If this variable is nil, don't do anything." - (setq default-directory - (if (and gnus-default-directory - (file-exists-p gnus-default-directory)) - (file-name-as-directory (expand-file-name gnus-default-directory)) - default-directory))) - -(defun gnus-display-time-event-handler () - "Like `display-time-event-handler', but test `display-time-timer'." - (when (gnus-boundp 'display-time-timer) - (display-time-event-handler))) - -(provide 'gnus-start) - -;;; gnus-start.el ends here diff --git a/lisp/gnus-sum.el b/lisp/gnus-sum.el deleted file mode 100644 index ba32f04..0000000 --- a/lisp/gnus-sum.el +++ /dev/null @@ -1,10924 +0,0 @@ -;;; gnus-sum.el --- summary mode commands for Semi-gnus -;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; MORIOKA Tomohiko -;; Katsumi Yamaoka -;; Keywords: mail, news, MIME - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'gnus-clfns)) - -(require 'gnus) -(require 'gnus-group) -(require 'gnus-spec) -(require 'gnus-range) -(require 'gnus-int) -(require 'gnus-undo) -(require 'gnus-util) -;; Recursive :-(. -;; (require 'gnus-art) -(require 'nnoo) -(require 'mime-view) - -(eval-when-compile - (require 'mime-play) - (require 'static)) - -(eval-and-compile - (autoload 'pgg-decrypt-region "pgg" nil t) - (autoload 'pgg-verify-region "pgg" nil t)) - -(autoload 'gnus-summary-limit-include-cached "gnus-cache" nil t) -(autoload 'gnus-cache-write-active "gnus-cache") -(autoload 'gnus-set-summary-default-charset "gnus-i18n" nil t) -(autoload 'gnus-mailing-list-insinuate "gnus-ml" nil t) -(autoload 'turn-on-gnus-mailing-list-mode "gnus-ml" nil t) -(autoload 'mm-uu-dissect "mm-uu") - -(defcustom gnus-kill-summary-on-exit t - "*If non-nil, kill the summary buffer when you exit from it. -If nil, the summary will become a \"*Dead Summary*\" buffer, and -it will be killed sometime later." - :group 'gnus-summary-exit - :type 'boolean) - -(defcustom gnus-fetch-old-headers nil - "*Non-nil means that Gnus will try to build threads by grabbing old headers. -If an unread article in the group refers to an older, already read (or -just marked as read) article, the old article will not normally be -displayed in the Summary buffer. If this variable is non-nil, Gnus -will attempt to grab the headers to the old articles, and thereby -build complete threads. If it has the value `some', only enough -headers to connect otherwise loose threads will be displayed. This -variable can also be a number. In that case, no more than that number -of old headers will be fetched. If it has the value `invisible', all -old headers will be fetched, but none will be displayed. - -The server has to support NOV for any of this to work." - :group 'gnus-thread - :type '(choice (const :tag "off" nil) - (const some) - number - (sexp :menu-tag "other" t))) - -(defcustom gnus-refer-thread-limit 200 - "*The number of old headers to fetch when doing \\\\[gnus-summary-refer-thread]. -If t, fetch all the available old headers." - :group 'gnus-thread - :type '(choice number - (sexp :menu-tag "other" t))) - -(defcustom gnus-summary-make-false-root 'adopt - "*nil means that Gnus won't gather loose threads. -If the root of a thread has expired or been read in a previous -session, the information necessary to build a complete thread has been -lost. Instead of having many small sub-threads from this original thread -scattered all over the summary buffer, Gnus can gather them. - -If non-nil, Gnus will try to gather all loose sub-threads from an -original thread into one large thread. - -If this variable is non-nil, it should be one of `none', `adopt', -`dummy' or `empty'. - -If this variable is `none', Gnus will not make a false root, but just -present the sub-threads after another. -If this variable is `dummy', Gnus will create a dummy root that will -have all the sub-threads as children. -If this variable is `adopt', Gnus will make one of the \"children\" -the parent and mark all the step-children as such. -If this variable is `empty', the \"children\" are printed with empty -subject fields. (Or rather, they will be printed with a string -given by the `gnus-summary-same-subject' variable.)" - :group 'gnus-thread - :type '(choice (const :tag "off" nil) - (const none) - (const dummy) - (const adopt) - (const empty))) - -(defcustom gnus-summary-gather-exclude-subject "^ *$\\|^(none)$" - "*A regexp to match subjects to be excluded from loose thread gathering. -As loose thread gathering is done on subjects only, that means that -there can be many false gatherings performed. By rooting out certain -common subjects, gathering might become saner." - :group 'gnus-thread - :type 'regexp) - -(defcustom gnus-summary-gather-subject-limit nil - "*Maximum length of subject comparisons when gathering loose threads. -Use nil to compare full subjects. Setting this variable to a low -number will help gather threads that have been corrupted by -newsreaders chopping off subject lines, but it might also mean that -unrelated articles that have subject that happen to begin with the -same few characters will be incorrectly gathered. - -If this variable is `fuzzy', Gnus will use a fuzzy algorithm when -comparing subjects." - :group 'gnus-thread - :type '(choice (const :tag "off" nil) - (const fuzzy) - (sexp :menu-tag "on" t))) - -(defcustom gnus-simplify-subject-functions nil - "List of functions taking a string argument that simplify subjects. -The functions are applied recursively. - -Useful functions to put in this list include: `gnus-simplify-subject-re', -`gnus-simplify-subject-fuzzy' and `gnus-simplify-whitespace'." - :group 'gnus-thread - :type '(repeat function)) - -(defcustom gnus-simplify-ignored-prefixes nil - "*Regexp, matches for which are removed from subject lines when simplifying fuzzily." - :group 'gnus-thread - :type '(choice (const :tag "off" nil) - regexp)) - -(defcustom gnus-build-sparse-threads nil - "*If non-nil, fill in the gaps in threads. -If `some', only fill in the gaps that are needed to tie loose threads -together. If `more', fill in all leaf nodes that Gnus can find. If -non-nil and non-`some', fill in all gaps that Gnus manages to guess." - :group 'gnus-thread - :type '(choice (const :tag "off" nil) - (const some) - (const more) - (sexp :menu-tag "all" t))) - -(defcustom gnus-summary-thread-gathering-function - 'gnus-gather-threads-by-subject - "*Function used for gathering loose threads. -There are two pre-defined functions: `gnus-gather-threads-by-subject', -which only takes Subjects into consideration; and -`gnus-gather-threads-by-references', which compared the References -headers of the articles to find matches." - :group 'gnus-thread - :type '(radio (function-item gnus-gather-threads-by-subject) - (function-item gnus-gather-threads-by-references) - (function :tag "other"))) - -(defcustom gnus-summary-same-subject "" - "*String indicating that the current article has the same subject as the previous. -This variable will only be used if the value of -`gnus-summary-make-false-root' is `empty'." - :group 'gnus-summary-format - :type 'string) - -(defcustom gnus-summary-goto-unread t - "*If t, many commands will go to the next unread article. -This applies to marking commands as well as other commands that -\"naturally\" select the next article, like, for instance, `SPC' at -the end of an article. - -If nil, the marking commands do NOT go to the next unread article -(they go to the next article instead). If `never', commands that -usually go to the next unread article, will go to the next article, -whether it is read or not." - :group 'gnus-summary-marks - :link '(custom-manual "(gnus)Setting Marks") - :type '(choice (const :tag "off" nil) - (const never) - (sexp :menu-tag "on" t))) - -(defcustom gnus-summary-default-score 0 - "*Default article score level. -All scores generated by the score files will be added to this score. -If this variable is nil, scoring will be disabled." - :group 'gnus-score-default - :type '(choice (const :tag "disable") - integer)) - -(defcustom gnus-summary-default-high-score 0 - "*Default threshold for a high scored article. -An article will be highlighted as high scored if its score is greater -than this score." - :group 'gnus-score-default - :type 'integer) - -(defcustom gnus-summary-default-low-score 0 - "*Default threshold for a low scored article. -An article will be highlighted as low scored if its score is smaller -than this score." - :group 'gnus-score-default - :type 'integer) - -(defcustom gnus-summary-zcore-fuzz 0 - "*Fuzziness factor for the zcore in the summary buffer. -Articles with scores closer than this to `gnus-summary-default-score' -will not be marked." - :group 'gnus-summary-format - :type 'integer) - -(defcustom gnus-simplify-subject-fuzzy-regexp nil - "*Strings to be removed when doing fuzzy matches. -This can either be a regular expression or list of regular expressions -that will be removed from subject strings if fuzzy subject -simplification is selected." - :group 'gnus-thread - :type '(repeat regexp)) - -(defcustom gnus-show-threads t - "*If non-nil, display threads in summary mode." - :group 'gnus-thread - :type 'boolean) - -(defcustom gnus-thread-hide-subtree nil - "*If non-nil, hide all threads initially. -If threads are hidden, you have to run the command -`gnus-summary-show-thread' by hand or use `gnus-select-article-hook' -to expose hidden threads." - :group 'gnus-thread - :type 'boolean) - -(defcustom gnus-thread-hide-killed t - "*If non-nil, hide killed threads automatically." - :group 'gnus-thread - :type 'boolean) - -(defcustom gnus-thread-ignore-subject t - "*If non-nil, which is the default, ignore subjects and do all threading based on the Reference header. -If nil, articles that have different subjects from their parents will -start separate threads." - :group 'gnus-thread - :type 'boolean) - -(defcustom gnus-thread-operation-ignore-subject t - "*If non-nil, subjects will be ignored when doing thread commands. -This affects commands like `gnus-summary-kill-thread' and -`gnus-summary-lower-thread'. - -If this variable is nil, articles in the same thread with different -subjects will not be included in the operation in question. If this -variable is `fuzzy', only articles that have subjects that are fuzzily -equal will be included." - :group 'gnus-thread - :type '(choice (const :tag "off" nil) - (const fuzzy) - (sexp :tag "on" t))) - -(defcustom gnus-thread-indent-level 4 - "*Number that says how much each sub-thread should be indented." - :group 'gnus-thread - :type 'integer) - -(defcustom gnus-auto-extend-newsgroup t - "*If non-nil, extend newsgroup forward and backward when requested." - :group 'gnus-summary-choose - :type 'boolean) - -(defcustom gnus-auto-select-first t - "*If nil, don't select the first unread article when entering a group. -If this variable is `best', select the highest-scored unread article -in the group. If t, select the first unread article. - -This variable can also be a function to place point on a likely -subject line. Useful values include `gnus-summary-first-unread-subject', -`gnus-summary-first-unread-article' and -`gnus-summary-best-unread-article'. - -If you want to prevent automatic selection of the first unread article -in some newsgroups, set the variable to nil in -`gnus-select-group-hook'." - :group 'gnus-group-select - :type '(choice (const :tag "none" nil) - (const best) - (sexp :menu-tag "first" t) - (function-item gnus-summary-first-unread-subject) - (function-item gnus-summary-first-unread-article) - (function-item gnus-summary-best-unread-article))) - -(defcustom gnus-dont-select-after-jump-to-other-group nil - "If non-nil, don't select the first unread article after entering the -other group by the command `gnus-summary-jump-to-other-group'. If nil, -it is depend on the value of `gnus-auto-select-first' whether to select -or not." - :group 'gnus-group-select - :type 'boolean) - -(defcustom gnus-auto-select-next t - "*If non-nil, offer to go to the next group from the end of the previous. -If the value is t and the next newsgroup is empty, Gnus will exit -summary mode and go back to group mode. If the value is neither nil -nor t, Gnus will select the following unread newsgroup. In -particular, if the value is the symbol `quietly', the next unread -newsgroup will be selected without any confirmation, and if it is -`almost-quietly', the next group will be selected without any -confirmation if you are located on the last article in the group. -Finally, if this variable is `slightly-quietly', the `Z n' command -will go to the next group without confirmation." - :group 'gnus-summary-maneuvering - :type '(choice (const :tag "off" nil) - (const quietly) - (const almost-quietly) - (const slightly-quietly) - (sexp :menu-tag "on" t))) - -(defcustom gnus-auto-select-same nil - "*If non-nil, select the next article with the same subject. -If there are no more articles with the same subject, go to -the first unread article." - :group 'gnus-summary-maneuvering - :type 'boolean) - -(defcustom gnus-summary-check-current nil - "*If non-nil, consider the current article when moving. -The \"unread\" movement commands will stay on the same line if the -current article is unread." - :group 'gnus-summary-maneuvering - :type 'boolean) - -(defcustom gnus-auto-center-summary t - "*If non-nil, always center the current summary buffer. -In particular, if `vertical' do only vertical recentering. If non-nil -and non-`vertical', do both horizontal and vertical recentering." - :group 'gnus-summary-maneuvering - :type '(choice (const :tag "none" nil) - (const vertical) - (integer :tag "height") - (sexp :menu-tag "both" t))) - -(defcustom gnus-show-all-headers nil - "*If non-nil, don't hide any headers." - :group 'gnus-article-hiding - :group 'gnus-article-headers - :type 'boolean) - -(defcustom gnus-summary-ignore-duplicates nil - "*If non-nil, ignore articles with identical Message-ID headers." - :group 'gnus-summary - :type 'boolean) - -(defcustom gnus-single-article-buffer t - "*If non-nil, display all articles in the same buffer. -If nil, each group will get its own article buffer." - :group 'gnus-article-various - :type 'boolean) - -(defcustom gnus-break-pages t - "*If non-nil, do page breaking on articles. -The page delimiter is specified by the `gnus-page-delimiter' -variable." - :group 'gnus-article-various - :type 'boolean) - -(defcustom gnus-show-mime t - "*If non-nil, do mime processing of articles. -The articles will simply be fed to the function given by -`gnus-article-display-method-for-mime'." - :group 'gnus-article-mime - :type 'boolean) - -(defcustom gnus-move-split-methods nil - "*Variable used to suggest where articles are to be moved to. -It uses the same syntax as the `gnus-split-methods' variable. -However, whereas `gnus-split-methods' specifies file names as targets, -this variable specifies group names." - :group 'gnus-summary-mail - :type '(repeat (choice (list :value (fun) function) - (cons :value ("" "") regexp (repeat string)) - (sexp :value nil)))) - -(defcustom gnus-unread-mark ?\ ;;;Whitespace - "*Mark used for unread articles." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-ticked-mark ?! - "*Mark used for ticked articles." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-dormant-mark ?? - "*Mark used for dormant articles." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-del-mark ?r - "*Mark used for del'd articles." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-read-mark ?R - "*Mark used for read articles." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-expirable-mark ?E - "*Mark used for expirable articles." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-killed-mark ?K - "*Mark used for killed articles." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-souped-mark ?F - "*Mark used for souped articles." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-kill-file-mark ?X - "*Mark used for articles killed by kill files." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-low-score-mark ?Y - "*Mark used for articles with a low score." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-catchup-mark ?C - "*Mark used for articles that are caught up." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-replied-mark ?A - "*Mark used for articles that have been replied to." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-forwarded-mark ?F - "*Mark used for articles that have been forwarded." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-recent-mark ?N - "*Mark used for articles that are recent." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-cached-mark ?* - "*Mark used for articles that are in the cache." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-saved-mark ?S - "*Mark used for articles that have been saved." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-unseen-mark ?. - "*Mark used for articles that haven't been seen." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-no-mark ?\ ;;;Whitespace - "*Mark used for articles that have no other secondary mark." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-ancient-mark ?O - "*Mark used for ancient articles." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-sparse-mark ?Q - "*Mark used for sparsely reffed articles." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-canceled-mark ?G - "*Mark used for canceled articles." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-duplicate-mark ?M - "*Mark used for duplicate articles." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-undownloaded-mark ?@ - "*Mark used for articles that weren't downloaded." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-downloadable-mark ?% - "*Mark used for articles that are to be downloaded." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-unsendable-mark ?= - "*Mark used for articles that won't be sent." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-score-over-mark ?+ - "*Score mark used for articles with high scores." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-score-below-mark ?- - "*Score mark used for articles with low scores." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-empty-thread-mark ?\ ;;;Whitespace - "*There is no thread under the article." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-not-empty-thread-mark ?= - "*There is a thread under the article." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-view-pseudo-asynchronously nil - "*If non-nil, Gnus will view pseudo-articles asynchronously." - :group 'gnus-extract-view - :type 'boolean) - -(defcustom gnus-auto-expirable-marks - (list gnus-killed-mark gnus-del-mark gnus-catchup-mark - gnus-low-score-mark gnus-ancient-mark gnus-read-mark - gnus-souped-mark gnus-duplicate-mark) - "*The list of marks converted into expiration if a group is auto-expirable." - :version "21.1" - :group 'gnus-summary - :type '(repeat character)) - -(defcustom gnus-inhibit-user-auto-expire t - "*If non-nil, user marking commands will not mark an article as expirable, even if the group has auto-expire turned on." - :version "21.1" - :group 'gnus-summary - :type 'boolean) - -(defcustom gnus-view-pseudos nil - "*If `automatic', pseudo-articles will be viewed automatically. -If `not-confirm', pseudos will be viewed automatically, and the user -will not be asked to confirm the command." - :group 'gnus-extract-view - :type '(choice (const :tag "off" nil) - (const automatic) - (const not-confirm))) - -(defcustom gnus-view-pseudos-separately t - "*If non-nil, one pseudo-article will be created for each file to be viewed. -If nil, all files that use the same viewing command will be given as a -list of parameters to that command." - :group 'gnus-extract-view - :type 'boolean) - -(defcustom gnus-insert-pseudo-articles t - "*If non-nil, insert pseudo-articles when decoding articles." - :group 'gnus-extract-view - :type 'boolean) - -(defcustom gnus-summary-dummy-line-format - " %(: :%) %S\n" - "*The format specification for the dummy roots in the summary buffer. -It works along the same lines as a normal formatting string, -with some simple extensions. - -%S The subject" - :group 'gnus-threading - :type 'string) - -(defcustom gnus-summary-mode-line-format "Gnus: %g [%A] %Z" - "*The format specification for the summary mode line. -It works along the same lines as a normal formatting string, -with some simple extensions: - -%G Group name -%p Unprefixed group name -%A Current article number -%z Current article score -%V Gnus version -%U Number of unread articles in the group -%e Number of unselected articles in the group -%Z A string with unread/unselected article counts -%g Shortish group name -%S Subject of the current article -%u User-defined spec -%s Current score file name -%d Number of dormant articles -%r Number of articles that have been marked as read in this session -%E Number of articles expunged by the score files" - :group 'gnus-summary-format - :type 'string) - -(defcustom gnus-list-identifiers nil - "Regexp that matches list identifiers to be removed from subject. -This can also be a list of regexps." - :version "21.1" - :group 'gnus-summary-format - :group 'gnus-article-hiding - :type '(choice (const :tag "none" nil) - (regexp :value ".*") - (repeat :value (".*") regexp))) - -(defcustom gnus-summary-mark-below 0 - "*Mark all articles with a score below this variable as read. -This variable is local to each summary buffer and usually set by the -score file." - :group 'gnus-score-default - :type 'integer) - -(defcustom gnus-article-sort-functions '(gnus-article-sort-by-number) - "*List of functions used for sorting articles in the summary buffer. - -Each function takes two articles and returns non-nil if the first -article should be sorted before the other. If you use more than one -function, the primary sort function should be the last. You should -probably always include `gnus-article-sort-by-number' in the list of -sorting functions -- preferably first. Also note that sorting by date -is often much slower than sorting by number, and the sorting order is -very similar. (Sorting by date means sorting by the time the message -was sent, sorting by number means sorting by arrival time.) - -Ready-made functions include `gnus-article-sort-by-number', -`gnus-article-sort-by-author', `gnus-article-sort-by-subject', -`gnus-article-sort-by-date' and `gnus-article-sort-by-score'. - -When threading is turned on, the variable `gnus-thread-sort-functions' -controls how articles are sorted." - :group 'gnus-summary-sort - :type '(repeat (choice (function-item gnus-article-sort-by-number) - (function-item gnus-article-sort-by-author) - (function-item gnus-article-sort-by-subject) - (function-item gnus-article-sort-by-date) - (function-item gnus-article-sort-by-score) - (function :tag "other")))) - -(defcustom gnus-thread-sort-functions '(gnus-thread-sort-by-number) - "*List of functions used for sorting threads in the summary buffer. -By default, threads are sorted by article number. - -Each function takes two threads and returns non-nil if the first -thread should be sorted before the other. If you use more than one -function, the primary sort function should be the last. You should -probably always include `gnus-thread-sort-by-number' in the list of -sorting functions -- preferably first. Also note that sorting by date -is often much slower than sorting by number, and the sorting order is -very similar. (Sorting by date means sorting by the time the message -was sent, sorting by number means sorting by arrival time.) - -Ready-made functions include `gnus-thread-sort-by-number', -`gnus-thread-sort-by-author', `gnus-thread-sort-by-subject', -`gnus-thread-sort-by-date', `gnus-thread-sort-by-score' and -`gnus-thread-sort-by-total-score' (see `gnus-thread-score-function'). - -When threading is turned off, the variable -`gnus-article-sort-functions' controls how articles are sorted." - :group 'gnus-summary-sort - :type '(repeat (choice (function-item gnus-thread-sort-by-number) - (function-item gnus-thread-sort-by-author) - (function-item gnus-thread-sort-by-subject) - (function-item gnus-thread-sort-by-date) - (function-item gnus-thread-sort-by-score) - (function-item gnus-thread-sort-by-total-score) - (function :tag "other")))) - -(defcustom gnus-thread-score-function '+ - "*Function used for calculating the total score of a thread. - -The function is called with the scores of the article and each -subthread and should then return the score of the thread. - -Some functions you can use are `+', `max', or `min'." - :group 'gnus-summary-sort - :type 'function) - -(defcustom gnus-summary-expunge-below nil - "All articles that have a score less than this variable will be expunged. -This variable is local to the summary buffers." - :group 'gnus-score-default - :type '(choice (const :tag "off" nil) - integer)) - -(defcustom gnus-thread-expunge-below nil - "All threads that have a total score less than this variable will be expunged. -See `gnus-thread-score-function' for en explanation of what a -\"thread score\" is. - -This variable is local to the summary buffers." - :group 'gnus-threading - :group 'gnus-score-default - :type '(choice (const :tag "off" nil) - integer)) - -(defcustom gnus-summary-mode-hook nil - "*A hook for Gnus summary mode. -This hook is run before any variables are set in the summary buffer." - :options '(turn-on-gnus-mailing-list-mode) - :group 'gnus-summary-various - :type 'hook) - -;; Extracted from gnus-xmas-redefine in order to preserve user settings -(when (featurep 'xemacs) - (add-hook 'gnus-summary-mode-hook 'gnus-xmas-summary-menu-add) - (add-hook 'gnus-summary-mode-hook 'gnus-xmas-setup-summary-toolbar) - (add-hook 'gnus-summary-mode-hook - 'gnus-xmas-switch-horizontal-scrollbar-off)) - -(defcustom gnus-summary-menu-hook nil - "*Hook run after the creation of the summary mode menu." - :group 'gnus-summary-visual - :type 'hook) - -(defcustom gnus-summary-exit-hook nil - "*A hook called on exit from the summary buffer. -It will be called with point in the group buffer." - :group 'gnus-summary-exit - :type 'hook) - -(defcustom gnus-summary-prepare-hook nil - "*A hook called after the summary buffer has been generated. -If you want to modify the summary buffer, you can use this hook." - :group 'gnus-summary-various - :type 'hook) - -(defcustom gnus-summary-prepared-hook nil - "*A hook called as the last thing after the summary buffer has been generated." - :group 'gnus-summary-various - :type 'hook) - -(defcustom gnus-summary-generate-hook nil - "*A hook run just before generating the summary buffer. -This hook is commonly used to customize threading variables and the -like." - :group 'gnus-summary-various - :type 'hook) - -(defcustom gnus-select-group-hook nil - "*A hook called when a newsgroup is selected. - -If you'd like to simplify subjects like the -`gnus-summary-next-same-subject' command does, you can use the -following hook: - - (setq gnus-select-group-hook - (list - (lambda () - (mapcar (lambda (header) - (mail-header-set-subject - header - (gnus-simplify-subject - (mail-header-subject header) 're-only))) - gnus-newsgroup-headers))))" - :group 'gnus-group-select - :type 'hook) - -(defcustom gnus-select-article-hook nil - "*A hook called when an article is selected." - :group 'gnus-summary-choose - :type 'hook) - -(defcustom gnus-visual-mark-article-hook - (list 'gnus-highlight-selected-summary) - "*Hook run after selecting an article in the summary buffer. -It is meant to be used for highlighting the article in some way. It -is not run if `gnus-visual' is nil." - :group 'gnus-summary-visual - :type 'hook) - -(defcustom gnus-parse-headers-hook '(gnus-set-summary-default-charset) - "*A hook called before parsing the headers." - :group 'gnus-various - :type 'hook) - -(defcustom gnus-exit-group-hook nil - "*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) - -(defcustom gnus-summary-update-hook - (list 'gnus-summary-highlight-line) - "*A hook called when a summary line is changed. -The hook will not be called if `gnus-visual' is nil. - -The default function `gnus-summary-highlight-line' will -highlight the line according to the `gnus-summary-highlight' -variable." - :group 'gnus-summary-visual - :type 'hook) - -(defcustom gnus-mark-article-hook '(gnus-summary-mark-read-and-unread-as-read) - "*A hook called when an article is selected for the first time. -The hook is intended to mark an article as read (or unread) -automatically when it is selected." - :group 'gnus-summary-choose - :type 'hook) - -(defcustom gnus-group-no-more-groups-hook nil - "*A hook run when returning to group mode having no more (unread) groups." - :group 'gnus-group-select - :type 'hook) - -(defcustom gnus-ps-print-hook nil - "*A hook run before ps-printing something from Gnus." - :group 'gnus-summary - :type 'hook) - -(defcustom gnus-summary-display-arrow - (and (fboundp 'display-graphic-p) - (display-graphic-p)) - "*If non-nil, display an arrow highlighting the current article." - :version "21.1" - :group 'gnus-summary - :type 'boolean) - -(defcustom gnus-summary-selected-face 'gnus-summary-selected-face - "Face used for highlighting the current article in the summary buffer." - :group 'gnus-summary-visual - :type 'face) - -(defcustom gnus-summary-highlight - '(((= mark gnus-canceled-mark) - . gnus-summary-cancelled-face) - ((and (> score default-high) - (or (= mark gnus-dormant-mark) - (= mark gnus-ticked-mark))) - . gnus-summary-high-ticked-face) - ((and (< score default-low) - (or (= mark gnus-dormant-mark) - (= mark gnus-ticked-mark))) - . gnus-summary-low-ticked-face) - ((or (= mark gnus-dormant-mark) - (= mark gnus-ticked-mark)) - . gnus-summary-normal-ticked-face) - ((and (> score default-high) (= mark gnus-ancient-mark)) - . gnus-summary-high-ancient-face) - ((and (< score default-low) (= mark gnus-ancient-mark)) - . gnus-summary-low-ancient-face) - ((= mark gnus-ancient-mark) - . gnus-summary-normal-ancient-face) - ((and (> score default-high) (= mark gnus-unread-mark)) - . gnus-summary-high-unread-face) - ((and (< score default-low) (= mark gnus-unread-mark)) - . gnus-summary-low-unread-face) - ((= mark gnus-unread-mark) - . gnus-summary-normal-unread-face) - ((and (> score default-high) (memq mark (list gnus-downloadable-mark - gnus-undownloaded-mark))) - . gnus-summary-high-unread-face) - ((and (< score default-low) (memq mark (list gnus-downloadable-mark - gnus-undownloaded-mark))) - . gnus-summary-low-unread-face) - ((and (memq mark (list gnus-downloadable-mark gnus-undownloaded-mark)) - (memq article gnus-newsgroup-unreads)) - . gnus-summary-normal-unread-face) - ((memq mark (list gnus-downloadable-mark gnus-undownloaded-mark)) - . gnus-summary-normal-read-face) - ((> score default-high) - . gnus-summary-high-read-face) - ((< score default-low) - . gnus-summary-low-read-face) - (t - . gnus-summary-normal-read-face)) - "*Controls the highlighting of summary buffer lines. - -A list of (FORM . FACE) pairs. When deciding how a a particular -summary line should be displayed, each form is evaluated. The content -of the face field after the first true form is used. You can change -how those summary lines are displayed, by editing the face field. - -You can use the following variables in the FORM field. - -score: The article's score -default: The default article score. -default-high: The default score for high scored articles. -default-low: The default score for low scored articles. -below: The score below which articles are automatically marked as read. -mark: The articles mark." - :group 'gnus-summary-visual - :type '(repeat (cons (sexp :tag "Form" nil) - face))) - -(defcustom gnus-alter-header-function nil - "Function called to allow alteration of article header structures. -The function is called with one parameter, the article header vector, -which it may alter in any way.") - -(defvar gnus-decode-encoded-word-function - (mime-find-field-decoder 'From 'nov) - "Variable that says which function should be used to decode a string with encoded words.") - -(defcustom gnus-extra-headers nil - "*Extra headers to parse." - :version "21.1" - :group 'gnus-summary - :type '(repeat symbol)) - -(defcustom gnus-ignored-from-addresses - (and user-mail-address (regexp-quote user-mail-address)) - "*Regexp of From headers that may be suppressed in favor of To headers." - :version "21.1" - :group 'gnus-summary - :type 'regexp) - -(defcustom gnus-newsgroup-ignored-charsets '(unknown-8bit x-unknown) - "List of charsets that should be ignored. -When these charsets are used in the \"charset\" parameter, the -default charset will be used instead." - :version "21.1" - :type '(repeat symbol) - :group 'gnus-charset) - -(gnus-define-group-parameter - ignored-charsets - :type list - :function-document - "Return the ignored charsets of GROUP." - :variable gnus-group-ignored-charsets-alist - :variable-default - '(("alt\\.chinese\\.text" iso-8859-1)) - :variable-document - "Alist of regexps (to match group names) and charsets that should be ignored. -When these charsets are used in the \"charset\" parameter, the -default charset will be used instead." - :variable-group gnus-charset - :variable-type '(repeat (cons (regexp :tag "Group") - (repeat symbol))) - :parameter-type '(choice :tag "Ignored charsets" - :value nil - (repeat (symbol))) - :parameter-document "\ -List of charsets that should be ignored. - -When these charsets are used in the \"charset\" parameter, the -default charset will be used instead.") - -(defcustom gnus-group-highlight-words-alist nil - "Alist of group regexps and highlight regexps. -This variable uses the same syntax as `gnus-emphasis-alist'." - :version "21.1" - :type '(repeat (cons (regexp :tag "Group") - (repeat (list (regexp :tag "Highlight regexp") - (number :tag "Group for entire word" 0) - (number :tag "Group for displayed part" 0) - (symbol :tag "Face" - gnus-emphasis-highlight-words))))) - :group 'gnus-summary-visual) - -(defcustom gnus-use-wheel nil - "Use Intelli-mouse on summary movement" - :type 'boolean - :group 'gnus-summary-maneuvering) - -(defcustom gnus-wheel-scroll-amount '(5 . 1) - "Amount to scroll messages by spinning the mouse wheel. -This is actually a cons cell, where the first item is the amount to scroll -on a normal wheel event, and the second is the amount to scroll when the -wheel is moved with the shift key depressed." - :type '(cons (integer :tag "Shift") integer) - :group 'gnus-summary-maneuvering) - -(defcustom gnus-wheel-edge-resistance 2 - "How hard it should be to change the current article -by moving the mouse over the edge of the article window." - :type 'integer - :group 'gnus-summary-maneuvering) - -(defcustom gnus-summary-show-article-charset-alist - nil - "Alist of number and charset. -The article will be shown with the charset corresponding to the -numbered argument. -For example: ((1 . cn-gb-2312) (2 . big5))." - :version "21.1" - :type '(repeat (cons (number :tag "Argument" 1) - (symbol :tag "Charset"))) - :group 'gnus-charset) - -(defcustom gnus-preserve-marks t - "Whether marks are preserved when moving, copying and respooling messages." - :version "21.1" - :type 'boolean - :group 'gnus-summary-marks) - -(defcustom gnus-alter-articles-to-read-function nil - "Function to be called to alter the list of articles to be selected." - :type '(choice (const nil) function) - :group 'gnus-summary) - -(defcustom gnus-orphan-score nil - "*All orphans get this score added. Set in the score file." - :group 'gnus-score-default - :type '(choice (const nil) - integer)) - -(defcustom gnus-summary-save-parts-default-mime "image/.*" - "*A regexp to match MIME parts when saving multiple parts of a message -with gnus-summary-save-parts (X m). This regexp will be used by default -when prompting the user for which type of files to save." - :group 'gnus-summary - :type 'regexp) - - -(defcustom gnus-summary-save-parts-default-mime "image/.*" - "*A regexp to match MIME parts when saving multiple parts of a message -with gnus-summary-save-parts (X m). This regexp will be used by default -when prompting the user for which type of files to save." - :group 'gnus-summary - :type 'regexp) - -(defcustom gnus-read-all-available-headers nil - "Whether Gnus should parse all headers made available to it. -This is mostly relevant for slow backends where the user may -wish to widen the summary buffer to include all headers -that were fetched. Say, for nnultimate groups." - :group 'gnus-summary - :type '(choice boolean regexp)) - -;;; Internal variables - -(defvar gnus-summary-display-cache nil) -(defvar gnus-article-mime-handles nil) -(defvar gnus-article-decoded-p nil) -(defvar gnus-article-charset nil) -(defvar gnus-article-ignored-charsets nil) -(defvar gnus-scores-exclude-files nil) -(defvar gnus-page-broken nil) -(defvar gnus-inhibit-mime-unbuttonizing nil) - -(defvar gnus-original-article nil) -(defvar gnus-article-internal-prepare-hook nil) -(defvar gnus-newsgroup-process-stack nil) - -(defvar gnus-thread-indent-array nil) -(defvar gnus-thread-indent-array-level gnus-thread-indent-level) -(defvar gnus-sort-gathered-threads-function 'gnus-thread-sort-by-number - "Function called to sort the articles within a thread after it has been gathered together.") - -(defvar gnus-summary-save-parts-type-history nil) -(defvar gnus-summary-save-parts-last-directory nil) - -(defvar gnus-summary-save-parts-type-history nil) -(defvar gnus-summary-save-parts-last-directory nil) - -;; Avoid highlighting in kill files. -(defvar gnus-summary-inhibit-highlight nil) -(defvar gnus-newsgroup-selected-overlay nil) -(defvar gnus-inhibit-limiting nil) -(defvar gnus-newsgroup-adaptive-score-file nil) -(defvar gnus-current-score-file nil) -(defvar gnus-current-move-group nil) -(defvar gnus-current-copy-group nil) -(defvar gnus-current-crosspost-group nil) -(defvar gnus-newsgroup-display nil) - -(defvar gnus-newsgroup-dependencies nil) -(defvar gnus-newsgroup-adaptive nil) -(defvar gnus-summary-display-article-function nil) -(defvar gnus-summary-highlight-line-function nil - "Function called after highlighting a summary line.") - -(defvar gnus-summary-line-format-alist - `((?N ,(macroexpand '(mail-header-number gnus-tmp-header)) ?d) - (?S ,(macroexpand '(mail-header-subject gnus-tmp-header)) ?s) - (?s gnus-tmp-subject-or-nil ?s) - (?n gnus-tmp-name ?s) - (?A (std11-address-string - (car (mime-entity-read-field gnus-tmp-header 'From))) ?s) - (?a (or (std11-full-name-string - (car (mime-entity-read-field gnus-tmp-header 'From))) - gnus-tmp-from) ?s) - (?F gnus-tmp-from ?s) - (?x ,(macroexpand '(mail-header-xref gnus-tmp-header)) ?s) - (?D ,(macroexpand '(mail-header-date gnus-tmp-header)) ?s) - (?d (gnus-dd-mmm (mail-header-date gnus-tmp-header)) ?s) - (?o (gnus-date-iso8601 (mail-header-date gnus-tmp-header)) ?s) - (?M ,(macroexpand '(mail-header-id gnus-tmp-header)) ?s) - (?r ,(macroexpand '(mail-header-references gnus-tmp-header)) ?s) - (?c (or (mail-header-chars gnus-tmp-header) 0) ?d) - (?L gnus-tmp-lines ?s) - (?I gnus-tmp-indentation ?s) - (?T (if (= gnus-tmp-level 0) "" (make-string (frame-width) ? )) ?s) - (?R gnus-tmp-replied ?c) - (?\[ gnus-tmp-opening-bracket ?c) - (?\] gnus-tmp-closing-bracket ?c) - (?\> (make-string gnus-tmp-level ? ) ?s) - (?\< (make-string (max 0 (- 20 gnus-tmp-level)) ? ) ?s) - (?i gnus-tmp-score ?d) - (?z gnus-tmp-score-char ?c) - (?l (bbb-grouplens-score gnus-tmp-header) ?s) - (?V (gnus-thread-total-score (and (boundp 'thread) (car thread))) ?d) - (?U gnus-tmp-unread ?c) - (?f (gnus-summary-from-or-to-or-newsgroups gnus-tmp-header) ?s) - (?t (gnus-summary-number-of-articles-in-thread - (and (boundp 'thread) (car thread)) gnus-tmp-level) - ?d) - (?e (gnus-summary-number-of-articles-in-thread - (and (boundp 'thread) (car thread)) gnus-tmp-level t) - ?c) - (?u gnus-tmp-user-defined ?s) - (?P (gnus-pick-line-number) ?d) - (?B gnus-tmp-thread-tree-header-string ?s)) - "An alist of format specifications that can appear in summary lines. -These are paired with what variables they correspond with, along with -the type of the variable (string, integer, character, etc).") - -(defvar gnus-summary-dummy-line-format-alist - `((?S gnus-tmp-subject ?s) - (?N gnus-tmp-number ?d) - (?u gnus-tmp-user-defined ?s))) - -(defvar gnus-summary-mode-line-format-alist - `((?G gnus-tmp-group-name ?s) - (?g (gnus-short-group-name gnus-tmp-group-name) ?s) - (?p (gnus-group-real-name gnus-tmp-group-name) ?s) - (?A gnus-tmp-article-number ?d) - (?Z gnus-tmp-unread-and-unselected ?s) - (?V gnus-version ?s) - (?U gnus-tmp-unread-and-unticked ?d) - (?S gnus-tmp-subject ?s) - (?e gnus-tmp-unselected ?d) - (?u gnus-tmp-user-defined ?s) - (?d (length gnus-newsgroup-dormant) ?d) - (?t (length gnus-newsgroup-marked) ?d) - (?r (length gnus-newsgroup-reads) ?d) - (?z (gnus-summary-article-score gnus-tmp-article-number) ?d) - (?E gnus-newsgroup-expunged-tally ?d) - (?s (gnus-current-score-file-nondirectory) ?s))) - -(defvar gnus-last-search-regexp nil - "Default regexp for article search command.") - -(defvar gnus-summary-search-article-matched-data nil - "Last matched data of article search command. It is the local variable -in `gnus-article-buffer' which consists of the list of start position, -end position and text.") - -(defvar gnus-last-shell-command nil - "Default shell command on article.") - -(defvar gnus-newsgroup-begin nil) -(defvar gnus-newsgroup-end nil) -(defvar gnus-newsgroup-last-rmail nil) -(defvar gnus-newsgroup-last-mail nil) -(defvar gnus-newsgroup-last-folder nil) -(defvar gnus-newsgroup-last-file nil) -(defvar gnus-newsgroup-auto-expire nil) -(defvar gnus-newsgroup-active nil) - -(defvar gnus-newsgroup-data nil) -(defvar gnus-newsgroup-data-reverse nil) -(defvar gnus-newsgroup-limit nil) -(defvar gnus-newsgroup-limits nil) - -(defvar gnus-newsgroup-unreads nil - "List of unread articles in the current newsgroup.") - -(defvar gnus-newsgroup-unselected nil - "List of unselected unread articles in the current newsgroup.") - -(defvar gnus-newsgroup-reads nil - "Alist of read articles and article marks in the current newsgroup.") - -(defvar gnus-newsgroup-expunged-tally nil) - -(defvar gnus-newsgroup-marked nil - "List of ticked articles in the current newsgroup (a subset of unread art).") - -(defvar gnus-newsgroup-killed nil - "List of ranges of articles that have been through the scoring process.") - -(defvar gnus-newsgroup-cached nil - "List of articles that come from the article cache.") - -(defvar gnus-newsgroup-saved nil - "List of articles that have been saved.") - -(defvar gnus-newsgroup-kill-headers nil) - -(defvar gnus-newsgroup-replied nil - "List of articles that have been replied to in the current newsgroup.") - -(defvar gnus-newsgroup-forwarded nil - "List of articles that have been forwarded in the current newsgroup.") - -(defvar gnus-newsgroup-recent nil - "List of articles that have are recent in the current newsgroup.") - -(defvar gnus-newsgroup-expirable nil - "List of articles in the current newsgroup that can be expired.") - -(defvar gnus-newsgroup-processable nil - "List of articles in the current newsgroup that can be processed.") - -(defvar gnus-newsgroup-downloadable nil - "List of articles in the current newsgroup that can be processed.") - -(defvar gnus-newsgroup-undownloaded nil - "List of articles in the current newsgroup that haven't been downloaded..") - -(defvar gnus-newsgroup-unsendable nil - "List of articles in the current newsgroup that won't be sent.") - -(defvar gnus-newsgroup-bookmarks nil - "List of articles in the current newsgroup that have bookmarks.") - -(defvar gnus-newsgroup-dormant nil - "List of dormant articles in the current newsgroup.") - -(defvar gnus-newsgroup-unseen nil - "List of unseen articles in the current newsgroup.") - -(defvar gnus-newsgroup-seen nil - "Range of seen articles in the current newsgroup.") - -(defvar gnus-newsgroup-articles nil - "List of articles in the current newsgroup.") - -(defvar gnus-newsgroup-scored nil - "List of scored articles in the current newsgroup.") - -(defvar gnus-newsgroup-incorporated nil - "List of incorporated articles in the current newsgroup.") - -(defvar gnus-newsgroup-headers nil - "List of article headers in the current newsgroup.") - -(defvar gnus-newsgroup-threads nil) - -(defvar gnus-newsgroup-prepared nil - "Whether the current group has been prepared properly.") - -(defvar gnus-newsgroup-ancient nil - "List of `gnus-fetch-old-headers' articles in the current newsgroup.") - -(defvar gnus-newsgroup-sparse nil) - -(defvar gnus-current-article nil) -(defvar gnus-article-current nil) -(defvar gnus-current-headers nil) -(defvar gnus-have-all-headers nil) -(defvar gnus-last-article nil) -(defvar gnus-newsgroup-history nil) -(defvar gnus-newsgroup-charset nil) -(defvar gnus-newsgroup-ephemeral-charset nil) -(defvar gnus-newsgroup-ephemeral-ignored-charsets nil) - -(defvar gnus-article-before-search nil) - -(defconst gnus-summary-local-variables - '(gnus-newsgroup-name - gnus-newsgroup-begin gnus-newsgroup-end - gnus-newsgroup-last-rmail gnus-newsgroup-last-mail - gnus-newsgroup-last-folder gnus-newsgroup-last-file - gnus-newsgroup-auto-expire gnus-newsgroup-unreads - gnus-newsgroup-unselected gnus-newsgroup-marked - gnus-newsgroup-reads gnus-newsgroup-saved - gnus-newsgroup-replied gnus-newsgroup-forwarded - gnus-newsgroup-recent - gnus-newsgroup-expirable - gnus-newsgroup-processable gnus-newsgroup-killed - gnus-newsgroup-downloadable gnus-newsgroup-undownloaded - gnus-newsgroup-unsendable gnus-newsgroup-unseen - gnus-newsgroup-seen gnus-newsgroup-articles - gnus-newsgroup-bookmarks gnus-newsgroup-dormant - gnus-newsgroup-headers gnus-newsgroup-threads - gnus-newsgroup-prepared gnus-summary-highlight-line-function - gnus-current-article gnus-current-headers gnus-have-all-headers - gnus-last-article gnus-article-internal-prepare-hook - gnus-newsgroup-dependencies gnus-newsgroup-selected-overlay - gnus-newsgroup-scored gnus-newsgroup-kill-headers - gnus-thread-expunge-below - gnus-score-alist gnus-current-score-file - (gnus-summary-expunge-below . global) - (gnus-summary-mark-below . global) - (gnus-orphan-score . global) - gnus-newsgroup-active gnus-scores-exclude-files - gnus-newsgroup-history gnus-newsgroup-ancient - gnus-newsgroup-sparse gnus-newsgroup-process-stack - (gnus-newsgroup-adaptive . gnus-use-adaptive-scoring) - gnus-newsgroup-adaptive-score-file (gnus-reffed-article-number . -1) - (gnus-newsgroup-expunged-tally . 0) - gnus-cache-removable-articles gnus-newsgroup-cached - gnus-newsgroup-data gnus-newsgroup-data-reverse - gnus-newsgroup-limit gnus-newsgroup-limits - gnus-newsgroup-charset gnus-newsgroup-display - gnus-newsgroup-incorporated) - "Variables that are buffer-local to the summary buffers.") - -(defvar gnus-newsgroup-variables nil - "Variables that have separate values in the newsgroups.") - -;; Byte-compiler warning. -(eval-when-compile (defvar gnus-article-mode-map)) - -;; Subject simplification. - -(defun gnus-simplify-whitespace (str) - "Remove excessive whitespace from STR." - (let ((mystr str)) - ;; Multiple spaces. - (while (string-match "[ \t][ \t]+" mystr) - (setq mystr (concat (substring mystr 0 (match-beginning 0)) - " " - (substring mystr (match-end 0))))) - ;; Leading spaces. - (when (string-match "^[ \t]+" mystr) - (setq mystr (substring mystr (match-end 0)))) - ;; Trailing spaces. - (when (string-match "[ \t]+$" mystr) - (setq mystr (substring mystr 0 (match-beginning 0)))) - mystr)) - -(defsubst gnus-simplify-subject-re (subject) - "Remove \"Re:\" from subject lines." - (if (string-match message-subject-re-regexp subject) - (substring subject (match-end 0)) - subject)) - -(defun gnus-simplify-subject (subject &optional re-only) - "Remove `Re:' and words in parentheses. -If RE-ONLY is non-nil, strip leading `Re:'s only." - (let ((case-fold-search t)) ;Ignore case. - ;; Remove `Re:', `Re^N:', `Re(n)', and `Re[n]:'. - (when (string-match "\\`\\(re\\([[(^][0-9]+[])]?\\)?:[ \t]*\\)+" subject) - (setq subject (substring subject (match-end 0)))) - ;; Remove uninteresting prefixes. - (when (and (not re-only) - gnus-simplify-ignored-prefixes - (string-match gnus-simplify-ignored-prefixes subject)) - (setq subject (substring subject (match-end 0)))) - ;; Remove words in parentheses from end. - (unless re-only - (while (string-match "[ \t\n]*([^()]*)[ \t\n]*\\'" subject) - (setq subject (substring subject 0 (match-beginning 0))))) - ;; Return subject string. - subject)) - -;; Remove any leading "re:"s, any trailing paren phrases, and simplify -;; all whitespace. -(defsubst gnus-simplify-buffer-fuzzy-step (regexp &optional newtext) - (goto-char (point-min)) - (while (re-search-forward regexp nil t) - (replace-match (or newtext "")))) - -(defun gnus-simplify-buffer-fuzzy () - "Simplify string in the buffer fuzzily. -The string in the accessible portion of the current buffer is simplified. -It is assumed to be a single-line subject. -Whitespace is generally cleaned up, and miscellaneous leading/trailing -matter is removed. Additional things can be deleted by setting -`gnus-simplify-subject-fuzzy-regexp'." - (let ((case-fold-search t) - (modified-tick)) - (gnus-simplify-buffer-fuzzy-step "\t" " ") - - (while (not (eq modified-tick (buffer-modified-tick))) - (setq modified-tick (buffer-modified-tick)) - (cond - ((listp gnus-simplify-subject-fuzzy-regexp) - (mapcar 'gnus-simplify-buffer-fuzzy-step - gnus-simplify-subject-fuzzy-regexp)) - (gnus-simplify-subject-fuzzy-regexp - (gnus-simplify-buffer-fuzzy-step gnus-simplify-subject-fuzzy-regexp))) - (gnus-simplify-buffer-fuzzy-step "^ *\\[[-+?*!][-+?*!]\\] *") - (gnus-simplify-buffer-fuzzy-step - "^ *\\(re\\|fw\\|fwd\\)[[{(^0-9]*[])}]?[:;] *") - (gnus-simplify-buffer-fuzzy-step "^[[].*:\\( .*\\)[]]$" "\\1")) - - (gnus-simplify-buffer-fuzzy-step " *[[{(][^()\n]*[]})] *$") - (gnus-simplify-buffer-fuzzy-step " +" " ") - (gnus-simplify-buffer-fuzzy-step " $") - (gnus-simplify-buffer-fuzzy-step "^ +"))) - -(defun gnus-simplify-subject-fuzzy (subject) - "Simplify a subject string fuzzily. -See `gnus-simplify-buffer-fuzzy' for details." - (save-excursion - (gnus-set-work-buffer) - (let ((case-fold-search t)) - ;; Remove uninteresting prefixes. - (when (and gnus-simplify-ignored-prefixes - (string-match gnus-simplify-ignored-prefixes subject)) - (setq subject (substring subject (match-end 0)))) - (insert subject) - (inline (gnus-simplify-buffer-fuzzy)) - (buffer-string)))) - -(defsubst gnus-simplify-subject-fully (subject) - "Simplify a subject string according to gnus-summary-gather-subject-limit." - (cond - (gnus-simplify-subject-functions - (gnus-map-function gnus-simplify-subject-functions subject)) - ((null gnus-summary-gather-subject-limit) - (gnus-simplify-subject-re subject)) - ((eq gnus-summary-gather-subject-limit 'fuzzy) - (gnus-simplify-subject-fuzzy subject)) - ((numberp gnus-summary-gather-subject-limit) - (gnus-limit-string (gnus-simplify-subject-re subject) - gnus-summary-gather-subject-limit)) - (t - subject))) - -(defsubst gnus-subject-equal (s1 s2 &optional simple-first) - "Check whether two subjects are equal. -If optional argument simple-first is t, first argument is already -simplified." - (cond - ((null simple-first) - (equal (gnus-simplify-subject-fully s1) - (gnus-simplify-subject-fully s2))) - (t - (equal s1 - (gnus-simplify-subject-fully s2))))) - -(defun gnus-summary-bubble-group () - "Increase the score of the current group. -This is a handy function to add to `gnus-summary-exit-hook' to -increase the score of each group you read." - (gnus-group-add-score gnus-newsgroup-name)) - - -;;; -;;; Gnus summary mode -;;; - -(put 'gnus-summary-mode 'mode-class 'special) - -(defvar gnus-article-commands-menu) - -(when t - ;; Non-orthogonal keys - - (gnus-define-keys gnus-summary-mode-map - " " gnus-summary-next-page - "\177" gnus-summary-prev-page - [delete] gnus-summary-prev-page - [backspace] gnus-summary-prev-page - "\r" gnus-summary-scroll-up - "\M-\r" gnus-summary-scroll-down - "n" gnus-summary-next-unread-article - "p" gnus-summary-prev-unread-article - "N" gnus-summary-next-article - "P" gnus-summary-prev-article - "\M-\C-n" gnus-summary-next-same-subject - "\M-\C-p" gnus-summary-prev-same-subject - "\M-n" gnus-summary-next-unread-subject - "\M-p" gnus-summary-prev-unread-subject - "." gnus-summary-first-unread-article - "," gnus-summary-best-unread-article - "\M-s" gnus-summary-search-article-forward - "\M-r" gnus-summary-search-article-backward - "<" gnus-summary-beginning-of-article - ">" gnus-summary-end-of-article - "j" gnus-summary-goto-article - "^" gnus-summary-refer-parent-article - "\M-^" gnus-summary-refer-article - "u" gnus-summary-tick-article-forward - "!" gnus-summary-tick-article-forward - "U" gnus-summary-tick-article-backward - "d" gnus-summary-mark-as-read-forward - "D" gnus-summary-mark-as-read-backward - "E" gnus-summary-mark-as-expirable - "\M-u" gnus-summary-clear-mark-forward - "\M-U" gnus-summary-clear-mark-backward - "k" gnus-summary-kill-same-subject-and-select - "\C-k" gnus-summary-kill-same-subject - "\M-\C-k" gnus-summary-kill-thread - "\M-\C-l" gnus-summary-lower-thread - "e" gnus-summary-edit-article - "#" gnus-summary-mark-as-processable - "\M-#" gnus-summary-unmark-as-processable - "\M-\C-t" gnus-summary-toggle-threads - "\M-\C-s" gnus-summary-show-thread - "\M-\C-h" gnus-summary-hide-thread - "\M-\C-f" gnus-summary-next-thread - "\M-\C-b" gnus-summary-prev-thread - [(meta down)] gnus-summary-next-thread - [(meta up)] gnus-summary-prev-thread - "\M-\C-u" gnus-summary-up-thread - "\M-\C-d" gnus-summary-down-thread - "&" gnus-summary-execute-command - "c" gnus-summary-catchup-and-exit - "\C-w" gnus-summary-mark-region-as-read - "\C-t" gnus-summary-toggle-truncation - "?" gnus-summary-mark-as-dormant - "\C-c\M-\C-s" gnus-summary-limit-include-expunged - "\C-c\C-s\C-n" gnus-summary-sort-by-number - "\C-c\C-s\C-l" gnus-summary-sort-by-lines - "\C-c\C-s\C-c" gnus-summary-sort-by-chars - "\C-c\C-s\C-a" gnus-summary-sort-by-author - "\C-c\C-s\C-s" gnus-summary-sort-by-subject - "\C-c\C-s\C-d" gnus-summary-sort-by-date - "\C-c\C-s\C-i" gnus-summary-sort-by-score - "\C-c\C-s\C-o" gnus-summary-sort-by-original - "=" gnus-summary-expand-window - "\C-x\C-s" gnus-summary-reselect-current-group - "\M-g" gnus-summary-rescan-group - "w" gnus-summary-stop-page-breaking - "\C-c\C-r" gnus-summary-caesar-message - "\M-t" gnus-summary-toggle-mime - "f" gnus-summary-followup - "F" gnus-summary-followup-with-original - "C" gnus-summary-cancel-article - "r" gnus-summary-reply - "R" gnus-summary-reply-with-original - "\C-c\C-f" gnus-summary-mail-forward - "o" gnus-summary-save-article - "\C-o" gnus-summary-save-article-mail - "|" gnus-summary-pipe-output - "\M-k" gnus-summary-edit-local-kill - "\M-K" gnus-summary-edit-global-kill - ;; "V" gnus-version - "\C-c\C-d" gnus-summary-describe-group - "q" gnus-summary-exit - "Q" gnus-summary-exit-no-update - "\C-c\C-i" gnus-info-find-node - gnus-mouse-2 gnus-mouse-pick-article - "m" gnus-summary-mail-other-window - "a" gnus-summary-post-news - "x" gnus-summary-limit-to-unread - "s" gnus-summary-isearch-article - "t" gnus-article-toggle-headers - "g" gnus-summary-show-article - "l" gnus-summary-goto-last-article - "v" gnus-summary-preview-mime-message - "\C-c\C-v\C-v" gnus-uu-decode-uu-view - "\C-d" gnus-summary-enter-digest-group - "\M-\C-d" gnus-summary-read-document - "\M-\C-e" gnus-summary-edit-parameters - "\M-\C-a" gnus-summary-customize-parameters - "\C-c\C-b" gnus-bug - "*" gnus-cache-enter-article - "\M-*" gnus-cache-remove-article - "\M-&" gnus-summary-universal-argument - "\C-l" gnus-recenter - "I" gnus-summary-increase-score - "L" gnus-summary-lower-score - "\M-i" gnus-symbolic-argument - "h" gnus-summary-select-article-buffer - - "V" gnus-summary-score-map - "X" gnus-uu-extract-map - "S" gnus-summary-send-map) - - ;; Sort of orthogonal keymap - (gnus-define-keys (gnus-summary-mark-map "M" gnus-summary-mode-map) - "t" gnus-summary-tick-article-forward - "!" gnus-summary-tick-article-forward - "d" gnus-summary-mark-as-read-forward - "r" gnus-summary-mark-as-read-forward - "c" gnus-summary-clear-mark-forward - " " gnus-summary-clear-mark-forward - "e" gnus-summary-mark-as-expirable - "x" gnus-summary-mark-as-expirable - "?" gnus-summary-mark-as-dormant - "b" gnus-summary-set-bookmark - "B" gnus-summary-remove-bookmark - "#" gnus-summary-mark-as-processable - "\M-#" gnus-summary-unmark-as-processable - "S" gnus-summary-limit-include-expunged - "C" gnus-summary-catchup - "H" gnus-summary-catchup-to-here - "h" gnus-summary-catchup-from-here - "\C-c" gnus-summary-catchup-all - "k" gnus-summary-kill-same-subject-and-select - "K" gnus-summary-kill-same-subject - "P" gnus-uu-mark-map) - - (gnus-define-keys (gnus-summary-mscore-map "V" gnus-summary-mark-map) - "c" gnus-summary-clear-above - "u" gnus-summary-tick-above - "m" gnus-summary-mark-above - "k" gnus-summary-kill-below) - - (gnus-define-keys (gnus-summary-limit-map "/" gnus-summary-mode-map) - "/" gnus-summary-limit-to-subject - "n" gnus-summary-limit-to-articles - "w" gnus-summary-pop-limit - "s" gnus-summary-limit-to-subject - "a" gnus-summary-limit-to-author - "u" gnus-summary-limit-to-unread - "m" gnus-summary-limit-to-marks - "M" gnus-summary-limit-exclude-marks - "v" gnus-summary-limit-to-score - "*" gnus-summary-limit-include-cached - "D" gnus-summary-limit-include-dormant - "T" gnus-summary-limit-include-thread - "d" gnus-summary-limit-exclude-dormant - "t" gnus-summary-limit-to-age - "x" gnus-summary-limit-to-extra - "p" gnus-summary-limit-to-display-predicate - "E" gnus-summary-limit-include-expunged - "c" gnus-summary-limit-exclude-childless-dormant - "C" gnus-summary-limit-mark-excluded-as-read - "o" gnus-summary-insert-old-articles - "N" gnus-summary-insert-new-articles) - - (gnus-define-keys (gnus-summary-goto-map "G" gnus-summary-mode-map) - "n" gnus-summary-next-unread-article - "p" gnus-summary-prev-unread-article - "N" gnus-summary-next-article - "P" gnus-summary-prev-article - "\C-n" gnus-summary-next-same-subject - "\C-p" gnus-summary-prev-same-subject - "\M-n" gnus-summary-next-unread-subject - "\M-p" gnus-summary-prev-unread-subject - "f" gnus-summary-first-unread-article - "b" gnus-summary-best-unread-article - "j" gnus-summary-goto-article - "g" gnus-summary-goto-subject - "l" gnus-summary-goto-last-article - "o" gnus-summary-pop-article) - - (gnus-define-keys (gnus-summary-thread-map "T" gnus-summary-mode-map) - "k" gnus-summary-kill-thread - "l" gnus-summary-lower-thread - "i" gnus-summary-raise-thread - "T" gnus-summary-toggle-threads - "t" gnus-summary-rethread-current - "^" gnus-summary-reparent-thread - "s" gnus-summary-show-thread - "S" gnus-summary-show-all-threads - "h" gnus-summary-hide-thread - "H" gnus-summary-hide-all-threads - "n" gnus-summary-next-thread - "p" gnus-summary-prev-thread - "u" gnus-summary-up-thread - "o" gnus-summary-top-thread - "d" gnus-summary-down-thread - "#" gnus-uu-mark-thread - "\M-#" gnus-uu-unmark-thread) - - (gnus-define-keys (gnus-summary-buffer-map "Y" gnus-summary-mode-map) - "g" gnus-summary-prepare - "c" gnus-summary-insert-cached-articles) - - (gnus-define-keys (gnus-summary-exit-map "Z" gnus-summary-mode-map) - "c" gnus-summary-catchup-and-exit - "C" gnus-summary-catchup-all-and-exit - "E" gnus-summary-exit-no-update - "J" gnus-summary-jump-to-other-group - "Q" gnus-summary-exit - "Z" gnus-summary-exit - "n" gnus-summary-catchup-and-goto-next-group - "R" gnus-summary-reselect-current-group - "G" gnus-summary-rescan-group - "N" gnus-summary-next-group - "s" gnus-summary-save-newsrc - "P" gnus-summary-prev-group) - - (gnus-define-keys (gnus-summary-article-map "A" gnus-summary-mode-map) - " " gnus-summary-next-page - "n" gnus-summary-next-page - "\177" gnus-summary-prev-page - [delete] gnus-summary-prev-page - "p" gnus-summary-prev-page - "\r" gnus-summary-scroll-up - "\M-\r" gnus-summary-scroll-down - "<" gnus-summary-beginning-of-article - ">" gnus-summary-end-of-article - "b" gnus-summary-beginning-of-article - "e" gnus-summary-end-of-article - "^" gnus-summary-refer-parent-article - "r" gnus-summary-refer-parent-article - "D" gnus-summary-enter-digest-group - "R" gnus-summary-refer-references - "T" gnus-summary-refer-thread - "g" gnus-summary-show-article - "s" gnus-summary-isearch-article - "P" gnus-summary-print-article - "M" gnus-mailing-list-insinuate - "t" gnus-article-babel) - - (gnus-define-keys (gnus-summary-wash-map "W" gnus-summary-mode-map) - "b" gnus-article-add-buttons - "B" gnus-article-add-buttons-to-head - "o" gnus-article-treat-overstrike - "e" gnus-article-emphasize - "w" gnus-article-fill-cited-article - "Q" gnus-article-fill-long-lines - "C" gnus-article-capitalize-sentences - "c" gnus-article-remove-cr - "Z" gnus-article-decode-HZ - "f" gnus-article-display-x-face - "l" gnus-summary-stop-page-breaking - "r" gnus-summary-caesar-message - "t" gnus-article-toggle-headers - "v" gnus-summary-verbose-headers - "m" gnus-summary-toggle-mime - "a" gnus-article-strip-headers-in-body ;; mnemonic: wash archive - "p" gnus-article-verify-x-pgp-sig - "d" gnus-article-treat-dumbquotes - "s" gnus-smiley-display) - - (gnus-define-keys (gnus-summary-wash-hide-map "W" gnus-summary-wash-map) - "a" gnus-article-hide - "h" gnus-article-toggle-headers - "b" gnus-article-hide-boring-headers - "s" gnus-article-hide-signature - "c" gnus-article-hide-citation - "C" gnus-article-hide-citation-in-followups - "l" gnus-article-hide-list-identifiers - "p" gnus-article-hide-pgp - "B" gnus-article-strip-banner - "P" gnus-article-hide-pem - "\C-c" gnus-article-hide-citation-maybe) - - (gnus-define-keys (gnus-summary-wash-highlight-map "H" gnus-summary-wash-map) - "a" gnus-article-highlight - "h" gnus-article-highlight-headers - "c" gnus-article-highlight-citation - "s" gnus-article-highlight-signature) - - (gnus-define-keys (gnus-summary-wash-time-map "T" gnus-summary-wash-map) - "z" gnus-article-date-ut - "u" gnus-article-date-ut - "l" gnus-article-date-local - "p" gnus-article-date-english - "e" gnus-article-date-lapsed - "o" gnus-article-date-original - "i" gnus-article-date-iso8601 - "s" gnus-article-date-user) - - (gnus-define-keys (gnus-summary-wash-empty-map "E" gnus-summary-wash-map) - "t" gnus-article-remove-trailing-blank-lines - "l" gnus-article-strip-leading-blank-lines - "m" gnus-article-strip-multiple-blank-lines - "a" gnus-article-strip-blank-lines - "A" gnus-article-strip-all-blank-lines - "s" gnus-article-strip-leading-space - "e" gnus-article-strip-trailing-space - "w" gnus-article-remove-leading-whitespace) - - (gnus-define-keys (gnus-summary-help-map "H" gnus-summary-mode-map) - "v" gnus-version - "f" gnus-summary-fetch-faq - "d" gnus-summary-describe-group - "h" gnus-summary-describe-briefly - "i" gnus-info-find-node) - - (gnus-define-keys (gnus-summary-backend-map "B" gnus-summary-mode-map) - "e" gnus-summary-expire-articles - "\M-\C-e" gnus-summary-expire-articles-now - "\177" gnus-summary-delete-article - [delete] gnus-summary-delete-article - [backspace] gnus-summary-delete-article - "m" gnus-summary-move-article - "r" gnus-summary-respool-article - "w" gnus-summary-edit-article - "c" gnus-summary-copy-article - "B" gnus-summary-crosspost-article - "q" gnus-summary-respool-query - "t" gnus-summary-respool-trace - "i" gnus-summary-import-article - "I" gnus-summary-create-article - "p" gnus-summary-article-posted-p) - - (gnus-define-keys (gnus-summary-save-map "O" gnus-summary-mode-map) - "o" gnus-summary-save-article - "m" gnus-summary-save-article-mail - "F" gnus-summary-write-article-file - "r" gnus-summary-save-article-rmail - "f" gnus-summary-save-article-file - "b" gnus-summary-save-article-body-file - "h" gnus-summary-save-article-folder - "v" gnus-summary-save-article-vm - "p" gnus-summary-pipe-output - "s" gnus-soup-add-article) - - (gnus-define-keys (gnus-summary-mime-map "K" gnus-summary-mode-map) - "b" gnus-summary-display-buttonized - "m" gnus-summary-repair-multipart - "v" gnus-article-view-part - "o" gnus-article-save-part - "c" gnus-article-copy-part - "C" gnus-article-view-part-as-charset - "e" gnus-article-externalize-part - "E" gnus-article-encrypt-body - "i" gnus-article-inline-part - "|" gnus-article-pipe-part)) - -(defvar gnus-article-post-menu nil) - -(defun gnus-summary-make-menu-bar () - (gnus-turn-off-edit-menu 'summary) - - (unless (boundp 'gnus-summary-misc-menu) - - (easy-menu-define - gnus-summary-kill-menu gnus-summary-mode-map "" - (cons - "Score" - (nconc - (list - ["Customize" gnus-score-customize t]) - (gnus-make-score-map 'increase) - (gnus-make-score-map 'lower) - '(("Mark" - ["Kill below" gnus-summary-kill-below t] - ["Mark above" gnus-summary-mark-above t] - ["Tick above" gnus-summary-tick-above t] - ["Clear above" gnus-summary-clear-above t]) - ["Current score" gnus-summary-current-score t] - ["Set score" gnus-summary-set-score t] - ["Switch current score file..." gnus-score-change-score-file t] - ["Set mark below..." gnus-score-set-mark-below t] - ["Set expunge below..." gnus-score-set-expunge-below t] - ["Edit current score file" gnus-score-edit-current-scores t] - ["Edit score file" gnus-score-edit-file t] - ["Trace score" gnus-score-find-trace t] - ["Find words" gnus-score-find-favourite-words t] - ["Rescore buffer" gnus-summary-rescore t] - ["Increase score..." gnus-summary-increase-score t] - ["Lower score..." gnus-summary-lower-score t])))) - - ;; Define both the Article menu in the summary buffer and the equivalent - ;; Commands menu in the article buffer here for consistency. - (let ((innards - `(("Hide" - ["All" gnus-article-hide t] - ["Headers" gnus-article-toggle-headers t] - ["Signature" gnus-article-hide-signature t] - ["Citation" gnus-article-hide-citation t] - ["List identifiers" gnus-article-hide-list-identifiers t] - ["PGP" gnus-article-hide-pgp t] - ["Banner" gnus-article-strip-banner t] - ["Boring headers" gnus-article-hide-boring-headers t]) - ("Highlight" - ["All" gnus-article-highlight t] - ["Headers" gnus-article-highlight-headers t] - ["Signature" gnus-article-highlight-signature t] - ["Citation" gnus-article-highlight-citation t]) - ("Date" - ["Local" gnus-article-date-local t] - ["ISO8601" gnus-article-date-iso8601 t] - ["UT" gnus-article-date-ut t] - ["Original" gnus-article-date-original t] - ["Lapsed" gnus-article-date-lapsed t] - ["User-defined" gnus-article-date-user t]) - ("Washing" - ("Remove Blanks" - ["Leading" gnus-article-strip-leading-blank-lines t] - ["Multiple" gnus-article-strip-multiple-blank-lines t] - ["Trailing" gnus-article-remove-trailing-blank-lines t] - ["All of the above" gnus-article-strip-blank-lines t] - ["All" gnus-article-strip-all-blank-lines t] - ["Leading space" gnus-article-strip-leading-space t] - ["Trailing space" gnus-article-strip-trailing-space t] - ["Leading space in headers" - gnus-article-remove-leading-whitespace t]) - ["Overstrike" gnus-article-treat-overstrike t] - ["Dumb quotes" gnus-article-treat-dumbquotes t] - ["Emphasis" gnus-article-emphasize t] - ["Word wrap" gnus-article-fill-cited-article t] - ["Fill long lines" gnus-article-fill-long-lines t] - ["Capitalize sentences" gnus-article-capitalize-sentences t] - ["CR" gnus-article-remove-cr t] - ["Show X-Face" gnus-article-display-x-face t] - ["Rot 13" gnus-summary-caesar-message - ,@(if (featurep 'xemacs) '(t) - '(:help "\"Caesar rotate\" article by 13"))] - ["Unix pipe" gnus-summary-pipe-message t] - ["Add buttons" gnus-article-add-buttons t] - ["Add buttons to head" gnus-article-add-buttons-to-head t] - ["Stop page breaking" gnus-summary-stop-page-breaking t] - ["Toggle MIME" gnus-summary-toggle-mime t] - ["Verbose header" gnus-summary-verbose-headers t] - ["Toggle header" gnus-summary-toggle-header t] - ["Toggle smileys" gnus-smiley-display t] - ["Verify X-PGP-Sig" gnus-article-verify-x-pgp-sig t] - ["HZ" gnus-article-decode-HZ t]) - ("Output" - ["Save in default format" gnus-summary-save-article - ,@(if (featurep 'xemacs) '(t) - '(:help "Save article using default method"))] - ["Save in file" gnus-summary-save-article-file - ,@(if (featurep 'xemacs) '(t) - '(:help "Save article in file"))] - ["Save in Unix mail format" gnus-summary-save-article-mail t] - ["Save in MH folder" gnus-summary-save-article-folder t] - ["Save in VM folder" gnus-summary-save-article-vm t] - ["Save in RMAIL mbox" gnus-summary-save-article-rmail t] - ["Save body in file" gnus-summary-save-article-body-file t] - ["Pipe through a filter" gnus-summary-pipe-output t] - ["Add to SOUP packet" gnus-soup-add-article t] - ["Print" gnus-summary-print-article t]) - ("Backend" - ["Respool article..." gnus-summary-respool-article t] - ["Move article..." gnus-summary-move-article - (gnus-check-backend-function - 'request-move-article gnus-newsgroup-name)] - ["Copy article..." gnus-summary-copy-article t] - ["Crosspost article..." gnus-summary-crosspost-article - (gnus-check-backend-function - 'request-replace-article gnus-newsgroup-name)] - ["Import file..." gnus-summary-import-article t] - ["Create article..." gnus-summary-create-article t] - ["Check if posted" gnus-summary-article-posted-p t] - ["Edit article" gnus-summary-edit-article - (not (gnus-group-read-only-p))] - ["Delete article" gnus-summary-delete-article - (gnus-check-backend-function - 'request-expire-articles gnus-newsgroup-name)] - ["Query respool" gnus-summary-respool-query t] - ["Trace respool" gnus-summary-respool-trace t] - ["Delete expirable articles" gnus-summary-expire-articles-now - (gnus-check-backend-function - 'request-expire-articles gnus-newsgroup-name)]) - ("Extract" - ["Uudecode" gnus-uu-decode-uu - ,@(if (featurep 'xemacs) '(t) - '(:help "Decode uuencoded article(s)"))] - ["Uudecode and save" gnus-uu-decode-uu-and-save t] - ["Unshar" gnus-uu-decode-unshar t] - ["Unshar and save" gnus-uu-decode-unshar-and-save t] - ["Save" gnus-uu-decode-save t] - ["Binhex" gnus-uu-decode-binhex t] - ["Postscript" gnus-uu-decode-postscript t]) - ("Cache" - ["Enter article" gnus-cache-enter-article t] - ["Remove article" gnus-cache-remove-article t]) - ["Translate" gnus-article-babel t] - ["Select article buffer" gnus-summary-select-article-buffer t] - ["Enter digest buffer" gnus-summary-enter-digest-group t] - ["Isearch article..." gnus-summary-isearch-article t] - ["Beginning of the article" gnus-summary-beginning-of-article t] - ["End of the article" gnus-summary-end-of-article t] - ["Fetch parent of article" gnus-summary-refer-parent-article t] - ["Fetch referenced articles" gnus-summary-refer-references t] - ["Fetch current thread" gnus-summary-refer-thread t] - ["Fetch article with id..." gnus-summary-refer-article t] - ["Setup Mailing List Params" gnus-mailing-list-insinuate t] - ["Redisplay" gnus-summary-show-article t] - ["Raw article" gnus-summary-show-raw-article t]))) - (easy-menu-define - gnus-summary-article-menu gnus-summary-mode-map "" - (cons "Article" innards)) - - (if (not (keymapp gnus-summary-article-menu)) - (easy-menu-define - gnus-article-commands-menu gnus-article-mode-map "" - (cons "Commands" innards)) - ;; in Emacs, don't share menu. - (setq gnus-article-commands-menu - (copy-keymap gnus-summary-article-menu)) - (define-key gnus-article-mode-map [menu-bar commands] - (cons "Commands" gnus-article-commands-menu)))) - - (easy-menu-define - gnus-summary-thread-menu gnus-summary-mode-map "" - '("Threads" - ["Toggle threading" gnus-summary-toggle-threads t] - ["Hide threads" gnus-summary-hide-all-threads t] - ["Show threads" gnus-summary-show-all-threads t] - ["Hide thread" gnus-summary-hide-thread t] - ["Show thread" gnus-summary-show-thread t] - ["Go to next thread" gnus-summary-next-thread t] - ["Go to previous thread" gnus-summary-prev-thread t] - ["Go down thread" gnus-summary-down-thread t] - ["Go up thread" gnus-summary-up-thread t] - ["Top of thread" gnus-summary-top-thread t] - ["Mark thread as read" gnus-summary-kill-thread t] - ["Lower thread score" gnus-summary-lower-thread t] - ["Raise thread score" gnus-summary-raise-thread t] - ["Rethread current" gnus-summary-rethread-current t])) - - (easy-menu-define - gnus-summary-post-menu gnus-summary-mode-map "" - `("Post" - ["Post an article" gnus-summary-post-news - ,@(if (featurep 'xemacs) '(t) - '(:help "Post an article"))] - ["Followup" gnus-summary-followup - ,@(if (featurep 'xemacs) '(t) - '(:help "Post followup to this article"))] - ["Followup and yank" gnus-summary-followup-with-original - ,@(if (featurep 'xemacs) '(t) - '(:help "Post followup to this article, quoting its contents"))] - ["Supersede article" gnus-summary-supersede-article t] - ["Cancel article" gnus-summary-cancel-article - ,@(if (featurep 'xemacs) '(t) - '(:help "Cancel an article you posted"))] - ["Reply" gnus-summary-reply t] - ["Reply and yank" gnus-summary-reply-with-original t] - ["Wide reply" gnus-summary-wide-reply t] - ["Wide reply and yank" gnus-summary-wide-reply-with-original - ,@(if (featurep 'xemacs) '(t) - '(:help "Mail a reply, quoting this article"))] - ["Mail forward" gnus-summary-mail-forward t] - ["Post forward" gnus-summary-post-forward t] - ["Digest and mail" gnus-summary-digest-mail-forward t] - ["Digest and post" gnus-summary-digest-post-forward t] - ["Resend message" gnus-summary-resend-message t] - ["Send bounced mail" gnus-summary-resend-bounced-mail t] - ["Send a mail" gnus-summary-mail-other-window t] - ["Uuencode and post" gnus-uu-post-news - ,@(if (featurep 'xemacs) '(t) - '(:help "Post a uuencoded article"))] - ["Followup via news" gnus-summary-followup-to-mail t] - ["Followup via news and yank" - gnus-summary-followup-to-mail-with-original t] - ;;("Draft" - ;;["Send" gnus-summary-send-draft t] - ;;["Send bounced" gnus-resend-bounced-mail t]) - )) - - (cond - ((not (keymapp gnus-summary-post-menu)) - (setq gnus-article-post-menu gnus-summary-post-menu)) - ((not gnus-article-post-menu) - ;; Don't share post menu. - (setq gnus-article-post-menu - (copy-keymap gnus-summary-post-menu)))) - (define-key gnus-article-mode-map [menu-bar post] - (cons "Post" gnus-article-post-menu)) - - (easy-menu-define - gnus-summary-misc-menu gnus-summary-mode-map "" - `("Gnus" - ("Mark Read" - ["Mark as read" gnus-summary-mark-as-read-forward t] - ["Mark same subject and select" - gnus-summary-kill-same-subject-and-select t] - ["Mark same subject" gnus-summary-kill-same-subject t] - ["Catchup" gnus-summary-catchup - ,@(if (featurep 'xemacs) '(t) - '(:help "Mark unread articles in this group as read"))] - ["Catchup all" gnus-summary-catchup-all t] - ["Catchup to here" gnus-summary-catchup-to-here t] - ["Catchup from here" gnus-summary-catchup-from-here t] - ["Catchup region" gnus-summary-mark-region-as-read t] - ["Mark excluded" gnus-summary-limit-mark-excluded-as-read t]) - ("Mark Various" - ["Tick" gnus-summary-tick-article-forward t] - ["Mark as dormant" gnus-summary-mark-as-dormant t] - ["Remove marks" gnus-summary-clear-mark-forward t] - ["Set expirable mark" gnus-summary-mark-as-expirable t] - ["Set bookmark" gnus-summary-set-bookmark t] - ["Remove bookmark" gnus-summary-remove-bookmark t]) - ("Mark Limit" - ["Marks..." gnus-summary-limit-to-marks t] - ["Subject..." gnus-summary-limit-to-subject t] - ["Author..." gnus-summary-limit-to-author t] - ["Age..." gnus-summary-limit-to-age t] - ["Extra..." gnus-summary-limit-to-extra t] - ["Score" gnus-summary-limit-to-score t] - ["Score" gnus-summary-limit-to-display-predicate t] - ["Unread" gnus-summary-limit-to-unread t] - ["Non-dormant" gnus-summary-limit-exclude-dormant t] - ["Articles" gnus-summary-limit-to-articles t] - ["Pop limit" gnus-summary-pop-limit t] - ["Show dormant" gnus-summary-limit-include-dormant t] - ["Hide childless dormant" - gnus-summary-limit-exclude-childless-dormant t] - ;;["Hide thread" gnus-summary-limit-exclude-thread t] - ["Hide marked" gnus-summary-limit-exclude-marks t] - ["Show expunged" gnus-summary-limit-include-expunged t]) - ("Process Mark" - ["Set mark" gnus-summary-mark-as-processable t] - ["Remove mark" gnus-summary-unmark-as-processable t] - ["Remove all marks" gnus-summary-unmark-all-processable t] - ["Mark above" gnus-uu-mark-over t] - ["Mark series" gnus-uu-mark-series t] - ["Mark region" gnus-uu-mark-region t] - ["Unmark region" gnus-uu-unmark-region t] - ["Mark by regexp..." gnus-uu-mark-by-regexp t] - ["Unmark by regexp..." gnus-uu-unmark-by-regexp t] - ["Mark all" gnus-uu-mark-all t] - ["Mark buffer" gnus-uu-mark-buffer t] - ["Mark sparse" gnus-uu-mark-sparse t] - ["Mark thread" gnus-uu-mark-thread t] - ["Unmark thread" gnus-uu-unmark-thread t] - ("Process Mark Sets" - ["Kill" gnus-summary-kill-process-mark t] - ["Yank" gnus-summary-yank-process-mark - gnus-newsgroup-process-stack] - ["Save" gnus-summary-save-process-mark t])) - ("Scroll article" - ["Page forward" gnus-summary-next-page - ,@(if (featurep 'xemacs) '(t) - '(:help "Show next page of article"))] - ["Page backward" gnus-summary-prev-page - ,@(if (featurep 'xemacs) '(t) - '(:help "Show previous page of article"))] - ["Line forward" gnus-summary-scroll-up t]) - ("Move" - ["Next unread article" gnus-summary-next-unread-article t] - ["Previous unread article" gnus-summary-prev-unread-article t] - ["Next article" gnus-summary-next-article t] - ["Previous article" gnus-summary-prev-article t] - ["Next unread subject" gnus-summary-next-unread-subject t] - ["Previous unread subject" gnus-summary-prev-unread-subject t] - ["Next article same subject" gnus-summary-next-same-subject t] - ["Previous article same subject" gnus-summary-prev-same-subject t] - ["First unread article" gnus-summary-first-unread-article t] - ["Best unread article" gnus-summary-best-unread-article t] - ["Go to subject number..." gnus-summary-goto-subject t] - ["Go to article number..." gnus-summary-goto-article t] - ["Go to the last article" gnus-summary-goto-last-article t] - ["Pop article off history" gnus-summary-pop-article t]) - ("Sort" - ["Sort by number" gnus-summary-sort-by-number t] - ["Sort by author" gnus-summary-sort-by-author t] - ["Sort by subject" gnus-summary-sort-by-subject t] - ["Sort by date" gnus-summary-sort-by-date t] - ["Sort by score" gnus-summary-sort-by-score t] - ["Sort by lines" gnus-summary-sort-by-lines t] - ["Sort by characters" gnus-summary-sort-by-chars t] - ["Original sort" gnus-summary-sort-by-original t]) - ("Help" - ["Fetch group FAQ" gnus-summary-fetch-faq t] - ["Describe group" gnus-summary-describe-group t] - ["Read manual" gnus-info-find-node t]) - ("Modes" - ["Pick and read" gnus-pick-mode t] - ["Binary" gnus-binary-mode t]) - ("Regeneration" - ["Regenerate" gnus-summary-prepare t] - ["Insert cached articles" gnus-summary-insert-cached-articles t] - ["Toggle threading" gnus-summary-toggle-threads t]) - ["See old articles" gnus-summary-insert-old-articles t] - ["See new articles" gnus-summary-insert-new-articles t] - ["Filter articles..." gnus-summary-execute-command t] - ["Run command on subjects..." gnus-summary-universal-argument t] - ["Search articles forward..." gnus-summary-search-article-forward t] - ["Search articles backward..." gnus-summary-search-article-backward t] - ["Toggle line truncation" gnus-summary-toggle-truncation t] - ["Expand window" gnus-summary-expand-window t] - ["Expire expirable articles" gnus-summary-expire-articles - (gnus-check-backend-function - 'request-expire-articles gnus-newsgroup-name)] - ["Edit local kill file" gnus-summary-edit-local-kill t] - ["Edit main kill file" gnus-summary-edit-global-kill t] - ["Edit group parameters" gnus-summary-edit-parameters t] - ["Customize group parameters" gnus-summary-customize-parameters t] - ["Send a bug report" gnus-bug t] - ("Exit" - ["Catchup and exit" gnus-summary-catchup-and-exit - ,@(if (featurep 'xemacs) '(t) - '(:help "Mark unread articles in this group as read, then exit"))] - ["Catchup all and exit" gnus-summary-catchup-all-and-exit t] - ["Catchup and goto next" gnus-summary-catchup-and-goto-next-group t] - ["Exit group" gnus-summary-exit - ,@(if (featurep 'xemacs) '(t) - '(:help "Exit current group, return to group selection mode"))] - ["Exit group without updating" gnus-summary-exit-no-update t] - ["Exit and goto next group" gnus-summary-next-group t] - ["Exit and goto prev group" gnus-summary-prev-group t] - ["Reselect group" gnus-summary-reselect-current-group t] - ["Rescan group" gnus-summary-rescan-group t] - ["Update dribble" gnus-summary-save-newsrc t]))) - - (gnus-run-hooks 'gnus-summary-menu-hook))) - -(defvar gnus-summary-tool-bar-map nil) - -;; Emacs 21 tool bar. Should be no-op otherwise. -(defun gnus-summary-make-tool-bar () - (if (and (fboundp 'tool-bar-add-item-from-menu) - (default-value 'tool-bar-mode) - (not gnus-summary-tool-bar-map)) - (setq gnus-summary-tool-bar-map - (let ((tool-bar-map (make-sparse-keymap)) - (load-path (mm-image-load-path))) - (tool-bar-add-item-from-menu - 'gnus-summary-prev-unread "prev-ur" gnus-summary-mode-map) - (tool-bar-add-item-from-menu - 'gnus-summary-next-unread "next-ur" gnus-summary-mode-map) - (tool-bar-add-item-from-menu - 'gnus-summary-post-news "post" gnus-summary-mode-map) - (tool-bar-add-item-from-menu - 'gnus-summary-followup-with-original "fuwo" gnus-summary-mode-map) - (tool-bar-add-item-from-menu - 'gnus-summary-followup "followup" gnus-summary-mode-map) - (tool-bar-add-item-from-menu - 'gnus-summary-reply-with-original "reply-wo" gnus-summary-mode-map) - (tool-bar-add-item-from-menu - 'gnus-summary-reply "reply" gnus-summary-mode-map) - (tool-bar-add-item-from-menu - 'gnus-summary-caesar-message "rot13" gnus-summary-mode-map) - (tool-bar-add-item-from-menu - 'gnus-uu-decode-uu "uu-decode" gnus-summary-mode-map) - (tool-bar-add-item-from-menu - 'gnus-summary-save-article-file "save-aif" gnus-summary-mode-map) - (tool-bar-add-item-from-menu - 'gnus-summary-save-article "save-art" gnus-summary-mode-map) - (tool-bar-add-item-from-menu - 'gnus-uu-post-news "uu-post" gnus-summary-mode-map) - (tool-bar-add-item-from-menu - 'gnus-summary-catchup "catchup" gnus-summary-mode-map) - (tool-bar-add-item-from-menu - 'gnus-summary-catchup-and-exit "cu-exit" gnus-summary-mode-map) - (tool-bar-add-item-from-menu - 'gnus-summary-exit "exit-summ" gnus-summary-mode-map) - tool-bar-map))) - (if gnus-summary-tool-bar-map - (set (make-local-variable 'tool-bar-map) gnus-summary-tool-bar-map))) - -(defun gnus-score-set-default (var value) - "A version of set that updates the GNU Emacs menu-bar." - (set var value) - ;; It is the message that forces the active status to be updated. - (message "")) - -(defun gnus-make-score-map (type) - "Make a summary score map of type TYPE." - (if t - nil - (let ((headers '(("author" "from" string) - ("subject" "subject" string) - ("article body" "body" string) - ("article head" "head" string) - ("xref" "xref" string) - ("extra header" "extra" string) - ("lines" "lines" number) - ("followups to author" "followup" string))) - (types '((number ("less than" <) - ("greater than" >) - ("equal" =)) - (string ("substring" s) - ("exact string" e) - ("fuzzy string" f) - ("regexp" r)))) - (perms '(("temporary" (current-time-string)) - ("permanent" nil) - ("immediate" now))) - header) - (list - (apply - 'nconc - (list - (if (eq type 'lower) - "Lower score" - "Increase score")) - (let (outh) - (while headers - (setq header (car headers)) - (setq outh - (cons - (apply - 'nconc - (list (car header)) - (let ((ts (cdr (assoc (nth 2 header) types))) - outt) - (while ts - (setq outt - (cons - (apply - 'nconc - (list (caar ts)) - (let ((ps perms) - outp) - (while ps - (setq outp - (cons - (vector - (caar ps) - (list - 'gnus-summary-score-entry - (nth 1 header) - (if (or (string= (nth 1 header) - "head") - (string= (nth 1 header) - "body")) - "" - (list 'gnus-summary-header - (nth 1 header))) - (list 'quote (nth 1 (car ts))) - (list 'gnus-score-delta-default - nil) - (nth 1 (car ps)) - t) - t) - outp)) - (setq ps (cdr ps))) - (list (nreverse outp)))) - outt)) - (setq ts (cdr ts))) - (list (nreverse outt)))) - outh)) - (setq headers (cdr headers))) - (list (nreverse outh)))))))) - - - -(defun gnus-summary-mode (&optional group) - "Major mode for reading articles. - -All normal editing commands are switched off. -\\ -Each line in this buffer represents one article. To read an -article, you can, for instance, type `\\[gnus-summary-next-page]'. To move forwards -and backwards while displaying articles, type `\\[gnus-summary-next-unread-article]' and `\\[gnus-summary-prev-unread-article]', -respectively. - -You can also post articles and send mail from this buffer. To -follow up an article, type `\\[gnus-summary-followup]'. To mail a reply to the author -of an article, type `\\[gnus-summary-reply]'. - -There are approx. one gazillion commands you can execute in this -buffer; read the info pages for more information (`\\[gnus-info-find-node]'). - -The following commands are available: - -\\{gnus-summary-mode-map}" - (interactive) - (kill-all-local-variables) - (when (gnus-visual-p 'summary-menu 'menu) - (gnus-summary-make-menu-bar) - (gnus-summary-make-tool-bar)) - (gnus-summary-make-local-variables) - (let ((gnus-summary-local-variables gnus-newsgroup-variables)) - (gnus-summary-make-local-variables)) - (gnus-make-thread-indent-array) - (gnus-simplify-mode-line) - (setq major-mode 'gnus-summary-mode) - (setq mode-name "Summary") - (make-local-variable 'minor-mode-alist) - (use-local-map gnus-summary-mode-map) - (buffer-disable-undo) - (setq buffer-read-only t) ;Disable modification - (setq truncate-lines t) - (setq selective-display t) - (setq selective-display-ellipses t) ;Display `...' - (gnus-summary-set-display-table) - (gnus-set-default-directory) - (setq gnus-newsgroup-name group) - (unless (gnus-news-group-p group) - (setq gnus-newsgroup-incorporated - (nnmail-new-mail-numbers (gnus-group-real-name group)))) - (make-local-variable 'gnus-summary-line-format) - (make-local-variable 'gnus-summary-line-format-spec) - (make-local-variable 'gnus-summary-dummy-line-format) - (make-local-variable 'gnus-summary-dummy-line-format-spec) - (make-local-variable 'gnus-summary-mark-positions) - (make-local-hook 'pre-command-hook) - (add-hook 'pre-command-hook 'gnus-set-global-variables nil t) - (gnus-run-hooks 'gnus-summary-mode-hook) - (turn-on-gnus-mailing-list-mode) - (gnus-update-format-specifications nil 'summary 'summary-mode 'summary-dummy) - (gnus-update-summary-mark-positions)) - -(defun gnus-summary-make-local-variables () - "Make all the local summary buffer variables." - (let (global) - (dolist (local gnus-summary-local-variables) - (if (consp local) - (progn - (if (eq (cdr local) 'global) - ;; Copy the global value of the variable. - (setq global (symbol-value (car local))) - ;; Use the value from the list. - (setq global (eval (cdr local)))) - (set (make-local-variable (car local)) global)) - ;; Simple nil-valued local variable. - (set (make-local-variable local) nil))))) - -(defun gnus-summary-clear-local-variables () - (let ((locals gnus-summary-local-variables)) - (while locals - (if (consp (car locals)) - (and (vectorp (caar locals)) - (set (caar locals) nil)) - (and (vectorp (car locals)) - (set (car locals) nil))) - (setq locals (cdr locals))))) - -;; Summary data functions. - -(defmacro gnus-data-number (data) - `(car ,data)) - -(defmacro gnus-data-set-number (data number) - `(setcar ,data ,number)) - -(defmacro gnus-data-mark (data) - `(nth 1 ,data)) - -(defmacro gnus-data-set-mark (data mark) - `(setcar (nthcdr 1 ,data) ,mark)) - -(defmacro gnus-data-pos (data) - `(nth 2 ,data)) - -(defmacro gnus-data-set-pos (data pos) - `(setcar (nthcdr 2 ,data) ,pos)) - -(defmacro gnus-data-header (data) - `(nth 3 ,data)) - -(defmacro gnus-data-set-header (data header) - `(setcar (nthcdr 3 ,data) ,header)) - -(defmacro gnus-data-level (data) - `(nth 4 ,data)) - -(defmacro gnus-data-unread-p (data) - `(= (nth 1 ,data) gnus-unread-mark)) - -(defmacro gnus-data-read-p (data) - `(/= (nth 1 ,data) gnus-unread-mark)) - -(defmacro gnus-data-pseudo-p (data) - `(consp (nth 3 ,data))) - -(defmacro gnus-data-find (number) - `(assq ,number gnus-newsgroup-data)) - -(defmacro gnus-data-find-list (number &optional data) - `(let ((bdata ,(or data 'gnus-newsgroup-data))) - (memq (assq ,number bdata) - bdata))) - -(defmacro gnus-data-make (number mark pos header level) - `(list ,number ,mark ,pos ,header ,level)) - -(defun gnus-data-enter (after-article number mark pos header level offset) - (let ((data (gnus-data-find-list after-article))) - (unless data - (error "No such article: %d" after-article)) - (setcdr data (cons (gnus-data-make number mark pos header level) - (cdr data))) - (setq gnus-newsgroup-data-reverse nil) - (gnus-data-update-list (cddr data) offset))) - -(defun gnus-data-enter-list (after-article list &optional offset) - (when list - (let ((data (and after-article (gnus-data-find-list after-article))) - (ilist list)) - (if (not (or data - after-article)) - (let ((odata gnus-newsgroup-data)) - (setq gnus-newsgroup-data (nconc list gnus-newsgroup-data)) - (when offset - (gnus-data-update-list odata offset))) - ;; Find the last element in the list to be spliced into the main - ;; list. - (while (cdr list) - (setq list (cdr list))) - (if (not data) - (progn - (setcdr list gnus-newsgroup-data) - (setq gnus-newsgroup-data ilist) - (when offset - (gnus-data-update-list (cdr list) offset))) - (setcdr list (cdr data)) - (setcdr data ilist) - (when offset - (gnus-data-update-list (cdr list) offset)))) - (setq gnus-newsgroup-data-reverse nil)))) - -(defun gnus-data-remove (article &optional offset) - (let ((data gnus-newsgroup-data)) - (if (= (gnus-data-number (car data)) article) - (progn - (setq gnus-newsgroup-data (cdr gnus-newsgroup-data) - gnus-newsgroup-data-reverse nil) - (when offset - (gnus-data-update-list gnus-newsgroup-data offset))) - (while (cdr data) - (when (= (gnus-data-number (cadr data)) article) - (setcdr data (cddr data)) - (when offset - (gnus-data-update-list (cdr data) offset)) - (setq data nil - gnus-newsgroup-data-reverse nil)) - (setq data (cdr data)))))) - -(defmacro gnus-data-list (backward) - `(if ,backward - (or gnus-newsgroup-data-reverse - (setq gnus-newsgroup-data-reverse - (reverse gnus-newsgroup-data))) - gnus-newsgroup-data)) - -(defun gnus-data-update-list (data offset) - "Add OFFSET to the POS of all data entries in DATA." - (setq gnus-newsgroup-data-reverse nil) - (while data - (setcar (nthcdr 2 (car data)) (+ offset (nth 2 (car data)))) - (setq data (cdr data)))) - -(defun gnus-summary-article-pseudo-p (article) - "Say whether this article is a pseudo article or not." - (not (vectorp (gnus-data-header (gnus-data-find article))))) - -(defmacro gnus-summary-article-sparse-p (article) - "Say whether this article is a sparse article or not." - `(memq ,article gnus-newsgroup-sparse)) - -(defmacro gnus-summary-article-ancient-p (article) - "Say whether this article is a sparse article or not." - `(memq ,article gnus-newsgroup-ancient)) - -(defun gnus-article-parent-p (number) - "Say whether this article is a parent or not." - (let ((data (gnus-data-find-list number))) - (and (cdr data) ; There has to be an article after... - (< (gnus-data-level (car data)) ; And it has to have a higher level. - (gnus-data-level (nth 1 data)))))) - -(defun gnus-article-children (number) - "Return a list of all children to NUMBER." - (let* ((data (gnus-data-find-list number)) - (level (gnus-data-level (car data))) - children) - (setq data (cdr data)) - (while (and data - (= (gnus-data-level (car data)) (1+ level))) - (push (gnus-data-number (car data)) children) - (setq data (cdr data))) - children)) - -(defmacro gnus-summary-skip-intangible () - "If the current article is intangible, then jump to a different article." - '(let ((to (get-text-property (point) 'gnus-intangible))) - (and to (gnus-summary-goto-subject to)))) - -(defmacro gnus-summary-article-intangible-p () - "Say whether this article is intangible or not." - '(get-text-property (point) 'gnus-intangible)) - -(defun gnus-article-read-p (article) - "Say whether ARTICLE is read or not." - (not (or (memq article gnus-newsgroup-marked) - (memq article gnus-newsgroup-unreads) - (memq article gnus-newsgroup-unselected) - (memq article gnus-newsgroup-dormant)))) - -;; Some summary mode macros. - -(defmacro gnus-summary-article-number () - "The article number of the article on the current line. -If there isn's an article number here, then we return the current -article number." - '(progn - (gnus-summary-skip-intangible) - (or (get-text-property (point) 'gnus-number) - (gnus-summary-last-subject)))) - -(defmacro gnus-summary-article-header (&optional number) - "Return the header of article NUMBER." - `(gnus-data-header (gnus-data-find - ,(or number '(gnus-summary-article-number))))) - -(defmacro gnus-summary-thread-level (&optional number) - "Return the level of thread that starts with article NUMBER." - `(if (and (eq gnus-summary-make-false-root 'dummy) - (get-text-property (point) 'gnus-intangible)) - 0 - (gnus-data-level (gnus-data-find - ,(or number '(gnus-summary-article-number)))))) - -(defmacro gnus-summary-article-mark (&optional number) - "Return the mark of article NUMBER." - `(gnus-data-mark (gnus-data-find - ,(or number '(gnus-summary-article-number))))) - -(defmacro gnus-summary-article-pos (&optional number) - "Return the position of the line of article NUMBER." - `(gnus-data-pos (gnus-data-find - ,(or number '(gnus-summary-article-number))))) - -(defalias 'gnus-summary-subject-string 'gnus-summary-article-subject) -(defmacro gnus-summary-article-subject (&optional number) - "Return current subject string or nil if nothing." - `(let ((headers - ,(if number - `(gnus-data-header (assq ,number gnus-newsgroup-data)) - '(gnus-data-header (assq (gnus-summary-article-number) - gnus-newsgroup-data))))) - (and headers - (vectorp headers) - (mail-header-subject headers)))) - -(defmacro gnus-summary-article-score (&optional number) - "Return current article score." - `(or (cdr (assq ,(or number '(gnus-summary-article-number)) - gnus-newsgroup-scored)) - gnus-summary-default-score 0)) - -(defun gnus-summary-article-children (&optional number) - "Return a list of article numbers that are children of article NUMBER." - (let* ((data (gnus-data-find-list (or number (gnus-summary-article-number)))) - (level (gnus-data-level (car data))) - l children) - (while (and (setq data (cdr data)) - (> (setq l (gnus-data-level (car data))) level)) - (and (= (1+ level) l) - (push (gnus-data-number (car data)) - children))) - (nreverse children))) - -(defun gnus-summary-article-parent (&optional number) - "Return the article number of the parent of article NUMBER." - (let* ((data (gnus-data-find-list (or number (gnus-summary-article-number)) - (gnus-data-list t))) - (level (gnus-data-level (car data)))) - (if (zerop level) - () ; This is a root. - ;; We search until we find an article with a level less than - ;; this one. That function has to be the parent. - (while (and (setq data (cdr data)) - (not (< (gnus-data-level (car data)) level)))) - (and data (gnus-data-number (car data)))))) - -(defun gnus-unread-mark-p (mark) - "Say whether MARK is the unread mark." - (= mark gnus-unread-mark)) - -(defun gnus-read-mark-p (mark) - "Say whether MARK is one of the marks that mark as read. -This is all marks except unread, ticked, dormant, and expirable." - (not (or (= mark gnus-unread-mark) - (= mark gnus-ticked-mark) - (= mark gnus-dormant-mark) - (= mark gnus-expirable-mark)))) - -(defmacro gnus-article-mark (number) - "Return the MARK of article NUMBER. -This macro should only be used when computing the mark the \"first\" -time; i.e., when generating the summary lines. After that, -`gnus-summary-article-mark' should be used to examine the -marks of articles." - `(cond - ((memq ,number gnus-newsgroup-unsendable) gnus-unsendable-mark) - ((memq ,number gnus-newsgroup-undownloaded) gnus-undownloaded-mark) - ((memq ,number gnus-newsgroup-downloadable) gnus-downloadable-mark) - ((memq ,number gnus-newsgroup-unreads) gnus-unread-mark) - ((memq ,number gnus-newsgroup-marked) gnus-ticked-mark) - ((memq ,number gnus-newsgroup-dormant) gnus-dormant-mark) - ((memq ,number gnus-newsgroup-expirable) gnus-expirable-mark) - (t (or (cdr (assq ,number gnus-newsgroup-reads)) - gnus-ancient-mark)))) - -;; Saving hidden threads. - -(put 'gnus-save-hidden-threads 'lisp-indent-function 0) -(put 'gnus-save-hidden-threads 'edebug-form-spec '(body)) - -(defmacro gnus-save-hidden-threads (&rest forms) - "Save hidden threads, eval FORMS, and restore the hidden threads." - (let ((config (make-symbol "config"))) - `(let ((,config (gnus-hidden-threads-configuration))) - (unwind-protect - (save-excursion - ,@forms) - (gnus-restore-hidden-threads-configuration ,config))))) - -(defun gnus-data-compute-positions () - "Compute the positions of all articles." - (setq gnus-newsgroup-data-reverse nil) - (let ((data gnus-newsgroup-data)) - (save-excursion - (gnus-save-hidden-threads - (gnus-summary-show-all-threads) - (goto-char (point-min)) - (while data - (while (get-text-property (point) 'gnus-intangible) - (forward-line 1)) - (gnus-data-set-pos (car data) (+ (point) 3)) - (setq data (cdr data)) - (forward-line 1)))))) - -(defun gnus-hidden-threads-configuration () - "Return the current hidden threads configuration." - (save-excursion - (let (config) - (goto-char (point-min)) - (while (search-forward "\r" nil t) - (push (1- (point)) config)) - config))) - -(defun gnus-restore-hidden-threads-configuration (config) - "Restore hidden threads configuration from CONFIG." - (save-excursion - (let (point buffer-read-only) - (while (setq point (pop config)) - (when (and (< point (point-max)) - (goto-char point) - (eq (char-after) ?\n)) - (subst-char-in-region point (1+ point) ?\n ?\r)))))) - -;; Various summary mode internalish functions. - -(defun gnus-mouse-pick-article (e) - (interactive "e") - (mouse-set-point e) - (gnus-summary-next-page nil t)) - -(defun gnus-summary-set-display-table () - "Change the display table. -Odd characters have a tendency to mess -up nicely formatted displays - we make all possible glyphs -display only a single character." - - ;; We start from the standard display table, if any. - (let ((table (or (copy-sequence standard-display-table) - (make-display-table))) - (i 32)) - ;; Nix out all the control chars... - (while (>= (setq i (1- i)) 0) - (aset table i [??])) - ;; ... but not newline and cr, of course. (cr is necessary for the - ;; selective display). - (aset table ?\n nil) - (aset table ?\r nil) - ;; We keep TAB as well. - (aset table ?\t nil) - ;; We nix out any glyphs over 126 that are not set already. - (let ((i 256)) - (while (>= (setq i (1- i)) 127) - ;; Only modify if the entry is nil. - (unless (aref table i) - (aset table i [??])))) - (setq buffer-display-table table))) - -(defun gnus-summary-set-article-display-arrow (pos) - "Update the overlay arrow to point to line at position POS." - (when (and gnus-summary-display-arrow - (boundp 'overlay-arrow-position) - (boundp 'overlay-arrow-string)) - (save-excursion - (goto-char pos) - (beginning-of-line) - (unless overlay-arrow-position - (setq overlay-arrow-position (make-marker))) - (setq overlay-arrow-string "=>" - overlay-arrow-position (set-marker overlay-arrow-position - (point) - (current-buffer)))))) - -(defun gnus-summary-buffer-name (group) - "Return the summary buffer name of GROUP." - (concat "*Summary " group "*")) - -(defun gnus-summary-setup-buffer (group) - "Initialize summary buffer." - (let ((buffer (gnus-summary-buffer-name group))) - (if (get-buffer buffer) - (progn - (set-buffer buffer) - (setq gnus-summary-buffer (current-buffer)) - (not gnus-newsgroup-prepared)) - ;; Fix by Sudish Joseph - (setq gnus-summary-buffer (set-buffer (gnus-get-buffer-create buffer))) - (gnus-summary-mode group) - (when gnus-carpal - (gnus-carpal-setup-buffer 'summary)) - (unless gnus-single-article-buffer - (make-local-variable 'gnus-article-buffer) - (make-local-variable 'gnus-article-current) - (make-local-variable 'gnus-original-article-buffer)) - (setq gnus-newsgroup-name group) - ;; Set any local variables in the group parameters. - (gnus-summary-set-local-parameters gnus-newsgroup-name) - t))) - -(defun gnus-set-global-variables () - "Set the global equivalents of the buffer-local variables. -They are set to the latest values they had. These reflect the summary -buffer that was in action when the last article was fetched." - (when (eq major-mode 'gnus-summary-mode) - (setq gnus-summary-buffer (current-buffer)) - (let ((name gnus-newsgroup-name) - (marked gnus-newsgroup-marked) - (unread gnus-newsgroup-unreads) - (headers gnus-current-headers) - (data gnus-newsgroup-data) - (summary gnus-summary-buffer) - (article-buffer gnus-article-buffer) - (original gnus-original-article-buffer) - (gac gnus-article-current) - (reffed gnus-reffed-article-number) - (score-file gnus-current-score-file) - (default-charset gnus-newsgroup-charset) - vlist) - (let ((locals gnus-newsgroup-variables)) - (while locals - (if (consp (car locals)) - (push (eval (caar locals)) vlist) - (push (eval (car locals)) vlist)) - (setq locals (cdr locals))) - (setq vlist (nreverse vlist))) - (save-excursion - (set-buffer gnus-group-buffer) - (setq gnus-newsgroup-name name - gnus-newsgroup-marked marked - gnus-newsgroup-unreads unread - gnus-current-headers headers - gnus-newsgroup-data data - gnus-article-current gac - gnus-summary-buffer summary - gnus-article-buffer article-buffer - gnus-original-article-buffer original - gnus-reffed-article-number reffed - gnus-current-score-file score-file - gnus-newsgroup-charset default-charset) - (let ((locals gnus-newsgroup-variables)) - (while locals - (if (consp (car locals)) - (set (caar locals) (pop vlist)) - (set (car locals) (pop vlist))) - (setq locals (cdr locals)))) - ;; The article buffer also has local variables. - (when (gnus-buffer-live-p gnus-article-buffer) - (set-buffer gnus-article-buffer) - (setq gnus-summary-buffer summary)))))) - -(defun gnus-summary-article-unread-p (article) - "Say whether ARTICLE is unread or not." - (memq article gnus-newsgroup-unreads)) - -(defun gnus-summary-first-article-p (&optional article) - "Return whether ARTICLE is the first article in the buffer." - (if (not (setq article (or article (gnus-summary-article-number)))) - nil - (eq article (caar gnus-newsgroup-data)))) - -(defun gnus-summary-last-article-p (&optional article) - "Return whether ARTICLE is the last article in the buffer." - (if (not (setq article (or article (gnus-summary-article-number)))) - ;; All non-existent numbers are the last article. :-) - t - (not (cdr (gnus-data-find-list article))))) - -(defun gnus-make-thread-indent-array () - (let ((n 200)) - (unless (and gnus-thread-indent-array - (= gnus-thread-indent-level gnus-thread-indent-array-level)) - (setq gnus-thread-indent-array (make-vector 201 "") - gnus-thread-indent-array-level gnus-thread-indent-level) - (while (>= n 0) - (aset gnus-thread-indent-array n - (make-string (* n gnus-thread-indent-level) ? )) - (setq n (1- n)))))) - -(defun gnus-update-summary-mark-positions () - "Compute where the summary marks are to go." - (save-excursion - (when (gnus-buffer-exists-p gnus-summary-buffer) - (set-buffer gnus-summary-buffer)) - (let ((gnus-replied-mark 129) - (gnus-score-below-mark 130) - (gnus-score-over-mark 130) - (gnus-download-mark 131) - (spec gnus-summary-line-format-spec) - gnus-visual pos) - (save-excursion - (gnus-set-work-buffer) - (let ((gnus-summary-line-format-spec spec) - (gnus-newsgroup-downloadable '((0 . t)))) - (gnus-summary-insert-line - (make-full-mail-header 0 "" "nobody" - "05 Apr 2001 23:33:09 +0400" - "" "" 0 0 "" nil) - 0 nil 128 t nil "" nil 1) - (goto-char (point-min)) - (setq pos (list (cons 'unread (and (search-forward "\200" nil t) - (- (point) 2))))) - (goto-char (point-min)) - (push (cons 'replied (and (search-forward "\201" nil t) - (- (point) 2))) - pos) - (goto-char (point-min)) - (push (cons 'score (and (search-forward "\202" nil t) (- (point) 2))) - pos) - (goto-char (point-min)) - (push (cons 'download - (and (search-forward "\203" nil t) (- (point) 2))) - pos))) - (setq gnus-summary-mark-positions pos)))) - -(defun gnus-summary-insert-dummy-line (gnus-tmp-subject gnus-tmp-number) - "Insert a dummy root in the summary buffer." - (beginning-of-line) - (gnus-add-text-properties - (point) (progn (eval gnus-summary-dummy-line-format-spec) (point)) - (list 'gnus-number gnus-tmp-number 'gnus-intangible gnus-tmp-number))) - -(defun gnus-summary-from-or-to-or-newsgroups (header) - (let ((to (cdr (assq 'To (mail-header-extra header)))) - (newsgroups (cdr (assq 'Newsgroups (mail-header-extra header)))) - (default-mime-charset (with-current-buffer gnus-summary-buffer - default-mime-charset))) - (cond - ((and to - gnus-ignored-from-addresses - (string-match gnus-ignored-from-addresses - (mail-header-from header))) - (concat "-> " - (or (car (funcall gnus-extract-address-components - (funcall - gnus-decode-encoded-word-function to))) - (funcall gnus-decode-encoded-word-function to)))) - ((and newsgroups - gnus-ignored-from-addresses - (string-match gnus-ignored-from-addresses - (mail-header-from header))) - (concat "=> " newsgroups)) - (t - (or (car (funcall gnus-extract-address-components - (mail-header-from header))) - (mail-header-from header)))))) - -(defun gnus-summary-insert-line (gnus-tmp-header - gnus-tmp-level gnus-tmp-current - gnus-tmp-unread gnus-tmp-replied - gnus-tmp-expirable gnus-tmp-subject-or-nil - &optional gnus-tmp-dummy gnus-tmp-score - gnus-tmp-process) - (let* ((gnus-tmp-indentation (aref gnus-thread-indent-array gnus-tmp-level)) - (gnus-tmp-lines (mail-header-lines gnus-tmp-header)) - (gnus-tmp-score (or gnus-tmp-score gnus-summary-default-score 0)) - (gnus-tmp-score-char - (if (or (null gnus-summary-default-score) - (<= (abs (- gnus-tmp-score gnus-summary-default-score)) - gnus-summary-zcore-fuzz)) - ?\ ;;;Whitespace - (if (< gnus-tmp-score gnus-summary-default-score) - gnus-score-below-mark gnus-score-over-mark))) - (gnus-tmp-replied - (cond (gnus-tmp-process gnus-process-mark) - ((memq gnus-tmp-current gnus-newsgroup-cached) - gnus-cached-mark) - (gnus-tmp-replied gnus-replied-mark) - ((memq gnus-tmp-current gnus-newsgroup-saved) - gnus-saved-mark) - (t gnus-no-mark))) - (gnus-tmp-from (mail-header-from gnus-tmp-header)) - (gnus-tmp-name - (cond - ((string-match "<[^>]+> *$" gnus-tmp-from) - (let ((beg (match-beginning 0))) - (or (and (string-match "^\".+\"" gnus-tmp-from) - (substring gnus-tmp-from 1 (1- (match-end 0)))) - (substring gnus-tmp-from 0 beg)))) - ((string-match "(.+)" gnus-tmp-from) - (substring gnus-tmp-from - (1+ (match-beginning 0)) (1- (match-end 0)))) - (t gnus-tmp-from))) - (gnus-tmp-subject (mail-header-subject gnus-tmp-header)) - (gnus-tmp-number (mail-header-number gnus-tmp-header)) - (gnus-tmp-opening-bracket (if gnus-tmp-dummy ?\< ?\[)) - (gnus-tmp-closing-bracket (if gnus-tmp-dummy ?\> ?\])) - (buffer-read-only nil)) - (when (string= gnus-tmp-name "") - (setq gnus-tmp-name gnus-tmp-from)) - (unless (numberp gnus-tmp-lines) - (setq gnus-tmp-lines -1)) - (if (= gnus-tmp-lines -1) - (setq gnus-tmp-lines "?") - (setq gnus-tmp-lines (number-to-string gnus-tmp-lines))) - (gnus-put-text-property-excluding-characters-with-faces - (point) - (progn (eval gnus-summary-line-format-spec) (point)) - 'gnus-number gnus-tmp-number) - (when (gnus-visual-p 'summary-highlight 'highlight) - (forward-line -1) - (gnus-run-hooks 'gnus-summary-update-hook) - (forward-line 1)))) - -(defun gnus-summary-update-line (&optional dont-update) - "Update summary line after change." - (when (and gnus-summary-default-score - (not gnus-summary-inhibit-highlight)) - (let* ((gnus-summary-inhibit-highlight t) ; Prevent recursion. - (article (gnus-summary-article-number)) - (score (gnus-summary-article-score article))) - (unless dont-update - (if (and gnus-summary-mark-below - (< (gnus-summary-article-score) - gnus-summary-mark-below)) - ;; This article has a low score, so we mark it as read. - (when (memq article gnus-newsgroup-unreads) - (gnus-summary-mark-article-as-read gnus-low-score-mark)) - (when (eq (gnus-summary-article-mark) gnus-low-score-mark) - ;; This article was previously marked as read on account - ;; of a low score, but now it has risen, so we mark it as - ;; unread. - (gnus-summary-mark-article-as-unread gnus-unread-mark))) - (gnus-summary-update-mark - (if (or (null gnus-summary-default-score) - (<= (abs (- score gnus-summary-default-score)) - gnus-summary-zcore-fuzz)) - ?\ ;;;Whitespace - (if (< score gnus-summary-default-score) - gnus-score-below-mark gnus-score-over-mark)) - 'score)) - ;; Do visual highlighting. - (when (gnus-visual-p 'summary-highlight 'highlight) - (gnus-run-hooks 'gnus-summary-update-hook))))) - -(defvar gnus-tmp-new-adopts nil) - -(defun gnus-summary-number-of-articles-in-thread (thread &optional level char) - "Return the number of articles in THREAD. -This may be 0 in some cases -- if none of the articles in -the thread are to be displayed." - (let* ((number - ;; Fix by Luc Van Eycken . - (cond - ((not (listp thread)) - 1) - ((and (consp thread) (cdr thread)) - (apply - '+ 1 (mapcar - 'gnus-summary-number-of-articles-in-thread (cdr thread)))) - ((null thread) - 1) - ((memq (mail-header-number (car thread)) gnus-newsgroup-limit) - 1) - (t 0)))) - (when (and level (zerop level) gnus-tmp-new-adopts) - (incf number - (apply '+ (mapcar - 'gnus-summary-number-of-articles-in-thread - gnus-tmp-new-adopts)))) - (if char - (if (> number 1) gnus-not-empty-thread-mark - gnus-empty-thread-mark) - number))) - -(defun gnus-summary-set-local-parameters (group) - "Go through the local params of GROUP and set all variable specs in that list." - (let ((params (gnus-group-find-parameter group)) - (vars '(quit-config)) ; Ignore quit-config. - elem) - (while params - (setq elem (car params) - params (cdr params)) - (and (consp elem) ; Has to be a cons. - (consp (cdr elem)) ; The cdr has to be a list. - (symbolp (car elem)) ; Has to be a symbol in there. - (not (memq (car elem) vars)) - (ignore-errors ; So we set it. - (push (car elem) vars) - (make-local-variable (car elem)) - (set (car elem) (eval (nth 1 elem)))))))) - -(defun gnus-summary-read-group (group &optional show-all no-article - kill-buffer no-display backward - select-articles) - "Start reading news in newsgroup GROUP. -If SHOW-ALL is non-nil, already read articles are also listed. -If NO-ARTICLE is non-nil, no article is selected initially. -If NO-DISPLAY, don't generate a summary buffer." - (let (result) - (while (and group - (null (setq result - (let ((gnus-auto-select-next nil)) - (or (gnus-summary-read-group-1 - group show-all no-article - kill-buffer no-display - select-articles) - (setq show-all nil - select-articles nil))))) - (eq gnus-auto-select-next 'quietly)) - (set-buffer gnus-group-buffer) - ;; The entry function called above goes to the next - ;; group automatically, so we go two groups back - ;; if we are searching for the previous group. - (when backward - (gnus-group-prev-unread-group 2)) - (if (not (equal group (gnus-group-group-name))) - (setq group (gnus-group-group-name)) - (setq group nil))) - result)) - -(defun gnus-summary-jump-to-other-group (group &optional show-all) - "Directly jump to the other GROUP from summary buffer. -If SHOW-ALL is non-nil, already read articles are also listed." - (interactive - (if (eq gnus-summary-buffer (current-buffer)) - (list (completing-read - "Group: " gnus-active-hashtb nil t - (when (and gnus-newsgroup-name - (string-match "[.:][^.:]+$" gnus-newsgroup-name)) - (substring gnus-newsgroup-name 0 (1+ (match-beginning 0)))) - 'gnus-group-history) - current-prefix-arg) - (error "%s must be invoked from a gnus summary buffer." this-command))) - (unless (or (zerop (length group)) - (and gnus-newsgroup-name - (string-equal gnus-newsgroup-name group))) - (gnus-summary-exit) - (gnus-summary-read-group group show-all - gnus-dont-select-after-jump-to-other-group))) - -(defun gnus-summary-read-group-1 (group show-all no-article - kill-buffer no-display - &optional select-articles) - ;; Killed foreign groups can't be entered. - ;; (when (and (not (gnus-group-native-p group)) - ;; (not (gnus-gethash group gnus-newsrc-hashtb))) - ;; (error "Dead non-native groups can't be entered")) - (gnus-message 5 "Retrieving newsgroup: %s..." - (gnus-group-decoded-name group)) - (let* ((new-group (gnus-summary-setup-buffer group)) - (quit-config (gnus-group-quit-config group)) - (did-select (and new-group (gnus-select-newsgroup - group show-all select-articles)))) - (cond - ;; This summary buffer exists already, so we just select it. - ((not new-group) - (gnus-set-global-variables) - (when kill-buffer - (gnus-kill-or-deaden-summary kill-buffer)) - (gnus-configure-windows 'summary 'force) - (gnus-set-mode-line 'summary) - (gnus-summary-position-point) - (message "") - t) - ;; We couldn't select this group. - ((null did-select) - (when (and (eq major-mode 'gnus-summary-mode) - (not (equal (current-buffer) kill-buffer))) - (kill-buffer (current-buffer)) - (if (not quit-config) - (progn - ;; Update the info -- marks might need to be removed, - ;; for instance. - (gnus-summary-update-info) - (set-buffer gnus-group-buffer) - (gnus-group-jump-to-group group) - (gnus-group-next-unread-group 1)) - (gnus-handle-ephemeral-exit quit-config))) - (let ((grpinfo (gnus-get-info group))) - (if (null (gnus-info-read grpinfo)) - (gnus-message 3 "Group %s contains no messages" - (gnus-group-decoded-name group)) - (gnus-message 3 "Can't select group"))) - nil) - ;; The user did a `C-g' while prompting for number of articles, - ;; so we exit this group. - ((eq did-select 'quit) - (and (eq major-mode 'gnus-summary-mode) - (not (equal (current-buffer) kill-buffer)) - (kill-buffer (current-buffer))) - (when kill-buffer - (gnus-kill-or-deaden-summary kill-buffer)) - (if (not quit-config) - (progn - (set-buffer gnus-group-buffer) - (gnus-group-jump-to-group group) - (gnus-group-next-unread-group 1) - (gnus-configure-windows 'group 'force)) - (gnus-handle-ephemeral-exit quit-config)) - ;; Finally signal the quit. - (signal 'quit nil)) - ;; The group was successfully selected. - (t - (gnus-set-global-variables) - ;; Save the active value in effect when the group was entered. - (setq gnus-newsgroup-active - (gnus-copy-sequence - (gnus-active gnus-newsgroup-name))) - ;; You can change the summary buffer in some way with this hook. - (gnus-run-hooks 'gnus-select-group-hook) - (gnus-update-format-specifications - nil 'summary 'summary-mode 'summary-dummy) - (gnus-update-summary-mark-positions) - ;; Do score processing. - (when gnus-use-scoring - (gnus-possibly-score-headers)) - ;; Check whether to fill in the gaps in the threads. - (when gnus-build-sparse-threads - (gnus-build-sparse-threads)) - ;; Find the initial limit. - (if gnus-show-threads - (if show-all - (let ((gnus-newsgroup-dormant nil)) - (gnus-summary-initial-limit show-all)) - (gnus-summary-initial-limit show-all)) - ;; When untreaded, all articles are always shown. - (setq gnus-newsgroup-limit - (mapcar - (lambda (header) (mail-header-number header)) - gnus-newsgroup-headers))) - ;; Generate the summary buffer. - (unless no-display - (gnus-summary-prepare)) - (when gnus-use-trees - (gnus-tree-open group) - (setq gnus-summary-highlight-line-function - 'gnus-tree-highlight-article)) - ;; If the summary buffer is empty, but there are some low-scored - ;; articles or some excluded dormants, we include these in the - ;; buffer. - (when (and (zerop (buffer-size)) - (not no-display)) - (cond (gnus-newsgroup-dormant - (gnus-summary-limit-include-dormant)) - ((and gnus-newsgroup-scored show-all) - (gnus-summary-limit-include-expunged t)))) - ;; Function `gnus-apply-kill-file' must be called in this hook. - (gnus-run-hooks 'gnus-apply-kill-hook) - (if (and (zerop (buffer-size)) - (not no-display)) - (progn - ;; This newsgroup is empty. - (gnus-summary-catchup-and-exit nil t) - (gnus-message 6 "No unread news") - (when kill-buffer - (gnus-kill-or-deaden-summary kill-buffer)) - ;; Return nil from this function. - nil) - ;; Hide conversation thread subtrees. We cannot do this in - ;; gnus-summary-prepare-hook since kill processing may not - ;; work with hidden articles. - (and gnus-show-threads - gnus-thread-hide-subtree - (gnus-summary-hide-all-threads)) - (when kill-buffer - (gnus-kill-or-deaden-summary kill-buffer)) - ;; Show first unread article if requested. - (if (and (not no-article) - (not no-display) - gnus-newsgroup-unreads - gnus-auto-select-first) - (progn - (gnus-configure-windows 'summary) - (cond - ((eq gnus-auto-select-first 'best) - (gnus-summary-best-unread-article)) - ((eq gnus-auto-select-first t) - (gnus-summary-first-unread-article)) - ((gnus-functionp gnus-auto-select-first) - (funcall gnus-auto-select-first)))) - ;; Don't select any articles, just move point to the first - ;; article in the group. - (goto-char (point-min)) - (gnus-summary-position-point) - (gnus-configure-windows 'summary 'force) - (gnus-set-mode-line 'summary)) - (when (get-buffer-window gnus-group-buffer t) - ;; Gotta use windows, because recenter does weird stuff if - ;; the current buffer ain't the displayed window. - (let ((owin (selected-window))) - (select-window (get-buffer-window gnus-group-buffer t)) - (when (gnus-group-goto-group group) - (recenter)) - (select-window owin))) - ;; Mark this buffer as "prepared". - (setq gnus-newsgroup-prepared t) - (gnus-run-hooks 'gnus-summary-prepared-hook) - t))))) - -(defun gnus-summary-prepare () - "Generate the summary buffer." - (interactive) - (let ((buffer-read-only nil)) - (erase-buffer) - (setq gnus-newsgroup-data nil - gnus-newsgroup-data-reverse nil) - (gnus-run-hooks 'gnus-summary-generate-hook) - ;; Generate the buffer, either with threads or without. - (when gnus-newsgroup-headers - (gnus-summary-prepare-threads - (if gnus-show-threads - (gnus-sort-gathered-threads - (funcall gnus-summary-thread-gathering-function - (gnus-sort-threads - (gnus-cut-threads (gnus-make-threads))))) - ;; Unthreaded display. - (gnus-sort-articles gnus-newsgroup-headers)))) - (setq gnus-newsgroup-data (nreverse gnus-newsgroup-data)) - ;; Call hooks for modifying summary buffer. - (goto-char (point-min)) - (gnus-run-hooks 'gnus-summary-prepare-hook))) - -(defsubst gnus-general-simplify-subject (subject) - "Simply subject by the same rules as gnus-gather-threads-by-subject." - (setq subject - (cond - ;; Truncate the subject. - (gnus-simplify-subject-functions - (gnus-map-function gnus-simplify-subject-functions subject)) - ((numberp gnus-summary-gather-subject-limit) - (setq subject (gnus-simplify-subject-re subject)) - (if (> (length subject) gnus-summary-gather-subject-limit) - (substring subject 0 gnus-summary-gather-subject-limit) - subject)) - ;; Fuzzily simplify it. - ((eq 'fuzzy gnus-summary-gather-subject-limit) - (gnus-simplify-subject-fuzzy subject)) - ;; Just remove the leading "Re:". - (t - (gnus-simplify-subject-re subject)))) - - (if (and gnus-summary-gather-exclude-subject - (string-match gnus-summary-gather-exclude-subject subject)) - nil ; This article shouldn't be gathered - subject)) - -(defun gnus-summary-simplify-subject-query () - "Query where the respool algorithm would put this article." - (interactive) - (gnus-summary-select-article) - (message "%s" - (gnus-general-simplify-subject (gnus-summary-article-subject)))) - -(defun gnus-gather-threads-by-subject (threads) - "Gather threads by looking at Subject headers." - (if (not gnus-summary-make-false-root) - threads - (let ((hashtb (gnus-make-hashtable 1024)) - (prev threads) - (result threads) - subject hthread whole-subject) - (while threads - (setq subject (gnus-general-simplify-subject - (setq whole-subject (mail-header-subject - (caar threads))))) - (when subject - (if (setq hthread (gnus-gethash subject hashtb)) - (progn - ;; We enter a dummy root into the thread, if we - ;; haven't done that already. - (unless (stringp (caar hthread)) - (setcar hthread (list whole-subject (car hthread)))) - ;; We add this new gathered thread to this gathered - ;; thread. - (setcdr (car hthread) - (nconc (cdar hthread) (list (car threads)))) - ;; Remove it from the list of threads. - (setcdr prev (cdr threads)) - (setq threads prev)) - ;; Enter this thread into the hash table. - (gnus-sethash subject threads hashtb))) - (setq prev threads) - (setq threads (cdr threads))) - result))) - -(defun gnus-gather-threads-by-references (threads) - "Gather threads by looking at References headers." - (let ((idhashtb (gnus-make-hashtable 1024)) - (thhashtb (gnus-make-hashtable 1024)) - (prev threads) - (result threads) - ids references id gthread gid entered ref) - (while threads - (when (setq references (mail-header-references (caar threads))) - (setq id (mail-header-id (caar threads)) - ids (gnus-split-references references) - entered nil) - (while (setq ref (pop ids)) - (setq ids (delete ref ids)) - (if (not (setq gid (gnus-gethash ref idhashtb))) - (progn - (gnus-sethash ref id idhashtb) - (gnus-sethash id threads thhashtb)) - (setq gthread (gnus-gethash gid thhashtb)) - (unless entered - ;; We enter a dummy root into the thread, if we - ;; haven't done that already. - (unless (stringp (caar gthread)) - (setcar gthread (list (mail-header-subject (caar gthread)) - (car gthread)))) - ;; We add this new gathered thread to this gathered - ;; thread. - (setcdr (car gthread) - (nconc (cdar gthread) (list (car threads))))) - ;; Add it into the thread hash table. - (gnus-sethash id gthread thhashtb) - (setq entered t) - ;; Remove it from the list of threads. - (setcdr prev (cdr threads)) - (setq threads prev)))) - (setq prev threads) - (setq threads (cdr threads))) - result)) - -(defun gnus-sort-gathered-threads (threads) - "Sort subtreads inside each gathered thread by `gnus-sort-gathered-threads-function'." - (let ((result threads)) - (while threads - (when (stringp (caar threads)) - (setcdr (car threads) - (sort (cdar threads) gnus-sort-gathered-threads-function))) - (setq threads (cdr threads))) - result)) - -(defun gnus-thread-loop-p (root thread) - "Say whether ROOT is in THREAD." - (let ((stack (list thread)) - (infloop 0) - th) - (while (setq thread (pop stack)) - (setq th (cdr thread)) - (while (and th - (not (eq (caar th) root))) - (pop th)) - (if th - ;; We have found a loop. - (let (ref-dep) - (setcdr thread (delq (car th) (cdr thread))) - (if (boundp (setq ref-dep (intern "none" - gnus-newsgroup-dependencies))) - (setcdr (symbol-value ref-dep) - (nconc (cdr (symbol-value ref-dep)) - (list (car th)))) - (set ref-dep (list nil (car th)))) - (setq infloop 1 - stack nil)) - ;; Push all the subthreads onto the stack. - (push (cdr thread) stack))) - infloop)) - -(defun gnus-make-threads () - "Go through the dependency hashtb and find the roots. Return all threads." - (let (threads) - (while (catch 'infloop - (mapatoms - (lambda (refs) - ;; Deal with self-referencing References loops. - (when (and (car (symbol-value refs)) - (not (zerop - (apply - '+ - (mapcar - (lambda (thread) - (gnus-thread-loop-p - (car (symbol-value refs)) thread)) - (cdr (symbol-value refs))))))) - (setq threads nil) - (throw 'infloop t)) - (unless (car (symbol-value refs)) - ;; These threads do not refer back to any other articles, - ;; so they're roots. - (setq threads (append (cdr (symbol-value refs)) threads)))) - gnus-newsgroup-dependencies))) - threads)) - -;; Build the thread tree. -(defsubst gnus-dependencies-add-header (header dependencies force-new) - "Enter HEADER into the DEPENDENCIES table if it is not already there. - -If FORCE-NEW is not nil, enter HEADER into the DEPENDENCIES table even -if it was already present. - -If `gnus-summary-ignore-duplicates' is nil then duplicate Message-IDs -will not be entered in the DEPENDENCIES table. Otherwise duplicate -Message-IDs will be renamed be renamed to a unique Message-ID before -being entered. - -Returns HEADER if it was entered in the DEPENDENCIES. Returns nil otherwise." - (let* ((id (mail-header-id header)) - (id-dep (and id (intern id dependencies))) - ref ref-dep ref-header) - ;; Enter this `header' in the `dependencies' table. - (cond - ((not id-dep) - (setq header nil)) - ;; The first two cases do the normal part: enter a new `header' - ;; in the `dependencies' table. - ((not (boundp id-dep)) - (set id-dep (list header))) - ((null (car (symbol-value id-dep))) - (setcar (symbol-value id-dep) header)) - - ;; From here the `header' was already present in the - ;; `dependencies' table. - (force-new - ;; Overrides an existing entry; - ;; just set the header part of the entry. - (setcar (symbol-value id-dep) header)) - - ;; Renames the existing `header' to a unique Message-ID. - ((not gnus-summary-ignore-duplicates) - ;; An article with this Message-ID has already been seen. - ;; We rename the Message-ID. - (set (setq id-dep (intern (setq id (nnmail-message-id)) dependencies)) - (list header)) - (mail-header-set-id header id)) - - ;; The last case ignores an existing entry, except it adds any - ;; additional Xrefs (in case the two articles came from different - ;; servers. - ;; Also sets `header' to `nil' meaning that the `dependencies' - ;; table was *not* modified. - (t - (mail-header-set-xref - (car (symbol-value id-dep)) - (concat (or (mail-header-xref (car (symbol-value id-dep))) - "") - (or (mail-header-xref header) ""))) - (setq header nil))) - - (when header - ;; First check if that we are not creating a References loop. - (setq ref (gnus-parent-id (mail-header-references header))) - (while (and ref - (setq ref-dep (intern-soft ref dependencies)) - (boundp ref-dep) - (setq ref-header (car (symbol-value ref-dep)))) - (if (string= id ref) - ;; Yuk! This is a reference loop. Make the article be a - ;; root article. - (progn - (mail-header-set-references (car (symbol-value id-dep)) "none") - (setq ref nil)) - (setq ref (gnus-parent-id (mail-header-references ref-header))))) - (setq ref (gnus-parent-id (mail-header-references header))) - (setq ref-dep (intern (or ref "none") dependencies)) - (if (boundp ref-dep) - (setcdr (symbol-value ref-dep) - (nconc (cdr (symbol-value ref-dep)) - (list (symbol-value id-dep)))) - (set ref-dep (list nil (symbol-value id-dep))))) - header)) - -(defun gnus-build-sparse-threads () - (let ((headers gnus-newsgroup-headers) - (mail-parse-charset gnus-newsgroup-charset) - (gnus-summary-ignore-duplicates t) - header references generation relations - subject child end new-child date) - ;; First we create an alist of generations/relations, where - ;; generations is how much we trust the relation, and the relation - ;; is parent/child. - (gnus-message 7 "Making sparse threads...") - (save-excursion - (nnheader-set-temp-buffer " *gnus sparse threads*") - (while (setq header (pop headers)) - (when (and (setq references (mail-header-references header)) - (not (string= references ""))) - (insert references) - (setq child (mail-header-id header) - subject (mail-header-subject header) - date (mail-header-date header) - generation 0) - (while (search-backward ">" nil t) - (setq end (1+ (point))) - (when (search-backward "<" nil t) - (setq new-child (buffer-substring (point) end)) - (push (list (incf generation) - child (setq child new-child) - subject date) - relations))) - (when child - (push (list (1+ generation) child nil subject) relations)) - (erase-buffer))) - (kill-buffer (current-buffer))) - ;; Sort over trustworthiness. - (mapcar - (lambda (relation) - (when (gnus-dependencies-add-header - (make-full-mail-header-from-decoded-header - gnus-reffed-article-number - (nth 3 relation) "" (or (nth 4 relation) "") - (nth 1 relation) - (or (nth 2 relation) "") 0 0 "") - gnus-newsgroup-dependencies nil) - (push gnus-reffed-article-number gnus-newsgroup-limit) - (push gnus-reffed-article-number gnus-newsgroup-sparse) - (push (cons gnus-reffed-article-number gnus-sparse-mark) - gnus-newsgroup-reads) - (decf gnus-reffed-article-number))) - (sort relations 'car-less-than-car)) - (gnus-message 7 "Making sparse threads...done"))) - -(defun gnus-build-old-threads () - ;; Look at all the articles that refer back to old articles, and - ;; fetch the headers for the articles that aren't there. This will - ;; build complete threads - if the roots haven't been expired by the - ;; server, that is. - (let ((mail-parse-charset gnus-newsgroup-charset) - id heads) - (mapatoms - (lambda (refs) - (when (not (car (symbol-value refs))) - (setq heads (cdr (symbol-value refs))) - (while heads - (if (memq (mail-header-number (caar heads)) - gnus-newsgroup-dormant) - (setq heads (cdr heads)) - (setq id (symbol-name refs)) - (while (and (setq id (gnus-build-get-header id)) - (not (car (gnus-id-to-thread id))))) - (setq heads nil))))) - gnus-newsgroup-dependencies))) - -;; This function has to be called with point after the article number -;; on the beginning of the line. -(defsubst gnus-nov-parse-line (number dependencies &optional force-new) - (let ((eol (gnus-point-at-eol)) - (buffer (current-buffer)) - header) - - ;; overview: [num subject from date id refs chars lines misc] - (unwind-protect - (progn - (narrow-to-region (point) eol) - (unless (eobp) - (forward-char)) - - (setq header - (make-full-mail-header - number ; number - (nnheader-nov-field) ; subject - (nnheader-nov-field) ; from - (nnheader-nov-field) ; date - (nnheader-nov-read-message-id) ; id - (nnheader-nov-field) ; refs - (nnheader-nov-read-integer) ; chars - (nnheader-nov-read-integer) ; lines - (unless (eobp) - (if (looking-at "Xref: ") - (goto-char (match-end 0))) - (nnheader-nov-field)) ; Xref - (nnheader-nov-parse-extra)))) ; extra - - (widen)) - - (when gnus-alter-header-function - (funcall gnus-alter-header-function header)) - (gnus-dependencies-add-header header dependencies force-new))) - -(defun gnus-build-get-header (id) - "Look through the buffer of NOV lines and find the header to ID. -Enter this line into the dependencies hash table, and return -the id of the parent article (if any)." - (let ((deps gnus-newsgroup-dependencies) - found header) - (prog1 - (save-excursion - (set-buffer nntp-server-buffer) - (let ((case-fold-search nil)) - (goto-char (point-min)) - (while (and (not found) - (search-forward id nil t)) - (beginning-of-line) - (setq found (looking-at - (format "^[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t%s" - (regexp-quote id)))) - (or found (beginning-of-line 2))) - (when found - (beginning-of-line) - (and - (setq header (gnus-nov-parse-line - (read (current-buffer)) deps)) - (gnus-parent-id (mail-header-references header)))))) - (when header - (let ((number (mail-header-number header))) - (push number gnus-newsgroup-limit) - (push header gnus-newsgroup-headers) - (if (memq number gnus-newsgroup-unselected) - (progn - (push number gnus-newsgroup-unreads) - (setq gnus-newsgroup-unselected - (delq number gnus-newsgroup-unselected))) - (push number gnus-newsgroup-ancient))))))) - -(defun gnus-build-all-threads () - "Read all the headers." - (let ((gnus-summary-ignore-duplicates t) - (mail-parse-charset gnus-newsgroup-charset) - (dependencies gnus-newsgroup-dependencies) - header article) - (save-excursion - (set-buffer nntp-server-buffer) - (let ((case-fold-search nil)) - (goto-char (point-min)) - (while (not (eobp)) - (ignore-errors - (setq article (read (current-buffer)) - header (gnus-nov-parse-line article dependencies))) - (when header - (save-excursion - (set-buffer gnus-summary-buffer) - (push header gnus-newsgroup-headers) - (if (memq (setq article (mail-header-number header)) - gnus-newsgroup-unselected) - (progn - (push article gnus-newsgroup-unreads) - (setq gnus-newsgroup-unselected - (delq article gnus-newsgroup-unselected))) - (push article gnus-newsgroup-ancient))) - (forward-line 1))))))) - -(defun gnus-summary-update-article-line (article header) - "Update the line for ARTICLE using HEADERS." - (let* ((id (mail-header-id header)) - (thread (gnus-id-to-thread id))) - (unless thread - (error "Article in no thread")) - ;; Update the thread. - (setcar thread header) - (gnus-summary-goto-subject article) - (let* ((datal (gnus-data-find-list article)) - (data (car datal)) - (length (when (cdr datal) - (- (gnus-data-pos data) - (gnus-data-pos (cadr datal))))) - (buffer-read-only nil) - (level (gnus-summary-thread-level))) - (gnus-delete-line) - (gnus-summary-insert-line - header level nil (gnus-article-mark article) - (memq article gnus-newsgroup-replied) - (memq article gnus-newsgroup-expirable) - ;; Only insert the Subject string when it's different - ;; from the previous Subject string. - (if (and - gnus-show-threads - (gnus-subject-equal - (condition-case () - (mail-header-subject - (gnus-data-header - (cadr - (gnus-data-find-list - article - (gnus-data-list t))))) - ;; Error on the side of excessive subjects. - (error "")) - (mail-header-subject header))) - "" - (mail-header-subject header)) - nil (cdr (assq article gnus-newsgroup-scored)) - (memq article gnus-newsgroup-processable)) - (when length - (gnus-data-update-list - (cdr datal) (- length (- (gnus-data-pos data) (point)))))))) - -(defun gnus-summary-update-article (article &optional iheader) - "Update ARTICLE in the summary buffer." - (set-buffer gnus-summary-buffer) - (let* ((header (gnus-summary-article-header article)) - (id (mail-header-id header)) - (data (gnus-data-find article)) - (thread (gnus-id-to-thread id)) - (references (mail-header-references header)) - (parent - (gnus-id-to-thread - (or (gnus-parent-id - (when (and references - (not (equal "" references))) - references)) - "none"))) - (buffer-read-only nil) - (old (car thread))) - (when thread - (unless iheader - (setcar thread nil) - (when parent - (delq thread parent))) - (if (gnus-summary-insert-subject id header) - ;; Set the (possibly) new article number in the data structure. - (gnus-data-set-number data (gnus-id-to-article id)) - (setcar thread old) - nil)))) - -(defun gnus-rebuild-thread (id &optional line) - "Rebuild the thread containing ID. -If LINE, insert the rebuilt thread starting on line LINE." - (let ((buffer-read-only nil) - old-pos current thread data) - (if (not gnus-show-threads) - (setq thread (list (car (gnus-id-to-thread id)))) - ;; Get the thread this article is part of. - (setq thread (gnus-remove-thread id))) - (setq old-pos (gnus-point-at-bol)) - (setq current (save-excursion - (and (re-search-backward "[\r\n]" nil t) - (gnus-summary-article-number)))) - ;; If this is a gathered thread, we have to go some re-gathering. - (when (stringp (car thread)) - (let ((subject (car thread)) - roots thr) - (setq thread (cdr thread)) - (while thread - (unless (memq (setq thr (gnus-id-to-thread - (gnus-root-id - (mail-header-id (caar thread))))) - roots) - (push thr roots)) - (setq thread (cdr thread))) - ;; We now have all (unique) roots. - (if (= (length roots) 1) - ;; All the loose roots are now one solid root. - (setq thread (car roots)) - (setq thread (cons subject (gnus-sort-threads roots)))))) - (let (threads) - ;; We then insert this thread into the summary buffer. - (when line - (goto-char (point-min)) - (forward-line (1- line))) - (let (gnus-newsgroup-data gnus-newsgroup-threads) - (if gnus-show-threads - (gnus-summary-prepare-threads (gnus-cut-threads (list thread))) - (gnus-summary-prepare-unthreaded thread)) - (setq data (nreverse gnus-newsgroup-data)) - (setq threads gnus-newsgroup-threads)) - ;; We splice the new data into the data structure. - ;;!!! This is kinda bogus. We assume that in LINE is non-nil, - ;;!!! then we want to insert at the beginning of the buffer. - ;;!!! That happens to be true with Gnus now, but that may - ;;!!! change in the future. Perhaps. - (gnus-data-enter-list - (if line nil current) data (- (point) old-pos)) - (setq gnus-newsgroup-threads - (nconc threads gnus-newsgroup-threads)) - (gnus-data-compute-positions)))) - -(defun gnus-number-to-header (number) - "Return the header for article NUMBER." - (let ((headers gnus-newsgroup-headers)) - (while (and headers - (not (= number (mail-header-number (car headers))))) - (pop headers)) - (when headers - (car headers)))) - -(defun gnus-parent-headers (in-headers &optional generation) - "Return the headers of the GENERATIONeth parent of HEADERS." - (unless generation - (setq generation 1)) - (let ((parent t) - (headers in-headers) - references) - (while (and parent - (not (zerop generation)) - (setq references (mail-header-references headers))) - (setq headers (if (and references - (setq parent (gnus-parent-id references))) - (car (gnus-id-to-thread parent)) - nil)) - (decf generation)) - (and (not (eq headers in-headers)) - headers))) - -(defun gnus-id-to-thread (id) - "Return the (sub-)thread where ID appears." - (gnus-gethash id gnus-newsgroup-dependencies)) - -(defun gnus-id-to-article (id) - "Return the article number of ID." - (let ((thread (gnus-id-to-thread id))) - (when (and thread - (car thread)) - (mail-header-number (car thread))))) - -(defun gnus-id-to-header (id) - "Return the article headers of ID." - (car (gnus-id-to-thread id))) - -(defun gnus-article-displayed-root-p (article) - "Say whether ARTICLE is a root(ish) article." - (let ((level (gnus-summary-thread-level article)) - (refs (mail-header-references (gnus-summary-article-header article))) - particle) - (cond - ((null level) nil) - ((zerop level) t) - ((null refs) t) - ((null (gnus-parent-id refs)) t) - ((and (= 1 level) - (null (setq particle (gnus-id-to-article - (gnus-parent-id refs)))) - (null (gnus-summary-thread-level particle))))))) - -(defun gnus-root-id (id) - "Return the id of the root of the thread where ID appears." - (let (last-id prev) - (while (and id (setq prev (car (gnus-id-to-thread id)))) - (setq last-id id - id (gnus-parent-id (mail-header-references prev)))) - last-id)) - -(defun gnus-articles-in-thread (thread) - "Return the list of articles in THREAD." - (cons (mail-header-number (car thread)) - (apply 'nconc (mapcar 'gnus-articles-in-thread (cdr thread))))) - -(defun gnus-remove-thread (id &optional dont-remove) - "Remove the thread that has ID in it." - (let (headers thread last-id) - ;; First go up in this thread until we find the root. - (setq last-id (gnus-root-id id) - headers (message-flatten-list (gnus-id-to-thread last-id))) - ;; We have now found the real root of this thread. It might have - ;; been gathered into some loose thread, so we have to search - ;; through the threads to find the thread we wanted. - (let ((threads gnus-newsgroup-threads) - sub) - (while threads - (setq sub (car threads)) - (if (stringp (car sub)) - ;; This is a gathered thread, so we look at the roots - ;; below it to find whether this article is in this - ;; gathered root. - (progn - (setq sub (cdr sub)) - (while sub - (when (member (caar sub) headers) - (setq thread (car threads) - threads nil - sub nil)) - (setq sub (cdr sub)))) - ;; It's an ordinary thread, so we check it. - (when (eq (car sub) (car headers)) - (setq thread sub - threads nil))) - (setq threads (cdr threads))) - ;; If this article is in no thread, then it's a root. - (if thread - (unless dont-remove - (setq gnus-newsgroup-threads (delq thread gnus-newsgroup-threads))) - (setq thread (gnus-id-to-thread last-id))) - (when thread - (prog1 - thread ; We return this thread. - (unless dont-remove - (if (stringp (car thread)) - (progn - ;; If we use dummy roots, then we have to remove the - ;; dummy root as well. - (when (eq gnus-summary-make-false-root 'dummy) - ;; We go to the dummy root by going to - ;; the first sub-"thread", and then one line up. - (gnus-summary-goto-article - (mail-header-number (caadr thread))) - (forward-line -1) - (gnus-delete-line) - (gnus-data-compute-positions)) - (setq thread (cdr thread)) - (while thread - (gnus-remove-thread-1 (car thread)) - (setq thread (cdr thread)))) - (gnus-remove-thread-1 thread)))))))) - -(defun gnus-remove-thread-1 (thread) - "Remove the thread THREAD recursively." - (let ((number (mail-header-number (pop thread))) - d) - (setq thread (reverse thread)) - (while thread - (gnus-remove-thread-1 (pop thread))) - (when (setq d (gnus-data-find number)) - (goto-char (gnus-data-pos d)) - (gnus-summary-show-thread) - (gnus-data-remove - number - (- (gnus-point-at-bol) - (prog1 - (1+ (gnus-point-at-eol)) - (gnus-delete-line))))))) - -(defun gnus-sort-threads-1 (threads func) - (sort (mapcar (lambda (thread) - (cons (car thread) - (and (cdr thread) - (gnus-sort-threads-1 (cdr thread) func)))) - threads) func)) - -(defun gnus-sort-threads (threads) - "Sort THREADS." - (if (not gnus-thread-sort-functions) - threads - (gnus-message 8 "Sorting threads...") - (prog1 - (gnus-sort-threads-1 - threads - (gnus-make-sort-function gnus-thread-sort-functions)) - (gnus-message 8 "Sorting threads...done")))) - -(defun gnus-sort-articles (articles) - "Sort ARTICLES." - (when gnus-article-sort-functions - (gnus-message 7 "Sorting articles...") - (prog1 - (setq gnus-newsgroup-headers - (sort articles (gnus-make-sort-function - gnus-article-sort-functions))) - (gnus-message 7 "Sorting articles...done")))) - -;; Written by Hallvard B Furuseth . -(defmacro gnus-thread-header (thread) - "Return header of first article in THREAD. -Note that THREAD must never, ever be anything else than a variable - -using some other form will lead to serious barfage." - (or (symbolp thread) (signal 'wrong-type-argument '(symbolp thread))) - ;; (8% speedup to gnus-summary-prepare, just for fun :-) - (list 'byte-code "\10\211:\203\17\0\211@;\203\16\0A@@\207" - (vector thread) 2)) - -(defsubst gnus-article-sort-by-number (h1 h2) - "Sort articles by article number." - (< (mail-header-number h1) - (mail-header-number h2))) - -(defun gnus-thread-sort-by-number (h1 h2) - "Sort threads by root article number." - (gnus-article-sort-by-number - (gnus-thread-header h1) (gnus-thread-header h2))) - -(defsubst gnus-article-sort-by-lines (h1 h2) - "Sort articles by article Lines header." - (< (mail-header-lines h1) - (mail-header-lines h2))) - -(defun gnus-thread-sort-by-lines (h1 h2) - "Sort threads by root article Lines header." - (gnus-article-sort-by-lines - (gnus-thread-header h1) (gnus-thread-header h2))) - -(defsubst gnus-article-sort-by-chars (h1 h2) - "Sort articles by octet length." - (< (mail-header-chars h1) - (mail-header-chars h2))) - -(defun gnus-thread-sort-by-chars (h1 h2) - "Sort threads by root article octet length." - (gnus-article-sort-by-chars - (gnus-thread-header h1) (gnus-thread-header h2))) - -(defsubst gnus-article-sort-by-author (h1 h2) - "Sort articles by root author." - (string-lessp - (let ((addr (car (mime-entity-read-field h1 'From)))) - (or (std11-full-name-string addr) - (std11-address-string addr) - "")) - (let ((addr (car (mime-entity-read-field h2 'From)))) - (or (std11-full-name-string addr) - (std11-address-string addr) - "")) - )) - -(defun gnus-thread-sort-by-author (h1 h2) - "Sort threads by root author." - (gnus-article-sort-by-author - (gnus-thread-header h1) (gnus-thread-header h2))) - -(defsubst gnus-article-sort-by-subject (h1 h2) - "Sort articles by root subject." - (string-lessp - (downcase (gnus-simplify-subject-re (mail-header-subject h1))) - (downcase (gnus-simplify-subject-re (mail-header-subject h2))))) - -(defun gnus-thread-sort-by-subject (h1 h2) - "Sort threads by root subject." - (gnus-article-sort-by-subject - (gnus-thread-header h1) (gnus-thread-header h2))) - -(defsubst gnus-article-sort-by-date (h1 h2) - "Sort articles by root article date." - (time-less-p - (gnus-date-get-time (mail-header-date h1)) - (gnus-date-get-time (mail-header-date h2)))) - -(defun gnus-thread-sort-by-date (h1 h2) - "Sort threads by root article date." - (gnus-article-sort-by-date - (gnus-thread-header h1) (gnus-thread-header h2))) - -(defsubst gnus-article-sort-by-score (h1 h2) - "Sort articles by root article score. -Unscored articles will be counted as having a score of zero." - (> (or (cdr (assq (mail-header-number h1) - gnus-newsgroup-scored)) - gnus-summary-default-score 0) - (or (cdr (assq (mail-header-number h2) - gnus-newsgroup-scored)) - gnus-summary-default-score 0))) - -(defun gnus-thread-sort-by-score (h1 h2) - "Sort threads by root article score." - (gnus-article-sort-by-score - (gnus-thread-header h1) (gnus-thread-header h2))) - -(defun gnus-thread-sort-by-total-score (h1 h2) - "Sort threads by the sum of all scores in the thread. -Unscored articles will be counted as having a score of zero." - (> (gnus-thread-total-score h1) (gnus-thread-total-score h2))) - -(defun gnus-thread-total-score (thread) - ;; This function find the total score of THREAD. - (cond ((null thread) - 0) - ((consp thread) - (if (stringp (car thread)) - (apply gnus-thread-score-function 0 - (mapcar 'gnus-thread-total-score-1 (cdr thread))) - (gnus-thread-total-score-1 thread))) - (t - (gnus-thread-total-score-1 (list thread))))) - -(defun gnus-thread-total-score-1 (root) - ;; This function find the total score of the thread below ROOT. - (setq root (car root)) - (apply gnus-thread-score-function - (or (append - (mapcar 'gnus-thread-total-score - (cdr (gnus-id-to-thread (mail-header-id root)))) - (when (> (mail-header-number root) 0) - (list (or (cdr (assq (mail-header-number root) - gnus-newsgroup-scored)) - gnus-summary-default-score 0)))) - (list gnus-summary-default-score) - '(0)))) - -;; Added by Per Abrahamsen . -(defvar gnus-tmp-prev-subject nil) -(defvar gnus-tmp-false-parent nil) -(defvar gnus-tmp-root-expunged nil) -(defvar gnus-tmp-dummy-line nil) - -(eval-when-compile (defvar gnus-tmp-header)) -(defun gnus-extra-header (type &optional header) - "Return the extra header of TYPE." - (or (cdr (assq type (mail-header-extra (or header gnus-tmp-header)))) - "")) - -(defvar gnus-tmp-thread-tree-header-string "") - -(defvar gnus-sum-thread-tree-root "> " - "With %B spec, used for the root of a thread. -If nil, use subject instead.") -(defvar gnus-sum-thread-tree-single-indent "" - "With %B spec, used for a thread with just one message. -If nil, use subject instead.") -(defvar gnus-sum-thread-tree-vertical "| " - "With %B spec, used for drawing a vertical line.") -(defvar gnus-sum-thread-tree-indent " " - "With %B spec, used for indenting.") -(defvar gnus-sum-thread-tree-leaf-with-other "+-> " - "With %B spec, used for a leaf with brothers.") -(defvar gnus-sum-thread-tree-single-leaf "\\-> " - "With %B spec, used for a leaf without brothers.") - -(defun gnus-summary-prepare-threads (threads) - "Prepare summary buffer from THREADS and indentation LEVEL. -THREADS is either a list of `(PARENT [(CHILD1 [(GRANDCHILD ...]...) ...])' -or a straight list of headers." - (gnus-message 7 "Generating summary...") - - (setq gnus-newsgroup-threads threads) - (beginning-of-line) - - (let ((gnus-tmp-level 0) - (default-score (or gnus-summary-default-score 0)) - (gnus-visual-p (gnus-visual-p 'summary-highlight 'highlight)) - thread number subject stack state gnus-tmp-gathered beg-match - new-roots gnus-tmp-new-adopts thread-end - gnus-tmp-header gnus-tmp-unread - gnus-tmp-replied gnus-tmp-subject-or-nil - gnus-tmp-dummy gnus-tmp-indentation gnus-tmp-lines gnus-tmp-score - gnus-tmp-score-char gnus-tmp-from gnus-tmp-name - gnus-tmp-number gnus-tmp-opening-bracket gnus-tmp-closing-bracket - tree-stack) - - (setq gnus-tmp-prev-subject nil) - - (if (vectorp (car threads)) - ;; If this is a straight (sic) list of headers, then a - ;; threaded summary display isn't required, so we just create - ;; an unthreaded one. - (gnus-summary-prepare-unthreaded threads) - - ;; Do the threaded display. - - (while (or threads stack gnus-tmp-new-adopts new-roots) - - (if (and (= gnus-tmp-level 0) - (or (not stack) - (= (caar stack) 0)) - (not gnus-tmp-false-parent) - (or gnus-tmp-new-adopts new-roots)) - (if gnus-tmp-new-adopts - (setq gnus-tmp-level (if gnus-tmp-root-expunged 0 1) - thread (list (car gnus-tmp-new-adopts)) - gnus-tmp-header (caar thread) - gnus-tmp-new-adopts (cdr gnus-tmp-new-adopts)) - (when new-roots - (setq thread (list (car new-roots)) - gnus-tmp-header (caar thread) - new-roots (cdr new-roots)))) - - (if threads - ;; If there are some threads, we do them before the - ;; threads on the stack. - (setq thread threads - gnus-tmp-header (caar thread)) - ;; There were no current threads, so we pop something off - ;; the stack. - (setq state (car stack) - gnus-tmp-level (car state) - tree-stack (cadr state) - thread (caddr state) - stack (cdr stack) - gnus-tmp-header (caar thread)))) - - (setq gnus-tmp-false-parent nil) - (setq gnus-tmp-root-expunged nil) - (setq thread-end nil) - - (if (stringp gnus-tmp-header) - ;; The header is a dummy root. - (cond - ((eq gnus-summary-make-false-root 'adopt) - ;; We let the first article adopt the rest. - (setq gnus-tmp-new-adopts (nconc gnus-tmp-new-adopts - (cddar thread))) - (setq gnus-tmp-gathered - (nconc (mapcar - (lambda (h) (mail-header-number (car h))) - (cddar thread)) - gnus-tmp-gathered)) - (setq thread (cons (list (caar thread) - (cadar thread)) - (cdr thread))) - (setq gnus-tmp-level -1 - gnus-tmp-false-parent t)) - ((eq gnus-summary-make-false-root 'empty) - ;; We print adopted articles with empty subject fields. - (setq gnus-tmp-gathered - (nconc (mapcar - (lambda (h) (mail-header-number (car h))) - (cddar thread)) - gnus-tmp-gathered)) - (setq gnus-tmp-level -1)) - ((eq gnus-summary-make-false-root 'dummy) - ;; We remember that we probably want to output a dummy - ;; root. - (setq gnus-tmp-dummy-line gnus-tmp-header) - (setq gnus-tmp-prev-subject gnus-tmp-header)) - (t - ;; We do not make a root for the gathered - ;; sub-threads at all. - (setq gnus-tmp-level -1))) - - (setq number (mail-header-number gnus-tmp-header) - subject (mail-header-subject gnus-tmp-header)) - - (cond - ;; If the thread has changed subject, we might want to make - ;; this subthread into a root. - ((and (null gnus-thread-ignore-subject) - (not (zerop gnus-tmp-level)) - gnus-tmp-prev-subject - (not (inline - (gnus-subject-equal gnus-tmp-prev-subject subject)))) - (setq new-roots (nconc new-roots (list (car thread))) - thread-end t - gnus-tmp-header nil)) - ;; If the article lies outside the current limit, - ;; then we do not display it. - ((not (memq number gnus-newsgroup-limit)) - (setq gnus-tmp-gathered - (nconc (mapcar - (lambda (h) (mail-header-number (car h))) - (cdar thread)) - gnus-tmp-gathered)) - (setq gnus-tmp-new-adopts (if (cdar thread) - (append gnus-tmp-new-adopts - (cdar thread)) - gnus-tmp-new-adopts) - thread-end t - gnus-tmp-header nil) - (when (zerop gnus-tmp-level) - (setq gnus-tmp-root-expunged t))) - ;; Perhaps this article is to be marked as read? - ((and gnus-summary-mark-below - (< (or (cdr (assq number gnus-newsgroup-scored)) - default-score) - gnus-summary-mark-below) - ;; Don't touch sparse articles. - (not (gnus-summary-article-sparse-p number)) - (not (gnus-summary-article-ancient-p number))) - (setq gnus-newsgroup-unreads - (delq number gnus-newsgroup-unreads)) - (if gnus-newsgroup-auto-expire - (push number gnus-newsgroup-expirable) - (push (cons number gnus-low-score-mark) - gnus-newsgroup-reads)))) - - (when gnus-tmp-header - ;; We may have an old dummy line to output before this - ;; article. - (when (and gnus-tmp-dummy-line - (gnus-subject-equal - gnus-tmp-dummy-line - (mail-header-subject gnus-tmp-header))) - (gnus-summary-insert-dummy-line - gnus-tmp-dummy-line (mail-header-number gnus-tmp-header)) - (setq gnus-tmp-dummy-line nil)) - - ;; Compute the mark. - (setq gnus-tmp-unread (gnus-article-mark number)) - - (push (gnus-data-make number gnus-tmp-unread (1+ (point)) - gnus-tmp-header gnus-tmp-level) - gnus-newsgroup-data) - - ;; Actually insert the line. - (setq - gnus-tmp-subject-or-nil - (cond - ((and gnus-thread-ignore-subject - gnus-tmp-prev-subject - (not (inline (gnus-subject-equal - gnus-tmp-prev-subject subject)))) - subject) - ((zerop gnus-tmp-level) - (if (and (eq gnus-summary-make-false-root 'empty) - (memq number gnus-tmp-gathered) - gnus-tmp-prev-subject - (inline (gnus-subject-equal - gnus-tmp-prev-subject subject))) - gnus-summary-same-subject - subject)) - (t gnus-summary-same-subject))) - (if (and (eq gnus-summary-make-false-root 'adopt) - (= gnus-tmp-level 1) - (memq number gnus-tmp-gathered)) - (setq gnus-tmp-opening-bracket ?\< - gnus-tmp-closing-bracket ?\>) - (setq gnus-tmp-opening-bracket ?\[ - gnus-tmp-closing-bracket ?\])) - (setq - gnus-tmp-indentation - (aref gnus-thread-indent-array gnus-tmp-level) - gnus-tmp-lines (mail-header-lines gnus-tmp-header) - gnus-tmp-score (or (cdr (assq number gnus-newsgroup-scored)) - gnus-summary-default-score 0) - gnus-tmp-score-char - (if (or (null gnus-summary-default-score) - (<= (abs (- gnus-tmp-score gnus-summary-default-score)) - gnus-summary-zcore-fuzz)) - ?\ ;;;Whitespace - (if (< gnus-tmp-score gnus-summary-default-score) - gnus-score-below-mark gnus-score-over-mark)) - gnus-tmp-replied - (cond ((memq number gnus-newsgroup-processable) - gnus-process-mark) - ((memq number gnus-newsgroup-cached) - gnus-cached-mark) - ((memq number gnus-newsgroup-replied) - gnus-replied-mark) - ((memq number gnus-newsgroup-forwarded) - gnus-forwarded-mark) - ((memq number gnus-newsgroup-saved) - gnus-saved-mark) - ((memq number gnus-newsgroup-recent) - gnus-recent-mark) - ((memq number gnus-newsgroup-unseen) - gnus-unseen-mark) - (t gnus-no-mark)) - gnus-tmp-from (mail-header-from gnus-tmp-header) - gnus-tmp-name - (cond - ((string-match "<[^>]+> *$" gnus-tmp-from) - (setq beg-match (match-beginning 0)) - (or (and (string-match "^\".+\"" gnus-tmp-from) - (substring gnus-tmp-from 1 (1- (match-end 0)))) - (substring gnus-tmp-from 0 beg-match))) - ((string-match "(.+)" gnus-tmp-from) - (substring gnus-tmp-from - (1+ (match-beginning 0)) (1- (match-end 0)))) - (t gnus-tmp-from)) - gnus-tmp-thread-tree-header-string - (cond - ((not gnus-show-threads) "") - ((zerop gnus-tmp-level) - (if (cdar thread) - (or gnus-sum-thread-tree-root subject) - (or gnus-sum-thread-tree-single-indent subject))) - (t - (concat (apply 'concat - (mapcar (lambda (item) - (if (= item 1) - gnus-sum-thread-tree-vertical - gnus-sum-thread-tree-indent)) - (cdr (reverse tree-stack)))) - (if (nth 1 thread) - gnus-sum-thread-tree-leaf-with-other - gnus-sum-thread-tree-single-leaf))))) - (when (string= gnus-tmp-name "") - (setq gnus-tmp-name gnus-tmp-from)) - (unless (numberp gnus-tmp-lines) - (setq gnus-tmp-lines -1)) - (if (= gnus-tmp-lines -1) - (setq gnus-tmp-lines "?") - (setq gnus-tmp-lines (number-to-string gnus-tmp-lines))) - (gnus-put-text-property - (point) - (progn (eval gnus-summary-line-format-spec) (point)) - 'gnus-number number) - (when gnus-visual-p - (forward-line -1) - (gnus-run-hooks 'gnus-summary-update-hook) - (forward-line 1)) - - (setq gnus-tmp-prev-subject subject))) - - (when (nth 1 thread) - (push (list (max 0 gnus-tmp-level) - (copy-list tree-stack) - (nthcdr 1 thread)) - stack)) - (push (if (nth 1 thread) 1 0) tree-stack) - (incf gnus-tmp-level) - (setq threads (if thread-end nil (cdar thread))) - (unless threads - (setq gnus-tmp-level 0))))) - (gnus-message 7 "Generating summary...done")) - -(defun gnus-summary-prepare-unthreaded (headers) - "Generate an unthreaded summary buffer based on HEADERS." - (let (header number mark) - - (beginning-of-line) - - (while headers - ;; We may have to root out some bad articles... - (when (memq (setq number (mail-header-number - (setq header (pop headers)))) - gnus-newsgroup-limit) - ;; Mark article as read when it has a low score. - (when (and gnus-summary-mark-below - (< (or (cdr (assq number gnus-newsgroup-scored)) - gnus-summary-default-score 0) - gnus-summary-mark-below) - (not (gnus-summary-article-ancient-p number))) - (setq gnus-newsgroup-unreads - (delq number gnus-newsgroup-unreads)) - (if gnus-newsgroup-auto-expire - (push number gnus-newsgroup-expirable) - (push (cons number gnus-low-score-mark) - gnus-newsgroup-reads))) - - (setq mark (gnus-article-mark number)) - (push (gnus-data-make number mark (1+ (point)) header 0) - gnus-newsgroup-data) - (gnus-summary-insert-line - header 0 number - mark (memq number gnus-newsgroup-replied) - (memq number gnus-newsgroup-expirable) - (mail-header-subject header) nil - (cdr (assq number gnus-newsgroup-scored)) - (memq number gnus-newsgroup-processable)))))) - -(defun gnus-summary-remove-list-identifiers () - "Remove list identifiers in `gnus-list-identifiers' from articles in the current group." - (let ((regexp (if (consp gnus-list-identifiers) - (mapconcat 'identity gnus-list-identifiers " *\\|") - gnus-list-identifiers)) - changed subject) - (when regexp - (dolist (header gnus-newsgroup-headers) - (setq subject (mail-header-subject header) - changed nil) - (while (string-match - (concat "^\\(R[Ee]: +\\)*\\(" regexp " *\\)") - subject) - (setq subject - (concat (substring subject 0 (match-beginning 2)) - (substring subject (match-end 0))) - changed t)) - (when (and changed - (string-match - "^\\(\\(R[Ee]: +\\)+\\)R[Ee]: +" subject)) - (setq subject - (concat (substring subject 0 (match-beginning 1)) - (substring subject (match-end 1))))) - (when changed - (mail-header-set-subject header subject)))))) - -(defun gnus-fetch-headers (articles) - "Fetch headers of ARTICLES." - (let ((name (gnus-group-decoded-name gnus-newsgroup-name))) - (gnus-message 5 "Fetching headers for %s..." name) - (prog1 - (if (eq 'nov - (setq gnus-headers-retrieved-by - (gnus-retrieve-headers - articles gnus-newsgroup-name - ;; We might want to fetch old headers, but - ;; not if there is only 1 article. - (and (or (and - (not (eq gnus-fetch-old-headers 'some)) - (not (numberp gnus-fetch-old-headers))) - (> (length articles) 1)) - gnus-fetch-old-headers)))) - (gnus-get-newsgroup-headers-xover - articles nil nil gnus-newsgroup-name t) - (gnus-get-newsgroup-headers)) - (gnus-message 5 "Fetching headers for %s...done" name)))) - -(defun gnus-select-newsgroup (group &optional read-all select-articles) - "Select newsgroup GROUP. -If READ-ALL is non-nil, all articles in the group are selected. -If SELECT-ARTICLES, only select those articles from GROUP." - (let* ((entry (gnus-gethash group gnus-newsrc-hashtb)) - ;;!!! Dirty hack; should be removed. - (gnus-summary-ignore-duplicates - (if (eq (car (gnus-find-method-for-group group)) 'nnvirtual) - t - gnus-summary-ignore-duplicates)) - (info (nth 2 entry)) - articles fetched-articles cached) - - (unless (gnus-check-server - (setq gnus-current-select-method - (gnus-find-method-for-group group))) - (error "Couldn't open server")) - - (or (and entry (not (eq (car entry) t))) ; Either it's active... - (gnus-activate-group group) ; Or we can activate it... - (progn ; Or we bug out. - (when (equal major-mode 'gnus-summary-mode) - (kill-buffer (current-buffer))) - (error "Couldn't activate group %s: %s" - group (gnus-status-message group)))) - - (unless (gnus-request-group group t) - (when (equal major-mode 'gnus-summary-mode) - (kill-buffer (current-buffer))) - (error "Couldn't request group %s: %s" - group (gnus-status-message group))) - - (setq gnus-newsgroup-name group - gnus-newsgroup-unselected nil - gnus-newsgroup-unreads (gnus-list-of-unread-articles group)) - - (let ((display (gnus-group-find-parameter group 'display))) - (setq gnus-newsgroup-display - (cond - ((eq display 'all) - 'gnus-not-ignore) - ((arrayp display) - (gnus-summary-display-make-predicate (mapcar 'identity display))) - (t - nil)))) - - (gnus-summary-setup-default-charset) - - ;; Kludge to avoid having cached articles nixed out in virtual groups. - (when (gnus-virtual-group-p group) - (setq cached gnus-newsgroup-cached)) - - (setq gnus-newsgroup-unreads - (gnus-set-difference - (gnus-set-difference gnus-newsgroup-unreads gnus-newsgroup-marked) - gnus-newsgroup-dormant)) - - (setq gnus-newsgroup-processable nil) - - (gnus-update-read-articles group gnus-newsgroup-unreads) - - ;; Adjust and set lists of article marks. - (when info - (gnus-adjust-marked-articles info)) - - (if (setq articles select-articles) - (setq gnus-newsgroup-unselected - (gnus-sorted-intersection - gnus-newsgroup-unreads - (gnus-sorted-complement gnus-newsgroup-unreads articles))) - (setq articles (gnus-articles-to-read group read-all))) - - (cond - ((null articles) - ;;(gnus-message 3 "Couldn't select newsgroup -- no articles to display") - 'quit) - ((eq articles 0) nil) - (t - ;; Init the dependencies hash table. - (setq gnus-newsgroup-dependencies - (gnus-make-hashtable (length articles))) - (gnus-set-global-variables) - ;; Retrieve the headers and read them in. - (setq gnus-newsgroup-headers (gnus-fetch-headers articles)) - - ;; Kludge to avoid having cached articles nixed out in virtual groups. - (when cached - (setq gnus-newsgroup-cached cached)) - - ;; Suppress duplicates? - (when gnus-suppress-duplicates - (gnus-dup-suppress-articles)) - - ;; Set the initial limit. - (setq gnus-newsgroup-limit (copy-sequence articles)) - ;; Remove canceled articles from the list of unread articles. - (setq fetched-articles - (mapcar (lambda (headers) (mail-header-number headers)) - gnus-newsgroup-headers)) - (setq gnus-newsgroup-articles fetched-articles) - (setq gnus-newsgroup-unreads - (gnus-set-sorted-intersection - gnus-newsgroup-unreads fetched-articles)) - - (let ((marks (assq 'seen (gnus-info-marks info)))) - ;; The `seen' marks are treated specially. - (when (setq gnus-newsgroup-seen (cdr marks)) - (dolist (article gnus-newsgroup-articles) - (unless (gnus-member-of-range - article gnus-newsgroup-seen) - (push article gnus-newsgroup-unseen))))) - - ;; Removed marked articles that do not exist. - (gnus-update-missing-marks - (gnus-sorted-complement fetched-articles articles)) - ;; We might want to build some more threads first. - (when (and gnus-fetch-old-headers - (eq gnus-headers-retrieved-by 'nov)) - (if (eq gnus-fetch-old-headers 'invisible) - (gnus-build-all-threads) - (gnus-build-old-threads))) - ;; Let the Gnus agent mark articles as read. - (when gnus-agent - (gnus-agent-get-undownloaded-list)) - ;; Remove list identifiers from subject - (when gnus-list-identifiers - (gnus-summary-remove-list-identifiers)) - ;; Check whether auto-expire is to be done in this group. - (setq gnus-newsgroup-auto-expire - (gnus-group-auto-expirable-p group)) - ;; Set up the article buffer now, if necessary. - (unless gnus-single-article-buffer - (gnus-article-setup-buffer)) - ;; First and last article in this newsgroup. - (when gnus-newsgroup-headers - (setq gnus-newsgroup-begin - (mail-header-number (car gnus-newsgroup-headers)) - gnus-newsgroup-end - (mail-header-number - (gnus-last-element gnus-newsgroup-headers)))) - ;; GROUP is successfully selected. - (or gnus-newsgroup-headers t))))) - -(defun gnus-summary-display-make-predicate (display) - (require 'gnus-agent) - (when (= (length display) 1) - (setq display (car display))) - (unless gnus-summary-display-cache - (dolist (elem (append (list (cons 'read 'read) - (cons 'unseen 'unseen)) - gnus-article-mark-lists)) - (push (cons (cdr elem) - (gnus-byte-compile - `(lambda () (gnus-article-marked-p ',(cdr elem))))) - gnus-summary-display-cache))) - (let ((gnus-category-predicate-alist gnus-summary-display-cache)) - (gnus-get-predicate display))) - -;; Uses the dynamically bound `number' variable. -(defvar number) -(defun gnus-article-marked-p (type &optional article) - (let ((article (or article number))) - (cond - ((eq type 'tick) - (memq article gnus-newsgroup-marked)) - ((eq type 'unsend) - (memq article gnus-newsgroup-unsendable)) - ((eq type 'undownload) - (memq article gnus-newsgroup-undownloaded)) - ((eq type 'download) - (memq article gnus-newsgroup-downloadable)) - ((eq type 'unread) - (memq article gnus-newsgroup-unreads)) - ((eq type 'read) - (memq article gnus-newsgroup-reads)) - ((eq type 'dormant) - (memq article gnus-newsgroup-dormant) ) - ((eq type 'expire) - (memq article gnus-newsgroup-expirable)) - ((eq type 'reply) - (memq article gnus-newsgroup-replied)) - ((eq type 'killed) - (memq article gnus-newsgroup-killed)) - ((eq type 'bookmark) - (assq article gnus-newsgroup-bookmarks)) - ((eq type 'score) - (assq article gnus-newsgroup-scored)) - ((eq type 'save) - (memq article gnus-newsgroup-saved)) - ((eq type 'cache) - (memq article gnus-newsgroup-cached)) - ((eq type 'forward) - (memq article gnus-newsgroup-forwarded)) - ((eq type 'seen) - (not (memq article gnus-newsgroup-unseen))) - ((eq type 'recent) - (memq article gnus-newsgroup-recent)) - (t t)))) - -(defun gnus-articles-to-read (group &optional read-all) - "Find out what articles the user wants to read." - (let* ((articles - ;; Select all articles if `read-all' is non-nil, or if there - ;; are no unread articles. - (if (or read-all - (and (zerop (length gnus-newsgroup-marked)) - (zerop (length gnus-newsgroup-unreads))) - (eq gnus-newsgroup-display 'gnus-not-ignore)) - ;; We want to select the headers for all the articles in - ;; the group, so we select either all the active - ;; articles in the group, or (if that's nil), the - ;; articles in the cache. - (or - (gnus-uncompress-range (gnus-active group)) - (gnus-cache-articles-in-group group)) - ;; Select only the "normal" subset of articles. - (sort (append gnus-newsgroup-dormant gnus-newsgroup-marked - (copy-sequence gnus-newsgroup-unreads)) - '<))) - (scored-list (gnus-killed-articles gnus-newsgroup-killed articles)) - (scored (length scored-list)) - (number (length articles)) - (marked (+ (length gnus-newsgroup-marked) - (length gnus-newsgroup-dormant))) - (select - (cond - ((numberp read-all) - read-all) - (t - (condition-case () - (cond - ((and (or (<= scored marked) (= scored number)) - (natnump gnus-large-newsgroup) - (> number gnus-large-newsgroup)) - (let* ((cursor-in-echo-area nil) - (input - (read-from-minibuffer - (format - "How many articles from %s (max %d): " - (gnus-limit-string - (gnus-group-decoded-name gnus-newsgroup-name) - 35) - number) - (cons (number-to-string gnus-large-newsgroup) - 0)))) - (if (string-match "^[ \t]*$" input) - number - input))) - ((and (> scored marked) (< scored number) - (> (- scored number) 20)) - (let ((input - (read-string - (format "%s %s (%d scored, %d total): " - "How many articles from" - (gnus-group-decoded-name group) - scored number)))) - (if (string-match "^[ \t]*$" input) - number input))) - (t number)) - (quit - (message "Quit getting the articles to read") - nil)))))) - (setq select (if (stringp select) (string-to-number select) select)) - (if (or (null select) (zerop select)) - select - (if (and (not (zerop scored)) (<= (abs select) scored)) - (progn - (setq articles (sort scored-list '<)) - (setq number (length articles))) - (setq articles (copy-sequence articles))) - - (when (< (abs select) number) - (if (< select 0) - ;; Select the N oldest articles. - (setcdr (nthcdr (1- (abs select)) articles) nil) - ;; Select the N most recent articles. - (setq articles (nthcdr (- number select) articles)))) - (setq gnus-newsgroup-unselected - (gnus-sorted-intersection - gnus-newsgroup-unreads - (gnus-sorted-complement gnus-newsgroup-unreads articles))) - (when gnus-alter-articles-to-read-function - (setq gnus-newsgroup-unreads - (sort - (funcall gnus-alter-articles-to-read-function - gnus-newsgroup-name gnus-newsgroup-unreads) - '<))) - articles))) - -(defun gnus-killed-articles (killed articles) - (let (out) - (while articles - (when (inline (gnus-member-of-range (car articles) killed)) - (push (car articles) out)) - (setq articles (cdr articles))) - out)) - -(defun gnus-uncompress-marks (marks) - "Uncompress the mark ranges in MARKS." - (let ((uncompressed '(score bookmark)) - out) - (while marks - (if (memq (caar marks) uncompressed) - (push (car marks) out) - (push (cons (caar marks) (gnus-uncompress-range (cdar marks))) out)) - (setq marks (cdr marks))) - out)) - -(defun gnus-article-mark-to-type (mark) - "Return the type of MARK." - (or (cadr (assq mark gnus-article-special-mark-lists)) - 'list)) - -(defun gnus-adjust-marked-articles (info) - "Set all article lists and remove all marks that are no longer valid." - (let* ((marked-lists (gnus-info-marks info)) - (active (gnus-active (gnus-info-group info))) - (min (car active)) - (max (cdr active)) - (types gnus-article-mark-lists) - marks var articles article mark mark-type) - - (dolist (marks marked-lists) - (setq mark (car marks) - mark-type (gnus-article-mark-to-type mark) - var (intern (format "gnus-newsgroup-%s" (car (rassq mark types))))) - - ;; We set the variable according to the type of the marks list, - ;; and then adjust the marks to a subset of the active articles. - (cond - ;; Adjust "simple" lists. - ((eq mark-type 'list) - (set var (setq articles (gnus-uncompress-range (cdr marks)))) - (when (memq mark '(tick dormant expire reply save)) - (while articles - (when (or (< (setq article (pop articles)) min) (> article max)) - (set var (delq article (symbol-value var))))))) - ;; Adjust assocs. - ((eq mark-type 'tuple) - (set var (setq articles (cdr marks))) - (when (not (listp (cdr (symbol-value var)))) - (set var (list (symbol-value var)))) - (when (not (listp (cdr articles))) - (setq articles (list articles))) - (while articles - (when (or (not (consp (setq article (pop articles)))) - (< (car article) min) - (> (car article) max)) - (set var (delq article (symbol-value var)))))) - ((eq mark-type 'range) - (cond - ((eq mark 'seen)))))))) - -(defun gnus-update-missing-marks (missing) - "Go through the list of MISSING articles and remove them from the mark lists." - (when missing - (let (var m) - ;; Go through all types. - (dolist (elem gnus-article-mark-lists) - (when (eq (gnus-article-mark-to-type (cdr elem)) 'list) - (setq var (intern (format "gnus-newsgroup-%s" (car elem)))) - (when (symbol-value var) - ;; This list has articles. So we delete all missing - ;; articles from it. - (setq m missing) - (while m - (set var (delq (pop m) (symbol-value var)))))))))) - -(defun gnus-update-marks () - "Enter the various lists of marked articles into the newsgroup info list." - (let ((types gnus-article-mark-lists) - (info (gnus-get-info gnus-newsgroup-name)) - (uncompressed '(score bookmark killed seen)) - type list newmarked symbol delta-marks) - (when info - ;; Add all marks lists to the list of marks lists. - (while (setq type (pop types)) - (setq list (symbol-value - (setq symbol - (intern (format "gnus-newsgroup-%s" (car type)))))) - - (when list - ;; Get rid of the entries of the articles that have the - ;; default score. - (when (and (eq (cdr type) 'score) - gnus-save-score - list) - (let* ((arts list) - (prev (cons nil list)) - (all prev)) - (while arts - (if (or (not (consp (car arts))) - (= (cdar arts) gnus-summary-default-score)) - (setcdr prev (cdr arts)) - (setq prev arts)) - (setq arts (cdr arts))) - (setq list (cdr all))))) - - (when (eq (cdr type) 'seen) - (setq list - (if list - (gnus-add-to-range list gnus-newsgroup-unseen) - (gnus-compress-sequence gnus-newsgroup-articles)))) - - (unless (memq (cdr type) uncompressed) - (setq list (gnus-compress-sequence (set symbol (sort list '<)) t))) - - (when (gnus-check-backend-function - 'request-set-mark gnus-newsgroup-name) - ;; propagate flags to server, with the following exceptions: - ;; uncompressed:s are not proper flags (they are cons cells) - ;; cache is a internal gnus flag - ;; download are local to one gnus installation (well) - ;; unsend are for nndraft groups only - ;; xxx: generality of this? this suits nnimap anyway - (unless (memq (cdr type) (append '(cache download unsend) - uncompressed)) - (let* ((old (cdr (assq (cdr type) (gnus-info-marks info)))) - (del (gnus-remove-from-range (gnus-copy-sequence old) list)) - (add (gnus-remove-from-range - (gnus-copy-sequence list) old))) - (when add - (push (list add 'add (list (cdr type))) delta-marks)) - (when del - (push (list del 'del (list (cdr type))) delta-marks))))) - - (when list - (push (cons (cdr type) list) newmarked))) - - (when delta-marks - (unless (gnus-check-group gnus-newsgroup-name) - (error "Can't open server for %s" gnus-newsgroup-name)) - (gnus-request-set-mark gnus-newsgroup-name delta-marks)) - - ;; Enter these new marks into the info of the group. - (if (nthcdr 3 info) - (setcar (nthcdr 3 info) newmarked) - ;; Add the marks lists to the end of the info. - (when newmarked - (setcdr (nthcdr 2 info) (list newmarked)))) - - ;; Cut off the end of the info if there's nothing else there. - (let ((i 5)) - (while (and (> i 2) - (not (nth i info))) - (when (nthcdr (decf i) info) - (setcdr (nthcdr i info) nil))))))) - -(defun gnus-set-mode-line (where) - "Set the mode line of the article or summary buffers. -If WHERE is `summary', the summary mode line format will be used." - ;; Is this mode line one we keep updated? - (when (and (memq where gnus-updated-mode-lines) - (symbol-value - (intern (format "gnus-%s-mode-line-format-spec" where)))) - (let (mode-string) - (save-excursion - ;; We evaluate this in the summary buffer since these - ;; variables are buffer-local to that buffer. - (set-buffer gnus-summary-buffer) - ;; We bind all these variables that are used in the `eval' form - ;; below. - (let* ((mformat (symbol-value - (intern - (format "gnus-%s-mode-line-format-spec" where)))) - (gnus-tmp-group-name (gnus-group-decoded-name - gnus-newsgroup-name)) - (gnus-tmp-article-number (or gnus-current-article 0)) - (gnus-tmp-unread gnus-newsgroup-unreads) - (gnus-tmp-unread-and-unticked (length gnus-newsgroup-unreads)) - (gnus-tmp-unselected (length gnus-newsgroup-unselected)) - (gnus-tmp-unread-and-unselected - (cond ((and (zerop gnus-tmp-unread-and-unticked) - (zerop gnus-tmp-unselected)) - "") - ((zerop gnus-tmp-unselected) - (format "{%d more}" gnus-tmp-unread-and-unticked)) - (t (format "{%d(+%d) more}" - gnus-tmp-unread-and-unticked - gnus-tmp-unselected)))) - (gnus-tmp-subject - (if (and gnus-current-headers - (vectorp gnus-current-headers)) - (gnus-mode-string-quote - (mail-header-subject gnus-current-headers)) - "")) - bufname-length max-len - gnus-tmp-header);; passed as argument to any user-format-funcs - (setq mode-string (eval mformat)) - (setq bufname-length (if (string-match "%b" mode-string) - (- (length - (buffer-name - (if (eq where 'summary) - nil - (get-buffer gnus-article-buffer)))) - 2) - 0)) - (setq max-len (max 4 (if gnus-mode-non-string-length - (- (window-width) - gnus-mode-non-string-length - bufname-length) - (length mode-string)))) - ;; We might have to chop a bit of the string off... - (when (> (length mode-string) max-len) - (setq mode-string - (concat (gnus-truncate-string mode-string (- max-len 3)) - "..."))) - ;; Pad the mode string a bit. - (setq mode-string (format (format "%%-%ds" max-len) mode-string)))) - ;; Update the mode line. - (setq mode-line-buffer-identification - (gnus-mode-line-buffer-identification (list mode-string))) - (set-buffer-modified-p t)))) - -(defun gnus-create-xref-hashtb (from-newsgroup headers unreads) - "Go through the HEADERS list and add all Xrefs to a hash table. -The resulting hash table is returned, or nil if no Xrefs were found." - (let* ((virtual (gnus-virtual-group-p from-newsgroup)) - (prefix (if virtual "" (gnus-group-real-prefix from-newsgroup))) - (xref-hashtb (gnus-make-hashtable)) - start group entry number xrefs header) - (while headers - (setq header (pop headers)) - (when (and (setq xrefs (mail-header-xref header)) - (not (memq (setq number (mail-header-number header)) - unreads))) - (setq start 0) - (while (string-match "\\([^ ]+\\)[:/]\\([0-9]+\\)" xrefs start) - (setq start (match-end 0)) - (setq group (if prefix - (concat prefix (substring xrefs (match-beginning 1) - (match-end 1))) - (substring xrefs (match-beginning 1) (match-end 1)))) - (setq number - (string-to-int (substring xrefs (match-beginning 2) - (match-end 2)))) - (if (setq entry (gnus-gethash group xref-hashtb)) - (setcdr entry (cons number (cdr entry))) - (gnus-sethash group (cons number nil) xref-hashtb))))) - (and start xref-hashtb))) - -(defun gnus-mark-xrefs-as-read (from-newsgroup headers unreads) - "Look through all the headers and mark the Xrefs as read." - (let ((virtual (gnus-virtual-group-p from-newsgroup)) - name entry info xref-hashtb idlist method nth4) - (save-excursion - (set-buffer gnus-group-buffer) - (when (setq xref-hashtb - (gnus-create-xref-hashtb from-newsgroup headers unreads)) - (mapatoms - (lambda (group) - (unless (string= from-newsgroup (setq name (symbol-name group))) - (setq idlist (symbol-value group)) - ;; Dead groups are not updated. - (and (prog1 - (setq entry (gnus-gethash name gnus-newsrc-hashtb) - info (nth 2 entry)) - (when (stringp (setq nth4 (gnus-info-method info))) - (setq nth4 (gnus-server-to-method nth4)))) - ;; Only do the xrefs if the group has the same - ;; select method as the group we have just read. - (or (gnus-methods-equal-p - nth4 (gnus-find-method-for-group from-newsgroup)) - virtual - (equal nth4 (setq method (gnus-find-method-for-group - from-newsgroup))) - (and (equal (car nth4) (car method)) - (equal (nth 1 nth4) (nth 1 method)))) - gnus-use-cross-reference - (or (not (eq gnus-use-cross-reference t)) - virtual - ;; Only do cross-references on subscribed - ;; groups, if that is what is wanted. - (<= (gnus-info-level info) gnus-level-subscribed)) - (gnus-group-make-articles-read name idlist)))) - xref-hashtb))))) - -(defun gnus-compute-read-articles (group articles) - (let* ((entry (gnus-gethash group gnus-newsrc-hashtb)) - (info (nth 2 entry)) - (active (gnus-active group)) - ninfo) - (when entry - ;; First peel off all invalid article numbers. - (when active - (let ((ids articles) - id first) - (while (setq id (pop ids)) - (when (and first (> id (cdr active))) - ;; We'll end up in this situation in one particular - ;; obscure situation. If you re-scan a group and get - ;; a new article that is cross-posted to a different - ;; group that has not been re-scanned, you might get - ;; crossposted article that has a higher number than - ;; Gnus believes possible. So we re-activate this - ;; group as well. This might mean doing the - ;; crossposting thingy will *increase* the number - ;; of articles in some groups. Tsk, tsk. - (setq active (or (gnus-activate-group group) active))) - (when (or (> id (cdr active)) - (< id (car active))) - (setq articles (delq id articles)))))) - ;; If the read list is nil, we init it. - (if (and active - (null (gnus-info-read info)) - (> (car active) 1)) - (setq ninfo (cons 1 (1- (car active)))) - (setq ninfo (gnus-info-read info))) - ;; Then we add the read articles to the range. - (gnus-add-to-range - ninfo (setq articles (sort articles '<)))))) - -(defun gnus-group-make-articles-read (group articles) - "Update the info of GROUP to say that ARTICLES are read." - (let* ((num 0) - (entry (gnus-gethash group gnus-newsrc-hashtb)) - (info (nth 2 entry)) - (active (gnus-active group)) - range) - (when entry - (setq range (gnus-compute-read-articles group articles)) - (save-excursion - (set-buffer gnus-group-buffer) - (gnus-undo-register - `(progn - (gnus-info-set-marks ',info ',(gnus-info-marks info) t) - (gnus-info-set-read ',info ',(gnus-info-read info)) - (gnus-get-unread-articles-in-group ',info (gnus-active ,group)) - (gnus-group-update-group ,group t)))) - ;; Add the read articles to the range. - (gnus-info-set-read info range) - (gnus-request-set-mark group (list (list range 'add '(read)))) - ;; Then we have to re-compute how many unread - ;; articles there are in this group. - (when active - (cond - ((not range) - (setq num (- (1+ (cdr active)) (car active)))) - ((not (listp (cdr range))) - (setq num (- (cdr active) (- (1+ (cdr range)) - (car range))))) - (t - (while range - (if (numberp (car range)) - (setq num (1+ num)) - (setq num (+ num (- (1+ (cdar range)) (caar range))))) - (setq range (cdr range))) - (setq num (- (cdr active) num)))) - ;; Update the number of unread articles. - (setcar entry num) - ;; Update the group buffer. - (gnus-group-update-group group t))))) - -(defvar gnus-newsgroup-none-id 0) - -(defun gnus-get-newsgroup-headers (&optional dependencies force-new) - (let ((cur nntp-server-buffer) - (dependencies - (or dependencies - (save-excursion (set-buffer gnus-summary-buffer) - gnus-newsgroup-dependencies))) - headers id end ref - (mail-parse-charset gnus-newsgroup-charset) - (mail-parse-ignored-charsets - (save-excursion (condition-case nil - (set-buffer gnus-summary-buffer) - (error)) - gnus-newsgroup-ignored-charsets))) - (save-excursion - (set-buffer nntp-server-buffer) - ;; Translate all TAB characters into SPACE characters. - (subst-char-in-region (point-min) (point-max) ?\t ? t) - (subst-char-in-region (point-min) (point-max) ?\r ? t) - (gnus-run-hooks 'gnus-parse-headers-hook) - (let ((case-fold-search t) - in-reply-to header p lines chars ctype) - (goto-char (point-min)) - ;; Search to the beginning of the next header. Error messages - ;; do not begin with 2 or 3. - (while (re-search-forward "^[23][0-9]+ " nil t) - (setq id nil - ref nil) - ;; This implementation of this function, with nine - ;; search-forwards instead of the one re-search-forward and - ;; a case (which basically was the old function) is actually - ;; about twice as fast, even though it looks messier. You - ;; can't have everything, I guess. Speed and elegance - ;; doesn't always go hand in hand. - (setq - header - (make-full-mail-header - ;; Number. - (prog1 - (read cur) - (end-of-line) - (setq p (point)) - (narrow-to-region (point) - (or (and (search-forward "\n.\n" nil t) - (- (point) 2)) - (point)))) - ;; Subject. - (progn - (goto-char p) - (if (search-forward "\nsubject:" nil t) - (nnheader-header-value) - "(none)")) - ;; From. - (progn - (goto-char p) - (if (search-forward "\nfrom:" nil t) - (nnheader-header-value) - "(nobody)")) - ;; Date. - (progn - (goto-char p) - (if (search-forward "\ndate:" nil t) - (nnheader-header-value) "")) - ;; Message-ID. - (progn - (goto-char p) - (setq id (if (re-search-forward - "^message-id: *\\(<[^\n\t> ]+>\\)" nil t) - ;; We do it this way to make sure the Message-ID - ;; is (somewhat) syntactically valid. - (buffer-substring (match-beginning 1) - (match-end 1)) - ;; If there was no message-id, we just fake one - ;; to make subsequent routines simpler. - (nnheader-generate-fake-message-id)))) - ;; References. - (progn - (goto-char p) - (if (search-forward "\nreferences:" nil t) - (progn - (setq end (point)) - (prog1 - (nnheader-header-value) - (setq ref - (buffer-substring - (progn - ;; (end-of-line) - (search-backward ">" end t) - (1+ (point))) - (progn - (search-backward "<" end t) - (point)))))) - ;; Get the references from the in-reply-to header if there - ;; were no references and the in-reply-to header looks - ;; promising. - (if (and (search-forward "\nin-reply-to:" nil t) - (setq in-reply-to (nnheader-header-value)) - (string-match "<[^>]+>" in-reply-to)) - (let (ref2) - (setq ref (substring in-reply-to (match-beginning 0) - (match-end 0))) - (while (string-match "<[^>]+>" in-reply-to (match-end 0)) - (setq ref2 (substring in-reply-to (match-beginning 0) - (match-end 0))) - (when (> (length ref2) (length ref)) - (setq ref ref2))) - ref) - (setq ref nil)))) - ;; Chars. - (progn - (goto-char p) - (if (search-forward "\nchars: " nil t) - (if (numberp (setq chars (ignore-errors (read cur)))) - chars -1) - -1)) - ;; Lines. - (progn - (goto-char p) - (if (search-forward "\nlines: " nil t) - (if (numberp (setq lines (ignore-errors (read cur)))) - lines -1) - -1)) - ;; Xref. - (progn - (goto-char p) - (and (search-forward "\nxref:" nil t) - (nnheader-header-value))) - ;; Extra. - (when gnus-extra-headers - (let ((extra gnus-extra-headers) - out) - (while extra - (goto-char p) - (when (search-forward - (concat "\n" (symbol-name (car extra)) ":") nil t) - (push (cons (car extra) (nnheader-header-value)) out)) - (pop extra)) - out)))) - (goto-char p) - (if (and (search-forward "\ncontent-type: " nil t) - (setq ctype (nnheader-header-value))) - (mime-entity-set-content-type-internal - header (mime-parse-Content-Type ctype))) - (when (equal id ref) - (setq ref nil)) - - (when gnus-alter-header-function - (funcall gnus-alter-header-function header) - (setq id (mail-header-id header) - ref (gnus-parent-id (mail-header-references header)))) - - (when (setq header - (gnus-dependencies-add-header - header dependencies force-new)) - (push header headers)) - (goto-char (point-max)) - (widen)) - (nreverse headers))))) - -;; Goes through the xover lines and returns a list of vectors -(defun gnus-get-newsgroup-headers-xover (sequence &optional - force-new dependencies - group also-fetch-heads) - "Parse the news overview data in the server buffer. -Return a list of headers that match SEQUENCE (see -`nntp-retrieve-headers')." - ;; Get the Xref when the users reads the articles since most/some - ;; NNTP servers do not include Xrefs when using XOVER. - (setq gnus-article-internal-prepare-hook '(gnus-article-get-xrefs)) - (let ((mail-parse-charset gnus-newsgroup-charset) - (mail-parse-ignored-charsets gnus-newsgroup-ignored-charsets) - (cur nntp-server-buffer) - (dependencies (or dependencies gnus-newsgroup-dependencies)) - (allp (cond - ((eq gnus-read-all-available-headers t) - t) - ((stringp gnus-read-all-available-headers) - (string-match gnus-read-all-available-headers group)) - (t - nil))) - number headers header) - (save-excursion - (set-buffer nntp-server-buffer) - (subst-char-in-region (point-min) (point-max) ?\r ? t) - ;; Allow the user to mangle the headers before parsing them. - (gnus-run-hooks 'gnus-parse-headers-hook) - (goto-char (point-min)) - (while (not (eobp)) - (condition-case () - (while (and (or sequence allp) - (not (eobp))) - (setq number (read cur)) - (when (not allp) - (while (and sequence - (< (car sequence) number)) - (setq sequence (cdr sequence)))) - (when (and (or allp - (and sequence - (eq number (car sequence)))) - (progn - (setq sequence (cdr sequence)) - (setq header (inline - (gnus-nov-parse-line - number dependencies force-new))))) - (push header headers)) - (forward-line 1)) - (error - (gnus-error 4 "Strange nov line (%d)" - (count-lines (point-min) (point))))) - (forward-line 1)) - ;; A common bug in inn is that if you have posted an article and - ;; then retrieves the active file, it will answer correctly -- - ;; the new article is included. However, a NOV entry for the - ;; article may not have been generated yet, so this may fail. - ;; We work around this problem by retrieving the last few - ;; headers using HEAD. - (if (or (not also-fetch-heads) - (not sequence)) - ;; We (probably) got all the headers. - (nreverse headers) - (let ((gnus-nov-is-evil t)) - (nconc - (nreverse headers) - (when (eq (gnus-retrieve-headers sequence group) 'headers) - (gnus-get-newsgroup-headers)))))))) - -(defun gnus-article-get-xrefs () - "Fill in the Xref value in `gnus-current-headers', if necessary. -This is meant to be called in `gnus-article-internal-prepare-hook'." - (let ((headers (save-excursion (set-buffer gnus-summary-buffer) - gnus-current-headers))) - (or (not gnus-use-cross-reference) - (not headers) - (and (mail-header-xref headers) - (not (string= (mail-header-xref headers) ""))) - (let ((case-fold-search t) - xref) - (save-restriction - (nnheader-narrow-to-headers) - (goto-char (point-min)) - (when (or (and (not (eobp)) - (eq (downcase (char-after)) ?x) - (looking-at "Xref:")) - (search-forward "\nXref:" nil t)) - (goto-char (1+ (match-end 0))) - (setq xref (buffer-substring (point) - (progn (end-of-line) (point)))) - (mail-header-set-xref headers xref))))))) - -(defun gnus-summary-insert-subject (id &optional old-header use-old-header) - "Find article ID and insert the summary line for that article. -OLD-HEADER can either be a header or a line number to insert -the subject line on." - (let* ((line (and (numberp old-header) old-header)) - (old-header (and (vectorp old-header) old-header)) - (header (cond ((and old-header use-old-header) - old-header) - ((and (numberp id) - (gnus-number-to-header id)) - (gnus-number-to-header id)) - (t - (gnus-read-header id)))) - (number (and (numberp id) id)) - d) - (when header - ;; Rebuild the thread that this article is part of and go to the - ;; article we have fetched. - (when (and (not gnus-show-threads) - old-header) - (when (and number - (setq d (gnus-data-find (mail-header-number old-header)))) - (goto-char (gnus-data-pos d)) - (gnus-data-remove - number - (- (gnus-point-at-bol) - (prog1 - (1+ (gnus-point-at-eol)) - (gnus-delete-line)))))) - (when old-header - (mail-header-set-number header (mail-header-number old-header))) - (setq gnus-newsgroup-sparse - (delq (setq number (mail-header-number header)) - gnus-newsgroup-sparse)) - (setq gnus-newsgroup-ancient (delq number gnus-newsgroup-ancient)) - (push number gnus-newsgroup-limit) - (gnus-rebuild-thread (mail-header-id header) line) - (gnus-summary-goto-subject number nil t)) - (when (and (numberp number) - (> number 0)) - ;; We have to update the boundaries even if we can't fetch the - ;; article if ID is a number -- so that the next `P' or `N' - ;; command will fetch the previous (or next) article even - ;; if the one we tried to fetch this time has been canceled. - (when (> number gnus-newsgroup-end) - (setq gnus-newsgroup-end number)) - (when (< number gnus-newsgroup-begin) - (setq gnus-newsgroup-begin number)) - (setq gnus-newsgroup-unselected - (delq number gnus-newsgroup-unselected))) - ;; Report back a success? - (and header (mail-header-number header)))) - -;;; Process/prefix in the summary buffer - -(defun gnus-summary-work-articles (n) - "Return a list of articles to be worked upon. -The prefix argument, the list of process marked articles, and the -current article will be taken into consideration." - (save-excursion - (set-buffer gnus-summary-buffer) - (cond - (n - ;; A numerical prefix has been given. - (setq n (prefix-numeric-value n)) - (let ((backward (< n 0)) - (n (abs (prefix-numeric-value n))) - articles article) - (save-excursion - (while - (and (> n 0) - (push (setq article (gnus-summary-article-number)) - articles) - (if backward - (gnus-summary-find-prev nil article) - (gnus-summary-find-next nil article))) - (decf n))) - (nreverse articles))) - ((and (gnus-region-active-p) (mark)) - (message "region active") - ;; Work on the region between point and mark. - (let ((max (max (point) (mark))) - articles article) - (save-excursion - (goto-char (min (point) (mark))) - (while - (and - (push (setq article (gnus-summary-article-number)) articles) - (gnus-summary-find-next nil article) - (< (point) max))) - (nreverse articles)))) - (gnus-newsgroup-processable - ;; There are process-marked articles present. - ;; Save current state. - (gnus-summary-save-process-mark) - ;; Return the list. - (reverse gnus-newsgroup-processable)) - (t - ;; Just return the current article. - (list (gnus-summary-article-number)))))) - -(defmacro gnus-summary-iterate (arg &rest forms) - "Iterate over the process/prefixed articles and do FORMS. -ARG is the interactive prefix given to the command. FORMS will be -executed with point over the summary line of the articles." - (let ((articles (make-symbol "gnus-summary-iterate-articles"))) - `(let ((,articles (gnus-summary-work-articles ,arg))) - (while ,articles - (gnus-summary-goto-subject (car ,articles)) - ,@forms - (pop ,articles))))) - -(put 'gnus-summary-iterate 'lisp-indent-function 1) -(put 'gnus-summary-iterate 'edebug-form-spec '(form body)) - -(defun gnus-summary-save-process-mark () - "Push the current set of process marked articles on the stack." - (interactive) - (push (copy-sequence gnus-newsgroup-processable) - gnus-newsgroup-process-stack)) - -(defun gnus-summary-kill-process-mark () - "Push the current set of process marked articles on the stack and unmark." - (interactive) - (gnus-summary-save-process-mark) - (gnus-summary-unmark-all-processable)) - -(defun gnus-summary-yank-process-mark () - "Pop the last process mark state off the stack and restore it." - (interactive) - (unless gnus-newsgroup-process-stack - (error "Empty mark stack")) - (gnus-summary-process-mark-set (pop gnus-newsgroup-process-stack))) - -(defun gnus-summary-process-mark-set (set) - "Make SET into the current process marked articles." - (gnus-summary-unmark-all-processable) - (while set - (gnus-summary-set-process-mark (pop set)))) - -;;; Searching and stuff - -(defun gnus-summary-search-group (&optional backward use-level) - "Search for next unread newsgroup. -If optional argument BACKWARD is non-nil, search backward instead." - (save-excursion - (set-buffer gnus-group-buffer) - (when (gnus-group-search-forward - backward nil (if use-level (gnus-group-group-level) nil)) - (gnus-group-group-name)))) - -(defun gnus-summary-best-group (&optional exclude-group) - "Find the name of the best unread group. -If EXCLUDE-GROUP, do not go to this group." - (save-excursion - (set-buffer gnus-group-buffer) - (save-excursion - (gnus-group-best-unread-group exclude-group)))) - -(defun gnus-summary-find-next (&optional unread article backward undownloaded) - (if backward (gnus-summary-find-prev) - (let* ((dummy (gnus-summary-article-intangible-p)) - (article (or article (gnus-summary-article-number))) - (arts (gnus-data-find-list article)) - result) - (when (and (not dummy) - (or (not gnus-summary-check-current) - (not unread) - (not (gnus-data-unread-p (car arts))))) - (setq arts (cdr arts))) - (when (setq result - (if unread - (progn - (while arts - (when (or (and undownloaded - (eq gnus-undownloaded-mark - (gnus-data-mark (car arts)))) - (gnus-data-unread-p (car arts))) - (setq result (car arts) - arts nil)) - (setq arts (cdr arts))) - result) - (car arts))) - (goto-char (gnus-data-pos result)) - (gnus-data-number result))))) - -(defun gnus-summary-find-prev (&optional unread article) - (let* ((eobp (eobp)) - (article (or article (gnus-summary-article-number))) - (arts (gnus-data-find-list article (gnus-data-list 'rev))) - result) - (when (and (not eobp) - (or (not gnus-summary-check-current) - (not unread) - (not (gnus-data-unread-p (car arts))))) - (setq arts (cdr arts))) - (when (setq result - (if unread - (progn - (while arts - (when (gnus-data-unread-p (car arts)) - (setq result (car arts) - arts nil)) - (setq arts (cdr arts))) - result) - (car arts))) - (goto-char (gnus-data-pos result)) - (gnus-data-number result)))) - -(defun gnus-summary-find-subject (subject &optional unread backward article) - (let* ((simp-subject (gnus-simplify-subject-fully subject)) - (article (or article (gnus-summary-article-number))) - (articles (gnus-data-list backward)) - (arts (gnus-data-find-list article articles)) - result) - (when (or (not gnus-summary-check-current) - (not unread) - (not (gnus-data-unread-p (car arts)))) - (setq arts (cdr arts))) - (while arts - (and (or (not unread) - (gnus-data-unread-p (car arts))) - (vectorp (gnus-data-header (car arts))) - (gnus-subject-equal - simp-subject (mail-header-subject (gnus-data-header (car arts))) t) - (setq result (car arts) - arts nil)) - (setq arts (cdr arts))) - (and result - (goto-char (gnus-data-pos result)) - (gnus-data-number result)))) - -(defun gnus-summary-search-forward (&optional unread subject backward) - "Search forward for an article. -If UNREAD, look for unread articles. If SUBJECT, look for -articles with that subject. If BACKWARD, search backward instead." - (cond (subject (gnus-summary-find-subject subject unread backward)) - (backward (gnus-summary-find-prev unread)) - (t (gnus-summary-find-next unread)))) - -(defun gnus-recenter (&optional n) - "Center point in window and redisplay frame. -Also do horizontal recentering." - (interactive "P") - (when (and gnus-auto-center-summary - (not (eq gnus-auto-center-summary 'vertical))) - (gnus-horizontal-recenter)) - (recenter n)) - -(defun gnus-summary-recenter () - "Center point in the summary window. -If `gnus-auto-center-summary' is nil, or the article buffer isn't -displayed, no centering will be performed." - ;; Suggested by earle@mahendo.JPL.NASA.GOV (Greg Earle). - ;; Recenter only when requested. Suggested by popovich@park.cs.columbia.edu. - (interactive) - (let* ((top (cond ((< (window-height) 4) 0) - ((< (window-height) 7) 1) - (t (if (numberp gnus-auto-center-summary) - gnus-auto-center-summary - 2)))) - (height (1- (window-height))) - (bottom (save-excursion (goto-char (point-max)) - (forward-line (- height)) - (point))) - (window (get-buffer-window (current-buffer)))) - ;; The user has to want it. - (when gnus-auto-center-summary - (when (get-buffer-window gnus-article-buffer) - ;; Only do recentering when the article buffer is displayed, - ;; Set the window start to either `bottom', which is the biggest - ;; possible valid number, or the second line from the top, - ;; whichever is the least. - (let ((top-pos (save-excursion (forward-line (- top)) (point)))) - (if (> bottom top-pos) - ;; Keep the second line from the top visible - (set-window-start window top-pos t) - ;; Try to keep the bottom line visible; if it's partially - ;; obscured, either scroll one more line to make it fully - ;; visible, or revert to using TOP-POS. - (save-excursion - (goto-char (point-max)) - (forward-line -1) - (let ((last-line-start (point))) - (goto-char bottom) - (set-window-start window (point) t) - (when (not (pos-visible-in-window-p last-line-start window)) - (forward-line 1) - (set-window-start window (min (point) top-pos) t))))))) - ;; Do horizontal recentering while we're at it. - (when (and (get-buffer-window (current-buffer) t) - (not (eq gnus-auto-center-summary 'vertical))) - (let ((selected (selected-window))) - (select-window (get-buffer-window (current-buffer) t)) - (gnus-summary-position-point) - (gnus-horizontal-recenter) - (select-window selected)))))) - -(defun gnus-summary-jump-to-group (newsgroup) - "Move point to NEWSGROUP in group mode buffer." - ;; Keep update point of group mode buffer if visible. - (if (eq (current-buffer) (get-buffer gnus-group-buffer)) - (save-window-excursion - ;; Take care of tree window mode. - (when (get-buffer-window gnus-group-buffer) - (pop-to-buffer gnus-group-buffer)) - (gnus-group-jump-to-group newsgroup)) - (save-excursion - ;; Take care of tree window mode. - (if (get-buffer-window gnus-group-buffer) - (pop-to-buffer gnus-group-buffer) - (set-buffer gnus-group-buffer)) - (gnus-group-jump-to-group newsgroup)))) - -;; This function returns a list of article numbers based on the -;; difference between the ranges of read articles in this group and -;; the range of active articles. -(defun gnus-list-of-unread-articles (group) - (let* ((read (gnus-info-read (gnus-get-info group))) - (active (or (gnus-active group) (gnus-activate-group group))) - (last (cdr active)) - first nlast unread) - ;; If none are read, then all are unread. - (if (not read) - (setq first (car active)) - ;; If the range of read articles is a single range, then the - ;; first unread article is the article after the last read - ;; article. Sounds logical, doesn't it? - (if (and (not (listp (cdr read))) - (or (< (car read) (car active)) - (progn (setq read (list read)) - nil))) - (setq first (max (car active) (1+ (cdr read)))) - ;; `read' is a list of ranges. - (when (/= (setq nlast (or (and (numberp (car read)) (car read)) - (caar read))) - 1) - (setq first (car active))) - (while read - (when first - (while (< first nlast) - (push first unread) - (setq first (1+ first)))) - (setq first (1+ (if (atom (car read)) (car read) (cdar read)))) - (setq nlast (if (atom (cadr read)) (cadr read) (caadr read))) - (setq read (cdr read))))) - ;; And add the last unread articles. - (while (<= first last) - (push first unread) - (setq first (1+ first))) - ;; Return the list of unread articles. - (delq 0 (nreverse unread)))) - -(defun gnus-list-of-read-articles (group) - "Return a list of unread, unticked and non-dormant articles." - (let* ((info (gnus-get-info group)) - (marked (gnus-info-marks info)) - (active (gnus-active group))) - (and info active - (gnus-set-difference - (gnus-sorted-complement - (gnus-uncompress-range active) - (gnus-list-of-unread-articles group)) - (append - (gnus-uncompress-range (cdr (assq 'dormant marked))) - (gnus-uncompress-range (cdr (assq 'tick marked)))))))) - -;; Various summary commands - -(defun gnus-summary-select-article-buffer () - "Reconfigure windows to show article buffer." - (interactive) - (if (not (gnus-buffer-live-p gnus-article-buffer)) - (error "There is no article buffer for this summary buffer") - (gnus-configure-windows 'article) - (select-window (get-buffer-window gnus-article-buffer)))) - -(defun gnus-summary-universal-argument (arg) - "Perform any operation on all articles that are process/prefixed." - (interactive "P") - (let ((articles (gnus-summary-work-articles arg)) - func article) - (if (eq - (setq - func - (key-binding - (read-key-sequence - (substitute-command-keys - "\\\\[gnus-summary-universal-argument]")))) - 'undefined) - (gnus-error 1 "Undefined key") - (save-excursion - (while articles - (gnus-summary-goto-subject (setq article (pop articles))) - (let (gnus-newsgroup-processable) - (command-execute func)) - (gnus-summary-remove-process-mark article))))) - (gnus-summary-position-point)) - -(defun gnus-summary-toggle-truncation (&optional arg) - "Toggle truncation of summary lines. -With arg, turn line truncation on iff arg is positive." - (interactive "P") - (setq truncate-lines - (if (null arg) (not truncate-lines) - (> (prefix-numeric-value arg) 0))) - (redraw-display)) - -(defun gnus-summary-reselect-current-group (&optional all rescan) - "Exit and then reselect the current newsgroup. -The prefix argument ALL means to select all articles." - (interactive "P") - (when (gnus-ephemeral-group-p gnus-newsgroup-name) - (error "Ephemeral groups can't be reselected")) - (let ((current-subject (gnus-summary-article-number)) - (group gnus-newsgroup-name)) - (setq gnus-newsgroup-begin nil) - (gnus-summary-exit) - ;; We have to adjust the point of group mode buffer because - ;; point was moved to the next unread newsgroup by exiting. - (gnus-summary-jump-to-group group) - (when rescan - (save-excursion - (save-window-excursion - ;; Don't show group contents. - (set-window-start (selected-window) (point-max)) - (gnus-group-get-new-news-this-group 1)))) - (gnus-group-read-group all t) - (gnus-summary-goto-subject current-subject nil t))) - -(defun gnus-summary-rescan-group (&optional all) - "Exit the newsgroup, ask for new articles, and select the newsgroup." - (interactive "P") - (gnus-summary-reselect-current-group all t)) - -(defun gnus-summary-update-info (&optional non-destructive) - (save-excursion - (let ((group gnus-newsgroup-name)) - (when group - (when gnus-newsgroup-kill-headers - (setq gnus-newsgroup-killed - (gnus-compress-sequence - (nconc - (gnus-set-sorted-intersection - (gnus-uncompress-range gnus-newsgroup-killed) - (setq gnus-newsgroup-unselected - (sort gnus-newsgroup-unselected '<))) - (setq gnus-newsgroup-unreads - (sort gnus-newsgroup-unreads '<))) - t))) - (unless (listp (cdr gnus-newsgroup-killed)) - (setq gnus-newsgroup-killed (list gnus-newsgroup-killed))) - (let ((headers gnus-newsgroup-headers)) - ;; Set the new ranges of read articles. - (save-excursion - (set-buffer gnus-group-buffer) - (gnus-undo-force-boundary)) - (gnus-update-read-articles - group (append gnus-newsgroup-unreads gnus-newsgroup-unselected)) - ;; Set the current article marks. - (let ((gnus-newsgroup-scored - (if (and (not gnus-save-score) - (not non-destructive)) - nil - gnus-newsgroup-scored))) - (save-excursion - (gnus-update-marks))) - ;; Do the cross-ref thing. - (when gnus-use-cross-reference - (gnus-mark-xrefs-as-read group headers gnus-newsgroup-unreads)) - ;; Do not switch windows but change the buffer to work. - (set-buffer gnus-group-buffer) - (unless (gnus-ephemeral-group-p group) - (gnus-group-update-group group))))))) - -(defun gnus-summary-save-newsrc (&optional force) - "Save the current number of read/marked articles in the dribble buffer. -The dribble buffer will then be saved. -If FORCE (the prefix), also save the .newsrc file(s)." - (interactive "P") - (gnus-summary-update-info t) - (if force - (gnus-save-newsrc-file) - (gnus-dribble-save))) - -(defun gnus-summary-exit (&optional temporary) - "Exit reading current newsgroup, and then return to group selection mode. -`gnus-exit-group-hook' is called with no arguments if that value is non-nil." - (interactive) - (gnus-set-global-variables) - (gnus-kill-save-kill-buffer) - (gnus-async-halt-prefetch) - (let* ((group gnus-newsgroup-name) - (quit-config (gnus-group-quit-config gnus-newsgroup-name)) - (mode major-mode) - (group-point nil) - (buf (current-buffer))) - (unless quit-config - ;; Do adaptive scoring, and possibly save score files. - (when gnus-newsgroup-adaptive - (gnus-score-adaptive)) - (when gnus-use-scoring - (gnus-score-save))) - (gnus-run-hooks 'gnus-summary-prepare-exit-hook) - ;; If we have several article buffers, we kill them at exit. - (unless gnus-single-article-buffer - (gnus-kill-buffer gnus-original-article-buffer) - (setq gnus-article-current nil)) - (when gnus-use-cache - (gnus-cache-possibly-remove-articles) - (gnus-cache-save-buffers)) - (gnus-async-prefetch-remove-group group) - (when gnus-suppress-duplicates - (gnus-dup-enter-articles)) - (when gnus-use-trees - (gnus-tree-close group)) - (when gnus-use-cache - (gnus-cache-write-active)) - ;; Remove entries for this group. - (nnmail-purge-split-history (gnus-group-real-name group)) - ;; Make all changes in this group permanent. - (unless quit-config - (gnus-run-hooks 'gnus-exit-group-hook) - (gnus-summary-update-info)) - (gnus-close-group group) - ;; Make sure where we were, and go to next newsgroup. - (set-buffer gnus-group-buffer) - (unless quit-config - (gnus-group-jump-to-group group)) - (gnus-run-hooks 'gnus-summary-exit-hook) - (unless (or quit-config - ;; If this group has disappeared from the summary - ;; buffer, don't skip forwards. - (not (string= group (gnus-group-group-name)))) - (gnus-group-next-unread-group 1)) - (setq group-point (point)) - (if temporary - nil ;Nothing to do. - ;; If we have several article buffers, we kill them at exit. - (unless gnus-single-article-buffer - (gnus-kill-buffer gnus-article-buffer) - (gnus-kill-buffer gnus-original-article-buffer) - (setq gnus-article-current nil)) - (set-buffer buf) - (if (not gnus-kill-summary-on-exit) - (progn - (gnus-deaden-summary) - (setq mode nil)) - ;; We set all buffer-local variables to nil. It is unclear why - ;; this is needed, but if we don't, buffer-local variables are - ;; not garbage-collected, it seems. This would the lead to en - ;; ever-growing Emacs. - (gnus-summary-clear-local-variables) - (let ((gnus-summary-local-variables gnus-newsgroup-variables)) - (gnus-summary-clear-local-variables)) - (when (get-buffer gnus-article-buffer) - (bury-buffer gnus-article-buffer)) - ;; We clear the global counterparts of the buffer-local - ;; variables as well, just to be on the safe side. - (set-buffer gnus-group-buffer) - (gnus-summary-clear-local-variables) - (let ((gnus-summary-local-variables gnus-newsgroup-variables)) - (gnus-summary-clear-local-variables))) - (setq gnus-current-select-method gnus-select-method) - (pop-to-buffer gnus-group-buffer) - (if (not quit-config) - (progn - (goto-char group-point) - (gnus-configure-windows 'group 'force) - (unless (pos-visible-in-window-p) - (forward-line (/ (static-if (featurep 'xemacs) - (window-displayed-height) - (1- (window-height))) - -2)) - (set-window-start (selected-window) (point)) - (goto-char group-point))) - (gnus-handle-ephemeral-exit quit-config)) - ;; Return to group mode buffer. - (when (eq mode 'gnus-summary-mode) - (gnus-kill-buffer buf)) - ;; Clear the current group name. - (unless quit-config - (setq gnus-newsgroup-name nil))))) - -(defalias 'gnus-summary-quit 'gnus-summary-exit-no-update) -(defun gnus-summary-exit-no-update (&optional no-questions) - "Quit reading current newsgroup without updating read article info." - (interactive) - (let* ((group gnus-newsgroup-name) - (quit-config (gnus-group-quit-config group))) - (when (or no-questions - gnus-expert-user - (gnus-y-or-n-p "Discard changes to this group and exit? ")) - (gnus-async-halt-prefetch) - (mapcar 'funcall - (delq 'gnus-summary-expire-articles - (copy-sequence gnus-summary-prepare-exit-hook))) - ;; If we have several article buffers, we kill them at exit. - (unless gnus-single-article-buffer - (gnus-kill-buffer gnus-article-buffer) - (gnus-kill-buffer gnus-original-article-buffer) - (setq gnus-article-current nil)) - (if (not gnus-kill-summary-on-exit) - (gnus-deaden-summary) - (gnus-close-group group) - (gnus-summary-clear-local-variables) - (let ((gnus-summary-local-variables gnus-newsgroup-variables)) - (gnus-summary-clear-local-variables)) - (set-buffer gnus-group-buffer) - (gnus-summary-clear-local-variables) - (let ((gnus-summary-local-variables gnus-newsgroup-variables)) - (gnus-summary-clear-local-variables)) - (when (get-buffer gnus-summary-buffer) - (kill-buffer gnus-summary-buffer))) - (unless gnus-single-article-buffer - (setq gnus-article-current nil)) - (when gnus-use-trees - (gnus-tree-close group)) - (gnus-async-prefetch-remove-group group) - (when (get-buffer gnus-article-buffer) - (bury-buffer gnus-article-buffer)) - ;; Return to the group buffer. - (gnus-configure-windows 'group 'force) - ;; Clear the current group name. - (setq gnus-newsgroup-name nil) - (when (equal (gnus-group-group-name) group) - (gnus-group-next-unread-group 1)) - (when quit-config - (gnus-handle-ephemeral-exit quit-config))))) - -(defun gnus-handle-ephemeral-exit (quit-config) - "Handle movement when leaving an ephemeral group. -The state which existed when entering the ephemeral is reset." - (if (not (buffer-name (car quit-config))) - (gnus-configure-windows 'group 'force) - (set-buffer (car quit-config)) - (cond ((eq major-mode 'gnus-summary-mode) - (gnus-set-global-variables)) - ((eq major-mode 'gnus-article-mode) - (save-excursion - ;; The `gnus-summary-buffer' variable may point - ;; to the old summary buffer when using a single - ;; article buffer. - (unless (gnus-buffer-live-p gnus-summary-buffer) - (set-buffer gnus-group-buffer)) - (set-buffer gnus-summary-buffer) - (gnus-set-global-variables)))) - (if (or (eq (cdr quit-config) 'article) - (eq (cdr quit-config) 'pick)) - (progn - ;; The current article may be from the ephemeral group - ;; thus it is best that we reload this article - (gnus-summary-show-article) - (if (and (boundp 'gnus-pick-mode) (symbol-value 'gnus-pick-mode)) - (gnus-configure-windows 'pick 'force) - (gnus-configure-windows (cdr quit-config) 'force))) - (gnus-configure-windows (cdr quit-config) 'force)) - (when (eq major-mode 'gnus-summary-mode) - (gnus-summary-next-subject 1 nil t) - (gnus-summary-recenter) - (gnus-summary-position-point)))) - -(defun gnus-summary-preview-mime-message () - "MIME decode and play this message." - (interactive) - (let ((gnus-break-pages nil) - (gnus-show-mime t)) - (gnus-summary-select-article gnus-show-all-headers t)) - (select-window (get-buffer-window gnus-article-buffer))) - -;;; Dead summaries. - -(defvar gnus-dead-summary-mode-map nil) - -(unless gnus-dead-summary-mode-map - (setq gnus-dead-summary-mode-map (make-keymap)) - (suppress-keymap gnus-dead-summary-mode-map) - (substitute-key-definition - 'undefined 'gnus-summary-wake-up-the-dead gnus-dead-summary-mode-map) - (let ((keys '("\C-d" "\r" "\177" [delete]))) - (while keys - (define-key gnus-dead-summary-mode-map - (pop keys) 'gnus-summary-wake-up-the-dead)))) - -(defvar gnus-dead-summary-mode nil - "Minor mode for Gnus summary buffers.") - -(defun gnus-dead-summary-mode (&optional arg) - "Minor mode for Gnus summary buffers." - (interactive "P") - (when (eq major-mode 'gnus-summary-mode) - (make-local-variable 'gnus-dead-summary-mode) - (setq gnus-dead-summary-mode - (if (null arg) (not gnus-dead-summary-mode) - (> (prefix-numeric-value arg) 0))) - (when gnus-dead-summary-mode - (gnus-add-minor-mode - 'gnus-dead-summary-mode " Dead" gnus-dead-summary-mode-map)))) - -(defun gnus-deaden-summary () - "Make the current summary buffer into a dead summary buffer." - ;; Kill any previous dead summary buffer. - (when (and gnus-dead-summary - (buffer-name gnus-dead-summary)) - (save-excursion - (set-buffer gnus-dead-summary) - (when gnus-dead-summary-mode - (kill-buffer (current-buffer))))) - ;; Make this the current dead summary. - (setq gnus-dead-summary (current-buffer)) - (gnus-dead-summary-mode 1) - (let ((name (buffer-name))) - (when (string-match "Summary" name) - (rename-buffer - (concat (substring name 0 (match-beginning 0)) "Dead " - (substring name (match-beginning 0))) - t) - (bury-buffer)))) - -(defun gnus-kill-or-deaden-summary (buffer) - "Kill or deaden the summary BUFFER." - (save-excursion - (when (and (buffer-name buffer) - (not gnus-single-article-buffer)) - (save-excursion - (set-buffer buffer) - (gnus-kill-buffer gnus-article-buffer) - (gnus-kill-buffer gnus-original-article-buffer))) - (cond (gnus-kill-summary-on-exit - (when (and gnus-use-trees - (gnus-buffer-exists-p buffer)) - (save-excursion - (set-buffer buffer) - (gnus-tree-close gnus-newsgroup-name))) - (gnus-kill-buffer buffer)) - ((gnus-buffer-exists-p buffer) - (save-excursion - (set-buffer buffer) - (gnus-deaden-summary)))))) - -(defun gnus-summary-wake-up-the-dead (&rest args) - "Wake up the dead summary buffer." - (interactive) - (gnus-dead-summary-mode -1) - (let ((name (buffer-name))) - (when (string-match "Dead " name) - (rename-buffer - (concat (substring name 0 (match-beginning 0)) - (substring name (match-end 0))) - t))) - (gnus-message 3 "This dead summary is now alive again")) - -;; Suggested by Andrew Eskilsson . -(defun gnus-summary-fetch-faq (&optional faq-dir) - "Fetch the FAQ for the current group. -If FAQ-DIR (the prefix), prompt for a directory to search for the faq -in." - (interactive - (list - (when current-prefix-arg - (completing-read - "Faq dir: " (and (listp gnus-group-faq-directory) - (mapcar (lambda (file) (list file)) - gnus-group-faq-directory)))))) - (let (gnus-faq-buffer) - (when (setq gnus-faq-buffer - (gnus-group-fetch-faq gnus-newsgroup-name faq-dir)) - (gnus-configure-windows 'summary-faq)))) - -;; Suggested by Per Abrahamsen . -(defun gnus-summary-describe-group (&optional force) - "Describe the current newsgroup." - (interactive "P") - (gnus-group-describe-group force gnus-newsgroup-name)) - -(defun gnus-summary-describe-briefly () - "Describe summary mode commands briefly." - (interactive) - (gnus-message 6 (substitute-command-keys "\\\\[gnus-summary-next-page]:Select \\[gnus-summary-next-unread-article]:Forward \\[gnus-summary-prev-unread-article]:Backward \\[gnus-summary-exit]:Exit \\[gnus-info-find-node]:Run Info \\[gnus-summary-describe-briefly]:This help"))) - -;; Walking around group mode buffer from summary mode. - -(defun gnus-summary-next-group (&optional no-article target-group backward) - "Exit current newsgroup and then select next unread newsgroup. -If prefix argument NO-ARTICLE is non-nil, no article is selected -initially. If NEXT-GROUP, go to this group. If BACKWARD, go to -previous group instead." - (interactive "P") - ;; Stop pre-fetching. - (gnus-async-halt-prefetch) - (let ((current-group gnus-newsgroup-name) - (current-buffer (current-buffer)) - entered) - ;; First we semi-exit this group to update Xrefs and all variables. - ;; We can't do a real exit, because the window conf must remain - ;; the same in case the user is prompted for info, and we don't - ;; want the window conf to change before that... - (gnus-summary-exit t) - (while (not entered) - ;; Then we find what group we are supposed to enter. - (set-buffer gnus-group-buffer) - (gnus-group-jump-to-group current-group) - (setq target-group - (or target-group - (if (eq gnus-keep-same-level 'best) - (gnus-summary-best-group gnus-newsgroup-name) - (gnus-summary-search-group backward gnus-keep-same-level)))) - (if (not target-group) - ;; There are no further groups, so we return to the group - ;; buffer. - (progn - (gnus-message 5 "Returning to the group buffer") - (setq entered t) - (when (gnus-buffer-live-p current-buffer) - (set-buffer current-buffer) - (gnus-summary-exit)) - (gnus-run-hooks 'gnus-group-no-more-groups-hook)) - ;; We try to enter the target group. - (gnus-group-jump-to-group target-group) - (let ((unreads (gnus-group-group-unread))) - (if (and (or (eq t unreads) - (and unreads (not (zerop unreads)))) - (gnus-summary-read-group - target-group nil no-article - (and (buffer-name current-buffer) current-buffer) - nil backward)) - (setq entered t) - (setq current-group target-group - target-group nil))))))) - -(defun gnus-summary-prev-group (&optional no-article) - "Exit current newsgroup and then select previous unread newsgroup. -If prefix argument NO-ARTICLE is non-nil, no article is selected initially." - (interactive "P") - (gnus-summary-next-group no-article nil t)) - -;; Walking around summary lines. - -(defun gnus-summary-first-subject (&optional unread undownloaded) - "Go to the first unread subject. -If UNREAD is non-nil, go to the first unread article. -Returns the article selected or nil if there are no unread articles." - (interactive "P") - (prog1 - (cond - ;; Empty summary. - ((null gnus-newsgroup-data) - (gnus-message 3 "No articles in the group") - nil) - ;; Pick the first article. - ((not unread) - (goto-char (gnus-data-pos (car gnus-newsgroup-data))) - (gnus-data-number (car gnus-newsgroup-data))) - ;; No unread articles. - ((null gnus-newsgroup-unreads) - (gnus-message 3 "No more unread articles") - nil) - ;; Find the first unread article. - (t - (let ((data gnus-newsgroup-data)) - (while (and data - (and (not (and undownloaded - (eq gnus-undownloaded-mark - (gnus-data-mark (car data))))) - (not (gnus-data-unread-p (car data))))) - (setq data (cdr data))) - (when data - (goto-char (gnus-data-pos (car data))) - (gnus-data-number (car data)))))) - (gnus-summary-position-point))) - -(defun gnus-summary-next-subject (n &optional unread dont-display) - "Go to next N'th summary line. -If N is negative, go to the previous N'th subject line. -If UNREAD is non-nil, only unread articles are selected. -The difference between N and the actual number of steps taken is -returned." - (interactive "p") - (let ((backward (< n 0)) - (n (abs n))) - (while (and (> n 0) - (if backward - (gnus-summary-find-prev unread) - (gnus-summary-find-next unread))) - (unless (zerop (setq n (1- n))) - (gnus-summary-show-thread))) - (when (/= 0 n) - (gnus-message 7 "No more%s articles" - (if unread " unread" ""))) - (unless dont-display - (gnus-summary-recenter) - (gnus-summary-position-point)) - n)) - -(defun gnus-summary-next-unread-subject (n) - "Go to next N'th unread summary line." - (interactive "p") - (gnus-summary-next-subject n t)) - -(defun gnus-summary-prev-subject (n &optional unread) - "Go to previous N'th summary line. -If optional argument UNREAD is non-nil, only unread article is selected." - (interactive "p") - (gnus-summary-next-subject (- n) unread)) - -(defun gnus-summary-prev-unread-subject (n) - "Go to previous N'th unread summary line." - (interactive "p") - (gnus-summary-next-subject (- n) t)) - -(defun gnus-summary-goto-subject (article &optional force silent) - "Go the subject line of ARTICLE. -If FORCE, also allow jumping to articles not currently shown." - (interactive "nArticle number: ") - (let ((b (point)) - (data (gnus-data-find article))) - ;; We read in the article if we have to. - (and (not data) - force - (gnus-summary-insert-subject - article - (if (or (numberp force) (vectorp force)) force) - t) - (setq data (gnus-data-find article))) - (goto-char b) - (if (not data) - (progn - (unless silent - (gnus-message 3 "Can't find article %d" article)) - nil) - (let ((pt (gnus-data-pos data))) - (goto-char pt) - (gnus-summary-set-article-display-arrow pt)) - (gnus-summary-position-point) - article))) - -;; Walking around summary lines with displaying articles. - -(defun gnus-summary-expand-window (&optional arg) - "Make the summary buffer take up the entire Emacs frame. -Given a prefix, will force an `article' buffer configuration." - (interactive "P") - (if arg - (gnus-configure-windows 'article 'force) - (gnus-configure-windows 'summary 'force))) - -(defun gnus-summary-display-article (article &optional all-header) - "Display ARTICLE in article buffer." - (when (gnus-buffer-live-p gnus-article-buffer) - (with-current-buffer gnus-article-buffer - (set-buffer-multibyte t))) - (gnus-set-global-variables) - (when (gnus-buffer-live-p gnus-article-buffer) - (with-current-buffer gnus-article-buffer - (setq gnus-article-charset gnus-newsgroup-charset) - (setq gnus-article-ignored-charsets gnus-newsgroup-ignored-charsets))) - (if (null article) - nil - (prog1 - (if gnus-summary-display-article-function - (funcall gnus-summary-display-article-function article all-header) - (gnus-article-prepare article all-header)) - (with-current-buffer gnus-article-buffer - (set (make-local-variable 'gnus-summary-search-article-matched-data) - nil)) - (gnus-run-hooks 'gnus-select-article-hook) - (when (and gnus-current-article - (not (zerop gnus-current-article))) - (gnus-summary-goto-subject gnus-current-article)) - (gnus-summary-recenter) - (when (and gnus-use-trees gnus-show-threads) - (gnus-possibly-generate-tree article) - (gnus-highlight-selected-tree article)) - ;; Successfully display article. - (gnus-article-set-window-start - (cdr (assq article gnus-newsgroup-bookmarks)))))) - -(defun gnus-summary-select-article (&optional all-headers force pseudo article) - "Select the current article. -If ALL-HEADERS is non-nil, show all header fields. If FORCE is -non-nil, the article will be re-fetched even if it already present in -the article buffer. If PSEUDO is non-nil, pseudo-articles will also -be displayed." - ;; Make sure we are in the summary buffer to work around bbdb bug. - (unless (eq major-mode 'gnus-summary-mode) - (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) - (and (not pseudo) - (gnus-summary-article-pseudo-p article) - (error "This is a pseudo-article")) - (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)) - (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-force-verify-and-decrypt () - (interactive) - (let ((mm-verify-option 'known) - (mm-decrypt-option 'known)) - (gnus-summary-select-article nil 'force))) - -(defun gnus-summary-set-current-mark (&optional current-mark) - "Obsolete function." - nil) - -(defun gnus-summary-next-article (&optional unread subject backward push) - "Select the next article. -If UNREAD, only unread articles are selected. -If SUBJECT, only articles with SUBJECT are selected. -If BACKWARD, the previous article is selected instead of the next." - (interactive "P") - (cond - ;; Is there such an article? - ((and (gnus-summary-search-forward unread subject backward) - (or (gnus-summary-display-article (gnus-summary-article-number)) - (eq (gnus-summary-article-mark) gnus-canceled-mark))) - (gnus-summary-position-point)) - ;; If not, we try the first unread, if that is wanted. - ((and subject - gnus-auto-select-same - (gnus-summary-first-unread-article)) - (gnus-summary-position-point) - (gnus-message 6 "Wrapped")) - ;; Try to get next/previous article not displayed in this group. - ((and gnus-auto-extend-newsgroup - (not unread) (not subject)) - (gnus-summary-goto-article - (if backward (1- gnus-newsgroup-begin) (1+ gnus-newsgroup-end)) - nil (count-lines (point-min) (point)))) - ;; Go to next/previous group. - (t - (unless (gnus-ephemeral-group-p gnus-newsgroup-name) - (gnus-summary-jump-to-group gnus-newsgroup-name)) - (let ((cmd last-command-char) - (point - (save-excursion - (set-buffer gnus-group-buffer) - (point))) - (group - (if (eq gnus-keep-same-level 'best) - (gnus-summary-best-group gnus-newsgroup-name) - (gnus-summary-search-group backward gnus-keep-same-level)))) - ;; For some reason, the group window gets selected. We change - ;; it back. - (select-window (get-buffer-window (current-buffer))) - ;; Select next unread newsgroup automagically. - (cond - ((or (not gnus-auto-select-next) - (not cmd)) - (gnus-message 7 "No more%s articles" (if unread " unread" ""))) - ((or (eq gnus-auto-select-next 'quietly) - (and (eq gnus-auto-select-next 'slightly-quietly) - push) - (and (eq gnus-auto-select-next 'almost-quietly) - (gnus-summary-last-article-p))) - ;; Select quietly. - (if (gnus-ephemeral-group-p gnus-newsgroup-name) - (gnus-summary-exit) - (gnus-message 7 "No more%s articles (%s)..." - (if unread " unread" "") - (if group (concat "selecting " group) - "exiting")) - (gnus-summary-next-group nil group backward))) - (t - (when (gnus-key-press-event-p last-input-event) - (gnus-summary-walk-group-buffer - gnus-newsgroup-name cmd unread backward point)))))))) - -(defun gnus-summary-walk-group-buffer (from-group cmd unread backward start) - (let ((keystrokes '((?\C-n (gnus-group-next-unread-group 1)) - (?\C-p (gnus-group-prev-unread-group 1)))) - (cursor-in-echo-area t) - keve key group ended) - (save-excursion - (set-buffer gnus-group-buffer) - (goto-char start) - (setq group - (if (eq gnus-keep-same-level 'best) - (gnus-summary-best-group gnus-newsgroup-name) - (gnus-summary-search-group backward gnus-keep-same-level)))) - (while (not ended) - (gnus-message - 5 "No more%s articles%s" (if unread " unread" "") - (if (and group - (not (gnus-ephemeral-group-p gnus-newsgroup-name))) - (format " (Type %s for %s [%s])" - (single-key-description cmd) group - (car (gnus-gethash group gnus-newsrc-hashtb))) - (format " (Type %s to exit %s)" - (single-key-description cmd) - gnus-newsgroup-name))) - ;; Confirm auto selection. - (setq key (car (setq keve (gnus-read-event-char)))) - (setq ended t) - (cond - ((assq key keystrokes) - (let ((obuf (current-buffer))) - (switch-to-buffer gnus-group-buffer) - (when group - (gnus-group-jump-to-group group)) - (eval (cadr (assq key keystrokes))) - (setq group (gnus-group-group-name)) - (switch-to-buffer obuf)) - (setq ended nil)) - ((equal key cmd) - (if (or (not group) - (gnus-ephemeral-group-p gnus-newsgroup-name)) - (gnus-summary-exit) - (gnus-summary-next-group nil group backward))) - (t - (push (cdr keve) unread-command-events)))))) - -(defun gnus-summary-next-unread-article () - "Select unread article after current one." - (interactive) - (gnus-summary-next-article - (or (not (eq gnus-summary-goto-unread 'never)) - (gnus-summary-last-article-p (gnus-summary-article-number))) - (and gnus-auto-select-same - (gnus-summary-article-subject)))) - -(defun gnus-summary-prev-article (&optional unread subject) - "Select the article after the current one. -If UNREAD is non-nil, only unread articles are selected." - (interactive "P") - (gnus-summary-next-article unread subject t)) - -(defun gnus-summary-prev-unread-article () - "Select unread article before current one." - (interactive) - (gnus-summary-prev-article - (or (not (eq gnus-summary-goto-unread 'never)) - (gnus-summary-first-article-p (gnus-summary-article-number))) - (and gnus-auto-select-same - (gnus-summary-article-subject)))) - -(defun gnus-summary-next-page (&optional lines circular) - "Show next page of the selected article. -If at the end of the current article, select the next article. -LINES says how many lines should be scrolled up. - -If CIRCULAR is non-nil, go to the start of the article instead of -selecting the next article when reaching the end of the current -article." - (interactive "P") - (setq gnus-summary-buffer (current-buffer)) - (gnus-set-global-variables) - (let ((article (gnus-summary-article-number)) - (article-window (get-buffer-window gnus-article-buffer t)) - endp) - ;; If the buffer is empty, we have no article. - (unless article - (error "No article to select")) - (gnus-configure-windows 'article) - (if (eq (cdr (assq article gnus-newsgroup-reads)) gnus-canceled-mark) - (if (and (eq gnus-summary-goto-unread 'never) - (not (gnus-summary-last-article-p article))) - (gnus-summary-next-article) - (gnus-summary-next-unread-article)) - (if (or (null gnus-current-article) - (null gnus-article-current) - (/= article (cdr gnus-article-current)) - (not (equal (car gnus-article-current) gnus-newsgroup-name))) - ;; Selected subject is different from current article's. - (gnus-summary-display-article article) - (when article-window - (gnus-eval-in-buffer-window gnus-article-buffer - (setq endp (gnus-article-next-page lines))) - (when endp - (cond (circular - (gnus-summary-beginning-of-article)) - (lines - (gnus-message 3 "End of message")) - ((null lines) - (if (and (eq gnus-summary-goto-unread 'never) - (not (gnus-summary-last-article-p article))) - (gnus-summary-next-article) - (gnus-summary-next-unread-article)))))))) - (gnus-summary-recenter) - (gnus-summary-position-point))) - -(defun gnus-summary-prev-page (&optional lines move) - "Show previous page of selected article. -Argument LINES specifies lines to be scrolled down. -If MOVE, move to the previous unread article if point is at -the beginning of the buffer." - (interactive "P") - (let ((article (gnus-summary-article-number)) - (article-window (get-buffer-window gnus-article-buffer t)) - endp) - (gnus-configure-windows 'article) - (if (or (null gnus-current-article) - (null gnus-article-current) - (/= article (cdr gnus-article-current)) - (not (equal (car gnus-article-current) gnus-newsgroup-name))) - ;; Selected subject is different from current article's. - (gnus-summary-display-article article) - (gnus-summary-recenter) - (when article-window - (gnus-eval-in-buffer-window gnus-article-buffer - (setq endp (gnus-article-prev-page lines))) - (when (and move endp) - (cond (lines - (gnus-message 3 "Beginning of message")) - ((null lines) - (if (and (eq gnus-summary-goto-unread 'never) - (not (gnus-summary-first-article-p article))) - (gnus-summary-prev-article) - (gnus-summary-prev-unread-article)))))))) - (gnus-summary-position-point)) - -(defun gnus-summary-prev-page-or-article (&optional lines) - "Show previous page of selected article. -Argument LINES specifies lines to be scrolled down. -If at the beginning of the article, go to the next article." - (interactive "P") - (gnus-summary-prev-page lines t)) - -(defun gnus-summary-scroll-up (lines) - "Scroll up (or down) one line current article. -Argument LINES specifies lines to be scrolled up (or down if negative)." - (interactive "p") - (gnus-configure-windows 'article) - (gnus-summary-show-thread) - (when (eq (gnus-summary-select-article nil nil 'pseudo) 'old) - (gnus-eval-in-buffer-window gnus-article-buffer - (cond ((> lines 0) - (when (gnus-article-next-page lines) - (gnus-message 3 "End of message"))) - ((< lines 0) - (gnus-article-prev-page (- lines)))))) - (gnus-summary-recenter) - (gnus-summary-position-point)) - -(defun gnus-summary-scroll-down (lines) - "Scroll down (or up) one line current article. -Argument LINES specifies lines to be scrolled down (or up if negative)." - (interactive "p") - (gnus-summary-scroll-up (- lines))) - -(defun gnus-summary-next-same-subject () - "Select next article which has the same subject as current one." - (interactive) - (gnus-summary-next-article nil (gnus-summary-article-subject))) - -(defun gnus-summary-prev-same-subject () - "Select previous article which has the same subject as current one." - (interactive) - (gnus-summary-prev-article nil (gnus-summary-article-subject))) - -(defun gnus-summary-next-unread-same-subject () - "Select next unread article which has the same subject as current one." - (interactive) - (gnus-summary-next-article t (gnus-summary-article-subject))) - -(defun gnus-summary-prev-unread-same-subject () - "Select previous unread article which has the same subject as current one." - (interactive) - (gnus-summary-prev-article t (gnus-summary-article-subject))) - -(defun gnus-summary-first-unread-article () - "Select the first unread article. -Return nil if there are no unread articles." - (interactive) - (prog1 - (when (gnus-summary-first-subject t) - (gnus-summary-show-thread) - (gnus-summary-first-subject t) - (gnus-summary-display-article (gnus-summary-article-number))) - (gnus-summary-position-point))) - -(defun gnus-summary-first-unread-subject () - "Place the point on the subject line of the first unread article. -Return nil if there are no unread articles." - (interactive) - (prog1 - (when (gnus-summary-first-subject t) - (gnus-summary-show-thread) - (gnus-summary-first-subject t)) - (gnus-summary-position-point))) - -(defun gnus-summary-first-article () - "Select the first article. -Return nil if there are no articles." - (interactive) - (prog1 - (when (gnus-summary-first-subject) - (gnus-summary-show-thread) - (gnus-summary-first-subject) - (gnus-summary-display-article (gnus-summary-article-number))) - (gnus-summary-position-point))) - -(defun gnus-summary-best-unread-article () - "Select the unread article with the highest score." - (interactive) - (let ((best -1000000) - (data gnus-newsgroup-data) - article score) - (while data - (and (gnus-data-unread-p (car data)) - (> (setq score - (gnus-summary-article-score (gnus-data-number (car data)))) - best) - (setq best score - article (gnus-data-number (car data)))) - (setq data (cdr data))) - (prog1 - (if article - (gnus-summary-goto-article article) - (error "No unread articles")) - (gnus-summary-position-point)))) - -(defun gnus-summary-last-subject () - "Go to the last displayed subject line in the group." - (let ((article (gnus-data-number (car (gnus-data-list t))))) - (when article - (gnus-summary-goto-subject article)))) - -(defun gnus-summary-goto-article (article &optional all-headers force) - "Fetch ARTICLE (article number or Message-ID) and display it if it exists. -If ALL-HEADERS is non-nil, no header lines are hidden. -If FORCE, go to the article even if it isn't displayed. If FORCE -is a number, it is the line the article is to be displayed on." - (interactive - (list - (completing-read - "Article number or Message-ID: " - (mapcar (lambda (number) (list (int-to-string number))) - gnus-newsgroup-limit)) - current-prefix-arg - t)) - (prog1 - (if (and (stringp article) - (string-match "@" article)) - (gnus-summary-refer-article article) - (when (stringp article) - (setq article (string-to-number article))) - (if (gnus-summary-goto-subject article force) - (gnus-summary-display-article article all-headers) - (gnus-message 4 "Couldn't go to article %s" article) nil)) - (gnus-summary-position-point))) - -(defun gnus-summary-goto-last-article () - "Go to the previously read article." - (interactive) - (prog1 - (when gnus-last-article - (gnus-summary-goto-article gnus-last-article nil t)) - (gnus-summary-position-point))) - -(defun gnus-summary-pop-article (number) - "Pop one article off the history and go to the previous. -NUMBER articles will be popped off." - (interactive "p") - (let (to) - (setq gnus-newsgroup-history - (cdr (setq to (nthcdr number gnus-newsgroup-history)))) - (if to - (gnus-summary-goto-article (car to) nil t) - (error "Article history empty"))) - (gnus-summary-position-point)) - -;; Summary commands and functions for limiting the summary buffer. - -(defun gnus-summary-limit-to-articles (n) - "Limit the summary buffer to the next N articles. -If not given a prefix, use the process marked articles instead." - (interactive "P") - (prog1 - (let ((articles (gnus-summary-work-articles n))) - (setq gnus-newsgroup-processable nil) - (gnus-summary-limit articles)) - (gnus-summary-position-point))) - -(defun gnus-summary-pop-limit (&optional total) - "Restore the previous limit. -If given a prefix, remove all limits." - (interactive "P") - (when total - (setq gnus-newsgroup-limits - (list (mapcar (lambda (h) (mail-header-number h)) - gnus-newsgroup-headers)))) - (unless gnus-newsgroup-limits - (error "No limit to pop")) - (prog1 - (gnus-summary-limit nil 'pop) - (gnus-summary-position-point))) - -(defun gnus-summary-limit-to-subject (subject &optional header) - "Limit the summary buffer to articles that have subjects that match a regexp." - (interactive "sLimit to subject (regexp): ") - (unless header - (setq header "subject")) - (when (not (equal "" subject)) - (prog1 - (let ((articles (gnus-summary-find-matching - (or header "subject") subject 'all))) - (unless articles - (error "Found no matches for \"%s\"" subject)) - (gnus-summary-limit articles)) - (gnus-summary-position-point)))) - -(defun gnus-summary-limit-to-author (from) - "Limit the summary buffer to articles that have authors that match a regexp." - (interactive "sLimit to author (regexp): ") - (gnus-summary-limit-to-subject from "from")) - -(defun gnus-summary-limit-to-age (age &optional younger-p) - "Limit the summary buffer to articles that are older than (or equal) AGE days. -If YOUNGER-P (the prefix) is non-nil, limit the summary buffer to -articles that are younger than AGE days." - (interactive - (let ((younger current-prefix-arg) - (days-got nil) - days) - (while (not days-got) - (setq days (if younger - (read-string "Limit to articles within (in days): ") - (read-string "Limit to articles older than (in days): "))) - (when (> (length days) 0) - (setq days (read days))) - (if (numberp days) - (setq days-got t) - (message "Please enter a number.") - (sleep-for 1))) - (list days younger))) - (prog1 - (let ((data gnus-newsgroup-data) - (cutoff (days-to-time age)) - articles d date is-younger) - (while (setq d (pop data)) - (when (and (vectorp (gnus-data-header d)) - (setq date (mail-header-date (gnus-data-header d)))) - (setq is-younger (time-less-p - (time-since (condition-case () - (date-to-time date) - (error '(0 0)))) - cutoff)) - (when (if younger-p - is-younger - (not is-younger)) - (push (gnus-data-number d) articles)))) - (gnus-summary-limit (nreverse articles))) - (gnus-summary-position-point))) - -(defun gnus-summary-limit-to-extra (header regexp) - "Limit the summary buffer to articles that match an 'extra' header." - (interactive - (let ((header - (intern - (gnus-completing-read - (symbol-name (car gnus-extra-headers)) - "Limit extra header:" - (mapcar (lambda (x) - (cons (symbol-name x) x)) - gnus-extra-headers) - nil - t)))) - (list header - (read-string (format "Limit to header %s (regexp): " header))))) - (when (not (equal "" regexp)) - (prog1 - (let ((articles (gnus-summary-find-matching - (cons 'extra header) regexp 'all))) - (unless articles - (error "Found no matches for \"%s\"" regexp)) - (gnus-summary-limit articles)) - (gnus-summary-position-point)))) - -(defun gnus-summary-limit-to-display-predicate () - "Limit the summary buffer to the predicated in the `display' group parameter." - (interactive) - (unless gnus-newsgroup-display - (error "There is no `diplay' group parameter")) - (let (articles) - (dolist (number gnus-newsgroup-articles) - (when (funcall gnus-newsgroup-display) - (push number articles))) - (gnus-summary-limit articles)) - (gnus-summary-position-point)) - -(defalias 'gnus-summary-delete-marked-as-read 'gnus-summary-limit-to-unread) -(make-obsolete - 'gnus-summary-delete-marked-as-read 'gnus-summary-limit-to-unread) - -(defun gnus-summary-limit-to-unread (&optional all) - "Limit the summary buffer to articles that are not marked as read. -If ALL is non-nil, limit strictly to unread articles." - (interactive "P") - (if all - (gnus-summary-limit-to-marks (char-to-string gnus-unread-mark)) - (gnus-summary-limit-to-marks - ;; Concat all the marks that say that an article is read and have - ;; those removed. - (list gnus-del-mark gnus-read-mark gnus-ancient-mark - gnus-killed-mark gnus-kill-file-mark - gnus-low-score-mark gnus-expirable-mark - gnus-canceled-mark gnus-catchup-mark gnus-sparse-mark - gnus-duplicate-mark gnus-souped-mark) - 'reverse))) - -(defalias 'gnus-summary-delete-marked-with 'gnus-summary-limit-exclude-marks) -(make-obsolete 'gnus-summary-delete-marked-with - 'gnus-summary-limit-exlude-marks) - -(defun gnus-summary-limit-exclude-marks (marks &optional reverse) - "Exclude articles that are marked with MARKS (e.g. \"DK\"). -If REVERSE, limit the summary buffer to articles that are marked -with MARKS. MARKS can either be a string of marks or a list of marks. -Returns how many articles were removed." - (interactive "sMarks: ") - (gnus-summary-limit-to-marks marks t)) - -(defun gnus-summary-limit-to-marks (marks &optional reverse) - "Limit the summary buffer to articles that are marked with MARKS (e.g. \"DK\"). -If REVERSE (the prefix), limit the summary buffer to articles that are -not marked with MARKS. MARKS can either be a string of marks or a -list of marks. -Returns how many articles were removed." - (interactive "sMarks: \nP") - (prog1 - (let ((data gnus-newsgroup-data) - (marks (if (listp marks) marks - (append marks nil))) ; Transform to list. - articles) - (while data - (when (if reverse (not (memq (gnus-data-mark (car data)) marks)) - (memq (gnus-data-mark (car data)) marks)) - (push (gnus-data-number (car data)) articles)) - (setq data (cdr data))) - (gnus-summary-limit articles)) - (gnus-summary-position-point))) - -(defun gnus-summary-limit-to-score (&optional score) - "Limit to articles with score at or above SCORE." - (interactive "P") - (setq score (if score - (prefix-numeric-value score) - (or gnus-summary-default-score 0))) - (let ((data gnus-newsgroup-data) - articles) - (while data - (when (>= (gnus-summary-article-score (gnus-data-number (car data))) - score) - (push (gnus-data-number (car data)) articles)) - (setq data (cdr data))) - (prog1 - (gnus-summary-limit articles) - (gnus-summary-position-point)))) - -(defun gnus-summary-limit-include-thread (id) - "Display all the hidden articles that is in the thread with ID in it. -When called interactively, ID is the Message-ID of the current -article." - (interactive (list (mail-header-id (gnus-summary-article-header)))) - (let ((articles (gnus-articles-in-thread - (gnus-id-to-thread (gnus-root-id id))))) - (prog1 - (gnus-summary-limit (nconc articles gnus-newsgroup-limit)) - (gnus-summary-limit-include-matching-articles - "subject" - (regexp-quote (gnus-simplify-subject-re - (mail-header-subject (gnus-id-to-header id))))) - (gnus-summary-position-point)))) - -(defun gnus-summary-limit-include-matching-articles (header regexp) - "Display all the hidden articles that have HEADERs that match REGEXP." - (interactive (list (read-string "Match on header: ") - (read-string "Regexp: "))) - (let ((articles (gnus-find-matching-articles header regexp))) - (prog1 - (gnus-summary-limit (nconc articles gnus-newsgroup-limit)) - (gnus-summary-position-point)))) - -(defun gnus-summary-limit-include-dormant () - "Display all the hidden articles that are marked as dormant. -Note that this command only works on a subset of the articles currently -fetched for this group." - (interactive) - (unless gnus-newsgroup-dormant - (error "There are no dormant articles in this group")) - (prog1 - (gnus-summary-limit (append gnus-newsgroup-dormant gnus-newsgroup-limit)) - (gnus-summary-position-point))) - -(defun gnus-summary-limit-exclude-dormant () - "Hide all dormant articles." - (interactive) - (prog1 - (gnus-summary-limit-to-marks (list gnus-dormant-mark) 'reverse) - (gnus-summary-position-point))) - -(defun gnus-summary-limit-exclude-childless-dormant () - "Hide all dormant articles that have no children." - (interactive) - (let ((data (gnus-data-list t)) - articles d children) - ;; Find all articles that are either not dormant or have - ;; children. - (while (setq d (pop data)) - (when (or (not (= (gnus-data-mark d) gnus-dormant-mark)) - (and (setq children - (gnus-article-children (gnus-data-number d))) - (let (found) - (while children - (when (memq (car children) articles) - (setq children nil - found t)) - (pop children)) - found))) - (push (gnus-data-number d) articles))) - ;; Do the limiting. - (prog1 - (gnus-summary-limit articles) - (gnus-summary-position-point)))) - -(defun gnus-summary-limit-mark-excluded-as-read (&optional all) - "Mark all unread excluded articles as read. -If ALL, mark even excluded ticked and dormants as read." - (interactive "P") - (let ((articles (gnus-sorted-complement - (sort - (mapcar (lambda (h) (mail-header-number h)) - gnus-newsgroup-headers) - '<) - (sort gnus-newsgroup-limit '<))) - article) - (setq gnus-newsgroup-unreads - (gnus-intersection gnus-newsgroup-unreads gnus-newsgroup-limit)) - (if all - (setq gnus-newsgroup-dormant nil - gnus-newsgroup-marked nil - gnus-newsgroup-reads - (nconc - (mapcar (lambda (n) (cons n gnus-catchup-mark)) articles) - gnus-newsgroup-reads)) - (while (setq article (pop articles)) - (unless (or (memq article gnus-newsgroup-dormant) - (memq article gnus-newsgroup-marked)) - (push (cons article gnus-catchup-mark) gnus-newsgroup-reads)))))) - -(defun gnus-summary-limit (articles &optional pop) - (if pop - ;; We pop the previous limit off the stack and use that. - (setq articles (car gnus-newsgroup-limits) - gnus-newsgroup-limits (cdr gnus-newsgroup-limits)) - ;; We use the new limit, so we push the old limit on the stack. - (push gnus-newsgroup-limit gnus-newsgroup-limits)) - ;; Set the limit. - (setq gnus-newsgroup-limit articles) - (let ((total (length gnus-newsgroup-data)) - (data (gnus-data-find-list (gnus-summary-article-number))) - (gnus-summary-mark-below nil) ; Inhibit this. - found) - ;; This will do all the work of generating the new summary buffer - ;; according to the new limit. - (gnus-summary-prepare) - ;; Hide any threads, possibly. - (and gnus-show-threads - gnus-thread-hide-subtree - (gnus-summary-hide-all-threads)) - ;; Try to return to the article you were at, or one in the - ;; neighborhood. - (when data - ;; We try to find some article after the current one. - (while data - (when (gnus-summary-goto-subject (gnus-data-number (car data)) nil t) - (setq data nil - found t)) - (setq data (cdr data)))) - (unless found - ;; If there is no data, that means that we were after the last - ;; article. The same goes when we can't find any articles - ;; after the current one. - (goto-char (point-max)) - (gnus-summary-find-prev)) - (gnus-set-mode-line 'summary) - ;; We return how many articles were removed from the summary - ;; buffer as a result of the new limit. - (- total (length gnus-newsgroup-data)))) - -(defsubst gnus-invisible-cut-children (threads) - (let ((num 0)) - (while threads - (when (memq (mail-header-number (caar threads)) gnus-newsgroup-limit) - (incf num)) - (pop threads)) - (< num 2))) - -(defsubst gnus-cut-thread (thread) - "Go forwards in the thread until we find an article that we want to display." - (when (or (eq gnus-fetch-old-headers 'some) - (eq gnus-fetch-old-headers 'invisible) - (numberp gnus-fetch-old-headers) - (eq gnus-build-sparse-threads 'some) - (eq gnus-build-sparse-threads 'more)) - ;; Deal with old-fetched headers and sparse threads. - (while (and - thread - (or - (gnus-summary-article-sparse-p (mail-header-number (car thread))) - (gnus-summary-article-ancient-p - (mail-header-number (car thread)))) - (if (or (<= (length (cdr thread)) 1) - (eq gnus-fetch-old-headers 'invisible)) - (setq gnus-newsgroup-limit - (delq (mail-header-number (car thread)) - gnus-newsgroup-limit) - thread (cadr thread)) - (when (gnus-invisible-cut-children (cdr thread)) - (let ((th (cdr thread))) - (while th - (if (memq (mail-header-number (caar th)) - gnus-newsgroup-limit) - (setq thread (car th) - th nil) - (setq th (cdr th)))))))))) - thread) - -(defun gnus-cut-threads (threads) - "Cut off all uninteresting articles from the beginning of threads." - (when (or (eq gnus-fetch-old-headers 'some) - (eq gnus-fetch-old-headers 'invisible) - (numberp gnus-fetch-old-headers) - (eq gnus-build-sparse-threads 'some) - (eq gnus-build-sparse-threads 'more)) - (let ((th threads)) - (while th - (setcar th (gnus-cut-thread (car th))) - (setq th (cdr th))))) - ;; Remove nixed out threads. - (delq nil threads)) - -(defun gnus-summary-initial-limit (&optional show-if-empty) - "Figure out what the initial limit is supposed to be on group entry. -This entails weeding out unwanted dormants, low-scored articles, -fetch-old-headers verbiage, and so on." - ;; Most groups have nothing to remove. - (if (or gnus-inhibit-limiting - (and (null gnus-newsgroup-dormant) - (eq gnus-newsgroup-display 'gnus-not-ignore) - (not (eq gnus-fetch-old-headers 'some)) - (not (numberp gnus-fetch-old-headers)) - (not (eq gnus-fetch-old-headers 'invisible)) - (null gnus-summary-expunge-below) - (not (eq gnus-build-sparse-threads 'some)) - (not (eq gnus-build-sparse-threads 'more)) - (null gnus-thread-expunge-below) - (not gnus-use-nocem))) - () ; Do nothing. - (push gnus-newsgroup-limit gnus-newsgroup-limits) - (setq gnus-newsgroup-limit nil) - (mapatoms - (lambda (node) - (unless (car (symbol-value node)) - ;; These threads have no parents -- they are roots. - (let ((nodes (cdr (symbol-value node))) - thread) - (while nodes - (if (and gnus-thread-expunge-below - (< (gnus-thread-total-score (car nodes)) - gnus-thread-expunge-below)) - (gnus-expunge-thread (pop nodes)) - (setq thread (pop nodes)) - (gnus-summary-limit-children thread)))))) - gnus-newsgroup-dependencies) - ;; If this limitation resulted in an empty group, we might - ;; pop the previous limit and use it instead. - (when (and (not gnus-newsgroup-limit) - show-if-empty) - (setq gnus-newsgroup-limit (pop gnus-newsgroup-limits))) - gnus-newsgroup-limit)) - -(defun gnus-summary-limit-children (thread) - "Return 1 if this subthread is visible and 0 if it is not." - ;; First we get the number of visible children to this thread. This - ;; is done by recursing down the thread using this function, so this - ;; will really go down to a leaf article first, before slowly - ;; working its way up towards the root. - (when thread - (let ((children - (if (cdr thread) - (apply '+ (mapcar 'gnus-summary-limit-children - (cdr thread))) - 0)) - (number (mail-header-number (car thread))) - score) - (if (and - (not (memq number gnus-newsgroup-marked)) - (or - ;; If this article is dormant and has absolutely no visible - ;; children, then this article isn't visible. - (and (memq number gnus-newsgroup-dormant) - (zerop children)) - ;; If this is "fetch-old-headered" and there is no - ;; visible children, then we don't want this article. - (and (or (eq gnus-fetch-old-headers 'some) - (numberp gnus-fetch-old-headers)) - (gnus-summary-article-ancient-p number) - (zerop children)) - ;; If this is "fetch-old-headered" and `invisible', then - ;; we don't want this article. - (and (eq gnus-fetch-old-headers 'invisible) - (gnus-summary-article-ancient-p number)) - ;; If this is a sparsely inserted article with no children, - ;; we don't want it. - (and (eq gnus-build-sparse-threads 'some) - (gnus-summary-article-sparse-p number) - (zerop children)) - ;; If we use expunging, and this article is really - ;; low-scored, then we don't want this article. - (when (and gnus-summary-expunge-below - (< (setq score - (or (cdr (assq number gnus-newsgroup-scored)) - gnus-summary-default-score)) - gnus-summary-expunge-below)) - ;; We increase the expunge-tally here, but that has - ;; nothing to do with the limits, really. - (incf gnus-newsgroup-expunged-tally) - ;; We also mark as read here, if that's wanted. - (when (and gnus-summary-mark-below - (< score gnus-summary-mark-below)) - (setq gnus-newsgroup-unreads - (delq number gnus-newsgroup-unreads)) - (if gnus-newsgroup-auto-expire - (push number gnus-newsgroup-expirable) - (push (cons number gnus-low-score-mark) - gnus-newsgroup-reads))) - t) - ;; Do the `display' group parameter. - (and gnus-newsgroup-display - (not (funcall gnus-newsgroup-display))) - ;; Check NoCeM things. - (if (and gnus-use-nocem - (gnus-nocem-unwanted-article-p - (mail-header-id (car thread)))) - (progn - (setq gnus-newsgroup-unreads - (delq number gnus-newsgroup-unreads)) - t)))) - ;; Nope, invisible article. - 0 - ;; Ok, this article is to be visible, so we add it to the limit - ;; and return 1. - (push number gnus-newsgroup-limit) - 1)))) - -(defun gnus-expunge-thread (thread) - "Mark all articles in THREAD as read." - (let* ((number (mail-header-number (car thread)))) - (incf gnus-newsgroup-expunged-tally) - ;; We also mark as read here, if that's wanted. - (setq gnus-newsgroup-unreads - (delq number gnus-newsgroup-unreads)) - (if gnus-newsgroup-auto-expire - (push number gnus-newsgroup-expirable) - (push (cons number gnus-low-score-mark) - gnus-newsgroup-reads))) - ;; Go recursively through all subthreads. - (mapcar 'gnus-expunge-thread (cdr thread))) - -;; Summary article oriented commands - -(defun gnus-summary-refer-parent-article (n) - "Refer parent article N times. -If N is negative, go to ancestor -N instead. -The difference between N and the number of articles fetched is returned." - (interactive "p") - (let ((skip 1) - error header ref) - (when (not (natnump n)) - (setq skip (abs n) - n 1)) - (while (and (> n 0) - (not error)) - (setq header (gnus-summary-article-header)) - (if (and (eq (mail-header-number header) - (cdr gnus-article-current)) - (equal gnus-newsgroup-name - (car gnus-article-current))) - ;; If we try to find the parent of the currently - ;; displayed article, then we take a look at the actual - ;; References header, since this is slightly more - ;; reliable than the References field we got from the - ;; server. - (save-excursion - (set-buffer gnus-original-article-buffer) - (nnheader-narrow-to-headers) - (unless (setq ref (message-fetch-field "references")) - (setq ref (message-fetch-field "in-reply-to"))) - (widen)) - (setq ref - ;; It's not the current article, so we take a bet on - ;; the value we got from the server. - (mail-header-references header))) - (if (and ref - (not (equal ref ""))) - (unless (gnus-summary-refer-article (gnus-parent-id ref skip)) - (gnus-message 1 "Couldn't find parent")) - (gnus-message 1 "No references in article %d" - (gnus-summary-article-number)) - (setq error t)) - (decf n)) - (gnus-summary-position-point) - n)) - -(defun gnus-summary-refer-references () - "Fetch all articles mentioned in the References header. -Return the number of articles fetched." - (interactive) - (let ((ref (mail-header-references (gnus-summary-article-header))) - (current (gnus-summary-article-number)) - (n 0)) - (if (or (not ref) - (equal ref "")) - (error "No References in the current article") - ;; For each Message-ID in the References header... - (while (string-match "<[^>]*>" ref) - (incf n) - ;; ... fetch that article. - (gnus-summary-refer-article - (prog1 (match-string 0 ref) - (setq ref (substring ref (match-end 0)))))) - (gnus-summary-goto-subject current) - (gnus-summary-position-point) - n))) - -(defun gnus-summary-refer-thread (&optional limit) - "Fetch all articles in the current thread. -If LIMIT (the numerical prefix), fetch that many old headers instead -of what's specified by the `gnus-refer-thread-limit' variable." - (interactive "P") - (let ((id (mail-header-id (gnus-summary-article-header))) - (limit (if limit (prefix-numeric-value limit) - gnus-refer-thread-limit))) - ;; We want to fetch LIMIT *old* headers, but we also have to - ;; re-fetch all the headers in the current buffer, because many of - ;; them may be undisplayed. So we adjust LIMIT. - (when (numberp limit) - (incf limit (- gnus-newsgroup-end gnus-newsgroup-begin))) - (unless (eq gnus-fetch-old-headers 'invisible) - (gnus-message 5 "Fetching headers for %s..." gnus-newsgroup-name) - ;; Retrieve the headers and read them in. - (if (eq (gnus-retrieve-headers - (list gnus-newsgroup-end) gnus-newsgroup-name limit) - 'nov) - (gnus-build-all-threads) - (error "Can't fetch thread from backends that don't support NOV")) - (gnus-message 5 "Fetching headers for %s...done" gnus-newsgroup-name)) - (gnus-summary-limit-include-thread id))) - -(defun gnus-summary-refer-article (message-id) - "Fetch an article specified by MESSAGE-ID." - (interactive "sMessage-ID: ") - (when (and (stringp message-id) - (not (zerop (length message-id)))) - ;; Construct the correct Message-ID if necessary. - ;; Suggested by tale@pawl.rpi.edu. - (unless (string-match "^<" message-id) - (setq message-id (concat "<" message-id))) - (unless (string-match ">$" message-id) - (setq message-id (concat message-id ">"))) - (let* ((header (gnus-id-to-header message-id)) - (sparse (and header - (gnus-summary-article-sparse-p - (mail-header-number header)) - (memq (mail-header-number header) - gnus-newsgroup-limit))) - number) - (cond - ;; If the article is present in the buffer we just go to it. - ((and header - (or (not (gnus-summary-article-sparse-p - (mail-header-number header))) - sparse)) - (prog1 - (gnus-summary-goto-article - (mail-header-number header) nil t) - (when sparse - (gnus-summary-update-article (mail-header-number header))))) - (t - ;; We fetch the article. - (catch 'found - (dolist (gnus-override-method (gnus-refer-article-methods)) - (gnus-check-server gnus-override-method) - ;; Fetch the header, and display the article. - (when (setq number (gnus-summary-insert-subject message-id)) - (gnus-summary-select-article nil nil nil number) - (throw 'found t))) - (gnus-message 3 "Couldn't fetch article %s" message-id))))))) - -(defun gnus-refer-article-methods () - "Return a list of referrable methods." - (cond - ;; No method, so we default to current and native. - ((null gnus-refer-article-method) - (list gnus-current-select-method gnus-select-method)) - ;; Current. - ((eq 'current gnus-refer-article-method) - (list gnus-current-select-method)) - ;; List of select methods. - ((not (and (symbolp (car gnus-refer-article-method)) - (assq (car gnus-refer-article-method) nnoo-definition-alist))) - (let (out) - (dolist (method gnus-refer-article-method) - (push (if (eq 'current method) - gnus-current-select-method - method) - out)) - (nreverse out))) - ;; One single select method. - (t - (list gnus-refer-article-method)))) - -(defun gnus-summary-edit-parameters () - "Edit the group parameters of the current group." - (interactive) - (gnus-group-edit-group gnus-newsgroup-name 'params)) - -(defun gnus-summary-customize-parameters () - "Customize the group parameters of the current group." - (interactive) - (gnus-group-customize gnus-newsgroup-name)) - -(defun gnus-summary-enter-digest-group (&optional force) - "Enter an nndoc group based on the current article. -If FORCE, force a digest interpretation. If not, try -to guess what the document format is." - (interactive "P") - (let ((conf gnus-current-window-configuration)) - (save-excursion - (gnus-summary-select-article)) - (setq gnus-current-window-configuration conf) - (let* ((name (format "%s-%d" - (gnus-group-prefixed-name - gnus-newsgroup-name (list 'nndoc "")) - (save-excursion - (set-buffer gnus-summary-buffer) - gnus-current-article))) - (ogroup gnus-newsgroup-name) - (params (append (gnus-info-params (gnus-get-info ogroup)) - (list (cons 'to-group ogroup)) - (list (cons 'save-article-group ogroup)))) - (case-fold-search t) - (buf (current-buffer)) - dig to-address) - (save-excursion - (set-buffer gnus-original-article-buffer) - ;; Have the digest group inherit the main mail address of - ;; the parent article. - (when (setq to-address (or (message-fetch-field "reply-to") - (message-fetch-field "from"))) - (setq params (append - (list (cons 'to-address - (funcall gnus-decode-encoded-word-function - to-address)))))) - (setq dig (nnheader-set-temp-buffer " *gnus digest buffer*")) - (insert-buffer-substring gnus-original-article-buffer) - ;; Remove lines that may lead nndoc to misinterpret the - ;; document type. - (narrow-to-region - (goto-char (point-min)) - (or (search-forward "\n\n" nil t) (point))) - (goto-char (point-min)) - (delete-matching-lines "^Path:\\|^From ") - (widen)) - (unwind-protect - (if (let ((gnus-newsgroup-ephemeral-charset gnus-newsgroup-charset) - (gnus-newsgroup-ephemeral-ignored-charsets - gnus-newsgroup-ignored-charsets)) - (gnus-group-read-ephemeral-group - name `(nndoc ,name (nndoc-address ,(get-buffer dig)) - (nndoc-article-type - ,(if force 'mbox 'guess))) t)) - ;; Make all postings to this group go to the parent group. - (nconc (gnus-info-params (gnus-get-info name)) - params) - ;; Couldn't select this doc group. - (switch-to-buffer buf) - (gnus-set-global-variables) - (gnus-configure-windows 'summary) - (gnus-message 3 "Article couldn't be entered?")) - (kill-buffer dig))))) - -(defun gnus-summary-read-document (n) - "Open a new group based on the current article(s). -This will allow you to read digests and other similar -documents as newsgroups. -Obeys the standard process/prefix convention." - (interactive "P") - (let* ((articles (gnus-summary-work-articles n)) - (ogroup gnus-newsgroup-name) - (params (append (gnus-info-params (gnus-get-info ogroup)) - (list (cons 'to-group ogroup)))) - article group egroup groups vgroup) - (while (setq article (pop articles)) - (setq group (format "%s-%d" gnus-newsgroup-name article)) - (gnus-summary-remove-process-mark article) - (when (gnus-summary-display-article article) - (save-excursion - (with-temp-buffer - (insert-buffer-substring gnus-original-article-buffer) - ;; Remove some headers that may lead nndoc to make - ;; the wrong guess. - (message-narrow-to-head) - (goto-char (point-min)) - (delete-matching-lines "^\\(Path\\):\\|^From ") - (widen) - (if (setq egroup - (gnus-group-read-ephemeral-group - group `(nndoc ,group (nndoc-address ,(current-buffer)) - (nndoc-article-type guess)) - t nil t)) - (progn - ;; Make all postings to this group go to the parent group. - (nconc (gnus-info-params (gnus-get-info egroup)) - params) - (push egroup groups)) - ;; Couldn't select this doc group. - (gnus-error 3 "Article couldn't be entered")))))) - ;; Now we have selected all the documents. - (cond - ((not groups) - (error "None of the articles could be interpreted as documents")) - ((gnus-group-read-ephemeral-group - (setq vgroup (format - "nnvirtual:%s-%s" gnus-newsgroup-name - (format-time-string "%Y%m%dT%H%M%S" (current-time)))) - `(nnvirtual ,vgroup (nnvirtual-component-groups ,groups)) - t - (cons (current-buffer) 'summary))) - (t - (error "Couldn't select virtual nndoc group"))))) - -(defun gnus-summary-isearch-article (&optional regexp-p) - "Do incremental search forward on the current article. -If REGEXP-P (the prefix) is non-nil, do regexp isearch." - (interactive "P") - (let* ((gnus-inhibit-treatment t) - (old (gnus-summary-select-article))) - (gnus-configure-windows 'article) - (gnus-eval-in-buffer-window gnus-article-buffer - (save-restriction - (widen) - (when (eq 'old old) - (gnus-article-show-all-headers)) - (goto-char (point-min)) - (isearch-forward regexp-p))))) - -(defun gnus-summary-search-article-forward (regexp &optional backward) - "Search for an article containing REGEXP forward. -If BACKWARD, search backward instead." - (interactive - (list (read-string - (format "Search article %s (regexp%s): " - (if current-prefix-arg "backward" "forward") - (if gnus-last-search-regexp - (concat ", default " gnus-last-search-regexp) - ""))) - current-prefix-arg)) - (if (string-equal regexp "") - (setq regexp (or gnus-last-search-regexp "")) - (setq gnus-last-search-regexp regexp) - (setq gnus-article-before-search gnus-current-article)) - ;; Intentionally set gnus-last-article. - (setq gnus-last-article gnus-article-before-search) - (let ((gnus-last-article gnus-last-article)) - (if (gnus-summary-search-article regexp backward) - (gnus-summary-show-thread) - (error "Search failed: \"%s\"" regexp)))) - -(defun gnus-summary-search-article-backward (regexp) - "Search for an article containing REGEXP backward." - (interactive - (list (read-string - (format "Search article backward (regexp%s): " - (if gnus-last-search-regexp - (concat ", default " gnus-last-search-regexp) - ""))))) - (gnus-summary-search-article-forward regexp 'backward)) - -(eval-when-compile - (defmacro gnus-summary-search-article-position-point (regexp backward) - "Dehighlight the last matched text and goto the beginning position." - (` (if (and gnus-summary-search-article-matched-data - (let ((text (caddr gnus-summary-search-article-matched-data)) - (inhibit-read-only t) - buffer-read-only) - (delete-region - (goto-char (car gnus-summary-search-article-matched-data)) - (cadr gnus-summary-search-article-matched-data)) - (insert text) - (string-match (, regexp) text))) - (if (, backward) (beginning-of-line) (end-of-line)) - (goto-char (if (, backward) (point-max) (point-min)))))) - - (defmacro gnus-summary-search-article-highlight-goto-x-face (opoint) - "Place point where X-Face image is displayed." - (if (featurep 'xemacs) - (` (let ((end (if (search-forward "\n\n" nil t) - (goto-char (1- (point))) - (point-min))) - extent) - (or (search-backward "\n\n" nil t) (goto-char (point-min))) - (unless (and (re-search-forward "^From:" end t) - (setq extent (extent-at (point))) - (extent-begin-glyph extent)) - (goto-char (, opoint))))) - (` (let ((end (if (search-forward "\n\n" nil t) - (goto-char (1- (point))) - (point-min))) - (start (or (search-backward "\n\n" nil t) (point-min)))) - (goto-char - (or (text-property-any start end 'x-face-image t);; x-face-e21 - (text-property-any start end 'x-face-mule-bitmap-image t) - (, opoint))))))) - - (defmacro gnus-summary-search-article-highlight-matched-text - (backward treated x-face) - "Highlight matched text in the function `gnus-summary-search-article'." - (` (let ((start (set-marker (make-marker) (match-beginning 0))) - (end (set-marker (make-marker) (match-end 0))) - (inhibit-read-only t) - buffer-read-only) - (unless treated - (let ((,@ - (let ((items (mapcar 'car gnus-treatment-function-alist))) - (mapcar - (lambda (item) (setq items (delq item items))) - '(gnus-treat-buttonize - gnus-treat-fill-article - gnus-treat-fill-long-lines - gnus-treat-emphasize - gnus-treat-highlight-headers - gnus-treat-highlight-citation - gnus-treat-highlight-signature - gnus-treat-overstrike - gnus-treat-display-xface - gnus-treat-buttonize-head - gnus-treat-decode-article-as-default-mime-charset)) - (static-if (featurep 'xemacs) - items - (cons '(x-face-mule-delete-x-face-field - (quote never)) - items)))) - (gnus-treat-display-xface - (when (, x-face) gnus-treat-display-xface))) - (gnus-article-prepare-mime-display))) - (goto-char (if (, backward) start end)) - (when (, x-face) - (gnus-summary-search-article-highlight-goto-x-face (point))) - (setq gnus-summary-search-article-matched-data - (list start end (buffer-substring start end))) - (unless (eq start end);; matched text has been deleted. :-< - (put-text-property start end 'face - (or (find-face 'isearch) - 'secondary-selection)))))) - ) - -(defun gnus-summary-search-article (regexp &optional backward) - "Search for an article containing REGEXP. -Optional argument BACKWARD means do search for backward. -`gnus-select-article-hook' is not called during the search." - ;; We have to require this here to make sure that the following - ;; dynamic binding isn't shadowed by autoloading. - (require 'gnus-async) - (require 'gnus-art) - (let ((gnus-select-article-hook nil) ;Disable hook. - (gnus-article-prepare-hook nil) - (gnus-mark-article-hook nil) ;Inhibit marking as read. - (gnus-use-article-prefetch nil) - (gnus-xmas-force-redisplay nil) ;Inhibit XEmacs redisplay. - (gnus-use-trees nil) ;Inhibit updating tree buffer. - (sum (current-buffer)) - (found nil) - point treated) - (gnus-save-hidden-threads - (static-if (featurep 'xemacs) - (let ((gnus-inhibit-treatment t)) - (setq treated (eq 'old (gnus-summary-select-article))) - (when (and treated - (not (and (gnus-buffer-live-p gnus-article-buffer) - (window-live-p (get-buffer-window - gnus-article-buffer t))))) - (gnus-summary-select-article nil t) - (setq treated nil))) - (let ((gnus-inhibit-treatment t) - (x-face-mule-delete-x-face-field 'never)) - (setq treated (eq 'old (gnus-summary-select-article))) - (when (and treated - (not - (and (gnus-buffer-live-p gnus-article-buffer) - (window-live-p (get-buffer-window - gnus-article-buffer t)) - (or (not (string-match "^\\^X-Face:" regexp)) - (with-current-buffer gnus-article-buffer - gnus-summary-search-article-matched-data))))) - (gnus-summary-select-article nil t) - (setq treated nil)))) - (set-buffer gnus-article-buffer) - (widen) - (if treated - (progn - (gnus-article-show-all-headers) - (gnus-summary-search-article-position-point regexp backward)) - (goto-char (if backward (point-max) (point-min)))) - (while (not found) - (gnus-message 7 "Searching article: %d..." (cdr gnus-article-current)) - (if (if backward - (re-search-backward regexp nil t) - (re-search-forward regexp nil t)) - ;; We found the regexp. - (progn - (gnus-summary-search-article-highlight-matched-text - backward treated (string-match "^\\^X-Face:" regexp)) - (setq found 'found) - (forward-line - (/ (- 2 (window-height - (get-buffer-window gnus-article-buffer t))) - 2)) - (set-window-start - (get-buffer-window (current-buffer)) - (point)) - (set-buffer sum) - (setq point (point))) - ;; We didn't find it, so we go to the next article. - (set-buffer sum) - (setq found 'not) - (while (eq found 'not) - (if (not (if backward (gnus-summary-find-prev) - (gnus-summary-find-next))) - ;; No more articles. - (setq found t) - ;; Select the next article and adjust point. - (unless (gnus-summary-article-sparse-p - (gnus-summary-article-number)) - (setq found nil) - (let ((gnus-inhibit-treatment t)) - (gnus-summary-select-article)) - (setq treated nil) - (set-buffer gnus-article-buffer) - (widen) - (goto-char (if backward (point-max) (point-min)))))))) - (gnus-message 7 "")) - ;; Return whether we found the regexp. - (when (eq found 'found) - (goto-char point) - (gnus-summary-show-thread) - (gnus-summary-goto-subject gnus-current-article) - (gnus-summary-position-point) - t))) - -(defun gnus-find-matching-articles (header regexp) - "Return a list of all articles that match REGEXP on HEADER. -This search includes all articles in the current group that Gnus has -fetched headers for, whether they are displayed or not." - (let ((articles nil) - (func `(lambda (h) (,(intern (concat "mail-header-" header)) h))) - (case-fold-search t)) - (dolist (header gnus-newsgroup-headers) - (when (string-match regexp (funcall func header)) - (push (mail-header-number header) articles))) - (nreverse articles))) - -(defun gnus-summary-find-matching (header regexp &optional backward unread - not-case-fold) - "Return a list of all articles that match REGEXP on HEADER. -The search stars on the current article and goes forwards unless -BACKWARD is non-nil. If BACKWARD is `all', do all articles. -If UNREAD is non-nil, only unread articles will -be taken into consideration. If NOT-CASE-FOLD, case won't be folded -in the comparisons." - (let ((case-fold-search (not not-case-fold)) - articles d func) - (if (consp header) - (if (eq (car header) 'extra) - (setq func - `(lambda (h) - (or (cdr (assq ',(cdr header) (mail-header-extra h))) - ""))) - (error "%s is an invalid header" header)) - (unless (fboundp (intern (concat "mail-header-" header))) - (error "%s is not a valid header" header)) - (setq func `(lambda (h) (,(intern (concat "mail-header-" header)) h)))) - (dolist (d (if (eq backward 'all) - gnus-newsgroup-data - (gnus-data-find-list - (gnus-summary-article-number) - (gnus-data-list backward)))) - (when (and (or (not unread) ; We want all articles... - (gnus-data-unread-p d)) ; Or just unreads. - (vectorp (gnus-data-header d)) ; It's not a pseudo. - (string-match regexp - (funcall func (gnus-data-header d)))) ; Match. - (push (gnus-data-number d) articles))) ; Success! - (nreverse articles))) - -(defun gnus-summary-execute-command (header regexp command &optional backward) - "Search forward for an article whose HEADER matches REGEXP and execute COMMAND. -If HEADER is an empty string (or nil), the match is done on the entire -article. If BACKWARD (the prefix) is non-nil, search backward instead." - (interactive - (list (let ((completion-ignore-case t)) - (completing-read - "Header name: " - (mapcar (lambda (header) (list (format "%s" header))) - (append - '("Number" "Subject" "From" "Lines" "Date" - "Message-ID" "Xref" "References" "Body") - gnus-extra-headers)) - nil 'require-match)) - (read-string "Regexp: ") - (read-key-sequence "Command: ") - current-prefix-arg)) - (when (equal header "Body") - (setq header "")) - ;; Hidden thread subtrees must be searched as well. - (gnus-summary-show-all-threads) - ;; We don't want to change current point nor window configuration. - (save-excursion - (save-window-excursion - (gnus-message 6 "Executing %s..." (key-description command)) - ;; We'd like to execute COMMAND interactively so as to give arguments. - (gnus-execute header regexp - `(call-interactively ',(key-binding command)) - backward) - (gnus-message 6 "Executing %s...done" (key-description command))))) - -(defun gnus-summary-beginning-of-article () - "Scroll the article back to the beginning." - (interactive) - (gnus-summary-select-article) - (gnus-configure-windows 'article) - (gnus-eval-in-buffer-window gnus-article-buffer - (widen) - (goto-char (point-min)) - (when gnus-page-broken - (gnus-narrow-to-page)))) - -(defun gnus-summary-end-of-article () - "Scroll to the end of the article." - (interactive) - (gnus-summary-select-article) - (gnus-configure-windows 'article) - (gnus-eval-in-buffer-window gnus-article-buffer - (widen) - (goto-char (point-max)) - (recenter -3) - (when gnus-page-broken - (gnus-narrow-to-page)))) - -(defun gnus-summary-print-article (&optional filename n) - "Generate and print a PostScript image of the N next (mail) articles. - -If N is negative, print the N previous articles. If N is nil and articles -have been marked with the process mark, print these instead. - -If the optional first argument FILENAME is nil, send the image to the -printer. If FILENAME is a string, save the PostScript image in a file with -that name. If FILENAME is a number, prompt the user for the name of the file -to save in." - (interactive (list (ps-print-preprint current-prefix-arg))) - (dolist (article (gnus-summary-work-articles n)) - (gnus-summary-select-article nil nil 'pseudo article) - (gnus-eval-in-buffer-window gnus-article-buffer - (let ((buffer (generate-new-buffer " *print*"))) - (unwind-protect - (progn - (copy-to-buffer buffer (point-min) (point-max)) - (set-buffer buffer) - (gnus-article-delete-invisible-text) - (when (gnus-visual-p 'article-highlight 'highlight) - ;; Copy-to-buffer doesn't copy overlay. So redo - ;; highlight. - (let ((gnus-article-buffer buffer)) - (gnus-article-highlight-citation t) - (gnus-article-highlight-signature))) - (let ((ps-left-header - (list - (concat "(" - (mail-header-subject gnus-current-headers) ")") - (concat "(" - (mail-header-from gnus-current-headers) ")"))) - (ps-right-header - (list - "/pagenumberstring load" - (concat "(" - (mail-header-date gnus-current-headers) ")")))) - (gnus-run-hooks 'gnus-ps-print-hook) - (save-excursion - (if window-system - (ps-spool-buffer-with-faces) - (ps-spool-buffer))))) - (kill-buffer buffer)))) - (gnus-summary-remove-process-mark article)) - (ps-despool filename)) - -(defun gnus-summary-show-article (&optional arg) - "Force re-fetching of the current article. -If ARG (the prefix) is a number, show the article with the charset -defined in `gnus-summary-show-article-charset-alist', or the charset -input. -If ARG (the prefix) is non-nil and not a number, show the raw article -without any article massaging functions being run." - (interactive "P") - (cond - ((numberp arg) - (gnus-summary-show-article t) - (let ((gnus-newsgroup-charset - (or (cdr (assq arg gnus-summary-show-article-charset-alist)) - (mm-read-coding-system - "View as charset: " - (save-excursion - (set-buffer gnus-article-buffer) - (detect-coding-region (point) (point-max) t))))) - (gnus-newsgroup-ignored-charsets 'gnus-all)) - (gnus-summary-select-article nil 'force) - (let ((deps gnus-newsgroup-dependencies) - head header) - (save-excursion - (set-buffer gnus-original-article-buffer) - (save-restriction - (message-narrow-to-head) - (setq head (buffer-string))) - (with-temp-buffer - (insert (format "211 %d Article retrieved.\n" - (cdr gnus-article-current))) - (insert head) - (insert ".\n") - (let ((nntp-server-buffer (current-buffer))) - (setq header (car (gnus-get-newsgroup-headers deps t)))))) - (gnus-data-set-header - (gnus-data-find (cdr gnus-article-current)) - header) - (gnus-summary-update-article-line - (cdr gnus-article-current) header) - (when (gnus-summary-goto-subject (cdr gnus-article-current) nil t) - (gnus-summary-update-secondary-mark (cdr gnus-article-current)))))) - ((not arg) - ;; Select the article the normal way. - (gnus-summary-select-article nil 'force)) - (t - ;; We have to require this here to make sure that the following - ;; dynamic binding isn't shadowed by autoloading. - (require 'gnus-async) - (require 'gnus-art) - ;; Bind the article treatment functions to nil. - (let ((gnus-have-all-headers t) - gnus-article-prepare-hook - gnus-article-decode-hook - gnus-break-pages - gnus-show-mime - (gnus-inhibit-treatment t)) - (gnus-summary-select-article nil 'force)))) - (gnus-summary-goto-subject gnus-current-article) - (gnus-summary-position-point)) - -(defun gnus-summary-show-raw-article () - "Show the raw article without any article massaging functions being run." - (interactive) - (gnus-summary-show-article t)) - -(defun gnus-summary-verbose-headers (&optional arg) - "Toggle permanent full header display. -If ARG is a positive number, turn header display on. -If ARG is a negative number, turn header display off." - (interactive "P") - (setq gnus-show-all-headers - (cond ((or (not (numberp arg)) - (zerop arg)) - (not gnus-show-all-headers)) - ((natnump arg) - t))) - (gnus-summary-show-article)) - -(defun gnus-summary-toggle-header (&optional arg) - "Show the headers if they are hidden, or hide them if they are shown. -If ARG is a positive number, show the entire header. -If ARG is a negative number, hide the unwanted header lines." - (interactive "P") - (save-excursion - (set-buffer gnus-article-buffer) - (save-restriction - (let* ((buffer-read-only nil) - (inhibit-point-motion-hooks t) - hidden e) - (setq hidden - (if (numberp arg) - (>= arg 0) - (save-restriction - (article-narrow-to-head) - (gnus-article-hidden-text-p 'headers)))) - (goto-char (point-min)) - (when (search-forward "\n\n" nil t) - (delete-region (point-min) (1- (point)))) - (goto-char (point-min)) - (save-excursion - (set-buffer gnus-original-article-buffer) - (goto-char (point-min)) - (setq e (1- (or (search-forward "\n\n" nil t) (point-max))))) - (insert-buffer-substring gnus-original-article-buffer 1 e) - (save-restriction - (narrow-to-region (point-min) (point)) - (article-decode-encoded-words) - (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-set-mode-line 'article))))) - -(defun gnus-summary-show-all-headers () - "Make all header lines visible." - (interactive) - (gnus-summary-toggle-header 1)) - -(defun gnus-summary-toggle-mime (&optional arg) - "Toggle MIME processing. -If ARG is a positive number, turn MIME processing on." - (interactive "P") - (setq gnus-show-mime - (if (null arg) - (not gnus-show-mime) - (> (prefix-numeric-value arg) 0))) - (gnus-summary-select-article t 'force)) - -(defun gnus-summary-caesar-message (&optional arg) - "Caesar rotate the current article by 13. -The numerical prefix specifies how many places to rotate each letter -forward." - (interactive "P") - (gnus-summary-select-article) - (let ((mail-header-separator "")) - (gnus-eval-in-buffer-window gnus-article-buffer - (save-restriction - (widen) - (let ((start (window-start)) - buffer-read-only) - (message-caesar-buffer-body arg) - (set-window-start (get-buffer-window (current-buffer)) start)))))) - -(defun gnus-summary-stop-page-breaking () - "Stop page breaking in the current article." - (interactive) - (gnus-summary-select-article) - (gnus-eval-in-buffer-window gnus-article-buffer - (widen) - (when (gnus-visual-p 'page-marker) - (let ((buffer-read-only nil)) - (gnus-remove-text-with-property 'gnus-prev) - (gnus-remove-text-with-property 'gnus-next)) - (setq gnus-page-broken nil)))) - -(defun gnus-summary-move-article (&optional n to-newsgroup - select-method action) - "Move the current article to a different newsgroup. -If N is a positive number, move the N next articles. -If N is a negative number, move the N previous articles. -If N is nil and any articles have been marked with the process mark, -move those articles instead. -If TO-NEWSGROUP is string, do not prompt for a newsgroup to move to. -If SELECT-METHOD is non-nil, do not move to a specific newsgroup, but -re-spool using this method. - -For this function to work, both the current newsgroup and the -newsgroup that you want to move to have to support the `request-move' -and `request-accept' functions. - -ACTION can be either `move' (the default), `crosspost' or `copy'." - (interactive "P") - (unless action - (setq action 'move)) - ;; Check whether the source group supports the required functions. - (cond ((and (eq action 'move) - (not (gnus-check-backend-function - 'request-move-article gnus-newsgroup-name))) - (error "The current group does not support article moving")) - ((and (eq action 'crosspost) - (not (gnus-check-backend-function - 'request-replace-article gnus-newsgroup-name))) - (error "The current group does not support article editing"))) - (let ((articles (gnus-summary-work-articles n)) - (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"))) - (copy-buf (save-excursion - (nnheader-set-temp-buffer " *copy article*"))) - (default-marks gnus-article-mark-lists) - (no-expire-marks (delete '(expirable . expire) - (copy-sequence gnus-article-mark-lists))) - art-group to-method new-xref article to-groups) - (unless (assq action names) - (error "Unknown action %s" action)) - ;; Read the newsgroup name. - (when (and (not to-newsgroup) - (not select-method)) - (setq to-newsgroup - (gnus-read-move-group-name - (cadr (assq action names)) - (symbol-value (intern (format "gnus-current-%s-group" action))) - articles prefix)) - (set (intern (format "gnus-current-%s-group" action)) to-newsgroup)) - (setq to-method (or select-method - (gnus-server-to-method - (gnus-group-method to-newsgroup)))) - ;; Check the method we are to move this article to... - (unless (gnus-check-backend-function - 'request-accept-article (car to-method)) - (error "%s does not support article copying" (car to-method))) - (unless (gnus-check-server to-method) - (error "Can't open server %s" (car to-method))) - (gnus-message 6 "%s to %s: %s..." - (caddr (assq action names)) - (or (car select-method) to-newsgroup) articles) - (while articles - (setq article (pop articles)) - (setq - art-group - (cond - ;; Move the article. - ((eq action 'move) - ;; Remove this article from future suppression. - (gnus-dup-unsuppress-article article) - (gnus-request-move-article - article ; Article to move - gnus-newsgroup-name ; From newsgroup - (nth 1 (gnus-find-method-for-group - gnus-newsgroup-name)) ; Server - (list 'gnus-request-accept-article - to-newsgroup (list 'quote select-method) - (not articles) t) ; Accept form - (not articles))) ; Only save nov last time - ;; Copy the article. - ((eq action 'copy) - (save-excursion - (set-buffer copy-buf) - (when (gnus-request-article-this-buffer article gnus-newsgroup-name) - (gnus-request-accept-article - to-newsgroup select-method (not articles) t)))) - ;; Crosspost the article. - ((eq action 'crosspost) - (let ((xref (message-tokenize-header - (mail-header-xref (gnus-summary-article-header article)) - " "))) - (setq new-xref (concat (gnus-group-real-name gnus-newsgroup-name) - ":" article)) - (unless xref - (setq xref (list (system-name)))) - (setq new-xref - (concat - (mapconcat 'identity - (delete "Xref:" (delete new-xref xref)) - " ") - " " new-xref)) - (save-excursion - (set-buffer copy-buf) - ;; First put the article in the destination group. - (gnus-request-article-this-buffer article gnus-newsgroup-name) - (when (consp (setq art-group - (gnus-request-accept-article - to-newsgroup select-method (not articles)))) - (setq new-xref (concat new-xref " " (car art-group) - ":" (cdr art-group))) - ;; Now we have the new Xrefs header, so we insert - ;; it and replace the new article. - (nnheader-replace-header "Xref" new-xref) - (gnus-request-replace-article - (cdr art-group) to-newsgroup (current-buffer)) - art-group)))))) - (cond - ((not art-group) - (gnus-message 1 "Couldn't %s article %s: %s" - (cadr (assq action names)) article - (nnheader-get-report (car to-method)))) - ((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)) - (entry - (gnus-gethash pto-group gnus-newsrc-hashtb)) - (info (nth 2 entry)) - (to-group (gnus-info-group info)) - to-marks) - ;; Update the group that has been moved to. - (when (and info - (memq action '(move copy))) - (unless (member to-group to-groups) - (push to-group to-groups)) - - (unless (memq article gnus-newsgroup-unreads) - (push 'read to-marks) - (gnus-info-set-read - info (gnus-add-to-range (gnus-info-read info) - (list (cdr art-group))))) - - ;; See whether the article is to be put in the cache. - (let ((marks (if (gnus-group-auto-expirable-p to-group) - default-marks - no-expire-marks)) - (to-article (cdr art-group))) - - ;; Enter the article into the cache in the new group, - ;; if that is required. - (when gnus-use-cache - (gnus-cache-possibly-enter-article - to-group to-article - (let ((header (copy-sequence - (gnus-summary-article-header article)))) - (mail-header-set-number header to-article) - header) - (memq article gnus-newsgroup-marked) - (memq article gnus-newsgroup-dormant) - (memq article gnus-newsgroup-unreads))) - - (when gnus-preserve-marks - ;; Copy any marks over to the new group. - (when (and (equal to-group gnus-newsgroup-name) - (not (memq article gnus-newsgroup-unreads))) - ;; Mark this article as read in this group. - (push (cons to-article gnus-read-mark) gnus-newsgroup-reads) - (setcdr (gnus-active to-group) to-article) - (setcdr gnus-newsgroup-active to-article)) - - (while marks - (when (eq (gnus-article-mark-to-type (cdar marks)) 'list) - (when (memq article (symbol-value - (intern (format "gnus-newsgroup-%s" - (caar marks))))) - (push (cdar marks) to-marks) - ;; If the other group is the same as this group, - ;; then we have to add the mark to the list. - (when (equal to-group gnus-newsgroup-name) - (set (intern (format "gnus-newsgroup-%s" (caar marks))) - (cons to-article - (symbol-value - (intern (format "gnus-newsgroup-%s" - (caar marks))))))) - ;; Copy the marks to other group. - (gnus-add-marked-articles - to-group (cdar marks) (list to-article) info))) - (setq marks (cdr marks))) - - (gnus-request-set-mark to-group (list (list (list to-article) - 'add - to-marks)))) - - (gnus-dribble-enter - (concat "(gnus-group-set-info '" - (gnus-prin1-to-string (gnus-get-info to-group)) - ")")))) - - ;; Update the Xref header in this article to point to - ;; the new crossposted article we have just created. - (when (eq action 'crosspost) - (save-excursion - (set-buffer copy-buf) - (gnus-request-article-this-buffer article gnus-newsgroup-name) - (nnheader-replace-header "Xref" new-xref) - (gnus-request-replace-article - article gnus-newsgroup-name (current-buffer))))) - - ;;;!!!Why is this necessary? - (set-buffer gnus-summary-buffer) - - (gnus-summary-goto-subject article) - (when (eq action 'move) - (gnus-summary-mark-article article gnus-canceled-mark)))) - (gnus-summary-remove-process-mark article)) - ;; Re-activate all groups that have been moved to. - (while to-groups - (save-excursion - (set-buffer gnus-group-buffer) - (when (gnus-group-goto-group (car to-groups) t) - (gnus-group-get-new-news-this-group 1 t)) - (pop to-groups))) - - (gnus-kill-buffer copy-buf) - (gnus-summary-position-point) - (gnus-set-mode-line 'summary))) - -(defun gnus-summary-copy-article (&optional n to-newsgroup select-method) - "Move the current article to a different newsgroup. -If TO-NEWSGROUP is string, do not prompt for a newsgroup to move to. -If SELECT-METHOD is non-nil, do not move to a specific newsgroup, but -re-spool using this method." - (interactive "P") - (gnus-summary-move-article n to-newsgroup select-method 'copy)) - -(defun gnus-summary-crosspost-article (&optional n) - "Crosspost the current article to some other group." - (interactive "P") - (gnus-summary-move-article n nil nil 'crosspost)) - -(defcustom gnus-summary-respool-default-method nil - "Default method for respooling an article. -If nil, use to the current newsgroup method." - :type '(choice (gnus-select-method :value (nnml "")) - (const nil)) - :group 'gnus-summary-mail) - -(defun gnus-summary-respool-article (&optional n method) - "Respool the current article. -The article will be squeezed through the mail spooling process again, -which means that it will be put in some mail newsgroup or other -depending on `nnmail-split-methods'. -If N is a positive number, respool the N next articles. -If N is a negative number, respool the N previous articles. -If N is nil and any articles have been marked with the process mark, -respool those articles instead. - -Respooling can be done both from mail groups and \"real\" newsgroups. -In the former case, the articles in question will be moved from the -current group into whatever groups they are destined to. In the -latter case, they will be copied into the relevant groups." - (interactive - (list current-prefix-arg - (let* ((methods (gnus-methods-using 'respool)) - (methname - (symbol-name (or gnus-summary-respool-default-method - (car (gnus-find-method-for-group - gnus-newsgroup-name))))) - (method - (gnus-completing-read - methname "What backend do you want to use when respooling?" - methods nil t nil 'gnus-mail-method-history)) - ms) - (cond - ((zerop (length (setq ms (gnus-servers-using-backend - (intern method))))) - (list (intern method) "")) - ((= 1 (length ms)) - (car ms)) - (t - (let ((ms-alist (mapcar (lambda (m) (cons (cadr m) m)) ms))) - (cdr (assoc (completing-read "Server name: " ms-alist nil t) - ms-alist)))))))) - (unless method - (error "No method given for respooling")) - (if (assoc (symbol-name - (car (gnus-find-method-for-group gnus-newsgroup-name))) - (gnus-methods-using 'respool)) - (gnus-summary-move-article n nil method) - (gnus-summary-copy-article n nil method))) - -(defun gnus-summary-import-article (file &optional edit) - "Import an arbitrary file into a mail newsgroup." - (interactive "fImport file: \nP") - (let ((group gnus-newsgroup-name) - (now (current-time)) - atts lines group-art) - (unless (gnus-check-backend-function 'request-accept-article group) - (error "%s does not support article importing" group)) - (or (file-readable-p file) - (not (file-regular-p file)) - (error "Can't read %s" file)) - (save-excursion - (set-buffer (gnus-get-buffer-create " *import file*")) - (erase-buffer) - (nnheader-insert-file-contents file) - (goto-char (point-min)) - (if (nnheader-article-p) - (save-restriction - (goto-char (point-min)) - (search-forward "\n\n" nil t) - (narrow-to-region (point-min) (1- (point))) - (goto-char (point-min)) - (unless (re-search-forward "^date:" nil t) - (goto-char (point-max)) - (insert "Date: " (message-make-date (nth 5 atts)) "\n"))) - ;; This doesn't look like an article, so we fudge some headers. - (setq atts (file-attributes file) - lines (count-lines (point-min) (point-max))) - (insert "From: " (read-string "From: ") "\n" - "Subject: " (read-string "Subject: ") "\n" - "Date: " (message-make-date (nth 5 atts)) "\n" - "Message-ID: " (message-make-message-id) "\n" - "Lines: " (int-to-string lines) "\n" - "Chars: " (int-to-string (nth 7 atts)) "\n\n")) - (setq group-art (gnus-request-accept-article group nil t)) - (kill-buffer (current-buffer))) - (setq gnus-newsgroup-active (gnus-activate-group group)) - (forward-line 1) - (gnus-summary-goto-article (cdr group-art) nil t) - (when edit - (gnus-summary-edit-article)))) - -(defun gnus-summary-create-article () - "Create an article in a mail newsgroup." - (interactive) - (let ((group gnus-newsgroup-name) - (now (current-time)) - group-art) - (unless (gnus-check-backend-function 'request-accept-article group) - (error "%s does not support article importing" group)) - (save-excursion - (set-buffer (gnus-get-buffer-create " *import file*")) - (erase-buffer) - (goto-char (point-min)) - ;; This doesn't look like an article, so we fudge some headers. - (insert "From: " (read-string "From: ") "\n" - "Subject: " (read-string "Subject: ") "\n" - "Date: " (message-make-date now) "\n" - "Message-ID: " (message-make-message-id) "\n") - (setq group-art (gnus-request-accept-article group nil t)) - (kill-buffer (current-buffer))) - (setq gnus-newsgroup-active (gnus-activate-group group)) - (forward-line 1) - (gnus-summary-goto-article (cdr group-art) nil t) - (gnus-summary-edit-article))) - -(defun gnus-summary-article-posted-p () - "Say whether the current (mail) article is available from news as well. -This will be the case if the article has both been mailed and posted." - (interactive) - (let ((id (mail-header-references (gnus-summary-article-header))) - (gnus-override-method (car (gnus-refer-article-methods)))) - (if (gnus-request-head id "") - (gnus-message 2 "The current message was found on %s" - gnus-override-method) - (gnus-message 2 "The current message couldn't be found on %s" - gnus-override-method) - nil))) - -(defun gnus-summary-expire-articles (&optional now) - "Expire all articles that are marked as expirable in the current group." - (interactive) - (when (gnus-check-backend-function - 'request-expire-articles gnus-newsgroup-name) - ;; This backend supports expiry. - (let* ((total (gnus-group-total-expirable-p gnus-newsgroup-name)) - (expirable (if total - (progn - ;; We need to update the info for - ;; this group for `gnus-list-of-read-articles' - ;; to give us the right answer. - (gnus-run-hooks 'gnus-exit-group-hook) - (gnus-summary-update-info) - (gnus-list-of-read-articles gnus-newsgroup-name)) - (setq gnus-newsgroup-expirable - (sort gnus-newsgroup-expirable '<)))) - (expiry-wait (if now 'immediate - (gnus-group-find-parameter - gnus-newsgroup-name 'expiry-wait))) - (nnmail-expiry-target - (or (gnus-group-find-parameter gnus-newsgroup-name 'expiry-target) - nnmail-expiry-target)) - es) - (when expirable - ;; There are expirable articles in this group, so we run them - ;; through the expiry process. - (gnus-message 6 "Expiring articles...") - (unless (gnus-check-group gnus-newsgroup-name) - (error "Can't open server for %s" gnus-newsgroup-name)) - ;; The list of articles that weren't expired is returned. - (save-excursion - (if expiry-wait - (let ((nnmail-expiry-wait-function nil) - (nnmail-expiry-wait expiry-wait)) - (setq es (gnus-request-expire-articles - expirable gnus-newsgroup-name))) - (setq es (gnus-request-expire-articles - expirable gnus-newsgroup-name))) - (unless total - (setq gnus-newsgroup-expirable es)) - ;; We go through the old list of expirable, and mark all - ;; really expired articles as nonexistent. - (unless (eq es expirable) ;If nothing was expired, we don't mark. - (let ((gnus-use-cache nil)) - (while expirable - (unless (memq (car expirable) es) - (when (gnus-data-find (car expirable)) - (gnus-summary-mark-article - (car expirable) gnus-canceled-mark))) - (setq expirable (cdr expirable)))))) - (gnus-message 6 "Expiring articles...done"))))) - -(defun gnus-summary-expire-articles-now () - "Expunge all expirable articles in the current group. -This means that *all* articles that are marked as expirable will be -deleted forever, right now." - (interactive) - (or gnus-expert-user - (gnus-yes-or-no-p - "Are you really, really, really sure you want to delete all these messages? ") - (error "Phew!")) - (gnus-summary-expire-articles t)) - -;; Suggested by Jack Vinson . -(defun gnus-summary-delete-article (&optional n) - "Delete the N next (mail) articles. -This command actually deletes articles. This is not a marking -command. The article will disappear forever from your life, never to -return. -If N is negative, delete backwards. -If N is nil and articles have been marked with the process mark, -delete these instead." - (interactive "P") - (unless (gnus-check-backend-function 'request-expire-articles - gnus-newsgroup-name) - (error "The current newsgroup does not support article deletion")) - (unless (gnus-check-server (gnus-find-method-for-group gnus-newsgroup-name)) - (error "Couldn't open server")) - ;; Compute the list of articles to delete. - (let ((articles (sort (copy-sequence (gnus-summary-work-articles n)) '<)) - not-deleted) - (if (and gnus-novice-user - (not (gnus-yes-or-no-p - (format "Do you really want to delete %s forever? " - (if (> (length articles) 1) - (format "these %s articles" (length articles)) - "this article"))))) - () - ;; Delete the articles. - (setq not-deleted (gnus-request-expire-articles - articles gnus-newsgroup-name 'force)) - (while articles - (gnus-summary-remove-process-mark (car articles)) - ;; The backend might not have been able to delete the article - ;; after all. - (unless (memq (car articles) not-deleted) - (gnus-summary-mark-article (car articles) gnus-canceled-mark)) - (setq articles (cdr articles))) - (when not-deleted - (gnus-message 4 "Couldn't delete articles %s" not-deleted))) - (gnus-summary-position-point) - (gnus-set-mode-line 'summary) - not-deleted)) - -(defun gnus-summary-edit-article (&optional force) - "Edit the current article. -This will have permanent effect only in mail groups. -If FORCE is non-nil, allow editing of articles even in read-only -groups." - (interactive "P") - (save-excursion - (set-buffer gnus-summary-buffer) - (let ((mail-parse-charset gnus-newsgroup-charset) - (mail-parse-ignored-charsets gnus-newsgroup-ignored-charsets)) - (gnus-set-global-variables) - (when (and (not force) - (gnus-group-read-only-p)) - (error "The current newsgroup does not support article editing")) - (gnus-summary-show-article t) - (gnus-article-edit-article - 'ignore - `(lambda (no-highlight) - (let ((mail-parse-charset ',gnus-newsgroup-charset) - (message-options message-options) - (message-options-set-recipient) - (mail-parse-ignored-charsets - ',gnus-newsgroup-ignored-charsets)) - (gnus-summary-edit-article-done - ,(or (mail-header-references gnus-current-headers) "") - ,(gnus-group-read-only-p) ,gnus-summary-buffer no-highlight))))))) - -(defalias 'gnus-summary-edit-article-postpone 'gnus-article-edit-exit) - -(defun gnus-summary-edit-article-done (&optional references read-only buffer - no-highlight) - "Make edits to the current article permanent." - (interactive) - (save-excursion - ;; The buffer restriction contains the entire article if it exists. - (when (article-goto-body) - (let ((lines (count-lines (point) (point-max))) - (length (- (point-max) (point))) - (case-fold-search t) - (body (copy-marker (point)))) - (goto-char (point-min)) - (when (re-search-forward "^content-length:[ \t]\\([0-9]+\\)" body t) - (delete-region (match-beginning 1) (match-end 1)) - (insert (number-to-string length))) - (goto-char (point-min)) - (when (re-search-forward - "^x-content-length:[ \t]\\([0-9]+\\)" body t) - (delete-region (match-beginning 1) (match-end 1)) - (insert (number-to-string length))) - (goto-char (point-min)) - (when (re-search-forward "^lines:[ \t]\\([0-9]+\\)" body t) - (delete-region (match-beginning 1) (match-end 1)) - (insert (number-to-string lines)))))) - ;; Replace the article. - (let ((buf (current-buffer))) - (with-temp-buffer - (insert-buffer-substring buf) - - (if (and (not read-only) - (not (gnus-request-replace-article - (cdr gnus-article-current) (car gnus-article-current) - (current-buffer) t))) - (error "Couldn't replace article") - ;; Update the summary buffer. - (if (and references - (equal (message-tokenize-header references " ") - (message-tokenize-header - (or (message-fetch-field "references") "") " "))) - ;; We only have to update this line. - (save-excursion - (save-restriction - (message-narrow-to-head) - (let ((head (buffer-string)) - header) - (with-temp-buffer - (insert (format "211 %d Article retrieved.\n" - (cdr gnus-article-current))) - (insert head) - (insert ".\n") - (let ((nntp-server-buffer (current-buffer))) - (setq header (car (gnus-get-newsgroup-headers - (save-excursion - (set-buffer gnus-summary-buffer) - gnus-newsgroup-dependencies) - t)))) - (save-excursion - (set-buffer gnus-summary-buffer) - (gnus-data-set-header - (gnus-data-find (cdr gnus-article-current)) - header) - (gnus-summary-update-article-line - (cdr gnus-article-current) header) - (if (gnus-summary-goto-subject - (cdr gnus-article-current) nil t) - (gnus-summary-update-secondary-mark - (cdr gnus-article-current)))))))) - ;; Update threads. - (set-buffer (or buffer gnus-summary-buffer)) - (gnus-summary-update-article (cdr gnus-article-current)) - (if (gnus-summary-goto-subject (cdr gnus-article-current) nil t) - (gnus-summary-update-secondary-mark - (cdr gnus-article-current)))) - ;; Prettify the article buffer again. - (unless no-highlight - (save-excursion - (set-buffer gnus-article-buffer) - ;;;!!! Fix this -- article should be rehighlighted. - ;;;(gnus-run-hooks 'gnus-article-display-hook) - (set-buffer gnus-original-article-buffer) - (gnus-request-article - (cdr gnus-article-current) - (car gnus-article-current) (current-buffer)))) - ;; Prettify the summary buffer line. - (when (gnus-visual-p 'summary-highlight 'highlight) - (gnus-run-hooks 'gnus-visual-mark-article-hook)))))) - -(defun gnus-summary-edit-wash (key) - "Perform editing command KEY in the article buffer." - (interactive - (list - (progn - (message "%s" (concat (this-command-keys) "- ")) - (read-char)))) - (message "") - (gnus-summary-edit-article) - (execute-kbd-macro (concat (this-command-keys) key)) - (gnus-article-edit-done)) - -;;; Respooling - -(defun gnus-summary-respool-query (&optional silent trace) - "Query where the respool algorithm would put this article." - (interactive) - (let (gnus-mark-article-hook) - (gnus-summary-select-article) - (save-excursion - (set-buffer gnus-original-article-buffer) - (save-restriction - (message-narrow-to-head) - (let ((groups (nnmail-article-group 'identity trace))) - (unless silent - (if groups - (message "This message would go to %s" - (mapconcat 'car groups ", ")) - (message "This message would go to no groups")) - groups)))))) - -(defun gnus-summary-respool-trace () - "Trace where the respool algorithm would put this article. -Display a buffer showing all fancy splitting patterns which matched." - (interactive) - (gnus-summary-respool-query nil t)) - -;; Summary marking commands. - -(defun gnus-summary-kill-same-subject-and-select (&optional unmark) - "Mark articles which has the same subject as read, and then select the next. -If UNMARK is positive, remove any kind of mark. -If UNMARK is negative, tick articles." - (interactive "P") - (when unmark - (setq unmark (prefix-numeric-value unmark))) - (let ((count - (gnus-summary-mark-same-subject - (gnus-summary-article-subject) unmark))) - ;; Select next unread article. If auto-select-same mode, should - ;; select the first unread article. - (gnus-summary-next-article t (and gnus-auto-select-same - (gnus-summary-article-subject))) - (gnus-message 7 "%d article%s marked as %s" - count (if (= count 1) " is" "s are") - (if unmark "unread" "read")))) - -(defun gnus-summary-kill-same-subject (&optional unmark) - "Mark articles which has the same subject as read. -If UNMARK is positive, remove any kind of mark. -If UNMARK is negative, tick articles." - (interactive "P") - (when unmark - (setq unmark (prefix-numeric-value unmark))) - (let ((count - (gnus-summary-mark-same-subject - (gnus-summary-article-subject) unmark))) - ;; If marked as read, go to next unread subject. - (when (null unmark) - ;; Go to next unread subject. - (gnus-summary-next-subject 1 t)) - (gnus-message 7 "%d articles are marked as %s" - count (if unmark "unread" "read")))) - -(defun gnus-summary-mark-same-subject (subject &optional unmark) - "Mark articles with same SUBJECT as read, and return marked number. -If optional argument UNMARK is positive, remove any kinds of marks. -If optional argument UNMARK is negative, mark articles as unread instead." - (let ((count 1)) - (save-excursion - (cond - ((null unmark) ; Mark as read. - (while (and - (progn - (gnus-summary-mark-article-as-read gnus-killed-mark) - (gnus-summary-show-thread) t) - (gnus-summary-find-subject subject)) - (setq count (1+ count)))) - ((> unmark 0) ; Tick. - (while (and - (progn - (gnus-summary-mark-article-as-unread gnus-ticked-mark) - (gnus-summary-show-thread) t) - (gnus-summary-find-subject subject)) - (setq count (1+ count)))) - (t ; Mark as unread. - (while (and - (progn - (gnus-summary-mark-article-as-unread gnus-unread-mark) - (gnus-summary-show-thread) t) - (gnus-summary-find-subject subject)) - (setq count (1+ count))))) - (gnus-set-mode-line 'summary) - ;; Return the number of marked articles. - count))) - -(defun gnus-summary-mark-as-processable (n &optional unmark) - "Set the process mark on the next N articles. -If N is negative, mark backward instead. If UNMARK is non-nil, remove -the process mark instead. The difference between N and the actual -number of articles marked is returned." - (interactive "P") - (if (and (null n) (gnus-region-active-p)) - (gnus-uu-mark-region (region-beginning) (region-end) unmark) - (setq n (prefix-numeric-value n)) - (let ((backward (< n 0)) - (n (abs n))) - (while (and - (> n 0) - (if unmark - (gnus-summary-remove-process-mark - (gnus-summary-article-number)) - (gnus-summary-set-process-mark (gnus-summary-article-number))) - (zerop (gnus-summary-next-subject (if backward -1 1) nil t))) - (setq n (1- n))) - (when (/= 0 n) - (gnus-message 7 "No more articles")) - (gnus-summary-recenter) - (gnus-summary-position-point) - n))) - -(defun gnus-summary-unmark-as-processable (n) - "Remove the process mark from the next N articles. -If N is negative, unmark backward instead. The difference between N and -the actual number of articles unmarked is returned." - (interactive "P") - (gnus-summary-mark-as-processable n t)) - -(defun gnus-summary-unmark-all-processable () - "Remove the process mark from all articles." - (interactive) - (save-excursion - (while gnus-newsgroup-processable - (gnus-summary-remove-process-mark (car gnus-newsgroup-processable)))) - (gnus-summary-position-point)) - -(defun gnus-summary-add-mark (article type) - "Mark ARTICLE with a mark of TYPE." - (let ((vtype (car (assq type gnus-article-mark-lists))) - var) - (if (not vtype) - (error "No such mark type: %s" type) - (setq var (intern (format "gnus-newsgroup-%s" type))) - (set var (cons article (symbol-value var))) - (if (memq type '(processable cached replied forwarded recent saved)) - (gnus-summary-update-secondary-mark article) - ;;; !!! This is bogus. We should find out what primary - ;;; !!! mark we want to set. - (gnus-summary-update-mark gnus-del-mark 'unread))))) - -(defun gnus-summary-mark-as-expirable (n) - "Mark N articles forward as expirable. -If N is negative, mark backward instead. The difference between N and -the actual number of articles marked is returned." - (interactive "p") - (gnus-summary-mark-forward n gnus-expirable-mark)) - -(defun gnus-summary-mark-article-as-replied (article) - "Mark ARTICLE as replied to and update the summary line. -ARTICLE can also be a list of articles." - (interactive (list (gnus-summary-article-number))) - (let ((articles (if (listp article) article (list article)))) - (dolist (article articles) - (push article gnus-newsgroup-replied) - (let ((buffer-read-only nil)) - (when (gnus-summary-goto-subject article nil t) - (gnus-summary-update-secondary-mark article)))))) - -(defun gnus-summary-mark-article-as-forwarded (article) - "Mark ARTICLE as forwarded and update the summary line. -ARTICLE can also be a list of articles." - (let ((articles (if (listp article) article (list article)))) - (dolist (article articles) - (push article gnus-newsgroup-forwarded) - (let ((buffer-read-only nil)) - (when (gnus-summary-goto-subject article nil t) - (gnus-summary-update-secondary-mark article)))))) - -(defun gnus-summary-set-bookmark (article) - "Set a bookmark in current article." - (interactive (list (gnus-summary-article-number))) - (when (or (not (get-buffer gnus-article-buffer)) - (not gnus-current-article) - (not gnus-article-current) - (not (equal gnus-newsgroup-name (car gnus-article-current)))) - (error "No current article selected")) - ;; Remove old bookmark, if one exists. - (let ((old (assq article gnus-newsgroup-bookmarks))) - (when old - (setq gnus-newsgroup-bookmarks - (delq old gnus-newsgroup-bookmarks)))) - ;; Set the new bookmark, which is on the form - ;; (article-number . line-number-in-body). - (push - (cons article - (save-excursion - (set-buffer gnus-article-buffer) - (count-lines - (min (point) - (save-excursion - (goto-char (point-min)) - (search-forward "\n\n" nil t) - (point))) - (point)))) - gnus-newsgroup-bookmarks) - (gnus-message 6 "A bookmark has been added to the current article.")) - -(defun gnus-summary-remove-bookmark (article) - "Remove the bookmark from the current article." - (interactive (list (gnus-summary-article-number))) - ;; Remove old bookmark, if one exists. - (let ((old (assq article gnus-newsgroup-bookmarks))) - (if old - (progn - (setq gnus-newsgroup-bookmarks - (delq old gnus-newsgroup-bookmarks)) - (gnus-message 6 "Removed bookmark.")) - (gnus-message 6 "No bookmark in current article.")))) - -;; Suggested by Daniel Quinlan . -(defun gnus-summary-mark-as-dormant (n) - "Mark N articles forward as dormant. -If N is negative, mark backward instead. The difference between N and -the actual number of articles marked is returned." - (interactive "p") - (gnus-summary-mark-forward n gnus-dormant-mark)) - -(defun gnus-summary-set-process-mark (article) - "Set the process mark on ARTICLE and update the summary line." - (setq gnus-newsgroup-processable - (cons article - (delq article gnus-newsgroup-processable))) - (when (gnus-summary-goto-subject article) - (gnus-summary-show-thread) - (gnus-summary-goto-subject article) - (gnus-summary-update-secondary-mark article))) - -(defun gnus-summary-remove-process-mark (article) - "Remove the process mark from ARTICLE and update the summary line." - (setq gnus-newsgroup-processable (delq article gnus-newsgroup-processable)) - (when (gnus-summary-goto-subject article) - (gnus-summary-show-thread) - (gnus-summary-goto-subject article) - (gnus-summary-update-secondary-mark article))) - -(defun gnus-summary-set-saved-mark (article) - "Set the process mark on ARTICLE and update the summary line." - (push article gnus-newsgroup-saved) - (when (gnus-summary-goto-subject article) - (gnus-summary-update-secondary-mark article))) - -(defun gnus-summary-mark-forward (n &optional mark no-expire) - "Mark N articles as read forwards. -If N is negative, mark backwards instead. Mark with MARK, ?r by default. -The difference between N and the actual number of articles marked is -returned. -Iff NO-EXPIRE, auto-expiry will be inhibited." - (interactive "p") - (gnus-summary-show-thread) - (let ((backward (< n 0)) - (gnus-summary-goto-unread - (and gnus-summary-goto-unread - (not (eq gnus-summary-goto-unread 'never)) - (not (memq mark (list gnus-unread-mark - gnus-ticked-mark gnus-dormant-mark))))) - (n (abs n)) - (mark (or mark gnus-del-mark))) - (while (and (> n 0) - (gnus-summary-mark-article nil mark no-expire) - (zerop (gnus-summary-next-subject - (if backward -1 1) - (and gnus-summary-goto-unread - (not (eq gnus-summary-goto-unread 'never))) - t))) - (setq n (1- n))) - (when (/= 0 n) - (gnus-message 7 "No more %sarticles" (if mark "" "unread "))) - (gnus-summary-recenter) - (gnus-summary-position-point) - (gnus-set-mode-line 'summary) - n)) - -(defun gnus-summary-mark-article-as-read (mark) - "Mark the current article quickly as read with MARK." - (let ((article (gnus-summary-article-number))) - (setq gnus-newsgroup-unreads (delq article gnus-newsgroup-unreads)) - (setq gnus-newsgroup-marked (delq article gnus-newsgroup-marked)) - (setq gnus-newsgroup-dormant (delq article gnus-newsgroup-dormant)) - (push (cons article mark) gnus-newsgroup-reads) - ;; Possibly remove from cache, if that is used. - (when gnus-use-cache - (gnus-cache-enter-remove-article article)) - ;; Allow the backend to change the mark. - (setq mark (gnus-request-update-mark gnus-newsgroup-name article mark)) - ;; Check for auto-expiry. - (when (and gnus-newsgroup-auto-expire - (memq mark gnus-auto-expirable-marks)) - (setq mark gnus-expirable-mark) - ;; Let the backend know about the mark change. - (setq mark (gnus-request-update-mark gnus-newsgroup-name article mark)) - (push article gnus-newsgroup-expirable)) - ;; Set the mark in the buffer. - (gnus-summary-update-mark mark 'unread) - t)) - -(defun gnus-summary-mark-article-as-unread (mark) - "Mark the current article quickly as unread with MARK." - (let* ((article (gnus-summary-article-number)) - (old-mark (gnus-summary-article-mark article))) - ;; Allow the backend to change the mark. - (setq mark (gnus-request-update-mark gnus-newsgroup-name article mark)) - (if (eq mark old-mark) - t - (if (<= article 0) - (progn - (gnus-error 1 "Can't mark negative article numbers") - nil) - (setq gnus-newsgroup-marked (delq article gnus-newsgroup-marked)) - (setq gnus-newsgroup-dormant (delq article gnus-newsgroup-dormant)) - (setq gnus-newsgroup-expirable (delq article gnus-newsgroup-expirable)) - (setq gnus-newsgroup-reads (delq article gnus-newsgroup-reads)) - (cond ((= mark gnus-ticked-mark) - (push article gnus-newsgroup-marked)) - ((= mark gnus-dormant-mark) - (push article gnus-newsgroup-dormant)) - (t - (push article gnus-newsgroup-unreads))) - (gnus-pull article gnus-newsgroup-reads) - - ;; See whether the article is to be put in the cache. - (and gnus-use-cache - (vectorp (gnus-summary-article-header article)) - (save-excursion - (gnus-cache-possibly-enter-article - gnus-newsgroup-name article - (gnus-summary-article-header article) - (= mark gnus-ticked-mark) - (= mark gnus-dormant-mark) (= mark gnus-unread-mark)))) - - ;; Fix the mark. - (gnus-summary-update-mark mark 'unread) - t)))) - -(defun gnus-summary-mark-article (&optional article mark no-expire) - "Mark ARTICLE with MARK. MARK can be any character. -Four MARK strings are reserved: `? ' (unread), `?!' (ticked), -`??' (dormant) and `?E' (expirable). -If MARK is nil, then the default character `?r' is used. -If ARTICLE is nil, then the article on the current line will be -marked. -Iff NO-EXPIRE, auto-expiry will be inhibited." - ;; The mark might be a string. - (when (stringp mark) - (setq mark (aref mark 0))) - ;; If no mark is given, then we check auto-expiring. - (when (null mark) - (setq mark gnus-del-mark)) - (when (and (not no-expire) - gnus-newsgroup-auto-expire - (memq mark gnus-auto-expirable-marks)) - (setq mark gnus-expirable-mark)) - (let ((article (or article (gnus-summary-article-number))) - (old-mark (gnus-summary-article-mark article))) - ;; Allow the backend to change the mark. - (setq mark (gnus-request-update-mark gnus-newsgroup-name article mark)) - (if (eq mark old-mark) - t - (unless article - (error "No article on current line")) - (if (not (if (or (= mark gnus-unread-mark) - (= mark gnus-ticked-mark) - (= mark gnus-dormant-mark)) - (gnus-mark-article-as-unread article mark) - (gnus-mark-article-as-read article mark))) - t - ;; See whether the article is to be put in the cache. - (and gnus-use-cache - (not (= mark gnus-canceled-mark)) - (vectorp (gnus-summary-article-header article)) - (save-excursion - (gnus-cache-possibly-enter-article - gnus-newsgroup-name article - (gnus-summary-article-header article) - (= mark gnus-ticked-mark) - (= mark gnus-dormant-mark) (= mark gnus-unread-mark)))) - - (when (gnus-summary-goto-subject article nil t) - (let ((buffer-read-only nil)) - (gnus-summary-show-thread) - ;; Fix the mark. - (gnus-summary-update-mark mark 'unread) - t)))))) - -(defun gnus-summary-update-secondary-mark (article) - "Update the secondary (read, process, cache) mark." - (gnus-summary-update-mark - (cond ((memq article gnus-newsgroup-processable) - gnus-process-mark) - ((memq article gnus-newsgroup-cached) - gnus-cached-mark) - ((memq article gnus-newsgroup-replied) - gnus-replied-mark) - ((memq article gnus-newsgroup-forwarded) - gnus-forwarded-mark) - ((memq article gnus-newsgroup-saved) - gnus-saved-mark) - ((memq article gnus-newsgroup-recent) - gnus-recent-mark) - ((memq article gnus-newsgroup-unseen) - gnus-unseen-mark) - (t gnus-no-mark)) - 'replied) - (when (gnus-visual-p 'summary-highlight 'highlight) - (gnus-run-hooks 'gnus-summary-update-hook)) - t) - -(defun gnus-summary-update-mark (mark type) - (let ((forward (cdr (assq type gnus-summary-mark-positions))) - (buffer-read-only nil)) - (re-search-backward "[\n\r]" (gnus-point-at-bol) 'move-to-limit) - (when forward - (when (looking-at "\r") - (incf forward)) - (when (<= (+ forward (point)) (point-max)) - ;; Go to the right position on the line. - (goto-char (+ forward (point))) - ;; Replace the old mark with the new mark. - (subst-char-in-region (point) (1+ (point)) (char-after) mark) - ;; Optionally update the marks by some user rule. - (when (eq type 'unread) - (gnus-data-set-mark - (gnus-data-find (gnus-summary-article-number)) mark) - (gnus-summary-update-line (eq mark gnus-unread-mark))))))) - -(defun gnus-mark-article-as-read (article &optional mark) - "Enter ARTICLE in the pertinent lists and remove it from others." - ;; Make the article expirable. - (let ((mark (or mark gnus-del-mark))) - (if (= mark gnus-expirable-mark) - (push article gnus-newsgroup-expirable) - (setq gnus-newsgroup-expirable (delq article gnus-newsgroup-expirable))) - ;; Remove from unread and marked lists. - (setq gnus-newsgroup-unreads (delq article gnus-newsgroup-unreads)) - (setq gnus-newsgroup-marked (delq article gnus-newsgroup-marked)) - (setq gnus-newsgroup-dormant (delq article gnus-newsgroup-dormant)) - (push (cons article mark) gnus-newsgroup-reads) - ;; Possibly remove from cache, if that is used. - (when gnus-use-cache - (gnus-cache-enter-remove-article article)) - t)) - -(defun gnus-mark-article-as-unread (article &optional mark) - "Enter ARTICLE in the pertinent lists and remove it from others." - (let ((mark (or mark gnus-ticked-mark))) - (if (<= article 0) - (progn - (gnus-error 1 "Can't mark negative article numbers") - nil) - (setq gnus-newsgroup-marked (delq article gnus-newsgroup-marked) - gnus-newsgroup-dormant (delq article gnus-newsgroup-dormant) - gnus-newsgroup-expirable (delq article gnus-newsgroup-expirable) - gnus-newsgroup-unreads (delq article gnus-newsgroup-unreads)) - - ;; Unsuppress duplicates? - (when gnus-suppress-duplicates - (gnus-dup-unsuppress-article article)) - - (cond ((= mark gnus-ticked-mark) - (push article gnus-newsgroup-marked)) - ((= mark gnus-dormant-mark) - (push article gnus-newsgroup-dormant)) - (t - (push article gnus-newsgroup-unreads))) - (gnus-pull article gnus-newsgroup-reads) - t))) - -(defalias 'gnus-summary-mark-as-unread-forward - 'gnus-summary-tick-article-forward) -(make-obsolete 'gnus-summary-mark-as-unread-forward - 'gnus-summary-tick-article-forward) -(defun gnus-summary-tick-article-forward (n) - "Tick N articles forwards. -If N is negative, tick backwards instead. -The difference between N and the number of articles ticked is returned." - (interactive "p") - (gnus-summary-mark-forward n gnus-ticked-mark)) - -(defalias 'gnus-summary-mark-as-unread-backward - 'gnus-summary-tick-article-backward) -(make-obsolete 'gnus-summary-mark-as-unread-backward - 'gnus-summary-tick-article-backward) -(defun gnus-summary-tick-article-backward (n) - "Tick N articles backwards. -The difference between N and the number of articles ticked is returned." - (interactive "p") - (gnus-summary-mark-forward (- n) gnus-ticked-mark)) - -(defalias 'gnus-summary-mark-as-unread 'gnus-summary-tick-article) -(make-obsolete 'gnus-summary-mark-as-unread 'gnus-summary-tick-article) -(defun gnus-summary-tick-article (&optional article clear-mark) - "Mark current article as unread. -Optional 1st argument ARTICLE specifies article number to be marked as unread. -Optional 2nd argument CLEAR-MARK remove any kinds of mark." - (interactive) - (gnus-summary-mark-article article (if clear-mark gnus-unread-mark - gnus-ticked-mark))) - -(defun gnus-summary-mark-as-read-forward (n) - "Mark N articles as read forwards. -If N is negative, mark backwards instead. -The difference between N and the actual number of articles marked is -returned." - (interactive "p") - (gnus-summary-mark-forward n gnus-del-mark gnus-inhibit-user-auto-expire)) - -(defun gnus-summary-mark-as-read-backward (n) - "Mark the N articles as read backwards. -The difference between N and the actual number of articles marked is -returned." - (interactive "p") - (gnus-summary-mark-forward - (- n) gnus-del-mark gnus-inhibit-user-auto-expire)) - -(defun gnus-summary-mark-as-read (&optional article mark) - "Mark current article as read. -ARTICLE specifies the article to be marked as read. -MARK specifies a string to be inserted at the beginning of the line." - (gnus-summary-mark-article article mark)) - -(defun gnus-summary-clear-mark-forward (n) - "Clear marks from N articles forward. -If N is negative, clear backward instead. -The difference between N and the number of marks cleared is returned." - (interactive "p") - (gnus-summary-mark-forward n gnus-unread-mark)) - -(defun gnus-summary-clear-mark-backward (n) - "Clear marks from N articles backward. -The difference between N and the number of marks cleared is returned." - (interactive "p") - (gnus-summary-mark-forward (- n) gnus-unread-mark)) - -(defun gnus-summary-mark-unread-as-read () - "Intended to be used by `gnus-summary-mark-article-hook'." - (when (memq gnus-current-article gnus-newsgroup-unreads) - (gnus-summary-mark-article gnus-current-article gnus-read-mark))) - -(defun gnus-summary-mark-read-and-unread-as-read () - "Intended to be used by `gnus-summary-mark-article-hook'." - (let ((mark (gnus-summary-article-mark))) - (when (or (gnus-unread-mark-p mark) - (gnus-read-mark-p mark)) - (gnus-summary-mark-article gnus-current-article gnus-read-mark)))) - -(defun gnus-summary-mark-unread-as-ticked () - "Intended to be used by `gnus-summary-mark-article-hook'." - (when (memq gnus-current-article gnus-newsgroup-unreads) - (gnus-summary-mark-article gnus-current-article gnus-ticked-mark))) - -(defun gnus-summary-mark-region-as-read (point mark all) - "Mark all unread articles between point and mark as read. -If given a prefix, mark all articles between point and mark as read, -even ticked and dormant ones." - (interactive "r\nP") - (save-excursion - (let (article) - (goto-char point) - (beginning-of-line) - (while (and - (< (point) mark) - (progn - (when (or all - (memq (setq article (gnus-summary-article-number)) - gnus-newsgroup-unreads)) - (gnus-summary-mark-article article gnus-del-mark)) - t) - (gnus-summary-find-next)))))) - -(defun gnus-summary-mark-below (score mark) - "Mark articles with score less than SCORE with MARK." - (interactive "P\ncMark: ") - (setq score (if score - (prefix-numeric-value score) - (or gnus-summary-default-score 0))) - (save-excursion - (set-buffer gnus-summary-buffer) - (goto-char (point-min)) - (while - (progn - (and (< (gnus-summary-article-score) score) - (gnus-summary-mark-article nil mark)) - (gnus-summary-find-next))))) - -(defun gnus-summary-kill-below (&optional score) - "Mark articles with score below SCORE as read." - (interactive "P") - (gnus-summary-mark-below score gnus-killed-mark)) - -(defun gnus-summary-clear-above (&optional score) - "Clear all marks from articles with score above SCORE." - (interactive "P") - (gnus-summary-mark-above score gnus-unread-mark)) - -(defun gnus-summary-tick-above (&optional score) - "Tick all articles with score above SCORE." - (interactive "P") - (gnus-summary-mark-above score gnus-ticked-mark)) - -(defun gnus-summary-mark-above (score mark) - "Mark articles with score over SCORE with MARK." - (interactive "P\ncMark: ") - (setq score (if score - (prefix-numeric-value score) - (or gnus-summary-default-score 0))) - (save-excursion - (set-buffer gnus-summary-buffer) - (goto-char (point-min)) - (while (and (progn - (when (> (gnus-summary-article-score) score) - (gnus-summary-mark-article nil mark)) - t) - (gnus-summary-find-next))))) - -;; Suggested by Daniel Quinlan . -(defalias 'gnus-summary-show-all-expunged 'gnus-summary-limit-include-expunged) -(defun gnus-summary-limit-include-expunged (&optional no-error) - "Display all the hidden articles that were expunged for low scores." - (interactive) - (let ((buffer-read-only nil)) - (let ((scored gnus-newsgroup-scored) - headers h) - (while scored - (unless (gnus-summary-article-header (caar scored)) - (and (setq h (gnus-number-to-header (caar scored))) - (< (cdar scored) gnus-summary-expunge-below) - (push h headers))) - (setq scored (cdr scored))) - (if (not headers) - (when (not no-error) - (error "No expunged articles hidden")) - (goto-char (point-min)) - (push gnus-newsgroup-limit gnus-newsgroup-limits) - (setq gnus-newsgroup-limit (copy-sequence gnus-newsgroup-limit)) - (mapcar (lambda (x) (push (mail-header-number x) - gnus-newsgroup-limit)) - headers) - (gnus-summary-prepare-unthreaded (nreverse headers)) - (goto-char (point-min)) - (gnus-summary-position-point) - t)))) - -(defun gnus-summary-catchup (&optional all quietly to-here not-mark reverse) - "Mark all unread articles in this newsgroup as read. -If prefix argument ALL is non-nil, ticked and dormant articles will -also be marked as read. -If QUIETLY is non-nil, no questions will be asked. -If TO-HERE is non-nil, it should be a point in the buffer. All -articles before (after, if REVERSE is set) this point will be marked as read. -Note that this function will only catch up the unread article -in the current summary buffer limitation. -The number of articles marked as read is returned." - (interactive "P") - (prog1 - (save-excursion - (when (or quietly - (not gnus-interactive-catchup) ;Without confirmation? - gnus-expert-user - (gnus-y-or-n-p - (if all - "Mark absolutely all articles as read? " - "Mark all unread articles as read? "))) - (if (and not-mark - (not gnus-newsgroup-adaptive) - (not gnus-newsgroup-auto-expire) - (not gnus-suppress-duplicates) - (or (not gnus-use-cache) - (eq gnus-use-cache 'passive))) - (progn - (when all - (setq gnus-newsgroup-marked nil - gnus-newsgroup-dormant nil)) - (setq gnus-newsgroup-unreads gnus-newsgroup-downloadable)) - ;; We actually mark all articles as canceled, which we - ;; have to do when using auto-expiry or adaptive scoring. - (gnus-summary-show-all-threads) - (if (and to-here reverse) - (progn - (goto-char to-here) - (while (and - (gnus-summary-mark-article-as-read gnus-catchup-mark) - (gnus-summary-find-next (not all) nil nil t)))) - (when (gnus-summary-first-subject (not all) t) - (while (and - (if to-here (< (point) to-here) t) - (gnus-summary-mark-article-as-read gnus-catchup-mark) - (gnus-summary-find-next (not all) nil nil t))))) - (gnus-set-mode-line 'summary)) - t)) - (gnus-summary-position-point))) - -(defun gnus-summary-catchup-to-here (&optional all) - "Mark all unticked articles before the current one as read. -If ALL is non-nil, also mark ticked and dormant articles as read." - (interactive "P") - (save-excursion - (gnus-save-hidden-threads - (let ((beg (point))) - ;; We check that there are unread articles. - (when (or all (gnus-summary-find-prev)) - (gnus-summary-catchup all t beg))))) - (gnus-summary-position-point)) - -(defun gnus-summary-catchup-from-here (&optional all) - "Mark all unticked articles after the current one as read. -If ALL is non-nil, also mark ticked and dormant articles as read." - (interactive "P") - (save-excursion - (gnus-save-hidden-threads - (let ((beg (point))) - ;; We check that there are unread articles. - (when (or all (gnus-summary-find-next)) - (gnus-summary-catchup all t beg nil t))))) - (gnus-summary-position-point)) - -(defun gnus-summary-catchup-all (&optional quietly) - "Mark all articles in this newsgroup as read." - (interactive "P") - (gnus-summary-catchup t quietly)) - -(defun gnus-summary-catchup-and-exit (&optional all quietly) - "Mark all unread articles in this group as read, then exit. -If prefix argument ALL is non-nil, all articles are marked as read. -If QUIETLY is non-nil, no questions will be asked." - (interactive "P") - (when (gnus-summary-catchup all quietly nil 'fast) - ;; Select next newsgroup or exit. - (if (and (not (gnus-group-quit-config gnus-newsgroup-name)) - (eq gnus-auto-select-next 'quietly)) - (gnus-summary-next-group nil) - (gnus-summary-exit)))) - -(defun gnus-summary-catchup-all-and-exit (&optional quietly) - "Mark all articles in this newsgroup as read, and then exit." - (interactive "P") - (gnus-summary-catchup-and-exit t quietly)) - -(defun gnus-summary-catchup-and-goto-next-group (&optional all) - "Mark all articles in this group as read and select the next group. -If given a prefix, mark all articles, unread as well as ticked, as -read." - (interactive "P") - (save-excursion - (gnus-summary-catchup all)) - (gnus-summary-next-group)) - -;;; -;;; with article -;;; - -(defmacro gnus-with-article (article &rest forms) - "Select ARTICLE and perform FORMS in the original article buffer. -Then replace the article with the result." - `(progn - ;; We don't want the article to be marked as read. - (let (gnus-mark-article-hook) - (gnus-summary-select-article t t nil ,article)) - (set-buffer gnus-original-article-buffer) - ,@forms - (if (not (gnus-check-backend-function - 'request-replace-article (car gnus-article-current))) - (gnus-message 5 "Read-only group; not replacing") - (unless (gnus-request-replace-article - ,article (car gnus-article-current) - (current-buffer) t) - (error "Couldn't replace article"))) - ;; The cache and backlog have to be flushed somewhat. - (when gnus-keep-backlog - (gnus-backlog-remove-article - (car gnus-article-current) (cdr gnus-article-current))) - (when gnus-use-cache - (gnus-cache-update-article - (car gnus-article-current) (cdr gnus-article-current))))) - -(put 'gnus-with-article 'lisp-indent-function 1) -(put 'gnus-with-article 'edebug-form-spec '(form body)) - -;; Thread-based commands. - -(defun gnus-summary-articles-in-thread (&optional article) - "Return a list of all articles in the current thread. -If ARTICLE is non-nil, return all articles in the thread that starts -with that article." - (let* ((article (or article (gnus-summary-article-number))) - (data (gnus-data-find-list article)) - (top-level (gnus-data-level (car data))) - (top-subject - (cond ((null gnus-thread-operation-ignore-subject) - (gnus-simplify-subject-re - (mail-header-subject (gnus-data-header (car data))))) - ((eq gnus-thread-operation-ignore-subject 'fuzzy) - (gnus-simplify-subject-fuzzy - (mail-header-subject (gnus-data-header (car data))))) - (t nil))) - (end-point (save-excursion - (if (gnus-summary-go-to-next-thread) - (point) (point-max)))) - articles) - (while (and data - (< (gnus-data-pos (car data)) end-point)) - (when (or (not top-subject) - (string= top-subject - (if (eq gnus-thread-operation-ignore-subject 'fuzzy) - (gnus-simplify-subject-fuzzy - (mail-header-subject - (gnus-data-header (car data)))) - (gnus-simplify-subject-re - (mail-header-subject - (gnus-data-header (car data))))))) - (push (gnus-data-number (car data)) articles)) - (unless (and (setq data (cdr data)) - (> (gnus-data-level (car data)) top-level)) - (setq data nil))) - ;; Return the list of articles. - (nreverse articles))) - -(defun gnus-summary-rethread-current () - "Rethread the thread the current article is part of." - (interactive) - (let* ((gnus-show-threads t) - (article (gnus-summary-article-number)) - (id (mail-header-id (gnus-summary-article-header))) - (gnus-newsgroup-threads (list (gnus-id-to-thread (gnus-root-id id))))) - (unless id - (error "No article on the current line")) - (gnus-rebuild-thread id) - (gnus-summary-goto-subject article))) - -(defun gnus-summary-reparent-thread () - "Make the current article child of the marked (or previous) article. - -Note that the re-threading will only work if `gnus-thread-ignore-subject' -is non-nil or the Subject: of both articles are the same." - (interactive) - (unless (not (gnus-group-read-only-p)) - (error "The current newsgroup does not support article editing")) - (unless (<= (length gnus-newsgroup-processable) 1) - (error "No more than one article may be marked")) - (save-window-excursion - (let ((gnus-article-buffer " *reparent*") - (current-article (gnus-summary-article-number)) - ;; First grab the marked article, otherwise one line up. - (parent-article (if (not (null gnus-newsgroup-processable)) - (car gnus-newsgroup-processable) - (save-excursion - (if (eq (forward-line -1) 0) - (gnus-summary-article-number) - (error "Beginning of summary buffer")))))) - (unless (not (eq current-article parent-article)) - (error "An article may not be self-referential")) - (let ((message-id (mail-header-id - (gnus-summary-article-header parent-article)))) - (unless (and message-id (not (equal message-id ""))) - (error "No message-id in desired parent")) - (gnus-with-article current-article - (save-restriction - (goto-char (point-min)) - (message-narrow-to-head) - (if (re-search-forward "^References: " nil t) - (progn - (re-search-forward "^[^ \t]" nil t) - (forward-line -1) - (end-of-line) - (insert " " message-id)) - (insert "References: " message-id "\n")))) - (set-buffer gnus-summary-buffer) - (gnus-summary-unmark-all-processable) - (gnus-summary-update-article current-article) - (if (gnus-summary-goto-subject (cdr gnus-article-current) nil t) - (gnus-summary-update-secondary-mark (cdr gnus-article-current))) - (gnus-summary-rethread-current) - (gnus-message 3 "Article %d is now the child of article %d" - current-article parent-article))))) - -(defun gnus-summary-toggle-threads (&optional arg) - "Toggle showing conversation threads. -If ARG is positive number, turn showing conversation threads on." - (interactive "P") - (let ((current (or (gnus-summary-article-number) gnus-newsgroup-end))) - (setq gnus-show-threads - (if (null arg) (not gnus-show-threads) - (> (prefix-numeric-value arg) 0))) - (gnus-summary-prepare) - (gnus-summary-goto-subject current) - (gnus-message 6 "Threading is now %s" (if gnus-show-threads "on" "off")) - (gnus-summary-position-point))) - -(defun gnus-summary-show-all-threads () - "Show all threads." - (interactive) - (save-excursion - (let ((buffer-read-only nil)) - (subst-char-in-region (point-min) (point-max) ?\^M ?\n t))) - (gnus-summary-position-point)) - -(defun gnus-summary-show-thread () - "Show thread subtrees. -Returns nil if no thread was there to be shown." - (interactive) - (let ((buffer-read-only nil) - (orig (point)) - ;; first goto end then to beg, to have point at beg after let - (end (progn (end-of-line) (point))) - (beg (progn (beginning-of-line) (point)))) - (prog1 - ;; Any hidden lines here? - (search-forward "\r" end t) - (subst-char-in-region beg end ?\^M ?\n t) - (goto-char orig) - (gnus-summary-position-point)))) - -(defun gnus-summary-hide-all-threads () - "Hide all thread subtrees." - (interactive) - (save-excursion - (goto-char (point-min)) - (gnus-summary-hide-thread) - (while (zerop (gnus-summary-next-thread 1 t)) - (gnus-summary-hide-thread))) - (gnus-summary-position-point)) - -(defun gnus-summary-hide-thread () - "Hide thread subtrees. -Returns nil if no threads were there to be hidden." - (interactive) - (let ((buffer-read-only nil) - (start (point)) - (article (gnus-summary-article-number))) - (goto-char start) - ;; Go forward until either the buffer ends or the subthread - ;; ends. - (when (and (not (eobp)) - (or (zerop (gnus-summary-next-thread 1 t)) - (goto-char (point-max)))) - (prog1 - (if (and (> (point) start) - (search-backward "\n" start t)) - (progn - (subst-char-in-region start (point) ?\n ?\^M) - (gnus-summary-goto-subject article)) - (goto-char start) - nil))))) - -(defun gnus-summary-go-to-next-thread (&optional previous) - "Go to the same level (or less) next thread. -If PREVIOUS is non-nil, go to previous thread instead. -Return the article number moved to, or nil if moving was impossible." - (let ((level (gnus-summary-thread-level)) - (way (if previous -1 1)) - (beg (point))) - (forward-line way) - (while (and (not (eobp)) - (< level (gnus-summary-thread-level))) - (forward-line way)) - (if (eobp) - (progn - (goto-char beg) - nil) - (setq beg (point)) - (prog1 - (gnus-summary-article-number) - (goto-char beg))))) - -(defun gnus-summary-next-thread (n &optional silent) - "Go to the same level next N'th thread. -If N is negative, search backward instead. -Returns the difference between N and the number of skips actually -done. - -If SILENT, don't output messages." - (interactive "p") - (let ((backward (< n 0)) - (n (abs n))) - (while (and (> n 0) - (gnus-summary-go-to-next-thread backward)) - (decf n)) - (unless silent - (gnus-summary-position-point)) - (when (and (not silent) (/= 0 n)) - (gnus-message 7 "No more threads")) - n)) - -(defun gnus-summary-prev-thread (n) - "Go to the same level previous N'th thread. -Returns the difference between N and the number of skips actually -done." - (interactive "p") - (gnus-summary-next-thread (- n))) - -(defun gnus-summary-go-down-thread () - "Go down one level in the current thread." - (let ((children (gnus-summary-article-children))) - (when children - (gnus-summary-goto-subject (car children))))) - -(defun gnus-summary-go-up-thread () - "Go up one level in the current thread." - (let ((parent (gnus-summary-article-parent))) - (when parent - (gnus-summary-goto-subject parent)))) - -(defun gnus-summary-down-thread (n) - "Go down thread N steps. -If N is negative, go up instead. -Returns the difference between N and how many steps down that were -taken." - (interactive "p") - (let ((up (< n 0)) - (n (abs n))) - (while (and (> n 0) - (if up (gnus-summary-go-up-thread) - (gnus-summary-go-down-thread))) - (setq n (1- n))) - (gnus-summary-position-point) - (when (/= 0 n) - (gnus-message 7 "Can't go further")) - n)) - -(defun gnus-summary-up-thread (n) - "Go up thread N steps. -If N is negative, go down instead. -Returns the difference between N and how many steps down that were -taken." - (interactive "p") - (gnus-summary-down-thread (- n))) - -(defun gnus-summary-top-thread () - "Go to the top of the thread." - (interactive) - (while (gnus-summary-go-up-thread)) - (gnus-summary-article-number)) - -(defun gnus-summary-kill-thread (&optional unmark) - "Mark articles under current thread as read. -If the prefix argument is positive, remove any kinds of marks. -If the prefix argument is negative, tick articles instead." - (interactive "P") - (when unmark - (setq unmark (prefix-numeric-value unmark))) - (let ((articles (gnus-summary-articles-in-thread))) - (save-excursion - ;; Expand the thread. - (gnus-summary-show-thread) - ;; Mark all the articles. - (while articles - (gnus-summary-goto-subject (car articles)) - (cond ((null unmark) - (gnus-summary-mark-article-as-read gnus-killed-mark)) - ((> unmark 0) - (gnus-summary-mark-article-as-unread gnus-unread-mark)) - (t - (gnus-summary-mark-article-as-unread gnus-ticked-mark))) - (setq articles (cdr articles)))) - ;; Hide killed subtrees. - (and (null unmark) - gnus-thread-hide-killed - (gnus-summary-hide-thread)) - ;; If marked as read, go to next unread subject. - (when (null unmark) - ;; Go to next unread subject. - (gnus-summary-next-subject 1 t))) - (gnus-set-mode-line 'summary)) - -;; Summary sorting commands - -(defun gnus-summary-sort-by-number (&optional reverse) - "Sort the summary buffer by article number. -Argument REVERSE means reverse order." - (interactive "P") - (gnus-summary-sort 'number reverse)) - -(defun gnus-summary-sort-by-author (&optional reverse) - "Sort the summary buffer by author name alphabetically. -If `case-fold-search' is non-nil, case of letters is ignored. -Argument REVERSE means reverse order." - (interactive "P") - (gnus-summary-sort 'author reverse)) - -(defun gnus-summary-sort-by-subject (&optional reverse) - "Sort the summary buffer by subject alphabetically. `Re:'s are ignored. -If `case-fold-search' is non-nil, case of letters is ignored. -Argument REVERSE means reverse order." - (interactive "P") - (gnus-summary-sort 'subject reverse)) - -(defun gnus-summary-sort-by-date (&optional reverse) - "Sort the summary buffer by date. -Argument REVERSE means reverse order." - (interactive "P") - (gnus-summary-sort 'date reverse)) - -(defun gnus-summary-sort-by-score (&optional reverse) - "Sort the summary buffer by score. -Argument REVERSE means reverse order." - (interactive "P") - (gnus-summary-sort 'score reverse)) - -(defun gnus-summary-sort-by-lines (&optional reverse) - "Sort the summary buffer by the number of lines. -Argument REVERSE means reverse order." - (interactive "P") - (gnus-summary-sort 'lines reverse)) - -(defun gnus-summary-sort-by-chars (&optional reverse) - "Sort the summary buffer by article length. -Argument REVERSE means reverse order." - (interactive "P") - (gnus-summary-sort 'chars reverse)) - -(defun gnus-summary-sort-by-original (&optional reverse) - "Sort the summary buffer using the default sorting method. -Argument REVERSE means reverse order." - (interactive "P") - (let* ((buffer-read-only) - (gnus-summary-prepare-hook nil)) - ;; We do the sorting by regenerating the threads. - (gnus-summary-prepare) - ;; Hide subthreads if needed. - (when (and gnus-show-threads gnus-thread-hide-subtree) - (gnus-summary-hide-all-threads)))) - -(defun gnus-summary-sort (predicate reverse) - "Sort summary buffer by PREDICATE. REVERSE means reverse order." - (let* ((thread (intern (format "gnus-thread-sort-by-%s" predicate))) - (article (intern (format "gnus-article-sort-by-%s" predicate))) - (gnus-thread-sort-functions - (if (not reverse) - thread - `(lambda (t1 t2) - (,thread t2 t1)))) - (gnus-sort-gathered-threads-function - gnus-thread-sort-functions) - (gnus-article-sort-functions - (if (not reverse) - article - `(lambda (t1 t2) - (,article t2 t1)))) - (buffer-read-only) - (gnus-summary-prepare-hook nil)) - ;; We do the sorting by regenerating the threads. - (gnus-summary-prepare) - ;; Hide subthreads if needed. - (when (and gnus-show-threads gnus-thread-hide-subtree) - (gnus-summary-hide-all-threads)))) - -;; Summary saving commands. - -(defun gnus-summary-save-article (&optional n not-saved) - "Save the current article using the default saver function. -If N is a positive number, save the N next articles. -If N is a negative number, save the N previous articles. -If N is nil and any articles have been marked with the process mark, -save those articles instead. -The variable `gnus-default-article-saver' specifies the saver function." - (interactive "P") - (let* ((articles (gnus-summary-work-articles n)) - (save-buffer (save-excursion - (nnheader-set-temp-buffer " *Gnus Save*"))) - (num (length articles)) - header file) - (dolist (article articles) - (setq header (gnus-summary-article-header article)) - (if (not (vectorp header)) - ;; This is a pseudo-article. - (if (assq 'name header) - (gnus-copy-file (cdr (assq 'name header))) - (gnus-message 1 "Article %d is unsaveable" article)) - ;; This is a real article. - (save-window-excursion - (gnus-summary-select-article t nil nil article)) - (save-excursion - (set-buffer save-buffer) - (erase-buffer) - (insert-buffer-substring gnus-original-article-buffer)) - (setq file (gnus-article-save save-buffer file num)) - (gnus-summary-remove-process-mark article) - (unless not-saved - (gnus-summary-set-saved-mark article)))) - (gnus-kill-buffer save-buffer) - (gnus-summary-position-point) - (gnus-set-mode-line 'summary) - n)) - -(defun gnus-summary-pipe-output (&optional arg) - "Pipe the current article to a subprocess. -If N is a positive number, pipe the N next articles. -If N is a negative number, pipe the N previous articles. -If N is nil and any articles have been marked with the process mark, -pipe those articles instead." - (interactive "P") - (require 'gnus-art) - (let ((gnus-default-article-saver 'gnus-summary-save-in-pipe)) - (gnus-summary-save-article arg t)) - (let ((buffer (get-buffer "*Shell Command Output*"))) - (if (and buffer - (with-current-buffer buffer (> (point-max) (point-min)))) - (gnus-configure-windows 'pipe)))) - -(defun gnus-summary-save-article-mail (&optional arg) - "Append the current article to an mail file. -If N is a positive number, save the N next articles. -If N is a negative number, save the N previous articles. -If N is nil and any articles have been marked with the process mark, -save those articles instead." - (interactive "P") - (require 'gnus-art) - (let ((gnus-default-article-saver 'gnus-summary-save-in-mail)) - (gnus-summary-save-article arg))) - -(defun gnus-summary-save-article-rmail (&optional arg) - "Append the current article to an rmail file. -If N is a positive number, save the N next articles. -If N is a negative number, save the N previous articles. -If N is nil and any articles have been marked with the process mark, -save those articles instead." - (interactive "P") - (require 'gnus-art) - (let ((gnus-default-article-saver 'gnus-summary-save-in-rmail)) - (gnus-summary-save-article arg))) - -(defun gnus-summary-save-article-file (&optional arg) - "Append the current article to a file. -If N is a positive number, save the N next articles. -If N is a negative number, save the N previous articles. -If N is nil and any articles have been marked with the process mark, -save those articles instead." - (interactive "P") - (require 'gnus-art) - (let ((gnus-default-article-saver 'gnus-summary-save-in-file)) - (gnus-summary-save-article arg))) - -(defun gnus-summary-write-article-file (&optional arg) - "Write the current article to a file, deleting the previous file. -If N is a positive number, save the N next articles. -If N is a negative number, save the N previous articles. -If N is nil and any articles have been marked with the process mark, -save those articles instead." - (interactive "P") - (require 'gnus-art) - (let ((gnus-default-article-saver 'gnus-summary-write-to-file)) - (gnus-summary-save-article arg))) - -(defun gnus-summary-save-article-body-file (&optional arg) - "Append the current article body to a file. -If N is a positive number, save the N next articles. -If N is a negative number, save the N previous articles. -If N is nil and any articles have been marked with the process mark, -save those articles instead." - (interactive "P") - (require 'gnus-art) - (let ((gnus-default-article-saver 'gnus-summary-save-body-in-file)) - (gnus-summary-save-article arg))) - -(defun gnus-summary-pipe-message (program) - "Pipe the current article through PROGRAM." - (interactive "sProgram: ") - (gnus-summary-select-article) - (let ((mail-header-separator "")) - (gnus-eval-in-buffer-window gnus-article-buffer - (save-restriction - (widen) - (let ((start (window-start)) - buffer-read-only) - (message-pipe-buffer-body program) - (set-window-start (get-buffer-window (current-buffer)) start)))))) - -(defun gnus-get-split-value (methods) - "Return a value based on the split METHODS." - (let (split-name method result match) - (when methods - (save-excursion - (set-buffer gnus-original-article-buffer) - (save-restriction - (nnheader-narrow-to-headers) - (while (and methods (not split-name)) - (goto-char (point-min)) - (setq method (pop methods)) - (setq match (car method)) - (when (cond - ((stringp match) - ;; Regular expression. - (ignore-errors - (re-search-forward match nil t))) - ((gnus-functionp match) - ;; Function. - (save-restriction - (widen) - (setq result (funcall match gnus-newsgroup-name)))) - ((consp match) - ;; Form. - (save-restriction - (widen) - (setq result (eval match))))) - (setq split-name (cdr method)) - (cond ((stringp result) - (push (expand-file-name - result gnus-article-save-directory) - split-name)) - ((consp result) - (setq split-name (append result split-name))))))))) - (nreverse split-name))) - -(defun gnus-valid-move-group-p (group) - (and (boundp group) - (symbol-name group) - (symbol-value group) - (gnus-get-function (gnus-find-method-for-group - (symbol-name group)) 'request-accept-article t))) - -(defun gnus-read-move-group-name (prompt default articles prefix) - "Read a group name." - (let* ((split-name (gnus-get-split-value gnus-move-split-methods)) - (minibuffer-confirm-incomplete nil) ; XEmacs - (prom - (format "%s %s to:" - prompt - (if (> (length articles) 1) - (format "these %d articles" (length articles)) - "this article"))) - (to-newsgroup - (cond - ((null split-name) - (gnus-completing-read default prom - gnus-active-hashtb - 'gnus-valid-move-group-p - nil prefix - 'gnus-group-history)) - ((= 1 (length split-name)) - (gnus-completing-read (car split-name) prom - gnus-active-hashtb - 'gnus-valid-move-group-p - nil nil - 'gnus-group-history)) - (t - (gnus-completing-read nil prom - (mapcar (lambda (el) (list el)) - (nreverse split-name)) - nil nil nil - 'gnus-group-history)))) - (to-method (gnus-server-to-method (gnus-group-method to-newsgroup)))) - (when to-newsgroup - (if (or (string= to-newsgroup "") - (string= to-newsgroup prefix)) - (setq to-newsgroup default)) - (unless to-newsgroup - (error "No group name entered")) - (or (gnus-active to-newsgroup) - (gnus-activate-group to-newsgroup nil nil to-method) - (if (gnus-y-or-n-p (format "No such group: %s. Create it? " - to-newsgroup)) - (or (and (gnus-request-create-group to-newsgroup to-method) - (gnus-activate-group - to-newsgroup nil nil to-method) - (gnus-subscribe-group to-newsgroup)) - (error "Couldn't create group %s" to-newsgroup))) - (error "No such group: %s" to-newsgroup))) - to-newsgroup)) - -(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: " - (or (car gnus-summary-save-parts-type-history) - gnus-summary-save-parts-default-mime) - 'gnus-summary-save-parts-type-history) - (setq gnus-summary-save-parts-last-directory - (read-file-name "Save to directory: " - gnus-summary-save-parts-last-directory - nil t)) - current-prefix-arg)) - (gnus-summary-iterate n - (let ((gnus-display-mime-function nil) - (gnus-inhibit-treatment t)) - (gnus-summary-select-article)) - (save-excursion - (set-buffer gnus-article-buffer) - (let ((handles (or gnus-article-mime-handles - (mm-dissect-buffer) (mm-uu-dissect)))) - (when handles - (gnus-summary-save-parts-1 type dir handles reverse) - (unless gnus-article-mime-handles ;; Don't destroy this case. - (mm-destroy-parts handles))))))) - -(defun gnus-summary-save-parts-1 (type dir handle reverse) - (if (stringp (car handle)) - (mapcar (lambda (h) (gnus-summary-save-parts-1 type dir h reverse)) - (cdr handle)) - (when (if reverse - (not (string-match type (mm-handle-media-type handle))) - (string-match type (mm-handle-media-type handle))) - (let ((file (expand-file-name - (file-name-nondirectory - (or - (mail-content-type-get - (mm-handle-disposition handle) 'filename) - (concat gnus-newsgroup-name - "." (number-to-string - (cdr gnus-article-current))))) - dir))) - (unless (file-exists-p file) - (mm-save-part-to-file handle file)))))) - -;; Summary extract commands - -(defun gnus-summary-insert-pseudos (pslist &optional not-view) - (let ((buffer-read-only nil) - (article (gnus-summary-article-number)) - after-article b e) - (unless (gnus-summary-goto-subject article) - (error "No such article: %d" article)) - (gnus-summary-position-point) - ;; If all commands are to be bunched up on one line, we collect - ;; them here. - (unless gnus-view-pseudos-separately - (let ((ps (setq pslist (sort pslist 'gnus-pseudos<))) - files action) - (while ps - (setq action (cdr (assq 'action (car ps)))) - (setq files (list (cdr (assq 'name (car ps))))) - (while (and ps (cdr ps) - (string= (or action "1") - (or (cdr (assq 'action (cadr ps))) "2"))) - (push (cdr (assq 'name (cadr ps))) files) - (setcdr ps (cddr ps))) - (when files - (when (not (string-match "%s" action)) - (push " " files)) - (push " " files) - (when (assq 'execute (car ps)) - (setcdr (assq 'execute (car ps)) - (funcall (if (string-match "%s" action) - 'format 'concat) - action - (mapconcat - (lambda (f) - (if (equal f " ") - f - (gnus-quote-arg-for-sh-or-csh f))) - files " "))))) - (setq ps (cdr ps))))) - (if (and gnus-view-pseudos (not not-view)) - (while pslist - (when (assq 'execute (car pslist)) - (gnus-execute-command (cdr (assq 'execute (car pslist))) - (eq gnus-view-pseudos 'not-confirm))) - (setq pslist (cdr pslist))) - (save-excursion - (while pslist - (setq after-article (or (cdr (assq 'article (car pslist))) - (gnus-summary-article-number))) - (gnus-summary-goto-subject after-article) - (forward-line 1) - (setq b (point)) - (insert " " (file-name-nondirectory - (cdr (assq 'name (car pslist)))) - ": " (or (cdr (assq 'execute (car pslist))) "") "\n") - (setq e (point)) - (forward-line -1) ; back to `b' - (gnus-add-text-properties - b (1- e) (list 'gnus-number gnus-reffed-article-number - gnus-mouse-face-prop gnus-mouse-face)) - (gnus-data-enter - after-article gnus-reffed-article-number - gnus-unread-mark b (car pslist) 0 (- e b)) - (push gnus-reffed-article-number gnus-newsgroup-unreads) - (setq gnus-reffed-article-number (1- gnus-reffed-article-number)) - (setq pslist (cdr pslist))))))) - -(defun gnus-pseudos< (p1 p2) - (let ((c1 (cdr (assq 'action p1))) - (c2 (cdr (assq 'action p2)))) - (and c1 c2 (string< c1 c2)))) - -(defun gnus-request-pseudo-article (props) - (cond ((assq 'execute props) - (gnus-execute-command (cdr (assq 'execute props))))) - (let ((gnus-current-article (gnus-summary-article-number))) - (gnus-run-hooks 'gnus-mark-article-hook))) - -(defun gnus-execute-command (command &optional automatic) - (save-excursion - (gnus-article-setup-buffer) - (set-buffer gnus-article-buffer) - (setq buffer-read-only nil) - (let ((command (if automatic command - (read-string "Command: " (cons command 0))))) - (erase-buffer) - (insert "$ " command "\n\n") - (if gnus-view-pseudo-asynchronously - (start-process "gnus-execute" (current-buffer) shell-file-name - shell-command-switch command) - (call-process shell-file-name nil t nil - shell-command-switch command))))) - -;; Summary kill commands. - -(defun gnus-summary-edit-global-kill (article) - "Edit the \"global\" kill file." - (interactive (list (gnus-summary-article-number))) - (gnus-group-edit-global-kill article)) - -(defun gnus-summary-edit-local-kill () - "Edit a local kill file applied to the current newsgroup." - (interactive) - (setq gnus-current-headers (gnus-summary-article-header)) - (gnus-group-edit-local-kill - (gnus-summary-article-number) gnus-newsgroup-name)) - -;;; Header reading. - -(defun gnus-read-header (id &optional header) - "Read the headers of article ID and enter them into the Gnus system." - (let ((group gnus-newsgroup-name) - (gnus-override-method - (or - gnus-override-method - (and (gnus-news-group-p gnus-newsgroup-name) - (car (gnus-refer-article-methods))))) - where) - ;; First we check to see whether the header in question is already - ;; fetched. - (if (stringp id) - ;; This is a Message-ID. - (setq header (or header (gnus-id-to-header id))) - ;; This is an article number. - (setq header (or header (gnus-summary-article-header id)))) - (if (and header - (not (gnus-summary-article-sparse-p (mail-header-number header)))) - ;; We have found the header. - header - ;; If this is a sparse article, we have to nix out its - ;; previous entry in the thread hashtb. - (when (and header - (gnus-summary-article-sparse-p (mail-header-number header))) - (let* ((parent (gnus-parent-id (mail-header-references header))) - (thread (and parent (gnus-id-to-thread parent)))) - (when thread - (delq (assq header thread) thread)))) - ;; We have to really fetch the header to this article. - (save-excursion - (set-buffer nntp-server-buffer) - (when (setq where (gnus-request-head id group)) - (nnheader-fold-continuation-lines) - (goto-char (point-max)) - (insert ".\n") - (goto-char (point-min)) - (insert "211 ") - (princ (cond - ((numberp id) id) - ((cdr where) (cdr where)) - (header (mail-header-number header)) - (t gnus-reffed-article-number)) - (current-buffer)) - (insert " Article retrieved.\n")) - (if (or (not where) - (not (setq header (car (gnus-get-newsgroup-headers nil t))))) - () ; Malformed head. - (unless (gnus-summary-article-sparse-p (mail-header-number header)) - (when (and (stringp id) - (not (string= (gnus-group-real-name group) - (car where)))) - ;; If we fetched by Message-ID and the article came - ;; from a different group, we fudge some bogus article - ;; numbers for this article. - (mail-header-set-number header gnus-reffed-article-number)) - (save-excursion - (set-buffer gnus-summary-buffer) - (decf gnus-reffed-article-number) - (gnus-remove-header (mail-header-number header)) - (push header gnus-newsgroup-headers) - (setq gnus-current-headers header) - (push (mail-header-number header) gnus-newsgroup-limit))) - header))))) - -(defun gnus-remove-header (number) - "Remove header NUMBER from `gnus-newsgroup-headers'." - (if (and gnus-newsgroup-headers - (= number (mail-header-number (car gnus-newsgroup-headers)))) - (pop gnus-newsgroup-headers) - (let ((headers gnus-newsgroup-headers)) - (while (and (cdr headers) - (not (= number (mail-header-number (cadr headers))))) - (pop headers)) - (when (cdr headers) - (setcdr headers (cddr headers)))))) - -;;; -;;; summary highlights -;;; - -(defun gnus-highlight-selected-summary () - "Highlight selected article in summary buffer." - ;; Added by Per Abrahamsen . - (when gnus-summary-selected-face - (save-excursion - (let* ((beg (progn (beginning-of-line) (point))) - (end (progn (end-of-line) (point))) - ;; Fix by Mike Dugan . - (from (if (get-text-property beg gnus-mouse-face-prop) - beg - (or (next-single-property-change - beg gnus-mouse-face-prop nil end) - beg))) - (to - (if (= from end) - (- from 2) - (or (next-single-property-change - from gnus-mouse-face-prop nil end) - end)))) - ;; If no mouse-face prop on line we will have to = from = end, - ;; so we highlight the entire line instead. - (when (= (+ to 2) from) - (setq from beg) - (setq to end)) - (if gnus-newsgroup-selected-overlay - ;; Move old overlay. - (gnus-move-overlay - gnus-newsgroup-selected-overlay from to (current-buffer)) - ;; Create new overlay. - (gnus-overlay-put - (setq gnus-newsgroup-selected-overlay (gnus-make-overlay from to)) - 'face gnus-summary-selected-face)))))) - -;; New implementation by Christian Limpach . -(defun gnus-summary-highlight-line () - "Highlight current line according to `gnus-summary-highlight'." - (let* ((list gnus-summary-highlight) - (p (point)) - (end (progn (end-of-line) (point))) - ;; now find out where the line starts and leave point there. - (beg (progn (beginning-of-line) (point))) - (article (gnus-summary-article-number)) - (score (or (cdr (assq (or article gnus-current-article) - gnus-newsgroup-scored)) - gnus-summary-default-score 0)) - (mark (or (gnus-summary-article-mark) gnus-unread-mark)) - (inhibit-read-only t)) - ;; Eval the cars of the lists until we find a match. - (let ((default gnus-summary-default-score) - (default-high gnus-summary-default-high-score) - (default-low gnus-summary-default-low-score)) - (while (and list - (not (eval (caar list)))) - (setq list (cdr list)))) - (let ((face (cdar list))) - (unless (eq face (get-text-property beg 'face)) - (gnus-put-text-property-excluding-characters-with-faces - beg end 'face - (setq face (if (boundp face) (symbol-value face) face))) - (when gnus-summary-highlight-line-function - (funcall gnus-summary-highlight-line-function article face)))) - (goto-char p))) - -(defun gnus-update-read-articles (group unread &optional compute) - "Update the list of read articles in GROUP." - (let* ((active (or gnus-newsgroup-active (gnus-active group))) - (entry (gnus-gethash group gnus-newsrc-hashtb)) - (info (nth 2 entry)) - (prev 1) - (unread (sort (copy-sequence unread) '<)) - read) - (if (or (not info) (not active)) - ;; There is no info on this group if it was, in fact, - ;; killed. Gnus stores no information on killed groups, so - ;; there's nothing to be done. - ;; One could store the information somewhere temporarily, - ;; perhaps... Hmmm... - () - ;; Remove any negative articles numbers. - (while (and unread (< (car unread) 0)) - (setq unread (cdr unread))) - ;; Remove any expired article numbers - (while (and unread (< (car unread) (car active))) - (setq unread (cdr unread))) - ;; Compute the ranges of read articles by looking at the list of - ;; unread articles. - (while unread - (when (/= (car unread) prev) - (push (if (= prev (1- (car unread))) prev - (cons prev (1- (car unread)))) - read)) - (setq prev (1+ (car unread))) - (setq unread (cdr unread))) - (when (<= prev (cdr active)) - (push (cons prev (cdr active)) read)) - (setq read (if (> (length read) 1) (nreverse read) read)) - (if compute - read - (save-excursion - (let (setmarkundo) - ;; Propagate the read marks to the backend. - (when (gnus-check-backend-function 'request-set-mark group) - (let ((del (gnus-remove-from-range (gnus-info-read info) read)) - (add (gnus-remove-from-range read (gnus-info-read info)))) - (when (or add del) - (unless (gnus-check-group group) - (error "Can't open server for %s" group)) - (gnus-request-set-mark - group (delq nil (list (if add (list add 'add '(read))) - (if del (list del 'del '(read)))))) - (setq setmarkundo - `(gnus-request-set-mark - ,group - ',(delq nil (list - (if del (list del 'add '(read))) - (if add (list add 'del '(read)))))))))) - (set-buffer gnus-group-buffer) - (gnus-undo-register - `(progn - (gnus-info-set-marks ',info ',(gnus-info-marks info) t) - (gnus-info-set-read ',info ',(gnus-info-read info)) - (gnus-get-unread-articles-in-group ',info - (gnus-active ,group)) - (gnus-group-update-group ,group t) - ,setmarkundo)))) - ;; Enter this list into the group info. - (gnus-info-set-read info read) - ;; Set the number of unread articles in gnus-newsrc-hashtb. - (gnus-get-unread-articles-in-group info (gnus-active group)) - t)))) - -(defun gnus-offer-save-summaries () - "Offer to save all active summary buffers." - (let (buffers) - ;; Go through all buffers and find all summaries. - (dolist (buffer (buffer-list)) - (when (and (setq buffer (buffer-name buffer)) - (string-match "Summary" buffer) - (save-excursion - (set-buffer buffer) - ;; We check that this is, indeed, a summary buffer. - (and (eq major-mode 'gnus-summary-mode) - ;; Also make sure this isn't bogus. - gnus-newsgroup-prepared - ;; Also make sure that this isn't a - ;; dead summary buffer. - (not gnus-dead-summary-mode)))) - (push buffer buffers))) - ;; Go through all these summary buffers and offer to save them. - (when buffers - (save-excursion - (map-y-or-n-p - "Update summary buffer %s? " - (lambda (buf) - (switch-to-buffer buf) - (gnus-summary-exit)) - buffers))))) - - -;;; @ for mime-partial -;;; - -(defun gnus-request-partial-message () - (save-excursion - (let ((number (gnus-summary-article-number)) - (group gnus-newsgroup-name) - (mother gnus-article-buffer)) - (set-buffer (get-buffer-create " *Partial Article*")) - (erase-buffer) - (setq mime-preview-buffer mother) - (gnus-request-article-this-buffer number group) - (mime-parse-buffer) - ))) - -(autoload 'mime-combine-message/partial-pieces-automatically - "mime-partial" - "Internal method to combine message/partial messages automatically.") - -(mime-add-condition - 'action '((type . message)(subtype . partial) - (major-mode . gnus-original-article-mode) - (method . mime-combine-message/partial-pieces-automatically) - (summary-buffer-exp . gnus-summary-buffer) - (request-partial-message-method . gnus-request-partial-message) - )) - - -;;; @ for message/rfc822 -;;; - -(defun gnus-mime-extract-message/rfc822 (entity situation) - (let (group article num cwin swin cur) - (with-temp-buffer - (mime-insert-entity-content entity) - (setq group (or (cdr (assq 'group situation)) - (completing-read "Group: " - gnus-active-hashtb - nil - (gnus-read-active-file-p) - gnus-newsgroup-name)) - article (gnus-request-accept-article group))) - (when (and (consp article) - (numberp (setq article (cdr article)))) - (setq num (1+ (or (cdr (assq 'number situation)) 0)) - cwin (get-buffer-window (current-buffer) t)) - (save-window-excursion - (if (setq swin (get-buffer-window gnus-summary-buffer t)) - (select-window swin) - (set-buffer gnus-summary-buffer)) - (setq cur gnus-current-article) - (forward-line num) - (let (gnus-show-threads) - (gnus-summary-goto-subject article t)) - (gnus-summary-clear-mark-forward 1) - (gnus-summary-goto-subject cur)) - (when (and cwin (window-frame cwin)) - (select-frame (window-frame cwin))) - (when (boundp 'mime-acting-situation-to-override) - (set-alist 'mime-acting-situation-to-override - 'group - group) - (set-alist 'mime-acting-situation-to-override - 'after-method - `(progn - (save-current-buffer - (set-buffer gnus-group-buffer) - (gnus-activate-group ,group)) - (gnus-summary-goto-article ,cur - gnus-show-all-headers))) - (set-alist 'mime-acting-situation-to-override - 'number num))))) - -(mime-add-condition - 'action '((type . message)(subtype . rfc822) - (major-mode . gnus-original-article-mode) - (method . gnus-mime-extract-message/rfc822) - (mode . "extract") - )) - -(mime-add-condition - 'action '((type . message)(subtype . news) - (major-mode . gnus-original-article-mode) - (method . gnus-mime-extract-message/rfc822) - (mode . "extract") - )) - -(defun gnus-mime-extract-multipart (entity situation) - (let ((children (mime-entity-children entity)) - mime-acting-situation-to-override - f) - (while children - (mime-play-entity (car children) - (cons (assq 'mode situation) - mime-acting-situation-to-override)) - (setq children (cdr children))) - (if (setq f (cdr (assq 'after-method - mime-acting-situation-to-override))) - (eval f) - ))) - -(mime-add-condition - 'action '((type . multipart) - (method . gnus-mime-extract-multipart) - (mode . "extract") - ) - 'with-default) - - -;;; @ end -;;; - -(defun gnus-summary-setup-default-charset () - "Setup newsgroup default charset." - (if (equal gnus-newsgroup-name "nndraft:drafts") - (setq gnus-newsgroup-charset nil) - (let* ((ignored-charsets - (or gnus-newsgroup-ephemeral-ignored-charsets - (append - (and gnus-newsgroup-name - (gnus-parameter-ignored-charsets gnus-newsgroup-name)) - gnus-newsgroup-ignored-charsets)))) - (setq gnus-newsgroup-charset - (or gnus-newsgroup-ephemeral-charset - (and gnus-newsgroup-name - (gnus-parameter-charset gnus-newsgroup-name)) - gnus-default-charset)) - (set (make-local-variable 'gnus-newsgroup-ignored-charsets) - ignored-charsets)))) - -;;; -;;; Mime Commands -;;; - -(defun gnus-summary-display-buttonized (&optional show-all-parts) - "Display the current article buffer fully MIME-buttonized. -If SHOW-ALL-PARTS (the prefix) is non-nil, all multipart/* parts are -treated as multipart/mixed." - (interactive "P") - (require 'gnus-art) - (let ((gnus-unbuttonized-mime-types nil) - (gnus-mime-display-multipart-as-mixed show-all-parts)) - (gnus-summary-show-article))) - -(defun gnus-summary-repair-multipart (article) - "Add a Content-Type header to a multipart article without one." - (interactive (list (gnus-summary-article-number))) - (gnus-with-article article - (message-narrow-to-head) - (message-remove-header "Mime-Version") - (goto-char (point-max)) - (insert "Mime-Version: 1.0\n") - (widen) - (when (search-forward "\n--" nil t) - (let ((separator (buffer-substring (point) (gnus-point-at-eol)))) - (message-narrow-to-head) - (message-remove-header "Content-Type") - (goto-char (point-max)) - (insert (format "Content-Type: multipart/mixed; boundary=\"%s\"\n" - separator)) - (widen)))) - (let (gnus-mark-article-hook) - (gnus-summary-select-article t t nil article))) - -(defun gnus-summary-toggle-display-buttonized () - "Toggle the buttonizing of the article buffer." - (interactive) - (require 'gnus-art) - (if (setq gnus-inhibit-mime-unbuttonizing - (not gnus-inhibit-mime-unbuttonizing)) - (let ((gnus-unbuttonized-mime-types nil)) - (gnus-summary-show-article)) - (gnus-summary-show-article))) - -;;; -;;; Intelli-mouse commmands -;;; - -(defun gnus-wheel-summary-scroll (event) - (interactive "e") - (let ((amount (if (memq 'shift (event-modifiers event)) - (car gnus-wheel-scroll-amount) - (cdr gnus-wheel-scroll-amount))) - (direction (- (* (static-if (featurep 'xemacs) - (event-button event) - (cond ((eq 'mouse-4 (event-basic-type event)) - 4) - ((eq 'mouse-5 (event-basic-type event)) - 5))) - 2) 9)) - edge) - (gnus-summary-scroll-up (* amount direction)) - (when (gnus-eval-in-buffer-window gnus-article-buffer - (save-restriction - (widen) - (and (if (< 0 direction) - (gnus-article-next-page 0) - (gnus-article-prev-page 0) - (bobp)) - (if (setq edge (get-text-property - (point-min) 'gnus-wheel-edge)) - (setq edge (* edge direction)) - (setq edge -1)) - (or (plusp edge) - (let ((buffer-read-only nil) - (inhibit-read-only t)) - (put-text-property (point-min) (point-max) - 'gnus-wheel-edge direction) - nil)) - (or (> edge gnus-wheel-edge-resistance) - (let ((buffer-read-only nil) - (inhibit-read-only t)) - (put-text-property (point-min) (point-max) - 'gnus-wheel-edge - (* (1+ edge) direction)) - nil)) - (eq last-command 'gnus-wheel-summary-scroll)))) - (gnus-summary-next-article nil nil (minusp direction))))) - -(defun gnus-wheel-install () - "Enable mouse wheel support on summary window." - (when gnus-use-wheel - (let ((keys - '([(mouse-4)] [(shift mouse-4)] [(mouse-5)] [(shift mouse-5)]))) - (dolist (key keys) - (define-key gnus-summary-mode-map key - 'gnus-wheel-summary-scroll))))) - -(add-hook 'gnus-summary-mode-hook 'gnus-wheel-install) - -;;; -;;; Traditional PGP commmands -;;; - -(defun gnus-summary-decrypt-article (&optional force) - "Decrypt the current article in traditional PGP way. -This will have permanent effect only in mail groups. -If FORCE is non-nil, allow editing of articles even in read-only -groups." - (interactive "P") - (gnus-summary-select-article t) - (gnus-eval-in-buffer-window gnus-article-buffer - (save-excursion - (save-restriction - (widen) - (goto-char (point-min)) - (unless (re-search-forward (car pgg-armor-header-lines) nil t) - (error "Not a traditional PGP message!")) - (let ((armor-start (match-beginning 0))) - (if (and (pgg-decrypt-region armor-start (point-max)) - (or force (not (gnus-group-read-only-p)))) - (let ((inhibit-read-only t) - buffer-read-only) - (delete-region armor-start - (progn - (re-search-forward "^-+END PGP" nil t) - (beginning-of-line 2) - (point))) - (insert-buffer-substring pgg-output-buffer)))))))) - -(defun gnus-summary-verify-article () - "Verify the current article in traditional PGP way." - (interactive) - (save-excursion - (set-buffer gnus-original-article-buffer) - (goto-char (point-min)) - (unless (re-search-forward "^-+BEGIN PGP SIGNED MESSAGE" nil t) - (error "Not a traditional PGP message!")) - (re-search-forward "^-+END PGP" nil t) - (beginning-of-line 2) - (call-interactively (function pgg-verify-region)))) - -;;; -;;; Generic summary marking commands -;;; - -(defvar gnus-summary-marking-alist - '((read gnus-del-mark "d") - (unread gnus-unread-mark "u") - (ticked gnus-ticked-mark "!") - (dormant gnus-dormant-mark "?") - (expirable gnus-expirable-mark "e")) - "An alist of names/marks/keystrokes.") - -(defvar gnus-summary-generic-mark-map (make-sparse-keymap)) -(defvar gnus-summary-mark-map) - -(defun gnus-summary-make-all-marking-commands () - (define-key gnus-summary-mark-map "M" gnus-summary-generic-mark-map) - (dolist (elem gnus-summary-marking-alist) - (apply 'gnus-summary-make-marking-command elem))) - -(defun gnus-summary-make-marking-command (name mark keystroke) - (let ((map (make-sparse-keymap))) - (define-key gnus-summary-generic-mark-map keystroke map) - (dolist (lway `((next "next" next nil "n") - (next-unread "next unread" next t "N") - (prev "previous" prev nil "p") - (prev-unread "previous unread" prev t "P") - (nomove "" nil nil ,keystroke))) - (let ((func (gnus-summary-make-marking-command-1 - mark (car lway) lway name))) - (setq func (eval func)) - (define-key map (nth 4 lway) func))))) - -(defun gnus-summary-make-marking-command-1 (mark way lway name) - `(defun ,(intern - (format "gnus-summary-put-mark-as-%s%s" - name (if (eq way 'nomove) - "" - (concat "-" (symbol-name way))))) - (n) - ,(format - "Mark the current article as %s%s. -If N, the prefix, then repeat N times. -If N is negative, move in reverse order. -The difference between N and the actual number of articles marked is -returned." - name (car (cdr lway))) - (interactive "p") - (gnus-summary-generic-mark n ,mark ',(nth 2 lway) ,(nth 3 lway)))) - -(defun gnus-summary-generic-mark (n mark move unread) - "Mark N articles with MARK." - (unless (eq major-mode 'gnus-summary-mode) - (error "This command can only be used in the summary buffer")) - (gnus-summary-show-thread) - (let ((nummove - (cond - ((eq move 'next) 1) - ((eq move 'prev) -1) - (t 0)))) - (if (zerop nummove) - (setq n 1) - (when (< n 0) - (setq n (abs n) - nummove (* -1 nummove)))) - (while (and (> n 0) - (gnus-summary-mark-article nil mark) - (zerop (gnus-summary-next-subject nummove unread t))) - (setq n (1- n))) - (when (/= 0 n) - (gnus-message 7 "No more %sarticles" (if mark "" "unread "))) - (gnus-summary-recenter) - (gnus-summary-position-point) - (gnus-set-mode-line 'summary) - n)) - -(defun gnus-summary-insert-articles (articles) - (when (setq articles - (gnus-set-difference articles - (mapcar (lambda (h) (mail-header-number h)) - gnus-newsgroup-headers))) - (setq gnus-newsgroup-headers - (merge 'list - gnus-newsgroup-headers - (gnus-fetch-headers articles) - 'gnus-article-sort-by-number)) - ;; Suppress duplicates? - (when gnus-suppress-duplicates - (gnus-dup-suppress-articles)) - - ;; We might want to build some more threads first. - (when (and gnus-fetch-old-headers - (eq gnus-headers-retrieved-by 'nov)) - (if (eq gnus-fetch-old-headers 'invisible) - (gnus-build-all-threads) - (gnus-build-old-threads))) - ;; Let the Gnus agent mark articles as read. - (when gnus-agent - (gnus-agent-get-undownloaded-list)) - ;; Remove list identifiers from subject - (when gnus-list-identifiers - (gnus-summary-remove-list-identifiers)) - ;; First and last article in this newsgroup. - (when gnus-newsgroup-headers - (setq gnus-newsgroup-begin - (mail-header-number (car gnus-newsgroup-headers)) - gnus-newsgroup-end - (mail-header-number - (gnus-last-element gnus-newsgroup-headers)))) - (when gnus-use-scoring - (gnus-possibly-score-headers)))) - -(defun gnus-summary-insert-old-articles (&optional all) - "Insert all old articles in this group. -If ALL is non-nil, already read articles become readable. -If ALL is a number, fetch this number of articles." - (interactive "P") - (prog1 - (let ((old (mapcar 'car gnus-newsgroup-data)) - (i (car gnus-newsgroup-active)) - older len) - (while (<= i (cdr gnus-newsgroup-active)) - (or (memq i old) (push i older)) - (incf i)) - (setq len (length older)) - (cond - ((null older) nil) - ((numberp all) - (if (< all len) - (setq older (subseq older 0 all)))) - (all nil) - (t - (if (and (numberp gnus-large-newsgroup) - (> len gnus-large-newsgroup)) - (let ((input - (read-string - (format - "How many articles from %s (default %d): " - (gnus-limit-string - (gnus-group-decoded-name gnus-newsgroup-name) 35) - len)))) - (unless (string-match "^[ \t]*$" input) - (setq all (string-to-number input)) - (if (< all len) - (setq older (subseq older 0 all)))))))) - (if (not older) - (message "No old news.") - (gnus-summary-insert-articles older) - (gnus-summary-limit (gnus-union older old)))) - (gnus-summary-position-point))) - -(defun gnus-summary-insert-new-articles () - "Insert all new articles in this group." - (interactive) - (prog1 - (let ((old (mapcar 'car gnus-newsgroup-data)) - (old-active gnus-newsgroup-active) - (nnmail-fetched-sources (list t)) - i new) - (setq gnus-newsgroup-active - (gnus-activate-group gnus-newsgroup-name 'scan)) - (setq i (1+ (cdr old-active))) - (while (<= i (cdr gnus-newsgroup-active)) - (push i new) - (incf i)) - (if (not new) - (message "No gnus is bad news.") - (setq new (nreverse new)) - (gnus-summary-insert-articles new) - (setq gnus-newsgroup-unreads - (append gnus-newsgroup-unreads new)) - (gnus-summary-limit (gnus-union old new)))) - (gnus-summary-position-point))) - -(gnus-summary-make-all-marking-commands) - -(gnus-ems-redefine) - -(provide 'gnus-sum) - -(run-hooks 'gnus-sum-load-hook) - -;;; gnus-sum.el ends here diff --git a/lisp/gnus-topic.el b/lisp/gnus-topic.el deleted file mode 100644 index 2267def..0000000 --- a/lisp/gnus-topic.el +++ /dev/null @@ -1,1678 +0,0 @@ -;;; gnus-topic.el --- a folding minor mode for Gnus group buffers -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Ilja Weis -;; Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'gnus-clfns)) - -(require 'gnus) -(require 'gnus-group) -(require 'gnus-start) -(require 'gnus-util) - -(defgroup gnus-topic nil - "Group topics." - :group 'gnus-group) - -(defvar gnus-topic-mode nil - "Minor mode for Gnus group buffers.") - -(defcustom gnus-topic-mode-hook nil - "Hook run in topic mode buffers." - :type 'hook - :group 'gnus-topic) - -(when (featurep 'xemacs) - (add-hook 'gnus-topic-mode-hook 'gnus-xmas-topic-menu-add)) - -(defcustom gnus-topic-line-format "%i[ %(%{%n%}%) -- %A ]%v\n" - "Format of topic lines. -It works along the same lines as a normal formatting string, -with some simple extensions. - -%i Indentation based on topic level. -%n Topic name. -%v Nothing if the topic is visible, \"...\" otherwise. -%g Number of groups in the topic. -%a Number of unread articles in the groups in the topic. -%A Number of unread articles in the groups in the topic and its subtopics. -" - :type 'string - :group 'gnus-topic) - -(defcustom gnus-topic-indent-level 2 - "*How much each subtopic should be indented." - :type 'integer - :group 'gnus-topic) - -(defcustom gnus-topic-display-empty-topics t - "*If non-nil, display the topic lines even of topics that have no unread articles." - :type 'boolean - :group 'gnus-topic) - -;; Internal variables. - -(defvar gnus-topic-active-topology nil) -(defvar gnus-topic-active-alist nil) -(defvar gnus-topic-unreads nil) - -(defvar gnus-topology-checked-p nil - "Whether the topology has been checked in this session.") - -(defvar gnus-topic-killed-topics nil) -(defvar gnus-topic-inhibit-change-level nil) - -(defconst gnus-topic-line-format-alist - `((?n name ?s) - (?v visible ?s) - (?i indentation ?s) - (?g number-of-groups ?d) - (?a (gnus-topic-articles-in-topic entries) ?d) - (?A total-number-of-articles ?d) - (?l level ?d))) - -(defvar gnus-topic-line-format-spec nil) - -;;; Utility functions - -(defun gnus-group-topic-name () - "The name of the topic on the current line." - (let ((topic (get-text-property (gnus-point-at-bol) 'gnus-topic))) - (and topic (symbol-name topic)))) - -(defun gnus-group-topic-level () - "The level of the topic on the current line." - (get-text-property (gnus-point-at-bol) 'gnus-topic-level)) - -(defun gnus-group-topic-unread () - "The number of unread articles in topic on the current line." - (get-text-property (gnus-point-at-bol) 'gnus-topic-unread)) - -(defun gnus-topic-unread (topic) - "Return the number of unread articles in TOPIC." - (or (cdr (assoc topic gnus-topic-unreads)) - 0)) - -(defun gnus-group-topic-p () - "Return non-nil if the current line is a topic." - (gnus-group-topic-name)) - -(defun gnus-topic-visible-p () - "Return non-nil if the current topic is visible." - (get-text-property (gnus-point-at-bol) 'gnus-topic-visible)) - -(defun gnus-topic-articles-in-topic (entries) - (let ((total 0) - number) - (while entries - (when (numberp (setq number (car (pop entries)))) - (incf total number))) - total)) - -(defun gnus-group-topic (group) - "Return the topic GROUP is a member of." - (let ((alist gnus-topic-alist) - out) - (while alist - (when (member group (cdar alist)) - (setq out (caar alist) - alist nil)) - (setq alist (cdr alist))) - out)) - -(defun gnus-group-parent-topic (group) - "Return the topic GROUP is member of by looking at the group buffer." - (save-excursion - (set-buffer gnus-group-buffer) - (if (gnus-group-goto-group group) - (gnus-current-topic) - (gnus-group-topic group)))) - -(defun gnus-topic-goto-topic (topic) - (when topic - (gnus-goto-char (text-property-any (point-min) (point-max) - 'gnus-topic (intern topic))))) - -(defun gnus-topic-jump-to-topic (topic) - "Go to TOPIC." - (interactive - (list (completing-read "Go to topic: " - (mapcar 'list (gnus-topic-list)) - nil t))) - (dolist (topic (gnus-current-topics topic)) - (gnus-topic-fold t)) - (gnus-topic-goto-topic topic)) - -(defun gnus-current-topic () - "Return the name of the current topic." - (let ((result - (or (get-text-property (point) 'gnus-topic) - (save-excursion - (and (gnus-goto-char (previous-single-property-change - (point) 'gnus-topic)) - (get-text-property (max (1- (point)) (point-min)) - 'gnus-topic)))))) - (when result - (symbol-name result)))) - -(defun gnus-current-topics (&optional topic) - "Return a list of all current topics, lowest in hierarchy first. -If TOPIC, start with that topic." - (let ((topic (or topic (gnus-current-topic))) - topics) - (while topic - (push topic topics) - (setq topic (gnus-topic-parent-topic topic))) - (nreverse topics))) - -(defun gnus-group-active-topic-p () - "Say whether the current topic comes from the active topics." - (save-excursion - (beginning-of-line) - (get-text-property (point) 'gnus-active))) - -(defun gnus-topic-find-groups (topic &optional level all lowest recursive) - "Return entries for all visible groups in TOPIC. -If RECURSIVE is t, return groups in its subtopics too." - (let ((groups (cdr (assoc topic gnus-topic-alist))) - info clevel unread group params visible-groups entry active) - (setq lowest (or lowest 1)) - (setq level (or level gnus-level-unsubscribed)) - ;; We go through the newsrc to look for matches. - (while groups - (when (setq group (pop groups)) - (setq entry (gnus-gethash group gnus-newsrc-hashtb) - info (nth 2 entry) - params (gnus-info-params info) - active (gnus-active group) - unread (or (car entry) - (and (not (equal group "dummy.group")) - active - (- (1+ (cdr active)) (car active)))) - clevel (or (gnus-info-level info) - (if (member group gnus-zombie-list) - gnus-level-zombie gnus-level-killed)))) - (and - info ; nil means that the group is dead. - (<= clevel level) - (>= clevel lowest) ; Is inside the level we want. - (or all - (if (or (eq unread t) - (eq unread nil)) - gnus-group-list-inactive-groups - (> unread 0)) - (and gnus-list-groups-with-ticked-articles - (cdr (assq 'tick (gnus-info-marks info)))) - ;; Has right readedness. - ;; Check for permanent visibility. - (and gnus-permanently-visible-groups - (string-match gnus-permanently-visible-groups group)) - (memq 'visible params) - (cdr (assq 'visible params))) - ;; Add this group to the list of visible groups. - (push (or entry group) visible-groups))) - (setq visible-groups (nreverse visible-groups)) - (when recursive - (if (eq recursive t) - (setq recursive (cdr (gnus-topic-find-topology topic)))) - (mapcar (lambda (topic-topology) - (setq visible-groups - (nconc visible-groups - (gnus-topic-find-groups - (caar topic-topology) - level all lowest topic-topology)))) - (cdr recursive))) - visible-groups)) - -(defun gnus-topic-previous-topic (topic) - "Return the previous topic on the same level as TOPIC." - (let ((top (cddr (gnus-topic-find-topology - (gnus-topic-parent-topic topic))))) - (unless (equal topic (caaar top)) - (while (and top (not (equal (caaadr top) topic))) - (setq top (cdr top))) - (caaar top)))) - -(defun gnus-topic-parent-topic (topic &optional topology) - "Return the parent of TOPIC." - (unless topology - (setq topology gnus-topic-topology)) - (let ((parent (car (pop topology))) - result found) - (while (and topology - (not (setq found (equal (caaar topology) topic))) - (not (setq result (gnus-topic-parent-topic - topic (car topology))))) - (setq topology (cdr topology))) - (or result (and found parent)))) - -(defun gnus-topic-next-topic (topic &optional previous) - "Return the next sibling of TOPIC." - (let ((parentt (cddr (gnus-topic-find-topology - (gnus-topic-parent-topic topic)))) - prev) - (while (and parentt - (not (equal (caaar parentt) topic))) - (setq prev (caaar parentt) - parentt (cdr parentt))) - (if previous - prev - (caaadr parentt)))) - -(defun gnus-topic-forward-topic (num) - "Go to the next topic on the same level as the current one." - (let* ((topic (gnus-current-topic)) - (way (if (< num 0) 'gnus-topic-previous-topic - 'gnus-topic-next-topic)) - (num (abs num))) - (while (and (not (zerop num)) - (setq topic (funcall way topic))) - (when (gnus-topic-goto-topic topic) - (decf num))) - (unless (zerop num) - (goto-char (point-max))) - num)) - -(defun gnus-topic-find-topology (topic &optional topology level remove) - "Return the topology of TOPIC." - (unless topology - (setq topology gnus-topic-topology) - (setq level 0)) - (let ((top topology) - result) - (if (equal (caar topology) topic) - (progn - (when remove - (delq topology remove)) - (cons level topology)) - (setq topology (cdr topology)) - (while (and topology - (not (setq result (gnus-topic-find-topology - topic (car topology) (1+ level) - (and remove top))))) - (setq topology (cdr topology))) - result))) - -(defvar gnus-tmp-topics nil) -(defun gnus-topic-list (&optional topology) - "Return a list of all topics in the topology." - (unless topology - (setq topology gnus-topic-topology - gnus-tmp-topics nil)) - (push (caar topology) gnus-tmp-topics) - (mapcar 'gnus-topic-list (cdr topology)) - gnus-tmp-topics) - -;;; Topic parameter jazz - -(defun gnus-topic-parameters (topic) - "Return the parameters for TOPIC." - (let ((top (gnus-topic-find-topology topic))) - (when top - (nth 3 (cadr top))))) - -(defun gnus-topic-set-parameters (topic parameters) - "Set the topic parameters of TOPIC to PARAMETERS." - (let ((top (gnus-topic-find-topology topic))) - (unless top - (error "No such topic: %s" topic)) - ;; We may have to extend if there is no parameters here - ;; to begin with. - (unless (nthcdr 2 (cadr top)) - (nconc (cadr top) (list nil))) - (unless (nthcdr 3 (cadr top)) - (nconc (cadr top) (list nil))) - (setcar (nthcdr 3 (cadr top)) parameters) - (gnus-dribble-enter - (format "(gnus-topic-set-parameters %S '%S)" topic parameters)))) - -(defun gnus-group-topic-parameters (group) - "Compute the group parameters for GROUP taking into account inheritance from topics." - (let ((params-list (copy-sequence (gnus-group-get-parameter group)))) - (save-excursion - (gnus-group-goto-group group) - (nconc params-list - (gnus-topic-hierarchical-parameters (gnus-current-topic)))))) - -(defun gnus-topic-hierarchical-parameters (topic) - "Return a topic list computed for TOPIC." - (let ((topics (gnus-current-topics topic)) - params-list param out params) - (while topics - (push (gnus-topic-parameters (pop topics)) params-list)) - ;; We probably have lots of nil elements here, so - ;; we remove them. Probably faster than doing this "properly". - (setq params-list (delq nil params-list)) - ;; Now we have all the parameters, so we go through them - ;; and do inheritance in the obvious way. - (while (setq params (pop params-list)) - (while (setq param (pop params)) - (when (atom param) - (setq param (cons param t))) - ;; Override any old versions of this param. - (gnus-pull (car param) out) - (push param out))) - ;; Return the resulting parameter list. - out)) - -;;; General utility functions - -(defun gnus-topic-enter-dribble () - (gnus-dribble-enter - (format "(setq gnus-topic-topology '%S)" gnus-topic-topology))) - -;;; Generating group buffers - -(defun gnus-group-prepare-topics (level &optional predicate lowest - regexp list-topic topic-level) - "List all newsgroups with unread articles of level LEVEL or lower. -Use the `gnus-group-topics' to sort the groups. -If PREDICTE is a function, list groups that the function returns non-nil; -if it is t, list groups that have no unread articles. -If LOWEST is non-nil, list all newsgroups of level LOWEST or higher." - (set-buffer gnus-group-buffer) - (let ((buffer-read-only nil) - (lowest (or lowest 1)) - (not-in-list - (and gnus-group-listed-groups - (copy-sequence gnus-group-listed-groups)))) - - (when (or (not gnus-topic-alist) - (not gnus-topology-checked-p)) - (gnus-topic-check-topology)) - - (unless list-topic - (erase-buffer)) - - ;; List dead groups? - (when (or gnus-group-listed-groups - (and (>= level gnus-level-zombie) - (<= lowest gnus-level-zombie))) - (gnus-group-prepare-flat-list-dead - (setq gnus-zombie-list (sort gnus-zombie-list 'string<)) - gnus-level-zombie ?Z - regexp)) - - (when (or gnus-group-listed-groups - (and (>= level gnus-level-killed) - (<= lowest gnus-level-killed))) - (gnus-group-prepare-flat-list-dead - (setq gnus-killed-list (sort gnus-killed-list 'string<)) - gnus-level-killed ?K regexp) - (when not-in-list - (unless gnus-killed-hashtb - (gnus-make-hashtable-from-killed)) - (gnus-group-prepare-flat-list-dead - (gnus-delete-if (lambda (group) - (or (gnus-gethash group gnus-newsrc-hashtb) - (gnus-gethash group gnus-killed-hashtb))) - not-in-list) - gnus-level-killed ?K regexp))) - - ;; Use topics. - (prog1 - (when (or (< lowest gnus-level-zombie) - gnus-group-listed-groups) - (if list-topic - (let ((top (gnus-topic-find-topology list-topic))) - (gnus-topic-prepare-topic (cdr top) (car top) - (or topic-level level) predicate - nil lowest regexp)) - (gnus-topic-prepare-topic gnus-topic-topology 0 - (or topic-level level) predicate - nil lowest regexp))) - (gnus-group-set-mode-line) - (setq gnus-group-list-mode (cons level predicate)) - (gnus-run-hooks 'gnus-group-prepare-hook)))) - -(defun gnus-topic-prepare-topic (topicl level &optional list-level - predicate silent - lowest regexp) - "Insert TOPIC into the group buffer. -If SILENT, don't insert anything. Return the number of unread -articles in the topic and its subtopics." - (let* ((type (pop topicl)) - (entries (gnus-topic-find-groups - (car type) - (if gnus-group-listed-groups - gnus-level-killed - list-level) - (or predicate gnus-group-listed-groups - (cdr (assq 'visible - (gnus-topic-hierarchical-parameters - (car type))))) - (if gnus-group-listed-groups 0 lowest))) - (visiblep (and (eq (nth 1 type) 'visible) (not silent))) - (gnus-group-indentation - (make-string (* gnus-topic-indent-level level) ? )) - (beg (progn (beginning-of-line) (point))) - (topicl (reverse topicl)) - (all-entries entries) - (point-max (point-max)) - (unread 0) - (topic (car type)) - info entry end active tick) - ;; Insert any sub-topics. - (while topicl - (incf unread - (gnus-topic-prepare-topic - (pop topicl) (1+ level) list-level predicate - (not visiblep) lowest regexp))) - (setq end (point)) - (goto-char beg) - ;; Insert all the groups that belong in this topic. - (while (setq entry (pop entries)) - (when (if (stringp entry) - (gnus-group-prepare-logic - entry - (and - (or (not gnus-group-listed-groups) - (if (< list-level gnus-level-zombie) nil - (let ((entry-level - (if (member entry gnus-zombie-list) - gnus-level-zombie gnus-level-killed))) - (and (<= entry-level list-level) - (>= entry-level lowest))))) - (cond - ((stringp regexp) - (string-match regexp entry)) - ((functionp regexp) - (funcall regexp entry)) - ((null regexp) t) - (t nil)))) - (setq info (nth 2 entry)) - (gnus-group-prepare-logic - (gnus-info-group info) - (and (or (not gnus-group-listed-groups) - (let ((entry-level (gnus-info-level info))) - (and (<= entry-level list-level) - (>= entry-level lowest)))) - (or (not (functionp predicate)) - (funcall predicate info)) - (or (not (stringp regexp)) - (string-match regexp (gnus-info-group info)))))) - (when visiblep - (if (stringp entry) - ;; Dead groups. - (gnus-group-insert-group-line - entry (if (member entry gnus-zombie-list) - gnus-level-zombie gnus-level-killed) - nil (- (1+ (cdr (setq active (gnus-active entry)))) - (car active)) - nil) - ;; Living groups. - (when (setq info (nth 2 entry)) - (gnus-group-insert-group-line - (gnus-info-group info) - (gnus-info-level info) (gnus-info-marks info) - (car entry) (gnus-info-method info))))) - (when (and (listp entry) - (numberp (car entry))) - (incf unread (car entry))) - (when (listp entry) - (setq tick t)))) - (goto-char beg) - ;; Insert the topic line. - (when (and (not silent) - (or gnus-topic-display-empty-topics ;We want empty topics - (not (zerop unread)) ;Non-empty - tick ;Ticked articles - (/= point-max (point-max)))) ;Unactivated groups - (gnus-extent-start-open (point)) - (gnus-topic-insert-topic-line - (car type) visiblep - (not (eq (nth 2 type) 'hidden)) - level all-entries unread)) - (gnus-topic-update-unreads (car type) unread) - (goto-char end) - unread)) - -(defun gnus-topic-remove-topic (&optional insert total-remove hide in-level) - "Remove the current topic." - (let ((topic (gnus-group-topic-name)) - (level (gnus-group-topic-level)) - (beg (progn (beginning-of-line) (point))) - buffer-read-only) - (when topic - (while (and (zerop (forward-line 1)) - (> (or (gnus-group-topic-level) (1+ level)) level))) - (delete-region beg (point)) - ;; Do the change in this rather odd manner because it has been - ;; reported that some topics share parts of some lists, for some - ;; reason. I have been unable to determine why this is the - ;; case, but this hack seems to take care of things. - (let ((data (cadr (gnus-topic-find-topology topic)))) - (setcdr data - (list (if insert 'visible 'invisible) - (caddr data) - (cadddr data)))) - (if total-remove - (setq gnus-topic-alist - (delq (assoc topic gnus-topic-alist) gnus-topic-alist)) - (gnus-topic-insert-topic topic in-level))))) - -(defun gnus-topic-insert-topic (topic &optional level) - "Insert TOPIC." - (gnus-group-prepare-topics - (car gnus-group-list-mode) (cdr gnus-group-list-mode) - nil nil topic level)) - -(defun gnus-topic-fold (&optional insert topic) - "Remove/insert the current topic." - (let ((topic (or topic (gnus-group-topic-name)))) - (when topic - (save-excursion - (if (not (gnus-group-active-topic-p)) - (gnus-topic-remove-topic - (or insert (not (gnus-topic-visible-p)))) - (let ((gnus-topic-topology gnus-topic-active-topology) - (gnus-topic-alist gnus-topic-active-alist) - (gnus-group-list-mode (cons 5 t))) - (gnus-topic-remove-topic - (or insert (not (gnus-topic-visible-p))) nil nil 9) - (gnus-topic-enter-dribble))))))) - -(defun gnus-topic-insert-topic-line (name visiblep shownp level entries - &optional unread) - (let* ((visible (if visiblep "" "...")) - (indentation (make-string (* gnus-topic-indent-level level) ? )) - (total-number-of-articles unread) - (number-of-groups (length entries)) - (active-topic (eq gnus-topic-alist gnus-topic-active-alist)) - gnus-tmp-header) - (gnus-topic-update-unreads name unread) - (beginning-of-line) - ;; Insert the text. - (if shownp - (gnus-add-text-properties - (point) - (prog1 (1+ (point)) - (eval gnus-topic-line-format-spec)) - (list 'gnus-topic (intern name) - 'gnus-topic-level level - 'gnus-topic-unread unread - 'gnus-active active-topic - 'gnus-topic-visible visiblep))))) - -(defun gnus-topic-update-unreads (topic unreads) - (setq gnus-topic-unreads (delq (assoc topic gnus-topic-unreads) - gnus-topic-unreads)) - (push (cons topic unreads) gnus-topic-unreads)) - -(defun gnus-topic-update-topics-containing-group (group) - "Update all topics that have GROUP as a member." - (when (and (eq major-mode 'gnus-group-mode) - gnus-topic-mode) - (save-excursion - (let ((alist gnus-topic-alist)) - ;; This is probably not entirely correct. If a topic - ;; isn't shown, then it's not updated. But the updating - ;; should be performed in any case, since the topic's - ;; parent should be updated. Pfft. - (while alist - (when (and (member group (cdar alist)) - (gnus-topic-goto-topic (caar alist))) - (gnus-topic-update-topic-line (caar alist))) - (pop alist)))))) - -(defun gnus-topic-update-topic () - "Update all parent topics to the current group." - (when (and (eq major-mode 'gnus-group-mode) - gnus-topic-mode) - (let ((group (gnus-group-group-name)) - (m (point-marker)) - (buffer-read-only nil)) - (when (and group - (gnus-get-info group) - (gnus-topic-goto-topic (gnus-current-topic))) - (gnus-topic-update-topic-line (gnus-group-topic-name)) - (goto-char m) - (set-marker m nil) - (gnus-group-position-point))))) - -(defun gnus-topic-goto-missing-group (group) - "Place point where GROUP is supposed to be inserted." - (let* ((topic (gnus-group-topic group)) - (groups (cdr (assoc topic gnus-topic-alist))) - (g (cdr (member group groups))) - (unfound t) - entry) - ;; Try to jump to a visible group. - (while (and g (not (gnus-group-goto-group (car g) t))) - (pop g)) - ;; It wasn't visible, so we try to see where to insert it. - (when (not g) - (setq g (cdr (member group (reverse groups)))) - (while (and g unfound) - (when (gnus-group-goto-group (pop g) t) - (forward-line 1) - (setq unfound nil))) - (when (and unfound - topic - (not (gnus-topic-goto-missing-topic topic))) - (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) - (forward-line 1) - ;; Topic not displayed. - (let* ((top (gnus-topic-find-topology - (gnus-topic-parent-topic topic))) - (tp (reverse (cddr top)))) - (if (not top) - (gnus-topic-insert-topic-line - topic t t (car (gnus-topic-find-topology topic)) nil 0) - (while (not (equal (caaar tp) topic)) - (setq tp (cdr tp))) - (pop tp) - (while (and tp - (not (gnus-topic-goto-topic (caaar tp)))) - (pop tp)) - (if tp - (gnus-topic-forward-topic 1) - (gnus-topic-goto-missing-topic (caadr top))))) - nil)) - -(defun gnus-topic-update-topic-line (topic-name &optional reads) - (let* ((top (gnus-topic-find-topology topic-name)) - (type (cadr top)) - (children (cddr top)) - (entries (gnus-topic-find-groups - (car type) (car gnus-group-list-mode) - (cdr gnus-group-list-mode))) - (parent (gnus-topic-parent-topic topic-name)) - (all-entries entries) - (unread 0) - old-unread entry new-unread) - (when (gnus-topic-goto-topic (car type)) - ;; Tally all the groups that belong in this topic. - (if reads - (setq unread (- (gnus-group-topic-unread) reads)) - (while children - (incf unread (gnus-topic-unread (caar (pop children))))) - (while (setq entry (pop entries)) - (when (numberp (car entry)) - (incf unread (car entry))))) - (setq old-unread (gnus-group-topic-unread)) - ;; Insert the topic line. - (gnus-topic-insert-topic-line - (car type) (gnus-topic-visible-p) - (not (eq (nth 2 type) 'hidden)) - (gnus-group-topic-level) all-entries unread) - (gnus-delete-line) - (forward-line -1) - (setq new-unread (gnus-group-topic-unread))) - (when parent - (forward-line -1) - (gnus-topic-update-topic-line - parent - (- (or old-unread 0) (or new-unread 0)))) - unread)) - -(defun gnus-topic-group-indentation () - (make-string - (* gnus-topic-indent-level - (or (save-excursion - (forward-line -1) - (gnus-topic-goto-topic (gnus-current-topic)) - (gnus-group-topic-level)) - 0)) - ? )) - -;;; Initialization - -(gnus-add-shutdown 'gnus-topic-close 'gnus) - -(defun gnus-topic-close () - (setq gnus-topic-active-topology nil - gnus-topic-active-alist nil - gnus-topic-killed-topics nil - gnus-topology-checked-p nil)) - -(defun gnus-topic-check-topology () - ;; The first time we set the topology to whatever we have - ;; gotten here, which can be rather random. - (unless gnus-topic-alist - (gnus-topic-init-alist)) - - (setq gnus-topology-checked-p t) - ;; Go through the topic alist and make sure that all topics - ;; are in the topic topology. - (let ((topics (gnus-topic-list)) - (alist gnus-topic-alist) - changed) - (while alist - (unless (member (caar alist) topics) - (nconc gnus-topic-topology - (list (list (list (caar alist) 'visible)))) - (setq changed t)) - (setq alist (cdr alist))) - (when changed - (gnus-topic-enter-dribble)) - ;; Conversely, go through the topology and make sure that all - ;; topologies have alists. - (while topics - (unless (assoc (car topics) gnus-topic-alist) - (push (list (car topics)) gnus-topic-alist)) - (pop topics))) - ;; Go through all living groups and make sure that - ;; they belong to some topic. - (let* ((tgroups (apply 'append (mapcar (lambda (entry) (cdr entry)) - gnus-topic-alist))) - (entry (last (assoc (caar gnus-topic-topology) gnus-topic-alist))) - (newsrc (cdr gnus-newsrc-alist)) - group) - (while newsrc - (unless (member (setq group (gnus-info-group (pop newsrc))) tgroups) - (setcdr entry (list group)) - (setq entry (cdr entry))))) - ;; Go through all topics and make sure they contain only living groups. - (let ((alist gnus-topic-alist) - topic) - (while (setq topic (pop alist)) - (while (cdr topic) - (if (and (cadr topic) - (gnus-gethash (cadr topic) gnus-newsrc-hashtb)) - (setq topic (cdr topic)) - (setcdr topic (cddr topic))))))) - -(defun gnus-topic-init-alist () - "Initialize the topic structures." - (setq gnus-topic-topology - (cons (list "Gnus" 'visible) - (mapcar (lambda (topic) - (list (list (car topic) 'visible))) - '(("misc"))))) - (setq gnus-topic-alist - (list (cons "misc" - (mapcar (lambda (info) (gnus-info-group info)) - (cdr gnus-newsrc-alist))) - (list "Gnus"))) - (gnus-topic-enter-dribble)) - -;;; Maintenance - -(defun gnus-topic-clean-alist () - "Remove bogus groups from the topic alist." - (let ((topic-alist gnus-topic-alist) - result topic) - (unless gnus-killed-hashtb - (gnus-make-hashtable-from-killed)) - (while (setq topic (pop topic-alist)) - (let ((topic-name (pop topic)) - group filtered-topic) - (while (setq group (pop topic)) - (when (and (or (gnus-gethash group gnus-active-hashtb) - (gnus-info-method (gnus-get-info group))) - (not (gnus-gethash group gnus-killed-hashtb))) - (push group filtered-topic))) - (push (cons topic-name (nreverse filtered-topic)) result))) - (setq gnus-topic-alist (nreverse result)))) - -(defun gnus-topic-change-level (group level oldlevel &optional previous) - "Run when changing levels to enter/remove groups from topics." - (save-excursion - (set-buffer gnus-group-buffer) - (let ((buffer-read-only nil)) - (unless gnus-topic-inhibit-change-level - (gnus-group-goto-group (or (car (nth 2 previous)) group)) - (when (and gnus-topic-mode - gnus-topic-alist - (not gnus-topic-inhibit-change-level)) - ;; Remove the group from the topics. - (if (and (< oldlevel gnus-level-zombie) - (>= level gnus-level-zombie)) - (let ((alist gnus-topic-alist)) - (while (gnus-group-goto-group group) - (gnus-delete-line)) - (while alist - (when (member group (car alist)) - (setcdr (car alist) (delete group (cdar alist)))) - (pop alist))) - ;; If the group is subscribed we enter it into the topics. - (when (and (< level gnus-level-zombie) - (>= oldlevel gnus-level-zombie)) - (let* ((prev (gnus-group-group-name)) - (gnus-topic-inhibit-change-level t) - (gnus-group-indentation - (make-string - (* gnus-topic-indent-level - (or (save-excursion - (gnus-topic-goto-topic (gnus-current-topic)) - (gnus-group-topic-level)) - 0)) - ? )) - (yanked (list group)) - alist talist end) - ;; Then we enter the yanked groups into the topics they belong - ;; to. - (when (setq alist (assoc (save-excursion - (forward-line -1) - (or - (gnus-current-topic) - (caar gnus-topic-topology))) - gnus-topic-alist)) - (setq talist alist) - (when (stringp yanked) - (setq yanked (list yanked))) - (if (not prev) - (nconc alist yanked) - (if (not (cdr alist)) - (setcdr alist (nconc yanked (cdr alist))) - (while (and (not end) (cdr alist)) - (when (equal (cadr alist) prev) - (setcdr alist (nconc yanked (cdr alist))) - (setq end t)) - (setq alist (cdr alist))) - (unless end - (nconc talist yanked)))))) - (gnus-topic-update-topic)))))))) - -(defun gnus-topic-goto-next-group (group props) - "Go to group or the next group after group." - (if (not group) - (if (not (memq 'gnus-topic props)) - (goto-char (point-max)) - (gnus-topic-goto-topic (symbol-name (cadr (memq 'gnus-topic props))))) - (if (gnus-group-goto-group group) - t - ;; The group is no longer visible. - (let* ((list (assoc (gnus-group-topic group) gnus-topic-alist)) - (after (cdr (member group (cdr list))))) - ;; First try to put point on a group after the current one. - (while (and after - (not (gnus-group-goto-group (car after)))) - (setq after (cdr after))) - ;; Then try to put point on a group before point. - (unless after - (setq after (cdr (member group (reverse (cdr list))))) - (while (and after - (not (gnus-group-goto-group (car after)))) - (setq after (cdr after)))) - ;; Finally, just put point on the topic. - (if (not (car list)) - (goto-char (point-min)) - (unless after - (gnus-topic-goto-topic (car list)) - (setq after nil))) - t)))) - -;;; Topic-active functions - -(defun gnus-topic-grok-active (&optional force) - "Parse all active groups and create topic structures for them." - ;; First we make sure that we have really read the active file. - (when (or force - (not gnus-topic-active-alist)) - (let (groups) - ;; Get a list of all groups available. - (mapatoms (lambda (g) (when (symbol-value g) - (push (symbol-name g) groups))) - gnus-active-hashtb) - (setq groups (sort groups 'string<)) - ;; Init the variables. - (setq gnus-topic-active-topology (list (list "" 'visible))) - (setq gnus-topic-active-alist nil) - ;; Descend the top-level hierarchy. - (gnus-topic-grok-active-1 gnus-topic-active-topology groups) - ;; Set the top-level topic names to something nice. - (setcar (car gnus-topic-active-topology) "Gnus active") - (setcar (car gnus-topic-active-alist) "Gnus active")))) - -(defun gnus-topic-grok-active-1 (topology groups) - (let* ((name (caar topology)) - (prefix (concat "^" (regexp-quote name))) - tgroups ntopology group) - (while (and groups - (string-match prefix (setq group (car groups)))) - (if (not (string-match "\\." group (match-end 0))) - ;; There are no further hierarchies here, so we just - ;; enter this group into the list belonging to this - ;; topic. - (push (pop groups) tgroups) - ;; New sub-hierarchy, so we add it to the topology. - (nconc topology (list (setq ntopology - (list (list (substring - group 0 (match-end 0)) - 'invisible))))) - ;; Descend the hierarchy. - (setq groups (gnus-topic-grok-active-1 ntopology groups)))) - ;; We remove the trailing "." from the topic name. - (setq name - (if (string-match "\\.$" name) - (substring name 0 (match-beginning 0)) - name)) - ;; Add this topic and its groups to the topic alist. - (push (cons name (nreverse tgroups)) gnus-topic-active-alist) - (setcar (car topology) name) - ;; We return the rest of the groups that didn't belong - ;; to this topic. - groups)) - -;;; Topic mode, commands and keymap. - -(defvar gnus-topic-mode-map nil) -(defvar gnus-group-topic-map nil) - -(unless gnus-topic-mode-map - (setq gnus-topic-mode-map (make-sparse-keymap)) - - ;; Override certain group mode keys. - (gnus-define-keys gnus-topic-mode-map - "=" gnus-topic-select-group - "\r" gnus-topic-select-group - " " gnus-topic-read-group - "\C-c\C-x" gnus-topic-expire-articles - "\C-k" gnus-topic-kill-group - "\C-y" gnus-topic-yank-group - "\M-g" gnus-topic-get-new-news-this-topic - "AT" gnus-topic-list-active - "Gp" gnus-topic-edit-parameters - "#" gnus-topic-mark-topic - "\M-#" gnus-topic-unmark-topic - [tab] gnus-topic-indent - [(meta tab)] gnus-topic-unindent - "\C-i" gnus-topic-indent - "\M-\C-i" gnus-topic-unindent - gnus-mouse-2 gnus-mouse-pick-topic) - - ;; Define a new submap. - (gnus-define-keys (gnus-group-topic-map "T" gnus-topic-mode-map) - "#" gnus-topic-mark-topic - "\M-#" gnus-topic-unmark-topic - "n" gnus-topic-create-topic - "m" gnus-topic-move-group - "D" gnus-topic-remove-group - "c" gnus-topic-copy-group - "h" gnus-topic-hide-topic - "s" gnus-topic-show-topic - "j" gnus-topic-jump-to-topic - "M" gnus-topic-move-matching - "C" gnus-topic-copy-matching - "\C-i" gnus-topic-indent - [tab] gnus-topic-indent - "r" gnus-topic-rename - "\177" gnus-topic-delete - [delete] gnus-topic-delete - "H" gnus-topic-toggle-display-empty-topics) - - (gnus-define-keys (gnus-topic-sort-map "S" gnus-group-topic-map) - "s" gnus-topic-sort-groups - "a" gnus-topic-sort-groups-by-alphabet - "u" gnus-topic-sort-groups-by-unread - "l" gnus-topic-sort-groups-by-level - "v" gnus-topic-sort-groups-by-score - "r" gnus-topic-sort-groups-by-rank - "m" gnus-topic-sort-groups-by-method)) - -(defun gnus-topic-make-menu-bar () - (unless (boundp 'gnus-topic-menu) - (easy-menu-define - gnus-topic-menu gnus-topic-mode-map "" - '("Topics" - ["Toggle topics" gnus-topic-mode t] - ("Groups" - ["Copy" gnus-topic-copy-group t] - ["Move" gnus-topic-move-group t] - ["Remove" gnus-topic-remove-group t] - ["Copy matching" gnus-topic-copy-matching t] - ["Move matching" gnus-topic-move-matching t]) - ("Topics" - ["Goto" gnus-topic-jump-to-topic t] - ["Show" gnus-topic-show-topic t] - ["Hide" gnus-topic-hide-topic t] - ["Delete" gnus-topic-delete t] - ["Rename" gnus-topic-rename t] - ["Create" gnus-topic-create-topic t] - ["Mark" gnus-topic-mark-topic t] - ["Indent" gnus-topic-indent t] - ["Sort" gnus-topic-sort-topics t] - ["Toggle hide empty" gnus-topic-toggle-display-empty-topics t] - ["Edit parameters" gnus-topic-edit-parameters t]) - ["List active" gnus-topic-list-active t])))) - -(defun gnus-topic-mode (&optional arg redisplay) - "Minor mode for topicsifying Gnus group buffers." - (interactive (list current-prefix-arg t)) - (when (eq major-mode 'gnus-group-mode) - (make-local-variable 'gnus-topic-mode) - (setq gnus-topic-mode - (if (null arg) (not gnus-topic-mode) - (> (prefix-numeric-value arg) 0))) - ;; Infest Gnus with topics. - (if (not gnus-topic-mode) - (setq gnus-goto-missing-group-function nil) - (when (gnus-visual-p 'topic-menu 'menu) - (gnus-topic-make-menu-bar)) - (gnus-set-format 'topic t) - (gnus-add-minor-mode 'gnus-topic-mode " Topic" - gnus-topic-mode-map nil (lambda (&rest junk) - (interactive) - (gnus-topic-mode nil t))) - (add-hook 'gnus-group-catchup-group-hook 'gnus-topic-update-topic) - (set (make-local-variable 'gnus-group-prepare-function) - 'gnus-group-prepare-topics) - (set (make-local-variable 'gnus-group-get-parameter-function) - 'gnus-group-topic-parameters) - (set (make-local-variable 'gnus-group-goto-next-group-function) - 'gnus-topic-goto-next-group) - (set (make-local-variable 'gnus-group-indentation-function) - 'gnus-topic-group-indentation) - (set (make-local-variable 'gnus-group-update-group-function) - 'gnus-topic-update-topics-containing-group) - (set (make-local-variable 'gnus-group-sort-alist-function) - 'gnus-group-sort-topic) - (setq gnus-group-change-level-function 'gnus-topic-change-level) - (setq gnus-goto-missing-group-function 'gnus-topic-goto-missing-group) - (make-local-hook 'gnus-check-bogus-groups-hook) - (add-hook 'gnus-check-bogus-groups-hook 'gnus-topic-clean-alist) - (setq gnus-topology-checked-p nil) - ;; We check the topology. - (when gnus-newsrc-alist - (gnus-topic-check-topology)) - (gnus-run-hooks 'gnus-topic-mode-hook)) - ;; Remove topic infestation. - (unless gnus-topic-mode - (remove-hook 'gnus-summary-exit-hook 'gnus-topic-update-topic) - (setq gnus-group-change-level-function nil) - (remove-hook 'gnus-check-bogus-groups-hook 'gnus-topic-clean-alist) - (setq gnus-group-prepare-function 'gnus-group-prepare-flat) - (setq gnus-group-sort-alist-function 'gnus-group-sort-flat)) - (when redisplay - (gnus-group-list-groups)))) - -(defun gnus-topic-select-group (&optional all) - "Select this newsgroup. -No article is selected automatically. -If the group is opened, just switch the summary buffer. -If ALL is non-nil, already read articles become readable. -If ALL is a number, fetch this number of articles. - -If performed over a topic line, toggle folding the topic." - (interactive "P") - (if (gnus-group-topic-p) - (let ((gnus-group-list-mode - (if all (cons (if (numberp all) all 7) t) gnus-group-list-mode))) - (gnus-topic-fold all) - (gnus-dribble-touch)) - (gnus-group-select-group all))) - -(defun gnus-mouse-pick-topic (e) - "Select the group or topic under the mouse pointer." - (interactive "e") - (mouse-set-point e) - (gnus-topic-read-group nil)) - -(defun gnus-topic-expire-articles (topic) - "Expire articles in this topic or group." - (interactive (list (gnus-group-topic-name))) - (if (not topic) - (call-interactively 'gnus-group-expire-articles) - (save-excursion - (gnus-message 5 "Expiring groups in %s..." topic) - (let ((gnus-group-marked - (mapcar (lambda (entry) (car (nth 2 entry))) - (gnus-topic-find-groups topic gnus-level-killed t)))) - (gnus-group-expire-articles nil)) - (gnus-message 5 "Expiring groups in %s...done" topic)))) - -(defun gnus-topic-read-group (&optional all no-article group) - "Read news in this newsgroup. -If the prefix argument ALL is non-nil, already read articles become -readable. IF ALL is a number, fetch this number of articles. If the -optional argument NO-ARTICLE is non-nil, no article will be -auto-selected upon group entry. If GROUP is non-nil, fetch that -group. - -If performed over a topic line, toggle folding the topic." - (interactive "P") - (if (gnus-group-topic-p) - (let ((gnus-group-list-mode - (if all (cons (if (numberp all) all 7) t) gnus-group-list-mode))) - (gnus-topic-fold all)) - (gnus-group-read-group all no-article group))) - -(defun gnus-topic-create-topic (topic parent &optional previous full-topic) - "Create a new TOPIC under PARENT. -When used interactively, PARENT will be the topic under point." - (interactive - (list - (read-string "New topic: ") - (gnus-current-topic))) - ;; Check whether this topic already exists. - (when (gnus-topic-find-topology topic) - (error "Topic already exists")) - (unless parent - (setq parent (caar gnus-topic-topology))) - (let ((top (cdr (gnus-topic-find-topology parent))) - (full-topic (or full-topic (list (list topic 'visible nil nil))))) - (unless top - (error "No such parent topic: %s" parent)) - (if previous - (progn - (while (and (cdr top) - (not (equal (caaadr top) previous))) - (setq top (cdr top))) - (setcdr top (cons full-topic (cdr top)))) - (nconc top (list full-topic))) - (unless (assoc topic gnus-topic-alist) - (push (list topic) gnus-topic-alist))) - (gnus-topic-enter-dribble) - (gnus-group-list-groups) - (gnus-topic-goto-topic topic)) - -;; FIXME: -;; 1. When the marked groups are overlapped with the process -;; region, the behavior of move or remove is not right. -;; 2. Can't process on several marked groups with a same name, -;; because gnus-group-marked only keeps one copy. - -(defun gnus-topic-move-group (n topic &optional copyp) - "Move the next N groups to TOPIC. -If COPYP, copy the groups instead." - (interactive - (list current-prefix-arg - (completing-read "Move to topic: " gnus-topic-alist nil t))) - (let ((use-marked (and (not n) (not (gnus-region-active-p)) - gnus-group-marked t)) - (groups (gnus-group-process-prefix n)) - (topicl (assoc topic gnus-topic-alist)) - (start-topic (gnus-group-topic-name)) - (start-group (progn (forward-line 1) (gnus-group-group-name))) - entry) - (if (and (not groups) (not copyp) start-topic) - (gnus-topic-move start-topic topic) - (mapcar - (lambda (g) - (gnus-group-remove-mark g use-marked) - (when (and - (setq entry (assoc (gnus-current-topic) gnus-topic-alist)) - (not copyp)) - (setcdr entry (gnus-delete-first g (cdr entry)))) - (nconc topicl (list g))) - groups) - (gnus-topic-enter-dribble) - (if start-group - (gnus-group-goto-group start-group) - (gnus-topic-goto-topic start-topic)) - (gnus-group-list-groups)))) - -(defun gnus-topic-remove-group (&optional n) - "Remove the current group from the topic." - (interactive "P") - (let ((use-marked (and (not n) (not (gnus-region-active-p)) - gnus-group-marked t)) - (groups (gnus-group-process-prefix n))) - (mapcar - (lambda (group) - (gnus-group-remove-mark group use-marked) - (let ((topicl (assoc (gnus-current-topic) gnus-topic-alist)) - (buffer-read-only nil)) - (when (and topicl group) - (gnus-delete-line) - (gnus-delete-first group topicl)) - (gnus-topic-update-topic))) - groups) - (gnus-topic-enter-dribble) - (gnus-group-position-point))) - -(defun gnus-topic-copy-group (n topic) - "Copy the current group to a topic." - (interactive - (list current-prefix-arg - (completing-read "Copy to topic: " gnus-topic-alist nil t))) - (gnus-topic-move-group n topic t)) - -(defun gnus-topic-kill-group (&optional n discard) - "Kill the next N groups." - (interactive "P") - (if (gnus-group-topic-p) - (let ((topic (gnus-group-topic-name))) - (push (cons - (gnus-topic-find-topology topic) - (assoc topic gnus-topic-alist)) - gnus-topic-killed-topics) - (gnus-topic-remove-topic nil t) - (gnus-topic-find-topology topic nil nil gnus-topic-topology) - (gnus-topic-enter-dribble)) - (gnus-group-kill-group n discard) - (if (not (gnus-group-topic-p)) - (gnus-topic-update-topic) - ;; Move up one line so that we update the right topic. - (forward-line -1) - (gnus-topic-update-topic) - (forward-line 1)))) - -(defun gnus-topic-yank-group (&optional arg) - "Yank the last topic." - (interactive "p") - (if gnus-topic-killed-topics - (let* ((previous - (or (gnus-group-topic-name) - (gnus-topic-next-topic (gnus-current-topic)))) - (data (pop gnus-topic-killed-topics)) - (alist (cdr data)) - (item (cdar data))) - (push alist gnus-topic-alist) - (gnus-topic-create-topic - (caar item) (gnus-topic-parent-topic previous) previous - item) - (gnus-topic-enter-dribble) - (gnus-topic-goto-topic (caar item))) - (let* ((prev (gnus-group-group-name)) - (gnus-topic-inhibit-change-level t) - (gnus-group-indentation - (make-string - (* gnus-topic-indent-level - (or (save-excursion - (gnus-topic-goto-topic (gnus-current-topic)) - (gnus-group-topic-level)) - 0)) - ? )) - yanked alist) - ;; We first yank the groups the normal way... - (setq yanked (gnus-group-yank-group arg)) - ;; Then we enter the yanked groups into the topics they belong - ;; to. - (setq alist (assoc (save-excursion - (forward-line -1) - (gnus-current-topic)) - gnus-topic-alist)) - (when (stringp yanked) - (setq yanked (list yanked))) - (if (not prev) - (nconc alist yanked) - (if (not (cdr alist)) - (setcdr alist (nconc yanked (cdr alist))) - (while (cdr alist) - (when (equal (cadr alist) prev) - (setcdr alist (nconc yanked (cdr alist))) - (setq alist nil)) - (setq alist (cdr alist)))))) - (gnus-topic-update-topic))) - -(defun gnus-topic-hide-topic (&optional permanent) - "Hide the current topic. -If PERMANENT, make it stay hidden in subsequent sessions as well." - (interactive "P") - (when (gnus-current-topic) - (gnus-topic-goto-topic (gnus-current-topic)) - (if permanent - (setcar (cddr - (cadr - (gnus-topic-find-topology (gnus-current-topic)))) - 'hidden)) - (gnus-topic-remove-topic nil nil))) - -(defun gnus-topic-show-topic (&optional permanent) - "Show the hidden topic. -If PERMANENT, make it stay shown in subsequent sessions as well." - (interactive "P") - (when (gnus-group-topic-p) - (if (not permanent) - (gnus-topic-remove-topic t nil) - (let ((topic - (gnus-topic-find-topology - (completing-read "Show topic: " gnus-topic-alist nil t)))) - (setcar (cddr (cadr topic)) nil) - (setcar (cdr (cadr topic)) 'visible) - (gnus-group-list-groups))))) - -(defun gnus-topic-mark-topic (topic &optional unmark recursive) - "Mark all groups in the TOPIC with the process mark. -If RECURSIVE is t, mark its subtopics too." - (interactive (list (gnus-group-topic-name) - nil - (and current-prefix-arg t))) - (if (not topic) - (call-interactively 'gnus-group-mark-group) - (save-excursion - (let ((groups (gnus-topic-find-groups topic gnus-level-killed t nil - recursive))) - (while groups - (funcall (if unmark 'gnus-group-remove-mark 'gnus-group-set-mark) - (gnus-info-group (nth 2 (pop groups))))))))) - -(defun gnus-topic-unmark-topic (topic &optional dummy recursive) - "Remove the process mark from all groups in the TOPIC. -If RECURSIVE is t, unmark its subtopics too." - (interactive (list (gnus-group-topic-name) - nil - (and current-prefix-arg t))) - (if (not topic) - (call-interactively 'gnus-group-unmark-group) - (gnus-topic-mark-topic topic t recursive))) - -(defun gnus-topic-get-new-news-this-topic (&optional n) - "Check for new news in the current topic." - (interactive "P") - (if (not (gnus-group-topic-p)) - (gnus-group-get-new-news-this-group n) - (let* ((topic (gnus-group-topic-name)) - (data (cadr (gnus-topic-find-topology topic)))) - (save-excursion - (gnus-topic-mark-topic topic nil (and n t)) - (gnus-group-get-new-news-this-group)) - (gnus-topic-remove-topic (eq 'visible (cadr data)))))) - -(defun gnus-topic-move-matching (regexp topic &optional copyp) - "Move all groups that match REGEXP to some topic." - (interactive - (let (topic) - (nreverse - (list - (setq topic (completing-read "Move to topic: " gnus-topic-alist nil t)) - (read-string (format "Move to %s (regexp): " topic)))))) - (gnus-group-mark-regexp regexp) - (gnus-topic-move-group nil topic copyp)) - -(defun gnus-topic-copy-matching (regexp topic &optional copyp) - "Copy all groups that match REGEXP to some topic." - (interactive - (let (topic) - (nreverse - (list - (setq topic (completing-read "Copy to topic: " gnus-topic-alist nil t)) - (read-string (format "Copy to %s (regexp): " topic)))))) - (gnus-topic-move-matching regexp topic t)) - -(defun gnus-topic-delete (topic) - "Delete a topic." - (interactive (list (gnus-group-topic-name))) - (unless topic - (error "No topic to be deleted")) - (let ((entry (assoc topic gnus-topic-alist)) - (buffer-read-only nil)) - (when (cdr entry) - (error "Topic not empty")) - ;; Delete if visible. - (when (gnus-topic-goto-topic topic) - (gnus-delete-line)) - ;; Remove from alist. - (setq gnus-topic-alist (delq entry gnus-topic-alist)) - ;; Remove from topology. - (gnus-topic-find-topology topic nil nil 'delete) - (gnus-dribble-touch))) - -(defun gnus-topic-rename (old-name new-name) - "Rename a topic." - (interactive - (let ((topic (gnus-current-topic))) - (list topic - (read-string "Rename topic to: " topic)))) - ;; Check whether the new name exists. - (when (gnus-topic-find-topology new-name) - (error "Topic '%s' already exists" new-name)) - ;; "nil" is an invalid name, for reasons I'd rather not go - ;; into here. Trust me. - (when (equal new-name "nil") - (error "Invalid name: %s" nil)) - ;; Do the renaming. - (let ((top (gnus-topic-find-topology old-name)) - (entry (assoc old-name gnus-topic-alist))) - (when top - (setcar (cadr top) new-name)) - (when entry - (setcar entry new-name)) - (forward-line -1) - (gnus-dribble-touch) - (gnus-group-list-groups) - (forward-line 1))) - -(defun gnus-topic-indent (&optional unindent) - "Indent a topic -- make it a sub-topic of the previous topic. -If UNINDENT, remove an indentation." - (interactive "P") - (if unindent - (gnus-topic-unindent) - (let* ((topic (gnus-current-topic)) - (parent (gnus-topic-previous-topic topic)) - (buffer-read-only nil)) - (unless parent - (error "Nothing to indent %s into" topic)) - (when topic - (gnus-topic-goto-topic topic) - (gnus-topic-kill-group) - (push (cdar gnus-topic-killed-topics) gnus-topic-alist) - (gnus-topic-create-topic - topic parent nil (cdaar gnus-topic-killed-topics)) - (pop gnus-topic-killed-topics) - (or (gnus-topic-goto-topic topic) - (gnus-topic-goto-topic parent)))))) - -(defun gnus-topic-unindent () - "Unindent a topic." - (interactive) - (let* ((topic (gnus-current-topic)) - (parent (gnus-topic-parent-topic topic)) - (grandparent (gnus-topic-parent-topic parent))) - (unless grandparent - (error "Nothing to indent %s into" topic)) - (when topic - (gnus-topic-goto-topic topic) - (gnus-topic-kill-group) - (push (cdar gnus-topic-killed-topics) gnus-topic-alist) - (gnus-topic-create-topic - topic grandparent (gnus-topic-next-topic parent) - (cdaar gnus-topic-killed-topics)) - (pop gnus-topic-killed-topics) - (gnus-topic-goto-topic topic)))) - -(defun gnus-topic-list-active (&optional force) - "List all groups that Gnus knows about in a topicsified fashion. -If FORCE, always re-read the active file." - (interactive "P") - (when force - (gnus-get-killed-groups)) - (gnus-topic-grok-active force) - (let ((gnus-topic-topology gnus-topic-active-topology) - (gnus-topic-alist gnus-topic-active-alist) - gnus-killed-list gnus-zombie-list) - (gnus-group-list-groups gnus-level-killed nil 1))) - -(defun gnus-topic-toggle-display-empty-topics () - "Show/hide topics that have no unread articles." - (interactive) - (setq gnus-topic-display-empty-topics - (not gnus-topic-display-empty-topics)) - (gnus-group-list-groups) - (message "%s empty topics" - (if gnus-topic-display-empty-topics - "Showing" "Hiding"))) - -;;; Topic sorting functions - -(defun gnus-topic-edit-parameters (group) - "Edit the group parameters of GROUP. -If performed on a topic, edit the topic parameters instead." - (interactive (list (gnus-group-group-name))) - (if group - (gnus-group-edit-group-parameters group) - (if (not (gnus-group-topic-p)) - (error "Nothing to edit on the current line") - (let ((topic (gnus-group-topic-name))) - (gnus-edit-form - (gnus-topic-parameters topic) - (format "Editing the topic parameters for `%s'." - (or group topic)) - `(lambda (form) - (gnus-topic-set-parameters ,topic form))))))) - -(defun gnus-group-sort-topic (func reverse) - "Sort groups in the topics according to FUNC and REVERSE." - (let ((alist gnus-topic-alist)) - (while alist - ;; !!!Sometimes nil elements sneak into the alist, - ;; for some reason or other. - (setcar alist (delq nil (car alist))) - (setcar alist (delete "dummy.group" (car alist))) - (gnus-topic-sort-topic (pop alist) func reverse)))) - -(defun gnus-topic-sort-topic (topic func reverse) - ;; Each topic only lists the name of the group, while - ;; the sort predicates expect group infos as inputs. - ;; So we first transform the group names into infos, - ;; then sort, and then transform back into group names. - (setcdr - topic - (mapcar - (lambda (info) (gnus-info-group info)) - (sort - (mapcar - (lambda (group) (gnus-get-info group)) - (cdr topic)) - func))) - ;; Do the reversal, if necessary. - (when reverse - (setcdr topic (nreverse (cdr topic))))) - -(defun gnus-topic-sort-groups (func &optional reverse) - "Sort the current topic according to FUNC. -If REVERSE, reverse the sorting order." - (interactive (list gnus-group-sort-function current-prefix-arg)) - (let ((topic (assoc (gnus-current-topic) gnus-topic-alist))) - (gnus-topic-sort-topic - topic (gnus-make-sort-function func) reverse) - (gnus-group-list-groups))) - -(defun gnus-topic-sort-groups-by-alphabet (&optional reverse) - "Sort the current topic alphabetically by group name. -If REVERSE, sort in reverse order." - (interactive "P") - (gnus-topic-sort-groups 'gnus-group-sort-by-alphabet reverse)) - -(defun gnus-topic-sort-groups-by-unread (&optional reverse) - "Sort the current topic by number of unread articles. -If REVERSE, sort in reverse order." - (interactive "P") - (gnus-topic-sort-groups 'gnus-group-sort-by-unread reverse)) - -(defun gnus-topic-sort-groups-by-level (&optional reverse) - "Sort the current topic by group level. -If REVERSE, sort in reverse order." - (interactive "P") - (gnus-topic-sort-groups 'gnus-group-sort-by-level reverse)) - -(defun gnus-topic-sort-groups-by-score (&optional reverse) - "Sort the current topic by group score. -If REVERSE, sort in reverse order." - (interactive "P") - (gnus-topic-sort-groups 'gnus-group-sort-by-score reverse)) - -(defun gnus-topic-sort-groups-by-rank (&optional reverse) - "Sort the current topic by group rank. -If REVERSE, sort in reverse order." - (interactive "P") - (gnus-topic-sort-groups 'gnus-group-sort-by-rank reverse)) - -(defun gnus-topic-sort-groups-by-method (&optional reverse) - "Sort the current topic alphabetically by backend name. -If REVERSE, sort in reverse order." - (interactive "P") - (gnus-topic-sort-groups 'gnus-group-sort-by-method reverse)) - -(defun gnus-topic-sort-topics-1 (top reverse) - (if (cdr top) - (let ((subtop - (mapcar (gnus-byte-compile - `(lambda (top) - (gnus-topic-sort-topics-1 top ,reverse))) - (sort (cdr top) - (lambda (t1 t2) - (string-lessp (caar t1) (caar t2))))))) - (setcdr top (if reverse (reverse subtop) subtop)))) - top) - -(defun gnus-topic-sort-topics (&optional topic reverse) - "Sort topics in TOPIC alphabeticaly by topic name. -If REVERSE, reverse the sorting order." - (interactive - (list (completing-read "Sort topics in : " gnus-topic-alist nil t - (gnus-current-topic)) - current-prefix-arg)) - (let ((topic-topology (or (and topic (cdr (gnus-topic-find-topology topic))) - gnus-topic-topology))) - (gnus-topic-sort-topics-1 topic-topology reverse) - (gnus-topic-enter-dribble) - (gnus-group-list-groups) - (gnus-topic-goto-topic topic))) - -(defun gnus-topic-move (current to) - "Move the CURRENT topic to TO." - (interactive - (list - (gnus-group-topic-name) - (completing-read "Move to topic: " gnus-topic-alist nil t))) - (unless (and current to) - (error "Can't find topic")) - (let ((current-top (cdr (gnus-topic-find-topology current))) - (to-top (cdr (gnus-topic-find-topology to)))) - (unless current-top - (error "Can't find topic `%s'" current)) - (unless to-top - (error "Can't find topic `%s'" to)) - (if (gnus-topic-find-topology to current-top 0);; Don't care the level - (error "Can't move `%s' to its sub-level" current)) - (gnus-topic-find-topology current nil nil 'delete) - (while (cdr to-top) - (setq to-top (cdr to-top))) - (setcdr to-top (list current-top)) - (gnus-topic-enter-dribble) - (gnus-group-list-groups) - (gnus-topic-goto-topic current))) - -(defun gnus-subscribe-topics (newsgroup) - (catch 'end - (let (match gnus-group-change-level-function) - (dolist (topic (gnus-topic-list)) - (when (and (setq match (cdr (assq 'subscribe - (gnus-topic-parameters topic)))) - (string-match match newsgroup)) - ;; Just subscribe the group. - (gnus-subscribe-alphabetically newsgroup) - ;; Add the group to the topic. - (nconc (assoc topic gnus-topic-alist) (list newsgroup)) - (throw 'end t))) - nil))) - -(provide 'gnus-topic) - -;;; gnus-topic.el ends here diff --git a/lisp/gnus-undo.el b/lisp/gnus-undo.el deleted file mode 100644 index 7dd333f..0000000 --- a/lisp/gnus-undo.el +++ /dev/null @@ -1,195 +0,0 @@ -;;; gnus-undo.el --- minor mode for undoing in Gnus - -;; Copyright (C) 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; This package allows arbitrary undoing in Gnus buffers. As all the -;; Gnus buffers aren't very text-oriented (what is in the buffers is -;; just some arbitrary representation of the actual data), normal Emacs -;; undoing doesn't work at all for Gnus. -;; -;; This package works by letting Gnus register functions for reversing -;; actions, and then calling these functions when the user pushes the -;; `undo' key. As with normal `undo', there it is possible to set -;; undo boundaries and so on. -;; -;; Internally, the undo sequence is represented by the -;; `gnus-undo-actions' list, where each element is a list of functions -;; to be called, in sequence, to undo some action. (An "action" is a -;; collection of functions.) -;; -;; For instance, a function for killing a group will call -;; `gnus-undo-register' with a function that un-kills the group. This -;; package will put that function into an action. - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus-util) -(require 'gnus) -(require 'custom) - -(defgroup gnus-undo nil - "Undoing in Gnus buffers." - :group 'gnus) - -(defcustom gnus-undo-limit 2000 - "The number of undoable actions recorded." - :type 'integer - :group 'gnus-undo) - -(defcustom gnus-undo-mode nil - "Minor mode for undoing in Gnus buffers." - :type 'boolean - :group 'gnus-undo) - -(defcustom gnus-undo-mode-hook nil - "Hook called in all `gnus-undo-mode' buffers." - :type 'hook - :group 'gnus-undo) - -;;; Internal variables. - -(defvar gnus-undo-actions nil) -(defvar gnus-undo-boundary t) -(defvar gnus-undo-last nil) -(defvar gnus-undo-boundary-inhibit nil) - -;;; Minor mode definition. - -(defvar gnus-undo-mode-map nil) - -(unless gnus-undo-mode-map - (setq gnus-undo-mode-map (make-sparse-keymap)) - - (gnus-define-keys gnus-undo-mode-map - "\M-\C-_" gnus-undo - "\C-_" gnus-undo - "\C-xu" gnus-undo - ;; many people are used to type `C-/' on X terminals and get `C-_'. - [(control /)] gnus-undo)) - -(defun gnus-undo-make-menu-bar () - ;; This is disabled for the time being. - (when nil - (define-key-after (current-local-map) [menu-bar file gnus-undo] - (cons "Undo" 'gnus-undo-actions) - [menu-bar file whatever]))) - -(defun gnus-undo-mode (&optional arg) - "Minor mode for providing `undo' in Gnus buffers. - -\\{gnus-undo-mode-map}" - (interactive "P") - (set (make-local-variable 'gnus-undo-mode) - (if (null arg) (not gnus-undo-mode) - (> (prefix-numeric-value arg) 0))) - (set (make-local-variable 'gnus-undo-actions) nil) - (set (make-local-variable 'gnus-undo-boundary) t) - (when gnus-undo-mode - ;; Set up the menu. - (when (gnus-visual-p 'undo-menu 'menu) - (gnus-undo-make-menu-bar)) - (gnus-add-minor-mode 'gnus-undo-mode "" gnus-undo-mode-map) - (make-local-hook 'post-command-hook) - (add-hook 'post-command-hook 'gnus-undo-boundary nil t) - (gnus-run-hooks 'gnus-undo-mode-hook))) - -;;; Interface functions. - -(defun gnus-disable-undo (&optional buffer) - "Disable undoing in the current buffer." - (interactive) - (save-excursion - (when buffer - (set-buffer buffer)) - (gnus-undo-mode -1))) - -(defun gnus-undo-boundary () - "Set Gnus undo boundary." - (if gnus-undo-boundary-inhibit - (setq gnus-undo-boundary-inhibit nil) - (setq gnus-undo-boundary t))) - -(defun gnus-undo-force-boundary () - "Set Gnus undo boundary." - (setq gnus-undo-boundary-inhibit nil - gnus-undo-boundary t)) - -(defun gnus-undo-register (form) - "Register FORMS as something to be performed to undo a change. -FORMS may use backtick quote syntax." - (when gnus-undo-mode - (gnus-undo-register-1 - `(lambda () - ,form)))) - -(put 'gnus-undo-register 'lisp-indent-function 0) -(put 'gnus-undo-register 'edebug-form-spec '(body)) - -(defun gnus-undo-register-1 (function) - "Register FUNCTION as something to be performed to undo a change." - (when gnus-undo-mode - (cond - ;; We are on a boundary, so we create a new action. - (gnus-undo-boundary - (push (list function) gnus-undo-actions) - (setq gnus-undo-boundary nil)) - ;; Prepend the function to an old action. - (gnus-undo-actions - (setcar gnus-undo-actions (cons function (car gnus-undo-actions)))) - ;; Initialize list. - (t - (setq gnus-undo-actions (list (list function))))) - ;; Limit the length of the undo list. - (let ((next (nthcdr gnus-undo-limit gnus-undo-actions))) - (when next - (setcdr next nil))) - ;; We are not at a boundary... - (setq gnus-undo-boundary-inhibit t))) - -(defun gnus-undo (n) - "Undo some previous changes in Gnus buffers. -Repeat this command to undo more changes. -A numeric argument serves as a repeat count." - (interactive "p") - (unless gnus-undo-mode - (error "Undoing is not enabled in this buffer")) - (message "%s" last-command) - (when (or (not (eq last-command 'gnus-undo)) - (not gnus-undo-last)) - (setq gnus-undo-last gnus-undo-actions)) - (let ((action (pop gnus-undo-last))) - (unless action - (error "Nothing further to undo")) - (setq gnus-undo-actions (delq action gnus-undo-actions)) - (setq gnus-undo-boundary t) - (while action - (funcall (pop action))))) - -(provide 'gnus-undo) - -;;; gnus-undo.el ends here diff --git a/lisp/gnus-util.el b/lisp/gnus-util.el deleted file mode 100644 index c5a04ec..0000000 --- a/lisp/gnus-util.el +++ /dev/null @@ -1,1125 +0,0 @@ -;;; gnus-util.el --- utility functions for Semi-gnus -;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Tatsuya Ichikawa -;; Keywords: mail, news, MIME - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; Nothing in this file depends on any other parts of Gnus -- all -;; functions and macros in this file are utility functions that are -;; used by Gnus and may be used by any other package without loading -;; Gnus first. - -;;; Code: - -(eval-when-compile - (require 'cl) - ;; Fixme: this should be a gnus variable, not nnmail-. - (defvar nnmail-pathname-coding-system)) -(eval-when-compile (require 'static)) - -(require 'custom) -(require 'nnheader) -(require 'time-date) - -(eval-and-compile - (autoload 'message-fetch-field "message") - (autoload 'rmail-insert-rmail-file-header "rmail") - (autoload 'rmail-count-new-messages "rmail") - (autoload 'rmail-show-message "rmail")) - -(defun gnus-boundp (variable) - "Return non-nil if VARIABLE is bound and non-nil." - (and (boundp variable) - (symbol-value variable))) - -(defmacro gnus-eval-in-buffer-window (buffer &rest forms) - "Pop to BUFFER, evaluate FORMS, and then return to the original window." - (let ((tempvar (make-symbol "GnusStartBufferWindow")) - (w (make-symbol "w")) - (buf (make-symbol "buf")) - (frame (make-symbol "frame"))) - `(let* ((,tempvar (selected-window)) - (,buf ,buffer) - (,w (get-buffer-window ,buf 'visible)) - ,frame) - (unwind-protect - (progn - (if ,w - (progn - (select-window ,w) - (set-buffer (window-buffer ,w))) - (pop-to-buffer ,buf)) - ,@forms) - (setq ,frame (selected-frame)) - (select-window ,tempvar) - (select-frame ,frame))))) - -(put 'gnus-eval-in-buffer-window 'lisp-indent-function 1) -(put 'gnus-eval-in-buffer-window 'edebug-form-spec '(form body)) - -(defmacro gnus-intern-safe (string hashtable) - "Set hash value. Arguments are STRING, VALUE, and HASHTABLE." - `(let ((symbol (intern ,string ,hashtable))) - (or (boundp symbol) - (set symbol nil)) - symbol)) - -;; Added by Geoffrey T. Dairiki . A safe way -;; to limit the length of a string. This function is necessary since -;; `(substr "abc" 0 30)' pukes with "Args out of range". -(defsubst gnus-limit-string (str width) - (if (> (length str) width) - (substring str 0 width) - str)) - -(defsubst gnus-functionp (form) - "Return non-nil if FORM is funcallable." - (or (and (symbolp form) (fboundp form)) - (and (listp form) (eq (car form) 'lambda)) - (byte-code-function-p form))) - -(defsubst gnus-goto-char (point) - (and point (goto-char point))) - -(defmacro gnus-buffer-exists-p (buffer) - `(let ((buffer ,buffer)) - (when buffer - (funcall (if (stringp buffer) 'get-buffer 'buffer-name) - buffer)))) - -(defmacro gnus-kill-buffer (buffer) - `(let ((buf ,buffer)) - (when (gnus-buffer-exists-p buf) - (kill-buffer buf)))) - -(static-cond - ((fboundp 'point-at-bol) - (defalias 'gnus-point-at-bol 'point-at-bol)) - ((fboundp 'line-beginning-position) - (defalias 'gnus-point-at-bol 'line-beginning-position)) - (t - (defun gnus-point-at-bol () - "Return point at the beginning of the line." - (let ((p (point))) - (beginning-of-line) - (prog1 - (point) - (goto-char p)))) - )) -(static-cond - ((fboundp 'point-at-eol) - (defalias 'gnus-point-at-eol 'point-at-eol)) - ((fboundp 'line-end-position) - (defalias 'gnus-point-at-eol 'line-end-position)) - (t - (defun gnus-point-at-eol () - "Return point at the end of the line." - (let ((p (point))) - (end-of-line) - (prog1 - (point) - (goto-char p)))) - )) - -(defun gnus-delete-first (elt list) - "Delete by side effect the first occurrence of ELT as a member of LIST." - (if (equal (car list) elt) - (cdr list) - (let ((total list)) - (while (and (cdr list) - (not (equal (cadr list) elt))) - (setq list (cdr list))) - (when (cdr list) - (setcdr list (cddr list))) - total))) - -;; Delete the current line (and the next N lines). -(defmacro gnus-delete-line (&optional n) - `(delete-region (progn (beginning-of-line) (point)) - (progn (forward-line ,(or n 1)) (point)))) - -(defun gnus-byte-code (func) - "Return a form that can be `eval'ed based on FUNC." - (let ((fval (indirect-function func))) - (if (byte-code-function-p fval) - (let ((flist (append fval nil))) - (setcar flist 'byte-code) - flist) - (cons 'progn (cddr fval))))) - -(defun gnus-extract-address-components (from) - (let (name address) - ;; First find the address - the thing with the @ in it. This may - ;; not be accurate in mail addresses, but does the trick most of - ;; the time in news messages. - (when (string-match "\\b[^@ \t<>]+[!@][^@ \t<>]+\\b" from) - (setq address (substring from (match-beginning 0) (match-end 0)))) - ;; Then we check whether the "name

" format is used. - (and address - ;; Linear white space is not required. - (string-match (concat "[ \t]*<" (regexp-quote address) ">") from) - (and (setq name (substring from 0 (match-beginning 0))) - ;; Strip any quotes from the name. - (string-match "\".*\"" name) - (setq name (substring name 1 (1- (match-end 0)))))) - ;; If not, then "address (name)" is used. - (or name - (and (string-match "(.+)" from) - (setq name (substring from (1+ (match-beginning 0)) - (1- (match-end 0))))) - (and (string-match "()" from) - (setq name address)) - ;; XOVER might not support folded From headers. - (and (string-match "(.*" from) - (setq name (substring from (1+ (match-beginning 0)) - (match-end 0))))) - (list (if (string= name "") nil name) (or address from)))) - - -(defun gnus-fetch-field (field) - "Return the value of the header FIELD of current article." - (save-excursion - (save-restriction - (let ((case-fold-search t) - (inhibit-point-motion-hooks t)) - (nnheader-narrow-to-headers) - (message-fetch-field field))))) - -(defun gnus-goto-colon () - (beginning-of-line) - (let ((eol (gnus-point-at-eol))) - (goto-char (or (text-property-any (point) eol 'gnus-position t) - (search-forward ":" eol t) - (point))))) - -(defun gnus-remove-text-with-property (prop) - "Delete all text in the current buffer with text property PROP." - (save-excursion - (goto-char (point-min)) - (while (not (eobp)) - (while (get-text-property (point) prop) - (delete-char 1)) - (goto-char (next-single-property-change (point) prop nil (point-max)))))) - -(require 'nnheader) -(defun gnus-newsgroup-directory-form (newsgroup) - "Make hierarchical directory name from NEWSGROUP name." - (let* ((newsgroup (gnus-newsgroup-savable-name newsgroup)) - (idx (string-match ":" newsgroup))) - (concat - (if idx (substring newsgroup 0 idx)) - (if idx "/") - (nnheader-replace-chars-in-string - (if idx (substring newsgroup (1+ idx)) newsgroup) - ?. ?/)))) - -(defun gnus-newsgroup-savable-name (group) - ;; Replace any slashes in a group name (eg. an ange-ftp nndoc group) - ;; with dots. - (nnheader-replace-chars-in-string group ?/ ?.)) - -(defun gnus-string> (s1 s2) - (not (or (string< s1 s2) - (string= s1 s2)))) - -;;; Time functions. - -(defun gnus-file-newer-than (file date) - (let ((fdate (nth 5 (file-attributes file)))) - (or (> (car fdate) (car date)) - (and (= (car fdate) (car date)) - (> (nth 1 fdate) (nth 1 date)))))) - -;;; Keymap macros. - -(defmacro gnus-local-set-keys (&rest plist) - "Set the keys in PLIST in the current keymap." - `(gnus-define-keys-1 (current-local-map) ',plist)) - -(defmacro gnus-define-keys (keymap &rest plist) - "Define all keys in PLIST in KEYMAP." - `(gnus-define-keys-1 (quote ,keymap) (quote ,plist))) - -(defmacro gnus-define-keys-safe (keymap &rest plist) - "Define all keys in PLIST in KEYMAP without overwriting previous definitions." - `(gnus-define-keys-1 (quote ,keymap) (quote ,plist) t)) - -(put 'gnus-define-keys 'lisp-indent-function 1) -(put 'gnus-define-keys-safe 'lisp-indent-function 1) -(put 'gnus-local-set-keys 'lisp-indent-function 1) - -(defmacro gnus-define-keymap (keymap &rest plist) - "Define all keys in PLIST in KEYMAP." - `(gnus-define-keys-1 ,keymap (quote ,plist))) - -(put 'gnus-define-keymap 'lisp-indent-function 1) - -(defun gnus-define-keys-1 (keymap plist &optional safe) - (when (null keymap) - (error "Can't set keys in a null keymap")) - (cond ((symbolp keymap) - (setq keymap (symbol-value keymap))) - ((keymapp keymap)) - ((listp keymap) - (set (car keymap) nil) - (define-prefix-command (car keymap)) - (define-key (symbol-value (caddr keymap)) (cadr keymap) (car keymap)) - (setq keymap (symbol-value (car keymap))))) - (let (key) - (while plist - (when (symbolp (setq key (pop plist))) - (setq key (symbol-value key))) - (if (or (not safe) - (eq (lookup-key keymap key) 'undefined)) - (define-key keymap key (pop plist)) - (pop plist))))) - -(defun gnus-completing-read (default prompt &rest args) - ;; Like `completing-read', except that DEFAULT is the default argument. - (let* ((prompt (if default - (concat prompt " (default " default ") ") - (concat prompt " "))) - (answer (apply 'completing-read prompt args))) - (if (or (null answer) (zerop (length answer))) - default - answer))) - -;; Two silly functions to ensure that all `y-or-n-p' questions clear -;; the echo area. -(defun gnus-y-or-n-p (prompt) - (prog1 - (y-or-n-p prompt) - (message ""))) - -(defun gnus-yes-or-no-p (prompt) - (prog1 - (yes-or-no-p prompt) - (message ""))) - -(defun gnus-dd-mmm (messy-date) - "Return a string like DD-MMM from a big messy string." - (condition-case () - (format-time-string "%d-%b" (safe-date-to-time messy-date)) - (error " - "))) - -(defmacro gnus-date-get-time (date) - "Convert DATE string to Emacs time. -Cache the result as a text property stored in DATE." - ;; Either return the cached value... - `(let ((d ,date)) - (if (equal "" d) - '(0 0) - (or (get-text-property 0 'gnus-time d) - ;; or compute the value... - (let ((time (safe-date-to-time d))) - ;; and store it back in the string. - (put-text-property 0 1 'gnus-time time d) - time))))) - -(defsubst gnus-time-iso8601 (time) - "Return a string of TIME in YYYYMMDDTHHMMSS format." - (format-time-string "%Y%m%dT%H%M%S" time)) - -(defun gnus-date-iso8601 (date) - "Convert the DATE to YYYYMMDDTHHMMSS." - (condition-case () - (gnus-time-iso8601 (gnus-date-get-time date)) - (error ""))) - -(defun gnus-mode-string-quote (string) - "Quote all \"%\"'s in STRING." - (save-excursion - (gnus-set-work-buffer) - (insert string) - (goto-char (point-min)) - (while (search-forward "%" nil t) - (insert "%")) - (buffer-string))) - -;; Make a hash table (default and minimum size is 256). -;; Optional argument HASHSIZE specifies the table size. -(defun gnus-make-hashtable (&optional hashsize) - (make-vector (if hashsize (max (gnus-create-hash-size hashsize) 256) 256) 0)) - -;; Make a number that is suitable for hashing; bigger than MIN and -;; equal to some 2^x. Many machines (such as sparcs) do not have a -;; hardware modulo operation, so they implement it in software. On -;; many sparcs over 50% of the time to intern is spent in the modulo. -;; Yes, it's slower than actually computing the hash from the string! -;; So we use powers of 2 so people can optimize the modulo to a mask. -(defun gnus-create-hash-size (min) - (let ((i 1)) - (while (< i min) - (setq i (* 2 i))) - i)) - -(defcustom gnus-verbose 7 - "*Integer that says how verbose Gnus should be. -The higher the number, the more messages Gnus will flash to say what -it's doing. At zero, Gnus will be totally mute; at five, Gnus will -display most important messages; and at ten, Gnus will keep on -jabbering all the time." - :group 'gnus-start - :type 'integer) - -;; Show message if message has a lower level than `gnus-verbose'. -;; Guideline for numbers: -;; 1 - error messages, 3 - non-serious error messages, 5 - messages -;; for things that take a long time, 7 - not very important messages -;; on stuff, 9 - messages inside loops. -(defun gnus-message (level &rest args) - (if (<= level gnus-verbose) - (apply 'message args) - ;; We have to do this format thingy here even if the result isn't - ;; shown - the return value has to be the same as the return value - ;; from `message'. - (apply 'format args))) - -(defun gnus-error (level &rest args) - "Beep an error if LEVEL is equal to or less than `gnus-verbose'." - (when (<= (floor level) gnus-verbose) - (apply 'message args) - (ding) - (let (duration) - (when (and (floatp level) - (not (zerop (setq duration (* 10 (- level (floor level))))))) - (sit-for duration)))) - nil) - -(defun gnus-split-references (references) - "Return a list of Message-IDs in REFERENCES." - (let ((beg 0) - ids) - (while (string-match "<[^> \t]+>" references beg) - (push (substring references (match-beginning 0) (setq beg (match-end 0))) - ids)) - (nreverse ids))) - -(defsubst gnus-parent-id (references &optional n) - "Return the last Message-ID in REFERENCES. -If N, return the Nth ancestor instead." - (when references - (let ((ids (inline (gnus-split-references references)))) - (while (nthcdr (or n 1) ids) - (setq ids (cdr ids))) - (car ids)))) - -(defsubst gnus-buffer-live-p (buffer) - "Say whether BUFFER is alive or not." - (and buffer - (get-buffer buffer) - (buffer-name (get-buffer buffer)))) - -(defun gnus-horizontal-recenter () - "Recenter the current buffer horizontally." - (if (< (current-column) (/ (window-width) 2)) - (set-window-hscroll (get-buffer-window (current-buffer) t) 0) - (let* ((orig (point)) - (end (window-end (get-buffer-window (current-buffer) t))) - (max 0)) - (when end - ;; Find the longest line currently displayed in the window. - (goto-char (window-start)) - (while (and (not (eobp)) - (< (point) end)) - (end-of-line) - (setq max (max max (current-column))) - (forward-line 1)) - (goto-char orig) - ;; Scroll horizontally to center (sort of) the point. - (if (> max (window-width)) - (set-window-hscroll - (get-buffer-window (current-buffer) t) - (min (- (current-column) (/ (window-width) 3)) - (+ 2 (- max (window-width))))) - (set-window-hscroll (get-buffer-window (current-buffer) t) 0)) - max)))) - -(defun gnus-read-event-char () - "Get the next event." - (let ((event (read-event))) - ;; should be gnus-characterp, but this can't be called in XEmacs anyway - (cons (and (numberp event) event) event))) - -(defun gnus-sortable-date (date) - "Make string suitable for sorting from DATE." - (gnus-time-iso8601 (date-to-time date))) - -(defun gnus-copy-file (file &optional to) - "Copy FILE to TO." - (interactive - (list (read-file-name "Copy file: " default-directory) - (read-file-name "Copy file to: " default-directory))) - (unless to - (setq to (read-file-name "Copy file to: " default-directory))) - (when (file-directory-p to) - (setq to (concat (file-name-as-directory to) - (file-name-nondirectory file)))) - (copy-file file to)) - -(defvar gnus-work-buffer " *gnus work*") - -(defun gnus-set-work-buffer () - "Put point in the empty Gnus work buffer." - (if (get-buffer gnus-work-buffer) - (progn - (set-buffer gnus-work-buffer) - (erase-buffer)) - (set-buffer (gnus-get-buffer-create gnus-work-buffer)) - (kill-all-local-variables))) - -(defmacro gnus-group-real-name (group) - "Find the real name of a foreign newsgroup." - `(let ((gname ,group)) - (if (string-match "^[^:]+:" gname) - (substring gname (match-end 0)) - gname))) - -(defun gnus-make-sort-function (funs) - "Return a composite sort condition based on the functions in FUNC." - (cond - ;; Just a simple function. - ((gnus-functionp funs) funs) - ;; No functions at all. - ((null funs) funs) - ;; A list of functions. - ((or (cdr funs) - (listp (car funs))) - (gnus-byte-compile - `(lambda (t1 t2) - ,(gnus-make-sort-function-1 (reverse funs))))) - ;; A list containing just one function. - (t - (car funs)))) - -(defun gnus-make-sort-function-1 (funs) - "Return a composite sort condition based on the functions in FUNC." - (let ((function (car funs)) - (first 't1) - (last 't2)) - (when (consp function) - (cond - ;; Reversed spec. - ((eq (car function) 'not) - (setq function (cadr function) - first 't2 - last 't1)) - ((gnus-functionp function) - ;; Do nothing. - ) - (t - (error "Invalid sort spec: %s" function)))) - (if (cdr funs) - `(or (,function ,first ,last) - (and (not (,function ,last ,first)) - ,(gnus-make-sort-function-1 (cdr funs)))) - `(,function ,first ,last)))) - -(defun gnus-turn-off-edit-menu (type) - "Turn off edit menu in `gnus-TYPE-mode-map'." - (define-key (symbol-value (intern (format "gnus-%s-mode-map" type))) - [menu-bar edit] 'undefined)) - -(defun gnus-prin1 (form) - "Use `prin1' on FORM in the current buffer. -Bind `print-quoted' and `print-readably' to t while printing." - (let ((print-quoted t) - (print-readably t) - (print-escape-multibyte nil) - print-level print-length) - (prin1 form (current-buffer)))) - -(defun gnus-prin1-to-string (form) - "The same as `prin1', but bind `print-quoted' and `print-readably' to t." - (let ((print-quoted t) - (print-readably t)) - (prin1-to-string form))) - -(defun gnus-make-directory (directory) - "Make DIRECTORY (and all its parents) if it doesn't exist." - (require 'nnmail) - (let ((file-name-coding-system nnmail-pathname-coding-system) - (pathname-coding-system nnmail-pathname-coding-system)) - (when (and directory - (not (file-exists-p directory))) - (make-directory directory t))) - t) - -(defun gnus-write-buffer (file) - "Write the current buffer's contents to FILE." - ;; Make sure the directory exists. - (gnus-make-directory (file-name-directory file)) - (let ((file-name-coding-system nnmail-pathname-coding-system) - (pathname-coding-system nnmail-pathname-coding-system)) - ;; Write the buffer. - (write-region (point-min) (point-max) file nil 'quietly))) - -(defun gnus-write-buffer-as-binary (file) - "Write the current buffer's contents to FILE without code conversion." - ;; Make sure the directory exists. - (gnus-make-directory (file-name-directory file)) - ;; Write the buffer. - (write-region-as-binary (point-min) (point-max) file nil 'quietly)) - -(defun gnus-write-buffer-as-coding-system (coding-system file) - "Write the current buffer's contents to FILE with code conversion." - ;; Make sure the directory exists. - (gnus-make-directory (file-name-directory file)) - ;; Write the buffer. - (write-region-as-coding-system - coding-system (point-min) (point-max) file nil 'quietly)) - -(defun gnus-delete-file (file) - "Delete FILE if it exists." - (when (file-exists-p file) - (delete-file file))) - -(defun gnus-strip-whitespace (string) - "Return STRING stripped of all whitespace." - (while (string-match "[\r\n\t ]+" string) - (setq string (replace-match "" t t string))) - string) - -(defsubst gnus-put-text-property-excluding-newlines (beg end prop val) - "The same as `put-text-property', but don't put this prop on any newlines in the region." - (save-match-data - (save-excursion - (save-restriction - (goto-char beg) - (while (re-search-forward gnus-emphasize-whitespace-regexp end 'move) - (gnus-put-text-property beg (match-beginning 0) prop val) - (setq beg (point))) - (gnus-put-text-property beg (point) prop val))))) - -(defun gnus-put-text-property-excluding-characters-with-faces (beg end - prop val) - "The same as `put-text-property', but don't put props on characters with the `gnus-face' property." - (let ((b beg)) - (while (/= b end) - (when (get-text-property b 'gnus-face) - (setq b (next-single-property-change b 'gnus-face nil end))) - (when (/= b end) - (gnus-put-text-property - b (setq b (next-single-property-change b 'gnus-face nil end)) - prop val))))) - -;;; Protected and atomic operations. dmoore@ucsd.edu 21.11.1996 -;;; The primary idea here is to try to protect internal datastructures -;;; from becoming corrupted when the user hits C-g, or if a hook or -;;; similar blows up. Often in Gnus multiple tables/lists need to be -;;; updated at the same time, or information can be lost. - -(defvar gnus-atomic-be-safe t - "If t, certain operations will be protected from interruption by C-g.") - -(defmacro gnus-atomic-progn (&rest forms) - "Evaluate FORMS atomically, which means to protect the evaluation -from being interrupted by the user. An error from the forms themselves -will return without finishing the operation. Since interrupts from -the user are disabled, it is recommended that only the most minimal -operations are performed by FORMS. If you wish to assign many -complicated values atomically, compute the results into temporary -variables and then do only the assignment atomically." - `(let ((inhibit-quit gnus-atomic-be-safe)) - ,@forms)) - -(put 'gnus-atomic-progn 'lisp-indent-function 0) - -(defmacro gnus-atomic-progn-assign (protect &rest forms) - "Evaluate FORMS, but insure that the variables listed in PROTECT -are not changed if anything in FORMS signals an error or otherwise -non-locally exits. The variables listed in PROTECT are updated atomically. -It is safe to use gnus-atomic-progn-assign with long computations. - -Note that if any of the symbols in PROTECT were unbound, they will be -set to nil on a sucessful assignment. In case of an error or other -non-local exit, it will still be unbound." - (let* ((temp-sym-map (mapcar (lambda (x) (list (make-symbol - (concat (symbol-name x) - "-tmp")) - x)) - protect)) - (sym-temp-map (mapcar (lambda (x) (list (cadr x) (car x))) - temp-sym-map)) - (temp-sym-let (mapcar (lambda (x) (list (car x) - `(and (boundp ',(cadr x)) - ,(cadr x)))) - temp-sym-map)) - (sym-temp-let sym-temp-map) - (temp-sym-assign (apply 'append temp-sym-map)) - (sym-temp-assign (apply 'append sym-temp-map)) - (result (make-symbol "result-tmp"))) - `(let (,@temp-sym-let - ,result) - (let ,sym-temp-let - (setq ,result (progn ,@forms)) - (setq ,@temp-sym-assign)) - (let ((inhibit-quit gnus-atomic-be-safe)) - (setq ,@sym-temp-assign)) - ,result))) - -(put 'gnus-atomic-progn-assign 'lisp-indent-function 1) -;(put 'gnus-atomic-progn-assign 'edebug-form-spec '(sexp body)) - -(defmacro gnus-atomic-setq (&rest pairs) - "Similar to setq, except that the real symbols are only assigned when -there are no errors. And when the real symbols are assigned, they are -done so atomically. If other variables might be changed via side-effect, -see gnus-atomic-progn-assign. It is safe to use gnus-atomic-setq -with potentially long computations." - (let ((tpairs pairs) - syms) - (while tpairs - (push (car tpairs) syms) - (setq tpairs (cddr tpairs))) - `(gnus-atomic-progn-assign ,syms - (setq ,@pairs)))) - -;(put 'gnus-atomic-setq 'edebug-form-spec '(body)) - - -;;; Functions for saving to babyl/mail files. - -(defvar rmail-default-rmail-file) -(defun gnus-output-to-rmail (filename &optional ask) - "Append the current article to an Rmail file named FILENAME." - (require 'rmail) - ;; Most of these codes are borrowed from rmailout.el. - (setq filename (expand-file-name filename)) - (setq rmail-default-rmail-file filename) - (let ((artbuf (current-buffer)) - (tmpbuf (get-buffer-create " *Gnus-output*"))) - (save-excursion - (or (get-file-buffer filename) - (file-exists-p filename) - (if (or (not ask) - (gnus-yes-or-no-p - (concat "\"" filename "\" does not exist, create it? "))) - (let ((file-buffer (create-file-buffer filename))) - (save-excursion - (set-buffer file-buffer) - (rmail-insert-rmail-file-header) - (let ((require-final-newline nil)) - (gnus-write-buffer-as-coding-system - nnheader-text-coding-system filename))) - (kill-buffer file-buffer)) - (error "Output file does not exist"))) - (set-buffer tmpbuf) - (erase-buffer) - (insert-buffer-substring artbuf) - (gnus-convert-article-to-rmail) - ;; Decide whether to append to a file or to an Emacs buffer. - (let ((outbuf (get-file-buffer filename))) - (if (not outbuf) - (let ((file-name-coding-system nnmail-pathname-coding-system) - (pathname-coding-system nnmail-pathname-coding-system)) - (write-region-as-binary (point-min) (point-max) - filename 'append)) - ;; File has been visited, in buffer OUTBUF. - (set-buffer outbuf) - (let ((buffer-read-only nil) - (msg (and (boundp 'rmail-current-message) - (symbol-value 'rmail-current-message)))) - ;; If MSG is non-nil, buffer is in RMAIL mode. - (when msg - (widen) - (narrow-to-region (point-max) (point-max))) - (insert-buffer-substring tmpbuf) - (when msg - (goto-char (point-min)) - (widen) - (search-backward "\n\^_") - (narrow-to-region (point) (point-max)) - (rmail-count-new-messages t) - (when (rmail-summary-exists) - (rmail-select-summary - (rmail-update-summary))) - (rmail-count-new-messages t) - (rmail-show-message msg)) - (save-buffer))))) - (kill-buffer tmpbuf))) - -(defun gnus-output-to-mail (filename &optional ask) - "Append the current article to a mail file named FILENAME." - (setq filename (expand-file-name filename)) - (let ((artbuf (current-buffer)) - (tmpbuf (get-buffer-create " *Gnus-output*"))) - (save-excursion - ;; Create the file, if it doesn't exist. - (when (and (not (get-file-buffer filename)) - (not (file-exists-p filename))) - (if (or (not ask) - (gnus-y-or-n-p - (concat "\"" filename "\" does not exist, create it? "))) - (let ((file-buffer (create-file-buffer filename))) - (save-excursion - (set-buffer file-buffer) - (let ((require-final-newline nil)) - (gnus-write-buffer-as-coding-system - nnheader-text-coding-system filename))) - (kill-buffer file-buffer)) - (error "Output file does not exist"))) - (set-buffer tmpbuf) - (erase-buffer) - (insert-buffer-substring artbuf) - (goto-char (point-min)) - (if (looking-at "From ") - (forward-line 1) - (insert "From nobody " (current-time-string) "\n")) - (let (case-fold-search) - (while (re-search-forward "^From " nil t) - (beginning-of-line) - (insert ">"))) - ;; Decide whether to append to a file or to an Emacs buffer. - (let ((outbuf (get-file-buffer filename))) - (if (not outbuf) - (let ((buffer-read-only nil)) - (save-excursion - (goto-char (point-max)) - (forward-char -2) - (unless (looking-at "\n\n") - (goto-char (point-max)) - (unless (bolp) - (insert "\n")) - (insert "\n")) - (goto-char (point-max)) - (let ((file-name-coding-system nnmail-pathname-coding-system) - (pathname-coding-system nnmail-pathname-coding-system)) - (write-region-as-binary (point-min) (point-max) - filename 'append)))) - ;; File has been visited, in buffer OUTBUF. - (set-buffer outbuf) - (let ((buffer-read-only nil)) - (goto-char (point-max)) - (unless (eobp) - (insert "\n")) - (insert "\n") - (insert-buffer-substring tmpbuf))))) - (kill-buffer tmpbuf))) - -(defun gnus-convert-article-to-rmail () - "Convert article in current buffer to Rmail message format." - (let ((buffer-read-only nil)) - ;; Convert article directly into Babyl format. - (goto-char (point-min)) - (insert "\^L\n0, unseen,,\n*** EOOH ***\n") - (while (search-forward "\n\^_" nil t) ;single char - (replace-match "\n^_" t t)) ;2 chars: "^" and "_" - (goto-char (point-max)) - (insert "\^_"))) - -(defun gnus-map-function (funs arg) - "Applies the result of the first function in FUNS to the second, and so on. -ARG is passed to the first function." - (let ((myfuns funs)) - (while myfuns - (setq arg (funcall (pop myfuns) arg))) - arg)) - -(defun gnus-run-hooks (&rest funcs) - "Does the same as `run-hooks', but saves excursion." - (let ((buf (current-buffer))) - (unwind-protect - (apply 'run-hooks funcs) - (set-buffer buf)))) - -;;; -;;; .netrc and .authinforc parsing -;;; - -(defun gnus-parse-netrc (file) - "Parse FILE and return an list of all entries in the file." - (when (file-exists-p file) - (with-temp-buffer - (let ((tokens '("machine" "default" "login" - "password" "account" "macdef" "force" - "port")) - alist elem result pair) - (insert-file-contents file) - (goto-char (point-min)) - ;; Go through the file, line by line. - (while (not (eobp)) - (narrow-to-region (point) (gnus-point-at-eol)) - ;; For each line, get the tokens and values. - (while (not (eobp)) - (skip-chars-forward "\t ") - ;; Skip lines that begin with a "#". - (if (eq (char-after) ?#) - (goto-char (point-max)) - (unless (eobp) - (setq elem - (if (= (following-char) ?\") - (read (current-buffer)) - (buffer-substring - (point) (progn (skip-chars-forward "^\t ") - (point))))) - (cond - ((equal elem "macdef") - ;; We skip past the macro definition. - (widen) - (while (and (zerop (forward-line 1)) - (looking-at "$"))) - (narrow-to-region (point) (point))) - ((member elem tokens) - ;; Tokens that don't have a following value are ignored, - ;; except "default". - (when (and pair (or (cdr pair) - (equal (car pair) "default"))) - (push pair alist)) - (setq pair (list elem))) - (t - ;; Values that haven't got a preceding token are ignored. - (when pair - (setcdr pair elem) - (push pair alist) - (setq pair nil))))))) - (when alist - (push (nreverse alist) result)) - (setq alist nil - pair nil) - (widen) - (forward-line 1)) - (nreverse result))))) - -(defun gnus-netrc-machine (list machine &optional port defaultport) - "Return the netrc values from LIST for MACHINE or for the default entry. -If PORT specified, only return entries with matching port tokens. -Entries without port tokens default to DEFAULTPORT." - (let ((rest list) - result) - (while list - (when (equal (cdr (assoc "machine" (car list))) machine) - (push (car list) result)) - (pop list)) - (unless result - ;; No machine name matches, so we look for default entries. - (while rest - (when (assoc "default" (car rest)) - (push (car rest) result)) - (pop rest))) - (when result - (setq result (nreverse result)) - (while (and result - (not (equal (or port defaultport "nntp") - (or (gnus-netrc-get (car result) "port") - defaultport "nntp")))) - (pop result)) - (car result)))) - -(defun gnus-netrc-get (alist type) - "Return the value of token TYPE from ALIST." - (cdr (assoc type alist))) - -;;; Various - -(defvar gnus-group-buffer) ; Compiler directive -(defun gnus-alive-p () - "Say whether Gnus is running or not." - (and (boundp 'gnus-group-buffer) - (get-buffer gnus-group-buffer) - (save-excursion - (set-buffer gnus-group-buffer) - (eq major-mode 'gnus-group-mode)))) - -(defun gnus-remove-duplicates (list) - (let (new (tail list)) - (while tail - (or (member (car tail) new) - (setq new (cons (car tail) new))) - (setq tail (cdr tail))) - (nreverse new))) - -(defun gnus-delete-if (predicate list) - "Delete elements from LIST that satisfy PREDICATE." - (let (out) - (while list - (unless (funcall predicate (car list)) - (push (car list) out)) - (pop list)) - (nreverse out))) - -(if (fboundp 'assq-delete-all) - (defalias 'gnus-delete-alist 'assq-delete-all) - (defun gnus-delete-alist (key alist) - "Delete from ALIST all elements whose car is KEY. -Return the modified alist." - (let (entry) - (while (setq entry (assq key alist)) - (setq alist (delq entry alist))) - alist))) - -(defmacro gnus-pull (key alist &optional assoc-p) - "Modify ALIST to be without KEY." - (unless (symbolp alist) - (error "Not a symbol: %s" alist)) - (let ((fun (if assoc-p 'assoc 'assq))) - `(setq ,alist (delq (,fun ,key ,alist) ,alist)))) - -(defun gnus-globalify-regexp (re) - "Returns a regexp that matches a whole line, iff RE matches a part of it." - (concat (unless (string-match "^\\^" re) "^.*") - re - (unless (string-match "\\$$" re) ".*$"))) - -(defun gnus-set-window-start (&optional point) - "Set the window start to POINT, or (point) if nil." - (let ((win (get-buffer-window (current-buffer) t))) - (when win - (set-window-start win (or point (point)))))) - -(defun gnus-annotation-in-region-p (b e) - (if (= b e) - (eq (cadr (memq 'gnus-undeletable (text-properties-at b))) t) - (text-property-any b e 'gnus-undeletable t))) - -(defun gnus-or (&rest elems) - "Return non-nil if any of the elements are non-nil." - (catch 'found - (while elems - (when (pop elems) - (throw 'found t))))) - -(defun gnus-and (&rest elems) - "Return non-nil if all of the elements are non-nil." - (catch 'found - (while elems - (unless (pop elems) - (throw 'found nil))) - t)) - -(defun gnus-write-active-file (file hashtb &optional full-names) - (let ((output-coding-system nnmail-active-file-coding-system) - (coding-system-for-write nnmail-active-file-coding-system)) - (with-temp-file file - (mapatoms - (lambda (sym) - (when (and sym - (boundp sym) - (symbol-value sym)) - (insert (format "%S %d %d y\n" - (if full-names - sym - (intern (gnus-group-real-name (symbol-name sym)))) - (or (cdr (symbol-value sym)) - (car (symbol-value sym))) - (car (symbol-value sym)))))) - hashtb) - (goto-char (point-max)) - (while (search-backward "\\." nil t) - (delete-char 1))))) - -(if (fboundp 'union) - (defalias 'gnus-union 'union) - (defun gnus-union (l1 l2) - "Set union of lists L1 and L2." - (cond ((null l1) l2) - ((null l2) l1) - ((equal l1 l2) l1) - (t - (or (>= (length l1) (length l2)) - (setq l1 (prog1 l2 (setq l2 l1)))) - (while l2 - (or (member (car l2) l1) - (push (car l2) l1)) - (pop l2)) - l1)))) - -(defun gnus-add-text-properties-when - (property value start end properties &optional object) - "Like `gnus-add-text-properties', only applied on where PROPERTY is VALUE." - (let (point) - (while (and start - (< start end) ;; XEmacs will loop for every when start=end. - (setq point (text-property-not-all start end property value))) - (gnus-add-text-properties start point properties object) - (setq start (text-property-any point end property value))) - (if start - (gnus-add-text-properties start end properties object)))) - -(defun gnus-remove-text-properties-when - (property value start end properties &optional object) - "Like `remove-text-properties', only applied on where PROPERTY is VALUE." - (let (point) - (while (and start - (< start end) - (setq point (text-property-not-all start end property value))) - (remove-text-properties start point properties object) - (setq start (text-property-any point end property value))) - (if start - (remove-text-properties start end properties object)) - t)) - -(defun gnus-string-equal (x y) - "Like `string-equal', except it compares case-insensitively." - (and (= (length x) (length y)) - (or (string-equal x y) - (string-equal (downcase x) (downcase y))))) - -(defcustom gnus-use-byte-compile t - "If non-nil, byte-compile crucial run-time codes." - :type 'boolean - :version "21.1" - :group 'gnus-various) - -(defun gnus-byte-compile (form) - "Byte-compile FORM if `gnus-use-byte-compile' is non-nil." - (if gnus-use-byte-compile - (progn - (require 'bytecomp) - (defalias 'gnus-byte-compile 'byte-compile) - (byte-compile form)) - form)) - -(defun gnus-remassoc (key alist) - "Delete by side effect any elements of LIST whose car is `equal' to KEY. -The modified LIST is returned. If the first member -of LIST has a car that is `equal' to KEY, there is no way to remove it -by side effect; therefore, write `(setq foo (remassoc key foo))' to be -sure of changing the value of `foo'." - (when alist - (if (equal key (caar alist)) - (cdr alist) - (setcdr alist (gnus-remassoc key (cdr alist))) - alist))) - -(defun gnus-update-alist-soft (key value alist) - (if value - (cons (cons key value) (gnus-remassoc key alist)) - (gnus-remassoc key alist))) - -(defun gnus-create-info-command (node) - "Create a command that will go to info NODE." - `(lambda () - (interactive) - ,(concat "Enter the info system at node " node) - (Info-goto-node ,node) - (setq gnus-info-buffer (current-buffer)) - (gnus-configure-windows 'info))) - -(defun gnus-not-ignore (&rest args) - t) - -(provide 'gnus-util) - -;;; gnus-util.el ends here diff --git a/lisp/gnus-uu.el b/lisp/gnus-uu.el deleted file mode 100644 index bfce4bd..0000000 --- a/lisp/gnus-uu.el +++ /dev/null @@ -1,2151 +0,0 @@ -;;; gnus-uu.el --- extract (uu)encoded files in Gnus -;; Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995, 1996, 1997, 1998, 2000, -;; 2001 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Created: 2 Oct 1993 -;; Keyword: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus) -(require 'gnus-art) -(require 'message) -(require 'gnus-msg) - -(defgroup gnus-extract nil - "Extracting encoded files." - :prefix "gnus-uu-" - :group 'gnus) - -(defgroup gnus-extract-view nil - "Viewwing extracted files." - :group 'gnus-extract) - -(defgroup gnus-extract-archive nil - "Extracting encoded archives." - :group 'gnus-extract) - -(defgroup gnus-extract-post nil - "Extracting encoded archives." - :prefix "gnus-uu-post" - :group 'gnus-extract) - -;; Default viewing action rules - -(defcustom gnus-uu-default-view-rules - '(("\\.te?xt$\\|\\.doc$\\|read.*me\\|\\.c?$\\|\\.h$\\|\\.bat$\\|\\.asm$\\|makefile" "cat %s | sed 's/\r$//'") - ("\\.pas$" "cat %s | sed 's/\r$//'") - ("\\.[1-9]$" "groff -mandoc -Tascii %s | sed s/\b.//g") - ("\\.\\(jpe?g\\|gif\\|tiff?\\|p[pgb]m\\|xwd\\|xbm\\|pcx\\)$" "display") - ("\\.tga$" "tgatoppm %s | ee -") - ("\\.\\(wav\\|aiff\\|hcom\\|u[blw]\\|s[bfw]\\|voc\\|smp\\)$" - "sox -v .5 %s -t .au -u - > /dev/audio") - ("\\.au$" "cat %s > /dev/audio") - ("\\.midi?$" "playmidi -f") - ("\\.mod$" "str32") - ("\\.ps$" "ghostview") - ("\\.dvi$" "xdvi") - ("\\.html$" "xmosaic") - ("\\.mpe?g$" "mpeg_play") - ("\\.\\(flc\\|fli\\|rle\\|iff\\|pfx\\|avi\\|sme\\|rpza\\|dl\\|qt\\|rsrc\\|mov\\)$" "xanim") - ("\\.\\(tar\\|arj\\|zip\\|zoo\\|arc\\|gz\\|Z\\|lzh\\|ar\\|lha\\)$" - "gnus-uu-archive")) - "*Default actions to be taken when the user asks to view a file. -To change the behaviour, you can either edit this variable or set -`gnus-uu-user-view-rules' to something useful. - -For example: - -To make gnus-uu use 'xli' to display JPEG and GIF files, put the -following in your .emacs file: - - (setq gnus-uu-user-view-rules '((\"jpg$\\\\|gif$\" \"xli\"))) - -Both these variables are lists of lists with two string elements. The -first string is a regular expression. If the file name matches this -regular expression, the command in the second string is executed with -the file as an argument. - -If the command string contains \"%s\", the file name will be inserted -at that point in the command string. If there's no \"%s\" in the -command string, the file name will be appended to the command string -before executing. - -There are several user variables to tailor the behaviour of gnus-uu to -your needs. First we have `gnus-uu-user-view-rules', which is the -variable gnus-uu first consults when trying to decide how to view a -file. If this variable contains no matches, gnus-uu examines the -default rule variable provided in this package. If gnus-uu finds no -match here, it uses `gnus-uu-user-view-rules-end' to try to make a -match." - :group 'gnus-extract-view - :type '(repeat (group regexp (string :tag "Command")))) - -(defcustom gnus-uu-user-view-rules nil - "What actions are to be taken to view a file. -See the documentation on the `gnus-uu-default-view-rules' variable for -details." - :group 'gnus-extract-view - :type '(repeat (group regexp (string :tag "Command")))) - -(defcustom gnus-uu-user-view-rules-end - '(("" "file")) - "*What actions are to be taken if no rule matched the file name. -See the documentation on the `gnus-uu-default-view-rules' variable for -details." - :group 'gnus-extract-view - :type '(repeat (group regexp (string :tag "Command")))) - -;; Default unpacking commands - -(defcustom gnus-uu-default-archive-rules - '(("\\.tar$" "tar xf") - ("\\.zip$" "unzip -o") - ("\\.ar$" "ar x") - ("\\.arj$" "unarj x") - ("\\.zoo$" "zoo -e") - ("\\.\\(lzh\\|lha\\)$" "lha x") - ("\\.Z$" "uncompress") - ("\\.gz$" "gunzip") - ("\\.arc$" "arc -x")) - "*See `gnus-uu-user-archive-rules'." - :group 'gnus-extract-archive - :type '(repeat (group regexp (string :tag "Command")))) - -(defvar gnus-uu-destructive-archivers - (list "uncompress" "gunzip")) - -(defcustom gnus-uu-user-archive-rules nil - "A list that can be set to override the default archive unpacking commands. -To use, for instance, 'untar' to unpack tar files and 'zip -x' to -unpack zip files, say the following: - (setq gnus-uu-user-archive-rules - '((\"\\\\.tar$\" \"untar\") - (\"\\\\.zip$\" \"zip -x\")))" - :group 'gnus-extract-archive - :type '(repeat (group regexp (string :tag "Command")))) - -(defcustom gnus-uu-ignore-files-by-name nil - "*A regular expression saying what files should not be viewed based on name. -If, for instance, you want gnus-uu to ignore all .au and .wav files, -you could say something like - - (setq gnus-uu-ignore-files-by-name \"\\\\.au$\\\\|\\\\.wav$\") - -Note that this variable can be used in conjunction with the -`gnus-uu-ignore-files-by-type' variable." - :group 'gnus-extract - :type '(choice (const :tag "off" nil) - (regexp :format "%v"))) - -(defcustom gnus-uu-ignore-files-by-type nil - "*A regular expression saying what files that shouldn't be viewed, based on MIME file type. -If, for instance, you want gnus-uu to ignore all audio files and all mpegs, -you could say something like - - (setq gnus-uu-ignore-files-by-type \"audio/\\\\|video/mpeg\") - -Note that this variable can be used in conjunction with the -`gnus-uu-ignore-files-by-name' variable." - :group 'gnus-extract - :type '(choice (const :tag "off" nil) - (regexp :format "%v"))) - -;; Pseudo-MIME support - -(defconst gnus-uu-ext-to-mime-list - '(("\\.gif$" "image/gif") - ("\\.jpe?g$" "image/jpeg") - ("\\.tiff?$" "image/tiff") - ("\\.xwd$" "image/xwd") - ("\\.pbm$" "image/pbm") - ("\\.pgm$" "image/pgm") - ("\\.ppm$" "image/ppm") - ("\\.xbm$" "image/xbm") - ("\\.pcx$" "image/pcx") - ("\\.tga$" "image/tga") - ("\\.ps$" "image/postscript") - ("\\.fli$" "video/fli") - ("\\.wav$" "audio/wav") - ("\\.aiff$" "audio/aiff") - ("\\.hcom$" "audio/hcom") - ("\\.voc$" "audio/voc") - ("\\.smp$" "audio/smp") - ("\\.mod$" "audio/mod") - ("\\.dvi$" "image/dvi") - ("\\.mpe?g$" "video/mpeg") - ("\\.au$" "audio/basic") - ("\\.\\(te?xt\\|doc\\|c\\|h\\)$" "text/plain") - ("\\.\\(c\\|h\\)$" "text/source") - ("read.*me" "text/plain") - ("\\.html$" "text/html") - ("\\.bat$" "text/bat") - ("\\.[1-6]$" "text/man") - ("\\.flc$" "video/flc") - ("\\.rle$" "video/rle") - ("\\.pfx$" "video/pfx") - ("\\.avi$" "video/avi") - ("\\.sme$" "video/sme") - ("\\.rpza$" "video/prza") - ("\\.dl$" "video/dl") - ("\\.qt$" "video/qt") - ("\\.rsrc$" "video/rsrc") - ("\\..*$" "unknown/unknown"))) - -;; Various variables users may set - -(defcustom gnus-uu-tmp-dir - (cond ((fboundp 'temp-directory) (temp-directory)) - ((boundp 'temporary-file-directory) temporary-file-directory) - ("/tmp/")) - "*Variable saying where gnus-uu is to do its work. -Default is \"/tmp/\"." - :group 'gnus-extract - :type 'directory) - -(defcustom gnus-uu-do-not-unpack-archives nil - "*Non-nil means that gnus-uu won't peek inside archives looking for files to display. -Default is nil." - :group 'gnus-extract-archive - :type 'boolean) - -(defcustom gnus-uu-ignore-default-view-rules nil - "*Non-nil means that gnus-uu will ignore the default viewing rules. -Only the user viewing rules will be consulted. Default is nil." - :group 'gnus-extract-view - :type 'boolean) - -(defcustom gnus-uu-grabbed-file-functions nil - "Functions run on each file after successful decoding. -They will be called with the name of the file as the argument. -Likely functions you can use in this list are `gnus-uu-grab-view' -and `gnus-uu-grab-move'." - :group 'gnus-extract - :options '(gnus-uu-grab-view gnus-uu-grab-move) - :type 'hook) - -(defcustom gnus-uu-ignore-default-archive-rules nil - "*Non-nil means that gnus-uu will ignore the default archive unpacking commands. -Only the user unpacking commands will be consulted. Default is nil." - :group 'gnus-extract-archive - :type 'boolean) - -(defcustom gnus-uu-kill-carriage-return t - "*Non-nil means that gnus-uu will strip all carriage returns from articles. -Default is t." - :group 'gnus-extract - :type 'boolean) - -(defcustom gnus-uu-view-with-metamail nil - "*Non-nil means that files will be viewed with metamail. -The gnus-uu viewing functions will be ignored and gnus-uu will try -to guess at a content-type based on file name suffixes. Default -it nil." - :group 'gnus-extract - :type 'boolean) - -(defcustom gnus-uu-unmark-articles-not-decoded nil - "*Non-nil means that gnus-uu will mark articles that were unsuccessfully decoded as unread. -Default is nil." - :group 'gnus-extract - :type 'boolean) - -(defcustom gnus-uu-correct-stripped-uucode nil - "*Non-nil means that gnus-uu will *try* to fix uuencoded files that have had trailing spaces deleted. -Default is nil." - :group 'gnus-extract - :type 'boolean) - -(defcustom gnus-uu-save-in-digest nil - "*Non-nil means that gnus-uu, when asked to save without decoding, will save in digests. -If this variable is nil, gnus-uu will just save everything in a -file without any embellishments. The digesting almost conforms to RFC1153 - -no easy way to specify any meaningful volume and issue numbers were found, -so I simply dropped them." - :group 'gnus-extract - :type 'boolean) - -(defcustom gnus-uu-pre-uudecode-hook nil - "Hook run before sending a message to uudecode." - :group 'gnus-extract - :type 'hook) - -(defcustom gnus-uu-digest-headers - '("^Date:" "^From:" "^To:" "^Cc:" "^Subject:" "^Message-ID:" "^Keywords:" - "^Summary:" "^References:" "^Content-Type:" "^Content-Transfer-Encoding:" - "^MIME-Version:" "^Content-Disposition:" "^Content-Description:" - "^Content-ID:" "^User-Agent:" "^X-Face:") - "*List of regexps to match headers included in digested messages. -The headers will be included in the sequence they are matched." - :group 'gnus-extract - :type '(repeat regexp)) - -(defcustom gnus-uu-save-separate-articles nil - "*Non-nil means that gnus-uu will save articles in separate files." - :group 'gnus-extract - :type 'boolean) - -(defcustom gnus-uu-be-dangerous 'ask - "*Specifies what to do if unusual situations arise during decoding. -If nil, be as conservative as possible. If t, ignore things that -didn't work, and overwrite existing files. Otherwise, ask each time." - :group 'gnus-extract - :type '(choice (const :tag "conservative" nil) - (const :tag "ask" ask) - (const :tag "liberal" t))) - -;; Internal variables - -(defvar gnus-uu-saved-article-name nil) - -(defvar gnus-uu-begin-string "^begin[ \t]+[0-7][0-7][0-7][ \t]+\\(.*\\)$") -(defvar gnus-uu-end-string "^end[ \t]*$") - -(defvar gnus-uu-body-line "^M") -(let ((i 61)) - (while (> (setq i (1- i)) 0) - (setq gnus-uu-body-line (concat gnus-uu-body-line "[^a-z]"))) - (setq gnus-uu-body-line (concat gnus-uu-body-line ".?$"))) - -;"^M.............................................................?$" - -(defvar gnus-uu-shar-begin-string "^#! */bin/sh") - -(defvar gnus-uu-shar-file-name nil) -(defvar gnus-uu-shar-name-marker - "begin [0-7][0-7][0-7][ \t]+\\(\\(\\w\\|\\.\\)*\\b\\)") - -(defvar gnus-uu-postscript-begin-string "^%!PS-") -(defvar gnus-uu-postscript-end-string "^%%EOF$") - -(defvar gnus-uu-file-name nil) -(defvar gnus-uu-uudecode-process nil) -(defvar gnus-uu-binhex-article-name nil) - -(defvar gnus-uu-work-dir nil) - -(defvar gnus-uu-output-buffer-name " *Gnus UU Output*") - -(defvar gnus-uu-default-dir gnus-article-save-directory) -(defvar gnus-uu-digest-from-subject nil) -(defvar gnus-uu-digest-buffer nil) - -;; Keymaps - -(gnus-define-keys (gnus-uu-mark-map "P" gnus-summary-mark-map) - "p" gnus-summary-mark-as-processable - "u" gnus-summary-unmark-as-processable - "U" gnus-summary-unmark-all-processable - "v" gnus-uu-mark-over - "s" gnus-uu-mark-series - "r" gnus-uu-mark-region - "g" gnus-uu-unmark-region - "R" gnus-uu-mark-by-regexp - "G" gnus-uu-unmark-by-regexp - "t" gnus-uu-mark-thread - "T" gnus-uu-unmark-thread - "a" gnus-uu-mark-all - "b" gnus-uu-mark-buffer - "S" gnus-uu-mark-sparse - "k" gnus-summary-kill-process-mark - "y" gnus-summary-yank-process-mark - "w" gnus-summary-save-process-mark - "i" gnus-uu-invert-processable) - -(gnus-define-keys (gnus-uu-extract-map "X" gnus-summary-mode-map) - ;;"x" gnus-uu-extract-any - "m" gnus-summary-save-parts - "u" gnus-uu-decode-uu - "U" gnus-uu-decode-uu-and-save - "s" gnus-uu-decode-unshar - "S" gnus-uu-decode-unshar-and-save - "o" gnus-uu-decode-save - "O" gnus-uu-decode-save - "b" gnus-uu-decode-binhex - "B" gnus-uu-decode-binhex - "p" gnus-uu-decode-postscript - "P" gnus-uu-decode-postscript-and-save) - -(gnus-define-keys - (gnus-uu-extract-view-map "v" gnus-uu-extract-map) - "u" gnus-uu-decode-uu-view - "U" gnus-uu-decode-uu-and-save-view - "s" gnus-uu-decode-unshar-view - "S" gnus-uu-decode-unshar-and-save-view - "o" gnus-uu-decode-save-view - "O" gnus-uu-decode-save-view - "b" gnus-uu-decode-binhex-view - "B" gnus-uu-decode-binhex-view - "p" gnus-uu-decode-postscript-view - "P" gnus-uu-decode-postscript-and-save-view) - - -;; Commands. - -(defun gnus-uu-decode-uu (&optional n) - "Uudecodes the current article." - (interactive "P") - (gnus-uu-decode-with-method 'gnus-uu-uustrip-article n)) - -(defun gnus-uu-decode-uu-and-save (n dir) - "Decodes and saves the resulting file." - (interactive - (list current-prefix-arg - (file-name-as-directory - (read-file-name "Uudecode and save in dir: " - gnus-uu-default-dir - gnus-uu-default-dir t)))) - (gnus-uu-decode-with-method 'gnus-uu-uustrip-article n dir nil nil t)) - -(defun gnus-uu-decode-unshar (&optional n) - "Unshars the current article." - (interactive "P") - (gnus-uu-decode-with-method 'gnus-uu-unshar-article n nil nil 'scan t)) - -(defun gnus-uu-decode-unshar-and-save (n dir) - "Unshars and saves the current article." - (interactive - (list current-prefix-arg - (file-name-as-directory - (read-file-name "Unshar and save in dir: " - gnus-uu-default-dir - gnus-uu-default-dir t)))) - (gnus-uu-decode-with-method 'gnus-uu-unshar-article n dir nil 'scan t)) - -(defun gnus-uu-decode-save (n file) - "Saves the current article." - (interactive - (list current-prefix-arg - (read-file-name - (if gnus-uu-save-separate-articles - "Save articles is dir: " - "Save articles in file: ") - gnus-uu-default-dir - gnus-uu-default-dir))) - (setq gnus-uu-saved-article-name file) - (gnus-uu-decode-with-method 'gnus-uu-save-article n nil t)) - -(defun gnus-uu-decode-binhex (n dir) - "Unbinhexes the current article." - (interactive - (list current-prefix-arg - (file-name-as-directory - (read-file-name "Unbinhex and save in dir: " - gnus-uu-default-dir - gnus-uu-default-dir)))) - (setq gnus-uu-binhex-article-name - (make-temp-name (concat gnus-uu-work-dir "binhex"))) - (gnus-uu-decode-with-method 'gnus-uu-binhex-article n dir)) - -(defun gnus-uu-decode-uu-view (&optional n) - "Uudecodes and views the current article." - (interactive "P") - (let ((gnus-view-pseudos (or gnus-view-pseudos 'automatic))) - (gnus-uu-decode-uu n))) - -(defun gnus-uu-decode-uu-and-save-view (n dir) - "Decodes, views and saves the resulting file." - (interactive - (list current-prefix-arg - (read-file-name "Uudecode, view and save in dir: " - gnus-uu-default-dir - gnus-uu-default-dir t))) - (let ((gnus-view-pseudos (or gnus-view-pseudos 'automatic))) - (gnus-uu-decode-uu-and-save n dir))) - -(defun gnus-uu-decode-unshar-view (&optional n) - "Unshars and views the current article." - (interactive "P") - (let ((gnus-view-pseudos (or gnus-view-pseudos 'automatic))) - (gnus-uu-decode-unshar n))) - -(defun gnus-uu-decode-unshar-and-save-view (n dir) - "Unshars and saves the current article." - (interactive - (list current-prefix-arg - (read-file-name "Unshar, view and save in dir: " - gnus-uu-default-dir - gnus-uu-default-dir t))) - (let ((gnus-view-pseudos (or gnus-view-pseudos 'automatic))) - (gnus-uu-decode-unshar-and-save n dir))) - -(defun gnus-uu-decode-save-view (n file) - "Saves and views the current article." - (interactive - (list current-prefix-arg - (read-file-name (if gnus-uu-save-separate-articles - "Save articles is dir: " - "Save articles in file: ") - gnus-uu-default-dir gnus-uu-default-dir))) - (let ((gnus-view-pseudos (or gnus-view-pseudos 'automatic))) - (gnus-uu-decode-save n file))) - -(defun gnus-uu-decode-binhex-view (n file) - "Unbinhexes and views the current article." - (interactive - (list current-prefix-arg - (read-file-name "Unbinhex, view and save in dir: " - gnus-uu-default-dir gnus-uu-default-dir))) - (setq gnus-uu-binhex-article-name - (make-temp-name (concat gnus-uu-work-dir "binhex"))) - (let ((gnus-view-pseudos (or gnus-view-pseudos 'automatic))) - (gnus-uu-decode-binhex n file))) - - -;; Digest and forward articles - -(defun gnus-uu-digest-mail-forward (&optional n post) - "Digests and forwards all articles in this series." - (interactive "P") - (let ((gnus-uu-save-in-digest t) - (file (make-temp-name (nnheader-concat gnus-uu-tmp-dir "forward"))) - (message-forward-as-mime message-forward-as-mime) - (mail-parse-charset gnus-newsgroup-charset) - (mail-parse-ignored-charsets gnus-newsgroup-ignored-charsets) - gnus-uu-digest-buffer subject from) - (if (and n (not (numberp n))) - (setq message-forward-as-mime (not message-forward-as-mime) - n nil)) - (let ((gnus-article-reply (gnus-summary-work-articles n))) - (gnus-setup-message 'forward - (setq gnus-uu-digest-from-subject nil) - (setq gnus-uu-digest-buffer - (gnus-get-buffer-create " *gnus-uu-forward*")) - (gnus-uu-decode-save n file) - (switch-to-buffer gnus-uu-digest-buffer) - (let ((fs gnus-uu-digest-from-subject)) - (when fs - (setq from (caar fs) - subject (gnus-simplify-subject-fuzzy (cdar fs)) - fs (cdr fs)) - (while (and fs (or from subject)) - (when from - (unless (string= from (caar fs)) - (setq from nil))) - (when subject - (unless (string= (gnus-simplify-subject-fuzzy (cdar fs)) - subject) - (setq subject nil))) - (setq fs (cdr fs)))) - (unless subject - (setq subject "Digested Articles")) - (unless from - (setq from - (if (gnus-news-group-p gnus-newsgroup-name) - gnus-newsgroup-name - "Various")))) - (goto-char (point-min)) - (when (re-search-forward "^Subject: ") - (delete-region (point) (gnus-point-at-eol)) - (insert subject)) - (goto-char (point-min)) - (when (re-search-forward "^From:") - (delete-region (point) (gnus-point-at-eol)) - (insert " " from)) - (let ((message-forward-decoded-p t)) - (message-forward post)))) - (setq gnus-uu-digest-from-subject nil))) - -(defun gnus-uu-digest-post-forward (&optional n) - "Digest and forward to a newsgroup." - (interactive "P") - (gnus-uu-digest-mail-forward n t)) - -;; Process marking. - -(defun gnus-message-process-mark (unmarkp new-marked) - (let ((old (- (length gnus-newsgroup-processable) (length new-marked)))) - (message "%d mark%s %s%s" - (length new-marked) - (if (= (length new-marked) 1) "" "s") - (if unmarkp "removed" "added") - (cond - ((and (zerop old) - (not unmarkp)) - "") - (unmarkp - (format ", %d remain marked" - (length gnus-newsgroup-processable))) - (t - (format ", %d already marked" old)))))) - -(defun gnus-new-processable (unmarkp articles) - (if unmarkp - (gnus-intersection gnus-newsgroup-processable articles) - (gnus-set-difference articles gnus-newsgroup-processable))) - -(defun gnus-uu-mark-by-regexp (regexp &optional unmark) - "Set the process mark on articles whose subjects match REGEXP. -When called interactively, prompt for REGEXP. -Optional UNMARK non-nil means unmark instead of mark." - (interactive "sMark (regexp): \nP") - (save-excursion - (let* ((articles (gnus-uu-find-articles-matching regexp)) - (new-marked (gnus-new-processable unmark articles))) - (while articles - (if unmark - (gnus-summary-remove-process-mark (pop articles)) - (gnus-summary-set-process-mark (pop articles)))) - (gnus-message-process-mark unmark new-marked))) - (gnus-summary-position-point)) - -(defun gnus-uu-unmark-by-regexp (regexp) - "Remove the process mark from articles whose subjects match REGEXP. -When called interactively, prompt for REGEXP." - (interactive "sUnmark (regexp): ") - (gnus-uu-mark-by-regexp regexp t)) - -(defun gnus-uu-mark-series () - "Mark the current series with the process mark." - (interactive) - (let ((articles (gnus-uu-find-articles-matching))) - (while articles - (gnus-summary-set-process-mark (car articles)) - (setq articles (cdr articles))) - (message "")) - (gnus-summary-position-point)) - -(defun gnus-uu-mark-region (beg end &optional unmark) - "Set the process mark on all articles between point and mark." - (interactive "r") - (save-excursion - (goto-char beg) - (while (< (point) end) - (if unmark - (gnus-summary-remove-process-mark (gnus-summary-article-number)) - (gnus-summary-set-process-mark (gnus-summary-article-number))) - (forward-line 1))) - (gnus-summary-position-point)) - -(defun gnus-uu-unmark-region (beg end) - "Remove the process mark from all articles between point and mark." - (interactive "r") - (gnus-uu-mark-region beg end t)) - -(defun gnus-uu-mark-buffer () - "Set the process mark on all articles in the buffer." - (interactive) - (gnus-uu-mark-region (point-min) (point-max))) - -(defun gnus-uu-unmark-buffer () - "Remove the process mark on all articles in the buffer." - (interactive) - (gnus-uu-mark-region (point-min) (point-max) t)) - -(defun gnus-uu-mark-thread () - "Marks all articles downwards in this thread." - (interactive) - (gnus-save-hidden-threads - (let ((level (gnus-summary-thread-level))) - (while (and (gnus-summary-set-process-mark - (gnus-summary-article-number)) - (zerop (gnus-summary-next-subject 1 nil t)) - (> (gnus-summary-thread-level) level))))) - (gnus-summary-position-point)) - -(defun gnus-uu-unmark-thread () - "Unmarks all articles downwards in this thread." - (interactive) - (let ((level (gnus-summary-thread-level))) - (while (and (gnus-summary-remove-process-mark - (gnus-summary-article-number)) - (zerop (gnus-summary-next-subject 1)) - (> (gnus-summary-thread-level) level)))) - (gnus-summary-position-point)) - -(defun gnus-uu-invert-processable () - "Invert the list of process-marked articles." - (interactive) - (let ((data gnus-newsgroup-data) - number) - (save-excursion - (while data - (if (memq (setq number (gnus-data-number (pop data))) - gnus-newsgroup-processable) - (gnus-summary-remove-process-mark number) - (gnus-summary-set-process-mark number))))) - (gnus-summary-position-point)) - -(defun gnus-uu-mark-over (&optional score) - "Mark all articles with a score over SCORE (the prefix)." - (interactive "P") - (let ((score (or score gnus-summary-default-score 0)) - (data gnus-newsgroup-data)) - (save-excursion - (while data - (when (> (or (cdr (assq (gnus-data-number (car data)) - gnus-newsgroup-scored)) - gnus-summary-default-score 0) - score) - (gnus-summary-set-process-mark (caar data))) - (setq data (cdr data)))) - (gnus-summary-position-point))) - -(defun gnus-uu-mark-sparse () - "Mark all series that have some articles marked." - (interactive) - (let ((marked (nreverse gnus-newsgroup-processable)) - subject articles total headers) - (unless marked - (error "No articles marked with the process mark")) - (setq gnus-newsgroup-processable nil) - (save-excursion - (while marked - (and (vectorp (setq headers - (gnus-summary-article-header (car marked)))) - (setq subject (mail-header-subject headers) - articles (gnus-uu-find-articles-matching - (gnus-uu-reginize-string subject)) - total (nconc total articles))) - (while articles - (gnus-summary-set-process-mark (car articles)) - (setcdr marked (delq (car articles) (cdr marked))) - (setq articles (cdr articles))) - (setq marked (cdr marked))) - (setq gnus-newsgroup-processable (nreverse total))) - (gnus-summary-position-point))) - -(defun gnus-uu-mark-all () - "Mark all articles in \"series\" order." - (interactive) - (setq gnus-newsgroup-processable nil) - (save-excursion - (let ((data gnus-newsgroup-data) - number) - (while data - (when (and (not (memq (setq number (gnus-data-number (car data))) - gnus-newsgroup-processable)) - (vectorp (gnus-data-header (car data)))) - (gnus-summary-goto-subject number) - (gnus-uu-mark-series)) - (setq data (cdr data))))) - (gnus-summary-position-point)) - -;; All PostScript functions written by Erik Selberg . - -(defun gnus-uu-decode-postscript (&optional n) - "Gets postscript of the current article." - (interactive "P") - (gnus-uu-decode-with-method 'gnus-uu-decode-postscript-article n)) - -(defun gnus-uu-decode-postscript-view (&optional n) - "Gets and views the current article." - (interactive "P") - (let ((gnus-view-pseudos (or gnus-view-pseudos 'automatic))) - (gnus-uu-decode-postscript n))) - -(defun gnus-uu-decode-postscript-and-save (n dir) - "Extracts postscript and saves the current article." - (interactive - (list current-prefix-arg - (file-name-as-directory - (read-file-name "Save in dir: " - gnus-uu-default-dir - gnus-uu-default-dir t)))) - (gnus-uu-decode-with-method 'gnus-uu-decode-postscript-article - n dir nil nil t)) - -(defun gnus-uu-decode-postscript-and-save-view (n dir) - "Decodes, views and saves the resulting file." - (interactive - (list current-prefix-arg - (read-file-name "Where do you want to save the file(s)? " - gnus-uu-default-dir - gnus-uu-default-dir t))) - (let ((gnus-view-pseudos (or gnus-view-pseudos 'automatic))) - (gnus-uu-decode-postscript-and-save n dir))) - - -;; Internal functions. - -(defun gnus-uu-decode-with-method (method n &optional save not-insert - scan cdir) - (gnus-uu-initialize scan) - (when save - (setq gnus-uu-default-dir save)) - ;; Create the directory we save to. - (when (and scan cdir save - (not (file-exists-p save))) - (make-directory save t)) - (let ((articles (gnus-uu-get-list-of-articles n)) - files) - (setq files (gnus-uu-grab-articles articles method t)) - (let ((gnus-current-article (car articles))) - (when scan - (setq files (gnus-uu-scan-directory gnus-uu-work-dir)))) - (when save - (gnus-uu-save-files files save)) - (when (eq gnus-uu-do-not-unpack-archives nil) - (setq files (gnus-uu-unpack-files files))) - (setq files (nreverse (gnus-uu-get-actions files))) - (or not-insert (not gnus-insert-pseudo-articles) - (gnus-summary-insert-pseudos files save)))) - -(defun gnus-uu-scan-directory (dir &optional rec) - "Return a list of all files under DIR." - (let ((files (directory-files dir t)) - out file) - (while (setq file (pop files)) - (unless (member (file-name-nondirectory file) '("." "..")) - (push (list (cons 'name file) - (cons 'article gnus-current-article)) - out) - (when (file-directory-p file) - (setq out (nconc (gnus-uu-scan-directory file t) out))))) - (if rec - out - (nreverse out)))) - -(defun gnus-uu-save-files (files dir) - "Save FILES in DIR." - (let ((len (length files)) - (reg (concat "^" (regexp-quote gnus-uu-work-dir))) - to-file file fromdir) - (while (setq file (cdr (assq 'name (pop files)))) - (when (file-exists-p file) - (string-match reg file) - (setq fromdir (substring file (match-end 0))) - (if (file-directory-p file) - (gnus-make-directory (concat dir fromdir)) - (setq to-file (concat dir fromdir)) - (when (or (not (file-exists-p to-file)) - (eq gnus-uu-be-dangerous t) - (and gnus-uu-be-dangerous - (gnus-y-or-n-p (format "%s exists; overwrite? " - to-file)))) - (copy-file file to-file t t))))) - (gnus-message 5 "Saved %d file%s" len (if (= len 1) "" "s")))) - -;; Functions for saving and possibly digesting articles without -;; any decoding. - -;; Function called by gnus-uu-grab-articles to treat each article. -(defun gnus-uu-save-article (buffer in-state) - (cond - (gnus-uu-save-separate-articles - (save-excursion - (set-buffer buffer) - (gnus-write-buffer-as-coding-system - nnheader-text-coding-system - (concat gnus-uu-saved-article-name gnus-current-article)) - (cond ((eq in-state 'first) (list gnus-uu-saved-article-name 'begin)) - ((eq in-state 'first-and-last) (list gnus-uu-saved-article-name - 'begin 'end)) - ((eq in-state 'last) (list 'end)) - (t (list 'middle))))) - ((not gnus-uu-save-in-digest) - (save-excursion - (set-buffer buffer) - (write-region (point-min) (point-max) gnus-uu-saved-article-name t) - (cond ((eq in-state 'first) (list gnus-uu-saved-article-name 'begin)) - ((eq in-state 'first-and-last) (list gnus-uu-saved-article-name - 'begin 'end)) - ((eq in-state 'last) (list 'end)) - (t (list 'middle))))) - (t - (let ((header (gnus-summary-article-header))) - (push (cons (mail-header-from header) - (mail-header-subject header)) - gnus-uu-digest-from-subject)) - (let ((name (file-name-nondirectory gnus-uu-saved-article-name)) - beg subj headers headline sorthead body end-string state) - (if (or (eq in-state 'first) - (eq in-state 'first-and-last)) - (progn - (setq state (list 'begin)) - (save-excursion - (set-buffer (gnus-get-buffer-create "*gnus-uu-body*")) - (erase-buffer)) - (save-excursion - (set-buffer (gnus-get-buffer-create "*gnus-uu-pre*")) - (erase-buffer) - (insert (format - "Date: %s\nFrom: %s\nSubject: %s Digest\n\n" - (current-time-string) name name)) - (insert "Topics:\n"))) - (when (not (eq in-state 'end)) - (setq state (list 'middle)))) - (save-excursion - (set-buffer "*gnus-uu-body*") - (goto-char (setq beg (point-max))) - (save-excursion - (save-restriction - (set-buffer buffer) - (let (buffer-read-only) - (gnus-set-text-properties (point-min) (point-max) nil) - ;; These two are necessary for XEmacs 19.12 fascism. - (put-text-property (point-min) (point-max) 'invisible nil) - (put-text-property (point-min) (point-max) 'intangible nil)) - (goto-char (point-min)) - (re-search-forward "\n\n") - (unless gnus-uu-digest-buffer - ;; Quote all 30-dash lines. - (save-excursion - (while (re-search-forward "^-" nil t) - (beginning-of-line) - (delete-char 1) - (insert "- ")))) - (setq body (buffer-substring (1- (point)) (point-max))) - (narrow-to-region (point-min) (point)) - (if (not (setq headers gnus-uu-digest-headers)) - (setq sorthead (buffer-substring (point-min) (point-max))) - (while headers - (setq headline (car headers)) - (setq headers (cdr headers)) - (goto-char (point-min)) - (while (re-search-forward headline nil t) - (setq sorthead - (concat sorthead - (buffer-substring - (match-beginning 0) - (or (and (re-search-forward "^[^ \t]" nil t) - (1- (point))) - (progn (forward-line 1) (point))))))))) - (widen))) - (insert message-forward-start-separator) - (insert sorthead) (goto-char (point-max)) - (insert body) (goto-char (point-max)) - (goto-char beg) - (when (re-search-forward "^Subject:" nil t) - (setq subj (nnheader-decode-subject - (buffer-substring (match-end 0) (std11-field-end))))) - (when subj - (save-excursion - (set-buffer "*gnus-uu-pre*") - (insert (format " %s\n" subj))))) - (when (or (eq in-state 'last) - (eq in-state 'first-and-last)) - (if gnus-uu-digest-buffer - (with-current-buffer gnus-uu-digest-buffer - (erase-buffer) - (insert-buffer "*gnus-uu-pre*") - (goto-char (point-max)) - (insert-buffer "*gnus-uu-body*")) - (save-excursion - (set-buffer "*gnus-uu-pre*") - (insert (format "\n\n%s\n\n" (make-string 70 ?-))) - (if gnus-uu-digest-buffer - (with-current-buffer gnus-uu-digest-buffer - (erase-buffer) - (insert-buffer "*gnus-uu-pre*")) - (gnus-write-buffer-as-coding-system - nnheader-text-coding-system gnus-uu-saved-article-name))) - (save-excursion - (set-buffer "*gnus-uu-body*") - (goto-char (point-max)) - (insert - (concat (setq end-string (format "End of %s Digest" name)) - "\n")) - (insert (concat (make-string (length end-string) ?*) "\n")) - (if gnus-uu-digest-buffer - (with-current-buffer gnus-uu-digest-buffer - (goto-char (point-max)) - (insert-buffer "*gnus-uu-body*")) - (let ((file-name-coding-system nnmail-pathname-coding-system) - (pathname-coding-system nnmail-pathname-coding-system)) - (write-region-as-coding-system - nnheader-text-coding-system - (point-min) (point-max) gnus-uu-saved-article-name t))))) - (gnus-kill-buffer "*gnus-uu-pre*") - (gnus-kill-buffer "*gnus-uu-body*") - (push 'end state)) - (if (memq 'begin state) - (cons gnus-uu-saved-article-name state) - state))))) - -;; Binhex treatment - not very advanced. - -(defvar gnus-uu-binhex-body-line - "^[^:]...............................................................$") -(defvar gnus-uu-binhex-begin-line - "^:...............................................................$") -(defvar gnus-uu-binhex-end-line - ":$") - -(defun gnus-uu-binhex-article (buffer in-state) - (let (state start-char) - (save-excursion - (set-buffer buffer) - (widen) - (goto-char (point-min)) - (when (not (re-search-forward gnus-uu-binhex-begin-line nil t)) - (when (not (re-search-forward gnus-uu-binhex-body-line nil t)) - (setq state (list 'wrong-type)))) - - (if (memq 'wrong-type state) - () - (beginning-of-line) - (setq start-char (point)) - (if (looking-at gnus-uu-binhex-begin-line) - (progn - (setq state (list 'begin)) - (write-region 1 1 gnus-uu-binhex-article-name)) - (setq state (list 'middle))) - (goto-char (point-max)) - (re-search-backward (concat gnus-uu-binhex-body-line "\\|" - gnus-uu-binhex-end-line) - nil t) - (when (looking-at gnus-uu-binhex-end-line) - (setq state (if (memq 'begin state) - (cons 'end state) - (list 'end)))) - (beginning-of-line) - (forward-line 1) - (when (file-exists-p gnus-uu-binhex-article-name) - (write-region-as-binary start-char (point) - gnus-uu-binhex-article-name 'append)))) - (if (memq 'begin state) - (cons gnus-uu-binhex-article-name state) - state))) - -;; PostScript - -(defun gnus-uu-decode-postscript-article (process-buffer in-state) - (let ((state (list 'ok)) - start-char end-char file-name) - (save-excursion - (set-buffer process-buffer) - (goto-char (point-min)) - (if (not (re-search-forward gnus-uu-postscript-begin-string nil t)) - (setq state (list 'wrong-type)) - (beginning-of-line) - (setq start-char (point)) - (if (not (re-search-forward gnus-uu-postscript-end-string nil t)) - (setq state (list 'wrong-type)) - (setq end-char (point)) - (set-buffer (gnus-get-buffer-create gnus-uu-output-buffer-name)) - (insert-buffer-substring process-buffer start-char end-char) - (setq file-name (concat gnus-uu-work-dir - (cdr gnus-article-current) ".ps")) - (write-region (point-min) (point-max) file-name) - (setq state (list file-name 'begin 'end))))) - state)) - - -;; Find actions. - -(defun gnus-uu-get-actions (files) - (let ((ofiles files) - action name) - (while files - (setq name (cdr (assq 'name (car files)))) - (and - (setq action (gnus-uu-get-action name)) - (setcar files (nconc (list (if (string= action "gnus-uu-archive") - (cons 'action "file") - (cons 'action action)) - (cons 'execute (gnus-uu-command - action name))) - (car files)))) - (setq files (cdr files))) - ofiles)) - -(defun gnus-uu-get-action (file-name) - (let (action) - (setq action - (gnus-uu-choose-action - file-name - (append - gnus-uu-user-view-rules - (if gnus-uu-ignore-default-view-rules - nil - gnus-uu-default-view-rules) - gnus-uu-user-view-rules-end))) - (when (and (not (string= (or action "") "gnus-uu-archive")) - gnus-uu-view-with-metamail) - (when (setq action - (gnus-uu-choose-action file-name gnus-uu-ext-to-mime-list)) - (setq action (format "metamail -d -b -c \"%s\"" action)))) - action)) - - -;; Functions for treating subjects and collecting series. - -(defun gnus-uu-reginize-string (string) - ;; Takes a string and puts a \ in front of every special character; - ;; replaces the last thing that looks like "2/3" with "[0-9]+/3" - ;; or, if it can't find something like that, tries "2 of 3", then - ;; finally just replaces the next to last number with "[0-9]+". - (save-excursion - (set-buffer (gnus-get-buffer-create gnus-uu-output-buffer-name)) - (buffer-disable-undo) - (erase-buffer) - (insert (regexp-quote string)) - - (setq case-fold-search nil) - - (end-of-line) - (if (re-search-backward "\\([^0-9]\\)[0-9]+/\\([0-9]+\\)" nil t) - (replace-match "\\1[0-9]+/\\2") - - (end-of-line) - (if (re-search-backward "\\([^0-9]\\)[0-9]+[ \t]*of[ \t]*\\([0-9]+\\)" - nil t) - (replace-match "\\1[0-9]+ of \\2") - - (end-of-line) - (if (re-search-backward "\\([^0-9]\\)[0-9]+\\([^0-9]+\\)[0-9]+" - nil t) - (replace-match "\\1[0-9]+\\2[0-9]+" t nil nil nil)))) - - (goto-char 1) - (while (re-search-forward "[ \t]+" nil t) - (replace-match "[ \t]+" t t)) - - (buffer-substring 1 (point-max)))) - -(defun gnus-uu-get-list-of-articles (n) - ;; If N is non-nil, the article numbers of the N next articles - ;; will be returned. - ;; If any articles have been marked as processable, they will be - ;; returned. - ;; Failing that, articles that have subjects that are part of the - ;; same "series" as the current will be returned. - (let (articles) - (cond - (n - (setq n (prefix-numeric-value n)) - (let ((backward (< n 0)) - (n (abs n))) - (save-excursion - (while (and (> n 0) - (push (gnus-summary-article-number) - articles) - (gnus-summary-search-forward nil nil backward)) - (setq n (1- n)))) - (nreverse articles))) - (gnus-newsgroup-processable - (reverse gnus-newsgroup-processable)) - (t - (gnus-uu-find-articles-matching))))) - -(defun gnus-uu-string< (l1 l2) - (string< (car l1) (car l2))) - -(defun gnus-uu-find-articles-matching - (&optional subject only-unread do-not-translate) - ;; Finds all articles that matches the regexp SUBJECT. If it is - ;; nil, the current article name will be used. If ONLY-UNREAD is - ;; non-nil, only unread articles are chosen. If DO-NOT-TRANSLATE is - ;; non-nil, article names are not equalized before sorting. - (let ((subject (or subject - (gnus-uu-reginize-string (gnus-summary-article-subject)))) - list-of-subjects) - (save-excursion - (when subject - ;; Collect all subjects matching subject. - (let ((case-fold-search t) - (data gnus-newsgroup-data) - subj mark d) - (while data - (setq d (pop data)) - (and (not (gnus-data-pseudo-p d)) - (or (not only-unread) - (= (setq mark (gnus-data-mark d)) - gnus-unread-mark) - (= mark gnus-ticked-mark) - (= mark gnus-dormant-mark)) - (setq subj (mail-header-subject (gnus-data-header d))) - (string-match subject subj) - (push (cons subj (gnus-data-number d)) - list-of-subjects)))) - - ;; Expand numbers, sort, and return the list of article - ;; numbers. - (mapcar (lambda (sub) (cdr sub)) - (sort (gnus-uu-expand-numbers - list-of-subjects - (not do-not-translate)) - 'gnus-uu-string<)))))) - -(defun gnus-uu-expand-numbers (string-list &optional translate) - ;; Takes a list of strings and "expands" all numbers in all the - ;; strings. That is, this function makes all numbers equal length by - ;; prepending lots of zeroes before each number. This is to ease later - ;; sorting to find out what sequence the articles are supposed to be - ;; decoded in. Returns the list of expanded strings. - (let ((out-list string-list) - string) - (save-excursion - (set-buffer (gnus-get-buffer-create gnus-uu-output-buffer-name)) - (buffer-disable-undo) - (while string-list - (erase-buffer) - (insert (caar string-list)) - ;; Translate multiple spaces to one space. - (goto-char (point-min)) - (while (re-search-forward "[ \t]+" nil t) - (replace-match " ")) - ;; Translate all characters to "a". - (goto-char (point-min)) - (when translate - (while (re-search-forward "[A-Za-z]" nil t) - (replace-match "a" t t))) - ;; Expand numbers. - (goto-char (point-min)) - (while (re-search-forward "[0-9]+" nil t) - (replace-match - (format "%06d" - (string-to-int (buffer-substring - (match-beginning 0) (match-end 0)))))) - (setq string (buffer-substring 1 (point-max))) - (setcar (car string-list) string) - (setq string-list (cdr string-list)))) - out-list)) - - -;; `gnus-uu-grab-articles' is the general multi-article treatment -;; function. It takes a list of articles to be grabbed and a function -;; to apply to each article. -;; -;; The function to be called should take two parameters. The first -;; parameter is the article buffer. The function should leave the -;; result, if any, in this buffer. Most treatment functions will just -;; generate files... -;; -;; The second parameter is the state of the list of articles, and can -;; have four values: `first', `middle', `last' and `first-and-last'. -;; -;; The function should return a list. The list may contain the -;; following symbols: -;; `error' if an error occurred -;; `begin' if the beginning of an encoded file has been received -;; If the list returned contains a `begin', the first element of -;; the list *must* be a string with the file name of the decoded -;; file. -;; `end' if the end of an encoded file has been received -;; `middle' if the article was a body part of an encoded file -;; `wrong-type' if the article was not a part of an encoded file -;; `ok', which can be used everything is ok - -(defvar gnus-uu-has-been-grabbed nil) - -(defun gnus-uu-unmark-list-of-grabbed (&optional dont-unmark-last-article) - (let (art) - (if (not (and gnus-uu-has-been-grabbed - gnus-uu-unmark-articles-not-decoded)) - () - (when dont-unmark-last-article - (setq art (car gnus-uu-has-been-grabbed)) - (setq gnus-uu-has-been-grabbed (cdr gnus-uu-has-been-grabbed))) - (while gnus-uu-has-been-grabbed - (gnus-summary-tick-article (car gnus-uu-has-been-grabbed) t) - (setq gnus-uu-has-been-grabbed (cdr gnus-uu-has-been-grabbed))) - (when dont-unmark-last-article - (setq gnus-uu-has-been-grabbed (list art)))))) - -;; This function takes a list of articles and a function to apply to -;; each article grabbed. -;; -;; This function returns a list of files decoded if the grabbing and -;; the process-function has been successful and nil otherwise. -(defun gnus-uu-grab-articles (articles process-function - &optional sloppy limit no-errors) - (let ((state 'first) - (gnus-asynchronous nil) - (gnus-inhibit-treatment t) - has-been-begin article result-file result-files process-state - gnus-summary-display-article-function - gnus-article-prepare-hook gnus-display-mime-function - article-series files) - - (while (and articles - (not (memq 'error process-state)) - (or sloppy - (not (memq 'end process-state)))) - - (setq article (pop articles)) - (when (vectorp (gnus-summary-article-header article)) - (push article article-series) - - (unless articles - (if (eq state 'first) - (setq state 'first-and-last) - (setq state 'last))) - - (let ((part (gnus-uu-part-number article))) - (gnus-message 6 "Getting article %d%s..." - article (if (string= part "") "" (concat ", " part)))) - (gnus-summary-display-article article) - - ;; Push the article to the processing function. - (save-excursion - (set-buffer gnus-original-article-buffer) - (let ((buffer-read-only nil)) - (save-excursion - (set-buffer gnus-summary-buffer) - (setq process-state - (funcall process-function - gnus-original-article-buffer state))))) - - (gnus-summary-remove-process-mark article) - - ;; If this is the beginning of a decoded file, we push it - ;; on to a list. - (when (or (memq 'begin process-state) - (and (or (eq state 'first) - (eq state 'first-and-last)) - (memq 'ok process-state))) - (when has-been-begin - ;; If there is a `result-file' here, that means that the - ;; file was unsuccessfully decoded, so we delete it. - (when (and result-file - (file-exists-p result-file) - (not gnus-uu-be-dangerous) - (or (eq gnus-uu-be-dangerous t) - (gnus-y-or-n-p - (format "Delete unsuccessfully decoded file %s" - result-file)))) - (delete-file result-file))) - (when (memq 'begin process-state) - (setq result-file (car process-state))) - (setq has-been-begin t)) - - ;; Check whether we have decoded one complete file. - (when (memq 'end process-state) - (setq article-series nil) - (setq has-been-begin nil) - (if (stringp result-file) - (setq files (list result-file)) - (setq files result-file)) - (setq result-file (car files)) - (while files - (push (list (cons 'name (pop files)) - (cons 'article article)) - result-files)) - ;; Allow user-defined functions to be run on this file. - (when gnus-uu-grabbed-file-functions - (let ((funcs gnus-uu-grabbed-file-functions)) - (unless (listp funcs) - (setq funcs (list funcs))) - (while funcs - (funcall (pop funcs) result-file)))) - (setq result-file nil) - ;; Check whether we have decoded enough articles. - (and limit (= (length result-files) limit) - (setq articles nil))) - - ;; If this is the last article to be decoded, and - ;; we still haven't reached the end, then we delete - ;; the partially decoded file. - (and (or (eq state 'last) (eq state 'first-and-last)) - (not (memq 'end process-state)) - result-file - (file-exists-p result-file) - (not gnus-uu-be-dangerous) - (or (eq gnus-uu-be-dangerous t) - (gnus-y-or-n-p - (format "Delete incomplete file %s? " result-file))) - (delete-file result-file)) - - ;; If this was a file of the wrong sort, then - (when (and (or (memq 'wrong-type process-state) - (memq 'error process-state)) - gnus-uu-unmark-articles-not-decoded) - (gnus-summary-tick-article article t)) - - ;; Set the new series state. - (if (and (not has-been-begin) - (not sloppy) - (or (memq 'end process-state) - (memq 'middle process-state))) - (progn - (setq process-state (list 'error)) - (gnus-message 2 "No begin part at the beginning") - (sleep-for 2)) - (setq state 'middle))) - - ;; When there are no result-files, then something must be wrong. - (if result-files - (message "") - (cond - ((not has-been-begin) - (gnus-message 2 "Wrong type file")) - ((memq 'error process-state) - (gnus-message 2 "An error occurred during decoding")) - ((not (or (memq 'ok process-state) - (memq 'end process-state))) - (gnus-message 2 "End of articles reached before end of file"))) - ;; Make unsuccessfully decoded articles unread. - (when gnus-uu-unmark-articles-not-decoded - (while article-series - (gnus-summary-tick-article (pop article-series) t))))) - - ;; The original article buffer is hosed, shoot it down. - (gnus-kill-buffer gnus-original-article-buffer) - - result-files)) - -(defun gnus-uu-grab-view (file) - "View FILE using the gnus-uu methods." - (let ((action (gnus-uu-get-action file))) - (gnus-execute-command - (if (string-match "%" action) - (format action file) - (concat action " " file)) - (eq gnus-view-pseudos 'not-confirm)))) - -(defun gnus-uu-grab-move (file) - "Move FILE to somewhere." - (when gnus-uu-default-dir - (let ((to-file (concat (file-name-as-directory gnus-uu-default-dir) - (file-name-nondirectory file)))) - (cond ((fboundp 'make-symbolic-link) - (rename-file file to-file) - (unless (file-exists-p file) - (make-symbolic-link to-file file))) - (t - (copy-file file to-file)))))) - -(defun gnus-uu-part-number (article) - (let* ((header (gnus-summary-article-header article)) - (subject (and header (mail-header-subject header))) - (part nil)) - (if subject - (while (string-match "[0-9]+/[0-9]+\\|[0-9]+[ \t]+of[ \t]+[0-9]+" - subject) - (setq part (match-string 0 subject)) - (setq subject (substring subject (match-end 0))))) - (or part - (while (string-match "\\([0-9]+\\)[^0-9]+\\([0-9]+\\)" subject) - (setq part (match-string 0 subject)) - (setq subject (substring subject (match-end 0))))) - (or part ""))) - -(defun gnus-uu-uudecode-sentinel (process event) - (delete-process (get-process process))) - -(defun gnus-uu-uustrip-article (process-buffer in-state) - ;; Uudecodes a file asynchronously. - (save-excursion - (set-buffer process-buffer) - (let ((state (list 'wrong-type)) - process-connection-type case-fold-search buffer-read-only - files start-char) - (goto-char (point-min)) - - ;; Deal with ^M at the end of the lines. - (when gnus-uu-kill-carriage-return - (save-excursion - (while (search-forward "\r" nil t) - (delete-backward-char 1)))) - - (while (or (re-search-forward gnus-uu-begin-string nil t) - (re-search-forward gnus-uu-body-line nil t)) - (setq state (list 'ok)) - ;; Ok, we are at the first uucoded line. - (beginning-of-line) - (setq start-char (point)) - - (if (not (looking-at gnus-uu-begin-string)) - (setq state (list 'middle)) - ;; This is the beginning of a uuencoded article. - ;; We replace certain characters that could make things messy. - (setq gnus-uu-file-name - (let ((nnheader-file-name-translation-alist - '((?/ . ?,) (? . ?_) (?* . ?_) (?$ . ?_)))) - (nnheader-translate-file-chars (match-string 1)))) - (replace-match (concat "begin 644 " gnus-uu-file-name) t t) - - ;; Remove any non gnus-uu-body-line right after start. - (forward-line 1) - (while (and (not (eobp)) - (not (looking-at gnus-uu-body-line))) - (gnus-delete-line)) - - ;; If a process is running, we kill it. - (when (and gnus-uu-uudecode-process - (memq (process-status gnus-uu-uudecode-process) - '(run stop))) - (delete-process gnus-uu-uudecode-process) - (gnus-uu-unmark-list-of-grabbed t)) - - ;; Start a new uudecoding process. - (let ((cdir default-directory)) - (unwind-protect - (progn - (cd gnus-uu-work-dir) - (setq gnus-uu-uudecode-process - (start-process - "*uudecode*" - (gnus-get-buffer-create gnus-uu-output-buffer-name) - shell-file-name shell-command-switch - (format "cd %s %s uudecode" gnus-uu-work-dir - gnus-shell-command-separator)))) - (cd cdir))) - (set-process-sentinel - gnus-uu-uudecode-process 'gnus-uu-uudecode-sentinel) - (setq state (list 'begin)) - (push (concat gnus-uu-work-dir gnus-uu-file-name) files)) - - ;; We look for the end of the thing to be decoded. - (if (re-search-forward gnus-uu-end-string nil t) - (push 'end state) - (goto-char (point-max)) - (re-search-backward gnus-uu-body-line nil t)) - - (forward-line 1) - - (when gnus-uu-uudecode-process - (when (memq (process-status gnus-uu-uudecode-process) '(run stop)) - ;; Try to correct mishandled uucode. - (when gnus-uu-correct-stripped-uucode - (gnus-uu-check-correct-stripped-uucode start-char (point))) - (gnus-run-hooks 'gnus-uu-pre-uudecode-hook) - - ;; Send the text to the process. - (condition-case nil - (process-send-region - gnus-uu-uudecode-process start-char (point)) - (error - (progn - (delete-process gnus-uu-uudecode-process) - (gnus-message 2 "gnus-uu: Couldn't uudecode") - (setq state (list 'wrong-type))))) - - (if (memq 'end state) - (progn - ;; Send an EOF, just in case. - (ignore-errors - (process-send-eof gnus-uu-uudecode-process)) - (while (memq (process-status gnus-uu-uudecode-process) - '(open run)) - (accept-process-output gnus-uu-uudecode-process 1))) - (when (or (not gnus-uu-uudecode-process) - (not (memq (process-status gnus-uu-uudecode-process) - '(run stop)))) - (setq state (list 'wrong-type))))))) - - (if (memq 'begin state) - (cons (if (= (length files) 1) (car files) files) state) - state)))) - -(defvar gnus-uu-unshar-warning - "*** WARNING *** - -Shell archives are an archaic method of bundling files for distribution -across computer networks. During the unpacking process, arbitrary commands -are executed on your system, and all kinds of nasty things can happen. -Please examine the archive very carefully before you instruct Emacs to -unpack it. You can browse the archive buffer using \\[scroll-other-window]. - -If you are unsure what to do, please answer \"no\"." - "Text of warning message displayed by `gnus-uu-unshar-article'. -Make sure that this text consists only of few text lines. Otherwise, -Gnus might fail to display all of it.") - - -;; This function is used by `gnus-uu-grab-articles' to treat -;; a shared article. -(defun gnus-uu-unshar-article (process-buffer in-state) - (let ((state (list 'ok)) - start-char) - (save-excursion - (set-buffer process-buffer) - (goto-char (point-min)) - (if (not (re-search-forward gnus-uu-shar-begin-string nil t)) - (setq state (list 'wrong-type)) - (save-window-excursion - (save-excursion - (switch-to-buffer (current-buffer)) - (delete-other-windows) - (let ((buffer (get-buffer-create (generate-new-buffer-name - "*Warning*")))) - (unless - (unwind-protect - (with-current-buffer buffer - (insert (substitute-command-keys - gnus-uu-unshar-warning)) - (goto-char (point-min)) - (display-buffer buffer) - (yes-or-no-p "This is a shell archive, unshar it? ")) - (kill-buffer buffer)) - (setq state (list 'error)))))) - (unless (memq 'error state) - (beginning-of-line) - (setq start-char (point)) - (call-process-region - start-char (point-max) shell-file-name nil - (gnus-get-buffer-create gnus-uu-output-buffer-name) nil - shell-command-switch - (concat "cd " gnus-uu-work-dir " " - gnus-shell-command-separator " sh"))))) - state)) - -;; Returns the name of what the shar file is going to unpack. -(defun gnus-uu-find-name-in-shar () - (let ((oldpoint (point)) - res) - (goto-char (point-min)) - (when (re-search-forward gnus-uu-shar-name-marker nil t) - (setq res (buffer-substring (match-beginning 1) (match-end 1)))) - (goto-char oldpoint) - res)) - -;; `gnus-uu-choose-action' chooses what action to perform given the name -;; and `gnus-uu-file-action-list'. Returns either nil if no action is -;; found, or the name of the command to run if such a rule is found. -(defun gnus-uu-choose-action (file-name file-action-list &optional no-ignore) - (let ((action-list (copy-sequence file-action-list)) - (case-fold-search t) - rule action) - (and - (unless no-ignore - (and (not - (and gnus-uu-ignore-files-by-name - (string-match gnus-uu-ignore-files-by-name file-name))) - (not - (and gnus-uu-ignore-files-by-type - (string-match gnus-uu-ignore-files-by-type - (or (gnus-uu-choose-action - file-name gnus-uu-ext-to-mime-list t) - "")))))) - (while (not (or (eq action-list ()) action)) - (setq rule (car action-list)) - (setq action-list (cdr action-list)) - (when (string-match (car rule) file-name) - (setq action (cadr rule))))) - action)) - -(defun gnus-uu-treat-archive (file-path) - ;; Unpacks an archive. Returns t if unpacking is successful. - (let ((did-unpack t) - action command dir) - (setq action (gnus-uu-choose-action - file-path (append gnus-uu-user-archive-rules - (if gnus-uu-ignore-default-archive-rules - nil - gnus-uu-default-archive-rules)))) - - (when (not action) - (error "No unpackers for the file %s" file-path)) - - (string-match "/[^/]*$" file-path) - (setq dir (substring file-path 0 (match-beginning 0))) - - (when (member action gnus-uu-destructive-archivers) - (copy-file file-path (concat file-path "~") t)) - - (setq command (format "cd %s ; %s" dir (gnus-uu-command action file-path))) - - (save-excursion - (set-buffer (gnus-get-buffer-create gnus-uu-output-buffer-name)) - (erase-buffer)) - - (gnus-message 5 "Unpacking: %s..." (gnus-uu-command action file-path)) - - (if (= 0 (call-process shell-file-name nil - (gnus-get-buffer-create gnus-uu-output-buffer-name) - nil shell-command-switch command)) - (message "") - (gnus-message 2 "Error during unpacking of archive") - (setq did-unpack nil)) - - (when (member action gnus-uu-destructive-archivers) - (rename-file (concat file-path "~") file-path t)) - - did-unpack)) - -(defun gnus-uu-dir-files (dir) - (let ((dirs (directory-files dir t "[^/][^\\.][^\\.]?$")) - files file) - (while dirs - (if (file-directory-p (setq file (car dirs))) - (setq files (append files (gnus-uu-dir-files file))) - (push file files)) - (setq dirs (cdr dirs))) - files)) - -(defun gnus-uu-unpack-files (files &optional ignore) - ;; Go through FILES and look for files to unpack. - (let* ((totfiles (gnus-uu-ls-r gnus-uu-work-dir)) - (ofiles files) - file did-unpack) - (while files - (setq file (cdr (assq 'name (car files)))) - (when (and (not (member file ignore)) - (equal (gnus-uu-get-action (file-name-nondirectory file)) - "gnus-uu-archive")) - (push file did-unpack) - (unless (gnus-uu-treat-archive file) - (gnus-message 2 "Error during unpacking of %s" file)) - (let* ((newfiles (gnus-uu-ls-r gnus-uu-work-dir)) - (nfiles newfiles)) - (while nfiles - (unless (member (car nfiles) totfiles) - (push (list (cons 'name (car nfiles)) - (cons 'original file)) - ofiles)) - (setq nfiles (cdr nfiles))) - (setq totfiles newfiles))) - (setq files (cdr files))) - (if did-unpack - (gnus-uu-unpack-files ofiles (append did-unpack ignore)) - ofiles))) - -(defun gnus-uu-ls-r (dir) - (let* ((files (gnus-uu-directory-files dir t)) - (ofiles files)) - (while files - (when (file-directory-p (car files)) - (setq ofiles (delete (car files) ofiles)) - (setq ofiles (append ofiles (gnus-uu-ls-r (car files))))) - (setq files (cdr files))) - ofiles)) - -;; Various stuff - -(defun gnus-uu-directory-files (dir &optional full) - (let (files out file) - (setq files (directory-files dir full)) - (while files - (setq file (car files)) - (setq files (cdr files)) - (unless (member (file-name-nondirectory file) '("." "..")) - (push file out))) - (setq out (nreverse out)) - out)) - -(defun gnus-uu-check-correct-stripped-uucode (start end) - (save-excursion - (let (found beg length) - (if (not gnus-uu-correct-stripped-uucode) - () - (goto-char start) - - (if (re-search-forward " \\|`" end t) - (progn - (goto-char start) - (while (not (eobp)) - (progn - (when (looking-at "\n") - (replace-match "")) - (forward-line 1)))) - - (while (not (eobp)) - (if (looking-at (concat gnus-uu-begin-string "\\|" - gnus-uu-end-string)) - () - (when (not found) - (beginning-of-line) - (setq beg (point)) - (end-of-line) - (setq length (- (point) beg))) - (setq found t) - (beginning-of-line) - (setq beg (point)) - (end-of-line) - (when (not (= length (- (point) beg))) - (insert (make-string (- length (- (point) beg)) ? )))) - (forward-line 1))))))) - -(defvar gnus-uu-tmp-alist nil) - -(defun gnus-uu-initialize (&optional scan) - (let (entry) - (if (and (not scan) - (when (setq entry (assoc gnus-newsgroup-name gnus-uu-tmp-alist)) - (if (file-exists-p (cdr entry)) - (setq gnus-uu-work-dir (cdr entry)) - (setq gnus-uu-tmp-alist (delq entry gnus-uu-tmp-alist)) - nil))) - t - (setq gnus-uu-tmp-dir (file-name-as-directory - (expand-file-name gnus-uu-tmp-dir))) - (if (not (file-directory-p gnus-uu-tmp-dir)) - (error "Temp directory %s doesn't exist" gnus-uu-tmp-dir) - (when (not (file-writable-p gnus-uu-tmp-dir)) - (error "Temp directory %s can't be written to" - gnus-uu-tmp-dir))) - - (setq gnus-uu-work-dir - (make-temp-name (concat gnus-uu-tmp-dir "gnus"))) - (gnus-make-directory gnus-uu-work-dir) - (set-file-modes gnus-uu-work-dir 448) - (setq gnus-uu-work-dir (file-name-as-directory gnus-uu-work-dir)) - (push (cons gnus-newsgroup-name gnus-uu-work-dir) - gnus-uu-tmp-alist)))) - - -;; Kills the temporary uu buffers, kills any processes, etc. -(defun gnus-uu-clean-up () - (let (buf) - (and gnus-uu-uudecode-process - (memq (process-status (or gnus-uu-uudecode-process "nevair")) - '(stop run)) - (delete-process gnus-uu-uudecode-process)) - (when (setq buf (get-buffer gnus-uu-output-buffer-name)) - (kill-buffer buf)))) - -(defun gnus-quote-arg-for-sh-or-csh (arg) - (let ((pos 0) new-pos accum) - ;; *** bug: we don't handle newline characters properly - (while (setq new-pos (string-match "[!`\"$\\& \t{}]" arg pos)) - (push (substring arg pos new-pos) accum) - (push "\\" accum) - (push (list (aref arg new-pos)) accum) - (setq pos (1+ new-pos))) - (if (= pos 0) - arg - (apply 'concat (nconc (nreverse accum) (list (substring arg pos))))))) - -;; Inputs an action and a filename and returns a full command, making sure -;; that the filename will be treated as a single argument when the shell -;; executes the command. -(defun gnus-uu-command (action file) - (let ((quoted-file (gnus-quote-arg-for-sh-or-csh file))) - (if (string-match "%s" action) - (format action quoted-file) - (concat action " " quoted-file)))) - -(defun gnus-uu-delete-work-dir (&optional dir) - "Delete recursively all files and directories under `gnus-uu-work-dir'." - (if dir - (gnus-message 7 "Deleting directory %s..." dir) - (setq dir gnus-uu-work-dir)) - (when (and dir - (file-exists-p dir)) - (let ((files (directory-files dir t nil t)) - file) - (while (setq file (pop files)) - (unless (member (file-name-nondirectory file) '("." "..")) - (if (file-directory-p file) - (gnus-uu-delete-work-dir file) - (gnus-message 9 "Deleting file %s..." file) - (delete-file file)))) - (delete-directory dir))) - (gnus-message 7 "")) - -;; Initializing - -(add-hook 'gnus-exit-group-hook 'gnus-uu-clean-up) -(add-hook 'gnus-exit-group-hook 'gnus-uu-delete-work-dir) - - - -;;; -;;; uuencoded posting -;;; - -;; Any function that is to be used as and encoding method will take two -;; parameters: PATH-NAME and FILE-NAME. (E.g. "/home/gaga/spiral.jpg" -;; and "spiral.jpg", respectively.) The function should return nil if -;; the encoding wasn't successful. -(defcustom gnus-uu-post-encode-method 'gnus-uu-post-encode-uuencode - "Function used for encoding binary files. -There are three functions supplied with gnus-uu for encoding files: -`gnus-uu-post-encode-uuencode', which does straight uuencoding; -`gnus-uu-post-encode-mime', which encodes with base64 and adds MIME -headers; and `gnus-uu-post-encode-mime-uuencode', which encodes with -uuencode and adds MIME headers." - :group 'gnus-extract-post - :type '(radio (function-item gnus-uu-post-encode-uuencode) - (function-item gnus-uu-post-encode-mime) - (function-item gnus-uu-post-encode-mime-uuencode) - (function :tag "Other"))) - -(defcustom gnus-uu-post-include-before-composing nil - "Non-nil means that gnus-uu will ask for a file to encode before you compose the article. -If this variable is t, you can either include an encoded file with -\\[gnus-uu-post-insert-binary-in-article] or have one included for you when you post the article." - :group 'gnus-extract-post - :type 'boolean) - -(defcustom gnus-uu-post-length 990 - "Maximum length of an article. -The encoded file will be split into how many articles it takes to -post the entire file." - :group 'gnus-extract-post - :type 'integer) - -(defcustom gnus-uu-post-threaded nil - "Non-nil means that gnus-uu will post the encoded file in a thread. -This may not be smart, as no other decoder I have seen are able to -follow threads when collecting uuencoded articles. (Well, I have seen -one package that does that - gnus-uu, but somehow, I don't think that -counts...) The default is nil." - :group 'gnus-extract-post - :type 'boolean) - -(defcustom gnus-uu-post-separate-description t - "Non-nil means that the description will be posted in a separate article. -The first article will typically be numbered (0/x). If this variable -is nil, the description the user enters will be included at the -beginning of the first article, which will be numbered (1/x). Default -is t." - :group 'gnus-extract-post - :type 'boolean) - -(defvar gnus-uu-post-binary-separator "--binary follows this line--") -(defvar gnus-uu-post-message-id nil) -(defvar gnus-uu-post-inserted-file-name nil) -(defvar gnus-uu-winconf-post-news nil) - -(defun gnus-uu-post-news () - "Compose an article and post an encoded file." - (interactive) - (setq gnus-uu-post-inserted-file-name nil) - (setq gnus-uu-winconf-post-news (current-window-configuration)) - - (gnus-summary-post-news) - - (let ((map (make-sparse-keymap))) - (set-keymap-parent map (current-local-map)) - (use-local-map map)) - ;;(local-set-key "\C-c\C-c" 'gnus-summary-edit-article-done) - (local-set-key "\C-c\C-c" 'gnus-uu-post-news-inews) - (local-set-key "\C-c\C-s" 'gnus-uu-post-news-inews) - (local-set-key "\C-c\C-i" 'gnus-uu-post-insert-binary-in-article) - - (when gnus-uu-post-include-before-composing - (save-excursion (setq gnus-uu-post-inserted-file-name - (gnus-uu-post-insert-binary))))) - -(defun gnus-uu-post-insert-binary-in-article () - "Inserts an encoded file in the buffer. -The user will be asked for a file name." - (interactive) - (save-excursion - (setq gnus-uu-post-inserted-file-name (gnus-uu-post-insert-binary)))) - -;; Encodes with uuencode and substitutes all spaces with backticks. -(defun gnus-uu-post-encode-uuencode (path file-name) - (when (gnus-uu-post-encode-file "uuencode" path file-name) - (goto-char (point-min)) - (forward-line 1) - (while (re-search-forward " " nil t) - (replace-match "`")) - t)) - -;; Encodes with uuencode and adds MIME headers. -(defun gnus-uu-post-encode-mime-uuencode (path file-name) - (when (gnus-uu-post-encode-uuencode path file-name) - (gnus-uu-post-make-mime file-name "x-uue") - t)) - -;; Encodes with base64 and adds MIME headers -(defun gnus-uu-post-encode-mime (path file-name) - (when (zerop (call-process shell-file-name nil t nil shell-command-switch - (format "%s %s -o %s" "mmencode" path file-name))) - (gnus-uu-post-make-mime file-name "base64") - t)) - -;; Adds MIME headers. -(defun gnus-uu-post-make-mime (file-name encoding) - (goto-char (point-min)) - (insert (format "Content-Type: %s; name=\"%s\"\n" - (gnus-uu-choose-action file-name gnus-uu-ext-to-mime-list) - file-name)) - (insert (format "Content-Transfer-Encoding: %s\n\n" encoding)) - (save-restriction - (set-buffer gnus-message-buffer) - (goto-char (point-min)) - (re-search-forward (concat "^" (regexp-quote mail-header-separator) "$")) - (forward-line -1) - (narrow-to-region 1 (point)) - (unless (mail-fetch-field "mime-version") - (widen) - (insert "MIME-Version: 1.0\n")) - (widen))) - -;; Encodes a file PATH with COMMAND, leaving the result in the -;; current buffer. -(defun gnus-uu-post-encode-file (command path file-name) - (= 0 (call-process shell-file-name nil t nil shell-command-switch - (format "%s %s %s" command path file-name)))) - -(defun gnus-uu-post-news-inews () - "Posts the composed news article and encoded file. -If no file has been included, the user will be asked for a file." - (interactive) - - (let (file-name) - - (if gnus-uu-post-inserted-file-name - (setq file-name gnus-uu-post-inserted-file-name) - (setq file-name (gnus-uu-post-insert-binary))) - - (gnus-uu-post-encoded file-name gnus-uu-post-threaded)) - (setq gnus-uu-post-inserted-file-name nil) - (when gnus-uu-winconf-post-news - (set-window-configuration gnus-uu-winconf-post-news))) - -;; Asks for a file to encode, encodes it and inserts the result in -;; the current buffer. Returns the file name the user gave. -(defun gnus-uu-post-insert-binary () - (let ((uuencode-buffer-name "*uuencode buffer*") - file-path uubuf file-name) - - (setq file-path (read-file-name - "What file do you want to encode? ")) - (when (not (file-exists-p file-path)) - (error "%s: No such file" file-path)) - - (goto-char (point-max)) - (insert (format "\n%s\n" gnus-uu-post-binary-separator)) - - ;; #### Unix-specific? - (when (string-match "^~/" file-path) - (setq file-path (concat "$HOME" (substring file-path 1)))) - ;; #### Unix-specific? - (if (string-match "/[^/]*$" file-path) - (setq file-name (substring file-path (1+ (match-beginning 0)))) - (setq file-name file-path)) - - (unwind-protect - (if (save-excursion - (set-buffer (setq uubuf - (gnus-get-buffer-create uuencode-buffer-name))) - (erase-buffer) - (funcall gnus-uu-post-encode-method file-path file-name)) - (insert-buffer-substring uubuf) - (error "Encoding unsuccessful")) - (kill-buffer uubuf)) - file-name)) - -;; Posts the article and all of the encoded file. -(defun gnus-uu-post-encoded (file-name &optional threaded) - (let ((send-buffer-name "*uuencode send buffer*") - (encoded-buffer-name "*encoded buffer*") - (top-string "[ cut here %s (%s %d/%d) %s gnus-uu ]") - (separator (concat mail-header-separator "\n\n")) - uubuf length parts header i end beg - beg-line minlen post-buf whole-len beg-binary end-binary) - - (setq post-buf (current-buffer)) - - (goto-char (point-min)) - (when (not (re-search-forward - (if gnus-uu-post-separate-description - (concat "^" (regexp-quote gnus-uu-post-binary-separator) - "$") - (concat "^" (regexp-quote mail-header-separator) "$")) - nil t)) - (error "Internal error: No binary/header separator")) - (beginning-of-line) - (forward-line 1) - (setq beg-binary (point)) - (setq end-binary (point-max)) - - (save-excursion - (set-buffer (setq uubuf (gnus-get-buffer-create encoded-buffer-name))) - (erase-buffer) - (insert-buffer-substring post-buf beg-binary end-binary) - (goto-char (point-min)) - (setq length (count-lines 1 (point-max))) - (setq parts (/ length gnus-uu-post-length)) - (unless (< (% length gnus-uu-post-length) 4) - (incf parts))) - - (when gnus-uu-post-separate-description - (forward-line -1)) - (delete-region (point) (point-max)) - - (goto-char (point-min)) - (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "$") nil t) - (beginning-of-line) - (setq header (buffer-substring 1 (point))) - - (goto-char (point-min)) - (when gnus-uu-post-separate-description - (when (re-search-forward "^Subject: " nil t) - (end-of-line) - (insert (format " (0/%d)" parts))) - (save-excursion - (message-send)) - (setq gnus-uu-post-message-id (message-fetch-field "message-id"))) - - (save-excursion - (setq i 1) - (setq beg 1) - (while (not (> i parts)) - (set-buffer (gnus-get-buffer-create send-buffer-name)) - (erase-buffer) - (insert header) - (when (and threaded gnus-uu-post-message-id) - (insert "References: " gnus-uu-post-message-id "\n")) - (insert separator) - (setq whole-len - (- 62 (length (format top-string "" file-name i parts "")))) - (when (> 1 (setq minlen (/ whole-len 2))) - (setq minlen 1)) - (setq - beg-line - (format top-string - (make-string minlen ?-) - file-name i parts - (make-string - (if (= 0 (% whole-len 2)) (1- minlen) minlen) ?-))) - - (goto-char (point-min)) - (when (re-search-forward "^Subject: " nil t) - (end-of-line) - (insert (format " (%d/%d)" i parts))) - - (goto-char (point-max)) - (save-excursion - (set-buffer uubuf) - (goto-char beg) - (if (= i parts) - (goto-char (point-max)) - (forward-line gnus-uu-post-length)) - (when (and (= (1+ i) parts) (< (count-lines (point) (point-max)) 4)) - (forward-line -4)) - (setq end (point))) - (insert-buffer-substring uubuf beg end) - (insert beg-line "\n") - (setq beg end) - (incf i) - (goto-char (point-min)) - (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "$") nil t) - (beginning-of-line) - (forward-line 2) - (when (re-search-forward - (concat "^" (regexp-quote gnus-uu-post-binary-separator) "$") - nil t) - (replace-match "") - (forward-line 1)) - (insert beg-line) - (insert "\n") - (let (message-sent-message-via) - (save-excursion - (message-send)) - (setq gnus-uu-post-message-id - (concat (message-fetch-field "references") " " - (message-fetch-field "message-id")))))) - - (gnus-kill-buffer send-buffer-name) - (gnus-kill-buffer encoded-buffer-name) - - (when (not gnus-uu-post-separate-description) - (set-buffer-modified-p nil) - (when (fboundp 'bury-buffer) - (bury-buffer))))) - -(provide 'gnus-uu) - -;;; gnus-uu.el ends here diff --git a/lisp/gnus-vers.el b/lisp/gnus-vers.el deleted file mode 100644 index 08c6ff3..0000000 --- a/lisp/gnus-vers.el +++ /dev/null @@ -1,88 +0,0 @@ -;;; gnus-vers.el --- Declare gnus version. - -;; Copyright (C) 2000, 2001 Free Software Foundation, Inc. - -;; Author: Keiichi Suzuki -;; Katsumi Yamaoka -;; Keywords: news, mail, compatibility - -;; This file is part of T-gnus. - -;; 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, 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; see the file COPYING. If not, write to -;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'gnus-clfns)) - -(require 'poe) -(require 'product) -(provide 'gnus-vers) - -(defconst gnus-revision-number "06" - "Revision number for this version of gnus.") - -;; Product information of this gnus. -(product-provide 'gnus-vers - (product-define "T-gnus" nil - (list 6 15 4 - (string-to-number gnus-revision-number)))) - -(defconst gnus-original-version-number "0.04" - "Version number for this version of Gnus.") - -(provide 'running-pterodactyl-gnus-0_73-or-later) - -(defconst gnus-original-product-name "Oort Gnus" - "Product name of the original version of Gnus.") - -(defconst gnus-product-name (product-name (product-find 'gnus-vers)) - "Product name of this version of gnus.") - -(defconst gnus-version-number - (mapconcat - 'number-to-string - (butlast (product-version (product-find 'gnus-vers))) - ".") - "Version number for this version of gnus.") - -(defconst gnus-version - (format "%s %s r%s (based on %s v%s ; for SEMI 1.13, FLIM 1.13)" - gnus-product-name gnus-version-number gnus-revision-number - gnus-original-product-name gnus-original-version-number) - "Version string for this version of gnus.") - -(defun gnus-version (&optional arg) - "Version number of this version of Gnus. -If ARG, insert string at point." - (interactive "P") - (if arg - (insert (message "%s" gnus-version)) - (message "%s" gnus-version))) - -(defun gnus-extended-version () - "Stringified gnus version." - (concat gnus-product-name "/" gnus-version-number - " (based on " - gnus-original-product-name " v" gnus-original-version-number ")" - (if (zerop (string-to-number gnus-revision-number)) - "" - (concat " (revision " gnus-revision-number ")")) - )) - -;; gnus-vers.el ends here diff --git a/lisp/gnus-vm.el b/lisp/gnus-vm.el deleted file mode 100644 index 145eda5..0000000 --- a/lisp/gnus-vm.el +++ /dev/null @@ -1,167 +0,0 @@ -;;; gnus-vm.el --- vm interface for Gnus - -;; Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Per Persson -;; Katsumi Yamaoka -;; Keywords: news, mail - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; Major contributors: -;; Christian Limpach -;; Some code stolen from: -;; Rick Sladkey - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus-art) - -(eval-when-compile - (autoload 'vm-mode "vm") - (autoload 'vm-read-file-name "vm") - (autoload 'vm-save-message "vm")) - -(when (not (featurep 'vm)) - (load "vm")) - -(defvar vm-folder-directory) -(defvar vm-folder-history) -(defvar vm-primary-inbox) -(defvar vm-use-toolbar) - -(defun gnus-vm-make-folder (&optional buffer) - (let ((article (or buffer (current-buffer))) - (tmp-folder (generate-new-buffer " *tmp-folder*")) - (start (point-min)) - (end (point-max))) - (set-buffer tmp-folder) - (insert-buffer-substring article start end) - (goto-char (point-min)) - (if (looking-at "^\\(From [^ ]+ \\).*$") - (replace-match (concat "\\1" (current-time-string))) - (insert "From " gnus-newsgroup-name " " - (current-time-string) "\n")) - (while (re-search-forward "\n\nFrom " nil t) - (replace-match "\n\n>From ")) - ;; insert a newline, otherwise the last line gets lost - (goto-char (point-max)) - (insert "\n") - (let (mime-display-header-hook - mime-display-text/plain-hook mime-text-decode-hook - mime-view-define-keymap-hook mime-view-mode-hook) - (vm-mode)) - tmp-folder)) - -(defvar gnus-summary-save-article-vm-folder nil) -(defvar gnus-summary-save-article-vm-count nil) - -(defun gnus-summary-save-article-vm (&optional arg folder) - "Append the current article to a vm folder. -If N is a positive number, save the N next articles. -If N is a negative number, save the N previous articles. -If N is nil and any articles have been marked with the process mark, -save those articles instead." - (interactive - (let ((prefix-arg current-prefix-arg) - articles marks default-folder) - (setq default-folder (or (car vm-folder-history) vm-primary-inbox)) - (if (numberp prefix-arg) - (setq articles prefix-arg) - (setq marks (delq nil (gnus-summary-work-articles nil)) - articles (length marks))) - (list - prefix-arg - (unless (zerop articles) - (vm-read-file-name - (format - "Save %s in VM folder: " - (cond ((eq 1 articles) - (if (or (not marks) (eq gnus-current-article (car marks))) - "this article" - "the marked article")) - ((< 0 articles) - (if marks - (format "the marked %d articles" articles) - (format "the %d next articles" articles))) - ((> 0 articles) - (format "the %d previous articles" (- articles))))) - (if default-folder "" vm-folder-directory) - nil nil default-folder 'vm-folder-history))))) - (if (interactive-p) - (unless folder - (error "No articles to be saved")) - (unless (setq folder (or folder gnus-summary-save-article-vm-folder)) - (error "No VM folder is specified"))) - (unwind-protect - (progn - (setq gnus-summary-save-article-vm-folder folder - gnus-summary-save-article-vm-count 0) - (let ((gnus-default-article-saver 'gnus-summary-save-in-vm) - mime-display-header-hook mime-display-text/plain-hook - mime-text-decode-hook mime-view-define-keymap-hook - mime-view-mode-hook) - (gnus-summary-save-article arg)) - (cond ((eq 1 gnus-summary-save-article-vm-count) - (message "One article is saved in %s" folder)) - ((< 0 gnus-summary-save-article-vm-count) - (message "%d articles are saved in %s" - gnus-summary-save-article-vm-count folder)) - (t - (message "Maybe no articles are saved in %s" folder)))) - (setq gnus-summary-save-article-vm-folder nil - gnus-summary-save-article-vm-count nil))) - -(defun gnus-summary-save-in-vm (&optional folder) - (interactive - (let (default-folder) - (setq default-folder (or (car vm-folder-history) vm-primary-inbox)) - (list (vm-read-file-name "Save this article in VM folder: " - (if default-folder "" vm-folder-directory) - nil nil default-folder 'vm-folder-history)))) - (unless (interactive-p) - (setq folder (or folder gnus-summary-save-article-vm-folder))) - (unless folder - (error "No VM folder is specified")) - (unless (interactive-p) - (message "Saving the article %d in %s..." gnus-current-article folder) - (when (numberp gnus-summary-save-article-vm-count) - (incf gnus-summary-save-article-vm-count))) - (save-window-excursion - (apply 'gnus-summary-select-article gnus-show-all-headers - (unless (interactive-p) - (list nil nil gnus-current-article))) - (gnus-eval-in-buffer-window gnus-original-article-buffer - (save-excursion - (save-restriction - (widen) - (let* ((vm-use-toolbar nil) - (vm-folder (gnus-vm-make-folder))) - (vm-save-message folder) - (when (interactive-p) - (message "This article is saved in %s" folder)) - (kill-buffer vm-folder))))))) - -(provide 'gnus-vm) - -;;; gnus-vm.el ends here diff --git a/lisp/gnus-win.el b/lisp/gnus-win.el deleted file mode 100644 index 07819de..0000000 --- a/lisp/gnus-win.el +++ /dev/null @@ -1,559 +0,0 @@ -;;; gnus-win.el --- window configuration functions for Gnus -;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus) - -(defgroup gnus-windows nil - "Window configuration." - :group 'gnus) - -(defcustom gnus-use-full-window t - "*If non-nil, use the entire Emacs screen." - :group 'gnus-windows - :type 'boolean) - -(defvar gnus-window-configuration nil - "Obsolete variable. See `gnus-buffer-configuration'.") - -(defcustom gnus-window-min-width 2 - "*Minimum width of Gnus buffers." - :group 'gnus-windows - :type 'integer) - -(defcustom gnus-window-min-height 1 - "*Minimum height of Gnus buffers." - :group 'gnus-windows - :type 'integer) - -(defcustom gnus-always-force-window-configuration nil - "*If non-nil, always force the Gnus window configurations." - :group 'gnus-windows - :type 'boolean) - -(defvar gnus-buffer-configuration - '((group - (vertical 1.0 - (group 1.0 point) - (if gnus-carpal '(group-carpal 4)))) - (summary - (vertical 1.0 - (summary 1.0 point) - (if gnus-carpal '(summary-carpal 4)))) - (article - (cond - ((and gnus-use-picons - (eq gnus-picons-display-where 'picons)) - '(frame 1.0 - (vertical 1.0 - (summary 0.25 point) - (if gnus-carpal '(summary-carpal 4)) - (article 1.0)) - (vertical ((height . 5) (width . 15) - (user-position . t) - (left . -1) (top . 1)) - (picons 1.0)))) - (gnus-use-trees - '(vertical 1.0 - (summary 0.25 point) - (tree 0.25) - (article 1.0))) - (t - '(vertical 1.0 - (summary 0.25 point) - (if gnus-carpal '(summary-carpal 4)) - (article 1.0))))) - (server - (vertical 1.0 - (server 1.0 point) - (if gnus-carpal '(server-carpal 2)))) - (browse - (vertical 1.0 - (browse 1.0 point) - (if gnus-carpal '(browse-carpal 2)))) - (message - (vertical 1.0 - (message 1.0 point))) - (pick - (vertical 1.0 - (article 1.0 point))) - (info - (vertical 1.0 - (info 1.0 point))) - (summary-faq - (vertical 1.0 - (summary 0.25) - (faq 1.0 point))) - (edit-article - (vertical 1.0 - (article 1.0 point))) - (edit-form - (vertical 1.0 - (group 0.5) - (edit-form 1.0 point))) - (edit-score - (vertical 1.0 - (summary 0.25) - (edit-score 1.0 point))) - (post - (vertical 1.0 - (post 1.0 point))) - (reply - (vertical 1.0 - (article-copy 0.5) - (message 1.0 point))) - (forward - (vertical 1.0 - (message 1.0 point))) - (reply-yank - (vertical 1.0 - (message 1.0 point))) - (mail-bounce - (vertical 1.0 - (article 0.5) - (message 1.0 point))) - (pipe - (vertical 1.0 - (summary 0.25 point) - (if gnus-carpal '(summary-carpal 4)) - ("*Shell Command Output*" 1.0))) - (bug - (vertical 1.0 - ("*Gnus Help Bug*" 0.5) - ("*Gnus Bug*" 1.0 point))) - (score-trace - (vertical 1.0 - (summary 0.5 point) - ("*Score Trace*" 1.0))) - (score-words - (vertical 1.0 - (summary 0.5 point) - ("*Score Words*" 1.0))) - (split-trace - (vertical 1.0 - (summary 0.5 point) - ("*Split Trace*" 1.0))) - (category - (vertical 1.0 - (category 1.0))) - (compose-bounce - (vertical 1.0 - (article 0.5) - (message 1.0 point))) - (display-term - (vertical 1.0 - ("*display*" 1.0)))) - "Window configuration for all possible Gnus buffers. -See the Gnus manual for an explanation of the syntax used.") - -(defvar gnus-window-to-buffer - '((group . gnus-group-buffer) - (summary . gnus-summary-buffer) - (article . gnus-article-buffer) - (server . gnus-server-buffer) - (browse . "*Gnus Browse Server*") - (edit-group . gnus-group-edit-buffer) - (edit-form . gnus-edit-form-buffer) - (edit-server . gnus-server-edit-buffer) - (group-carpal . gnus-carpal-group-buffer) - (summary-carpal . gnus-carpal-summary-buffer) - (server-carpal . gnus-carpal-server-buffer) - (browse-carpal . gnus-carpal-browse-buffer) - (edit-score . gnus-score-edit-buffer) - (message . gnus-message-buffer) - (mail . gnus-message-buffer) - (post-news . gnus-message-buffer) - (faq . gnus-faq-buffer) - (picons . gnus-picons-buffer-name) - (tree . gnus-tree-buffer) - (score-trace . "*Score Trace*") - (split-trace . "*Split Trace*") - (info . gnus-info-buffer) - (category . gnus-category-buffer) - (article-copy . gnus-article-copy) - (draft . gnus-draft-buffer)) - "Mapping from short symbols to buffer names or buffer variables.") - -;;; Internal variables. - -(defvar gnus-current-window-configuration nil - "The most recently set window configuration.") - -(defvar gnus-created-frames nil) -(defvar gnus-window-frame-focus nil) - -(defun gnus-kill-gnus-frames () - "Kill all frames Gnus has created." - (while gnus-created-frames - (when (frame-live-p (car gnus-created-frames)) - ;; We slap a condition-case around this `delete-frame' to ensure - ;; against errors if we try do delete the single frame that's left. - (ignore-errors - (delete-frame (car gnus-created-frames)))) - (pop gnus-created-frames))) - -(defun gnus-window-configuration-element (list) - (while (and list - (not (assq (car list) gnus-window-configuration))) - (pop list)) - (cadr (assq (car list) gnus-window-configuration))) - -(defun gnus-windows-old-to-new (setting) - ;; First we take care of the really, really old Gnus 3 actions. - (when (symbolp setting) - (setq setting - ;; Take care of ooold GNUS 3.x values. - (cond ((eq setting 'SelectArticle) 'article) - ((memq setting '(SelectNewsgroup SelectSubject ExpandSubject)) - 'summary) - ((memq setting '(ExitNewsgroup)) 'group) - (t setting)))) - (if (or (listp setting) - (not (and gnus-window-configuration - (memq setting '(group summary article))))) - setting - (let* ((elem - (cond - ((eq setting 'group) - (gnus-window-configuration-element - '(group newsgroups ExitNewsgroup))) - ((eq setting 'summary) - (gnus-window-configuration-element - '(summary SelectNewsgroup SelectSubject ExpandSubject))) - ((eq setting 'article) - (gnus-window-configuration-element - '(article SelectArticle))))) - (total (apply '+ elem)) - (types '(group summary article)) - (pbuf (if (eq setting 'newsgroups) 'group 'summary)) - (i 0) - perc out) - (while (< i 3) - (or (not (numberp (nth i elem))) - (zerop (nth i elem)) - (progn - (setq perc (if (= i 2) - 1.0 - (/ (float (nth i elem)) total))) - (push (if (eq pbuf (nth i types)) - (list (nth i types) perc 'point) - (list (nth i types) perc)) - out))) - (incf i)) - `(vertical 1.0 ,@(nreverse out))))) - -;;;###autoload -(defun gnus-add-configuration (conf) - "Add the window configuration CONF to `gnus-buffer-configuration'." - (setq gnus-buffer-configuration - (cons conf (delq (assq (car conf) gnus-buffer-configuration) - gnus-buffer-configuration)))) - -(defvar gnus-frame-list nil) - -(defun gnus-window-to-buffer-helper (obj) - (cond ((not (symbolp obj)) - obj) - ((boundp obj) - (symbol-value obj)) - ((fboundp obj) - (funcall obj)) - (t - nil))) - -(defun gnus-configure-frame (split &optional window) - "Split WINDOW according to SPLIT." - (let ((current-window - (or (get-buffer-window (current-buffer)) (selected-window)))) - (unless window - (setq window current-window)) - (select-window window) - ;; This might be an old-stylee buffer config. - (when (vectorp split) - (setq split (append split nil))) - (when (or (consp (car split)) - (vectorp (car split))) - (push 1.0 split) - (push 'vertical split)) - ;; The SPLIT might be something that is to be evaled to - ;; return a new SPLIT. - (while (and (not (assq (car split) gnus-window-to-buffer)) - (gnus-functionp (car split))) - (setq split (eval split))) - (let* ((type (car split)) - (subs (cddr split)) - (len (if (eq type 'horizontal) (window-width) (window-height))) - (total 0) - (window-min-width (or gnus-window-min-width window-min-width)) - (window-min-height (or gnus-window-min-height window-min-height)) - s result new-win rest comp-subs size sub) - (cond - ;; Nothing to do here. - ((null split)) - ;; Don't switch buffers. - ((null type) - (and (memq 'point split) window)) - ;; This is a buffer to be selected. - ((not (memq type '(frame horizontal vertical))) - (let ((buffer (cond ((stringp type) type) - (t (cdr (assq type gnus-window-to-buffer)))))) - (unless buffer - (error "Invalid buffer type: %s" type)) - (let ((buf (gnus-get-buffer-create - (gnus-window-to-buffer-helper buffer)))) - (if (eq buf (window-buffer (selected-window))) (set-buffer buf) - (switch-to-buffer buf))) - (when (memq 'frame-focus split) - (setq gnus-window-frame-focus window)) - ;; We return the window if it has the `point' spec. - (and (memq 'point split) window))) - ;; This is a frame split. - ((eq type 'frame) - (unless gnus-frame-list - (setq gnus-frame-list (list (window-frame current-window)))) - (let ((i 0) - params frame fresult) - (while (< i (length subs)) - ;; Frame parameter is gotten from the sub-split. - (setq params (cadr (elt subs i))) - ;; It should be a list. - (unless (listp params) - (setq params nil)) - ;; Create a new frame? - (unless (setq frame (elt gnus-frame-list i)) - (nconc gnus-frame-list (list (setq frame (make-frame params)))) - (push frame gnus-created-frames)) - ;; Is the old frame still alive? - (unless (frame-live-p frame) - (setcar (nthcdr i gnus-frame-list) - (setq frame (make-frame params)))) - ;; Select the frame in question and do more splits there. - (select-frame frame) - (setq fresult (or (gnus-configure-frame (elt subs i)) fresult)) - (incf i)) - ;; Select the frame that has the selected buffer. - (when fresult - (select-frame (window-frame fresult))))) - ;; This is a normal split. - (t - (when (> (length subs) 0) - ;; First we have to compute the sizes of all new windows. - (while subs - (setq sub (append (pop subs) nil)) - (while (and (not (assq (car sub) gnus-window-to-buffer)) - (gnus-functionp (car sub))) - (setq sub (eval sub))) - (when sub - (push sub comp-subs) - (setq size (cadar comp-subs)) - (cond ((equal size 1.0) - (setq rest (car comp-subs)) - (setq s 0)) - ((floatp size) - (setq s (floor (* size len)))) - ((integerp size) - (setq s size)) - (t - (error "Invalid size: %s" size))) - ;; Try to make sure that we are inside the safe limits. - (cond ((zerop s)) - ((eq type 'horizontal) - (setq s (max s window-min-width))) - ((eq type 'vertical) - (setq s (max s window-min-height)))) - (setcar (cdar comp-subs) s) - (incf total s))) - ;; Take care of the "1.0" spec. - (if rest - (setcar (cdr rest) (- len total)) - (error "No 1.0 specs in %s" split)) - ;; The we do the actual splitting in a nice recursive - ;; fashion. - (setq comp-subs (nreverse comp-subs)) - (while comp-subs - (if (null (cdr comp-subs)) - (setq new-win window) - (setq new-win - (split-window window (cadar comp-subs) - (eq type 'horizontal)))) - (setq result (or (gnus-configure-frame - (car comp-subs) window) - result)) - (select-window new-win) - (setq window new-win) - (setq comp-subs (cdr comp-subs)))) - ;; Return the proper window, if any. - (when result - (select-window result))))))) - -(defvar gnus-frame-split-p nil) - -(defun gnus-configure-windows (setting &optional force) - (if (window-configuration-p setting) - (set-window-configuration setting) - (setq gnus-current-window-configuration setting) - (setq force (or force gnus-always-force-window-configuration)) - (setq setting (gnus-windows-old-to-new setting)) - (let ((split (if (symbolp setting) - (cadr (assq setting gnus-buffer-configuration)) - setting)) - all-visible) - - (setq gnus-frame-split-p nil) - - (unless split - (error "No such setting in `gnus-buffer-configuration': %s" setting)) - - (if (and (setq all-visible (gnus-all-windows-visible-p split)) - (not force)) - ;; All the windows mentioned are already visible, so we just - ;; put point in the assigned buffer, and do not touch the - ;; winconf. - (select-window all-visible) - - ;; Make sure "the other" buffer, nntp-server-buffer, is live. - (unless (gnus-buffer-live-p nntp-server-buffer) - (nnheader-init-server-buffer)) - - ;; Either remove all windows or just remove all Gnus windows. - (let ((frame (selected-frame))) - (unwind-protect - (if gnus-use-full-window - ;; We want to remove all other windows. - (if (not gnus-frame-split-p) - ;; This is not a `frame' split, so we ignore the - ;; other frames. - (delete-other-windows) - ;; This is a `frame' split, so we delete all windows - ;; on all frames. - (gnus-delete-windows-in-gnusey-frames)) - ;; Just remove some windows. - (gnus-remove-some-windows) - (if (featurep 'xemacs) - (switch-to-buffer nntp-server-buffer) - (set-buffer nntp-server-buffer))) - (select-frame frame))) - - (let (gnus-window-frame-focus) - (if (featurep 'xemacs) - (switch-to-buffer nntp-server-buffer) - (set-buffer nntp-server-buffer)) - (gnus-configure-frame split) - (when gnus-window-frame-focus - (select-frame (window-frame gnus-window-frame-focus)))))))) - -(defun gnus-delete-windows-in-gnusey-frames () - "Do a `delete-other-windows' in all frames that have Gnus windows." - (let ((buffers (gnus-buffers))) - (mapcar - (lambda (frame) - (unless (eq (cdr (assq 'minibuffer - (frame-parameters frame))) - 'only) - (select-frame frame) - (let (do-delete) - (walk-windows - (lambda (window) - (when (memq (window-buffer window) buffers) - (setq do-delete t)))) - (when do-delete - (delete-other-windows))))) - (frame-list)))) - -(defun gnus-all-windows-visible-p (split) - "Say whether all buffers in SPLIT are currently visible. -In particular, the value returned will be the window that -should have point." - (let ((stack (list split)) - (all-visible t) - type buffer win buf) - (while (and (setq split (pop stack)) - all-visible) - ;; Be backwards compatible. - (when (vectorp split) - (setq split (append split nil))) - (when (or (consp (car split)) - (vectorp (car split))) - (push 1.0 split) - (push 'vertical split)) - ;; The SPLIT might be something that is to be evaled to - ;; return a new SPLIT. - (while (and (not (assq (car split) gnus-window-to-buffer)) - (gnus-functionp (car split))) - (setq split (eval split))) - - (setq type (elt split 0)) - (cond - ;; Nothing here. - ((null split) t) - ;; A buffer. - ((not (memq type '(horizontal vertical frame))) - (setq buffer (cond ((stringp type) type) - (t (cdr (assq type gnus-window-to-buffer))))) - (unless buffer - (error "Invalid buffer type: %s" type)) - (if (and (setq buf (get-buffer (gnus-window-to-buffer-helper buffer))) - (setq win (get-buffer-window buf t))) - (if (memq 'point split) - (setq all-visible win)) - (setq all-visible nil))) - (t - (when (eq type 'frame) - (setq gnus-frame-split-p t)) - (setq stack (append (cddr split) stack))))) - (unless (eq all-visible t) - all-visible))) - -(defun gnus-window-top-edge (&optional window) - (nth 1 (window-edges window))) - -(defun gnus-remove-some-windows () - (let ((buffers (gnus-buffers)) - buf bufs lowest-buf lowest) - (save-excursion - ;; Remove windows on all known Gnus buffers. - (while (setq buf (pop buffers)) - (when (get-buffer-window buf) - (push buf bufs) - (pop-to-buffer buf) - (when (or (not lowest) - (< (gnus-window-top-edge) lowest)) - (setq lowest (gnus-window-top-edge) - lowest-buf buf)))) - (when lowest-buf - (pop-to-buffer lowest-buf) - (if (featurep 'xemacs) - (switch-to-buffer nntp-server-buffer) - (set-buffer nntp-server-buffer))) - (mapcar (lambda (b) (delete-windows-on b t)) - (delq lowest-buf bufs))))) - -(provide 'gnus-win) - -;;; gnus-win.el ends here diff --git a/lisp/gnus-xmas.el b/lisp/gnus-xmas.el deleted file mode 100644 index f691cb7..0000000 --- a/lisp/gnus-xmas.el +++ /dev/null @@ -1,965 +0,0 @@ -;;; gnus-xmas.el --- Gnus functions for XEmacs - -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Katsumi Yamaoka -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(require 'text-props) -(defvar menu-bar-mode (featurep 'menubar)) -(require 'messagexmas) -(require 'wid-edit) - -(defgroup gnus-xmas nil - "XEmacsoid support for Gnus" - :group 'gnus) - -(defcustom gnus-xmas-glyph-directory nil - "Directory where Gnus logos and icons are located. -If this variable is nil, Gnus will try to locate the directory -automatically." - :type '(choice (const :tag "autodetect" nil) - directory) - :group 'gnus-xmas) - -(unless gnus-xmas-glyph-directory - (unless (setq gnus-xmas-glyph-directory - (message-xmas-find-glyph-directory "gnus")) - (error "Can't find glyph directory. \ -Possibly the `etc' directory has not been installed."))) - -;;(format "%02x%02x%02x" 114 66 20) "724214" - -(defvar gnus-xmas-logo-color-alist - '((flame "#cc3300" "#ff2200") - (pine "#c0cc93" "#f8ffb8") - (moss "#a1cc93" "#d2ffb8") - (irish "#04cc90" "#05ff97") - (sky "#049acc" "#05deff") - (tin "#6886cc" "#82b6ff") - (velvet "#7c68cc" "#8c82ff") - (grape "#b264cc" "#cf7df") - (labia "#cc64c2" "#fd7dff") - (berry "#cc6485" "#ff7db5") - (dino "#724214" "#1e3f03") - (neutral "#b4b4b4" "#878787") - (september "#bf9900" "#ffcc00")) - "Color alist used for the Gnus logo.") - -(defcustom gnus-xmas-logo-color-style 'dino - "*Color styles used for the Gnus logo." - :type '(choice (const flame) (const pine) (const moss) - (const irish) (const sky) (const tin) - (const velvet) (const grape) (const labia) - (const berry) (const neutral) (const september) - (const dino)) - :group 'gnus-xmas) - -(defvar gnus-xmas-logo-colors - (cdr (assq gnus-xmas-logo-color-style gnus-xmas-logo-color-alist)) - "Colors used for the Gnus logo.") - -(defcustom gnus-article-x-face-command - (if (or (featurep 'xface) - (featurep 'xpm)) - 'gnus-xmas-article-display-xface - "{ echo '/* Width=48, Height=48 */'; uncompface; } | icontopbm | ee -") - "*String or function to be executed to display an X-Face header. -If it is a string, the command will be executed in a sub-shell -asynchronously. The compressed face will be piped to this command." - :type '(choice string function)) - -;;; Internal variables. - -;; Don't warn about these undefined variables. - -;;defined in gnus.el -(defvar gnus-active-hashtb) -(defvar gnus-article-buffer) -(defvar gnus-auto-center-summary) -(defvar gnus-current-headers) -(defvar gnus-level-killed) -(defvar gnus-level-zombie) -(defvar gnus-newsgroup-bookmarks) -(defvar gnus-newsgroup-dependencies) -(defvar gnus-newsgroup-selected-overlay) -(defvar gnus-newsrc-hashtb) -(defvar gnus-read-mark) -(defvar gnus-refer-article-method) -(defvar gnus-reffed-article-number) -(defvar gnus-unread-mark) -(defvar gnus-version) -(defvar gnus-view-pseudos) -(defvar gnus-view-pseudos-separately) -(defvar gnus-visual) -(defvar gnus-zombie-list) -;;defined in gnus-msg.el -(defvar gnus-article-copy) -(defvar gnus-check-before-posting) -;;defined in gnus-vis.el -(defvar gnus-article-button-face) -(defvar gnus-article-mouse-face) -(defvar gnus-summary-selected-face) -(defvar gnus-group-reading-menu) -(defvar gnus-group-group-menu) -(defvar gnus-group-misc-menu) -(defvar gnus-summary-article-menu) -(defvar gnus-summary-thread-menu) -(defvar gnus-summary-misc-menu) -(defvar gnus-summary-post-menu) -(defvar gnus-summary-kill-menu) -(defvar gnus-article-article-menu) -(defvar gnus-article-treatment-menu) -(defvar gnus-mouse-2) -(defvar standard-display-table) -(defvar gnus-tree-minimize-window) - -(defun gnus-xmas-set-text-properties (start end props &optional buffer) - "You should NEVER use this function. It is ideologically blasphemous. -It is provided only to ease porting of broken FSF Emacs programs." - (if (stringp buffer) - nil - (map-extents (lambda (extent ignored) - (remove-text-properties - start end - (list (extent-property extent 'text-prop) nil) - buffer) - nil) - buffer start end nil nil 'text-prop) - (gnus-add-text-properties start end props buffer))) - -(defun gnus-xmas-highlight-selected-summary () - ;; Highlight selected article in summary buffer - (when gnus-summary-selected-face - (when gnus-newsgroup-selected-overlay - (delete-extent gnus-newsgroup-selected-overlay)) - (setq gnus-newsgroup-selected-overlay - (make-extent (gnus-point-at-bol) (gnus-point-at-eol))) - (set-extent-face gnus-newsgroup-selected-overlay - gnus-summary-selected-face))) - -(defcustom gnus-xmas-force-redisplay nil - "*If non-nil, force a redisplay before recentering the summary buffer. -This is ugly, but it works around a bug in `window-displayed-height'." - :type 'boolean - :group 'gnus-xmas) - -(defun gnus-xmas-switch-horizontal-scrollbar-off () - (when (featurep 'scrollbar) - (set-specifier scrollbar-height (cons (current-buffer) 0)))) - -(defun gnus-xmas-summary-recenter () - "\"Center\" point in the summary window. -If `gnus-auto-center-summary' is nil, or the article buffer isn't -displayed, no centering will be performed." - ;; Suggested by earle@mahendo.JPL.NASA.GOV (Greg Earle). - ;; Recenter only when requested. Suggested by popovich@park.cs.columbia.edu. - ;; Force redisplay to get properly computed window height. - (when gnus-xmas-force-redisplay - (sit-for 0)) - (when gnus-auto-center-summary - (let* ((height (if (fboundp 'window-displayed-height) - (window-displayed-height) - (- (window-height) 2))) - (top (cond ((< height 4) 0) - ((< height 7) 1) - (t (if (numberp gnus-auto-center-summary) - gnus-auto-center-summary - 2)))) - (bottom (save-excursion (goto-char (point-max)) - (forward-line (- height)) - (point))) - (window (get-buffer-window (current-buffer)))) - (when (get-buffer-window gnus-article-buffer) - ;; Only do recentering when the article buffer is displayed, - ;; Set the window start to either `bottom', which is the biggest - ;; possible valid number, or the second line from the top, - ;; whichever is the least. - ;; NOFORCE parameter suggested by Daniel Pittman . - (set-window-start - window (min bottom (save-excursion (forward-line (- top)) (point))) - t)) - ;; Do horizontal recentering while we're at it. - (when (and (get-buffer-window (current-buffer) t) - (not (eq gnus-auto-center-summary 'vertical))) - (let ((selected (selected-window))) - (select-window (get-buffer-window (current-buffer) t)) - (gnus-summary-position-point) - (gnus-horizontal-recenter) - (select-window selected)))))) - -(defun gnus-xmas-summary-set-display-table () - ;; Setup the display table -- like `gnus-summary-setup-display-table', - ;; but done in an XEmacsish way. - (let ((table (make-display-table)) - (i 32)) - ;; Nix out all the control chars... - (while (>= (setq i (1- i)) 0) - (aset table i [??])) - ;; ... but not newline and cr, of course. (cr is necessary for the - ;; selective display). - (aset table ?\n nil) - (aset table ?\r nil) - ;; We keep TAB as well. - (aset table ?\t nil) - ;; We nix out any glyphs over 126 below ctl-arrow. - (let ((i (if (integerp ctl-arrow) ctl-arrow 160))) - (while (>= (setq i (1- i)) 127) - (unless (aref table i) - (aset table i [??])))) - ;; Can't use `set-specifier' because of a bug in 19.14 and earlier - (add-spec-to-specifier current-display-table table (current-buffer) nil))) - -(defun gnus-xmas-add-text-properties (start end props &optional object) - (add-text-properties start end props object) - (put-text-property start end 'start-closed nil object)) - -(defun gnus-xmas-put-text-property (start end prop value &optional object) - (put-text-property start end prop value object) - (put-text-property start end 'start-closed nil object)) - -(defun gnus-xmas-extent-start-open (point) - (map-extents (lambda (extent arg) - (set-extent-property extent 'start-open t)) - nil point (min (1+ (point)) (point-max)))) - -(defun gnus-xmas-article-push-button (event) - "Check text under the mouse pointer for a callback function. -If the text under the mouse pointer has a `gnus-callback' property, -call it with the value of the `gnus-data' text property." - (interactive "e") - (set-buffer (window-buffer (event-window event))) - (let* ((pos (event-closest-point event)) - (data (get-text-property pos 'gnus-data)) - (fun (get-text-property pos 'gnus-callback))) - (goto-char pos) - (when fun - (funcall fun data)))) - -(defun gnus-xmas-move-overlay (extent start end &optional buffer) - (set-extent-endpoints extent start end buffer)) - -(defun gnus-xmas-kill-all-overlays () - "Delete all extents in the current buffer." - (map-extents (lambda (extent ignore) - (delete-extent extent) - nil))) - -(defun gnus-xmas-window-top-edge (&optional window) - (nth 1 (window-pixel-edges window))) - -(defun gnus-xmas-tree-minimize () - (when (and gnus-tree-minimize-window - (not (one-window-p))) - (let* ((window-min-height 2) - (height (1+ (count-lines (point-min) (point-max)))) - (min (max (1- window-min-height) height)) - (tot (if (numberp gnus-tree-minimize-window) - (min gnus-tree-minimize-window min) - min)) - (win (get-buffer-window (current-buffer))) - (wh (and win (1- (window-height win))))) - (when (and win - (not (eq tot wh))) - (let ((selected (selected-window))) - (select-window win) - (enlarge-window (- tot wh)) - (select-window selected)))))) - -;; Select the lowest window on the frame. -(defun gnus-xmas-appt-select-lowest-window () - (let* ((lowest-window (selected-window)) - (bottom-edge (car (cdr (cdr (cdr (window-pixel-edges)))))) - (last-window (previous-window)) - (window-search t)) - (while window-search - (let* ((this-window (next-window)) - (next-bottom-edge (car (cdr (cdr (cdr - (window-pixel-edges - this-window))))))) - (when (< bottom-edge next-bottom-edge) - (setq bottom-edge next-bottom-edge) - (setq lowest-window this-window)) - - (select-window this-window) - (when (eq last-window this-window) - (select-window lowest-window) - (setq window-search nil)))))) - -(defmacro gnus-xmas-menu-add (type &rest menus) - `(gnus-xmas-menu-add-1 ',type ',menus)) -(put 'gnus-xmas-menu-add 'lisp-indent-function 1) - -(defun gnus-xmas-menu-add-1 (type menus) - (when (and menu-bar-mode - (gnus-visual-p (intern (format "%s-menu" type)) 'menu)) - (while menus - (easy-menu-add (symbol-value (pop menus)))))) - -(defun gnus-xmas-group-menu-add () - (gnus-xmas-menu-add group - gnus-group-reading-menu gnus-group-group-menu gnus-group-misc-menu)) - -(defun gnus-xmas-summary-menu-add () - (gnus-xmas-menu-add summary - gnus-summary-misc-menu gnus-summary-kill-menu - gnus-summary-article-menu gnus-summary-thread-menu - gnus-summary-post-menu )) - -(defun gnus-xmas-article-menu-add () - (gnus-xmas-menu-add article - gnus-article-article-menu gnus-article-treatment-menu - gnus-article-post-menu gnus-article-commands-menu)) - -(defun gnus-xmas-score-menu-add () - (gnus-xmas-menu-add score - gnus-score-menu)) - -(defun gnus-xmas-pick-menu-add () - (gnus-xmas-menu-add pick - gnus-pick-menu)) - -(defun gnus-xmas-topic-menu-add () - (gnus-xmas-menu-add topic - gnus-topic-menu)) - -(defun gnus-xmas-binary-menu-add () - (gnus-xmas-menu-add binary - gnus-binary-menu)) - -(defun gnus-xmas-agent-summary-menu-add () - (gnus-xmas-menu-add agent-summary - gnus-agent-summary-menu)) - -(defun gnus-xmas-agent-group-menu-add () - (gnus-xmas-menu-add agent-group - gnus-agent-group-menu)) - -(defun gnus-xmas-agent-server-menu-add () - (gnus-xmas-menu-add agent-server - gnus-agent-server-menu)) - -(defun gnus-xmas-tree-menu-add () - (gnus-xmas-menu-add tree - gnus-tree-menu)) - -(defun gnus-xmas-draft-menu-add () - (gnus-xmas-menu-add draft - gnus-draft-menu)) - -(defun gnus-xmas-server-menu-add () - (gnus-xmas-menu-add menu - gnus-server-server-menu gnus-server-connections-menu)) - -(defun gnus-xmas-browse-menu-add () - (gnus-xmas-menu-add browse - gnus-browse-menu)) - -(defun gnus-xmas-grouplens-menu-add () - (gnus-xmas-menu-add grouplens - gnus-grouplens-menu)) - -(defun gnus-xmas-read-event-char () - "Get the next event." - (let ((event (next-command-event))) - (sit-for 0) - ;; We junk all non-key events. Is this naughty? - (while (not (or (key-press-event-p event) - (button-press-event-p event))) - (dispatch-event event) - (setq event (next-command-event))) - (cons (and (key-press-event-p event) - (event-to-character event)) - event))) - -(defun gnus-xmas-define () - (setq gnus-mouse-2 [button2]) - (setq gnus-mouse-3 [button3]) - (setq gnus-widget-button-keymap widget-button-keymap) - - (unless (memq 'underline (face-list)) - (and (fboundp 'make-face) - (funcall (intern "make-face") 'underline))) - ;; Must avoid calling set-face-underline-p directly, because it - ;; is a defsubst in emacs19, and will make the .elc files non - ;; portable! - (unless (face-differs-from-default-p 'underline) - (funcall (intern "set-face-underline-p") 'underline t)) - - (cond - ((fboundp 'char-or-char-int-p) - ;; Handle both types of marks for XEmacs-20.x. - (defalias 'gnus-characterp 'char-or-char-int-p)) - ;; V19 of XEmacs, probably. - (t - (defalias 'gnus-characterp 'characterp))) - - (defalias 'gnus-make-overlay 'make-extent) - (defalias 'gnus-delete-overlay 'delete-extent) - (defalias 'gnus-overlay-put 'set-extent-property) - (defalias 'gnus-move-overlay 'gnus-xmas-move-overlay) - (defalias 'gnus-overlay-buffer 'extent-object) - (defalias 'gnus-overlay-start 'extent-start-position) - (defalias 'gnus-overlay-end 'extent-end-position) - (defalias 'gnus-kill-all-overlays 'gnus-xmas-kill-all-overlays) - (defalias 'gnus-extent-detached-p 'extent-detached-p) - (defalias 'gnus-add-text-properties 'gnus-xmas-add-text-properties) - (defalias 'gnus-put-text-property 'gnus-xmas-put-text-property) - (defalias 'gnus-deactivate-mark 'ignore) - (defalias 'gnus-window-edges 'window-pixel-edges) - - (if (and (<= emacs-major-version 19) - (< emacs-minor-version 14)) - (defalias 'gnus-set-text-properties 'gnus-xmas-set-text-properties)) - - (unless (boundp 'standard-display-table) - (setq standard-display-table nil)) - - (defvar gnus-mouse-face-prop 'highlight) - - (defun gnus-byte-code (func) - "Return a form that can be `eval'ed based on FUNC." - (let ((fval (indirect-function func))) - (if (compiled-function-p fval) - (list 'funcall fval) - (cons 'progn (cdr (cdr fval)))))) - - (defalias 'gnus-x-color-values - (if (fboundp 'x-color-values) - 'x-color-values - (lambda (color) - (color-instance-rgb-components - (make-color-instance color)))))) - -(defun gnus-xmas-redefine () - "Redefine lots of Gnus functions for XEmacs." - (defalias 'gnus-summary-set-display-table 'gnus-xmas-summary-set-display-table) - (defalias 'gnus-visual-turn-off-edit-menu 'identity) - (defalias 'gnus-summary-recenter 'gnus-xmas-summary-recenter) - (defalias 'gnus-extent-start-open 'gnus-xmas-extent-start-open) - (defalias 'gnus-article-push-button 'gnus-xmas-article-push-button) - (defalias 'gnus-window-top-edge 'gnus-xmas-window-top-edge) - (defalias 'gnus-read-event-char 'gnus-xmas-read-event-char) - (defalias 'gnus-group-startup-message 'gnus-xmas-group-startup-message) - (defalias 'gnus-tree-minimize 'gnus-xmas-tree-minimize) - (defalias 'gnus-appt-select-lowest-window - 'gnus-xmas-appt-select-lowest-window) - (defalias 'gnus-mail-strip-quoted-names 'gnus-xmas-mail-strip-quoted-names) - (defalias 'gnus-character-to-event 'character-to-event) - (defalias 'gnus-mode-line-buffer-identification - 'gnus-xmas-mode-line-buffer-identification) - (defalias 'gnus-key-press-event-p 'key-press-event-p) - (defalias 'gnus-region-active-p 'region-active-p) - (defalias 'gnus-annotation-in-region-p 'gnus-xmas-annotation-in-region-p) - (defalias 'gnus-mime-button-menu 'gnus-xmas-mime-button-menu) - - ;; These ones are not defcutom'ed, sometimes not even defvar'ed. They - ;; probably should. If that is done, the code below should then be moved - ;; where each variable is defined, in order not to mess with user settings. - ;; -- didier - (add-hook 'gnus-score-mode-hook 'gnus-xmas-score-menu-add) - (add-hook 'gnus-binary-mode-hook 'gnus-xmas-binary-menu-add) - (add-hook 'gnus-grouplens-mode-hook 'gnus-xmas-grouplens-menu-add) - (add-hook 'gnus-server-mode-hook 'gnus-xmas-server-menu-add) - (add-hook 'gnus-browse-mode-hook 'gnus-xmas-browse-menu-add) - (add-hook 'gnus-draft-mode-hook 'gnus-xmas-draft-menu-add) - (add-hook 'gnus-mailing-list-mode-hook 'gnus-xmas-mailing-list-menu-add) - - (when (featurep 'mule) - (defun gnus-truncate-string (str end-column &optional start-column padding) - "Truncate string STR to end at column END-COLUMN. -The optional 2nd arg START-COLUMN, if non-nil, specifies -the starting column; that means to return the characters occupying -columns START-COLUMN ... END-COLUMN of STR. - -The optional 3rd arg PADDING, if non-nil, specifies a padding character -to add at the end of the result if STR doesn't reach column END-COLUMN, -or if END-COLUMN comes in the middle of a character in STR. -PADDING is also added at the beginning of the result -if column START-COLUMN appears in the middle of a character in STR. - -If PADDING is nil, no padding is added in these cases, so -the resulting string may be narrower than END-COLUMN. -\[Emacs 20.3 emulating function]" - (or start-column - (setq start-column 0)) - (let ((len (length str)) - (idx 0) - (column 0) - (head-padding "") (tail-padding "") - ch last-column last-idx from-idx) - (condition-case nil - (while (< column start-column) - (setq ch (aref str idx) - column (+ column (char-width ch)) - idx (1+ idx))) - (args-out-of-range (setq idx len))) - (if (< column start-column) - (if padding (make-string end-column padding) "") - (if (and padding (> column start-column)) - (setq head-padding - (make-string (- column start-column) padding))) - (setq from-idx idx) - (if (< end-column column) - (setq idx from-idx) - (condition-case nil - (while (< column end-column) - (setq last-column column - last-idx idx - ch (aref str idx) - column (+ column (char-width ch)) - idx (1+ idx))) - (args-out-of-range (setq idx len))) - (if (> column end-column) - (setq column last-column idx last-idx)) - (if (and padding (< column end-column)) - (setq tail-padding - (make-string (- end-column column) padding)))) - (setq str (substring str from-idx idx)) - (if padding - (concat head-padding str tail-padding) - str)))) - - (defun gnus-tilde-pad-form (el pad-width) - "Return a form that pads EL to PAD-WIDTH." - (let ((pad (abs pad-width))) - (if (symbolp el) - (if (< pad-width 0) - `(let ((val (format "%s" ,el))) - (concat val (make-string - (max 0 (- ,pad (string-width val))) ?\ ))) - `(let ((val (format "%s" ,el))) - (concat (make-string - (max 0 (- ,pad (string-width val))) ?\ ) - val))) - (if (< pad-width 0) - `(let ((val (eval ,el))) - (concat val (make-string - (max 0 (- ,pad (string-width val))) ?\ ))) - `(let ((val (eval ,el))) - (concat (make-string - (max 0 (- ,pad (string-width val))) ?\ ) - val)))))) - )) - -;;; XEmacs logo and toolbar. - -(defun gnus-xmas-group-startup-message (&optional x y) - "Insert startup message in current buffer." - ;; Insert the message. - (erase-buffer) - (cond - ((and (console-on-window-system-p) - (or (featurep 'xpm) - (featurep 'xbm))) - (let* ((logo-xpm (expand-file-name "gnus.xpm" gnus-xmas-glyph-directory)) - (logo-xbm (expand-file-name "gnus.xbm" gnus-xmas-glyph-directory)) - (glyph (make-glyph - (cond ((featurep 'xpm) - `[xpm - :file ,logo-xpm - :color-symbols - (("thing" . ,(car gnus-xmas-logo-colors)) - ("shadow" . ,(cadr gnus-xmas-logo-colors)) - ("background" . ,(face-background 'default)))]) - ((featurep 'xbm) - `[xbm :file ,logo-xbm]) - (t [nothing])))) - (wpheight (window-pixel-height)) - (rest (max 0 (1- (/ (* (- wpheight (glyph-height glyph)) - (window-height)) - wpheight 2))))) - (insert " ") - (set-extent-begin-glyph (make-extent (point) (point)) glyph) - (goto-char (point-min)) - (while (not (eobp)) - (insert (make-string (/ (max (- (window-width) (or x 35)) 0) 2) - ?\ )) - (forward-line 1)) - (setq gnus-simple-splash nil) - (goto-char (point-min)) - (insert gnus-product-name " " gnus-version-number - (if (zerop (string-to-number gnus-revision-number)) - "" - (concat " (r" gnus-revision-number ")")) - " based on " gnus-original-product-name " v" - gnus-original-version-number "\n") - (end-of-line 0) - (put-text-property (point-min) (point) 'face 'gnus-splash-face) - (insert-char ?\ (prog1 - (max 0 (/ (- (window-width) (point)) 2)) - (goto-char (point-min)))) - (forward-line 1) - (insert-char ?\n rest) - (set-window-start (selected-window) (point-min)))) - (t - (insert " - _ ___ _ _ - _ ___ __ ___ __ _ ___ - __ _ ___ __ ___ - _ ___ _ - _ _ __ _ - ___ __ _ - __ _ - _ _ _ - _ _ _ - _ _ _ - __ ___ - _ _ _ _ - _ _ - _ _ - _ _ - _ - __ - -" - ) - (goto-char (point-min)) - (insert gnus-product-name " " gnus-version-number - (if (zerop (string-to-number gnus-revision-number)) - "" - (concat " (r" gnus-revision-number ")")) - " based on " gnus-original-product-name " v" - gnus-original-version-number) - (insert-char ?\ (prog1 - (max 0 (/ (- (window-width) (point)) 2)) - (goto-char (point-min)))) - (forward-line 1) - ;; And then hack it. - (gnus-indent-rigidly (point) (point-max) - (/ (max (- (window-width) (or x 46)) 0) 2)) - (goto-char (point-min)) - (forward-line 1) - (let* ((pheight (count-lines (point-min) (point-max))) - (wheight (window-height)) - (rest (- wheight pheight))) - (insert (make-string (max 0 (* 2 (/ rest 3))) ?\n))) - ;; Paint it. - (put-text-property (point-min) (point-max) 'face 'gnus-splash-face))) - (setq modeline-buffer-identification - (list (concat gnus-version ": *Group*"))) - (set-buffer-modified-p t)) - - -;;; The toolbar. - -(defcustom gnus-use-toolbar (if (featurep 'toolbar) - 'default-toolbar - nil) - "*If nil, do not use a toolbar. -If it is non-nil, it must be a toolbar. The five valid values are -`default-toolbar', `top-toolbar', `bottom-toolbar', -`right-toolbar', and `left-toolbar'." - :type '(choice (const default-toolbar) - (const top-toolbar) (const bottom-toolbar) - (const left-toolbar) (const right-toolbar) - (const :tag "no toolbar" nil)) - :group 'gnus-xmas) - -(defvar gnus-group-toolbar - '([gnus-group-get-new-news gnus-group-get-new-news t "Get new news"] - [gnus-group-get-new-news-this-group - gnus-group-get-new-news-this-group t "Get new news in this group"] - [gnus-group-catchup-current - gnus-group-catchup-current t "Catchup group"] - [gnus-group-describe-group - gnus-group-describe-group t "Describe group"] - [gnus-group-unsubscribe gnus-group-unsubscribe t "Unsubscribe group"] - [gnus-group-subscribe gnus-group-subscribe t "Subscribe group"] - [gnus-group-kill-group gnus-group-kill-group t "Kill group"] - [gnus-group-exit gnus-group-exit t "Exit Gnus"]) - "The group buffer toolbar.") - -(defvar gnus-summary-toolbar - '([gnus-summary-prev-unread - gnus-summary-prev-page-or-article t "Page up"] - [gnus-summary-next-unread - gnus-summary-next-page t "Page down"] - [gnus-summary-post-news - gnus-summary-post-news t "Post an article"] - [gnus-summary-followup-with-original - gnus-summary-followup-with-original t - "Post a followup and yank the original"] - [gnus-summary-followup - gnus-summary-followup t "Post a followup"] - [gnus-summary-reply-with-original - gnus-summary-reply-with-original t "Mail a reply and yank the original"] - [gnus-summary-reply - gnus-summary-reply t "Mail a reply"] - [gnus-summary-caesar-message - gnus-summary-caesar-message t "Rot 13"] - [gnus-uu-decode-uu - gnus-uu-decode-uu t "Decode uuencoded articles"] - [gnus-summary-save-article-file - gnus-summary-save-article-file t "Save article in file"] - [gnus-summary-save-article - gnus-summary-save-article t "Save article"] - [gnus-uu-post-news - gnus-uu-post-news t "Post a uuencoded article"] - [gnus-summary-cancel-article - gnus-summary-cancel-article t "Cancel article"] - [gnus-summary-catchup - gnus-summary-catchup t "Catchup"] - [gnus-summary-catchup-and-exit - gnus-summary-catchup-and-exit t "Catchup and exit"] - [gnus-summary-exit gnus-summary-exit t "Exit this summary"]) - "The summary buffer toolbar.") - -(defvar gnus-summary-mail-toolbar - '( - [gnus-summary-prev-unread - gnus-summary-prev-unread-article t "Prev unread article"] - [gnus-summary-next-unread - gnus-summary-next-unread-article t "Next unread article"] - [gnus-summary-mail-reply gnus-summary-reply t "Reply"] - [gnus-summary-mail-originate gnus-summary-post-news t "Originate"] - [gnus-summary-mail-save gnus-summary-save-article t "Save"] - [gnus-summary-mail-copy gnus-summary-copy-article t "Copy message"] - [gnus-summary-mail-forward gnus-summary-mail-forward t "Forward message"] - [gnus-summary-caesar-message - gnus-summary-caesar-message t "Rot 13"] - [gnus-uu-decode-uu - gnus-uu-decode-uu t "Decode uuencoded articles"] - [gnus-summary-save-article-file - gnus-summary-save-article-file t "Save article in file"] - [gnus-summary-save-article - gnus-summary-save-article t "Save article"] - [gnus-summary-catchup - gnus-summary-catchup t "Catchup"] - [gnus-summary-catchup-and-exit - gnus-summary-catchup-and-exit t "Catchup and exit"] - [gnus-summary-exit gnus-summary-exit t "Exit this summary"]) - "The summary buffer mail toolbar.") - -(defun gnus-xmas-setup-group-toolbar () - (and gnus-use-toolbar - (message-xmas-setup-toolbar gnus-group-toolbar nil "gnus") - (set-specifier (symbol-value gnus-use-toolbar) - (cons (current-buffer) gnus-group-toolbar)))) - -(defun gnus-xmas-setup-summary-toolbar () - (let ((bar (if (gnus-news-group-p gnus-newsgroup-name) - gnus-summary-toolbar gnus-summary-mail-toolbar))) - (and gnus-use-toolbar - (message-xmas-setup-toolbar bar nil "gnus") - (set-specifier (symbol-value gnus-use-toolbar) - (cons (current-buffer) bar))))) - -(defun gnus-xmas-mail-strip-quoted-names (address) - "Protect mail-strip-quoted-names from NIL input. -XEmacs compatibility workaround." - (if (null address) - nil - (mail-strip-quoted-names address))) - -(defun gnus-xmas-call-region (command &rest args) - (apply - 'call-process-region (point-min) (point-max) command t '(t nil) nil - args)) - -(defface gnus-x-face '((t (:foreground "black" :background "white"))) - "Face to show X face" - :group 'gnus-xmas) - -(defun gnus-xmas-article-display-xface (beg end &optional buffer) - "Display any XFace headers in BUFFER." - (save-excursion - (let ((xface-glyph - (cond - ((featurep 'xface) - (make-glyph (vector 'xface :data - (concat "X-Face: " - (if buffer - (with-current-buffer buffer - (buffer-substring beg end)) - (buffer-substring beg end)))))) - ((featurep 'xpm) - (let ((cur (or buffer (current-buffer)))) - (save-excursion - (gnus-set-work-buffer) - (insert-buffer-substring cur beg end) - (let ((coding-system-for-read 'binary) - (coding-system-for-write 'binary)) - (gnus-xmas-call-region "uncompface") - (goto-char (point-min)) - (insert "/* Width=48, Height=48 */\n") - (gnus-xmas-call-region "icontopbm") - (gnus-xmas-call-region "ppmtoxpm") - (make-glyph - (vector 'xpm :data (buffer-string))))))) - (t - (make-glyph [nothing])))) - (ext (make-extent (progn - (goto-char (point-min)) - (re-search-forward "^From:" nil t) - (point)) - (1+ (point))))) - (set-glyph-face xface-glyph 'gnus-x-face) - (set-extent-begin-glyph ext xface-glyph) - (set-extent-property ext 'duplicable t)))) - -(defvar gnus-xmas-modeline-left-extent - (let ((ext (copy-extent modeline-buffer-id-left-extent))) - ext)) - -(defvar gnus-xmas-modeline-right-extent - (let ((ext (copy-extent modeline-buffer-id-right-extent))) - ext)) - -(defvar gnus-xmas-modeline-glyph - (progn - (let* ((file-xpm (expand-file-name "gnus-pointer.xpm" - gnus-xmas-glyph-directory)) - (file-xbm (expand-file-name "gnus-pointer.xbm" - gnus-xmas-glyph-directory)) - (glyph (make-glyph - ;; Gag gag gag. - (cond ((featurep 'xpm) - ;; Let's try a nifty XPM - `[xpm :file ,file-xpm]) - ((featurep 'xbm) - ;; Then a not-so-nifty XBM - `[xbm :file ,file-xbm]) - ;; Then the simple string - (t [string :data "Gnus:"]))))) - (set-glyph-face glyph 'modeline-buffer-id) - glyph))) - -(defun gnus-xmas-mode-line-buffer-identification (line) - (let ((line (car line)) - chop) - (cond - ;; This is some weird type of id. - ((not (stringp line)) - (list line)) - ;; This is non-standard, so we just pass it through. - ((not (string-match "^Gnus:" line)) - (list line)) - ;; We have a standard line, so we colorize and glyphize it a bit. - (t - (setq chop (match-end 0)) - (list - (if gnus-xmas-modeline-glyph - (cons gnus-xmas-modeline-left-extent gnus-xmas-modeline-glyph) - (cons gnus-xmas-modeline-left-extent (substring line 0 chop))) - (cons gnus-xmas-modeline-right-extent (substring line chop))))))) - -(defun gnus-xmas-splash () - (when (eq (device-type) 'x) - (gnus-splash))) - -(defun gnus-xmas-annotation-in-region-p (b e) - (or (map-extents (lambda (e u) t) nil b e nil nil 'mm t) - (if (= b e) - (eq (cadr (memq 'gnus-undeletable (text-properties-at b))) t) - (text-property-any b e 'gnus-undeletable t)))) - -(defun gnus-xmas-mime-button-menu (event) - "Construct a context-sensitive menu of MIME commands." - (interactive "e") - (let ((response (get-popup-menu-response - `("MIME Part" - ,@(mapcar (lambda (c) `[,(caddr c) ,(car c) t]) - gnus-mime-button-commands))))) - (set-buffer (event-buffer event)) - (goto-char (event-point event)) - (funcall (event-function response) (event-object response)))) - -(defun gnus-group-add-icon () - "Add an icon to the current line according to `gnus-group-icon-list'." - (let* ((p (point)) - (end (progn (end-of-line) (point))) - ;; now find out where the line starts and leave point there. - (beg (progn (beginning-of-line) (point)))) - (save-restriction - (narrow-to-region beg end) - (goto-char beg) - (when (search-forward "==&&==" nil t) - (let* ((group (gnus-group-group-name)) - (entry (gnus-group-entry group)) - (unread (if (numberp (car entry)) (car entry) 0)) - (active (gnus-active group)) - (total (if active (1+ (- (cdr active) (car active))) 0)) - (info (nth 2 entry)) - (method (gnus-server-get-method group (gnus-info-method info))) - (marked (gnus-info-marks info)) - (mailp (memq 'mail (assoc (symbol-name - (car (or method gnus-select-method))) - gnus-valid-select-methods))) - (level (or (gnus-info-level info) gnus-level-killed)) - (score (or (gnus-info-score info) 0)) - (ticked (gnus-range-length (cdr (assq 'tick marked)))) - (group-age (gnus-group-timestamp-delta group)) - (inhibit-read-only t) - (list gnus-group-icon-list) - (mystart (match-beginning 0)) - (myend (match-end 0))) - (goto-char (point-min)) - (while (and list - (not (eval (caar list)))) - (setq list (cdr list))) - (if list - (let* ((file (cdar list)) - (glyph (gnus-group-icon-create-glyph - (buffer-substring mystart myend) - file))) - (if glyph - (progn - (mapcar 'delete-annotation (annotations-at myend)) - (let ((ext (make-extent mystart myend)) - (ant (make-annotation glyph myend 'text))) - ;; set text extent params - (set-extent-property ext 'end-open t) - (set-extent-property ext 'start-open t) - (set-extent-property ext 'invisible t))) - (delete-region mystart myend))) - (delete-region mystart myend)))) - (widen)) - (goto-char p))) - -(defun gnus-group-icon-create-glyph (substring pixmap) - "Create a glyph for insertion into a group line." - (or - (cdr-safe (assoc pixmap gnus-group-icon-cache)) - (let* ((glyph (make-glyph - (list - (cons 'x - (expand-file-name pixmap gnus-xmas-glyph-directory)) - (cons 'mswindows - (expand-file-name pixmap gnus-xmas-glyph-directory)) - (cons 'tty substring))))) - (setq gnus-group-icon-cache - (cons (cons pixmap glyph) gnus-group-icon-cache)) - (set-glyph-face glyph 'default) - glyph))) - -(defun gnus-xmas-mailing-list-menu-add () - (gnus-xmas-menu-add mailing-list - gnus-mailing-list-menu)) - -(provide 'gnus-xmas) - -;;; gnus-xmas.el ends here diff --git a/lisp/gnus.el b/lisp/gnus.el deleted file mode 100644 index cf8255a..0000000 --- a/lisp/gnus.el +++ /dev/null @@ -1,3292 +0,0 @@ -;;; gnus.el --- a newsreader for GNU Emacs -;; Copyright (C) 1987, 1988, 1989, 1990, 1993, 1994, 1995, 1996, -;; 1997, 1998, 2000, 2001 Free Software Foundation, Inc. - -;; Author: Masanobu UMEDA -;; Lars Magne Ingebrigtsen -;; Tatsuya Ichikawa -;; Yoshiki Hayashi -;; Keywords: news, mail - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval '(run-hooks 'gnus-load-hook)) - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'static)) - -(require 'wid-edit) - -(require 'gnus-vers) - -(defgroup gnus nil - "The coffee-brewing, all singing, all dancing, kitchen sink newsreader." - :group 'news - :group 'mail) - -(defgroup gnus-format nil - "Dealing with formatting issues." - :group 'news - :group 'mail) - -(defgroup gnus-charset nil - "Group character set issues." - :link '(custom-manual "(gnus)Charsets") - :version "21.1" - :group 'gnus) - -(defgroup gnus-cache nil - "Cache interface." - :group 'gnus) - -(defgroup gnus-start nil - "Starting your favorite newsreader." - :group 'gnus) - -(defgroup gnus-start-server nil - "Server options at startup." - :group 'gnus-start) - -;; These belong to gnus-group.el. -(defgroup gnus-group nil - "Group buffers." - :link '(custom-manual "(gnus)The Group Buffer") - :group 'gnus) - -(defgroup gnus-group-foreign nil - "Foreign groups." - :link '(custom-manual "(gnus)Foreign Groups") - :group 'gnus-group) - -(defgroup gnus-group-new nil - "Automatic subscription of new groups." - :group 'gnus-group) - -(defgroup gnus-group-levels nil - "Group levels." - :link '(custom-manual "(gnus)Group Levels") - :group 'gnus-group) - -(defgroup gnus-group-select nil - "Selecting a Group." - :link '(custom-manual "(gnus)Selecting a Group") - :group 'gnus-group) - -(defgroup gnus-group-listing nil - "Showing slices of the group list." - :link '(custom-manual "(gnus)Listing Groups") - :group 'gnus-group) - -(defgroup gnus-group-visual nil - "Sorting the group buffer." - :link '(custom-manual "(gnus)Group Buffer Format") - :group 'gnus-group - :group 'gnus-visual) - -(defgroup gnus-group-various nil - "Various group options." - :link '(custom-manual "(gnus)Scanning New Messages") - :group 'gnus-group) - -;; These belong to gnus-sum.el. -(defgroup gnus-summary nil - "Summary buffers." - :link '(custom-manual "(gnus)The Summary Buffer") - :group 'gnus) - -(defgroup gnus-summary-exit nil - "Leaving summary buffers." - :link '(custom-manual "(gnus)Exiting the Summary Buffer") - :group 'gnus-summary) - -(defgroup gnus-summary-marks nil - "Marks used in summary buffers." - :link '(custom-manual "(gnus)Marking Articles") - :group 'gnus-summary) - -(defgroup gnus-thread nil - "Ordering articles according to replies." - :link '(custom-manual "(gnus)Threading") - :group 'gnus-summary) - -(defgroup gnus-summary-format nil - "Formatting of the summary buffer." - :link '(custom-manual "(gnus)Summary Buffer Format") - :group 'gnus-summary) - -(defgroup gnus-summary-choose nil - "Choosing Articles." - :link '(custom-manual "(gnus)Choosing Articles") - :group 'gnus-summary) - -(defgroup gnus-summary-maneuvering nil - "Summary movement commands." - :link '(custom-manual "(gnus)Summary Maneuvering") - :group 'gnus-summary) - -(defgroup gnus-summary-mail nil - "Mail group commands." - :link '(custom-manual "(gnus)Mail Group Commands") - :group 'gnus-summary) - -(defgroup gnus-summary-sort nil - "Sorting the summary buffer." - :link '(custom-manual "(gnus)Sorting") - :group 'gnus-summary) - -(defgroup gnus-summary-visual nil - "Highlighting and menus in the summary buffer." - :link '(custom-manual "(gnus)Summary Highlighting") - :group 'gnus-visual - :group 'gnus-summary) - -(defgroup gnus-summary-various nil - "Various summary buffer options." - :link '(custom-manual "(gnus)Various Summary Stuff") - :group 'gnus-summary) - -(defgroup gnus-summary-pick nil - "Pick mode in the summary buffer." - :link '(custom-manual "(gnus)Pick and Read") - :prefix "gnus-pick-" - :group 'gnus-summary) - -(defgroup gnus-summary-tree nil - "Tree display of threads in the summary buffer." - :link '(custom-manual "(gnus)Tree Display") - :prefix "gnus-tree-" - :group 'gnus-summary) - -;; Belongs to gnus-uu.el -(defgroup gnus-extract-view nil - "Viewing extracted files." - :link '(custom-manual "(gnus)Viewing Files") - :group 'gnus-extract) - -;; Belongs to gnus-score.el -(defgroup gnus-score nil - "Score and kill file handling." - :group 'gnus) - -(defgroup gnus-score-kill nil - "Kill files." - :group 'gnus-score) - -(defgroup gnus-score-adapt nil - "Adaptive score files." - :group 'gnus-score) - -(defgroup gnus-score-default nil - "Default values for score files." - :group 'gnus-score) - -(defgroup gnus-score-expire nil - "Expiring score rules." - :group 'gnus-score) - -(defgroup gnus-score-decay nil - "Decaying score rules." - :group 'gnus-score) - -(defgroup gnus-score-files nil - "Score and kill file names." - :group 'gnus-score - :group 'gnus-files) - -(defgroup gnus-score-various nil - "Various scoring and killing options." - :group 'gnus-score) - -;; Other -(defgroup gnus-visual nil - "Options controling the visual fluff." - :group 'gnus - :group 'faces) - -(defgroup gnus-agent nil - "Offline support for Gnus." - :group 'gnus) - -(defgroup gnus-files nil - "Files used by Gnus." - :group 'gnus) - -(defgroup gnus-dribble-file nil - "Auto save file." - :link '(custom-manual "(gnus)Auto Save") - :group 'gnus-files) - -(defgroup gnus-newsrc nil - "Storing Gnus state." - :group 'gnus-files) - -(defgroup gnus-server nil - "Options related to newsservers and other servers used by Gnus." - :group 'gnus) - -(defgroup gnus-server-visual nil - "Highlighting and menus in the server buffer." - :group 'gnus-visual - :group 'gnus-server) - -(defgroup gnus-message '((message custom-group)) - "Composing replies and followups in Gnus." - :group 'gnus) - -(defgroup gnus-meta nil - "Meta variables controling major portions of Gnus. -In general, modifying these variables does not take affect until Gnus -is restarted, and sometimes reloaded." - :group 'gnus) - -(defgroup gnus-various nil - "Other Gnus options." - :link '(custom-manual "(gnus)Various Various") - :group 'gnus) - -(defgroup gnus-mime nil - "Variables for controlling the Gnus MIME interface." - :group 'gnus) - -(defgroup gnus-exit nil - "Exiting gnus." - :link '(custom-manual "(gnus)Exiting Gnus") - :group 'gnus) - -(defcustom gnus-inhibit-startup-message nil - "If non-nil, the startup message will not be displayed. -This variable is used before `.gnus.el' is loaded, so it should -be set in `.emacs' instead." - :group 'gnus-start - :type 'boolean) - -(defcustom gnus-play-startup-jingle nil - "If non-nil, play the Gnus jingle at startup." - :group 'gnus-start - :type 'boolean) - -(unless (fboundp 'gnus-group-remove-excess-properties) - (defalias 'gnus-group-remove-excess-properties 'ignore)) - -(unless (fboundp 'gnus-set-text-properties) - (defalias 'gnus-set-text-properties 'set-text-properties)) - -(unless (featurep 'gnus-xmas) - (defalias 'gnus-make-overlay 'make-overlay) - (defalias 'gnus-delete-overlay 'delete-overlay) - (defalias 'gnus-overlay-put 'overlay-put) - (defalias 'gnus-move-overlay 'move-overlay) - (defalias 'gnus-overlay-buffer 'overlay-buffer) - (defalias 'gnus-overlay-start 'overlay-start) - (defalias 'gnus-overlay-end 'overlay-end) - (defalias 'gnus-extent-detached-p 'ignore) - (defalias 'gnus-extent-start-open 'ignore) - (defalias 'gnus-appt-select-lowest-window 'appt-select-lowest-window) - (defalias 'gnus-mail-strip-quoted-names 'mail-strip-quoted-names) - (defalias 'gnus-character-to-event 'identity) - (defalias 'gnus-add-text-properties 'add-text-properties) - (defalias 'gnus-put-text-property 'put-text-property) - (defvar gnus-mode-line-image-cache t) - (if (fboundp 'find-image) - (defun gnus-mode-line-buffer-identification (line) - (let ((str (car-safe line))) - (if (and (stringp str) - (string-match "^Gnus:" str)) - (progn (add-text-properties - 0 5 - (list 'display - (if (eq t gnus-mode-line-image-cache) - (setq gnus-mode-line-image-cache - (find-image - '((:type xpm :file "gnus-pointer.xpm" - :ascent center) - (:type xbm :file "gnus-pointer.xbm" - :ascent center)))) - gnus-mode-line-image-cache) - 'help-echo "This is Gnus") - str) - (list str)) - line))) - (defalias 'gnus-mode-line-buffer-identification 'identity)) - (defalias 'gnus-characterp 'numberp) - (defalias 'gnus-deactivate-mark 'deactivate-mark) - (defalias 'gnus-window-edges 'window-edges) - (defalias 'gnus-key-press-event-p 'numberp) - ;;(defalias 'gnus-decode-rfc1522 'ignore) - ) - -;; We define these group faces here to avoid the display -;; update forced when creating new faces. - -(defface gnus-group-news-1-face - '((((class color) - (background dark)) - (:foreground "PaleTurquoise" :bold t)) - (((class color) - (background light)) - (:foreground "ForestGreen" :bold t)) - (t - ())) - "Level 1 newsgroup face.") - -(defface gnus-group-news-1-empty-face - '((((class color) - (background dark)) - (:foreground "PaleTurquoise")) - (((class color) - (background light)) - (:foreground "ForestGreen")) - (t - ())) - "Level 1 empty newsgroup face.") - -(defface gnus-group-news-2-face - '((((class color) - (background dark)) - (:foreground "turquoise" :bold t)) - (((class color) - (background light)) - (:foreground "CadetBlue4" :bold t)) - (t - ())) - "Level 2 newsgroup face.") - -(defface gnus-group-news-2-empty-face - '((((class color) - (background dark)) - (:foreground "turquoise")) - (((class color) - (background light)) - (:foreground "CadetBlue4")) - (t - ())) - "Level 2 empty newsgroup face.") - -(defface gnus-group-news-3-face - '((((class color) - (background dark)) - (:bold t)) - (((class color) - (background light)) - (:bold t)) - (t - ())) - "Level 3 newsgroup face.") - -(defface gnus-group-news-3-empty-face - '((((class color) - (background dark)) - ()) - (((class color) - (background light)) - ()) - (t - ())) - "Level 3 empty newsgroup face.") - -(defface gnus-group-news-4-face - '((((class color) - (background dark)) - (:bold t)) - (((class color) - (background light)) - (:bold t)) - (t - ())) - "Level 4 newsgroup face.") - -(defface gnus-group-news-4-empty-face - '((((class color) - (background dark)) - ()) - (((class color) - (background light)) - ()) - (t - ())) - "Level 4 empty newsgroup face.") - -(defface gnus-group-news-5-face - '((((class color) - (background dark)) - (:bold t)) - (((class color) - (background light)) - (:bold t)) - (t - ())) - "Level 5 newsgroup face.") - -(defface gnus-group-news-5-empty-face - '((((class color) - (background dark)) - ()) - (((class color) - (background light)) - ()) - (t - ())) - "Level 5 empty newsgroup face.") - -(defface gnus-group-news-6-face - '((((class color) - (background dark)) - (:bold t)) - (((class color) - (background light)) - (:bold t)) - (t - ())) - "Level 6 newsgroup face.") - -(defface gnus-group-news-6-empty-face - '((((class color) - (background dark)) - ()) - (((class color) - (background light)) - ()) - (t - ())) - "Level 6 empty newsgroup face.") - -(defface gnus-group-news-low-face - '((((class color) - (background dark)) - (:foreground "DarkTurquoise" :bold t)) - (((class color) - (background light)) - (:foreground "DarkGreen" :bold t)) - (t - ())) - "Low level newsgroup face.") - -(defface gnus-group-news-low-empty-face - '((((class color) - (background dark)) - (:foreground "DarkTurquoise")) - (((class color) - (background light)) - (:foreground "DarkGreen")) - (t - ())) - "Low level empty newsgroup face.") - -(defface gnus-group-mail-1-face - '((((class color) - (background dark)) - (:foreground "aquamarine1" :bold t)) - (((class color) - (background light)) - (:foreground "DeepPink3" :bold t)) - (t - (:bold t))) - "Level 1 mailgroup face.") - -(defface gnus-group-mail-1-empty-face - '((((class color) - (background dark)) - (:foreground "aquamarine1")) - (((class color) - (background light)) - (:foreground "DeepPink3")) - (t - (:italic t :bold t))) - "Level 1 empty mailgroup face.") - -(defface gnus-group-mail-2-face - '((((class color) - (background dark)) - (:foreground "aquamarine2" :bold t)) - (((class color) - (background light)) - (:foreground "HotPink3" :bold t)) - (t - (:bold t))) - "Level 2 mailgroup face.") - -(defface gnus-group-mail-2-empty-face - '((((class color) - (background dark)) - (:foreground "aquamarine2")) - (((class color) - (background light)) - (:foreground "HotPink3")) - (t - (:bold t))) - "Level 2 empty mailgroup face.") - -(defface gnus-group-mail-3-face - '((((class color) - (background dark)) - (:foreground "aquamarine3" :bold t)) - (((class color) - (background light)) - (:foreground "magenta4" :bold t)) - (t - (:bold t))) - "Level 3 mailgroup face.") - -(defface gnus-group-mail-3-empty-face - '((((class color) - (background dark)) - (:foreground "aquamarine3")) - (((class color) - (background light)) - (:foreground "magenta4")) - (t - ())) - "Level 3 empty mailgroup face.") - -(defface gnus-group-mail-low-face - '((((class color) - (background dark)) - (:foreground "aquamarine4" :bold t)) - (((class color) - (background light)) - (:foreground "DeepPink4" :bold t)) - (t - (:bold t))) - "Low level mailgroup face.") - -(defface gnus-group-mail-low-empty-face - '((((class color) - (background dark)) - (:foreground "aquamarine4")) - (((class color) - (background light)) - (:foreground "DeepPink4")) - (t - (:bold t))) - "Low level empty mailgroup face.") - -;; Summary mode faces. - -(defface gnus-summary-selected-face '((t - (:underline t))) - "Face used for selected articles.") - -(defface gnus-summary-cancelled-face - '((((class color)) - (:foreground "yellow" :background "black"))) - "Face used for cancelled articles.") - -(defface gnus-summary-high-ticked-face - '((((class color) - (background dark)) - (:foreground "pink" :bold t)) - (((class color) - (background light)) - (:foreground "firebrick" :bold t)) - (t - (:bold t))) - "Face used for high interest ticked articles.") - -(defface gnus-summary-low-ticked-face - '((((class color) - (background dark)) - (:foreground "pink" :italic t)) - (((class color) - (background light)) - (:foreground "firebrick" :italic t)) - (t - (:italic t))) - "Face used for low interest ticked articles.") - -(defface gnus-summary-normal-ticked-face - '((((class color) - (background dark)) - (:foreground "pink")) - (((class color) - (background light)) - (:foreground "firebrick")) - (t - ())) - "Face used for normal interest ticked articles.") - -(defface gnus-summary-high-ancient-face - '((((class color) - (background dark)) - (:foreground "SkyBlue" :bold t)) - (((class color) - (background light)) - (:foreground "RoyalBlue" :bold t)) - (t - (:bold t))) - "Face used for high interest ancient articles.") - -(defface gnus-summary-low-ancient-face - '((((class color) - (background dark)) - (:foreground "SkyBlue" :italic t)) - (((class color) - (background light)) - (:foreground "RoyalBlue" :italic t)) - (t - (:italic t))) - "Face used for low interest ancient articles.") - -(defface gnus-summary-normal-ancient-face - '((((class color) - (background dark)) - (:foreground "SkyBlue")) - (((class color) - (background light)) - (:foreground "RoyalBlue")) - (t - ())) - "Face used for normal interest ancient articles.") - -(defface gnus-summary-high-unread-face - '((t - (:bold t))) - "Face used for high interest unread articles.") - -(defface gnus-summary-low-unread-face - '((t - (:italic t))) - "Face used for low interest unread articles.") - -(defface gnus-summary-normal-unread-face - '((t - ())) - "Face used for normal interest unread articles.") - -(defface gnus-summary-incorporated-face - '((t - ())) - "Face used for incorporated articles.") - -(defface gnus-summary-high-read-face - '((((class color) - (background dark)) - (:foreground "PaleGreen" - :bold t)) - (((class color) - (background light)) - (:foreground "DarkGreen" - :bold t)) - (t - (:bold t))) - "Face used for high interest read articles.") - -(defface gnus-summary-low-read-face - '((((class color) - (background dark)) - (:foreground "PaleGreen" - :italic t)) - (((class color) - (background light)) - (:foreground "DarkGreen" - :italic t)) - (t - (:italic t))) - "Face used for low interest read articles.") - -(defface gnus-summary-normal-read-face - '((((class color) - (background dark)) - (:foreground "PaleGreen")) - (((class color) - (background light)) - (:foreground "DarkGreen")) - (t - ())) - "Face used for normal interest read articles.") - - -;;; -;;; Gnus buffers -;;; - -(defvar gnus-buffers nil) - -(defun gnus-get-buffer-create (name) - "Do the same as `get-buffer-create', but store the created buffer." - (or (get-buffer name) - (car (push (get-buffer-create name) gnus-buffers)))) - -(defun gnus-add-buffer () - "Add the current buffer to the list of Gnus buffers." - (push (current-buffer) gnus-buffers)) - -(defun gnus-buffers () - "Return a list of live Gnus buffers." - (while (and gnus-buffers - (not (buffer-name (car gnus-buffers)))) - (pop gnus-buffers)) - (let ((buffers gnus-buffers)) - (while (cdr buffers) - (if (buffer-name (cadr buffers)) - (pop buffers) - (setcdr buffers (cddr buffers))))) - gnus-buffers) - -;;; Splash screen. - -(defvar gnus-group-buffer "*Group*") - -(eval-and-compile - (autoload 'gnus-play-jingle "gnus-audio")) - -(defface gnus-splash-face - '((((class color) - (background dark)) - (:foreground "Brown")) - (((class color) - (background light)) - (:foreground "Brown")) - (t - ())) - "Face for the splash screen.") - -(defun gnus-splash () - (save-excursion - (switch-to-buffer (gnus-get-buffer-create gnus-group-buffer)) - (let ((buffer-read-only nil)) - (erase-buffer) - (unless gnus-inhibit-startup-message - (gnus-group-startup-message) - (sit-for 0) - (when gnus-play-startup-jingle - (gnus-play-jingle)))))) - -(defun gnus-indent-rigidly (start end arg) - "Indent rigidly using only spaces and no tabs." - (save-excursion - (save-restriction - (narrow-to-region start end) - (let ((tab-width 8)) - (indent-rigidly start end arg) - ;; We translate tabs into spaces -- not everybody uses - ;; an 8-character tab. - (goto-char (point-min)) - (while (search-forward "\t" nil t) - (replace-match " " t t)))))) - -(defvar gnus-simple-splash nil) - -(defun gnus-group-startup-message (&optional x y) - "Insert startup message in current buffer." - ;; Insert the message. - (erase-buffer) - (cond - ((and (fboundp 'find-image) - (display-graphic-p) - (let* ((bg (face-background 'default)) - (fg (face-foreground 'gnus-splash-face)) - (image (find-image - `((:type xpm :file "gnus.xpm" - :color-symbols (("thing" . "#724214") - ("shadow" . "#1e3f03") - ("background" . ,bg))) - (:type pbm :file "gnus.pbm" - ;; Account for the pbm's blackground. - :background ,bg :foreground ,fg) - (:type xbm :file "gnus.xbm" - ;; Account for the xbm's blackground. - :background ,bg :foreground ,fg))))) - (when image - (insert - (propertize - (concat gnus-product-name " " gnus-version-number - (if (zerop (string-to-number gnus-revision-number)) - "" - (concat " (r" gnus-revision-number ")")) - " based on " gnus-original-product-name " v" - gnus-original-version-number) - 'face `(variable-pitch :background ,bg :foreground ,fg))) - (let ((fill-column (window-width))) - (center-region (point-min) (point))) - (let ((size (image-size image))) - (insert-char ?\n (max 1 (round (- (window-height) - (or y (cdr size))) 2))) - (insert - (propertize " " 'display - `(space :align-to - ,(max 0 (round (- (window-width) - (or x (car size))) 2))))) - (insert-image image)) - (setq gnus-simple-splash nil) - t)))) - (t - (insert " - _ ___ _ _ - _ ___ __ ___ __ _ ___ - __ _ ___ __ ___ - _ ___ _ - _ _ __ _ - ___ __ _ - __ _ - _ _ _ - _ _ _ - _ _ _ - __ ___ - _ _ _ _ - _ _ - _ _ - _ _ - _ - __ - -" - ) - (goto-char (point-min)) - (insert gnus-product-name " " gnus-version-number - (if (zerop (string-to-number gnus-revision-number)) - "" - (concat " (r" gnus-revision-number ")")) - " based on " gnus-original-product-name " v" - gnus-original-version-number) - (insert-char ?\ (prog1 - (max 0 (/ (- (window-width) (point)) 2)) - (goto-char (point-min)))) - (forward-line 1) - ;; And then hack it. - (gnus-indent-rigidly (point) (point-max) - (/ (max (- (window-width) (or x 46)) 0) 2)) - (goto-char (point-min)) - (forward-line 1) - (let* ((pheight (count-lines (point-min) (point-max))) - (wheight (window-height)) - (rest (- wheight pheight))) - (insert (make-string (max 0 (* 2 (/ rest 3))) ?\n))) - ;; Fontify some. - (put-text-property (point-min) (point-max) 'face 'gnus-splash-face) - (setq gnus-simple-splash t))) - (goto-char (point-min)) - (setq mode-line-buffer-identification (concat " " gnus-version)) - (set-buffer-modified-p t)) - -(eval-when (load) - (let ((command (format "%s" this-command))) - (if (and (string-match "gnus" command) - (not (string-match "gnus-other-frame" command))) - (gnus-splash) - (gnus-get-buffer-create gnus-group-buffer)))) - -;;; Do the rest. - -(require 'gnus-util) -(require 'nnheader) - -(defcustom gnus-parameters nil - "Alist of group parameters. - -For example: - ((\"mail\\\\..*\" (gnus-show-threads nil) - (gnus-use-scoring nil) - (gnus-summary-line-format - \"%U%R%z%I%(%[%d:%ub%-23,23f%]%) %s\\n\") - (gcc-self . t) - (display . all)) - (\"mail\\\\.me\" (gnus-use-scoring t)) - (\"list\\\\..*\" (total-expire . t) - (broken-reply-to . t)))" - :group 'gnus-group-various - :type '(repeat (cons regexp - (repeat sexp)))) - -(defvar gnus-group-parameters-more nil) - -(defvar gnus-colon-keywords - (eval-when-compile - (when (boundp 'dgnushack-colon-keywords) - (symbol-value 'dgnushack-colon-keywords))) - "List of the colon keywords should be bound at run-time. This variable -defaults to a proper value only if this file is byte-compiled by make.") - -(dolist (keyword gnus-colon-keywords) - (set keyword keyword)) - -(defmacro gnus-define-group-parameter (param &rest rest) - "Define a group parameter PARAM. -REST is a plist of following: -:type One of `bool', `list' or `nil'. -:function The name of the function. -:function-document The document of the function. -:parameter-type The type for customizing the parameter. -:parameter-document The document for the parameter. -:variable The name of the variable. -:variable-document The document for the variable. -:variable-group The group for customizing the variable. -:variable-type The type for customizing the variable. -:variable-default The default value of the variable." - (let* ((type (plist-get rest :type)) - (parameter-type (plist-get rest :parameter-type)) - (parameter-document (plist-get rest :parameter-document)) - (function (or (plist-get rest :function) - (intern (format "gnus-parameter-%s" param)))) - (function-document (or (plist-get rest :function-document) "")) - (variable (or (plist-get rest :variable) - (intern (format "gnus-parameter-%s-alist" param)))) - (variable-document (or (plist-get rest :variable-document) "")) - (variable-group (plist-get rest :variable-group)) - (variable-type (or (plist-get rest :variable-type) - `(quote (repeat - (list (regexp :tag "Group") - ,(car (cdr parameter-type))))))) - (variable-default (plist-get rest :variable-default))) - (list - 'progn - `(defcustom ,variable ,variable-default - ,variable-document - :group 'gnus-group-parameter - :group ',variable-group - :type ,variable-type) - `(setq gnus-group-parameters-more - (delq (assq ',param gnus-group-parameters-more) - gnus-group-parameters-more)) - `(add-to-list 'gnus-group-parameters-more - (list ',param - ,parameter-type - ,parameter-document)) - (if (eq type 'bool) - `(defun ,function (name) - ,function-document - (let ((params (gnus-group-find-parameter name)) - val) - (cond - ((memq ',param params) - t) - ((setq val (assq ',param params)) - (cdr val)) - ((stringp ,variable) - (string-match ,variable name)) - (,variable - (let ((alist ,variable) - elem value) - (while (setq elem (pop alist)) - (when (and name - (string-match (car elem) name)) - (setq alist nil - value (cdr elem)))) - (if (consp value) (car value) value)))))) - `(defun ,function (name) - ,function-document - (and name - (or (gnus-group-find-parameter name ',param ,(and type t)) - (let ((alist ,variable) - elem value) - (while (setq elem (pop alist)) - (when (and name - (string-match (car elem) name)) - (setq alist nil - value (cdr elem)))) - ,(if type - 'value - '(if (consp value) (car value) value)))))))))) - -(defcustom gnus-home-directory "~/" - "Directory variable that specifies the \"home\" directory. -All other Gnus path variables are initialized from this variable." - :group 'gnus-files - :type 'directory) - -(defcustom gnus-directory (or (getenv "SAVEDIR") - (nnheader-concat gnus-home-directory "News/")) - "*Directory variable from which all other Gnus file variables are derived. - -Note that Gnus is mostly loaded when the `.gnus.el' file is read. -This means that other directory variables that are initialized from -this variable won't be set properly if you set this variable in `.gnus.el'. -Set this variable in `.emacs' instead." - :group 'gnus-files - :type 'directory) - -(defcustom gnus-default-directory nil - "*Default directory for all Gnus buffers." - :group 'gnus-files - :type '(choice (const :tag "current" nil) - directory)) - -;; Site dependent variables. These variables should be defined in -;; paths.el. - -(defvar gnus-default-nntp-server nil - "Specify a default NNTP server. -This variable should be defined in paths.el, and should never be set -by the user. -If you want to change servers, you should use `gnus-select-method'. -See the documentation to that variable.") - -;; Don't touch this variable. -(defvar gnus-nntp-service "nntp" - "NNTP service name (\"nntp\" or 119). -This is an obsolete variable, which is scarcely used. If you use an -nntp server for your newsgroup and want to change the port number -used to 899, you would say something along these lines: - - (setq gnus-select-method '(nntp \"my.nntp.server\" (nntp-port-number 899)))") - -(defcustom gnus-nntpserver-file "/etc/nntpserver" - "A file with only the name of the nntp server in it." - :group 'gnus-files - :group 'gnus-server - :type 'file) - -;; This function is used to check both the environment variable -;; NNTPSERVER and the /etc/nntpserver file to see whether one can find -;; an nntp server name default. -(defun gnus-getenv-nntpserver () - (or (getenv "NNTPSERVER") - (and (file-readable-p gnus-nntpserver-file) - (save-excursion - (set-buffer (gnus-get-buffer-create " *gnus nntp*")) - (insert-file-contents gnus-nntpserver-file) - (let ((name (buffer-string))) - (prog1 - (if (string-match "\\'[ \t\n]*$" name) - nil - name) - (kill-buffer (current-buffer)))))))) - -(defcustom gnus-select-method - (condition-case nil - (nconc - (list 'nntp (or (condition-case nil - (gnus-getenv-nntpserver) - (error nil)) - (when (and gnus-default-nntp-server - (not (string= gnus-default-nntp-server ""))) - gnus-default-nntp-server) - "news")) - (if (or (null gnus-nntp-service) - (equal gnus-nntp-service "nntp")) - nil - (list gnus-nntp-service))) - (error nil)) - "Default method for selecting a newsgroup. -This variable should be a list, where the first element is how the -news is to be fetched, the second is the address. - -For instance, if you want to get your news via NNTP from -\"flab.flab.edu\", you could say: - -\(setq gnus-select-method '(nntp \"flab.flab.edu\")) - -If you want to use your local spool, say: - -\(setq gnus-select-method (list 'nnspool (system-name))) - -If you use this variable, you must set `gnus-nntp-server' to nil. - -There is a lot more to know about select methods and virtual servers - -see the manual for details." - :group 'gnus-server - :type 'gnus-select-method) - -(defcustom gnus-message-archive-method "archive" - "*Method used for archiving messages you've sent. -This should be a mail method." - :group 'gnus-server - :group 'gnus-message - :type 'gnus-select-method) - -(defcustom gnus-message-archive-group nil - "*Name of the group in which to save the messages you've written. -This can either be a string; a list of strings; or an alist -of regexps/functions/forms to be evaluated to return a string (or a list -of strings). The functions are called with the name of the current -group (or nil) as a parameter. - -If you want to save your mail in one group and the news articles you -write in another group, you could say something like: - - \(setq gnus-message-archive-group - '((if (message-news-p) - \"misc-news\" - \"misc-mail\"))) - -Normally the group names returned by this variable should be -unprefixed -- which implicitly means \"store on the archive server\". -However, you may wish to store the message on some other server. In -that case, just return a fully prefixed name of the group -- -\"nnml+private:mail.misc\", for instance." - :group 'gnus-message - :type '(choice (const :tag "none" nil) - function - sexp - string)) - -(defcustom gnus-secondary-servers nil - "List of NNTP servers that the user can choose between interactively. -To make Gnus query you for a server, you have to give `gnus' a -non-numeric prefix - `C-u M-x gnus', in short." - :group 'gnus-server - :type '(repeat string)) - -(defcustom gnus-nntp-server nil - "*The name of the host running the NNTP server. -This variable is semi-obsolete. Use the `gnus-select-method' -variable instead." - :group 'gnus-server - :type '(choice (const :tag "disable" nil) - string)) - -(defcustom gnus-secondary-select-methods nil - "A list of secondary methods that will be used for reading news. -This is a list where each element is a complete select method (see -`gnus-select-method'). - -If, for instance, you want to read your mail with the nnml backend, -you could set this variable: - -\(setq gnus-secondary-select-methods '((nnml \"\")))" - :group 'gnus-server - :type '(repeat gnus-select-method)) - -(defvar gnus-backup-default-subscribed-newsgroups - '("news.announce.newusers" "news.groups.questions" "gnu.emacs.gnus") - "Default default new newsgroups the first time Gnus is run. -Should be set in paths.el, and shouldn't be touched by the user.") - -(defcustom gnus-local-domain nil - "Local domain name without a host name. -The DOMAINNAME environment variable is used instead if it is defined. -If the `system-name' function returns the full Internet name, there is -no need to set this variable." - :group 'gnus-message - :type '(choice (const :tag "default" nil) - string)) - -(defvar gnus-local-organization nil - "String with a description of what organization (if any) the user belongs to. -Obsolete variable; use `message-user-organization' instead.") - -;; Customization variables - -(defcustom gnus-refer-article-method nil - "Preferred method for fetching an article by Message-ID. -If you are reading news from the local spool (with nnspool), fetching -articles by Message-ID is painfully slow. By setting this method to an -nntp method, you might get acceptable results. - -The value of this variable must be a valid select method as discussed -in the documentation of `gnus-select-method'. - -It can also be a list of select methods, as well as the special symbol -`current', which means to use the current select method. If it is a -list, Gnus will try all the methods in the list until it finds a match." - :group 'gnus-server - :type '(choice (const :tag "default" nil) - (const :tag "DejaNews" (nnweb "refer" (nnweb-type dejanews))) - gnus-select-method - (repeat :menu-tag "Try multiple" - :tag "Multiple" - :value (current (nnweb "refer" (nnweb-type dejanews))) - (choice :tag "Method" - (const current) - (const :tag "DejaNews" - (nnweb "refer" (nnweb-type dejanews))) - gnus-select-method)))) - -(defcustom gnus-group-faq-directory - '("/ftp@mirrors.aol.com:/pub/rtfm/usenet/" - "/ftp@sunsite.auc.dk:/pub/usenet/" - "/ftp@sunsite.doc.ic.ac.uk:/pub/usenet/news-faqs/" - "/ftp@src.doc.ic.ac.uk:/usenet/news-FAQS/" - "/ftp@ftp.seas.gwu.edu:/pub/rtfm/" - "/ftp@rtfm.mit.edu:/pub/usenet/" - "/ftp@ftp.uni-paderborn.de:/pub/FAQ/" - "/ftp@ftp.sunet.se:/pub/usenet/" - "/ftp@nctuccca.edu.tw:/USENET/FAQ/" - "/ftp@hwarang.postech.ac.kr:/pub/usenet/" - "/ftp@ftp.hk.super.net:/mirror/faqs/") - "*Directory where the group FAQs are stored. -This will most commonly be on a remote machine, and the file will be -fetched by ange-ftp. - -This variable can also be a list of directories. In that case, the -first element in the list will be used by default. The others can -be used when being prompted for a site. - -Note that Gnus uses an aol machine as the default directory. If this -feels fundamentally unclean, just think of it as a way to finally get -something of value back from them. - -If the default site is too slow, try one of these: - - North America: mirrors.aol.com /pub/rtfm/usenet - ftp.seas.gwu.edu /pub/rtfm - rtfm.mit.edu /pub/usenet - Europe: ftp.uni-paderborn.de /pub/FAQ - src.doc.ic.ac.uk /usenet/news-FAQS - ftp.sunet.se /pub/usenet - sunsite.auc.dk /pub/usenet - Asia: nctuccca.edu.tw /USENET/FAQ - hwarang.postech.ac.kr /pub/usenet - ftp.hk.super.net /mirror/faqs" - :group 'gnus-group-various - :type '(choice directory - (repeat directory))) - -(defcustom gnus-use-cross-reference t - "*Non-nil means that cross referenced articles will be marked as read. -If nil, ignore cross references. If t, mark articles as read in -subscribed newsgroups. If neither t nor nil, mark as read in all -newsgroups." - :group 'gnus-server - :type '(choice (const :tag "off" nil) - (const :tag "subscribed" t) - (sexp :format "all" - :value always))) - -(defcustom gnus-process-mark ?# - "*Process mark." - :group 'gnus-group-visual - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-large-newsgroup 200 - "*The number of articles which indicates a large newsgroup. -If the number of articles in a newsgroup is greater than this value, -confirmation is required for selecting the newsgroup. -If it is `nil', no confirmation is required." - :group 'gnus-group-select - :type 'integer) - -(defcustom gnus-use-long-file-name (not (memq system-type '(usg-unix-v xenix))) - "*Non-nil means that the default name of a file to save articles in is the group name. -If it's nil, the directory form of the group name is used instead. - -If this variable is a list, and the list contains the element -`not-score', long file names will not be used for score files; if it -contains the element `not-save', long file names will not be used for -saving; and if it contains the element `not-kill', long file names -will not be used for kill files. - -Note that the default for this variable varies according to what system -type you're using. On `usg-unix-v' and `xenix' this variable defaults -to nil while on all other systems it defaults to t." - :group 'gnus-start - :type 'boolean) - -(defcustom gnus-kill-files-directory gnus-directory - "*Name of the directory where kill files will be stored (default \"~/News\")." - :group 'gnus-score-files - :group 'gnus-score-kill - :type 'directory) - -(defcustom gnus-save-score nil - "*If non-nil, save group scoring info." - :group 'gnus-score-various - :group 'gnus-start - :type 'boolean) - -(defcustom gnus-use-undo t - "*If non-nil, allow undoing in Gnus group mode buffers." - :group 'gnus-meta - :type 'boolean) - -(defcustom gnus-use-adaptive-scoring nil - "*If non-nil, use some adaptive scoring scheme. -If a list, then the values `word' and `line' are meaningful. The -former will perform adaption on individual words in the subject -header while `line' will perform adaption on several headers." - :group 'gnus-meta - :group 'gnus-score-adapt - :type '(set (const word) (const line))) - -(defcustom gnus-use-cache 'passive - "*If nil, Gnus will ignore the article cache. -If `passive', it will allow entering (and reading) articles -explicitly entered into the cache. If anything else, use the -cache to the full extent of the law." - :group 'gnus-meta - :group 'gnus-cache - :type '(choice (const :tag "off" nil) - (const :tag "passive" passive) - (const :tag "active" t))) - -(defcustom gnus-use-trees nil - "*If non-nil, display a thread tree buffer." - :group 'gnus-meta - :type 'boolean) - -(defcustom gnus-use-grouplens nil - "*If non-nil, use GroupLens ratings." - :group 'gnus-meta - :type 'boolean) - -(defcustom gnus-keep-backlog nil - "*If non-nil, Gnus will keep read articles for later re-retrieval. -If it is a number N, then Gnus will only keep the last N articles -read. If it is neither nil nor a number, Gnus will keep all read -articles. This is not a good idea." - :group 'gnus-meta - :type '(choice (const :tag "off" nil) - integer - (sexp :format "all" - :value t))) - -(defcustom gnus-use-nocem nil - "*If non-nil, Gnus will read NoCeM cancel messages." - :group 'gnus-meta - :type 'boolean) - -(defcustom gnus-suppress-duplicates nil - "*If non-nil, Gnus will mark duplicate copies of the same article as read." - :group 'gnus-meta - :type 'boolean) - -(defcustom gnus-use-scoring t - "*If non-nil, enable scoring." - :group 'gnus-meta - :type 'boolean) - -(defcustom gnus-use-picons nil - "*If non-nil, display picons in a frame of their own." - :group 'gnus-meta - :type 'boolean) - -(defcustom gnus-summary-prepare-exit-hook - '(gnus-summary-expire-articles) - "*A hook called when preparing to exit from the summary buffer. -It calls `gnus-summary-expire-articles' by default." - :group 'gnus-summary-exit - :type 'hook) - -(defcustom gnus-novice-user t - "*Non-nil means that you are a usenet novice. -If non-nil, verbose messages may be displayed and confirmations may be -required." - :group 'gnus-meta - :type 'boolean) - -(defcustom gnus-expert-user nil - "*Non-nil means that you will never be asked for confirmation about anything. -That doesn't mean *anything* anything; particularly destructive -commands will still require prompting." - :group 'gnus-meta - :type 'boolean) - -(defcustom gnus-interactive-catchup t - "*If non-nil, require your confirmation when catching up a group." - :group 'gnus-group-select - :type 'boolean) - -(defcustom gnus-interactive-exit t - "*If non-nil, require your confirmation when exiting Gnus." - :group 'gnus-exit - :type 'boolean) - -(defcustom gnus-extract-address-components 'gnus-extract-address-components - "Function for extracting address components from a From header. -Three pre-defined functions exist: `gnus-extract-address-components', -which is the default, quite fast, and too simplistic solution, -`mail-extract-address-components', which works much better, but is -slower, and `std11-extract-address-components'." - :group 'gnus-summary-format - :type '(radio (function-item gnus-extract-address-components) - (function-item mail-extract-address-components) - (function-item std11-extract-address-components) - (function :tag "Other"))) - -(defcustom gnus-carpal nil - "*If non-nil, display clickable icons." - :group 'gnus-meta - :type 'boolean) - -(defcustom gnus-shell-command-separator ";" - "String used to separate to shell commands." - :group 'gnus-files - :type 'string) - -(defcustom gnus-valid-select-methods - '(("nntp" post address prompt-address physical-address) - ("nnspool" post address) - ("nnvirtual" post-mail virtual prompt-address) - ("nnmbox" mail respool address) - ("nnml" post-mail respool address) - ("nnmh" mail respool address) - ("nndir" post-mail prompt-address physical-address) - ("nneething" none address prompt-address physical-address) - ("nndoc" none address prompt-address) - ("nnbabyl" mail address respool) - ("nnkiboze" post virtual) - ("nnsoup" post-mail address) - ("nndraft" post-mail) - ("nnfolder" mail respool address) - ("nngateway" post-mail address prompt-address physical-address) - ("nnweb" none) - ("nnslashdot" post) - ("nnultimate" none) - ("nnrss" none) - ("nnwfm" none) - ("nnwarchive" none) - ("nnlistserv" none) - ("nnagent" post-mail) - ("nnimap" post-mail address prompt-address physical-address)) - "*An alist of valid select methods. -The first element of each list lists should be a string with the name -of the select method. The other elements may be the category of -this method (i. e., `post', `mail', `none' or whatever) or other -properties that this method has (like being respoolable). -If you implement a new select method, all you should have to change is -this variable. I think." - :group 'gnus-server - :type '(repeat (group (string :tag "Name") - (radio-button-choice (const :format "%v " post) - (const :format "%v " mail) - (const :format "%v " none) - (const post-mail)) - (checklist :inline t - (const :format "%v " address) - (const :format "%v " prompt-address) - (const :format "%v " physical-address) - (const :format "%v " virtual) - (const respool))))) - -(defun gnus-redefine-select-method-widget () - "Recomputes the select-method widget based on the value of -`gnus-valid-select-methods'." - (define-widget 'gnus-select-method 'list - "Widget for entering a select method." - :value '(nntp "") - :tag "Select Method" - :args `((choice :tag "Method" - ,@(mapcar (lambda (entry) - (list 'const :format "%v\n" - (intern (car entry)))) - gnus-valid-select-methods) - (symbol :tag "other")) - (string :tag "Address") - (repeat :tag "Options" - :inline t - (list :format "%v" - variable - (sexp :tag "Value")))))) - -(gnus-redefine-select-method-widget) - -(defcustom gnus-updated-mode-lines '(group article summary tree) - "List of buffers that should update their mode lines. -The list may contain the symbols `group', `article', `tree' and -`summary'. If the corresponding symbol is present, Gnus will keep -that mode line updated with information that may be pertinent. -If this variable is nil, screen refresh may be quicker." - :group 'gnus-various - :type '(set (const group) - (const article) - (const summary) - (const tree))) - -;; Added by Keinonen Kari . -(defcustom gnus-mode-non-string-length nil - "*Max length of mode-line non-string contents. -If this is nil, Gnus will take space as is needed, leaving the rest -of the modeline intact. Note that the default of nil is unlikely -to be desirable; see the manual for further details." - :group 'gnus-various - :type '(choice (const nil) - integer)) - -;; There should be special validation for this. -(define-widget 'gnus-email-address 'string - "An email address") - -(gnus-define-group-parameter - to-address - :function-document - "Return GROUP's to-address." - :variable-document - "*Alist of group regexps and correspondent to-addresses." - :parameter-type '(gnus-email-address :tag "To Address") - :parameter-document "\ -This will be used when doing followups and posts. - -This is primarily useful in mail groups that represent closed -mailing lists--mailing lists where it's expected that everybody that -writes to the mailing list is subscribed to it. Since using this -parameter ensures that the mail only goes to the mailing list itself, -it means that members won't receive two copies of your followups. - -Using `to-address' will actually work whether the group is foreign or -not. Let's say there's a group on the server that is called -`fa.4ad-l'. This is a real newsgroup, but the server has gotten the -articles from a mail-to-news gateway. Posting directly to this group -is therefore impossible--you have to send mail to the mailing list -address instead. - -The gnus-group-split mail splitting mechanism will behave as if this -address was listed in gnus-group-split Addresses (see below).") - -(gnus-define-group-parameter - to-list - :function-document - "Return GROUP's to-list." - :variable-document - "*Alist of group regexps and correspondent to-lists." - :parameter-type '(gnus-email-address :tag "To List") - :parameter-document "\ -This address will be used when doing a `a' in the group. - -It is totally ignored when doing a followup--except that if it is -present in a news group, you'll get mail group semantics when doing -`f'. - -The gnus-group-split mail splitting mechanism will behave as if this -address was listed in gnus-group-split Addresses (see below).") - -(gnus-define-group-parameter - auto-expire - :type bool - :function gnus-group-auto-expirable-p - :function-document - "Check whether GROUP is auto-expirable or not." - :variable gnus-auto-expirable-newsgroups - :variable-default nil - :variable-document - "*Groups in which to automatically mark read articles as expirable. -If non-nil, this should be a regexp that should match all groups in -which to perform auto-expiry. This only makes sense for mail groups." - :variable-group nnmail-expire - :variable-type '(choice (const nil) - regexp) - :parameter-type '(const :tag "Automatic Expire" t) - :parameter-document - "All articles that are read will be marked as expirable.") - -(gnus-define-group-parameter - total-expire - :type bool - :function gnus-group-total-expirable-p - :function-document - "Check whether GROUP is total-expirable or not." - :variable gnus-total-expirable-newsgroups - :variable-default nil - :variable-document - "*Groups in which to perform expiry of all read articles. -Use with extreme caution. All groups that match this regexp will be -expiring - which means that all read articles will be deleted after -\(say) one week. (This only goes for mail groups and the like, of -course.)" - :variable-group nnmail-expire - :variable-type '(choice (const nil) - regexp) - :parameter-type '(const :tag "Total Expire" t) - :parameter-document - "All read articles will be put through the expiry process - -This happens even if they are not marked as expirable. -Use with caution.") - -(gnus-define-group-parameter - charset - :function-document - "Return the default charset of GROUP." - :variable gnus-group-charset-alist - :variable-default - '(("\\(^\\|:\\)hk\\>\\|\\(^\\|:\\)tw\\>\\|\\" cn-big5) - ("\\(^\\|:\\)cn\\>\\|\\" cn-gb-2312) - ("\\(^\\|:\\)fj\\>\\|\\(^\\|:\\)japan\\>" iso-2022-jp-2) - ("\\(^\\|:\\)tnn\\>\\|\\(^\\|:\\)pin\\>\\|\\(^\\|:\\)sci.lang.japan" iso-2022-7bit) - ("\\(^\\|:\\)relcom\\>" koi8-r) - ("\\(^\\|:\\)fido7\\>" koi8-r) - ("\\(^\\|:\\)\\(cz\\|hun\\|pl\\|sk\\|hr\\)\\>" iso-8859-2) - ("\\(^\\|:\\)israel\\>" iso-8859-1) - ("\\(^\\|:\\)han\\>" euc-kr) - ("\\(^\\|:\\)alt.chinese.text.big5\\>" chinese-big5) - ("\\(^\\|:\\)soc.culture.vietnamese\\>" vietnamese-viqr) - ("\\(^\\|:\\)\\(comp\\|rec\\|alt\\|sci\\|soc\\|news\\|gnu\\|bofh\\)\\>" iso-8859-1) - (".*" iso-8859-1)) - :variable-document - "Alist of regexps (to match group names) and default charsets to be used when reading." - :variable-group gnus-charset - :variable-type '(repeat (list (regexp :tag "Group") - (symbol :tag "Charset"))) - :parameter-type '(symbol :tag "Charset") - :parameter-document "\ -The default charset to use in the group.") - -(gnus-define-group-parameter - post-method - :type list - :function-document - "Return a posting method for GROUP." - :variable gnus-post-method-alist - :variable-document - "Alist of regexps (to match group names) and method to be used when -posting an article." - :variable-group gnus-group-foreign - :parameter-type - '(choice :tag "Posting Method" - (const nil) - (const current) - (const native) - (list :convert-widget - (lambda (widget) - (list 'sexp :tag "Methods" - :value gnus-select-method)))) - :parameter-document - "Posting method for this group.") - -(defcustom gnus-group-uncollapsed-levels 1 - "Number of group name elements to leave alone when making a short group name." - :group 'gnus-group-visual - :type 'integer) - -(defcustom gnus-group-use-permanent-levels nil - "*If non-nil, once you set a level, Gnus will use this level." - :group 'gnus-group-levels - :type 'boolean) - -;; Hooks. - -(defcustom gnus-load-hook nil - "A hook run while Gnus is loaded." - :group 'gnus-start - :type 'hook) - -(defcustom gnus-apply-kill-hook '(gnus-apply-kill-file) - "A hook called to apply kill files to a group. -This hook is intended to apply a kill file to the selected newsgroup. -The function `gnus-apply-kill-file' is called by default. - -Since a general kill file is too heavy to use only for a few -newsgroups, I recommend you to use a lighter hook function. For -example, if you'd like to apply a kill file to articles which contains -a string `rmgroup' in subject in newsgroup `control', you can use the -following hook: - - (setq gnus-apply-kill-hook - (list - (lambda () - (cond ((string-match \"control\" gnus-newsgroup-name) - (gnus-kill \"Subject\" \"rmgroup\") - (gnus-expunge \"X\"))))))" - :group 'gnus-score-kill - :options '(gnus-apply-kill-file) - :type 'hook) - -(defcustom gnus-group-change-level-function nil - "Function run when a group level is changed. -It is called with three parameters -- GROUP, LEVEL and OLDLEVEL." - :group 'gnus-group-levels - :type 'function) - -;;; Face thingies. - -(defcustom gnus-visual - '(summary-highlight group-highlight article-highlight - mouse-face - summary-menu group-menu article-menu - tree-highlight menu highlight - browse-menu server-menu - page-marker tree-menu binary-menu pick-menu - grouplens-menu) - "*Enable visual features. -If `visual' is disabled, there will be no menus and few faces. Most of -the visual customization options below will be ignored. Gnus will use -less space and be faster as a result. - -This variable can also be a list of visual elements to switch on. For -instance, to switch off all visual things except menus, you can say: - - (setq gnus-visual '(menu)) - -Valid elements include `summary-highlight', `group-highlight', -`article-highlight', `mouse-face', `summary-menu', `group-menu', -`article-menu', `tree-highlight', `menu', `highlight', `browse-menu', -`server-menu', `page-marker', `tree-menu', `binary-menu', `pick-menu', -and `grouplens-menu'." - :group 'gnus-meta - :group 'gnus-visual - :type '(set (const summary-highlight) - (const group-highlight) - (const article-highlight) - (const mouse-face) - (const summary-menu) - (const group-menu) - (const article-menu) - (const tree-highlight) - (const menu) - (const highlight) - (const browse-menu) - (const server-menu) - (const page-marker) - (const tree-menu) - (const binary-menu) - (const pick-menu) - (const grouplens-menu))) - -;; Byte-compiler warning. -(defvar gnus-visual) -;; Find out whether the gnus-visual TYPE is wanted. -(defun gnus-visual-p (&optional type class) - (and gnus-visual ; Has to be non-nil, at least. - (if (not type) ; We don't care about type. - gnus-visual - (if (listp gnus-visual) ; It's a list, so we check it. - (or (memq type gnus-visual) - (memq class gnus-visual)) - t)))) - -(defcustom gnus-mouse-face - (condition-case () - (if (gnus-visual-p 'mouse-face 'highlight) - (if (boundp 'gnus-mouse-face) - (or gnus-mouse-face 'highlight) - 'highlight) - 'default) - (error 'highlight)) - "*Face used for group or summary buffer mouse highlighting. -The line beneath the mouse pointer will be highlighted with this -face." - :group 'gnus-visual - :type 'face) - -(defcustom gnus-article-save-directory gnus-directory - "*Name of the directory articles will be saved in (default \"~/News\")." - :group 'gnus-article-saving - :type 'directory) - -(defvar gnus-plugged t - "Whether Gnus is plugged or not.") - -(defcustom gnus-default-charset 'iso-8859-1 - "Default charset assumed to be used when viewing non-ASCII characters. -This variable is overridden on a group-to-group basis by the -gnus-group-charset-alist variable and is only used on groups not -covered by that variable." - :type 'symbol - :group 'gnus-charset) - - -;;; Internal variables - -(defvar gnus-agent-gcc-header "X-Gnus-Agent-Gcc") -(defvar gnus-agent-meta-information-header "X-Gnus-Agent-Meta-Information") -(defvar gnus-draft-meta-information-header "X-Draft-From") -(defvar gnus-group-get-parameter-function 'gnus-group-get-parameter) -(defvar gnus-original-article-buffer " *Original Article*") -(defvar gnus-newsgroup-name nil) -(defvar gnus-ephemeral-servers nil) - -(defvar gnus-agent nil - "Whether we want to use the Gnus agent or not.") - -(defvar gnus-agent-fetching nil - "Whether Gnus agent is in fetching mode.") - -(defvar gnus-command-method nil - "Dynamically bound variable that says what the current backend is.") - -(defvar gnus-current-select-method nil - "The current method for selecting a newsgroup.") - -(defvar gnus-tree-buffer "*Tree*" - "Buffer where Gnus thread trees are displayed.") - -;; Dummy variable. -(defvar gnus-use-generic-from nil) - -;; Variable holding the user answers to all method prompts. -(defvar gnus-method-history nil) - -;; Variable holding the user answers to all mail method prompts. -(defvar gnus-mail-method-history nil) - -;; Variable holding the user answers to all group prompts. -(defvar gnus-group-history nil) - -(defvar gnus-server-alist nil - "List of available servers.") - -(defcustom gnus-cache-directory - (nnheader-concat gnus-directory "cache/") - "*The directory where cached articles will be stored." - :group 'gnus-cache - :type 'directory) - -(defvar gnus-predefined-server-alist - `(("cache" - nnspool "cache" - (nnspool-spool-directory ,gnus-cache-directory) - (nnspool-nov-directory ,gnus-cache-directory) - (nnspool-active-file - ,(nnheader-concat gnus-cache-directory "active")))) - "List of predefined (convenience) servers.") - -(defvar gnus-topic-indentation "");; Obsolete variable. - -(defconst gnus-article-mark-lists - '((marked . tick) (replied . reply) - (expirable . expire) (killed . killed) - (bookmarks . bookmark) (dormant . dormant) - (scored . score) (saved . save) - (cached . cache) (downloadable . download) - (unsendable . unsend) (forwarded . forward) - (recent . recent) (seen . seen))) - -(defconst gnus-article-special-mark-lists - '((seen range) - (bookmark tuple) - (score tuple))) - -(defvar gnus-headers-retrieved-by nil) -(defvar gnus-article-reply nil) -(defvar gnus-override-method nil) -(defvar gnus-article-check-size nil) -(defvar gnus-opened-servers nil) - -(defvar gnus-current-kill-article nil) - -(defvar gnus-have-read-active-file nil) - -(defconst gnus-maintainer - "semi-gnus-ja@meadowy.org (T-gnus Bugfixing Girls + Boys)" - "The mail address of the T-gnus maintainers.") - -(defcustom gnus-info-filename nil - "*Controls language of gnus Info. -If nil and current-language-environment is Japanese, go to gnus-ja. -Otherwise go to corresponding Info. -This variable can be nil, gnus or gnus-ja." - :group 'gnus-start - :type '(choice (const nil) - (const :tag "English" gnus) - (const :tag "Japanese" gnus-ja))) - -(defvar gnus-info-nodes - '((gnus-group-mode "Group Buffer") - (gnus-summary-mode "Summary Buffer") - (gnus-article-mode "Article Buffer") - (gnus-server-mode "Server Buffer") - (gnus-browse-mode "Browse Foreign Server") - (gnus-tree-mode "Tree Display")) - "Alist of major modes and related Info nodes.") - -(defvar gnus-group-buffer "*Group*") -(defvar gnus-summary-buffer "*Summary*") -(defvar gnus-article-buffer "*Article*") -(defvar gnus-server-buffer "*Server*") - -(defvar gnus-slave nil - "Whether this Gnus is a slave or not.") - -(defvar gnus-batch-mode nil - "Whether this Gnus is running in batch mode or not.") - -(defvar gnus-variable-list - '(gnus-newsrc-options gnus-newsrc-options-n - gnus-newsrc-last-checked-date - gnus-newsrc-alist gnus-server-alist - gnus-killed-list gnus-zombie-list - gnus-topic-topology gnus-topic-alist) - "Gnus variables saved in the quick startup file.") - -(defvar gnus-product-variable-file-list - (let ((version (product-version (product-find 'gnus-vers))) - (codesys (static-if (boundp 'MULE) '*ctext* 'ctext))) - `(("strict-cache" ((product-version ,version) (emacs-version)) - binary - gnus-format-specs-compiled) - ("cache" ((product-version ,version) (emacs-version)) - ,codesys - gnus-format-specs))) - "Gnus variables are saved in the produce depend quick startup files.") - -(defcustom gnus-compile-user-specs t - "If non-nil, the user-defined format specs will be byte-compiled -automatically. -It has an effect on the values of `gnus-*-line-format-spec'." - :group 'gnus - :type 'boolean) - -(defvar gnus-newsrc-alist nil - "Assoc list of read articles. -gnus-newsrc-hashtb should be kept so that both hold the same information.") - -(defvar gnus-newsrc-hashtb nil - "Hashtable of gnus-newsrc-alist.") - -(defvar gnus-killed-list nil - "List of killed newsgroups.") - -(defvar gnus-killed-hashtb nil - "Hash table equivalent of gnus-killed-list.") - -(defvar gnus-zombie-list nil - "List of almost dead newsgroups.") - -(defvar gnus-description-hashtb nil - "Descriptions of newsgroups.") - -(defvar gnus-list-of-killed-groups nil - "List of newsgroups that have recently been killed by the user.") - -(defvar gnus-active-hashtb nil - "Hashtable of active articles.") - -(defvar gnus-moderated-hashtb nil - "Hashtable of moderated newsgroups.") - -;; Save window configuration. -(defvar gnus-prev-winconf nil) - -(defvar gnus-reffed-article-number nil) - -;;; Let the byte-compiler know that we know about this variable. -(defvar rmail-default-rmail-file) - -(defvar gnus-dead-summary nil) - -(defvar gnus-invalid-group-regexp "[: `'\"/]\\|^$" - "Regexp matching invalid groups.") - -;;; End of variables. - -;; Define some autoload functions Gnus might use. -(eval-and-compile - - ;; This little mapcar goes through the list below and marks the - ;; symbols in question as autoloaded functions. - (mapcar - (lambda (package) - (let ((interactive (nth 1 (memq ':interactive package)))) - (mapcar - (lambda (function) - (let (keymap) - (when (consp function) - (setq keymap (car (memq 'keymap function))) - (setq function (car function))) - (unless (fboundp function) - (autoload function (car package) nil interactive keymap)))) - (if (eq (nth 1 package) ':interactive) - (nthcdr 3 package) - (cdr package))))) - '(("info" :interactive t Info-goto-node) - ("pp" pp-to-string) - ("ps-print" ps-print-preprint) - ("message" :interactive t - message-send-and-exit message-yank-original) - ("babel" babel-as-string) - ("nnmail" nnmail-split-fancy nnmail-article-group) - ("nnvirtual" nnvirtual-catchup-group nnvirtual-convert-headers) - ("rmailout" rmail-output rmail-output-to-rmail-file) - ("rmail" rmail-insert-rmail-file-header rmail-count-new-messages - rmail-show-message rmail-summary-exists - rmail-select-summary rmail-update-summary) - ("gnus-audio" :interactive t gnus-audio-play) - ("gnus-xmas" gnus-xmas-splash) - ("gnus-soup" :interactive t - gnus-group-brew-soup gnus-brew-soup gnus-soup-add-article - gnus-soup-send-replies gnus-soup-save-areas gnus-soup-pack-packet) - ("nnsoup" nnsoup-pack-replies) - ("score-mode" :interactive t gnus-score-mode) - ("gnus-mh" gnus-summary-save-article-folder - gnus-Folder-save-name gnus-folder-save-name) - ("gnus-mh" :interactive t gnus-summary-save-in-folder) - ("gnus-demon" gnus-demon-add-nocem gnus-demon-add-scanmail - gnus-demon-add-rescan gnus-demon-add-scan-timestamps - gnus-demon-add-disconnection gnus-demon-add-handler - gnus-demon-remove-handler) - ("gnus-demon" :interactive t - gnus-demon-init gnus-demon-cancel) - ("gnus-salt" gnus-highlight-selected-tree gnus-possibly-generate-tree - gnus-tree-open gnus-tree-close gnus-carpal-setup-buffer) - ("gnus-nocem" gnus-nocem-scan-groups gnus-nocem-close - gnus-nocem-unwanted-article-p) - ("gnus-srvr" gnus-enter-server-buffer gnus-server-set-info - gnus-server-server-name) - ("gnus-srvr" gnus-browse-foreign-server) - ("gnus-cite" :interactive t - gnus-article-highlight-citation gnus-article-hide-citation-maybe - gnus-article-hide-citation gnus-article-fill-cited-article - gnus-article-hide-citation-in-followups) - ("gnus-kill" gnus-kill gnus-apply-kill-file-internal - gnus-kill-file-edit-file gnus-kill-file-raise-followups-to-author - gnus-execute gnus-expunge gnus-batch-kill gnus-batch-score) - ("gnus-cache" gnus-cache-possibly-enter-article gnus-cache-save-buffers - gnus-cache-possibly-remove-articles gnus-cache-request-article - gnus-cache-retrieve-headers gnus-cache-possibly-alter-active - gnus-cache-enter-remove-article gnus-cached-article-p - gnus-cache-open gnus-cache-close gnus-cache-update-article - gnus-cache-articles-in-group) - ("gnus-cache" :interactive t gnus-jog-cache gnus-cache-enter-article - gnus-cache-remove-article gnus-summary-insert-cached-articles) - ("gnus-score" :interactive t - gnus-summary-increase-score gnus-summary-set-score - gnus-summary-raise-thread gnus-summary-raise-same-subject - gnus-summary-raise-score gnus-summary-raise-same-subject-and-select - gnus-summary-lower-thread gnus-summary-lower-same-subject - gnus-summary-lower-score gnus-summary-lower-same-subject-and-select - gnus-summary-current-score gnus-score-delta-default - gnus-score-flush-cache gnus-score-close - gnus-possibly-score-headers gnus-score-followup-article - gnus-score-followup-thread) - ("gnus-score" - (gnus-summary-score-map keymap) gnus-score-save gnus-score-headers - gnus-current-score-file-nondirectory gnus-score-adaptive - gnus-score-find-trace gnus-score-file-name) - ("gnus-cus" :interactive t gnus-custom-mode gnus-group-customize - gnus-score-customize) - ("gnus-topic" :interactive t gnus-topic-mode) - ("gnus-topic" gnus-topic-remove-group gnus-topic-set-parameters - gnus-subscribe-topics) - ("gnus-salt" :interactive t gnus-pick-mode gnus-binary-mode) - ("gnus-uu" (gnus-uu-extract-map keymap) (gnus-uu-mark-map keymap)) - ("gnus-uu" :interactive t - gnus-uu-digest-mail-forward gnus-uu-digest-post-forward - gnus-uu-mark-series gnus-uu-mark-region gnus-uu-mark-buffer - gnus-uu-mark-by-regexp gnus-uu-mark-all - gnus-uu-mark-sparse gnus-uu-mark-thread gnus-uu-decode-uu - gnus-uu-decode-uu-and-save gnus-uu-decode-unshar - gnus-uu-decode-unshar-and-save gnus-uu-decode-save - gnus-uu-decode-binhex gnus-uu-decode-uu-view - gnus-uu-decode-uu-and-save-view gnus-uu-decode-unshar-view - gnus-uu-decode-unshar-and-save-view gnus-uu-decode-save-view - gnus-uu-decode-binhex-view gnus-uu-unmark-thread - gnus-uu-mark-over gnus-uu-post-news) - ("gnus-uu" gnus-uu-delete-work-dir gnus-quote-arg-for-sh-or-csh - gnus-uu-unmark-thread) - ("gnus-msg" (gnus-summary-send-map keymap) - gnus-article-mail gnus-copy-article-buffer gnus-following-method) - ("gnus-msg" :interactive t - gnus-group-post-news gnus-group-mail gnus-summary-post-news - gnus-summary-followup gnus-summary-followup-with-original - gnus-summary-cancel-article gnus-summary-supersede-article - gnus-post-news gnus-summary-reply gnus-summary-reply-with-original - gnus-summary-mail-forward gnus-summary-mail-other-window - gnus-summary-resend-message gnus-summary-resend-bounced-mail - gnus-summary-wide-reply gnus-summary-followup-to-mail - gnus-summary-followup-to-mail-with-original gnus-bug - gnus-summary-wide-reply-with-original gnus-summary-post-forward - gnus-summary-digest-mail-forward gnus-summary-digest-post-forward) - ("gnus-picon" :interactive t gnus-article-display-picons - gnus-group-display-picons) - ("gnus-picon" gnus-picons-buffer-name) - ("gnus-gl" bbb-login bbb-logout bbb-grouplens-group-p - gnus-grouplens-mode) - ("smiley" :interactive t gnus-smiley-display) - ("gnus-win" gnus-configure-windows gnus-add-configuration) - ("gnus-sum" gnus-summary-insert-line gnus-summary-read-group - gnus-list-of-unread-articles gnus-list-of-read-articles - gnus-offer-save-summaries gnus-make-thread-indent-array - gnus-summary-exit gnus-update-read-articles gnus-summary-last-subject - gnus-summary-skip-intangible gnus-summary-article-number - gnus-data-header gnus-data-find gnus-summary-jump-to-other-group) - ("gnus-group" gnus-group-insert-group-line gnus-group-quit - gnus-group-list-groups gnus-group-first-unread-group - gnus-group-set-mode-line gnus-group-set-info gnus-group-save-newsrc - gnus-group-setup-buffer gnus-group-get-new-news - gnus-group-make-help-group gnus-group-update-group - gnus-group-iterate gnus-group-group-name) - ("gnus-bcklg" gnus-backlog-request-article gnus-backlog-enter-article - gnus-backlog-remove-article) - ("gnus-art" gnus-article-read-summary-keys gnus-article-save - gnus-article-prepare gnus-article-set-window-start - gnus-article-next-page gnus-article-prev-page - gnus-request-article-this-buffer gnus-article-mode - gnus-article-setup-buffer gnus-narrow-to-page - gnus-article-delete-invisible-text gnus-treat-article) - ("gnus-art" :interactive t - gnus-article-hide-headers gnus-article-hide-boring-headers - gnus-article-treat-overstrike - gnus-article-remove-cr gnus-article-remove-trailing-blank-lines - gnus-article-display-x-face - gnus-article-decode-HZ - gnus-article-wash-html - gnus-article-hide-pgp - gnus-article-hide-pem gnus-article-hide-signature - gnus-article-strip-leading-blank-lines gnus-article-date-local - gnus-article-date-original gnus-article-date-lapsed - gnus-article-show-all-headers gnus-article-show-all - gnus-article-edit-mode gnus-article-edit-article - gnus-article-edit-done article-decode-encoded-words - gnus-start-date-timer gnus-stop-date-timer - gnus-article-toggle-headers) - ("gnus-int" gnus-request-type) - ("gnus-start" gnus-newsrc-parse-options gnus-1 gnus-no-server-1 - gnus-dribble-enter gnus-read-init-file gnus-dribble-touch) - ("gnus-dup" gnus-dup-suppress-articles gnus-dup-unsuppress-article - gnus-dup-enter-articles) - ("gnus-range" gnus-copy-sequence) - ("gnus-eform" gnus-edit-form) - ("gnus-move" :interactive t - gnus-group-move-group-to-server gnus-change-server) - ("gnus-logic" gnus-score-advanced) - ("gnus-undo" gnus-undo-mode gnus-undo-register) - ("gnus-async" gnus-async-request-fetched-article gnus-async-prefetch-next - gnus-async-prefetch-article gnus-async-prefetch-remove-group - gnus-async-halt-prefetch) - ("gnus-offline" - gnus-offline-setup) - ("gnus-offline" :interactive t - gnus-offline-toggle-plugged - gnus-offline-set-unplugged-state - gnus-offline-toggle-auto-hangup - gnus-offline-toggle-on/off-send-mail - gnus-offline-toggle-articles-to-fetch - gnus-offline-set-interval-time - gnus-offline-agent-expire) - ("miee" :interactive t gnspool-get-news - mail-spool-send news-spool-post) - ("international/mw32misc" define-process-argument-editing - general-process-argument-editing-function) - ("gnus-agent" gnus-open-agent gnus-agent-get-function - gnus-agent-save-groups gnus-agent-save-active gnus-agent-method-p - gnus-agent-get-undownloaded-list gnus-agent-fetch-session - gnus-summary-set-agent-mark gnus-agent-save-group-info) - ("gnus-agent" :interactive t - gnus-unplugged gnus-agentize gnus-agent-batch) - ("gnus-vm" :interactive t gnus-summary-save-in-vm - gnus-summary-save-article-vm) - ("gnus-draft" :interactive t gnus-draft-mode gnus-group-send-drafts) - ("gnus-mlspl" gnus-group-split gnus-group-split-fancy) - ("gnus-mlspl" :interactive t gnus-group-split-setup - gnus-group-split-update)))) - -(eval-and-compile - (unless (featurep 'xemacs) - (if (>= emacs-major-version 21) - (autoload 'x-face-decode-message-header "x-face-e21") - (autoload 'gnus-smiley-display "gnus-bitmap" nil t) - (autoload 'smiley-toggle-buffer "gnus-bitmap") - (autoload 'x-face-mule-gnus-article-display-x-face "x-face-mule")))) - -(unless (and (fboundp 'base64-encode-string) - (subrp (symbol-function 'base64-encode-string))) - (require 'base64)) - -;; To make shimbun groups. -(autoload 'gnus-group-make-shimbun-group "nnshimbun" nil t) - -;; A tool for the developers. -(autoload 'find-cl-run-time-functions "gnus-clfns" nil t) - -;;; gnus-sum.el thingies - - -(defcustom gnus-summary-line-format "%U%R%z%I%(%[%4L: %-23,23n%]%) %s\n" - "*The format specification of the lines in the summary buffer. - -It works along the same lines as a normal formatting string, -with some simple extensions. - -%N Article number, left padded with spaces (string) -%S Subject (string) -%s Subject if it is at the root of a thread, and \"\" otherwise (string) -%n Name of the poster (string) -%a Extracted name of the poster (string) -%A Extracted address of the poster (string) -%F Contents of the From: header (string) -%f Contents of the From: or To: headers (string) -%x Contents of the Xref: header (string) -%D Date of the article (string) -%d Date of the article (string) in DD-MMM format -%o Date of the article (string) in YYYYMMDD`T'HHMMSS format -%M Message-id of the article (string) -%r References of the article (string) -%c Number of characters in the article (integer) -%L Number of lines in the article (integer) -%I Indentation based on thread level (a string of spaces) -%B A complex trn-style thread tree (string) - The variables `gnus-sum-thread-*' can be used for customization. -%T A string with two possible values: 80 spaces if the article - is on thread level two or larger and 0 spaces on level one -%R \"A\" if this article has been replied to, \" \" otherwise (character) -%U Status of this article (character, \"R\", \"K\", \"-\" or \" \") -%[ Opening bracket (character, \"[\" or \"<\") -%] Closing bracket (character, \"]\" or \">\") -%> Spaces of length thread-level (string) -%< Spaces of length (- 20 thread-level) (string) -%i Article score (number) -%z Article zcore (character) -%t Number of articles under the current thread (number). -%e Whether the thread is empty or not (character). -%l GroupLens score (string). -%V Total thread score (number). -%P The line number (number). -%O Download mark (character). -%u User defined specifier. The next character in the format string should - be a letter. Gnus will call the function gnus-user-format-function-X, - where X is the letter following %u. The function will be passed the - current header as argument. The function should return a string, which - will be inserted into the summary just like information from any other - summary specifier. - -Text between %( and %) will be highlighted with `gnus-mouse-face' -when the mouse point is placed inside the area. There can only be one -such area. - -The %U (status), %R (replied) and %z (zcore) specs have to be handled -with care. For reasons of efficiency, Gnus will compute what column -these characters will end up in, and \"hard-code\" that. This means that -it is invalid to have these specs after a variable-length spec. Well, -you might not be arrested, but your summary buffer will look strange, -which is bad enough. - -The smart choice is to have these specs as far to the left as -possible. - -This restriction may disappear in later versions of Gnus." - :type 'string - :group 'gnus-summary-format) - -;;; -;;; Skeleton keymaps -;;; - -(defun gnus-suppress-keymap (keymap) - (suppress-keymap keymap) - (let ((keys `([backspace] [delete] "\177" "\M-u"))) ;gnus-mouse-2 - (while keys - (define-key keymap (pop keys) 'undefined)))) - -(defvar gnus-article-mode-map - (let ((keymap (make-sparse-keymap))) - (gnus-suppress-keymap keymap) - keymap)) -(defvar gnus-summary-mode-map - (let ((keymap (make-keymap))) - (gnus-suppress-keymap keymap) - keymap)) -(defvar gnus-group-mode-map - (let ((keymap (make-keymap))) - (gnus-suppress-keymap keymap) - keymap)) - - - -;; Fix by Hallvard B Furuseth . -;; If you want the cursor to go somewhere else, set these two -;; functions in some startup hook to whatever you want. -(defalias 'gnus-summary-position-point 'gnus-goto-colon) -(defalias 'gnus-group-position-point 'gnus-goto-colon) - -;;; Various macros and substs. - -(defun gnus-header-from (header) - (mail-header-from header)) - -(defmacro gnus-gethash (string hashtable) - "Get hash value of STRING in HASHTABLE." - `(symbol-value (intern-soft ,string ,hashtable))) - -(defmacro gnus-sethash (string value hashtable) - "Set hash value. Arguments are STRING, VALUE, and HASHTABLE." - `(set (intern ,string ,hashtable) ,value)) -(put 'gnus-sethash 'edebug-form-spec '(form form form)) - -(defmacro gnus-group-unread (group) - "Get the currently computed number of unread articles in GROUP." - `(car (gnus-gethash ,group gnus-newsrc-hashtb))) - -(defmacro gnus-group-entry (group) - "Get the newsrc entry for GROUP." - `(gnus-gethash ,group gnus-newsrc-hashtb)) - -(defmacro gnus-active (group) - "Get active info on GROUP." - `(gnus-gethash ,group gnus-active-hashtb)) - -(defmacro gnus-set-active (group active) - "Set GROUP's active info." - `(gnus-sethash ,group ,active gnus-active-hashtb)) - -;; Info access macros. - -(defmacro gnus-info-group (info) - `(nth 0 ,info)) -(defmacro gnus-info-rank (info) - `(nth 1 ,info)) -(defmacro gnus-info-read (info) - `(nth 2 ,info)) -(defmacro gnus-info-marks (info) - `(nth 3 ,info)) -(defmacro gnus-info-method (info) - `(nth 4 ,info)) -(defmacro gnus-info-params (info) - `(nth 5 ,info)) - -(defmacro gnus-info-level (info) - `(let ((rank (gnus-info-rank ,info))) - (if (consp rank) - (car rank) - rank))) -(defmacro gnus-info-score (info) - `(let ((rank (gnus-info-rank ,info))) - (or (and (consp rank) (cdr rank)) 0))) - -(defmacro gnus-info-set-group (info group) - `(setcar ,info ,group)) -(defmacro gnus-info-set-rank (info rank) - `(setcar (nthcdr 1 ,info) ,rank)) -(defmacro gnus-info-set-read (info read) - `(setcar (nthcdr 2 ,info) ,read)) -(defmacro gnus-info-set-marks (info marks &optional extend) - (if extend - `(gnus-info-set-entry ,info ,marks 3) - `(setcar (nthcdr 3 ,info) ,marks))) -(defmacro gnus-info-set-method (info method &optional extend) - (if extend - `(gnus-info-set-entry ,info ,method 4) - `(setcar (nthcdr 4 ,info) ,method))) -(defmacro gnus-info-set-params (info params &optional extend) - (if extend - `(gnus-info-set-entry ,info ,params 5) - `(setcar (nthcdr 5 ,info) ,params))) - -(defun gnus-info-set-entry (info entry number) - ;; Extend the info until we have enough elements. - (while (<= (length info) number) - (nconc info (list nil))) - ;; Set the entry. - (setcar (nthcdr number info) entry)) - -(defmacro gnus-info-set-level (info level) - `(let ((rank (cdr ,info))) - (if (consp (car rank)) - (setcar (car rank) ,level) - (setcar rank ,level)))) -(defmacro gnus-info-set-score (info score) - `(let ((rank (cdr ,info))) - (if (consp (car rank)) - (setcdr (car rank) ,score) - (setcar rank (cons (car rank) ,score))))) - -(defmacro gnus-get-info (group) - `(nth 2 (gnus-gethash ,group gnus-newsrc-hashtb))) - -;;; Load the compatability functions. - -(require 'gnus-ems) - - -;;; -;;; Shutdown -;;; - -(defvar gnus-shutdown-alist nil) - -(defun gnus-add-shutdown (function &rest symbols) - "Run FUNCTION whenever one of SYMBOLS is shut down." - (push (cons function symbols) gnus-shutdown-alist)) - -(defun gnus-shutdown (symbol) - "Shut down everything that waits for SYMBOL." - (let ((alist gnus-shutdown-alist) - entry) - (while (setq entry (pop alist)) - (when (memq symbol (cdr entry)) - (funcall (car entry)))))) - - -;;; -;;; Gnus Utility Functions -;;; - - -(defmacro gnus-string-or (&rest strings) - "Return the first element of STRINGS that is a non-blank string. -STRINGS will be evaluated in normal `or' order." - `(gnus-string-or-1 ',strings)) - -(defun gnus-string-or-1 (strings) - (let (string) - (while strings - (setq string (eval (pop strings))) - (if (string-match "^[ \t]*$" string) - (setq string nil) - (setq strings nil))) - string)) - -(defun gnus-info-find-node (&optional nodename) - "Find Info documentation of Gnus." - (interactive) - ;; Enlarge info window if needed. - (let (gnus-info-buffer) - (Info-goto-node - (format "(%s)%s" - (or gnus-info-filename - (get-language-info current-language-environment 'gnus-info) - "gnus") - (or nodename - (cadr (assq major-mode gnus-info-nodes)) - (and (eq (current-buffer) (get-buffer gnus-article-buffer)) - (cadr (assq 'gnus-article-mode gnus-info-nodes)))))) - (setq gnus-info-buffer (current-buffer)) - (gnus-configure-windows 'info))) - -;;; -;;; gnus-interactive -;;; - -(defvar gnus-current-prefix-symbol nil - "Current prefix symbol.") - -(defvar gnus-current-prefix-symbols nil - "List of current prefix symbols.") - -(defun gnus-interactive (string &optional params) - "Return a list that can be fed to `interactive'. -See `interactive' for full documentation. - -Adds the following specs: - -y -- The current symbolic prefix. -Y -- A list of the current symbolic prefix(es). -A -- Article number. -H -- Article header. -g -- Group name." - (let ((i 0) - out c prompt) - (while (< i (length string)) - (string-match ".\\([^\n]*\\)\n?" string i) - (setq c (aref string i)) - (when (match-end 1) - (setq prompt (match-string 1 string))) - (setq i (match-end 0)) - ;; We basically emulate just about everything that - ;; `interactive' does, but add the specs listed above. - (push - (cond - ((= c ?a) - (completing-read prompt obarray 'fboundp t)) - ((= c ?b) - (read-buffer prompt (current-buffer) t)) - ((= c ?B) - (read-buffer prompt (other-buffer (current-buffer)))) - ((= c ?c) - (read-char)) - ((= c ?C) - (completing-read prompt obarray 'commandp t)) - ((= c ?d) - (point)) - ((= c ?D) - (read-file-name prompt nil default-directory 'lambda)) - ((= c ?f) - (read-file-name prompt nil nil 'lambda)) - ((= c ?F) - (read-file-name prompt)) - ((= c ?k) - (read-key-sequence prompt)) - ((= c ?K) - (error "Not implemented spec")) - ((= c ?e) - (error "Not implemented spec")) - ((= c ?m) - (mark)) - ((= c ?N) - (error "Not implemented spec")) - ((= c ?n) - (string-to-number (read-from-minibuffer prompt))) - ((= c ?p) - (prefix-numeric-value current-prefix-arg)) - ((= c ?P) - current-prefix-arg) - ((= c ?r) - 'gnus-prefix-nil) - ((= c ?s) - (read-string prompt)) - ((= c ?S) - (intern (read-string prompt))) - ((= c ?v) - (read-variable prompt)) - ((= c ?x) - (read-minibuffer prompt)) - ((= c ?x) - (eval-minibuffer prompt)) - ;; And here the new specs come. - ((= c ?y) - gnus-current-prefix-symbol) - ((= c ?Y) - gnus-current-prefix-symbols) - ((= c ?g) - (gnus-group-group-name)) - ((= c ?A) - (gnus-summary-skip-intangible) - (or (get-text-property (point) 'gnus-number) - (gnus-summary-last-subject))) - ((= c ?H) - (gnus-data-header (gnus-data-find (gnus-summary-article-number)))) - (t - (error "Non-implemented spec"))) - out) - (cond - ((= c ?r) - (push (if (< (point) (mark)) (point) (mark)) out) - (push (if (> (point) (mark)) (point) (mark)) out)))) - (setq out (delq 'gnus-prefix-nil out)) - (nreverse out))) - -(defun gnus-symbolic-argument (&optional arg) - "Read a symbolic argument and a command, and then execute command." - (interactive "P") - (let* ((in-command (this-command-keys)) - (command in-command) - gnus-current-prefix-symbols - gnus-current-prefix-symbol - syms) - (while (equal in-command command) - (message "%s-" (key-description (this-command-keys))) - (push (intern (char-to-string (read-char))) syms) - (setq command (read-key-sequence nil t))) - (setq gnus-current-prefix-symbols (nreverse syms) - gnus-current-prefix-symbol (car gnus-current-prefix-symbols)) - (call-interactively (key-binding command t)))) - -;;; More various functions. - -(defsubst gnus-check-backend-function (func group) - "Check whether GROUP supports function FUNC. -GROUP can either be a string (a group name) or a select method." - (ignore-errors - (let ((method (if (stringp group) - (car (gnus-find-method-for-group group)) - group))) - (unless (featurep method) - (require method)) - (fboundp (intern (format "%s-%s" method func)))))) - -(defun gnus-group-read-only-p (&optional group) - "Check whether GROUP supports editing or not. -If GROUP is nil, `gnus-newsgroup-name' will be checked instead. Note -that that variable is buffer-local to the summary buffers." - (let ((group (or group gnus-newsgroup-name))) - (not (gnus-check-backend-function 'request-replace-article group)))) - -(defun gnus-virtual-group-p (group) - "Say whether GROUP is virtual or not." - (memq 'virtual (assoc (symbol-name (car (gnus-find-method-for-group group))) - gnus-valid-select-methods))) - -(defun gnus-news-group-p (group &optional article) - "Return non-nil if GROUP (and ARTICLE) come from a news server." - (or (gnus-member-of-valid 'post group) ; Ordinary news group. - (and (gnus-member-of-valid 'post-mail group) ; Combined group. - (if (or (null article) - (not (< article 0))) - (eq (gnus-request-type group article) 'news) - (if (not (vectorp article)) - nil - ;; It's a real article. - (eq (gnus-request-type group (mail-header-id article)) - 'news)))))) - -;; Returns a list of writable groups. -(defun gnus-writable-groups () - (let ((alist gnus-newsrc-alist) - groups group) - (while (setq group (car (pop alist))) - (unless (gnus-group-read-only-p group) - (push group groups))) - (nreverse groups))) - -;; Check whether to use long file names. -(defun gnus-use-long-file-name (symbol) - ;; The variable has to be set... - (and gnus-use-long-file-name - ;; If it isn't a list, then we return t. - (or (not (listp gnus-use-long-file-name)) - ;; If it is a list, and the list contains `symbol', we - ;; return nil. - (not (memq symbol gnus-use-long-file-name))))) - -;; Generate a unique new group name. -(defun gnus-generate-new-group-name (leaf) - (let ((name leaf) - (num 0)) - (while (gnus-gethash name gnus-newsrc-hashtb) - (setq name (concat leaf "<" (int-to-string (setq num (1+ num))) ">"))) - name)) - -(defun gnus-ephemeral-group-p (group) - "Say whether GROUP is ephemeral or not." - (gnus-group-get-parameter group 'quit-config t)) - -(defun gnus-group-quit-config (group) - "Return the quit-config of GROUP." - (gnus-group-get-parameter group 'quit-config t)) - -(defun gnus-kill-ephemeral-group (group) - "Remove ephemeral GROUP from relevant structures." - (gnus-sethash group nil gnus-newsrc-hashtb)) - -(defun gnus-simplify-mode-line () - "Make mode lines a bit simpler." - (setq mode-line-modified (cdr gnus-mode-line-modified)) - (when (listp mode-line-format) - (make-local-variable 'mode-line-format) - (setq mode-line-format (copy-sequence mode-line-format)) - (when (equal (nth 3 mode-line-format) " ") - (setcar (nthcdr 3 mode-line-format) " ")))) - -;;; Servers and groups. - -(defsubst gnus-server-add-address (method) - (let ((method-name (symbol-name (car method)))) - (if (and (memq 'address (assoc method-name gnus-valid-select-methods)) - (not (assq (intern (concat method-name "-address")) method)) - (memq 'physical-address (assq (car method) - gnus-valid-select-methods))) - (append method (list (list (intern (concat method-name "-address")) - (nth 1 method)))) - method))) - -(defsubst gnus-server-get-method (group method) - ;; Input either a server name, and extended server name, or a - ;; select method, and return a select method. - (cond ((stringp method) - (gnus-server-to-method method)) - ((equal method gnus-select-method) - gnus-select-method) - ((and (stringp (car method)) - group) - (gnus-server-extend-method group method)) - ((and method - (not group) - (equal (cadr method) "")) - method) - (t - (gnus-server-add-address method)))) - -(defun gnus-server-to-method (server) - "Map virtual server names to select methods." - (or - ;; Is this a method, perhaps? - (and server (listp server) server) - ;; Perhaps this is the native server? - (and (equal server "native") gnus-select-method) - ;; It should be in the server alist. - (cdr (assoc server gnus-server-alist)) - ;; It could be in the predefined server alist. - (cdr (assoc server gnus-predefined-server-alist)) - ;; If not, we look through all the opened server - ;; to see whether we can find it there. - (let ((opened gnus-opened-servers)) - (while (and opened - (not (equal server (format "%s:%s" (caaar opened) - (cadaar opened))))) - (pop opened)) - (caar opened)) - ;; It could be a named method, search all servers - (let ((servers gnus-secondary-select-methods)) - (while (and servers - (not (equal server (format "%s:%s" (caar servers) - (cadar servers))))) - (pop servers)) - (car servers)))) - -(defmacro gnus-method-equal (ss1 ss2) - "Say whether two servers are equal." - `(let ((s1 ,ss1) - (s2 ,ss2)) - (or (equal s1 s2) - (and (= (length s1) (length s2)) - (progn - (while (and s1 (member (car s1) s2)) - (setq s1 (cdr s1))) - (null s1)))))) - -(defun gnus-methods-equal-p (m1 m2) - (let ((m1 (or m1 gnus-select-method)) - (m2 (or m2 gnus-select-method))) - (or (equal m1 m2) - (and (eq (car m1) (car m2)) - (or (not (memq 'address (assoc (symbol-name (car m1)) - gnus-valid-select-methods))) - (equal (nth 1 m1) (nth 1 m2))))))) - -(defun gnus-server-equal (m1 m2) - "Say whether two methods are equal." - (let ((m1 (cond ((null m1) gnus-select-method) - ((stringp m1) (gnus-server-to-method m1)) - (t m1))) - (m2 (cond ((null m2) gnus-select-method) - ((stringp m2) (gnus-server-to-method m2)) - (t m2)))) - (gnus-method-equal m1 m2))) - -(defun gnus-servers-using-backend (backend) - "Return a list of known servers using BACKEND." - (let ((opened gnus-opened-servers) - out) - (while opened - (when (eq backend (caaar opened)) - (push (caar opened) out)) - (pop opened)) - out)) - -(defun gnus-archive-server-wanted-p () - "Say whether the user wants to use the archive server." - (cond - ((or (not gnus-message-archive-method) - (not gnus-message-archive-group)) - nil) - ((and gnus-message-archive-method gnus-message-archive-group) - t) - (t - (let ((active (cadr (assq 'nnfolder-active-file - gnus-message-archive-method)))) - (and active - (file-exists-p active)))))) - -(defsubst gnus-method-to-server-name (method) - (concat - (format "%s" (car method)) - (when (and - (or (assoc (format "%s" (car method)) - (gnus-methods-using 'address)) - (gnus-server-equal method gnus-message-archive-method)) - (nth 1 method) - (not (string= (nth 1 method) ""))) - (concat "+" (nth 1 method))))) - -(defun gnus-group-prefixed-name (group method) - "Return the whole name from GROUP and METHOD." - (and (stringp method) (setq method (gnus-server-to-method method))) - (if (or (not method) - (gnus-server-equal method "native")) - group - (concat (gnus-method-to-server-name method) ":" group))) - -(defun gnus-group-real-prefix (group) - "Return the prefix of the current group name." - (if (string-match "^[^:]+:" group) - (substring group 0 (match-end 0)) - "")) - -(defun gnus-group-method (group) - "Return the server or method used for selecting GROUP. -You should probably use `gnus-find-method-for-group' instead." - (let ((prefix (gnus-group-real-prefix group))) - (if (equal prefix "") - gnus-select-method - (let ((servers gnus-opened-servers) - (server "") - backend possible found) - (if (string-match "^[^\\+]+\\+" prefix) - (setq backend (intern (substring prefix 0 (1- (match-end 0)))) - server (substring prefix (match-end 0) (1- (length prefix)))) - (setq backend (intern (substring prefix 0 (1- (length prefix)))))) - (while servers - (when (eq (caaar servers) backend) - (setq possible (caar servers)) - (when (equal (cadaar servers) server) - (setq found (caar servers)))) - (pop servers)) - (or (car (rassoc found gnus-server-alist)) - found - (car (rassoc possible gnus-server-alist)) - possible - (list backend server)))))) - -(defsubst gnus-native-method-p (method) - "Return whether METHOD is the native select method." - (gnus-method-equal method gnus-select-method)) - -(defsubst gnus-secondary-method-p (method) - "Return whether METHOD is a secondary select method." - (let ((methods gnus-secondary-select-methods) - (gmethod (gnus-server-get-method nil method))) - (while (and methods - (not (gnus-method-equal - (gnus-server-get-method nil (car methods)) - gmethod))) - (setq methods (cdr methods))) - methods)) - -(defun gnus-method-simplify (method) - "Return the shortest uniquely identifying string or method for METHOD." - (cond ((stringp method) - method) - ((gnus-native-method-p method) - nil) - ((gnus-secondary-method-p method) - (format "%s:%s" (nth 0 method) (nth 1 method))) - (t - method))) - -(defun gnus-groups-from-server (server) - "Return a list of all groups that are fetched from SERVER." - (let ((alist (cdr gnus-newsrc-alist)) - info groups) - (while (setq info (pop alist)) - (when (gnus-server-equal (gnus-info-method info) server) - (push (gnus-info-group info) groups))) - (sort groups 'string<))) - -(defun gnus-group-foreign-p (group) - "Say whether a group is foreign or not." - (and (not (gnus-group-native-p group)) - (not (gnus-group-secondary-p group)))) - -(defun gnus-group-native-p (group) - "Say whether the group is native or not." - (not (string-match ":" group))) - -(defun gnus-group-secondary-p (group) - "Say whether the group is secondary or not." - (gnus-secondary-method-p (gnus-find-method-for-group group))) - -(defun gnus-parameters-get-parameter (group) - "Return the group parameters for GROUP from `gnus-parameters'." - (let (params-list) - (dolist (elem gnus-parameters) - (when (string-match (car elem) group) - (setq params-list - (nconc (gnus-expand-group-parameters - (car elem) (cdr elem) group) - params-list)))) - params-list)) - -(defun gnus-expand-group-parameters (match parameters group) - "Go through PARAMETERS and expand them according to the match data." - (let (new) - (dolist (elem parameters) - (if (and (stringp (cdr elem)) - (string-match "\\\\" (cdr elem))) - (push (cons (car elem) - (with-temp-buffer - (insert group) - (goto-char (point-min)) - (while (re-search-forward match nil t) - (replace-match (cdr elem))) - (buffer-string))) - new) - (push elem new))) - new)) - -(defun gnus-group-find-parameter (group &optional symbol allow-list) - "Return the group parameters for GROUP. -If SYMBOL, return the value of that symbol in the group parameters." - (save-excursion - (set-buffer gnus-group-buffer) - (let ((parameters - (nconc - (copy-sequence - (funcall gnus-group-get-parameter-function group)) - (gnus-parameters-get-parameter group)))) - (if symbol - (gnus-group-parameter-value parameters symbol allow-list) - parameters)))) - -(defun gnus-group-get-parameter (group &optional symbol allow-list) - "Return the group parameters for GROUP. -If SYMBOL, return the value of that symbol in the group parameters. -Most functions should use `gnus-group-find-parameter', which -also examines the topic parameters." - (let ((params (gnus-info-params (gnus-get-info group)))) - (if symbol - (gnus-group-parameter-value params symbol allow-list) - params))) - -(defun gnus-group-parameter-value (params symbol &optional allow-list) - "Return the value of SYMBOL in group PARAMS." - ;; We only wish to return group parameters (dotted lists) and - ;; not local variables, which may have the same names. - ;; But first we handle single elements... - (or (car (memq symbol params)) - ;; Handle alist. - (let (elem) - (catch 'found - (while (setq elem (pop params)) - (when (and (consp elem) - (eq (car elem) symbol) - (or allow-list - (atom (cdr elem)))) - (throw 'found (cdr elem)))))))) - -(defun gnus-group-add-parameter (group param) - "Add parameter PARAM to GROUP." - (let ((info (gnus-get-info group))) - (when info - (gnus-group-remove-parameter group (if (consp param) (car param) param)) - ;; Cons the new param to the old one and update. - (gnus-group-set-info (cons param (gnus-info-params info)) - group 'params)))) - -(defun gnus-group-set-parameter (group name value) - "Set parameter NAME to VALUE in GROUP." - (let ((info (gnus-get-info group))) - (when info - (gnus-group-remove-parameter group name) - (let ((old-params (gnus-info-params info)) - (new-params (list (cons name value)))) - (while old-params - (when (or (not (listp (car old-params))) - (not (eq (caar old-params) name))) - (setq new-params (append new-params (list (car old-params))))) - (setq old-params (cdr old-params))) - (gnus-group-set-info new-params group 'params))))) - -(defun gnus-group-remove-parameter (group name) - "Remove parameter NAME from GROUP." - (let ((info (gnus-get-info group))) - (when info - (let ((params (gnus-info-params info))) - (when params - (setq params (delq name params)) - (while (assq name params) - (gnus-pull name params)) - (gnus-info-set-params info params)))))) - -(defun gnus-group-add-score (group &optional score) - "Add SCORE to the GROUP score. -If SCORE is nil, add 1 to the score of GROUP." - (let ((info (gnus-get-info group))) - (when info - (gnus-info-set-score info (+ (gnus-info-score info) (or score 1)))))) - -(defun gnus-short-group-name (group &optional levels) - "Collapse GROUP name LEVELS. -Select methods are stripped and any remote host name is stripped down to -just the host name." - (let* ((name "") - (foreign "") - (depth 0) - (skip 1) - (levels (or levels - gnus-group-uncollapsed-levels - (progn - (while (string-match "\\." group skip) - (setq skip (match-end 0) - depth (+ depth 1))) - depth)))) - ;; Separate foreign select method from group name and collapse. - ;; If method contains a server, collapse to non-domain server name, - ;; otherwise collapse to select method. - (let* ((colon (string-match ":" group)) - (server (and colon (substring group 0 colon))) - (plus (and server (string-match "+" server)))) - (when server - (if plus - (setq foreign (substring server (+ 1 plus) - (string-match "\\." server)) - group (substring group (+ 1 colon))) - (setq foreign server - group (substring group (+ 1 colon)))) - (setq foreign (concat foreign ":"))) - ;; Collapse group name leaving LEVELS uncollapsed elements - (let* ((slist (split-string group "/")) - (slen (length slist)) - (dlist (split-string group "\\.")) - (dlen (length dlist)) - glist - glen - gsep - res) - (if (> slen dlen) - (setq glist slist - glen slen - gsep "/") - (setq glist dlist - glen dlen - gsep ".")) - (setq levels (- glen levels)) - (dolist (g glist) - (push (if (>= (decf levels) 0) - (if (zerop (length g)) - "" - (substring g 0 1)) - g) - res)) - (concat foreign (mapconcat 'identity (nreverse res) gsep)))))) - -(defun gnus-narrow-to-body () - "Narrow to the body of an article." - (narrow-to-region - (progn - (goto-char (point-min)) - (or (search-forward "\n\n" nil t) - (point-max))) - (point-max))) - - -;;; -;;; Kill file handling. -;;; - -(defun gnus-apply-kill-file () - "Apply a kill file to the current newsgroup. -Returns the number of articles marked as read." - (if (or (file-exists-p (gnus-newsgroup-kill-file nil)) - (file-exists-p (gnus-newsgroup-kill-file gnus-newsgroup-name))) - (gnus-apply-kill-file-internal) - 0)) - -(defun gnus-kill-save-kill-buffer () - (let ((file (gnus-newsgroup-kill-file gnus-newsgroup-name))) - (when (get-file-buffer file) - (save-excursion - (set-buffer (get-file-buffer file)) - (when (buffer-modified-p) - (save-buffer)) - (kill-buffer (current-buffer)))))) - -(defcustom gnus-kill-file-name "KILL" - "Suffix of the kill files." - :group 'gnus-score-kill - :group 'gnus-score-files - :type 'string) - -(defun gnus-newsgroup-kill-file (newsgroup) - "Return the name of a kill file name for NEWSGROUP. -If NEWSGROUP is nil, return the global kill file name instead." - (cond - ;; The global KILL file is placed at top of the directory. - ((or (null newsgroup) - (string-equal newsgroup "")) - (expand-file-name gnus-kill-file-name - gnus-kill-files-directory)) - ;; Append ".KILL" to newsgroup name. - ((gnus-use-long-file-name 'not-kill) - (expand-file-name (concat (gnus-newsgroup-savable-name newsgroup) - "." gnus-kill-file-name) - gnus-kill-files-directory)) - ;; Place "KILL" under the hierarchical directory. - (t - (expand-file-name (concat (gnus-newsgroup-directory-form newsgroup) - "/" gnus-kill-file-name) - gnus-kill-files-directory)))) - -;;; Server things. - -(defun gnus-member-of-valid (symbol group) - "Find out if GROUP has SYMBOL as part of its \"valid\" spec." - (memq symbol (assoc - (symbol-name (car (gnus-find-method-for-group group))) - gnus-valid-select-methods))) - -(defun gnus-method-option-p (method option) - "Return non-nil if select METHOD has OPTION as a parameter." - (when (stringp method) - (setq method (gnus-server-to-method method))) - (memq option (assoc (format "%s" (car method)) - gnus-valid-select-methods))) - -(defun gnus-similar-server-opened (method) - (let ((opened gnus-opened-servers)) - (while (and method opened) - (when (and (equal (cadr method) (cadaar opened)) - (equal (car method) (caaar opened)) - (not (equal method (caar opened)))) - (setq method nil)) - (pop opened)) - (not method))) - -(defun gnus-server-extend-method (group method) - ;; This function "extends" a virtual server. If the server is - ;; "hello", and the select method is ("hello" (my-var "something")) - ;; in the group "alt.alt", this will result in a new virtual server - ;; called "hello+alt.alt". - (if (or (not (inline (gnus-similar-server-opened method))) - (not (cddr method))) - method - `(,(car method) ,(concat (cadr method) "+" group) - (,(intern (format "%s-address" (car method))) ,(cadr method)) - ,@(cddr method)))) - -(defun gnus-server-status (method) - "Return the status of METHOD." - (nth 1 (assoc method gnus-opened-servers))) - -(defun gnus-group-name-to-method (group) - "Guess a select method based on GROUP." - (if (string-match ":" group) - (let ((server (substring group 0 (match-beginning 0)))) - (if (string-match "\\+" server) - (list (intern (substring server 0 (match-beginning 0))) - (substring server (match-end 0))) - (list (intern server) ""))) - gnus-select-method)) - -(defun gnus-server-string (server) - "Return a readable string that describes SERVER." - (let* ((server (gnus-server-to-method server)) - (address (nth 1 server))) - (if (and address - (not (zerop (length address)))) - (format "%s via %s" address (car server)) - (format "%s" (car server))))) - -(defun gnus-find-method-for-group (group &optional info) - "Find the select method that GROUP uses." - (or gnus-override-method - (and (not group) - gnus-select-method) - (and (not (gnus-group-entry group));; a new group - (gnus-group-name-to-method group)) - (let ((info (or info (gnus-get-info group))) - method) - (if (or (not info) - (not (setq method (gnus-info-method info))) - (equal method "native")) - gnus-select-method - (setq method - (cond ((stringp method) - (inline (gnus-server-to-method method))) - ((stringp (cadr method)) - (inline (gnus-server-extend-method group method))) - (t - method))) - (cond ((equal (cadr method) "") - method) - ((null (cadr method)) - (list (car method) "")) - (t - (gnus-server-add-address method))))))) - -(defun gnus-methods-using (feature) - "Find all methods that have FEATURE." - (let ((valids gnus-valid-select-methods) - outs) - (while valids - (when (memq feature (car valids)) - (push (car valids) outs)) - (setq valids (cdr valids))) - outs)) - -(defun gnus-read-group (prompt &optional default) - "Prompt the user for a group name. -Disallow invalid group names." - (let ((prefix "") - group) - (while (not group) - (when (string-match - gnus-invalid-group-regexp - (setq group (read-string (concat prefix prompt) - (cons (or default "") 0) - 'gnus-group-history))) - (setq prefix (format "Invalid group name: \"%s\". " group) - group nil))) - group)) - -(defun gnus-read-method (prompt) - "Prompt the user for a method. -Allow completion over sensible values." - (let* ((open-servers - (mapcar (lambda (i) (cons (format "%s:%s" (caar i) (cadar i)) i)) - gnus-opened-servers)) - (valid-methods - (let (methods) - (dolist (method gnus-valid-select-methods) - (if (or (memq 'prompt-address method) - (not (assoc (format "%s:" (car method)) open-servers))) - (push method methods))) - methods)) - (servers - (append valid-methods - open-servers - gnus-predefined-server-alist - gnus-server-alist)) - (method - (completing-read - prompt servers - nil t nil 'gnus-method-history))) - (cond - ((equal method "") - (setq method gnus-select-method)) - ((assoc method gnus-valid-select-methods) - (let ((address (if (memq 'prompt-address - (assoc method gnus-valid-select-methods)) - (read-string "Address: ") - ""))) - (or (cadr (assoc (format "%s:%s" method address) open-servers)) - (list (intern method) address)))) - ((assoc method servers) - method) - (t - (list (intern method) ""))))) - -;;; User-level commands. - -;;;###autoload -(defun gnus-slave-no-server (&optional arg) - "Read network news as a slave, without connecting to local server." - (interactive "P") - (gnus-no-server arg t)) - -;;;###autoload -(defun gnus-no-server (&optional arg slave) - "Read network news. -If ARG is a positive number, Gnus will use that as the -startup level. If ARG is nil, Gnus will be started at level 2. -If ARG is non-nil and not a positive number, Gnus will -prompt the user for the name of an NNTP server to use. -As opposed to `gnus', this command will not connect to the local server." - (interactive "P") - (gnus-no-server-1 arg slave)) - -;;;###autoload -(defun gnus-slave (&optional arg) - "Read news as a slave." - (interactive "P") - (gnus arg nil 'slave)) - -(defcustom gnus-frame-properties nil - "The properties of the frame in which gnus is displayed. Under XEmacs, -the variable `toolbar-news-frame-plist' will be refered instead." - :type '(repeat (cons :format "%v" - (symbol :tag "Parameter") - (sexp :tag "Value"))) - :group 'gnus) - -(defvar gnus-frame nil - "The frame in which gnus is displayed. It is not used under XEmacs.") - -;;;###autoload -(defun gnus-other-frame (&optional arg) - "Pop up a frame to read news." - (interactive "P") - (static-if (featurep 'xemacs) - (let ((toolbar-news-use-separate-frame t)) - (toolbar-gnus)) - (if (frame-live-p gnus-frame) - (raise-frame gnus-frame) - (setq gnus-frame (make-frame gnus-frame-properties)) - (if (and (gnus-buffer-live-p gnus-group-buffer) - (save-current-buffer - (set-buffer gnus-group-buffer) - (eq 'gnus-group-mode major-mode))) - (progn - (select-frame gnus-frame) - (switch-to-buffer gnus-group-buffer)) - (add-hook 'gnus-exit-gnus-hook - (lambda () - (when (and (frame-live-p gnus-frame) - (cdr (frame-list))) - (delete-frame gnus-frame)) - (setq gnus-frame nil))) - (select-frame gnus-frame) - (gnus arg))))) - -;;;###autoload -(defun gnus (&optional arg dont-connect slave) - "Read network news. -If ARG is non-nil and a positive number, Gnus will use that as the -startup level. If ARG is non-nil and not a positive number, Gnus will -prompt the user for the name of an NNTP server to use." - (interactive "P") - (gnus-1 arg dont-connect slave)) - -;; Allow redefinition of Gnus functions. - -(gnus-ems-redefine) - -(product-provide (provide 'gnus) 'gnus-vers) - -;;; gnus.el ends here diff --git a/lisp/ietf-drums.el b/lisp/ietf-drums.el deleted file mode 100644 index b39decb..0000000 --- a/lisp/ietf-drums.el +++ /dev/null @@ -1,250 +0,0 @@ -;;; ietf-drums.el --- Functions for parsing RFC822bis headers -;; Copyright (C) 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; DRUMS is an IETF Working Group that works (or worked) on the -;; successor to RFC822, "Standard For The Format Of Arpa Internet Text -;; Messages". This library is based on -;; draft-ietf-drums-msg-fmt-05.txt, released on 1998-08-05. - -;;; Code: - -(eval-when-compile (require 'cl)) -(require 'time-date) -(require 'mm-util) - -(defvar ietf-drums-no-ws-ctl-token "\001-\010\013\014\016-\037\177" - "US-ASCII control characters excluding CR, LF and white space.") -(defvar ietf-drums-text-token "\001-\011\013\014\016-\177" - "US-ASCII characters exlcuding CR and LF.") -(defvar ietf-drums-specials-token "()<>[]:;@\\,.\"" - "Special characters.") -(defvar ietf-drums-quote-token "\\" - "Quote character.") -(defvar ietf-drums-wsp-token " \t" - "White space.") -(defvar ietf-drums-fws-regexp - (concat "[" ietf-drums-wsp-token "]*\n[" ietf-drums-wsp-token "]+") - "Folding white space.") -(defvar ietf-drums-atext-token "-^a-zA-Z0-9!#$%&'*+/=?_`{|}~" - "Textual token.") -(defvar ietf-drums-dot-atext-token "-^a-zA-Z0-9!#$%&'*+/=?_`{|}~." - "Textual token including full stop.") -(defvar ietf-drums-qtext-token - (concat ietf-drums-no-ws-ctl-token "\041\043-\133\135-\177") - "Non-white-space control characaters, plus the rest of ASCII excluding backslash and doublequote.") -(defvar ietf-drums-tspecials "][()<>@,;:\\\"/?=" - "Tspecials.") - -(defvar ietf-drums-syntax-table - (let ((table (copy-syntax-table emacs-lisp-mode-syntax-table))) - (modify-syntax-entry ?\\ "/" table) - (modify-syntax-entry ?< "(" table) - (modify-syntax-entry ?> ")" table) - (modify-syntax-entry ?@ "w" table) - (modify-syntax-entry ?/ "w" table) - (modify-syntax-entry ?= " " table) - (modify-syntax-entry ?* " " table) - (modify-syntax-entry ?\; " " table) - (modify-syntax-entry ?\' " " table) - table)) - -(defun ietf-drums-token-to-list (token) - "Translate TOKEN into a list of characters." - (let ((i 0) - b e c out range) - (while (< i (length token)) - (setq c (mm-char-int (aref token i))) - (incf i) - (cond - ((eq c (mm-char-int ?-)) - (if b - (setq range t) - (push c out))) - (range - (while (<= b c) - (push (mm-make-char 'ascii b) out) - (incf b)) - (setq range nil)) - ((= i (length token)) - (push (mm-make-char 'ascii c) out)) - (t - (when b - (push (mm-make-char 'ascii b) out)) - (setq b c)))) - (nreverse out))) - -(defsubst ietf-drums-init (string) - (set-syntax-table ietf-drums-syntax-table) - (insert string) - (ietf-drums-unfold-fws) - (goto-char (point-min))) - -(defun ietf-drums-remove-comments (string) - "Remove comments from STRING." - (with-temp-buffer - (let (c) - (ietf-drums-init string) - (while (not (eobp)) - (setq c (char-after)) - (cond - ((eq c ?\") - (forward-sexp 1)) - ((eq c ?\() - (delete-region (point) (progn (forward-sexp 1) (point)))) - (t - (forward-char 1)))) - (buffer-string)))) - -(defun ietf-drums-remove-whitespace (string) - "Remove whitespace from STRING." - (with-temp-buffer - (ietf-drums-init string) - (let (c) - (while (not (eobp)) - (setq c (char-after)) - (cond - ((eq c ?\") - (forward-sexp 1)) - ((eq c ?\() - (forward-sexp 1)) - ((memq c '(? ?\t ?\n)) - (delete-char 1)) - (t - (forward-char 1)))) - (buffer-string)))) - -(defun ietf-drums-get-comment (string) - "Return the first comment in STRING." - (with-temp-buffer - (ietf-drums-init string) - (let (result c) - (while (not (eobp)) - (setq c (char-after)) - (cond - ((eq c ?\") - (forward-sexp 1)) - ((eq c ?\() - (setq result - (buffer-substring - (1+ (point)) - (progn (forward-sexp 1) (1- (point)))))) - (t - (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 - (let (display-name mailbox c display-string) - (ietf-drums-init string) - (while (not (eobp)) - (setq c (char-after)) - (cond - ((or (eq c ? ) - (eq c ?\t)) - (forward-char 1)) - ((eq c ?\() - (forward-sexp 1)) - ((eq c ?\") - (push (buffer-substring - (1+ (point)) (progn (forward-sexp 1) (1- (point)))) - display-name)) - ((looking-at (concat "[" ietf-drums-atext-token "@" "]")) - (push (buffer-substring (point) (progn (forward-sexp 1) (point))) - display-name)) - ((eq c ?<) - (setq mailbox - (ietf-drums-remove-whitespace - (ietf-drums-remove-comments - (buffer-substring - (1+ (point)) - (progn (forward-sexp 1) (1- (point)))))))) - (t (error "Unknown symbol: %c" c)))) - ;; If we found no display-name, then we look for comments. - (if display-name - (setq display-string - (mapconcat 'identity (reverse display-name) " ")) - (setq display-string (ietf-drums-get-comment string))) - (if (not mailbox) - (when (string-match "@" display-string) - (cons - (mapconcat 'identity (nreverse display-name) "") - (ietf-drums-get-comment string))) - (cons mailbox display-string))))) - -(defun ietf-drums-parse-addresses (string) - "Parse STRING and return a list of MAILBOX / DISPLAY-NAME pairs." - (with-temp-buffer - (ietf-drums-init string) - (let ((beg (point)) - pairs c) - (while (not (eobp)) - (setq c (char-after)) - (cond - ((memq c '(?\" ?< ?\()) - (forward-sexp 1)) - ((eq c ?,) - (push (ietf-drums-parse-address (buffer-substring beg (point))) - pairs) - (forward-char 1) - (setq beg (point))) - (t - (forward-char 1)))) - (push (ietf-drums-parse-address (buffer-substring beg (point))) - pairs) - (nreverse pairs)))) - -(defun ietf-drums-unfold-fws () - "Unfold folding white space in the current buffer." - (goto-char (point-min)) - (while (re-search-forward ietf-drums-fws-regexp nil t) - (replace-match " " t t)) - (goto-char (point-min))) - -(defun ietf-drums-parse-date (string) - "Return an Emacs time spec from STRING." - (apply 'encode-time (parse-time-string string))) - -(defun ietf-drums-narrow-to-header () - "Narrow to the header section in the current buffer." - (narrow-to-region - (goto-char (point-min)) - (if (re-search-forward "^\r?$" nil 1) - (match-beginning 0) - (point-max))) - (goto-char (point-min))) - -(defun ietf-drums-quote-string (string) - "Quote string if it needs quoting to be displayed in a header." - (if (string-match (concat "[^" ietf-drums-atext-token "]") string) - (concat "\"" string "\"") - string)) - -(provide 'ietf-drums) - -;;; ietf-drums.el ends here diff --git a/lisp/imap.el b/lisp/imap.el deleted file mode 100644 index c89384e..0000000 --- a/lisp/imap.el +++ /dev/null @@ -1,2633 +0,0 @@ -;;; imap.el --- imap library -;; Copyright (C) 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Simon Josefsson -;; Keywords: mail - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; imap.el is a elisp library providing an interface for talking to -;; IMAP servers. -;; -;; imap.el is roughly divided in two parts, one that parses IMAP -;; responses from the server and storing data into buffer-local -;; variables, and one for utility functions which send commands to -;; server, waits for an answer, and return information. The latter -;; part is layered on top of the previous. -;; -;; The imap.el API consist of the following functions, other functions -;; in this file should not be called directly and the result of doing -;; so are at best undefined. -;; -;; Global commands: -;; -;; imap-open, imap-opened, imap-authenticate, imap-close, -;; imap-capability, imap-namespace, imap-error-text -;; -;; Mailbox commands: -;; -;; imap-mailbox-get, imap-mailbox-map, imap-current-mailbox, -;; imap-current-mailbox-p, imap-search, imap-mailbox-select, -;; imap-mailbox-examine, imap-mailbox-unselect, imap-mailbox-expunge -;; imap-mailbox-close, imap-mailbox-create, imap-mailbox-delete -;; imap-mailbox-rename, imap-mailbox-lsub, imap-mailbox-list -;; imap-mailbox-subscribe, imap-mailbox-unsubscribe, imap-mailbox-status -;; imap-mailbox-acl-get, imap-mailbox-acl-set, imap-mailbox-acl-delete -;; -;; Message commands: -;; -;; imap-fetch-asynch, imap-fetch, -;; imap-current-message, imap-list-to-message-set, -;; imap-message-get, imap-message-map -;; imap-message-envelope-date, imap-message-envelope-subject, -;; imap-message-envelope-from, imap-message-envelope-sender, -;; imap-message-envelope-reply-to, imap-message-envelope-to, -;; imap-message-envelope-cc, imap-message-envelope-bcc -;; imap-message-envelope-in-reply-to, imap-message-envelope-message-id -;; imap-message-body, imap-message-flag-permanent-p -;; imap-message-flags-set, imap-message-flags-del -;; imap-message-flags-add, imap-message-copyuid -;; imap-message-copy, imap-message-appenduid -;; imap-message-append, imap-envelope-from -;; imap-body-lines -;; -;; It is my hope that theese commands should be pretty self -;; explanatory for someone that know IMAP. All functions have -;; additional documentation on how to invoke them. -;; -;; imap.el support RFC1730/2060 (IMAP4/IMAP4rev1), implemented IMAP -;; extensions are RFC2195 (CRAM-MD5), RFC2086 (ACL), RFC2342 -;; (NAMESPACE), RFC2359 (UIDPLUS), the IMAP-part of RFC2595 (STARTTLS, -;; LOGINDISABLED) (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. -;; -;; This is a transcript of short interactive session for demonstration -;; purposes. -;; -;; (imap-open "my.mail.server") -;; => " *imap* my.mail.server:0" -;; -;; The rest are invoked with current buffer as the buffer returned by -;; `imap-open'. It is possible to do all without this, but it would -;; look ugly here since `buffer' is always the last argument for all -;; imap.el API functions. -;; -;; (imap-authenticate "myusername" "mypassword") -;; => auth -;; -;; (imap-mailbox-lsub "*") -;; => ("INBOX.sentmail" "INBOX.private" "INBOX.draft" "INBOX.spam") -;; -;; (imap-mailbox-list "INBOX.n%") -;; => ("INBOX.namedroppers" "INBOX.nnimap" "INBOX.ntbugtraq") -;; -;; (imap-mailbox-select "INBOX.nnimap") -;; => "INBOX.nnimap" -;; -;; (imap-mailbox-get 'exists) -;; => 166 -;; -;; (imap-mailbox-get 'uidvalidity) -;; => "908992622" -;; -;; (imap-search "FLAGGED SINCE 18-DEC-98") -;; => (235 236) -;; -;; (imap-fetch 235 "RFC822.PEEK" 'RFC822) -;; => "X-Sieve: cmu-sieve 1.3^M\nX-Username: ^M\r...." -;; -;; Todo: -;; -;; o Parse UIDs as strings? We need to overcome the 28 bit limit somehow. -;; 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. -;; -;; Revision history: -;; -;; - 19991218 added starttls/digest-md5 patch, -;; by Daiki Ueno -;; NB! you need SLIM for starttls.el and digest-md5.el -;; - 19991023 commited to pgnus -;; - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'static)) - -(require 'base64) - -(eval-and-compile - (autoload 'open-ssl-stream "ssl") - (autoload 'starttls-open-stream "starttls") - (autoload 'starttls-negotiate "starttls") - (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") - ;; Avoid use gnus-point-at-eol so we're independent of Gnus. These - ;; days we have point-at-eol anyhow. - (if (fboundp 'point-at-eol) - (defalias 'imap-point-at-eol 'point-at-eol) - (defun imap-point-at-eol () - (save-excursion - (end-of-line) - (point)))) - (autoload 'sasl-digest-md5-digest-response "sasl")) - -;; User variables. - -(defgroup imap nil - "Low-level IMAP issues." - :version "21.1" - :group 'mail) - -(defcustom 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. Each entry in -the list is tried until a successful connection is made." - :group 'imap - :type '(repeat string)) - -(defcustom 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. Each entry in -the list is tried until a successful connection is made." - :group 'imap - :type '(repeat string)) - -(defcustom imap-ssl-program '("openssl s_client -quiet -ssl3 -connect %s:%p" - "openssl s_client -quiet -ssl2 -connect %s:%p" - "s_client -quiet -ssl3 -connect %s:%p" - "s_client -quiet -ssl2 -connect %s:%p") - "A string, or list of strings, containing commands for SSL connections. -Within a string, %s is replaced with the server address and %p with -port number on server. The program should accept IMAP commands on -stdin and return responses to stdout. Each entry in the list is tried -until a successful connection is made." - :group 'imap - :type '(choice string - (repeat string))) - -(defcustom imap-shell-program '("ssh %s imapd" - "rsh %s imapd" - "ssh %g ssh %s imapd" - "rsh %g rsh %s imapd") - "A list of strings, containing commands for IMAP connection. -Within a string, %s is replaced with the server address, %p with port -number on server, %g with `imap-shell-host', and %l with -`imap-default-user'. The program should read IMAP commands from stdin -and write IMAP response to stdout. Each entry in the list is tried -until a successful connection is made." - :group 'imap - :type '(repeat string)) - -(defcustom imap-process-connection-type nil - "*Value for `process-connection-type' to use for Kerberos4 and GSSAPI." - :group 'imap - :type 'boolean) - -(defvar imap-shell-host "gateway" - "Hostname of rlogin proxy.") - -(defvar imap-default-user (user-login-name) - "Default username to use.") - -(defvar imap-error nil - "Error codes from the last command.") - -;; Various variables. - -(defvar imap-fetch-data-hook nil - "Hooks called after receiving each FETCH response.") - -(defvar imap-streams '(gssapi kerberos4 starttls ssl network shell) - "Priority of streams to consider when opening connection to server.") - -(defvar imap-stream-alist - '((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) - (shell imap-shell-p imap-shell-open) - (starttls imap-starttls-p imap-starttls-open)) - "Definition of network streams. - -\(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 '(gssapi - kerberos4 - digest-md5 - cram-md5 - login - anonymous) - "Priority of authenticators to consider when authenticating to server.") - -(defvar imap-authenticator-alist - '((gssapi imap-gssapi-auth-p imap-gssapi-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 names the authenticator. CHECK is a function returning non-nil if -the server support the authenticator and AUTHENTICATE is a function -for doing the actuall authentification.") - -(defvar imap-use-utf7 t - "If non-nil, do utf7 encoding/decoding of mailbox names. -Since the UTF7 decoding currently only decodes into ISO-8859-1 -characters, you may disable this decoding if you need to access UTF7 -encoded mailboxes which doesn't translate into ISO-8859-1.") - -;; Internal constants. Change theese and die. - -(defconst imap-default-port 143) -(defconst imap-default-ssl-port 993) -(defconst imap-default-stream 'network) -(defconst imap-local-variables '(imap-server - imap-port - imap-client-eol - imap-server-eol - imap-auth - imap-stream - imap-username - imap-password - imap-current-mailbox - imap-current-target-mailbox - imap-message-data - imap-capability - imap-namespace - imap-state - imap-reached-tag - imap-failed-tags - imap-tag - imap-process - imap-calculate-literal-size-first - imap-mailbox-data)) - -;; Internal variables. - -(defvar imap-stream nil) -(defvar imap-auth nil) -(defvar imap-server nil) -(defvar imap-port nil) -(defvar imap-username nil) -(defvar imap-password nil) -(defvar imap-calculate-literal-size-first nil) -(defvar imap-state 'closed - "IMAP state. -Valid states are `closed', `initial', `nonauth', `auth', `selected' -and `examine'.") - -(defvar imap-server-eol "\r\n" - "The EOL string sent from the server.") - -(defvar imap-client-eol "\r\n" - "The EOL string we send to the server.") - -(defvar imap-current-mailbox nil - "Current mailbox name.") - -(defvar imap-current-target-mailbox nil - "Current target mailbox for COPY and APPEND commands.") - -(defvar imap-mailbox-data nil - "Obarray with mailbox data.") - -(defvar imap-mailbox-prime 997 - "Length of imap-mailbox-data.") - -(defvar imap-current-message nil - "Current message number.") - -(defvar imap-message-data nil - "Obarray with message data.") - -(defvar imap-message-prime 997 - "Length of imap-message-data.") - -(defvar imap-capability nil - "Capability for server.") - -(defvar imap-namespace nil - "Namespace for current server.") - -(defvar imap-reached-tag 0 - "Lower limit on command tags that have been parsed.") - -(defvar imap-failed-tags nil - "Alist of tags that failed. -Each element is a list with four elements; tag (a integer), response -state (a symbol, `OK', `NO' or `BAD'), response code (a string), and -human readable response text (a string).") - -(defvar imap-tag 0 - "Command tag number.") - -(defvar imap-process nil - "Process.") - -(defvar imap-continuation nil - "Non-nil indicates that the server emitted a continuation request. -The actually value is really the text on the continuation line.") - -(defvar imap-log nil - "Name of buffer for imap session trace. -For example: (setq imap-log \"*imap-log*\")") - -(defvar imap-debug nil ;"*imap-debug*" - "Name of buffer for random debug spew. -For example: (setq imap-debug \"*imap-debug*\")") - - -;; Utility functions: - -(defun imap-read-passwd (prompt &rest args) - "Read a password using PROMPT. -If ARGS, PROMPT is used as an argument to `format'." - (let ((prompt (if args - (apply 'format prompt args) - prompt))) - (funcall (if (or (fboundp 'read-passwd) - (and (load "subr" t) - (fboundp 'read-passwd)) - (and (load "passwd" t) - (fboundp 'read-passwd))) - 'read-passwd - (autoload 'ange-ftp-read-passwd "ange-ftp") - 'ange-ftp-read-passwd) - prompt))) - -(defsubst imap-utf7-encode (string) - (if imap-use-utf7 - (and string - (condition-case () - (utf7-encode string t) - (error (message - "imap: Could not UTF7 encode `%s', using it unencoded..." - string) - string))) - string)) - -(defsubst imap-utf7-decode (string) - (if imap-use-utf7 - (and string - (condition-case () - (utf7-decode string t) - (error (message - "imap: Could not UTF7 decode `%s', using it undecoded..." - string) - string))) - string)) - -(defsubst imap-ok-p (status) - (if (eq status 'OK) - t - (setq imap-error status) - nil)) - -(defun imap-error-text (&optional buffer) - (with-current-buffer (or buffer (current-buffer)) - (nth 3 (car imap-failed-tags)))) - - -;; Server functions; stream stuff: - -(defun imap-kerberos4-stream-p (buffer) - (imap-capability 'AUTH=KERBEROS_V4 buffer)) - -(defun imap-kerberos4-open (name buffer server port) - (let ((cmds imap-kerberos4-program) - cmd done) - (while (and (not done) (setq cmd (pop cmds))) - (message "Opening Kerberos 4 IMAP connection with `%s'..." cmd) - (erase-buffer) - (let* ((port (or port imap-default-port)) - (process-connection-type imap-process-connection-type) - (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" - imap-calculate-literal-size-first t) - (while (and (memq (process-status process) '(open run)) - (set-buffer buffer) ;; XXX "blue moon" nntp.el bug - (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 "Opening Kerberos 4 IMAP connection with `%s'...%s" cmd - (if response (concat "done, " 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-connection-type imap-process-connection-type) - (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" - imap-calculate-literal-size-first t) - (while (and (memq (process-status process) '(open run)) - (set-buffer buffer) ;; XXX "blue moon" nntp.el bug - (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: - (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) - -(defun imap-ssl-open (name buffer server port) - "Open a SSL connection to server." - (let ((cmds (if (listp imap-ssl-program) imap-ssl-program - (list imap-ssl-program))) - cmd done) - (ignore-errors (require 'ssl)) - (while (and (not done) (setq cmd (pop cmds))) - (message "imap: Opening SSL connection with `%s'..." cmd) - (let* ((port (or port imap-default-ssl-port)) - (ssl-program-name shell-file-name) - (ssl-program-arguments - (list shell-command-switch - (format-spec cmd (format-spec-make - ?s server - ?p (number-to-string port))))) - process) - (when (setq process - (ignore-errors - (cond ((eq system-type 'windows-nt) - (let (selective-display - (coding-system-for-write 'binary) - (coding-system-for-read 'raw-text-dos) - (output-coding-system 'binary) - (input-coding-system 'raw-text-dos)) - (open-ssl-stream name buffer server port))) - (t - (as-binary-process - (open-ssl-stream name buffer server port)))))) - (with-current-buffer buffer - (goto-char (point-min)) - (while (and (memq (process-status process) '(open run)) - (set-buffer buffer) ;; XXX "blue moon" nntp.el bug - (goto-char (point-max)) - (forward-line -1) - (not (imap-parse-greeting))) - (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) - (when (memq (process-status process) '(open run)) - (setq done process)))))) - (if done - (progn - (message "imap: Opening SSL connection with `%s'...done" cmd) - done) - (message "imap: Opening SSL connection with `%s'...failed" cmd) - nil))) - -(defun imap-network-p (buffer) - t) - -(defun imap-network-open (name buffer server port) - (let* ((port (or port imap-default-port)) - (process (open-network-stream-as-binary name buffer server port))) - (when process - (while (and (memq (process-status process) '(open run)) - (set-buffer buffer) ;; XXX "blue moon" nntp.el bug - (goto-char (point-min)) - (not (imap-parse-greeting))) - (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))) - (when (memq (process-status process) '(open run)) - process)))) - -(defun imap-shell-p (buffer) - nil) - -(defun imap-shell-open (name buffer server port) - (let ((cmds imap-shell-program) - cmd done) - (while (and (not done) (setq cmd (pop cmds))) - (message "imap: Opening IMAP connection with `%s'..." cmd) - (setq imap-client-eol "\n") - (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 - ?g imap-shell-host - ?p (number-to-string port) - ?l imap-default-user)))))) - (when process - (while (and (memq (process-status process) '(open run)) - (set-buffer buffer) ;; XXX "blue moon" nntp.el bug - (goto-char (point-min)) - (not (imap-parse-greeting))) - (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) - (when (memq (process-status process) '(open run)) - (setq done process))))) - (if done - (progn - (message "imap: Opening IMAP connection with `%s'...done" cmd) - done) - (message "imap: Opening IMAP connection with `%s'...failed" cmd) - nil))) - -(defun imap-starttls-p (buffer) - (and (imap-capability 'STARTTLS buffer) - (condition-case () - (progn - (require 'starttls) - (call-process "starttls")) - (error nil)))) - -(defun imap-starttls-open (name buffer server port) - (let* ((port (or port imap-default-port)) - (process (as-binary-process - (starttls-open-stream name buffer server port))) - done) - (message "imap: Connecting with STARTTLS...") - (when process - (while (and (memq (process-status process) '(open run)) - (set-buffer buffer) ;; XXX "blue moon" nntp.el bug - (goto-char (point-min)) - (not (imap-parse-greeting))) - (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 ((imap-process process)) - (unwind-protect - (progn - (set-process-filter imap-process 'imap-arrival-filter) - (when (and (eq imap-stream 'starttls) - (imap-ok-p (imap-send-command-wait "STARTTLS"))) - (starttls-negotiate imap-process))) - (set-process-filter imap-process nil))) - (when (memq (process-status process) '(open run)) - (setq done process))) - (if done - (progn - (message "imap: Connecting with STARTTLS...done") - done) - (message "imap: Connecting with STARTTLS...failed") - nil))) - -;; Server functions; authenticator stuff: - -(defun imap-interactive-login (buffer loginfunc) - "Login to server in BUFFER. -LOGINFUNC is passed a username and a password, it should return t if -it where sucessful authenticating itself to the server, nil otherwise. -Returns t if login was successful, nil otherwise." - (with-current-buffer buffer - (make-local-variable 'imap-username) - (make-local-variable 'imap-password) - (let (user passwd ret) - ;; (condition-case () - (while (or (not user) (not passwd)) - (setq user (or imap-username - (read-from-minibuffer - (concat "IMAP username for " imap-server ": ") - (or user imap-default-user)))) - (setq passwd (or imap-password - (imap-read-passwd - (concat "IMAP password for " user "@" - imap-server ": ")))) - (when (and user passwd) - (if (funcall loginfunc user passwd) - (progn - (setq ret t - imap-username user) - (if (and (not imap-password) - (y-or-n-p "Store password for this session? ")) - (setq imap-password passwd))) - (message "Login failed...") - (setq passwd nil) - (sit-for 1)))) - ;; (quit (with-current-buffer buffer - ;; (setq user nil - ;; passwd nil))) - ;; (error (with-current-buffer buffer - ;; (setq user nil - ;; passwd nil)))) - ret))) - -(defun imap-gssapi-auth-p (buffer) - (and (imap-capability 'AUTH=GSSAPI buffer) - (catch 'imtest-found - (let (prg (prgs imap-gssapi-program)) - (while (setq prg (pop prgs)) - (condition-case () - (and (call-process (substring prg 0 (string-match " " prg))) - (throw 'imtest-found t)) - (error nil))))))) - -(defun imap-gssapi-auth (buffer) - (message "imap: Authenticating using GSSAPI...%s" - (if (eq imap-stream 'gssapi) "done" "failed")) - (eq imap-stream 'gssapi)) - -(defun imap-kerberos4-auth-p (buffer) - (and (imap-capability 'AUTH=KERBEROS_V4 buffer) - (catch 'imtest-found - (let (prg (prgs imap-kerberos4-program)) - (while (setq prg (pop prgs)) - (condition-case () - (and (call-process (substring prg 0 (string-match " " prg))) - (throw 'imtest-found t)) - (error nil))))))) - -(defun imap-kerberos4-auth (buffer) - (message "imap: Authenticating using Kerberos 4...%s" - (if (eq imap-stream 'kerberos4) "done" "failed")) - (eq imap-stream 'kerberos4)) - -(defun imap-cram-md5-p (buffer) - (imap-capability 'AUTH=CRAM-MD5 buffer)) - -(defun imap-cram-md5-auth (buffer) - "Login to server using the AUTH CRAM-MD5 method." - (message "imap: Authenticating using CRAM-MD5...") - (let ((done (imap-interactive-login - buffer - (lambda (user passwd) - (imap-ok-p - (imap-send-command-wait - (list - "AUTHENTICATE CRAM-MD5" - (lambda (challenge) - (let* ((decoded (base64-decode-string challenge)) - (hash-function - (if (and (featurep 'xemacs) - (>= (function-max-args 'md5) 4)) - (lambda (object &optional start end) - (md5 object start end 'binary)) - 'md5)) - (hash (rfc2104-hash hash-function 64 16 - passwd decoded)) - (response (concat user " " hash)) - (encoded (base64-encode-string response))) - encoded))))))))) - (if done - (message "imap: Authenticating using CRAM-MD5...done") - (message "imap: Authenticating using CRAM-MD5...failed")))) - -(defun imap-login-p (buffer) - (and (not (imap-capability 'LOGINDISABLED buffer)) - (not (imap-capability 'X-LOGIN-CMD-DISABLED buffer)))) - -(defun imap-login-auth (buffer) - "Login to server using the LOGIN command." - (message "imap: Plaintext authentication...") - (imap-interactive-login buffer - (lambda (user passwd) - (imap-ok-p (imap-send-command-wait - (concat "LOGIN \"" user "\" \"" - passwd "\"")))))) - -(defun imap-anonymous-p (buffer) - t) - -(defun imap-anonymous-auth (buffer) - (message "imap: Loging in anonymously...") - (with-current-buffer buffer - (imap-ok-p (imap-send-command-wait - (concat "LOGIN anonymous \"" (concat (user-login-name) "@" - (system-name)) "\""))))) - -(defun imap-digest-md5-p (buffer) - (and (imap-capability 'AUTH=DIGEST-MD5 buffer) - (condition-case () - (require 'digest-md5) - (error nil)))) - -(defun imap-digest-md5-auth (buffer) - "Login to server using the AUTH DIGEST-MD5 method." - (message "imap: Authenticating using DIGEST-MD5...") - (imap-interactive-login - buffer - (lambda (user passwd) - (let ((tag - (imap-send-command - (list - "AUTHENTICATE DIGEST-MD5" - (lambda (challenge) - (base64-encode-string - (sasl-digest-md5-digest-response - (base64-decode-string challenge) - user passwd "imap" imap-server) - 'no-line-break)))))) - (if (not (eq (imap-wait-for-tag tag) 'INCOMPLETE)) - nil - (setq imap-continuation nil) - (imap-send-command-1 "") - (imap-ok-p (imap-wait-for-tag tag))))))) - -;; Server functions: - -(defun imap-open-1 (buffer) - (with-current-buffer buffer - (erase-buffer) - (setq imap-current-mailbox nil - imap-current-message nil - imap-state 'initial - imap-process (condition-case () - (funcall (nth 2 (assq imap-stream - imap-stream-alist)) - "imap" buffer imap-server imap-port) - ((error quit) nil))) - (when imap-process - (set-process-filter imap-process 'imap-arrival-filter) - (set-process-sentinel imap-process 'imap-sentinel) - (while (and (eq imap-state 'initial) - (memq (process-status imap-process) '(open run))) - (message "Waiting for response from %s..." imap-server) - (accept-process-output imap-process 1)) - (message "Waiting for response from %s...done" imap-server) - (and (memq (process-status imap-process) '(open run)) - imap-process)))) - -(defun imap-open (server &optional port stream auth buffer) - "Open a IMAP connection to host SERVER at PORT returning a buffer. -If PORT is unspecified, a default value is used (143 except -for SSL which use 993). -STREAM indicates the stream to use, see `imap-streams' for available -streams. If nil, it choices the best stream the server is capable of. -AUTH indicates authenticator to use, see `imap-authenticators' for -available authenticators. If nil, it choices the best stream the -server is capable of. -BUFFER can be a buffer or a name of a buffer, which is created if -necessery. If nil, the buffer name is generated." - (setq buffer (or buffer (format " *imap* %s:%d" server (or port 0)))) - (with-current-buffer (get-buffer-create buffer) - (if (imap-opened buffer) - (imap-close buffer)) - (mapcar 'make-local-variable imap-local-variables) - (set-buffer-multibyte nil) - (buffer-disable-undo) - (setq imap-server (or server imap-server)) - (setq imap-port (or port imap-port)) - (setq imap-auth (or auth imap-auth)) - (setq imap-stream (or stream imap-stream)) - (message "imap: Connecting to %s..." imap-server) - (if (let ((imap-stream (or imap-stream imap-default-stream))) - (imap-open-1 buffer)) - ;; Choose stream. - (let (stream-changed) - (message "imap: Connecting to %s...done" imap-server) - (when (null imap-stream) - (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 - imap-default-stream) - stream)) - imap-stream stream - streams nil))) - (unless imap-stream - (error "Couldn't figure out a stream for server")))) - (when stream-changed - (message "imap: Reconnecting with stream `%s'..." imap-stream) - (imap-close buffer) - (if (imap-open-1 buffer) - (message "imap: Reconnecting with stream `%s'...done" - imap-stream) - (message "imap: Reconnecting with stream `%s'...failed" - imap-stream)) - (setq imap-capability nil)) - (if (imap-opened buffer) - ;; Choose authenticator - (when (and (null imap-auth) (not (eq imap-state 'auth))) - (let ((auths imap-authenticators)) - (while (setq auth (pop auths)) - (if (funcall (nth 1 (assq auth imap-authenticator-alist)) - buffer) - (setq imap-auth auth - auths nil))) - (unless imap-auth - (error "Couldn't figure out authenticator for server")))))) - (message "imap: Connecting to %s...failed" imap-server)) - (when (imap-opened buffer) - (setq imap-mailbox-data (make-vector imap-mailbox-prime 0)) - buffer))) - -(defun imap-opened (&optional buffer) - "Return non-nil if connection to imap server in BUFFER is open. -If BUFFER is nil then the current buffer is used." - (and (setq buffer (get-buffer (or buffer (current-buffer)))) - (buffer-live-p buffer) - (with-current-buffer buffer - (and imap-process - (memq (process-status imap-process) '(open run)))))) - -(defun imap-authenticate (&optional user passwd buffer) - "Authenticate to server in BUFFER, using current buffer if nil. -It uses the authenticator specified when opening the server. If the -authenticator requires username/passwords, they are queried from the -user and optionally stored in the buffer. If USER and/or PASSWD is -specified, the user will not be questioned and the username and/or -password is remembered in the buffer." - (with-current-buffer (or buffer (current-buffer)) - (if (not (eq imap-state 'nonauth)) - (or (eq imap-state 'auth) - (eq imap-state 'select) - (eq imap-state 'examine)) - (make-local-variable 'imap-username) - (make-local-variable 'imap-password) - (if user (setq imap-username user)) - (if passwd (setq imap-password passwd)) - (if (funcall (nth 2 (assq imap-auth imap-authenticator-alist)) buffer) - (setq imap-state 'auth))))) - -(defun imap-close (&optional buffer) - "Close connection to server in BUFFER. -If BUFFER is nil, the current buffer is used." - (with-current-buffer (or buffer (current-buffer)) - (and (imap-opened) - (not (imap-ok-p (imap-send-command-wait "LOGOUT"))) - (message "Server %s didn't let me log out" imap-server)) - (when (and imap-process - (memq (process-status imap-process) '(open run))) - (delete-process imap-process)) - (setq imap-current-mailbox nil - imap-current-message nil - imap-process nil) - (erase-buffer) - t)) - -(defun imap-capability (&optional identifier buffer) - "Return a list of identifiers which server in BUFFER support. -If IDENTIFIER, return non-nil if it's among the servers capabilities. -If BUFFER is nil, the current buffer is assumed." - (with-current-buffer (or buffer (current-buffer)) - (unless imap-capability - (unless (imap-ok-p (imap-send-command-wait "CAPABILITY")) - (setq imap-capability '(IMAP2)))) - (if identifier - (memq (intern (upcase (symbol-name identifier))) imap-capability) - imap-capability))) - -(defun imap-namespace (&optional buffer) - "Return a namespace hierarchy at server in BUFFER. -If BUFFER is nil, the current buffer is assumed." - (with-current-buffer (or buffer (current-buffer)) - (unless imap-namespace - (when (imap-capability 'NAMESPACE) - (imap-send-command-wait "NAMESPACE"))) - imap-namespace)) - -(defun imap-send-command-wait (command &optional buffer) - (imap-wait-for-tag (imap-send-command command buffer) buffer)) - - -;; Mailbox functions: - -(defun imap-mailbox-put (propname value &optional mailbox buffer) - (with-current-buffer (or buffer (current-buffer)) - (if imap-mailbox-data - (put (intern (or mailbox imap-current-mailbox) imap-mailbox-data) - propname value) - (error "Imap-mailbox-data is nil, prop %s value %s mailbox %s buffer %s" - propname value mailbox (current-buffer))) - t)) - -(defsubst imap-mailbox-get-1 (propname &optional mailbox) - (get (intern-soft (or mailbox imap-current-mailbox) imap-mailbox-data) - propname)) - -(defun imap-mailbox-get (propname &optional mailbox buffer) - (let ((mailbox (imap-utf7-encode mailbox))) - (with-current-buffer (or buffer (current-buffer)) - (imap-mailbox-get-1 propname (or mailbox imap-current-mailbox))))) - -(defun imap-mailbox-map-1 (func &optional mailbox-decoder buffer) - (with-current-buffer (or buffer (current-buffer)) - (let (result) - (mapatoms - (lambda (s) - (push (funcall func (if mailbox-decoder - (funcall mailbox-decoder (symbol-name s)) - (symbol-name s))) result)) - imap-mailbox-data) - result))) - -(defun imap-mailbox-map (func &optional buffer) - "Map a function across each mailbox in `imap-mailbox-data', returning a list. -Function should take a mailbox name (a string) as -the only argument." - (imap-mailbox-map-1 func 'imap-utf7-decode buffer)) - -(defun imap-current-mailbox (&optional buffer) - (with-current-buffer (or buffer (current-buffer)) - (imap-utf7-decode imap-current-mailbox))) - -(defun imap-current-mailbox-p-1 (mailbox &optional examine) - (and (string= mailbox imap-current-mailbox) - (or (and examine - (eq imap-state 'examine)) - (and (not examine) - (eq imap-state 'selected))))) - -(defun imap-current-mailbox-p (mailbox &optional examine buffer) - (with-current-buffer (or buffer (current-buffer)) - (imap-current-mailbox-p-1 (imap-utf7-encode mailbox) examine))) - -(defun imap-mailbox-select-1 (mailbox &optional examine) - "Select MAILBOX on server in BUFFER. -If EXAMINE is non-nil, do a read-only select." - (if (imap-current-mailbox-p-1 mailbox examine) - imap-current-mailbox - (setq imap-current-mailbox mailbox) - (if (imap-ok-p (imap-send-command-wait - (concat (if examine "EXAMINE" "SELECT") " \"" - mailbox "\""))) - (progn - (setq imap-message-data (make-vector imap-message-prime 0) - imap-state (if examine 'examine 'selected)) - imap-current-mailbox) - ;; Failed SELECT/EXAMINE unselects current mailbox - (setq imap-current-mailbox nil)))) - -(defun imap-mailbox-select (mailbox &optional examine buffer) - (with-current-buffer (or buffer (current-buffer)) - (imap-utf7-decode - (imap-mailbox-select-1 (imap-utf7-encode mailbox) examine)))) - -(defun imap-mailbox-examine-1 (mailbox &optional buffer) - (with-current-buffer (or buffer (current-buffer)) - (imap-mailbox-select-1 mailbox 'examine))) - -(defun imap-mailbox-examine (mailbox &optional buffer) - "Examine MAILBOX on server in BUFFER." - (imap-mailbox-select mailbox 'examine buffer)) - -(defun imap-mailbox-unselect (&optional buffer) - "Close current folder in BUFFER, without expunging articles." - (with-current-buffer (or buffer (current-buffer)) - (when (or (eq imap-state 'auth) - (and (imap-capability 'UNSELECT) - (imap-ok-p (imap-send-command-wait "UNSELECT"))) - (and (imap-ok-p - (imap-send-command-wait (concat "EXAMINE \"" - imap-current-mailbox - "\""))) - (imap-ok-p (imap-send-command-wait "CLOSE")))) - (setq imap-current-mailbox nil - imap-message-data nil - imap-state 'auth) - t))) - -(defun imap-mailbox-expunge (&optional buffer) - "Expunge articles in current folder in BUFFER. -If BUFFER is nil the current buffer is assumed." - (with-current-buffer (or buffer (current-buffer)) - (when (and imap-current-mailbox (not (eq imap-state 'examine))) - (imap-ok-p (imap-send-command-wait "EXPUNGE"))))) - -(defun imap-mailbox-close (&optional buffer) - "Expunge articles and close current folder in BUFFER. -If BUFFER is nil the current buffer is assumed." - (with-current-buffer (or buffer (current-buffer)) - (when (and imap-current-mailbox - (imap-ok-p (imap-send-command-wait "CLOSE"))) - (setq imap-current-mailbox nil - imap-message-data nil - imap-state 'auth) - t))) - -(defun imap-mailbox-create-1 (mailbox) - (imap-ok-p (imap-send-command-wait (list "CREATE \"" mailbox "\"")))) - -(defun imap-mailbox-create (mailbox &optional buffer) - "Create MAILBOX on server in BUFFER. -If BUFFER is nil the current buffer is assumed." - (with-current-buffer (or buffer (current-buffer)) - (imap-mailbox-create-1 (imap-utf7-encode mailbox)))) - -(defun imap-mailbox-delete (mailbox &optional buffer) - "Delete MAILBOX on server in BUFFER. -If BUFFER is nil the current buffer is assumed." - (let ((mailbox (imap-utf7-encode mailbox))) - (with-current-buffer (or buffer (current-buffer)) - (imap-ok-p - (imap-send-command-wait (list "DELETE \"" mailbox "\"")))))) - -(defun imap-mailbox-rename (oldname newname &optional buffer) - "Rename mailbox OLDNAME to NEWNAME on server in BUFFER. -If BUFFER is nil the current buffer is assumed." - (let ((oldname (imap-utf7-encode oldname)) - (newname (imap-utf7-encode newname))) - (with-current-buffer (or buffer (current-buffer)) - (imap-ok-p - (imap-send-command-wait (list "RENAME \"" oldname "\" " - "\"" newname "\"")))))) - -(defun imap-mailbox-lsub (&optional root reference add-delimiter buffer) - "Return a list of subscribed mailboxes on server in BUFFER. -If ROOT is non-nil, only list matching mailboxes. If ADD-DELIMITER is -non-nil, a hierarchy delimiter is added to root. REFERENCE is a -implementation-specific string that has to be passed to lsub command." - (with-current-buffer (or buffer (current-buffer)) - ;; Make sure we know the hierarchy separator for root's hierarchy - (when (and add-delimiter (null (imap-mailbox-get-1 'delimiter root))) - (imap-send-command-wait (concat "LIST \"" reference "\" \"" - (imap-utf7-encode root) "\""))) - ;; clear list data (NB not delimiter and other stuff) - (imap-mailbox-map-1 (lambda (mailbox) - (imap-mailbox-put 'lsub nil mailbox))) - (when (imap-ok-p - (imap-send-command-wait - (concat "LSUB \"" reference "\" \"" (imap-utf7-encode root) - (and add-delimiter (imap-mailbox-get-1 'delimiter root)) - "%\""))) - (let (out) - (imap-mailbox-map-1 (lambda (mailbox) - (when (imap-mailbox-get-1 'lsub mailbox) - (push (imap-utf7-decode mailbox) out)))) - (nreverse out))))) - -(defun imap-mailbox-list (root &optional reference add-delimiter buffer) - "Return a list of mailboxes matching ROOT on server in BUFFER. -If ADD-DELIMITER is non-nil, a hierarchy delimiter is added to -root. REFERENCE is a implementation-specific string that has to be -passed to list command." - (with-current-buffer (or buffer (current-buffer)) - ;; Make sure we know the hierarchy separator for root's hierarchy - (when (and add-delimiter (null (imap-mailbox-get-1 'delimiter root))) - (imap-send-command-wait (concat "LIST \"" reference "\" \"" - (imap-utf7-encode root) "\""))) - ;; clear list data (NB not delimiter and other stuff) - (imap-mailbox-map-1 (lambda (mailbox) - (imap-mailbox-put 'list nil mailbox))) - (when (imap-ok-p - (imap-send-command-wait - (concat "LIST \"" reference "\" \"" (imap-utf7-encode root) - (and add-delimiter (imap-mailbox-get-1 'delimiter root)) - "%\""))) - (let (out) - (imap-mailbox-map-1 (lambda (mailbox) - (when (imap-mailbox-get-1 'list mailbox) - (push (imap-utf7-decode mailbox) out)))) - (nreverse out))))) - -(defun imap-mailbox-subscribe (mailbox &optional buffer) - "Send the SUBSCRIBE command on the mailbox to server in BUFFER. -Returns non-nil if successful." - (with-current-buffer (or buffer (current-buffer)) - (imap-ok-p (imap-send-command-wait (concat "SUBSCRIBE \"" - (imap-utf7-encode mailbox) - "\""))))) - -(defun imap-mailbox-unsubscribe (mailbox &optional buffer) - "Send the SUBSCRIBE command on the mailbox to server in BUFFER. -Returns non-nil if successful." - (with-current-buffer (or buffer (current-buffer)) - (imap-ok-p (imap-send-command-wait (concat "UNSUBSCRIBE " - (imap-utf7-encode mailbox) - "\""))))) - -(defun imap-mailbox-status (mailbox items &optional buffer) - "Get status items ITEM in MAILBOX from server in BUFFER. -ITEMS can be a symbol or a list of symbols, valid symbols are one of -the STATUS data items -- ie 'messages, 'recent, 'uidnext, 'uidvalidity -or 'unseen. If ITEMS is a list of symbols, a list of values is -returned, if ITEMS is a symbol only it's value is returned." - (with-current-buffer (or buffer (current-buffer)) - (when (imap-ok-p - (imap-send-command-wait (list "STATUS \"" - (imap-utf7-encode mailbox) - "\" " - (format "%s" - (if (listp items) - items - (list items)))))) - (if (listp items) - (mapcar (lambda (item) - (imap-mailbox-get item mailbox)) - items) - (imap-mailbox-get items mailbox))))) - -(defun imap-mailbox-acl-get (&optional mailbox buffer) - "Get ACL on mailbox from server in BUFFER." - (let ((mailbox (imap-utf7-encode mailbox))) - (with-current-buffer (or buffer (current-buffer)) - (when (imap-ok-p - (imap-send-command-wait (list "GETACL \"" - (or mailbox imap-current-mailbox) - "\""))) - (imap-mailbox-get-1 'acl (or mailbox imap-current-mailbox)))))) - -(defun imap-mailbox-acl-set (identifier rights &optional mailbox buffer) - "Change/set ACL for IDENTIFIER to RIGHTS in MAILBOX from server in BUFFER." - (let ((mailbox (imap-utf7-encode mailbox))) - (with-current-buffer (or buffer (current-buffer)) - (imap-ok-p - (imap-send-command-wait (list "SETACL \"" - (or mailbox imap-current-mailbox) - "\" " - identifier - " " - rights)))))) - -(defun imap-mailbox-acl-delete (identifier &optional mailbox buffer) - "Removes any pair for IDENTIFIER in MAILBOX from server in BUFFER." - (let ((mailbox (imap-utf7-encode mailbox))) - (with-current-buffer (or buffer (current-buffer)) - (imap-ok-p - (imap-send-command-wait (list "DELETEACL \"" - (or mailbox imap-current-mailbox) - "\" " - identifier)))))) - - -;; Message functions: - -(defun imap-current-message (&optional buffer) - (with-current-buffer (or buffer (current-buffer)) - imap-current-message)) - -(defun imap-list-to-message-set (list) - (mapconcat (lambda (item) - (number-to-string item)) - (if (listp list) - list - (list list)) - ",")) - -(defun imap-range-to-message-set (range) - (mapconcat - (lambda (item) - (if (consp item) - (format "%d:%d" - (car item) (cdr item)) - (format "%d" item))) - (if (and (listp range) (not (listp (cdr range)))) - (list range) ;; make (1 . 2) into ((1 . 2)) - range) - ",")) - -(defun imap-fetch-asynch (uids props &optional nouidfetch buffer) - (with-current-buffer (or buffer (current-buffer)) - (imap-send-command (format "%sFETCH %s %s" (if nouidfetch "" "UID ") - (if (listp uids) - (imap-list-to-message-set uids) - uids) - props)))) - -(defun imap-fetch (uids props &optional receive nouidfetch buffer) - "Fetch properties PROPS from message set UIDS from server in BUFFER. -UIDS can be a string, number or a list of numbers. If RECEIVE -is non-nil return theese properties." - (with-current-buffer (or buffer (current-buffer)) - (when (imap-ok-p (imap-send-command-wait - (format "%sFETCH %s %s" (if nouidfetch "" "UID ") - (if (listp uids) - (imap-list-to-message-set uids) - uids) - props))) - (if (or (null receive) (stringp uids)) - t - (if (listp uids) - (mapcar (lambda (uid) - (if (listp receive) - (mapcar (lambda (prop) - (imap-message-get uid prop)) - receive) - (imap-message-get uid receive))) - uids) - (imap-message-get uids receive)))))) - -(defun imap-message-put (uid propname value &optional buffer) - (with-current-buffer (or buffer (current-buffer)) - (if imap-message-data - (put (intern (number-to-string uid) imap-message-data) - propname value) - (error "Imap-message-data is nil, uid %s prop %s value %s buffer %s" - uid propname value (current-buffer))) - t)) - -(defun imap-message-get (uid propname &optional buffer) - (with-current-buffer (or buffer (current-buffer)) - (get (intern-soft (number-to-string uid) imap-message-data) - propname))) - -(defun imap-message-map (func propname &optional buffer) - "Map a function across each mailbox in `imap-message-data', returning a list." - (with-current-buffer (or buffer (current-buffer)) - (let (result) - (mapatoms - (lambda (s) - (push (funcall func (get s 'UID) (get s propname)) result)) - imap-message-data) - result))) - -(defmacro imap-message-envelope-date (uid &optional buffer) - `(with-current-buffer (or ,buffer (current-buffer)) - (elt (imap-message-get ,uid 'ENVELOPE) 0))) - -(defmacro imap-message-envelope-subject (uid &optional buffer) - `(with-current-buffer (or ,buffer (current-buffer)) - (elt (imap-message-get ,uid 'ENVELOPE) 1))) - -(defmacro imap-message-envelope-from (uid &optional buffer) - `(with-current-buffer (or ,buffer (current-buffer)) - (elt (imap-message-get ,uid 'ENVELOPE) 2))) - -(defmacro imap-message-envelope-sender (uid &optional buffer) - `(with-current-buffer (or ,buffer (current-buffer)) - (elt (imap-message-get ,uid 'ENVELOPE) 3))) - -(defmacro imap-message-envelope-reply-to (uid &optional buffer) - `(with-current-buffer (or ,buffer (current-buffer)) - (elt (imap-message-get ,uid 'ENVELOPE) 4))) - -(defmacro imap-message-envelope-to (uid &optional buffer) - `(with-current-buffer (or ,buffer (current-buffer)) - (elt (imap-message-get ,uid 'ENVELOPE) 5))) - -(defmacro imap-message-envelope-cc (uid &optional buffer) - `(with-current-buffer (or ,buffer (current-buffer)) - (elt (imap-message-get ,uid 'ENVELOPE) 6))) - -(defmacro imap-message-envelope-bcc (uid &optional buffer) - `(with-current-buffer (or ,buffer (current-buffer)) - (elt (imap-message-get ,uid 'ENVELOPE) 7))) - -(defmacro imap-message-envelope-in-reply-to (uid &optional buffer) - `(with-current-buffer (or ,buffer (current-buffer)) - (elt (imap-message-get ,uid 'ENVELOPE) 8))) - -(defmacro imap-message-envelope-message-id (uid &optional buffer) - `(with-current-buffer (or ,buffer (current-buffer)) - (elt (imap-message-get ,uid 'ENVELOPE) 9))) - -(defmacro imap-message-body (uid &optional buffer) - `(with-current-buffer (or ,buffer (current-buffer)) - (imap-message-get ,uid 'BODY))) - -(defun imap-search (predicate &optional buffer) - (with-current-buffer (or buffer (current-buffer)) - (imap-mailbox-put 'search 'dummy) - (when (imap-ok-p (imap-send-command-wait (concat "UID SEARCH " predicate))) - (if (eq (imap-mailbox-get-1 'search imap-current-mailbox) 'dummy) - (error "Missing SEARCH response to a SEARCH command") - (imap-mailbox-get-1 'search imap-current-mailbox))))) - -(defun imap-message-flag-permanent-p (flag &optional mailbox buffer) - "Return t iff FLAG can be permanently (between IMAP sessions) saved on articles, in MAILBOX on server in BUFFER." - (with-current-buffer (or buffer (current-buffer)) - (or (member "\\*" (imap-mailbox-get 'permanentflags mailbox)) - (member flag (imap-mailbox-get 'permanentflags mailbox))))) - -(defun imap-message-flags-set (articles flags &optional silent buffer) - (when (and articles flags) - (with-current-buffer (or buffer (current-buffer)) - (imap-ok-p (imap-send-command-wait - (concat "UID STORE " articles - " FLAGS" (if silent ".SILENT") " (" flags ")")))))) - -(defun imap-message-flags-del (articles flags &optional silent buffer) - (when (and articles flags) - (with-current-buffer (or buffer (current-buffer)) - (imap-ok-p (imap-send-command-wait - (concat "UID STORE " articles - " -FLAGS" (if silent ".SILENT") " (" flags ")")))))) - -(defun imap-message-flags-add (articles flags &optional silent buffer) - (when (and articles flags) - (with-current-buffer (or buffer (current-buffer)) - (imap-ok-p (imap-send-command-wait - (concat "UID STORE " articles - " +FLAGS" (if silent ".SILENT") " (" flags ")")))))) - -(defun imap-message-copyuid-1 (mailbox) - (if (imap-capability 'UIDPLUS) - (list (nth 0 (imap-mailbox-get-1 'copyuid mailbox)) - (string-to-number (nth 2 (imap-mailbox-get-1 'copyuid mailbox)))) - (let ((old-mailbox imap-current-mailbox) - (state imap-state) - (imap-message-data (make-vector 2 0))) - (when (imap-mailbox-examine-1 mailbox) - (prog1 - (and (imap-fetch "*" "UID") - (list (imap-mailbox-get-1 'uidvalidity mailbox) - (apply 'max (imap-message-map - (lambda (uid prop) uid) 'UID)))) - (if old-mailbox - (imap-mailbox-select old-mailbox (eq state 'examine)) - (imap-mailbox-unselect))))))) - -(defun imap-message-copyuid (mailbox &optional buffer) - (with-current-buffer (or buffer (current-buffer)) - (imap-message-copyuid-1 (imap-utf7-decode mailbox)))) - -(defun imap-message-copy (articles mailbox - &optional dont-create no-copyuid buffer) - "Copy ARTICLES (a string message set) to MAILBOX on server in -BUFFER, creating mailbox if it doesn't exist. If dont-create is -non-nil, it will not create a mailbox. On success, return a list with -the UIDVALIDITY of the mailbox the article(s) was copied to as the -first element, rest of list contain the saved articles' UIDs." - (when articles - (with-current-buffer (or buffer (current-buffer)) - (let ((mailbox (imap-utf7-encode mailbox))) - (if (let ((cmd (concat "UID COPY " articles " \"" mailbox "\"")) - (imap-current-target-mailbox mailbox)) - (if (imap-ok-p (imap-send-command-wait cmd)) - t - (when (and (not dont-create) - ;; removed because of buggy Oracle server - ;; that doesn't send TRYCREATE tags (which - ;; is a MUST according to specifications): - ;;(imap-mailbox-get-1 'trycreate mailbox) - (imap-mailbox-create-1 mailbox)) - (imap-ok-p (imap-send-command-wait cmd))))) - (or no-copyuid - (imap-message-copyuid-1 mailbox))))))) - -(defun imap-message-appenduid-1 (mailbox) - (if (imap-capability 'UIDPLUS) - (imap-mailbox-get-1 'appenduid mailbox) - (let ((old-mailbox imap-current-mailbox) - (state imap-state) - (imap-message-data (make-vector 2 0))) - (when (imap-mailbox-examine-1 mailbox) - (prog1 - (and (imap-fetch "*" "UID") - (list (imap-mailbox-get-1 'uidvalidity mailbox) - (apply 'max (imap-message-map - (lambda (uid prop) uid) 'UID)))) - (if old-mailbox - (imap-mailbox-select old-mailbox (eq state 'examine)) - (imap-mailbox-unselect))))))) - -(defun imap-message-appenduid (mailbox &optional buffer) - (with-current-buffer (or buffer (current-buffer)) - (imap-message-appenduid-1 (imap-utf7-encode mailbox)))) - -(defun imap-message-append (mailbox article &optional flags date-time buffer) - "Append ARTICLE (a buffer) to MAILBOX on server in BUFFER. -FLAGS and DATE-TIME is currently not used. Return a cons holding -uidvalidity of MAILBOX and UID the newly created article got, or nil -on failure." - (let ((mailbox (imap-utf7-encode mailbox))) - (with-current-buffer (or buffer (current-buffer)) - (and (let ((imap-current-target-mailbox mailbox)) - (imap-ok-p - (imap-send-command-wait - (list "APPEND \"" mailbox "\" " article)))) - (imap-message-appenduid-1 mailbox))))) - -(defun imap-body-lines (body) - "Return number of lines in article by looking at the mime bodystructure BODY." - (if (listp body) - (if (stringp (car body)) - (cond ((and (string= (upcase (car body)) "TEXT") - (numberp (nth 7 body))) - (nth 7 body)) - ((and (string= (upcase (car body)) "MESSAGE") - (numberp (nth 9 body))) - (nth 9 body)) - (t 0)) - (apply '+ (mapcar 'imap-body-lines body))) - 0)) - -(defun imap-envelope-from (from) - "Return a from string line." - (and from - (concat (aref from 0) - (if (aref from 0) " <") - (aref from 2) - "@" - (aref from 3) - (if (aref from 0) ">")))) - - -;; Internal functions. - -(defun imap-send-command-1 (cmdstr) - (setq cmdstr (concat cmdstr imap-client-eol)) - (and imap-log - (with-current-buffer (get-buffer-create imap-log) - (buffer-disable-undo) - (goto-char (point-max)) - (insert cmdstr))) - (process-send-string imap-process cmdstr)) - -(defun imap-send-command (command &optional buffer) - (with-current-buffer (or buffer (current-buffer)) - (if (not (listp command)) (setq command (list command))) - (let ((tag (setq imap-tag (1+ imap-tag))) - cmd cmdstr) - (setq cmdstr (concat (number-to-string imap-tag) " ")) - (while (setq cmd (pop command)) - (cond ((stringp cmd) - (setq cmdstr (concat cmdstr cmd))) - ((bufferp cmd) - (let ((eol imap-client-eol) - (calcfirst imap-calculate-literal-size-first) - size) - (with-current-buffer cmd - (if calcfirst - (setq size (buffer-size))) - (when (not (equal eol "\r\n")) - ;; XXX modifies buffer! - (goto-char (point-min)) - (while (search-forward "\r\n" nil t) - (replace-match eol))) - (if (not calcfirst) - (setq size (buffer-size)))) - (setq cmdstr - (concat cmdstr (format "{%d}" size)))) - (unwind-protect - (progn - (imap-send-command-1 cmdstr) - (setq cmdstr nil) - (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) - (eol imap-client-eol)) - (with-current-buffer cmd - (and imap-log - (with-current-buffer (get-buffer-create - imap-log) - (buffer-disable-undo) - (goto-char (point-max)) - (insert-buffer-substring cmd))) - (process-send-region process (point-min) - (point-max))) - (process-send-string process imap-client-eol)))) - (setq imap-continuation nil))) - ((functionp cmd) - (imap-send-command-1 cmdstr) - (setq cmdstr nil) - (unwind-protect - (if (not (eq (imap-wait-for-tag tag) 'INCOMPLETE)) - (setq command nil);; abort command if no cont-req - (setq command (cons (funcall cmd imap-continuation) - command))) - (setq imap-continuation nil))) - (t - (error "Unknown command type")))) - (if cmdstr - (imap-send-command-1 cmdstr)) - tag))) - -(defun imap-wait-for-tag (tag &optional buffer) - (with-current-buffer (or buffer (current-buffer)) - (while (and (null imap-continuation) - (memq (process-status imap-process) '(open run)) - (< imap-reached-tag tag)) - (let ((len (/ (point-max) 1024)) - message-log-max) - (unless (< len 10) - (message "imap read: %dk" len)) - (accept-process-output imap-process 1))) - (message "") - (and (memq (process-status imap-process) '(open run)) - (or (assq tag imap-failed-tags) - (if imap-continuation - 'INCOMPLETE - 'OK))))) - -(defun imap-sentinel (process string) - (delete-process process)) - -(defun imap-find-next-line () - "Return point at end of current line, taking into account literals. -Return nil if no complete line has arrived." - (when (re-search-forward (concat imap-server-eol "\\|{\\([0-9]+\\)}" - imap-server-eol) - nil t) - (if (match-string 1) - (if (< (point-max) (+ (point) (string-to-number (match-string 1)))) - nil - (goto-char (+ (point) (string-to-number (match-string 1)))) - (imap-find-next-line)) - (point)))) - -(defun imap-arrival-filter (proc string) - "IMAP process filter." - (with-current-buffer (process-buffer proc) - (goto-char (point-max)) - (insert string) - (and imap-log - (with-current-buffer (get-buffer-create imap-log) - (buffer-disable-undo) - (goto-char (point-max)) - (insert string))) - (let (end) - (goto-char (point-min)) - (while (setq end (imap-find-next-line)) - (save-restriction - (narrow-to-region (point-min) end) - (delete-backward-char (length imap-server-eol)) - (goto-char (point-min)) - (unwind-protect - (cond ((eq imap-state 'initial) - (imap-parse-greeting)) - ((or (eq imap-state 'auth) - (eq imap-state 'nonauth) - (eq imap-state 'selected) - (eq imap-state 'examine)) - (imap-parse-response)) - (t - (message "Unknown state %s in arrival filter" - imap-state))) - (delete-region (point-min) (point-max)))))))) - - -;; Imap parser. - -(defsubst imap-forward () - (or (eobp) (forward-char))) - -;; number = 1*DIGIT -;; ; Unsigned 32-bit integer -;; ; (0 <= n < 4,294,967,296) - -(defsubst imap-parse-number () - (when (looking-at "[0-9]+") - (prog1 - (string-to-number (match-string 0)) - (goto-char (match-end 0))))) - -;; literal = "{" number "}" CRLF *CHAR8 -;; ; Number represents the number of CHAR8s - -(defsubst imap-parse-literal () - (when (looking-at "{\\([0-9]+\\)}\r\n") - (let ((pos (match-end 0)) - (len (string-to-number (match-string 1)))) - (if (< (point-max) (+ pos len)) - nil - (goto-char (+ pos len)) - (buffer-substring pos (+ pos len)))))) - -;; string = quoted / literal -;; -;; quoted = DQUOTE *QUOTED-CHAR DQUOTE -;; -;; QUOTED-CHAR = / -;; "\" quoted-specials -;; -;; quoted-specials = DQUOTE / "\" -;; -;; TEXT-CHAR = - -(defsubst imap-parse-string () - (cond ((eq (char-after) ?\") - (forward-char 1) - (let ((p (point)) (name "")) - (skip-chars-forward "^\"\\\\") - (setq name (buffer-substring p (point))) - (while (eq (char-after) ?\\) - (setq p (1+ (point))) - (forward-char 2) - (skip-chars-forward "^\"\\\\") - (setq name (concat name (buffer-substring p (point))))) - (forward-char 1) - name)) - ((eq (char-after) ?{) - (imap-parse-literal)))) - -;; nil = "NIL" - -(defsubst imap-parse-nil () - (if (looking-at "NIL") - (goto-char (match-end 0)))) - -;; nstring = string / nil - -(defsubst imap-parse-nstring () - (or (imap-parse-string) - (and (imap-parse-nil) - nil))) - -;; astring = atom / string -;; -;; atom = 1*ATOM-CHAR -;; -;; ATOM-CHAR = -;; -;; atom-specials = "(" / ")" / "{" / SP / CTL / list-wildcards / -;; quoted-specials -;; -;; list-wildcards = "%" / "*" -;; -;; quoted-specials = DQUOTE / "\" - -(defsubst imap-parse-astring () - (or (imap-parse-string) - (buffer-substring (point) - (if (re-search-forward "[(){ \r\n%*\"\\]" nil t) - (goto-char (1- (match-end 0))) - (end-of-line) - (point))))) - -;; address = "(" addr-name SP addr-adl SP addr-mailbox SP -;; addr-host ")" -;; -;; addr-adl = nstring -;; ; Holds route from [RFC-822] route-addr if -;; ; non-NIL -;; -;; addr-host = nstring -;; ; NIL indicates [RFC-822] group syntax. -;; ; Otherwise, holds [RFC-822] domain name -;; -;; addr-mailbox = nstring -;; ; NIL indicates end of [RFC-822] group; if -;; ; non-NIL and addr-host is NIL, holds -;; ; [RFC-822] group name. -;; ; Otherwise, holds [RFC-822] local-part -;; ; after removing [RFC-822] quoting -;; -;; addr-name = nstring -;; ; If non-NIL, holds phrase from [RFC-822] -;; ; mailbox after removing [RFC-822] quoting -;; - -(defsubst imap-parse-address () - (let (address) - (when (eq (char-after) ?\() - (imap-forward) - (setq address (vector (prog1 (imap-parse-nstring) - (imap-forward)) - (prog1 (imap-parse-nstring) - (imap-forward)) - (prog1 (imap-parse-nstring) - (imap-forward)) - (imap-parse-nstring))) - (when (eq (char-after) ?\)) - (imap-forward) - address)))) - -;; address-list = "(" 1*address ")" / nil -;; -;; nil = "NIL" - -(defsubst imap-parse-address-list () - (if (eq (char-after) ?\() - (let (address addresses) - (imap-forward) - (while (and (not (eq (char-after) ?\))) - ;; next line for MS Exchange bug - (progn (and (eq (char-after) ? ) (imap-forward)) t) - (setq address (imap-parse-address))) - (setq addresses (cons address addresses))) - (when (eq (char-after) ?\)) - (imap-forward) - (nreverse addresses))) - (assert (imap-parse-nil) t "In imap-parse-address-list"))) - -;; mailbox = "INBOX" / astring -;; ; INBOX is case-insensitive. All case variants of -;; ; INBOX (e.g. "iNbOx") MUST be interpreted as INBOX -;; ; not as an astring. An astring which consists of -;; ; the case-insensitive sequence "I" "N" "B" "O" "X" -;; ; is considered to be INBOX and not an astring. -;; ; Refer to section 5.1 for further -;; ; semantic details of mailbox names. - -(defsubst imap-parse-mailbox () - (let ((mailbox (imap-parse-astring))) - (if (string-equal "INBOX" (upcase mailbox)) - "INBOX" - mailbox))) - -;; greeting = "*" SP (resp-cond-auth / resp-cond-bye) CRLF -;; -;; resp-cond-auth = ("OK" / "PREAUTH") SP resp-text -;; ; Authentication condition -;; -;; resp-cond-bye = "BYE" SP resp-text - -(defun imap-parse-greeting () - "Parse a IMAP greeting." - (cond ((looking-at "\\* OK ") - (setq imap-state 'nonauth)) - ((looking-at "\\* PREAUTH ") - (setq imap-state 'auth)) - ((looking-at "\\* BYE ") - (setq imap-state 'closed)))) - -;; response = *(continue-req / response-data) response-done -;; -;; continue-req = "+" SP (resp-text / base64) CRLF -;; -;; response-data = "*" SP (resp-cond-state / resp-cond-bye / -;; mailbox-data / message-data / capability-data) CRLF -;; -;; response-done = response-tagged / response-fatal -;; -;; response-fatal = "*" SP resp-cond-bye CRLF -;; ; Server closes connection immediately -;; -;; response-tagged = tag SP resp-cond-state CRLF -;; -;; resp-cond-state = ("OK" / "NO" / "BAD") SP resp-text -;; ; Status condition -;; -;; resp-cond-bye = "BYE" SP resp-text -;; -;; mailbox-data = "FLAGS" SP flag-list / -;; "LIST" SP mailbox-list / -;; "LSUB" SP mailbox-list / -;; "SEARCH" *(SP nz-number) / -;; "STATUS" SP mailbox SP "(" -;; [status-att SP number *(SP status-att SP number)] ")" / -;; number SP "EXISTS" / -;; number SP "RECENT" -;; -;; message-data = nz-number SP ("EXPUNGE" / ("FETCH" SP msg-att)) -;; -;; capability-data = "CAPABILITY" *(SP capability) SP "IMAP4rev1" -;; *(SP capability) -;; ; IMAP4rev1 servers which offer RFC 1730 -;; ; compatibility MUST list "IMAP4" as the first -;; ; capability. - -(defun imap-parse-response () - "Parse a IMAP command response." - (let (token) - (case (setq token (read (current-buffer))) - (+ (setq imap-continuation - (or (buffer-substring (min (point-max) (1+ (point))) - (point-max)) - t))) - (* (case (prog1 (setq token (read (current-buffer))) - (imap-forward)) - (OK (imap-parse-resp-text)) - (NO (imap-parse-resp-text)) - (BAD (imap-parse-resp-text)) - (BYE (imap-parse-resp-text)) - (FLAGS (imap-mailbox-put 'flags (imap-parse-flag-list))) - (LIST (imap-parse-data-list 'list)) - (LSUB (imap-parse-data-list 'lsub)) - (SEARCH (imap-mailbox-put - 'search - (read (concat "(" (buffer-substring (point) (point-max)) ")")))) - (STATUS (imap-parse-status)) - (CAPABILITY (setq imap-capability - (read (concat "(" (upcase (buffer-substring - (point) (point-max))) - ")")))) - (ACL (imap-parse-acl)) - (t (case (prog1 (read (current-buffer)) - (imap-forward)) - (EXISTS (imap-mailbox-put 'exists token)) - (RECENT (imap-mailbox-put 'recent token)) - (EXPUNGE t) - (FETCH (imap-parse-fetch token)) - (t (message "Garbage: %s" (buffer-string))))))) - (t (let (status) - (if (not (integerp token)) - (message "Garbage: %s" (buffer-string)) - (case (prog1 (setq status (read (current-buffer))) - (imap-forward)) - (OK (progn - (setq imap-reached-tag (max imap-reached-tag token)) - (imap-parse-resp-text))) - (NO (progn - (setq imap-reached-tag (max imap-reached-tag token)) - (save-excursion - (imap-parse-resp-text)) - (let (code text) - (when (eq (char-after) ?\[) - (setq code (buffer-substring (point) - (search-forward "]"))) - (imap-forward)) - (setq text (buffer-substring (point) (point-max))) - (push (list token status code text) - imap-failed-tags)))) - (BAD (progn - (setq imap-reached-tag (max imap-reached-tag token)) - (save-excursion - (imap-parse-resp-text)) - (let (code text) - (when (eq (char-after) ?\[) - (setq code (buffer-substring (point) - (search-forward "]"))) - (imap-forward)) - (setq text (buffer-substring (point) (point-max))) - (push (list token status code text) imap-failed-tags) - (error "Internal error, tag %s status %s code %s text %s" - token status code text)))) - (t (message "Garbage: %s" (buffer-string)))))))))) - -;; resp-text = ["[" resp-text-code "]" SP] text -;; -;; text = 1*TEXT-CHAR -;; -;; TEXT-CHAR = - -(defun imap-parse-resp-text () - (imap-parse-resp-text-code)) - -;; resp-text-code = "ALERT" / -;; "BADCHARSET [SP "(" astring *(SP astring) ")" ] / -;; "NEWNAME" SP string SP string / -;; "PARSE" / -;; "PERMANENTFLAGS" SP "(" -;; [flag-perm *(SP flag-perm)] ")" / -;; "READ-ONLY" / -;; "READ-WRITE" / -;; "TRYCREATE" / -;; "UIDNEXT" SP nz-number / -;; "UIDVALIDITY" SP nz-number / -;; "UNSEEN" SP nz-number / -;; resp-text-atom [SP 1*] -;; -;; resp_code_apnd = "APPENDUID" SPACE nz_number SPACE uniqueid -;; -;; resp_code_copy = "COPYUID" SPACE nz_number SPACE set SPACE set -;; -;; set = sequence-num / (sequence-num ":" sequence-num) / -;; (set "," set) -;; ; Identifies a set of messages. For message -;; ; sequence numbers, these are consecutive -;; ; numbers from 1 to the number of messages in -;; ; the mailbox -;; ; Comma delimits individual numbers, colon -;; ; delimits between two numbers inclusive. -;; ; Example: 2,4:7,9,12:* is 2,4,5,6,7,9,12,13, -;; ; 14,15 for a mailbox with 15 messages. -;; -;; sequence-num = nz-number / "*" -;; ; * is the largest number in use. For message -;; ; sequence numbers, it is the number of messages -;; ; in the mailbox. For unique identifiers, it is -;; ; the unique identifier of the last message in -;; ; the mailbox. -;; -;; flag-perm = flag / "\*" -;; -;; flag = "\Answered" / "\Flagged" / "\Deleted" / -;; "\Seen" / "\Draft" / flag-keyword / flag-extension -;; ; Does not include "\Recent" -;; -;; flag-extension = "\" atom -;; ; Future expansion. Client implementations -;; ; MUST accept flag-extension flags. Server -;; ; implementations MUST NOT generate -;; ; flag-extension flags except as defined by -;; ; future standard or standards-track -;; ; revisions of this specification. -;; -;; flag-keyword = atom -;; -;; resp-text-atom = 1* - -(defun imap-parse-resp-text-code () - ;; xxx next line for stalker communigate pro 3.3.1 bug - (when (looking-at " \\[") - (imap-forward)) - (when (eq (char-after) ?\[) - (imap-forward) - (cond ((search-forward "PERMANENTFLAGS " nil t) - (imap-mailbox-put 'permanentflags (imap-parse-flag-list))) - ((search-forward "UIDNEXT " nil t) - (imap-mailbox-put 'uidnext (read (current-buffer)))) - ((search-forward "UNSEEN " nil t) - (imap-mailbox-put 'unseen (read (current-buffer)))) - ((looking-at "UIDVALIDITY \\([0-9]+\\)") - (imap-mailbox-put 'uidvalidity (match-string 1))) - ((search-forward "READ-ONLY" nil t) - (imap-mailbox-put 'read-only t)) - ((search-forward "NEWNAME " nil t) - (let (oldname newname) - (setq oldname (imap-parse-string)) - (imap-forward) - (setq newname (imap-parse-string)) - (imap-mailbox-put 'newname newname oldname))) - ((search-forward "TRYCREATE" nil t) - (imap-mailbox-put 'trycreate t imap-current-target-mailbox)) - ((looking-at "APPENDUID \\([0-9]+\\) \\([0-9]+\\)") - (imap-mailbox-put 'appenduid - (list (match-string 1) - (string-to-number (match-string 2))) - imap-current-target-mailbox)) - ((looking-at "COPYUID \\([0-9]+\\) \\([0-9,:]+\\) \\([0-9,:]+\\)") - (imap-mailbox-put 'copyuid (list (match-string 1) - (match-string 2) - (match-string 3)) - imap-current-target-mailbox)) - ((search-forward "ALERT] " nil t) - (message "Imap server %s information: %s" imap-server - (buffer-substring (point) (point-max))))))) - -;; mailbox-list = "(" [mbx-list-flags] ")" SP -;; (DQUOTE QUOTED-CHAR DQUOTE / nil) SP mailbox -;; -;; mbx-list-flags = *(mbx-list-oflag SP) mbx-list-sflag -;; *(SP mbx-list-oflag) / -;; mbx-list-oflag *(SP mbx-list-oflag) -;; -;; mbx-list-oflag = "\Noinferiors" / flag-extension -;; ; Other flags; multiple possible per LIST response -;; -;; mbx-list-sflag = "\Noselect" / "\Marked" / "\Unmarked" -;; ; Selectability flags; only one per LIST response -;; -;; QUOTED-CHAR = / -;; "\" quoted-specials -;; -;; quoted-specials = DQUOTE / "\" - -(defun imap-parse-data-list (type) - (let (flags delimiter mailbox) - (setq flags (imap-parse-flag-list)) - (when (looking-at " NIL\\| \"\\\\?\\(.\\)\"") - (setq delimiter (match-string 1)) - (goto-char (1+ (match-end 0))) - (when (setq mailbox (imap-parse-mailbox)) - (imap-mailbox-put type t mailbox) - (imap-mailbox-put 'list-flags flags mailbox) - (imap-mailbox-put 'delimiter delimiter mailbox))))) - -;; msg_att ::= "(" 1#("ENVELOPE" SPACE envelope / -;; "FLAGS" SPACE "(" #(flag / "\Recent") ")" / -;; "INTERNALDATE" SPACE date_time / -;; "RFC822" [".HEADER" / ".TEXT"] SPACE nstring / -;; "RFC822.SIZE" SPACE number / -;; "BODY" ["STRUCTURE"] SPACE body / -;; "BODY" section ["<" number ">"] SPACE nstring / -;; "UID" SPACE uniqueid) ")" -;; -;; date_time ::= <"> date_day_fixed "-" date_month "-" date_year -;; SPACE time SPACE zone <"> -;; -;; section ::= "[" [section_text / (nz_number *["." nz_number] -;; ["." (section_text / "MIME")])] "]" -;; -;; section_text ::= "HEADER" / "HEADER.FIELDS" [".NOT"] -;; SPACE header_list / "TEXT" -;; -;; header_fld_name ::= astring -;; -;; header_list ::= "(" 1#header_fld_name ")" - -(defsubst imap-parse-header-list () - (when (eq (char-after) ?\() - (let (strlist) - (while (not (eq (char-after) ?\))) - (imap-forward) - (push (imap-parse-astring) strlist)) - (imap-forward) - (nreverse strlist)))) - -(defsubst imap-parse-fetch-body-section () - (let ((section - (buffer-substring (point) (1- (re-search-forward "[] ]" nil t))))) - (if (eq (char-before) ? ) - (prog1 - (mapconcat 'identity (cons section (imap-parse-header-list)) " ") - (search-forward "]" nil t)) - section))) - -(defun imap-parse-fetch (response) - (when (eq (char-after) ?\() - (let (uid flags envelope internaldate rfc822 rfc822header rfc822text - rfc822size body bodydetail bodystructure) - (while (not (eq (char-after) ?\))) - (imap-forward) - (let ((token (read (current-buffer)))) - (imap-forward) - (cond ((eq token 'UID) - (setq uid (ignore-errors (read (current-buffer))))) - ((eq token 'FLAGS) - (setq flags (imap-parse-flag-list))) - ((eq token 'ENVELOPE) - (setq envelope (imap-parse-envelope))) - ((eq token 'INTERNALDATE) - (setq internaldate (imap-parse-string))) - ((eq token 'RFC822) - (setq rfc822 (imap-parse-nstring))) - ((eq token 'RFC822.HEADER) - (setq rfc822header (imap-parse-nstring))) - ((eq token 'RFC822.TEXT) - (setq rfc822text (imap-parse-nstring))) - ((eq token 'RFC822.SIZE) - (setq rfc822size (read (current-buffer)))) - ((eq token 'BODY) - (if (eq (char-before) ?\[) - (push (list - (upcase (imap-parse-fetch-body-section)) - (and (eq (char-after) ?<) - (buffer-substring (1+ (point)) - (search-forward ">" nil t))) - (progn (imap-forward) - (imap-parse-nstring))) - bodydetail) - (setq body (imap-parse-body)))) - ((eq token 'BODYSTRUCTURE) - (setq bodystructure (imap-parse-body)))))) - (when uid - (setq imap-current-message uid) - (imap-message-put uid 'UID uid) - (and flags (imap-message-put uid 'FLAGS flags)) - (and envelope (imap-message-put uid 'ENVELOPE envelope)) - (and internaldate (imap-message-put uid 'INTERNALDATE internaldate)) - (and rfc822 (imap-message-put uid 'RFC822 rfc822)) - (and rfc822header (imap-message-put uid 'RFC822.HEADER rfc822header)) - (and rfc822text (imap-message-put uid 'RFC822.TEXT rfc822text)) - (and rfc822size (imap-message-put uid 'RFC822.SIZE rfc822size)) - (and body (imap-message-put uid 'BODY body)) - (and bodydetail (imap-message-put uid 'BODYDETAIL bodydetail)) - (and bodystructure (imap-message-put uid 'BODYSTRUCTURE bodystructure)) - (run-hooks 'imap-fetch-data-hook))))) - -;; mailbox-data = ... -;; "STATUS" SP mailbox SP "(" -;; [status-att SP number -;; *(SP status-att SP number)] ")" -;; ... -;; -;; status-att = "MESSAGES" / "RECENT" / "UIDNEXT" / "UIDVALIDITY" / -;; "UNSEEN" - -(defun imap-parse-status () - (let ((mailbox (imap-parse-mailbox))) - (when (and mailbox (search-forward "(" nil t)) - (while (not (eq (char-after) ?\))) - (let ((token (read (current-buffer)))) - (cond ((eq token 'MESSAGES) - (imap-mailbox-put 'messages (read (current-buffer)) mailbox)) - ((eq token 'RECENT) - (imap-mailbox-put 'recent (read (current-buffer)) mailbox)) - ((eq token 'UIDNEXT) - (imap-mailbox-put 'uidnext (read (current-buffer)) mailbox)) - ((eq token 'UIDVALIDITY) - (and (looking-at " \\([0-9]+\\)") - (imap-mailbox-put 'uidvalidity (match-string 1) mailbox) - (goto-char (match-end 1)))) - ((eq token 'UNSEEN) - (imap-mailbox-put 'unseen (read (current-buffer)) mailbox)) - (t - (message "Unknown status data %s in mailbox %s ignored" - token mailbox)))))))) - -;; acl_data ::= "ACL" SPACE mailbox *(SPACE identifier SPACE -;; rights) -;; -;; identifier ::= astring -;; -;; rights ::= astring - -(defun imap-parse-acl () - (let ((mailbox (imap-parse-mailbox)) - identifier rights acl) - (while (eq (char-after) ?\ ) - (imap-forward) - (setq identifier (imap-parse-astring)) - (imap-forward) - (setq rights (imap-parse-astring)) - (setq acl (append acl (list (cons identifier rights))))) - (imap-mailbox-put 'acl acl mailbox))) - -;; flag-list = "(" [flag *(SP flag)] ")" -;; -;; flag = "\Answered" / "\Flagged" / "\Deleted" / -;; "\Seen" / "\Draft" / flag-keyword / flag-extension -;; ; Does not include "\Recent" -;; -;; flag-keyword = atom -;; -;; flag-extension = "\" atom -;; ; Future expansion. Client implementations -;; ; MUST accept flag-extension flags. Server -;; ; implementations MUST NOT generate -;; ; flag-extension flags except as defined by -;; ; future standard or standards-track -;; ; revisions of this specification. - -(defun imap-parse-flag-list () - (let (flag-list start) - (assert (eq (char-after) ?\() t "In imap-parse-flag-list") - (while (and (not (eq (char-after) ?\))) - (setq start (progn - (imap-forward) - ;; next line for Courier IMAP bug. - (skip-chars-forward " ") - (point))) - (> (skip-chars-forward "^ )" (imap-point-at-eol)) 0)) - (push (buffer-substring start (point)) flag-list)) - (assert (eq (char-after) ?\)) t "In imap-parse-flag-list") - (imap-forward) - (nreverse flag-list))) - -;; envelope = "(" env-date SP env-subject SP env-from SP env-sender SP -;; env-reply-to SP env-to SP env-cc SP env-bcc SP -;; env-in-reply-to SP env-message-id ")" -;; -;; env-bcc = "(" 1*address ")" / nil -;; -;; env-cc = "(" 1*address ")" / nil -;; -;; env-date = nstring -;; -;; env-from = "(" 1*address ")" / nil -;; -;; env-in-reply-to = nstring -;; -;; env-message-id = nstring -;; -;; env-reply-to = "(" 1*address ")" / nil -;; -;; env-sender = "(" 1*address ")" / nil -;; -;; env-subject = nstring -;; -;; env-to = "(" 1*address ")" / nil - -(defun imap-parse-envelope () - (when (eq (char-after) ?\() - (imap-forward) - (vector (prog1 (imap-parse-nstring);; date - (imap-forward)) - (prog1 (imap-parse-nstring);; subject - (imap-forward)) - (prog1 (imap-parse-address-list);; from - (imap-forward)) - (prog1 (imap-parse-address-list);; sender - (imap-forward)) - (prog1 (imap-parse-address-list);; reply-to - (imap-forward)) - (prog1 (imap-parse-address-list);; to - (imap-forward)) - (prog1 (imap-parse-address-list);; cc - (imap-forward)) - (prog1 (imap-parse-address-list);; bcc - (imap-forward)) - (prog1 (imap-parse-nstring);; in-reply-to - (imap-forward)) - (prog1 (imap-parse-nstring);; message-id - (imap-forward))))) - -;; body-fld-param = "(" string SP string *(SP string SP string) ")" / nil - -(defsubst imap-parse-string-list () - (cond ((eq (char-after) ?\();; body-fld-param - (let (strlist str) - (imap-forward) - (while (setq str (imap-parse-string)) - (push str strlist) - ;; buggy stalker communigate pro 3.0 doesn't print SPC - ;; between body-fld-param's sometimes - (or (eq (char-after) ?\") - (imap-forward))) - (nreverse strlist))) - ((imap-parse-nil) - nil))) - -;; body-extension = nstring / number / -;; "(" body-extension *(SP body-extension) ")" -;; ; Future expansion. Client implementations -;; ; MUST accept body-extension fields. Server -;; ; implementations MUST NOT generate -;; ; body-extension fields except as defined by -;; ; future standard or standards-track -;; ; revisions of this specification. - -(defun imap-parse-body-extension () - (if (eq (char-after) ?\() - (let (b-e) - (imap-forward) - (push (imap-parse-body-extension) b-e) - (while (eq (char-after) ?\ ) - (imap-forward) - (push (imap-parse-body-extension) b-e)) - (assert (eq (char-after) ?\)) t "In imap-parse-body-extension") - (imap-forward) - (nreverse b-e)) - (or (imap-parse-number) - (imap-parse-nstring)))) - -;; body-ext-1part = body-fld-md5 [SP body-fld-dsp [SP body-fld-lang -;; *(SP body-extension)]] -;; ; MUST NOT be returned on non-extensible -;; ; "BODY" fetch -;; -;; body-ext-mpart = body-fld-param [SP body-fld-dsp [SP body-fld-lang -;; *(SP body-extension)]] -;; ; MUST NOT be returned on non-extensible -;; ; "BODY" fetch - -(defsubst imap-parse-body-ext () - (let (ext) - (when (eq (char-after) ?\ );; body-fld-dsp - (imap-forward) - (let (dsp) - (if (eq (char-after) ?\() - (progn - (imap-forward) - (push (imap-parse-string) dsp) - (imap-forward) - (push (imap-parse-string-list) dsp) - (imap-forward)) - (assert (imap-parse-nil) t "In imap-parse-body-ext")) - (push (nreverse dsp) ext)) - (when (eq (char-after) ?\ );; body-fld-lang - (imap-forward) - (if (eq (char-after) ?\() - (push (imap-parse-string-list) ext) - (push (imap-parse-nstring) ext)) - (while (eq (char-after) ?\ );; body-extension - (imap-forward) - (setq ext (append (imap-parse-body-extension) ext))))) - ext)) - -;; body = "(" body-type-1part / body-type-mpart ")" -;; -;; body-ext-1part = body-fld-md5 [SP body-fld-dsp [SP body-fld-lang -;; *(SP body-extension)]] -;; ; MUST NOT be returned on non-extensible -;; ; "BODY" fetch -;; -;; body-ext-mpart = body-fld-param [SP body-fld-dsp [SP body-fld-lang -;; *(SP body-extension)]] -;; ; MUST NOT be returned on non-extensible -;; ; "BODY" fetch -;; -;; body-fields = body-fld-param SP body-fld-id SP body-fld-desc SP -;; body-fld-enc SP body-fld-octets -;; -;; body-fld-desc = nstring -;; -;; body-fld-dsp = "(" string SP body-fld-param ")" / nil -;; -;; body-fld-enc = (DQUOTE ("7BIT" / "8BIT" / "BINARY" / "BASE64"/ -;; "QUOTED-PRINTABLE") DQUOTE) / string -;; -;; body-fld-id = nstring -;; -;; body-fld-lang = nstring / "(" string *(SP string) ")" -;; -;; body-fld-lines = number -;; -;; body-fld-md5 = nstring -;; -;; body-fld-octets = number -;; -;; body-fld-param = "(" string SP string *(SP string SP string) ")" / nil -;; -;; body-type-1part = (body-type-basic / body-type-msg / body-type-text) -;; [SP body-ext-1part] -;; -;; body-type-basic = media-basic SP body-fields -;; ; MESSAGE subtype MUST NOT be "RFC822" -;; -;; body-type-msg = media-message SP body-fields SP envelope -;; SP body SP body-fld-lines -;; -;; body-type-text = media-text SP body-fields SP body-fld-lines -;; -;; body-type-mpart = 1*body SP media-subtype -;; [SP body-ext-mpart] -;; -;; media-basic = ((DQUOTE ("APPLICATION" / "AUDIO" / "IMAGE" / -;; "MESSAGE" / "VIDEO") DQUOTE) / string) SP media-subtype -;; ; Defined in [MIME-IMT] -;; -;; media-message = DQUOTE "MESSAGE" DQUOTE SP DQUOTE "RFC822" DQUOTE -;; ; Defined in [MIME-IMT] -;; -;; media-subtype = string -;; ; Defined in [MIME-IMT] -;; -;; media-text = DQUOTE "TEXT" DQUOTE SP media-subtype -;; ; Defined in [MIME-IMT] - -(defun imap-parse-body () - (let (body) - (when (eq (char-after) ?\() - (imap-forward) - (if (eq (char-after) ?\() - (let (subbody) - (while (and (eq (char-after) ?\() - (setq subbody (imap-parse-body))) - ;; buggy stalker communigate pro 3.0 insert a SPC between - ;; parts in multiparts - (when (and (eq (char-after) ?\ ) - (eq (char-after (1+ (point))) ?\()) - (imap-forward)) - (push subbody body)) - (imap-forward) - (push (imap-parse-string) body);; media-subtype - (when (eq (char-after) ?\ );; body-ext-mpart: - (imap-forward) - (if (eq (char-after) ?\();; body-fld-param - (push (imap-parse-string-list) body) - (push (and (imap-parse-nil) nil) body)) - (setq body - (append (imap-parse-body-ext) body)));; body-ext-... - (assert (eq (char-after) ?\)) t "In imap-parse-body") - (imap-forward) - (nreverse body)) - - (push (imap-parse-string) body);; media-type - (imap-forward) - (push (imap-parse-string) body);; media-subtype - (imap-forward) - ;; next line for Sun SIMS bug - (and (eq (char-after) ? ) (imap-forward)) - (if (eq (char-after) ?\();; body-fld-param - (push (imap-parse-string-list) body) - (push (and (imap-parse-nil) nil) body)) - (imap-forward) - (push (imap-parse-nstring) body);; body-fld-id - (imap-forward) - (push (imap-parse-nstring) body);; body-fld-desc - (imap-forward) - ;; next `or' for Sun SIMS bug, it regard body-fld-enc as a - ;; nstring and return NIL instead of defaulting back to 7BIT - ;; as the standard says. - (push (or (imap-parse-nstring) "7BIT") body);; body-fld-enc - (imap-forward) - (push (imap-parse-number) body);; body-fld-octets - - ;; ok, we're done parsing the required parts, what comes now is one - ;; of three things: - ;; - ;; envelope (then we're parsing body-type-msg) - ;; body-fld-lines (then we're parsing body-type-text) - ;; body-ext-1part (then we're parsing body-type-basic) - ;; - ;; the problem is that the two first are in turn optionally followed - ;; by the third. So we parse the first two here (if there are any)... - - (when (eq (char-after) ?\ ) - (imap-forward) - (let (lines) - (cond ((eq (char-after) ?\();; body-type-msg: - (push (imap-parse-envelope) body);; envelope - (imap-forward) - (push (imap-parse-body) body);; body - ;; buggy stalker communigate pro 3.0 doesn't print - ;; number of lines in message/rfc822 attachment - (if (eq (char-after) ?\)) - (push 0 body) - (imap-forward) - (push (imap-parse-number) body))) ;; body-fld-lines - ((setq lines (imap-parse-number)) ;; body-type-text: - (push lines body)) ;; body-fld-lines - (t - (backward-char))))) ;; no match... - - ;; ...and then parse the third one here... - - (when (eq (char-after) ?\ );; body-ext-1part: - (imap-forward) - (push (imap-parse-nstring) body);; body-fld-md5 - (setq body (append (imap-parse-body-ext) body)));; body-ext-1part.. - - (assert (eq (char-after) ?\)) t "In imap-parse-body 2") - (imap-forward) - (nreverse body))))) - -(when imap-debug ; (untrace-all) - (require 'trace) - (buffer-disable-undo (get-buffer-create imap-debug)) - (mapcar (lambda (f) (trace-function-background f imap-debug)) - '( - imap-read-passwd - imap-utf7-encode - imap-utf7-decode - imap-error-text - imap-kerberos4s-p - imap-kerberos4-open - imap-ssl-p - imap-ssl-open - imap-network-p - imap-network-open - imap-interactive-login - imap-kerberos4a-p - imap-kerberos4-auth - imap-cram-md5-p - imap-cram-md5-auth - imap-login-p - imap-login-auth - imap-anonymous-p - imap-anonymous-auth - imap-open-1 - imap-open - imap-opened - imap-authenticate - imap-close - imap-capability - imap-namespace - imap-send-command-wait - imap-mailbox-put - imap-mailbox-get - imap-mailbox-map-1 - imap-mailbox-map - imap-current-mailbox - imap-current-mailbox-p-1 - imap-current-mailbox-p - imap-mailbox-select-1 - imap-mailbox-select - imap-mailbox-examine-1 - imap-mailbox-examine - imap-mailbox-unselect - imap-mailbox-expunge - imap-mailbox-close - imap-mailbox-create-1 - imap-mailbox-create - imap-mailbox-delete - imap-mailbox-rename - imap-mailbox-lsub - imap-mailbox-list - imap-mailbox-subscribe - imap-mailbox-unsubscribe - imap-mailbox-status - imap-mailbox-acl-get - imap-mailbox-acl-set - imap-mailbox-acl-delete - imap-current-message - imap-list-to-message-set - imap-fetch-asynch - imap-fetch - imap-message-put - imap-message-get - imap-message-map - imap-search - imap-message-flag-permanent-p - imap-message-flags-set - imap-message-flags-del - imap-message-flags-add - imap-message-copyuid-1 - imap-message-copyuid - imap-message-copy - imap-message-appenduid-1 - imap-message-appenduid - imap-message-append - imap-body-lines - imap-envelope-from - imap-send-command-1 - imap-send-command - imap-wait-for-tag - imap-sentinel - imap-find-next-line - imap-arrival-filter - imap-parse-greeting - imap-parse-response - imap-parse-resp-text - imap-parse-resp-text-code - imap-parse-data-list - imap-parse-fetch - imap-parse-status - imap-parse-acl - imap-parse-flag-list - imap-parse-envelope - imap-parse-body-extension - imap-parse-body - ))) - -(provide 'imap) - -;;; imap.el ends here diff --git a/lisp/lpath.el b/lisp/lpath.el deleted file mode 100644 index bc7257b..0000000 --- a/lisp/lpath.el +++ /dev/null @@ -1,130 +0,0 @@ -;; Shut up. - -(defvar byte-compile-default-warnings) - -(defun maybe-fbind (args) - (while args - (or (fboundp (car args)) - (defalias (car args) 'ignore)) - (setq args (cdr args)))) - -(defun maybe-bind (args) - (mapcar (lambda (var) (unless (boundp var) (set var nil))) args)) - -(maybe-fbind '(babel-fetch - babel-wash create-image decode-coding-string display-graphic-p - bbdb-complete-name - display-time-event-handler - find-image font-create-object gnus-mule-get-coding-system - font-lock-set-defaults - image-size image-type-available-p insert-image - make-temp-file message-xmas-redefine - mail-aliases-setup mm-copy-tree - mule-write-region-no-coding-system put-image - ring-elements - charsetp - coding-system-p - propertize make-mode-line-mouse2-map - make-mode-line-mouse-map - rmail-select-summary rmail-summary-exists rmail-update-summary - sc-cite-regexp set-font-family set-font-size temp-directory - string-as-multibyte - tool-bar-add-item tool-bar-add-item-from-menu - url-view-url vcard-pretty-print - url-insert-file-contents - w3-coding-system-for-mime-charset w3-prepare-buffer w3-region - widget-make-intangible x-defined-colors)) - -(maybe-bind '(adaptive-fill-first-line-regexp - adaptive-fill-regexp babel-history babel-translations - default-enable-multibyte-characters - enable-multibyte-characters - display-time-mail-function imap-password mail-mode-hook - filladapt-mode - mc-pgp-always-sign - gpg-unabbrev-trust-alist - nnoo-definition-alist - current-language-environment - language-info-alist - url-current-callback-func url-be-asynchronous - url-current-callback-data url-working-buffer - url-current-mime-headers w3-meta-charset-content-type-regexp - w3-meta-content-type-charset-regexp)) - -(if (featurep 'xemacs) - (progn - (defvar track-mouse nil) - (maybe-fbind '(char-charset - coding-system-get compute-motion coordinates-in-window-p - delete-overlay easy-menu-create-keymaps - error-message-string event-click-count event-end - event-start facemenu-add-new-face facemenu-get-face - find-charset-region find-coding-systems-for-charsets - find-coding-systems-region find-non-ascii-charset-region - frame-face-alist get-charset-property internal-find-face - internal-next-face-id mail-abbrevs-setup make-char-table - make-face-internal make-face-x-resource-internal - make-overlay mouse-minibuffer-check mouse-movement-p - mouse-scroll-subr overlay-buffer overlay-end - overlay-get overlay-lists overlay-put - overlay-start posn-point posn-window - read-event read-event run-with-idle-timer - set-buffer-multibyte set-char-table-range - set-face-stipple set-frame-face-alist track-mouse - url-retrieve w3-form-encode-xwfu window-at - window-edges x-color-values x-popup-menu browse-url - frame-char-height frame-char-width - xml-parse-region)) - (maybe-bind '(buffer-display-table - buffer-file-coding-system font-lock-defaults - global-face-data gnus-article-x-face-too-ugly - gnus-newsgroup-charset gnus-newsgroup-emphasis-alist - gnus-newsgroup-name mark-active - mouse-selection-click-count - mouse-selection-click-count-buffer - temporary-file-directory transient-mark-mode - url-current-mime-type - user-full-name user-login-name - w3-image-mappings))) - (maybe-bind '(browse-url-browser-function - enable-multibyte-characters help-echo-owns-message)) - (maybe-fbind '(Info-goto-node - add-submenu annotation-glyph annotationp babel-as-string - button-press-event-p characterp color-instance-name - color-instance-rgb-components color-name delete-annotation - device-class device-on-window-system-p device-type - display-error event-glyph event-object event-point - events-to-keys face-doc-string find-face frame-device - frame-property get-popup-menu-response glyph-height - glyph-property glyph-width glyphp make-annotation - make-event - make-color-instance make-extent make-glyph make-gui-button - make-image-specifier map-extents next-command-event - pp-to-string read-color set-extent-property - set-face-doc-string set-glyph-image set-glyph-property - specifier-instance url-generic-parse-url - valid-image-instantiator-format-p w3-do-setup - window-pixel-height window-pixel-width - xml-parse-region))) - -;; T-gnus. -(let ((functions-variables - (cond - ((featurep 'xemacs) - nil) - ((>= emacs-major-version 21) - '((function-max-args smiley-encode-buffer))) - ((boundp 'MULE) - '((coding-system-get - compose-mail file-name-extension find-coding-systems-region - function-max-args get-charset-property shell-command-to-string - smiley-encode-buffer))) - (t - '((function-max-args smiley-encode-buffer)))))) - (maybe-fbind (car functions-variables)) - (maybe-bind (car (cdr functions-variables)))) - -(defun nnkiboze-score-file (a) - ) - -(provide 'lpath) diff --git a/lisp/mail-parse.el b/lisp/mail-parse.el deleted file mode 100644 index 95a3359..0000000 --- a/lisp/mail-parse.el +++ /dev/null @@ -1,71 +0,0 @@ -;;; mail-parse.el --- Interface functions for parsing mail -;; Copyright (C) 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; This file contains wrapper functions for a wide range of mail -;; parsing functions. The idea is that there are low-level libraries -;; that impement according to various specs (RFC2231, DRUMS, USEFOR), -;; but that programmers that want to parse some header (say, -;; Content-Type) will want to use the latest spec. -;; -;; So while each low-level library (rfc2231.el, for instance) decodes -;; faithfully according to that (proposed) standard, this library is -;; the interface library. If some later RFC supersedes RFC2231, one -;; would just have to write a new low-level library, adjust the -;; aliases in this library, and the users and programmers won't notice -;; any changes. - -;;; Code: - -(require 'mail-prsvr) -(require 'ietf-drums) -(require 'rfc2231) -(require 'rfc2047) -(require 'rfc2045) - -(defalias 'mail-header-parse-content-type 'rfc2231-parse-qp-string) -(defalias 'mail-header-parse-content-disposition 'rfc2231-parse-qp-string) -(defalias 'mail-content-type-get 'rfc2231-get-value) -;(defalias 'mail-header-encode-parameter 'rfc2045-encode-string) -(defalias 'mail-header-encode-parameter 'rfc2231-encode-string) - -(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) -(defalias 'mail-header-parse-date 'ietf-drums-parse-date) -(defalias 'mail-narrow-to-head 'ietf-drums-narrow-to-header) -(defalias 'mail-quote-string 'ietf-drums-quote-string) - -(defalias 'mail-header-narrow-to-field 'rfc2047-narrow-to-field) -(defalias 'mail-encode-encoded-word-region 'rfc2047-encode-region) -(defalias 'mail-encode-encoded-word-buffer 'rfc2047-encode-message-header) -(defalias 'mail-encode-encoded-word-string 'rfc2047-encode-string) -(defalias 'mail-decode-encoded-word-region 'rfc2047-decode-region) -(defalias 'mail-decode-encoded-word-string 'rfc2047-decode-string) - -(provide 'mail-parse) - -;;; mail-parse.el ends here diff --git a/lisp/mail-prsvr.el b/lisp/mail-prsvr.el deleted file mode 100644 index 2566abc..0000000 --- a/lisp/mail-prsvr.el +++ /dev/null @@ -1,44 +0,0 @@ -;;; mail-prsvr.el --- Interface variables for parsing mail -;; Copyright (C) 1999, 2000 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(defvar mail-parse-charset nil - "Default charset used by low-level libraries. -This variable should never be set. Instead, it should be bound by -functions that wish to call mail-parse functions and let them know -what the desired charset is to be.") - -(defvar mail-parse-mule-charset nil - "Default MULE charset used by low-level libraries. -This variable should never be set.") - -(defvar mail-parse-ignored-charsets nil - "Ignored charsets used by low-level libraries. -This variable should never be set. Instead, it should be bound by -functions that wish to call mail-parse functions and let them know -what the desired charsets is to be ignored.") - -(provide 'mail-prsvr) - -;;; mail-prsvr.el ends here diff --git a/lisp/mail-source.el b/lisp/mail-source.el deleted file mode 100644 index 136704c..0000000 --- a/lisp/mail-source.el +++ /dev/null @@ -1,970 +0,0 @@ -;;; mail-source.el --- functions for fetching mail -;; Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news, mail - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile - (require 'cl) - (require 'imap) - (eval-when-compile (defvar display-time-mail-function))) -(eval-and-compile - (defvar pop3-leave-mail-on-server) - (autoload 'pop3-movemail "pop3") - (autoload 'pop3-get-message-count "pop3") - (autoload 'nnheader-cancel-timer "nnheader") - (autoload 'nnheader-run-at-time "nnheader")) -(require 'format-spec) -(require 'message) ;; for `message-directory' - -(defgroup mail-source nil - "The mail-fetching library." - :version "21.1" - :group 'gnus) - -;; Define these at compile time to avoid dragging in imap always. -(defconst mail-source-imap-authenticators - (eval-when-compile - (mapcar (lambda (a) - (list 'const (car a))) - imap-authenticator-alist))) -(defconst mail-source-imap-streams - (eval-when-compile - (mapcar (lambda (a) - (list 'const (car a))) - imap-stream-alist))) - -(defcustom mail-sources nil - "*Where the mail backends will look for incoming mail. -This variable is a list of mail source specifiers. -See Info node `(gnus)Mail Source Specifiers'." - :group 'mail-source - :type `(repeat - (choice :format "%[Value Menu%] %v" - :value (file) - (cons :tag "Spool file" - (const :format "" file) - (checklist :tag "Options" :greedy t - (group :inline t - (const :format "" :value :path) - file))) - (cons :tag "Several files in a directory" - (const :format "" directory) - (checklist :tag "Options" :greedy t - (group :inline t - (const :format "" :value :path) - (directory :tag "Path")) - (group :inline t - (const :format "" :value :suffix) - (string :tag "Suffix")) - (group :inline t - (const :format "" :value :predicate) - (function :tag "Predicate")) - (group :inline t - (const :format "" :value :prescript) - (string :tag "Prescript")) - (group :inline t - (const :format "" :value :postscript) - (string :tag "Postscript")) - (group :inline t - (const :format "" :value :plugged) - (boolean :tag "Plugged")))) - (cons :tag "POP3 server" - (const :format "" pop) - (checklist :tag "Options" :greedy t - (group :inline t - (const :format "" :value :server) - (string :tag "Server")) - (group :inline t - (const :format "" :value :port) - (choice :tag "Port" - :value "pop3" - (number :format "%v") - (string :format "%v"))) - (group :inline t - (const :format "" :value :user) - (string :tag "User")) - (group :inline t - (const :format "" :value :password) - (string :tag "Password")) - (group :inline t - (const :format "" :value :program) - (string :tag "Program")) - (group :inline t - (const :format "" :value :prescript) - (string :tag "Prescript")) - (group :inline t - (const :format "" :value :postscript) - (string :tag "Postscript")) - (group :inline t - (const :format "" :value :function) - (function :tag "Function")) - (group :inline t - (const :format "" - :value :authentication) - (choice :tag "Authentication" - :value apop - (const password) - (const apop))) - (group :inline t - (const :format "" :value :plugged) - (boolean :tag "Plugged")))) - (cons :tag "Maildir (qmail, postfix...)" - (const :format "" maildir) - (checklist :tag "Options" :greedy t - (group :inline t - (const :format "" :value :path) - (directory :tag "Path")) - (group :inline t - (const :format "" :value :plugged) - (boolean :tag "Plugged")))) - (cons :tag "IMAP server" - (const :format "" imap) - (checklist :tag "Options" :greedy t - (group :inline t - (const :format "" :value :server) - (string :tag "Server")) - (group :inline t - (const :format "" :value :port) - (choice :tag "Port" - :value 143 - number string)) - (group :inline t - (const :format "" :value :user) - (string :tag "User")) - (group :inline t - (const :format "" :value :password) - (string :tag "Password")) - (group :inline t - (const :format "" :value :stream) - (choice :tag "Stream" - :value network - ,@mail-source-imap-streams)) - (group :inline t - (const :format "" :value :program) - (string :tag "Program")) - (group :inline t - (const :format "" - :value :authenticator) - (choice :tag "Authenticator" - :value login - ,@mail-source-imap-authenticators)) - (group :inline t - (const :format "" :value :mailbox) - (string :tag "Mailbox" - :value "INBOX")) - (group :inline t - (const :format "" :value :predicate) - (string :tag "Predicate" - :value "UNSEEN UNDELETED")) - (group :inline t - (const :format "" :value :fetchflag) - (string :tag "Fetchflag" - :value "\\Deleted")) - (group :inline t - (const :format "" - :value :dontexpunge) - (boolean :tag "Dontexpunge")) - (group :inline t - (const :format "" :value :plugged) - (boolean :tag "Plugged")))) - (cons :tag "Webmail server" - (const :format "" webmail) - (checklist :tag "Options" :greedy t - (group :inline t - (const :format "" :value :subtype) - ;; Should be generated from - ;; `webmail-type-definition', but we - ;; can't require webmail without W3. - (choice :tag "Subtype" - :value hotmail - (const hotmail) - (const yahoo) - (const netaddress) - (const netscape) - (const my-deja))) - (group :inline t - (const :format "" :value :user) - (string :tag "User")) - (group :inline t - (const :format "" :value :password) - (string :tag "Password")) - (group :inline t - (const :format "" - :value :dontexpunge) - (boolean :tag "Dontexpunge")) - (group :inline t - (const :format "" :value :plugged) - (boolean :tag "Plugged"))))))) - -(defcustom mail-source-primary-source nil - "*Primary source for incoming mail. -If non-nil, this maildrop will be checked periodically for new mail." - :group 'mail-source - :type 'sexp) - -(defcustom mail-source-flash t - "*If non-nil, flash periodically when mail is available." - :group 'mail-source - :type 'boolean) - -(defcustom mail-source-crash-box "~/.emacs-mail-crash-box" - "File where mail will be stored while processing it." - :group 'mail-source - :type 'file) - -(defcustom mail-source-directory message-directory - "Directory where files (if any) will be stored." - :group 'mail-source - :type 'directory) - -(defcustom mail-source-default-file-modes 384 - "Set the mode bits of all new mail files to this integer." - :group 'mail-source - :type 'integer) - -(defcustom mail-source-delete-incoming nil - "*If non-nil, delete incoming files after handling." - :group 'mail-source - :type 'boolean) - -(defcustom mail-source-incoming-file-prefix "Incoming" - "Prefix for file name for storing incoming mail" - :group 'mail-source - :type 'string) - -(defcustom mail-source-report-new-mail-interval 5 - "Interval in minutes between checks for new mail." - :group 'mail-source - :type 'number) - -(defcustom mail-source-idle-time-delay 5 - "Number of idle seconds to wait before checking for new mail." - :group 'mail-source - :type 'number) - -;;; Internal variables. - -(defvar mail-source-string "" - "A dynamically bound string that says what the current mail source is.") - -(defvar mail-source-new-mail-available nil - "Flag indicating when new mail is available.") - -(eval-and-compile - (defvar mail-source-common-keyword-map - '((:plugged)) - "Mapping from keywords to default values. -Common keywords should be listed here.") - - (defvar mail-source-keyword-map - '((file - (:prescript) - (:prescript-delay) - (:postscript) - (:path (or (getenv "MAIL") - (expand-file-name (user-login-name) rmail-spool-directory)))) - (directory - (:path) - (:suffix ".spool") - (:predicate identity)) - (pop - (:prescript) - (:prescript-delay) - (:postscript) - (:server (getenv "MAILHOST")) - (:port 110) - (:user (or (user-login-name) (getenv "LOGNAME") (getenv "USER"))) - (:program) - (:function) - (:password) - (:connection) - (:authentication password) - (:leave)) - (maildir - (:path (or (getenv "MAILDIR") "~/Maildir/")) - (:subdirs ("new" "cur")) - (:function)) - (imap - (:server (getenv "MAILHOST")) - (:port) - (:stream) - (:program) - (:authentication) - (:user (or (user-login-name) (getenv "LOGNAME") (getenv "USER"))) - (:password) - (:mailbox "INBOX") - (:predicate "UNSEEN UNDELETED") - (:fetchflag "\\Deleted") - (:dontexpunge)) - (webmail - (:subtype hotmail) - (:user (or (user-login-name) (getenv "LOGNAME") (getenv "USER"))) - (:password) - (:dontexpunge) - (:authentication password))) - "Mapping from keywords to default values. -All keywords that can be used must be listed here.")) - -(defvar mail-source-fetcher-alist - '((file mail-source-fetch-file) - (directory mail-source-fetch-directory) - (pop mail-source-fetch-pop) - (maildir mail-source-fetch-maildir) - (imap mail-source-fetch-imap) - (webmail mail-source-fetch-webmail)) - "A mapping from source type to fetcher function.") - -(defvar mail-source-password-cache nil) - -(defvar mail-source-plugged t) - -;;; Functions - -(eval-and-compile - (defun mail-source-strip-keyword (keyword) - "Strip the leading colon off the KEYWORD." - (intern (substring (symbol-name keyword) 1)))) - -(eval-and-compile - (defun mail-source-bind-1 (type) - (let* ((defaults (cdr (assq type mail-source-keyword-map))) - default bind) - (while (setq default (pop defaults)) - (push (list (mail-source-strip-keyword (car default)) - nil) - bind)) - bind))) - -(defmacro mail-source-bind (type-source &rest body) - "Return a `let' form that binds all variables in source TYPE. -TYPE-SOURCE is a list where the first element is the TYPE, and -the second variable is the SOURCE. -At run time, the mail source specifier SOURCE will be inspected, -and the variables will be set according to it. Variables not -specified will be given default values. - -After this is done, BODY will be executed in the scope -of the `let' form. - -The variables bound and their default values are described by -the `mail-source-keyword-map' variable." - `(let ,(mail-source-bind-1 (car type-source)) - (mail-source-set-1 ,(cadr type-source)) - ,@body)) - -(put 'mail-source-bind 'lisp-indent-function 1) -(put 'mail-source-bind 'edebug-form-spec '(form body)) - -(defun mail-source-set-1 (source) - (let* ((type (pop source)) - (defaults (cdr (assq type mail-source-keyword-map))) - default value keyword) - (while (setq default (pop defaults)) - (set (mail-source-strip-keyword (setq keyword (car default))) - (if (setq value (plist-get source keyword)) - (mail-source-value value) - (mail-source-value (cadr default))))))) - -(eval-and-compile - (defun mail-source-bind-common-1 () - (let* ((defaults mail-source-common-keyword-map) - default bind) - (while (setq default (pop defaults)) - (push (list (mail-source-strip-keyword (car default)) - nil) - bind)) - bind))) - -(defun mail-source-set-common-1 (source) - (let* ((type (pop source)) - (defaults mail-source-common-keyword-map) - (defaults-1 (cdr (assq type mail-source-keyword-map))) - default value keyword) - (while (setq default (pop defaults)) - (set (mail-source-strip-keyword (setq keyword (car default))) - (if (setq value (plist-get source keyword)) - (mail-source-value value) - (if (setq value (assq keyword defaults-1)) - (mail-source-value (cadr value)) - (mail-source-value (cadr default)))))))) - -(defmacro mail-source-bind-common (source &rest body) - "Return a `let' form that binds all common variables. -See `mail-source-bind'." - `(let ,(mail-source-bind-common-1) - (mail-source-set-common-1 source) - ,@body)) - -(put 'mail-source-bind-common 'lisp-indent-function 1) -(put 'mail-source-bind-common 'edebug-form-spec '(form body)) - -(defun mail-source-value (value) - "Return the value of VALUE." - (cond - ;; String - ((stringp value) - value) - ;; Function - ((and (listp value) - (functionp (car value))) - (eval value)) - ;; Just return the value. - (t - value))) - -(defun mail-source-fetch (source callback) - "Fetch mail from SOURCE and call CALLBACK zero or more times. -CALLBACK will be called with the name of the file where (some of) -the mail from SOURCE is put. -Return the number of files that were found." - (mail-source-bind-common source - (if (or mail-source-plugged plugged) - (save-excursion - (let ((function (cadr (assq (car source) mail-source-fetcher-alist))) - (found 0)) - (unless function - (error "%S is an invalid mail source specification" source)) - ;; If there's anything in the crash box, we do it first. - (when (file-exists-p mail-source-crash-box) - (message "Processing mail from %s..." mail-source-crash-box) - (setq found (mail-source-callback - callback mail-source-crash-box))) - (+ found - (condition-case err - (funcall function source callback) - (error - (unless (yes-or-no-p - (format "Mail source error (%s). Continue? " err)) - (error "Cannot get new mail")) - 0)))))))) - -(defun mail-source-make-complex-temp-name (prefix) - (let ((newname (make-temp-name prefix)) - (newprefix prefix)) - (while (file-exists-p newname) - (setq newprefix (concat newprefix "x")) - (setq newname (make-temp-name newprefix))) - newname)) - -(defun mail-source-callback (callback info) - "Call CALLBACK on the mail file, and then remove the mail file. -Pass INFO on to CALLBACK." - (if (or (not (file-exists-p mail-source-crash-box)) - (zerop (nth 7 (file-attributes mail-source-crash-box)))) - (progn - (when (file-exists-p mail-source-crash-box) - (delete-file mail-source-crash-box)) - 0) - (prog1 - (funcall callback mail-source-crash-box info) - (when (file-exists-p mail-source-crash-box) - ;; Delete or move the incoming mail out of the way. - (if mail-source-delete-incoming - (delete-file mail-source-crash-box) - (let ((incoming - (mail-source-make-complex-temp-name - (expand-file-name - mail-source-incoming-file-prefix - mail-source-directory)))) - (unless (file-exists-p (file-name-directory incoming)) - (make-directory (file-name-directory incoming) t)) - (rename-file mail-source-crash-box incoming t))))))) - -(defun mail-source-movemail (from to) - "Move FROM to TO using movemail." - (if (not (file-writable-p to)) - (error "Can't write to crash box %s. Not moving mail" to) - (let ((to (file-truename (expand-file-name to))) - errors result) - (setq to (file-truename to) - from (file-truename from)) - ;; Set TO if have not already done so, and rename or copy - ;; the file FROM to TO if and as appropriate. - (cond - ((file-exists-p to) - ;; The crash box exists already. - t) - ((not (file-exists-p from)) - ;; There is no inbox. - (setq to nil)) - ((zerop (nth 7 (file-attributes from))) - ;; Empty file. - (setq to nil)) - (t - ;; If getting from mail spool directory, use movemail to move - ;; rather than just renaming, so as to interlock with the - ;; mailer. - (unwind-protect - (save-excursion - (setq errors (generate-new-buffer " *mail source loss*")) - (let ((default-directory "/")) - (setq result - (apply - 'call-process - (append - (list - (expand-file-name "movemail" exec-directory) - nil errors nil from to))))) - (when (file-exists-p to) - (set-file-modes to mail-source-default-file-modes)) - (if (and (or (not (buffer-modified-p errors)) - (zerop (buffer-size errors))) - (zerop result)) - ;; No output => movemail won. - t - (set-buffer errors) - ;; There may be a warning about older revisions. We - ;; ignore that. - (goto-char (point-min)) - (if (search-forward "older revision" nil t) - t - ;; Probably a real error. - (subst-char-in-region (point-min) (point-max) ?\n ?\ ) - (goto-char (point-max)) - (skip-chars-backward " \t") - (delete-region (point) (point-max)) - (goto-char (point-min)) - (when (looking-at "movemail: ") - (delete-region (point-min) (match-end 0))) - ;; Result may be a signal description string. - (unless (yes-or-no-p - (format "movemail: %s (%s return). Continue? " - (buffer-string) result)) - (error "%s" (buffer-string))) - (setq to nil))))))) - (when (and errors - (buffer-name errors)) - (kill-buffer errors)) - ;; Return whether we moved successfully or not. - to))) - -(defun mail-source-movemail-and-remove (from to) - "Move FROM to TO using movemail, then remove FROM if empty." - (or (not (mail-source-movemail from to)) - (not (zerop (nth 7 (file-attributes from)))) - (delete-file from))) - -(defvar mail-source-read-passwd nil) -(defun mail-source-read-passwd (prompt &rest args) - "Read a password using PROMPT. -If ARGS, PROMPT is used as an argument to `format'." - (let ((prompt - (if args - (apply 'format prompt args) - prompt))) - (unless mail-source-read-passwd - (if (or (fboundp 'read-passwd) (load "passwd" t)) - (setq mail-source-read-passwd 'read-passwd) - (unless (fboundp 'ange-ftp-read-passwd) - (autoload 'ange-ftp-read-passwd "ange-ftp")) - (setq mail-source-read-passwd 'ange-ftp-read-passwd))) - (funcall mail-source-read-passwd prompt))) - -(defun mail-source-fetch-with-program (program) - (zerop (call-process shell-file-name nil nil nil - shell-command-switch program))) - -(defun mail-source-run-script (script spec &optional delay) - (when script - (if (and (symbolp script) (fboundp script)) - (funcall script) - (mail-source-call-script - (format-spec script spec)))) - (when delay - (sleep-for delay))) - -(defun mail-source-call-script (script) - (let ((background nil)) - (when (string-match "& *$" script) - (setq script (substring script 0 (match-beginning 0)) - background 0)) - (call-process shell-file-name nil background nil - shell-command-switch script))) - -;;; -;;; Different fetchers -;;; - -(defun mail-source-fetch-file (source callback) - "Fetcher for single-file sources." - (mail-source-bind (file source) - (mail-source-run-script - prescript (format-spec-make ?t mail-source-crash-box) - prescript-delay) - (let ((mail-source-string (format "file:%s" path))) - (if (mail-source-movemail path mail-source-crash-box) - (prog1 - (mail-source-callback callback path) - (mail-source-run-script - postscript (format-spec-make ?t mail-source-crash-box))) - 0)))) - -(defun mail-source-fetch-directory (source callback) - "Fetcher for directory sources." - (mail-source-bind (directory source) - (let ((found 0) - (mail-source-string (format "directory:%s" path))) - (dolist (file (directory-files - path t (concat (regexp-quote suffix) "$"))) - (when (and (file-regular-p file) - (funcall predicate file) - (mail-source-movemail file mail-source-crash-box)) - (incf found (mail-source-callback callback file)))) - found))) - -(defun mail-source-fetch-pop (source callback) - "Fetcher for single-file sources." - (mail-source-bind (pop source) - (mail-source-run-script - prescript - (format-spec-make ?p password ?t mail-source-crash-box - ?s server ?P port ?u user) - prescript-delay) - (let ((from (format "%s:%s:%s" server user port)) - (mail-source-string (format "pop:%s@%s" user server)) - result) - (when (eq authentication 'password) - (setq password - (or password - (cdr (assoc from mail-source-password-cache)) - (mail-source-read-passwd - (format "Password for %s at %s: " user server))))) - (when server - (setenv "MAILHOST" server)) - (setq result - (cond - (program - (mail-source-fetch-with-program - (format-spec - program - (format-spec-make ?p password ?t mail-source-crash-box - ?s server ?P port ?u user)))) - (function - (funcall function mail-source-crash-box)) - ;; The default is to use pop3.el. - (t - (let ((pop3-password password) - (pop3-maildrop user) - (pop3-mailhost server) - (pop3-port port) - (pop3-authentication-scheme - (if (eq authentication 'apop) 'apop 'pass)) - (pop3-connection-type connection) - (pop3-leave-mail-on-server - (or leave - (and (boundp 'pop3-leave-mail-on-server) - pop3-leave-mail-on-server)))) - (condition-case err - (save-excursion (pop3-movemail mail-source-crash-box)) - (error - ;; 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)) - (signal (car err) (cdr err)))))))) - (if result - (progn - (when (eq authentication 'password) - (unless (assoc from mail-source-password-cache) - (push (cons from password) mail-source-password-cache))) - (prog1 - (mail-source-callback callback server) - ;; Update display-time's mail flag, if relevant. - (if (equal source mail-source-primary-source) - (setq mail-source-new-mail-available nil)) - (mail-source-run-script - postscript - (format-spec-make ?p password ?t mail-source-crash-box - ?s server ?P port ?u user)))) - ;; We nix out the password in case the error - ;; was because of a wrong password being given. - (setq mail-source-password-cache - (delq (assoc from mail-source-password-cache) - mail-source-password-cache)) - 0)))) - -(defun mail-source-check-pop (source) - "Check whether there is new mail." - (mail-source-bind (pop source) - (let ((from (format "%s:%s:%s" server user port)) - (mail-source-string (format "pop:%s@%s" user server)) - result) - (when (eq authentication 'password) - (setq password - (or password - (cdr (assoc from mail-source-password-cache)) - (mail-source-read-passwd - (format "Password for %s at %s: " user server)))) - (unless (assoc from mail-source-password-cache) - (push (cons from password) mail-source-password-cache))) - (when server - (setenv "MAILHOST" server)) - (setq result - (cond - ;; No easy way to check whether mail is waiting for these. - (program) - (function) - ;; The default is to use pop3.el. - (t - (let ((pop3-password password) - (pop3-maildrop user) - (pop3-mailhost server) - (pop3-port port) - (pop3-authentication-scheme - (if (eq authentication 'apop) 'apop 'pass))) - (condition-case err - (save-excursion (pop3-get-message-count)) - (error - ;; 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)) - (signal (car err) (cdr err)))))))) - (if result - ;; Inform display-time that we have new mail. - (setq mail-source-new-mail-available (> result 0)) - ;; 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))) - result))) - -(defun mail-source-new-mail-p () - "Handler for `display-time' to indicate when new mail is available." - ;; Flash (ie. ring the visible bell) if mail is available. - (if (and mail-source-flash mail-source-new-mail-available) - (let ((visible-bell t)) - (ding))) - ;; Only report flag setting; flag is updated on a different schedule. - mail-source-new-mail-available) - - -(defvar mail-source-report-new-mail nil) -(defvar mail-source-report-new-mail-timer nil) -(defvar mail-source-report-new-mail-idle-timer nil) - -(eval-when-compile - (if (featurep 'xemacs) - (require 'itimer) - (require 'timer))) - -(defun mail-source-start-idle-timer () - ;; Start our idle timer if necessary, so we delay the check until the - ;; user isn't typing. - (unless mail-source-report-new-mail-idle-timer - (setq mail-source-report-new-mail-idle-timer - (run-with-idle-timer - mail-source-idle-time-delay - nil - (lambda () - (unwind-protect - (mail-source-check-pop mail-source-primary-source) - (setq mail-source-report-new-mail-idle-timer nil))))) - ;; Since idle timers created when Emacs is already in the idle - ;; state don't get activated until Emacs _next_ becomes idle, we - ;; need to force our timer to be considered active now. We do - ;; this by being naughty and poking the timer internals directly - ;; (element 0 of the vector is nil if the timer is active). - (aset mail-source-report-new-mail-idle-timer 0 nil))) - -(defun mail-source-report-new-mail (arg) - "Toggle whether to report when new mail is available. -This only works when `display-time' is enabled." - (interactive "P") - (if (not mail-source-primary-source) - (error "Need to set `mail-source-primary-source' to check for new mail")) - (let ((on (if (null arg) - (not mail-source-report-new-mail) - (> (prefix-numeric-value arg) 0)))) - (setq mail-source-report-new-mail on) - (and mail-source-report-new-mail-timer - (nnheader-cancel-timer mail-source-report-new-mail-timer)) - (and mail-source-report-new-mail-idle-timer - (nnheader-cancel-timer mail-source-report-new-mail-idle-timer)) - (setq mail-source-report-new-mail-timer nil) - (setq mail-source-report-new-mail-idle-timer nil) - (if on - (progn - (require 'time) - ;; display-time-mail-function is an Emacs 21 feature. - (setq display-time-mail-function #'mail-source-new-mail-p) - ;; Set up the main timer. - (setq mail-source-report-new-mail-timer - (nnheader-run-at-time - (* 60 mail-source-report-new-mail-interval) - (* 60 mail-source-report-new-mail-interval) - #'mail-source-start-idle-timer)) - ;; When you get new mail, clear "Mail" from the mode line. - (add-hook 'nnmail-post-get-new-mail-hook - 'display-time-event-handler) - (message "Mail check enabled")) - (setq display-time-mail-function nil) - (remove-hook 'nnmail-post-get-new-mail-hook - 'display-time-event-handler) - (message "Mail check disabled")))) - -(defun mail-source-fetch-maildir (source callback) - "Fetcher for maildir sources." - (mail-source-bind (maildir source) - (let ((found 0) - mail-source-string) - (unless (string-match "/$" path) - (setq path (concat path "/"))) - (dolist (subdir subdirs) - (when (file-directory-p (concat path subdir)) - (setq mail-source-string (format "maildir:%s%s" path subdir)) - (dolist (file (directory-files (concat path subdir) t)) - (when (and (not (file-directory-p file)) - (not (if function - (funcall function file mail-source-crash-box) - (let ((coding-system-for-write - nnheader-text-coding-system) - (coding-system-for-read - nnheader-text-coding-system) - (output-coding-system - nnheader-text-coding-system) - (input-coding-system - nnheader-text-coding-system)) - (with-temp-file mail-source-crash-box - (insert-file-contents file) - (goto-char (point-min)) -;;; ;; Unix mail format -;;; (unless (looking-at "\n*From ") -;;; (insert "From maildir " -;;; (current-time-string) "\n")) -;;; (while (re-search-forward "^From " nil t) -;;; (replace-match ">From ")) -;;; (goto-char (point-max)) -;;; (insert "\n\n") - ;; MMDF mail format - (insert "\001\001\001\001\n")) - (delete-file file))))) - (incf found (mail-source-callback callback file)))))) - found))) - -(eval-and-compile - (autoload 'imap-open "imap") - (autoload 'imap-authenticate "imap") - (autoload 'imap-mailbox-select "imap") - (autoload 'imap-mailbox-unselect "imap") - (autoload 'imap-mailbox-close "imap") - (autoload 'imap-search "imap") - (autoload 'imap-fetch "imap") - (autoload 'imap-close "imap") - (autoload 'imap-error-text "imap") - (autoload 'imap-message-flags-add "imap") - (autoload 'imap-list-to-message-set "imap") - (autoload 'imap-range-to-message-set "imap")) - -(defvar mail-source-imap-file-coding-system 'binary - "Coding system for the crashbox made by `mail-source-fetch-imap'.") - -(defun mail-source-fetch-imap (source callback) - "Fetcher for imap sources." - (mail-source-bind (imap source) - (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)) - (imap-shell-program (or (list program) imap-shell-program)) - remove) - (if (and (imap-open server port stream authentication buf) - (imap-authenticate - user (or (cdr (assoc from mail-source-password-cache)) - password) buf) - (imap-mailbox-select mailbox nil buf)) - (let ((coding-system-for-write mail-source-imap-file-coding-system) - (output-coding-system mail-source-imap-file-coding-system) - str) - (with-temp-file mail-source-crash-box - ;; Avoid converting 8-bit chars from inserted strings to - ;; multibyte. - (set-buffer-multibyte nil) - ;; 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)) - (push uid remove) - (insert "From imap " (current-time-string) "\n") - (save-excursion - (insert str "\n\n")) - (while (re-search-forward "^From " nil t) - (replace-match ">From ")) - (goto-char (point-max)))) - (nnheader-ms-strip-cr)) - (incf found (mail-source-callback callback server)) - (when (and remove fetchflag) - (imap-message-flags-add - (imap-range-to-message-set (gnus-compress-sequence remove)) - fetchflag nil buf)) - (if dontexpunge - (imap-mailbox-unselect buf) - (imap-mailbox-close buf)) - (imap-close buf)) - (imap-close buf) - ;; We nix out the password in case the error - ;; was because of a wrong password being given. - (setq mail-source-password-cache - (delq (assoc from mail-source-password-cache) - mail-source-password-cache)) - (error (imap-error-text buf))) - (kill-buffer buf) - found))) - -(eval-and-compile - (autoload 'webmail-fetch "webmail")) - -(defun mail-source-fetch-webmail (source callback) - "Fetch for webmail source." - (mail-source-bind (webmail source) - (let ((mail-source-string (format "webmail:%s:%s" subtype user)) - (webmail-newmail-only dontexpunge) - (webmail-move-to-trash-can (not dontexpunge))) - (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)))) - (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))))) - -(provide 'mail-source) - -;;; mail-source.el ends here diff --git a/lisp/mailheader.el b/lisp/mailheader.el deleted file mode 100644 index 796ae75..0000000 --- a/lisp/mailheader.el +++ /dev/null @@ -1,182 +0,0 @@ -;;; mail-header.el --- Mail header parsing, merging, formatting - -;; Copyright (C) 1996 by Free Software Foundation, Inc. - -;; Author: Erik Naggum -;; Keywords: tools, mail, news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to -;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; This package provides an abstraction to RFC822-style messages, used in -;; mail news, and some other systems. The simple syntactic rules for such -;; headers, such as quoting and line folding, are routinely reimplemented -;; in many individual packages. This package removes the need for this -;; redundancy by representing message headers as association lists, -;; offering functions to extract the set of headers from a message, to -;; parse individual headers, to merge sets of headers, and to format a set -;; of headers. - -;; The car of each element in the message-header alist is a symbol whose -;; print name is the name of the header, in all lower-case. The cdr of an -;; element depends on the operation. After extracting headers from a -;; message, it is a string, the value of the header. An extracted set of -;; headers may be parsed further, which may turn it into a list, whose car -;; is the original value and whose subsequent elements depend on the -;; header. For formatting, it is evaluated to obtain the strings to be -;; inserted. For merging, one set of headers consists of strings, while -;; the other set will be evaluated with the symbols in the first set of -;; headers bound to their respective values. - -;;; Code: - -(eval-when-compile (require 'cl)) - -;; Make the byte-compiler shut up. -(defvar headers) - -(defun mail-header-extract () - "Extract headers from current buffer after point. -Returns a header alist, where each element is a cons cell (name . value), -where NAME is a symbol, and VALUE is the string value of the header having -that name." - (let ((message-headers ()) (top (point)) - start end) - (while (and (setq start (point)) - (> (skip-chars-forward "^\0- :") 0) - (eq (char-after) ?:) - (setq end (point)) - (progn (forward-char) - (> (skip-chars-forward " \t") 0))) - (let ((header (intern (downcase (buffer-substring start end)))) - (value (list (buffer-substring - (point) (progn (end-of-line) (point)))))) - (while (progn (forward-char) (> (skip-chars-forward " \t") 0)) - (push (buffer-substring (point) (progn (end-of-line) (point))) - value)) - (push (if (cdr value) - (cons header (mapconcat #'identity (nreverse value) " ")) - (cons header (car value))) - message-headers))) - (goto-char top) - (nreverse message-headers))) - -(defun mail-header-extract-no-properties () - "Extract headers from current buffer after point, without properties. -Returns a header alist, where each element is a cons cell (name . value), -where NAME is a symbol, and VALUE is the string value of the header having -that name." - (mapcar - (lambda (elt) - (set-text-properties 0 (length (cdr elt)) nil (cdr elt)) - elt) - (mail-header-extract))) - -(defun mail-header-parse (parsing-rules headers) - "Apply PARSING-RULES to HEADERS. -PARSING-RULES is an alist whose keys are header names (symbols) and whose -value is a parsing function. The function takes one argument, a string, -and return a list of values, which will destructively replace the value -associated with the key in HEADERS, after being prepended with the original -value." - (dolist (rule parsing-rules) - (let ((header (assq (car rule) headers))) - (when header - (if (consp (cdr header)) - (setf (cddr header) (funcall (cdr rule) (cadr header))) - (setf (cdr header) - (cons (cdr header) (funcall (cdr rule) (cdr header)))))))) - headers) - -(defsubst mail-header (header &optional header-alist) - "Return the value associated with header HEADER in HEADER-ALIST. -If the value is a string, it is the original value of the header. If the -value is a list, its first element is the original value of the header, -with any subsequent elements being the result of parsing the value. -If HEADER-ALIST is nil, the dynamically bound variable `headers' is used." - (cdr (assq header (or header-alist headers)))) - -(defun mail-header-set (header value &optional header-alist) - "Set the value associated with header HEADER to VALUE in HEADER-ALIST. -HEADER-ALIST defaults to the dynamically bound variable `headers' if nil. -See `mail-header' for the semantics of VALUE." - (let* ((alist (or header-alist headers)) - (entry (assq header alist))) - (if entry - (setf (cdr entry) value) - (nconc alist (list (cons header value))))) - value) - -(defsetf mail-header (header &optional header-alist) (value) - `(mail-header-set ,header ,value ,header-alist)) - -(defun mail-header-merge (merge-rules headers) - "Return a new header alist with MERGE-RULES applied to HEADERS. -MERGE-RULES is an alist whose keys are header names (symbols) and whose -values are forms to evaluate, the results of which are the new headers. It -should be a string or a list of string. The first element may be nil to -denote that the formatting functions must use the remaining elements, or -skip the header altogether if there are no other elements. - The macro `mail-header' can be used to access headers in HEADERS." - (mapcar - (lambda (rule) - (cons (car rule) (eval (cdr rule)))) - merge-rules)) - -(defvar mail-header-format-function - (lambda (header value) - "Function to format headers without a specified formatting function." - (insert (capitalize (symbol-name header)) - ": " - (if (consp value) (car value) value) - "\n"))) - -(defun mail-header-format (format-rules headers) - "Use FORMAT-RULES to format HEADERS and insert into current buffer. -FORMAT-RULES is an alist whose keys are header names (symbols), and whose -values are functions that format the header, the results of which are -inserted, unless it is nil. The function takes two arguments, the header -symbol, and the value of that header. If the function itself is nil, the -default action is to insert the value of the header, unless it is nil. -The headers are inserted in the order of the FORMAT-RULES. -A key of t represents any otherwise unmentioned headers. -A key of nil has as its value a list of defaulted headers to ignore." - (let ((ignore (append (cdr (assq nil format-rules)) - (mapcar #'car format-rules)))) - (dolist (rule format-rules) - (let* ((header (car rule)) - (value (mail-header header))) - (cond ((null header) 'ignore) - ((eq header t) - (dolist (defaulted headers) - (unless (memq (car defaulted) ignore) - (let* ((header (car defaulted)) - (value (cdr defaulted))) - (if (cdr rule) - (funcall (cdr rule) header value) - (funcall mail-header-format-function header value)))))) - (value - (if (cdr rule) - (funcall (cdr rule) header value) - (funcall mail-header-format-function header value)))))) - (insert "\n"))) - -(provide 'mailheader) - -;;; mail-header.el ends here diff --git a/lisp/md5.el b/lisp/md5.el deleted file mode 100644 index 2f85d70..0000000 --- a/lisp/md5.el +++ /dev/null @@ -1,413 +0,0 @@ -;;; md5.el -- MD5 Message Digest Algorithm -;;; Gareth Rees - -;; LCD Archive Entry: -;; md5|Gareth Rees|gdr11@cl.cam.ac.uk| -;; MD5 cryptographic message digest algorithm| -;; 13-Nov-95|1.0|~/misc/md5.el.Z| - -;;; Details: ------------------------------------------------------------------ - -;; This is a direct translation into Emacs LISP of the reference C -;; implementation of the MD5 Message-Digest Algorithm written by RSA -;; Data Security, Inc. -;; -;; The algorithm takes a message (that is, a string of bytes) and -;; computes a 16-byte checksum or "digest" for the message. This digest -;; is supposed to be cryptographically strong in the sense that if you -;; are given a 16-byte digest D, then there is no easier way to -;; construct a message whose digest is D than to exhaustively search the -;; space of messages. However, the robustness of the algorithm has not -;; been proven, and a similar algorithm (MD4) was shown to be unsound, -;; so treat with caution! -;; -;; The C algorithm uses 32-bit integers; because GNU Emacs -;; implementations provide 28-bit integers (with 24-bit integers on -;; versions prior to 19.29), the code represents a 32-bit integer as the -;; cons of two 16-bit integers. The most significant word is stored in -;; the car and the least significant in the cdr. The algorithm requires -;; at least 17 bits of integer representation in order to represent the -;; carry from a 16-bit addition. - -;;; Usage: -------------------------------------------------------------------- - -;; To compute the MD5 Message Digest for a message M (represented as a -;; string or as a vector of bytes), call -;; -;; (md5-encode M) -;; -;; which returns the message digest as a vector of 16 bytes. If you -;; need to supply the message in pieces M1, M2, ... Mn, then call -;; -;; (md5-init) -;; (md5-update M1) -;; (md5-update M2) -;; ... -;; (md5-update Mn) -;; (md5-final) - -;;; Copyright and licence: ---------------------------------------------------- - -;; Copyright (C) 1995 by Gareth Rees -;; Derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm -;; -;; md5.el 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, or (at your option) any -;; later version. -;; -;; md5.el 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. -;; -;; The original copyright notice is given below, as required by the -;; licence for the original code. This code is distributed under *both* -;; RSA's original licence and the GNU General Public Licence. (There -;; should be no problems, as the former is more liberal than the -;; latter). - -;;; Original copyright notice: ------------------------------------------------ - -;; Copyright (C) 1990, RSA Data Security, Inc. All rights reserved. -;; -;; License to copy and use this software is granted provided that it is -;; identified as the "RSA Data Security, Inc. MD5 Message- Digest -;; Algorithm" in all material mentioning or referencing this software or -;; this function. -;; -;; License is also granted to make and use derivative works provided -;; that such works are identified as "derived from the RSA Data -;; Security, Inc. MD5 Message-Digest Algorithm" in all material -;; mentioning or referencing the derived work. -;; -;; RSA Data Security, Inc. makes no representations concerning either -;; the merchantability of this software or the suitability of this -;; software for any particular purpose. It is provided "as is" without -;; express or implied warranty of any kind. -;; -;; These notices must be retained in any copies of any part of this -;; documentation and/or software. - -;;; Code: --------------------------------------------------------------------- - -(defvar md5-program "md5sum" - "*Program that reads a message on its standard input and writes an -MD5 digest on its output.") - -(defvar md5-maximum-internal-length 4096 - "*The maximum size of a piece of data that should use the MD5 routines -written in lisp. If a message exceeds this, it will be run through an -external filter for processing. Also see the `md5-program' variable. -This variable has no effect if you call the md5-init|update|final -functions - only used by the `md5' function's simpler interface.") - -(defvar md5-bits (make-vector 4 0) - "Number of bits handled, modulo 2^64. -Represented as four 16-bit numbers, least significant first.") -(defvar md5-buffer (make-vector 4 '(0 . 0)) - "Scratch buffer (four 32-bit integers).") -(defvar md5-input (make-vector 64 0) - "Input buffer (64 bytes).") - -(defun md5-unhex (x) - (if (> x ?9) - (if (>= x ?a) - (+ 10 (- x ?a)) - (+ 10 (- x ?A))) - (- x ?0))) - -(defun md5-encode (message) - "Encodes MESSAGE using the MD5 message digest algorithm. -MESSAGE must be a string or an array of bytes. -Returns a vector of 16 bytes containing the message digest." - (if (<= (length message) md5-maximum-internal-length) - (progn - (md5-init) - (md5-update message) - (md5-final)) - (save-excursion - (set-buffer (get-buffer-create " *md5-work*")) - (erase-buffer) - (insert message) - (call-process-region (point-min) (point-max) - (or shell-file-name "/bin/sh") - t (current-buffer) nil - "-c" md5-program) - ;; MD5 digest is 32 chars long - ;; mddriver adds a newline to make neaten output for tty - ;; viewing, make sure we leave it behind. - (let ((data (buffer-substring (point-min) (+ (point-min) 32))) - (vec (make-vector 16 0)) - (ctr 0)) - (while (< ctr 16) - (aset vec ctr (+ (* 16 (md5-unhex (aref data (* ctr 2)))) - (md5-unhex (aref data (1+ (* ctr 2)))))) - (setq ctr (1+ ctr))))))) - -(defsubst md5-add (x y) - "Return 32-bit sum of 32-bit integers X and Y." - (let ((m (+ (car x) (car y))) - (l (+ (cdr x) (cdr y)))) - (cons (logand 65535 (+ m (lsh l -16))) (logand l 65535)))) - -;; FF, GG, HH and II are basic MD5 functions, providing transformations -;; for rounds 1, 2, 3 and 4 respectively. Each function follows this -;; pattern of computation (where ROTATE(x,y) means rotate 32-bit value x -;; by y bits to the left): -;; -;; FF(a,b,c,d,x,s,ac) = ROTATE(a + F(b,c,d) + x + ac,s) + b -;; -;; so we use the macro `md5-make-step' to construct each one. The -;; helper functions F, G, H and I operate on 16-bit numbers; the full -;; operation splits its inputs, operates on the halves separately and -;; then puts the results together. - -(defsubst md5-F (x y z) (logior (logand x y) (logand (lognot x) z))) -(defsubst md5-G (x y z) (logior (logand x z) (logand y (lognot z)))) -(defsubst md5-H (x y z) (logxor x y z)) -(defsubst md5-I (x y z) (logxor y (logior x (logand 65535 (lognot z))))) - -(defmacro md5-make-step (name func) - (` - (defun (, name) (a b c d x s ac) - (let* - ((m1 (+ (car a) ((, func) (car b) (car c) (car d)) (car x) (car ac))) - (l1 (+ (cdr a) ((, func) (cdr b) (cdr c) (cdr d)) (cdr x) (cdr ac))) - (m2 (logand 65535 (+ m1 (lsh l1 -16)))) - (l2 (logand 65535 l1)) - (m3 (logand 65535 (if (> s 15) - (+ (lsh m2 (- s 32)) (lsh l2 (- s 16))) - (+ (lsh m2 s) (lsh l2 (- s 16)))))) - (l3 (logand 65535 (if (> s 15) - (+ (lsh l2 (- s 32)) (lsh m2 (- s 16))) - (+ (lsh l2 s) (lsh m2 (- s 16))))))) - (md5-add (cons m3 l3) b))))) - -(md5-make-step md5-FF md5-F) -(md5-make-step md5-GG md5-G) -(md5-make-step md5-HH md5-H) -(md5-make-step md5-II md5-I) - -(defun md5-init () - "Initialise the state of the message-digest routines." - (aset md5-bits 0 0) - (aset md5-bits 1 0) - (aset md5-bits 2 0) - (aset md5-bits 3 0) - (aset md5-buffer 0 '(26437 . 8961)) - (aset md5-buffer 1 '(61389 . 43913)) - (aset md5-buffer 2 '(39098 . 56574)) - (aset md5-buffer 3 '( 4146 . 21622))) - -(defun md5-update (string) - "Update the current MD5 state with STRING (an array of bytes)." - (let ((len (length string)) - (i 0) - (j 0)) - (while (< i len) - ;; Compute number of bytes modulo 64 - (setq j (% (/ (aref md5-bits 0) 8) 64)) - - ;; Store this byte (truncating to 8 bits to be sure) - (aset md5-input j (logand 255 (aref string i))) - - ;; Update number of bits by 8 (modulo 2^64) - (let ((c 8) (k 0)) - (while (and (> c 0) (< k 4)) - (let ((b (aref md5-bits k))) - (aset md5-bits k (logand 65535 (+ b c))) - (setq c (if (> b (- 65535 c)) 1 0) - k (1+ k))))) - - ;; Increment number of bytes processed - (setq i (1+ i)) - - ;; When 64 bytes accumulated, pack them into sixteen 32-bit - ;; integers in the array `in' and then tranform them. - (if (= j 63) - (let ((in (make-vector 16 (cons 0 0))) - (k 0) - (kk 0)) - (while (< k 16) - (aset in k (md5-pack md5-input kk)) - (setq k (+ k 1) kk (+ kk 4))) - (md5-transform in)))))) - -(defun md5-pack (array i) - "Pack the four bytes at ARRAY reference I to I+3 into a 32-bit integer." - (cons (+ (lsh (aref array (+ i 3)) 8) (aref array (+ i 2))) - (+ (lsh (aref array (+ i 1)) 8) (aref array (+ i 0))))) - -(defun md5-byte (array n b) - "Unpack byte B (0 to 3) from Nth member of ARRAY of 32-bit integers." - (let ((e (aref array n))) - (cond ((eq b 0) (logand 255 (cdr e))) - ((eq b 1) (lsh (cdr e) -8)) - ((eq b 2) (logand 255 (car e))) - ((eq b 3) (lsh (car e) -8))))) - -(defun md5-final () - (let ((in (make-vector 16 (cons 0 0))) - (j 0) - (digest (make-vector 16 0)) - (padding)) - - ;; Save the number of bits in the message - (aset in 14 (cons (aref md5-bits 1) (aref md5-bits 0))) - (aset in 15 (cons (aref md5-bits 3) (aref md5-bits 2))) - - ;; Compute number of bytes modulo 64 - (setq j (% (/ (aref md5-bits 0) 8) 64)) - - ;; Pad out computation to 56 bytes modulo 64 - (setq padding (make-vector (if (< j 56) (- 56 j) (- 120 j)) 0)) - (aset padding 0 128) - (md5-update padding) - - ;; Append length in bits and transform - (let ((k 0) (kk 0)) - (while (< k 14) - (aset in k (md5-pack md5-input kk)) - (setq k (+ k 1) kk (+ kk 4)))) - (md5-transform in) - - ;; Store the results in the digest - (let ((k 0) (kk 0)) - (while (< k 4) - (aset digest (+ kk 0) (md5-byte md5-buffer k 0)) - (aset digest (+ kk 1) (md5-byte md5-buffer k 1)) - (aset digest (+ kk 2) (md5-byte md5-buffer k 2)) - (aset digest (+ kk 3) (md5-byte md5-buffer k 3)) - (setq k (+ k 1) kk (+ kk 4)))) - - ;; Return digest - digest)) - -;; It says in the RSA source, "Note that if the Mysterious Constants are -;; arranged backwards in little-endian order and decrypted with the DES -;; they produce OCCULT MESSAGES!" Security through obscurity? - -(defun md5-transform (in) - "Basic MD5 step. Transform md5-buffer based on array IN." - (let ((a (aref md5-buffer 0)) - (b (aref md5-buffer 1)) - (c (aref md5-buffer 2)) - (d (aref md5-buffer 3))) - (setq - a (md5-FF a b c d (aref in 0) 7 '(55146 . 42104)) - d (md5-FF d a b c (aref in 1) 12 '(59591 . 46934)) - c (md5-FF c d a b (aref in 2) 17 '( 9248 . 28891)) - b (md5-FF b c d a (aref in 3) 22 '(49597 . 52974)) - a (md5-FF a b c d (aref in 4) 7 '(62844 . 4015)) - d (md5-FF d a b c (aref in 5) 12 '(18311 . 50730)) - c (md5-FF c d a b (aref in 6) 17 '(43056 . 17939)) - b (md5-FF b c d a (aref in 7) 22 '(64838 . 38145)) - a (md5-FF a b c d (aref in 8) 7 '(27008 . 39128)) - d (md5-FF d a b c (aref in 9) 12 '(35652 . 63407)) - c (md5-FF c d a b (aref in 10) 17 '(65535 . 23473)) - b (md5-FF b c d a (aref in 11) 22 '(35164 . 55230)) - a (md5-FF a b c d (aref in 12) 7 '(27536 . 4386)) - d (md5-FF d a b c (aref in 13) 12 '(64920 . 29075)) - c (md5-FF c d a b (aref in 14) 17 '(42617 . 17294)) - b (md5-FF b c d a (aref in 15) 22 '(18868 . 2081)) - a (md5-GG a b c d (aref in 1) 5 '(63006 . 9570)) - d (md5-GG d a b c (aref in 6) 9 '(49216 . 45888)) - c (md5-GG c d a b (aref in 11) 14 '( 9822 . 23121)) - b (md5-GG b c d a (aref in 0) 20 '(59830 . 51114)) - a (md5-GG a b c d (aref in 5) 5 '(54831 . 4189)) - d (md5-GG d a b c (aref in 10) 9 '( 580 . 5203)) - c (md5-GG c d a b (aref in 15) 14 '(55457 . 59009)) - b (md5-GG b c d a (aref in 4) 20 '(59347 . 64456)) - a (md5-GG a b c d (aref in 9) 5 '( 8673 . 52710)) - d (md5-GG d a b c (aref in 14) 9 '(49975 . 2006)) - c (md5-GG c d a b (aref in 3) 14 '(62677 . 3463)) - b (md5-GG b c d a (aref in 8) 20 '(17754 . 5357)) - a (md5-GG a b c d (aref in 13) 5 '(43491 . 59653)) - d (md5-GG d a b c (aref in 2) 9 '(64751 . 41976)) - c (md5-GG c d a b (aref in 7) 14 '(26479 . 729)) - b (md5-GG b c d a (aref in 12) 20 '(36138 . 19594)) - a (md5-HH a b c d (aref in 5) 4 '(65530 . 14658)) - d (md5-HH d a b c (aref in 8) 11 '(34673 . 63105)) - c (md5-HH c d a b (aref in 11) 16 '(28061 . 24866)) - b (md5-HH b c d a (aref in 14) 23 '(64997 . 14348)) - a (md5-HH a b c d (aref in 1) 4 '(42174 . 59972)) - d (md5-HH d a b c (aref in 4) 11 '(19422 . 53161)) - c (md5-HH c d a b (aref in 7) 16 '(63163 . 19296)) - b (md5-HH b c d a (aref in 10) 23 '(48831 . 48240)) - a (md5-HH a b c d (aref in 13) 4 '(10395 . 32454)) - d (md5-HH d a b c (aref in 0) 11 '(60065 . 10234)) - c (md5-HH c d a b (aref in 3) 16 '(54511 . 12421)) - b (md5-HH b c d a (aref in 6) 23 '( 1160 . 7429)) - a (md5-HH a b c d (aref in 9) 4 '(55764 . 53305)) - d (md5-HH d a b c (aref in 12) 11 '(59099 . 39397)) - c (md5-HH c d a b (aref in 15) 16 '( 8098 . 31992)) - b (md5-HH b c d a (aref in 2) 23 '(50348 . 22117)) - a (md5-II a b c d (aref in 0) 6 '(62505 . 8772)) - d (md5-II d a b c (aref in 7) 10 '(17194 . 65431)) - c (md5-II c d a b (aref in 14) 15 '(43924 . 9127)) - b (md5-II b c d a (aref in 5) 21 '(64659 . 41017)) - a (md5-II a b c d (aref in 12) 6 '(25947 . 22979)) - d (md5-II d a b c (aref in 3) 10 '(36620 . 52370)) - c (md5-II c d a b (aref in 10) 15 '(65519 . 62589)) - b (md5-II b c d a (aref in 1) 21 '(34180 . 24017)) - a (md5-II a b c d (aref in 8) 6 '(28584 . 32335)) - d (md5-II d a b c (aref in 15) 10 '(65068 . 59104)) - c (md5-II c d a b (aref in 6) 15 '(41729 . 17172)) - b (md5-II b c d a (aref in 13) 21 '(19976 . 4513)) - a (md5-II a b c d (aref in 4) 6 '(63315 . 32386)) - d (md5-II d a b c (aref in 11) 10 '(48442 . 62005)) - c (md5-II c d a b (aref in 2) 15 '(10967 . 53947)) - b (md5-II b c d a (aref in 9) 21 '(60294 . 54161))) - - (aset md5-buffer 0 (md5-add (aref md5-buffer 0) a)) - (aset md5-buffer 1 (md5-add (aref md5-buffer 1) b)) - (aset md5-buffer 2 (md5-add (aref md5-buffer 2) c)) - (aset md5-buffer 3 (md5-add (aref md5-buffer 3) d)))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Here begins the merger with the XEmacs API and the md5.el from the URL -;;; package. Courtesy wmperry@spry.com -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defun md5 (object &optional start end coding noerror) - "Return the MD5 (a secure message digest algorithm) of an object. -OBJECT is either a string or a buffer. -Optional arguments START and END denote buffer positions for computing the -hash of a portion of OBJECT. - -The optional CODING and NOERROR arguments are ignored. They are no -more than placeholders to ensure the compatibility with XEmacsen with -file-coding or Mule support." - (let ((buffer nil)) - (unwind-protect - (save-excursion - (setq buffer (generate-new-buffer " *md5-work*")) - (set-buffer buffer) - (cond - ((bufferp object) - (insert-buffer-substring object start end)) - ((stringp object) - (insert (if (or start end) - (substring object start end) - object))) - (t nil)) - (prog1 - (if (<= (point-max) md5-maximum-internal-length) - (mapconcat - (function (lambda (node) (format "%02x" node))) - (md5-encode (buffer-string)) - "") - (call-process-region (point-min) (point-max) - (or shell-file-name "/bin/sh") - t buffer nil - "-c" md5-program) - ;; MD5 digest is 32 chars long - ;; mddriver adds a newline to make neaten output for tty - ;; viewing, make sure we leave it behind. - (buffer-substring (point-min) (+ (point-min) 32))) - (kill-buffer buffer))) - (and buffer (kill-buffer buffer) nil)))) - -(provide 'md5) - -;;; md5.el ends here diff --git a/lisp/message.el b/lisp/message.el deleted file mode 100644 index a710df2..0000000 --- a/lisp/message.el +++ /dev/null @@ -1,5910 +0,0 @@ -;;; message.el --- composing mail and news messages -*- coding: iso-latin-1 -*- -;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; MORIOKA Tomohiko -;; Shuhei KOBAYASHI -;; Keiichi Suzuki -;; Tatsuya Ichikawa -;; Katsumi Yamaoka -;; Kiyokazu SUTO -;; Keywords: mail, news, MIME - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; This mode provides mail-sending facilities from within Emacs. It -;; consists mainly of large chunks of code from the sendmail.el, -;; gnus-msg.el and rnewspost.el files. - -;;; Code: - -(eval-when-compile - (require 'cl) - (require 'smtp) - (defvar gnus-list-identifiers)) ; gnus-sum is required where necessary -(require 'mailheader) -(require 'nnheader) -;; This is apparently necessary even though things are autoloaded: -(if (featurep 'xemacs) - (require 'mail-abbrevs)) -(require 'mime-edit) -(eval-when-compile (require 'static)) - -;; Avoid byte-compile warnings. -(eval-when-compile - (require 'mail-parse) - (require 'mml)) - -(require 'rfc822) - -(defgroup message '((user-mail-address custom-variable) - (user-full-name custom-variable)) - "Mail and news message composing." - :link '(custom-manual "(message)Top") - :group 'mail - :group 'news) - -(put 'user-mail-address 'custom-type 'string) -(put 'user-full-name 'custom-type 'string) - -(defgroup message-various nil - "Various Message Variables" - :link '(custom-manual "(message)Various Message Variables") - :group 'message) - -(defgroup message-buffers nil - "Message Buffers" - :link '(custom-manual "(message)Message Buffers") - :group 'message) - -(defgroup message-sending nil - "Message Sending" - :link '(custom-manual "(message)Sending Variables") - :group 'message) - -(defgroup message-interface nil - "Message Interface" - :link '(custom-manual "(message)Interface") - :group 'message) - -(defgroup message-forwarding nil - "Message Forwarding" - :link '(custom-manual "(message)Forwarding") - :group 'message-interface) - -(defgroup message-insertion nil - "Message Insertion" - :link '(custom-manual "(message)Insertion") - :group 'message) - -(defgroup message-headers nil - "Message Headers" - :link '(custom-manual "(message)Message Headers") - :group 'message) - -(defgroup message-news nil - "Composing News Messages" - :group 'message) - -(defgroup message-mail nil - "Composing Mail Messages" - :group 'message) - -(defgroup message-faces nil - "Faces used for message composing." - :group 'message - :group 'faces) - -(defgroup message-frames nil - "Message frames" - :group 'message) - -(defcustom message-directory "~/Mail/" - "*Directory from which all other mail file variables are derived." - :group 'message-various - :type 'directory) - -(defcustom message-max-buffers 10 - "*How many buffers to keep before starting to kill them off." - :group 'message-buffers - :type 'integer) - -(defcustom message-send-rename-function nil - "Function called to rename the buffer after sending it." - :group 'message-buffers - :type '(choice function (const nil))) - -(defcustom message-fcc-handler-function 'message-output - "*A function called to save outgoing articles. -This function will be called with the name of the file to store the -article in. The default function is `message-output' which saves in Unix -mailbox format." - :type '(radio (function-item message-output) - (function :tag "Other")) - :group 'message-sending) - -(defcustom message-encode-function 'message-maybe-encode - "*A function called to encode messages." - :group 'message-sending - :type 'function) - -(defcustom message-8bit-encoding-list '(8bit binary) - "*8bit encoding type in Content-Transfer-Encoding field." - :group 'message-sending - :type '(repeat (symbol :tag "Type"))) - -(defcustom message-courtesy-message - "The following message is a courtesy copy of an article\nthat has been posted to %s as well.\n\n" - "*This is inserted at the start of a mailed copy of a posted message. -If the string contains the format spec \"%s\", the Newsgroups -the article has been posted to will be inserted there. -If this variable is nil, no such courtesy message will be added." - :group 'message-sending - :type 'string) - -(defcustom message-ignored-bounced-headers "^\\(Received\\|Return-Path\\):" - "*Regexp that matches headers to be removed in resent bounced mail." - :group 'message-interface - :type 'regexp) - -(defcustom message-bounce-setup-function 'message-bounce-setup-for-mime-edit - "Function to setup a re-sending bounced message." - :group 'message-sending - :type 'function) - -;;;###autoload -(defcustom message-from-style 'default - "*Specifies how \"From\" headers look. - -If nil, they contain just the return address like: - king@grassland.com -If `parens', they look like: - king@grassland.com (Elvis Parsley) -If `angles', they look like: - Elvis Parsley - -Otherwise, most addresses look like `angles', but they look like -`parens' if `angles' would need quoting and `parens' would not." - :type '(choice (const :tag "simple" nil) - (const parens) - (const angles) - (const default)) - :group 'message-headers) - -(defcustom message-syntax-checks nil - ;; Guess this one shouldn't be easy to customize... - "*Controls what syntax checks should not be performed on outgoing posts. -To disable checking of long signatures, for instance, add - `(signature . disabled)' to this list. - -Don't touch this variable unless you really know what you're doing. - -Checks include `subject-cmsg', `multiple-headers', `sendsys', -`message-id', `from', `long-lines', `control-chars', `size', -`new-text', `quoting-style', `redirected-followup', `signature', -`approved', `sender', `empty', `empty-headers', `message-id', `from', -`subject', `shorten-followup-to', `existing-newsgroups', -`buffer-file-name', `unchanged', `newsgroups', `reply-to'." - :group 'message-news - :type '(repeat sexp)) ; Fixme: improve this - -(defcustom message-required-news-headers - '(From Newsgroups Subject Date Message-ID - (optional . Organization) Lines - (optional . User-Agent)) - "*Headers to be generated or prompted for when posting an article. -RFC977 and RFC1036 require From, Date, Newsgroups, Subject, -Message-ID. Organization, Lines, In-Reply-To, Expires, and -User-Agent are optional. If don't you want message to insert some -header, remove it from this list." - :group 'message-news - :group 'message-headers - :type '(repeat sexp)) - -(defcustom message-required-mail-headers - '(From Subject Date (optional . In-Reply-To) Message-ID Lines - (optional . User-Agent)) - "*Headers to be generated or prompted for when mailing a message. -It is recommended that From, Date, To, Subject and Message-ID be -included. Organization, Lines and User-Agent are optional." - :group 'message-mail - :group 'message-headers - :type '(repeat sexp)) - -(defcustom message-deletable-headers '(Message-ID Date Lines) - "Headers to be deleted if they already exist and were generated by message previously." - :group 'message-headers - :type 'sexp) - -(defcustom message-ignored-news-headers - "^NNTP-Posting-Host:\\|^Xref:\\|^[BGF]cc:\\|^Resent-Fcc:\\|^X-Draft-From:" - "*Regexp of headers to be removed unconditionally before posting." - :group 'message-news - :group 'message-headers - :type 'regexp) - -(defcustom message-ignored-mail-headers - "^[GF]cc:\\|^Resent-Fcc:\\|^Xref:\\|^X-Draft-From:" - "*Regexp of headers to be removed unconditionally before mailing." - :group 'message-mail - :group 'message-headers - :type 'regexp) - -(defcustom message-ignored-supersedes-headers "^Path:\\|^Date\\|^NNTP-Posting-Host:\\|^Xref:\\|^Lines:\\|^Received:\\|^X-From-Line:\\|^X-Trace:\\|^X-Complaints-To:\\|Return-Path:\\|^Supersedes:\\|^NNTP-Posting-Date:\\|^X-Trace:\\|^X-Complaints-To:" - "*Header lines matching this regexp will be deleted before posting. -It's best to delete old Path and Date headers before posting to avoid -any confusion." - :group 'message-interface - :type 'regexp) - -(defcustom message-supersede-setup-function - 'message-supersede-setup-for-mime-edit - "Function to setup a supersede message." - :group 'message-sending - :type 'function) - -(defcustom message-subject-re-regexp "^[ \t]*\\([Rr][Ee]:[ \t]*\\)*[ \t]*" - "*Regexp matching \"Re: \" in the subject line." - :group 'message-various - :type 'regexp) - -;;; Some sender agents encode the whole subject including leading "Re: ". -;;; And if followup agent does not decode it for some reason (e.g. unknown -;;; charset) and just add a new "Re: " in front of the encoded-word, the -;;; result will contain multiple "Re: "'s. -(defcustom message-subject-encoded-re-regexp - (concat - "^[ \t]*" - (regexp-quote "=?") - "[-!#$%&'*+0-9A-Z^_`a-z{|}~]+" ; charset - (regexp-quote "?") - "\\(" - "[Bb]" (regexp-quote "?") ; B encoding - "\\(\\(CQk\\|CSA\\|IAk\\|ICA\\)[Jg]\\)*" ; \([ \t][ \t][ \t]\)* - "\\(" - "[Uc][km]U6" ; [Rr][Ee]: - "\\|" - "\\(C[VX]\\|I[FH]\\)J[Fl]O[g-v]" ; [ \t][Rr][Ee]: - "\\|" - "\\(CQl\\|CSB\\|IAl\\|ICB\\)[Sy][RZ]T[o-r]" ; [ \t][ \t][Rr][Ee]: - "\\)" - "\\|" - "[Qb]" (regexp-quote "?") ; Q encoding - "\\(_\\|=09\\|=20\\)*" - "\\([Rr]\\|=[57]2\\)\\([Ee]\\|=[46]5\\)\\(:\\|=3[Aa]\\)" - "\\)" - ) - "*Regexp matching \"Re: \" in the subject line. -Unlike `message-subject-re-regexp', this regexp matches \"Re: \" within -an encoded-word." - :group 'message-various - :type 'regexp) - -(defcustom message-use-subject-re t - "*If t, remove any (buggy) \"Re: \"'s from the subject of the precursor -and add a new \"Re: \". If it is nil, use the subject \"as-is\". If it -is the symbol `guess', try to detect \"Re: \" within an encoded-word." - :group 'message-various - :type '(choice (const :tag "off" nil) - (const :tag "on" t) - (const guess))) - -;;;###autoload -(defcustom message-signature-separator "^-- *$" - "Regexp matching the signature separator." - :type 'regexp - :group 'message-various) - -(defcustom message-signature-separator-for-insertion "-- \n" - "*Signature separator. This value will be inserted as signature separator -when composing message. Default value is \"-- \\n\". Notice: Changing this -value may go against RFC-1036 and draft-ietf-usefor-article-05.txt. " - :type 'string - :group 'message-insertion) - -(defcustom message-elide-ellipsis "\n[...]\n\n" - "*The string which is inserted for elided text." - :type 'string - :group 'message-various) - -(defcustom message-interactive nil - "Non-nil means when sending a message wait for and display errors. -nil means let mailer mail back a message to report errors." - :group 'message-sending - :group 'message-mail - :type 'boolean) - -(defcustom message-generate-new-buffers 'unique - "*Non-nil means create a new message buffer whenever `message-setup' is called. -If this is a function, call that function with three parameters: The type, -the to address and the group name. (Any of these may be nil.) The function -should return the new buffer name." - :group 'message-buffers - :type '(choice (const :tag "off" nil) - (const :tag "unique" unique) - (const :tag "unsent" unsent) - (function fun))) - -(defcustom message-kill-buffer-on-exit nil - "*Non-nil means that the message buffer will be killed after sending a message." - :group 'message-buffers - :type 'boolean) - -(defcustom message-kill-buffer-query-function 'yes-or-no-p - "*A function called to query the user whether to kill buffer anyway or not. -If it is t, the buffer will be killed peremptorily." - :type '(radio (function-item yes-or-no-p) - (function-item y-or-n-p) - (function-item nnheader-Y-or-n-p) - (function :tag "Other" t)) - :group 'message-buffers) - -(eval-when-compile - (defvar gnus-local-organization)) -(defcustom message-user-organization - (or (and (boundp 'gnus-local-organization) - (stringp gnus-local-organization) - gnus-local-organization) - (getenv "ORGANIZATION") - t) - "*String to be used as an Organization header. -If t, use `message-user-organization-file'." - :group 'message-headers - :type '(choice string - (const :tag "consult file" t))) - -;;;###autoload -(defcustom message-user-organization-file "/usr/lib/news/organization" - "*Local news organization file." - :type 'file - :group 'message-headers) - -(defcustom message-forward-start-separator - (concat (mime-make-tag "message" "rfc822") "\n") - "*Delimiter inserted before forwarded messages." - :group 'message-forwarding - :type 'string) - -(defcustom message-forward-end-separator - (concat (mime-make-tag "text" "plain") "\n") - "*Delimiter inserted after forwarded messages." - :group 'message-forwarding - :type 'string) - -(defcustom message-included-forward-headers - "^From:\\|^Newsgroups:\\|^Subject:\\|^Date:\\|^\\(Mail-\\)?Followup-To:\\|^\\(Mail-\\)?Reply-To:\\|^Mail-Copies-To:\\|^Organization:\\|^Summary:\\|^Keywords:\\|^To:\\|^Cc:\\|^Posted-To:\\|^Apparently-To:\\|^Gnus-Warning:\\|^Resent-\\|^Message-ID:\\|^References:\\|^Content-\\|^MIME-Version:" - "*Regexp matching headers to be included in forwarded messages." - :group 'message-forwarding - :type 'regexp) - -(defcustom message-make-forward-subject-function - 'message-forward-subject-author-subject - "*List of functions called to generate subject headers for forwarded messages. -The subject generated by the previous function is passed into each -successive function. - -The provided functions are: - -* `message-forward-subject-author-subject' (Source of article (author or - newsgroup)), in brackets followed by the subject -* `message-forward-subject-fwd' (Subject of article with 'Fwd:' prepended - to it." - :group 'message-forwarding - :type '(radio (function-item message-forward-subject-author-subject) - (function-item message-forward-subject-fwd) - (repeat :tag "List of functions" function))) - -(defcustom message-forward-as-mime t - "*If non-nil, forward messages as an inline/rfc822 MIME section. Otherwise, directly inline the old message in the forwarded message." - :version "21.1" - :group 'message-forwarding - :type 'boolean) - -(defcustom message-forward-show-mml t - "*If non-nil, forward messages are shown as mml. Otherwise, forward messages are unchanged." - :version "21.1" - :group 'message-forwarding - :type 'boolean) - -(defcustom message-forward-before-signature t - "*If non-nil, put forwarded message before signature, else after." - :group 'message-forwarding - :type 'boolean) - -(defcustom message-wash-forwarded-subjects nil - "*If non-nil, try to remove as much old cruft as possible from the subject of messages before generating the new subject of a forward." - :group 'message-forwarding - :type 'boolean) - -(defcustom message-ignored-resent-headers "^Return-receipt\\|^X-Gnus\\|^Gnus-Warning:" - "*All headers that match this regexp will be deleted when resending a message." - :group 'message-interface - :type 'regexp) - -(defcustom message-forward-ignored-headers "^Content-Transfer-Encoding:\\|^X-Gnus" - "*All headers that match this regexp will be deleted when forwarding a message." - :version "21.1" - :group 'message-forwarding - :type '(choice (const :tag "None" nil) - regexp)) - -(defcustom message-ignored-cited-headers "." - "*Delete these headers from the messages you yank." - :group 'message-insertion - :type 'regexp) - -(defcustom message-cite-prefix-regexp - (if (string-match "[[:digit:]]" "1") ;; support POSIX? - "\\([ \t]*[-_.[:word:]]+>+\\|[ \t]*[]>»|:}+]\\)+" - ;; ?-, ?_ or ?. MUST NOT be in syntax entry w. - "\\([ \t]*\\(\\w\\|[-_.]\\)+>+\\|[ \t]*[]>»|:}+]\\)+") - "*Regexp matching the longest possible citation prefix on a line." - :group 'message-insertion - :type 'regexp) - -(defcustom message-cancel-message "I am canceling my own article.\n" - "Message to be inserted in the cancel message." - :group 'message-interface - :type 'string) - -;; Useful to set in site-init.el -;;;###autoload -(defcustom message-send-mail-function 'message-send-mail-with-sendmail - "Function to call to send the current buffer as mail. -The headers should be delimited by a line whose contents match the -variable `mail-header-separator'. - -Valid values include `message-send-mail-with-sendmail' (the default), -`message-send-mail-with-mh', `message-send-mail-with-qmail', -`message-send-mail-with-smtp', `smtpmail-send-it' and `feedmail-send-it'. - -See also `send-mail-function'." - :type '(radio (function-item message-send-mail-with-sendmail) - (function-item message-send-mail-with-mh) - (function-item message-send-mail-with-qmail) - (function-item message-send-mail-with-smtp) - (function-item smtpmail-send-it) - (function-item feedmail-send-it) - (function :tag "Other")) - :group 'message-sending - :group 'message-mail) - -;; 1997-09-29 by MORIOKA Tomohiko -(defcustom message-send-news-function 'message-send-news-with-gnus - "Function to call to send the current buffer as news. -The headers should be delimited by a line whose contents match the -variable `mail-header-separator'." - :group 'message-sending - :group 'message-news - :type 'function) - -(defcustom message-reply-to-function nil - "If non-nil, function that should return a list of headers. -This function should pick out addresses from the To, Cc, and From headers -and respond with new To and Cc headers." - :group 'message-interface - :type '(choice function (const nil))) - -(defcustom message-wide-reply-to-function nil - "If non-nil, function that should return a list of headers. -This function should pick out addresses from the To, Cc, and From headers -and respond with new To and Cc headers." - :group 'message-interface - :type '(choice function (const nil))) - -(defcustom message-followup-to-function nil - "If non-nil, function that should return a list of headers. -This function should pick out addresses from the To, Cc, and From headers -and respond with new To and Cc headers." - :group 'message-interface - :type '(choice function (const nil))) - -(defcustom message-use-followup-to 'ask - "*Specifies what to do with Followup-To header. -If nil, always ignore the header. If it is t, use its value, but -query before using the \"poster\" value. If it is the symbol `ask', -always query the user whether to use the value. If it is the symbol -`use', always use the value." - :group 'message-interface - :type '(choice (const :tag "ignore" nil) - (const :tag "use & query" t) - (const :tag "maybe" t) - (const :tag "always" use) - (const :tag "ask" ask))) - -(defcustom message-use-mail-copies-to 'ask - "*Specifies what to do with Mail-Copies-To header. -If nil, always ignore the header. If it is t, use its value, but -query before using the value other than \"always\" or \"never\". -If it is the symbol `ask', always query the user whether to use -the value. If it is the symbol `use', always use the value." - :group 'message-interface - :type '(choice (const :tag "ignore" nil) - (const :tag "maybe" t) - (const :tag "always" use) - (const :tag "ask" ask))) - -;;; XXX: 'ask and 'use are not implemented yet. -(defcustom message-use-mail-reply-to 'ask - "*Specifies what to do with Mail-Reply-To/Reply-To header. -If nil, always ignore the header. If it is t or the symbol `use', use -its value. If it is the symbol `ask', always query the user whether to -use the value. Note that if \"Reply-To\" is marked as \"broken\", its value -is never used." - :group 'message-interface - :type '(choice (const :tag "ignore" nil) - (const :tag "maybe" t) - (const :tag "always" use) - (const :tag "ask" ask))) - -(defcustom message-use-mail-followup-to 'use - "*Specifies what to do with Mail-Followup-To header. -If nil, always ignore the header. If it is the symbol `ask', always -query the user whether to use the value. If it is t or the symbol -`use', always use the value." - :group 'message-interface - :type '(choice (const :tag "ignore" nil) - (const :tag "maybe" t) - (const :tag "always" use) - (const :tag "ask" ask))) - -(defcustom message-sendmail-f-is-evil nil - "*Non-nil means don't add \"-f username\" to the sendmail command line. -Doing so would be even more evil than leaving it out." - :group 'message-sending - :type 'boolean) - -;; qmail-related stuff -(defcustom message-qmail-inject-program "/var/qmail/bin/qmail-inject" - "Location of the qmail-inject program." - :group 'message-sending - :type 'file) - -(defcustom message-qmail-inject-args nil - "Arguments passed to qmail-inject programs. -This should be a list of strings, one string for each argument. - -For e.g., if you wish to set the envelope sender address so that bounces -go to the right place or to deal with listserv's usage of that address, you -might set this variable to '(\"-f\" \"you@some.where\")." - :group 'message-sending - :type '(repeat string)) - -(defvar message-cater-to-broken-inn t - "Non-nil means Gnus should not fold the `References' header. -Folding `References' makes ancient versions of INN create incorrect -NOV lines.") - -(eval-when-compile - (defvar gnus-post-method) - (defvar gnus-select-method)) -(defcustom message-post-method - (cond ((and (boundp 'gnus-post-method) - (listp gnus-post-method) - gnus-post-method) - gnus-post-method) - ((boundp 'gnus-select-method) - gnus-select-method) - (t '(nnspool ""))) - "*Method used to post news. -Note that when posting from inside Gnus, for instance, this -variable isn't used." - :group 'message-news - :group 'message-sending - ;; This should be the `gnus-select-method' widget, but that might - ;; create a dependence to `gnus.el'. - :type 'sexp) - -(defcustom message-generate-headers-first nil - "*If non-nil, generate all required headers before composing. -The variables `message-required-news-headers' and -`message-required-mail-headers' specify which headers to generate. - -Note that the variable `message-deletable-headers' specifies headers which -are to be deleted and then re-generated before sending, so this variable -will not have a visible effect for those headers." - :group 'message-headers - :type 'boolean) - -(defcustom message-setup-hook '(turn-on-mime-edit) - "Normal hook, run each time a new outgoing message is initialized. -The function `message-setup' runs this hook." - :group 'message-various - :type 'hook) - -(defcustom message-cancel-hook nil - "Hook run when cancelling articles." - :group 'message-various - :type 'hook) - -(defcustom message-signature-setup-hook nil - "Normal hook, run each time a new outgoing message is initialized. -It is run after the headers have been inserted and before -the signature is inserted." - :group 'message-various - :type 'hook) - -(defcustom message-bounce-setup-hook nil - "Normal hook, run each time a re-sending bounced message is initialized. -The function `message-bounce' runs this hook." - :group 'message-various - :type 'hook) - -(defcustom message-supersede-setup-hook nil - "Normal hook, run each time a supersede message is initialized. -The function `message-supersede' runs this hook." - :group 'message-various - :type 'hook) - -(defcustom message-mode-hook nil - "Hook run in message mode buffers." - :group 'message-various - :type 'hook) - -(defcustom message-header-hook '((lambda () (eword-encode-header t))) - "Hook run in a message mode buffer narrowed to the headers." - :group 'message-various - :type 'hook) - -(defcustom message-header-setup-hook nil - "Hook called narrowed to the headers when setting up a message buffer." - :group 'message-various - :type 'hook) - -(defcustom message-minibuffer-local-map - (let ((map (make-sparse-keymap 'message-minibuffer-local-map))) - (set-keymap-parent map minibuffer-local-map) - map) - "Keymap for `message-read-from-minibuffer'.") - -;;;###autoload -(defcustom message-citation-line-function 'message-insert-citation-line - "*Function called to insert the \"Whomever writes:\" line. - -Note that Gnus provides a feature where the reader can click on -`writes:' to hide the cited text. If you change this line too much, -people who read your message will have to change their Gnus -configuration. See the variable `gnus-cite-attribution-suffix'." - :type 'function - :group 'message-insertion) - -;;;###autoload -(defcustom message-yank-prefix "> " - "*Prefix inserted on the lines of yanked messages. -Fix `message-cite-prefix-regexp' if it is set to an abnormal value. -See also `message-yank-cited-prefix'." - :type 'string - :group 'message-insertion) - -(defcustom message-yank-add-new-references t - "Non-nil means new IDs will be added to \"References\" field when an -article is yanked by the command `message-yank-original' interactively. -If it is a symbol `message-id-only', only an ID from \"Message-ID\" field -is used, otherwise IDs extracted from \"References\", \"In-Reply-To\" and -\"Message-ID\" fields are used." - :type '(radio (const :tag "Do not add anything" nil) - (const :tag "From Message-Id, References and In-Reply-To fields" t) - (const :tag "From only Message-Id field." message-id-only)) - :group 'message-insertion) - -(defcustom message-list-references-add-position nil - "Integer value means position for adding to \"References\" field when -an article is yanked by the command `message-yank-original' interactively." - :type '(radio (const :tag "Add to last" nil) - (integer :tag "Position from last ID")) - :group 'message-insertion) - -(defcustom message-yank-cited-prefix ">" - "*Prefix inserted on cited or empty lines of yanked messages. -Fix `message-cite-prefix-regexp' if it is set to an abnormal value. -See also `message-yank-prefix'." - :type 'string - :group 'message-insertion) - -(defcustom message-indentation-spaces 3 - "*Number of spaces to insert at the beginning of each cited line. -Used by `message-yank-original' via `message-yank-cite'." - :group 'message-insertion - :type 'integer) - -;;;###autoload -(defcustom message-cite-function 'message-cite-original - "*Function for citing an original message. -Predefined functions include `message-cite-original' and -`message-cite-original-without-signature'. -Note that `message-cite-original' uses `mail-citation-hook' if that is non-nil." - :type '(radio (function-item message-cite-original) - (function-item message-cite-original-without-signature) - (function-item mu-cite-original) - (function-item sc-cite-original) - (function :tag "Other")) - :group 'message-insertion) - -;;;###autoload -(defcustom message-suspend-font-lock-when-citing nil - "Non-nil means suspend font-lock'ing while citing an original message. -Some lazy demand-driven fontification tools (or Emacs itself) have a -bug that they often miss a buffer to be fontified. It will mostly -occur when Emacs prompts user for any inputs in the minibuffer. -Setting this option to non-nil may help you to avoid unpleasant errors -even if it is an add-hoc expedient." - :type 'boolean - :group 'message-insertion) - -;;;###autoload -(defcustom message-indent-citation-function 'message-indent-citation - "*Function for modifying a citation just inserted in the mail buffer. -This can also be a list of functions. Each function can find the -citation between (point) and (mark t). And each function should leave -point and mark around the citation text as modified." - :type 'function - :group 'message-insertion) - -(defvar message-abbrevs-loaded nil) - -;;;###autoload -(defcustom message-signature t - "*String to be inserted at the end of the message buffer. -If t, the `message-signature-file' file will be inserted instead. -If a function, the result from the function will be used instead. -If a form, the result from the form will be used instead." - :type 'sexp - :group 'message-insertion) - -;;;###autoload -(defcustom message-signature-file "~/.signature" - "*Name of file containing the text inserted at end of message buffer. -Ignored if the named file doesn't exist. -If nil, don't insert a signature." - :type '(choice file (const :tags "None" nil)) - :group 'message-insertion) - -(defcustom message-distribution-function nil - "*Function called to return a Distribution header." - :group 'message-news - :group 'message-headers - :type '(choice function (const nil))) - -(defcustom message-expires 14 - "Number of days before your article expires." - :group 'message-news - :group 'message-headers - :link '(custom-manual "(message)News Headers") - :type 'integer) - -(defcustom message-user-path nil - "If nil, use the NNTP server name in the Path header. -If stringp, use this; if non-nil, use no host name (user name only)." - :group 'message-news - :group 'message-headers - :link '(custom-manual "(message)News Headers") - :type '(choice (const :tag "nntp" nil) - (string :tag "name") - (sexp :tag "none" :format "%t" t))) - -(defvar message-reply-buffer nil) -(defvar message-reply-headers nil) -(defvar message-sent-message-via nil) -(defvar message-checksum nil) -(defvar message-send-actions nil - "A list of actions to be performed upon successful sending of a message.") -(defvar message-exit-actions nil - "A list of actions to be performed upon exiting after sending a message.") -(defvar message-kill-actions nil - "A list of actions to be performed before killing a message buffer.") -(defvar message-postpone-actions nil - "A list of actions to be performed after postponing a message.") -(defvar message-original-frame nil) -(defvar message-parameter-alist nil) -(defvar message-startup-parameter-alist nil) - -(define-widget 'message-header-lines 'text - "All header lines must be LFD terminated." - :format "%{%t%}:%n%v" - :valid-regexp "^\\'" - :error "All header lines must be newline terminated") - -(defcustom message-default-headers "" - "*A string containing header lines to be inserted in outgoing messages. -It is inserted before you edit the message, so you can edit or delete -these lines." - :group 'message-headers - :type 'message-header-lines) - -(defcustom message-default-mail-headers "" - "*A string of header lines to be inserted in outgoing mails." - :group 'message-headers - :group 'message-mail - :type 'message-header-lines) - -(defcustom message-default-news-headers "" - "*A string of header lines to be inserted in outgoing news articles." - :group 'message-headers - :group 'message-news - :type 'message-header-lines) - -;; Note: could use /usr/ucb/mail instead of sendmail; -;; options -t, and -v if not interactive. -(defcustom message-mailer-swallows-blank-line - (if (and (string-match "sparc-sun-sunos\\(\\'\\|[^5]\\)" - system-configuration) - (file-readable-p "/etc/sendmail.cf") - (let ((buffer (get-buffer-create " *temp*"))) - (unwind-protect - (save-excursion - (set-buffer buffer) - (insert-file-contents "/etc/sendmail.cf") - (goto-char (point-min)) - (let ((case-fold-search nil)) - (re-search-forward "^OR\\>" nil t))) - (kill-buffer buffer)))) - ;; According to RFC822, "The field-name must be composed of printable - ;; ASCII characters (i. e., characters that have decimal values between - ;; 33 and 126, except colon)", i. e., any chars except ctl chars, - ;; space, or colon. - '(looking-at "[ \t]\\|[][!\"#$%&'()*+,-./0-9;<=>?@A-Z\\\\^_`a-z{|}~]+:")) - "*Set this non-nil if the system's mailer runs the header and body together. -\(This problem exists on Sunos 4 when sendmail is run in remote mode.) -The value should be an expression to test whether the problem will -actually occur." - :group 'message-sending - :type 'sexp) - -;;; XXX: This symbol is overloaded! See below. -(defvar message-user-agent nil - "String of the form of PRODUCT/VERSION. Used for User-Agent header field.") - -(static-when (boundp 'MULE) - (require 'reporter));; `define-mail-user-agent' is here. - -;;;###autoload -(define-mail-user-agent 'message-user-agent - 'message-mail 'message-send-and-exit - 'message-kill-buffer 'message-send-hook) - -(defvar message-mh-deletable-headers '(Message-ID Date Lines Sender) - "If non-nil, delete the deletable headers before feeding to mh.") - -(defvar message-send-method-alist - '((news message-news-p message-send-via-news) - (mail message-mail-p message-send-via-mail)) - "Alist of ways to send outgoing messages. -Each element has the form - - \(TYPE PREDICATE FUNCTION) - -where TYPE is a symbol that names the method; PREDICATE is a function -called without any parameters to determine whether the message is -a message of type TYPE; and FUNCTION is a function to be called if -PREDICATE returns non-nil. FUNCTION is called with one parameter -- -the prefix.") - -(defcustom message-mail-alias-type 'abbrev - "*What alias expansion type to use in Message buffers. -The default is `abbrev', which uses mailabbrev. nil switches -mail aliases off." - :group 'message - :link '(custom-manual "(message)Mail Aliases") - :type '(choice (const :tag "Use Mailabbrev" abbrev) - (const :tag "No expansion" nil))) - -(defcustom message-auto-save-directory - (file-name-as-directory (nnheader-concat message-directory "drafts")) - "*Directory where Message auto-saves buffers if Gnus isn't running. -If nil, Message won't auto-save." - :group 'message-buffers - :type '(choice directory (const :tag "Don't auto-save" nil))) - -(defcustom message-buffer-naming-style 'unique - "*The way new message buffers are named. -Valid valued are `unique' and `unsent'." - :version "21.1" - :group 'message-buffers - :type '(choice (const :tag "unique" unique) - (const :tag "unsent" unsent))) - -(defcustom message-default-charset - (and (featurep 'xemacs) (not (featurep 'mule)) 'iso-8859-1) - "Default charset used in non-MULE XEmacsen." - :version "21.1" - :group 'message - :type 'symbol) - -(defcustom message-dont-reply-to-names - (and (boundp 'rmail-dont-reply-to-names) rmail-dont-reply-to-names) - "*A regexp specifying addresses to prune when doing wide replies. -A value of nil means exclude your own user name only." - :version "21.1" - :group 'message - :type '(choice (const :tag "Yourself" nil) - regexp)) - -(defvar message-shoot-gnksa-feet nil - "*A list of GNKSA feet you are allowed to shoot. -Gnus gives you all the opportunity you could possibly want for -shooting yourself in the foot. Also, Gnus allows you to shoot the -feet of Good Net-Keeping Seal of Approval. The following are foot -candidates: -`empty-article' Allow you to post an empty article; -`quoted-text-only' Allow you to post quoted text only; -`multiple-copies' Allow you to post multiple copies.") -;; `cancel-messages' Allow you to cancel or supersede others' messages. - -(defsubst message-gnksa-enable-p (feature) - (or (not (listp message-shoot-gnksa-feet)) - (memq feature message-shoot-gnksa-feet))) - -;;; Internal variables. -;;; Well, not really internal. - -(defvar message-mode-syntax-table - (let ((table (copy-syntax-table text-mode-syntax-table))) - (modify-syntax-entry ?% ". " table) - (modify-syntax-entry ?> ". " table) - (modify-syntax-entry ?< ". " table) - table) - "Syntax table used while in Message mode.") - -(defface message-header-to-face - '((((class color) - (background dark)) - (:foreground "green2" :bold t)) - (((class color) - (background light)) - (:foreground "MidnightBlue" :bold t)) - (t - (:bold t :italic t))) - "Face used for displaying From headers." - :group 'message-faces) - -(defface message-header-cc-face - '((((class color) - (background dark)) - (:foreground "green4" :bold t)) - (((class color) - (background light)) - (:foreground "MidnightBlue")) - (t - (:bold t))) - "Face used for displaying Cc headers." - :group 'message-faces) - -(defface message-header-subject-face - '((((class color) - (background dark)) - (:foreground "green3")) - (((class color) - (background light)) - (:foreground "navy blue" :bold t)) - (t - (:bold t))) - "Face used for displaying subject headers." - :group 'message-faces) - -(defface message-header-newsgroups-face - '((((class color) - (background dark)) - (:foreground "yellow" :bold t :italic t)) - (((class color) - (background light)) - (:foreground "blue4" :bold t :italic t)) - (t - (:bold t :italic t))) - "Face used for displaying newsgroups headers." - :group 'message-faces) - -(defface message-header-other-face - '((((class color) - (background dark)) - (:foreground "#b00000")) - (((class color) - (background light)) - (:foreground "steel blue")) - (t - (:bold t :italic t))) - "Face used for displaying newsgroups headers." - :group 'message-faces) - -(defface message-header-name-face - '((((class color) - (background dark)) - (:foreground "DarkGreen")) - (((class color) - (background light)) - (:foreground "cornflower blue")) - (t - (:bold t))) - "Face used for displaying header names." - :group 'message-faces) - -(defface message-header-xheader-face - '((((class color) - (background dark)) - (:foreground "blue")) - (((class color) - (background light)) - (:foreground "blue")) - (t - (:bold t))) - "Face used for displaying X-Header headers." - :group 'message-faces) - -(defface message-separator-face - '((((class color) - (background dark)) - (:foreground "blue3")) - (((class color) - (background light)) - (:foreground "brown")) - (t - (:bold t))) - "Face used for displaying the separator." - :group 'message-faces) - -(defface message-cited-text-face - '((((class color) - (background dark)) - (:foreground "red")) - (((class color) - (background light)) - (:foreground "red")) - (t - (:bold t))) - "Face used for displaying cited text names." - :group 'message-faces) - -(defface message-mml-face - '((((class color) - (background dark)) - (:foreground "ForestGreen")) - (((class color) - (background light)) - (:foreground "ForestGreen")) - (t - (:bold t))) - "Face used for displaying MML." - :group 'message-faces) - -(defvar message-font-lock-keywords - (let ((content "[ \t]*\\(.+\\(\n[ \t].*\\)*\\)\n?")) - `((,(concat "^\\([Tt]o:\\)" content) - (1 'message-header-name-face) - (2 'message-header-to-face nil t)) - (,(concat "^\\([GBF]?[Cc][Cc]:\\|[Rr]eply-[Tt]o:\\|" - "[Mm]ail-[Cc]opies-[Tt]o:\\|" - "[Mm]ail-[Rr]eply-[Tt]o:\\|" - "[Mm]ail-[Ff]ollowup-[Tt]o:\\)" content) - (1 'message-header-name-face) - (2 'message-header-cc-face nil t)) - (,(concat "^\\([Ss]ubject:\\)" content) - (1 'message-header-name-face) - (2 'message-header-subject-face nil t)) - (,(concat "^\\([Nn]ewsgroups:\\|Followup-[Tt]o:\\)" content) - (1 'message-header-name-face) - (2 'message-header-newsgroups-face nil t)) - (,(concat "^\\([A-Z][^: \n\t]+:\\)" content) - (1 'message-header-name-face) - (2 'message-header-other-face nil t)) - (,(concat "^\\(X-[A-Za-z0-9-]+\\|In-Reply-To\\):" content) - (1 'message-header-name-face) - (2 'message-header-name-face)) - ,@(if (and mail-header-separator - (not (equal mail-header-separator ""))) - `((,(concat "^\\(" (regexp-quote mail-header-separator) "\\)$") - 1 'message-separator-face)) - nil) - (,(concat "^\\(" message-cite-prefix-regexp "\\).*") - (0 'message-cited-text-face)) - (,mime-edit-tag-regexp - (0 'message-mml-face)))) - "Additional expressions to highlight in Message mode.") - -;; XEmacs does it like this. For Emacs, we have to set the -;; `font-lock-defaults' buffer-local variable. -(put 'message-mode 'font-lock-defaults '(message-font-lock-keywords t)) - -(defvar message-face-alist - '((bold . bold-region) - (underline . underline-region) - (default . (lambda (b e) - (unbold-region b e) - (ununderline-region b e)))) - "Alist of mail and news faces for facemenu. -The cdr of ech entry is a function for applying the face to a region.") - -(defcustom message-send-hook nil - "Hook run before sending messages." - :group 'message-various - :options '(ispell-message) - :type 'hook) - -(defcustom message-send-mail-hook nil - "Hook run before sending mail messages." - :group 'message-various - :type 'hook) - -(defcustom message-send-news-hook nil - "Hook run before sending news messages." - :group 'message-various - :type 'hook) - -(defcustom message-sent-hook nil - "Hook run after sending messages." - :group 'message-various - :type 'hook) - -(defcustom message-use-multi-frames nil - "Make new frame when sending messages." - :group 'message-frames - :type 'boolean) - -(defcustom message-delete-frame-on-exit nil - "Delete frame after sending messages." - :group 'message-frames - :type '(choice (const :tag "off" nil) - (const :tag "always" t) - (const :tag "ask" ask))) - -(defvar message-draft-coding-system - (cond - ((boundp 'MULE) '*junet*) - ((not (fboundp 'find-coding-system)) nil) - ((find-coding-system 'emacs-mule) - (if (memq system-type '(windows-nt ms-dos ms-windows)) - 'emacs-mule-dos 'emacs-mule)) - ((find-coding-system 'escape-quoted) 'escape-quoted) - ((find-coding-system 'no-conversion) 'no-conversion) - (t nil)) - "Coding system to compose mail.") - -(defcustom message-send-mail-partially-limit 1000000 - "The limitation of messages sent as message/partial. -The lower bound of message size in characters, beyond which the message -should be sent in several parts. If it is nil, the size is unlimited." - :version "21.1" - :group 'message-buffers - :type '(choice (const :tag "unlimited" nil) - (integer 1000000))) - -(defcustom message-alternative-emails nil - "A regexp to match the alternative email addresses. -The first matched address (not primary one) is used in the From field." - :group 'message-headers - :type '(choice (const :tag "Always use primary" nil) - regexp)) - -(defcustom message-mail-user-agent nil - "Like `mail-user-agent'. -Except if it is nil, use Gnus native MUA; if it is t, use -`mail-user-agent'." - :type '(radio (const :tag "Gnus native" - :format "%t\n" - nil) - (const :tag "`mail-user-agent'" - :format "%t\n" - t) - (function-item :tag "Default Emacs mail" - :format "%t\n" - sendmail-user-agent) - (function-item :tag "Emacs interface to MH" - :format "%t\n" - mh-e-user-agent) - (function :tag "Other")) - :version "21.1" - :group 'message) - -(defcustom message-wide-reply-confirm-recipients nil - "Whether to confirm a wide reply to multiple email recipients. -If this variable is nil, don't ask whether to reply to all recipients. -If this variable is non-nil, pose the question \"Reply to all -recipients?\" before a wide reply to multiple recipients. If the user -answers yes, reply to all recipients as usual. If the user answers -no, only reply back to the author." - :group 'message-headers - :type 'boolean) - -;;; Internal variables. - -(defvar message-sending-message "Sending...") -(defvar message-buffer-list nil) -(defvar message-this-is-news nil) -(defvar message-this-is-mail nil) -(defvar message-draft-article nil) -(defvar message-mime-part nil) -(defvar message-posting-charset nil) - -;; Byte-compiler warning -(eval-when-compile - (defvar gnus-active-hashtb) - (defvar gnus-read-active-file)) - -;;; Regexp matching the delimiter of messages in UNIX mail format -;;; (UNIX From lines), minus the initial ^. It should be a copy -;;; of rmail.el's rmail-unix-mail-delimiter. -(defvar message-unix-mail-delimiter - (let ((time-zone-regexp - (concat "\\([A-Z]?[A-Z]?[A-Z][A-Z]\\( DST\\)?" - "\\|[-+]?[0-9][0-9][0-9][0-9]" - "\\|" - "\\) *"))) - (concat - "From " - - ;; Many things can happen to an RFC 822 mailbox before it is put into - ;; a `From' line. The leading phrase can be stripped, e.g. - ;; `Joe <@w.x:joe@y.z>' -> `<@w.x:joe@y.z>'. The <> can be stripped, e.g. - ;; `<@x.y:joe@y.z>' -> `@x.y:joe@y.z'. Everything starting with a CRLF - ;; can be removed, e.g. - ;; From: joe@y.z (Joe K - ;; User) - ;; can yield `From joe@y.z (Joe K Fri Mar 22 08:11:15 1996', and - ;; From: Joe User - ;; - ;; can yield `From Joe User Fri Mar 22 08:11:15 1996'. - ;; The mailbox can be removed or be replaced by white space, e.g. - ;; From: "Joe User"{space}{tab} - ;; - ;; can yield `From {space}{tab} Fri Mar 22 08:11:15 1996', - ;; where {space} and {tab} represent the Ascii space and tab characters. - ;; We want to match the results of any of these manglings. - ;; The following regexp rejects names whose first characters are - ;; obviously bogus, but after that anything goes. - "\\([^\0-\b\n-\r\^?].*\\)? " - - ;; The time the message was sent. - "\\([^\0-\r \^?]+\\) +" ; day of the week - "\\([^\0-\r \^?]+\\) +" ; month - "\\([0-3]?[0-9]\\) +" ; day of month - "\\([0-2][0-9]:[0-5][0-9]\\(:[0-6][0-9]\\)?\\) *" ; time of day - - ;; Perhaps a time zone, specified by an abbreviation, or by a - ;; numeric offset. - time-zone-regexp - - ;; The year. - " \\([0-9][0-9]+\\) *" - - ;; On some systems the time zone can appear after the year, too. - time-zone-regexp - - ;; Old uucp cruft. - "\\(remote from .*\\)?" - - "\n")) - "Regexp matching the delimiter of messages in UNIX mail format.") - -(defvar message-unsent-separator - (concat "^ *---+ +Unsent message follows +---+ *$\\|" - "^ *---+ +Returned message +---+ *$\\|" - "^Start of returned message$\\|" - "^ *---+ +Original message +---+ *$\\|" - "^ *--+ +begin message +--+ *$\\|" - "^ *---+ +Original message follows +---+ *$\\|" - "^ *---+ +Undelivered message follows +---+ *$\\|" - "^|? *---+ +Message text follows: +---+ *|?$") - "A regexp that matches the separator before the text of a failed message.") - -(defvar message-header-format-alist - `((Newsgroups) - (To . message-fill-address) - (Cc . message-fill-address) - (Subject) - (In-Reply-To) - (Fcc) - (Bcc) - (Date) - (Organization) - (Distribution) - (Lines) - (Expires) - (Message-ID) - (References . message-shorten-references) - (User-Agent)) - "Alist used for formatting headers.") - -(defvar message-options nil - "Some saved answers when sending message.") - -(defvar message-send-mail-real-function nil - "Internal send mail function.") - -(defvar message-bogus-system-names "^localhost\\." - "The regexp of bogus system names.") - -(eval-and-compile - (autoload 'message-setup-toolbar "messagexmas") - (autoload 'mh-new-draft-name "mh-comp") - (autoload 'mh-send-letter "mh-comp") - (autoload 'gnus-point-at-eol "gnus-util") - (autoload 'gnus-point-at-bol "gnus-util") - (autoload 'gnus-output-to-rmail "gnus-util") - (autoload 'gnus-output-to-mail "gnus-util") - (autoload 'mail-abbrev-in-expansion-header-p "mailabbrev") - (autoload 'nndraft-request-associate-buffer "nndraft") - (autoload 'nndraft-request-expire-articles "nndraft") - (autoload 'gnus-open-server "gnus-int") - (autoload 'gnus-request-post "gnus-int") - (autoload 'gnus-copy-article-buffer "gnus-msg") - (autoload 'gnus-alive-p "gnus-util") - (autoload 'gnus-server-string "gnus") - (autoload 'gnus-group-name-charset "gnus-group") - (autoload 'rmail-output "rmailout") - (autoload 'mu-cite-original "mu-cite")) - - - -;;; -;;; Utility functions. -;;; -(defun message-eval-parameter (parameter) - (condition-case () - (if (symbolp parameter) - (if (functionp parameter) - (funcall parameter) - (eval parameter)) - parameter) - (error nil))) - -(defsubst message-get-parameter (key &optional alist) - (unless alist - (setq alist message-parameter-alist)) - (cdr (assq key alist))) - -(defmacro message-get-parameter-with-eval (key &optional alist) - `(message-eval-parameter (message-get-parameter ,key ,alist))) - -(defmacro message-y-or-n-p (question show &rest text) - "Ask QUESTION, displaying remaining args in a temporary buffer if SHOW." - `(message-talkative-question 'y-or-n-p ,question ,show ,@text)) - -(defmacro message-delete-line (&optional n) - "Delete the current line (and the next N lines)." - `(delete-region (progn (beginning-of-line) (point)) - (progn (forward-line ,(or n 1)) (point)))) - -(defun message-unquote-tokens (elems) - "Remove double quotes (\") from strings in list ELEMS." - (mapcar (lambda (item) - (while (string-match "^\\(.*\\)\"\\(.*\\)$" item) - (setq item (concat (match-string 1 item) - (match-string 2 item)))) - item) - elems)) - -(defun message-tokenize-header (header &optional separator) - "Split HEADER into a list of header elements. -SEPARATOR is a string of characters to be used as separators. \",\" -is used by default." - (if (not header) - nil - (let ((regexp (format "[%s]+" (or separator ","))) - (beg 1) - (first t) - quoted elems paren) - (save-excursion - (message-set-work-buffer) - (insert header) - (goto-char (point-min)) - (while (not (eobp)) - (if first - (setq first nil) - (forward-char 1)) - (cond ((and (> (point) beg) - (or (eobp) - (and (looking-at regexp) - (not quoted) - (not paren)))) - (push (buffer-substring beg (point)) elems) - (setq beg (match-end 0))) - ((eq (char-after) ?\") - (setq quoted (not quoted))) - ((and (eq (char-after) ?\() - (not quoted)) - (setq paren t)) - ((and (eq (char-after) ?\)) - (not quoted)) - (setq paren nil)))) - (nreverse elems))))) - -(defun message-mail-file-mbox-p (file) - "Say whether FILE looks like a Unix mbox file." - (when (and (file-exists-p file) - (file-readable-p file) - (file-regular-p file)) - (with-temp-buffer - (nnheader-insert-file-contents file) - (goto-char (point-min)) - (looking-at message-unix-mail-delimiter)))) - -(defun message-fetch-field (header &optional not-all) - "The same as `mail-fetch-field', only remove all newlines." - (let* ((inhibit-point-motion-hooks t) - (case-fold-search t) - (value (mail-fetch-field header nil (not not-all)))) - (when value - (while (string-match "\n[\t ]+" value) - (setq value (replace-match " " t t value))) - (set-text-properties 0 (length value) nil value) - value))) - -(defun message-narrow-to-field () - "Narrow the buffer to the header on the current line." - (beginning-of-line) - (narrow-to-region - (point) - (progn - (forward-line 1) - (if (re-search-forward "^[^ \n\t]" nil t) - (progn - (beginning-of-line) - (point)) - (point-max)))) - (goto-char (point-min))) - -(defun message-add-header (&rest headers) - "Add the HEADERS to the message header, skipping those already present." - (while headers - (let (hclean) - (unless (string-match "^\\([^:]+\\):[ \t]*[^ \t]" (car headers)) - (error "Invalid header `%s'" (car headers))) - (setq hclean (match-string 1 (car headers))) - (save-restriction - (message-narrow-to-headers) - (unless (re-search-forward (concat "^" (regexp-quote hclean) ":") nil t) - (goto-char (point-max)) - (if (string-match "\n$" (car headers)) - (insert (car headers)) - (insert (car headers) ?\n))))) - (setq headers (cdr headers)))) - - -(defun message-fetch-reply-field (header) - "Fetch field HEADER from the message we're replying to." - (let ((buffer (message-eval-parameter message-reply-buffer))) - (when (and buffer - (buffer-name buffer)) - (save-excursion - (set-buffer buffer) - (message-fetch-field header))))) - -(defun message-set-work-buffer () - (if (get-buffer " *message work*") - (progn - (set-buffer " *message work*") - (erase-buffer)) - (set-buffer (get-buffer-create " *message work*")) - (kill-all-local-variables))) - -(defun message-functionp (form) - "Return non-nil if FORM is funcallable." - (or (and (symbolp form) (fboundp form)) - (and (listp form) (eq (car form) 'lambda)) - (byte-code-function-p form))) - -(defun message-strip-list-identifiers (subject) - "Remove list identifiers in `gnus-list-identifiers' from string SUBJECT." - (require 'gnus-sum) ; for gnus-list-identifiers - (let ((regexp (if (stringp gnus-list-identifiers) - gnus-list-identifiers - (mapconcat 'identity gnus-list-identifiers " *\\|")))) - (if (string-match (concat "\\(\\(\\(Re: +\\)?\\(" regexp - " *\\)\\)+\\(Re: +\\)?\\)") subject) - (concat (substring subject 0 (match-beginning 1)) - (or (match-string 3 subject) - (match-string 5 subject)) - (substring subject - (match-end 1))) - subject))) - -(defun message-strip-subject-re (subject) - "Remove \"Re:\" from subject lines in string SUBJECT." - (if (string-match message-subject-re-regexp subject) - (substring subject (match-end 0)) - subject)) - -(defun message-remove-header (header &optional is-regexp first reverse) - "Remove HEADER in the narrowed buffer. -If IS-REGEXP, HEADER is a regular expression. -If FIRST, only remove the first instance of the header. -Return the number of headers removed." - (goto-char (point-min)) - (let ((regexp (if is-regexp header (concat "^" (regexp-quote header) ":"))) - (number 0) - (case-fold-search t) - last) - (while (and (not (eobp)) - (not last)) - (if (if reverse - (not (looking-at regexp)) - (looking-at regexp)) - (progn - (incf number) - (when first - (setq last t)) - (delete-region - (point) - ;; There might be a continuation header, so we have to search - ;; until we find a new non-continuation line. - (progn - (forward-line 1) - (if (re-search-forward "^[^ \t]" nil t) - (goto-char (match-beginning 0)) - (point-max))))) - (forward-line 1) - (if (re-search-forward "^[^ \t]" nil t) - (goto-char (match-beginning 0)) - (goto-char (point-max))))) - number)) - -(defun message-remove-first-header (header) - "Remove the first instance of HEADER if there is more than one." - (let ((count 0) - (regexp (concat "^" (regexp-quote header) ":"))) - (save-excursion - (goto-char (point-min)) - (while (re-search-forward regexp nil t) - (incf count))) - (while (> count 1) - (message-remove-header header nil t) - (decf count)))) - -(defun message-narrow-to-headers () - "Narrow the buffer to the head of the message." - (widen) - (narrow-to-region - (goto-char (point-min)) - (if (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "\n") nil t) - (match-beginning 0) - (point-max))) - (goto-char (point-min))) - -(defun message-narrow-to-head-1 () - "Like `message-narrow-to-head'. Don't widen." - (narrow-to-region - (goto-char (point-min)) - (if (search-forward "\n\n" nil 1) - (1- (point)) - (point-max))) - (goto-char (point-min))) - -(defun message-narrow-to-head () - "Narrow the buffer to the head of the message. -Point is left at the beginning of the narrowed-to region." - (widen) - (message-narrow-to-head-1)) - -(defun message-narrow-to-headers-or-head () - "Narrow the buffer to the head of the message." - (widen) - (narrow-to-region - (goto-char (point-min)) - (cond - ((re-search-forward - (concat "^" (regexp-quote mail-header-separator) "\n") nil t) - (match-beginning 0)) - ((search-forward "\n\n" nil t) - (1- (point))) - (t - (point-max)))) - (goto-char (point-min))) - -(defun message-news-p () - "Say whether the current buffer contains a news message." - (and (not message-this-is-mail) - (or message-this-is-news - (save-excursion - (save-restriction - (message-narrow-to-headers) - (and (message-fetch-field "newsgroups") - (not (message-fetch-field "posted-to")))))))) - -(defun message-mail-p () - "Say whether the current buffer contains a mail message." - (and (not message-this-is-news) - (or message-this-is-mail - (save-excursion - (save-restriction - (message-narrow-to-headers) - (or (message-fetch-field "to") - (message-fetch-field "cc") - (message-fetch-field "bcc"))))))) - -(defun message-next-header () - "Go to the beginning of the next header." - (beginning-of-line) - (or (eobp) (forward-char 1)) - (not (if (re-search-forward "^[^ \t]" nil t) - (beginning-of-line) - (goto-char (point-max))))) - -(defun message-sort-headers-1 () - "Sort the buffer as headers using `message-rank' text props." - (goto-char (point-min)) - (require 'sort) - (sort-subr - nil 'message-next-header - (lambda () - (message-next-header) - (unless (bobp) - (forward-char -1))) - (lambda () - (or (get-text-property (point) 'message-rank) - 10000)))) - -(defun message-sort-headers () - "Sort the headers of the current message according to `message-header-format-alist'." - (interactive) - (save-excursion - (save-restriction - (let ((max (1+ (length message-header-format-alist))) - rank) - (message-narrow-to-headers) - (while (re-search-forward "^[^ \n]+:" nil t) - (put-text-property - (match-beginning 0) (1+ (match-beginning 0)) - 'message-rank - (if (setq rank (length (memq (assq (intern (buffer-substring - (match-beginning 0) - (1- (match-end 0)))) - message-header-format-alist) - message-header-format-alist))) - (- max rank) - (1+ max))))) - (message-sort-headers-1)))) - - - -;;; -;;; Message mode -;;; - -;;; Set up keymap. - -(defvar message-mode-map nil) - -(unless message-mode-map - (setq message-mode-map (make-keymap)) - (set-keymap-parent message-mode-map text-mode-map) - (define-key message-mode-map "\C-c?" 'describe-mode) - - (define-key message-mode-map "\C-c\C-f\C-t" 'message-goto-to) - (define-key message-mode-map "\C-c\C-f\C-b" 'message-goto-bcc) - (define-key message-mode-map "\C-c\C-f\C-w" 'message-goto-fcc) - (define-key message-mode-map "\C-c\C-f\C-c" 'message-goto-cc) - (define-key message-mode-map "\C-c\C-f\C-s" 'message-goto-subject) - ;; (define-key message-mode-map "\C-c\C-f\C-r" 'message-goto-reply-to) - (define-key message-mode-map "\C-c\C-f\C-r" 'message-goto-mail-reply-to) - (define-key message-mode-map "\C-c\C-f\C-m" 'message-goto-mail-followup-to) - (define-key message-mode-map "\C-c\C-f\C-n" 'message-goto-newsgroups) - (define-key message-mode-map "\C-c\C-f\C-d" 'message-goto-distribution) - (define-key message-mode-map "\C-c\C-f\C-f" 'message-goto-followup-to) - (define-key message-mode-map "\C-c\C-f\C-k" 'message-goto-keywords) - (define-key message-mode-map "\C-c\C-f\C-u" 'message-goto-summary) - (define-key message-mode-map "\C-c\C-b" 'message-goto-body) - (define-key message-mode-map "\C-c\C-i" 'message-goto-signature) - (define-key message-mode-map "\C-c\C-fc" 'message-goto-mail-copies-to) - - (define-key message-mode-map "\C-c\C-t" 'message-insert-to) - (define-key message-mode-map "\C-c\C-n" 'message-insert-newsgroups) - - (define-key message-mode-map "\C-c\C-y" 'message-yank-original) - (define-key message-mode-map "\C-c\M-\C-y" 'message-yank-buffer) - (define-key message-mode-map "\C-c\C-q" 'message-fill-yanked-message) - (define-key message-mode-map "\C-c\C-w" 'message-insert-signature) - (define-key message-mode-map "\C-c\M-h" 'message-insert-headers) - (define-key message-mode-map "\C-c\C-r" 'message-caesar-buffer-body) - (define-key message-mode-map "\C-c\C-o" 'message-sort-headers) - (define-key message-mode-map "\C-c\M-r" 'message-rename-buffer) - - (define-key message-mode-map "\C-c\C-c" 'message-send-and-exit) - (define-key message-mode-map "\C-c\C-s" 'message-send) - (define-key message-mode-map "\C-c\C-k" 'message-kill-buffer) - (define-key message-mode-map "\C-c\C-d" 'message-dont-send) - - (define-key message-mode-map "\C-c\C-e" 'message-elide-region) - (define-key message-mode-map "\C-c\C-v" 'message-delete-not-region) - (define-key message-mode-map "\C-c\C-z" 'message-kill-to-signature) - (define-key message-mode-map "\M-\r" 'message-newline-and-reformat) - ;;(define-key message-mode-map "\M-q" 'message-fill-paragraph) - - (define-key message-mode-map "\t" 'message-tab) - (define-key message-mode-map "\M-;" 'comment-region) - - (define-key message-mode-map "\C-x\C-s" 'message-save-drafts) - (define-key message-mode-map "\C-xk" 'message-mimic-kill-buffer)) - -(easy-menu-define - message-mode-menu message-mode-map "Message Menu." - `("Message" - ["Sort Headers" message-sort-headers t] - ["Yank Original" message-yank-original t] - ["Fill Yanked Message" message-fill-yanked-message t] - ["Insert Signature" message-insert-signature t] - ["Caesar (rot13) Message" message-caesar-buffer-body t] - ["Caesar (rot13) Region" message-caesar-region (mark t)] - ["Elide Region" message-elide-region (mark t)] - ["Delete Outside Region" message-delete-not-region (mark t)] - ["Kill To Signature" message-kill-to-signature t] - ["Newline and Reformat" message-newline-and-reformat t] - ["Rename buffer" message-rename-buffer t] - ["Spellcheck" ispell-message - ,@(if (featurep 'xemacs) '(t) - '(:help "Spellcheck this message"))] - ["Attach file as MIME" mime-edit-insert-file - ,@(if (featurep 'xemacs) '(t) - '(:help "Attach a file at point"))] - "----" - ["Send Message" message-send-and-exit - ,@(if (featurep 'xemacs) '(t) - '(:help "Send this message"))] - ["Postpone Message" message-dont-send - ,@(if (featurep 'xemacs) '(t) - '(:help "File this draft message and exit"))] - ["Kill Message" message-kill-buffer - ,@(if (featurep 'xemacs) '(t) - '(:help "Delete this message without sending"))])) - -(easy-menu-define - message-mode-field-menu message-mode-map "" - '("Field" - ["Fetch To" message-insert-to t] - ["Fetch Newsgroups" message-insert-newsgroups t] - "----" - ["To" message-goto-to t] - ["Subject" message-goto-subject t] - ["Cc" message-goto-cc t] - ["Reply-To" message-goto-reply-to t] - ["Mail-Reply-To" message-goto-mail-reply-to t] - ["Mail-Followup-To" message-goto-mail-followup-to t] - ["Mail-Copies-To" message-goto-mail-copies-to t] - ["Summary" message-goto-summary t] - ["Keywords" message-goto-keywords t] - ["Newsgroups" message-goto-newsgroups t] - ["Followup-To" message-goto-followup-to t] - ["Distribution" message-goto-distribution t] - ["Body" message-goto-body t] - ["Signature" message-goto-signature t])) - -(defvar message-tool-bar-map nil) - -(eval-when-compile - (defvar facemenu-add-face-function) - (defvar facemenu-remove-face-function)) - -;;;###autoload -(define-derived-mode message-mode text-mode "Message" - "Major mode for editing mail and news to be sent. -Like Text Mode but with these additional commands:\\ -C-c C-s `message-send' (send the message) C-c C-c `message-send-and-exit' -C-c C-d Postpone sending the message C-c C-k Kill the message -C-c C-f move to a header field (and create it if there isn't): - C-c C-f C-t move to To C-c C-f C-s move to Subject - C-c C-f C-c move to Cc C-c C-f C-b move to Bcc - C-c C-f C-w move to Fcc C-c C-f C-r move to Reply-To - C-c C-f C-u move to Summary C-c C-f C-n move to Newsgroups - C-c C-f C-k move to Keywords C-c C-f C-d move to Distribution - C-c C-f C-m move to Mail-Followup-To - C-c C-f C-f move to Followup-To - C-c C-f c move to Mail-Copies-To -C-c C-t `message-insert-to' (add a To header to a news followup) -C-c C-n `message-insert-newsgroups' (add a Newsgroup header to a news reply) -C-c C-b `message-goto-body' (move to beginning of message text). -C-c C-i `message-goto-signature' (move to the beginning of the signature). -C-c C-w `message-insert-signature' (insert `message-signature-file' file). -C-c C-y `message-yank-original' (insert current message, if any). -C-c C-q `message-fill-yanked-message' (fill what was yanked). -C-c C-e `message-elide-region' (elide the text between point and mark). -C-c C-v `message-delete-not-region' (remove the text outside the region). -C-c C-z `message-kill-to-signature' (kill the text up to the signature). -C-c C-r `message-caesar-buffer-body' (rot13 the message body). -M-RET `message-newline-and-reformat' (break the line and reformat)." - (set (make-local-variable 'message-reply-buffer) nil) - (make-local-variable 'message-send-actions) - (make-local-variable 'message-exit-actions) - (make-local-variable 'message-kill-actions) - (make-local-variable 'message-postpone-actions) - (make-local-variable 'message-draft-article) - (setq buffer-offer-save t) - (set (make-local-variable 'facemenu-add-face-function) - (lambda (face end) - (let ((face-fun (cdr (assq face message-face-alist)))) - (if face-fun - (funcall face-fun (point) end) - (error "Face %s not configured for %s mode" face mode-name))) - "")) - (set (make-local-variable 'facemenu-remove-face-function) t) - (set (make-local-variable 'message-reply-headers) nil) - (make-local-variable 'message-user-agent) - (make-local-variable 'message-post-method) - (set (make-local-variable 'message-sent-message-via) nil) - (set (make-local-variable 'message-checksum) nil) - (make-local-variable 'message-parameter-alist) - (setq message-parameter-alist - (copy-sequence message-startup-parameter-alist)) - (message-setup-fill-variables) - ;; Allow using comment commands to add/remove quoting. - (set (make-local-variable 'comment-start) message-yank-prefix) - (if (featurep 'xemacs) - (message-setup-toolbar) - (set (make-local-variable 'font-lock-defaults) - '(message-font-lock-keywords t)) - (if (boundp 'tool-bar-map) - (set (make-local-variable 'tool-bar-map) (message-tool-bar-map)))) - (easy-menu-add message-mode-menu message-mode-map) - (easy-menu-add message-mode-field-menu message-mode-map) - ;; Allow mail alias things. - (when (eq message-mail-alias-type 'abbrev) - (if (fboundp 'mail-abbrevs-setup) - (mail-abbrevs-setup) - (mail-aliases-setup))) - (message-set-auto-save-file-name) - (set (make-local-variable 'indent-tabs-mode) nil)) ;No tabs for indentation. - -(defun message-setup-fill-variables () - "Setup message fill variables." - (set (make-local-variable 'fill-paragraph-function) - 'message-fill-paragraph) - (make-local-variable 'paragraph-separate) - (make-local-variable 'paragraph-start) - (make-local-variable 'adaptive-fill-regexp) - (unless (boundp 'adaptive-fill-first-line-regexp) - (setq adaptive-fill-first-line-regexp nil)) - (make-local-variable 'adaptive-fill-first-line-regexp) - (make-local-variable 'auto-fill-inhibit-regexp) - (let ((quote-prefix-regexp - ;; User should change message-cite-prefix-regexp if - ;; message-yank-prefix is set to an abnormal value. - (concat "\\(" message-cite-prefix-regexp "\\)[ \t]*"))) - (setq paragraph-start - (concat - (regexp-quote mail-header-separator) "$\\|" - "[ \t]*$\\|" ; blank lines - "-- $\\|" ; signature delimiter - "---+$\\|" ; delimiters for forwarded messages - page-delimiter "$\\|" ; spoiler warnings - ".*wrote:$\\|" ; attribution lines - quote-prefix-regexp "$")) ; empty lines in quoted text - (setq paragraph-separate paragraph-start) - (setq adaptive-fill-regexp - (concat quote-prefix-regexp "\\|" adaptive-fill-regexp)) - (setq adaptive-fill-first-line-regexp - (concat quote-prefix-regexp "\\|" - adaptive-fill-first-line-regexp)) - (setq auto-fill-inhibit-regexp "^[A-Z][^: \n\t]+:"))) - - - -;;; -;;; Message mode commands -;;; - -;;; Movement commands - -(defun message-goto-to () - "Move point to the To header." - (interactive) - (message-position-on-field "To")) - -(defun message-goto-subject () - "Move point to the Subject header." - (interactive) - (message-position-on-field "Subject")) - -(defun message-goto-cc () - "Move point to the Cc header." - (interactive) - (message-position-on-field "Cc" "To")) - -(defun message-goto-bcc () - "Move point to the Bcc header." - (interactive) - (message-position-on-field "Bcc" "Cc" "To")) - -(defun message-goto-fcc () - "Move point to the Fcc header." - (interactive) - (message-position-on-field "Fcc" "To" "Newsgroups")) - -(defun message-goto-reply-to () - "Move point to the Reply-To header." - (interactive) - (message-position-on-field "Reply-To" "Subject")) - -(defun message-goto-mail-reply-to () - "Move point to the Mail-Reply-To header." - (interactive) - (message-position-on-field "Mail-Reply-To" "Subject")) - -(defun message-goto-mail-followup-to () - "Move point to the Mail-Followup-To header. If the header is newly created -and To field contains only one address, the address is inserted in default." - (interactive) - (unless (message-position-on-field "Mail-Followup-To" "Subject") - (let ((start (point)) - addresses) - (save-restriction - (message-narrow-to-headers) - (setq addresses (split-string (mail-strip-quoted-names - (or (std11-fetch-field "to") "")) - "[ \f\t\n\r\v,]+")) - (when (eq 1 (length addresses)) - (goto-char start) - (insert (car addresses)) - (goto-char start)))))) - -(defun message-goto-mail-copies-to () - "Move point to the Mail-Copies-To header. If the header is newly created, -a string \"never\" is inserted in default." - (interactive) - (unless (message-position-on-field "Mail-Copies-To" "Subject") - (insert "never") - (backward-char 5))) - -(defun message-goto-newsgroups () - "Move point to the Newsgroups header." - (interactive) - (message-position-on-field "Newsgroups")) - -(defun message-goto-distribution () - "Move point to the Distribution header." - (interactive) - (message-position-on-field "Distribution")) - -(defun message-goto-followup-to () - "Move point to the Followup-To header." - (interactive) - (message-position-on-field "Followup-To" "Newsgroups")) - -(defun message-goto-keywords () - "Move point to the Keywords header." - (interactive) - (message-position-on-field "Keywords" "Subject")) - -(defun message-goto-summary () - "Move point to the Summary header." - (interactive) - (message-position-on-field "Summary" "Subject")) - -(defun message-goto-body (&optional interactivep) - "Move point to the beginning of the message body." - (interactive (list t)) - (when (and interactivep - (looking-at "[ \t]*\n")) - (expand-abbrev)) - (goto-char (point-min)) - (or (search-forward (concat "\n" mail-header-separator "\n") nil t) - (search-forward-regexp "[^:]+:\\([^\n]\\|\n[ \t]\\)+\n\n" nil t))) - -(defun message-goto-eoh () - "Move point to the end of the headers." - (interactive) - (message-goto-body) - (forward-line -1)) - -(defun message-goto-signature () - "Move point to the beginning of the message signature. -If there is no signature in the article, go to the end and -return nil." - (interactive) - (goto-char (point-min)) - (if (re-search-forward message-signature-separator nil t) - (forward-line 1) - (goto-char (point-max)) - nil)) - - - -(defun message-insert-to (&optional force) - "Insert a To header that points to the author of the article being replied to. -If the original author requested not to be sent mail, the function signals -an error. -With the prefix argument FORCE, insert the header anyway." - (interactive "P") - (let ((co (message-fetch-reply-field "mail-copies-to"))) - (when (and (null force) - co - (or (equal (downcase co) "never") - (equal (downcase co) "nobody"))) - (error "The user has requested not to have copies sent via mail"))) - (when (and (message-position-on-field "To") - (mail-fetch-field "to") - (not (string-match "\\` *\\'" (mail-fetch-field "to")))) - (insert ", ")) - (insert (or (message-fetch-reply-field "mail-reply-to") - (message-fetch-reply-field "reply-to") - (message-fetch-reply-field "from") ""))) - -(defun message-widen-reply () - "Widen the reply to include maximum recipients." - (interactive) - (let ((follow-to - (and message-reply-buffer - (buffer-name message-reply-buffer) - (save-excursion - (set-buffer message-reply-buffer) - (message-get-reply-headers t))))) - (save-excursion - (save-restriction - (message-narrow-to-headers) - (dolist (elem follow-to) - (message-remove-header (symbol-name (car elem))) - (goto-char (point-min)) - (insert (symbol-name (car elem)) ": " - (cdr elem) "\n")))))) - -(defun message-insert-newsgroups () - "Insert the Newsgroups header from the article being replied to." - (interactive) - (when (and (message-position-on-field "Newsgroups") - (mail-fetch-field "newsgroups") - (not (string-match "\\` *\\'" (mail-fetch-field "newsgroups")))) - (insert ",")) - (insert (or (message-fetch-reply-field "newsgroups") ""))) - - - -;;; Various commands - -(defun message-delete-not-region (beg end) - "Delete everything in the body of the current message outside of the region." - (interactive "r") - (let (citeprefix) - (save-excursion - (goto-char beg) - ;; snarf citation prefix, if appropriate - (unless (eq (point) (progn (beginning-of-line) (point))) - (when (looking-at message-cite-prefix-regexp) - (setq citeprefix (match-string 0)))) - (goto-char end) - (delete-region (point) (if (not (message-goto-signature)) - (point) - (forward-line -2) - (point))) - (insert "\n") - (goto-char beg) - (delete-region beg (progn (message-goto-body) - (forward-line 2) - (point))) - (when citeprefix - (insert citeprefix)))) - (when (message-goto-signature) - (forward-line -2))) - -(defun message-kill-to-signature () - "Deletes all text up to the signature." - (interactive) - (let ((point (point))) - (message-goto-signature) - (unless (eobp) - (forward-line -2)) - (kill-region point (point)) - (unless (bolp) - (insert "\n")))) - -(defun message-newline-and-reformat (&optional arg not-break) - "Insert four newlines, and then reformat if inside quoted text. -Prefix arg means justify as well." - (interactive (list (if current-prefix-arg 'full))) - (let (quoted point beg end leading-space bolp) - (setq point (point)) - (beginning-of-line) - (setq beg (point)) - (setq bolp (= beg point)) - ;; Find first line of the paragraph. - (if not-break - (while (and (not (eobp)) - (not (looking-at message-cite-prefix-regexp)) - (looking-at paragraph-start)) - (forward-line 1))) - ;; Find the prefix - (when (looking-at message-cite-prefix-regexp) - (setq quoted (match-string 0)) - (goto-char (match-end 0)) - (looking-at "[ \t]*") - (setq leading-space (match-string 0))) - (if (and quoted - (not not-break) - (not bolp) - (< (- point beg) (length quoted))) - ;; break inside the cite prefix. - (setq quoted nil - end nil)) - (if quoted - (progn - (forward-line 1) - (while (and (not (eobp)) - (not (looking-at paragraph-separate)) - (looking-at message-cite-prefix-regexp) - (equal quoted (match-string 0))) - (goto-char (match-end 0)) - (looking-at "[ \t]*") - (if (> (length leading-space) (length (match-string 0))) - (setq leading-space (match-string 0))) - (forward-line 1)) - (setq end (point)) - (goto-char beg) - (while (and (if (bobp) nil (forward-line -1) t) - (not (looking-at paragraph-start)) - (looking-at message-cite-prefix-regexp) - (equal quoted (match-string 0))) - (setq beg (point)) - (goto-char (match-end 0)) - (looking-at "[ \t]*") - (if (> (length leading-space) (length (match-string 0))) - (setq leading-space (match-string 0))))) - (while (and (not (eobp)) - (not (looking-at paragraph-separate)) - (not (looking-at message-cite-prefix-regexp))) - (forward-line 1)) - (setq end (point)) - (goto-char beg) - (while (and (if (bobp) nil (forward-line -1) t) - (not (looking-at paragraph-start)) - (not (looking-at message-cite-prefix-regexp))) - (setq beg (point)))) - (goto-char point) - (save-restriction - (narrow-to-region beg end) - (if not-break - (setq point nil) - (if bolp - (insert "\n") - (insert "\n\n")) - (setq point (point)) - (insert "\n\n") - (delete-region (point) (re-search-forward "[ \t]*")) - (when (and quoted (not bolp)) - (insert quoted leading-space))) - (if quoted - (let* ((adaptive-fill-regexp - (regexp-quote (concat quoted leading-space))) - (adaptive-fill-first-line-regexp - adaptive-fill-regexp )) - (fill-paragraph arg)) - (fill-paragraph arg)) - (if point (goto-char point))))) - -(defun message-fill-paragraph (&optional arg) - "Like `fill-paragraph'." - (interactive (list (if current-prefix-arg 'full))) - (if (and (boundp 'filladapt-mode) filladapt-mode) - nil - (message-newline-and-reformat arg t) - t)) - -(defun message-insert-signature (&optional force) - "Insert a signature. See documentation for variable `message-signature'." - (interactive (list 0)) - (let* ((signature - (cond - ((and (null message-signature) - (eq force 0)) - (save-excursion - (goto-char (point-max)) - (not (re-search-backward message-signature-separator nil t)))) - ((and (null message-signature) - force) - t) - ((message-functionp message-signature) - (funcall message-signature)) - ((listp message-signature) - (eval message-signature)) - (t message-signature))) - (signature - (cond ((stringp signature) - signature) - ((and (eq t signature) - message-signature-file - (file-exists-p message-signature-file)) - signature)))) - (when signature - (goto-char (point-max)) - ;; Insert the signature. - (unless (bolp) - (insert "\n")) - (insert "\n" message-signature-separator-for-insertion) - (unless (bolp) - (insert "\n")) - (if (eq signature t) - (insert-file-contents message-signature-file) - (insert signature)) - (goto-char (point-max)) - (or (bolp) (insert "\n"))))) - -(defun message-elide-region (b e) - "Elide the text in the region. -An ellipsis (from `message-elide-ellipsis') will be inserted where the -text was killed." - (interactive "r") - (kill-region b e) - (insert message-elide-ellipsis)) - -(defvar message-caesar-translation-table nil) - -(defun message-caesar-region (b e &optional n) - "Caesar rotate region B to E by N, default 13, for decrypting netnews." - (interactive - (list - (min (point) (or (mark t) (point))) - (max (point) (or (mark t) (point))) - (when current-prefix-arg - (prefix-numeric-value current-prefix-arg)))) - - (setq n (if (numberp n) (mod n 26) 13)) ;canonize N - (unless (or (zerop n) ; no action needed for a rot of 0 - (= b e)) ; no region to rotate - ;; We build the table, if necessary. - (when (or (not message-caesar-translation-table) - (/= (aref message-caesar-translation-table ?a) (+ ?a n))) - (setq message-caesar-translation-table - (message-make-caesar-translation-table n))) - (translate-region b e message-caesar-translation-table))) - -(defun message-make-caesar-translation-table (n) - "Create a rot table with offset N." - (let ((i -1) - (table (make-string 256 0))) - (while (< (incf i) 256) - (aset table i i)) - (concat - (substring table 0 ?A) - (substring table (+ ?A n) (+ ?A n (- 26 n))) - (substring table ?A (+ ?A n)) - (substring table (+ ?A 26) ?a) - (substring table (+ ?a n) (+ ?a n (- 26 n))) - (substring table ?a (+ ?a n)) - (substring table (+ ?a 26) 255)))) - -(defun message-caesar-buffer-body (&optional rotnum) - "Caesar rotate all letters in the current buffer by 13 places. -Used to encode/decode possibly offensive messages (commonly in rec.humor). -With prefix arg, specifies the number of places to rotate each letter forward. -Mail and USENET news headers are not rotated." - (interactive (if current-prefix-arg - (list (prefix-numeric-value current-prefix-arg)) - (list nil))) - (save-excursion - (save-restriction - (when (message-goto-body) - (narrow-to-region (point) (point-max))) - (message-caesar-region (point-min) (point-max) rotnum)))) - -(defun message-pipe-buffer-body (program) - "Pipe the message body in the current buffer through PROGRAM." - (save-excursion - (save-restriction - (when (message-goto-body) - (narrow-to-region (point) (point-max))) - (shell-command-on-region - (point-min) (point-max) program nil t)))) - -(defun message-rename-buffer (&optional enter-string) - "Rename the *message* buffer to \"*message* RECIPIENT\". -If the function is run with a prefix, it will ask for a new buffer -name, rather than giving an automatic name." - (interactive "Pbuffer name: ") - (save-excursion - (save-restriction - (goto-char (point-min)) - (narrow-to-region (point) - (search-forward mail-header-separator nil 'end)) - (let* ((mail-to (or - (if (message-news-p) (message-fetch-field "Newsgroups") - (message-fetch-field "To")) - "")) - (mail-trimmed-to - (if (string-match "," mail-to) - (concat (substring mail-to 0 (match-beginning 0)) ", ...") - mail-to)) - (name-default (concat "*message* " mail-trimmed-to)) - (name (if enter-string - (read-string "New buffer name: " name-default) - name-default))) - (rename-buffer name t))))) - -(defun message-fill-yanked-message (&optional justifyp) - "Fill the paragraphs of a message yanked into this one. -Numeric argument means justify as well." - (interactive "P") - (save-excursion - (goto-char (point-min)) - (search-forward (concat "\n" mail-header-separator "\n") nil t) - (let ((fill-prefix message-yank-prefix)) - (fill-individual-paragraphs (point) (point-max) justifyp)))) - -(defun message-indent-citation () - "Modify text just inserted from a message to be cited. -The inserted text should be the region. -When this function returns, the region is again around the modified text. - -Normally, indent each nonblank line `message-indentation-spaces' spaces. -However, if `message-yank-prefix' is non-nil, insert that prefix on each line." - (let ((start (point))) - ;; Remove unwanted headers. - (when message-ignored-cited-headers - (let (all-removed) - (save-restriction - (narrow-to-region - (goto-char start) - (if (search-forward "\n\n" nil t) - (1- (point)) - (point))) - (message-remove-header message-ignored-cited-headers t) - (when (= (point-min) (point-max)) - (setq all-removed t)) - (goto-char (point-max))) - (if all-removed - (goto-char start) - (forward-line 1)))) - ;; Delete blank lines at the start of the buffer. - (while (and (point-min) - (eolp) - (not (eobp))) - (message-delete-line)) - ;; Delete blank lines at the end of the buffer. - (goto-char (point-max)) - (unless (bolp) - (insert "\n")) - (while (and (zerop (forward-line -1)) - (looking-at "$")) - (message-delete-line)) - ;; Do the indentation. - (if (null message-yank-prefix) - (indent-rigidly start (mark t) message-indentation-spaces) - (save-excursion - (goto-char start) - (let (last-line) - ;; `last-line' describes the contents of the last line - ;; encountered in the loop below. nil means "empty line", - ;; spaces "line consisting entirely of whitespace", - ;; right-angle "line starts with >", quoted "quote character - ;; at the beginning of the line", text "the remaining cases". - (while (< (point) (mark t)) - (cond - ((eolp) - (insert message-yank-cited-prefix) - (setq last-line nil)) - ((looking-at ">") - (if (memq last-line '(nil spaces right-angle quoted)) - (progn - (insert message-yank-cited-prefix) - (setq last-line 'quoted)) - (insert message-yank-prefix) - (setq last-line 'right-angle))) - ((looking-at "\\s-+$") - (insert message-yank-prefix) - (setq last-line 'spaces)) - (t - (insert message-yank-prefix) - (setq last-line 'text))) - (forward-line 1))))) - (goto-char start))) - -(defun message-list-references (refs-list &rest refs-strs) - "Add `Message-ID's which appear in REFS-STRS but not in REFS-LIST, -to REFS-LIST." - (let (refs ref id saved-id) - (when (and refs-list - (integerp message-list-references-add-position)) - (let ((pos message-list-references-add-position)) - (while (and refs-list - (> pos 0)) - (push (pop refs-list) saved-id) - (setq pos (1- pos))))) - (while refs-strs - (when (setq refs (pop refs-strs)) - (setq refs (std11-parse-msg-ids (std11-lexical-analyze refs))) - (while refs - (when (eq (car (setq ref (pop refs))) 'msg-id) - (setq id (concat "<" (mapconcat 'cdr (cdr ref) "") ">")) - (or (member id refs-list) - (member id saved-id) - (push id refs-list)))))) - (while saved-id - (push (pop saved-id) refs-list)) - refs-list)) - -(defvar gnus-article-copy) -(defun message-yank-original (&optional arg) - "Insert the message being replied to, if any. -Puts point before the text and mark after. -Normally indents each nonblank line ARG spaces (default 3). However, -if `message-yank-prefix' is non-nil, insert that prefix on each line. - -This function uses `message-cite-function' to do the actual citing. - -Just \\[universal-argument] as argument means don't indent, insert no -prefix, and don't delete any headers. - -In addition, if `message-yank-add-new-references' is non-nil and this -command is called interactively, new IDs from the yanked article will -be added to \"References\" field. -\(See also `message-yank-add-new-references'.)" - (interactive "P") - (let ((modified (buffer-modified-p)) - (buffer (message-eval-parameter message-reply-buffer)) - start end refs) - (when (and buffer - message-cite-function) - (delete-windows-on buffer t) - (insert-buffer buffer) ; mark will be set at the end of article. - (setq start (point) - end (mark t)) - - ;; Add new IDs to References field. - (when (and message-yank-add-new-references (interactive-p)) - (save-excursion - (save-restriction - (message-narrow-to-headers) - (setq refs (message-list-references - nil - (message-fetch-field "References"))) - (widen) - (narrow-to-region start end) - (std11-narrow-to-header) - (when (setq refs (message-list-references - refs - (unless (eq message-yank-add-new-references - 'message-id-only) - (or (message-fetch-field "References") - (message-fetch-field "In-Reply-To"))) - (message-fetch-field "Message-ID"))) - (widen) - (message-narrow-to-headers) - (goto-char (point-min)) - (let ((case-fold-search t)) - (if (re-search-forward "^References:\\([\t ]+.+\n\\)+" nil t) - (replace-match "") - (goto-char (point-max)))) - (mail-header-format - (list (or (assq 'References message-header-format-alist) - '(References . message-fill-references))) - (list (cons 'References - (mapconcat 'identity (nreverse refs) " ")))) - (backward-delete-char 1))))) - - (unless arg - (if (and message-suspend-font-lock-when-citing - (boundp 'font-lock-mode) - (symbol-value 'font-lock-mode)) - (unwind-protect - (progn - (sit-for 0) - (font-lock-mode 0) - (funcall message-cite-function)) - (font-lock-mode 1)) - (funcall message-cite-function))) - (message-exchange-point-and-mark) - (unless (bolp) - (insert ?\n)) - (unless modified - (setq message-checksum (message-checksum)))))) - -(defun message-yank-buffer (buffer) - "Insert BUFFER into the current buffer and quote it." - (interactive "bYank buffer: ") - (let ((message-reply-buffer buffer)) - (save-window-excursion - (message-yank-original)))) - -(defun message-buffers () - "Return a list of active message buffers." - (let (buffers) - (save-excursion - (dolist (buffer (buffer-list t)) - (set-buffer buffer) - (when (and (eq major-mode 'message-mode) - (null message-sent-message-via)) - (push (buffer-name buffer) buffers)))) - (nreverse buffers))) - -(defun message-cite-original-without-signature () - "Cite function in the standard Message manner." - (let ((start (point)) - (end (mark t)) - (functions - (when message-indent-citation-function - (if (listp message-indent-citation-function) - message-indent-citation-function - (list message-indent-citation-function)))) - (message-reply-headers (or message-reply-headers - (make-mail-header)))) - (mail-header-set-from message-reply-headers - (save-restriction - (narrow-to-region - (point) - (if (search-forward "\n\n" nil t) - (1- (point)) - (point-max))) - (or (message-fetch-field "from") - "unknown sender"))) - ;; Allow undoing. - (undo-boundary) - (goto-char end) - (when (re-search-backward message-signature-separator start t) - ;; Also peel off any blank lines before the signature. - (forward-line -1) - (while (looking-at "^[ \t]*$") - (forward-line -1)) - (forward-line 1) - (delete-region (point) end) - (unless (search-backward "\n\n" start t) - ;; Insert a blank line if it is peeled off. - (insert "\n"))) - (goto-char start) - (while functions - (funcall (pop functions))) - (when message-citation-line-function - (unless (bolp) - (insert "\n")) - (funcall message-citation-line-function)))) - -(eval-when-compile (defvar mail-citation-hook)) ;Compiler directive -(defun message-cite-original () - "Cite function in the standard Message manner." - (if (and (boundp 'mail-citation-hook) - mail-citation-hook) - (run-hooks 'mail-citation-hook) - (let ((start (point)) - (end (mark t)) - (functions - (when message-indent-citation-function - (if (listp message-indent-citation-function) - message-indent-citation-function - (list message-indent-citation-function)))) - (message-reply-headers (or message-reply-headers - (make-mail-header)))) - (mail-header-set-from message-reply-headers - (save-restriction - (narrow-to-region - (point) - (if (search-forward "\n\n" nil t) - (1- (point)) - (point-max))) - (or (message-fetch-field "from") - "unknown sender"))) - (goto-char start) - (while functions - (funcall (pop functions))) - (when message-citation-line-function - (unless (bolp) - (insert "\n")) - (funcall message-citation-line-function))))) - -(defun message-insert-citation-line () - "Insert a simple citation line." - (when message-reply-headers - (insert (mail-header-from message-reply-headers) " writes:\n\n"))) - -(defun message-position-on-field (header &rest afters) - (let ((case-fold-search t)) - (save-restriction - (narrow-to-region - (goto-char (point-min)) - (progn - (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "$")) - (match-beginning 0))) - (goto-char (point-min)) - (if (re-search-forward (concat "^" (regexp-quote header) ":") nil t) - (progn - (re-search-forward "^[^ \t]" nil 'move) - (beginning-of-line) - (skip-chars-backward "\n") - t) - (while (and afters - (not (re-search-forward - (concat "^" (regexp-quote (car afters)) ":") - nil t))) - (pop afters)) - (when afters - (re-search-forward "^[^ \t]" nil 'move) - (beginning-of-line)) - (insert header ": \n") - (forward-char -1) - nil)))) - -(defun message-remove-signature () - "Remove the signature from the text between point and mark. -The text will also be indented the normal way." - (save-excursion - (let ((start (point)) - mark) - (if (not (re-search-forward message-signature-separator (mark t) t)) - ;; No signature here, so we just indent the cited text. - (message-indent-citation) - ;; Find the last non-empty line. - (forward-line -1) - (while (looking-at "[ \t]*$") - (forward-line -1)) - (forward-line 1) - (setq mark (set-marker (make-marker) (point))) - (goto-char start) - (message-indent-citation) - ;; Enable undoing the deletion. - (undo-boundary) - (delete-region mark (mark t)) - (set-marker mark nil))))) - - - -;;; -;;; Sending messages -;;; - -;; Avoid byte-compile warning. -(defvar message-encoding-buffer nil) -(defvar message-edit-buffer nil) -(defvar message-mime-mode nil) - -(defun message-send-and-exit (&optional arg) - "Send message like `message-send', then, if no errors, exit from mail buffer." - (interactive "P") - (let ((buf (current-buffer)) - (actions message-exit-actions) - (frame (selected-frame)) - (org-frame message-original-frame)) - (when (and (message-send arg) - (buffer-name buf)) - (if message-kill-buffer-on-exit - (kill-buffer buf) - (bury-buffer buf) - (when (eq buf (current-buffer)) - (message-bury buf))) - (message-do-actions actions) - (message-delete-frame frame org-frame) - t))) - -(defun message-dont-send () - "Don't send the message you have been editing." - (interactive) - (message-save-drafts) - (let ((actions message-postpone-actions) - (frame (selected-frame)) - (org-frame message-original-frame)) - (message-bury (current-buffer)) - (message-do-actions actions) - (message-delete-frame frame org-frame))) - -(defun message-kill-buffer () - "Kill the current buffer." - (interactive) - (when (or (not (buffer-modified-p)) - (eq t message-kill-buffer-query-function) - (funcall message-kill-buffer-query-function - "The buffer modified; kill anyway? ")) - (let ((actions message-kill-actions) - (frame (selected-frame)) - (org-frame message-original-frame)) - (setq buffer-file-name nil) - (kill-buffer (current-buffer)) - (message-do-actions actions) - (message-delete-frame frame org-frame))) - (message "")) - -(defun message-mimic-kill-buffer () - "Kill the current buffer with query." - (interactive) - (unless (eq 'message-mode major-mode) - (error "%s must be invoked from a message buffer." this-command)) - (let ((command this-command) - (bufname (read-buffer (format "Kill buffer: (default %s) " - (buffer-name))))) - (if (or (not bufname) - (string-equal bufname "") - (string-equal bufname (buffer-name))) - (message-kill-buffer) - (message "%s must be invoked only for the current buffer." command)))) - -(defun message-delete-frame (frame org-frame) - "Delete frame for editing message." - (when (and (or (static-if (featurep 'xemacs) - (device-on-window-system-p) - window-system) - (>= emacs-major-version 20)) - (or (and (eq message-delete-frame-on-exit t) - (select-frame frame) - (or (eq frame org-frame) - (prog1 - (y-or-n-p "Delete this frame?") - (message "")))) - (and (eq message-delete-frame-on-exit 'ask) - (select-frame frame) - (prog1 - (y-or-n-p "Delete this frame?") - (message ""))))) - (delete-frame frame))) - -(defun message-bury (buffer) - "Bury this mail BUFFER." - (let ((newbuf (other-buffer buffer))) - (bury-buffer buffer) - (if (and (fboundp 'frame-parameters) - (cdr (assq 'dedicated (frame-parameters))) - (not (null (delq (selected-frame) (visible-frame-list))))) - (delete-frame (selected-frame)) - (switch-to-buffer newbuf)))) - -(defun message-send (&optional arg) - "Send the message in the current buffer. -If `message-interactive' is non-nil, wait for success indication or -error messages, and inform user. -Otherwise any failure is reported in a message back to the user from -the mailer. -The usage of ARG is defined by the instance that called Message. -It should typically alter the sending method in some way or other." - (interactive "P") - ;; Disabled test. - (when (or (buffer-modified-p) - (message-check-element 'unchanged) - (y-or-n-p "No changes in the buffer; really send? ")) - ;; Make it possible to undo the coming changes. - (undo-boundary) - (let ((inhibit-read-only t)) - (put-text-property (point-min) (point-max) 'read-only nil)) - (run-hooks 'message-send-hook) - (message-fix-before-sending) - (message message-sending-message) - (let ((message-encoding-buffer - (message-generate-new-buffer-clone-locals " message encoding")) - (message-edit-buffer (current-buffer)) - (message-mime-mode mime-edit-mode-flag) - (alist message-send-method-alist) - (success t) - elem sent - (message-options message-options)) - (message-options-set-recipient) - (save-excursion - (set-buffer message-encoding-buffer) - (erase-buffer) - ;; Avoid copying text props. - (let (message-invisibles) - (insert - (with-current-buffer message-edit-buffer - (setq message-invisibles (message-find-invisible-regions)) - (buffer-substring-no-properties (point-min) (point-max)))) - ;; Inherit the invisible property of texts to make MIME-Edit - ;; find the MIME part boundaries. - (dolist (region message-invisibles) - (put-text-property (car region) (cdr region) 'invisible t))) - (funcall message-encode-function) - (while (and success - (setq elem (pop alist))) - (when (funcall (cadr elem)) - (when (and (or (not (memq (car elem) - message-sent-message-via)) - (if (or (message-gnksa-enable-p 'multiple-copies) - (not (eq (car elem) 'news))) - (y-or-n-p - (format - "Already sent message via %s; resend? " - (car elem))) - (error "Denied posting -- multiple copies"))) - (setq success (funcall (caddr elem) arg))) - (setq sent t))))) - (unless (or sent (not success)) - (error "No methods specified to send by")) - (prog1 - (when (and success sent) - (message-do-fcc) - (save-excursion - (run-hooks 'message-sent-hook)) - (message "Sending...done") - ;; Mark the buffer as unmodified and delete auto-save. - (set-buffer-modified-p nil) - (delete-auto-save-file-if-necessary t) - (message-disassociate-draft) - ;; Delete other mail buffers and stuff. - (message-do-send-housekeeping) - (message-do-actions message-send-actions) - ;; Return success. - t) - (kill-buffer message-encoding-buffer))))) - -(defun message-send-via-mail (arg) - "Send the current message via mail." - (message-send-mail arg)) - -(defun message-send-via-news (arg) - "Send the current message via news." - (message-send-news arg)) - -(defmacro message-check (type &rest forms) - "Eval FORMS if TYPE is to be checked." - `(or (message-check-element ,type) - (save-excursion - ,@forms))) - -(put 'message-check 'lisp-indent-function 1) -(put 'message-check 'edebug-form-spec '(form body)) - -;; This function will be used by MIME-Edit when inserting invisible parts. -(defun message-invisible-region (start end) - (if (featurep 'xemacs) - (if (save-excursion - (goto-char start) - (eq (following-char) ?\n)) - (setq start (1+ start))) - (if (save-excursion - (goto-char (1- end)) - (eq (following-char) ?\n)) - (setq end (1- end)))) - (put-text-property start end 'invisible t) - (if (eq 'message-mode major-mode) - (put-text-property start end 'message-invisible t))) - -(eval-after-load "invisible" - '(defalias 'invisible-region 'message-invisible-region)) - -(defun message-find-invisible-regions () - "Find invisible texts with the property `message-invisible' and -return a list of points." - (let (from - (to (point-min)) - regions) - (while (setq from (text-property-any to (point-max) - 'message-invisible t)) - (setq to (or (text-property-not-all from (point-max) - 'message-invisible t) - (point-max))) - (push (cons from to) regions)) - regions)) - -(defun message-fix-before-sending () - "Do various things to make the message nice before sending it." - ;; Make sure there's a newline at the end of the message. - (widen) - (goto-char (point-max)) - (unless (bolp) - (insert "\n")) - ;; Expose all invisible text with the property `message-invisible'. - ;; We should believe that the things might be created by MIME-Edit. - (let ((message-invisibles (message-find-invisible-regions))) - (dolist (region message-invisibles) - (put-text-property (car region) (cdr region) 'invisible nil)) - ;; Expose all invisible text. - (message-check 'invisible-text - (when (text-property-any (point-min) (point-max) 'invisible t) - (put-text-property (point-min) (point-max) 'invisible nil) - (unless (yes-or-no-p - "Invisible text found and made visible; continue posting? ") - (error "Invisible text found and made visible")))) - ;; Hide again all text with the property `message-invisible'. - ;; It is needed to make MIME-Edit find the MIME part boundaries. - (dolist (region message-invisibles) - (put-text-property (car region) (cdr region) 'invisible t)))) - -(defun message-add-action (action &rest types) - "Add ACTION to be performed when doing an exit of type TYPES." - (let (var) - (while types - (set (setq var (intern (format "message-%s-actions" (pop types)))) - (nconc (symbol-value var) (list action)))))) - -(defun message-do-actions (actions) - "Perform all actions in ACTIONS." - ;; Now perform actions on successful sending. - (while actions - (ignore-errors - (cond - ;; A simple function. - ((message-functionp (car actions)) - (funcall (car actions))) - ;; Something to be evaled. - (t - (eval (car actions))))) - (pop actions))) - -(defsubst message-maybe-split-and-send-mail () - "Split a message if necessary, and send it via mail. -Returns nil if sending succeeded, returns any string if sending failed. -This sub function is for exclusive use of `message-send-mail'." - (let ((mime-edit-split-ignored-field-regexp - mime-edit-split-ignored-field-regexp) - (case-fold-search t) - failure) - (while (string-match "Message-ID" mime-edit-split-ignored-field-regexp) - (setq mime-edit-split-ignored-field-regexp - (concat (substring mime-edit-split-ignored-field-regexp - 0 (match-beginning 0)) - "Hey_MIME-Edit,_there_is_an_inviolable_Message_ID" - "_so_don't_rape_it!" - (substring mime-edit-split-ignored-field-regexp - (match-end 0))))) - (setq failure - (or - (catch 'message-sending-mail-failure - (mime-edit-maybe-split-and-send - (function - (lambda () - (interactive) - (save-restriction - (std11-narrow-to-header mail-header-separator) - (goto-char (point-min)) - (when (re-search-forward "^Message-ID:" nil t) - (delete-region (match-end 0) (std11-field-end)) - (insert " " (message-make-message-id)))) - (condition-case err - (funcall (or message-send-mail-real-function - message-send-mail-function)) - (error - (throw 'message-sending-mail-failure err)))))) - nil) - (condition-case err - (progn - (funcall (or message-send-mail-real-function - message-send-mail-function)) - nil) - (error err)))) - (when failure - (if (eq 'error (car failure)) - (cadr failure) - (prin1-to-string failure))))) - -(defun message-send-mail-partially () - "Send mail as message/partial." - ;; replace the header delimiter with a blank line - (goto-char (point-min)) - (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "\n")) - (replace-match "\n") - (run-hooks 'message-send-mail-hook) - (let ((p (goto-char (point-min))) - (tembuf (message-generate-new-buffer-clone-locals " message temp")) - (curbuf (current-buffer)) - (id (message-make-message-id)) (n 1) - plist total header required-mail-headers) - (while (not (eobp)) - (if (< (point-max) (+ p message-send-mail-partially-limit)) - (goto-char (point-max)) - (goto-char (+ p message-send-mail-partially-limit)) - (beginning-of-line) - (if (<= (point) p) (forward-line 1))) ;; In case of bad message. - (push p plist) - (setq p (point))) - (setq total (length plist)) - (push (point-max) plist) - (setq plist (nreverse plist)) - (unwind-protect - (save-excursion - (setq p (pop plist)) - (while plist - (set-buffer curbuf) - (copy-to-buffer tembuf p (car plist)) - (set-buffer tembuf) - (goto-char (point-min)) - (if header - (progn - (goto-char (point-min)) - (narrow-to-region (point) (point)) - (insert header)) - (message-goto-eoh) - (setq header (buffer-substring (point-min) (point))) - (goto-char (point-min)) - (narrow-to-region (point) (point)) - (insert header) - (message-remove-header "Mime-Version") - (message-remove-header "Content-Type") - (message-remove-header "Content-Transfer-Encoding") - (message-remove-header "Message-ID") - (message-remove-header "Lines") - (goto-char (point-max)) - (insert "Mime-Version: 1.0\n") - (setq header (buffer-substring (point-min) (point-max)))) - (goto-char (point-max)) - (insert (format "Content-Type: message/partial; id=\"%s\"; number=%d; total=%d\n" - id n total)) - (let ((mail-header-separator "")) - (when (memq 'Message-ID message-required-mail-headers) - (insert "Message-ID: " (message-make-message-id) "\n")) - (when (memq 'Lines message-required-mail-headers) - (let ((mail-header-separator "")) - (insert "Lines: " (message-make-lines) "\n"))) - (message-goto-subject) - (end-of-line) - (insert (format " (%d/%d)" n total)) - (goto-char (point-max)) - (insert "\n") - (widen) - (mm-with-unibyte-current-buffer - (funcall (or message-send-mail-real-function - message-send-mail-function)))) - (setq n (+ n 1)) - (setq p (pop plist)) - (erase-buffer))) - (kill-buffer tembuf)))) - -(defun message-send-mail (&optional arg) - (require 'mail-utils) - (let* ((tembuf (message-generate-new-buffer-clone-locals " message temp")) - (case-fold-search nil) - (news (message-news-p)) - (message-this-is-mail t) - failure) - (save-restriction - (message-narrow-to-headers) - ;; Insert some headers. - (let ((message-deletable-headers - (if news nil message-deletable-headers))) - (message-generate-headers message-required-mail-headers)) - ;; Let the user do all of the above. - (run-hooks 'message-header-hook)) - (if (not (message-check-mail-syntax)) - (progn - (message "") - nil) - (unwind-protect - (save-excursion - (set-buffer tembuf) - (erase-buffer) - (insert-buffer message-encoding-buffer) - ;; Remove some headers. - (save-restriction - (message-narrow-to-headers) -;; We Semi-gnus people have no use for it. -;; ;; We (re)generate the Lines header. -;; (when (memq 'Lines message-required-mail-headers) -;; (message-generate-headers '(Lines))) - ;; Remove some headers. - (message-remove-header message-ignored-mail-headers t)) - (goto-char (point-max)) - ;; require one newline at the end. - (or (= (preceding-char) ?\n) - (insert ?\n)) - (when - (save-restriction - (message-narrow-to-headers) - (and news - (or (message-fetch-field "cc") - (message-fetch-field "to")) - (let ((ct (mime-read-Content-Type))) - (or (not ct) - (and (eq 'text (cdr (assq 'type ct))) - (eq 'plain (cdr (assq 'subtype ct)))))))) - (message-insert-courtesy-copy)) - (setq failure (message-maybe-split-and-send-mail))) - (kill-buffer tembuf)) - (set-buffer message-edit-buffer) - (if failure - (progn - (message "Couldn't send message via mail: %s" failure) - nil) - (push 'mail message-sent-message-via))))) - -(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") - 0)) - resend-to-addresses delimline) - (let ((case-fold-search t)) - (save-restriction - (message-narrow-to-headers) - (setq resend-to-addresses (message-fetch-field "resent-to"))) - ;; Change header-delimiter to be what sendmail expects. - (goto-char (point-min)) - (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "\n")) - (replace-match "\n") - (backward-char 1) - (setq delimline (point-marker)) - (run-hooks 'message-send-mail-hook) - ;; Insert an extra newline if we need it to work around - ;; Sun's bug that swallows newlines. - (goto-char (1+ delimline)) - (when (eval message-mailer-swallows-blank-line) - (newline)) - (when message-interactive - (save-excursion - (set-buffer errbuf) - (erase-buffer)))) - (let ((default-directory "/")) - (as-binary-process - (apply 'call-process-region - (append (list (point-min) (point-max) - (if (boundp 'sendmail-program) - sendmail-program - "/usr/lib/sendmail") - nil errbuf nil "-oi") - ;; Always specify who from, - ;; since some systems have broken sendmails. - ;; But some systems are more broken with -f, so - ;; we'll let users override this. - (if (null message-sendmail-f-is-evil) - (list "-f" (message-make-address))) - ;; These mean "report errors by mail" - ;; and "deliver in background". - (if (null message-interactive) '("-oem" "-odb")) - ;; Get the addresses from the message - ;; unless this is a resend. - ;; We must not do that for a resend - ;; because we would find the original addresses. - ;; For a resend, include the specific addresses. - (if resend-to-addresses - (list resend-to-addresses) - '("-t")))))) - (when message-interactive - (save-excursion - (set-buffer errbuf) - (goto-char (point-min)) - (while (re-search-forward "\n\n* *" nil t) - (replace-match "; ")) - (if (not (zerop (buffer-size))) - (error "Sending...failed to %s" - (buffer-substring (point-min) (point-max))))) - (when (bufferp errbuf) - (kill-buffer errbuf))))) - -(defun message-send-mail-with-qmail () - "Pass the prepared message buffer to qmail-inject. -Refer to the documentation for the variable `message-send-mail-function' -to find out how to use this." - ;; replace the header delimiter with a blank line - (goto-char (point-min)) - (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "\n")) - (replace-match "\n") - (backward-char 1) - (run-hooks 'message-send-mail-hook) - ;; send the message - (case - (as-binary-process - (apply - 'call-process-region 1 (point-max) message-qmail-inject-program - nil nil nil - ;; qmail-inject's default behaviour is to look for addresses on the - ;; command line; if there're none, it scans the headers. - ;; yes, it does The Right Thing w.r.t. Resent-To and it's kin. - ;; - ;; in general, ALL of qmail-inject's defaults are perfect for simply - ;; reading a formatted (i. e., at least a To: or Resent-To header) - ;; message from stdin. - ;; - ;; qmail also has the advantage of not having been raped by - ;; various vendors, so we don't have to allow for that, either -- - ;; compare this with message-send-mail-with-sendmail and weep - ;; for sendmail's lost innocence. - ;; - ;; all this is way cool coz it lets us keep the arguments entirely - ;; free for -inject-arguments -- a big win for the user and for us - ;; since we don't have to play that double-guessing game and the user - ;; gets full control (no gestapo'ish -f's, for instance). --sj - message-qmail-inject-args)) - ;; qmail-inject doesn't say anything on it's stdout/stderr, - ;; we have to look at the retval instead - (0 nil) - (100 (error "qmail-inject reported permanent failure")) - (111 (error "qmail-inject reported transient failure")) - ;; should never happen - (t (error "qmail-inject reported unknown failure")))) - -(defun message-send-mail-with-mh () - "Send the prepared message buffer with mh." - (let ((mh-previous-window-config nil) - (name (mh-new-draft-name))) - (setq buffer-file-name name) - ;; MH wants to generate these headers itself. - (when message-mh-deletable-headers - (let ((headers message-mh-deletable-headers)) - (while headers - (goto-char (point-min)) - (and (re-search-forward - (concat "^" (symbol-name (car headers)) ": *") nil t) - (message-delete-line)) - (pop headers)))) - (run-hooks 'message-send-mail-hook) - ;; Pass it on to mh. - (mh-send-letter))) - -(defun message-send-mail-with-smtp () - "Send off the prepared buffer with SMTP." - (require 'smtp) ; XXX - (let ((case-fold-search t) - recipients) - (save-restriction - (message-narrow-to-headers) - (setq recipients - ;; XXX: Should be replaced by better one. - (smtp-deduce-address-list (current-buffer) - (point-min) (point-max))) - ;; Remove BCC lines. - (message-remove-header "bcc")) - ;; replace the header delimiter with a blank line. - (goto-char (point-min)) - (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "\n")) - (replace-match "\n") - (backward-char 1) - (run-hooks 'message-send-mail-hook) - (if recipients - (static-if (fboundp 'smtp-send-buffer) - (smtp-send-buffer user-mail-address recipients - (current-buffer)) - (let ((result (smtp-via-smtp user-mail-address recipients - (current-buffer)))) - (unless (eq result t) - (error "Sending failed; %s" result)))) - (error "Sending failed; no recipients")))) - -(defsubst message-maybe-split-and-send-news (method) - "Split a message if necessary, and send it via news. -Returns nil if sending succeeded, returns t if sending failed. -This sub function is for exclusive use of `message-send-news'." - (let ((mime-edit-split-ignored-field-regexp - mime-edit-split-ignored-field-regexp) - (case-fold-search t)) - (while (string-match "Message-ID" mime-edit-split-ignored-field-regexp) - (setq mime-edit-split-ignored-field-regexp - (concat (substring mime-edit-split-ignored-field-regexp - 0 (match-beginning 0)) - "Hey_MIME-Edit,_there_is_an_inviolable_Message_ID" - "_so_don't_rape_it!" - (substring mime-edit-split-ignored-field-regexp - (match-end 0))))) - (or - (catch 'message-sending-news-failure - (mime-edit-maybe-split-and-send - (function - (lambda () - (interactive) - (save-restriction - (std11-narrow-to-header mail-header-separator) - (goto-char (point-min)) - (when (re-search-forward "^Message-ID:" nil t) - (delete-region (match-end 0) (std11-field-end)) - (insert " " (message-make-message-id)))) - (unless (funcall message-send-news-function method) - (throw 'message-sending-news-failure t))))) - nil) - (not (funcall message-send-news-function method))))) - -(defun message-send-news (&optional arg) - (let* ((tembuf (message-generate-new-buffer-clone-locals " *message temp*")) - (case-fold-search nil) - (method (if (message-functionp message-post-method) - (funcall message-post-method arg) - message-post-method)) - (group-name-charset (gnus-group-name-charset method "")) - (message-syntax-checks - (if arg - (cons '(existing-newsgroups . disabled) - message-syntax-checks) - message-syntax-checks)) - (message-this-is-news t) - result) - (save-restriction - (message-narrow-to-headers) - ;; Insert some headers. - (message-generate-headers message-required-news-headers) - ;; Let the user do all of the above. - (run-hooks 'message-header-hook)) - (when group-name-charset - (setq message-syntax-checks - (cons '(valid-newsgroups . disabled) - message-syntax-checks))) - (message-cleanup-headers) - (if (not (let ((message-post-method method)) - (message-check-news-syntax))) - nil - (unwind-protect - (save-excursion - (set-buffer tembuf) - (buffer-disable-undo) - (erase-buffer) - (insert-buffer message-encoding-buffer) - ;; Remove some headers. - (save-restriction - (message-narrow-to-headers) -;; We Semi-gnus people have no use for it. -;; ;; We (re)generate the Lines header. -;; (when (memq 'Lines message-required-mail-headers) -;; (message-generate-headers '(Lines))) - ;; Remove some headers. - (message-remove-header message-ignored-news-headers t)) - (goto-char (point-max)) - ;; require one newline at the end. - (or (= (preceding-char) ?\n) - (insert ?\n)) - (setq result (message-maybe-split-and-send-news method))) - (kill-buffer tembuf)) - (set-buffer message-edit-buffer) - (if result - (progn - (message "Couldn't send message via news: %s" - (nnheader-get-report (car method))) - nil) - (push 'news message-sent-message-via))))) - -;; 1997-09-29 by MORIOKA Tomohiko -(defun message-send-news-with-gnus (method) - (let ((case-fold-search t)) - ;; Remove the delimiter. - (goto-char (point-min)) - (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "\n")) - (replace-match "\n") - (backward-char 1) - (run-hooks 'message-send-news-hook) - (gnus-open-server method) - (message "Sending news with %s..." (gnus-server-string method)) - (gnus-request-post method) - )) - -;;; -;;; Header generation & syntax checking. -;;; - -(defun message-check-element (type) - "Return non-nil if this TYPE is not to be checked." - (if (eq message-syntax-checks 'dont-check-for-anything-just-trust-me) - t - (let ((able (assq type message-syntax-checks))) - (and (consp able) - (eq (cdr able) 'disabled))))) - -(defun message-check-news-syntax () - "Check the syntax of the message." - (save-excursion - (save-restriction - (widen) - (and - ;; We narrow to the headers and check them first. - (save-excursion - (save-restriction - (message-narrow-to-headers) - (message-check-news-header-syntax))) - ;; Check the body. - (save-excursion - (set-buffer message-edit-buffer) - (message-check-news-body-syntax)))))) - -(defun message-check-news-header-syntax () - (and - ;; Check Newsgroups header. - (message-check 'newsgroups - (let ((group (message-fetch-field "newsgroups"))) - (or - (and group - (not (string-match "\\`[ \t]*\\'" group))) - (ignore - (message - "The newsgroups field is empty or missing. Posting is denied."))))) - ;; Check the Subject header. - (message-check 'subject - (let* ((case-fold-search t) - (subject (message-fetch-field "subject"))) - (or - (and subject - (not (string-match "\\`[ \t]*\\'" subject))) - (ignore - (message - "The subject field is empty or missing. Posting is denied."))))) - ;; Check for commands in Subject. - (message-check 'subject-cmsg - (if (string-match "^cmsg " (message-fetch-field "subject")) - (y-or-n-p - "The control code \"cmsg\" is in the subject. Really post? ") - t)) - ;; Check for multiple identical headers. - (message-check 'multiple-headers - (let (found) - (while (and (not found) - (re-search-forward "^[^ \t:]+: " nil t)) - (save-excursion - (or (re-search-forward - (concat "^" - (regexp-quote - (setq found - (buffer-substring - (match-beginning 0) (- (match-end 0) 2)))) - ":") - nil t) - (setq found nil)))) - (if found - (y-or-n-p (format "Multiple %s headers. Really post? " found)) - t))) - ;; Check for Version and Sendsys. - (message-check 'sendsys - (if (re-search-forward "^Sendsys:\\|^Version:" nil t) - (y-or-n-p - (format "The article contains a %s command. Really post? " - (buffer-substring (match-beginning 0) - (1- (match-end 0))))) - t)) - ;; See whether we can shorten Followup-To. - (message-check 'shorten-followup-to - (let ((newsgroups (message-fetch-field "newsgroups")) - (followup-to (message-fetch-field "followup-to")) - to) - (when (and newsgroups - (string-match "," newsgroups) - (not followup-to) - (not - (zerop - (length - (setq to (completing-read - "Followups to: (default all groups) " - (mapcar (lambda (g) (list g)) - (cons "poster" - (message-tokenize-header - newsgroups))))))))) - (goto-char (point-min)) - (insert "Followup-To: " to "\n")) - t)) - ;; Check "Shoot me". - (message-check 'shoot - (if (re-search-forward - "Message-ID.*.i-did-not-set--mail-host-address--so-shoot-me" nil t) - (y-or-n-p "You appear to have a misconfigured system. Really post? ") - t)) - ;; Check for Approved. - (message-check 'approved - (if (re-search-forward "^Approved:" nil t) - (y-or-n-p "The article contains an Approved header. Really post? ") - t)) - ;; Check the Message-ID header. - (message-check 'message-id - (let* ((case-fold-search t) - (message-id (message-fetch-field "message-id" t))) - (or (not message-id) - ;; Is there an @ in the ID? - (and (string-match "@" message-id) - ;; Is there a dot in the ID? - (string-match "@[^.]*\\." message-id) - ;; Does the ID end with a dot? - (not (string-match "\\.>" message-id))) - (y-or-n-p - (format "The Message-ID looks strange: \"%s\". Really post? " - message-id))))) - ;; Check the Newsgroups & Followup-To headers. - (message-check 'existing-newsgroups - (let* ((case-fold-search t) - (newsgroups (message-fetch-field "newsgroups")) - (followup-to (message-fetch-field "followup-to")) - (groups (message-tokenize-header - (if followup-to - (concat newsgroups "," followup-to) - newsgroups))) - (known-groups - (mapcar (lambda (n) (gnus-group-real-name n)) - (gnus-groups-from-server - (if (message-functionp message-post-method) - (funcall message-post-method) - message-post-method)))) - errors) - (while groups - (unless (or (equal (car groups) "poster") - (member (car groups) known-groups)) - (push (car groups) errors)) - (pop groups)) - (cond - ;; Gnus is not running. - ((or (not (and (boundp 'gnus-active-hashtb) - gnus-active-hashtb)) - (not (boundp 'gnus-read-active-file))) - t) - ;; We don't have all the group names. - ((and (or (not gnus-read-active-file) - (eq gnus-read-active-file 'some)) - errors) - (y-or-n-p - (format - "Really post to %s possibly unknown group%s: %s? " - (if (= (length errors) 1) "this" "these") - (if (= (length errors) 1) "" "s") - (mapconcat 'identity errors ", ")))) - ;; There were no errors. - ((not errors) - t) - ;; There are unknown groups. - (t - (y-or-n-p - (format - "Really post to %s unknown group%s: %s? " - (if (= (length errors) 1) "this" "these") - (if (= (length errors) 1) "" "s") - (mapconcat 'identity errors ", "))))))) - ;; Check the Newsgroups & Followup-To headers for syntax errors. - (message-check 'valid-newsgroups - (let ((case-fold-search t) - (headers '("Newsgroups" "Followup-To")) - header error) - (while (and headers (not error)) - (when (setq header (mail-fetch-field (car headers))) - (if (or - (not - (string-match - "\\`\\([-+_&.a-zA-Z0-9]+\\)?\\(,[-+_&.a-zA-Z0-9]+\\)*\\'" - header)) - (memq - nil (mapcar - (lambda (g) - (not (string-match "\\.\\'\\|\\.\\." g))) - (message-tokenize-header header ",")))) - (setq error t))) - (unless error - (pop headers))) - (if (not error) - t - (y-or-n-p - (format "The %s header looks odd: \"%s\". Really post? " - (car headers) header))))) - (message-check 'repeated-newsgroups - (let ((case-fold-search t) - (headers '("Newsgroups" "Followup-To")) - header error groups group) - (while (and headers - (not error)) - (when (setq header (mail-fetch-field (pop headers))) - (setq groups (message-tokenize-header header ",")) - (while (setq group (pop groups)) - (when (member group groups) - (setq error group - groups nil))))) - (if (not error) - t - (y-or-n-p - (format "Group %s is repeated in headers. Really post? " error))))) - ;; Check the From header. - (message-check 'from - (let* ((case-fold-search t) - (from (message-fetch-field "from")) - ad) - (cond - ((not from) - (message "There is no From line. Posting is denied.") - nil) - ((or (not (string-match - "@[^\\.]*\\." - (setq ad (nth 1 (mail-extract-address-components - from))))) ;larsi@ifi - (string-match "\\.\\." ad) ;larsi@ifi..uio - (string-match "@\\." ad) ;larsi@.ifi.uio - (string-match "\\.$" ad) ;larsi@ifi.uio. - (not (string-match "^[^@]+@[^@]+$" ad)) ;larsi.ifi.uio - (string-match "(.*).*(.*)" from)) ;(lars) (lars) - (message - "Denied posting -- the From looks strange: \"%s\"." from) - nil) - ((let ((addresses (rfc822-addresses from))) - (while (and addresses - (not (eq (string-to-char (car addresses)) ?\())) - (setq addresses (cdr addresses))) - addresses) - (message - "Denied posting -- bad From address: \"%s\"." from) - nil) - (t t)))) - ;; Check the Reply-To header. - (message-check 'reply-to - (let* ((case-fold-search t) - (reply-to (message-fetch-field "reply-to")) - ad) - (cond - ((not reply-to) - t) - ((string-match "," reply-to) - (y-or-n-p - (format "Multiple Reply-To addresses: \"%s\". Really post? " - reply-to))) - ((or (not (string-match - "@[^\\.]*\\." - (setq ad (nth 1 (mail-extract-address-components - reply-to))))) ;larsi@ifi - (string-match "\\.\\." ad) ;larsi@ifi..uio - (string-match "@\\." ad) ;larsi@.ifi.uio - (string-match "\\.$" ad) ;larsi@ifi.uio. - (not (string-match "^[^@]+@[^@]+$" ad)) ;larsi.ifi.uio - (string-match "(.*).*(.*)" reply-to)) ;(lars) (lars) - (y-or-n-p - (format - "The Reply-To looks strange: \"%s\". Really post? " - reply-to))) - (t t)))))) - -(defun message-check-news-body-syntax () - (and - ;; Check for long lines. - (message-check 'long-lines - (goto-char (point-min)) - (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "$")) - (forward-line 1) - (while (and - (or (looking-at - mime-edit-tag-regexp) - (let ((p (point))) - (end-of-line) - (< (- (point) p) 80))) - (zerop (forward-line 1)))) - (or (bolp) - (eobp) - (y-or-n-p - "You have lines longer than 79 characters. Really post? "))) - ;; Check whether the article is empty. - (message-check 'empty - (goto-char (point-min)) - (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "$")) - (forward-line 1) - (let ((b (point))) - (goto-char (point-max)) - (re-search-backward message-signature-separator nil t) - (beginning-of-line) - (or (re-search-backward "[^ \n\t]" b t) - (if (message-gnksa-enable-p 'empty-article) - (y-or-n-p "Empty article. Really post? ") - (message "Denied posting -- Empty article.") - nil)))) - ;; Check for control characters. - (message-check 'control-chars - (if (re-search-forward "[\000-\007\013\015-\032\034-\037\200-\237]" nil t) - (y-or-n-p - "The article contains control characters. Really post? ") - t)) - ;; Check 8bit characters. - (message-check '8bit - (message-check-8bit)) - ;; Check excessive size. - (message-check 'size - (if (> (buffer-size) 60000) - (y-or-n-p - (format "The article is %d octets long. Really post? " - (buffer-size))) - t)) - ;; Check whether any new text has been added. - (message-check 'new-text - (or - (not message-checksum) - (not (eq (message-checksum) message-checksum)) - (if (message-gnksa-enable-p 'quoted-text-only) - (y-or-n-p - "It looks like no new text has been added. Really post? ") - (message "Denied posting -- no new text has been added.") - nil))) - ;; Check the length of the signature. - (message-check 'signature - (goto-char (point-max)) - (if (> (count-lines (point) (point-max)) 5) - (y-or-n-p - (format - "Your .sig is %d lines; it should be max 4. Really post? " - (1- (count-lines (point) (point-max))))) - t)) - ;; Ensure that text follows last quoted portion. - (message-check 'quoting-style - (goto-char (point-max)) - (let ((no-problem t)) - (when (search-backward-regexp "^>[^\n]*\n" nil t) - (setq no-problem (search-forward-regexp "^[ \t]*[^>\n]" nil t))) - (if no-problem - t - (if (message-gnksa-enable-p 'quoted-text-only) - (y-or-n-p "Your text should follow quoted text. Really post? ") - ;; Ensure that - (goto-char (point-min)) - (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "$")) - (if (search-forward-regexp "^[ \t]*[^>\n]" nil t) - (y-or-n-p "Your text should follow quoted text. Really post? ") - (message "Denied posting -- only quoted text.") - nil))))))) - -(defun message-check-mail-syntax () - "Check the syntax of the message." - (save-excursion - (save-restriction - (widen) - (and - ;; We narrow to the headers and check them first. - (save-excursion - (save-restriction - (message-narrow-to-headers) - (message-check-mail-header-syntax))) - ;; Check the body. - (save-excursion - (set-buffer message-edit-buffer) - (message-check-mail-body-syntax)))))) - -(defun message-check-mail-header-syntax () - t) - -(defun message-check-mail-body-syntax () - (and - ;; Check 8bit characters. - (message-check '8bit - (message-check-8bit) - ))) - -(defun message-check-8bit () - "Check the article contains 8bit characters." - (save-excursion - (set-buffer message-encoding-buffer) - (message-narrow-to-headers) - (let* ((case-fold-search t) - (field-value (message-fetch-field "content-transfer-encoding"))) - (if (and field-value - (member (downcase field-value) message-8bit-encoding-list)) - t - (widen) - (set-buffer (get-buffer-create " message syntax")) - (erase-buffer) - (goto-char (point-min)) - (set-buffer-multibyte nil) - (insert-buffer message-encoding-buffer) - (goto-char (point-min)) - (if (re-search-forward "[^\x00-\x7f]" nil t) - (y-or-n-p - "The article contains 8bit characters. Really post? ") - t))))) - -(defun message-checksum () - "Return a \"checksum\" for the current buffer." - (let ((sum 0)) - (save-excursion - (goto-char (point-min)) - (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "$")) - (while (not (eobp)) - (when (not (looking-at "[ \t\n]")) - (setq sum (logxor (ash sum 1) (if (natnump sum) 0 1) - (char-after)))) - (forward-char 1))) - sum)) - -(defun message-do-fcc () - "Process Fcc headers in the current buffer." - (let ((case-fold-search t) - (coding-system-for-write 'raw-text) - (output-coding-system 'raw-text) - list file) - (save-excursion - (save-restriction - (message-narrow-to-headers) - (setq file (message-fetch-field "fcc" t))) - (when file - (set-buffer (get-buffer-create " *message temp*")) - (erase-buffer) - (insert-buffer-substring message-encoding-buffer) - (save-restriction - (message-narrow-to-headers) - (while (setq file (message-fetch-field "fcc")) - (push file list) - (message-remove-header "fcc" nil t))) - (goto-char (point-min)) - (when (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "$") - nil t) - (replace-match "" t t)) - ;; Process FCC operations. - (while list - (setq file (pop list)) - (if (string-match "^[ \t]*|[ \t]*\\(.*\\)[ \t]*$" file) - ;; Pipe the article to the program in question. - (call-process-region (point-min) (point-max) shell-file-name - nil nil nil shell-command-switch - (match-string 1 file)) - ;; Save the article. - (setq file (expand-file-name file)) - (unless (file-exists-p (file-name-directory file)) - (make-directory (file-name-directory file) t)) - (if (and message-fcc-handler-function - (not (eq message-fcc-handler-function 'rmail-output))) - (funcall message-fcc-handler-function file) - (if (and (file-readable-p file) (mail-file-babyl-p file)) - (rmail-output file 1 nil t) - (let ((mail-use-rfc822 t)) - (rmail-output file 1 t t)))))) - (kill-buffer (current-buffer)))))) - -(defun message-output (filename) - "Append this article to Unix/babyl mail file FILENAME." - (if (and (file-readable-p filename) - (mail-file-babyl-p filename)) - (gnus-output-to-rmail filename t) - (gnus-output-to-mail filename t))) - -(defun message-cleanup-headers () - "Do various automatic cleanups of the headers." - ;; Remove empty lines in the header. - (save-restriction - (message-narrow-to-headers) - ;; Remove blank lines. - (while (re-search-forward "^[ \t]*\n" nil t) - (replace-match "" t t)) - - ;; Correct Newsgroups and Followup-To headers: Change sequence of - ;; spaces to comma and eliminate spaces around commas. Eliminate - ;; embedded line breaks. - (goto-char (point-min)) - (while (re-search-forward "^\\(Newsgroups\\|Followup-To\\): +" nil t) - (save-restriction - (narrow-to-region - (point) - (if (re-search-forward "^[^ \t]" nil t) - (match-beginning 0) - (forward-line 1) - (point))) - (goto-char (point-min)) - (while (re-search-forward "\n[ \t]+" nil t) - (replace-match " " t t)) ;No line breaks (too confusing) - (goto-char (point-min)) - (while (re-search-forward "[ \t\n]*,[ \t\n]*\\|[ \t]+" nil t) - (replace-match "," t t)) - (goto-char (point-min)) - ;; Remove trailing commas. - (when (re-search-forward ",+$" nil t) - (replace-match "" t t)))))) - -(defun message-make-date (&optional now) - "Make a valid data header. -If NOW, use that time instead." - (let* ((now (or now (current-time))) - (zone (nth 8 (decode-time now))) - (sign "+")) - (when (< zone 0) - (setq sign "-") - (setq zone (- zone))) - (concat - ;; The day name of the %a spec is locale-specific. Pfff. - (format "%s, " (capitalize (car (rassoc (nth 6 (decode-time now)) - parse-time-weekdays)))) - (format-time-string "%d" now) - ;; The month name of the %b spec is locale-specific. Pfff. - (format " %s " - (capitalize (car (rassoc (nth 4 (decode-time now)) - parse-time-months)))) - (format-time-string "%Y %H:%M:%S " now) - ;; We do all of this because XEmacs doesn't have the %z spec. - (format "%s%02d%02d" sign (/ zone 3600) (/ (% zone 3600) 60))))) - -(defun message-make-followup-subject (subject) - "Make a followup Subject." - (cond - ((and (eq message-use-subject-re 'guess) - (string-match message-subject-encoded-re-regexp subject)) - subject) - (message-use-subject-re - (concat "Re: " (message-strip-subject-re subject))) - (t subject))) - -(defun message-make-message-id () - "Make a unique Message-ID." - (concat "<" (message-unique-id) - (let ((psubject (save-excursion (message-fetch-field "subject"))) - (psupersedes - (save-excursion (message-fetch-field "supersedes")))) - (if (or - (and message-reply-headers - (mail-header-references message-reply-headers) - (mail-header-subject message-reply-headers) - psubject - (not (string= - (message-strip-subject-re - (mail-header-subject message-reply-headers)) - (message-strip-subject-re psubject)))) - (and psupersedes - (string-match "_-_@" psupersedes))) - "_-_" "")) - "@" (message-make-fqdn) ">")) - -(defvar message-unique-id-char nil) - -;; If you ever change this function, make sure the new version -;; cannot generate IDs that the old version could. -;; You might for example insert a "." somewhere (not next to another dot -;; or string boundary), or modify the "fsf" string. -(defun message-unique-id () - ;; Don't use microseconds from (current-time), they may be unsupported. - ;; Instead we use this randomly inited counter. - (setq message-unique-id-char - (% (1+ (or message-unique-id-char (logand (random t) (1- (lsh 1 20))))) - ;; (current-time) returns 16-bit ints, - ;; and 2^16*25 just fits into 4 digits i base 36. - (* 25 25))) - (let ((tm (current-time))) - (concat - (if (memq system-type '(ms-dos emx vax-vms)) - (let ((user (downcase (user-login-name)))) - (while (string-match "[^a-z0-9_]" user) - (aset user (match-beginning 0) ?_)) - user) - (message-number-base36 (user-uid) -1)) - (message-number-base36 (+ (car tm) - (lsh (% message-unique-id-char 25) 16)) 4) - (message-number-base36 (+ (nth 1 tm) - (lsh (/ message-unique-id-char 25) 16)) 4) - ;; Append the newsreader name, because while the generated - ;; ID is unique to this newsreader, other newsreaders might - ;; otherwise generate the same ID via another algorithm. - ".fsf"))) - -(defun message-number-base36 (num len) - (if (if (< len 0) - (<= num 0) - (= len 0)) - "" - (concat (message-number-base36 (/ num 36) (1- len)) - (char-to-string (aref "zyxwvutsrqponmlkjihgfedcba9876543210" - (% num 36)))))) - -(defun message-make-organization () - "Make an Organization header." - (let* ((organization - (when message-user-organization - (if (message-functionp message-user-organization) - (funcall message-user-organization) - message-user-organization)))) - (save-excursion - (message-set-work-buffer) - (cond ((stringp organization) - (insert organization)) - ((and (eq t organization) - message-user-organization-file - (file-exists-p message-user-organization-file)) - (insert-file-contents message-user-organization-file))) - (goto-char (point-min)) - (while (re-search-forward "[\t\n]+" nil t) - (replace-match "" t t)) - (unless (zerop (buffer-size)) - (buffer-string))))) - -(defun message-make-lines () - "Count the number of lines and return numeric string." - (save-excursion - (save-restriction - (widen) - (message-goto-body) - (int-to-string (count-lines (point) (point-max)))))) - -(defun message-make-in-reply-to () - "Return the In-Reply-To header for this message." - (when message-reply-headers - (let ((from (mail-header-from message-reply-headers)) - (date (mail-header-date message-reply-headers)) - (msg-id (mail-header-message-id message-reply-headers))) - (when msg-id - (concat msg-id - (when from - (let ((pair (std11-extract-address-components from))) - (concat "\n (" - (or (car pair) (cadr pair)) - "'s message of \"" - (if (or (not date) (string= date "")) - "(unknown date)" date) - "\")")))))))) - -(defun message-make-distribution () - "Make a Distribution header." - (let ((orig-distribution (message-fetch-reply-field "distribution"))) - (cond ((message-functionp message-distribution-function) - (funcall message-distribution-function)) - (t orig-distribution)))) - -(defun message-make-expires () - "Return an Expires header based on `message-expires'." - (let ((current (current-time)) - (future (* 1.0 message-expires 60 60 24))) - ;; Add the future to current. - (setcar current (+ (car current) (round (/ future (expt 2 16))))) - (setcar (cdr current) (+ (nth 1 current) (% (round future) (expt 2 16)))) - (message-make-date current))) - -(defun message-make-path () - "Return uucp path." - (let ((login-name (user-login-name))) - (cond ((null message-user-path) - (concat (system-name) "!" login-name)) - ((stringp message-user-path) - ;; Support GENERICPATH. Suggested by vixie@decwrl.dec.com. - (concat message-user-path "!" login-name)) - (t login-name)))) - -(defun message-make-from () - "Make a From header." - (let* ((style message-from-style) - (login (message-make-address)) - (fullname - (or (and (boundp 'user-full-name) - user-full-name) - (user-full-name)))) - (when (string= fullname "&") - (setq fullname (user-login-name))) - (save-excursion - (message-set-work-buffer) - (cond - ((or (null style) - (equal fullname "")) - (insert login)) - ((or (eq style 'angles) - (and (not (eq style 'parens)) - ;; Use angles if no quoting is needed, or if parens would - ;; need quoting too. - (or (not (string-match "[^- !#-'*+/-9=?A-Z^-~]" fullname)) - (let ((tmp (concat fullname nil))) - (while (string-match "([^()]*)" tmp) - (aset tmp (match-beginning 0) ?-) - (aset tmp (1- (match-end 0)) ?-)) - (string-match "[\\()]" tmp))))) - (insert fullname) - (goto-char (point-min)) - ;; Look for a character that cannot appear unquoted - ;; according to RFC 822. - (when (re-search-forward "[^- !#-'*+/-9=?A-Z^-~]" nil 1) - ;; Quote fullname, escaping specials. - (goto-char (point-min)) - (insert "\"") - (while (re-search-forward "[\"\\]" nil 1) - (replace-match "\\\\\\&" t)) - (insert "\"")) - (insert " <" login ">")) - (t ; 'parens or default - (insert login " (") - (let ((fullname-start (point))) - (insert fullname) - (goto-char fullname-start) - ;; RFC 822 says \ and nonmatching parentheses - ;; must be escaped in comments. - ;; Escape every instance of ()\ ... - (while (re-search-forward "[()\\]" nil 1) - (replace-match "\\\\\\&" t)) - ;; ... then undo escaping of matching parentheses, - ;; including matching nested parentheses. - (goto-char fullname-start) - (while (re-search-forward - "\\(\\=\\|[^\\]\\(\\\\\\\\\\)*\\)\\\\(\\(\\([^\\]\\|\\\\\\\\\\)*\\)\\\\)" - nil 1) - (replace-match "\\1(\\3)" t) - (goto-char fullname-start))) - (insert ")"))) - (buffer-string)))) - -(defun message-make-sender () - "Return the \"real\" user address. -This function tries to ignore all user modifications, and -give as trustworthy answer as possible." - (concat (user-login-name) "@" (system-name))) - -(defun message-make-address () - "Make the address of the user." - (or (message-user-mail-address) - (concat (user-login-name) "@" (message-make-domain)))) - -(defun message-user-mail-address () - "Return the pertinent part of `user-mail-address'." - (when user-mail-address - (if (string-match " " user-mail-address) - (nth 1 (std11-extract-address-components user-mail-address)) - user-mail-address))) - -(defun message-make-fqdn () - "Return user's fully qualified domain name." - (let ((system-name (system-name)) - (user-mail (message-user-mail-address))) - (cond - ((and (string-match "[^.]\\.[^.]" system-name) - (not (string-match message-bogus-system-names system-name))) - ;; `system-name' returned the right result. - system-name) - ;; Try `mail-host-address'. - ((and (boundp 'mail-host-address) - (stringp mail-host-address) - (string-match "\\." mail-host-address)) - mail-host-address) - ;; We try `user-mail-address' as a backup. - ((and user-mail - (string-match "\\." user-mail) - (string-match "@\\(.*\\)\\'" user-mail)) - (match-string 1 user-mail)) - ;; Default to this bogus thing. - (t - (concat system-name ".i-did-not-set--mail-host-address--so-shoot-me"))))) - -(defun message-make-host-name () - "Return the name of the host." - (let ((fqdn (message-make-fqdn))) - (string-match "^[^.]+\\." fqdn) - (substring fqdn 0 (1- (match-end 0))))) - -(defun message-make-domain () - "Return the domain name." - (or mail-host-address - (message-make-fqdn))) - -;; Dummy to avoid byte-compile warning. -(defvar mule-version) -(defvar emacs-beta-version) -(defvar xemacs-codename) -(defvar gnus-inviolable-extended-version) - -(defun message-make-user-agent () - "Return user-agent info if the value `message-user-agent' is non-nil. If the -\"User-Agent\" field has already exist, it's value will be added in the return -string." - (when message-user-agent - (save-excursion - (goto-char (point-min)) - (let ((case-fold-search t) - user-agent start p end) - (if (re-search-forward "^User-Agent:[\t ]*" nil t) - (progn - (setq start (match-beginning 0) - p (match-end 0) - end (std11-field-end) - user-agent (buffer-substring-no-properties p end)) - (delete-region start (1+ end)) - (concat message-user-agent " " user-agent)) - message-user-agent))))) - -(defun message-generate-headers (headers) - "Prepare article HEADERS. -Headers already prepared in the buffer are not modified." - (save-restriction - (message-narrow-to-headers) - (let* ((Date (message-make-date)) - (Message-ID (message-make-message-id)) - (Organization (message-make-organization)) - (From (message-make-from)) - (Path (message-make-path)) - (Subject nil) - (Newsgroups nil) - (In-Reply-To (message-make-in-reply-to)) - (To nil) - (Distribution (message-make-distribution)) - (Lines (message-make-lines)) - (User-Agent (message-make-user-agent)) - (Expires (message-make-expires)) - (case-fold-search t) - header value elem) - ;; First we remove any old generated headers. - (let ((headers message-deletable-headers)) - (unless (buffer-modified-p) - (setq headers (delq 'Message-ID (copy-sequence headers)))) - (while headers - (goto-char (point-min)) - (and (re-search-forward - (concat "^" (symbol-name (car headers)) ": *") nil t) - (get-text-property (1+ (match-beginning 0)) 'message-deletable) - (message-delete-line)) - (pop headers))) - ;; Go through all the required headers and see if they are in the - ;; articles already. If they are not, or are empty, they are - ;; inserted automatically - except for Subject, Newsgroups and - ;; Distribution. - (while headers - (goto-char (point-min)) - (setq elem (pop headers)) - (if (consp elem) - (if (eq (car elem) 'optional) - (setq header (cdr elem)) - (setq header (car elem))) - (setq header elem)) - (when (or (not (re-search-forward - (concat "^" - (regexp-quote - (downcase - (if (stringp header) - header - (symbol-name header)))) - ":") - nil t)) - (progn - ;; The header was found. We insert a space after the - ;; colon, if there is none. - (if (/= (char-after) ? ) (insert " ") (forward-char 1)) - ;; Find out whether the header is empty... - (looking-at "[ \t]*\n[^ \t]"))) - ;; So we find out what value we should insert. - (setq value - (cond - ((and (consp elem) (eq (car elem) 'optional)) - ;; This is an optional header. If the cdr of this - ;; is something that is nil, then we do not insert - ;; this header. - (setq header (cdr elem)) - (or (and (fboundp (cdr elem)) (funcall (cdr elem))) - (and (boundp (cdr elem)) (symbol-value (cdr elem))))) - ((consp elem) - ;; The element is a cons. Either the cdr is a - ;; string to be inserted verbatim, or it is a - ;; function, and we insert the value returned from - ;; this function. - (or (and (stringp (cdr elem)) (cdr elem)) - (and (fboundp (cdr elem)) (funcall (cdr elem))))) - ((and (boundp header) (symbol-value header)) - ;; The element is a symbol. We insert the value - ;; of this symbol, if any. - (symbol-value header)) - ((not (message-check-element header)) - ;; We couldn't generate a value for this header, - ;; so we just ask the user. - (read-from-minibuffer - (format "Empty header for %s; enter value: " header))))) - ;; Finally insert the header. - (when (and value - (not (equal value ""))) - (save-excursion - (if (bolp) - (progn - ;; This header didn't exist, so we insert it. - (goto-char (point-max)) - (insert (if (stringp header) header (symbol-name header)) - ": " value) - (unless (bolp) - (insert "\n")) - (forward-line -1)) - ;; The value of this header was empty, so we clear - ;; totally and insert the new value. - (delete-region (point) (gnus-point-at-eol)) - (insert value) - (when (bolp) - (delete-char -1))) - ;; Add the deletable property to the headers that require it. - (and (memq header message-deletable-headers) - (progn (beginning-of-line) (looking-at "[^:]+: ")) - (add-text-properties - (point) (match-end 0) - '(message-deletable t face italic) (current-buffer))))))) - ;; Insert new Sender if the From is strange. - (let ((from (message-fetch-field "from")) - (sender (message-fetch-field "sender")) - (secure-sender (message-make-sender))) - (when (and from - (not (message-check-element 'sender)) - (not (string= - (downcase - (cadr (std11-extract-address-components from))) - (downcase secure-sender))) - (or (null sender) - (not - (string= - (downcase - (cadr (std11-extract-address-components sender))) - (downcase secure-sender))))) - (goto-char (point-min)) - ;; Rename any old Sender headers to Original-Sender. - (when (re-search-forward "^\\(Original-\\)*Sender:" nil t) - (beginning-of-line) - (insert "Original-") - (beginning-of-line)) - (when (or (message-news-p) - (string-match "@.+\\.." secure-sender)) - (insert "Sender: " secure-sender "\n"))))))) - -(defun message-insert-courtesy-copy () - "Insert a courtesy message in mail copies of combined messages." - (let (newsgroups) - (save-excursion - (save-restriction - (message-narrow-to-headers) - (when (setq newsgroups (message-fetch-field "newsgroups")) - (goto-char (point-max)) - (insert "Posted-To: " newsgroups "\n"))) - (forward-line 1) - (when message-courtesy-message - (cond - ((string-match "%s" message-courtesy-message) - (insert (format message-courtesy-message newsgroups))) - (t - (insert message-courtesy-message))))))) - -;;; -;;; Setting up a message buffer -;;; - -(defun message-fill-address (header value) - (save-restriction - (narrow-to-region (point) (point)) - (insert (capitalize (symbol-name header)) - ": " - (if (consp value) (car value) value) - "\n") - (narrow-to-region (point-min) (1- (point-max))) - (let (quoted last) - (goto-char (point-min)) - (while (not (eobp)) - (skip-chars-forward "^,\"" (point-max)) - (if (or (eq (char-after) ?,) - (eobp)) - (when (not quoted) - (if (and (> (current-column) 78) - last) - (save-excursion - (goto-char last) - (looking-at "[ \t]*") - (replace-match "\n " t t))) - (setq last (1+ (point)))) - (setq quoted (not quoted))) - (unless (eobp) - (forward-char 1)))) - (goto-char (point-max)) - (widen) - (forward-line 1))) - -(defun message-fill-references (header value) - (insert (capitalize (symbol-name header)) - ": " - (std11-fill-msg-id-list-string - (if (consp value) (car value) value)) - "\n")) - -(defun message-fill-header (header value) - (let ((begin (point)) - (fill-column 78) - (fill-prefix " ")) - (insert (capitalize (symbol-name header)) - ": " - (if (consp value) (car value) value) - "\n") - (save-restriction - (narrow-to-region begin (point)) - (fill-region-as-paragraph begin (point)) - ;; Tapdance around looong Message-IDs. - (forward-line -1) - (when (looking-at "[ \t]*$") - (message-delete-line)) - (goto-char begin) - (re-search-forward ":" nil t) - (when (looking-at "\n[ \t]+") - (replace-match " " t t)) - (goto-char (point-max))))) - -(defun message-shorten-1 (list cut surplus) - "Cut SURPLUS elements out of LIST, beginning with CUTth one." - (setcdr (nthcdr (- cut 2) list) - (nthcdr (+ (- cut 2) surplus 1) list))) - -(defun message-shorten-references (header references) - "Trim REFERENCES to be 21 Message-ID long or less, and fold them. -If folding is disallowed, also check that the REFERENCES are less -than 988 characters long, and if they are not, trim them until they are." - (let ((maxcount 21) - (count 0) - (cut 2) - refs) - (with-temp-buffer - (insert references) - (goto-char (point-min)) - ;; Cons a list of valid references. - (while (re-search-forward "<[^>]+>" nil t) - (push (match-string 0) refs)) - (setq refs (nreverse refs) - count (length refs))) - - ;; If the list has more than MAXCOUNT elements, trim it by - ;; removing the CUTth element and the required number of - ;; elements that follow. - (when (> count maxcount) - (let ((surplus (- count maxcount))) - (message-shorten-1 refs cut surplus) - (decf count surplus))) - - ;; If folding is disallowed, make sure the total length (including - ;; the spaces between) will be less than MAXSIZE characters. - ;; - ;; Only disallow folding for News messages. At this point the headers - ;; have not been generated, thus we use message-this-is-news directly. - (when (and message-this-is-news message-cater-to-broken-inn) - (let ((maxsize 988) - (totalsize (+ (apply #'+ (mapcar #'length refs)) - (1- count))) - (surplus 0) - (ptr (nthcdr (1- cut) refs))) - ;; Decide how many elements to cut off... - (while (> totalsize maxsize) - (decf totalsize (1+ (length (car ptr)))) - (incf surplus) - (setq ptr (cdr ptr))) - ;; ...and do it. - (when (> surplus 0) - (message-shorten-1 refs cut surplus)))) - - ;; Finally, collect the references back into a string and insert - ;; it into the buffer. - (let ((refstring (mapconcat #'identity refs " "))) - (if (and message-this-is-news message-cater-to-broken-inn) - (insert (capitalize (symbol-name header)) ": " - refstring "\n") - (message-fill-header header refstring))))) - -(defun message-position-point () - "Move point to where the user probably wants to find it." - (message-narrow-to-headers) - (cond - ((re-search-forward "^[^:]+:[ \t]*$" nil t) - (search-backward ":" ) - (widen) - (forward-char 1) - (if (eq (char-after) ? ) - (forward-char 1) - (insert " "))) - (t - (goto-char (point-max)) - (widen) - (forward-line 1) - (unless (looking-at "$") - (forward-line 2))) - (sit-for 0))) - -(defun message-buffer-name (type &optional to group) - "Return a new (unique) buffer name based on TYPE and TO." - (cond - ;; Generate a new buffer name The Message Way. - ((eq message-generate-new-buffers 'unique) - (generate-new-buffer-name - (concat "*" type - (if to - (concat " to " - (or (car (std11-extract-address-components to)) - to) "") - "") - (if (and group (not (string= group ""))) (concat " on " group) "") - "*"))) - ;; Check whether `message-generate-new-buffers' is a function, - ;; and if so, call it. - ((message-functionp message-generate-new-buffers) - (funcall message-generate-new-buffers type to group)) - ((eq message-generate-new-buffers 'unsent) - (generate-new-buffer-name - (concat "*unsent " type - (if to - (concat " to " - (or (car (mail-extract-address-components to)) - to) "") - "") - (if (and group (not (string= group ""))) (concat " on " group) "") - "*"))) - ;; Use standard name. - (t - (format "*%s message*" type)))) - -(defmacro message-pop-to-buffer-1 (buffer) - `(if pop-up-frames - (let (special-display-buffer-names - special-display-regexps - same-window-buffer-names - same-window-regexps) - (pop-to-buffer ,buffer)) - (pop-to-buffer ,buffer))) - -(defun message-pop-to-buffer (name) - "Pop to buffer NAME, and warn if it already exists and is modified." - (let ((buffer (get-buffer name)) - (pop-up-frames (and (or (static-if (featurep 'xemacs) - (device-on-window-system-p) - window-system) - (>= emacs-major-version 20)) - message-use-multi-frames))) - (if (and buffer - (buffer-name buffer)) - (progn - (message-pop-to-buffer-1 buffer) - (when (and (buffer-modified-p) - (not (y-or-n-p - "Message already being composed; erase? "))) - (error "Message being composed"))) - (message-pop-to-buffer-1 name)) - (erase-buffer) - (message-mode) - (when pop-up-frames - (set (make-local-variable 'message-original-frame) (selected-frame))))) - -(defun message-do-send-housekeeping () - "Kill old message buffers." - ;; We might have sent this buffer already. Delete it from the - ;; list of buffers. - (setq message-buffer-list (delq (current-buffer) message-buffer-list)) - (while (and message-max-buffers - message-buffer-list - (>= (length message-buffer-list) message-max-buffers)) - ;; Kill the oldest buffer -- unless it has been changed. - (let ((buffer (pop message-buffer-list))) - (when (and (buffer-name buffer) - (not (buffer-modified-p buffer))) - (kill-buffer buffer)))) - ;; Rename the buffer. - (if message-send-rename-function - (funcall message-send-rename-function) - ;; Note: mail-abbrevs of XEmacs renames buffer name behind Gnus. - (when (string-match - "\\`\\*\\(sent \\|unsent \\)?\\(.+\\)\\*[^\\*]*\\|\\`mail to " - (buffer-name)) - (let ((name (match-string 2 (buffer-name))) - to group) - (if (not (or (null name) - (string-equal name "mail") - (string-equal name "news"))) - (setq name (concat "*sent " name "*")) - (message-narrow-to-headers) - (setq to (message-fetch-field "to")) - (setq group (message-fetch-field "newsgroups")) - (widen) - (setq name - (cond - (to (concat "*sent mail to " - (or (car (mail-extract-address-components to)) - to) "*")) - ((and group (not (string= group ""))) - (concat "*sent news on " group "*")) - (t "*sent mail*")))) - (unless (string-equal name (buffer-name)) - (rename-buffer name t))))) - ;; Push the current buffer onto the list. - (when message-max-buffers - (setq message-buffer-list - (nconc message-buffer-list (list (current-buffer)))))) - -(defun message-mail-user-agent () - (let ((mua (cond - ((not message-mail-user-agent) nil) - ((eq message-mail-user-agent t) mail-user-agent) - (t message-mail-user-agent)))) - (if (memq mua '(message-user-agent gnus-user-agent)) - nil - mua))) - -(defun message-setup (headers &optional replybuffer actions switch-function) - (let ((mua (message-mail-user-agent)) - subject to field yank-action) - (if (not (and message-this-is-mail mua)) - (message-setup-1 headers replybuffer actions) - (if replybuffer - (setq yank-action (list 'insert-buffer replybuffer))) - (setq headers (copy-sequence headers)) - (setq field (assq 'Subject headers)) - (when field - (setq subject (cdr field)) - (setq headers (delq field headers))) - (setq field (assq 'To headers)) - (when field - (setq to (cdr field)) - (setq headers (delq field headers))) - (let ((mail-user-agent mua)) - (compose-mail to subject - (mapcar (lambda (item) - (cons - (format "%s" (car item)) - (cdr item))) - headers) - nil switch-function yank-action actions))))) - -;;;(defvar mc-modes-alist) -(defun message-setup-1 (headers &optional replybuffer actions) -;;; (when (and (boundp 'mc-modes-alist) -;;; (not (assq 'message-mode mc-modes-alist))) -;;; (push '(message-mode (encrypt . mc-encrypt-message) -;;; (sign . mc-sign-message)) -;;; mc-modes-alist)) - (when actions - (setq message-send-actions actions)) - (setq message-reply-buffer - (or (message-get-parameter 'reply-buffer) - replybuffer)) - (goto-char (point-min)) - ;; Insert all the headers. - (mail-header-format - (let ((h headers) - (alist message-header-format-alist)) - (while h - (unless (assq (caar h) message-header-format-alist) - (push (list (caar h)) alist)) - (pop h)) - alist) - headers) - (delete-region (point) (progn (forward-line -1) (point))) - (when message-default-headers - (insert message-default-headers) - (or (bolp) (insert ?\n))) - (put-text-property - (point) - (progn - (insert mail-header-separator "\n") - (1- (point))) - 'read-only nil) - (forward-line -1) - (when (message-news-p) - (when message-default-news-headers - (insert message-default-news-headers) - (or (bolp) (insert ?\n))) - (when message-generate-headers-first - (message-generate-headers - (delq 'Lines - (delq 'Subject - (copy-sequence message-required-news-headers)))))) - (when (message-mail-p) - (when message-default-mail-headers - (insert message-default-mail-headers) - (or (bolp) (insert ?\n))) - (when message-generate-headers-first - (message-generate-headers - (delq 'Lines - (delq 'Subject - (copy-sequence message-required-mail-headers)))))) - (run-hooks 'message-signature-setup-hook) - (message-insert-signature) - (save-restriction - (message-narrow-to-headers) - (if message-alternative-emails - (message-use-alternative-email-as-from)) - (run-hooks 'message-header-setup-hook)) - (set-buffer-modified-p nil) - (setq buffer-undo-list nil) - (run-hooks 'message-setup-hook) - (message-position-point) - (undo-boundary)) - -(defun message-set-auto-save-file-name () - "Associate the message buffer with a file in the drafts directory." - (when message-auto-save-directory - (unless (file-directory-p - (directory-file-name message-auto-save-directory)) - (gnus-make-directory message-auto-save-directory)) - (if (gnus-alive-p) - (setq message-draft-article - (nndraft-request-associate-buffer "drafts")) - (setq buffer-file-name (expand-file-name - (if (memq system-type - '(ms-dos ms-windows windows-nt - cygwin32 win32 w32 - mswindows)) - "message" - "*message*") - message-auto-save-directory)) - (setq buffer-auto-save-file-name (make-auto-save-file-name))) - (clear-visited-file-modtime) - (static-if (boundp 'MULE) - (set-file-coding-system message-draft-coding-system) - (setq buffer-file-coding-system message-draft-coding-system)))) - -(defun message-disassociate-draft () - "Disassociate the message buffer from the drafts directory." - (when message-draft-article - (nndraft-request-expire-articles - (list message-draft-article) "drafts" nil t))) - -(defun message-insert-headers () - "Generate the headers for the article." - (interactive) - (save-excursion - (save-restriction - (message-narrow-to-headers) - (when (message-news-p) - (message-generate-headers - (delq 'Lines - (delq 'Subject - (copy-sequence message-required-news-headers))))) - (when (message-mail-p) - (message-generate-headers - (delq 'Lines - (delq 'Subject - (copy-sequence message-required-mail-headers)))))))) - - - -;;; -;;; Commands for interfacing with message -;;; - -;;;###autoload -(defun message-mail (&optional to subject - other-headers continue switch-function - yank-action send-actions) - "Start editing a mail message to be sent. -OTHER-HEADERS is an alist of header/value pairs." - (interactive) - (let ((message-this-is-mail t) replybuffer) - (unless (message-mail-user-agent) - (message-pop-to-buffer (message-buffer-name "mail" to))) - ;; FIXME: message-mail should do something if YANK-ACTION is not - ;; insert-buffer. - (and (consp yank-action) (eq (car yank-action) 'insert-buffer) - (setq replybuffer (nth 1 yank-action))) - (message-setup - (nconc - `((To . ,(or to "")) (Subject . ,(or subject ""))) - (when other-headers other-headers)) - replybuffer send-actions) - ;; FIXME: Should return nil if failure. - t)) - -;;;###autoload -(defun message-news (&optional newsgroups subject) - "Start editing a news article to be sent." - (interactive) - (let ((message-this-is-news t)) - (message-pop-to-buffer (message-buffer-name "news" nil newsgroups)) - (message-setup `((Newsgroups . ,(or newsgroups "")) - (Subject . ,(or subject "")))))) - -(defun message-get-reply-headers (wide &optional to-address) - (let (follow-to mct never-mct from to cc reply-to mrt mft) - ;; Find all relevant headers we need. - (setq from (message-fetch-field "from") - to (message-fetch-field "to") - cc (message-fetch-field "cc") - mct (when message-use-mail-copies-to - (message-fetch-field "mail-copies-to")) - reply-to (message-fetch-field "reply-to") - mrt (when message-use-mail-reply-to - (message-fetch-field "mail-reply-to")) - mft (when (and (not (or to-address mrt reply-to)) - message-use-mail-followup-to) - (message-fetch-field "mail-followup-to"))) - - ;; Handle special values of Mail-Copies-To. - (when mct - (cond - ((and (or (equal (downcase mct) "never") - (equal (downcase mct) "nobody"))) - (when (or (not (eq message-use-mail-copies-to 'ask)) - (message-y-or-n-p - (concat "Obey Mail-Copies-To: never? ") t "\ -You should normally obey the Mail-Copies-To: header. - - `Mail-Copies-To: " mct "' -directs you not to send your response to the author.")) - (setq never-mct t)) - (setq mct nil)) - ((and (or (equal (downcase mct) "always") - (equal (downcase mct) "poster"))) - (if (or (not (eq message-use-mail-copies-to 'ask)) - (message-y-or-n-p - (concat "Obey Mail-Copies-To: always? ") t "\ -You should normally obey the Mail-Copies-To: header. - - `Mail-Copies-To: " mct "' -sends a copy of your response to the author.")) - (setq mct (or mrt reply-to from)) - (setq mct nil))) - ((and (eq message-use-mail-copies-to 'ask) - (not (message-y-or-n-p - (concat "Obey Mail-Copies-To: " mct " ? ") t "\ -You should normally obey the Mail-Copies-To: header. - - `Mail-Copies-To: " mct "' -sends a copy of your response to " (if (string-match "," mct) - "the specified addresses" - "that address") "."))) - (setq mct nil)))) - - ;; Handle Mail-Followup-To. - (when (and mft - (eq message-use-mail-followup-to 'ask) - (not (message-y-or-n-p - (concat "Obey Mail-Followup-To: " mft "? ") t "\ -You should normally obey the Mail-Followup-To: header. - - `Mail-Followup-To: " mft "' -directs your response to " (if (string-match "," mft) - "the specified addresses" - "that address only") ". - -A typical situation where Mail-Followup-To is used is when the author thinks -that further discussion should take place only in " - (if (string-match "," mft) - "the specified mailing lists" - "that mailing list") "."))) - (setq mft nil)) - - (if (and (not mft) - (or (not wide) - to-address)) - (progn - (setq follow-to (list (cons 'To - (or to-address mrt reply-to mft from)))) - (when (and wide mct - (not (member (cons 'To mct) follow-to))) - (push (cons 'Cc mct) follow-to))) - (let (ccalist) - (save-excursion - (message-set-work-buffer) - (if (and mft - wide - (or (not (eq message-use-mail-followup-to 'ask)) - (message-y-or-n-p "Obey Mail-Followup-To? " t "\ -You should normally obey the Mail-Followup-To: header. In this -article, it has the value of - -" mft " - -which directs your response to " (if (string-match "," mft) - "the specified addresses" - "that address only") ". - -Most commonly, Mail-Followup-To is used by a mailing list poster to -express that responses should be sent to just the list, and not the -poster as well. - -If a message is posted to several mailing lists, Mail-Followup-To may -also be used to direct the following discussion to one list only, -because discussions that are spread over several lists tend to be -fragmented and very difficult to follow. - -Also, some source/announcement lists are not intended for discussion; -responses here are directed to other addresses."))) - (insert mft) - (unless never-mct - (insert (or mrt reply-to from ""))) - (insert (if to (concat (if (bolp) "" ", ") to) "")) - (insert (if mct (concat (if (bolp) "" ", ") mct) "")) - (insert (if cc (concat (if (bolp) "" ", ") cc) ""))) - (goto-char (point-min)) - (while (re-search-forward "[ \t]+" nil t) - (replace-match " " t t)) - ;; Remove addresses that match `rmail-dont-reply-to-names'. - (let ((rmail-dont-reply-to-names message-dont-reply-to-names)) - (insert (prog1 (rmail-dont-reply-to (buffer-string)) - (erase-buffer)))) - (goto-char (point-min)) - ;; Perhaps "Mail-Copies-To: never" removed the only address? - (when (eobp) - (insert (or mrt reply-to from ""))) - (setq ccalist - (mapcar - (lambda (addr) - (cons (mail-strip-quoted-names addr) addr)) - (message-tokenize-header (buffer-string)))) - (let ((s ccalist)) - (while s - (setq ccalist (delq (assoc (car (pop s)) s) ccalist))))) - (setq follow-to (list (cons 'To (cdr (pop ccalist))))) - (when ccalist - (let ((ccs (cons 'Cc (mapconcat - (lambda (addr) (cdr addr)) ccalist ", ")))) - (when (string-match "^ +" (cdr ccs)) - (setcdr ccs (substring (cdr ccs) (match-end 0)))) - (push ccs follow-to))) - ;; Allow the user to be asked whether or not to reply to all - ;; recipients in a wide reply. - (if (and ccalist wide message-wide-reply-confirm-recipients - (not (y-or-n-p "Reply to all recipients? "))) - (setq follow-to (delq (assoc 'Cc follow-to) follow-to))))) - follow-to)) - -;;;###autoload -(defun message-reply (&optional to-address wide) - "Start editing a reply to the article in the current buffer." - (interactive) - (require 'gnus-sum) ; for gnus-list-identifiers - (let ((cur (current-buffer)) - from subject date - references message-id follow-to - (inhibit-point-motion-hooks t) - (message-this-is-mail t) - gnus-warning in-reply-to) - (save-restriction - (message-narrow-to-head-1) - ;; Allow customizations to have their say. - (if (not wide) - ;; This is a regular reply. - (when (message-functionp message-reply-to-function) - (save-excursion - (setq follow-to (funcall message-reply-to-function)))) - ;; This is a followup. - (when (message-functionp message-wide-reply-to-function) - (save-excursion - (setq follow-to - (funcall message-wide-reply-to-function))))) - (setq message-id (message-fetch-field "message-id" t) - references (message-fetch-field "references") - date (message-fetch-field "date") - from (message-fetch-field "from") - subject (or (message-fetch-field "subject") "none")) - (when gnus-list-identifiers - (setq subject (message-strip-list-identifiers subject))) - (setq subject (message-make-followup-subject subject)) - - (when (and (setq gnus-warning (message-fetch-field "gnus-warning")) - (string-match "<[^>]+>" gnus-warning)) - (setq message-id (match-string 0 gnus-warning))) - - (unless follow-to - (setq follow-to (message-get-reply-headers wide to-address))) - - ;; Get the references from "In-Reply-To" field if there were - ;; no references and "In-Reply-To" field looks promising. - (unless references - (when (and (setq in-reply-to (message-fetch-field "in-reply-to")) - (string-match "<[^>]+>" in-reply-to)) - (setq references (match-string 0 in-reply-to))))) - - (unless (message-mail-user-agent) - (message-pop-to-buffer - (message-buffer-name - (if wide "wide reply" "reply") from - (if wide to-address nil)))) - - (setq message-reply-headers - (make-full-mail-header-from-decoded-header - 0 subject from date message-id references 0 0 "")) - - (message-setup - `((Subject . ,subject) - ,@follow-to - ,@(if (or references message-id) - `((References . ,(concat (or references "") (and references " ") - (or message-id "")))) - nil)) - cur))) - -;;;###autoload -(defun message-wide-reply (&optional to-address) - "Make a \"wide\" reply to the message in the current buffer." - (interactive) - (message-reply to-address t)) - -;;;###autoload -(defun message-followup (&optional to-newsgroups) - "Follow up to the message in the current buffer. -If TO-NEWSGROUPS, use that as the new Newsgroups line." - (interactive) - (require 'gnus-sum) ; for gnus-list-identifiers - (let ((cur (current-buffer)) - from subject date reply-to mrt mct mft - references message-id follow-to - (inhibit-point-motion-hooks t) - (message-this-is-news t) - followup-to distribution newsgroups gnus-warning posted-to) - (save-restriction - (message-narrow-to-head) - (when (message-functionp message-followup-to-function) - (setq follow-to - (funcall message-followup-to-function))) - (setq from (message-fetch-field "from") - date (message-fetch-field "date") - subject (or (message-fetch-field "subject") "none") - references (message-fetch-field "references") - message-id (message-fetch-field "message-id" t) - followup-to (message-fetch-field "followup-to") - newsgroups (message-fetch-field "newsgroups") - posted-to (message-fetch-field "posted-to") - reply-to (message-fetch-field "reply-to") - mrt (when message-use-mail-reply-to - (message-fetch-field "mail-reply-to")) - distribution (message-fetch-field "distribution") - mct (when message-use-mail-copies-to - (message-fetch-field "mail-copies-to")) - mft (when message-use-mail-followup-to - (message-fetch-field "mail-followup-to"))) - (when (and (setq gnus-warning (message-fetch-field "gnus-warning")) - (string-match "<[^>]+>" gnus-warning)) - (setq message-id (match-string 0 gnus-warning))) - ;; Remove bogus distribution. - (when (and (stringp distribution) - (let ((case-fold-search t)) - (string-match "world" distribution))) - (setq distribution nil)) - (if gnus-list-identifiers - (setq subject (message-strip-list-identifiers subject))) - (setq subject (message-make-followup-subject subject)) - (widen)) - - ;; Handle special values of Mail-Copies-To. - (when mct - (cond - ((and (or (equal (downcase mct) "never") - (equal (downcase mct) "nobody"))) - (setq mct nil)) - ((and (or (equal (downcase mct) "always") - (equal (downcase mct) "poster"))) - (if (or (not (eq message-use-mail-copies-to 'ask)) - (message-y-or-n-p - (concat "Obey Mail-Copies-To: always? ") t "\ -You should normally obey the Mail-Copies-To: header. - - `Mail-Copies-To: " mct "' -sends a copy of your response to the author.")) - (setq mct (or mrt reply-to from)) - (setq mct nil))) - ((and (eq message-use-mail-copies-to 'ask) - (not - (message-y-or-n-p - (concat "Obey Mail-Copies-To: " mct " ? ") t "\ -You should normally obey the Mail-Copies-To: header. - - `Mail-Copies-To: " mct "' -sends a copy of your response to " (if (string-match "," mct) - "the specified addresses" - "that address") "."))) - (setq mct nil)))) - - (unless follow-to - (cond - (to-newsgroups (setq follow-to (list (cons 'Newsgroups to-newsgroups)))) - ;; Handle Followup-To. - (followup-to - (cond - ((equal (downcase followup-to) "poster") - (if (or (and followup-to (eq message-use-followup-to 'use)) - (message-y-or-n-p "Obey Followup-To: poster? " t "\ -You should normally obey the Followup-To: header. - - `Followup-To: poster' -sends your response via e-mail instead of news. - -A typical situation where `Followup-To: poster' is used is when the author -does not read the newsgroup, so he wouldn't see any replies sent to it.")) - (setq message-this-is-news nil - distribution nil - follow-to (list (cons 'To (or mrt reply-to from "")))) - (setq follow-to (list (cons 'Newsgroups newsgroups))))) - (t - (if (or (equal followup-to newsgroups) - (not (and followup-to (eq message-use-followup-to 'ask))) - (message-y-or-n-p - (concat "Obey Followup-To: " followup-to "? ") t "\ -You should normally obey the Followup-To: header. - - `Followup-To: " followup-to "' -directs your response to " (if (string-match "," followup-to) - "the specified newsgroups" - "that newsgroup only") ". - -If a message is posted to several newsgroups, Followup-To is often -used to direct the following discussion to one newsgroup only, -because discussions that are spread over several newsgroup tend to -be fragmented and very difficult to follow. - -Also, some source/announcement newsgroups are not intended for discussion; -responses here are directed to other newsgroups.")) - (setq follow-to (list (cons 'Newsgroups followup-to))) - (setq follow-to (list (cons 'Newsgroups newsgroups))))))) - ;; Handle Mail-Followup-To, followup via e-mail. - ((and mft - (or (not (eq message-use-mail-followup-to 'ask)) - (message-y-or-n-p - (concat "Obey Mail-Followup-To: " mft "? ") t "\ -You should normally obey the Mail-Followup-To: header. - - `Mail-Followup-To: " mft "' -directs your response to " (if (string-match "," mft) - "the specified addresses" - "that address only") " instead of news. - -A typical situation where Mail-Followup-To is used is when the author thinks -that further discussion should take place only in " - (if (string-match "," mft) - "the specified mailing lists" - "that mailing list") "."))) - (setq message-this-is-news nil - distribution nil - follow-to (list (cons 'To mft)))) - (posted-to (setq follow-to (list (cons 'Newsgroups posted-to)))) - (t - (setq follow-to (list (cons 'Newsgroups newsgroups)))))) - - (message-pop-to-buffer (message-buffer-name "followup" from newsgroups)) - - (message-setup - `((Subject . ,subject) - ,@follow-to - ,@(and mct (list (cons 'Cc mct))) - ,@(and distribution (list (cons 'Distribution distribution))) - ,@(if (or references message-id) - `((References . ,(concat (or references "") (and references " ") - (or message-id "")))))) - cur) - - (setq message-reply-headers - (make-full-mail-header-from-decoded-header - 0 subject from date message-id references 0 0 "")))) - -;;;###autoload -(defun message-cancel-news (&optional arg) - "Cancel an article you posted. -If ARG, allow editing of the cancellation message." - (interactive "P") - (unless (message-news-p) - (error "This is not a news article; canceling is impossible")) - (let (from newsgroups message-id distribution buf sender) - (save-excursion - ;; Get header info from original article. - (save-restriction - (message-narrow-to-head-1) - (setq from (message-fetch-field "from") - sender (message-fetch-field "sender") - newsgroups (message-fetch-field "newsgroups") - message-id (message-fetch-field "message-id" t) - distribution (message-fetch-field "distribution"))) - ;; Make sure that this article was written by the user. - (unless (or (message-gnksa-enable-p 'cancel-messages) - (and sender - (string-equal - (downcase sender) - (downcase (message-make-sender)))) - (string-equal - (downcase (cadr (std11-extract-address-components from))) - (downcase (cadr (std11-extract-address-components - (message-make-from)))))) - (error "This article is not yours")) - (when (yes-or-no-p "Do you really want to cancel this article? ") - ;; Make control message. - (if arg - (message-news) - (setq buf (set-buffer (get-buffer-create " *message cancel*")))) - (erase-buffer) - (insert "Newsgroups: " newsgroups "\n" - "From: " from "\n" - "Subject: cmsg cancel " message-id "\n" - "Control: cancel " message-id "\n" - (if distribution - (concat "Distribution: " distribution "\n") - "") - mail-header-separator "\n" - message-cancel-message) - (run-hooks 'message-cancel-hook) - (unless arg - (message "Canceling your article...") - (if (let ((message-syntax-checks - 'dont-check-for-anything-just-trust-me) - (message-encoding-buffer (current-buffer)) - (message-edit-buffer (current-buffer))) - (message-send-news)) - (message "Canceling your article...done")) - (kill-buffer buf)))))) - -(defun message-supersede-setup-for-mime-edit () - (set (make-local-variable 'message-setup-hook) nil) - (mime-edit-again)) - -;;;###autoload -(defun message-supersede () - "Start composing a message to supersede the current message. -This is done simply by taking the old article and adding a Supersedes -header line with the old Message-ID." - (interactive) - (let ((cur (current-buffer)) - (sender (message-fetch-field "sender")) - (from (message-fetch-field "from"))) - ;; Check whether the user owns the article that is to be superseded. - (unless (or (message-gnksa-enable-p 'cancel-messages) - (and sender - (string-equal - (downcase sender) - (downcase (message-make-sender)))) - (string-equal - (downcase (cadr (std11-extract-address-components from))) - (downcase (cadr (std11-extract-address-components - (message-make-from)))))) - (error "This article is not yours")) - ;; Get a normal message buffer. - (message-pop-to-buffer (message-buffer-name "supersede")) - (insert-buffer-substring cur) - (message-narrow-to-head-1) - ;; Remove unwanted headers. - (when message-ignored-supersedes-headers - (message-remove-header message-ignored-supersedes-headers t)) - (goto-char (point-min)) - (if (not (re-search-forward "^Message-ID: " nil t)) - (error "No Message-ID in this article") - (replace-match "Supersedes: " t t)) - (goto-char (point-max)) - (insert mail-header-separator) - (widen) - (when message-supersede-setup-function - (funcall message-supersede-setup-function)) - (run-hooks 'message-supersede-setup-hook) - (goto-char (point-min)) - (search-forward (concat "\n" mail-header-separator "\n") nil t))) - -;;;###autoload -(defun message-recover () - "Reread contents of current buffer from its last auto-save file." - (interactive) - (let ((file-name (make-auto-save-file-name))) - (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 - "ls" nil standard-output nil "-l" file-name)))) - (yes-or-no-p (format "Recover auto save file %s? " file-name))) - (let ((buffer-read-only nil)) - (erase-buffer) - (insert-file-contents file-name nil))) - (t (error "message-recover cancelled"))))) - -;;; Washing Subject: - -(defun message-wash-subject (subject) - "Remove junk like \"Re:\", \"(fwd)\", etc. added to subject string SUBJECT. -Previous forwarders, replyers, etc. may add it." - (with-temp-buffer - (insert-string subject) - (goto-char (point-min)) - ;; strip Re/Fwd stuff off the beginning - (while (re-search-forward - "\\([Rr][Ee]:\\|[Ff][Ww][Dd]\\(\\[[0-9]*\\]\\)?:\\|[Ff][Ww]:\\)" nil t) - (replace-match "")) - - ;; and gnus-style forwards [foo@bar.com] subject - (goto-char (point-min)) - (while (re-search-forward "\\[[^ \t]*\\(@\\|\\.\\)[^ \t]*\\]" nil t) - (replace-match "")) - - ;; and off the end - (goto-char (point-max)) - (while (re-search-backward "([Ff][Ww][Dd])" nil t) - (replace-match "")) - - ;; and finally, any whitespace that was left-over - (goto-char (point-min)) - (while (re-search-forward "^[ \t]+" nil t) - (replace-match "")) - (goto-char (point-max)) - (while (re-search-backward "[ \t]+$" nil t) - (replace-match "")) - - (buffer-string))) - -;;; Forwarding messages. - -(defvar message-forward-decoded-p nil - "Non-nil means the original message is decoded.") - -(defun message-forward-subject-author-subject (subject) - "Generate a SUBJECT for a forwarded message. -The form is: [Source] Subject, where if the original message was mail, -Source is the sender, and if the original message was news, Source is -the list of newsgroups is was posted to." - (concat "[" - (if (message-news-p) - (or (message-fetch-field "newsgroups") - "(nowhere)") - (let ((from (message-fetch-field "from"))) - (if from - (nnheader-decode-from from) - "(nobody)"))) - "] " subject)) - -(defun message-forward-subject-fwd (subject) - "Generate a SUBJECT for a forwarded message. -The form is: Fwd: Subject, where Subject is the original subject of -the message." - (concat "Fwd: " subject)) - -(defun message-make-forward-subject () - "Return a Subject header suitable for the message in the current buffer." - (save-excursion - (save-restriction - (message-narrow-to-head-1) - (let ((funcs message-make-forward-subject-function) - (subject (message-fetch-field "Subject"))) - (setq subject - (if subject - (if message-forward-decoded-p - subject - (nnheader-decode-subject subject)) - "")) - (if message-wash-forwarded-subjects - (setq subject (message-wash-subject subject))) - ;; Make sure funcs is a list. - (and funcs - (not (listp funcs)) - (setq funcs (list funcs))) - ;; Apply funcs in order, passing subject generated by previous - ;; func to the next one. - (while funcs - (when (message-functionp (car funcs)) - (setq subject (funcall (car funcs) subject))) - (setq funcs (cdr funcs))) - subject)))) - -;;;###autoload -(defun message-forward (&optional news) - "Forward the current message via mail. -Optional NEWS will use news to forward instead of mail." - (interactive "P") - (let ((cur (current-buffer)) - (subject (message-make-forward-subject)) - art-beg) - (if news - (message-news nil subject) - (message-mail nil subject)) - ;; Put point where we want it before inserting the forwarded - ;; message. - (if message-forward-before-signature - (message-goto-body) - (goto-char (point-max))) - ;; Make sure we're at the start of the line. - (unless (bolp) - (insert "\n")) - ;; Narrow to the area we are to insert. - (narrow-to-region (point) (point)) - ;; Insert the separators and the forwarded buffer. - (insert message-forward-start-separator) - (setq art-beg (point)) - (insert-buffer-substring cur) - (goto-char (point-max)) - (insert message-forward-end-separator) - (set-text-properties (point-min) (point-max) nil) - ;; Remove all unwanted headers. - (goto-char art-beg) - (narrow-to-region (point) (if (search-forward "\n\n" nil t) - (1- (point)) - (point))) - (goto-char (point-min)) - (message-remove-header message-included-forward-headers t nil t) - (widen) - (message-position-point))) - -;;;###autoload -(defun message-resend (address) - "Resend the current article to ADDRESS." - (interactive - (list (message-read-from-minibuffer "Resend message to: "))) - (message "Resending message to %s..." address) - (save-excursion - (let ((cur (current-buffer)) - beg) - ;; We first set up a normal mail buffer. - (unless (message-mail-user-agent) - (set-buffer (get-buffer-create " *message resend*")) - (erase-buffer) - (let ((message-this-is-mail t) - ;; avoid to turn-on-mime-edit - message-setup-hook) - (message-setup `((To . ,address))))) - ;; Insert our usual headers. - (message-generate-headers '(From Date To)) - (message-narrow-to-headers) - ;; Rename them all to "Resent-*". - (while (re-search-forward "^[A-Za-z]" nil t) - (forward-char -1) - (insert "Resent-")) - (widen) - (forward-line) - (delete-region (point) (point-max)) - (setq beg (point)) - ;; Insert the message to be resent. - (insert-buffer-substring cur) - (goto-char (point-min)) - (search-forward "\n\n") - (forward-char -1) - (save-restriction - (narrow-to-region beg (point)) - (message-remove-header message-ignored-resent-headers t) - (goto-char (point-max))) - (insert mail-header-separator) - ;; Rename all old ("Also-")Resent headers. - (while (re-search-backward "^\\(Also-\\)*Resent-" beg t) - (beginning-of-line) - (insert "Also-")) - ;; Quote any "From " lines at the beginning. - (goto-char beg) - (when (looking-at "From ") - (replace-match "X-From-Line: ")) - ;; Send it. - (let ((message-encoding-buffer (current-buffer)) - (message-edit-buffer (current-buffer))) - (let (message-required-mail-headers) - (message-send-mail))) - (kill-buffer (current-buffer))) - (message "Resending message to %s...done" address))) - -(defun message-bounce-setup-for-mime-edit () - (set (make-local-variable 'message-setup-hook) nil) - (mime-edit-again)) - -;;;###autoload -(defun message-bounce () - "Re-mail the current message. -This only makes sense if the current message is a bounce message that -contains some mail you have written which has been bounced back to -you." - (interactive) - (let ((cur (current-buffer)) - boundary) - (message-pop-to-buffer (message-buffer-name "bounce")) - (insert-buffer-substring cur) - (undo-boundary) - (message-narrow-to-head) - (if (and (message-fetch-field "MIME-Version") - (setq boundary (message-fetch-field "Content-Type"))) - (if (string-match "boundary=\"\\([^\"]+\\)\"" boundary) - (setq boundary (concat (match-string 1 boundary) " *\n" - "Content-Type: message/rfc822")) - (setq boundary nil))) - (widen) - (goto-char (point-min)) - (search-forward "\n\n" nil t) - (if (or (and boundary - (re-search-forward boundary nil t) - (forward-line 2)) - (and (re-search-forward message-unsent-separator nil t) - (forward-line 1)) - (re-search-forward "^Return-Path:.*\n" nil t)) - ;; We remove everything before the bounced mail. - (delete-region - (point-min) - (if (re-search-forward "^[^ \n\t]+:" nil t) - (match-beginning 0) - (point))) - (when (re-search-backward "^.?From .*\n" nil t) - (delete-region (match-beginning 0) (match-end 0)))) - (save-restriction - (message-narrow-to-head-1) - (message-remove-header message-ignored-bounced-headers t) - (goto-char (point-max)) - (insert mail-header-separator)) - (when message-bounce-setup-function - (funcall message-bounce-setup-function)) - (run-hooks 'message-bounce-setup-hook) - (message-position-point))) - -;;; -;;; Interactive entry points for new message buffers. -;;; - -;;;###autoload -(defun message-mail-other-window (&optional to subject) - "Like `message-mail' command, but display mail buffer in another window." - (interactive) - (unless (message-mail-user-agent) - (let ((pop-up-windows t) - (special-display-buffer-names nil) - (special-display-regexps nil) - (same-window-buffer-names nil) - (same-window-regexps nil)) - (message-pop-to-buffer (message-buffer-name "mail" to)))) - (let ((message-this-is-mail t)) - (message-setup `((To . ,(or to "")) (Subject . ,(or subject ""))) - nil nil 'switch-to-buffer-other-window))) - -;;;###autoload -(defun message-mail-other-frame (&optional to subject) - "Like `message-mail' command, but display mail buffer in another frame." - (interactive) - (unless (message-mail-user-agent) - (let ((pop-up-frames t) - (special-display-buffer-names nil) - (special-display-regexps nil) - (same-window-buffer-names nil) - (same-window-regexps nil)) - (message-pop-to-buffer (message-buffer-name "mail" to)))) - (let ((message-this-is-mail t)) - (message-setup `((To . ,(or to "")) (Subject . ,(or subject ""))) - nil nil 'switch-to-buffer-other-frame))) - -;;;###autoload -(defun message-news-other-window (&optional newsgroups subject) - "Start editing a news article to be sent." - (interactive) - (let ((pop-up-windows t) - (special-display-buffer-names nil) - (special-display-regexps nil) - (same-window-buffer-names nil) - (same-window-regexps nil)) - (message-pop-to-buffer (message-buffer-name "news" nil newsgroups))) - (let ((message-this-is-news t)) - (message-setup `((Newsgroups . ,(or newsgroups "")) - (Subject . ,(or subject "")))))) - -;;;###autoload -(defun message-news-other-frame (&optional newsgroups subject) - "Start editing a news article to be sent." - (interactive) - (let ((pop-up-frames t) - (special-display-buffer-names nil) - (special-display-regexps nil) - (same-window-buffer-names nil) - (same-window-regexps nil)) - (message-pop-to-buffer (message-buffer-name "news" nil newsgroups))) - (let ((message-this-is-news t)) - (message-setup `((Newsgroups . ,(or newsgroups "")) - (Subject . ,(or subject "")))))) - -;;; underline.el - -;; This code should be moved to underline.el (from which it is stolen). - -;;;###autoload -(defun bold-region (start end) - "Bold all nonblank characters in the region. -Works by overstriking characters. -Called from program, takes two arguments START and END -which specify the range to operate on." - (interactive "r") - (save-excursion - (let ((end1 (make-marker))) - (move-marker end1 (max start end)) - (goto-char (min start end)) - (while (< (point) end1) - (or (looking-at "[_\^@- ]") - (insert (char-after) "\b")) - (forward-char 1))))) - -;;;###autoload -(defun unbold-region (start end) - "Remove all boldness (overstruck characters) in the region. -Called from program, takes two arguments START and END -which specify the range to operate on." - (interactive "r") - (save-excursion - (let ((end1 (make-marker))) - (move-marker end1 (max start end)) - (goto-char (min start end)) - (while (re-search-forward "\b" end1 t) - (if (eq (char-after) (char-after (- (point) 2))) - (delete-char -2)))))) - -(defalias 'message-exchange-point-and-mark 'exchange-point-and-mark) - -;; Support for toolbar -(eval-when-compile - (defvar tool-bar-map) - (defvar tool-bar-mode)) - -(defun message-tool-bar-map () - (or message-tool-bar-map - (setq message-tool-bar-map - (and (fboundp 'tool-bar-add-item-from-menu) - tool-bar-mode - (let ((tool-bar-map (copy-keymap tool-bar-map)) - (load-path (mm-image-load-path))) - ;; Zap some items which aren't so relevant and take - ;; up space. - (dolist (key '(print-buffer kill-buffer save-buffer - write-file dired open-file)) - (define-key tool-bar-map (vector key) nil)) - (tool-bar-add-item-from-menu - 'message-send-and-exit "mail_send" message-mode-map) - (tool-bar-add-item-from-menu - 'message-kill-buffer "close" message-mode-map) - (tool-bar-add-item-from-menu - 'message-dont-send "cancel" message-mode-map) - (tool-bar-add-item-from-menu - 'mml-attach-file "attach" message-mode-map) - (tool-bar-add-item-from-menu - 'ispell-message "spell" message-mode-map) - tool-bar-map))))) - -;;; Group name completion. - -(defvar message-newgroups-header-regexp - "^\\(Newsgroups\\|Followup-To\\|Posted-To\\|Gcc\\):" - "Regexp that match headers that lists groups.") - -(defvar message-completion-alist - (list (cons message-newgroups-header-regexp 'message-expand-group) - '("^\\(Resent-\\)?\\(To\\|B?Cc\\):" . message-expand-name)) - "Alist of (RE . FUN). Use FUN for completion on header lines matching RE.") - -(defun message-tab () - "Complete names according to `message-completion-alist'. -Do an `indent-relative' if not in those headers." - (interactive) - (let ((alist message-completion-alist)) - (while (and alist - (let ((mail-abbrev-mode-regexp (caar alist))) - (not (mail-abbrev-in-expansion-header-p)))) - (setq alist (cdr alist))) - (funcall (or (cdar alist) 'indent-relative)))) - -(defun message-expand-group () - "Expand the group name under point." - (let* ((b (save-excursion - (save-restriction - (narrow-to-region - (save-excursion - (beginning-of-line) - (skip-chars-forward "^:") - (1+ (point))) - (point)) - (skip-chars-backward "^, \t\n") (point)))) - (completion-ignore-case t) - (string (buffer-substring b (progn (skip-chars-forward "^,\t\n ") - (point)))) - (hashtb (and (boundp 'gnus-active-hashtb) gnus-active-hashtb)) - (completions (all-completions string hashtb)) - comp) - (delete-region b (point)) - (cond - ((= (length completions) 1) - (if (string= (car completions) string) - (progn - (insert string) - (message "Only matching group")) - (insert (car completions)))) - ((and (setq comp (try-completion string hashtb)) - (not (string= comp string))) - (insert comp)) - (t - (insert string) - (if (not comp) - (message "No matching groups") - (save-selected-window - (pop-to-buffer "*Completions*") - (buffer-disable-undo) - (let ((buffer-read-only nil)) - (erase-buffer) - (let ((standard-output (current-buffer))) - (display-completion-list (sort completions 'string<))) - (goto-char (point-min)) - (delete-region (point) (progn (forward-line 3) (point)))))))))) - -(defun message-expand-name () - (if (fboundp 'bbdb-complete-name) - (bbdb-complete-name) - (expand-abbrev))) - -;;; Help stuff. - -(defun message-talkative-question (ask question show &rest text) - "Call FUNCTION with argument QUESTION; optionally display TEXT... args. -If SHOW is non-nil, the arguments TEXT... are displayed in a temp buffer. -The following arguments may contain lists of values." - (if (and show - (setq text (message-flatten-list text))) - (save-window-excursion - (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)) - (funcall ask question))) - -(defun message-flatten-list (list) - "Return a new, flat list that contains all elements of LIST. - -\(message-flatten-list '(1 (2 3 (4 5 (6))) 7)) -=> (1 2 3 4 5 6 7)" - (cond ((consp list) - (apply 'append (mapcar 'message-flatten-list list))) - (list - (list list)))) - -(defun message-generate-new-buffer-clone-locals (name &optional varstr) - "Create and return a buffer with name based on NAME using `generate-new-buffer.' -Then clone the local variables and values from the old buffer to the -new one, cloning only the locals having a substring matching the -regexp varstr." - (let ((oldbuf (current-buffer))) - (save-excursion - (set-buffer (generate-new-buffer name)) - (message-clone-locals oldbuf varstr) - (current-buffer)))) - -(defun message-clone-locals (buffer &optional varstr) - "Clone the local variables from BUFFER to the current buffer." - (let ((locals (save-excursion - (set-buffer buffer) - (buffer-local-variables))) - (regexp - "^\\(gnus\\|nn\\|message\\|user-\\(mail-address\\|full-name\\)\\)")) - (mapcar - (lambda (local) - (when (and (consp local) - (car local) - (string-match regexp (symbol-name (car local))) - (or (null varstr) - (string-match varstr (symbol-name (car local))))) - (ignore-errors - (set (make-local-variable (car local)) - (cdr local))))) - locals))) - - -;;; @ for MIME Edit mode -;;; - -(defun message-maybe-encode () - (when message-mime-mode - ;; Inherit the buffer local variable `mime-edit-pgp-processing'. - (let ((pgp-processing (with-current-buffer message-edit-buffer - mime-edit-pgp-processing))) - (setq mime-edit-pgp-processing pgp-processing)) - (run-hooks 'mime-edit-translate-hook) - (if (catch 'mime-edit-error - (save-excursion - (mime-edit-pgp-enclose-buffer) - (mime-edit-translate-body))) - (error "Translation error!")) - (run-hooks 'mime-edit-exit-hook))) - -(defun message-mime-insert-article (&optional full-headers) - (interactive "P") - (let ((message-cite-function 'mime-edit-inserted-message-filter) - (message-reply-buffer - (message-get-parameter-with-eval 'original-buffer)) - (start (point))) - (message-yank-original nil) - (save-excursion - (narrow-to-region (goto-char start) - (if (search-forward "\n\n" nil t) - (1- (point)) - (point-max))) - (goto-char (point-min)) - (let ((message-included-forward-headers - (if full-headers "" message-included-forward-headers))) - (message-remove-header message-included-forward-headers t nil t)) - (widen)))) - -(set-alist 'mime-edit-message-inserter-alist - 'message-mode (function message-mime-insert-article)) - -;;; Miscellaneous functions - -;; stolen (and renamed) from nnheader.el -(static-if (fboundp 'subst-char-in-string) - (defsubst message-replace-chars-in-string (string from to) - (subst-char-in-string from to string)) - (defun message-replace-chars-in-string (string from to) - "Replace characters in STRING from FROM to TO." - (let ((string (substring string 0)) ;Copy string. - (len (length string)) - (idx 0)) - ;; Replace all occurrences of FROM with TO. - (while (< idx len) - (when (= (aref string idx) from) - (aset string idx to)) - (setq idx (1+ idx))) - string))) - -;;; -;;; MIME functions -;;; - -(defvar message-inhibit-body-encoding t) - -(defun message-encode-message-body () - (unless message-inhibit-body-encoding - (let ((mail-parse-charset (or mail-parse-charset - message-default-charset)) - (case-fold-search t) - lines content-type-p) - (message-goto-body) - (save-restriction - (narrow-to-region (point) (point-max)) - (let ((new (mml-generate-mime))) - (when new - (delete-region (point-min) (point-max)) - (insert new) - (goto-char (point-min)) - (if (eq (aref new 0) ?\n) - (delete-char 1) - (search-forward "\n\n") - (setq lines (buffer-substring (point-min) (1- (point)))) - (delete-region (point-min) (point)))))) - (save-restriction - (message-narrow-to-headers-or-head) - (message-remove-header "Mime-Version") - (goto-char (point-max)) - (insert "MIME-Version: 1.0\n") - (when lines - (insert lines)) - (setq content-type-p - (or mml-boundary - (re-search-backward "^Content-Type:" nil t)))) - (save-restriction - (message-narrow-to-headers-or-head) - (message-remove-first-header "Content-Type") - (message-remove-first-header "Content-Transfer-Encoding")) - ;; We always make sure that the message has a Content-Type header. - ;; This is because some broken MTAs and MUAs get awfully confused - ;; when confronted with a message with a MIME-Version header and - ;; without a Content-Type header. For instance, Solaris' - ;; /usr/bin/mail. - (unless content-type-p - (goto-char (point-min)) - (re-search-forward "^MIME-Version:") - (forward-line 1) - (insert "Content-Type: text/plain; charset=us-ascii\n"))))) - -(defun message-read-from-minibuffer (prompt) - "Read from the minibuffer while providing abbrev expansion." - (if (fboundp 'mail-abbrevs-setup) - (let ((mail-abbrev-mode-regexp "") - (minibuffer-setup-hook 'mail-abbrevs-setup) - (minibuffer-local-map message-minibuffer-local-map)) - (read-from-minibuffer prompt)) - (let ((minibuffer-setup-hook 'mail-abbrev-minibuffer-setup-hook) - (minibuffer-local-map message-minibuffer-local-map)) - (read-string prompt)))) - -(defun message-use-alternative-email-as-from () - (require 'mail-utils) - (let* ((fields '("To" "Cc")) - (emails - (split-string - (mail-strip-quoted-names - (mapconcat 'message-fetch-reply-field fields ",")) - "[ \f\t\n\r\v,]+")) - email) - (while emails - (if (string-match message-alternative-emails (car emails)) - (setq email (car emails) - emails nil)) - (pop emails)) - (unless (or (not email) (equal email user-mail-address)) - (goto-char (point-max)) - (insert "From: " email "\n")))) - -(defun message-options-get (symbol) - (cdr (assq symbol message-options))) - -(defun message-options-set (symbol value) - (let ((the-cons (assq symbol message-options))) - (if the-cons - (if value - (setcdr the-cons value) - (setq message-options (delq the-cons message-options))) - (and value - (push (cons symbol value) message-options)))) - value) - -(defun message-options-set-recipient () - (save-restriction - (message-narrow-to-headers-or-head) - (message-options-set 'message-sender - (mail-strip-quoted-names - (message-fetch-field "from"))) - (message-options-set 'message-recipients - (mail-strip-quoted-names - (let ((to (message-fetch-field "to")) - (cc (message-fetch-field "cc")) - (bcc (message-fetch-field "bcc"))) - (concat - (or to "") - (if (and to cc) ", ") - (or cc "") - (if (and (or to cc) bcc) ", ") - (or bcc ""))))))) - -(when (featurep 'xemacs) - (require 'messagexmas) - (message-xmas-redefine)) - -(defun message-save-drafts () - "Postponing the message." - (interactive) - (message "Saving %s..." buffer-file-name) - (let ((reply-headers message-reply-headers) - (msg (buffer-substring-no-properties (point-min) (point-max))) - (message-invisibles (message-find-invisible-regions))) - (with-temp-file buffer-file-name - (insert msg) - ;; Inherit the invisible property of texts to make MIME-Edit - ;; find the MIME part boundaries. - (dolist (region message-invisibles) - (put-text-property (car region) (cdr region) 'invisible t)) - (setq message-reply-headers reply-headers) - (message-generate-headers '((optional . In-Reply-To))) - (mime-edit-translate-buffer)) - (set-buffer-modified-p nil)) - (message "Saving %s...done" buffer-file-name)) - -(provide 'message) - -(run-hooks 'message-load-hook) - -;; Local Variables: -;; coding: iso-8859-1 -;; End: - -;;; message.el ends here diff --git a/lisp/messagexmas.el b/lisp/messagexmas.el deleted file mode 100644 index a82b64e..0000000 --- a/lisp/messagexmas.el +++ /dev/null @@ -1,132 +0,0 @@ -;;; messagexmas.el --- XEmacs extensions to message - -;; Copyright (C) 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: mail, news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(require 'nnheader) - -(defvar message-xmas-dont-activate-region t - "If t, don't activate region after yanking.") - -(defvar message-xmas-glyph-directory nil - "*Directory where Message logos and icons are located. -If this variable is nil, Message will try to locate the directory -automatically.") - -(defvar message-use-toolbar (if (featurep 'toolbar) - 'default-toolbar - nil) - "*If nil, do not use a toolbar. -If it is non-nil, it must be a toolbar. The five valid values are -`default-toolbar', `top-toolbar', `bottom-toolbar', -`right-toolbar', and `left-toolbar'.") - -(defvar message-toolbar - '([message-spell ispell-message t "Spell"] - [message-help (Info-goto-node "(Message)Top") t "Message help"]) - "The message buffer toolbar.") - -(defun message-xmas-find-glyph-directory (&optional package) - (setq package (or package "message")) - (let ((dir (symbol-value - (intern-soft (concat package "-xmas-glyph-directory"))))) - (if (and (stringp dir) (file-directory-p dir)) - dir - (nnheader-find-etc-directory package)))) - -(defun message-xmas-setup-toolbar (bar &optional force package) - (let ((dir (message-xmas-find-glyph-directory package)) - (xpm (if (featurep 'xpm) "xpm" "xbm")) - icon up down disabled name) - (unless package - (setq message-xmas-glyph-directory dir)) - (when dir - (while bar - (setq icon (aref (car bar) 0) - name (symbol-name icon) - bar (cdr bar)) - (when (or force - (not (boundp icon))) - (setq up (concat dir name "-up." xpm)) - (setq down (concat dir name "-down." xpm)) - (setq disabled (concat dir name "-disabled." xpm)) - (if (not (file-exists-p up)) - (setq bar nil - dir nil) - (set icon (toolbar-make-button-list - up (and (file-exists-p down) down) - (and (file-exists-p disabled) disabled))))))) - dir)) - -(defun message-setup-toolbar () - (and message-use-toolbar - (message-xmas-setup-toolbar message-toolbar) - (set-specifier (symbol-value message-use-toolbar) - (cons (current-buffer) message-toolbar)))) - -(defun message-xmas-exchange-point-and-mark () - "Exchange point and mark, but allow for XEmacs' optional argument." - (exchange-point-and-mark message-xmas-dont-activate-region)) - -(defun message-xmas-maybe-fontify () - (when (featurep 'font-lock) - (font-lock-set-defaults))) - -(defun message-xmas-make-caesar-translation-table (n) - "Create a rot table with offset N." - (let ((i -1) - (table (make-string 256 0)) - (a (char-int ?a)) - (A (char-int ?A))) - (while (< (incf i) 256) - (aset table i i)) - (concat - (substring table 0 A) - (substring table (+ A n) (+ A n (- 26 n))) - (substring table A (+ A n)) - (substring table (+ A 26) a) - (substring table (+ a n) (+ a n (- 26 n))) - (substring table a (+ a n)) - (substring table (+ a 26) 255)))) - -(add-hook 'message-mode-hook 'message-xmas-maybe-fontify) - -(defun message-xmas-redefine () - "Redefine message functions for XEmacs." - (defalias 'message-exchange-point-and-mark - 'message-xmas-exchange-point-and-mark) - - (when (>= emacs-major-version 20) - (defalias 'message-make-caesar-translation-table - 'message-xmas-make-caesar-translation-table))) - -(message-xmas-redefine) - -(provide 'messagexmas) - -;;; messagexmas.el ends here diff --git a/lisp/messcompat.el b/lisp/messcompat.el deleted file mode 100644 index e3021ce..0000000 --- a/lisp/messcompat.el +++ /dev/null @@ -1,94 +0,0 @@ -;;; messcompat.el --- making message mode compatible with mail mode - -;; Copyright (C) 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: mail, news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; This file tries to provide backward compatability with sendmail.el -;; for Message mode. It should be used by simply adding -;; -;; (require 'messcompat) -;; -;; to the .emacs file. Loading it after Message mode has been -;; loaded will have no effect. - -;;; Code: - -(require 'sendmail) - -(defvar message-from-style mail-from-style - "*Specifies how \"From\" headers look. - -If `nil', they contain just the return address like: - king@grassland.com -If `parens', they look like: - king@grassland.com (Elvis Parsley) -If `angles', they look like: - Elvis Parsley - -Otherwise, most addresses look like `angles', but they look like -`parens' if `angles' would need quoting and `parens' would not.") - -(defvar message-interactive mail-interactive - "Non-nil means when sending a message wait for and display errors. -nil means let mailer mail back a message to report errors.") - -(defvar message-setup-hook mail-setup-hook - "Normal hook, run each time a new outgoing message is initialized. -The function `message-setup' runs this hook.") - -(if (boundp 'mail-mode-hook) - (defvar message-mode-hook mail-mode-hook - "Hook run in message mode buffers.")) - -(defvar message-indentation-spaces mail-indentation-spaces - "*Number of spaces to insert at the beginning of each cited line. -Used by `message-yank-original' via `message-yank-cite'.") - -(defvar message-signature mail-signature - "*String to be inserted at the end of the message buffer. -If t, the `message-signature-file' file will be inserted instead. -If a function, the result from the function will be used instead. -If a form, the result from the form will be used instead.") - -;; Deleted the autoload cookie because this crashes in loaddefs.el. -(defvar message-signature-file mail-signature-file - "*File containing the text inserted at end of the message buffer.") - -(defvar message-default-headers mail-default-headers - "*A string containing header lines to be inserted in outgoing messages. -It is inserted before you edit the message, so you can edit or delete -these lines.") - -(defvar message-send-hook mail-send-hook - "Hook run before sending messages.") - -(defvar message-send-mail-function send-mail-function - "Function to call to send the current buffer as mail. -The headers should be delimited by a line whose contents match the -variable `mail-header-separator'.") - -(provide 'messcompat) - -;;; messcompat.el ends here diff --git a/lisp/mm-bodies.el b/lisp/mm-bodies.el deleted file mode 100644 index dacb792..0000000 --- a/lisp/mm-bodies.el +++ /dev/null @@ -1,292 +0,0 @@ -;;; mm-bodies.el --- Functions for decoding MIME things -;; Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; MORIOKA Tomohiko -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-and-compile - (or (fboundp 'base64-decode-region) - (require 'base64))) - -(eval-when-compile - (defvar mm-uu-decode-function) - (defvar mm-uu-binhex-decode-function)) - -(require 'mm-util) -(require 'rfc2047) -(require 'mm-encode) - -;; 8bit treatment gets any char except: 0x32 - 0x7f, CR, LF, TAB, BEL, -;; BS, vertical TAB, form feed, and ^_ -(defvar mm-7bit-chars "\x20-\x7f\r\n\t\x7\x8\xb\xc\x1f") - -(defcustom mm-body-charset-encoding-alist - '((iso-2022-jp . 7bit) - (iso-2022-jp-2 . 7bit)) - "Alist of MIME charsets to encodings. -Valid encodings are `7bit', `8bit', `quoted-printable' and `base64'." - :type '(repeat (cons (symbol :tag "charset") - (choice :tag "encoding" - (const 7bit) - (const 8bit) - (const quoted-printable) - (const base64)))) - :group 'mime) - -(defun mm-encode-body (&optional charset) - "Encode a body. -Should be called narrowed to the body that is to be encoded. -If there is more than one non-ASCII MULE charset, then list of found -MULE charsets are returned. -If CHARSET is non-nil, it is used. -If successful, the MIME charset is returned. -If no encoding was done, nil is returned." - (if (not (mm-multibyte-p)) - ;; In the non-Mule case, we search for non-ASCII chars and - ;; return the value of `mail-parse-charset' if any are found. - (or charset - (save-excursion - (goto-char (point-min)) - (if (re-search-forward "[^\x0-\x7f]" nil t) - (or mail-parse-charset - (message-options-get 'mm-encody-body-charset) - (message-options-set - 'mm-encody-body-charset - (mm-read-charset "Charset used in the article: "))) - ;; The logic in `mml-generate-mime-1' confirms that it's OK - ;; to return nil here. - nil))) - (save-excursion - (if charset - (progn - (mm-encode-coding-region (point-min) (point-max) charset) - charset) - (goto-char (point-min)) - (let ((charsets (mm-find-mime-charset-region (point-min) (point-max))) - start) - (cond - ;; No encoding. - ((null charsets) - nil) - ;; Too many charsets. - ((> (length charsets) 1) - charsets) - ;; We encode. - (t - (setq charset (car charsets)) - (while (not (eobp)) - (if (eq (mm-charset-after) 'ascii) - (when start - (save-restriction - (narrow-to-region start (point)) - (mm-encode-coding-region - start (point) (mm-charset-to-coding-system charset)) - (goto-char (point-max))) - (setq start nil)) - (unless start - (setq start (point)))) - (forward-char 1)) - (when start - (mm-encode-coding-region start (point) - (mm-charset-to-coding-system charset)) - (setq start nil)) - charset))))))) - -(defun mm-long-lines-p (length) - "Say whether any of the lines in the buffer is longer than LINES." - (save-excursion - (goto-char (point-min)) - (end-of-line) - (while (and (not (eobp)) - (not (> (current-column) length))) - (forward-line 1) - (end-of-line)) - (and (> (current-column) length) - (current-column)))) - -(defvar message-posting-charset) - -(defun mm-body-encoding (charset &optional encoding) - "Do Content-Transfer-Encoding and return the encoding of the current buffer." - (let ((bits (mm-body-7-or-8)) - (longp (mm-long-lines-p 1000))) - (require 'message) - (cond - ((and (not mm-use-ultra-safe-encoding) - (not longp) - (eq bits '7bit)) - bits) - ((and (not mm-use-ultra-safe-encoding) - (not longp) - (or (eq t (cdr message-posting-charset)) - (memq charset (cdr message-posting-charset)) - (eq charset mail-parse-charset))) - bits) - (t - (let ((encoding (or encoding - (cdr (assq charset mm-body-charset-encoding-alist)) - (mm-qp-or-base64)))) - (when mm-use-ultra-safe-encoding - (setq encoding (mm-safer-encoding encoding))) - (mm-encode-content-transfer-encoding encoding "text/plain") - encoding))))) - -(defun mm-body-7-or-8 () - "Say whether the body is 7bit or 8bit." - (cond - ((not (featurep 'mule)) - (if (save-excursion - (goto-char (point-min)) - (skip-chars-forward mm-7bit-chars) - (eobp)) - '7bit - '8bit)) - (t - ;; Mule version - (if (and (null (delq 'ascii - (mm-find-charset-region (point-min) (point-max)))) - ;;!!!The following is necessary because the function - ;;!!!above seems to return the wrong result under - ;;!!!Emacs 20.3. Sometimes. - (save-excursion - (goto-char (point-min)) - (skip-chars-forward mm-7bit-chars) - (eobp))) - '7bit - '8bit)))) - -;;; -;;; Functions for decoding -;;; - -(defun mm-decode-content-transfer-encoding (encoding &optional type) - "Decodes buffer encoded with ENCODING, returning success status. -If TYPE is `text/plain' CRLF->LF translation may occur." - (prog1 - (condition-case error - (cond - ((eq encoding 'quoted-printable) - (quoted-printable-decode-region (point-min) (point-max)) - t) - ((eq encoding 'base64) - (base64-decode-region - (point-min) - ;; Some mailers insert whitespace - ;; junk at the end which - ;; base64-decode-region dislikes. - ;; Also remove possible junk which could - ;; have been added by mailing list software. - (save-excursion - (goto-char (point-min)) - (while (re-search-forward "^[\t ]*\r?\n" nil t) - (delete-region (match-beginning 0) (match-end 0))) - (goto-char (point-max)) - (when (re-search-backward "^[A-Za-z0-9+/]+=*[\t ]*$" nil t) - (forward-line)) - (point)))) - ((memq encoding '(7bit 8bit binary)) - ;; Do nothing. - t) - ((null encoding) - ;; Do nothing. - t) - ((memq encoding '(x-uuencode x-uue)) - (require 'mm-uu) - (funcall mm-uu-decode-function (point-min) (point-max)) - t) - ((eq encoding 'x-binhex) - (require 'mm-uu) - (funcall mm-uu-binhex-decode-function (point-min) (point-max)) - t) - ((functionp encoding) - (funcall encoding (point-min) (point-max)) - t) - (t - (message "Unknown encoding %s; defaulting to 8bit" encoding))) - (error - (message "Error while decoding: %s" error) - nil)) - (when (and - (memq encoding '(base64 x-uuencode x-uue x-binhex)) - (equal type "text/plain")) - (goto-char (point-min)) - (while (search-forward "\r\n" nil t) - (replace-match "\n" t t))))) - -(defun mm-decode-body (charset &optional encoding type) - "Decode the current article that has been encoded with ENCODING. -The characters in CHARSET should then be decoded." - (if (stringp charset) - (setq charset (intern (downcase charset)))) - (if (or (not charset) - (eq 'gnus-all mail-parse-ignored-charsets) - (memq 'gnus-all mail-parse-ignored-charsets) - (memq charset mail-parse-ignored-charsets)) - (setq charset mail-parse-charset)) - (save-excursion - (when encoding - (mm-decode-content-transfer-encoding encoding type)) - (when (featurep 'mule) - (let ((coding-system (mm-charset-to-coding-system charset))) - (if (and (not coding-system) - (listp mail-parse-ignored-charsets) - (memq 'gnus-unknown mail-parse-ignored-charsets)) - (setq coding-system - (mm-charset-to-coding-system mail-parse-charset))) - (when (and charset coding-system - ;; buffer-file-coding-system - ;;Article buffer is nil coding system - ;;in XEmacs - (mm-multibyte-p) - (or (not (eq coding-system 'ascii)) - (setq coding-system mail-parse-charset)) - (not (eq coding-system 'gnus-decoded))) - (mm-decode-coding-region (point-min) (point-max) coding-system)))))) - -(defun mm-decode-string (string charset) - "Decode STRING with CHARSET." - (when (stringp charset) - (setq charset (intern (downcase charset)))) - (when (or (not charset) - (eq 'gnus-all mail-parse-ignored-charsets) - (memq 'gnus-all mail-parse-ignored-charsets) - (memq charset mail-parse-ignored-charsets)) - (setq charset mail-parse-charset)) - (or - (when (featurep 'mule) - (let ((coding-system (mm-charset-to-coding-system charset))) - (if (and (not coding-system) - (listp mail-parse-ignored-charsets) - (memq 'gnus-unknown mail-parse-ignored-charsets)) - (setq coding-system - (mm-charset-to-coding-system mail-parse-charset))) - (when (and charset coding-system - (mm-multibyte-p) - (or (not (eq coding-system 'ascii)) - (setq coding-system mail-parse-charset))) - (mm-decode-coding-string string coding-system)))) - string)) - -(provide 'mm-bodies) - -;;; mm-bodies.el ends here diff --git a/lisp/mm-decode.el b/lisp/mm-decode.el deleted file mode 100644 index d300c6e..0000000 --- a/lisp/mm-decode.el +++ /dev/null @@ -1,1350 +0,0 @@ -;;; mm-decode.el --- Functions for decoding MIME things -;; Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; MORIOKA Tomohiko -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; Jaap-Henk Hoepman (jhh@xs4all.nl): -;; -;; Added support for delayed destroy of external MIME viewers. All external -;; viewers for mime types in mm-keep-viewer-alive-types will remain active -;; after switching articles or groups, and will only be removed when exiting -;; gnus. -;; - -;;; Code: - -(require 'mail-parse) -(require 'gnus-mailcap) -(require 'mm-bodies) -(eval-when-compile (require 'cl) - (require 'term)) - -(eval-and-compile - (autoload 'mm-inline-partial "mm-partial") - (autoload 'mm-inline-external-body "mm-extern") - (autoload 'mm-insert-inline "mm-view")) - -(add-hook 'gnus-exit-gnus-hook 'mm-destroy-postponed-undisplay-list) - -(defgroup mime-display () - "Display of MIME in mail and news articles." - :link '(custom-manual "(emacs-mime)Customization") - :version "21.1" - :group 'mail - :group 'news - :group 'multimedia) - -(defgroup mime-security () - "MIME security in mail and news articles." - :link '(custom-manual "(emacs-mime)Customization") - :group 'mail - :group 'news - :group 'multimedia) - -;;; Convenience macros. - -(defmacro mm-handle-buffer (handle) - `(nth 0 ,handle)) -(defmacro mm-handle-type (handle) - `(nth 1 ,handle)) -(defsubst mm-handle-media-type (handle) - (if (stringp (car handle)) - (car handle) - (car (mm-handle-type handle)))) -(defsubst mm-handle-media-supertype (handle) - (car (split-string (mm-handle-media-type handle) "/"))) -(defsubst mm-handle-media-subtype (handle) - (cadr (split-string (mm-handle-media-type handle) "/"))) -(defmacro mm-handle-encoding (handle) - `(nth 2 ,handle)) -(defmacro mm-handle-undisplayer (handle) - `(nth 3 ,handle)) -(defmacro mm-handle-set-undisplayer (handle function) - `(setcar (nthcdr 3 ,handle) ,function)) -(defmacro mm-handle-disposition (handle) - `(nth 4 ,handle)) -(defmacro mm-handle-description (handle) - `(nth 5 ,handle)) -(defmacro mm-handle-cache (handle) - `(nth 6 ,handle)) -(defmacro mm-handle-set-cache (handle contents) - `(setcar (nthcdr 6 ,handle) ,contents)) -(defmacro mm-handle-id (handle) - `(nth 7 ,handle)) -(defmacro mm-handle-multipart-original-buffer (handle) - `(get-text-property 0 'buffer (car ,handle))) -(defmacro mm-handle-multipart-from (handle) - `(get-text-property 0 'from (car ,handle))) -(defmacro mm-handle-multipart-ctl-parameter (handle parameter) - `(get-text-property 0 ,parameter (car ,handle))) - -(defmacro mm-make-handle (&optional buffer type encoding undisplayer - disposition description cache - id) - `(list ,buffer ,type ,encoding ,undisplayer - ,disposition ,description ,cache ,id)) - -(defcustom mm-inline-media-tests - '(("image/jpeg" - mm-inline-image - (lambda (handle) - (mm-valid-and-fit-image-p 'jpeg handle))) - ("image/png" - mm-inline-image - (lambda (handle) - (mm-valid-and-fit-image-p 'png handle))) - ("image/gif" - mm-inline-image - (lambda (handle) - (mm-valid-and-fit-image-p 'gif handle))) - ("image/tiff" - mm-inline-image - (lambda (handle) - (mm-valid-and-fit-image-p 'tiff handle)) ) - ("image/xbm" - mm-inline-image - (lambda (handle) - (mm-valid-and-fit-image-p 'xbm handle))) - ("image/x-xbitmap" - mm-inline-image - (lambda (handle) - (mm-valid-and-fit-image-p 'xbm handle))) - ("image/xpm" - mm-inline-image - (lambda (handle) - (mm-valid-and-fit-image-p 'xpm handle))) - ("image/x-pixmap" - mm-inline-image - (lambda (handle) - (mm-valid-and-fit-image-p 'xpm handle))) - ("image/bmp" - mm-inline-image - (lambda (handle) - (mm-valid-and-fit-image-p 'bmp handle))) - ("image/x-portable-bitmap" - mm-inline-image - (lambda (handle) - (mm-valid-and-fit-image-p 'pbm handle))) - ("text/plain" mm-inline-text identity) - ("text/enriched" mm-inline-text identity) - ("text/richtext" mm-inline-text identity) - ("text/x-patch" mm-display-patch-inline - (lambda (handle) - (locate-library "diff-mode"))) - ("application/emacs-lisp" mm-display-elisp-inline identity) - ("text/html" - mm-inline-text - (lambda (handle) - (locate-library "w3"))) - ("text/x-vcard" - mm-inline-text - (lambda (handle) - (or (featurep 'vcard) - (locate-library "vcard")))) - ("message/delivery-status" mm-inline-text identity) - ("message/rfc822" mm-inline-message identity) - ("message/partial" mm-inline-partial identity) - ("message/external-body" mm-inline-external-body identity) - ("text/.*" mm-inline-text identity) - ("audio/wav" mm-inline-audio - (lambda (handle) - (and (or (featurep 'nas-sound) (featurep 'native-sound)) - (device-sound-enabled-p)))) - ("audio/au" - mm-inline-audio - (lambda (handle) - (and (or (featurep 'nas-sound) (featurep 'native-sound)) - (device-sound-enabled-p)))) - ("application/pgp-signature" ignore identity) - ("application/x-pkcs7-signature" ignore identity) - ("application/pkcs7-signature" ignore identity) - ("application/x-pkcs7-mime" ignore identity) - ("application/pkcs7-mime" ignore identity) - ("multipart/alternative" ignore identity) - ("multipart/mixed" ignore identity) - ("multipart/related" ignore identity) - ;; Disable audio and image - ("audio/.*" ignore ignore) - ("image/.*" ignore ignore) - ;; Default to displaying as text - (".*" mm-inline-text mm-readable-p)) - "Alist of media types/tests saying whether types can be displayed inline." - :type '(repeat (list (string :tag "MIME type") - (function :tag "Display function") - (function :tag "Display test"))) - :group 'mime-display) - -(defcustom mm-inlined-types - '("image/.*" "text/.*" "message/delivery-status" "message/rfc822" - "message/partial" "message/external-body" "application/emacs-lisp" - "application/pgp-signature" "application/x-pkcs7-signature" - "application/pkcs7-signature" "application/x-pkcs7-mime" - "application/pkcs7-mime") - "List of media types that are to be displayed inline. -See also `mm-inline-media-tests', which says how to display a media -type inline." - :type '(repeat string) - :group 'mime-display) - -(defcustom mm-keep-viewer-alive-types - '("application/postscript" "application/msword" "application/vnd.ms-excel" - "application/pdf" "application/x-dvi") - "List of media types for which the external viewer will not be killed -when selecting a different article." - :type '(repeat string) - :group 'mime-display) - -(defcustom mm-automatic-display - '("text/plain" "text/enriched" "text/richtext" "text/html" - "text/x-vcard" "image/.*" "message/delivery-status" "multipart/.*" - "message/rfc822" "text/x-patch" "application/pgp-signature" - "application/emacs-lisp" "application/x-pkcs7-signature" - "application/pkcs7-signature" "application/x-pkcs7-mime" - "application/pkcs7-mime") - "A list of MIME types to be displayed automatically." - :type '(repeat string) - :group 'mime-display) - -(defcustom mm-attachment-override-types '("text/x-vcard" - "application/pkcs7-mime" - "application/x-pkcs7-mime") - "Types to have \"attachment\" ignored if they can be displayed inline." - :type '(repeat string) - :group 'mime-display) - -(defcustom mm-inline-override-types nil - "Types to be treated as attachments even if they can be displayed inline." - :type '(repeat string) - :group 'mime-display) - -(defcustom mm-automatic-external-display nil - "List of MIME type regexps that will be displayed externally automatically." - :type '(repeat string) - :group 'mime-display) - -(defcustom mm-discouraged-alternatives nil - "List of MIME types that are discouraged when viewing multipart/alternative. -Viewing agents are supposed to view the last possible part of a message, -as that is supposed to be the richest. However, users may prefer other -types instead, and this list says what types are most unwanted. If, -for instance, text/html parts are very unwanted, and text/richtext are -somewhat unwanted, then the value of this variable should be set -to: - - (\"text/html\" \"text/richtext\")" - :type '(repeat string) - :group 'mime-display) - -(defcustom mm-tmp-directory - (cond ((fboundp 'temp-directory) (temp-directory)) - ((boundp 'temporary-file-directory) temporary-file-directory) - ("/tmp/")) - "Where mm will store its temporary files." - :type 'directory - :group 'mime-display) - -(defcustom mm-inline-large-images nil - "If non-nil, then all images fit in the buffer." - :type 'boolean - :group 'mime-display) - -(defvar mm-file-name-rewrite-functions nil - "*List of functions used for rewriting file names of MIME parts. -Each function takes a file name as input and returns a file name. - -Ready-made functions include -`mm-file-name-delete-whitespace', -`mm-file-name-trim-whitespace', -`mm-file-name-collapse-whitespace', -`mm-file-name-replace-whitespace', -`capitalize', `downcase', `upcase', and -`upcase-initials'.") - -(defvar mm-path-name-rewrite-functions nil - "*List of functions used for rewriting path names of MIME parts. -This is used when viewing parts externally , and is meant for -transforming the path name so that non-compliant programs can -find the file where it's saved. - -Each function takes a file name as input and returns a file name.") - -(defvar mm-file-name-replace-whitespace nil - "String used for replacing whitespace characters; default is `\"_\"'.") - -(defcustom mm-default-directory nil - "The default directory where mm will save files. -If not set, `default-directory' will be used." - :type 'directory - :group 'mime-display) - -(defcustom mm-external-terminal-program "xterm" - "The program to start an external terminal." - :type 'string - :group 'mime-display) - -;;; Internal variables. - -(defvar mm-dissection-list nil) -(defvar mm-last-shell-command "") -(defvar mm-content-id-alist nil) -(defvar mm-postponed-undisplay-list nil) - -;; According to RFC2046, in particular, in a digest, the default -;; Content-Type value for a body part is changed from "text/plain" to -;; "message/rfc822". -(defvar mm-dissect-default-type "text/plain") - -(autoload 'mml2015-verify "mml2015") -(autoload 'mml2015-verify-test "mml2015") -(autoload 'mml-smime-verify "mml-smime") -(autoload 'mml-smime-verify-test "mml-smime") - -(defvar mm-verify-function-alist - '(("application/pgp-signature" mml2015-verify "PGP" mml2015-verify-test) - ("application/x-gnus-pgp-signature" mm-uu-pgp-signed-extract-1 "PGP" - mm-uu-pgp-signed-test) - ("application/pkcs7-signature" mml-smime-verify "S/MIME" - mml-smime-verify-test) - ("application/x-pkcs7-signature" mml-smime-verify "S/MIME" - mml-smime-verify-test))) - -(defcustom mm-verify-option 'never - "Option of verifying signed parts. -`never', not verify; `always', always verify; -`known', only verify known protocols. Otherwise, ask user." - :type '(choice (item always) - (item never) - (item :tag "only known protocols" known) - (item :tag "ask" nil)) - :group 'mime-security) - -(autoload 'mml2015-decrypt "mml2015") -(autoload 'mml2015-decrypt-test "mml2015") - -(defvar mm-decrypt-function-alist - '(("application/pgp-encrypted" mml2015-decrypt "PGP" mml2015-decrypt-test) - ("application/x-gnus-pgp-encrypted" mm-uu-pgp-encrypted-extract-1 "PGP" - mm-uu-pgp-encrypted-test))) - -(defcustom mm-decrypt-option nil - "Option of decrypting encrypted parts. -`never', not decrypt; `always', always decrypt; -`known', only decrypt known protocols. Otherwise, ask user." - :type '(choice (item always) - (item never) - (item :tag "only known protocols" known) - (item :tag "ask" nil)) - :group 'mime-security) - -(defvar mm-viewer-completion-map - (let ((map (make-sparse-keymap 'mm-viewer-completion-map))) - (set-keymap-parent map minibuffer-local-completion-map) - map) - "Keymap for input viewer with completion.") - -;; Should we bind other key to minibuffer-complete-word? -(define-key mm-viewer-completion-map " " 'self-insert-command) - -(defvar mm-viewer-completion-map - (let ((map (make-sparse-keymap 'mm-viewer-completion-map))) - (set-keymap-parent map minibuffer-local-completion-map) - map) - "Keymap for input viewer with completion.") - -;; Should we bind other key to minibuffer-complete-word? -(define-key mm-viewer-completion-map " " 'self-insert-command) - -;;; The functions. - -(defun mm-alist-to-plist (alist) - "Convert association list ALIST into the equivalent property-list form. -The plist is returned. This converts from - -\((a . 1) (b . 2) (c . 3)) - -into - -\(a 1 b 2 c 3) - -The original alist is not modified. See also `destructive-alist-to-plist'." - (let (plist) - (while alist - (let ((el (car alist))) - (setq plist (cons (cdr el) (cons (car el) plist)))) - (setq alist (cdr alist))) - (nreverse plist))) - -(defun mm-keep-viewer-alive-p (handle) - "Say whether external viewer for HANDLE should stay alive." - (let ((types mm-keep-viewer-alive-types) - (type (mm-handle-media-type handle)) - ty) - (catch 'found - (while (setq ty (pop types)) - (when (string-match ty type) - (throw 'found t)))))) - -(defun mm-handle-set-external-undisplayer (handle function) - "Set the undisplayer for this handle; postpone undisplaying of viewers -for types in mm-keep-viewer-alive-types." - (if (mm-keep-viewer-alive-p handle) - (let ((new-handle (copy-sequence handle))) - (mm-handle-set-undisplayer new-handle function) - (mm-handle-set-undisplayer handle nil) - (push new-handle mm-postponed-undisplay-list)) - (mm-handle-set-undisplayer handle function))) - -(defun mm-destroy-postponed-undisplay-list () - (when mm-postponed-undisplay-list - (message "Destroying external MIME viewers") - (mm-destroy-parts mm-postponed-undisplay-list))) - -(defun mm-dissect-buffer (&optional no-strict-mime) - "Dissect the current buffer and return a list of MIME handles." - (save-excursion - (let (ct ctl type subtype cte cd description id result from) - (save-restriction - (mail-narrow-to-head) - (when (or no-strict-mime - (mail-fetch-field "mime-version")) - (setq ct (mail-fetch-field "content-type") - ctl (ignore-errors (mail-header-parse-content-type ct)) - cte (mail-fetch-field "content-transfer-encoding") - cd (mail-fetch-field "content-disposition") - description (mail-fetch-field "content-description") - from (mail-fetch-field "from") - id (mail-fetch-field "content-id")) - ;; FIXME: In some circumstances, this code is running within - ;; an unibyte macro. mail-extract-address-components - ;; creates unibyte buffers. This `if', though not a perfect - ;; solution, avoids most of them. - (if from - (setq from (cadr (mail-extract-address-components from)))))) - (when cte - (setq cte (mail-header-strip cte))) - (if (or (not ctl) - (not (string-match "/" (car ctl)))) - (mm-dissect-singlepart - (list mm-dissect-default-type) - (and cte (intern (downcase (mail-header-remove-whitespace - (mail-header-remove-comments - cte))))) - no-strict-mime - (and cd (ignore-errors (mail-header-parse-content-disposition cd))) - description) - (setq type (split-string (car ctl) "/")) - (setq subtype (cadr type) - type (pop type)) - (setq - result - (cond - ((equal type "multipart") - (let ((mm-dissect-default-type (if (equal subtype "digest") - "message/rfc822" - "text/plain"))) - (add-text-properties 0 (length (car ctl)) - (mm-alist-to-plist (cdr ctl)) (car ctl)) - - ;; what really needs to be done here is a way to link a - ;; MIME handle back to it's parent MIME handle (in a multilevel - ;; MIME article). That would probably require changing - ;; the mm-handle API so we simply store the multipart buffert - ;; name as a text property of the "multipart/whatever" string. - (add-text-properties 0 (length (car ctl)) - (list 'buffer (mm-copy-to-buffer)) - (car ctl)) - (add-text-properties 0 (length (car ctl)) - (list 'from from) - (car ctl)) - (cons (car ctl) (mm-dissect-multipart ctl)))) - (t - (mm-possibly-verify-or-decrypt - (mm-dissect-singlepart - ctl - (and cte (intern (downcase (mail-header-remove-whitespace - (mail-header-remove-comments - cte))))) - no-strict-mime - (and cd (ignore-errors - (mail-header-parse-content-disposition cd))) - description id) - ctl)))) - (when id - (when (string-match " *<\\(.*\\)> *" id) - (setq id (match-string 1 id))) - (push (cons id result) mm-content-id-alist)) - result)))) - -(defun mm-dissect-singlepart (ctl cte &optional force cdl description id) - (when (or force - (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) - res))) - -(defun mm-remove-all-parts () - "Remove all MIME handles." - (interactive) - (mapcar 'mm-remove-part mm-dissection-list) - (setq mm-dissection-list nil)) - -(defun mm-dissect-multipart (ctl) - (goto-char (point-min)) - (let* ((boundary (concat "\n--" (mail-content-type-get ctl 'boundary))) - (close-delimiter (concat (regexp-quote boundary) "--[ \t]*$")) - start parts - (end (save-excursion - (goto-char (point-max)) - (if (re-search-backward close-delimiter nil t) - (match-beginning 0) - (point-max))))) - (setq boundary (concat (regexp-quote boundary) "[ \t]*$")) - (while (and (< (point) end) (re-search-forward boundary end t)) - (goto-char (match-beginning 0)) - (when start - (save-excursion - (save-restriction - (narrow-to-region start (point)) - (setq parts (nconc (list (mm-dissect-buffer t)) parts))))) - (forward-line 2) - (setq start (point))) - (when (and start (< start end)) - (save-excursion - (save-restriction - (narrow-to-region start end) - (setq parts (nconc (list (mm-dissect-buffer t)) parts))))) - (mm-possibly-verify-or-decrypt (nreverse parts) ctl))) - -(defun mm-copy-to-buffer () - "Copy the contents of the current buffer to a fresh buffer." - (save-excursion - (let ((flag enable-multibyte-characters) - (new-buffer (generate-new-buffer " *mm*"))) - (goto-char (point-min)) - (search-forward-regexp "^\n" nil t) - (save-restriction - (narrow-to-region (point) (point-max)) - (when flag - (set-buffer-multibyte nil)) - (copy-to-buffer new-buffer (point-min) (point-max)) - (when flag - (set-buffer-multibyte t))) - new-buffer))) - -(defun mm-display-parts (handle &optional no-default) - (if (stringp (car handle)) - (mapcar 'mm-display-parts (cdr handle)) - (if (bufferp (car handle)) - (save-restriction - (narrow-to-region (point) (point)) - (mm-display-part handle) - (goto-char (point-max))) - (mapcar 'mm-display-parts handle)))) - -(defun mm-display-part (handle &optional no-default) - "Display the MIME part represented by HANDLE. -Returns nil if the part is removed; inline if displayed inline; -external if displayed external." - (save-excursion - (mailcap-parse-mailcaps) - (if (mm-handle-displayed-p handle) - (mm-remove-part handle) - (let* ((type (mm-handle-media-type handle)) - (method (mailcap-mime-info type))) - (if (and (mm-inlinable-p handle) - (mm-inlined-p handle)) - (progn - (forward-line 1) - (mm-display-inline handle) - 'inline) - (when (or method - (not no-default)) - (if (and (not method) - (equal "text" (car (split-string type)))) - (progn - (forward-line 1) - (mm-insert-inline handle (mm-get-part handle)) - 'inline) - (mm-display-external - handle (or method 'mailcap-save-binary-file))))))))) - -(defun mm-display-external (handle method) - "Display HANDLE using METHOD." - (let ((outbuf (current-buffer))) - (mm-with-unibyte-buffer - (if (functionp method) - (let ((cur (current-buffer))) - (if (eq method 'mailcap-save-binary-file) - (progn - (set-buffer (generate-new-buffer " *mm*")) - (setq method nil)) - (mm-insert-part handle) - (let ((win (get-buffer-window cur t))) - (when win - (select-window win))) - (switch-to-buffer (generate-new-buffer " *mm*"))) - (buffer-disable-undo) - (mm-set-buffer-file-coding-system mm-binary-coding-system) - (insert-buffer-substring cur) - (goto-char (point-min)) - (message "Viewing with %s" method) - (let ((mm (current-buffer)) - (non-viewer (assq 'non-viewer - (mailcap-mime-info - (mm-handle-media-type handle) t)))) - (unwind-protect - (if method - (funcall method) - (mm-save-part handle)) - (when (and (not non-viewer) - method) - (mm-handle-set-undisplayer handle mm))))) - ;; The function is a string to be executed. - (mm-insert-part handle) - (let* ((dir (make-temp-name - (expand-file-name "emm." mm-tmp-directory))) - (filename (or - (mail-content-type-get - (mm-handle-disposition handle) 'filename) - (mail-content-type-get - (mm-handle-type handle) 'name))) - (mime-info (mailcap-mime-info - (mm-handle-media-type handle) t)) - (needsterm (or (assoc "needsterm" mime-info) - (assoc "needsterminal" mime-info))) - (copiousoutput (assoc "copiousoutput" mime-info)) - file buffer) - ;; We create a private sub-directory where we store our files. - (make-directory dir) - (set-file-modes dir 448) - (if filename - (setq file (expand-file-name (file-name-nondirectory filename) - dir)) - (setq file (make-temp-name (expand-file-name "mm." dir)))) - (let ((coding-system-for-write mm-binary-coding-system)) - (write-region (point-min) (point-max) file nil 'nomesg)) - (message "Viewing with %s" method) - (cond - (needsterm - (unwind-protect - (if window-system - (start-process "*display*" nil - mm-external-terminal-program - "-e" shell-file-name - shell-command-switch - (mm-mailcap-command - method file (mm-handle-type handle))) - (require 'term) - (require 'gnus-win) - (set-buffer - (setq buffer - (make-term "display" - shell-file-name - nil - shell-command-switch - (mm-mailcap-command - method file - (mm-handle-type handle))))) - (term-mode) - (term-char-mode) - (set-process-sentinel - (get-buffer-process buffer) - `(lambda (process state) - (if (eq 'exit (process-status process)) - (gnus-configure-windows - ',gnus-current-window-configuration)))) - (gnus-configure-windows 'display-term)) - (mm-handle-set-external-undisplayer handle (cons file buffer))) - (message "Displaying %s..." (format method file)) - 'external) - (copiousoutput - (with-current-buffer outbuf - (forward-line 1) - (mm-insert-inline - handle - (unwind-protect - (progn - (call-process shell-file-name nil - (setq buffer - (generate-new-buffer " *mm*")) - nil - shell-command-switch - (mm-mailcap-command - method file (mm-handle-type handle))) - (if (buffer-live-p buffer) - (save-excursion - (set-buffer buffer) - (buffer-string)))) - (progn - (ignore-errors (delete-file file)) - (ignore-errors (delete-directory - (file-name-directory file))) - (ignore-errors (kill-buffer buffer)))))) - 'inline) - (t - (unwind-protect - (start-process "*display*" - (setq buffer - (generate-new-buffer " *mm*")) - shell-file-name - shell-command-switch - (mm-mailcap-command - method file (mm-handle-type handle))) - (mm-handle-set-external-undisplayer - handle (cons file buffer))) - (message "Displaying %s..." (format method file)) - '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) - (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 - (gnus-map-function mm-path-name-rewrite-functions 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) - (when uses-stdin - (push "<" out) - (push (mm-quote-arg - (gnus-map-function mm-path-name-rewrite-functions file)) - out)) - (mapconcat 'identity (nreverse out) ""))) - -(defun mm-remove-parts (handles) - "Remove the displayed MIME parts represented by HANDLES." - (if (and (listp handles) - (bufferp (car handles))) - (mm-remove-part handles) - (let (handle) - (while (setq handle (pop handles)) - (cond - ((stringp handle) - (when (buffer-live-p (get-text-property 0 'buffer handle)) - (kill-buffer (get-text-property 0 'buffer handle)))) - ((and (listp handle) - (stringp (car handle))) - (mm-remove-parts (cdr handle))) - (t - (mm-remove-part handle))))))) - -(defun mm-destroy-parts (handles) - "Remove the displayed MIME parts represented by HANDLES." - (if (and (listp handles) - (bufferp (car handles))) - (mm-destroy-part handles) - (let (handle) - (while (setq handle (pop handles)) - (cond - ((stringp handle) - (when (buffer-live-p (get-text-property 0 'buffer handle)) - (kill-buffer (get-text-property 0 'buffer handle)))) - ((and (listp handle) - (stringp (car handle))) - (mm-destroy-parts handle)) - (t - (mm-destroy-part handle))))))) - -(defun mm-remove-part (handle) - "Remove the displayed MIME part represented by HANDLE." - (when (listp handle) - (let ((object (mm-handle-undisplayer handle))) - (ignore-errors - (cond - ;; Internally displayed part. - ((mm-annotationp object) - (delete-annotation object)) - ((or (functionp object) - (and (listp object) - (eq (car object) 'lambda))) - (funcall object)) - ;; Externally displayed part. - ((consp object) - (ignore-errors (delete-file (car object))) - (ignore-errors (delete-directory (file-name-directory (car object)))) - (ignore-errors (and (cdr object) (kill-buffer (cdr object))))) - ((bufferp object) - (when (buffer-live-p object) - (kill-buffer object))))) - (mm-handle-set-undisplayer handle nil)))) - -(defun mm-display-inline (handle) - (let* ((type (mm-handle-media-type handle)) - (function (cadr (mm-assoc-string-match mm-inline-media-tests type)))) - (funcall function handle) - (goto-char (point-min)))) - -(defun mm-assoc-string-match (alist type) - (dolist (elem alist) - (when (string-match (car elem) type) - (return elem)))) - -(defun mm-automatic-display-p (handle) - "Say whether the user wants HANDLE to be displayed automatically." - (let ((methods mm-automatic-display) - (type (mm-handle-media-type handle)) - method result) - (while (setq method (pop methods)) - (when (and (not (mm-inline-override-p handle)) - (string-match method type)) - (setq result t - methods nil))) - result)) - -(defun mm-inlinable-p (handle) - "Say whether HANDLE can be displayed inline." - (let ((alist mm-inline-media-tests) - (type (mm-handle-media-type handle)) - test) - (while alist - (when (string-match (caar alist) type) - (setq test (caddar alist) - alist nil) - (setq test (funcall test handle))) - (pop alist)) - test)) - -(defun mm-inlined-p (handle) - "Say whether the user wants HANDLE to be displayed inline." - (let ((methods mm-inlined-types) - (type (mm-handle-media-type handle)) - method result) - (while (setq method (pop methods)) - (when (and (not (mm-inline-override-p handle)) - (string-match method type)) - (setq result t - methods nil))) - result)) - -(defun mm-attachment-override-p (handle) - "Say whether HANDLE should have attachment behavior overridden." - (let ((types mm-attachment-override-types) - (type (mm-handle-media-type handle)) - ty) - (catch 'found - (while (setq ty (pop types)) - (when (and (string-match ty type) - (mm-inlinable-p handle)) - (throw 'found t)))))) - -(defun mm-inline-override-p (handle) - "Say whether HANDLE should have inline behavior overridden." - (let ((types mm-inline-override-types) - (type (mm-handle-media-type handle)) - ty) - (catch 'found - (while (setq ty (pop types)) - (when (string-match ty type) - (throw 'found t)))))) - -(defun mm-automatic-external-display-p (type) - "Return the user-defined method for TYPE." - (let ((methods mm-automatic-external-display) - method result) - (while (setq method (pop methods)) - (when (string-match method type) - (setq result t - methods nil))) - result)) - -(defun mm-destroy-part (handle) - "Destroy the data structures connected to HANDLE." - (when (listp handle) - (mm-remove-part handle) - (when (buffer-live-p (mm-handle-buffer handle)) - (kill-buffer (mm-handle-buffer handle))))) - -(defun mm-handle-displayed-p (handle) - "Say whether HANDLE is displayed or not." - (mm-handle-undisplayer handle)) - -;;; -;;; Functions for outputting parts -;;; - -(defun mm-get-part (handle) - "Return the contents of HANDLE as a string." - (mm-with-unibyte-buffer - (insert (with-current-buffer (mm-handle-buffer handle) - (mm-with-unibyte-current-buffer-mule4 - (buffer-string)))) - (mm-decode-content-transfer-encoding - (mm-handle-encoding handle) - (mm-handle-media-type handle)) - (buffer-string))) - -(defun mm-insert-part (handle) - "Insert the contents of HANDLE in the current buffer." - (let ((cur (current-buffer))) - (save-excursion - (if (member (mm-handle-media-supertype handle) '("text" "message")) - (with-temp-buffer - (insert-buffer-substring (mm-handle-buffer handle)) - (prog1 - (mm-decode-content-transfer-encoding - (mm-handle-encoding handle) - (mm-handle-media-type handle)) - (let ((temp (current-buffer))) - (set-buffer cur) - (insert-buffer-substring temp)))) - (mm-with-unibyte-buffer - (insert-buffer-substring (mm-handle-buffer handle)) - (prog1 - (mm-decode-content-transfer-encoding - (mm-handle-encoding handle) - (mm-handle-media-type handle)) - (let ((temp (current-buffer))) - (set-buffer cur) - (insert-buffer-substring temp)))))))) - -(defun mm-file-name-delete-whitespace (file-name) - "Remove all whitespace characters from FILE-NAME." - (while (string-match "\\s-+" file-name) - (setq file-name (replace-match "" t t file-name))) - file-name) - -(defun mm-file-name-trim-whitespace (file-name) - "Remove leading and trailing whitespace characters from FILE-NAME." - (when (string-match "\\`\\s-+" file-name) - (setq file-name (substring file-name (match-end 0)))) - (when (string-match "\\s-+\\'" file-name) - (setq file-name (substring file-name 0 (match-beginning 0)))) - file-name) - -(defun mm-file-name-collapse-whitespace (file-name) - "Collapse multiple whitespace characters in FILE-NAME." - (while (string-match "\\s-\\s-+" file-name) - (setq file-name (replace-match " " t t file-name))) - file-name) - -(defun mm-file-name-replace-whitespace (file-name) - "Replace whitespace characters in FILE-NAME with underscores. -Set `mm-file-name-replace-whitespace' to any other string if you do not -like underscores." - (let ((s (or mm-file-name-replace-whitespace "_"))) - (while (string-match "\\s-" file-name) - (setq file-name (replace-match s t t file-name)))) - file-name) - -(defun mm-save-part (handle) - "Write HANDLE to a file." - (let* ((name (mail-content-type-get (mm-handle-type handle) 'name)) - (filename (mail-content-type-get - (mm-handle-disposition handle) 'filename)) - file) - (when filename - (setq filename (gnus-map-function mm-file-name-rewrite-functions - (file-name-nondirectory filename)))) - (setq file - (read-file-name "Save MIME part to: " - (expand-file-name - (or filename name "") - (or mm-default-directory default-directory)))) - (setq mm-default-directory (file-name-directory file)) - (and (or (not (file-exists-p file)) - (yes-or-no-p (format "File %s already exists; overwrite? " - file))) - (progn - (mm-save-part-to-file handle file) - file)))) - -(defun mm-save-part-to-file (handle file) - (mm-with-unibyte-buffer - (mm-insert-part handle) - (let ((coding-system-for-write 'binary) - ;; Don't re-compress .gz & al. Arguably we should make - ;; `file-name-handler-alist' nil, but that would chop - ;; ange-ftp, which is reasonable to use here. - (inhibit-file-name-operation 'write-region) - (inhibit-file-name-handlers - (cons 'jka-compr-handler inhibit-file-name-handlers))) - (write-region (point-min) (point-max) file)))) - -(defun mm-pipe-part (handle) - "Pipe HANDLE to a process." - (let* ((name (mail-content-type-get (mm-handle-type handle) 'name)) - (command - (read-string "Shell command on MIME part: " mm-last-shell-command))) - (mm-with-unibyte-buffer - (mm-insert-part handle) - (let ((coding-system-for-write 'binary)) - (shell-command-on-region (point-min) (point-max) command nil))))) - -(defun mm-interactively-view-part (handle) - "Display HANDLE using METHOD." - (let* ((type (mm-handle-media-type handle)) - (methods - (mapcar (lambda (i) (list (cdr (assoc 'viewer i)))) - (mailcap-mime-info type 'all))) - (method (let ((minibuffer-local-completion-map - mm-viewer-completion-map)) - (completing-read "Viewer: " methods)))) - (when (string= method "") - (error "No method given")) - (if (string-match "^[^% \t]+$" method) - (setq method (concat method " %s"))) - (mm-display-external handle method))) - -(defun mm-preferred-alternative (handles &optional preferred) - "Say which of HANDLES are preferred." - (let ((prec (if preferred (list preferred) - (mm-preferred-alternative-precedence handles))) - p h result type handle) - (while (setq p (pop prec)) - (setq h handles) - (while h - (setq handle (car h)) - (setq type (mm-handle-media-type handle)) - (when (and (equal p type) - (mm-automatic-display-p handle) - (or (stringp (car handle)) - (not (mm-handle-disposition handle)) - (equal (car (mm-handle-disposition handle)) - "inline"))) - (setq result handle - h nil - prec nil)) - (pop h))) - result)) - -(defun mm-preferred-alternative-precedence (handles) - "Return the precedence based on HANDLES and `mm-discouraged-alternatives'." - (let ((seq (nreverse (mapcar #'mm-handle-media-type - handles)))) - (dolist (disc (reverse mm-discouraged-alternatives)) - (dolist (elem (copy-sequence seq)) - (when (string-match disc elem) - (setq seq (nconc (delete elem seq) (list elem)))))) - seq)) - -(defun mm-get-content-id (id) - "Return the handle(s) referred to by ID." - (cdr (assoc id mm-content-id-alist))) - -(defconst mm-image-type-regexps - '(("/\\*.*XPM.\\*/" . xpm) - ("P[1-6]" . pbm) - ("GIF8" . gif) - ("\377\330" . jpeg) - ("\211PNG\r\n" . png) - ("#define" . xbm) - ("\\(MM\0\\*\\)\\|\\(II\\*\0\\)" . tiff) - ("%!PS" . postscript)) - "Alist of (REGEXP . IMAGE-TYPE) pairs used to auto-detect image types. -When the first bytes of an image file match REGEXP, it is assumed to -be of image type IMAGE-TYPE.") - -;; Steal from image.el. image-type-from-data suffers multi-line matching bug. -(defun mm-image-type-from-buffer () - "Determine the image type from data in the current buffer. -Value is a symbol specifying the image type or nil if type cannot -be determined." - (let ((types mm-image-type-regexps) - type) - (goto-char (point-min)) - (while (and types (null type)) - (let ((regexp (car (car types))) - (image-type (cdr (car types)))) - (when (looking-at regexp) - (setq type image-type)) - (setq types (cdr types)))) - type)) - -(defun mm-get-image (handle) - "Return an image instance based on HANDLE." - (let ((type (mm-handle-media-subtype handle)) - spec) - ;; Allow some common translations. - (setq type - (cond - ((equal type "x-pixmap") - "xpm") - ((equal type "x-xbitmap") - "xbm") - ((equal type "x-portable-bitmap") - "pbm") - (t type))) - (or (mm-handle-cache handle) - (mm-with-unibyte-buffer - (mm-insert-part handle) - (prog1 - (setq spec - (ignore-errors - ;; Avoid testing `make-glyph' since W3 may define - ;; a bogus version of it. - (if (fboundp 'create-image) - (create-image (buffer-string) - (or (mm-image-type-from-buffer) - (intern type)) - 'data-p) - (cond - ((equal type "xbm") - ;; xbm images require special handling, since - ;; the only way to create glyphs from these - ;; (without a ton of work) is to write them - ;; out to a file, and then create a file - ;; specifier. - (let ((file (make-temp-name - (expand-file-name "emm.xbm" - mm-tmp-directory)))) - (unwind-protect - (progn - (write-region (point-min) (point-max) file) - (make-glyph (list (cons 'x file)))) - (ignore-errors - (delete-file file))))) - (t - (make-glyph - (vector - (or (mm-image-type-from-buffer) - (intern type)) - :data (buffer-string)))))))) - (mm-handle-set-cache handle spec)))))) - -(defun mm-image-fit-p (handle) - "Say whether the image in HANDLE will fit the current window." - (let ((image (mm-get-image handle))) - (if (fboundp 'glyph-width) - ;; XEmacs' glyphs can actually tell us about their width, so - ;; lets be nice and smart about them. - (or mm-inline-large-images - (and (< (glyph-width image) (window-pixel-width)) - (< (glyph-height image) (window-pixel-height)))) - (let* ((size (image-size image)) - (w (car size)) - (h (cdr size))) - (or mm-inline-large-images - (and (< h (1- (window-height))) ; Don't include mode line. - (< w (window-width)))))))) - -(defun mm-valid-image-format-p (format) - "Say whether FORMAT can be displayed natively by Emacs." - (cond - ;; Handle XEmacs - ((fboundp 'valid-image-instantiator-format-p) - (valid-image-instantiator-format-p format)) - ;; Handle Emacs 21 - ((fboundp 'image-type-available-p) - (and (display-graphic-p) - (image-type-available-p format))) - ;; Nobody else can do images yet. - (t - nil))) - -(defun mm-valid-and-fit-image-p (format handle) - "Say whether FORMAT can be displayed natively and HANDLE fits the window." - (and (mm-valid-image-format-p format) - (mm-image-fit-p handle))) - -(defun mm-find-part-by-type (handles type &optional notp recursive) - "Search in HANDLES for part with TYPE. -If NOTP, returns first non-matching part. -If RECURSIVE, search recursively." - (let (handle) - (while handles - (if (and recursive (stringp (caar handles))) - (if (setq handle (mm-find-part-by-type (cdar handles) type - notp recursive)) - (setq handles nil)) - (if (if notp - (not (equal (mm-handle-media-type (car handles)) type)) - (equal (mm-handle-media-type (car handles)) type)) - (setq handle (car handles) - handles nil))) - (setq handles (cdr handles))) - handle)) - -(defun mm-find-raw-part-by-type (ctl type &optional notp) - (goto-char (point-min)) - (let* ((boundary (concat "--" (mm-handle-multipart-ctl-parameter ctl - 'boundary))) - (close-delimiter (concat "^" (regexp-quote boundary) "--[ \t]*$")) - start - (end (save-excursion - (goto-char (point-max)) - (if (re-search-backward close-delimiter nil t) - (match-beginning 0) - (point-max)))) - result) - (setq boundary (concat "^" (regexp-quote boundary) "[ \t]*$")) - (while (and (not result) - (re-search-forward boundary end t)) - (goto-char (match-beginning 0)) - (when start - (save-excursion - (save-restriction - (narrow-to-region start (1- (point))) - (when (let ((ctl (ignore-errors - (mail-header-parse-content-type - (mail-fetch-field "content-type"))))) - (if notp - (not (equal (car ctl) type)) - (equal (car ctl) type))) - (setq result (buffer-substring (point-min) (point-max))))))) - (forward-line 1) - (setq start (point))) - (when (and (not result) start) - (save-excursion - (save-restriction - (narrow-to-region start end) - (when (let ((ctl (ignore-errors - (mail-header-parse-content-type - (mail-fetch-field "content-type"))))) - (if notp - (not (equal (car ctl) type)) - (equal (car ctl) type))) - (setq result (buffer-substring (point-min) (point-max))))))) - result)) - -(defvar mm-security-handle nil) - -(defsubst mm-set-handle-multipart-parameter (handle parameter value) - ;; HANDLE could be a CTL. - (if handle - (put-text-property 0 (length (car handle)) parameter value - (car handle)))) - -(defun mm-possibly-verify-or-decrypt (parts ctl) - (let ((type (car ctl)) - (subtype (cadr (split-string (car ctl) "/"))) - (mm-security-handle ctl) ;; (car CTL) is the type. - protocol func functest) - (cond - ((or (equal type "application/x-pkcs7-mime") - (equal type "application/pkcs7-mime")) - (with-temp-buffer - (when (and (cond - ((eq mm-decrypt-option 'never) nil) - ((eq mm-decrypt-option 'always) t) - ((eq mm-decrypt-option 'known) t) - (t (y-or-n-p - (format "Decrypt (S/MIME) part? ")))) - (mm-view-pkcs7 parts)) - (setq parts (mm-dissect-buffer t))))) - ((equal subtype "signed") - (unless (and (setq protocol - (mm-handle-multipart-ctl-parameter ctl 'protocol)) - (not (equal protocol "multipart/mixed"))) - ;; The message is broken or draft-ietf-openpgp-multsig-01. - (let ((protocols mm-verify-function-alist)) - (while protocols - (if (and (or (not (setq functest (nth 3 (car protocols)))) - (funcall functest parts ctl)) - (mm-find-part-by-type parts (caar protocols) nil t)) - (setq protocol (caar protocols) - protocols nil) - (setq protocols (cdr protocols)))))) - (setq func (nth 1 (assoc protocol mm-verify-function-alist))) - (if (cond - ((eq mm-verify-option 'never) nil) - ((eq mm-verify-option 'always) t) - ((eq mm-verify-option 'known) - (and func - (or (not (setq functest - (nth 3 (assoc protocol - mm-verify-function-alist)))) - (funcall functest parts ctl)))) - (t (y-or-n-p - (format "Verify signed (%s) part? " - (or (nth 2 (assoc protocol mm-verify-function-alist)) - (format "protocol=%s" protocol)))))) - (save-excursion - (if func - (funcall func parts ctl) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details - (format "Unknown sign protocol (%s)" protocol)))))) - ((equal subtype "encrypted") - (unless (setq protocol - (mm-handle-multipart-ctl-parameter ctl 'protocol)) - ;; The message is broken. - (let ((parts parts)) - (while parts - (if (assoc (mm-handle-media-type (car parts)) - mm-decrypt-function-alist) - (setq protocol (mm-handle-media-type (car parts)) - parts nil) - (setq parts (cdr parts)))))) - (setq func (nth 1 (assoc protocol mm-decrypt-function-alist))) - (if (cond - ((eq mm-decrypt-option 'never) nil) - ((eq mm-decrypt-option 'always) t) - ((eq mm-decrypt-option 'known) - (and func - (or (not (setq functest - (nth 3 (assoc protocol - mm-decrypt-function-alist)))) - (funcall functest parts ctl)))) - (t (y-or-n-p - (format "Decrypt (%s) part? " - (or (nth 2 (assoc protocol mm-decrypt-function-alist)) - (format "protocol=%s" protocol)))))) - (save-excursion - (if func - (setq parts (funcall func parts ctl)) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details - (format "Unknown encrypt protocol (%s)" protocol)))))) - (t nil)) - parts)) - -(defun mm-multiple-handles (handles) - (and (listp (car handles)) - (> (length handles) 1))) - -(defun mm-merge-handles (handles1 handles2) - (append - (if (listp (car handles1)) - handles1 - (list handles1)) - (if (listp (car handles2)) - handles2 - (list handles2)))) - -(defun mm-readable-p (handle) - "Say whether the content of HANDLE is readable." - (and (< (with-current-buffer (mm-handle-buffer handle) - (buffer-size)) 10000) - (mm-with-unibyte-buffer - (mm-insert-part handle) - (and (eq (mm-body-7-or-8) '7bit) - (not (mm-long-lines-p 76)))))) - -(provide 'mm-decode) - -;;; mm-decode.el ends here diff --git a/lisp/mm-encode.el b/lisp/mm-encode.el deleted file mode 100644 index b56c569..0000000 --- a/lisp/mm-encode.el +++ /dev/null @@ -1,176 +0,0 @@ -;;; mm-encode.el --- Functions for encoding MIME things -;; Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; MORIOKA Tomohiko -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(require 'mail-parse) -(require 'gnus-mailcap) -(eval-and-compile - (autoload 'mm-body-7-or-8 "mm-bodies")) - -(defvar mm-content-transfer-encoding-defaults - '(("text/x-patch" 8bit) - ("text/.*" qp-or-base64) - ("message/rfc822" 8bit) - ("application/emacs-lisp" 8bit) - ("application/x-patch" 8bit) - (".*" base64)) - "Alist of regexps that match MIME types and their encodings. -If the encoding is `qp-or-base64', then either quoted-printable -or base64 will be used, depending on what is more efficient.") - -(defvar mm-use-ultra-safe-encoding nil - "If non-nil, use encodings aimed at Procrustean bed survival. - -This means that textual parts are encoded as quoted-printable if they -contain lines longer than 76 characters or starting with \"From \" in -the body. Non-7bit encodings (8bit, binary) are generally disallowed. -This is to reduce the probability that a broken MTA or MDA changes the -message. - -This variable should never be set directly, but bound before a call to -`mml-generate-mime' or similar functions.") - -(defun mm-insert-rfc822-headers (charset encoding) - "Insert text/plain headers with CHARSET and ENCODING." - (insert "MIME-Version: 1.0\n") - (insert "Content-Type: text/plain; charset=" - (mail-quote-string (downcase (symbol-name charset))) "\n") - (insert "Content-Transfer-Encoding: " - (downcase (symbol-name encoding)) "\n")) - -(defun mm-insert-multipart-headers () - "Insert multipart/mixed headers." - (let ((boundary "=-=-=")) - (insert "MIME-Version: 1.0\n") - (insert "Content-Type: multipart/mixed; boundary=\"" boundary "\"\n") - boundary)) - -(defun mm-default-file-encoding (file) - "Return a default encoding for FILE." - (if (not (string-match "\\.[^.]+$" file)) - "application/octet-stream" - (mailcap-extension-to-mime (match-string 0 file)))) - -(defun mm-safer-encoding (encoding) - "Return a safer but similar encoding." - (cond - ((memq encoding '(7bit 8bit quoted-printable)) 'quoted-printable) - ;; The remaing encodings are binary and base64 (and perhaps some - ;; non-standard ones), which are both turned into base64. - (t 'base64))) - -(defun mm-encode-content-transfer-encoding (encoding &optional type) - (cond - ((eq encoding 'quoted-printable) - (mm-with-unibyte-current-buffer-mule4 - (quoted-printable-encode-region (point-min) (point-max) t))) - ((eq encoding 'base64) - (when (equal type "text/plain") - (goto-char (point-min)) - (while (search-forward "\n" nil t) - (replace-match "\r\n" t t))) - (condition-case error - (base64-encode-region (point-min) (point-max)) - (error - (message "Error while decoding: %s" error) - nil))) - ((memq encoding '(7bit 8bit binary)) - ;; Do nothing. - ) - ((null encoding) - ;; Do nothing. - ) - ((functionp encoding) - (ignore-errors (funcall encoding (point-min) (point-max)))) - (t - (message "Unknown encoding %s; defaulting to 8bit" encoding)))) - -(defun mm-encode-buffer (type) - "Encode the buffer which contains data of TYPE. -The encoding used is returned." - (let* ((mime-type (if (stringp type) type (car type))) - (encoding - (or (and (listp type) - (cadr (assq 'encoding type))) - (mm-content-transfer-encoding mime-type))) - (bits (mm-body-7-or-8))) - ;; We force buffers that are 7bit to be unencoded, no matter - ;; what the preferred encoding is. - ;; Only if the buffers don't contain lone lines. - (when (and (eq bits '7bit) (not (mm-long-lines-p 76))) - (setq encoding bits)) - (mm-encode-content-transfer-encoding encoding mime-type) - encoding)) - -(defun mm-insert-headers (type encoding &optional file) - "Insert headers for TYPE." - (insert "Content-Type: " type) - (when file - (insert ";\n\tname=\"" (file-name-nondirectory file) "\"")) - (insert "\n") - (insert (format "Content-Transfer-Encoding: %s\n" encoding)) - (insert "Content-Disposition: inline") - (when file - (insert ";\n\tfilename=\"" (file-name-nondirectory file) "\"")) - (insert "\n") - (insert "\n")) - -(defun mm-content-transfer-encoding (type) - "Return a CTE suitable for TYPE to encode the current buffer." - (let ((rules mm-content-transfer-encoding-defaults)) - (catch 'found - (while rules - (when (string-match (caar rules) type) - (throw 'found - (let ((encoding - (if (eq (cadr (car rules)) 'qp-or-base64) - (mm-qp-or-base64) - (cadr (car rules))))) - (if mm-use-ultra-safe-encoding - (mm-safer-encoding encoding) - encoding)))) - (pop rules))))) - -(defun mm-qp-or-base64 () - (save-excursion - (let ((limit (min (point-max) (+ 2000 (point-min)))) - (n8bit 0)) - (goto-char (point-min)) - (skip-chars-forward "\x20-\x7f\r\n\t" limit) - (while (< (point) limit) - (incf n8bit) - (forward-char 1) - (skip-chars-forward "\x20-\x7f\r\n\t" limit)) - (if (or (< (* 6 n8bit) (- limit (point-min))) - ;; Don't base64, say, a short line with a single - ;; non-ASCII char when splitting parts by charset. - (= n8bit 1)) - 'quoted-printable - 'base64)))) - -(provide 'mm-encode) - -;;; mm-encode.el ends here diff --git a/lisp/mm-extern.el b/lisp/mm-extern.el deleted file mode 100644 index 4a18d0e..0000000 --- a/lisp/mm-extern.el +++ /dev/null @@ -1,166 +0,0 @@ -;;; mm-extern.el --- showing message/external-body -;; Copyright (C) 2000, 2001 Free Software Foundation, Inc. - -;; Author: Shenghuo Zhu -;; Keywords: message external-body - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your -;; option) any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'mm-util) -(require 'mm-decode) - -(defvar mm-extern-function-alist - '((local-file . mm-extern-local-file) - (url . mm-extern-url) - (anon-ftp . mm-extern-anon-ftp) - (ftp . mm-extern-ftp) -;;; (tftp . mm-extern-tftp) - (mail-server . mm-extern-mail-server) -;;; (afs . mm-extern-afs)) - )) - -(defvar mm-extern-anonymous "anonymous") - -(defun mm-extern-local-file (handle) - (erase-buffer) - (let ((name (cdr (assq 'name (cdr (mm-handle-type handle))))) - (coding-system-for-read mm-binary-coding-system)) - (unless name - (error "The filename is not specified")) - (mm-disable-multibyte-mule4) - (if (file-exists-p name) - (mm-insert-file-contents name nil nil nil nil t) - (error (format "File %s is gone" name))))) - -(defun mm-extern-url (handle) - (erase-buffer) - (require 'url) - (let ((url (cdr (assq 'url (cdr (mm-handle-type handle))))) - (name buffer-file-name) - (coding-system-for-read mm-binary-coding-system)) - (unless url - (error "URL is not specified")) - (mm-with-unibyte-current-buffer-mule4 - (url-insert-file-contents url)) - (mm-disable-multibyte-mule4) - (setq buffer-file-name name))) - -(defun mm-extern-anon-ftp (handle) - (erase-buffer) - (let* ((params (cdr (mm-handle-type handle))) - (name (cdr (assq 'name params))) - (site (cdr (assq 'site params))) - (directory (cdr (assq 'directory params))) - (mode (cdr (assq 'mode params))) - (path (concat "/" (or mm-extern-anonymous - (read-string (format "ID for %s: " site))) - "@" site ":" directory "/" name)) - (coding-system-for-read mm-binary-coding-system)) - (unless name - (error "The filename is not specified")) - (mm-disable-multibyte-mule4) - (mm-insert-file-contents path nil nil nil nil t))) - -(defun mm-extern-ftp (handle) - (let (mm-extern-anonymous) - (mm-extern-anon-ftp handle))) - -(defun mm-extern-mail-server (handle) - (require 'message) - (let* ((params (cdr (mm-handle-type handle))) - (server (cdr (assq 'server params))) - (subject (or (cdr (assq 'subject params)) "none")) - (buf (current-buffer)) - info) - (if (y-or-n-p (format "Send a request message to %s?" server)) - (save-window-excursion - (message-mail server subject) - (message-goto-body) - (delete-region (point) (point-max)) - (insert-buffer buf) - (message "Requesting external body...") - (message-send-and-exit) - (setq info "Request is sent.") - (message info)) - (setq info "Request is not sent.")) - (goto-char (point-min)) - (insert "[" info "]\n\n"))) - -;;;###autoload -(defun mm-inline-external-body (handle &optional no-display) - "Show the external-body part of HANDLE. -This function replaces the buffer of HANDLE with a buffer contains -the entire message. -If NO-DISPLAY is nil, display it. Otherwise, do nothing after replacing." - (let* ((access-type (cdr (assq 'access-type - (cdr (mm-handle-type handle))))) - (func (cdr (assq (intern - (downcase - (or access-type - (error "Couldn't find access type")))) - mm-extern-function-alist))) - gnus-displaying-mime buf - handles) - (unless (mm-handle-cache handle) - (unless func - (error (format "Access type (%s) is not supported" access-type))) - (with-temp-buffer - (mm-insert-part handle) - (goto-char (point-max)) - (insert "\n\n") - (setq handles (mm-dissect-buffer t))) - (unless (bufferp (car handles)) - (mm-destroy-parts handles) - (error "Multipart external body is not supported")) - (save-excursion ;; single part - (set-buffer (setq buf (mm-handle-buffer handles))) - (let (good) - (unwind-protect - (progn - (funcall func handle) - (setq good t)) - (unless good - (mm-destroy-parts handles)))) - (mm-handle-set-cache handle handles)) - (setq gnus-article-mime-handles - (mm-merge-handles gnus-article-mime-handles handles))) - (unless no-display - (save-excursion - (save-restriction - (narrow-to-region (point) (point)) - (gnus-display-mime (mm-handle-cache handle)) - (mm-handle-set-undisplayer - handle - `(lambda () - (let (buffer-read-only) - (condition-case nil - ;; This is only valid on XEmacs. - (mapcar (lambda (prop) - (remove-specifier - (face-property 'default prop) (current-buffer))) - '(background background-pixmap foreground)) - (error nil)) - (delete-region ,(point-min-marker) ,(point-max-marker)))))))))) - -;;; mm-extern.el ends here diff --git a/lisp/mm-partial.el b/lisp/mm-partial.el deleted file mode 100644 index d3346ba..0000000 --- a/lisp/mm-partial.el +++ /dev/null @@ -1,151 +0,0 @@ -;;; mm-partial.el --- showing message/partial -;; Copyright (C) 2000, 2001 Free Software Foundation, Inc. - -;; Author: Shenghuo Zhu -;; Keywords: message partial - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your -;; option) any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus-sum) -(require 'mm-util) -(require 'mm-decode) - -(defun mm-partial-find-parts (id &optional art) - (let ((headers (save-excursion - (set-buffer gnus-summary-buffer) - gnus-newsgroup-headers)) - phandles header) - (while (setq header (pop headers)) - (unless (eq (aref header 0) art) - (mm-with-unibyte-buffer - (gnus-request-article-this-buffer (aref header 0) - gnus-newsgroup-name) - (when (search-forward id nil t) - (let ((nhandles (mm-dissect-buffer)) nid) - (if (consp (car nhandles)) - (mm-destroy-parts nhandles) - (setq nid (cdr (assq 'id - (cdr (mm-handle-type nhandles))))) - (if (not (equal id nid)) - (mm-destroy-parts nhandles) - (push nhandles phandles)))))))) - phandles)) - -;;;###autoload -(defun mm-inline-partial (handle &optional no-display) - "Show the partial part of HANDLE. -This function replaces the buffer of HANDLE with a buffer contains -the entire message. -If NO-DISPLAY is nil, display it. Otherwise, do nothing after replacing." - (let ((id (cdr (assq 'id (cdr (mm-handle-type handle))))) - phandles - (b (point)) (n 1) total - phandle nn ntotal - gnus-displaying-mime handles buffer) - (unless (mm-handle-cache handle) - (unless id - (error "Can not find message/partial id")) - (setq phandles - (sort (cons handle - (mm-partial-find-parts - id - (save-excursion - (set-buffer gnus-summary-buffer) - (gnus-summary-article-number)))) - #'(lambda (a b) - (let ((anumber (string-to-number - (cdr (assq 'number - (cdr (mm-handle-type a)))))) - (bnumber (string-to-number - (cdr (assq 'number - (cdr (mm-handle-type b))))))) - (< anumber bnumber))))) - (setq gnus-article-mime-handles - (mm-merge-handles gnus-article-mime-handles phandles)) - (save-excursion - (set-buffer (generate-new-buffer " *mm*")) - (while (setq phandle (pop phandles)) - (setq nn (string-to-number - (cdr (assq 'number - (cdr (mm-handle-type phandle)))))) - (setq ntotal (string-to-number - (cdr (assq 'total - (cdr (mm-handle-type phandle)))))) - (if ntotal - (if total - (unless (eq total ntotal) - (error "The numbers of total are different")) - (setq total ntotal))) - (unless (< nn n) - (unless (eq nn n) - (error "Missing part %d" n)) - (mm-insert-part phandle) - (goto-char (point-max)) - (when (not (eq 0 (skip-chars-backward "\r\n"))) - ;; remove tail blank spaces except one - (if (looking-at "\r?\n") - (goto-char (match-end 0))) - (delete-region (point) (point-max))) - (setq n (+ n 1)))) - (unless total - (error "Don't known the total number of")) - (if (<= n total) - (error "Missing part %d" n)) - (kill-buffer (mm-handle-buffer handle)) - (goto-char (point-min)) - (let ((point (if (search-forward "\n\n" nil t) - (1- (point)) - (point-max)))) - (goto-char (point-min)) - (unless (re-search-forward "^mime-version:" point t) - (insert "MIME-Version: 1.0\n"))) - (setcar handle (current-buffer)) - (mm-handle-set-cache handle t))) - (unless no-display - (save-excursion - (save-restriction - (narrow-to-region b b) - (mm-insert-part handle) - (let (gnus-article-mime-handles) - (run-hooks 'gnus-article-decode-hook) - (gnus-article-prepare-display) - (setq handles gnus-article-mime-handles)) - (when handles - ;; It is in article buffer. - (setq gnus-article-mime-handles - (mm-merge-handles gnus-article-mime-handles handles))) - (mm-handle-set-undisplayer - handle - `(lambda () - (let (buffer-read-only) - (condition-case nil - ;; This is only valid on XEmacs. - (mapcar (lambda (prop) - (remove-specifier - (face-property 'default prop) (current-buffer))) - '(background background-pixmap foreground)) - (error nil)) - (delete-region ,(point-min-marker) ,(point-max-marker)))))))))) - -;;; mm-partial.el ends here diff --git a/lisp/mm-util.el b/lisp/mm-util.el deleted file mode 100644 index 50899a3..0000000 --- a/lisp/mm-util.el +++ /dev/null @@ -1,573 +0,0 @@ -;;; mm-util.el --- Utility functions for Mule and low level things -;; Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; MORIOKA Tomohiko -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'gnus-clfns)) -(eval-when-compile (require 'static)) - -(require 'mail-prsvr) - -(defvar mm-mime-mule-charset-alist - `((us-ascii ascii) - (iso-8859-1 latin-iso8859-1) - (iso-8859-2 latin-iso8859-2) - (iso-8859-3 latin-iso8859-3) - (iso-8859-4 latin-iso8859-4) - (iso-8859-5 cyrillic-iso8859-5) - ;; Non-mule (X)Emacs uses the last mule-charset for 8bit characters. - ;; The fake mule-charset, gnus-koi8-r, tells Gnus that the default - ;; charset is koi8-r, not iso-8859-5. - (koi8-r cyrillic-iso8859-5 gnus-koi8-r) - (iso-8859-6 arabic-iso8859-6) - (iso-8859-7 greek-iso8859-7) - (iso-8859-8 hebrew-iso8859-8) - (iso-8859-9 latin-iso8859-9) - (iso-8859-14 latin-iso8859-14) - (iso-8859-15 latin-iso8859-15) - (viscii vietnamese-viscii-lower) - (iso-2022-jp latin-jisx0201 japanese-jisx0208 japanese-jisx0208-1978) - (euc-kr korean-ksc5601) - (gb2312 chinese-gb2312) - (big5 chinese-big5-1 chinese-big5-2) - (tibetan tibetan) - (thai-tis620 thai-tis620) - (iso-2022-7bit ethiopic arabic-1-column arabic-2-column) - (iso-2022-jp-2 latin-iso8859-1 greek-iso8859-7 - latin-jisx0201 japanese-jisx0208-1978 - chinese-gb2312 japanese-jisx0208 - korean-ksc5601 japanese-jisx0212 - katakana-jisx0201) - (iso-2022-int-1 latin-iso8859-1 greek-iso8859-7 - latin-jisx0201 japanese-jisx0208-1978 - chinese-gb2312 japanese-jisx0208 - korean-ksc5601 japanese-jisx0212 - chinese-cns11643-1 chinese-cns11643-2) - (iso-2022-int-1 latin-iso8859-1 latin-iso8859-2 - cyrillic-iso8859-5 greek-iso8859-7 - latin-jisx0201 japanese-jisx0208-1978 - chinese-gb2312 japanese-jisx0208 - korean-ksc5601 japanese-jisx0212 - chinese-cns11643-1 chinese-cns11643-2 - chinese-cns11643-3 chinese-cns11643-4 - chinese-cns11643-5 chinese-cns11643-6 - chinese-cns11643-7) - ,(if (or (not (fboundp 'charsetp)) ;; non-Mule case - (not (fboundp 'coding-system-p)) - (charsetp 'unicode-a) - (not (coding-system-p 'mule-utf-8))) - '(utf-8 unicode-a unicode-b unicode-c unicode-d unicode-e) - ;; If we have utf-8 we're in Mule 5+. - (delete 'ascii (coding-system-get 'mule-utf-8 'safe-charsets)))) - "Alist of MIME-charset/MULE-charsets.") - -(eval-and-compile - (mapcar - (lambda (elem) - (let ((nfunc (intern (format "mm-%s" (car elem))))) - (if (fboundp (car elem)) - (defalias nfunc (car elem)) - (defalias nfunc (cdr elem))))) - '((decode-coding-string . (lambda (s a) s)) - (encode-coding-string . (lambda (s a) s)) - (encode-coding-region . ignore) - (coding-system-list . ignore) - (decode-coding-region . ignore) - (char-int . identity) - (device-type . ignore) - (coding-system-equal . equal) - (annotationp . ignore) - (set-buffer-file-coding-system . ignore) - (make-char - . (lambda (charset int) - (int-to-char int))) - (read-charset - . (lambda (prompt) - "Return a charset." - (intern - (completing-read - prompt - (mapcar (lambda (e) (list (symbol-name (car e)))) - mm-mime-mule-charset-alist) - nil t)))) - (subst-char-in-string - . (lambda (from to string) ;; stolen (and renamed) from nnheader.el - "Replace characters in STRING from FROM to TO." - (let ((string (substring string 0)) ;Copy string. - (len (length string)) - (idx 0)) - ;; Replace all occurrences of FROM with TO. - (while (< idx len) - (when (= (aref string idx) from) - (aset string idx to)) - (setq idx (1+ idx))) - string))) - (string-as-unibyte . identity) - (string-as-multibyte . identity) - (multibyte-string-p . ignore)))) - -(eval-and-compile - (defalias 'mm-char-or-char-int-p - (cond - ((fboundp 'char-or-char-int-p) 'char-or-char-int-p) - ((fboundp 'char-valid-p) 'char-valid-p) - (t 'identity)))) - -(eval-and-compile - (defalias 'mm-read-coding-system - (cond - ((fboundp 'read-coding-system) - (if (and (featurep 'xemacs) - (<= (string-to-number emacs-version) 21.1)) - (lambda (prompt &optional default-coding-system) - (read-coding-system prompt)) - 'read-coding-system)) - (t (lambda (prompt &optional default-coding-system) - "Prompt the user for a coding system." - (completing-read - prompt (mapcar (lambda (s) (list (symbol-name (car s)))) - mm-mime-mule-charset-alist))))))) - -(defvar mm-coding-system-list nil) -(defun mm-get-coding-system-list () - "Get the coding system list." - (or mm-coding-system-list - (setq mm-coding-system-list (mm-coding-system-list)))) - -(defun mm-coding-system-p (sym) - "Return non-nil if SYM is a coding system." - (or (and (fboundp 'coding-system-p) (coding-system-p sym)) - (memq sym (mm-get-coding-system-list)))) - -(defvar mm-charset-synonym-alist - `((big5 . cn-big5) - (gb2312 . cn-gb-2312) - (cn-gb . cn-gb-2312) - ;; Windows-1252 is actually a superset of Latin-1. See also - ;; `gnus-article-dumbquotes-map'. - ,(unless (mm-coding-system-p 'windows-1252) ; should be defined eventually - '(windows-1252 . iso-8859-1)) - (x-ctext . ctext)) - "A mapping from invalid charset names to the real charset names.") - -(defvar mm-binary-coding-system - (cond - ((mm-coding-system-p 'binary) 'binary) - ((mm-coding-system-p 'no-conversion) 'no-conversion) - (t nil)) - "100% binary coding system.") - -(defvar mm-text-coding-system - (or (if (memq system-type '(windows-nt ms-dos ms-windows)) - (and (mm-coding-system-p 'raw-text-dos) 'raw-text-dos) - (and (mm-coding-system-p 'raw-text) 'raw-text)) - mm-binary-coding-system) - "Text-safe coding system (For removing ^M).") - -(defvar mm-text-coding-system-for-write nil - "Text coding system for write.") - -(defvar mm-auto-save-coding-system - (cond - ((mm-coding-system-p 'emacs-mule) - (if (memq system-type '(windows-nt ms-dos ms-windows)) - (if (mm-coding-system-p 'emacs-mule-dos) - 'emacs-mule-dos mm-binary-coding-system) - 'emacs-mule)) - ((mm-coding-system-p 'escape-quoted) 'escape-quoted) - (t mm-binary-coding-system)) - "Coding system of auto save file.") - -(defvar mm-universal-coding-system mm-auto-save-coding-system - "The universal Coding system.") - -;;; Internal variables: - -;;; Functions: - -(defun mm-mule-charset-to-mime-charset (charset) - "Return the MIME charset corresponding to the given Mule CHARSET." - (let ((alist mm-mime-mule-charset-alist) - out) - (while alist - (when (memq charset (cdar alist)) - (setq out (caar alist) - alist nil)) - (pop alist)) - out)) - -(defun mm-charset-to-coding-system (charset &optional lbt) - "Return coding-system corresponding to CHARSET. -CHARSET is a symbol naming a MIME charset. -If optional argument LBT (`unix', `dos' or `mac') is specified, it is -used as the line break code type of the coding system." - (when (stringp charset) - (setq charset (intern (downcase charset)))) - (setq charset - (or (cdr (assq charset mm-charset-synonym-alist)) - charset)) - (when lbt - (setq charset (intern (format "%s-%s" charset lbt)))) - (cond - ;; Running in a non-MULE environment. - ((null (mm-get-coding-system-list)) - charset) - ;; ascii - ((eq charset 'us-ascii) - 'ascii) - ;; Check to see whether we can handle this charset. (This depends - ;; on there being some coding system matching each `mime-charset' - ;; coding sysytem property defined, as there should be.) - ((memq charset (mm-get-coding-system-list)) - charset) - ;; Nope. - (t - nil))) - -(defsubst mm-replace-chars-in-string (string from to) - (mm-subst-char-in-string from to string)) - -(defsubst mm-enable-multibyte () - "Set the multibyte flag of the current buffer. -Only do this if the default value of `enable-multibyte-characters' is -non-nil. This is a no-op in XEmacs." - (when (and (not (featurep 'xemacs)) - (boundp 'default-enable-multibyte-characters) - default-enable-multibyte-characters - (fboundp 'set-buffer-multibyte)) - (set-buffer-multibyte t))) - -(defsubst mm-disable-multibyte () - "Unset the multibyte flag of in the current buffer. -This is a no-op in XEmacs." - (when (and (not (featurep 'xemacs)) - (fboundp 'set-buffer-multibyte)) - (set-buffer-multibyte nil))) - -(defsubst mm-enable-multibyte-mule4 () - "Enable multibyte in the current buffer. -Only used in Emacs Mule 4." - (when (and (not (featurep 'xemacs)) - (boundp 'default-enable-multibyte-characters) - default-enable-multibyte-characters - (fboundp 'set-buffer-multibyte) - (fboundp 'charsetp) - (not (charsetp 'eight-bit-control))) - (set-buffer-multibyte t))) - -(defsubst mm-disable-multibyte-mule4 () - "Disable multibyte in the current buffer. -Only used in Emacs Mule 4." - (when (and (not (featurep 'xemacs)) - (fboundp 'set-buffer-multibyte) - (fboundp 'charsetp) - (not (charsetp 'eight-bit-control))) - (set-buffer-multibyte nil))) - -(defun mm-preferred-coding-system (charset) - ;; A typo in some Emacs versions. - (or (get-charset-property charset 'prefered-coding-system) - (get-charset-property charset 'preferred-coding-system))) - -(defun mm-charset-after (&optional pos) - "Return charset of a character in current buffer at position POS. -If POS is nil, it defauls to the current point. -If POS is out of range, the value is nil. -If the charset is `composition', return the actual one." - (let ((char (char-after pos)) charset) - (if (< (mm-char-int char) 128) - (setq charset 'ascii) - ;; charset-after is fake in some Emacsen. - (setq charset (and (fboundp 'char-charset) (char-charset char))) - (if (eq charset 'composition) - (let ((p (or pos (point)))) - (cadr (find-charset-region p (1+ p)))) - (if (and charset (not (memq charset '(ascii eight-bit-control - eight-bit-graphic)))) - charset - (or - mail-parse-mule-charset ;; cached mule-charset - (progn - (setq mail-parse-mule-charset - (and (boundp 'current-language-environment) - (car (last - (assq 'charset - (assoc current-language-environment - language-info-alist)))))) - (if (or (not mail-parse-mule-charset) - (eq mail-parse-mule-charset 'ascii)) - (setq mail-parse-mule-charset - (or (car (last (assq mail-parse-charset - mm-mime-mule-charset-alist))) - ;; Fixme: don't fix that! - 'latin-iso8859-1))) - mail-parse-mule-charset))))))) - -(defun mm-mime-charset (charset) - "Return the MIME charset corresponding to the MULE CHARSET." - (if (eq charset 'unknown) - (error "The message contains non-printable characters, please use attachment")) - (if (and (fboundp 'coding-system-get) (fboundp 'get-charset-property)) - ;; This exists in Emacs 20. - (or - (and (mm-preferred-coding-system charset) - (coding-system-get - (mm-preferred-coding-system charset) 'mime-charset)) - (and (eq charset 'ascii) - 'us-ascii) - (mm-preferred-coding-system charset) - (mm-mule-charset-to-mime-charset charset)) - ;; This is for XEmacs. - (mm-mule-charset-to-mime-charset charset))) - -(defun mm-delete-duplicates (list) - "Simple substitute for CL `delete-duplicates', testing with `equal'." - (let (result head) - (while list - (setq head (car list)) - (setq list (delete head list)) - (setq result (cons head result))) - (nreverse result))) - -(defun mm-find-mime-charset-region (b e) - "Return the MIME charsets needed to encode the region between B and E." - (let ((charsets (mapcar 'mm-mime-charset - (delq 'ascii - (mm-find-charset-region b e))))) - (when (memq 'iso-2022-jp-2 charsets) - (setq charsets (delq 'iso-2022-jp charsets))) - (setq charsets (mm-delete-duplicates charsets)) - (if (and (> (length charsets) 1) - (fboundp 'find-coding-systems-region) - (let ((cs (find-coding-systems-region b e))) - (or (memq 'utf-8 cs) (memq 'mule-utf-8 cs)))) - '(utf-8) - charsets))) - -(defsubst mm-multibyte-p () - "Say whether multibyte is enabled." - (if (and (not (featurep 'xemacs)) - (boundp 'enable-multibyte-characters)) - enable-multibyte-characters - (featurep 'mule))) - -(defmacro mm-with-unibyte-buffer (&rest forms) - "Create a temporary buffer, and evaluate FORMS there like `progn'. -Use unibyte mode for this." - `(let (default-enable-multibyte-characters) - (with-temp-buffer ,@forms))) -(put 'mm-with-unibyte-buffer 'lisp-indent-function 0) -(put 'mm-with-unibyte-buffer 'edebug-form-spec '(body)) - -(defmacro mm-with-unibyte-current-buffer (&rest forms) - "Evaluate FORMS with current current buffer temporarily made unibyte. -Also bind `default-enable-multibyte-characters' to nil. -Equivalent to `progn' in XEmacs" - (let ((buffer (make-symbol "buffer"))) - `(if (and (not (featurep 'xemacs)) - (boundp 'enable-multibyte-characters) - enable-multibyte-characters - (fboundp 'set-buffer-multibyte)) - (let ((,buffer (current-buffer))) - (unwind-protect - (let (default-enable-multibyte-characters) - (set-buffer-multibyte nil) - ,@forms) - (set-buffer ,buffer) - (set-buffer-multibyte t))) - (let (default-enable-multibyte-characters) - ,@forms)))) -(put 'mm-with-unibyte-current-buffer 'lisp-indent-function 0) -(put 'mm-with-unibyte-current-buffer 'edebug-form-spec '(body)) - -(defmacro mm-with-unibyte-current-buffer-mule4 (&rest forms) - "Evaluate FORMS there like `progn' in current buffer. -Mule4 only." - (let ((buffer (make-symbol "buffer"))) - `(if (and (not (featurep 'xemacs)) - (boundp 'enable-multibyte-characters) - enable-multibyte-characters - (fboundp 'set-buffer-multibyte) - (fboundp 'charsetp) - (not (charsetp 'eight-bit-control))) ;; For Emacs Mule 4 only. - (let ((,buffer (current-buffer))) - (unwind-protect - (let (default-enable-multibyte-characters) - (set-buffer-multibyte nil) - ,@forms) - (set-buffer ,buffer) - (set-buffer-multibyte t))) - (let (default-enable-multibyte-characters) - ,@forms)))) -(put 'mm-with-unibyte-current-buffer-mule4 'lisp-indent-function 0) -(put 'mm-with-unibyte-current-buffer-mule4 'edebug-form-spec '(body)) - -(defmacro mm-with-unibyte (&rest forms) - "Eval the FORMS with the default value of `enable-multibyte-characters' nil, ." - `(let (default-enable-multibyte-characters) - ,@forms)) -(put 'mm-with-unibyte 'lisp-indent-function 0) -(put 'mm-with-unibyte 'edebug-form-spec '(body)) - -(defun mm-find-charset-region (b e) - "Return a list of Emacs charsets in the region B to E." - (cond - ((and (mm-multibyte-p) - (fboundp 'find-charset-region)) - ;; Remove composition since the base charsets have been included. - ;; Remove eight-bit-*, treat them as ascii. - (let ((css (find-charset-region b e))) - (mapcar (lambda (cs) (setq css (delq cs css))) - '(composition eight-bit-control eight-bit-graphic - control-1)) - css)) - (t - ;; We are in a unibyte buffer or XEmacs non-mule, so we futz around a bit. - (save-excursion - (save-restriction - (narrow-to-region b e) - (goto-char (point-min)) - (skip-chars-forward "\0-\177") - (if (eobp) - '(ascii) - (let (charset) - (setq charset - (and (boundp 'current-language-environment) - (car (last (assq 'charset - (assoc current-language-environment - language-info-alist)))))) - (if (eq charset 'ascii) (setq charset nil)) - (or charset - (setq charset - (car (last (assq mail-parse-charset - mm-mime-mule-charset-alist))))) - (list 'ascii (or charset 'latin-iso8859-1))))))))) - -(static-if (fboundp 'shell-quote-argument) - (defalias 'mm-quote-arg 'shell-quote-argument) - (defun mm-quote-arg (arg) - "Return a version of ARG that is safe to evaluate in a shell." - (let ((pos 0) new-pos accum) - ;; *** bug: we don't handle newline characters properly - (while (setq new-pos (string-match "[]*[;!'`\"$\\& \t{} |()<>]" arg pos)) - (push (substring arg pos new-pos) accum) - (push "\\" accum) - (push (list (aref arg new-pos)) accum) - (setq pos (1+ new-pos))) - (if (= pos 0) - arg - (apply 'concat (nconc (nreverse accum) (list (substring arg pos)))))))) - -(defun mm-auto-mode-alist () - "Return an `auto-mode-alist' with only the .gz (etc) thingies." - (let ((alist auto-mode-alist) - out) - (while alist - (when (listp (cdar alist)) - (push (car alist) out)) - (pop alist)) - (nreverse out))) - -(defvar mm-inhibit-file-name-handlers - '(jka-compr-handler image-file-handler) - "A list of handlers doing (un)compression (etc) thingies.") - -(defun mm-insert-file-contents (filename &optional visit beg end replace - inhibit) - "Like `insert-file-contents', q.v., but only reads in the file. -A buffer may be modified in several ways after reading into the buffer due -to advanced Emacs features, such as file-name-handlers, format decoding, -find-file-hooks, etc. -If INHIBIT is non-nil, inhibit mm-inhibit-file-name-handlers. - This function ensures that none of these modifications will take place." - (let ((format-alist nil) - (auto-mode-alist (if inhibit nil (mm-auto-mode-alist))) - (default-major-mode 'fundamental-mode) - (enable-local-variables nil) - (after-insert-file-functions nil) - (enable-local-eval nil) - (find-file-hooks nil) - (inhibit-file-name-operation (if inhibit - 'insert-file-contents - inhibit-file-name-operation)) - (inhibit-file-name-handlers - (if inhibit - (append mm-inhibit-file-name-handlers - inhibit-file-name-handlers) - inhibit-file-name-handlers))) - (insert-file-contents filename visit beg end replace))) - -(defun mm-append-to-file (start end filename &optional codesys inhibit) - "Append the contents of the region to the end of file FILENAME. -When called from a function, expects three arguments, -START, END and FILENAME. START and END are buffer positions -saying what text to write. -Optional fourth argument specifies the coding system to use when -encoding the file. -If INHIBIT is non-nil, inhibit mm-inhibit-file-name-handlers." - (let ((coding-system-for-write - (or codesys mm-text-coding-system-for-write - mm-text-coding-system)) - (inhibit-file-name-operation (if inhibit - 'append-to-file - inhibit-file-name-operation)) - (inhibit-file-name-handlers - (if inhibit - (append mm-inhibit-file-name-handlers - inhibit-file-name-handlers) - inhibit-file-name-handlers))) - (append-to-file start end filename))) - -(defun mm-write-region (start end filename &optional append visit lockname - coding-system inhibit) - - "Like `write-region'. -If INHIBIT is non-nil, inhibit mm-inhibit-file-name-handlers." - (let ((coding-system-for-write - (or coding-system mm-text-coding-system-for-write - mm-text-coding-system)) - (inhibit-file-name-operation (if inhibit - 'write-region - inhibit-file-name-operation)) - (inhibit-file-name-handlers - (if inhibit - (append mm-inhibit-file-name-handlers - inhibit-file-name-handlers) - inhibit-file-name-handlers))) - (write-region start end filename append visit lockname))) - -(defun mm-image-load-path (&optional package) - (let (dir result) - (dolist (path load-path (nreverse result)) - (if (file-directory-p - (setq dir (concat (file-name-directory - (directory-file-name path)) - "etc/" (or package "gnus/")))) - (push dir result)) - (push path result)))) - -(provide 'mm-util) - -;;; mm-util.el ends here diff --git a/lisp/mm-uu.el b/lisp/mm-uu.el deleted file mode 100644 index 7c90203..0000000 --- a/lisp/mm-uu.el +++ /dev/null @@ -1,440 +0,0 @@ -;;; mm-uu.el --- Return uu stuff as mm handles -;; Copyright (c) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. - -;; Author: Shenghuo Zhu -;; Keywords: postscript uudecode binhex shar forward gnatsweb pgp - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. -;; -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(require 'mail-parse) -(require 'nnheader) -(require 'mm-decode) -(require 'gnus-mailcap) -(require 'mml2015) -(require 'uudecode) -(require 'binhex) - -;; This is not the right place for this. uudecode.el should decide -;; whether or not to use a program with a single interface, but I -;; guess it's too late now. Also the default should depend on a test -;; for the program. -- fx -(defcustom mm-uu-decode-function 'uudecode-decode-region - "*Function to uudecode. -Internal function is done in Lisp by default, therefore decoding may -appear to be horribly slow. You can make Gnus use an external -decoder, such as uudecode." - :type '(choice - (function-item :tag "Internal" uudecode-decode-region) - (function-item :tag "External" uudecode-decode-region-external)) - :group 'gnus-article-mime) - -(defcustom mm-uu-binhex-decode-function 'binhex-decode-region - "*Function to binhex decode. -Internal function is done in elisp by default, therefore decoding may -appear to be horribly slow . You can make Gnus use the external Unix -decoder, such as hexbin." - :type '(choice (item :tag "internal" binhex-decode-region) - (item :tag "external" binhex-decode-region-external)) - :group 'gnus-article-mime) - -(defvar mm-uu-pgp-beginning-signature - "^-----BEGIN PGP SIGNATURE-----") - -(defvar mm-uu-beginning-regexp nil) - -(defvar mm-dissect-disposition "inline" - "The default disposition of uu parts. -This can be either \"inline\" or \"attachment\".") - -(defvar mm-uu-emacs-sources-regexp "gnu\\.emacs\\.sources" - "The regexp of emacs sources groups.") - -(defvar mm-uu-type-alist - '((postscript - "^%!PS-" - "^%%EOF$" - mm-uu-postscript-extract - nil) - (uu - "^begin[ \t]+[0-7][0-7][0-7][ \t]+" - "^end[ \t]*$" - mm-uu-uu-extract - mm-uu-uu-filename) - (binhex - "^:...............................................................$" - ":$" - mm-uu-binhex-extract - nil - mm-uu-binhex-filename) - (shar - "^#! */bin/sh" - "^exit 0$" - mm-uu-shar-extract) - (forward -;;; Thanks to Edward J. Sabol and -;;; Peter von der Ah\'e - "^-+ \\(Start of \\)?Forwarded message" - "^-+ End \\(of \\)?forwarded message" - mm-uu-forward-extract - nil - mm-uu-forward-test) - (gnatsweb - "^----gnatsweb-attachment----" - nil - mm-uu-gnatsweb-extract) - (pgp-signed - "^-----BEGIN PGP SIGNED MESSAGE-----" - "^-----END PGP SIGNATURE-----" - mm-uu-pgp-signed-extract - nil - nil) - (pgp-encrypted - "^-----BEGIN PGP MESSAGE-----" - "^-----END PGP MESSAGE-----" - mm-uu-pgp-encrypted-extract - nil - nil) - (pgp-key - "^-----BEGIN PGP PUBLIC KEY BLOCK-----" - "^-----END PGP PUBLIC KEY BLOCK-----" - mm-uu-pgp-key-extract - mm-uu-gpg-key-skip-to-last - nil) - (emacs-sources - "^;;;?[ \t]*[^ \t]+\\.el[ \t]*--" - "^;;;?[ \t]*\\([^ \t]+\\.el\\)[ \t]+ends here" - mm-uu-emacs-sources-extract - nil - mm-uu-emacs-sources-test))) - -(defcustom mm-uu-configure-list nil - "A list of mm-uu configuration. -To disable dissecting shar codes, for instance, add -`(shar . disabled)' to this list." - :type 'alist - :options (mapcar (lambda (entry) - (list (car entry) '(const disabled))) - mm-uu-type-alist) - :group 'gnus-article-mime) - -;; functions - -(defsubst mm-uu-type (entry) - (car entry)) - -(defsubst mm-uu-beginning-regexp (entry) - (nth 1 entry)) - -(defsubst mm-uu-end-regexp (entry) - (nth 2 entry)) - -(defsubst mm-uu-function-extract (entry) - (nth 3 entry)) - -(defsubst mm-uu-function-1 (entry) - (nth 4 entry)) - -(defsubst mm-uu-function-2 (entry) - (nth 5 entry)) - -(defun mm-uu-copy-to-buffer (&optional from to) - "Copy the contents of the current buffer to a fresh buffer. -Return that buffer." - (save-excursion - (let ((obuf (current-buffer))) - (set-buffer (generate-new-buffer " *mm-uu*")) - (insert-buffer-substring obuf from to) - (current-buffer)))) - -(defun mm-uu-configure-p (key val) - (member (cons key val) mm-uu-configure-list)) - -(defun mm-uu-configure (&optional symbol value) - (if symbol (set-default symbol value)) - (setq mm-uu-beginning-regexp nil) - (mapcar (lambda (entry) - (if (mm-uu-configure-p (mm-uu-type entry) 'disabled) - nil - (setq mm-uu-beginning-regexp - (concat mm-uu-beginning-regexp - (if mm-uu-beginning-regexp "\\|") - (mm-uu-beginning-regexp entry))))) - mm-uu-type-alist)) - -(mm-uu-configure) - -(eval-when-compile - (defvar file-name) - (defvar start-point) - (defvar end-point) - (defvar entry)) - -(defun mm-uu-uu-filename () - (if (looking-at ".+") - (setq file-name - (let ((nnheader-file-name-translation-alist - '((?/ . ?,) (? . ?_) (?* . ?_) (?$ . ?_)))) - (nnheader-translate-file-chars (match-string 0)))))) - -(defun mm-uu-binhex-filename () - (setq file-name - (ignore-errors - (binhex-decode-region start-point end-point t)))) - -(defun mm-uu-forward-test () - (save-excursion - (goto-char start-point) - (forward-line) - (looking-at "[\r\n]*[a-zA-Z][a-zA-Z0-9-]*:"))) - -(defun mm-uu-postscript-extract () - (mm-make-handle (mm-uu-copy-to-buffer start-point end-point) - '("application/postscript"))) - -(defun mm-uu-emacs-sources-extract () - (mm-make-handle (mm-uu-copy-to-buffer start-point end-point) - '("application/emacs-lisp") - nil nil - (list mm-dissect-disposition - (cons 'filename file-name)))) - -(eval-when-compile - (defvar gnus-newsgroup-name)) - -(defun mm-uu-emacs-sources-test () - (setq file-name (match-string 1)) - (and gnus-newsgroup-name - mm-uu-emacs-sources-regexp - (string-match mm-uu-emacs-sources-regexp gnus-newsgroup-name))) - -(defun mm-uu-forward-extract () - (mm-make-handle (mm-uu-copy-to-buffer - (progn (goto-char start-point) (forward-line) (point)) - (progn (goto-char end-point) (forward-line -1) (point))) - '("message/rfc822" (charset . gnus-decoded)))) - -(defun mm-uu-uu-extract () - (mm-make-handle (mm-uu-copy-to-buffer start-point end-point) - (list (or (and file-name - (string-match "\\.[^\\.]+$" - file-name) - (mailcap-extension-to-mime - (match-string 0 file-name))) - "application/octet-stream")) - 'x-uuencode nil - (if (and file-name (not (equal file-name ""))) - (list mm-dissect-disposition - (cons 'filename file-name))))) - -(defun mm-uu-binhex-extract () - (mm-make-handle (mm-uu-copy-to-buffer start-point end-point) - (list (or (and file-name - (string-match "\\.[^\\.]+$" file-name) - (mailcap-extension-to-mime - (match-string 0 file-name))) - "application/octet-stream")) - 'x-binhex nil - (if (and file-name (not (equal file-name ""))) - (list mm-dissect-disposition - (cons 'filename file-name))))) - -(defun mm-uu-shar-extract () - (mm-make-handle (mm-uu-copy-to-buffer start-point end-point) - '("application/x-shar"))) - -(defun mm-uu-gnatsweb-extract () - (save-restriction - (goto-char start-point) - (forward-line) - (narrow-to-region (point) end-point) - (mm-dissect-buffer t))) - -(defun mm-uu-pgp-signed-test (&rest rest) - (and - mml2015-use - (mml2015-clear-verify-function) - (cond - ((eq mm-verify-option 'never) nil) - ((eq mm-verify-option 'always) t) - ((eq mm-verify-option 'known) t) - (t (y-or-n-p "Verify pgp signed part?"))))) - -(eval-when-compile - (defvar gnus-newsgroup-charset)) - -(defun mm-uu-pgp-signed-extract-1 (handles ctl) - (let ((buf (mm-uu-copy-to-buffer (point-min) (point-max)))) - (with-current-buffer buf - (if (mm-uu-pgp-signed-test) - (progn - (mml2015-clean-buffer) - (let ((coding-system-for-write (or gnus-newsgroup-charset - 'iso-8859-1))) - (funcall (mml2015-clear-verify-function)))) - (when (and mml2015-use (null (mml2015-clear-verify-function))) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details - (format "Clear verification not supported by `%s'.\n" mml2015-use)))) - (goto-char (point-min)) - (if (search-forward "\n\n" nil t) - (delete-region (point-min) (point))) - (if (re-search-forward mm-uu-pgp-beginning-signature nil t) - (delete-region (match-beginning 0) (point-max))) - (goto-char (point-min)) - (while (re-search-forward "^- " nil t) - (replace-match "" t t) - (forward-line 1))) - (list (mm-make-handle buf '("text/plain" (charset . gnus-decoded)))))) - -(defun mm-uu-pgp-signed-extract () - (let ((mm-security-handle (list (format "multipart/signed")))) - (mm-set-handle-multipart-parameter - mm-security-handle 'protocol "application/x-gnus-pgp-signature") - (save-restriction - (narrow-to-region start-point end-point) - (add-text-properties 0 (length (car mm-security-handle)) - (list 'buffer (mm-uu-copy-to-buffer)) - (car mm-security-handle)) - (setcdr mm-security-handle - (mm-uu-pgp-signed-extract-1 nil - mm-security-handle))) - mm-security-handle)) - -(defun mm-uu-pgp-encrypted-test (&rest rest) - (and - mml2015-use - (mml2015-clear-decrypt-function) - (cond - ((eq mm-decrypt-option 'never) nil) - ((eq mm-decrypt-option 'always) t) - ((eq mm-decrypt-option 'known) t) - (t (y-or-n-p "Decrypt pgp encrypted part?"))))) - -(defun mm-uu-pgp-encrypted-extract-1 (handles ctl) - (let ((buf (mm-uu-copy-to-buffer (point-min) (point-max)))) - (if (mm-uu-pgp-encrypted-test) - (with-current-buffer buf - (mml2015-clean-buffer) - (funcall (mml2015-clear-decrypt-function)))) - (list - (mm-make-handle buf - '("text/plain" (charset . gnus-decoded)))))) - -(defun mm-uu-pgp-encrypted-extract () - (let ((mm-security-handle (list (format "multipart/encrypted")))) - (mm-set-handle-multipart-parameter - mm-security-handle 'protocol "application/x-gnus-pgp-encrypted") - (save-restriction - (narrow-to-region start-point end-point) - (add-text-properties 0 (length (car mm-security-handle)) - (list 'buffer (mm-uu-copy-to-buffer)) - (car mm-security-handle)) - (setcdr mm-security-handle - (mm-uu-pgp-encrypted-extract-1 nil - mm-security-handle))) - mm-security-handle)) - -(defun mm-uu-gpg-key-skip-to-last () - (let ((point (point)) - (end-regexp (mm-uu-end-regexp entry)) - (beginning-regexp (mm-uu-beginning-regexp entry))) - (when (and end-regexp - (not (mm-uu-configure-p (mm-uu-type entry) 'disabled))) - (while (re-search-forward end-regexp nil t) - (skip-chars-forward " \t\n\r") - (if (looking-at beginning-regexp) - (setq point (match-end 0))))) - (goto-char point))) - -(defun mm-uu-pgp-key-extract () - (let ((buf (mm-uu-copy-to-buffer start-point end-point))) - (mm-make-handle buf - '("application/pgp-keys")))) - -;;;###autoload -(defun mm-uu-dissect () - "Dissect the current buffer and return a list of uu handles." - (let ((case-fold-search t) - text-start start-point end-point file-name result - text-plain-type entry func) - (save-excursion - (goto-char (point-min)) - (cond - ((looking-at "\n") - (forward-line)) - ((search-forward "\n\n" nil t) - t) - (t (goto-char (point-max)))) - ;;; gnus-decoded is a fake charset, which means no further - ;;; decoding. - (setq text-start (point) - text-plain-type '("text/plain" (charset . gnus-decoded))) - (while (re-search-forward mm-uu-beginning-regexp nil t) - (setq start-point (match-beginning 0)) - (let ((alist mm-uu-type-alist) - (beginning-regexp (match-string 0))) - (while (not entry) - (if (string-match (mm-uu-beginning-regexp (car alist)) - beginning-regexp) - (setq entry (car alist)) - (pop alist)))) - (if (setq func (mm-uu-function-1 entry)) - (funcall func)) - (forward-line);; in case of failure - (when (and (not (mm-uu-configure-p (mm-uu-type entry) 'disabled)) - (let ((end-regexp (mm-uu-end-regexp entry))) - (if (not end-regexp) - (or (setq end-point (point-max)) t) - (prog1 - (re-search-forward end-regexp nil t) - (forward-line) - (setq end-point (point))))) - (or (not (setq func (mm-uu-function-2 entry))) - (funcall func))) - (if (and (> start-point text-start) - (progn - (goto-char text-start) - (re-search-forward "." start-point t))) - (push - (mm-make-handle (mm-uu-copy-to-buffer text-start start-point) - text-plain-type) - result)) - (push - (funcall (mm-uu-function-extract entry)) - result) - (goto-char (setq text-start end-point)))) - (when result - (if (and (> (point-max) (1+ text-start)) - (save-excursion - (goto-char text-start) - (re-search-forward "." nil t))) - (push - (mm-make-handle (mm-uu-copy-to-buffer text-start (point-max)) - text-plain-type) - result)) - (setq result (cons "multipart/mixed" (nreverse result)))) - result))) - -(provide 'mm-uu) - -;;; mm-uu.el ends here diff --git a/lisp/mm-view.el b/lisp/mm-view.el deleted file mode 100644 index 82f116c..0000000 --- a/lisp/mm-view.el +++ /dev/null @@ -1,378 +0,0 @@ -;;; mm-view.el --- Functions for viewing MIME objects -;; Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(require 'mail-parse) -(require 'mailcap) -(require 'mm-bodies) -(require 'mm-decode) - -(eval-and-compile - (autoload 'gnus-article-prepare-display "gnus-art") - (autoload 'vcard-parse-string "vcard") - (autoload 'vcard-format-string "vcard") - (autoload 'fill-flowed "flow-fill") - (unless (fboundp 'diff-mode) - (autoload 'diff-mode "diff-mode" "" t nil))) - -;;; -;;; Functions for displaying various formats inline -;;; -(defun mm-inline-image-emacs (handle) - (let ((b (point-marker)) - buffer-read-only) - (insert "\n") - (put-image (mm-get-image handle) b) - (mm-handle-set-undisplayer - handle - `(lambda () (remove-images ,b (1+ ,b)))))) - -(defun mm-inline-image-xemacs (handle) - (insert "\n") - (forward-char -1) - (let ((b (point)) - (annot (make-annotation (mm-get-image handle) nil 'text)) - buffer-read-only) - (mm-handle-set-undisplayer - handle - `(lambda () - (let (buffer-read-only) - (delete-annotation ,annot) - (delete-region ,(set-marker (make-marker) b) - ,(set-marker (make-marker) (point)))))) - (set-extent-property annot 'mm t) - (set-extent-property annot 'duplicable t))) - -(eval-and-compile - (if (featurep 'xemacs) - (defalias 'mm-inline-image 'mm-inline-image-xemacs) - (defalias 'mm-inline-image 'mm-inline-image-emacs))) - -(defvar mm-w3-setup nil) -(defun mm-setup-w3 () - (unless mm-w3-setup - (require 'w3) - (w3-do-setup) - (require 'url) - (require 'w3-vars) - (require 'url-vars) - (setq mm-w3-setup t))) - -(defun mm-inline-text (handle) - (let ((type (mm-handle-media-subtype handle)) - text buffer-read-only) - (cond - ((equal type "html") - (mm-setup-w3) - (setq text (mm-get-part handle)) - (let ((b (point)) - (url-standalone-mode t) - (url-current-object - (url-generic-parse-url (format "cid:%s" (mm-handle-id handle)))) - (width (window-width)) - (charset (mail-content-type-get - (mm-handle-type handle) 'charset))) - (save-excursion - (insert text) - (save-restriction - (narrow-to-region b (point)) - (goto-char (point-min)) - (if (or (and (boundp 'w3-meta-content-type-charset-regexp) - (re-search-forward - w3-meta-content-type-charset-regexp nil t)) - (and (boundp 'w3-meta-charset-content-type-regexp) - (re-search-forward - w3-meta-charset-content-type-regexp nil t))) - (setq charset - (or (let ((bsubstr (buffer-substring-no-properties - (match-beginning 2) - (match-end 2)))) - (if (fboundp 'w3-coding-system-for-mime-charset) - (w3-coding-system-for-mime-charset bsubstr) - (mm-charset-to-coding-system bsubstr))) - charset))) - (delete-region (point-min) (point-max)) - (insert (mm-decode-string text charset)) - (save-window-excursion - (save-restriction - (let ((w3-strict-width width) - ;; Don't let w3 set the global version of - ;; this variable. - (fill-column fill-column) - (url-standalone-mode t)) - (condition-case var - (w3-region (point-min) (point-max)) - (error - (delete-region (point-min) (point-max)) - (let ((b (point)) - (charset (mail-content-type-get - (mm-handle-type handle) 'charset))) - (if (or (eq charset 'gnus-decoded) - (eq mail-parse-charset 'gnus-decoded)) - (save-restriction - (narrow-to-region (point) (point)) - (mm-insert-part handle) - (goto-char (point-max))) - (insert (mm-decode-string (mm-get-part handle) - charset)))) - (message - "Error while rendering html; showing as text/plain")))))) - (mm-handle-set-undisplayer - handle - `(lambda () - (let (buffer-read-only) - (if (functionp 'remove-specifier) - (mapcar (lambda (prop) - (remove-specifier - (face-property 'default prop) - (current-buffer))) - '(background background-pixmap foreground))) - (delete-region ,(point-min-marker) - ,(point-max-marker))))))))) - ((or (equal type "enriched") - (equal type "richtext")) - (save-excursion - (mm-with-unibyte-buffer - (mm-insert-part handle) - (save-window-excursion - (enriched-decode (point-min) (point-max)) - (setq text (buffer-string))))) - (mm-insert-inline handle text)) - ((equal type "x-vcard") - (mm-insert-inline - handle - (concat "\n-- \n" - (ignore-errors - (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 - (let ((b (point)) - (charset (mail-content-type-get - (mm-handle-type handle) 'charset))) - (if (or (eq charset 'gnus-decoded) - ;; This is probably not entirely correct, but - ;; makes rfc822 parts with embedded multiparts work. - (eq mail-parse-charset 'gnus-decoded)) - (save-restriction - (narrow-to-region (point) (point)) - (mm-insert-part handle) - (goto-char (point-max))) - (insert (mm-decode-string (mm-get-part handle) 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) - (mm-handle-set-undisplayer - handle - `(lambda () - (let (buffer-read-only) - (delete-region ,(point-min-marker) - ,(point-max-marker))))))))))) - -(defun mm-insert-inline (handle text) - "Insert TEXT inline from HANDLE." - (let ((b (point))) - (insert text) - (mm-handle-set-undisplayer - handle - `(lambda () - (let (buffer-read-only) - (delete-region ,(set-marker (make-marker) b) - ,(set-marker (make-marker) (point)))))))) - -(defun mm-inline-audio (handle) - (message "Not implemented")) - -(defun mm-view-sound-file () - (message "Not implemented")) - -(defun mm-w3-prepare-buffer () - (require 'w3) - (let ((url-standalone-mode t)) - (w3-prepare-buffer))) - -(defun mm-view-message () - (mm-enable-multibyte) - (let (handles) - (let (gnus-article-mime-handles) - ;; Double decode problem may happen. See mm-inline-message. - (run-hooks 'gnus-article-decode-hook) - (gnus-article-prepare-display) - (setq handles gnus-article-mime-handles)) - (when handles - (setq gnus-article-mime-handles - (mm-merge-handles gnus-article-mime-handles handles)))) - (fundamental-mode) - (goto-char (point-min))) - -(defun mm-inline-message (handle) - (let ((b (point)) - (bolp (bolp)) - (charset (mail-content-type-get - (mm-handle-type handle) 'charset)) - gnus-displaying-mime handles) - (when (and charset - (stringp charset)) - (setq charset (intern (downcase charset))) - (when (eq charset 'us-ascii) - (setq charset nil))) - (save-excursion - (save-restriction - (narrow-to-region b b) - (mm-insert-part handle) - (let (gnus-article-mime-handles - ;; disable prepare hook - gnus-article-prepare-hook - (gnus-newsgroup-charset - (or charset gnus-newsgroup-charset))) - (run-hooks 'gnus-article-decode-hook) - (gnus-article-prepare-display) - (setq handles gnus-article-mime-handles)) - (goto-char (point-min)) - (unless bolp - (insert "\n")) - (goto-char (point-max)) - (unless (bolp) - (insert "\n")) - (insert "----------\n\n") - (when handles - (setq gnus-article-mime-handles - (mm-merge-handles gnus-article-mime-handles handles))) - (mm-handle-set-undisplayer - handle - `(lambda () - (let (buffer-read-only) - (if (fboundp 'remove-specifier) - ;; This is only valid on XEmacs. - (mapcar (lambda (prop) - (remove-specifier - (face-property 'default prop) (current-buffer))) - '(background background-pixmap foreground))) - (delete-region ,(point-min-marker) ,(point-max-marker))))))))) - -(defun mm-display-inline-fontify (handle mode) - (let (text) - ;; XEmacs @#$@ version of font-lock refuses to fully turn itself - ;; on for buffers whose name begins with " ". That's why we use - ;; save-current-buffer/get-buffer-create rather than - ;; with-temp-buffer. - (save-current-buffer - (set-buffer (generate-new-buffer "*fontification*")) - (unwind-protect - (progn - (buffer-disable-undo) - (mm-insert-part handle) - (funcall mode) - (let ((font-lock-verbose nil)) - ;; I find font-lock a bit too verbose. - (font-lock-fontify-buffer)) - ;; By default, XEmacs font-lock uses non-duplicable text - ;; properties. This code forces all the text properties - ;; to be copied along with the text. - (when (fboundp 'extent-list) - (map-extents (lambda (ext ignored) - (set-extent-property ext 'duplicable t) - nil) - nil nil nil nil nil 'text-prop)) - (setq text (buffer-string))) - (kill-buffer (current-buffer)))) - (mm-insert-inline handle text))) - -;; Shouldn't these functions check whether the user even wants to use -;; font-lock? At least under XEmacs, this fontification is pretty -;; much unconditional. Also, it would be nice to change for the size -;; of the fontified region. - -(defun mm-display-patch-inline (handle) - (mm-display-inline-fontify handle 'diff-mode)) - -(defun mm-display-elisp-inline (handle) - (mm-display-inline-fontify handle 'emacs-lisp-mode)) - -;; id-signedData OBJECT IDENTIFIER ::= { iso(1) member-body(2) -;; us(840) rsadsi(113549) pkcs(1) pkcs7(7) 2 } -(defvar mm-pkcs7-signed-magic - (mm-string-as-unibyte - (apply 'concat - (mapcar 'char-to-string - (list ?\x30 ?\x5c ?\x28 ?\x80 ?\x5c ?\x7c ?\x81 ?\x2e ?\x5c - ?\x7c ?\x82 ?\x2e ?\x2e ?\x5c ?\x7c ?\x83 ?\x2e ?\x2e - ?\x2e ?\x5c ?\x29 ?\x06 ?\x09 ?\x5c ?\x2a ?\x86 ?\x48 - ?\x86 ?\xf7 ?\x0d ?\x01 ?\x07 ?\x02))))) - -;; id-envelopedData OBJECT IDENTIFIER ::= { iso(1) member-body(2) -;; us(840) rsadsi(113549) pkcs(1) pkcs7(7) 3 } -(defvar mm-pkcs7-enveloped-magic - (mm-string-as-unibyte - (apply 'concat - (mapcar 'char-to-string - (list ?\x30 ?\x5c ?\x28 ?\x80 ?\x5c ?\x7c ?\x81 ?\x2e ?\x5c - ?\x7c ?\x82 ?\x2e ?\x2e ?\x5c ?\x7c ?\x83 ?\x2e ?\x2e - ?\x2e ?\x5c ?\x29 ?\x06 ?\x09 ?\x5c ?\x2a ?\x86 ?\x48 - ?\x86 ?\xf7 ?\x0d ?\x01 ?\x07 ?\x03))))) - -(defun mm-view-pkcs7-get-type (handle) - (mm-with-unibyte-buffer - (mm-insert-part handle) - (cond ((looking-at mm-pkcs7-enveloped-magic) - 'enveloped) - ((looking-at mm-pkcs7-signed-magic) - 'signed) - (t - (error "Could not identify PKCS#7 type"))))) - -(defun mm-view-pkcs7 (handle) - (case (mm-view-pkcs7-get-type handle) - (enveloped (mm-view-pkcs7-decrypt handle)) - (otherwise (error "Unknown or unimplemented PKCS#7 type")))) - -(defun mm-view-pkcs7-decrypt (handle) - (insert-buffer (mm-handle-buffer handle)) - (goto-char (point-min)) - (insert "MIME-Version: 1.0\n") - (mm-insert-headers "application/pkcs7-mime" "base64" "smime.p7m") - (smime-decrypt-region - (point-min) (point-max) - (if (= (length smime-keys) 1) - (cadar smime-keys) - (smime-get-key-by-email - (completing-read "Decrypt this part with which key? " - smime-keys nil nil - (and (listp (car-safe smime-keys)) - (caar smime-keys))))))) - -(provide 'mm-view) - -;;; mm-view.el ends here diff --git a/lisp/mmgnus.el b/lisp/mmgnus.el deleted file mode 100644 index 3493ee1..0000000 --- a/lisp/mmgnus.el +++ /dev/null @@ -1,92 +0,0 @@ -;;; mmgnus.el --- MIME entity implementation for gnus-article - -;; Copyright (C) 1998 Free Software Foundation, Inc. - -;; Author: MORIOKA Tomohiko -;; Keywords: MIME, multimedia, mail, news - -;; This file is part of Chao-gnus. - -;; 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, 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Code: - -(require 'mmbuffer) - -(luna-define-class mime-gnus-entity (mime-buffer-entity) - (number - subject from date id references chars lines xref extra)) - -(luna-define-internal-accessors 'mime-gnus-entity) - -(luna-define-method initialize-instance ((entity mime-gnus-entity) - &rest init-args) - (apply (car (luna-class-find-functions - (luna-find-class 'standard-object) - 'initialize-instance)) - entity init-args) - ) - -;; (luna-define-method mime-entity-fetch-field ((entity mime-gnus-entity) -;; field-name) -;; (or (funcall (car (luna-class-find-functions -;; (luna-find-class 'mime-entity) -;; 'mime-entity-fetch-field)) -;; entity field-name) -;; (with-current-buffer gnus-original-article-buffer -;; (let ((ret (std11-field-body field-name))) -;; (when ret -;; (or (symbolp field-name) -;; (setq field-name -;; (intern (capitalize (capitalize field-name))))) -;; (mime-entity-set-original-header-internal -;; entity -;; (put-alist field-name ret -;; (mime-entity-original-header-internal entity))) -;; ret))))) - -;; (luna-define-method mime-entity-buffer ((entity mime-gnus-entity)) -;; ;; (if (with-current-buffer gnus-summary-buffer -;; ;; (eq gnus-current-article (mail-header-number entity))) -;; ;; ...) -;; (unless (mime-buffer-entity-header-end-internal entity) -;; (set-buffer gnus-original-article-buffer) -;; (mime-buffer-entity-set-header-start-internal entity (point-min)) -;; (mime-buffer-entity-set-body-end-internal entity (point-max)) -;; (goto-char (point-min)) -;; (if (re-search-forward "^$" nil t) -;; (progn -;; (mime-buffer-entity-set-header-end-internal entity (match-end 0)) -;; (mime-buffer-entity-set-body-start-internal -;; entity -;; (if (= (mime-buffer-entity-header-end-internal entity) -;; (mime-buffer-entity-body-end-internal entity)) -;; (mime-buffer-entity-body-end-internal entity) -;; (1+ (mime-buffer-entity-header-end-internal entity)) -;; )) -;; ) -;; (mime-buffer-entity-set-header-end-internal entity (point-min)) -;; (mime-buffer-entity-set-body-start-internal entity (point-min)) -;; )) -;; gnus-original-article-buffer) - - -;;; @ end -;;; - -(provide 'mmgnus) - -;;; mmgnus.el ends here diff --git a/lisp/mml-sec.el b/lisp/mml-sec.el deleted file mode 100644 index fbd92c7..0000000 --- a/lisp/mml-sec.el +++ /dev/null @@ -1,112 +0,0 @@ -;;; mml-sec.el --- A package with security functions for MML documents -;; Copyright (C) 2000 Free Software Foundation, Inc. - -;; Author: Simon Josefsson -;; This file is not part of GNU Emacs, but the same permissions apply. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(require 'smime) -(require 'mml2015) -(require 'mml-smime) -(eval-when-compile (require 'cl)) - -(defvar mml-sign-alist - '(("smime" mml-smime-sign-buffer mml-smime-sign-query) - ("pgpmime" mml-pgpmime-sign-buffer list)) - "Alist of MIME signer functions.") - -(defvar mml-default-sign-method (caar mml-sign-alist) - "Default sign method.") - -(defvar mml-encrypt-alist - '(("smime" mml-smime-encrypt-buffer mml-smime-encrypt-query) - ("pgpmime" mml-pgpmime-encrypt-buffer list)) - "Alist of MIME encryption functions.") - -(defvar mml-default-encrypt-method (caar mml-encrypt-alist) - "Default encryption method.") - -;;; Security functions - -(defun mml-smime-sign-buffer (cont) - (or (mml-smime-sign cont) - (error "Signing failed... inspect message logs for errors"))) - -(defun mml-smime-encrypt-buffer (cont) - (or (mml-smime-encrypt cont) - (error "Encryption failed... inspect message logs for errors"))) - -(defun mml-pgpmime-sign-buffer (cont) - (or (mml2015-sign cont) - (error "Signing failed... inspect message logs for errors"))) - -(defun mml-pgpmime-encrypt-buffer (cont) - (or (mml2015-encrypt cont) - (error "Encryption failed... inspect message logs for errors"))) - -(defun mml-secure-part (method &optional sign) - (save-excursion - (let ((tags (funcall (nth 2 (assoc method (if sign mml-sign-alist - mml-encrypt-alist)))))) - (cond ((re-search-backward - "<#\\(multipart\\|part\\|external\\|mml\\)" nil t) - (goto-char (match-end 0)) - (insert (if sign " sign=" " encrypt=") method) - (while tags - (let ((key (pop tags)) - (value (pop tags))) - (when value - ;; Quote VALUE if it contains suspicious characters. - (when (string-match "[\"'\\~/*;() \t\n]" value) - (setq value (prin1-to-string value))) - (insert (format " %s=%s" key value)))))) - ((or (re-search-backward - (concat "^" (regexp-quote mail-header-separator) "\n") nil t) - (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "\n") nil t)) - (goto-char (match-end 0)) - (apply 'mml-insert-tag 'part (cons (if sign 'sign 'encrypt) - (cons method tags)))) - (t (error "The message is corrupted. No mail header separator")))))) - -(defun mml-secure-sign-pgpmime () - "Add MML tags to PGP/MIME sign this MML part." - (interactive) - (mml-secure-part "pgpmime" 'sign)) - -(defun mml-secure-sign-smime () - "Add MML tags to S/MIME sign this MML part." - (interactive) - (mml-secure-part "smime" 'sign)) - -(defun mml-secure-encrypt-pgpmime () - "Add MML tags to PGP/MIME encrypt this MML part." - (interactive) - (mml-secure-part "pgpmime")) - -(defun mml-secure-encrypt-smime () - "Add MML tags to S/MIME encrypt this MML part." - (interactive) - (mml-secure-part "smime")) - -(provide 'mml-sec) - -;;; mml-sec.el ends here diff --git a/lisp/mml-smime.el b/lisp/mml-smime.el deleted file mode 100644 index ac87492..0000000 --- a/lisp/mml-smime.el +++ /dev/null @@ -1,194 +0,0 @@ -;;; mml-smime.el --- S/MIME support for MML -;; Copyright (c) 2000, 2001 Free Software Foundation, Inc. - -;; Author: Simon Josefsson -;; Keywords: Gnus, MIME, S/MIME, MML - -;; This file is a part of GNU Emacs. - -;; GNU Emacs 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, or (at your -;; option) any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(require 'smime) -(require 'mm-decode) - -(defun mml-smime-sign (cont) - (when (null smime-keys) - (customize-variable 'smime-keys) - (error "No S/MIME keys configured, use customize to add your key")) - (smime-sign-buffer (cdr (assq 'keyfile cont))) - (goto-char (point-max))) - -(defun mml-smime-encrypt (cont) - (let (certnames certfiles tmp file tmpfiles) - ;; xxx tmp files are always an security issue - (while (setq tmp (pop cont)) - (if (and (consp tmp) (eq (car tmp) 'certfile)) - (push (cdr tmp) certnames))) - (while (setq tmp (pop certnames)) - (if (not (and (not (file-exists-p tmp)) - (get-buffer tmp))) - (push tmp certfiles) - (setq file (make-temp-name mm-tmp-directory)) - (with-current-buffer tmp - (write-region (point-min) (point-max) file)) - (push file certfiles) - (push file tmpfiles))) - (if (smime-encrypt-buffer certfiles) - (progn - (while (setq tmp (pop tmpfiles)) - (delete-file tmp)) - t) - (while (setq tmp (pop tmpfiles)) - (delete-file tmp)) - nil)) - (goto-char (point-max))) - -(defun mml-smime-sign-query () - ;; query information (what certificate) from user when MML tag is - ;; added, for use later by the signing process - (when (null smime-keys) - (customize-variable 'smime-keys) - (error "No S/MIME keys configured, use customize to add your key")) - (list 'keyfile - (if (= (length smime-keys) 1) - (cadar smime-keys) - (or (let ((from (cadr (funcall gnus-extract-address-components - (or (save-excursion - (save-restriction - (message-narrow-to-headers) - (message-fetch-field "from"))) - ""))))) - (and from (smime-get-key-by-email from))) - (smime-get-key-by-email - (completing-read "Sign this part with what signature? " - smime-keys nil nil - (and (listp (car-safe smime-keys)) - (caar smime-keys)))))))) - -(defun mml-smime-get-file-cert () - (ignore-errors - (list 'certfile (read-file-name - "File with recipient's S/MIME certificate: " - smime-certificate-directory nil t "")))) - -(defun mml-smime-get-dns-cert () - ;; todo: deal with comma separated multiple recipients - (let (result who bad cert) - (condition-case () - (while (not result) - (setq who (read-from-minibuffer - (format "%sLookup certificate for: " (or bad "")) - (cadr (funcall gnus-extract-address-components - (or (save-excursion - (save-restriction - (message-narrow-to-headers) - (message-fetch-field "to"))) - ""))))) - (if (setq cert (smime-cert-by-dns who)) - (setq result (list 'certfile (buffer-name cert))) - (setq bad (format "`%s' not found. " who)))) - (quit)) - result)) - -(defun mml-smime-encrypt-query () - ;; todo: add ldap support (xemacs ldap api?) - ;; todo: try dns/ldap automatically first, before prompting user - (let (certs done) - (while (not done) - (ecase (read (gnus-completing-read "dns" "Fetch certificate from" - '(("dns") ("file")) nil t)) - (dns (setq certs (append certs - (mml-smime-get-dns-cert)))) - (file (setq certs (append certs - (mml-smime-get-file-cert))))) - (setq done (not (y-or-n-p "Add more recipients? ")))) - certs)) - -(defun mml-smime-verify (handle ctl) - (with-temp-buffer - (insert-buffer (mm-handle-multipart-original-buffer ctl)) - (goto-char (point-min)) - (insert (format "Content-Type: %s; " (mm-handle-media-type ctl))) - (insert (format "protocol=\"%s\"; " - (mm-handle-multipart-ctl-parameter ctl 'protocol))) - (insert (format "micalg=\"%s\"; " - (mm-handle-multipart-ctl-parameter ctl 'micalg))) - (insert (format "boundary=\"%s\"\n\n" - (mm-handle-multipart-ctl-parameter ctl 'boundary))) - (when (get-buffer smime-details-buffer) - (kill-buffer smime-details-buffer)) - (let ((buf (current-buffer)) - (good-signature (smime-noverify-buffer)) - (good-certificate (and (or smime-CA-file smime-CA-directory) - (smime-verify-buffer))) - addresses openssl-output) - (setq openssl-output (with-current-buffer smime-details-buffer - (buffer-string))) - (if (not good-signature) - (progn - ;; we couldn't verify message, fail with openssl output as message - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "Failed") - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details - (concat "OpenSSL failed to verify message integrity:\n" - "-------------------------------------------\n" - openssl-output))) - ;; verify mail addresses in mail against those in certificate - (when (and (smime-pkcs7-region (point-min) (point-max)) - (smime-pkcs7-certificates-region (point-min) (point-max))) - (with-temp-buffer - (insert-buffer-substring buf) - (goto-char (point-min)) - (while (re-search-forward "-----END CERTIFICATE-----" nil t) - (when (smime-pkcs7-email-region (point-min) (point)) - (setq addresses (append (smime-buffer-as-string-region - (point-min) (point)) addresses))) - (delete-region (point-min) (point))) - (setq addresses (mapcar 'downcase addresses)))) - (if (not (member (downcase (or (mm-handle-multipart-from ctl) "")) addresses)) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "Sender address forged") - (if good-certificate - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "Ok (sender authenticated)") - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "Ok (sender not trusted)"))) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details - (concat "Sender claimed to be: " (mm-handle-multipart-from ctl) "\n" - (if addresses - (concat "Addresses in certificate: " - (mapconcat 'identity addresses ", ")) - "No addresses found in certificate. (Requires OpenSSL 0.9.6 or later.)") - "\n" "\n" - "OpenSSL output:\n" - "---------------\n" openssl-output "\n" - "Certificate(s) inside S/MIME signature:\n" - "---------------------------------------\n" - (buffer-string) "\n"))))) - handle) - -(defun mml-smime-verify-test (handle ctl) - smime-openssl-program) - -(provide 'mml-smime) - -;;; mml-smime.el ends here diff --git a/lisp/mml.el b/lisp/mml.el deleted file mode 100644 index 2826144..0000000 --- a/lisp/mml.el +++ /dev/null @@ -1,952 +0,0 @@ -;;; mml.el --- A package for parsing and validating MML documents -;; Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(require 'mm-util) -(require 'mm-bodies) -(require 'mm-encode) -(require 'mm-decode) -(require 'mml-sec) -(eval-when-compile (require 'cl)) - -(eval-and-compile - (autoload 'message-make-message-id "message") - (autoload 'gnus-setup-posting-charset "gnus-msg") - (autoload 'gnus-add-minor-mode "gnus-ems") - (autoload 'message-fetch-field "message") - (autoload 'message-posting-charset "message")) - -(defcustom mml-content-type-parameters - '(name access-type expiration size permission format) - "*A list of acceptable parameters in MML tag. -These parameters are generated in Content-Type header if exists." - :type '(repeat (symbol :tag "Parameter")) - :group 'message) - -(defcustom mml-content-disposition-parameters - '(filename creation-date modification-date read-date) - "*A list of acceptable parameters in MML tag. -These parameters are generated in Content-Disposition header if exists." - :type '(repeat (symbol :tag "Parameter")) - :group 'message) - -(defvar mml-tweak-type-alist nil - "A list of (TYPE . FUNCTION) for tweaking MML parts. -TYPE is a string containing a regexp to match the MIME type. FUNCTION -is a Lisp function which is called with the MML handle to tweak the -part. This variable is used only when no TWEAK parameter exists in -the MML handle.") - -(defvar mml-tweak-function-alist nil - "A list of (NAME . FUNCTION) for tweaking MML parts. -NAME is a string containing the name of the TWEAK parameter in the MML -handle. FUNCTION is a Lisp function which is called with the MML -handle to tweak the part.") - -(defvar mml-generate-multipart-alist nil - "*Alist of multipart generation functions. -Each entry has the form (NAME . FUNCTION), where -NAME is a string containing the name of the part (without the -leading \"/multipart/\"), -FUNCTION is a Lisp function which is called to generate the part. - -The Lisp function has to supply the appropriate MIME headers and the -contents of this part.") - -(defvar mml-syntax-table - (let ((table (copy-syntax-table emacs-lisp-mode-syntax-table))) - (modify-syntax-entry ?\\ "/" table) - (modify-syntax-entry ?< "(" table) - (modify-syntax-entry ?> ")" table) - (modify-syntax-entry ?@ "w" table) - (modify-syntax-entry ?/ "w" table) - (modify-syntax-entry ?= " " table) - (modify-syntax-entry ?* " " table) - (modify-syntax-entry ?\; " " table) - (modify-syntax-entry ?\' " " table) - table)) - -(defvar mml-boundary-function 'mml-make-boundary - "A function called to suggest a boundary. -The function may be called several times, and should try to make a new -suggestion each time. The function is called with one parameter, -which is a number that says how many times the function has been -called for this message.") - -(defvar mml-confirmation-set nil - "A list of symbols, each of which disables some warning. -`unknown-encoding': always send messages contain characters with -unknown encoding; `use-ascii': always use ASCII for those characters -with unknown encoding; `multipart': always send messages with more than -one charsets.") - -(defvar mml-generate-default-type "text/plain") - -(defvar mml-buffer-list nil) - -(defun mml-generate-new-buffer (name) - (let ((buf (generate-new-buffer name))) - (push buf mml-buffer-list) - buf)) - -(defun mml-destroy-buffers () - (let (kill-buffer-hook) - (mapcar 'kill-buffer mml-buffer-list) - (setq mml-buffer-list nil))) - -(defun mml-parse () - "Parse the current buffer as an MML document." - (save-excursion - (goto-char (point-min)) - (let ((table (syntax-table))) - (unwind-protect - (progn - (set-syntax-table mml-syntax-table) - (mml-parse-1)) - (set-syntax-table table))))) - -(defun mml-parse-1 () - "Parse the current buffer as an MML document." - (let (struct tag point contents charsets warn use-ascii no-markup-p raw) - (while (and (not (eobp)) - (not (looking-at "<#/multipart"))) - (cond - ((looking-at "<#multipart") - (push (nconc (mml-read-tag) (mml-parse-1)) struct)) - ((looking-at "<#external") - (push (nconc (mml-read-tag) (list (cons 'contents (mml-read-part)))) - struct)) - (t - (if (or (looking-at "<#part") (looking-at "<#mml")) - (setq tag (mml-read-tag) - no-markup-p nil - warn nil) - (setq tag (list 'part '(type . "text/plain")) - no-markup-p t - warn t)) - (setq raw (cdr (assq 'raw tag)) - point (point) - contents (mml-read-part (eq 'mml (car tag))) - charsets (cond - (raw nil) - ((assq 'charset tag) - (list - (intern (downcase (cdr (assq 'charset tag)))))) - (t - (mm-find-mime-charset-region point (point))))) - (when (and (not raw) (memq nil charsets)) - (if (or (memq 'unknown-encoding mml-confirmation-set) - (message-options-get 'unknown-encoding) - (and (y-or-n-p "\ -Message contains characters with unknown encoding. Really send?") - (message-options-set 'unknown-encoding t))) - (if (setq use-ascii - (or (memq 'use-ascii mml-confirmation-set) - (message-options-get 'use-ascii) - (and (y-or-n-p "Use ASCII as charset?") - (message-options-set 'use-ascii t)))) - (setq charsets (delq nil charsets)) - (setq warn nil)) - (error "Edit your message to remove those characters"))) - (if (or raw - (eq 'mml (car tag)) - (< (length charsets) 2)) - (if (or (not no-markup-p) - (string-match "[^ \t\r\n]" contents)) - ;; Don't create blank parts. - (push (nconc tag (list (cons 'contents contents))) - struct)) - (let ((nstruct (mml-parse-singlepart-with-multiple-charsets - tag point (point) use-ascii))) - (when (and warn - (not (memq 'multipart mml-confirmation-set)) - (not (message-options-get 'multipart)) - (not (and (y-or-n-p (format "\ -A message part needs to be split into %d charset parts. Really send? " - (length nstruct))) - (message-options-set 'multipart t)))) - (error "Edit your message to use only one charset")) - (setq struct (nconc nstruct struct))))))) - (unless (eobp) - (forward-line 1)) - (nreverse struct))) - -(defun mml-parse-singlepart-with-multiple-charsets - (orig-tag beg end &optional use-ascii) - (save-excursion - (save-restriction - (narrow-to-region beg end) - (goto-char (point-min)) - (let ((current (or (mm-mime-charset (mm-charset-after)) - (and use-ascii 'us-ascii))) - charset struct space newline paragraph) - (while (not (eobp)) - (setq charset (mm-mime-charset (mm-charset-after))) - (cond - ;; The charset remains the same. - ((eq charset 'us-ascii)) - ((or (and use-ascii (not charset)) - (eq charset current)) - (setq space nil - newline nil - paragraph nil)) - ;; The initial charset was ascii. - ((eq current 'us-ascii) - (setq current charset - space nil - newline nil - paragraph nil)) - ;; We have a change in charsets. - (t - (push (append - orig-tag - (list (cons 'contents - (buffer-substring-no-properties - beg (or paragraph newline space (point)))))) - struct) - (setq beg (or paragraph newline space (point)) - current charset - space nil - newline nil - paragraph nil))) - ;; Compute places where it might be nice to break the part. - (cond - ((memq (following-char) '(? ?\t)) - (setq space (1+ (point)))) - ((and (eq (following-char) ?\n) - (not (bobp)) - (eq (char-after (1- (point))) ?\n)) - (setq paragraph (point))) - ((eq (following-char) ?\n) - (setq newline (1+ (point))))) - (forward-char 1)) - ;; Do the final part. - (unless (= beg (point)) - (push (append orig-tag - (list (cons 'contents - (buffer-substring-no-properties - beg (point))))) - struct)) - struct)))) - -(defun mml-read-tag () - "Read a tag and return the contents." - (let ((orig-point (point)) - contents name elem val) - (forward-char 2) - (setq name (buffer-substring-no-properties - (point) (progn (forward-sexp 1) (point)))) - (skip-chars-forward " \t\n") - (while (not (looking-at ">[ \t]*\n?")) - (setq elem (buffer-substring-no-properties - (point) (progn (forward-sexp 1) (point)))) - (skip-chars-forward "= \t\n") - (setq val (buffer-substring-no-properties - (point) (progn (forward-sexp 1) (point)))) - (when (string-match "^\"\\(.*\\)\"$" val) - (setq val (match-string 1 val))) - (push (cons (intern elem) val) contents) - (skip-chars-forward " \t\n")) - (goto-char (match-end 0)) - ;; Don't skip the leading space. - ;;(skip-chars-forward " \t\n") - ;; Put the tag location into the returned contents - (setq contents (append (list (cons 'tag-location orig-point)) contents)) - (cons (intern name) (nreverse contents)))) - -(defun mml-read-part (&optional mml) - "Return the buffer up till the next part, multipart or closing part or multipart. -If MML is non-nil, return the buffer up till the correspondent mml tag." - (let ((beg (point)) (count 1)) - ;; If the tag ended at the end of the line, we go to the next line. - (when (looking-at "[ \t]*\n") - (forward-line 1)) - (if mml - (progn - (while (and (> count 0) (not (eobp))) - (if (re-search-forward "<#\\(/\\)?mml." nil t) - (setq count (+ count (if (match-beginning 1) -1 1))) - (goto-char (point-max)))) - (buffer-substring-no-properties beg (if (> count 0) - (point) - (match-beginning 0)))) - (if (re-search-forward - "<#\\(/\\)?\\(multipart\\|part\\|external\\|mml\\)." nil t) - (prog1 - (buffer-substring-no-properties beg (match-beginning 0)) - (if (or (not (match-beginning 1)) - (equal (match-string 2) "multipart")) - (goto-char (match-beginning 0)) - (when (looking-at "[ \t]*\n") - (forward-line 1)))) - (buffer-substring-no-properties beg (goto-char (point-max))))))) - -(defvar mml-boundary nil) -(defvar mml-base-boundary "-=-=") -(defvar mml-multipart-number 0) - -(defun mml-generate-mime () - "Generate a MIME message based on the current MML document." - (let ((cont (mml-parse)) - (mml-multipart-number mml-multipart-number)) - (if (not cont) - nil - (with-temp-buffer - (if (and (consp (car cont)) - (= (length cont) 1)) - (mml-generate-mime-1 (car cont)) - (mml-generate-mime-1 (nconc (list 'multipart '(type . "mixed")) - cont))) - (buffer-string))))) - -(defun mml-generate-mime-1 (cont) - (let ((mm-use-ultra-safe-encoding - (or mm-use-ultra-safe-encoding (assq 'sign cont)))) - (save-restriction - (narrow-to-region (point) (point)) - (mml-tweak-part cont) - (cond - ((or (eq (car cont) 'part) (eq (car cont) 'mml)) - (let ((raw (cdr (assq 'raw cont))) - coded encoding charset filename type) - (setq type (or (cdr (assq 'type cont)) "text/plain")) - (if (and (not raw) - (member (car (split-string type "/")) '("text" "message"))) - (with-temp-buffer - (setq charset (mm-charset-to-coding-system - (cdr (assq 'charset cont)))) - (when (eq charset 'ascii) - (setq charset nil)) - (cond - ((cdr (assq 'buffer cont)) - (insert-buffer-substring (cdr (assq 'buffer cont)))) - ((and (setq filename (cdr (assq 'filename cont))) - (not (equal (cdr (assq 'nofile cont)) "yes"))) - (let ((coding-system-for-read charset)) - (mm-insert-file-contents filename))) - ((eq 'mml (car cont)) - (insert (cdr (assq 'contents cont)))) - (t - (save-restriction - (narrow-to-region (point) (point)) - (insert (cdr (assq 'contents cont))) - ;; Remove quotes from quoted tags. - (goto-char (point-min)) - (while (re-search-forward - "<#!+/?\\(part\\|multipart\\|external\\|mml\\)" - nil t) - (delete-region (+ (match-beginning 0) 2) - (+ (match-beginning 0) 3)))))) - (cond - ((eq (car cont) 'mml) - (let ((mml-boundary (funcall mml-boundary-function - (incf mml-multipart-number))) - (mml-generate-default-type "text/plain")) - (mml-to-mime)) - (let ((mm-7bit-chars (concat mm-7bit-chars "\x1b"))) - ;; ignore 0x1b, it is part of iso-2022-jp - (setq encoding (mm-body-7-or-8)))) - ((string= (car (split-string type "/")) "message") - (let ((mm-7bit-chars (concat mm-7bit-chars "\x1b"))) - ;; ignore 0x1b, it is part of iso-2022-jp - (setq encoding (mm-body-7-or-8)))) - (t - (setq charset (mm-encode-body charset)) - (setq encoding (mm-body-encoding - charset (cdr (assq 'encoding cont)))))) - (setq coded (buffer-string))) - (mm-with-unibyte-buffer - (cond - ((cdr (assq 'buffer cont)) - (insert-buffer-substring (cdr (assq 'buffer cont)))) - ((and (setq filename (cdr (assq 'filename cont))) - (not (equal (cdr (assq 'nofile cont)) "yes"))) - (let ((coding-system-for-read mm-binary-coding-system)) - (mm-insert-file-contents filename nil nil nil nil t))) - (t - (insert (cdr (assq 'contents cont))))) - (setq encoding (mm-encode-buffer type) - coded (mm-string-as-multibyte (buffer-string))))) - (mml-insert-mime-headers cont type charset encoding) - (insert "\n") - (insert coded))) - ((eq (car cont) 'external) - (insert "Content-Type: message/external-body") - (let ((parameters (mml-parameter-string - cont '(expiration size permission))) - (name (cdr (assq 'name cont))) - (url (cdr (assq 'url cont)))) - (when name - (setq name (mml-parse-file-name name)) - (if (stringp name) - (mml-insert-parameter - (mail-header-encode-parameter "name" name) - "access-type=local-file") - (mml-insert-parameter - (mail-header-encode-parameter - "name" (file-name-nondirectory (nth 2 name))) - (mail-header-encode-parameter "site" (nth 1 name)) - (mail-header-encode-parameter - "directory" (file-name-directory (nth 2 name)))) - (mml-insert-parameter - (concat "access-type=" - (if (member (nth 0 name) '("ftp@" "anonymous@")) - "anon-ftp" - "ftp"))))) - (when url - (mml-insert-parameter - (mail-header-encode-parameter "url" url) - "access-type=url")) - (when parameters - (mml-insert-parameter-string - cont '(expiration size permission)))) - (insert "\n\n") - (insert "Content-Type: " (cdr (assq 'type cont)) "\n") - (insert "Content-ID: " (message-make-message-id) "\n") - (insert "Content-Transfer-Encoding: " - (or (cdr (assq 'encoding cont)) "binary")) - (insert "\n\n") - (insert (or (cdr (assq 'contents cont)))) - (insert "\n")) - ((eq (car cont) 'multipart) - (let* ((type (or (cdr (assq 'type cont)) "mixed")) - (mml-generate-default-type (if (equal type "digest") - "message/rfc822" - "text/plain")) - (handler (assoc type mml-generate-multipart-alist))) - (if handler - (funcall (cdr handler) cont) - ;; No specific handler. Use default one. - (let ((mml-boundary (mml-compute-boundary cont))) - (insert (format "Content-Type: multipart/%s; boundary=\"%s\"\n" - type mml-boundary)) - (let ((cont cont) part) - (while (setq part (pop cont)) - ;; Skip `multipart' and attributes. - (when (and (consp part) (consp (cdr part))) - (insert "\n--" mml-boundary "\n") - (mml-generate-mime-1 part)))) - (insert "\n--" mml-boundary "--\n"))))) - (t - (error "Invalid element: %S" cont))) - (let ((item (assoc (cdr (assq 'sign cont)) mml-sign-alist)) - sender recipients) - (when item - (if (setq sender (cdr (assq 'sender cont))) - (message-options-set 'message-sender sender)) - (if (setq recipients (cdr (assq 'recipients cont))) - (message-options-set 'message-sender recipients)) - (funcall (nth 1 item) cont))) - (let ((item (assoc (cdr (assq 'encrypt cont)) mml-encrypt-alist)) - sender recipients) - (when item - (if (setq sender (cdr (assq 'sender cont))) - (message-options-set 'message-sender sender)) - (if (setq recipients (cdr (assq 'recipients cont))) - (message-options-set 'message-sender recipients)) - (funcall (nth 1 item) cont)))))) - -(defun mml-compute-boundary (cont) - "Return a unique boundary that does not exist in CONT." - (let ((mml-boundary (funcall mml-boundary-function - (incf mml-multipart-number)))) - ;; This function tries again and again until it has found - ;; a unique boundary. - (while (not (catch 'not-unique - (mml-compute-boundary-1 cont)))) - mml-boundary)) - -(defun mml-compute-boundary-1 (cont) - (let (filename) - (cond - ((eq (car cont) 'part) - (with-temp-buffer - (cond - ((cdr (assq 'buffer cont)) - (insert-buffer-substring (cdr (assq 'buffer cont)))) - ((and (setq filename (cdr (assq 'filename cont))) - (not (equal (cdr (assq 'nofile cont)) "yes"))) - (mm-insert-file-contents filename)) - (t - (insert (cdr (assq 'contents cont))))) - (goto-char (point-min)) - (when (re-search-forward (concat "^--" (regexp-quote mml-boundary)) - nil t) - (setq mml-boundary (funcall mml-boundary-function - (incf mml-multipart-number))) - (throw 'not-unique nil)))) - ((eq (car cont) 'multipart) - (mapcar 'mml-compute-boundary-1 (cddr cont)))) - t)) - -(defun mml-make-boundary (number) - (concat (make-string (% number 60) ?=) - (if (> number 17) - (format "%x" number) - "") - mml-base-boundary)) - -(defun mml-insert-mime-headers (cont type charset encoding) - (let (parameters disposition description) - (setq parameters - (mml-parameter-string - cont mml-content-type-parameters)) - (when (or charset - parameters - (not (equal type mml-generate-default-type))) - (when (consp charset) - (error - "Can't encode a part with several charsets.")) - (insert "Content-Type: " type) - (when charset - (insert "; " (mail-header-encode-parameter - "charset" (symbol-name charset)))) - (when parameters - (mml-insert-parameter-string - cont mml-content-type-parameters)) - (insert "\n")) - (setq parameters - (mml-parameter-string - cont mml-content-disposition-parameters)) - (when (or (setq disposition (cdr (assq 'disposition cont))) - parameters) - (insert "Content-Disposition: " (or disposition "inline")) - (when parameters - (mml-insert-parameter-string - cont mml-content-disposition-parameters)) - (insert "\n")) - (unless (eq encoding '7bit) - (insert (format "Content-Transfer-Encoding: %s\n" encoding))) - (when (setq description (cdr (assq 'description cont))) - (insert "Content-Description: " - (mail-encode-encoded-word-string description) "\n")))) - -(defun mml-parameter-string (cont types) - (let ((string "") - value type) - (while (setq type (pop types)) - (when (setq value (cdr (assq type cont))) - ;; Strip directory component from the filename parameter. - (when (eq type 'filename) - (setq value (file-name-nondirectory value))) - (setq string (concat string "; " - (mail-header-encode-parameter - (symbol-name type) value))))) - (when (not (zerop (length string))) - string))) - -(defun mml-insert-parameter-string (cont types) - (let (value type) - (while (setq type (pop types)) - (when (setq value (cdr (assq type cont))) - ;; Strip directory component from the filename parameter. - (when (eq type 'filename) - (setq value (file-name-nondirectory value))) - (mml-insert-parameter - (mail-header-encode-parameter - (symbol-name type) value)))))) - -(eval-when-compile - (defvar ange-ftp-name-format) - (defvar efs-path-regexp)) -(defun mml-parse-file-name (path) - (if (if (boundp 'efs-path-regexp) - (string-match efs-path-regexp path) - (if (boundp 'ange-ftp-name-format) - (string-match (car ange-ftp-name-format) path))) - (list (match-string 1 path) (match-string 2 path) - (substring path (1+ (match-end 2)))) - path)) - -(defun mml-insert-buffer (buffer) - "Insert BUFFER at point and quote any MML markup." - (save-restriction - (narrow-to-region (point) (point)) - (insert-buffer-substring buffer) - (mml-quote-region (point-min) (point-max)) - (goto-char (point-max)))) - -;;; -;;; Transforming MIME to MML -;;; - -(defun mime-to-mml (&optional handles) - "Translate the current buffer (which should be a message) into MML. -If HANDLES is non-nil, use it instead reparsing the buffer." - ;; First decode the head. - (save-restriction - (message-narrow-to-head) - (mail-decode-encoded-word-region (point-min) (point-max))) - (unless handles - (setq handles (mm-dissect-buffer t))) - (goto-char (point-min)) - (search-forward "\n\n" nil t) - (delete-region (point) (point-max)) - (if (stringp (car handles)) - (mml-insert-mime handles) - (mml-insert-mime handles t)) - (mm-destroy-parts handles) - (save-restriction - (message-narrow-to-head) - ;; Remove them, they are confusing. - (message-remove-header "Content-Type") - (message-remove-header "MIME-Version") - (message-remove-header "Content-Transfer-Encoding"))) - -(defun mml-to-mime () - "Translate the current buffer from MML to MIME." - (message-encode-message-body) - (save-restriction - (message-narrow-to-headers-or-head) - (let ((mail-parse-charset message-default-charset)) - (mail-encode-encoded-word-buffer)))) - -(defun mml-insert-mime (handle &optional no-markup) - (let (textp buffer mmlp) - ;; Determine type and stuff. - (unless (stringp (car handle)) - (unless (setq textp (equal (mm-handle-media-supertype handle) "text")) - (save-excursion - (set-buffer (setq buffer (mml-generate-new-buffer " *mml*"))) - (mm-insert-part handle) - (if (setq mmlp (equal (mm-handle-media-type handle) - "message/rfc822")) - (mime-to-mml))))) - (if mmlp - (mml-insert-mml-markup handle nil t t) - (unless (and no-markup - (equal (mm-handle-media-type handle) "text/plain")) - (mml-insert-mml-markup handle buffer textp))) - (cond - (mmlp - (insert-buffer buffer) - (goto-char (point-max)) - (insert "<#/mml>\n")) - ((stringp (car handle)) - (mapcar 'mml-insert-mime (cdr handle)) - (insert "<#/multipart>\n")) - (textp - (let ((charset (mail-content-type-get - (mm-handle-type handle) 'charset))) - (if (eq charset 'gnus-decoded) - (mm-insert-part handle) - (insert (mm-decode-string (mm-get-part handle) charset)))) - (goto-char (point-max))) - (t - (insert "<#/part>\n"))))) - -(defun mml-insert-mml-markup (handle &optional buffer nofile mmlp) - "Take a MIME handle and insert an MML tag." - (if (stringp (car handle)) - (insert "<#multipart type=" (mm-handle-media-subtype handle) - ">\n") - (if mmlp - (insert "<#mml type=" (mm-handle-media-type handle)) - (insert "<#part type=" (mm-handle-media-type handle))) - (dolist (elem (append (cdr (mm-handle-type handle)) - (cdr (mm-handle-disposition handle)))) - (unless (symbolp (cdr elem)) - (insert " " (symbol-name (car elem)) "=\"" (cdr elem) "\""))) - (when (mm-handle-disposition handle) - (insert " disposition=" (car (mm-handle-disposition handle)))) - (when buffer - (insert " buffer=\"" (buffer-name buffer) "\"")) - (when nofile - (insert " nofile=yes")) - (when (mm-handle-description handle) - (insert " description=\"" (mm-handle-description handle) "\"")) - (insert ">\n"))) - -(defun mml-insert-parameter (&rest parameters) - "Insert PARAMETERS in a nice way." - (dolist (param parameters) - (insert ";") - (let ((point (point))) - (insert " " param) - (when (> (current-column) 71) - (goto-char point) - (insert "\n ") - (end-of-line))))) - -;;; -;;; Mode for inserting and editing MML forms -;;; - -(defvar mml-mode-map - (let ((sign (make-sparse-keymap)) - (encrypt (make-sparse-keymap)) - (map (make-sparse-keymap)) - (main (make-sparse-keymap))) - (define-key sign "p" 'mml-secure-sign-pgpmime) - (define-key sign "s" 'mml-secure-sign-smime) - (define-key encrypt "p" 'mml-secure-encrypt-pgpmime) - (define-key encrypt "s" 'mml-secure-encrypt-smime) - (define-key map "f" 'mml-attach-file) - (define-key map "b" 'mml-attach-buffer) - (define-key map "e" 'mml-attach-external) - (define-key map "q" 'mml-quote-region) - (define-key map "m" 'mml-insert-multipart) - (define-key map "p" 'mml-insert-part) - (define-key map "v" 'mml-validate) - (define-key map "P" 'mml-preview) - (define-key map "s" sign) - (define-key map "c" encrypt) - ;;(define-key map "n" 'mml-narrow-to-part) - ;; `M-m' conflicts with `back-to-indentation'. - ;; (define-key main "\M-m" map) - (define-key main "\C-c\C-m" map) - main)) - -(easy-menu-define - mml-menu mml-mode-map "" - '("Attachments" - ["Attach File" mml-attach-file t] - ["Attach Buffer" mml-attach-buffer t] - ["Attach External" mml-attach-external t] - ["Insert Part" mml-insert-part t] - ["Insert Multipart" mml-insert-multipart t] - ["PGP/MIME Sign" mml-secure-sign-pgpmime t] - ["PGP/MIME Encrypt" mml-secure-encrypt-pgpmime t] - ["S/MIME Sign" mml-secure-sign-smime t] - ["S/MIME Encrypt" mml-secure-encrypt-smime t] - ;;["Narrow" mml-narrow-to-part t] - ["Quote MML" mml-quote-region t] - ["Validate MML" mml-validate t] - ["Preview" mml-preview t])) - -(defvar mml-mode nil - "Minor mode for editing MML.") - -(defun mml-mode (&optional arg) - "Minor mode for editing MML. - -\\{mml-mode-map}" - (interactive "P") - (when (set (make-local-variable 'mml-mode) - (if (null arg) (not mml-mode) - (> (prefix-numeric-value arg) 0))) - (gnus-add-minor-mode 'mml-mode " MML" mml-mode-map) - (easy-menu-add mml-menu mml-mode-map) - (run-hooks 'mml-mode-hook))) - -;;; -;;; Helper functions for reading MIME stuff from the minibuffer and -;;; inserting stuff to the buffer. -;;; - -(defun mml-minibuffer-read-file (prompt) - (let ((file (read-file-name prompt nil nil t))) - ;; Prevent some common errors. This is inspired by similar code in - ;; VM. - (when (file-directory-p file) - (error "%s is a directory, cannot attach" file)) - (unless (file-exists-p file) - (error "No such file: %s" file)) - (unless (file-readable-p file) - (error "Permission denied: %s" file)) - file)) - -(defun mml-minibuffer-read-type (name &optional default) - (mailcap-parse-mimetypes) - (let* ((default (or default - (mm-default-file-encoding name) - ;; Perhaps here we should check what the file - ;; looks like, and offer text/plain if it looks - ;; like text/plain. - "application/octet-stream")) - (string (completing-read - (format "Content type (default %s): " default) - (mapcar 'list (mailcap-mime-types))))) - (if (not (equal string "")) - string - default))) - -(defun mml-minibuffer-read-description () - (let ((description (read-string "One line description: "))) - (when (string-match "\\`[ \t]*\\'" description) - (setq description nil)) - description)) - -(defun mml-quote-region (beg end) - "Quote the MML tags in the region." - (interactive "r") - (save-excursion - (save-restriction - ;; Temporarily narrow the region to defend from changes - ;; invalidating END. - (narrow-to-region beg end) - (goto-char (point-min)) - ;; Quote parts. - (while (re-search-forward - "<#!*/?\\(multipart\\|part\\|external\\|mml\\)" nil t) - ;; Insert ! after the #. - (goto-char (+ (match-beginning 0) 2)) - (insert "!"))))) - -(defun mml-insert-tag (name &rest plist) - "Insert an MML tag described by NAME and PLIST." - (when (symbolp name) - (setq name (symbol-name name))) - (insert "<#" name) - (while plist - (let ((key (pop plist)) - (value (pop plist))) - (when value - ;; Quote VALUE if it contains suspicious characters. - (when (string-match "[\"'\\~/*;() \t\n]" value) - (setq value (prin1-to-string value))) - (insert (format " %s=%s" key value))))) - (insert ">\n")) - -(defun mml-insert-empty-tag (name &rest plist) - "Insert an empty MML tag described by NAME and PLIST." - (when (symbolp name) - (setq name (symbol-name name))) - (apply #'mml-insert-tag name plist) - (insert "<#/" name ">\n")) - -;;; Attachment functions. - -(defun mml-attach-file (file &optional type description) - "Attach a file to the outgoing MIME message. -The file is not inserted or encoded until you send the message with -`\\[message-send-and-exit]' or `\\[message-send]'. - -FILE is the name of the file to attach. TYPE is its content-type, a -string of the form \"type/subtype\". DESCRIPTION is a one-line -description of the attachment." - (interactive - (let* ((file (mml-minibuffer-read-file "Attach file: ")) - (type (mml-minibuffer-read-type file)) - (description (mml-minibuffer-read-description))) - (list file type description))) - (mml-insert-empty-tag 'part 'type type 'filename file - 'disposition "attachment" 'description description)) - -(defun mml-attach-buffer (buffer &optional type description) - "Attach a buffer to the outgoing MIME message. -See `mml-attach-file' for details of operation." - (interactive - (let* ((buffer (read-buffer "Attach buffer: ")) - (type (mml-minibuffer-read-type buffer "text/plain")) - (description (mml-minibuffer-read-description))) - (list buffer type description))) - (mml-insert-empty-tag 'part 'type type 'buffer buffer - 'disposition "attachment" 'description description)) - -(defun mml-attach-external (file &optional type description) - "Attach an external file into the buffer. -FILE is an ange-ftp/efs specification of the part location. -TYPE is the MIME type to use." - (interactive - (let* ((file (mml-minibuffer-read-file "Attach external file: ")) - (type (mml-minibuffer-read-type file)) - (description (mml-minibuffer-read-description))) - (list file type description))) - (mml-insert-empty-tag 'external 'type type 'name file - 'disposition "attachment" 'description description)) - -(defun mml-insert-multipart (&optional type) - (interactive (list (completing-read "Multipart type (default mixed): " - '(("mixed") ("alternative") ("digest") ("parallel") - ("signed") ("encrypted")) - nil nil "mixed"))) - (or type - (setq type "mixed")) - (mml-insert-empty-tag "multipart" 'type type) - (forward-line -1)) - -(defun mml-insert-part (&optional type) - (interactive - (list (mml-minibuffer-read-type ""))) - (mml-insert-tag 'part 'type type 'disposition "inline") - (forward-line -1)) - -(defun mml-preview (&optional raw) - "Display current buffer with Gnus, in a new buffer. -If RAW, don't highlight the article." - (interactive "P") - (let ((buf (current-buffer)) - (message-options message-options) - (message-posting-charset (or (gnus-setup-posting-charset - (save-restriction - (message-narrow-to-headers-or-head) - (message-fetch-field "Newsgroups"))) - message-posting-charset))) - (message-options-set-recipient) - (switch-to-buffer (generate-new-buffer - (concat (if raw "*Raw MIME preview of " - "*MIME preview of ") (buffer-name)))) - (erase-buffer) - (insert-buffer buf) - (if (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "\n") nil t) - (replace-match "\n")) - (mml-to-mime) - (if raw - (when (fboundp 'set-buffer-multibyte) - (let ((s (buffer-string))) - ;; Insert the content into unibyte buffer. - (erase-buffer) - (mm-disable-multibyte) - (insert s))) - (let ((gnus-newsgroup-charset (car message-posting-charset))) - (run-hooks 'gnus-article-decode-hook) - (let ((gnus-newsgroup-name "dummy")) - (gnus-article-prepare-display)))) - ;; Disable article-mode-map. - (use-local-map nil) - (setq buffer-read-only t) - (local-set-key "q" (lambda () (interactive) (kill-buffer nil))) - (goto-char (point-min)))) - -(defun mml-validate () - "Validate the current MML document." - (interactive) - (mml-parse)) - -(defun mml-tweak-part (cont) - "Tweak a MML part." - (let ((tweak (cdr (assq 'tweak cont))) - func) - (cond - (tweak - (setq func - (or (cdr (assoc tweak mml-tweak-function-alist)) - (intern tweak)))) - (mml-tweak-type-alist - (let ((alist mml-tweak-type-alist) - (type (or (cdr (assq 'type cont)) "text/plain"))) - (while alist - (if (string-match (caar alist) type) - (setq func (cdar alist) - alist nil) - (setq alist (cdr alist))))))) - (if func - (funcall func cont) - cont))) - -(provide 'mml) - -;;; mml.el ends here diff --git a/lisp/mml2015.el b/lisp/mml2015.el deleted file mode 100644 index a16a4e5..0000000 --- a/lisp/mml2015.el +++ /dev/null @@ -1,643 +0,0 @@ -;;; mml2015.el --- MIME Security with Pretty Good Privacy (PGP) -;; Copyright (C) 2000, 2001 Free Software Foundation, Inc. - -;; Author: Shenghuo Zhu -;; Keywords: PGP MIME MML - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your -;; option) any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'gnus-clfns)) -(require 'mm-decode) - -(defvar mml2015-use (or - (progn - (ignore-errors - (require 'gpg)) - (and (fboundp 'gpg-sign-detached) - 'gpg)) - (progn (ignore-errors - (load "mc-toplev")) - (and (fboundp 'mc-encrypt-generic) - (fboundp 'mc-sign-generic) - (fboundp 'mc-cleanup-recipient-headers) - 'mailcrypt))) - "The package used for PGP/MIME.") - -;; Something is not RFC2015. -(defvar mml2015-function-alist - '((mailcrypt mml2015-mailcrypt-sign - mml2015-mailcrypt-encrypt - mml2015-mailcrypt-verify - mml2015-mailcrypt-decrypt - mml2015-mailcrypt-clear-verify - mml2015-mailcrypt-clear-decrypt) - (gpg mml2015-gpg-sign - mml2015-gpg-encrypt - mml2015-gpg-verify - mml2015-gpg-decrypt - mml2015-gpg-clear-verify - mml2015-gpg-clear-decrypt)) - "Alist of PGP/MIME functions.") - -(defvar mml2015-result-buffer nil) - -(defvar mml2015-trust-boundaries-alist - '((trust-undefined . nil) - (trust-none . nil) - (trust-marginal . t) - (trust-full . t) - (trust-ultimate . t)) - "Trust boundaries for a signer's GnuPG key. -This alist contains pairs of the form (trust-symbol . boolean), with -symbols that are contained in `gpg-unabbrev-trust-alist'. The boolean -specifies whether the given trust value is good enough to be trusted -by you.") - -;;; mailcrypt wrapper - -(eval-and-compile - (autoload 'mailcrypt-decrypt "mailcrypt") - (autoload 'mailcrypt-verify "mailcrypt") - (autoload 'mc-pgp-always-sign "mailcrypt") - (autoload 'mc-encrypt-generic "mc-toplev") - (autoload 'mc-cleanup-recipient-headers "mc-toplev") - (autoload 'mc-sign-generic "mc-toplev")) - -(eval-when-compile - (defvar mc-default-scheme) - (defvar mc-schemes)) - -(defvar mml2015-decrypt-function 'mailcrypt-decrypt) -(defvar mml2015-verify-function 'mailcrypt-verify) - -(defun mml2015-format-error (err) - (if (stringp (cadr err)) - (cadr err) - (format "%S" (cdr err)))) - -(defun mml2015-mailcrypt-decrypt (handle ctl) - (catch 'error - (let (child handles result) - (unless (setq child (mm-find-part-by-type - (cdr handle) - "application/octet-stream" nil t)) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "Corrupted") - (throw 'error handle)) - (with-temp-buffer - (mm-insert-part child) - (setq result - (condition-case err - (funcall mml2015-decrypt-function) - (error - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details (mml2015-format-error err)) - nil) - (quit - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details "Quit.") - nil))) - (unless (car result) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "Failed") - (throw 'error handle)) - (setq handles (mm-dissect-buffer t))) - (mm-destroy-parts handle) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "OK") - (if (listp (car handles)) - handles - (list handles))))) - -(defun mml2015-mailcrypt-clear-decrypt () - (let (result) - (setq result - (condition-case err - (funcall mml2015-decrypt-function) - (error - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details (mml2015-format-error err)) - nil) - (quit - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details "Quit.") - nil))) - (if (car result) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "OK") - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "Failed")))) - -(defun mml2015-fix-micalg (alg) - (and alg - (upcase (if (string-match "^pgp-" alg) - (substring alg (match-end 0)) - alg)))) - -(defun mml2015-mailcrypt-verify (handle ctl) - (catch 'error - (let (part) - (unless (setq part (mm-find-raw-part-by-type - ctl (or (mm-handle-multipart-ctl-parameter - ctl 'protocol) - "application/pgp-signature") - t)) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "Corrupted") - (throw 'error handle)) - (with-temp-buffer - (insert "-----BEGIN PGP SIGNED MESSAGE-----\n") - (insert (format "Hash: %s\n\n" - (or (mml2015-fix-micalg - (mm-handle-multipart-ctl-parameter - ctl 'micalg)) - "SHA1"))) - (save-restriction - (narrow-to-region (point) (point)) - (insert part "\n") - (goto-char (point-min)) - (while (not (eobp)) - (if (looking-at "^-") - (insert "- ")) - (forward-line))) - (unless (setq part (mm-find-part-by-type - (cdr handle) "application/pgp-signature" nil t)) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "Corrupted") - (throw 'error handle)) - (save-restriction - (narrow-to-region (point) (point)) - (mm-insert-part part) - (goto-char (point-min)) - (if (re-search-forward "^-----BEGIN PGP [^-]+-----\r?$" nil t) - (replace-match "-----BEGIN PGP SIGNATURE-----" t t)) - (if (re-search-forward "^-----END PGP [^-]+-----\r?$" nil t) - (replace-match "-----END PGP SIGNATURE-----" t t))) - (let ((mc-gpg-debug-buffer (get-buffer-create " *gnus gpg debug*"))) - (unless (condition-case err - (prog1 - (funcall mml2015-verify-function) - (if (get-buffer " *mailcrypt stderr temp") - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details - (with-current-buffer " *mailcrypt stderr temp" - (buffer-string)))) - (if (get-buffer " *mailcrypt stdout temp") - (kill-buffer " *mailcrypt stdout temp")) - (if (get-buffer " *mailcrypt stderr temp") - (kill-buffer " *mailcrypt stderr temp")) - (if (get-buffer " *mailcrypt status temp") - (kill-buffer " *mailcrypt status temp")) - (if (get-buffer mc-gpg-debug-buffer) - (kill-buffer mc-gpg-debug-buffer))) - (error - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details (mml2015-format-error err)) - nil) - (quit - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details "Quit.") - nil)) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "Failed") - (throw 'error handle)))) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "OK") - handle))) - -(defun mml2015-mailcrypt-clear-verify () - (let ((mc-gpg-debug-buffer (get-buffer-create " *gnus gpg debug*"))) - (if (condition-case err - (prog1 - (funcall mml2015-verify-function) - (if (get-buffer " *mailcrypt stderr temp") - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details - (with-current-buffer " *mailcrypt stderr temp" - (buffer-string)))) - (if (get-buffer " *mailcrypt stdout temp") - (kill-buffer " *mailcrypt stdout temp")) - (if (get-buffer " *mailcrypt stderr temp") - (kill-buffer " *mailcrypt stderr temp")) - (if (get-buffer " *mailcrypt status temp") - (kill-buffer " *mailcrypt status temp")) - (if (get-buffer mc-gpg-debug-buffer) - (kill-buffer mc-gpg-debug-buffer))) - (error - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details (mml2015-format-error err)) - nil) - (quit - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details "Quit.") - nil)) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "OK") - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "Failed")))) - -(defun mml2015-mailcrypt-sign (cont) - (mc-sign-generic (message-options-get 'message-sender) - nil nil nil nil) - (let ((boundary - (funcall mml-boundary-function (incf mml-multipart-number))) - hash point) - (goto-char (point-min)) - (unless (re-search-forward "^-----BEGIN PGP SIGNED MESSAGE-----\r?$" nil t) - (error "Cannot find signed begin line")) - (goto-char (match-beginning 0)) - (forward-line 1) - (unless (looking-at "Hash:[ \t]*\\([a-zA-Z0-9]+\\)") - (error "Cannot not find PGP hash")) - (setq hash (match-string 1)) - (unless (re-search-forward "^$" nil t) - (error "Cannot not find PGP message")) - (forward-line 1) - (delete-region (point-min) (point)) - (insert (format "Content-Type: multipart/signed; boundary=\"%s\";\n" - boundary)) - (insert (format "\tmicalg=pgp-%s; protocol=\"application/pgp-signature\"\n" - (downcase hash))) - (insert (format "\n--%s\n" boundary)) - (setq point (point)) - (goto-char (point-max)) - (unless (re-search-backward "^-----END PGP SIGNATURE-----\r?$" nil t) - (error "Cannot find signature part")) - (replace-match "-----END PGP MESSAGE-----" t t) - (goto-char (match-beginning 0)) - (unless (re-search-backward "^-----BEGIN PGP SIGNATURE-----\r?$" - nil t) - (error "Cannot find signature part")) - (replace-match "-----BEGIN PGP MESSAGE-----" t t) - (goto-char (match-beginning 0)) - (save-restriction - (narrow-to-region point (point)) - (goto-char point) - (while (re-search-forward "^- -" nil t) - (replace-match "-" t t)) - (goto-char (point-max))) - (insert (format "--%s\n" boundary)) - (insert "Content-Type: application/pgp-signature\n\n") - (goto-char (point-max)) - (insert (format "--%s--\n" boundary)) - (goto-char (point-max)))) - -(defun mml2015-mailcrypt-encrypt (cont) - (let ((mc-pgp-always-sign - (or mc-pgp-always-sign - (eq t (or (message-options-get 'message-sign-encrypt) - (message-options-set - 'message-sign-encrypt - (or (y-or-n-p "Sign the message? ") - 'not)))) - 'never))) - (mm-with-unibyte-current-buffer-mule4 - (mc-encrypt-generic - (or (message-options-get 'message-recipients) - (message-options-set 'message-recipients - (mc-cleanup-recipient-headers - (read-string "Recipients: ")))) - nil nil nil - (message-options-get 'message-sender)))) - (goto-char (point-min)) - (unless (looking-at "-----BEGIN PGP MESSAGE-----") - (error "Fail to encrypt the message")) - (let ((boundary - (funcall mml-boundary-function (incf mml-multipart-number)))) - (insert (format "Content-Type: multipart/encrypted; boundary=\"%s\";\n" - boundary)) - (insert "\tprotocol=\"application/pgp-encrypted\"\n\n") - (insert (format "--%s\n" boundary)) - (insert "Content-Type: application/pgp-encrypted\n\n") - (insert "Version: 1\n\n") - (insert (format "--%s\n" boundary)) - (insert "Content-Type: application/octet-stream\n\n") - (goto-char (point-max)) - (insert (format "--%s--\n" boundary)) - (goto-char (point-max)))) - -;;; gpg wrapper - -(eval-and-compile - (autoload 'gpg-decrypt "gpg") - (autoload 'gpg-verify "gpg") - (autoload 'gpg-verify-cleartext "gpg") - (autoload 'gpg-sign-detached "gpg") - (autoload 'gpg-sign-encrypt "gpg") - (autoload 'gpg-passphrase-read "gpg")) - -(defun mml2015-gpg-passphrase () - (or (message-options-get 'gpg-passphrase) - (message-options-set 'gpg-passphrase (gpg-passphrase-read)))) - -(defun mml2015-gpg-decrypt-1 () - (let ((cipher (current-buffer)) plain result) - (if (with-temp-buffer - (prog1 - (gpg-decrypt cipher (setq plain (current-buffer)) - mml2015-result-buffer nil) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details - (with-current-buffer mml2015-result-buffer - (buffer-string))) - (set-buffer cipher) - (erase-buffer) - (insert-buffer plain))) - '(t) - ;; Some wrong with the return value, check plain text buffer. - (if (> (point-max) (point-min)) - '(t) - nil)))) - -(defun mml2015-gpg-decrypt (handle ctl) - (let ((mml2015-decrypt-function 'mml2015-gpg-decrypt-1)) - (mml2015-mailcrypt-decrypt handle ctl))) - -(defun mml2015-gpg-clear-decrypt () - (let (result) - (setq result (mml2015-gpg-decrypt-1)) - (if (car result) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "OK") - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "Failed")))) - -(defun mml2015-gpg-pretty-print-fpr (fingerprint) - (let* ((result "") - (fpr-length (string-width fingerprint)) - (n-slice 0) - slice) - (setq fingerprint (string-to-list fingerprint)) - (while fingerprint - (setq fpr-length (- fpr-length 4)) - (setq slice (butlast fingerprint fpr-length)) - (setq fingerprint (nthcdr 4 fingerprint)) - (setq n-slice (1+ n-slice)) - (setq result - (concat - result - (case n-slice - (1 slice) - (otherwise (concat " " slice)))))) - result)) - -(defun mml2015-gpg-extract-signature-details () - (goto-char (point-min)) - (if (boundp 'gpg-unabbrev-trust-alist) - (let* ((signer (and (re-search-forward - "^\\[GNUPG:\\] GOODSIG [0-9A-Za-z]* \\(.*\\)$" - nil t) - (match-string 1))) - (fprint (and (re-search-forward - "^\\[GNUPG:\\] VALIDSIG \\([0-9a-zA-Z]*\\) " - nil t) - (match-string 1))) - (trust (and (re-search-forward "^\\[GNUPG:\\] \\(TRUST_.*\\)$" nil t) - (match-string 1))) - (trust-good-enough-p - (cdr (assoc (cdr (assoc trust gpg-unabbrev-trust-alist)) - mml2015-trust-boundaries-alist)))) - (if (and signer trust fprint) - (concat signer - (unless trust-good-enough-p - (concat "\nUntrusted, Fingerprint: " - (mml2015-gpg-pretty-print-fpr fprint)))) - "From unknown user")) - (if (re-search-forward "^gpg: Good signature from \"\\(.*\\)\"$" nil t) - (match-string 1) - "From unknown user"))) - -(defun mml2015-gpg-verify (handle ctl) - (catch 'error - (let (part message signature info-is-set-p) - (unless (setq part (mm-find-raw-part-by-type - ctl (or (mm-handle-multipart-ctl-parameter - ctl 'protocol) - "application/pgp-signature") - t)) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "Corrupted") - (throw 'error handle)) - (with-temp-buffer - (setq message (current-buffer)) - (insert part) - (with-temp-buffer - (setq signature (current-buffer)) - (unless (setq part (mm-find-part-by-type - (cdr handle) "application/pgp-signature" nil t)) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "Corrupted") - (throw 'error handle)) - (mm-insert-part part) - (unless (condition-case err - (prog1 - (gpg-verify message signature mml2015-result-buffer) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details - (with-current-buffer mml2015-result-buffer - (buffer-string)))) - (error - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details (mml2015-format-error err)) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "Error.") - (setq info-is-set-p t) - nil) - (quit - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details "Quit.") - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "Quit.") - (setq info-is-set-p t) - nil)) - (unless info-is-set-p - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "Failed")) - (throw 'error handle))) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info - (with-current-buffer mml2015-result-buffer - (mml2015-gpg-extract-signature-details)))) - handle))) - -(defun mml2015-gpg-clear-verify () - (if (condition-case err - (prog1 - (gpg-verify-cleartext (current-buffer) mml2015-result-buffer) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details - (with-current-buffer mml2015-result-buffer - (buffer-string)))) - (error - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details (mml2015-format-error err)) - nil) - (quit - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details "Quit.") - nil)) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info - (with-current-buffer mml2015-result-buffer - (mml2015-gpg-extract-signature-details))) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "Failed"))) - -(defun mml2015-gpg-sign (cont) - (let ((boundary - (funcall mml-boundary-function (incf mml-multipart-number))) - (text (current-buffer)) signature) - (goto-char (point-max)) - (unless (bolp) - (insert "\n")) - (with-temp-buffer - (unless (gpg-sign-detached text (setq signature (current-buffer)) - mml2015-result-buffer - nil - (message-options-get 'message-sender) - t t) ; armor & textmode - (unless (> (point-max) (point-min)) - (pop-to-buffer mml2015-result-buffer) - (error "Sign error"))) - (goto-char (point-min)) - (while (re-search-forward "\r+$" nil t) - (replace-match "" t t)) - (set-buffer text) - (goto-char (point-min)) - (insert (format "Content-Type: multipart/signed; boundary=\"%s\";\n" - boundary)) - ;;; FIXME: what is the micalg? - (insert "\tmicalg=pgp-sha1; protocol=\"application/pgp-signature\"\n") - (insert (format "\n--%s\n" boundary)) - (goto-char (point-max)) - (insert (format "\n--%s\n" boundary)) - (insert "Content-Type: application/pgp-signature\n\n") - (insert-buffer signature) - (goto-char (point-max)) - (insert (format "--%s--\n" boundary)) - (goto-char (point-max))))) - -(defun mml2015-gpg-encrypt (cont) - (let ((boundary - (funcall mml-boundary-function (incf mml-multipart-number))) - (text (current-buffer)) - cipher) - (mm-with-unibyte-current-buffer-mule4 - (with-temp-buffer - (unless (gpg-sign-encrypt - text (setq cipher (current-buffer)) - mml2015-result-buffer - (split-string - (or - (message-options-get 'message-recipients) - (message-options-set 'message-recipients - (read-string "Recipients: "))) - "[ \f\t\n\r\v,]+") - nil - (message-options-get 'message-sender) - t t) ; armor & textmode - (unless (> (point-max) (point-min)) - (pop-to-buffer mml2015-result-buffer) - (error "Encrypt error"))) - (goto-char (point-min)) - (while (re-search-forward "\r+$" nil t) - (replace-match "" t t)) - (set-buffer text) - (delete-region (point-min) (point-max)) - (insert (format "Content-Type: multipart/encrypted; boundary=\"%s\";\n" - boundary)) - (insert "\tprotocol=\"application/pgp-encrypted\"\n\n") - (insert (format "--%s\n" boundary)) - (insert "Content-Type: application/pgp-encrypted\n\n") - (insert "Version: 1\n\n") - (insert (format "--%s\n" boundary)) - (insert "Content-Type: application/octet-stream\n\n") - (insert-buffer cipher) - (goto-char (point-max)) - (insert (format "--%s--\n" boundary)) - (goto-char (point-max)))))) - -;;; General wrapper - -(defun mml2015-clean-buffer () - (if (gnus-buffer-live-p mml2015-result-buffer) - (with-current-buffer mml2015-result-buffer - (erase-buffer) - t) - (setq mml2015-result-buffer - (gnus-get-buffer-create "*MML2015 Result*")) - nil)) - -(defsubst mml2015-clear-decrypt-function () - (nth 6 (assq mml2015-use mml2015-function-alist))) - -(defsubst mml2015-clear-verify-function () - (nth 5 (assq mml2015-use mml2015-function-alist))) - -;;;###autoload -(defun mml2015-decrypt (handle ctl) - (mml2015-clean-buffer) - (let ((func (nth 4 (assq mml2015-use mml2015-function-alist)))) - (if func - (funcall func handle ctl) - handle))) - -;;;###autoload -(defun mml2015-decrypt-test (handle ctl) - mml2015-use) - -;;;###autoload -(defun mml2015-verify (handle ctl) - (mml2015-clean-buffer) - (let ((func (nth 3 (assq mml2015-use mml2015-function-alist)))) - (if func - (funcall func handle ctl) - handle))) - -;;;###autoload -(defun mml2015-verify-test (handle ctl) - mml2015-use) - -;;;###autoload -(defun mml2015-encrypt (cont) - (mml2015-clean-buffer) - (let ((func (nth 2 (assq mml2015-use mml2015-function-alist)))) - (if func - (funcall func cont) - (error "Cannot find encrypt function")))) - -;;;###autoload -(defun mml2015-sign (cont) - (mml2015-clean-buffer) - (let ((func (nth 1 (assq mml2015-use mml2015-function-alist)))) - (if func - (funcall func cont) - (error "Cannot find sign function")))) - -;;;###autoload -(defun mml2015-self-encrypt () - (mml2015-encrypt nil)) - -(provide 'mml2015) - -;;; mml2015.el ends here diff --git a/lisp/nnagent.el b/lisp/nnagent.el deleted file mode 100644 index 60c26cc..0000000 --- a/lisp/nnagent.el +++ /dev/null @@ -1,208 +0,0 @@ -;;; nnagent.el --- offline backend for Gnus -;; Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news, mail - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(require 'nnheader) -(require 'nnoo) -(eval-when-compile (require 'cl)) -(require 'gnus-agent) -(require 'nnml) - -(nnoo-declare nnagent - nnml) - - - -(defconst nnagent-version "nnagent 1.0") - -(defvoo nnagent-directory nil - "Internal variable." - nnml-directory) - -(defvoo nnagent-active-file nil - "Internal variable." - nnml-active-file) - -(defvoo nnagent-newsgroups-file nil - "Internal variable." - nnml-newsgroups-file) - -(defvoo nnagent-get-new-mail nil - "Internal variable." - nnml-get-new-mail) - -;;; Interface functions. - -(nnoo-define-basics nnagent) - -(defun nnagent-server (server) - (and server (format "%s+%s" (car gnus-command-method) server))) - -(deffoo nnagent-open-server (server &optional defs) - (setq defs - `((nnagent-directory ,(gnus-agent-directory)) - (nnagent-active-file ,(gnus-agent-lib-file "active")) - (nnagent-newsgroups-file ,(gnus-agent-lib-file "newsgroups")) - (nnagent-get-new-mail nil))) - (nnoo-change-server 'nnagent - (nnagent-server server) - defs) - (let ((dir (gnus-agent-directory)) - err) - (cond - ((not (condition-case arg - (file-exists-p dir) - (ftp-error (setq err (format "%s" arg))))) - (nnagent-close-server) - (nnheader-report - 'nnagent (or err - (format "No such file or directory: %s" dir)))) - ((not (file-directory-p (file-truename dir))) - (nnagent-close-server) - (nnheader-report 'nnagent "Not a directory: %s" dir)) - (t - (nnheader-report 'nnagent "Opened server %s using directory %s" - server dir) - t)))) - -(deffoo nnagent-retrieve-groups (groups &optional server) - (save-excursion - (cond - ((file-exists-p (gnus-agent-lib-file "groups")) - (nnmail-find-file (gnus-agent-lib-file "groups")) - 'groups) - ((file-exists-p (gnus-agent-lib-file "active")) - (nnmail-find-file (gnus-agent-lib-file "active")) - 'active) - (t nil)))) - -(defun nnagent-request-type (group article) - (unless (stringp article) - (let ((gnus-plugged t)) - (if (not (gnus-check-backend-function - 'request-type (car gnus-command-method))) - 'unknown - (funcall (gnus-get-function gnus-command-method 'request-type) - (gnus-group-real-name group) article))))) - -(deffoo nnagent-request-newgroups (date server) - nil) - -(deffoo nnagent-request-update-info (group info &optional server) - nil) - -(deffoo nnagent-request-post (&optional server) - (gnus-agent-insert-meta-information 'news gnus-command-method) - (gnus-request-accept-article "nndraft:queue" nil t t)) - -(deffoo nnagent-request-set-mark (group action server) - (with-temp-buffer - (insert (format "(%s-request-set-mark \"%s\" '%s \"%s\")\n" - (nth 0 gnus-command-method) group action - (or server (nth 1 gnus-command-method)))) - (append-to-file (point-min) (point-max) (gnus-agent-lib-file "flags"))) - nil) - -(deffoo nnagent-request-group (group &optional server dont-check) - (nnoo-parent-function 'nnagent 'nnml-request-group - (list group (nnagent-server server) dont-check))) - -(deffoo nnagent-close-group (group &optional server) - (nnoo-parent-function 'nnagent 'nnml-close-group - (list group (nnagent-server server)))) - -(deffoo nnagent-request-accept-article (group &optional server last) - (nnoo-parent-function 'nnagent 'nnml-request-accept-article - (list group (nnagent-server server) last))) - -(deffoo nnagent-request-article (id &optional group server buffer) - (nnoo-parent-function 'nnagent 'nnml-request-article - (list id group (nnagent-server server) buffer))) - -(deffoo nnagent-request-create-group (group &optional server args) - (nnoo-parent-function 'nnagent 'nnml-request-create-group - (list group (nnagent-server server) args))) - -(deffoo nnagent-request-delete-group (group &optional force server) - (nnoo-parent-function 'nnagent 'nnml-request-delete-group - (list group force (nnagent-server server)))) - -(deffoo nnagent-request-expire-articles (articles group &optional server force) - (nnoo-parent-function 'nnagent 'nnml-request-expire-articles - (list articles group (nnagent-server server) force))) - -(deffoo nnagent-request-list (&optional server) - (nnoo-parent-function 'nnagent 'nnml-request-list - (list (nnagent-server server)))) - -(deffoo nnagent-request-list-newsgroups (&optional server) - (nnoo-parent-function 'nnagent 'nnml-request-list-newsgroups - (list (nnagent-server server)))) - -(deffoo nnagent-request-move-article - (article group server accept-form &optional last) - (nnoo-parent-function 'nnagent 'nnml-request-move-article - (list article group (nnagent-server server) - accept-form last))) - -(deffoo nnagent-request-rename-group (group new-name &optional server) - (nnoo-parent-function 'nnagent 'nnml-request-rename-group - (list group new-name (nnagent-server server)))) - -(deffoo nnagent-request-scan (&optional group server) - (nnoo-parent-function 'nnagent 'nnml-request-scan - (list group (nnagent-server server)))) - -(deffoo nnagent-retrieve-headers (sequence &optional group server fetch-old) - (nnoo-parent-function 'nnagent 'nnml-retrieve-headers - (list sequence group (nnagent-server server) fetch-old))) - -(deffoo nnagent-set-status (article name value &optional group server) - (nnoo-parent-function 'nnagent 'nnml-set-status - (list article name value group (nnagent-server server)))) - -(deffoo nnagent-server-opened (&optional server) - (nnoo-parent-function 'nnagent 'nnml-server-opened - (list (nnagent-server server)))) - -(deffoo nnagent-status-message (&optional server) - (nnoo-parent-function 'nnagent 'nnml-status-message - (list (nnagent-server server)))) - -(deffoo nnagent-request-regenerate (server) - (nnoo-parent-function 'nnagent 'nnml-request-regenerate - (list (nnagent-server server)))) - -;; Use nnml functions for just about everything. -(nnoo-import nnagent - (nnml)) - - -;;; Internal functions. - -(provide 'nnagent) - -;;; nnagent.el ends here diff --git a/lisp/nnbabyl.el b/lisp/nnbabyl.el deleted file mode 100644 index 6e4f883..0000000 --- a/lisp/nnbabyl.el +++ /dev/null @@ -1,673 +0,0 @@ -;;; nnbabyl.el --- rmail mbox access for Gnus - -;; Copyright (C) 1995, 1996, 1997, 1998, 1099, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Masanobu UMEDA -;; Keywords: news, mail - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; For an overview of what the interface functions do, please see the -;; Gnus sources. - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'nnheader) -(condition-case nil - (require 'rmail) - (t (nnheader-message - 5 "Ignore rmail errors from this file, you don't have rmail"))) -(require 'nnmail) -(require 'nnoo) - -(nnoo-declare nnbabyl) - -(defvoo nnbabyl-mbox-file (expand-file-name "~/RMAIL") - "The name of the rmail box file in the users home directory. - -This variable is a virtual server slot. See the Gnus manual for details.") - -(defvoo nnbabyl-active-file (expand-file-name "~/.rmail-active") - "The name of the active file for the rmail box. - -This variable is a virtual server slot. See the Gnus manual for details.") - -(defvoo nnbabyl-get-new-mail t - "If non-nil, nnbabyl will check the incoming mail file and split the mail. - -This variable is a virtual server slot. See the Gnus manual for details.") - - -(defvoo nnbabyl-prepare-save-mail-hook nil - "Hook run narrowed to an article before saving. - -This variable is a virtual server slot. See the Gnus manual for details.") - - - -(defvar nnbabyl-mail-delimiter "\^_") - -(defconst nnbabyl-version "nnbabyl 1.0" - "nnbabyl version.") - -(defvoo nnbabyl-mbox-buffer nil) -(defvoo nnbabyl-current-group nil) -(defvoo nnbabyl-status-string "") -(defvoo nnbabyl-group-alist nil) -(defvoo nnbabyl-active-timestamp nil) - -(defvoo nnbabyl-previous-buffer-mode nil) - -(eval-and-compile - (autoload 'gnus-set-text-properties "gnus-ems")) - - - -;;; Interface functions - -(nnoo-define-basics nnbabyl) - -(deffoo nnbabyl-retrieve-headers (articles &optional group server fetch-old) - (save-excursion - (set-buffer nntp-server-buffer) - (erase-buffer) - (let ((number (length articles)) - (count 0) - (delim (concat "^" nnbabyl-mail-delimiter)) - article art-string start stop) - (nnbabyl-possibly-change-newsgroup group server) - (while (setq article (pop articles)) - (setq art-string (nnbabyl-article-string article)) - (set-buffer nnbabyl-mbox-buffer) - (end-of-line) - (when (or (search-forward art-string nil t) - (search-backward art-string nil t)) - (unless (re-search-backward delim nil t) - (goto-char (point-min))) - (while (and (not (looking-at ".+:")) - (zerop (forward-line 1)))) - (setq start (point)) - (search-forward "\n\n" nil t) - (setq stop (1- (point))) - (set-buffer nntp-server-buffer) - (insert "221 ") - (princ article (current-buffer)) - (insert " Article retrieved.\n") - (insert-buffer-substring nnbabyl-mbox-buffer start stop) - (goto-char (point-max)) - (insert ".\n")) - (and (numberp nnmail-large-newsgroup) - (> number nnmail-large-newsgroup) - (zerop (% (incf count) 20)) - (nnheader-message 5 "nnbabyl: Receiving headers... %d%%" - (/ (* count 100) number)))) - - (and (numberp nnmail-large-newsgroup) - (> number nnmail-large-newsgroup) - (nnheader-message 5 "nnbabyl: Receiving headers...done")) - - (set-buffer nntp-server-buffer) - (nnheader-fold-continuation-lines) - 'headers))) - -(deffoo nnbabyl-open-server (server &optional defs) - (nnoo-change-server 'nnbabyl server defs) - (nnbabyl-create-mbox) - (cond - ((not (file-exists-p nnbabyl-mbox-file)) - (nnbabyl-close-server) - (nnheader-report 'nnbabyl "No such file: %s" nnbabyl-mbox-file)) - ((file-directory-p nnbabyl-mbox-file) - (nnbabyl-close-server) - (nnheader-report 'nnbabyl "Not a regular file: %s" nnbabyl-mbox-file)) - (t - (nnheader-report 'nnbabyl "Opened server %s using mbox %s" server - nnbabyl-mbox-file) - t))) - -(deffoo nnbabyl-close-server (&optional server) - ;; Restore buffer mode. - (when (and (nnbabyl-server-opened) - nnbabyl-previous-buffer-mode) - (save-excursion - (set-buffer nnbabyl-mbox-buffer) - (narrow-to-region - (caar nnbabyl-previous-buffer-mode) - (cdar nnbabyl-previous-buffer-mode)) - (funcall (cdr nnbabyl-previous-buffer-mode)))) - (nnoo-close-server 'nnbabyl server) - (setq nnbabyl-mbox-buffer nil) - t) - -(deffoo nnbabyl-server-opened (&optional server) - (and (nnoo-current-server-p 'nnbabyl server) - nnbabyl-mbox-buffer - (buffer-name nnbabyl-mbox-buffer) - nntp-server-buffer - (buffer-name nntp-server-buffer))) - -(deffoo nnbabyl-request-article (article &optional newsgroup server buffer) - (nnbabyl-possibly-change-newsgroup newsgroup server) - (save-excursion - (set-buffer nnbabyl-mbox-buffer) - (goto-char (point-min)) - (when (search-forward (nnbabyl-article-string article) nil t) - (let (start stop summary-line) - (unless (re-search-backward (concat "^" nnbabyl-mail-delimiter) nil t) - (goto-char (point-min)) - (end-of-line)) - (while (and (not (looking-at ".+:")) - (zerop (forward-line 1)))) - (setq start (point)) - (or (when (re-search-forward - (concat "^" nnbabyl-mail-delimiter) nil t) - (beginning-of-line) - t) - (goto-char (point-max))) - (setq stop (point)) - (let ((nntp-server-buffer (or buffer nntp-server-buffer))) - (set-buffer nntp-server-buffer) - (erase-buffer) - (insert-buffer-substring nnbabyl-mbox-buffer start stop) - (goto-char (point-min)) - ;; If there is an EOOH header, then we have to remove some - ;; duplicated headers. - (setq summary-line (looking-at "Summary-line:")) - (when (search-forward "\n*** EOOH ***" nil t) - (if summary-line - ;; The headers to be deleted are located before the - ;; EOOH line... - (delete-region (point-min) (progn (forward-line 1) - (point))) - ;; ...or after. - (delete-region (progn (beginning-of-line) (point)) - (or (search-forward "\n\n" nil t) - (point))))) - (if (numberp article) - (cons nnbabyl-current-group article) - (nnbabyl-article-group-number))))))) - -(deffoo nnbabyl-request-group (group &optional server dont-check) - (let ((active (cadr (assoc group nnbabyl-group-alist)))) - (save-excursion - (cond - ((or (null active) - (null (nnbabyl-possibly-change-newsgroup group server))) - (nnheader-report 'nnbabyl "No such group: %s" group)) - (dont-check - (nnheader-report 'nnbabyl "Selected group %s" group) - (nnheader-insert "")) - (t - (nnheader-report 'nnbabyl "Selected group %s" group) - (nnheader-insert "211 %d %d %d %s\n" - (1+ (- (cdr active) (car active))) - (car active) (cdr active) group)))))) - -(deffoo nnbabyl-request-scan (&optional group server) - (nnbabyl-possibly-change-newsgroup group server) - (nnbabyl-read-mbox) - (nnmail-get-new-mail - 'nnbabyl - (lambda () - (save-excursion - (set-buffer nnbabyl-mbox-buffer) - (save-buffer))) - (file-name-directory nnbabyl-mbox-file) - group - (lambda () - (save-excursion - (let ((in-buf (current-buffer))) - (goto-char (point-min)) - (while (search-forward "\n\^_\n" nil t) - (delete-char -1)) - (set-buffer nnbabyl-mbox-buffer) - (goto-char (point-max)) - (search-backward "\n\^_" nil t) - (goto-char (match-end 0)) - (insert-buffer-substring in-buf))) - (nnmail-save-active nnbabyl-group-alist nnbabyl-active-file)))) - -(deffoo nnbabyl-close-group (group &optional server) - t) - -(deffoo nnbabyl-request-create-group (group &optional server args) - (nnmail-activate 'nnbabyl) - (unless (assoc group nnbabyl-group-alist) - (push (list group (cons 1 0)) - nnbabyl-group-alist) - (nnmail-save-active nnbabyl-group-alist nnbabyl-active-file)) - t) - -(deffoo nnbabyl-request-list (&optional server) - (save-excursion - (nnmail-find-file nnbabyl-active-file) - (setq nnbabyl-group-alist (nnmail-get-active)) - t)) - -(deffoo nnbabyl-request-newgroups (date &optional server) - (nnbabyl-request-list server)) - -(deffoo nnbabyl-request-list-newsgroups (&optional server) - (nnheader-report 'nnbabyl "nnbabyl: LIST NEWSGROUPS is not implemented.")) - -(deffoo nnbabyl-request-expire-articles - (articles newsgroup &optional server force) - (nnbabyl-possibly-change-newsgroup newsgroup server) - (let* ((is-old t) - rest) - (nnmail-activate 'nnbabyl) - - (save-excursion - (set-buffer nnbabyl-mbox-buffer) - (gnus-set-text-properties (point-min) (point-max) nil) - (while (and articles is-old) - (goto-char (point-min)) - (when (search-forward (nnbabyl-article-string (car articles)) nil t) - (if (setq is-old - (nnmail-expired-article-p - newsgroup - (buffer-substring - (point) (progn (end-of-line) (point))) force)) - (progn - (unless (eq nnmail-expiry-target 'delete) - (with-temp-buffer - (nnbabyl-request-article (car articles) - newsgroup server - (current-buffer)) - (let ((nnml-current-directory nil)) - (nnmail-expiry-target-group - nnmail-expiry-target newsgroup)))) - (nnheader-message 5 "Deleting article %d in %s..." - (car articles) newsgroup) - (nnbabyl-delete-mail)) - (push (car articles) rest))) - (setq articles (cdr articles))) - (save-buffer) - ;; Find the lowest active article in this group. - (let ((active (nth 1 (assoc newsgroup nnbabyl-group-alist)))) - (goto-char (point-min)) - (while (and (not (search-forward - (nnbabyl-article-string (car active)) nil t)) - (<= (car active) (cdr active))) - (setcar active (1+ (car active))) - (goto-char (point-min)))) - (nnmail-save-active nnbabyl-group-alist nnbabyl-active-file) - (nconc rest articles)))) - -(deffoo nnbabyl-request-move-article - (article group server accept-form &optional last) - (let ((buf (get-buffer-create " *nnbabyl move*")) - result) - (and - (nnbabyl-request-article article group server) - (save-excursion - (set-buffer buf) - (insert-buffer-substring nntp-server-buffer) - (goto-char (point-min)) - (while (re-search-forward - "^X-Gnus-Newsgroup:" - (save-excursion (search-forward "\n\n" nil t) (point)) t) - (delete-region (progn (beginning-of-line) (point)) - (progn (forward-line 1) (point)))) - (setq result (eval accept-form)) - (kill-buffer (current-buffer)) - result) - (save-excursion - (nnbabyl-possibly-change-newsgroup group server) - (set-buffer nnbabyl-mbox-buffer) - (goto-char (point-min)) - (if (search-forward (nnbabyl-article-string article) nil t) - (nnbabyl-delete-mail)) - (and last (save-buffer)))) - result)) - -(deffoo nnbabyl-request-accept-article (group &optional server last) - (nnbabyl-possibly-change-newsgroup group server) - (nnmail-check-syntax) - (let ((buf (current-buffer)) - result beg) - (and - (nnmail-activate 'nnbabyl) - (save-excursion - (goto-char (point-min)) - (search-forward "\n\n" nil t) - (forward-line -1) - (save-excursion - (while (re-search-backward "^X-Gnus-Newsgroup: " beg t) - (delete-region (point) (progn (forward-line 1) (point))))) - (when nnmail-cache-accepted-message-ids - (nnmail-cache-insert (nnmail-fetch-field "message-id"))) - (setq result - (if (stringp group) - (list (cons group (nnbabyl-active-number group))) - (nnmail-article-group 'nnbabyl-active-number))) - (if (and (null result) - (yes-or-no-p "Moved to `junk' group; delete article? ")) - (setq result 'junk) - (setq result (car (nnbabyl-save-mail result)))) - (set-buffer nnbabyl-mbox-buffer) - (goto-char (point-max)) - (search-backward "\n\^_") - (goto-char (match-end 0)) - (insert-buffer-substring buf) - (when last - (when nnmail-cache-accepted-message-ids - (nnmail-cache-insert (nnmail-fetch-field "message-id"))) - (save-buffer) - (nnmail-save-active nnbabyl-group-alist nnbabyl-active-file)) - result)))) - -(deffoo nnbabyl-request-replace-article (article group buffer) - (nnbabyl-possibly-change-newsgroup group) - (save-excursion - (set-buffer nnbabyl-mbox-buffer) - (goto-char (point-min)) - (if (not (search-forward (nnbabyl-article-string article) nil t)) - nil - (nnbabyl-delete-mail t t) - (insert-buffer-substring buffer) - (save-buffer) - t))) - -(deffoo nnbabyl-request-delete-group (group &optional force server) - (nnbabyl-possibly-change-newsgroup group server) - ;; Delete all articles in GROUP. - (if (not force) - () ; Don't delete the articles. - (save-excursion - (set-buffer nnbabyl-mbox-buffer) - (goto-char (point-min)) - ;; Delete all articles in this group. - (let ((ident (concat "\nX-Gnus-Newsgroup: " nnbabyl-current-group ":")) - found) - (while (search-forward ident nil t) - (setq found t) - (nnbabyl-delete-mail)) - (when found - (save-buffer))))) - ;; Remove the group from all structures. - (setq nnbabyl-group-alist - (delq (assoc group nnbabyl-group-alist) nnbabyl-group-alist) - nnbabyl-current-group nil) - ;; Save the active file. - (nnmail-save-active nnbabyl-group-alist nnbabyl-active-file) - t) - -(deffoo nnbabyl-request-rename-group (group new-name &optional server) - (nnbabyl-possibly-change-newsgroup group server) - (save-excursion - (set-buffer nnbabyl-mbox-buffer) - (goto-char (point-min)) - (let ((ident (concat "\nX-Gnus-Newsgroup: " nnbabyl-current-group ":")) - (new-ident (concat "\nX-Gnus-Newsgroup: " new-name ":")) - found) - (while (search-forward ident nil t) - (replace-match new-ident t t) - (setq found t)) - (when found - (save-buffer)))) - (let ((entry (assoc group nnbabyl-group-alist))) - (and entry (setcar entry new-name)) - (setq nnbabyl-current-group nil) - ;; Save the new group alist. - (nnmail-save-active nnbabyl-group-alist nnbabyl-active-file) - t)) - - -;;; Internal functions. - -;; If FORCE, delete article no matter how many X-Gnus-Newsgroup -;; headers there are. If LEAVE-DELIM, don't delete the Unix mbox -;; delimiter line. -(defun nnbabyl-delete-mail (&optional force leave-delim) - ;; Delete the current X-Gnus-Newsgroup line. - (unless force - (delete-region - (progn (beginning-of-line) (point)) - (progn (forward-line 1) (point)))) - ;; Beginning of the article. - (save-excursion - (save-restriction - (widen) - (narrow-to-region - (save-excursion - (unless (re-search-backward (concat "^" nnbabyl-mail-delimiter) nil t) - (goto-char (point-min)) - (end-of-line)) - (if leave-delim (progn (forward-line 1) (point)) - (match-beginning 0))) - (progn - (forward-line 1) - (or (and (re-search-forward (concat "^" nnbabyl-mail-delimiter) - nil t) - (match-beginning 0)) - (point-max)))) - (goto-char (point-min)) - ;; Only delete the article if no other groups owns it as well. - (when (or force (not (re-search-forward "^X-Gnus-Newsgroup: " nil t))) - (delete-region (point-min) (point-max)))))) - -(defun nnbabyl-possibly-change-newsgroup (newsgroup &optional server) - (when (and server - (not (nnbabyl-server-opened server))) - (nnbabyl-open-server server)) - (when (or (not nnbabyl-mbox-buffer) - (not (buffer-name nnbabyl-mbox-buffer))) - (save-excursion (nnbabyl-read-mbox))) - (unless nnbabyl-group-alist - (nnmail-activate 'nnbabyl)) - (if newsgroup - (if (assoc newsgroup nnbabyl-group-alist) - (setq nnbabyl-current-group newsgroup) - (nnheader-report 'nnbabyl "No such group in file")) - t)) - -(defun nnbabyl-article-string (article) - (if (numberp article) - (concat "\nX-Gnus-Newsgroup: " nnbabyl-current-group ":" - (int-to-string article) " ") - (concat "\nMessage-ID: " article))) - -(defun nnbabyl-article-group-number () - (save-excursion - (goto-char (point-min)) - (when (re-search-forward "^X-Gnus-Newsgroup: +\\([^:]+\\):\\([0-9]+\\) " - nil t) - (cons (buffer-substring (match-beginning 1) (match-end 1)) - (string-to-int - (buffer-substring (match-beginning 2) (match-end 2))))))) - -(defun nnbabyl-insert-lines () - "Insert how many lines and chars there are in the body of the mail." - (let (lines chars) - (save-excursion - (goto-char (point-min)) - (when (search-forward "\n\n" nil t) - ;; There may be an EOOH line here... - (when (looking-at "\\*\\*\\* EOOH \\*\\*\\*") - (search-forward "\n\n" nil t)) - (setq chars (- (point-max) (point)) - lines (max (- (count-lines (point) (point-max)) 1) 0)) - ;; Move back to the end of the headers. - (goto-char (point-min)) - (search-forward "\n\n" nil t) - (forward-char -1) - (save-excursion - (when (re-search-backward "^Lines: " nil t) - (delete-region (point) (progn (forward-line 1) (point))))) - (insert (format "Lines: %d\n" lines)) - chars)))) - -(defun nnbabyl-save-mail (group-art) - ;; Called narrowed to an article. - (nnbabyl-insert-lines) - (nnmail-insert-xref group-art) - (nnbabyl-insert-newsgroup-line group-art) - (run-hooks 'nnbabyl-prepare-save-mail-hook) - group-art) - -(defun nnbabyl-insert-newsgroup-line (group-art) - (save-excursion - (goto-char (point-min)) - (while (looking-at "From ") - (replace-match "Mail-from: From " t t) - (forward-line 1)) - ;; If there is a C-l at the beginning of the narrowed region, this - ;; isn't really a "save", but rather a "scan". - (goto-char (point-min)) - (unless (looking-at "\^L") - (save-excursion - (insert "\^L\n0, unseen,,\n*** EOOH ***\n") - (goto-char (point-max)) - (insert "\^_\n"))) - (when (search-forward "\n\n" nil t) - (forward-char -1) - (while group-art - (insert (format "X-Gnus-Newsgroup: %s:%d %s\n" - (caar group-art) (cdar group-art) - (current-time-string))) - (setq group-art (cdr group-art)))) - t)) - -(defun nnbabyl-active-number (group) - ;; Find the next article number in GROUP. - (let ((active (cadr (assoc group nnbabyl-group-alist)))) - (if active - (setcdr active (1+ (cdr active))) - ;; This group is new, so we create a new entry for it. - ;; This might be a bit naughty... creating groups on the drop of - ;; a hat, but I don't know... - (push (list group (setq active (cons 1 1))) - nnbabyl-group-alist)) - (cdr active))) - -(defun nnbabyl-create-mbox () - (unless (file-exists-p nnbabyl-mbox-file) - ;; Create a new, empty RMAIL mbox file. - (save-excursion - (set-buffer (setq nnbabyl-mbox-buffer - (create-file-buffer nnbabyl-mbox-file))) - (setq buffer-file-name nnbabyl-mbox-file) - (insert "BABYL OPTIONS:\n\n\^_") - (nnmail-write-region - (point-min) (point-max) nnbabyl-mbox-file t 'nomesg)))) - -(defun nnbabyl-read-mbox () - (nnmail-activate 'nnbabyl) - (nnbabyl-create-mbox) - - (unless (and nnbabyl-mbox-buffer - (buffer-name nnbabyl-mbox-buffer) - (save-excursion - (set-buffer nnbabyl-mbox-buffer) - (= (buffer-size) (nnheader-file-size nnbabyl-mbox-file)))) - ;; This buffer has changed since we read it last. Possibly. - (save-excursion - (let ((delim (concat "^" nnbabyl-mail-delimiter)) - (alist nnbabyl-group-alist) - start end number) - (set-buffer (setq nnbabyl-mbox-buffer - (nnheader-find-file-noselect - nnbabyl-mbox-file nil t))) - ;; Save previous buffer mode. - (setq nnbabyl-previous-buffer-mode - (cons (cons (point-min) (point-max)) - major-mode)) - - (buffer-disable-undo) - (widen) - (setq buffer-read-only nil) - (fundamental-mode) - - ;; Go through the group alist and compare against - ;; the rmail file. - (while alist - (goto-char (point-max)) - (when (and (re-search-backward - (format "^X-Gnus-Newsgroup: %s:\\([0-9]+\\) " - (caar alist)) - nil t) - (> (setq number - (string-to-number - (buffer-substring - (match-beginning 1) (match-end 1)))) - (cdadar alist))) - (setcdr (cadar alist) number)) - (setq alist (cdr alist))) - - ;; We go through the mbox and make sure that each and - ;; every mail belongs to some group or other. - (goto-char (point-min)) - (if (looking-at "\^L") - (setq start (point)) - (re-search-forward delim nil t) - (setq start (match-end 0))) - (while (re-search-forward delim nil t) - (setq end (match-end 0)) - (unless (search-backward "\nX-Gnus-Newsgroup: " start t) - (goto-char end) - (save-excursion - (save-restriction - (narrow-to-region (goto-char start) end) - (nnbabyl-save-mail - (nnmail-article-group 'nnbabyl-active-number)) - (setq end (point-max))))) - (goto-char (setq start end))) - (when (buffer-modified-p (current-buffer)) - (save-buffer)) - (nnmail-save-active nnbabyl-group-alist nnbabyl-active-file))))) - -(defun nnbabyl-remove-incoming-delims () - (goto-char (point-min)) - (while (search-forward "\^_" nil t) - (replace-match "?" t t))) - -(defun nnbabyl-check-mbox () - "Go through the nnbabyl mbox and make sure that no article numbers are reused." - (interactive) - (let ((idents (make-vector 1000 0)) - id) - (save-excursion - (when (or (not nnbabyl-mbox-buffer) - (not (buffer-name nnbabyl-mbox-buffer))) - (nnbabyl-read-mbox)) - (set-buffer nnbabyl-mbox-buffer) - (goto-char (point-min)) - (while (re-search-forward "^X-Gnus-Newsgroup: \\([^ ]+\\) " nil t) - (if (intern-soft (setq id (match-string 1)) idents) - (progn - (delete-region (progn (beginning-of-line) (point)) - (progn (forward-line 1) (point))) - (nnheader-message 7 "Moving %s..." id) - (nnbabyl-save-mail - (nnmail-article-group 'nnbabyl-active-number))) - (intern id idents))) - (when (buffer-modified-p (current-buffer)) - (save-buffer)) - (nnmail-save-active nnbabyl-group-alist nnbabyl-active-file) - (nnheader-message 5 "")))) - -(provide 'nnbabyl) - -;;; nnbabyl.el ends here diff --git a/lisp/nndb.el b/lisp/nndb.el deleted file mode 100644 index d8fb469..0000000 --- a/lisp/nndb.el +++ /dev/null @@ -1,324 +0,0 @@ -;;; nndb.el --- nndb access for Gnus - -;; Copyright (C) 1997, 1998, 2000 Free Software Foundation, Inc. - -;; Author: Masanobu UMEDA -;; Kai Grossjohann -;; Joe Hildebrand -;; David Blacka -;; Keywords: news - -;; This file is NOT part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; This was based upon Kai Grossjohan's shamessly snarfed code and -;;; further modified by Joe Hildebrand. It has been updated for Red -;;; Gnus. - -;; TODO: -;; -;; * Fix bug where server connection can be lost and impossible to regain -;; This hasn't happened to me in a while; think it was fixed in Rgnus -;; -;; * make it handle different nndb servers seemlessly -;; -;; * Optimize expire if FORCE -;; -;; * Optimize move (only expire once) -;; -;; * Deal with add/deletion of groups -;; -;; * make the backend TOUCH an article when marked as expireable (will -;; make article expire 'expiry' days after that moment). - -;;- -;; Register nndb with known select methods. - -(gnus-declare-backend "nndb" 'mail 'respool 'address 'prompt-address) - -;;; Code: - -(require 'nnmail) -(require 'nnheader) -(require 'nntp) -(eval-when-compile (require 'cl)) - -(eval-and-compile - (autoload 'news-setup "rnewspost") - (autoload 'news-reply-mode "rnewspost") - (autoload 'cancel-timer "timer") - (autoload 'telnet "telnet" nil t) - (autoload 'telnet-send-input "telnet" nil t) - (autoload 'gnus-declare-backend "gnus-start")) - -;; Declare nndb as derived from nntp - -(nnoo-declare nndb nntp) - -;; Variables specific to nndb - -;;- currently not used but just in case... -(defvoo nndb-deliver-program "nndel" - "*The program used to put a message in an NNDB group.") - -(defvoo nndb-server-side-expiry nil - "If t, expiry calculation will occur on the server side.") - -(defvoo nndb-set-expire-date-on-mark nil - "If t, the expiry date for a given article will be set to the time -it was marked as expireable; otherwise the date will be the time the -article was posted to nndb") - -;; Variables copied from nntp - -(defvoo nndb-server-opened-hook '(nntp-send-authinfo-from-file) - "Like nntp-server-opened-hook." - nntp-server-opened-hook) - -(defvoo nndb-address "localhost" - "*The name of the NNDB server." - nntp-address) - -(defvoo nndb-port-number 9000 - "*Port number to connect to." - nntp-port-number) - -;; change to 'news if you are actually using nndb for news -(defvoo nndb-article-type 'mail) - -(defvoo nndb-status-string nil "" nntp-status-string) - - - -(defconst nndb-version "nndb 0.7" - "Version numbers of this version of NNDB.") - - -;;; Interface functions. - -(nnoo-define-basics nndb) - -;;------------------------------------------------------------------ - -;; this function turns the lisp list into a string list. There is -;; probably a more efficient way to do this. -(defun nndb-build-article-string (articles) - (let (art-string art) - (while articles - (setq art (pop articles)) - (setq art-string (concat art-string art " "))) - art-string)) - -(defun nndb-build-expire-rest-list (total expire) - (let (art rest) - (while total - (setq art (pop total)) - (if (memq art expire) - () - (push art rest))) - rest)) - - -;; -(deffoo nndb-request-type (group &optional article) - nndb-article-type) - -;; nndb-request-update-info does not exist and is not needed - -;; nndb-request-update-mark does not exist; it should be used to TOUCH -;; articles as they are marked exipirable -(defun nndb-touch-article (group article) - (nntp-send-command nil "X-TOUCH" article)) - -(deffoo nndb-request-update-mark - (group article mark) - "Sets the expiry date for ARTICLE in GROUP to now, if the mark is 'E'" - (if (and nndb-set-expire-date-on-mark (string-equal mark "E")) - (nndb-touch-article group article)) - mark) - -;; nndb-request-create-group -- currently this isn't necessary; nndb -;; creates groups on demand. - -;; todo -- use some other time than the creation time of the article -;; best is time since article has been marked as expirable - -(defun nndb-request-expire-articles-local - (articles &optional group server force) - "Let gnus do the date check and issue the delete commands." - (let (msg art delete-list (num-delete 0) rest) - (nntp-possibly-change-group group server) - (while articles - (setq art (pop articles)) - (nntp-send-command "^\\([23]\\|^423\\).*\n" "X-DATE" art) - (setq msg (nndb-status-message)) - (if (string-match "^423" msg) - () - (or (string-match "'\\(.+\\)'" msg) - (error "Not a valid response for X-DATE command: %s" - msg)) - (if (nnmail-expired-article-p - group - (date-to-time (substring msg (match-beginning 1) (match-end 1))) - force) - (progn - (setq delete-list (concat delete-list " " (int-to-string art))) - (setq num-delete (1+ num-delete))) - (push art rest)))) - (if (> (length delete-list) 0) - (progn - (nnheader-message 5 "Deleting %s article(s) from %s" - (int-to-string num-delete) group) - (nntp-send-command "^[23].*\n" "X-DELETE" delete-list)) - ) - - (nnheader-message 5 "") - (nconc rest articles))) - -(defun nndb-get-remote-expire-response () - (let (list) - (set-buffer nntp-server-buffer) - (goto-char (point-min)) - (if (looking-at "^[34]") - ;; x-expire returned error--presume no articles were expirable) - (setq list nil) - ;; otherwise, pull all of the following numbers into the list - (re-search-forward "follows\r?\n?" nil t) - (while (re-search-forward "^[0-9]+$" nil t) - (push (string-to-int (match-string 0)) list))) - list)) - -(defun nndb-request-expire-articles-remote - (articles &optional group server force) - "Let the nndb backend expire articles" - (let (days art-string delete-list (num-delete 0)) - (nntp-possibly-change-group group server) - - ;; first calculate the wait period in days - (setq days (or (and nnmail-expiry-wait-function - (funcall nnmail-expiry-wait-function group)) - nnmail-expiry-wait)) - ;; now handle the special cases - (cond (force - (setq days 0)) - ((eq days 'never) - ;; This isn't an expirable group. - (setq days -1)) - ((eq days 'immediate) - (setq days 0))) - - - ;; build article string - (setq art-string (concat days " " (nndb-build-article-string articles))) - (nntp-send-command "^\.\r?\n\\|^[345].*\n" "X-EXPIRE" art-string) - - (setq delete-list (nndb-get-remote-expire-response)) - (setq num-delete (length delete-list)) - (if (> num-delete 0) - (nnheader-message 5 "Deleting %s article(s) from %s" - (int-to-string num-delete) group)) - - (nndb-build-expire-rest-list articles delete-list))) - -(deffoo nndb-request-expire-articles - (articles &optional group server force) - "Expires ARTICLES from GROUP on SERVER. -If FORCE, delete regardless of exiration date, otherwise use normal -expiry mechanism." - (if nndb-server-side-expiry - (nndb-request-expire-articles-remote articles group server force) - (nndb-request-expire-articles-local articles group server force))) - -(deffoo nndb-request-move-article - (article group server accept-form &optional last) - "Move ARTICLE (a number) from GROUP on SERVER. -Evals ACCEPT-FORM in current buffer, where the article is. -Optional LAST is ignored." - ;; we guess that the second arg in accept-form is the new group, - ;; which it will be for nndb, which is all that matters anyway - (let ((new-group (nth 1 accept-form)) result) - (nntp-possibly-change-group group server) - - ;; use the move command for nndb-to-nndb moves - (if (string-match "^nndb" new-group) - (let ((new-group-name (gnus-group-real-name new-group))) - (nntp-send-command "^[23].*\n" "X-MOVE" article new-group-name) - (cons new-group article)) - ;; else move normally - (let ((artbuf (get-buffer-create " *nndb move*"))) - (and - (nndb-request-article article group server artbuf) - (save-excursion - (set-buffer artbuf) - (insert-buffer-substring nntp-server-buffer) - (setq result (eval accept-form)) - (kill-buffer (current-buffer)) - result) - (nndb-request-expire-articles (list article) - group - server - t)) - result) - ))) - -(deffoo nndb-request-accept-article (group server &optional last) - "The article in the current buffer is put into GROUP." - (nntp-possibly-change-group group server) - (let (art msg) - (when (nntp-send-command "^[23].*\r?\n" "ACCEPT" group) - (nnheader-insert "") - (nntp-send-buffer "^[23].*\n")) - - (set-buffer nntp-server-buffer) - (setq msg (buffer-substring (point-min) (point-max))) - (or (string-match "^\\([0-9]+\\)" msg) - (error "nndb: %s" msg)) - (setq art (substring msg (match-beginning 1) (match-end 1))) - (nnheader-message 5 "nndb: accepted %s" art) - (list art))) - -(deffoo nndb-request-replace-article (article group buffer) - "ARTICLE is the number of the article in GROUP to be replaced with the contents of the BUFFER." - (set-buffer buffer) - (when (nntp-send-command "^[23].*\r?\n" "X-REPLACE" (int-to-string article)) - (nnheader-insert "") - (nntp-send-buffer "^[23.*\n") - (list (int-to-string article)))) - -; nndb-request-delete-group does not exist -; todo -- maybe later - -; nndb-request-rename-group does not exist -; todo -- maybe later - -;; -- standard compatability functions - -(deffoo nndb-status-message (&optional server) - "Return server status as a string." - (set-buffer nntp-server-buffer) - (buffer-substring (point-min) (point-max))) - -;; Import stuff from nntp - -(nnoo-import nndb - (nntp)) - -(provide 'nndb) - -;;; nndb.el ends here diff --git a/lisp/nndir.el b/lisp/nndir.el deleted file mode 100644 index f1a6635..0000000 --- a/lisp/nndir.el +++ /dev/null @@ -1,101 +0,0 @@ -;;; nndir.el --- single directory newsgroup access for Gnus - -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(require 'nnheader) -(require 'nnmh) -(require 'nnml) -(require 'nnoo) -(eval-when-compile (require 'cl)) - -(nnoo-declare nndir - nnml nnmh) - -(defvoo nndir-directory nil - "Where nndir will look for groups." - nnml-current-directory nnmh-current-directory) - -(defvoo nndir-nov-is-evil nil - "*Non-nil means that nndir will never retrieve NOV headers." - nnml-nov-is-evil) - - - -(defvoo nndir-current-group "" nil nnml-current-group nnmh-current-group) -(defvoo nndir-top-directory nil nil nnml-directory nnmh-directory) -(defvoo nndir-get-new-mail nil nil nnml-get-new-mail nnmh-get-new-mail) - -(defvoo nndir-status-string "" nil nnmh-status-string) -(defconst nndir-version "nndir 1.0") - - - -;;; Interface functions. - -(nnoo-define-basics nndir) - -(deffoo nndir-open-server (server &optional defs) - (setq nndir-directory - (or (cadr (assq 'nndir-directory defs)) - server)) - (unless (assq 'nndir-directory defs) - (push `(nndir-directory ,server) defs)) - (push `(nndir-current-group - ,(file-name-nondirectory (directory-file-name nndir-directory))) - defs) - (push `(nndir-top-directory - ,(file-name-directory (directory-file-name nndir-directory))) - defs) - (nnoo-change-server 'nndir server defs) - (let (err) - (cond - ((not (condition-case arg - (file-exists-p nndir-directory) - (ftp-error (setq err (format "%s" arg))))) - (nndir-close-server) - (nnheader-report - 'nndir (or err "No such file or directory: %s" nndir-directory))) - ((not (file-directory-p (file-truename nndir-directory))) - (nndir-close-server) - (nnheader-report 'nndir "Not a directory: %s" nndir-directory)) - (t - (nnheader-report 'nndir "Opened server %s using directory %s" - server nndir-directory) - t)))) - -(nnoo-map-functions nndir - (nnml-retrieve-headers 0 nndir-current-group 0 0) - (nnml-request-article 0 nndir-current-group 0 0) - (nnmh-request-group nndir-current-group 0 0) - (nnml-close-group nndir-current-group 0) - (nnml-request-list (nnoo-current-server 'nndir) nndir-directory) - (nnml-request-newsgroups (nnoo-current-server 'nndir) nndir-directory)) - -(provide 'nndir) - -;;; nndir.el ends here diff --git a/lisp/nndoc.el b/lisp/nndoc.el deleted file mode 100644 index 5c115b7..0000000 --- a/lisp/nndoc.el +++ /dev/null @@ -1,922 +0,0 @@ -;;; nndoc.el --- single file access for Gnus -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Masanobu UMEDA -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; For Outlook mail boxes format, see http://mbx2mbox.sourceforge.net/ - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'nnheader) -(require 'message) -(require 'nnmail) -(require 'nnoo) -(require 'gnus-util) - -(nnoo-declare nndoc) - -(defvoo nndoc-article-type 'guess - "*Type of the file. -One of `mbox', `babyl', `digest', `news', `rnews', `mmdf', `forward', -`rfc934', `rfc822-forward', `mime-parts', `standard-digest', -`slack-digest', `clari-briefs', `nsmail', `outlook', `oe-dbx' or -`guess'.") - -(defvoo nndoc-post-type 'mail - "*Whether the nndoc group is `mail' or `post'.") - -(defvoo nndoc-open-document-hook 'nnheader-ms-strip-cr - "Hook run after opening a document. -The default function removes all trailing carriage returns -from the document.") - -(defvar nndoc-type-alist - `((mmdf - (article-begin . "^\^A\^A\^A\^A\n") - (body-end . "^\^A\^A\^A\^A\n")) - (nsmail - (article-begin . "^From - ")) - (news - (article-begin . "^Path:")) - (rnews - (article-begin . "^#! *rnews +\\([0-9]+\\) *\n") - (body-end-function . nndoc-rnews-body-end)) - (mbox - (article-begin-function . nndoc-mbox-article-begin) - (body-end-function . nndoc-mbox-body-end)) - (babyl - (article-begin . "\^_\^L *\n") - (body-end . "\^_") - (body-begin-function . nndoc-babyl-body-begin) - (head-begin-function . nndoc-babyl-head-begin)) - (forward - (article-begin . "^-+ \\(Start of \\)?forwarded message.*\n+") - (body-end . "^-+ End \\(of \\)?forwarded message.*$") - (prepare-body-function . nndoc-unquote-dashes)) - (rfc934 - (article-begin . "^--.*\n+") - (body-end . "^--.*$") - (prepare-body-function . nndoc-unquote-dashes)) - (clari-briefs - (article-begin . "^ \\*") - (body-end . "^\t------*[ \t]^*\n^ \\*") - (body-begin . "^\t") - (head-end . "^\t") - (generate-head-function . nndoc-generate-clari-briefs-head) - (article-transform-function . nndoc-transform-clari-briefs)) - (mime-digest - (article-begin . "") - (head-begin . "^ ?\n") - (head-end . "^ ?$") - (body-end . "") - (file-end . "") - (subtype digest guess)) - (mime-parts - (generate-head-function . nndoc-generate-mime-parts-head) - (article-transform-function . nndoc-transform-mime-parts)) - (standard-digest - (first-article . ,(concat "^" (make-string 70 ?-) "\n *\n+")) - (article-begin . ,(concat "^\n" (make-string 30 ?-) "\n *\n+")) - (prepare-body-function . nndoc-unquote-dashes) - (body-end-function . nndoc-digest-body-end) - (head-end . "^ *$") - (body-begin . "^ *\n") - (file-end . "^End of .*digest.*[0-9].*\n\\*\\*\\|^End of.*Digest *$") - (subtype digest guess)) - (slack-digest - (article-begin . "^------------------------------*[\n \t]+") - (head-end . "^ ?$") - (body-end-function . nndoc-digest-body-end) - (body-begin . "^ ?$") - (file-end . "^End of") - (prepare-body-function . nndoc-unquote-dashes) - (subtype digest guess)) - (lanl-gov-announce - (article-begin . "^\\\\\\\\\n") - (head-begin . "^Paper.*:") - (head-end . "\\(^\\\\\\\\.*\n\\|-----------------\\)") - (body-begin . "") - (body-end . "-------------------------------------------------") - (file-end . "^Title: Recent Seminal") - (generate-head-function . nndoc-generate-lanl-gov-head) - (article-transform-function . nndoc-transform-lanl-gov-announce) - (subtype preprints guess)) - (rfc822-forward - (article-begin . "^\n") - (body-end-function . nndoc-rfc822-forward-body-end-function)) - (outlook - (article-begin-function . nndoc-outlook-article-begin) - (body-end . "\0")) - (oe-dbx ;; Outlook Express DBX format - (dissection-function . nndoc-oe-dbx-dissection) - (generate-head-function . nndoc-oe-dbx-generate-head) - (generate-article-function . nndoc-oe-dbx-generate-article)) - (guess - (guess . t) - (subtype nil)) - (digest - (guess . t) - (subtype nil)) - (preprints - (guess . t) - (subtype nil)))) - -(defvar nndoc-binary-file-names ".[Dd][Bb][Xx]$" - "Regexp for binary nndoc file names.") - - -(defvoo nndoc-file-begin nil) -(defvoo nndoc-first-article nil) -(defvoo nndoc-article-begin nil) -(defvoo nndoc-head-begin nil) -(defvoo nndoc-head-end nil) -(defvoo nndoc-file-end nil) -(defvoo nndoc-body-begin nil) -(defvoo nndoc-body-end-function nil) -(defvoo nndoc-body-begin-function nil) -(defvoo nndoc-head-begin-function nil) -(defvoo nndoc-body-end nil) -;; nndoc-dissection-alist is a list of sublists. Each sublist holds the -;; following items. ARTICLE acts as the association key and is an ordinal -;; starting at 1. HEAD-BEGIN [0], HEAD-END [1], BODY-BEGIN [2] and BODY-END -;; [3] are positions in the `nndoc' buffer. LINE-COUNT [4] is a count of -;; lines in the body. For MIME dissections only, ARTICLE-INSERT [5] and -;; SUMMARY-INSERT [6] give headers to insert for full article or summary line -;; generation, respectively. Other headers usually follow directly from the -;; buffer. Value `nil' means no insert. -(defvoo nndoc-dissection-alist nil) -(defvoo nndoc-prepare-body-function nil) -(defvoo nndoc-generate-head-function nil) -(defvoo nndoc-article-transform-function nil) -(defvoo nndoc-article-begin-function nil) -(defvoo nndoc-generate-article-function nil) -(defvoo nndoc-dissection-function nil) - -(defvoo nndoc-status-string "") -(defvoo nndoc-group-alist nil) -(defvoo nndoc-current-buffer nil - "Current nndoc news buffer.") -(defvoo nndoc-address nil) - -(defconst nndoc-version "nndoc 1.0" - "nndoc version.") - - - -;;; Interface functions - -(nnoo-define-basics nndoc) - -(deffoo nndoc-retrieve-headers (articles &optional newsgroup server fetch-old) - (when (nndoc-possibly-change-buffer newsgroup server) - (save-excursion - (set-buffer nntp-server-buffer) - (erase-buffer) - (let (article entry) - (if (stringp (car articles)) - 'headers - (while articles - (when (setq entry (cdr (assq (setq article (pop articles)) - nndoc-dissection-alist))) - (insert (format "221 %d Article retrieved.\n" article)) - (if nndoc-generate-head-function - (funcall nndoc-generate-head-function article) - (insert-buffer-substring - nndoc-current-buffer (car entry) (nth 1 entry))) - (goto-char (point-max)) - (unless (eq (char-after (1- (point))) ?\n) - (insert "\n")) - (insert (format "Lines: %d\n" (nth 4 entry))) - (insert ".\n"))) - - (nnheader-fold-continuation-lines) - 'headers))))) - -(deffoo nndoc-request-article (article &optional newsgroup server buffer) - (nndoc-possibly-change-buffer newsgroup server) - (save-excursion - (let ((buffer (or buffer nntp-server-buffer)) - (entry (cdr (assq article nndoc-dissection-alist))) - beg) - (set-buffer buffer) - (erase-buffer) - (when entry - (cond - ((stringp article) nil) - (nndoc-generate-article-function - (funcall nndoc-generate-article-function article)) - (t - (insert-buffer-substring - nndoc-current-buffer (car entry) (nth 1 entry)) - (insert "\n") - (setq beg (point)) - (insert-buffer-substring - nndoc-current-buffer (nth 2 entry) (nth 3 entry)) - (goto-char beg) - (when nndoc-prepare-body-function - (funcall nndoc-prepare-body-function)) - (when nndoc-article-transform-function - (funcall nndoc-article-transform-function article)) - t)))))) - -(deffoo nndoc-request-group (group &optional server dont-check) - "Select news GROUP." - (let (number) - (cond - ((not (nndoc-possibly-change-buffer group server)) - (nnheader-report 'nndoc "No such file or buffer: %s" - nndoc-address)) - (dont-check - (nnheader-report 'nndoc "Selected group %s" group) - t) - ((zerop (setq number (length nndoc-dissection-alist))) - (nndoc-close-group group) - (nnheader-report 'nndoc "No articles in group %s" group)) - (t - (nnheader-insert "211 %d %d %d %s\n" number 1 number group))))) - -(deffoo nndoc-request-type (group &optional article) - (cond ((not article) 'unknown) - (nndoc-post-type nndoc-post-type) - (t 'unknown))) - -(deffoo nndoc-close-group (group &optional server) - (nndoc-possibly-change-buffer group server) - (and nndoc-current-buffer - (buffer-name nndoc-current-buffer) - (kill-buffer nndoc-current-buffer)) - (setq nndoc-group-alist (delq (assoc group nndoc-group-alist) - nndoc-group-alist)) - (setq nndoc-current-buffer nil) - (nnoo-close-server 'nndoc server) - (setq nndoc-dissection-alist nil) - t) - -(deffoo nndoc-request-list (&optional server) - nil) - -(deffoo nndoc-request-newgroups (date &optional server) - nil) - -(deffoo nndoc-request-list-newsgroups (&optional server) - nil) - - -;;; Internal functions. - -(defun nndoc-possibly-change-buffer (group source) - (let (buf) - (cond - ;; The current buffer is this group's buffer. - ((and nndoc-current-buffer - (buffer-name nndoc-current-buffer) - (eq nndoc-current-buffer - (setq buf (cdr (assoc group nndoc-group-alist)))))) - ;; We change buffers by taking an old from the group alist. - ;; `source' is either a string (a file name) or a buffer object. - (buf - (setq nndoc-current-buffer buf)) - ;; It's a totally new group. - ((or (and (bufferp nndoc-address) - (buffer-name nndoc-address)) - (and (stringp nndoc-address) - (file-exists-p nndoc-address) - (not (file-directory-p nndoc-address)))) - (push (cons group (setq nndoc-current-buffer - (get-buffer-create - (concat " *nndoc " group "*")))) - nndoc-group-alist) - (setq nndoc-dissection-alist nil) - (save-excursion - (set-buffer nndoc-current-buffer) - (erase-buffer) - (if (and (stringp nndoc-address) - (string-match nndoc-binary-file-names nndoc-address)) - (let ((coding-system-for-read 'binary)) - (mm-insert-file-contents nndoc-address)) - (if (stringp nndoc-address) - (nnheader-insert-file-contents nndoc-address) - (insert-buffer-substring nndoc-address)) - (run-hooks 'nndoc-open-document-hook))))) - ;; Initialize the nndoc structures according to this new document. - (when (and nndoc-current-buffer - (not nndoc-dissection-alist)) - (save-excursion - (set-buffer nndoc-current-buffer) - (nndoc-set-delims) - (if (eq nndoc-article-type 'mime-parts) - (nndoc-dissect-mime-parts) - (nndoc-dissect-buffer)))) - (unless nndoc-current-buffer - (nndoc-close-server)) - ;; Return whether we managed to select a file. - nndoc-current-buffer)) - -;;; -;;; Deciding what document type we have -;;; - -(defun nndoc-set-delims () - "Set the nndoc delimiter variables according to the type of the document." - (let ((vars '(nndoc-file-begin - nndoc-first-article - nndoc-article-begin-function - nndoc-head-begin nndoc-head-end - nndoc-file-end nndoc-article-begin - nndoc-body-begin nndoc-body-end-function nndoc-body-end - nndoc-prepare-body-function nndoc-article-transform-function - nndoc-generate-head-function nndoc-body-begin-function - nndoc-head-begin-function - nndoc-generate-article-function - nndoc-dissection-function))) - (while vars - (set (pop vars) nil))) - (let (defs) - ;; Guess away until we find the real file type. - (while (assq 'guess (setq defs (cdr (assq nndoc-article-type - nndoc-type-alist)))) - (setq nndoc-article-type (nndoc-guess-type nndoc-article-type))) - ;; Set the nndoc variables. - (while defs - (set (intern (format "nndoc-%s" (caar defs))) - (cdr (pop defs)))))) - -(defun nndoc-guess-type (subtype) - (let ((alist nndoc-type-alist) - results result entry) - (while (and (not result) - (setq entry (pop alist))) - (when (memq subtype (or (cdr (assq 'subtype entry)) '(guess))) - (goto-char (point-min)) - ;; Remove blank lines. - (while (eq (following-char) ?\n) - (delete-char 1)) - (when (numberp (setq result (funcall (intern - (format "nndoc-%s-type-p" - (car entry)))))) - (push (cons result entry) results) - (setq result nil)))) - (unless (or result results) - (error "Document is not of any recognized type")) - (if result - (car entry) - (cadar (sort results 'car-less-than-car))))) - -;;; -;;; Built-in type predicates and functions -;;; - -(defun nndoc-mbox-type-p () - (when (looking-at message-unix-mail-delimiter) - t)) - -(defun nndoc-mbox-article-begin () - (when (re-search-forward (concat "^" message-unix-mail-delimiter) nil t) - (goto-char (match-beginning 0)))) - -(defun nndoc-mbox-body-end () - (let ((beg (point)) - len end) - (when - (save-excursion - (and (re-search-backward - (concat "^" message-unix-mail-delimiter) nil t) - (setq end (point)) - (search-forward "\n\n" beg t) - (re-search-backward - "^Content-Length:[ \t]*\\([0-9]+\\) *$" end t) - (setq len (string-to-int (match-string 1))) - (search-forward "\n\n" beg t) - (unless (= (setq len (+ (point) len)) (point-max)) - (and (< len (point-max)) - (goto-char len) - (looking-at message-unix-mail-delimiter))))) - (goto-char len)))) - -(defun nndoc-mmdf-type-p () - (when (looking-at "\^A\^A\^A\^A$") - t)) - -(defun nndoc-news-type-p () - (when (looking-at "^Path:.*\n") - t)) - -(defun nndoc-rnews-type-p () - (when (looking-at "#! *rnews") - t)) - -(defun nndoc-rnews-body-end () - (and (re-search-backward nndoc-article-begin nil t) - (forward-line 1) - (goto-char (+ (point) (string-to-int (match-string 1)))))) - -(defun nndoc-babyl-type-p () - (when (re-search-forward "\^_\^L *\n" nil t) - t)) - -(defun nndoc-babyl-body-begin () - (re-search-forward "^\n" nil t) - (when (looking-at "\\*\\*\\* EOOH \\*\\*\\*") - (let ((next (or (save-excursion - (re-search-forward nndoc-article-begin nil t)) - (point-max)))) - (unless (re-search-forward "^\n" next t) - (goto-char next) - (forward-line -1) - (insert "\n") - (forward-line -1))))) - -(defun nndoc-babyl-head-begin () - (when (re-search-forward "^[0-9].*\n" nil t) - (when (looking-at "\\*\\*\\* EOOH \\*\\*\\*") - (forward-line 1)) - t)) - -(defun nndoc-forward-type-p () - (when (and (re-search-forward "^-+ \\(Start of \\)?forwarded message.*\n+" - nil t) - (looking-at "[\r\n]*[a-zA-Z][a-zA-Z0-9-]*:")) - t)) - -(defun nndoc-rfc934-type-p () - (when (and (re-search-forward "^-+ Start of forwarded.*\n+" nil t) - (not (re-search-forward "^Subject:.*digest" nil t)) - (not (re-search-backward "^From:" nil t 2)) - (not (re-search-forward "^From:" nil t 2))) - t)) - -(defun nndoc-rfc822-forward-type-p () - (save-restriction - (message-narrow-to-head) - (when (re-search-forward "^Content-Type: *message/rfc822" nil t) - t))) - -(defun nndoc-rfc822-forward-body-end-function () - (goto-char (point-max))) - -(defun nndoc-mime-parts-type-p () - (let ((case-fold-search t) - (limit (search-forward "\n\n" nil t))) - (goto-char (point-min)) - (when (and limit - (re-search-forward - (concat "\ -^Content-Type:[ \t]*multipart/[a-z]+ *; *\\(\\(\n[ \t]\\)?.*;\\)*" - "\\(\n[ \t]\\)?[ \t]*boundary=\"?[^\"\n]*[^\" \t\n]") - limit t)) - t))) - -(defun nndoc-transform-mime-parts (article) - (let* ((entry (cdr (assq article nndoc-dissection-alist))) - (headers (nth 5 entry))) - (when headers - (goto-char (point-min)) - (insert headers)))) - -(defun nndoc-generate-mime-parts-head (article) - (let* ((entry (cdr (assq article nndoc-dissection-alist))) - (headers (nth 6 entry))) - (save-restriction - (narrow-to-region (point) (point)) - (insert-buffer-substring - nndoc-current-buffer (car entry) (nth 1 entry)) - (goto-char (point-max))) - (when headers - (insert headers)))) - -(defun nndoc-clari-briefs-type-p () - (when (let ((case-fold-search nil)) - (re-search-forward "^\t[^a-z]+ ([^a-z]+) --" nil t)) - t)) - -(defun nndoc-transform-clari-briefs (article) - (goto-char (point-min)) - (when (looking-at " *\\*\\(.*\\)\n") - (replace-match "" t t)) - (nndoc-generate-clari-briefs-head article)) - -(defun nndoc-generate-clari-briefs-head (article) - (let ((entry (cdr (assq article nndoc-dissection-alist))) - subject from) - (save-excursion - (set-buffer nndoc-current-buffer) - (save-restriction - (narrow-to-region (car entry) (nth 3 entry)) - (goto-char (point-min)) - (when (looking-at " *\\*\\(.*\\)$") - (setq subject (match-string 1)) - (when (string-match "[ \t]+$" subject) - (setq subject (substring subject 0 (match-beginning 0))))) - (when - (let ((case-fold-search nil)) - (re-search-forward - "^\t\\([^a-z]+\\(,[^(]+\\)? ([^a-z]+)\\) --" nil t)) - (setq from (match-string 1))))) - (insert "From: " "clari@clari.net (" (or from "unknown") ")" - "\nSubject: " (or subject "(no subject)") "\n"))) - - -(defun nndoc-mime-digest-type-p () - (let ((case-fold-search t) - boundary-id b-delimiter entry) - (when (and - (re-search-forward - (concat "^Content-Type: *multipart/digest;[ \t\n]*[ \t]" - "boundary=\"?\\([^\"\n]*[^\" \t\n]\\)") - nil t) - (match-beginning 1)) - (setq boundary-id (match-string 1) - b-delimiter (concat "\n--" boundary-id "[ \t]*$")) - (setq entry (assq 'mime-digest nndoc-type-alist)) - (setcdr entry - (list - (cons 'head-begin "^ ?\n") - (cons 'head-end "^ ?$") - (cons 'body-begin "^ ?\n") - (cons 'article-begin b-delimiter) - (cons 'body-end-function 'nndoc-digest-body-end) - (cons 'file-end (concat "\n--" boundary-id "--[ \t]*$")))) - t))) - -(defun nndoc-standard-digest-type-p () - (when (and (re-search-forward (concat "^" (make-string 70 ?-) "\n\n") nil t) - (re-search-forward - (concat "\n\n" (make-string 30 ?-) "\n\n") nil t)) - t)) - -(defun nndoc-digest-body-end () - (and (re-search-forward nndoc-article-begin nil t) - (goto-char (match-beginning 0)))) - -(defun nndoc-slack-digest-type-p () - 0) - -(defun nndoc-lanl-gov-announce-type-p () - (when (let ((case-fold-search nil)) - (re-search-forward "^\\\\\\\\\nPaper: [a-z-]+/[0-9]+" nil t)) - t)) - -(defun nndoc-transform-lanl-gov-announce (article) - (goto-char (point-max)) - (when (re-search-backward "^\\\\\\\\ +(\\([^ ]*\\) , *\\([^ ]*\\))" nil t) - (replace-match "\n\nGet it at \\1 (\\2)" t nil))) - -(defun nndoc-generate-lanl-gov-head (article) - (let ((entry (cdr (assq article nndoc-dissection-alist))) - (e-mail "no address given") - subject from) - (save-excursion - (set-buffer nndoc-current-buffer) - (save-restriction - (narrow-to-region (car entry) (nth 1 entry)) - (goto-char (point-min)) - (when (looking-at "^Paper.*: \\([a-z-]+/[0-9]+\\)") - (setq subject (concat " (" (match-string 1) ")")) - (when (re-search-forward "^From: \\([^ ]+\\)" nil t) - (setq e-mail (match-string 1))) - (when (re-search-forward "^Title: \\([^\f]*\\)\nAuthors?: \\(.*\\)" - nil t) - (setq subject (concat (match-string 1) subject)) - (setq from (concat (match-string 2) " <" e-mail ">")))))) - (while (and from (string-match "(\[^)\]*)" from)) - (setq from (replace-match "" t t from))) - (insert "From: " (or from "unknown") - "\nSubject: " (or subject "(no subject)") "\n"))) - -(defun nndoc-nsmail-type-p () - (when (looking-at "From - ") - t)) - -(defun nndoc-outlook-article-begin () - (prog1 (re-search-forward "From:\\|Received:" nil t) - (goto-char (match-beginning 0)))) - -(defun nndoc-outlook-type-p () - ;; FIXME: Is JMF the magic of outlook mailbox? -- ShengHuo. - (looking-at "JMF")) - -(defun nndoc-oe-dbx-type-p () - (looking-at (mm-string-as-multibyte "\317\255\022\376"))) - -(defun nndoc-read-little-endian () - (+ (prog1 (char-after) (forward-char 1)) - (lsh (prog1 (char-after) (forward-char 1)) 8) - (lsh (prog1 (char-after) (forward-char 1)) 16) - (lsh (prog1 (char-after) (forward-char 1)) 24))) - -(defun nndoc-oe-dbx-decode-block () - (list - (nndoc-read-little-endian) ;; this address - (nndoc-read-little-endian) ;; next address offset - (nndoc-read-little-endian) ;; blocksize - (nndoc-read-little-endian))) ;; next address - -(defun nndoc-oe-dbx-dissection () - (let ((i 0) blk p tp) - (goto-char 60117) ;; 0x0000EAD4+1 - (setq p (point)) - (unless (eobp) - (setq blk (nndoc-oe-dbx-decode-block))) - (while (and blk (> (car blk) 0) (or (zerop (nth 3 blk)) - (> (nth 3 blk) p))) - (push (list (incf i) p nil nil nil 0) nndoc-dissection-alist) - (while (and (> (car blk) 0) (> (nth 3 blk) p)) - (goto-char (1+ (nth 3 blk))) - (setq blk (nndoc-oe-dbx-decode-block))) - (if (or (<= (car blk) p) - (<= (nth 1 blk) 0) - (not (zerop (nth 3 blk)))) - (setq blk nil) - (setq tp (+ (car blk) (nth 1 blk) 17)) - (if (or (<= tp p) (>= tp (point-max))) - (setq blk nil) - (goto-char tp) - (setq p tp - blk (nndoc-oe-dbx-decode-block))))))) - -(defun nndoc-oe-dbx-generate-article (article &optional head) - (let ((entry (cdr (assq article nndoc-dissection-alist))) - (cur (current-buffer)) - (begin (point)) - blk p) - (with-current-buffer nndoc-current-buffer - (setq p (car entry)) - (while (> p (point-min)) - (goto-char p) - (setq blk (nndoc-oe-dbx-decode-block)) - (setq p (point)) - (with-current-buffer cur - (insert-buffer-substring nndoc-current-buffer p (+ p (nth 2 blk)))) - (setq p (1+ (nth 3 blk))))) - (goto-char begin) - (while (re-search-forward "\r$" nil t) - (delete-backward-char 1)) - (when head - (goto-char begin) - (when (search-forward "\n\n" nil t) - (setcar (cddddr entry) (count-lines (point) (point-max))) - (delete-region (1- (point)) (point-max)))) - t)) - -(defun nndoc-oe-dbx-generate-head (article) - (nndoc-oe-dbx-generate-article article 'head)) - -(deffoo nndoc-request-accept-article (group &optional server last) - nil) - -;;; -;;; Functions for dissecting the documents -;;; - -(defun nndoc-search (regexp) - (prog1 - (re-search-forward regexp nil t) - (beginning-of-line))) - -(defun nndoc-dissect-buffer () - "Go through the document and partition it into heads/bodies/articles." - (let ((i 0) - (first t) - head-begin head-end body-begin body-end) - (setq nndoc-dissection-alist nil) - (save-excursion - (set-buffer nndoc-current-buffer) - (goto-char (point-min)) - ;; Remove blank lines. - (while (eq (following-char) ?\n) - (delete-char 1)) - (if nndoc-dissection-function - (funcall nndoc-dissection-function) - ;; Find the beginning of the file. - (when nndoc-file-begin - (nndoc-search nndoc-file-begin)) - ;; Go through the file. - (while (if (and first nndoc-first-article) - (nndoc-search nndoc-first-article) - (nndoc-article-begin)) - (setq first nil) - (cond (nndoc-head-begin-function - (funcall nndoc-head-begin-function)) - (nndoc-head-begin - (nndoc-search nndoc-head-begin))) - (if (or (eobp) - (and nndoc-file-end - (looking-at nndoc-file-end))) - (goto-char (point-max)) - (setq head-begin (point)) - (nndoc-search (or nndoc-head-end "^$")) - (setq head-end (point)) - (if nndoc-body-begin-function - (funcall nndoc-body-begin-function) - (nndoc-search (or nndoc-body-begin "^\n"))) - (setq body-begin (point)) - (or (and nndoc-body-end-function - (funcall nndoc-body-end-function)) - (and nndoc-body-end - (nndoc-search nndoc-body-end)) - (nndoc-article-begin) - (progn - (goto-char (point-max)) - (when nndoc-file-end - (and (re-search-backward nndoc-file-end nil t) - (beginning-of-line))))) - (setq body-end (point)) - (push (list (incf i) head-begin head-end body-begin body-end - (count-lines body-begin body-end)) - nndoc-dissection-alist))))))) - -(defun nndoc-article-begin () - (if nndoc-article-begin-function - (funcall nndoc-article-begin-function) - (ignore-errors - (nndoc-search nndoc-article-begin)))) - -(defun nndoc-unquote-dashes () - "Unquote quoted non-separators in digests." - (while (re-search-forward "^- -"nil t) - (replace-match "-" t t))) - -;; Against compiler warnings. -(defvar nndoc-mime-split-ordinal) - -(defun nndoc-dissect-mime-parts () - "Go through a MIME composite article and partition it into sub-articles. -When a MIME entity contains sub-entities, dissection produces one article for -the header of this entity, and one article per sub-entity." - (setq nndoc-dissection-alist nil - nndoc-mime-split-ordinal 0) - (save-excursion - (set-buffer nndoc-current-buffer) - (nndoc-dissect-mime-parts-sub (point-min) (point-max) nil nil nil))) - -(defun nndoc-dissect-mime-parts-sub (head-begin body-end article-insert - position parent) - "Dissect an entity, within a composite MIME message. -The complete message or MIME entity extends from HEAD-BEGIN to BODY-END. -ARTICLE-INSERT should be added at beginning for generating a full article. -The string POSITION holds a dotted decimal representation of the article -position in the hierarchical structure, it is nil for the outer entity. -PARENT is the message-ID of the parent summary line, or nil for none." - (let ((case-fold-search t) - (message-id (nnmail-message-id)) - head-end body-begin summary-insert message-rfc822 multipart-any - subject content-type type subtype boundary-regexp) - ;; Gracefully handle a missing body. - (goto-char head-begin) - (if (or (and (eq (char-after) ?\n) (or (forward-char 1) t)) - (search-forward "\n\n" body-end t)) - (setq head-end (1- (point)) - body-begin (point)) - (setq head-end body-end - body-begin body-end)) - (narrow-to-region head-begin head-end) - ;; Save MIME attributes. - (goto-char head-begin) - (setq content-type (message-fetch-field "Content-Type")) - (when content-type - (when (string-match - "^ *\\([^ \t\n/;]+\\)/\\([^ \t\n/;]+\\)" content-type) - (setq type (downcase (match-string 1 content-type)) - subtype (downcase (match-string 2 content-type)) - message-rfc822 (and (string= type "message") - (string= subtype "rfc822")) - multipart-any (string= type "multipart"))) - (when (string-match ";[ \t\n]*name=\\([^ \t\n;]+\\)" content-type) - (setq subject (match-string 1 content-type))) - (when (string-match "boundary=\"?\\([^\"\n]*[^\" \t\n]\\)" content-type) - (setq boundary-regexp (concat "^--" - (regexp-quote - (match-string 1 content-type)) - "\\(--\\)?[ \t]*\n")))) - (unless subject - (when (or multipart-any (not article-insert)) - (setq subject (message-fetch-field "Subject")))) - (unless type - (setq type "text" - subtype "plain")) - ;; Prepare the article and summary inserts. - (unless article-insert - (setq article-insert (buffer-substring (point-min) (point-max)) - head-end head-begin)) - (setq summary-insert article-insert) - ;; - summary Subject. - (setq summary-insert - (let ((line (concat "Subject: <" position - (and position multipart-any ".") - (and multipart-any "*") - (and (or position multipart-any) " ") - (cond ((string= subtype "plain") type) - ((string= subtype "basic") type) - (t subtype)) - ">" - (and subject " ") - subject - "\n"))) - (if (string-match "Subject:.*\n\\([ \t].*\n\\)*" summary-insert) - (replace-match line t t summary-insert) - (concat summary-insert line)))) - ;; - summary Message-ID. - (setq summary-insert - (let ((line (concat "Message-ID: " message-id "\n"))) - (if (string-match "Message-ID:.*\n\\([ \t].*\n\\)*" summary-insert) - (replace-match line t t summary-insert) - (concat summary-insert line)))) - ;; - summary References. - (when parent - (setq summary-insert - (let ((line (concat "References: " parent "\n"))) - (if (string-match "References:.*\n\\([ \t].*\n\\)*" - summary-insert) - (replace-match line t t summary-insert) - (concat summary-insert line))))) - ;; Generate dissection information for this entity. - (push (list (incf nndoc-mime-split-ordinal) - head-begin head-end body-begin body-end - (count-lines body-begin body-end) - article-insert summary-insert) - nndoc-dissection-alist) - ;; Recurse for all sub-entities, if any. - (widen) - (cond - (message-rfc822 - (save-excursion - (nndoc-dissect-mime-parts-sub body-begin body-end nil - position message-id))) - ((and multipart-any boundary-regexp) - (let ((part-counter 0) - part-begin part-end eof-flag) - (while (string-match "\ -^\\(Lines\\|Content-\\(Type\\|Transfer-Encoding\\|Disposition\\)\\):.*\n\\([ \t].*\n\\)*" - article-insert) - (setq article-insert (replace-match "" t t article-insert))) - (let ((case-fold-search nil)) - (goto-char body-begin) - (setq eof-flag (not (re-search-forward boundary-regexp body-end t))) - (while (not eof-flag) - (setq part-begin (point)) - (cond ((re-search-forward boundary-regexp body-end t) - (or (not (match-string 1)) - (string= (match-string 1) "") - (setq eof-flag t)) - (forward-line -1) - (setq part-end (point)) - (forward-line 1)) - (t (setq part-end body-end - eof-flag t))) - (save-excursion - (nndoc-dissect-mime-parts-sub - part-begin part-end article-insert - (concat position - (and position ".") - (format "%d" (incf part-counter))) - message-id))))))))) - -;;;###autoload -(defun nndoc-add-type (definition &optional position) - "Add document DEFINITION to the list of nndoc document definitions. -If POSITION is nil or `last', the definition will be added -as the last checked definition, if t or `first', add as the -first definition, and if any other symbol, add after that -symbol in the alist." - ;; First remove any old instances. - (gnus-pull (car definition) nndoc-type-alist) - ;; Then enter the new definition in the proper place. - (cond - ((or (null position) (eq position 'last)) - (setq nndoc-type-alist (nconc nndoc-type-alist (list definition)))) - ((or (eq position t) (eq position 'first)) - (push definition nndoc-type-alist)) - (t - (let ((list (memq (assq position nndoc-type-alist) - nndoc-type-alist))) - (unless list - (error "No such position: %s" position)) - (setcdr list (cons definition (cdr list))))))) - -(provide 'nndoc) - -;;; nndoc.el ends here diff --git a/lisp/nndraft.el b/lisp/nndraft.el deleted file mode 100644 index e1302a7..0000000 --- a/lisp/nndraft.el +++ /dev/null @@ -1,276 +0,0 @@ -;;; nndraft.el --- draft article access for Gnus -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'nnheader) -(require 'nnmail) -(require 'gnus-start) -(require 'nnmh) -(require 'nnoo) - -(nnoo-declare nndraft - nnmh) - -(defvoo nndraft-directory (nnheader-concat gnus-directory "drafts/") - "Where nndraft will store its files." - nnmh-directory) - - - -(defvoo nndraft-current-group "" nil nnmh-current-group) -(defvoo nndraft-get-new-mail nil nil nnmh-get-new-mail) -(defvoo nndraft-current-directory nil nil nnmh-current-directory) - -(defconst nndraft-version "nndraft 1.0") -(defvoo nndraft-status-string "" nil nnmh-status-string) - - - -;;; Interface functions. - -(nnoo-define-basics nndraft) - -(deffoo nndraft-open-server (server &optional defs) - (nnoo-change-server 'nndraft server defs) - (cond - ((not (file-exists-p nndraft-directory)) - (nndraft-close-server) - (nnheader-report 'nndraft "No such file or directory: %s" - nndraft-directory)) - ((not (file-directory-p (file-truename nndraft-directory))) - (nndraft-close-server) - (nnheader-report 'nndraft "Not a directory: %s" nndraft-directory)) - (t - (nnheader-report 'nndraft "Opened server %s using directory %s" - server nndraft-directory) - t))) - -(deffoo nndraft-retrieve-headers (articles &optional group server fetch-old) - (nndraft-possibly-change-group group) - (save-excursion - (set-buffer nntp-server-buffer) - (erase-buffer) - (let* (article) - ;; We don't support fetching by Message-ID. - (if (stringp (car articles)) - 'headers - (while articles - (narrow-to-region (point) (point)) - (when (nndraft-request-article - (setq article (pop articles)) group server (current-buffer)) - (goto-char (point-min)) - (if (search-forward "\n\n" nil t) - (forward-line -1) - (goto-char (point-max))) - (delete-region (point) (point-max)) - (goto-char (point-min)) - (insert (format "221 %d Article retrieved.\n" article)) - (widen) - (goto-char (point-max)) - (insert ".\n"))) - - (nnheader-fold-continuation-lines) - 'headers)))) - -(deffoo nndraft-request-article (id &optional group server buffer) - (nndraft-possibly-change-group group) - (when (numberp id) - ;; We get the newest file of the auto-saved file and the - ;; "real" file. - (let* ((file (nndraft-article-filename id)) - (auto (nndraft-auto-save-file-name file)) - (newest (if (file-newer-than-file-p file auto) file auto)) - (nntp-server-buffer (or buffer nntp-server-buffer))) - (when (and (file-exists-p newest) - (let ((nnmail-file-coding-system nnheader-text-coding-system)) - (nnmail-find-file newest))) - (save-excursion - (set-buffer nntp-server-buffer) - (goto-char (point-min)) - ;; If there's a mail header separator in this file, - ;; we remove it. - (when (re-search-forward - (concat "^" mail-header-separator "$") nil t) - (replace-match "" t t))) - t)))) - -(deffoo nndraft-request-restore-buffer (article &optional group server) - "Request a new buffer that is restored to the state of ARTICLE." - (nndraft-possibly-change-group group) - (when (nndraft-request-article article group server (current-buffer)) - (message-remove-header "xref") - (message-remove-header "lines") - ;; Articles in nndraft:queue are considered as sent messages. The - ;; Date field should be the time when they are sent. - ;;(message-remove-header "date") - t)) - -(deffoo nndraft-request-update-info (group info &optional server) - (nndraft-possibly-change-group group) - (gnus-info-set-read - info - (gnus-update-read-articles (gnus-group-prefixed-name group '(nndraft "")) - (nndraft-articles) t)) - (let ((marks (nth 3 info))) - (when marks - ;; Nix out all marks except the `unsend'-able article marks. - (setcar (nthcdr 3 info) - (if (assq 'unsend marks) - (list (assq 'unsend marks)) - nil)))) - t) - -(deffoo nndraft-request-associate-buffer (group) - "Associate the current buffer with some article in the draft group." - (nndraft-open-server "") - (nndraft-request-group group) - (nndraft-possibly-change-group group) - (let ((gnus-verbose-backends nil) - (buf (current-buffer)) - article file) - (with-temp-buffer - (insert-buffer-substring buf) - (setq article (nndraft-request-accept-article - group (nnoo-current-server 'nndraft) t 'noinsert) - file (nndraft-article-filename article))) - (setq buffer-file-name (expand-file-name file) - buffer-auto-save-file-name (make-auto-save-file-name)) - (clear-visited-file-modtime) - article)) - -(deffoo nndraft-request-group (group &optional server dont-check) - (nndraft-possibly-change-group group) - (unless dont-check - (let* ((pathname (nnmail-group-pathname group nndraft-directory)) - (file-name-coding-system nnmail-pathname-coding-system) - dir file) - (nnheader-re-read-dir pathname) - (setq dir (mapcar (lambda (name) (string-to-int (substring name 1))) - (directory-files pathname nil "^#[0-9]+#$" t))) - (dolist (n dir) - (unless (file-exists-p - (setq file (expand-file-name (int-to-string n) pathname))) - (rename-file (nndraft-auto-save-file-name file) file))))) - (nnoo-parent-function 'nndraft - 'nnmh-request-group - (list group server dont-check))) - -(deffoo nndraft-request-expire-articles (articles group &optional server force) - (nndraft-possibly-change-group group) - (let* ((nnmh-allow-delete-final t) - (res (nnoo-parent-function 'nndraft - 'nnmh-request-expire-articles - (list articles group server force))) - article) - ;; Delete all the "state" files of articles that have been expired. - (while articles - (unless (memq (setq article (pop articles)) res) - (let ((auto (nndraft-auto-save-file-name - (nndraft-article-filename article)))) - (when (file-exists-p auto) - (funcall nnmail-delete-file-function auto))) - (dolist (backup - (let ((kept-new-versions 1) - (kept-old-versions 0)) - (find-backup-file-name - (nndraft-article-filename article)))) - (when (file-exists-p backup) - (funcall nnmail-delete-file-function backup))))) - res)) - -(deffoo nndraft-request-accept-article (group &optional server last noinsert) - (nndraft-possibly-change-group group) - (let ((gnus-verbose-backends nil)) - (nnoo-parent-function 'nndraft 'nnmh-request-accept-article - (list group server last noinsert)))) - -(deffoo nndraft-request-replace-article (article group buffer) - (nndraft-possibly-change-group group) - (let ((nnmail-file-coding-system nnheader-text-coding-system)) - (nnoo-parent-function 'nndraft 'nnmh-request-replace-article - (list article group buffer)))) - -(deffoo nndraft-request-create-group (group &optional server args) - (nndraft-possibly-change-group group) - (if (file-exists-p nndraft-current-directory) - (if (file-directory-p nndraft-current-directory) - t - nil) - (condition-case () - (progn - (gnus-make-directory nndraft-current-directory) - t) - (file-error nil)))) - - -;;; Low-Level Interface - -(defun nndraft-possibly-change-group (group) - (when (and group - (not (equal group nndraft-current-group))) - (nndraft-open-server "") - (setq nndraft-current-group group) - (setq nndraft-current-directory - (nnheader-concat nndraft-directory group)))) - -(defun nndraft-article-filename (article &rest args) - (apply 'concat - (file-name-as-directory nndraft-current-directory) - (int-to-string article) - args)) - -(defun nndraft-auto-save-file-name (file) - (save-excursion - (prog1 - (progn - (set-buffer (get-buffer-create " *draft tmp*")) - (setq buffer-file-name file) - (make-auto-save-file-name)) - (kill-buffer (current-buffer))))) - -(defun nndraft-articles () - "Return the list of messages in the group." - (gnus-make-directory nndraft-current-directory) - (sort - (mapcar 'string-to-int - (directory-files nndraft-current-directory nil "\\`[0-9]+\\'" t)) - '<)) - -(nnoo-import nndraft - (nnmh - nnmh-retrieve-headers - nnmh-request-group - nnmh-close-group - nnmh-request-list - nnmh-request-newsgroups - nnmh-request-move-article)) - -(provide 'nndraft) - -;;; nndraft.el ends here diff --git a/lisp/nneething.el b/lisp/nneething.el deleted file mode 100644 index 7b713c4..0000000 --- a/lisp/nneething.el +++ /dev/null @@ -1,377 +0,0 @@ -;;; nneething.el --- arbitrary file access for Gnus - -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Masanobu UMEDA -;; Keywords: news, mail - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'nnheader) -(require 'nnmail) -(require 'nnoo) -(require 'gnus-util) - -(nnoo-declare nneething) - -(defvoo nneething-map-file-directory "~/.nneething/" - "Where nneething stores the map files.") - -(defvoo nneething-map-file ".nneething" - "Name of the map files.") - -(defvoo nneething-exclude-files nil - "Regexp saying what files to exclude from the group. -If this variable is nil, no files will be excluded.") - -(defvoo nneething-include-files nil - "Regexp saying what files to include in the group. -If this variable is non-nil, only files matching this regexp will be -included.") - - - -;;; Internal variables. - -(defconst nneething-version "nneething 1.0" - "nneething version.") - -(defvoo nneething-current-directory nil - "Current news group directory.") - -(defvoo nneething-status-string "") - -(defvoo nneething-message-id-number 0) -(defvoo nneething-work-buffer " *nneething work*") - -(defvoo nneething-group nil) -(defvoo nneething-map nil) -(defvoo nneething-read-only nil) -(defvoo nneething-active nil) -(defvoo nneething-address nil) - - - -;;; Interface functions. - -(nnoo-define-basics nneething) - -(deffoo nneething-retrieve-headers (articles &optional group server fetch-old) - (nneething-possibly-change-directory group) - - (save-excursion - (set-buffer nntp-server-buffer) - (erase-buffer) - (let* ((number (length articles)) - (count 0) - (large (and (numberp nnmail-large-newsgroup) - (> number nnmail-large-newsgroup))) - article file) - - (if (stringp (car articles)) - 'headers - - (while (setq article (pop articles)) - (setq file (nneething-file-name article)) - - (when (and (file-exists-p file) - (or (file-directory-p file) - (not (zerop (nnheader-file-size file))))) - (insert (format "221 %d Article retrieved.\n" article)) - (nneething-insert-head file) - (insert ".\n")) - - (incf count) - - (and large - (zerop (% count 20)) - (nnheader-message 5 "nneething: Receiving headers... %d%%" - (/ (* count 100) number)))) - - (when large - (nnheader-message 5 "nneething: Receiving headers...done")) - - (nnheader-fold-continuation-lines) - 'headers)))) - -(deffoo nneething-request-article (id &optional group server buffer) - (nneething-possibly-change-directory group) - (let ((file (unless (stringp id) - (nneething-file-name id))) - (nntp-server-buffer (or buffer nntp-server-buffer))) - (and (stringp file) ; We did not request by Message-ID. - (file-exists-p file) ; The file exists. - (not (file-directory-p file)) ; It's not a dir. - (save-excursion - (nnmail-find-file file) ; Insert the file in the nntp buf. - (unless (nnheader-article-p) ; Either it's a real article... - (goto-char (point-min)) - (nneething-make-head - file (current-buffer)) ; ... or we fake some headers. - (insert "\n")) - t)))) - -(deffoo nneething-request-group (group &optional server dont-check) - (nneething-possibly-change-directory group server) - (unless dont-check - (nneething-create-mapping) - (if (> (car nneething-active) (cdr nneething-active)) - (nnheader-insert "211 0 1 0 %s\n" group) - (nnheader-insert - "211 %d %d %d %s\n" - (- (1+ (cdr nneething-active)) (car nneething-active)) - (car nneething-active) (cdr nneething-active) - group))) - t) - -(deffoo nneething-request-list (&optional server dir) - (nnheader-report 'nneething "LIST is not implemented.")) - -(deffoo nneething-request-newgroups (date &optional server) - (nnheader-report 'nneething "NEWSGROUPS is not implemented.")) - -(deffoo nneething-request-type (group &optional article) - 'unknown) - -(deffoo nneething-close-group (group &optional server) - (setq nneething-current-directory nil) - t) - -(deffoo nneething-open-server (server &optional defs) - (nnheader-init-server-buffer) - (if (nneething-server-opened server) - t - (unless (assq 'nneething-address defs) - (setq defs (append defs (list (list 'nneething-address server))))) - (nnoo-change-server 'nneething server defs))) - - -;;; Internal functions. - -(defun nneething-possibly-change-directory (group &optional server) - (when (and server - (not (nneething-server-opened server))) - (nneething-open-server server)) - (when (and group - (not (equal nneething-group group))) - (setq nneething-group group) - (setq nneething-map nil) - (setq nneething-active (cons 1 0)) - (nneething-create-mapping))) - -(defun nneething-map-file () - ;; We make sure that the .nneething directory exists. - (gnus-make-directory nneething-map-file-directory) - ;; We store it in a special directory under the user's home dir. - (concat (file-name-as-directory nneething-map-file-directory) - nneething-group nneething-map-file)) - -(defun nneething-create-mapping () - ;; Read nneething-active and nneething-map. - (when (file-exists-p nneething-address) - (let ((map-file (nneething-map-file)) - (files (directory-files nneething-address)) - touched map-files) - (when (file-exists-p map-file) - (ignore-errors - (load map-file nil t t))) - (unless nneething-active - (setq nneething-active (cons 1 0))) - ;; Old nneething had a different map format. - (when (and (cdar nneething-map) - (atom (cdar nneething-map))) - (setq nneething-map - (mapcar (lambda (n) - (list (cdr n) (car n) - (nth 5 (file-attributes - (nneething-file-name (car n)))))) - nneething-map))) - ;; Remove files matching the exclusion regexp. - (when nneething-exclude-files - (let ((f files) - prev) - (while f - (if (string-match nneething-exclude-files (car f)) - (if prev (setcdr prev (cdr f)) - (setq files (cdr files))) - (setq prev f)) - (setq f (cdr f))))) - ;; Remove files not matching the inclusion regexp. - (when nneething-include-files - (let ((f files) - prev) - (while f - (if (not (string-match nneething-include-files (car f))) - (if prev (setcdr prev (cdr f)) - (setq files (cdr files))) - (setq prev f)) - (setq f (cdr f))))) - ;; Remove deleted files from the map. - (let ((map nneething-map) - prev) - (while map - (if (and (member (cadr (car map)) files) - ;; We also remove files that have changed mod times. - (equal (nth 5 (file-attributes - (nneething-file-name (cadr (car map))))) - (cadr (cdar map)))) - (progn - (push (cadr (car map)) map-files) - (setq prev map)) - (setq touched t) - (if prev - (setcdr prev (cdr map)) - (setq nneething-map (cdr nneething-map)))) - (setq map (cdr map)))) - ;; Find all new files and enter them into the map. - (while files - (unless (member (car files) map-files) - ;; This file is not in the map, so we enter it. - (setq touched t) - (setcdr nneething-active (1+ (cdr nneething-active))) - (push (list (cdr nneething-active) (car files) - (nth 5 (file-attributes - (nneething-file-name (car files))))) - nneething-map)) - (setq files (cdr files))) - (when (and touched - (not nneething-read-only)) - (with-temp-file map-file - (insert "(setq nneething-map '") - (gnus-prin1 nneething-map) - (insert ")\n(setq nneething-active '") - (gnus-prin1 nneething-active) - (insert ")\n")))))) - -(defun nneething-insert-head (file) - "Insert the head of FILE." - (when (nneething-get-head file) - (insert-buffer-substring nneething-work-buffer) - (goto-char (point-max)))) - -(defun nneething-make-head (file &optional buffer extra-msg) - "Create a head by looking at the file attributes of FILE." - (let ((atts (file-attributes file))) - (insert - "Subject: " (file-name-nondirectory file) (or extra-msg "") "\n" - "Message-ID: \n" - (if (equal '(0 0) (nth 5 atts)) "" - (concat "Date: " (current-time-string (nth 5 atts)) "\n")) - (or (when buffer - (save-excursion - (set-buffer buffer) - (when (re-search-forward "<[a-zA-Z0-9_]@[-a-zA-Z0-9_]>" 1000 t) - (concat "From: " (match-string 0) "\n")))) - (nneething-from-line (nth 2 atts) file)) - (if (> (string-to-int (int-to-string (nth 7 atts))) 0) - (concat "Chars: " (int-to-string (nth 7 atts)) "\n") - "") - (if buffer - (save-excursion - (set-buffer buffer) - (concat "Lines: " (int-to-string - (count-lines (point-min) (point-max))) - "\n")) - "")))) - -(defun nneething-from-line (uid &optional file) - "Return a From header based of UID." - (let* ((login (condition-case nil - (user-login-name uid) - (error - (cond ((= uid (user-uid)) (user-login-name)) - ((zerop uid) "root") - (t (int-to-string uid)))))) - (name (condition-case nil - (user-full-name uid) - (error - (cond ((= uid (user-uid)) (user-full-name)) - ((zerop uid) "Ms. Root"))))) - (host (if (string-match "\\`/[^/@]*@\\([^:/]+\\):" file) - (prog1 - (substring file - (match-beginning 1) - (match-end 1)) - (when (string-match - "/\\(users\\|home\\)/\\([^/]+\\)/" file) - (setq login (substring file - (match-beginning 2) - (match-end 2)) - name nil))) - (system-name)))) - (concat "From: " login "@" host - (if name (concat " (" name ")") "") "\n"))) - -(defun nneething-get-head (file) - "Either find the head in FILE or make a head for FILE." - (save-excursion - (set-buffer (get-buffer-create nneething-work-buffer)) - (setq case-fold-search nil) - (buffer-disable-undo) - (erase-buffer) - (cond - ((not (file-exists-p file)) - ;; The file do not exist. - nil) - ((or (file-directory-p file) - (file-symlink-p file)) - ;; It's a dir, so we fudge a head. - (nneething-make-head file) t) - (t - ;; We examine the file. - (condition-case () - (progn - (nnheader-insert-head file) - (if (nnheader-article-p) - (delete-region - (progn - (goto-char (point-min)) - (or (and (search-forward "\n\n" nil t) - (1- (point))) - (point-max))) - (point-max)) - (goto-char (point-min)) - (nneething-make-head file (current-buffer)) - (delete-region (point) (point-max)))) - (file-error - (nneething-make-head file (current-buffer) " (unreadable)"))) - t)))) - -(defun nneething-file-name (article) - "Return the file name of ARTICLE." - (let ((dir (file-name-as-directory nneething-address)) - fname) - (if (numberp article) - (if (setq fname (cadr (assq article nneething-map))) - (expand-file-name fname dir) - (make-temp-name (expand-file-name "nneething" dir))) - (expand-file-name article dir)))) - -(provide 'nneething) - -;;; nneething.el ends here diff --git a/lisp/nnfolder.el b/lisp/nnfolder.el deleted file mode 100644 index 3f31789..0000000 --- a/lisp/nnfolder.el +++ /dev/null @@ -1,1235 +0,0 @@ -;;; nnfolder.el --- mail folder access for Gnus -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Simon Josefsson (adding MARKS) -;; ShengHuo Zhu (adding NOV) -;; Scott Byer -;; Lars Magne Ingebrigtsen -;; Masanobu UMEDA -;; Keywords: mail - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'gnus-clfns)) - -(require 'nnheader) -(require 'message) -(require 'nnmail) -(require 'nnoo) -(require 'gnus) -(require 'gnus-util) -(require 'gnus-range) - -(eval-and-compile - (autoload 'gnus-intersection "gnus-range")) - -(nnoo-declare nnfolder) - -(defvoo nnfolder-directory (expand-file-name message-directory) - "The name of the nnfolder directory. - -This variable is a virtual server slot. See the Gnus manual for details.") - -(defvoo nnfolder-nov-directory nil - "The name of the nnfolder NOV directory. -If nil, `nnfolder-directory' is used.") - -(defvoo nnfolder-marks-directory nil - "The name of the nnfolder MARKS directory. -If nil, `nnfolder-directory' is used.") - -(defvoo nnfolder-active-file - (nnheader-concat nnfolder-directory "active") - "The name of the active file. - -This variable is a virtual server slot. See the Gnus manual for details.") - -;; I renamed this variable to something more in keeping with the general GNU -;; style. -SLB - -(defvoo nnfolder-ignore-active-file nil - "If non-nil, the active file is ignored. -This causes nnfolder to do some extra work in order to determine the -true active ranges of an mbox file. Note that the active file is -still saved, but its values are not used. This costs some extra time -when scanning an mbox when opening it.") - -(defvoo nnfolder-distrust-mbox nil - "If non-nil, the folder will be distrusted. -This means that nnfolder will not trust the user with respect to -inserting unaccounted for mail in the middle of an mbox file. This -can greatly slow down scans, which now must scan the entire file for -unmarked messages. When nil, scans occur forward from the last marked -message, a huge time saver for large mailboxes.") - -(defvoo nnfolder-newsgroups-file - (concat (file-name-as-directory nnfolder-directory) "newsgroups") - "Mail newsgroups description file. - -This variable is a virtual server slot. See the Gnus manual for details.") - -(defvoo nnfolder-get-new-mail t - "If non-nil, nnfolder will check the incoming mail file and split the mail. - -This variable is a virtual server slot. See the Gnus manual for details.") - -(defvoo nnfolder-prepare-save-mail-hook nil - "Hook run narrowed to an article before saving.") - -(defvoo nnfolder-save-buffer-hook nil - "Hook run before saving the nnfolder mbox buffer. - -This variable is a virtual server slot. See the Gnus manual for details.") - - -(defvoo nnfolder-inhibit-expiry nil - "If non-nil, inhibit expiry. - -This variable is a virtual server slot. See the Gnus manual for details.") - - - -(defconst nnfolder-version "nnfolder 2.0" - "nnfolder version.") - -(defconst nnfolder-article-marker "X-Gnus-Article-Number: " - "String used to demarcate what the article number for a message is.") - -(defvoo nnfolder-current-group nil) -(defvoo nnfolder-current-buffer nil) -(defvoo nnfolder-status-string "") -(defvoo nnfolder-group-alist nil) -(defvoo nnfolder-buffer-alist nil) -(defvoo nnfolder-scantime-alist nil) -(defvoo nnfolder-active-timestamp nil) -(defvoo nnfolder-active-file-coding-system nnheader-text-coding-system) -(defvoo nnfolder-active-file-coding-system-for-write - nnmail-active-file-coding-system) -(defvoo nnfolder-file-coding-system nnheader-text-coding-system) -(defvoo nnfolder-file-coding-system-for-write nnheader-file-coding-system - "Coding system for save nnfolder file. -If NIL, NNFOLDER-FILE-CODING-SYSTEM is used.") - -(defvoo nnfolder-nov-is-evil nil - "If non-nil, Gnus will never generate and use nov databases for mail groups. -Using nov databases will speed up header fetching considerably. -This variable shouldn't be flipped much. If you have, for some reason, -set this to t, and want to set it to nil again, you should always run -the `nnfolder-generate-active-file' command. The function will go -through all nnfolder directories and generate nov databases for them -all. This may very well take some time. - -This variable is a virtual server slot. See the Gnus manual for details.") - -(defvoo nnfolder-nov-file-suffix ".nov") - -(defvoo nnfolder-nov-buffer-alist nil) - -(defvar nnfolder-nov-buffer-file-name nil) - -(defvoo nnfolder-marks-is-evil nil - "If non-nil, Gnus will never generate and use marks file for mail groups. -Using marks files makes it possible to backup and restore mail groups -separately from `.newsrc.eld'. If you have, for some reason, set -this to t, and want to set it to nil again, you should always remove -the corresponding marks file (usually base nnfolder file name -concatenated with `.mrk', but see `nnfolder-marks-file-suffix') for -the group. Then the marks file will be regenerated properly by Gnus. - -This variable is a virtual server slot. See the Gnus manual for details.") - -(defvoo nnfolder-marks nil) - -(defvoo nnfolder-marks-file-suffix ".mrk") - - - -;;; Interface functions - -(nnoo-define-basics nnfolder) - -(deffoo nnfolder-retrieve-headers (articles &optional group server fetch-old) - (save-excursion - (set-buffer nntp-server-buffer) - (erase-buffer) - (let (article start stop) - (nnfolder-possibly-change-group group server) - (when nnfolder-current-buffer - (set-buffer nnfolder-current-buffer) - (goto-char (point-min)) - (if (stringp (car articles)) - 'headers - (if (nnfolder-retrieve-headers-with-nov articles fetch-old) - 'nov - (setq articles (gnus-sorted-intersection - ;; Is ARTICLES sorted? - (sort articles '<) - (nnfolder-existing-articles))) - (while (setq article (pop articles)) - (set-buffer nnfolder-current-buffer) - (when (nnfolder-goto-article article) - (setq start (point)) - (setq stop (if (search-forward "\n\n" nil t) - (1- (point)) - (point-max))) - (set-buffer nntp-server-buffer) - (insert (format "221 %d Article retrieved.\n" article)) - (insert-buffer-substring nnfolder-current-buffer start stop) - (goto-char (point-max)) - (insert ".\n"))) - (set-buffer nntp-server-buffer) - (nnheader-fold-continuation-lines) - 'headers)))))) - -(deffoo nnfolder-open-server (server &optional defs) - (nnoo-change-server 'nnfolder server defs) - (nnmail-activate 'nnfolder t) - (gnus-make-directory nnfolder-directory) - (unless (or gnus-nov-is-evil nnfolder-nov-is-evil) - (and nnfolder-nov-directory - (gnus-make-directory nnfolder-nov-directory))) - (unless nnfolder-marks-is-evil - (and nnfolder-marks-directory - (gnus-make-directory nnfolder-marks-directory))) - (cond - ((not (file-exists-p nnfolder-directory)) - (nnfolder-close-server) - (nnheader-report 'nnfolder "Couldn't create directory: %s" - nnfolder-directory)) - ((not (file-directory-p (file-truename nnfolder-directory))) - (nnfolder-close-server) - (nnheader-report 'nnfolder "Not a directory: %s" nnfolder-directory)) - (t - (nnmail-activate 'nnfolder) - (nnheader-report 'nnfolder "Opened server %s using directory %s" - server nnfolder-directory) - t))) - -(deffoo nnfolder-request-close () - (let ((alist nnfolder-buffer-alist)) - (while alist - (nnfolder-close-group (caar alist) nil t) - (setq alist (cdr alist)))) - (nnoo-close-server 'nnfolder) - (setq nnfolder-buffer-alist nil - nnfolder-group-alist nil)) - -(deffoo nnfolder-request-article (article &optional group server buffer) - (nnfolder-possibly-change-group group server) - (save-excursion - (set-buffer nnfolder-current-buffer) - (goto-char (point-min)) - (when (nnfolder-goto-article article) - (let (start stop) - (setq start (point)) - (forward-line 1) - (unless (and (nnmail-search-unix-mail-delim) - (forward-line -1)) - (goto-char (point-max))) - (setq stop (point)) - (let ((nntp-server-buffer (or buffer nntp-server-buffer))) - (set-buffer nntp-server-buffer) - (erase-buffer) - (insert-buffer-substring nnfolder-current-buffer start stop) - (goto-char (point-min)) - (while (looking-at "From ") - (delete-char 5) - (insert "X-From-Line: ") - (forward-line 1)) - (if (numberp article) - (cons nnfolder-current-group article) - (goto-char (point-min)) - (cons nnfolder-current-group - (if (search-forward (concat "\n" nnfolder-article-marker) - nil t) - (string-to-int - (buffer-substring - (point) (progn (end-of-line) (point)))) - -1)))))))) - -(deffoo nnfolder-request-group (group &optional server dont-check) - (nnfolder-possibly-change-group group server t) - (save-excursion - (if (not (assoc group nnfolder-group-alist)) - (nnheader-report 'nnfolder "No such group: %s" group) - (if dont-check - (progn - (nnheader-report 'nnfolder "Selected group %s" group) - t) - (let* ((active (assoc group nnfolder-group-alist)) - (group (car active)) - (range (cadr active))) - (cond - ((null active) - (nnheader-report 'nnfolder "No such group: %s" group)) - ((null nnfolder-current-group) - (nnheader-report 'nnfolder "Empty group: %s" group)) - (t - (nnheader-report 'nnfolder "Selected group %s" group) - (nnheader-insert "211 %d %d %d %s\n" - (1+ (- (cdr range) (car range))) - (car range) (cdr range) group)))))))) - -(deffoo nnfolder-request-scan (&optional group server) - (nnfolder-possibly-change-group nil server) - (when nnfolder-get-new-mail - (nnfolder-possibly-change-group group server) - (nnmail-get-new-mail - 'nnfolder - (lambda () - (let ((bufs nnfolder-buffer-alist)) - (save-excursion - (while bufs - (if (not (gnus-buffer-live-p (nth 1 (car bufs)))) - (setq nnfolder-buffer-alist - (delq (car bufs) nnfolder-buffer-alist)) - (set-buffer (nth 1 (car bufs))) - (nnfolder-save-buffer) - (kill-buffer (current-buffer))) - (setq bufs (cdr bufs)))))) - nnfolder-directory - group))) - -;; Don't close the buffer if we're not shutting down the server. This way, -;; we can keep the buffer in the group buffer cache, and not have to grovel -;; over the buffer again unless we add new mail to it or modify it in some -;; way. - -(deffoo nnfolder-close-group (group &optional server force) - ;; Make sure we _had_ the group open. - (when (or (assoc group nnfolder-buffer-alist) - (equal group nnfolder-current-group)) - (let ((inf (assoc group nnfolder-buffer-alist))) - (when inf - (when (and nnfolder-current-group - nnfolder-current-buffer) - (push (list nnfolder-current-group nnfolder-current-buffer) - nnfolder-buffer-alist)) - (setq nnfolder-buffer-alist - (delq inf nnfolder-buffer-alist)) - (setq nnfolder-current-buffer (cadr inf) - nnfolder-current-group (car inf)))) - (when (and nnfolder-current-buffer - (buffer-name nnfolder-current-buffer)) - (save-excursion - (set-buffer nnfolder-current-buffer) - ;; If the buffer was modified, write the file out now. - (nnfolder-save-buffer) - ;; If we're shutting the server down, we need to kill the - ;; buffer and remove it from the open buffer list. Or, of - ;; course, if we're trying to minimize our space impact. - (kill-buffer (current-buffer)) - (setq nnfolder-buffer-alist (delq (assoc group nnfolder-buffer-alist) - nnfolder-buffer-alist))))) - (setq nnfolder-current-group nil - nnfolder-current-buffer nil) - t) - -(deffoo nnfolder-request-create-group (group &optional server args) - (nnfolder-possibly-change-group nil server) - (nnmail-activate 'nnfolder) - (when group - (unless (assoc group nnfolder-group-alist) - (push (list group (cons 1 0)) nnfolder-group-alist) - (nnfolder-save-active nnfolder-group-alist nnfolder-active-file) - (nnfolder-read-folder group))) - t) - -(deffoo nnfolder-request-list (&optional server) - (nnfolder-possibly-change-group nil server) - (save-excursion - (let ((nnmail-file-coding-system nnfolder-active-file-coding-system)) - (nnmail-find-file nnfolder-active-file) - (setq nnfolder-group-alist (nnmail-get-active))) - t)) - -(deffoo nnfolder-request-newgroups (date &optional server) - (nnfolder-possibly-change-group nil server) - (nnfolder-request-list server)) - -(deffoo nnfolder-request-list-newsgroups (&optional server) - (nnfolder-possibly-change-group nil server) - (save-excursion - (let ((nnmail-file-coding-system nnfolder-file-coding-system)) - (nnmail-find-file nnfolder-newsgroups-file)))) - -;; Return a list consisting of all article numbers existing in the -;; current folder. - -(defun nnfolder-existing-articles () - (save-excursion - (when nnfolder-current-buffer - (set-buffer nnfolder-current-buffer) - (goto-char (point-min)) - (let ((marker (concat "\n" nnfolder-article-marker)) - (number "[0-9]+") - numbers) - (while (and (search-forward marker nil t) - (re-search-forward number nil t)) - (let ((newnum (string-to-number (match-string 0)))) - (if (nnmail-within-headers-p) - (push newnum numbers)))) - ;; The article numbers are increasing, so this result is sorted. - (nreverse numbers))))) - -(deffoo nnfolder-request-expire-articles - (articles newsgroup &optional server force) - (nnfolder-possibly-change-group newsgroup server) - (let* ((is-old t) - ;; The articles we have deleted so far. - (deleted-articles nil) - ;; The articles that really exist and will - ;; be expired if they are old enough. - (maybe-expirable - (gnus-sorted-intersection articles (nnfolder-existing-articles)))) - (nnmail-activate 'nnfolder) - - (save-excursion - (set-buffer nnfolder-current-buffer) - ;; Since messages are sorted in arrival order and expired in the - ;; same order, we can stop as soon as we find a message that is - ;; too old. - (while (and maybe-expirable is-old) - (goto-char (point-min)) - (when (and (nnfolder-goto-article (car maybe-expirable)) - (search-forward (concat "\n" nnfolder-article-marker) - nil t)) - (forward-sexp) - (when (setq is-old - (nnmail-expired-article-p - newsgroup - (buffer-substring - (point) (progn (end-of-line) (point))) - force nnfolder-inhibit-expiry)) - (unless (eq nnmail-expiry-target 'delete) - (with-temp-buffer - (nnfolder-request-article (car maybe-expirable) - newsgroup server (current-buffer)) - (let ((nnml-current-directory nil)) - (nnmail-expiry-target-group - nnmail-expiry-target newsgroup)))) - (nnheader-message 5 "Deleting article %d in %s..." - (car maybe-expirable) newsgroup) - (nnfolder-delete-mail) - (unless (or gnus-nov-is-evil nnfolder-nov-is-evil) - (nnfolder-nov-delete-article newsgroup (car maybe-expirable))) - ;; Must remember which articles were actually deleted - (push (car maybe-expirable) deleted-articles))) - (setq maybe-expirable (cdr maybe-expirable))) - (unless nnfolder-inhibit-expiry - (nnheader-message 5 "Deleting articles...done")) - (nnfolder-save-buffer) - (nnfolder-adjust-min-active newsgroup) - (nnfolder-save-active nnfolder-group-alist nnfolder-active-file) - (gnus-sorted-complement articles (nreverse deleted-articles))))) - -(deffoo nnfolder-request-move-article (article group server - accept-form &optional last) - (save-excursion - (let ((buf (get-buffer-create " *nnfolder move*")) - result) - (and - (nnfolder-request-article article group server) - (save-excursion - (set-buffer buf) - (erase-buffer) - (insert-buffer-substring nntp-server-buffer) - (goto-char (point-min)) - (while (re-search-forward - (concat "^" nnfolder-article-marker) - (save-excursion (and (search-forward "\n\n" nil t) (point))) - t) - (delete-region (progn (beginning-of-line) (point)) - (progn (forward-line 1) (point)))) - (setq result (eval accept-form)) - (kill-buffer buf) - result) - (save-excursion - (nnfolder-possibly-change-group group server) - (set-buffer nnfolder-current-buffer) - (goto-char (point-min)) - (when (nnfolder-goto-article article) - (nnfolder-delete-mail)) - (unless (or gnus-nov-is-evil nnfolder-nov-is-evil) - (nnfolder-nov-delete-article group article)) - (when last - (nnfolder-save-buffer) - (nnfolder-adjust-min-active group) - (nnfolder-save-active nnfolder-group-alist nnfolder-active-file)))) - result))) - -(deffoo nnfolder-request-accept-article (group &optional server last) - (save-excursion - (nnfolder-possibly-change-group group server) - (nnmail-check-syntax) - (let ((buf (current-buffer)) - result art-group) - (goto-char (point-min)) - (when (looking-at "X-From-Line: ") - (replace-match "From ")) - (with-temp-buffer - (let ((nnmail-file-coding-system nnfolder-active-file-coding-system) - (nntp-server-buffer (current-buffer))) - (nnmail-find-file nnfolder-active-file) - (setq nnfolder-group-alist (nnmail-parse-active)))) - (save-excursion - (goto-char (point-min)) - (if (search-forward "\n\n" nil t) - (forward-line -1) - (goto-char (point-max))) - (while (re-search-backward (concat "^" nnfolder-article-marker) nil t) - (delete-region (point) (progn (forward-line 1) (point)))) - (when nnmail-cache-accepted-message-ids - (nnmail-cache-insert (nnmail-fetch-field "message-id"))) - (setq result (if (stringp group) - (list (cons group (nnfolder-active-number group))) - (setq art-group - (nnmail-article-group 'nnfolder-active-number)))) - (if (and (null result) - (yes-or-no-p "Moved to `junk' group; delete article? ")) - (setq result 'junk) - (setq result - (car (nnfolder-save-mail result))))) - (when last - (save-excursion - (nnfolder-possibly-change-folder (or (caar art-group) group)) - (nnfolder-save-buffer) - (when nnmail-cache-accepted-message-ids - (nnmail-cache-close)))) - (nnfolder-save-active nnfolder-group-alist nnfolder-active-file) - (unless result - (nnheader-report 'nnfolder "Couldn't store article")) - result))) - -(deffoo nnfolder-request-replace-article (article group buffer) - (nnfolder-possibly-change-group group) - (save-excursion - (set-buffer buffer) - (goto-char (point-min)) - (let (xfrom) - (while (re-search-forward "^X-From-Line: \\(.*\\)$" nil t) - (setq xfrom (match-string 1)) - (gnus-delete-line)) - (goto-char (point-min)) - (if xfrom - (insert "From " xfrom "\n") - (unless (looking-at "From ") - (insert "From nobody " (current-time-string) "\n")))) - (nnfolder-normalize-buffer) - (set-buffer nnfolder-current-buffer) - (goto-char (point-min)) - (if (not (nnfolder-goto-article article)) - nil - (nnfolder-delete-mail) - (insert-buffer-substring buffer) - (unless (or gnus-nov-is-evil nnfolder-nov-is-evil) - (save-excursion - (set-buffer buffer) - (let ((headers (nnfolder-parse-head article - (point-min) (point-max)))) - (with-current-buffer (nnfolder-open-nov group) - (if (nnheader-find-nov-line article) - (delete-region (point) (progn (forward-line 1) (point)))) - (nnheader-insert-nov headers))))) - (nnfolder-save-buffer) - t))) - -(deffoo nnfolder-request-delete-group (group &optional force server) - (nnfolder-close-group group server t) - ;; Delete all articles in GROUP. - (if (not force) - () ; Don't delete the articles. - ;; Delete the file that holds the group. - (ignore-errors - (delete-file (nnfolder-group-pathname group)) - (when (file-exists-p (nnfolder-group-nov-pathname group)) - (delete-file (nnfolder-group-nov-pathname group))) - (when (file-exists-p (nnfolder-group-marks-pathname group)) - (delete-file (nnfolder-group-marks-pathname group))))) - ;; Remove the group from all structures. - (setq nnfolder-group-alist - (delq (assoc group nnfolder-group-alist) nnfolder-group-alist) - nnfolder-current-group nil - nnfolder-current-buffer nil) - ;; Save the active file. - (nnfolder-save-active nnfolder-group-alist nnfolder-active-file) - t) - -(deffoo nnfolder-request-rename-group (group new-name &optional server) - (nnfolder-possibly-change-group group server) - (save-excursion - (set-buffer nnfolder-current-buffer) - (and (file-writable-p buffer-file-name) - (ignore-errors - (let ((new-file (nnfolder-group-pathname new-name))) - (gnus-make-directory (file-name-directory new-file)) - (rename-file buffer-file-name new-file) - (when (file-exists-p (nnfolder-group-nov-pathname group)) - (setq new-file (nnfolder-group-nov-pathname new-name)) - (gnus-make-directory (file-name-directory new-file)) - (rename-file (nnfolder-group-nov-pathname group) new-file)) - (when (file-exists-p (nnfolder-group-marks-pathname group)) - (setq new-file (nnfolder-group-marks-pathname new-name)) - (gnus-make-directory (file-name-directory new-file)) - (rename-file (nnfolder-group-marks-pathname group) new-file))) - t) - ;; That went ok, so we change the internal structures. - (let ((entry (assoc group nnfolder-group-alist))) - (and entry (setcar entry new-name)) - (setq nnfolder-current-buffer nil - nnfolder-current-group nil) - ;; Save the new group alist. - (nnfolder-save-active nnfolder-group-alist nnfolder-active-file) - ;; We kill the buffer instead of renaming it and stuff. - (kill-buffer (current-buffer)) - t)))) - -(deffoo nnfolder-request-regenerate (server) - (nnfolder-possibly-change-group nil server) - (nnfolder-generate-active-file) - t) - - -;;; Internal functions. - -(defun nnfolder-adjust-min-active (group) - ;; Find the lowest active article in this group. - (let* ((active (cadr (assoc group nnfolder-group-alist))) - (marker (concat "\n" nnfolder-article-marker)) - (number "[0-9]+") - (activemin (cdr active))) - (save-excursion - (set-buffer nnfolder-current-buffer) - (goto-char (point-min)) - (while (and (search-forward marker nil t) - (re-search-forward number nil t)) - (let ((newnum (string-to-number (match-string 0)))) - (if (nnmail-within-headers-p) - (setq activemin (min activemin newnum))))) - (setcar active activemin)))) - -(defun nnfolder-article-string (article) - (if (numberp article) - (concat "\n" nnfolder-article-marker (int-to-string article) " ") - (concat "\nMessage-ID: " article))) - -(defun nnfolder-goto-article (article) - "Place point at the start of the headers of ARTICLE. -ARTICLE can be an article number or a Message-ID. -Returns t if successful, nil otherwise." - (let ((art-string (nnfolder-article-string article)) - start found) - ;; It is likely that we are at or before the delimiter line. - ;; We therefore go to the end of the previous line, and start - ;; searching from there. - (beginning-of-line) - (unless (bobp) - (forward-char -1)) - (setq start (point)) - ;; First search forward. - (while (and (setq found (search-forward art-string nil t)) - (not (nnmail-within-headers-p)))) - ;; If unsuccessful, search backward from where we started, - (unless found - (goto-char start) - (while (and (setq found (search-backward art-string nil t)) - (not (nnmail-within-headers-p))))) - (when found - (nnmail-search-unix-mail-delim-backward)))) - -(defun nnfolder-delete-mail (&optional leave-delim) - "Delete the message that point is in. -If optional argument LEAVE-DELIM is t, then mailbox delimiter is not -deleted. Point is left where the deleted region was." - (save-restriction - (narrow-to-region - (save-excursion - ;; In case point is at the beginning of the message already. - (forward-line 1) - (nnmail-search-unix-mail-delim-backward) - (if leave-delim (progn (forward-line 1) (point)) - (point))) - (progn - (forward-line 1) - (if (nnmail-search-unix-mail-delim) - (point) - (point-max)))) - (run-hooks 'nnfolder-delete-mail-hook) - (delete-region (point-min) (point-max)))) - -(defun nnfolder-possibly-change-group (group &optional server dont-check) - ;; Change servers. - (when (and server - (not (nnfolder-server-opened server))) - (nnfolder-open-server server)) - (unless (gnus-buffer-live-p nnfolder-current-buffer) - (setq nnfolder-current-buffer nil - nnfolder-current-group nil)) - ;; Change group. - (let ((file-name-coding-system nnmail-pathname-coding-system) - (pathname-coding-system nnmail-pathname-coding-system)) - (when (and group - (not (equal group nnfolder-current-group)) - (progn - (nnmail-activate 'nnfolder) - (and (assoc group nnfolder-group-alist) - (file-exists-p (nnfolder-group-pathname group))))) - (if dont-check - (setq nnfolder-current-group group - nnfolder-current-buffer nil) - (let (inf file) - ;; If we have to change groups, see if we don't already have the - ;; folder in memory. If we do, verify the modtime and destroy - ;; the folder if needed so we can rescan it. - (setq nnfolder-current-buffer - (nth 1 (assoc group nnfolder-buffer-alist))) - - ;; If the buffer is not live, make sure it isn't in the alist. If it - ;; is live, verify that nobody else has touched the file since last - ;; time. - (when (and nnfolder-current-buffer - (not (gnus-buffer-live-p nnfolder-current-buffer))) - (setq nnfolder-buffer-alist (delq inf nnfolder-buffer-alist) - nnfolder-current-buffer nil)) - - (setq nnfolder-current-group group) - - (when (or (not nnfolder-current-buffer) - (not (verify-visited-file-modtime - nnfolder-current-buffer))) - (save-excursion - (setq file (nnfolder-group-pathname group)) - ;; See whether we need to create the new file. - (unless (file-exists-p file) - (gnus-make-directory (file-name-directory file)) - (let ((nnmail-file-coding-system - (or nnfolder-file-coding-system-for-write - nnfolder-file-coding-system-for-write))) - (nnmail-write-region 1 1 file t 'nomesg))) - (when (setq nnfolder-current-buffer (nnfolder-read-folder group)) - (set-buffer nnfolder-current-buffer) - (push (list group nnfolder-current-buffer) - nnfolder-buffer-alist))))))))) - -(defun nnfolder-save-mail (group-art-list) - "Called narrowed to an article." - (let* (save-list group-art) - (goto-char (point-min)) - ;; The From line may have been quoted by movemail. - (when (looking-at ">From") - (delete-char 1)) - ;; This might come from somewhere else. - (unless (looking-at "From ") - (insert "From nobody " (current-time-string) "\n") - (goto-char (point-min))) - ;; Quote all "From " lines in the article. - (forward-line 1) - (let (case-fold-search) - (while (re-search-forward "^From " nil t) - (beginning-of-line) - (insert "> "))) - (setq save-list group-art-list) - (nnmail-insert-lines) - (nnmail-insert-xref group-art-list) - (run-hooks 'nnmail-prepare-save-mail-hook) - (run-hooks 'nnfolder-prepare-save-mail-hook) - - ;; Insert the mail into each of the destination groups. - (while (setq group-art (pop group-art-list)) - ;; Kill any previous newsgroup markers. - (goto-char (point-min)) - (if (search-forward "\n\n" nil t) - (forward-line -1) - (goto-char (point-max))) - (while (search-backward (concat "\n" nnfolder-article-marker) nil t) - (delete-region (1+ (point)) (progn (forward-line 2) (point)))) - - ;; Insert the new newsgroup marker. - (nnfolder-insert-newsgroup-line group-art) - - (save-excursion - (let ((beg (point-min)) - (end (point-max)) - (obuf (current-buffer))) - (nnfolder-possibly-change-folder (car group-art)) - (let ((buffer-read-only nil)) - (nnfolder-normalize-buffer) - (insert-buffer-substring obuf beg end)) - (unless (or gnus-nov-is-evil nnfolder-nov-is-evil) - (set-buffer obuf) - (nnfolder-add-nov (car group-art) (cdr group-art) - (nnfolder-parse-head nil beg end)))))) - - ;; Did we save it anywhere? - save-list)) - -(defun nnfolder-normalize-buffer () - "Make sure there are two newlines at the end of the buffer." - (goto-char (point-max)) - (skip-chars-backward "\n") - (delete-region (point) (point-max)) - (insert "\n\n")) - -(defun nnfolder-insert-newsgroup-line (group-art) - (save-excursion - (goto-char (point-min)) - (unless (search-forward "\n\n" nil t) - (goto-char (point-max)) - (insert "\n")) - (forward-char -1) - (insert (format (concat nnfolder-article-marker "%d %s\n") - (cdr group-art) (current-time-string))))) - -(defun nnfolder-active-number (group) - ;; Find the next article number in GROUP. - (let ((active (cadr (assoc group nnfolder-group-alist)))) - (if active - (setcdr active (1+ (cdr active))) - ;; This group is new, so we create a new entry for it. - ;; This might be a bit naughty... creating groups on the drop of - ;; a hat, but I don't know... - (push (list group (setq active (cons 1 1))) - nnfolder-group-alist)) - (cdr active))) - -(defun nnfolder-possibly-change-folder (group) - (let ((inf (assoc group nnfolder-buffer-alist))) - (if (and inf - (gnus-buffer-live-p (cadr inf))) - (set-buffer (cadr inf)) - (when inf - (setq nnfolder-buffer-alist (delq inf nnfolder-buffer-alist))) - (when nnfolder-group-alist - (nnfolder-save-active nnfolder-group-alist nnfolder-active-file)) - (push (list group (nnfolder-read-folder group)) - nnfolder-buffer-alist)))) - -;; This method has a problem if you've accidentally let the active -;; list get out of sync with the files. This could happen, say, if -;; you've accidentally gotten new mail with something other than Gnus -;; (but why would _that_ ever happen? :-). In that case, we will be -;; in the middle of processing the file, ready to add new X-Gnus -;; article number markers, and we'll run across a message with no ID -;; yet - the active list _may_not_ be ready for us yet. - -;; To handle this, I'm modifying this routine to maintain the maximum -;; ID seen so far, and when we hit a message with no ID, we will -;; _manually_ scan the rest of the message looking for any more, -;; possibly higher IDs. We'll assume the maximum that we find is the -;; highest active. Note that this shouldn't cost us much extra time -;; at all, but will be a lot less vulnerable to glitches between the -;; mbox and the active file. - -(defun nnfolder-read-folder (group) - (let* ((file (nnfolder-group-pathname group)) - (nov (nnfolder-group-nov-pathname group)) - (buffer (set-buffer - (let ((nnheader-file-coding-system - nnfolder-file-coding-system)) - (nnheader-find-file-noselect file))))) - (if (equal (cadr (assoc group nnfolder-scantime-alist)) - (nth 5 (file-attributes file))) - ;; This looks up-to-date, so we don't do any scanning. - (if (file-exists-p file) - buffer - (push (list group buffer) nnfolder-buffer-alist) - (set-buffer-modified-p t) - (nnfolder-save-buffer)) - ;; Parse the damn thing. - (save-excursion - (goto-char (point-min)) - ;; Remove any blank lines at the start. - (while (eq (following-char) ?\n) - (delete-char 1)) - (nnmail-activate 'nnfolder) - ;; Read in the file. - (let ((delim "^From ") - (marker (concat "\n" nnfolder-article-marker)) - (number "[0-9]+") - (active (or (cadr (assoc group nnfolder-group-alist)) - (cons 1 0))) - (scantime (assoc group nnfolder-scantime-alist)) - (minid (lsh -1 -1)) - maxid start end newscantime - novbuf articles newnum - buffer-read-only) - (buffer-disable-undo) - (setq maxid (cdr active)) - - (unless (or gnus-nov-is-evil nnfolder-nov-is-evil - (and (file-exists-p nov) - (file-newer-than-file-p nov file))) - (unless (file-exists-p nov) - (gnus-make-directory (file-name-directory nov))) - (with-current-buffer - (setq novbuf (nnfolder-open-nov group)) - (goto-char (point-min)) - (while (not (eobp)) - (push (read novbuf) articles) - (forward-line 1)) - (setq articles (nreverse articles)))) - (goto-char (point-min)) - - ;; Anytime the active number is 1 or 0, it is suspect. In that - ;; case, search the file manually to find the active number. Or, - ;; of course, if we're being paranoid. (This would also be the - ;; place to build other lists from the header markers, such as - ;; expunge lists, etc., if we ever desired to abandon the active - ;; file entirely for mboxes.) - (when (or nnfolder-ignore-active-file - novbuf - (< maxid 2)) - (while (and (search-forward marker nil t) - (looking-at number)) - (setq newnum (string-to-number (match-string 0))) - (when (nnmail-within-headers-p) - (setq maxid (max maxid newnum) - minid (min minid newnum)) - (when novbuf - (if (memq newnum articles) - (setq articles (delq newnum articles)) - (let ((headers (nnfolder-parse-head newnum))) - (with-current-buffer novbuf - (nnheader-find-nov-line newnum) - (nnheader-insert-nov headers))))))) - (when (and novbuf articles) - (with-current-buffer novbuf - (dolist (article articles) - (when (nnheader-find-nov-line article) - (delete-region (point) - (progn (forward-line 1) (point))))))) - (setcar active (max 1 (min minid maxid))) - (setcdr active (max maxid (cdr active))) - (goto-char (point-min))) - - ;; As long as we trust that the user will only insert unmarked mail - ;; at the end, go to the end and search backwards for the last - ;; marker. Find the start of that message, and begin to search for - ;; unmarked messages from there. - (when (not (or nnfolder-distrust-mbox - (< maxid 2))) - (goto-char (point-max)) - (unless (re-search-backward marker nil t) - (goto-char (point-min))) - ;;(when (nnmail-search-unix-mail-delim) - ;; (goto-char (point-min))) - ) - - ;; Keep track of the active number on our own, and insert it back - ;; into the active list when we're done. Also, prime the pump to - ;; cut down on the number of searches we do. - (unless (nnmail-search-unix-mail-delim) - (goto-char (point-max))) - (setq end (point-marker)) - (while (not (= end (point-max))) - (setq start (marker-position end)) - (goto-char end) - ;; There may be more than one "From " line, so we skip past - ;; them. - (while (looking-at delim) - (forward-line 1)) - (set-marker end (if (nnmail-search-unix-mail-delim) - (point) - (point-max))) - (goto-char start) - (when (not (search-forward marker end t)) - (narrow-to-region start end) - (nnmail-insert-lines) - (nnfolder-insert-newsgroup-line - (cons nil - (setq newnum - (nnfolder-active-number nnfolder-current-group)))) - (when novbuf - (let ((headers (nnfolder-parse-head newnum (point-min) - (point-max)))) - (with-current-buffer novbuf - (goto-char (point-max)) - (nnheader-insert-nov headers)))) - (widen))) - - (set-marker end nil) - ;; Make absolutely sure that the active list reflects reality! - (nnfolder-save-active nnfolder-group-alist nnfolder-active-file) - - ;; Set the scantime for this group. - (setq newscantime (visited-file-modtime)) - (if scantime - (setcdr scantime (list newscantime)) - (push (list nnfolder-current-group newscantime) - nnfolder-scantime-alist)) - ;; Save nov. - (when novbuf - (nnfolder-save-nov)) - (current-buffer)))))) - -;;;###autoload -(defun nnfolder-generate-active-file () - "Look for mbox folders in the nnfolder directory and make them into groups. -This command does not work if you use short group names." - (interactive) - (nnmail-activate 'nnfolder) - (unless (or gnus-nov-is-evil nnfolder-nov-is-evil) - (dolist (file (directory-files (or nnfolder-nov-directory - nnfolder-directory) - t - (concat - (regexp-quote nnfolder-nov-file-suffix) - "$"))) - (when (not (message-mail-file-mbox-p file)) - (ignore-errors - (delete-file file))))) - (let ((files (directory-files nnfolder-directory)) - file) - (while (setq file (pop files)) - (when (and (not (backup-file-name-p file)) - (message-mail-file-mbox-p - (nnheader-concat nnfolder-directory file))) - (let ((oldgroup (assoc file nnfolder-group-alist))) - (if oldgroup - (nnheader-message 5 "Refreshing group %s..." file) - (nnheader-message 5 "Adding group %s..." file)) - (if oldgroup - (setq nnfolder-group-alist - (delq oldgroup (copy-sequence nnfolder-group-alist)))) - (push (list file (cons 1 0)) nnfolder-group-alist) - (nnfolder-possibly-change-folder file) - (nnfolder-possibly-change-group file) - (nnfolder-close-group file)))) - (nnheader-message 5 ""))) - -(defun nnfolder-group-pathname (group) - "Make pathname for GROUP." - (setq group - (encode-coding-string group nnmail-pathname-coding-system)) - (let ((dir (file-name-as-directory (expand-file-name nnfolder-directory)))) - ;; If this file exists, we use it directly. - (if (or nnmail-use-long-file-names - (file-exists-p (concat dir group))) - (concat dir group) - ;; If not, we translate dots into slashes. - (concat dir (nnheader-replace-chars-in-string group ?. ?/))))) - -(defun nnfolder-group-nov-pathname (group) - "Make pathname for GROUP NOV." - (let ((nnfolder-directory - (or nnfolder-nov-directory nnfolder-directory))) - (concat (nnfolder-group-pathname group) nnfolder-nov-file-suffix))) - -(defun nnfolder-save-buffer () - "Save the buffer." - (when (buffer-modified-p) - (run-hooks 'nnfolder-save-buffer-hook) - (gnus-make-directory (file-name-directory (buffer-file-name))) - (let* ((coding-system-for-write - (or nnfolder-file-coding-system-for-write - nnfolder-file-coding-system)) - (output-coding-system coding-system-for-write)) - (save-buffer))) - (unless (or gnus-nov-is-evil nnfolder-nov-is-evil) - (nnfolder-save-nov))) - -(defun nnfolder-save-active (group-alist active-file) - (let ((nnmail-active-file-coding-system - (or nnfolder-active-file-coding-system-for-write - nnfolder-active-file-coding-system))) - (nnmail-save-active group-alist active-file))) - -(defun nnfolder-open-nov (group) - (or (cdr (assoc group nnfolder-nov-buffer-alist)) - (let ((buffer (get-buffer-create (format " *nnfolder overview %s*" group)))) - (save-excursion - (set-buffer buffer) - (set (make-local-variable 'nnfolder-nov-buffer-file-name) - (nnfolder-group-nov-pathname group)) - (erase-buffer) - (when (file-exists-p nnfolder-nov-buffer-file-name) - (nnheader-insert-file-contents nnfolder-nov-buffer-file-name))) - (push (cons group buffer) nnfolder-nov-buffer-alist) - buffer))) - -(defun nnfolder-save-nov () - (save-excursion - (while nnfolder-nov-buffer-alist - (when (buffer-name (cdar nnfolder-nov-buffer-alist)) - (set-buffer (cdar nnfolder-nov-buffer-alist)) - (when (buffer-modified-p) - (gnus-make-directory (file-name-directory - nnfolder-nov-buffer-file-name)) - (nnmail-write-region 1 (point-max) nnfolder-nov-buffer-file-name - nil 'nomesg)) - (set-buffer-modified-p nil) - (kill-buffer (current-buffer))) - (setq nnfolder-nov-buffer-alist (cdr nnfolder-nov-buffer-alist))))) - -(defun nnfolder-nov-delete-article (group article) - (save-excursion - (set-buffer (nnfolder-open-nov group)) - (when (nnheader-find-nov-line article) - (delete-region (point) (progn (forward-line 1) (point)))) - t)) - -(defun nnfolder-retrieve-headers-with-nov (articles &optional fetch-old) - (if (or gnus-nov-is-evil nnfolder-nov-is-evil) - nil - (let ((nov (nnfolder-group-nov-pathname nnfolder-current-group))) - (when (file-exists-p nov) - (save-excursion - (set-buffer nntp-server-buffer) - (erase-buffer) - (nnheader-insert-file-contents nov) - (if (and fetch-old - (not (numberp fetch-old))) - t ; Don't remove anything. - (nnheader-nov-delete-outside-range - (if fetch-old (max 1 (- (car articles) fetch-old)) - (car articles)) - (car (last articles))) - t)))))) - -(defun nnfolder-parse-head (&optional number b e) - "Parse the head of the current buffer." - (let ((buf (current-buffer)) - chars) - (save-excursion - (unless b - (setq b (if (nnmail-search-unix-mail-delim-backward) - (point) (point-min))) - (forward-line 1) - (setq e (if (nnmail-search-unix-mail-delim) - (point) (point-max)))) - (setq chars (- e b)) - (unless (zerop chars) - (goto-char b) - (if (search-forward "\n\n" e t) (setq e (1- (point))))) - (with-temp-buffer - (insert-buffer-substring buf b e) - ;; Fold continuation lines. - (goto-char (point-min)) - (while (re-search-forward "\\(\r?\n[ \t]+\\)+" nil t) - (replace-match " " t t)) - ;; Remove any tabs; they are too confusing. - (subst-char-in-region (point-min) (point-max) ?\t ? ) - (let ((headers (nnheader-parse-head t))) - (mail-header-set-chars headers chars) - (mail-header-set-number headers number) - headers))))) - -(defun nnfolder-add-nov (group article headers) - "Add a nov line for the GROUP base." - (save-excursion - (set-buffer (nnfolder-open-nov group)) - (goto-char (point-max)) - (mail-header-set-number headers article) - (nnheader-insert-nov headers))) - -(deffoo nnfolder-request-set-mark (group actions &optional server) - (when (and server - (not (nnfolder-server-opened server))) - (nnfolder-open-server server)) - (unless nnfolder-marks-is-evil - (nnfolder-open-marks group server) - (dolist (action actions) - (let ((range (nth 0 action)) - (what (nth 1 action)) - (marks (nth 2 action))) - (assert (or (eq what 'add) (eq what 'del)) t - "Unknown request-set-mark action: %s" what) - (dolist (mark marks) - (setq nnfolder-marks (gnus-update-alist-soft - mark - (funcall (if (eq what 'add) 'gnus-range-add - 'gnus-remove-from-range) - (cdr (assoc mark nnfolder-marks)) range) - nnfolder-marks))))) - (nnfolder-save-marks group server)) - nil) - -(deffoo nnfolder-request-update-info (group info &optional server) - ;; Change servers. - (when (and server - (not (nnfolder-server-opened server))) - (nnfolder-open-server server)) - (unless nnfolder-marks-is-evil - (nnheader-message 8 "Updating marks for %s..." group) - (nnfolder-open-marks group server) - ;; Update info using `nnfolder-marks'. - (mapcar (lambda (pred) - (gnus-info-set-marks - info - (gnus-update-alist-soft - (cdr pred) - (cdr (assq (cdr pred) nnfolder-marks)) - (gnus-info-marks info)) - t)) - gnus-article-mark-lists) - (let ((seen (cdr (assq 'read nnfolder-marks)))) - (gnus-info-set-read info - (if (and (integerp (car seen)) - (null (cdr seen))) - (list (cons (car seen) (car seen))) - seen))) - (nnheader-message 8 "Updating marks for %s...done" group)) - info) - -(defun nnfolder-group-marks-pathname (group) - "Make pathname for GROUP NOV." - (let ((nnfolder-directory (or nnfolder-marks-directory nnfolder-directory))) - (concat (nnfolder-group-pathname group) nnfolder-marks-file-suffix))) - -(defun nnfolder-save-marks (group server) - (let ((file-name-coding-system nnmail-pathname-coding-system) - (file (nnfolder-group-marks-pathname group))) - (condition-case err - (with-temp-file file - (erase-buffer) - (princ nnfolder-marks (current-buffer)) - (insert "\n")) - (error (or (gnus-yes-or-no-p - (format "Could not write to %s (%s). Continue? " file err)) - (error "Cannot write to %s (%s)" err)))))) - -(defun nnfolder-open-marks (group server) - (let ((file (nnfolder-group-marks-pathname group))) - (if (file-exists-p file) - (setq nnfolder-marks (condition-case err - (with-temp-buffer - (nnheader-insert-file-contents file) - (read (current-buffer))) - (error (or (gnus-yes-or-no-p - (format "Error reading nnfolder marks file %s (%s). Continuing will use marks from .newsrc.eld. Continue? " file err)) - (error "Cannot read nnfolder marks file %s (%s)" file err))))) - ;; User didn't have a .marks file. Probably first time - ;; user of the .marks stuff. Bootstrap it from .newsrc.eld. - (let ((info (gnus-get-info - (gnus-group-prefixed-name - group - (gnus-server-to-method (format "nnfolder:%s" server)))))) - (nnheader-message 7 "Bootstrapping marks for %s..." group) - (setq nnfolder-marks (gnus-info-marks info)) - (push (cons 'read (gnus-info-read info)) nnfolder-marks) - (nnfolder-save-marks group server))))) - -(provide 'nnfolder) - -;;; nnfolder.el ends here diff --git a/lisp/nngateway.el b/lisp/nngateway.el deleted file mode 100644 index b1d3b92..0000000 --- a/lisp/nngateway.el +++ /dev/null @@ -1,94 +0,0 @@ -;;; nngateway.el --- posting news via mail gateways - -;; Copyright (C) 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news, mail - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(require 'nnoo) -(require 'message) - -(nnoo-declare nngateway) - -(defvoo nngateway-address nil - "Address of the mail-to-news gateway.") - -(defvoo nngateway-header-transformation 'nngateway-simple-header-transformation - "Function to be called to rewrite the news headers into mail headers. -It is called narrowed to the headers to be transformed with one -parameter -- the gateway address.") - -;;; Interface functions - -(nnoo-define-basics nngateway) - -(deffoo nngateway-open-server (server &optional defs) - (if (nngateway-server-opened server) - t - (unless (assq 'nngateway-address defs) - (setq defs (append defs (list (list 'nngateway-address server))))) - (nnoo-change-server 'nngateway server defs))) - -(deffoo nngateway-request-post (&optional server) - (when (or (nngateway-server-opened server) - (nngateway-open-server server)) - ;; Rewrite the header. - (let ((buf (current-buffer))) - (with-temp-buffer - (insert-buffer-substring buf) - (message-narrow-to-head) - (funcall nngateway-header-transformation nngateway-address) - (goto-char (point-max)) - (insert mail-header-separator "\n") - (widen) - (let (message-required-mail-headers) - (funcall (or message-send-mail-real-function - message-send-mail-function))) - t)))) - -;;; Internal functions - -(defun nngateway-simple-header-transformation (gateway) - "Transform the headers to use GATEWAY." - (let ((newsgroups (mail-fetch-field "newsgroups"))) - (message-remove-header "to") - (message-remove-header "cc") - (goto-char (point-min)) - (insert "To: " (nnheader-replace-chars-in-string newsgroups ?. ?-) - "@" gateway "\n"))) - -(defun nngateway-mail2news-header-transformation (gateway) - "Transform the headers for sending to a mail2news gateway." - (message-remove-header "to") - (message-remove-header "cc") - (goto-char (point-min)) - (insert "To: " gateway "\n")) - -(nnoo-define-skeleton nngateway) - -(provide 'nngateway) - -;;; nngateway.el ends here diff --git a/lisp/nnheader.el b/lisp/nnheader.el deleted file mode 100644 index 466d701..0000000 --- a/lisp/nnheader.el +++ /dev/null @@ -1,1202 +0,0 @@ -;;; nnheader.el --- header access macros for Semi-gnus and its backends - -;; Copyright (C) 1987, 1988, 1989, 1990, 1993, 1994, 1995, 1996, -;; 1997, 1998, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Masanobu UMEDA -;; Lars Magne Ingebrigtsen -;; MORIOKA Tomohiko -;; Katsumi Yamaoka -;; Keywords: mail, news, MIME - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'static)) - -;; Requiring `gnus-util' at compile time creates a circular -;; dependency between nnheader.el and gnus-util.el. -;(eval-when-compile (require 'gnus-util)) - -(require 'mail-utils) - -;; Reduce the required value of `recursive-load-depth-limit' for Emacs 21. -(require 'pces) -(require 'poem) -(require 'std11) - -(require 'mime) -(eval-and-compile - (autoload 'gnus-sorted-intersection "gnus-range") - (autoload 'gnus-intersection "gnus-range") - (autoload 'gnus-sorted-complement "gnus-range")) - -(defvar nnheader-max-head-length 4096 - "*Max length of the head of articles. - -Value is an integer, nil, or t. Nil means read in chunks of a file -indefinitely until a complete head is found\; t means always read the -entire file immediately, disregarding `nnheader-head-chop-length'. - -Integer values will in effect be rounded up to the nearest multiple of -`nnheader-head-chop-length'.") - -(defvar nnheader-head-chop-length 2048 - "*Length of each read operation when trying to fetch HEAD headers.") - -(defvar nnheader-file-name-translation-alist nil - "*Alist that says how to translate characters in file names. -For instance, if \":\" is invalid as a file character in file names -on your system, you could say something like: - -\(setq nnheader-file-name-translation-alist '((?: . ?_)))") - -(defvar nnheader-text-coding-system - (if (memq system-type '(windows-nt ms-dos ms-windows)) - 'raw-text-dos - 'raw-text) - "Text-safe coding system (For removing ^M). -This variable is a substitute for `mm-text-coding-system'.") - -(defvar nnheader-text-coding-system-for-write nil - "Text coding system for write. -This variable is a substitute for `mm-text-coding-system-for-write'.") - -(eval-and-compile - (autoload 'nnmail-message-id "nnmail") - (autoload 'mail-position-on-field "sendmail") - (autoload 'message-remove-header "message") - (autoload 'gnus-point-at-eol "gnus-util") - (autoload 'gnus-delete-line "gnus-util" nil nil 'macro) - (autoload 'gnus-buffer-live-p "gnus-util")) - -;;; Header access macros. - -;; These macros may look very much like the ones in GNUS 4.1. They -;; are, in a way, but you should note that the indices they use have -;; been changed from the internal GNUS format to the NOV format. The -;; makes it possible to read headers from XOVER much faster. -;; -;; The format of a header is now: -;; [number subject from date id references chars lines xref extra] -;; -;; (That next-to-last entry is defined as "misc" in the NOV format, -;; but Gnus uses it for xrefs.) - -(require 'mmgnus) - -(defmacro mail-header-number (header) - "Return article number in HEADER." - `(mime-entity-location-internal ,header)) - -(defmacro mail-header-set-number (header number) - "Set article number of HEADER to NUMBER." - `(mime-entity-set-location-internal ,header ,number)) - -(defalias 'mail-header-subject 'mime-gnus-entity-subject-internal) -(defalias 'mail-header-set-subject 'mime-gnus-entity-set-subject-internal) - -(defalias 'mail-header-from 'mime-gnus-entity-from-internal) -(defalias 'mail-header-set-from 'mime-gnus-entity-set-from-internal) - -(defalias 'mail-header-date 'mime-gnus-entity-date-internal) -(defalias 'mail-header-set-date 'mime-gnus-entity-set-date-internal) - -(defalias 'mail-header-message-id 'mime-gnus-entity-id-internal) -(defalias 'mail-header-id 'mime-gnus-entity-id-internal) -(defalias 'mail-header-set-message-id 'mime-gnus-entity-set-id-internal) -(defalias 'mail-header-set-id 'mime-gnus-entity-set-id-internal) - -(defalias 'mail-header-references 'mime-gnus-entity-references-internal) -(defalias 'mail-header-set-references - 'mime-gnus-entity-set-references-internal) - -(defalias 'mail-header-chars 'mime-gnus-entity-chars-internal) -(defalias 'mail-header-set-chars 'mime-gnus-entity-set-chars-internal) - -(defalias 'mail-header-lines 'mime-gnus-entity-lines-internal) -(defalias 'mail-header-set-lines 'mime-gnus-entity-set-lines-internal) - -(defalias 'mail-header-xref 'mime-gnus-entity-xref-internal) -(defalias 'mail-header-set-xref 'mime-gnus-entity-set-xref-internal) - -(defalias 'nnheader-decode-subject - (mime-find-field-decoder 'Subject 'nov)) -(defalias 'nnheader-decode-from - (mime-find-field-decoder 'From 'nov)) - -(defalias 'mail-header-extra 'mime-gnus-entity-extra-internal) -(defalias 'mail-header-set-extra 'mime-gnus-entity-set-extra-internal) - -(defun nnheader-decode-field-body (field-body field-name - &optional mode max-column) - (mime-decode-field-body field-body - (if (stringp field-name) - (intern (capitalize field-name)) - field-name) - mode max-column)) - -(defsubst make-full-mail-header (&optional number subject from date id - references chars lines xref - extra) - "Create a new mail header structure initialized with the parameters given." - (luna-make-entity (mm-expand-class-name 'gnus) - :location number - :subject (if subject - (nnheader-decode-subject subject)) - :from (if from - (nnheader-decode-from from)) - :date date - :id id - :references references - :chars chars - :lines lines - :xref xref - :original-header (list (cons 'Subject subject) - (cons 'From from)) - :extra extra)) - -(defsubst make-full-mail-header-from-decoded-header - (&optional number subject from date id references chars lines xref extra) - "Create a new mail header structure initialized with the parameters given." - (luna-make-entity (mm-expand-class-name 'gnus) - :location number - :subject subject - :from from - :date date - :id id - :references references - :chars chars - :lines lines - :xref xref - :extra extra)) - -(defsubst make-mail-header (&optional init) - "Create a new mail header structure initialized with INIT." - (make-full-mail-header init init init init init - init init init init init)) - -;; fake message-ids: generation and detection - -(defvar nnheader-fake-message-id 1) - -(defsubst nnheader-generate-fake-message-id () - (concat "fake+none+" (int-to-string (incf nnheader-fake-message-id)))) - -(defsubst nnheader-fake-message-id-p (id) - (save-match-data ; regular message-id's are <.*> - (string-match "\\`fake\\+none\\+[0-9]+\\'" id))) - -;; Parsing headers and NOV lines. - -(defsubst nnheader-header-value () - (let ((pt (point))) - (prog2 - (skip-chars-forward " \t") - (buffer-substring (point) (std11-field-end)) - (goto-char pt)))) - -(defun nnheader-parse-head (&optional naked) - (let ((case-fold-search t) - (cur (current-buffer)) - (buffer-read-only nil) - in-reply-to lines p ref) - (goto-char (point-min)) - (when naked - (insert "\n")) - ;; Search to the beginning of the next header. Error messages - ;; do not begin with 2 or 3. - (prog1 - (when (or naked (re-search-forward "^[23][0-9]+ " nil t)) - ;; This implementation of this function, with nine - ;; search-forwards instead of the one re-search-forward and - ;; a case (which basically was the old function) is actually - ;; about twice as fast, even though it looks messier. You - ;; can't have everything, I guess. Speed and elegance - ;; don't always go hand in hand. - (make-full-mail-header - ;; Number. - (if naked - (progn - (setq p (point-min)) - 0) - (prog1 - (read cur) - (end-of-line) - (setq p (point)) - (narrow-to-region (point) - (or (and (search-forward "\n.\n" nil t) - (- (point) 2)) - (point))))) - ;; Subject. - (progn - (goto-char p) - (if (search-forward "\nsubject:" nil t) - (nnheader-header-value) "(none)")) - ;; From. - (progn - (goto-char p) - (if (search-forward "\nfrom:" nil t) - (nnheader-header-value) "(nobody)")) - ;; Date. - (progn - (goto-char p) - (if (search-forward "\ndate:" nil t) - (nnheader-header-value) "")) - ;; Message-ID. - (progn - (goto-char p) - (if (search-forward "\nmessage-id:" nil t) - (buffer-substring - (1- (or (search-forward "<" (gnus-point-at-eol) t) - (point))) - (or (search-forward ">" (gnus-point-at-eol) t) (point))) - ;; If there was no message-id, we just fake one to make - ;; subsequent routines simpler. - (nnheader-generate-fake-message-id))) - ;; References. - (progn - (goto-char p) - (if (search-forward "\nreferences:" nil t) - (nnheader-header-value) - ;; Get the references from the in-reply-to header if there - ;; were no references and the in-reply-to header looks - ;; promising. - (if (and (search-forward "\nin-reply-to:" nil t) - (setq in-reply-to (nnheader-header-value)) - (string-match "<[^\n>]+>" in-reply-to)) - (let (ref2) - (setq ref (substring in-reply-to (match-beginning 0) - (match-end 0))) - (while (string-match "<[^\n>]+>" - in-reply-to (match-end 0)) - (setq ref2 (substring in-reply-to (match-beginning 0) - (match-end 0))) - (when (> (length ref2) (length ref)) - (setq ref ref2))) - ref) - nil))) - ;; Chars. - 0 - ;; Lines. - (progn - (goto-char p) - (if (search-forward "\nlines: " nil t) - (if (numberp (setq lines (read cur))) - lines 0) - 0)) - ;; Xref. - (progn - (goto-char p) - (and (search-forward "\nxref:" nil t) - (nnheader-header-value))) - - ;; Extra. - (when nnmail-extra-headers - (let ((extra nnmail-extra-headers) - out) - (while extra - (goto-char p) - (when (search-forward - (concat "\n" (symbol-name (car extra)) ":") nil t) - (push (cons (car extra) (nnheader-header-value)) - out)) - (pop extra)) - out)))) - (when naked - (goto-char (point-min)) - (delete-char 1))))) - -(defmacro nnheader-nov-skip-field () - '(search-forward "\t" eol 'move)) - -(defmacro nnheader-nov-field () - '(buffer-substring (point) (if (nnheader-nov-skip-field) (1- (point)) eol))) - -(defmacro nnheader-nov-read-integer () - '(prog1 - (if (eq (char-after) ?\t) - 0 - (let ((num (condition-case nil - (read (current-buffer)) - (error nil)))) - (if (numberp num) num 0))) - (unless (eobp) - (search-forward "\t" eol 'move)))) - -(defmacro nnheader-nov-parse-extra () - '(let (out string) - (while (not (memq (char-after) '(?\n nil))) - (setq string (nnheader-nov-field)) - (when (string-match "^\\([^ :]+\\): " string) - (push (cons (intern (match-string 1 string)) - (substring string (match-end 0))) - out))) - out)) - -(defmacro nnheader-nov-read-message-id () - '(let ((id (nnheader-nov-field))) - (if (string-match "^<[^>]+>$" id) - id - (nnheader-generate-fake-message-id)))) - -(defun nnheader-parse-nov () - (let ((eol (gnus-point-at-eol))) - (make-full-mail-header - (nnheader-nov-read-integer) ; number - (nnheader-nov-field) ; subject - (nnheader-nov-field) ; from - (nnheader-nov-field) ; date - (nnheader-nov-read-message-id) ; id - (nnheader-nov-field) ; refs - (nnheader-nov-read-integer) ; chars - (nnheader-nov-read-integer) ; lines - (if (eq (char-after) ?\n) - nil - (if (looking-at "Xref: ") - (goto-char (match-end 0))) - (nnheader-nov-field)) ; Xref - (nnheader-nov-parse-extra)))) ; extra - -(defun nnheader-insert-nov (header) - (princ (mail-header-number header) (current-buffer)) - (let ((p (point))) - (insert - "\t" - (or (mime-entity-fetch-field header 'Subject) "(none)") "\t" - (or (mime-entity-fetch-field header 'From) "(nobody)") "\t" - (or (mail-header-date header) "") "\t" - (or (mail-header-id header) - (nnmail-message-id)) - "\t" - (or (mail-header-references header) "") "\t") - (princ (or (mail-header-chars header) 0) (current-buffer)) - (insert "\t") - (princ (or (mail-header-lines header) 0) (current-buffer)) - (insert "\t") - (when (mail-header-xref header) - (insert "Xref: " (mail-header-xref header))) - (when (or (mail-header-xref header) - (mail-header-extra header)) - (insert "\t")) - (when (mail-header-extra header) - (let ((extra (mail-header-extra header))) - (while extra - (insert (symbol-name (caar extra)) - ": " (cdar extra) "\t") - (pop extra)))) - (insert "\n") - (backward-char 1) - (while (search-backward "\n" p t) - (delete-char 1)) - (forward-line 1))) - -(defun nnheader-insert-header (header) - (insert - "Subject: " (or (mail-header-subject header) "(none)") "\n" - "From: " (or (mail-header-from header) "(nobody)") "\n" - "Date: " (or (mail-header-date header) "") "\n" - "Message-ID: " (or (mail-header-id header) (nnmail-message-id)) "\n" - "References: " (or (mail-header-references header) "") "\n" - "Lines: ") - (princ (or (mail-header-lines header) 0) (current-buffer)) - (insert "\n\n")) - -(defun nnheader-insert-article-line (article) - (goto-char (point-min)) - (insert "220 ") - (princ article (current-buffer)) - (insert " Article retrieved.\n") - (search-forward "\n\n" nil 'move) - (delete-region (point) (point-max)) - (forward-char -1) - (insert ".")) - -(defun nnheader-nov-delete-outside-range (beg end) - "Delete all NOV lines that lie outside the BEG to END range." - ;; First we find the first wanted line. - (nnheader-find-nov-line beg) - (delete-region (point-min) (point)) - ;; Then we find the last wanted line. - (when (nnheader-find-nov-line end) - (forward-line 1)) - (delete-region (point) (point-max))) - -(defun nnheader-find-nov-line (article) - "Put point at the NOV line that start with ARTICLE. -If ARTICLE doesn't exist, put point where that line -would have been. The function will return non-nil if -the line could be found." - ;; This function basically does a binary search. - (let ((max (point-max)) - (min (goto-char (point-min))) - (cur (current-buffer)) - (prev (point-min)) - num found) - (while (not found) - (goto-char (/ (+ max min) 2)) - (beginning-of-line) - (if (or (= (point) prev) - (eobp)) - (setq found t) - (setq prev (point)) - (while (and (not (numberp (setq num (read cur)))) - (not (eobp))) - (gnus-delete-line)) - (cond ((> num article) - (setq max (point))) - ((< num article) - (setq min (point))) - (t - (setq found 'yes))))) - ;; We may be at the first line. - (when (and (not num) - (not (eobp))) - (setq num (read cur))) - ;; Now we may have found the article we're looking for, or we - ;; may be somewhere near it. - (when (and (not (eq found 'yes)) - (not (eq num article))) - (setq found (point)) - (while (and (< (point) max) - (or (not (numberp num)) - (< num article))) - (forward-line 1) - (setq found (point)) - (or (eobp) - (= (setq num (read cur)) article))) - (unless (eq num article) - (goto-char found))) - (beginning-of-line) - (eq num article))) - -(defun nnheader-retrieve-headers-from-directory* (articles - directory dependencies - &optional - fetch-old force-new large - backend) - (with-temp-buffer - (let* ((file nil) - (number (length articles)) - (count 0) - (file-name-coding-system 'binary) - (pathname-coding-system 'binary) - (case-fold-search t) - (cur (current-buffer)) - article - headers header id end ref in-reply-to lines chars ctype) - ;; We don't support fetching by Message-ID. - (if (stringp (car articles)) - 'headers - (while articles - (when (and (file-exists-p - (setq file (expand-file-name - (int-to-string - (setq article (pop articles))) - directory))) - (not (file-directory-p file))) - (erase-buffer) - (nnheader-insert-head file) - (save-restriction - (std11-narrow-to-header) - (setq - header - (make-full-mail-header - ;; Number. - article - ;; Subject. - (or (std11-fetch-field "Subject") - "(none)") - ;; From. - (or (std11-fetch-field "From") - "(nobody)") - ;; Date. - (or (std11-fetch-field "Date") - "") - ;; Message-ID. - (progn - (goto-char (point-min)) - (setq id (if (re-search-forward - "^Message-ID: *\\(<[^\n\t> ]+>\\)" nil t) - ;; We do it this way to make sure the Message-ID - ;; is (somewhat) syntactically valid. - (buffer-substring (match-beginning 1) - (match-end 1)) - ;; If there was no message-id, we just fake one - ;; to make subsequent routines simpler. - (nnheader-generate-fake-message-id)))) - ;; References. - (progn - (goto-char (point-min)) - (if (search-forward "\nReferences: " nil t) - (progn - (setq end (point)) - (prog1 - (buffer-substring (match-end 0) (std11-field-end)) - (setq ref - (buffer-substring - (progn - ;; (end-of-line) - (search-backward ">" end t) - (1+ (point))) - (progn - (search-backward "<" end t) - (point)))))) - ;; Get the references from the in-reply-to header if there - ;; were no references and the in-reply-to header looks - ;; promising. - (if (and (search-forward "\nIn-Reply-To: " nil t) - (setq in-reply-to - (buffer-substring (match-end 0) - (std11-field-end))) - (string-match "<[^>]+>" in-reply-to)) - (let (ref2) - (setq ref (substring in-reply-to (match-beginning 0) - (match-end 0))) - (while (string-match "<[^>]+>" - in-reply-to (match-end 0)) - (setq ref2 - (substring in-reply-to (match-beginning 0) - (match-end 0))) - (when (> (length ref2) (length ref)) - (setq ref ref2))) - ref) - (setq ref nil)))) - ;; Chars. - (progn - (goto-char (point-min)) - (if (search-forward "\nChars: " nil t) - (if (numberp (setq chars (ignore-errors (read cur)))) - chars 0) - 0)) - ;; Lines. - (progn - (goto-char (point-min)) - (if (search-forward "\nLines: " nil t) - (if (numberp (setq lines (ignore-errors (read cur)))) - lines 0) - 0)) - ;; Xref. - (std11-fetch-field "Xref") - )) - (goto-char (point-min)) - (if (setq ctype (std11-fetch-field "Content-Type")) - (mime-entity-set-content-type-internal - header (mime-parse-Content-Type ctype))) - ) - (when (setq header - (gnus-dependencies-add-header - header dependencies force-new)) - (push header headers)) - ) - (setq count (1+ count)) - - (and large - (zerop (% count 20)) - (nnheader-message 5 "%s: Receiving headers... %d%%" - backend - (/ (* count 100) number)))) - - (when large - (nnheader-message 5 "%s: Receiving headers...done" backend)) - - headers)))) - -(defun nnheader-retrieve-headers-from-directory (articles - directory dependencies - &optional - fetch-old force-new large - backend) - (cons 'header - (nreverse (nnheader-retrieve-headers-from-directory* - articles directory dependencies - fetch-old force-new large backend)))) - -(defun nnheader-get-newsgroup-headers-xover* (sequence - &optional - force-new dependencies - group) - "Parse the news overview data in the server buffer, and return a -list of headers that match SEQUENCE (see `nntp-retrieve-headers')." - ;; Get the Xref when the users reads the articles since most/some - ;; NNTP servers do not include Xrefs when using XOVER. - ;; (setq gnus-article-internal-prepare-hook '(gnus-article-get-xrefs)) - (let ((cur nntp-server-buffer) - number headers header) - (save-excursion - (set-buffer nntp-server-buffer) - ;; Allow the user to mangle the headers before parsing them. - (gnus-run-hooks 'gnus-parse-headers-hook) - (goto-char (point-min)) - (while (not (eobp)) - (condition-case () - (while (and sequence (not (eobp))) - (setq number (read cur)) - (while (and sequence - (< (car sequence) number)) - (setq sequence (cdr sequence))) - (and sequence - (eq number (car sequence)) - (progn - (setq sequence (cdr sequence)) - (setq header (inline - (gnus-nov-parse-line - number dependencies force-new)))) - (push header headers)) - (forward-line 1)) - (error - (gnus-error 4 "Strange nov line (%d)" - (count-lines (point-min) (point))))) - (forward-line 1)) - ;; A common bug in inn is that if you have posted an article and - ;; then retrieves the active file, it will answer correctly -- - ;; the new article is included. However, a NOV entry for the - ;; article may not have been generated yet, so this may fail. - ;; We work around this problem by retrieving the last few - ;; headers using HEAD. - headers))) - -;; Various cruft the backends and Gnus need to communicate. - -(defvar nntp-server-buffer nil) -(defvar nntp-process-response nil) -(defvar gnus-verbose-backends 7 - "*A number that says how talkative the Gnus backends should be.") -(defvar gnus-nov-is-evil nil - "If non-nil, Gnus backends will never output headers in the NOV format.") -(defvar news-reply-yank-from nil) -(defvar news-reply-yank-message-id nil) - -(defvar nnheader-callback-function nil) - -(defun nnheader-init-server-buffer () - "Initialize the Gnus-backend communication buffer." - (save-excursion - (unless (gnus-buffer-live-p nntp-server-buffer) - (setq nntp-server-buffer (get-buffer-create " *nntpd*"))) - (set-buffer nntp-server-buffer) - (erase-buffer) - (kill-all-local-variables) - (setq case-fold-search t) ;Should ignore case. - (set (make-local-variable 'nntp-process-response) nil) - t)) - -;;; Various functions the backends use. - -(defun nnheader-file-error (file) - "Return a string that says what is wrong with FILE." - (format - (cond - ((not (file-exists-p file)) - "%s does not exist") - ((file-directory-p file) - "%s is a directory") - ((not (file-readable-p file)) - "%s is not readable")) - file)) - -(defun nnheader-insert-head (file) - "Insert the head of the article." - (when (file-exists-p file) - (if (eq nnheader-max-head-length t) - ;; Just read the entire file. - (nnheader-insert-file-contents file) - ;; Read 1K blocks until we find a separator. - (let ((beg 0) - format-alist) - (while (and (eq nnheader-head-chop-length - (nth 1 (nnheader-insert-file-contents - file nil beg - (incf beg nnheader-head-chop-length)))) - (prog1 (not (search-forward "\n\n" nil t)) - (goto-char (point-max))) - (or (null nnheader-max-head-length) - (< beg nnheader-max-head-length)))))) - t)) - -(defun nnheader-article-p () - "Say whether the current buffer looks like an article." - (goto-char (point-min)) - (if (not (search-forward "\n\n" nil t)) - nil - (narrow-to-region (point-min) (1- (point))) - (goto-char (point-min)) - (while (looking-at "[a-zA-Z][^ \t]+:.*\n\\([ \t].*\n\\)*\\|From .*\n") - (goto-char (match-end 0))) - (prog1 - (eobp) - (widen)))) - -(defun nnheader-insert-references (references message-id) - "Insert a References header based on REFERENCES and MESSAGE-ID." - (if (and (not references) (not message-id)) - ;; This is invalid, but not all articles have Message-IDs. - () - (mail-position-on-field "References") - (let ((begin (save-excursion (beginning-of-line) (point))) - (fill-column 78) - (fill-prefix "\t")) - (when references - (insert references)) - (when (and references message-id) - (insert " ")) - (when message-id - (insert message-id)) - ;; Fold long References lines to conform to RFC1036 (sort of). - ;; The region must end with a newline to fill the region - ;; without inserting extra newline. - (fill-region-as-paragraph begin (1+ (point)))))) - -(defun nnheader-replace-header (header new-value) - "Remove HEADER and insert the NEW-VALUE." - (save-excursion - (save-restriction - (nnheader-narrow-to-headers) - (prog1 - (message-remove-header header) - (goto-char (point-max)) - (insert header ": " new-value "\n"))))) - -(defun nnheader-narrow-to-headers () - "Narrow to the head of an article." - (widen) - (narrow-to-region - (goto-char (point-min)) - (if (search-forward "\n\n" nil t) - (1- (point)) - (point-max))) - (goto-char (point-min))) - -(defun nnheader-set-temp-buffer (name &optional noerase) - "Set-buffer to an empty (possibly new) buffer called NAME with undo disabled." - (set-buffer (get-buffer-create name)) - (buffer-disable-undo) - (unless noerase - (erase-buffer)) - (current-buffer)) - -(eval-when-compile (defvar jka-compr-compression-info-list)) -(defvar nnheader-numerical-files - (if (boundp 'jka-compr-compression-info-list) - (concat "\\([0-9]+\\)\\(" - (mapconcat (lambda (i) (aref i 0)) - jka-compr-compression-info-list "\\|") - "\\)?") - "[0-9]+$") - "Regexp that match numerical files.") - -(defvar nnheader-numerical-short-files (concat "^" nnheader-numerical-files) - "Regexp that matches numerical file names.") - -(defvar nnheader-numerical-full-files (concat "/" nnheader-numerical-files) - "Regexp that matches numerical full file paths.") - -(defsubst nnheader-file-to-number (file) - "Take a FILE name and return the article number." - (if (string= nnheader-numerical-short-files "^[0-9]+$") - (string-to-int file) - (string-match nnheader-numerical-short-files file) - (string-to-int (match-string 0 file)))) - -(defvar nnheader-directory-files-is-safe - (or (eq system-type 'windows-nt) - (and (not (featurep 'xemacs)) - (> emacs-major-version 20))) - "If non-nil, Gnus believes `directory-files' is safe. -It has been reported numerous times that `directory-files' fails with -an alarming frequency on NFS mounted file systems. If it is nil, -`nnheader-directory-files-safe' is used.") - -(defun nnheader-directory-files-safe (&rest args) - "Execute `directory-files' twice and returns the longer result." - (let ((first (apply 'directory-files args)) - (second (apply 'directory-files args))) - (if (> (length first) (length second)) - first - second))) - -(defun nnheader-directory-articles (dir) - "Return a list of all article files in directory DIR." - (mapcar 'nnheader-file-to-number - (if nnheader-directory-files-is-safe - (directory-files - dir nil nnheader-numerical-short-files t) - (nnheader-directory-files-safe - dir nil nnheader-numerical-short-files t)))) - -(defun nnheader-article-to-file-alist (dir) - "Return an alist of article/file pairs in DIR." - (mapcar (lambda (file) (cons (nnheader-file-to-number file) file)) - (if nnheader-directory-files-is-safe - (directory-files - dir nil nnheader-numerical-short-files t) - (nnheader-directory-files-safe - dir nil nnheader-numerical-short-files t)))) - -(defun nnheader-fold-continuation-lines () - "Fold continuation lines in the current buffer." - (nnheader-replace-regexp "\\(\r?\n[ \t]+\\)+" " ")) - -(defun nnheader-translate-file-chars (file &optional full) - "Translate FILE into something that can be a file name. -If FULL, translate everything." - (if (null nnheader-file-name-translation-alist) - ;; No translation is necessary. - file - (let* ((i 0) - trans leaf path len) - (if full - ;; Do complete translation. - (setq leaf (copy-sequence file) - path "" - i (if (and (< 1 (length leaf)) (eq ?: (aref leaf 1))) - 2 0)) - ;; We translate -- but only the file name. We leave the directory - ;; alone. - (if (and (featurep 'xemacs) - (memq system-type '(cygwin32 win32 w32 mswindows windows-nt))) - ;; This is needed on NT and stuff, because - ;; file-name-nondirectory is not enough to split - ;; file names, containing ':', e.g. - ;; "d:\\Work\\News\\nntp+news.fido7.ru:fido7.ru.gnu.SCORE" - ;; - ;; we are trying to correctly split such names: - ;; "d:file.name" -> "a:" "file.name" - ;; "aaa:bbb.ccc" -> "" "aaa:bbb.ccc" - ;; "d:aaa\\bbb:ccc" -> "d:aaa\\" "bbb:ccc" - ;; etc. - ;; to translate then only the file name part. - (progn - (setq leaf file - path "") - (if (string-match "\\(^\\w:\\|[/\\]\\)\\([^/\\]+\\)$" file) - (setq leaf (substring file (match-beginning 2)) - path (substring file 0 (match-beginning 2))))) - ;; Emacs DTRT, says andrewi. - (setq leaf (file-name-nondirectory file) - path (file-name-directory file)))) - (setq len (length leaf)) - (while (< i len) - (when (setq trans (cdr (assq (aref leaf i) - nnheader-file-name-translation-alist))) - (aset leaf i trans)) - (incf i)) - (concat path leaf)))) - -(defun nnheader-report (backend &rest args) - "Report an error from the BACKEND. -The first string in ARGS can be a format string." - (set (intern (format "%s-status-string" backend)) - (if (< (length args) 2) - (car args) - (apply 'format args))) - nil) - -(defun nnheader-get-report (backend) - "Get the most recent report from BACKEND." - (condition-case () - (nnheader-message 5 "%s" (symbol-value (intern (format "%s-status-string" - backend)))) - (error (nnheader-message 5 "")))) - -(defun nnheader-insert (format &rest args) - "Clear the communication buffer and insert FORMAT and ARGS into the buffer. -If FORMAT isn't a format string, it and all ARGS will be inserted -without formatting." - (save-excursion - (set-buffer nntp-server-buffer) - (erase-buffer) - (if (string-match "%" format) - (insert (apply 'format format args)) - (apply 'insert format args)) - t)) - -(static-if (fboundp 'subst-char-in-string) - (defsubst nnheader-replace-chars-in-string (string from to) - (subst-char-in-string from to string)) - (defun nnheader-replace-chars-in-string (string from to) - "Replace characters in STRING from FROM to TO." - (let ((string (substring string 0)) ;Copy string. - (len (length string)) - (idx 0)) - ;; Replace all occurrences of FROM with TO. - (while (< idx len) - (when (= (aref string idx) from) - (aset string idx to)) - (setq idx (1+ idx))) - string))) - -(defun nnheader-replace-duplicate-chars-in-string (string from to) - "Replace characters in STRING from FROM to TO." - (let ((string (substring string 0)) ;Copy string. - (len (length string)) - (idx 0) prev i) - ;; Replace all occurrences of FROM with TO. - (while (< idx len) - (setq i (aref string idx)) - (when (and (eq prev from) (= i from)) - (aset string (1- idx) to) - (aset string idx to)) - (setq prev i) - (setq idx (1+ idx))) - string)) - -(defun nnheader-file-to-group (file &optional top) - "Return a group name based on FILE and TOP." - (nnheader-replace-chars-in-string - (if (not top) - file - (condition-case () - (substring (expand-file-name file) - (length - (expand-file-name - (file-name-as-directory top)))) - (error ""))) - ?/ ?.)) - -(defun nnheader-message (level &rest args) - "Message if the Gnus backends are talkative." - (if (or (not (numberp gnus-verbose-backends)) - (<= level gnus-verbose-backends)) - (apply 'message args) - (apply 'format args))) - -(defun nnheader-be-verbose (level) - "Return whether the backends should be verbose on LEVEL." - (or (not (numberp gnus-verbose-backends)) - (<= level gnus-verbose-backends))) - -(defvar nnheader-pathname-coding-system 'binary - "*Coding system for pathname.") - -(defun nnheader-group-pathname (group dir &optional file) - "Make pathname for GROUP." - (concat - (let ((dir (file-name-as-directory (expand-file-name dir)))) - ;; If this directory exists, we use it directly. - (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)))) - -(defun nnheader-functionp (form) - "Return non-nil if FORM is funcallable." - (or (and (symbolp form) (fboundp form)) - (and (listp form) (eq (car form) 'lambda)))) - -(defun nnheader-concat (dir &rest files) - "Concat DIR as directory to FILES." - (apply 'concat (file-name-as-directory dir) files)) - -(defun nnheader-ms-strip-cr () - "Strip ^M from the end of all lines." - (save-excursion - (goto-char (point-min)) - (while (re-search-forward "\r$" nil t) - (delete-backward-char 1)))) - -(defun nnheader-file-size (file) - "Return the file size of FILE or 0." - (or (nth 7 (file-attributes file)) 0)) - -(defun nnheader-find-etc-directory (package &optional file) - "Go through the path and find the \".../etc/PACKAGE\" directory. -If FILE, find the \".../etc/PACKAGE\" file instead." - (let ((path load-path) - dir result) - ;; We try to find the dir by looking at the load path, - ;; stripping away the last component and adding "etc/". - (while path - (if (and (car path) - (file-exists-p - (setq dir (concat - (file-name-directory - (directory-file-name (car path))) - "etc/" package - (if file "" "/")))) - (or file (file-directory-p dir))) - (setq result dir - path nil) - (setq path (cdr path)))) - result)) - -(eval-when-compile - (defvar ange-ftp-path-format) - (defvar efs-path-regexp)) -(defun nnheader-re-read-dir (path) - "Re-read directory PATH if PATH is on a remote system." - (if (and (fboundp 'efs-re-read-dir) (boundp 'efs-path-regexp)) - (when (string-match efs-path-regexp path) - (efs-re-read-dir path)) - (when (and (fboundp 'ange-ftp-re-read-dir) (boundp 'ange-ftp-path-format)) - (when (string-match (car ange-ftp-path-format) path) - (ange-ftp-re-read-dir path))))) - -(defvar nnheader-file-coding-system 'raw-text - "Coding system used in file backends of Gnus.") - -(defun nnheader-insert-file-contents (filename &optional visit beg end replace) - "Like `insert-file-contents', q.v., but only reads in the file. -A buffer may be modified in several ways after reading into the buffer due -to advanced Emacs features, such as file-name-handlers, format decoding, -find-file-hooks, etc. - This function ensures that none of these modifications will take place." - (let ((format-alist nil) - (auto-mode-alist (nnheader-auto-mode-alist)) - (default-major-mode 'fundamental-mode) - (enable-local-variables nil) - (after-insert-file-functions nil) - (enable-local-eval nil) - (find-file-hooks nil)) - (insert-file-contents-as-coding-system - nnheader-file-coding-system filename visit beg end replace))) - -(defun nnheader-find-file-noselect (&rest args) - (let ((format-alist nil) - (auto-mode-alist (nnheader-auto-mode-alist)) - (default-major-mode 'fundamental-mode) - (enable-local-variables nil) - (after-insert-file-functions nil) - (enable-local-eval nil) - (find-file-hooks nil)) - (apply 'find-file-noselect-as-coding-system - nnheader-file-coding-system args))) - -(defun nnheader-auto-mode-alist () - "Return an `auto-mode-alist' with only the .gz (etc) thingies." - (let ((alist auto-mode-alist) - out) - (while alist - (when (listp (cdar alist)) - (push (car alist) out)) - (pop alist)) - (nreverse out))) - -(defun nnheader-directory-regular-files (dir) - "Return a list of all regular files in DIR." - (let ((files (directory-files dir t)) - out) - (while files - (when (file-regular-p (car files)) - (push (car files) out)) - (pop files)) - (nreverse out))) - -(defun nnheader-directory-files (&rest args) - "Same as `directory-files', but prune \".\" and \"..\"." - (let ((files (apply 'directory-files args)) - out) - (while files - (unless (member (file-name-nondirectory (car files)) '("." "..")) - (push (car files) out)) - (pop files)) - (nreverse out))) - -(defmacro nnheader-skeleton-replace (from &optional to regexp) - `(let ((new (generate-new-buffer " *nnheader replace*")) - (cur (current-buffer)) - (start (point-min))) - (set-buffer cur) - (goto-char (point-min)) - (while (,(if regexp 're-search-forward 'search-forward) - ,from nil t) - (insert-buffer-substring - cur start (prog1 (match-beginning 0) (set-buffer new))) - (goto-char (point-max)) - ,(when to `(insert ,to)) - (set-buffer cur) - (setq start (point))) - (insert-buffer-substring - cur start (prog1 (point-max) (set-buffer new))) - (copy-to-buffer cur (point-min) (point-max)) - (kill-buffer (current-buffer)) - (set-buffer cur))) - -(defun nnheader-replace-string (from to) - "Do a fast replacement of FROM to TO from point to `point-max'." - (nnheader-skeleton-replace from to)) - -(defun nnheader-replace-regexp (from to) - "Do a fast regexp replacement of FROM to TO from point to `point-max'." - (nnheader-skeleton-replace from to t)) - -(defun nnheader-strip-cr () - "Strip all \r's from the current buffer." - (nnheader-skeleton-replace "\r")) - -(defalias 'nnheader-run-at-time 'run-at-time) -(defalias 'nnheader-cancel-timer 'cancel-timer) -(defalias 'nnheader-cancel-function-timers 'cancel-function-timers) -(defalias 'nnheader-string-as-multibyte 'string-as-multibyte) - -(defun nnheader-Y-or-n-p (prompt) - "Ask user a \"Y/n\" question. Return t if answer is neither \"n\", \"N\" nor \"C-g\"." - (let ((cursor-in-echo-area t) - (echo-keystrokes 0) - (inhibit-quit t) - ans) - (let (message-log-max) - (while (not (memq ans '(?\ ?N ?Y ?\C-g ?\e ?\n ?\r ?n ?y))) - (message "%s(Y/n) " prompt) - (setq ans (read-char-exclusive)))) - (if (memq ans '(?\C-g ?N ?n)) - (progn - (message "%s(Y/n) No" prompt) - nil) - (message "%s(Y/n) Yes" prompt) - t))) - -(defun nnheader-image-load-path (&optional package) - (let (dir result) - (dolist (path load-path (nreverse result)) - (if (file-directory-p - (setq dir (concat (file-name-directory - (directory-file-name path)) - "etc/" (or package "gnus/")))) - (push dir result)) - (push path result)))) -(defalias 'mm-image-load-path 'nnheader-image-load-path) - -(defalias 'mm-read-coding-system - (if (or (and (featurep 'xemacs) - (<= (string-to-number emacs-version) 21.1)) - (boundp 'MULE)) - (lambda (prompt &optional default-coding-system) - (read-coding-system prompt)) - 'read-coding-system)) - -(when (featurep 'xemacs) - (require 'nnheaderxm)) - -(run-hooks 'nnheader-load-hook) - -(provide 'nnheader) - -;;; nnheader.el ends here diff --git a/lisp/nnheaderxm.el b/lisp/nnheaderxm.el deleted file mode 100644 index 06bce72..0000000 --- a/lisp/nnheaderxm.el +++ /dev/null @@ -1,66 +0,0 @@ -;;; nnheaderxm.el --- making Gnus backends work under XEmacs - -;; Copyright (C) 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Katsumi Yamaoka -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(defun nnheader-xmas-run-at-time (time repeat function &rest args) - (start-itimer - "nnheader-run-at-time" - `(lambda () - (,function ,@args)) - time repeat)) - -(defun nnheader-xmas-Y-or-n-p (prompt) - "Ask user a \"Y/n\" question. Return t if answer is neither \"n\", \"N\" nor \"C-g\"." - (if (should-use-dialog-box-p) - (yes-or-no-p-dialog-box prompt) - (let ((cursor-in-echo-area t) - (echo-keystrokes 0) - (inhibit-quit t) - event) - (message "%s(Y/n) " prompt) - (while (or (not (key-press-event-p (setq event (next-command-event)))) - (not (or (eq (event-key event) 'escape) - (memq (event-to-character event) - '(?\ ?N ?Y ?\C-g ?\e ?\n ?\r ?n ?y)))))) - (if (memq (event-key event) '(?\C-g ?N ?n)) - (progn - (message "%s(Y/n) No" prompt) - nil) - (message "%s(Y/n) Yes" prompt) - t)))) - -(defalias 'nnheader-run-at-time 'nnheader-xmas-run-at-time) -(defalias 'nnheader-cancel-timer 'delete-itimer) -(defalias 'nnheader-cancel-function-timers 'ignore) -(defalias 'nnheader-string-as-multibyte 'identity) -(defalias 'nnheader-Y-or-n-p 'nnheader-xmas-Y-or-n-p) - -(provide 'nnheaderxm) - -;;; nnheaderxm.el ends here diff --git a/lisp/nnimap.el b/lisp/nnimap.el deleted file mode 100644 index 2dfcedf..0000000 --- a/lisp/nnimap.el +++ /dev/null @@ -1,1421 +0,0 @@ -;;; nnimap.el --- imap backend for Gnus -;; Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. - -;; Author: Simon Josefsson -;; Jim Radford -;; Keywords: mail - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; Todo, major things: -;; -;; o Fix Gnus to view correct number of unread/total articles in group buffer -;; o Fix Gnus to handle leading '.' in group names (fixed?) -;; o Finish disconnected mode (moving articles between mailboxes unplugged) -;; o Sieve -;; o MIME (partial article fetches) -;; o Split to other backends, different split rules for different -;; servers/inboxes -;; -;; Todo, minor things: -;; -;; o Don't require half of Gnus -- backends should be standalone -;; o Verify that we don't use IMAP4rev1 specific things (RFC2060 App B) -;; o Dont uid fetch 1,* in nnimap-retrive-groups (slow) -;; o Split up big fetches (1,* header especially) in smaller chunks -;; o What do I do with gnus-newsgroup-*? -;; o Tell Gnus about new groups (how can we tell?) -;; o Respooling (fix Gnus?) (unnecessery?) -;; o Add support for the following: (if applicable) -;; request-list-newsgroups, request-regenerate -;; list-active-group, -;; request-associate-buffer, request-restore-buffer, -;; o Do The Right Thing when UIDVALIDITY changes (what's the right thing?) -;; o Support RFC2221 (Login referrals) -;; o IMAP2BIS compatibility? (RFC2061) -;; o ACAP stuff (perhaps a different project, would be nice to ACAPify -;; .newsrc.eld) -;; o What about Gnus's article editing, can we support it? NO! -;; o Use \Draft to support the draft group?? -;; o Duplicate suppression - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'gnus-clfns)) -(eval-and-compile (require 'imap)) - -(require 'nnoo) -(require 'nnmail) -(require 'nnheader) -(require 'gnus) -(require 'gnus-range) -(require 'gnus-start) -(require 'gnus-int) - -(nnoo-declare nnimap) - -(defconst nnimap-version "nnimap 1.0") - -(defvoo nnimap-address nil - "Address of physical IMAP server. If nil, use the virtual server's name.") - -(defvoo nnimap-server-port nil - "Port number on physical IMAP server. -If nil, defaults to 993 for SSL connections and 143 otherwise.") - -;; Splitting variables - -(defvar nnimap-split-crosspost t - "If non-nil, do crossposting if several split methods match the mail. -If nil, the first match found will be used.") - -(defvar nnimap-split-inbox nil - "*Name of mailbox to split mail from. - -Mail is read from this mailbox and split according to rules in -`nnimap-split-rule'. - -This can be a string or a list of strings.") - -(defvar nnimap-split-rule nil - "*Mail will be split according to theese rules. - -Mail is read from mailbox(es) specified in `nnimap-split-inbox'. - -If you'd like, for instance, one mail group for mail from the -\"gnus-imap\" mailing list, one group for junk mail and leave -everything else in the incoming mailbox, you could do something like -this: - -(setq nnimap-split-rule '((\"INBOX.gnus-imap\" \"From:.*gnus-imap\") - (\"INBOX.junk\" \"Subject:.*buy\"))) - -As you can see, `nnimap-split-rule' is a list of lists, where the first -element in each \"rule\" is the name of the IMAP mailbox, and the -second is a regexp that nnimap will try to match on the header to find -a fit. - -The second element can also be a function. In that case, it will be -called narrowed to the headers with the first element of the rule as -the argument. It should return a non-nil value if it thinks that the -mail belongs in that group. - -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. See `nnimap-split-fancy'. - -To allow for different split rules on different virtual servers, and -even different split rules in different inboxes on the same server, -the syntax of this variable have been extended along the lines of: - -(setq nnimap-split-rule - '((\"my1server\" (\".*\" ((\"ding\" \"ding@gnus.org\") - (\"junk\" \"From:.*Simon\"))) - (\"my2server\" (\"INBOX\" nnimap-split-fancy)) - (\"my[34]server\" (\".*\" ((\"private\" \"To:.*Simon\") - (\"junk\" my-junk-func))))) - -The virtual server name is in fact a regexp, so that the same rules -may apply to several servers. In the example, the servers -\"my3server\" and \"my4server\" both use the same rules. Similarly, -the inbox string is also a regexp. The actual splitting rules are as -before, either a function, or a list with group/regexp or -group/function elements.") - -(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.") - -;; Authorization / Privacy variables - -(defvoo nnimap-auth-method nil - "Obsolete.") - -(defvoo nnimap-stream nil - "How nnimap will connect to the server. - -The default, nil, will try to use the \"best\" method the server can -handle. - -Change this if - -1) you want to connect with SSL. The SSL integration with IMAP is - brain-dead so you'll have to tell it specifically. - -2) your server is more capable than your environment -- i.e. your - server accept Kerberos login's but you haven't installed the - `imtest' program or your machine isn't configured for Kerberos. - -Possible choices: kerberos4, ssl, network") - -(defvoo nnimap-authenticator nil - "How nnimap authenticate itself to the server. - -The default, nil, will try to use the \"best\" method the server can -handle. - -There is only one reason for fiddling with this variable, and that is -if your server is more capable than your environment -- i.e. you -connect to a server that accept Kerberos login's but you haven't -installed the `imtest' program or your machine isn't configured for -Kerberos. - -Possible choices: kerberos4, cram-md5, login, anonymous.") - -(defvoo nnimap-directory (nnheader-concat gnus-directory "overview/") - "Directory to keep NOV cache files for nnimap groups. -See also `nnimap-nov-file-name'.") - -(defvoo nnimap-nov-file-name "nnimap." - "NOV cache base filename. -The group name and `nnimap-nov-file-name-suffix' will be appended. A -typical complete file name would be -~/News/overview/nnimap.pdc.INBOX.ding.nov, or -~/News/overview/nnimap/pdc/INBOX/ding/nov if -`nnmail-use-long-file-names' is nil") - -(defvoo nnimap-nov-file-name-suffix ".novcache" - "Suffix for NOV cache base filename.") - -(defvoo nnimap-nov-is-evil nil - "If non-nil, nnimap will never generate or use a local nov database for this backend. -Using nov databases will speed up header fetching considerably. -Unlike other backends, you do not need to take special care if you -flip this variable.") - -(defvoo nnimap-expunge-on-close 'always ; 'ask, 'never - "Whether to expunge a group when it is closed. -When a IMAP group with articles marked for deletion is closed, this -variable determine if nnimap should actually remove the articles or -not. - -If always, nnimap always perform a expunge when closing the group. -If never, nnimap never expunges articles marked for deletion. -If ask, nnimap will ask you if you wish to expunge marked articles. - -When setting this variable to `never', you can only expunge articles -by using `G x' (gnus-group-nnimap-expunge) from the Group buffer.") - -(defvoo nnimap-list-pattern "*" - "A string LIMIT or list of strings with mailbox wildcards used to limit available groups. -See below for available wildcards. - -The LIMIT string can be a cons cell (REFERENCE . LIMIT), where -REFERENCE will be passed as the first parameter to LIST/LSUB. The -semantics of this are server specific, on the University of Washington -server you can specify a directory. - -Example: - '(\"INBOX\" \"mail/*\" (\"~friend/mail/\" . \"list/*\")) - -There are two wildcards * and %. * matches everything, % matches -everything in the current hierarchy.") - -(defvoo nnimap-news-groups nil - "IMAP support a news-like mode, also known as bulletin board mode, -where replies is sent via IMAP instead of SMTP. - -This variable should contain a regexp matching groups where you wish -replies to be stored to the mailbox directly. - -Example: - '(\"^[^I][^N][^B][^O][^X].*$\") - -This will match all groups not beginning with \"INBOX\". - -Note that there is nothing technically different between mail-like and -news-like mailboxes. If you wish to have a group with todo items or -similar which you wouldn't want to set up a mailing list for, you can -use this to make replies go directly to the group.") - -(defvoo nnimap-expunge-search-string "UID %s NOT SINCE %s" - "*IMAP search command to use for articles that are to be expired. -The first %s is replaced by a UID set of articles to search on, -and the second %s is replaced by a date criterium. - -One useful (and perhaps the only useful) value to change this to would -be `UID %s NOT SENTSINCE %s' to make nnimap use the Date: header -instead of the internal date of messages. See section 6.4.4 of RFC -2060 for more information on valid strings.") - -(defvoo nnimap-importantize-dormant t - "*If non-nil, mark \"dormant\" articles as \"ticked\" for other IMAP clients. -Note that within Gnus, dormant articles will still (only) be -marked as ticked. This is to make \"dormant\" articles stand out, -just like \"ticked\" articles, in other IMAP clients.") - -(defvoo nnimap-server-address nil - "Obsolete. Use `nnimap-address'.") - -(defcustom nnimap-authinfo-file "~/.authinfo" - "Authorization information for IMAP servers. In .netrc format." - :type - '(choice file - (repeat :tag "Entries" - :menu-tag "Inline" - (list :format "%v" - :value ("" ("login" . "") ("password" . "")) - (string :tag "Host") - (checklist :inline t - (cons :format "%v" - (const :format "" "login") - (string :format "Login: %v")) - (cons :format "%v" - (const :format "" "password") - (string :format "Password: %v"))))))) - -(defcustom nnimap-prune-cache t - "If non-nil, nnimap check whether articles still exist on server before using data stored in NOV cache." - :type 'boolean) - -(defvar nnimap-request-list-method 'imap-mailbox-list - "Method to use to request a list of all folders from the server. -If this is 'imap-mailbox-lsub, then use a server-side subscription list to -restrict visible folders.") - -;; Internal variables: - -(defvar nnimap-debug nil - "Name of buffer to record debugging info. -For example: (setq nnimap-debug \"*nnimap-debug*\")") -(defvar nnimap-current-move-server nil) -(defvar nnimap-current-move-group nil) -(defvar nnimap-current-move-article nil) -(defvar nnimap-length) -(defvar nnimap-progress-chars '(?| ?/ ?- ?\\)) -(defvar nnimap-progress-how-often 20) -(defvar nnimap-counter) -(defvar nnimap-callback-callback-function nil - "Gnus callback the nnimap asynchronous callback should call.") -(defvar nnimap-callback-buffer nil - "Which buffer the asynchronous article prefetch callback should work in.") -(defvar nnimap-server-buffer-alist nil) ;; Map server name to buffers. -(defvar nnimap-current-server nil) ;; Current server -(defvar nnimap-server-buffer nil) ;; Current servers' buffer - - - -(nnoo-define-basics nnimap) - -;; Utility functions: - -(defsubst nnimap-get-server-buffer (server) - "Return buffer for SERVER, if nil use current server." - (cadr (assoc (or server nnimap-current-server) nnimap-server-buffer-alist))) - -(defun nnimap-possibly-change-server (server) - "Return buffer for SERVER, changing the current server as a side-effect. -If SERVER is nil, uses the current server." - (setq nnimap-current-server (or server nnimap-current-server) - nnimap-server-buffer (nnimap-get-server-buffer nnimap-current-server))) - -(defun nnimap-verify-uidvalidity (group server) - "Verify stored uidvalidity match current one in GROUP on SERVER." - (let* ((gnusgroup (gnus-group-prefixed-name - group (gnus-server-to-method - (format "nnimap:%s" server)))) - (new-uidvalidity (imap-mailbox-get 'uidvalidity)) - (old-uidvalidity (gnus-group-get-parameter gnusgroup 'uidvalidity)) - (dir (file-name-as-directory (expand-file-name nnimap-directory))) - (nameuid (nnheader-translate-file-chars - (concat nnimap-nov-file-name - (if (equal server "") - "unnamed" - server) "." group "." old-uidvalidity - nnimap-nov-file-name-suffix) t)) - (file (if (or nnmail-use-long-file-names - (file-exists-p (expand-file-name nameuid dir))) - (expand-file-name nameuid dir) - (expand-file-name - (encode-coding-string - (nnheader-replace-chars-in-string nameuid ?. ?/) - nnmail-pathname-coding-system) - dir)))) - (if old-uidvalidity - (if (not (equal old-uidvalidity new-uidvalidity)) - ;; uidvalidity clash - (gnus-delete-file file) - (gnus-group-set-parameter gnusgroup 'uidvalidity new-uidvalidity) - t) - (gnus-group-add-parameter gnusgroup (cons 'uidvalidity new-uidvalidity)) - t))) - -(defun nnimap-before-find-minmax-bugworkaround () - "Function called before iterating through mailboxes with -`nnimap-find-minmax-uid'." - ;; XXX this is for UoW imapd problem, it doesn't notice new mail in - ;; currently selected mailbox without a re-select/examine. - (or (null (imap-current-mailbox nnimap-server-buffer)) - (imap-mailbox-unselect nnimap-server-buffer))) - -(defun nnimap-find-minmax-uid (group &optional examine) - "Find lowest and highest active article nummber in GROUP. -If EXAMINE is non-nil the group is selected read-only." - (with-current-buffer nnimap-server-buffer - (when (imap-mailbox-select group examine) - (let (minuid maxuid) - (when (> (imap-mailbox-get 'exists) 0) - (imap-fetch "1,*" "UID" nil 'nouidfetch) - (imap-message-map (lambda (uid Uid) - (setq minuid (if minuid (min minuid uid) uid) - maxuid (if maxuid (max maxuid uid) uid))) - 'UID)) - (list (imap-mailbox-get 'exists) minuid maxuid))))) - -(defun nnimap-possibly-change-group (group &optional server) - "Make GROUP the current group, and SERVER the current server." - (when (nnimap-possibly-change-server server) - (with-current-buffer nnimap-server-buffer - (if (or (null group) (imap-current-mailbox-p group)) - imap-current-mailbox - (if (imap-mailbox-select group) - (if (or (nnimap-verify-uidvalidity - group (or server nnimap-current-server)) - (zerop (imap-mailbox-get 'exists group)) - t ;; for OGnus to see if ignoring uidvalidity - ;; changes has any bad effects. - (yes-or-no-p - (format - "nnimap: Group %s is not uidvalid. Continue? " group))) - imap-current-mailbox - (imap-mailbox-unselect) - (error "nnimap: Group %s is not uid-valid" group)) - (nnheader-report 'nnimap (imap-error-text))))))) - -(defun nnimap-replace-whitespace (string) - "Return STRING with all whitespace replaced with space." - (when string - (while (string-match "[\r\n\t]+" string) - (setq string (replace-match " " t t string))) - string)) - -;; Required backend functions - -(defun nnimap-retrieve-headers-progress () - "Hook to insert NOV line for current article into `nntp-server-buffer'." - (and (numberp nnmail-large-newsgroup) - (zerop (% (incf nnimap-counter) nnimap-progress-how-often)) - (> nnimap-length nnmail-large-newsgroup) - (nnheader-message 6 "nnimap: Retrieving headers... %c" - (nth (/ (% nnimap-counter - (* (length nnimap-progress-chars) - nnimap-progress-how-often)) - nnimap-progress-how-often) - nnimap-progress-chars))) - (with-current-buffer nntp-server-buffer - (let (headers lines chars uid mbx) - (with-current-buffer nnimap-server-buffer - (setq uid imap-current-message - mbx imap-current-mailbox - headers (nnimap-demule - (if (imap-capability 'IMAP4rev1) - ;; xxx don't just use car? alist doesn't contain - ;; anything else now, but it might... - (nth 2 (car (imap-message-get uid 'BODYDETAIL))) - (imap-message-get uid 'RFC822.HEADER))) - lines (imap-body-lines (imap-message-body imap-current-message)) - chars (imap-message-get imap-current-message 'RFC822.SIZE))) - (nnheader-insert-nov - (with-temp-buffer - (buffer-disable-undo) - (insert headers) - (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) - "Get a range of articles to fetch based on ARTICLES and FETCH-OLD." - (with-current-buffer nnimap-server-buffer - (if (numberp (car-safe articles)) - (imap-search - (concat "UID " - (imap-range-to-message-set - (gnus-compress-sequence - (append (gnus-uncompress-sequence - (and fetch-old - (cons (if (numberp fetch-old) - (max 1 (- (car articles) fetch-old)) - 1) - (1- (car articles))))) - articles))))) - (mapcar (lambda (msgid) - (imap-search - (format "HEADER Message-Id \"%s\"" msgid))) - articles)))) - -(defun nnimap-group-overview-filename (group server) - "Make pathname for GROUP on SERVER." - (let* ((dir (file-name-as-directory (expand-file-name nnimap-directory))) - (uidvalidity (gnus-group-get-parameter - (gnus-group-prefixed-name - group (gnus-server-to-method - (format "nnimap:%s" server))) - 'uidvalidity)) - (name (nnheader-translate-file-chars - (concat nnimap-nov-file-name - (if (equal server "") - "unnamed" - server) "." group nnimap-nov-file-name-suffix) t)) - (nameuid (nnheader-translate-file-chars - (concat nnimap-nov-file-name - (if (equal server "") - "unnamed" - server) "." group "." uidvalidity - nnimap-nov-file-name-suffix) t)) - (oldfile (if (or nnmail-use-long-file-names - (file-exists-p (expand-file-name name dir))) - (expand-file-name name dir) - (expand-file-name - (encode-coding-string - (nnheader-replace-chars-in-string name ?. ?/) - nnmail-pathname-coding-system) - dir))) - (newfile (if (or nnmail-use-long-file-names - (file-exists-p (expand-file-name nameuid dir))) - (expand-file-name nameuid dir) - (expand-file-name - (encode-coding-string - (nnheader-replace-chars-in-string nameuid ?. ?/) - nnmail-pathname-coding-system) - dir)))) - (when (and (file-exists-p oldfile) (not (file-exists-p newfile))) - (message "nnimap: Upgrading novcache filename...") - (sit-for 1) - (gnus-make-directory (file-name-directory newfile)) - (unless (ignore-errors (rename-file oldfile newfile) t) - (if (ignore-errors (copy-file oldfile newfile) t) - (delete-file oldfile) - (error "Can't rename `%s' to `%s'" oldfile newfile)))) - newfile)) - -(defun nnimap-retrieve-headers-from-file (group server) - (with-current-buffer nntp-server-buffer - (let ((nov (nnimap-group-overview-filename group server))) - (when (file-exists-p nov) - (nnheader-insert-file-contents nov) - (set-buffer-modified-p nil) - (let ((min (ignore-errors (goto-char (point-min)) - (read (current-buffer)))) - (max (ignore-errors (goto-char (point-max)) - (forward-line -1) - (read (current-buffer))))) - (if (and (numberp min) (numberp max)) - (cons min max) - ;; junk, remove it, it's saved later - (erase-buffer) - nil)))))) - -(defun nnimap-retrieve-headers-from-server (articles group server) - (with-current-buffer nnimap-server-buffer - (let ((imap-fetch-data-hook '(nnimap-retrieve-headers-progress)) - (nnimap-length (gnus-range-length articles)) - (nnimap-counter 0)) - (imap-fetch (imap-range-to-message-set articles) - (concat "(UID RFC822.SIZE BODY " - (let ((headers - (append '(Subject From Date Message-Id - References In-Reply-To Xref) - (copy-sequence - nnmail-extra-headers)))) - (if (imap-capability 'IMAP4rev1) - (format "BODY.PEEK[HEADER.FIELDS %s])" headers) - (format "RFC822.HEADER.LINES %s)" headers))))) - (and (numberp nnmail-large-newsgroup) - (> nnimap-length nnmail-large-newsgroup) - (nnheader-message 6 "nnimap: Retrieving headers...done"))))) - -(defun nnimap-dont-use-nov-p (group server) - (or gnus-nov-is-evil nnimap-nov-is-evil - (unless (and (gnus-make-directory - (file-name-directory - (nnimap-group-overview-filename group server))) - (file-writable-p - (nnimap-group-overview-filename group server))) - (message "nnimap: Nov cache not writable, %s" - (nnimap-group-overview-filename group server))))) - -(deffoo nnimap-retrieve-headers (articles &optional group server fetch-old) - (when (nnimap-possibly-change-group group server) - (with-current-buffer nntp-server-buffer - (erase-buffer) - (if (nnimap-dont-use-nov-p group server) - (nnimap-retrieve-headers-from-server - (gnus-compress-sequence articles) group server) - (let (uids cached low high) - (when (setq uids (nnimap-retrieve-which-headers articles fetch-old) - low (car uids) - high (car (last uids))) - (if (setq cached (nnimap-retrieve-headers-from-file group server)) - (progn - ;; fetch articles with uids before cache block - (when (< low (car cached)) - (goto-char (point-min)) - (nnimap-retrieve-headers-from-server - (cons low (1- (car cached))) group server)) - ;; fetch articles with uids after cache block - (when (> high (cdr cached)) - (goto-char (point-max)) - (nnimap-retrieve-headers-from-server - (cons (1+ (cdr cached)) high) group server)) - (when nnimap-prune-cache - ;; 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))))) - ;; nothing cached, fetch whole range from server - (nnimap-retrieve-headers-from-server - (cons low high) group server)) - (when (buffer-modified-p) - (nnmail-write-region - 1 (point-max) (nnimap-group-overview-filename group server) - nil 'nomesg)) - (nnheader-nov-delete-outside-range low high)))) - 'nov))) - -(defun nnimap-open-connection (server) - (if (not (imap-open nnimap-address nnimap-server-port nnimap-stream - nnimap-authenticator nnimap-server-buffer)) - (nnheader-report 'nnimap "Can't open connection to server %s" server) - (unless (or (imap-capability 'IMAP4 nnimap-server-buffer) - (imap-capability 'IMAP4rev1 nnimap-server-buffer)) - (imap-close nnimap-server-buffer) - (nnheader-report 'nnimap "Server %s is not IMAP4 compliant" server)) - (let* ((list (gnus-parse-netrc nnimap-authinfo-file)) - (port (if nnimap-server-port - (int-to-string nnimap-server-port) - "imap")) - (alist (gnus-netrc-machine list (or nnimap-server-address - nnimap-address server) - port "imap")) - (user (gnus-netrc-get alist "login")) - (passwd (gnus-netrc-get alist "password"))) - (if (imap-authenticate user passwd nnimap-server-buffer) - (prog1 - (push (list server nnimap-server-buffer) - nnimap-server-buffer-alist) - (nnimap-possibly-change-server server)) - (imap-close nnimap-server-buffer) - (kill-buffer nnimap-server-buffer) - (nnheader-report 'nnimap "Could not authenticate to %s" server))))) - -(deffoo nnimap-open-server (server &optional defs) - (nnheader-init-server-buffer) - (if (nnimap-server-opened server) - t - (unless (assq 'nnimap-server-buffer defs) - (push (list 'nnimap-server-buffer (concat " *nnimap* " server)) defs)) - ;; translate `nnimap-server-address' to `nnimap-address' in defs - ;; for people that configured nnimap with a very old version - (unless (assq 'nnimap-address defs) - (if (assq 'nnimap-server-address defs) - (push (list 'nnimap-address - (cadr (assq 'nnimap-server-address defs))) defs) - (push (list 'nnimap-address server) defs))) - (nnoo-change-server 'nnimap server defs) - (or nnimap-server-buffer - (setq nnimap-server-buffer (cadr (assq 'nnimap-server-buffer defs)))) - (with-current-buffer (get-buffer-create nnimap-server-buffer) - (nnoo-change-server 'nnimap server defs)) - (or (and nnimap-server-buffer - (imap-opened nnimap-server-buffer)) - (nnimap-open-connection server)))) - -(deffoo nnimap-server-opened (&optional server) - "Whether SERVER is opened. -If SERVER is the current virtual server, and the connection to the -physical server is alive, this function return a non-nil value. If -SERVER is nil, it is treated as the current server." - ;; clean up autologouts?? - (and (or server nnimap-current-server) - (nnoo-server-opened 'nnimap (or server nnimap-current-server)) - (imap-opened (nnimap-get-server-buffer server)))) - -(deffoo nnimap-close-server (&optional server) - "Close connection to server and free all resources connected to it. -Return nil if the server couldn't be closed for some reason." - (let ((server (or server nnimap-current-server))) - (when (or (nnimap-server-opened server) - (imap-opened (nnimap-get-server-buffer server))) - (imap-close (nnimap-get-server-buffer server)) - (kill-buffer (nnimap-get-server-buffer server)) - (setq nnimap-server-buffer nil - nnimap-current-server nil - nnimap-server-buffer-alist - (delq server nnimap-server-buffer-alist))) - (nnoo-close-server 'nnimap server))) - -(deffoo nnimap-request-close () - "Close connection to all servers and free all resources that the backend have reserved. -All buffers that have been created by that -backend should be killed. (Not the nntp-server-buffer, though.) This -function is generally only called when Gnus is shutting down." - (mapcar (lambda (server) (nnimap-close-server (car server))) - nnimap-server-buffer-alist) - (setq nnimap-server-buffer-alist nil)) - -(deffoo nnimap-status-message (&optional server) - "This function returns the last error message from server." - (when (nnimap-possibly-change-server server) - (nnoo-status-message 'nnimap server))) - -(defun nnimap-demule (string) - (funcall (if (and (fboundp 'string-as-multibyte) - (subrp (symbol-function 'string-as-multibyte))) - 'string-as-multibyte - 'identity) - (or string ""))) - -(defun nnimap-callback () - (remove-hook 'imap-fetch-data-hook 'nnimap-callback) - (with-current-buffer nnimap-callback-buffer - (insert - (with-current-buffer nnimap-server-buffer - (if (imap-capability 'IMAP4rev1) - ;; xxx don't just use car? alist doesn't contain - ;; anything else now, but it might... - (nth 2 (car (imap-message-get (imap-current-message) 'BODYDETAIL))) - (imap-message-get (imap-current-message) 'RFC822)))) - (nnheader-ms-strip-cr) - (funcall nnimap-callback-callback-function t))) - -(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))) - (when article - (gnus-message 10 "nnimap: Fetching (part of) article %d..." article) - (if (not nnheader-callback-function) - (with-current-buffer (or to-buffer nntp-server-buffer) - (erase-buffer) - (let ((data (imap-fetch article part prop nil - nnimap-server-buffer))) - (when data - (insert (if detail (nth 2 (car data)) data)) - (nnheader-ms-strip-cr) - (gnus-message 10 - "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) - (imap-fetch-asynch article part nil nnimap-server-buffer) - (cons group article)))))) - -(deffoo nnimap-asynchronous-p () - t) - -(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 'detail) - (nnimap-request-article-part - article "RFC822.PEEK" 'RFC822 group server to-buffer))) - -(deffoo nnimap-request-head (article &optional 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 'detail) - (nnimap-request-article-part - article "RFC822.TEXT.PEEK" 'RFC822.TEXT group server to-buffer))) - -(deffoo nnimap-request-group (group &optional server fast) - (nnimap-request-update-info-internal - group - (gnus-get-info (gnus-group-prefixed-name - group (gnus-server-to-method (format "nnimap:%s" server)))) - server) - (when (nnimap-possibly-change-group group server) - (nnimap-before-find-minmax-bugworkaround) - (let (info) - (cond (fast group) - ((null (setq info (nnimap-find-minmax-uid group t))) - (nnheader-report 'nnimap "Could not get active info for %s" - group)) - (t - (nnheader-insert "211 %d %d %d %s\n" (or (nth 0 info) 0) - (max 1 (or (nth 1 info) 1)) - (or (nth 2 info) 0) group) - (nnheader-report 'nnimap "Group %s selected" group) - t))))) - -(defun nnimap-close-group (group &optional server) - (with-current-buffer nnimap-server-buffer - (when (and (imap-opened) - (nnimap-possibly-change-group group server)) - (case nnimap-expunge-on-close - ('always (imap-mailbox-expunge) - (imap-mailbox-close)) - ('ask (if (and (imap-search "DELETED") - (gnus-y-or-n-p (format - "Expunge articles in group `%s'? " - imap-current-mailbox))) - (progn (imap-mailbox-expunge) - (imap-mailbox-close)) - (imap-mailbox-unselect))) - (t (imap-mailbox-unselect))) - (not imap-current-mailbox)))) - -(defun nnimap-pattern-to-list-arguments (pattern) - (mapcar (lambda (p) - (cons (car-safe p) (or (cdr-safe p) p))) - (if (and (listp pattern) - (listp (cdr pattern))) - pattern - (list pattern)))) - -(deffoo nnimap-request-list (&optional server) - (when (nnimap-possibly-change-server server) - (with-current-buffer nntp-server-buffer - (erase-buffer)) - (gnus-message 5 "nnimap: Generating active list%s..." - (if (> (length server) 0) (concat " for " server) "")) - (nnimap-before-find-minmax-bugworkaround) - (with-current-buffer nnimap-server-buffer - (dolist (pattern (nnimap-pattern-to-list-arguments nnimap-list-pattern)) - (dolist (mbx (funcall nnimap-request-list-method - (cdr pattern) (car pattern))) - (or (member "\\NoSelect" (imap-mailbox-get 'list-flags mbx)) - (let ((info (nnimap-find-minmax-uid mbx 'examine))) - (when info - (with-current-buffer nntp-server-buffer - (insert (format "\"%s\" %d %d y\n" - mbx (or (nth 2 info) 0) - (max 1 (or (nth 1 info) 1))))))))))) - (gnus-message 5 "nnimap: Generating active list%s...done" - (if (> (length server) 0) (concat " for " server) "")) - t)) - -(deffoo nnimap-request-post (&optional server) - (let ((success t)) - (dolist (mbx (message-unquote-tokens - (message-tokenize-header - (message-fetch-field "Newsgroups") ", ")) success) - (let ((to-newsgroup (gnus-group-prefixed-name mbx gnus-command-method))) - (or (gnus-active to-newsgroup) - (gnus-activate-group to-newsgroup) - (if (gnus-y-or-n-p (format "No such group: %s. Create it? " - to-newsgroup)) - (or (and (gnus-request-create-group - to-newsgroup gnus-command-method) - (gnus-activate-group to-newsgroup nil nil - gnus-command-method)) - (error "Couldn't create group %s" to-newsgroup))) - (error "No such group: %s" to-newsgroup)) - (unless (nnimap-request-accept-article mbx (nth 1 gnus-command-method)) - (setq success nil)))))) - -;; Optional backend functions - -(deffoo nnimap-retrieve-groups (groups &optional server) - (when (nnimap-possibly-change-server server) - (gnus-message 5 "nnimap: Checking mailboxes...") - (with-current-buffer nntp-server-buffer - (erase-buffer) - (nnimap-before-find-minmax-bugworkaround) - (dolist (group groups) - (gnus-message 7 "nnimap: Checking mailbox %s" group) - (or (member "\\NoSelect" - (imap-mailbox-get 'list-flags group nnimap-server-buffer)) - (let ((info (nnimap-find-minmax-uid group 'examine))) - (when (> (or (imap-mailbox-get 'recent group - nnimap-server-buffer) 0) - 0) - (push (list (cons group 0)) nnmail-split-history)) - (insert (format "\"%s\" %d %d y\n" group - (or (nth 2 info) 0) - (max 1 (or (nth 1 info) 1)))))))) - (gnus-message 5 "nnimap: Checking mailboxes...done") - 'active)) - -(deffoo nnimap-request-update-info-internal (group info &optional server) - (when (nnimap-possibly-change-group group server) - (when info;; xxx what does this mean? should we create a info? - (with-current-buffer nnimap-server-buffer - (gnus-message 5 "nnimap: Updating info for %s..." - (gnus-info-group info)) - - (when (nnimap-mark-permanent-p 'read) - (let (seen unseen) - ;; read info could contain articles marked unread by other - ;; imap clients! we correct this - (setq seen (gnus-uncompress-range (gnus-info-read info)) - unseen (imap-search "UNSEEN UNDELETED") - seen (gnus-set-difference seen unseen) - ;; seen might lack articles marked as read by other - ;; imap clients! we correct this - seen (append seen (imap-search "SEEN")) - ;; remove dupes - seen (sort seen '<) - seen (gnus-compress-sequence seen t) - ;; we can't return '(1) since this isn't a "list of ranges", - ;; and we can't return '((1)) since g-list-of-unread-articles - ;; is buggy so we return '((1 . 1)). - seen (if (and (integerp (car seen)) - (null (cdr seen))) - (list (cons (car seen) (car seen))) - seen)) - (gnus-info-set-read info seen))) - - (mapcar (lambda (pred) - (when (or (eq (cdr pred) 'recent) - (and (nnimap-mark-permanent-p (cdr pred)) - (member (nnimap-mark-to-flag (cdr pred)) - (imap-mailbox-get 'flags)))) - (gnus-info-set-marks - info - (gnus-update-alist-soft - (cdr pred) - (gnus-compress-sequence - (imap-search (nnimap-mark-to-predicate (cdr pred)))) - (gnus-info-marks info)) - t))) - gnus-article-mark-lists) - - (when nnimap-importantize-dormant - ;; nnimap mark dormant article as ticked too (for other clients) - ;; so we remove that mark for gnus since we support dormant - (gnus-info-set-marks - info - (gnus-update-alist-soft - 'tick - (gnus-remove-from-range - (cdr-safe (assoc 'tick (gnus-info-marks info))) - (cdr-safe (assoc 'dormant (gnus-info-marks info)))) - (gnus-info-marks info)) - t)) - - (gnus-message 5 "nnimap: Updating info for %s...done" - (gnus-info-group info)) - - info)))) - -(deffoo nnimap-request-type (group &optional article) - (if (and nnimap-news-groups (string-match nnimap-news-groups group)) - 'news - 'mail)) - -(deffoo nnimap-request-set-mark (group actions &optional server) - (when (nnimap-possibly-change-group group server) - (with-current-buffer nnimap-server-buffer - (let (action) - (gnus-message 7 "nnimap: Setting marks in %s..." group) - (while (setq action (pop actions)) - (let ((range (nth 0 action)) - (what (nth 1 action)) - (cmdmarks (nth 2 action)) - marks) - ;; cache flags are pointless on the server - (setq cmdmarks (delq 'cache cmdmarks)) - ;; seen flags are local to each gnus - (setq cmdmarks (delq 'seen cmdmarks)) - ;; recent marks can't be set - (setq cmdmarks (delq 'recent cmdmarks)) - (when nnimap-importantize-dormant - ;; flag dormant articles as ticked - (if (memq 'dormant cmdmarks) - (setq cmdmarks (cons 'tick cmdmarks)))) - ;; remove stuff we are forbidden to store - (mapcar (lambda (mark) - (if (imap-message-flag-permanent-p - (nnimap-mark-to-flag mark)) - (setq marks (cons mark marks)))) - cmdmarks) - (when (and range marks) - (cond ((eq what 'del) - (imap-message-flags-del - (imap-range-to-message-set range) - (nnimap-mark-to-flag marks nil t))) - ((eq what 'add) - (imap-message-flags-add - (imap-range-to-message-set range) - (nnimap-mark-to-flag marks nil t))) - ((eq what 'set) - (imap-message-flags-set - (imap-range-to-message-set range) - (nnimap-mark-to-flag marks nil t))))))) - (gnus-message 7 "nnimap: Setting marks in %s...done" group)))) - nil) - -(defun nnimap-split-fancy () - "Like nnmail-split-fancy, but uses nnimap-split-fancy." - (let ((nnmail-split-fancy nnimap-split-fancy)) - (nnmail-split-fancy))) - -(defun nnimap-split-to-groups (rules) - ;; tries to match all rules in nnimap-split-rule against content of - ;; nntp-server-buffer, returns a list of groups that matched. - (with-current-buffer nntp-server-buffer - ;; Fold continuation lines. - (goto-char (point-min)) - (while (re-search-forward "\\(\r?\n[ \t]+\\)+" nil t) - (replace-match " " t t)) - (if (functionp rules) - (funcall rules) - (let (to-groups regrepp) - (catch 'split-done - (dolist (rule rules to-groups) - (let ((group (car rule)) - (regexp (cadr rule))) - (goto-char (point-min)) - (when (and (if (stringp regexp) - (progn - (setq regrepp (string-match "\\\\[0-9&]" group)) - (re-search-forward regexp nil t)) - (funcall regexp group)) - ;; Don't enter the article into the same group twice. - (not (assoc group to-groups))) - (push (if regrepp - (nnmail-expand-newtext group) - group) - to-groups) - (or nnimap-split-crosspost - (throw 'split-done to-groups)))))))))) - -(defun nnimap-assoc-match (key alist) - (let (element) - (while (and alist (not element)) - (if (string-match (car (car alist)) key) - (setq element (car alist))) - (setq alist (cdr alist))) - element)) - -(defun nnimap-split-find-rule (server inbox) - (if (and (listp nnimap-split-rule) (listp (car nnimap-split-rule)) - (list (cdar nnimap-split-rule)) (listp (cadar nnimap-split-rule))) - ;; extended format - (cadr (nnimap-assoc-match inbox (cdr (nnimap-assoc-match - server nnimap-split-rule)))) - nnimap-split-rule)) - -(defun nnimap-split-find-inbox (server) - (if (listp nnimap-split-inbox) - nnimap-split-inbox - (list nnimap-split-inbox))) - -(defun nnimap-split-articles (&optional group server) - (when (nnimap-possibly-change-server server) - (with-current-buffer nnimap-server-buffer - (let (rule inbox removeorig (inboxes (nnimap-split-find-inbox server))) - ;; iterate over inboxes - (while (and (setq inbox (pop inboxes)) - (nnimap-possibly-change-group inbox));; SELECT - ;; find split rule for this server / inbox - (when (setq rule (nnimap-split-find-rule server inbox)) - ;; iterate over articles - (dolist (article (imap-search nnimap-split-predicate)) - (when (nnimap-request-head article) - ;; copy article to right group(s) - (setq removeorig nil) - (dolist (to-group (nnimap-split-to-groups rule)) - (cond ((eq to-group 'junk) - (message "IMAP split removed %s:%s:%d" server inbox - article) - (setq removeorig t)) - ((imap-message-copy (number-to-string article) - to-group nil 'nocopyuid) - (message "IMAP split moved %s:%s:%d to %s" server - inbox article to-group) - (setq removeorig t) - ;; Add the group-art list to the history list. - (push (list (cons to-group 0)) nnmail-split-history)) - (t - (message "IMAP split failed to move %s:%s:%d to %s" - server inbox article to-group)))) - ;; remove article if it was successfully copied somewhere - (and removeorig - (imap-message-flags-add (format "%d" article) - "\\Seen \\Deleted"))))) - (when (imap-mailbox-select inbox);; just in case - ;; todo: UID EXPUNGE (if available) to remove splitted articles - (imap-mailbox-expunge) - (imap-mailbox-close))) - t)))) - -(deffoo nnimap-request-scan (&optional group server) - (nnimap-split-articles group server)) - -(deffoo nnimap-request-newgroups (date &optional server) - (when (nnimap-possibly-change-server server) - (with-current-buffer nntp-server-buffer - (gnus-message 5 "nnimap: Listing subscribed mailboxes%s%s..." - (if (> (length server) 0) " on " "") server) - (erase-buffer) - (nnimap-before-find-minmax-bugworkaround) - (dolist (pattern (nnimap-pattern-to-list-arguments - nnimap-list-pattern)) - (dolist (mbx (imap-mailbox-lsub "*" (car pattern) nil - nnimap-server-buffer)) - (or (catch 'found - (dolist (mailbox (imap-mailbox-get 'list-flags mbx - nnimap-server-buffer)) - (if (string= (downcase mailbox) "\\noselect") - (throw 'found t))) - nil) - (let ((info (nnimap-find-minmax-uid mbx 'examine))) - (when info - (insert (format "\"%s\" %d %d y\n" - mbx (or (nth 2 info) 0) - (max 1 (or (nth 1 info) 1))))))))) - (gnus-message 5 "nnimap: Listing subscribed mailboxes%s%s...done" - (if (> (length server) 0) " on " "") server)) - t)) - -(deffoo nnimap-request-create-group (group &optional server args) - (when (nnimap-possibly-change-server server) - (or (imap-mailbox-status group 'uidvalidity nnimap-server-buffer) - (imap-mailbox-create group nnimap-server-buffer)))) - -(defun nnimap-time-substract (time1 time2) - "Return TIME for TIME1 - TIME2." - (let* ((ms (- (car time1) (car time2))) - (ls (- (nth 1 time1) (nth 1 time2)))) - (if (< ls 0) - (list (- ms 1) (+ (expt 2 16) ls)) - (list ms ls)))) - -(defun nnimap-date-days-ago (daysago) - "Return date, in format \"3-Aug-1998\", for DAYSAGO days ago." - (let* ((time (nnimap-time-substract (current-time) (days-to-time daysago))) - (date (format-time-string - (format "%%d-%s-%%Y" - (capitalize (car (rassoc (nth 4 (decode-time time)) - parse-time-months)))) - time))) - (if (eq ?0 (string-to-char date)) - (substring date 1) - date))) - -(defun nnimap-request-expire-articles-progress () - (gnus-message 5 "nnimap: Marking article %d for deletion..." - imap-current-message)) - - -(defun nnimap-expiry-target (arts group server) - (unless (eq nnmail-expiry-target 'delete) - (with-current-buffer nntp-server-buffer - (dolist (art (gnus-uncompress-sequence arts)) - (nnimap-request-article art group server) - ;; hints for optimization in `nnimap-request-accept-article' - (let ((nnimap-current-move-article art) - (nnimap-current-move-group group) - (nnimap-current-move-server server)) - (nnmail-expiry-target-group nnmail-expiry-target group)))))) - -;; Notice that we don't actually delete anything, we just mark them deleted. -(deffoo nnimap-request-expire-articles (articles group &optional server force) - (let ((artseq (gnus-compress-sequence articles))) - (when (and artseq (nnimap-possibly-change-group group server)) - (with-current-buffer nnimap-server-buffer - (if force - (progn - (nnimap-expiry-target artseq group server) - (when (imap-message-flags-add (imap-range-to-message-set artseq) - "\\Deleted") - (setq articles nil))) - (let ((days (or (and nnmail-expiry-wait-function - (funcall nnmail-expiry-wait-function group)) - nnmail-expiry-wait))) - (cond ((eq days 'immediate) - (nnimap-expiry-target artseq group server) - (when (imap-message-flags-add - (imap-range-to-message-set artseq) "\\Deleted") - (setq articles nil))) - ((numberp days) - (let ((oldarts (imap-search - (format nnimap-expunge-search-string - (imap-range-to-message-set artseq) - (nnimap-date-days-ago days)))) - (imap-fetch-data-hook - '(nnimap-request-expire-articles-progress))) - (nnimap-expiry-target oldarts group server) - (and oldarts - (imap-message-flags-add - (imap-range-to-message-set - (gnus-compress-sequence oldarts)) - "\\Deleted") - (setq articles (gnus-set-difference - articles oldarts))))))))))) - ;; return articles not deleted - articles) - -(deffoo nnimap-request-move-article (article group server - accept-form &optional last) - (when (nnimap-possibly-change-server server) - (save-excursion - (let ((buf (get-buffer-create " *nnimap move*")) - (nnimap-current-move-article article) - (nnimap-current-move-group group) - (nnimap-current-move-server nnimap-current-server) - result) - (and (nnimap-request-article article group server) - (save-excursion - (set-buffer buf) - (buffer-disable-undo (current-buffer)) - (insert-buffer-substring nntp-server-buffer) - (setq result (eval accept-form)) - (kill-buffer buf) - result) - (nnimap-request-expire-articles (list article) group server t)) - result)))) - -(deffoo nnimap-request-accept-article (group &optional server last) - (when (nnimap-possibly-change-server server) - (let (uid) - (if (setq uid - (if (string= nnimap-current-server nnimap-current-move-server) - ;; moving article within same server, speed it up... - (and (nnimap-possibly-change-group - nnimap-current-move-group) - (imap-message-copy (number-to-string - nnimap-current-move-article) - group 'dontcreate nil - nnimap-server-buffer)) - (with-current-buffer (current-buffer) - (goto-char (point-min)) - ;; remove any 'From blabla' lines, some IMAP servers - ;; reject the entire message otherwise. - (when (looking-at "^From[^:]") - (kill-region (point) (progn (forward-line) (point)))) - ;; turn into rfc822 format (\r\n eol's) - (while (search-forward "\n" nil t) - (replace-match "\r\n"))) - ;; this 'or' is for Cyrus server bug - (or (null (imap-current-mailbox nnimap-server-buffer)) - (imap-mailbox-unselect nnimap-server-buffer)) - (imap-message-append group (current-buffer) nil nil - nnimap-server-buffer))) - (cons group (nth 1 uid)) - (nnheader-report 'nnimap (imap-error-text nnimap-server-buffer)))))) - -(deffoo nnimap-request-delete-group (group force &optional server) - (when (nnimap-possibly-change-server server) - (with-current-buffer nnimap-server-buffer - (if force - (or (null (imap-mailbox-status group 'uidvalidity)) - (imap-mailbox-delete group)) - ;; UNSUBSCRIBE? - t)))) - -(deffoo nnimap-request-rename-group (group new-name &optional server) - (when (nnimap-possibly-change-server server) - (imap-mailbox-rename group new-name nnimap-server-buffer))) - -(defun nnimap-expunge (mailbox server) - (when (nnimap-possibly-change-group mailbox server) - (imap-mailbox-expunge nnimap-server-buffer))) - -(defun nnimap-acl-get (mailbox server) - (when (nnimap-possibly-change-server server) - (and (imap-capability 'ACL nnimap-server-buffer) - (imap-mailbox-acl-get mailbox nnimap-server-buffer)))) - -(defun nnimap-acl-edit (mailbox method old-acls new-acls) - (when (nnimap-possibly-change-server (cadr method)) - (unless (imap-capability 'ACL nnimap-server-buffer) - (error "Your server does not support ACL editing")) - (with-current-buffer nnimap-server-buffer - ;; delete all removed identifiers - (mapcar (lambda (old-acl) - (unless (assoc (car old-acl) new-acls) - (or (imap-mailbox-acl-delete (car old-acl) mailbox) - (error "Can't delete ACL for %s" (car old-acl))))) - old-acls) - ;; set all changed acl's - (mapcar (lambda (new-acl) - (let ((new-rights (cdr new-acl)) - (old-rights (cdr (assoc (car new-acl) old-acls)))) - (unless (and old-rights new-rights - (string= old-rights new-rights)) - (or (imap-mailbox-acl-set (car new-acl) new-rights mailbox) - (error "Can't set ACL for %s to %s" (car new-acl) - new-rights))))) - new-acls) - t))) - - -;;; Internal functions - -;; -;; This is confusing. -;; -;; mark => read, tick, draft, reply etc -;; flag => "\\Seen", "\\Flagged", "\\Draft", "gnus-expire" etc -;; predicate => "SEEN", "FLAGGED", "DRAFT", "KEYWORD gnus-expire" etc -;; -;; Mark should not really contain 'read since it's not a "mark" in the Gnus -;; world, but we cheat. Mark == gnus-article-mark-lists + '(read . read). -;; - -(defconst nnimap-mark-to-predicate-alist - (mapcar - (lambda (pair) ; cdr is the mark - (or (assoc (cdr pair) - '((read . "SEEN") - (tick . "FLAGGED") - (draft . "DRAFT") - (recent . "RECENT") - (reply . "ANSWERED"))) - (cons (cdr pair) - (format "KEYWORD gnus-%s" (symbol-name (cdr pair)))))) - (cons '(read . read) gnus-article-mark-lists))) - -(defun nnimap-mark-to-predicate (pred) - "Convert a Gnus mark (a symbol such as read, tick, expire) to a IMAP predicate. -This is a string such as \"SEEN\", \"FLAGGED\", \"KEYWORD gnus-expire\", -to be used within a IMAP SEARCH query." - (cdr (assq pred nnimap-mark-to-predicate-alist))) - -(defconst nnimap-mark-to-flag-alist - (mapcar - (lambda (pair) - (or (assoc (cdr pair) - '((read . "\\Seen") - (tick . "\\Flagged") - (draft . "\\Draft") - (recent . "\\Recent") - (reply . "\\Answered"))) - (cons (cdr pair) - (format "gnus-%s" (symbol-name (cdr pair)))))) - (cons '(read . read) gnus-article-mark-lists))) - -(defun nnimap-mark-to-flag-1 (preds) - (if (and (not (null preds)) (listp preds)) - (cons (nnimap-mark-to-flag (car preds)) - (nnimap-mark-to-flag (cdr preds))) - (cdr (assoc preds nnimap-mark-to-flag-alist)))) - -(defun nnimap-mark-to-flag (preds &optional always-list make-string) - "Convert a Gnus mark (a symbol such as read, tick, expire) to a IMAP flag. -This is a string such as \"\\Seen\", \"\\Flagged\", \"gnus-expire\", to -be used in a STORE FLAGS command." - (let ((result (nnimap-mark-to-flag-1 preds))) - (setq result (if (and (or make-string always-list) - (not (listp result))) - (list result) - result)) - (if make-string - (mapconcat (lambda (flag) - (if (listp flag) - (mapconcat 'identity flag " ") - flag)) - result " ") - result))) - -(defun nnimap-mark-permanent-p (mark &optional group) - "Return t iff MARK can be permanently (between IMAP sessions) saved on articles, in GROUP." - (imap-message-flag-permanent-p (nnimap-mark-to-flag mark))) - -(when nnimap-debug - (require 'trace) - (buffer-disable-undo (get-buffer-create nnimap-debug)) - (mapcar (lambda (f) (trace-function-background f nnimap-debug)) - '( - nnimap-possibly-change-server - nnimap-verify-uidvalidity - nnimap-find-minmax-uid - nnimap-before-find-minmax-bugworkaround - nnimap-possibly-change-group - ;;nnimap-replace-whitespace - nnimap-retrieve-headers-progress - nnimap-retrieve-which-headers - nnimap-group-overview-filename - nnimap-retrieve-headers-from-file - nnimap-retrieve-headers-from-server - nnimap-retrieve-headers - nnimap-open-connection - nnimap-open-server - nnimap-server-opened - nnimap-close-server - nnimap-request-close - nnimap-status-message - ;;nnimap-demule - nnimap-request-article-part - nnimap-request-article - nnimap-request-head - nnimap-request-body - nnimap-request-group - nnimap-close-group - nnimap-pattern-to-list-arguments - nnimap-request-list - nnimap-request-post - nnimap-retrieve-groups - nnimap-request-update-info-internal - nnimap-request-type - nnimap-request-set-mark - nnimap-split-to-groups - nnimap-split-find-rule - nnimap-split-find-inbox - nnimap-split-articles - nnimap-request-scan - nnimap-request-newgroups - nnimap-request-create-group - nnimap-time-substract - nnimap-date-days-ago - nnimap-request-expire-articles-progress - nnimap-request-expire-articles - nnimap-request-move-article - nnimap-request-accept-article - nnimap-request-delete-group - nnimap-request-rename-group - gnus-group-nnimap-expunge - gnus-group-nnimap-edit-acl - gnus-group-nnimap-edit-acl-done - nnimap-group-mode-hook - nnimap-mark-to-predicate - nnimap-mark-to-flag-1 - nnimap-mark-to-flag - nnimap-mark-permanent-p - ))) - -(provide 'nnimap) - -;;; nnimap.el ends here diff --git a/lisp/nnkiboze.el b/lisp/nnkiboze.el deleted file mode 100644 index b705d2e..0000000 --- a/lisp/nnkiboze.el +++ /dev/null @@ -1,393 +0,0 @@ -;;; nnkiboze.el --- select virtual news access for Gnus - -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; The other access methods (nntp, nnspool, etc) are general news -;; access methods. This module relies on Gnus and can't be used -;; separately. - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'gnus-clfns)) - -(require 'nntp) -(require 'nnheader) -(require 'gnus) -(require 'gnus-score) -(require 'nnoo) - -(nnoo-declare nnkiboze) -(defvoo nnkiboze-directory (nnheader-concat gnus-directory "kiboze/") - "nnkiboze will put its files in this directory.") - -(defvoo nnkiboze-level 9 - "The maximum level to be searched for articles.") - -(defvoo nnkiboze-remove-read-articles t - "If non-nil, nnkiboze will remove read articles from the kiboze group.") - -(defvoo nnkiboze-ephemeral nil - "If non-nil, don't store any data anywhere.") - -(defvoo nnkiboze-scores nil - "Score rules for generating the nnkiboze group.") - -(defvoo nnkiboze-regexp nil - "Regexp for matching component groups.") - -(defvoo nnkiboze-file-coding-system nnheader-text-coding-system - "Coding system for nnkiboze files.") - - - -(defconst nnkiboze-version "nnkiboze 1.0") - -(defvoo nnkiboze-current-group nil) -(defvoo nnkiboze-status-string "") - -(defvoo nnkiboze-headers nil) - - - -;;; Interface functions. - -(nnoo-define-basics nnkiboze) - -(deffoo nnkiboze-retrieve-headers (articles &optional group server fetch-old) - (nnkiboze-possibly-change-group group) - (unless gnus-nov-is-evil - (if (stringp (car articles)) - 'headers - (let ((nov (nnkiboze-nov-file-name))) - (when (file-exists-p nov) - (save-excursion - (set-buffer nntp-server-buffer) - (erase-buffer) - (let ((nnheader-file-coding-system nnkiboze-file-coding-system)) - (nnheader-insert-file-contents nov)) - (nnheader-nov-delete-outside-range - (car articles) (car (last articles))) - 'nov)))))) - -(deffoo nnkiboze-request-article (article &optional newsgroup server buffer) - (nnkiboze-possibly-change-group newsgroup) - (if (not (numberp article)) - ;; This is a real kludge. It might not work at times, but it - ;; does no harm I think. The only alternative is to offer no - ;; article fetching by message-id at all. - (nntp-request-article article newsgroup gnus-nntp-server buffer) - (let* ((header (gnus-summary-article-header article)) - (xref (mail-header-xref header)) - num group) - (unless xref - (error "nnkiboze: No xref")) - (unless (string-match " \\([^ ]+\\):\\([0-9]+\\)" xref) - (error "nnkiboze: Malformed xref")) - (setq num (string-to-int (match-string 2 xref)) - group (match-string 1 xref)) - (or (with-current-buffer buffer - (gnus-cache-request-article num group)) - (gnus-request-article num group buffer))))) - -(deffoo nnkiboze-request-scan (&optional group server) - (nnkiboze-generate-group (concat "nnkiboze:" group))) - -(deffoo nnkiboze-request-group (group &optional server dont-check) - "Make GROUP the current newsgroup." - (nnkiboze-possibly-change-group group) - (if dont-check - t - (let ((nov-file (nnkiboze-nov-file-name)) - beg end total) - (save-excursion - (set-buffer nntp-server-buffer) - (erase-buffer) - (unless (file-exists-p nov-file) - (nnkiboze-request-scan group)) - (if (not (file-exists-p nov-file)) - (nnheader-report 'nnkiboze "Can't select group %s" group) - (let ((nnheader-file-coding-system nnkiboze-file-coding-system)) - (nnheader-insert-file-contents nov-file)) - (if (zerop (buffer-size)) - (nnheader-insert "211 0 0 0 %s\n" group) - (goto-char (point-min)) - (when (looking-at "[0-9]+") - (setq beg (read (current-buffer)))) - (goto-char (point-max)) - (when (re-search-backward "^[0-9]" nil t) - (setq end (read (current-buffer)))) - (setq total (count-lines (point-min) (point-max))) - (nnheader-insert "211 %d %d %d %s\n" total beg end group))))))) - -(deffoo nnkiboze-close-group (group &optional server) - (nnkiboze-possibly-change-group group) - ;; Remove NOV lines of articles that are marked as read. - (when (and (file-exists-p (nnkiboze-nov-file-name)) - nnkiboze-remove-read-articles) - (let ((coding-system-for-write nnkiboze-file-coding-system) - (output-coding-system nnkiboze-file-coding-system)) - (with-temp-file (nnkiboze-nov-file-name) - (let ((cur (current-buffer)) - (nnheader-file-coding-system nnkiboze-file-coding-system)) - (nnheader-insert-file-contents (nnkiboze-nov-file-name)) - (goto-char (point-min)) - (while (not (eobp)) - (if (not (gnus-article-read-p (read cur))) - (forward-line 1) - (gnus-delete-line)))))) - (setq nnkiboze-current-group nil))) - -(deffoo nnkiboze-open-server (server &optional defs) - (unless (assq 'nnkiboze-regexp defs) - (push `(nnkiboze-regexp ,server) - defs)) - (nnoo-change-server 'nnkiboze server defs)) - -(deffoo nnkiboze-request-delete-group (group &optional force server) - (nnkiboze-possibly-change-group group) - (when force - (let ((files (nconc - (nnkiboze-score-file group) - (list (nnkiboze-nov-file-name) - (nnkiboze-nov-file-name ".newsrc"))))) - (while files - (and (file-exists-p (car files)) - (file-writable-p (car files)) - (delete-file (car files))) - (setq files (cdr files))))) - (setq nnkiboze-current-group nil) - t) - -(nnoo-define-skeleton nnkiboze) - - -;;; Internal functions. - -(defun nnkiboze-possibly-change-group (group) - (setq nnkiboze-current-group group)) - -(defun nnkiboze-prefixed-name (group) - (gnus-group-prefixed-name group '(nnkiboze ""))) - -;;;###autoload -(defun nnkiboze-generate-groups () - "\"Usage: emacs -batch -l nnkiboze -f nnkiboze-generate-groups\". -Finds out what articles are to be part of the nnkiboze groups." - (interactive) - (let ((nnmail-spool-file nil) - (mail-sources nil) - (gnus-use-dribble-file nil) - (gnus-read-active-file t) - (gnus-expert-user t)) - (gnus)) - (let* ((gnus-newsrc-alist (gnus-copy-sequence gnus-newsrc-alist)) - (newsrc (cdr gnus-newsrc-alist)) - gnus-newsrc-hashtb info) - (gnus-make-hashtable-from-newsrc-alist) - ;; We have copied all the newsrc alist info over to local copies - ;; so that we can mess all we want with these lists. - (while (setq info (pop newsrc)) - (when (string-match "nnkiboze" (gnus-info-group info)) - ;; For each kiboze group, we call this function to generate - ;; it. - (nnkiboze-generate-group (gnus-info-group info) t)))) - (save-excursion - (set-buffer gnus-group-buffer) - (gnus-group-list-groups))) - -(defun nnkiboze-score-file (group) - (list (expand-file-name - (concat (file-name-as-directory gnus-kill-files-directory) - (nnheader-translate-file-chars - (concat (nnkiboze-prefixed-name nnkiboze-current-group) - "." gnus-score-file-suffix)))))) - -(defun nnkiboze-generate-group (group &optional inhibit-list-groups) - (let* ((info (nth 2 (gnus-gethash group gnus-newsrc-hashtb))) - (newsrc-file (concat nnkiboze-directory - (nnheader-translate-file-chars - (concat group ".newsrc")))) - (nov-file (concat nnkiboze-directory - (nnheader-translate-file-chars - (concat group ".nov")))) - method nnkiboze-newsrc gname newsrc active - ginfo lowest glevel orig-info nov-buffer - ;; Bind various things to nil to make group entry faster. - (gnus-expert-user t) - (gnus-large-newsgroup nil) - (gnus-score-find-score-files-function 'nnkiboze-score-file) - ;; Use only nnkiboze-score-file! - (gnus-score-use-all-scores nil) - (gnus-use-scoring t) - (gnus-verbose (min gnus-verbose 3)) - gnus-select-group-hook gnus-summary-prepare-hook - gnus-thread-sort-functions gnus-show-threads - gnus-visual gnus-suppress-duplicates num-unread) - (unless info - (error "No such group: %s" group)) - ;; Load the kiboze newsrc file for this group. - (when (file-exists-p newsrc-file) - (load newsrc-file)) - (let ((coding-system-for-write nnkiboze-file-coding-system) - (output-coding-system nnkiboze-file-coding-system)) - (with-temp-file nov-file - (when (file-exists-p nov-file) - (nnheader-insert-file-contents nov-file)) - (setq nov-buffer (current-buffer)) - ;; Go through the active hashtb and add new all groups that match the - ;; kiboze regexp. - (mapatoms - (lambda (group) - (and (string-match nnkiboze-regexp - (setq gname (symbol-name group))) ; Match - (not (assoc gname nnkiboze-newsrc)) ; It isn't registered - (numberp (car (symbol-value group))) ; It is active - (or (> nnkiboze-level 7) - (and (setq glevel (nth 1 (nth 2 (gnus-gethash - gname gnus-newsrc-hashtb)))) - (>= nnkiboze-level glevel))) - (not (string-match "^nnkiboze:" gname)) ; Exclude kibozes - (push (cons gname (1- (car (symbol-value group)))) - nnkiboze-newsrc))) - gnus-active-hashtb) - ;; `newsrc' is set to the list of groups that possibly are - ;; component groups to this kiboze group. This list has elements - ;; on the form `(GROUP . NUMBER)', where NUMBER is the highest - ;; number that has been kibozed in GROUP in this kiboze group. - (setq newsrc nnkiboze-newsrc) - (while newsrc - (if (not (setq active (gnus-gethash - (caar newsrc) gnus-active-hashtb))) - ;; This group isn't active after all, so we remove it from - ;; the list of component groups. - (setq nnkiboze-newsrc (delq (car newsrc) nnkiboze-newsrc)) - (setq lowest (cdar newsrc)) - ;; Ok, we have a valid component group, so we jump to it. - (switch-to-buffer gnus-group-buffer) - (gnus-group-jump-to-group (caar newsrc)) - (gnus-message 3 "nnkiboze: Checking %s..." (caar newsrc)) - (setq ginfo (gnus-get-info (gnus-group-group-name)) - orig-info (gnus-copy-sequence ginfo) - num-unread (car (gnus-gethash (caar newsrc) - gnus-newsrc-hashtb))) - (unwind-protect - (progn - ;; We set all list of article marks to nil. Since we operate - ;; on copies of the real lists, we can destroy anything we - ;; want here. - (when (nth 3 ginfo) - (setcar (nthcdr 3 ginfo) nil)) - ;; We set the list of read articles to be what we expect for - ;; this kiboze group -- either nil or `(1 . LOWEST)'. - (when ginfo - (setcar (nthcdr 2 ginfo) - (and (not (= lowest 1)) (cons 1 lowest)))) - (when (and (or (not ginfo) - (> (length (gnus-list-of-unread-articles - (car ginfo))) - 0)) - (progn - (ignore-errors - (gnus-group-select-group nil)) - (eq major-mode 'gnus-summary-mode))) - ;; We are now in the group where we want to be. - (setq method (gnus-find-method-for-group - gnus-newsgroup-name)) - (when (eq method gnus-select-method) - (setq method nil)) - ;; We go through the list of scored articles. - (while gnus-newsgroup-scored - (when (> (caar gnus-newsgroup-scored) lowest) - ;; If it has a good score, then we enter this article - ;; into the kiboze group. - (nnkiboze-enter-nov - nov-buffer - (gnus-summary-article-header - (caar gnus-newsgroup-scored)) - gnus-newsgroup-name)) - (setq gnus-newsgroup-scored (cdr gnus-newsgroup-scored))) - ;; That's it. We exit this group. - (when (eq major-mode 'gnus-summary-mode) - (kill-buffer (current-buffer))))) - ;; Restore the proper info. - (when ginfo - (setcdr ginfo (cdr orig-info))) - (setcar (gnus-gethash (caar newsrc) gnus-newsrc-hashtb) - num-unread))) - (setcdr (car newsrc) (car active)) - (gnus-message 3 "nnkiboze: Checking %s...done" (caar newsrc)) - (setq newsrc (cdr newsrc))))) - ;; We save the kiboze newsrc for this group. - (with-temp-file newsrc-file - (insert "(setq nnkiboze-newsrc '") - (gnus-prin1 nnkiboze-newsrc) - (insert ")\n"))) - (unless inhibit-list-groups - (save-excursion - (set-buffer gnus-group-buffer) - (gnus-group-list-groups))) - t) - -(defun nnkiboze-enter-nov (buffer header group) - (save-excursion - (set-buffer buffer) - (goto-char (point-max)) - (let ((prefix (gnus-group-real-prefix group)) - (oheader (copy-sequence header)) - article) - (if (zerop (forward-line -1)) - (progn - (setq article (1+ (read (current-buffer)))) - (forward-line 1)) - (setq article 1)) - (mail-header-set-number oheader article) - (with-temp-buffer - (insert (or (mail-header-xref oheader) "")) - (goto-char (point-min)) - (if (re-search-forward " [^ ]+:[0-9]+" nil t) - (goto-char (match-beginning 0)) - (or (eobp) (forward-char 1))) - ;; The first Xref has to be the group this article - ;; really came for - this is the article nnkiboze - ;; will request when it is asked for the article. - (insert " " group ":" - (int-to-string (mail-header-number header)) " ") - (while (re-search-forward " [^ ]+:[0-9]+" nil t) - (goto-char (1+ (match-beginning 0))) - (insert prefix)) - (mail-header-set-xref oheader (buffer-string))) - (nnheader-insert-nov oheader)))) - -(defun nnkiboze-nov-file-name (&optional suffix) - (concat (file-name-as-directory nnkiboze-directory) - (nnheader-translate-file-chars - (concat (nnkiboze-prefixed-name nnkiboze-current-group) - (or suffix ".nov"))))) - -(provide 'nnkiboze) - -;;; nnkiboze.el ends here diff --git a/lisp/nnlistserv.el b/lisp/nnlistserv.el deleted file mode 100644 index bcbbf80..0000000 --- a/lisp/nnlistserv.el +++ /dev/null @@ -1,157 +0,0 @@ -;;; nnlistserv.el --- retrieving articles via web mailing list archives - -;; Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news, mail - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; Note: You need to have `url' and `w3' installed for this -;; backend to work. - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'nnoo) -(eval-when-compile - (ignore-errors - (require 'nnweb)) ; requires W3 - (autoload 'url-insert-file-contents "nnweb")) - -(nnoo-declare nnlistserv - nnweb) - -(defvoo nnlistserv-directory (nnheader-concat gnus-directory "nnlistserv/") - "Where nnlistserv will save its files." - nnweb-directory) - -(defvoo nnlistserv-name 'kk - "What search engine type is being used." - nnweb-type) - -(defvoo nnlistserv-type-definition - '((kk - (article . nnlistserv-kk-wash-article) - (map . nnlistserv-kk-create-mapping) - (search . nnlistserv-kk-search) - (address . "http://www.itk.ntnu.no/ansatte/Andresen_Trond/kk-f/%s/") - (pages "fra160396" "fra160796" "fra061196" "fra160197" - "fra090997" "fra040797" "fra130397" "nye") - (index . "date.html") - (identifier . nnlistserv-kk-identity))) - "Type-definition alist." - nnweb-type-definition) - -(defvoo nnlistserv-search nil - "Search string to feed to DejaNews." - nnweb-search) - -(defvoo nnlistserv-ephemeral-p nil - "Whether this nnlistserv server is ephemeral." - nnweb-ephemeral-p) - -;;; Internal variables - -;;; Interface functions - -(nnoo-define-basics nnlistserv) - -(nnoo-import nnlistserv - (nnweb)) - -;;; Internal functions - -;;; -;;; KK functions. -;;; - -(defun nnlistserv-kk-create-mapping () - "Perform the search and create an number-to-url alist." - (save-excursion - (set-buffer nnweb-buffer) - (let ((case-fold-search t) - (active (or (cadr (assoc nnweb-group nnweb-group-alist)) - (cons 1 0))) - (pages (nnweb-definition 'pages)) - map url page subject from ) - (while (setq page (pop pages)) - (erase-buffer) - (when (funcall (nnweb-definition 'search) page) - ;; Go through all the article hits on this page. - (goto-char (point-min)) - (nnweb-decode-entities) - (goto-char (point-min)) - (while (re-search-forward "^
  • *\\([^\\>]+\\) *<[^>]+>\\([^>]+\\)<" nil t) - (setq url (match-string 1) - subject (match-string 2) - from (match-string 3)) - (setq url (concat (format (nnweb-definition 'address) page) url)) - (unless (nnweb-get-hashtb url) - (push - (list - (incf (cdr active)) - (make-full-mail-header - (cdr active) subject from "" - (concat "<" (nnweb-identifier url) "@kk>") - nil 0 0 url)) - map) - (nnweb-set-hashtb (cadar map) (car map)) - (nnheader-message 5 "%s %s %s" (cdr active) (point) pages))))) - ;; Return the articles in the right order. - (setq nnweb-articles - (sort (nconc nnweb-articles map) 'car-less-than-car))))) - -(defun nnlistserv-kk-wash-article () - (let ((case-fold-search t) - (headers '(sent name email subject id)) - sent name email subject id) - (nnweb-decode-entities) - (while headers - (goto-char (point-min)) - (re-search-forward (format "" nil t) - (replace-match "")) - (setq from - (or (mail-fetch-field "from") - (nnwarchive-from-r13 - (mail-fetch-field "from-r13")))) - (setq date (mail-fetch-field "date")) - (setq id (mail-fetch-field "message-id")) - (setq subject (mail-fetch-field "subject")) - (goto-char (point-max)) - (widen)) - (when (search-forward "
      " nil t) - (forward-line) - (delete-region (point-min) (point)) - (search-forward "
    " nil t) - (end-of-line) - (narrow-to-region (point-min) (point)) - (nnweb-remove-markup) - (nnweb-decode-entities) - (goto-char (point-min)) - (delete-blank-lines) - (when from - (message-remove-header "from") - (goto-char (point-max)) - (insert "From: " from "\n")) - (when subject - (message-remove-header "subject") - (goto-char (point-max)) - (insert "Subject: " subject "\n")) - (when id - (goto-char (point-max)) - (insert "X-Message-ID: <" id ">\n")) - (when date - (message-remove-header "date") - (goto-char (point-max)) - (insert "Date: " date "\n")) - (goto-char (point-max)) - (widen) - (insert "\n")) - (setq p (point)) - (when (search-forward "X-Body-of-Message" nil t) - (forward-line) - (delete-region p (point)) - (search-forward "X-Body-of-Message-End" nil t) - (beginning-of-line) - (save-restriction - (narrow-to-region p (point)) - (goto-char (point-min)) - (if (> (skip-chars-forward "\040\n\r\t") 0) - (delete-region (point-min) (point))) - (while (not (eobp)) - (cond - ((looking-at "
    \r?\n?")
    -	      (delete-region (match-beginning 0) (match-end 0))
    -	      (setq p (point))
    -	      (when (search-forward "
    " nil t) - (delete-region (match-beginning 0) (match-end 0)) - (save-restriction - (narrow-to-region p (point)) - (nnweb-remove-markup) - (nnweb-decode-entities) - (goto-char (point-max))))) - ((looking-at "

    \n" - "<#/external>") - (setq mime t)) - (t - (setq p (point)) - (insert "<#part type=\"text/html\" disposition=inline>") - (goto-char - (if (re-search-forward - "[\040\n\r\t]*

    \\|[\040\n\r\t]*

    ") - (setq mime t))) - (setq p (point)) - (if (> (skip-chars-forward "\040\n\r\t") 0) - (delete-region p (point)))) - (goto-char (point-max)))) - (setq p (point)) - (when (search-forward "X-References-End" nil t) - (setq e (point)) - (beginning-of-line) - (search-backward "X-References" p t) - (while (re-search-forward "msg\\([0-9]+\\)\\.html" e t) - (push (concat "<" (match-string 1) "%" group ">") refs))) - (delete-region p (point-max)) - (goto-char (point-min)) - (insert (format "Message-ID: <%05d%%%s>\n" (1- article) group)) - (when refs - (insert "References:") - (while refs - (insert " " (pop refs))) - (insert "\n")) - (when mime - (unless (looking-at "$") - (search-forward "\n\n" nil t) - (forward-line -1)) - (narrow-to-region (point) (point-max)) - (insert "MIME-Version: 1.0\n" - (prog1 - (mml-generate-mime) - (delete-region (point-min) (point-max)))) - (widen))) - (buffer-string))) - -(provide 'nnwarchive) - -;;; nnwarchive.el ends here diff --git a/lisp/nnweb.el b/lisp/nnweb.el deleted file mode 100644 index 760ef75..0000000 --- a/lisp/nnweb.el +++ /dev/null @@ -1,985 +0,0 @@ -;;; nnweb.el --- retrieving articles via web search engines -;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; Note: You need to have `url' and `w3' installed for this -;; backend to work. - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'gnus-clfns)) - -(require 'nnoo) -(require 'message) -(require 'gnus-util) -(require 'gnus) -(require 'nnmail) -(eval-when-compile - (ignore-errors - (require 'w3) - (require 'url) - (require 'w3-forms))) - -;; Report failure to find w3 at load time if appropriate. -(unless noninteractive - (eval '(progn - (require 'w3) - (require 'url) - (require 'w3-forms)))) - -(nnoo-declare nnweb) - -(defvoo nnweb-directory (nnheader-concat gnus-directory "nnweb/") - "Where nnweb will save its files.") - -(defvoo nnweb-type 'dejanews - "What search engine type is being used. -Valid types include `dejanews', `dejanewsold', `reference', -and `altavista'.") - -(defvar nnweb-type-definition - '( - (dejanews ;; bought by google.com - ;;(article . nnweb-google-wash-article) - ;;(id . "http://groups.google.com/groups?as_umsgid=%s") - (article . ignore) - (id . "http://groups.google.com/groups?selm=%s&output=gplain") - ;;(reference . nnweb-google-reference) - (reference . identity) - (map . nnweb-google-create-mapping) - (search . nnweb-google-search) - (address . "http://groups.google.com/groups") - (identifier . nnweb-google-identity)) -;;; (dejanews -;;; (article . ignore) -;;; (id . "http://search.dejanews.com/msgid.xp?MID=%s&fmt=text") -;;; (map . nnweb-dejanews-create-mapping) -;;; (search . nnweb-dejanews-search) -;;; (address . "http://www.deja.com/=dnc/qs.xp") -;;; (identifier . nnweb-dejanews-identity)) -;;; (dejanewsold -;;; (article . ignore) -;;; (map . nnweb-dejanews-create-mapping) -;;; (search . nnweb-dejanewsold-search) -;;; (address . "http://www.deja.com/dnquery.xp") -;;; (identifier . nnweb-dejanews-identity)) - (reference - (article . nnweb-reference-wash-article) - (map . nnweb-reference-create-mapping) - (search . nnweb-reference-search) - (address . "http://www.reference.com/cgi-bin/pn/go") - (identifier . identity)) - (altavista - (article . nnweb-altavista-wash-article) - (map . nnweb-altavista-create-mapping) - (search . nnweb-altavista-search) - (address . "http://www.altavista.digital.com/cgi-bin/query") - (id . "/cgi-bin/news?id@%s") - (identifier . identity))) - "Type-definition alist.") - -(defvoo nnweb-search nil - "Search string to feed to DejaNews.") - -(defvoo nnweb-max-hits 999 - "Maximum number of hits to display.") - -(defvoo nnweb-ephemeral-p nil - "Whether this nnweb server is ephemeral.") - -;;; Internal variables - -(defvoo nnweb-articles nil) -(defvoo nnweb-buffer nil) -(defvoo nnweb-group-alist nil) -(defvoo nnweb-group nil) -(defvoo nnweb-hashtb nil) - -;;; Interface functions - -(nnoo-define-basics nnweb) - -(deffoo nnweb-retrieve-headers (articles &optional group server fetch-old) - (nnweb-possibly-change-server group server) - (save-excursion - (set-buffer nntp-server-buffer) - (erase-buffer) - (let (article header) - (mm-with-unibyte-current-buffer - (while (setq article (pop articles)) - (when (setq header (cadr (assq article nnweb-articles))) - (nnheader-insert-nov header)))) - 'nov))) - -(deffoo nnweb-request-scan (&optional group server) - (nnweb-possibly-change-server group server) - (funcall (nnweb-definition 'map)) - (unless nnweb-ephemeral-p - (nnweb-write-active) - (nnweb-write-overview group))) - -(deffoo nnweb-request-group (group &optional server dont-check) - (nnweb-possibly-change-server nil server) - (when (and group - (not (equal group nnweb-group)) - (not nnweb-ephemeral-p)) - (setq nnweb-group group - nnweb-articles nil) - (let ((info (assoc group nnweb-group-alist))) - (when info - (setq nnweb-type (nth 2 info)) - (setq nnweb-search (nth 3 info)) - (unless dont-check - (nnweb-read-overview group))))) - (cond - ((not nnweb-articles) - (nnheader-report 'nnweb "No matching articles")) - (t - (let ((active (if nnweb-ephemeral-p - (cons (caar nnweb-articles) - (caar (last nnweb-articles))) - (cadr (assoc group nnweb-group-alist))))) - (nnheader-report 'nnweb "Opened group %s" group) - (nnheader-insert - "211 %d %d %d %s\n" (length nnweb-articles) - (car active) (cdr active) group))))) - -(deffoo nnweb-close-group (group &optional server) - (nnweb-possibly-change-server group server) - (when (gnus-buffer-live-p nnweb-buffer) - (save-excursion - (set-buffer nnweb-buffer) - (set-buffer-modified-p nil) - (kill-buffer nnweb-buffer))) - t) - -(deffoo nnweb-request-article (article &optional group server buffer) - (nnweb-possibly-change-server group server) - (save-excursion - (set-buffer (or buffer nntp-server-buffer)) - (let* ((header (cadr (assq article nnweb-articles))) - (url (and header (mail-header-xref header)))) - (when (or (and url - (mm-with-unibyte-current-buffer - (nnweb-fetch-url url))) - (and (stringp article) - (nnweb-definition 'id t) - (let ((fetch (nnweb-definition 'id)) - art active) - (when (string-match "^<\\(.*\\)>$" article) - (setq art (match-string 1 article))) - (when (and fetch art) - (setq url (format fetch art)) - (mm-with-unibyte-current-buffer - (nnweb-fetch-url url)) - (if (nnweb-definition 'reference t) - (setq article - (funcall (nnweb-definition - 'reference) article))))))) - (unless nnheader-callback-function - (funcall (nnweb-definition 'article))) - (nnheader-report 'nnweb "Fetched article %s" article) - (cons group (and (numberp article) article)))))) - -(deffoo nnweb-close-server (&optional server) - (when (and (nnweb-server-opened server) - (gnus-buffer-live-p nnweb-buffer)) - (save-excursion - (set-buffer nnweb-buffer) - (set-buffer-modified-p nil) - (kill-buffer nnweb-buffer))) - (nnoo-close-server 'nnweb server)) - -(deffoo nnweb-request-list (&optional server) - (nnweb-possibly-change-server nil server) - (save-excursion - (set-buffer nntp-server-buffer) - (nnmail-generate-active nnweb-group-alist) - t)) - -(deffoo nnweb-request-update-info (group info &optional server) - (nnweb-possibly-change-server group server)) - -(deffoo nnweb-asynchronous-p () - t) - -(deffoo nnweb-request-create-group (group &optional server args) - (nnweb-possibly-change-server nil server) - (nnweb-request-delete-group group) - (push `(,group ,(cons 1 0) ,@args) nnweb-group-alist) - (nnweb-write-active) - t) - -(deffoo nnweb-request-delete-group (group &optional force server) - (nnweb-possibly-change-server group server) - (gnus-pull group nnweb-group-alist t) - (nnweb-write-active) - (gnus-delete-file (nnweb-overview-file group)) - t) - -(nnoo-define-skeleton nnweb) - -;;; Internal functions - -(defun nnweb-read-overview (group) - "Read the overview of GROUP and build the map." - (when (file-exists-p (nnweb-overview-file group)) - (mm-with-unibyte-buffer - (nnheader-insert-file-contents (nnweb-overview-file group)) - (goto-char (point-min)) - (let (header) - (while (not (eobp)) - (setq header (nnheader-parse-nov)) - (forward-line 1) - (push (list (mail-header-number header) - header (mail-header-xref header)) - nnweb-articles) - (nnweb-set-hashtb header (car nnweb-articles))))))) - -(defun nnweb-write-overview (group) - "Write the overview file for GROUP." - (with-temp-file (nnweb-overview-file group) - (let ((articles nnweb-articles)) - (while articles - (nnheader-insert-nov (cadr (pop articles))))))) - -(defun nnweb-set-hashtb (header data) - (gnus-sethash (nnweb-identifier (mail-header-xref header)) - data nnweb-hashtb)) - -(defun nnweb-get-hashtb (url) - (gnus-gethash (nnweb-identifier url) nnweb-hashtb)) - -(defun nnweb-identifier (ident) - (funcall (nnweb-definition 'identifier) ident)) - -(defun nnweb-overview-file (group) - "Return the name of the overview file of GROUP." - (nnheader-concat nnweb-directory group ".overview")) - -(defun nnweb-write-active () - "Save the active file." - (gnus-make-directory nnweb-directory) - (with-temp-file (nnheader-concat nnweb-directory "active") - (prin1 `(setq nnweb-group-alist ',nnweb-group-alist) (current-buffer)))) - -(defun nnweb-read-active () - "Read the active file." - (load (nnheader-concat nnweb-directory "active") t t t)) - -(defun nnweb-definition (type &optional noerror) - "Return the definition of TYPE." - (let ((def (cdr (assq type (assq nnweb-type nnweb-type-definition))))) - (when (and (not def) - (not noerror)) - (error "Undefined definition %s" type)) - def)) - -(defun nnweb-possibly-change-server (&optional group server) - (nnweb-init server) - (when server - (unless (nnweb-server-opened server) - (nnweb-open-server server))) - (unless nnweb-group-alist - (nnweb-read-active)) - (when group - (when (and (not nnweb-ephemeral-p) - (not (equal group nnweb-group))) - (setq nnweb-hashtb (gnus-make-hashtable 4095)) - (nnweb-request-group group nil t)))) - -(defun nnweb-init (server) - "Initialize buffers and such." - (unless (gnus-buffer-live-p nnweb-buffer) - (setq nnweb-buffer - (save-excursion - (mm-with-unibyte - (nnheader-set-temp-buffer - (format " *nnweb %s %s %s*" - nnweb-type nnweb-search server)) - (current-buffer)))))) - -(defun nnweb-fetch-url (url) - (let (buf) - (save-excursion - (if (not nnheader-callback-function) - (progn - (with-temp-buffer - (mm-enable-multibyte) - (let ((coding-system-for-read 'binary) - (coding-system-for-write 'binary) - (input-coding-system 'binary) - (output-coding-system 'binary) - (default-process-coding-system 'binary)) - (nnweb-insert url)) - (setq buf (buffer-string))) - (erase-buffer) - (insert buf) - t) - (nnweb-url-retrieve-asynch - url 'nnweb-callback (current-buffer) nnheader-callback-function) - t)))) - -(defun nnweb-callback (buffer callback) - (when (gnus-buffer-live-p url-working-buffer) - (save-excursion - (set-buffer url-working-buffer) - (funcall (nnweb-definition 'article)) - (nnweb-decode-entities) - (set-buffer buffer) - (goto-char (point-max)) - (insert-buffer-substring url-working-buffer)) - (funcall callback t) - (gnus-kill-buffer url-working-buffer))) - -(defun nnweb-url-retrieve-asynch (url callback &rest data) - (let ((url-request-method "GET") - (old-asynch url-be-asynchronous) - (url-request-data nil) - (url-request-extra-headers nil) - (url-working-buffer (generate-new-buffer-name " *nnweb*"))) - (setq-default url-be-asynchronous t) - (save-excursion - (set-buffer (get-buffer-create url-working-buffer)) - (setq url-current-callback-data data - url-be-asynchronous t - url-current-callback-func callback) - (url-retrieve url nil)) - (setq-default url-be-asynchronous old-asynch))) - -(if (fboundp 'url-retrieve-synchronously) - (defun nnweb-url-retrieve-asynch (url callback &rest data) - (url-retrieve url callback data))) - -;;; -;;; DejaNews functions. -;;; - -(defun nnweb-dejanews-create-mapping () - "Perform the search and create an number-to-url alist." - (save-excursion - (set-buffer nnweb-buffer) - (erase-buffer) - (when (funcall (nnweb-definition 'search) nnweb-search) - (let ((i 0) - (more t) - (case-fold-search t) - (active (or (cadr (assoc nnweb-group nnweb-group-alist)) - (cons 1 0))) - subject date from - map url parse a table group text) - (while more - ;; Go through all the article hits on this page. - (goto-char (point-min)) - (setq parse (w3-parse-buffer (current-buffer)) - table (nth 1 (nnweb-parse-find-all 'table parse))) - (dolist (row (nth 2 (car (nth 2 table)))) - (setq a (nnweb-parse-find 'a row) - url (cdr (assq 'href (nth 1 a))) - text (nreverse (nnweb-text row))) - (when a - (setq subject (nth 4 text) - group (nth 2 text) - date (nth 1 text) - from (nth 0 text)) - (if (string-match "\\([0-9]+\\)/\\([0-9]+\\)/\\([0-9]+\\)" date) - (setq date (format "%s %s 00:00:00 %s" - (car (rassq (string-to-number - (match-string 2 date)) - parse-time-months)) - (match-string 3 date) - (match-string 1 date))) - (setq date "Jan 1 00:00:00 0000")) - (incf i) - (setq url (concat url "&fmt=text")) - (when (string-match "&context=[^&]+" url) - (setq url (replace-match "" t t url))) - (unless (nnweb-get-hashtb url) - (push - (list - (incf (cdr active)) - (make-full-mail-header - (cdr active) (concat subject " (" group ")") from date - (concat "<" (nnweb-identifier url) "@dejanews>") - nil 0 0 url)) - map) - (nnweb-set-hashtb (cadar map) (car map))))) - ;; See whether there is a "Get next 20 hits" button here. - (goto-char (point-min)) - (if (or (not (re-search-forward - "HREF=\"\\([^\"]+\\)\"[<>b]+Next result" nil t)) - (>= i nnweb-max-hits)) - (setq more nil) - ;; Yup -- fetch it. - (setq more (match-string 1)) - (erase-buffer) - (url-insert-file-contents more))) - ;; Return the articles in the right order. - (setq nnweb-articles - (sort (nconc nnweb-articles map) 'car-less-than-car)))))) - -(defun nnweb-dejanews-search (search) - (nnweb-insert - (concat - (nnweb-definition 'address) - "?" - (nnweb-encode-www-form-urlencoded - `(("ST" . "PS") - ("svcclass" . "dnyr") - ("QRY" . ,search) - ("defaultOp" . "AND") - ("DBS" . "1") - ("OP" . "dnquery.xp") - ("LNG" . "ALL") - ("maxhits" . "100") - ("threaded" . "0") - ("format" . "verbose2") - ("showsort" . "date") - ("agesign" . "1") - ("ageweight" . "1"))))) - t) - -(defun nnweb-dejanewsold-search (search) - (nnweb-fetch-form - (nnweb-definition 'address) - `(("query" . ,search) - ("defaultOp" . "AND") - ("svcclass" . "dnold") - ("maxhits" . "100") - ("format" . "verbose2") - ("threaded" . "0") - ("showsort" . "date") - ("agesign" . "1") - ("ageweight" . "1"))) - t) - -(defun nnweb-dejanews-identity (url) - "Return an unique identifier based on URL." - (if (string-match "AN=\\([0-9]+\\)" url) - (match-string 1 url) - url)) - -;;; -;;; InReference -;;; - -(defun nnweb-reference-create-mapping () - "Perform the search and create an number-to-url alist." - (save-excursion - (set-buffer nnweb-buffer) - (erase-buffer) - (when (funcall (nnweb-definition 'search) nnweb-search) - (let ((i 0) - (more t) - (case-fold-search t) - (active (or (cadr (assoc nnweb-group nnweb-group-alist)) - (cons 1 0))) - Subject Score Date Newsgroups From Message-ID - map url) - (while more - ;; Go through all the article hits on this page. - (goto-char (point-min)) - (search-forward "


    " nil t) - (delete-region (point-min) (point)) - (goto-char (point-min)) - (while (re-search-forward "^ +[0-9]+\\." nil t) - (narrow-to-region - (point) - (if (re-search-forward "^$" nil t) - (match-beginning 0) - (point-max))) - (goto-char (point-min)) - (when (looking-at ".*href=\"\\([^\"]+\\)\"") - (setq url (match-string 1))) - (nnweb-remove-markup) - (goto-char (point-min)) - (while (search-forward "\t" nil t) - (replace-match " ")) - (goto-char (point-min)) - (while (re-search-forward "^\\([^:]+\\): \\(.*\\)$" nil t) - (set (intern (match-string 1)) (match-string 2))) - (widen) - (search-forward "" nil t) - (incf i) - (unless (nnweb-get-hashtb url) - (push - (list - (incf (cdr active)) - (make-full-mail-header - (cdr active) (concat "(" Newsgroups ") " Subject) From Date - Message-ID - nil 0 (string-to-int Score) url)) - map) - (nnweb-set-hashtb (cadar map) (car map)))) - (setq more nil)) - ;; Return the articles in the right order. - (setq nnweb-articles - (sort (nconc nnweb-articles map) 'car-less-than-car)))))) - -(defun nnweb-reference-wash-article () - (let ((case-fold-search t)) - (goto-char (point-min)) - (re-search-forward "^
    " nil t) - (delete-region (point-min) (point)) - (search-forward "
    " nil t)
    -    (forward-line -1)
    -    (let ((body (point-marker)))
    -      (search-forward "
    " nil t) - (delete-region (point) (point-max)) - (nnweb-remove-markup) - (goto-char (point-min)) - (while (looking-at " *$") - (gnus-delete-line)) - (narrow-to-region (point-min) body) - (while (and (re-search-forward "^$" nil t) - (not (eobp))) - (gnus-delete-line)) - (goto-char (point-min)) - (while (looking-at "\\(^[^ ]+:\\) *") - (replace-match "\\1 " t) - (forward-line 1)) - (goto-char (point-min)) - (when (re-search-forward "^References:" nil t) - (narrow-to-region - (point) (if (re-search-forward "^$\\|^[^:]+:" nil t) - (match-beginning 0) - (point-max))) - (goto-char (point-min)) - (while (not (eobp)) - (unless (looking-at "References") - (insert "\t") - (forward-line 1))) - (goto-char (point-min)) - (while (search-forward "," nil t) - (replace-match " " t t))) - (widen) - (nnweb-decode-entities) - (set-marker body nil)))) - -(defun nnweb-reference-search (search) - (url-insert-file-contents - (concat - (nnweb-definition 'address) - "?" - (nnweb-encode-www-form-urlencoded - `(("search" . "advanced") - ("querytext" . ,search) - ("subj" . "") - ("name" . "") - ("login" . "") - ("host" . "") - ("organization" . "") - ("groups" . "") - ("keywords" . "") - ("choice" . "Search") - ("startmonth" . "Jul") - ("startday" . "25") - ("startyear" . "1996") - ("endmonth" . "Aug") - ("endday" . "24") - ("endyear" . "1996") - ("mode" . "Quick") - ("verbosity" . "Verbose") - ("ranking" . "Relevance") - ("first" . "1") - ("last" . "25") - ("score" . "50"))))) - (setq buffer-file-name nil) - t) - -;;; -;;; Alta Vista -;;; - -(defun nnweb-altavista-create-mapping () - "Perform the search and create an number-to-url alist." - (save-excursion - (set-buffer nnweb-buffer) - (erase-buffer) - (let ((part 0)) - (when (funcall (nnweb-definition 'search) nnweb-search part) - (let ((i 0) - (more t) - (case-fold-search t) - (active (or (cadr (assoc nnweb-group nnweb-group-alist)) - (cons 1 0))) - subject date from id group - map url) - (while more - ;; Go through all the article hits on this page. - (goto-char (point-min)) - (search-forward "
    " nil t) - (delete-region (point-min) (match-beginning 0)) - (goto-char (point-min)) - (while (search-forward "
    " nil t) - (replace-match "\n")) - (nnweb-decode-entities) - (goto-char (point-min)) - (while (re-search-forward ".*href=\"\\([^\"]+\\)\">\\([^>]*\\)
    \\([^-]+\\)- \\([^<]+\\)<.*href=\"news:\\([^\"]+\\)\">.*\">\\(.+\\)

    " - nil t) - (setq url (match-string 1) - subject (match-string 2) - date (match-string 3) - group (match-string 4) - id (concat "<" (match-string 5) ">") - from (match-string 6)) - (incf i) - (unless (nnweb-get-hashtb url) - (push - (list - (incf (cdr active)) - (make-full-mail-header - (cdr active) (concat "(" group ") " subject) from date - id nil 0 0 url)) - map) - (nnweb-set-hashtb (cadar map) (car map)))) - ;; See if we want more. - (when (or (not nnweb-articles) - (>= i nnweb-max-hits) - (not (funcall (nnweb-definition 'search) - nnweb-search (incf part)))) - (setq more nil))) - ;; Return the articles in the right order. - (setq nnweb-articles - (sort (nconc nnweb-articles map) 'car-less-than-car))))))) - -(defun nnweb-altavista-wash-article () - (goto-char (point-min)) - (let ((case-fold-search t)) - (when (re-search-forward "^" nil t) - (delete-region (point-min) (match-beginning 0))) - (goto-char (point-min)) - (while (looking-at "\\([^ ]+\\) + +\\(.*\\)$") - (replace-match "\\1: \\2" t) - (forward-line 1)) - (when (re-search-backward "^References:" nil t) - (narrow-to-region (point) (progn (forward-line 1) (point))) - (goto-char (point-min)) - (while (re-search-forward "[0-9]+" nil t) - (replace-match "<\\1> " t))) - (widen) - (nnweb-remove-markup) - (nnweb-decode-entities))) - -(defun nnweb-altavista-search (search &optional part) - (url-insert-file-contents - (concat - (nnweb-definition 'address) - "?" - (nnweb-encode-www-form-urlencoded - `(("pg" . "aq") - ("what" . "news") - ,@(when part `(("stq" . ,(int-to-string (* part 30))))) - ("fmt" . "d") - ("q" . ,search) - ("r" . "") - ("d0" . "") - ("d1" . ""))))) - (setq buffer-file-name nil) - t) - -;;; -;;; Deja bought by google.com -;;; - -(defun nnweb-google-wash-article () - (let ((case-fold-search t) url) - (goto-char (point-min)) - (re-search-forward "^

    " nil t)
    -    (narrow-to-region (point-min) (point))
    -    (search-backward "" nil t)
    -      (replace-match "\n"))
    -    (nnweb-remove-markup)
    -    (goto-char (point-min))
    -    (while (re-search-forward "^[ \t]*\n" nil t)
    -      (replace-match ""))
    -    (goto-char (point-max))
    -    (insert "\n")
    -    (widen)
    -    (narrow-to-region (point) (point-max))
    -    (search-forward "" nil t)
    -    (delete-region (point) (point-max))
    -    (nnweb-remove-markup)
    -    (widen)))
    -
    -(defun nnweb-google-parse-1 (&optional Message-ID)
    -  (let ((i 0)
    -	(case-fold-search t)
    -	(active (cadr (assoc nnweb-group nnweb-group-alist)))
    -	Subject Score Date Newsgroups From
    -	map url mid)
    -    (unless active
    -      (push (list nnweb-group (setq active (cons 1 0))
    -		  nnweb-type nnweb-search)
    -	    nnweb-group-alist))
    -    ;; Go through all the article hits on this page.
    -    (goto-char (point-min))
    -    (while (re-search-forward
    -	    "a href=/groups\\(\\?[^ \">]*selm=\\([^ &\">]+\\)\\)" nil t)
    -      (setq mid (match-string 2)
    -	    url (format 
    -		 "http://groups.google.com/groups?selm=%s&output=gplain" mid))
    -      (narrow-to-region (search-forward ">" nil t)
    -			(search-forward "" nil t))
    -      (nnweb-remove-markup)
    -      (nnweb-decode-entities)
    -      (setq Subject (buffer-string))
    -      (goto-char (point-max))
    -      (widen)
    -      (forward-line 2)
    -      (when (looking-at "
    ]+>") - (goto-char (match-end 0))) - (if (not (looking-at "]+>")) - (skip-chars-forward " \t") - (narrow-to-region (point) - (search-forward "" nil t)) - (nnweb-remove-markup) - (nnweb-decode-entities) - (setq Newsgroups (buffer-string)) - (goto-char (point-max)) - (widen) - (skip-chars-forward "- \t")) - (when (looking-at - "\\([0-9]+[/ ][A-Za-z]+[/ ][0-9]+\\)[ \t]*by[ \t]*\\([^<]*\\) - ]+\\)" url) - (match-string 1 url) - url)) - -;;; -;;; General web/w3 interface utility functions -;;; - -(defun nnweb-insert-html (parse) - "Insert HTML based on a w3 parse tree." - (if (stringp parse) - (insert (nnheader-string-as-multibyte parse)) - (insert "<" (symbol-name (car parse)) " ") - (insert (mapconcat - (lambda (param) - (concat (symbol-name (car param)) "=" - (prin1-to-string - (if (consp (cdr param)) - (cadr param) - (cdr param))))) - (nth 1 parse) - " ")) - (insert ">\n") - (mapcar 'nnweb-insert-html (nth 2 parse)) - (insert "\n"))) - -(defun nnweb-encode-www-form-urlencoded (pairs) - "Return PAIRS encoded for forms." - (mapconcat - (function - (lambda (data) - (concat (w3-form-encode-xwfu (car data)) "=" - (w3-form-encode-xwfu (cdr data))))) - pairs "&")) - -(defun nnweb-fetch-form (url pairs) - "Fetch a form from URL with PAIRS as the data using the POST method." - (let ((url-request-data (nnweb-encode-www-form-urlencoded pairs)) - (url-request-method "POST") - (url-request-extra-headers - '(("Content-type" . "application/x-www-form-urlencoded")))) - (url-insert-file-contents url) - (setq buffer-file-name nil)) - t) - -(defun nnweb-decode-entities () - "Decode all HTML entities." - (goto-char (point-min)) - (while (re-search-forward "&\\(#[0-9]+\\|[a-z]+\\);" nil t) - (let ((elem (if (eq (aref (match-string 1) 0) ?\#) - (let ((c - (string-to-number (substring - (match-string 1) 1)))) - (if (mm-char-or-char-int-p c) c 32)) - (or (cdr (assq (intern (match-string 1)) - w3-html-entities)) - ?#)))) - (unless (stringp elem) - (setq elem (char-to-string elem))) - (replace-match elem t t)))) - -(defun nnweb-decode-entities-string (string) - (with-temp-buffer - (insert string) - (nnweb-decode-entities) - (buffer-substring (point-min) (point-max)))) - -(defun nnweb-remove-markup () - "Remove all HTML markup, leaving just plain text." - (goto-char (point-min)) - (while (search-forward "" nil t) - (point-max)))) - (goto-char (point-min)) - (while (re-search-forward "<[^>]+>" nil t) - (replace-match "" t t))) - -(defun nnweb-insert (url &optional follow-refresh) - "Insert the contents from an URL in the current buffer. -If FOLLOW-REFRESH is non-nil, redirect refresh url in META." - (let ((name buffer-file-name)) - (if follow-refresh - (save-restriction - (narrow-to-region (point) (point)) - (url-insert-file-contents url) - (goto-char (point-min)) - (when (re-search-forward - "]*URL=\\([^\"]+\\)\"" nil t) - (let ((url (match-string 1))) - (delete-region (point-min) (point-max)) - (nnweb-insert url t)))) - (url-insert-file-contents url)) - (setq buffer-file-name name))) - -(defun nnweb-parse-find (type parse &optional maxdepth) - "Find the element of TYPE in PARSE." - (catch 'found - (nnweb-parse-find-1 type parse maxdepth))) - -(defun nnweb-parse-find-1 (type contents maxdepth) - (when (or (null maxdepth) - (not (zerop maxdepth))) - (when (consp contents) - (when (eq (car contents) type) - (throw 'found contents)) - (when (listp (cdr contents)) - (dolist (element contents) - (when (consp element) - (nnweb-parse-find-1 type element - (and maxdepth (1- maxdepth))))))))) - -(defun nnweb-parse-find-all (type parse) - "Find all elements of TYPE in PARSE." - (catch 'found - (nnweb-parse-find-all-1 type parse))) - -(defun nnweb-parse-find-all-1 (type contents) - (let (result) - (when (consp contents) - (if (eq (car contents) type) - (push contents result) - (when (listp (cdr contents)) - (dolist (element contents) - (when (consp element) - (setq result - (nconc result (nnweb-parse-find-all-1 type element)))))))) - result)) - -(defvar nnweb-text) -(defun nnweb-text (parse) - "Return a list of text contents in PARSE." - (let ((nnweb-text nil)) - (nnweb-text-1 parse) - (nreverse nnweb-text))) - -(defun nnweb-text-1 (contents) - (dolist (element contents) - (if (stringp element) - (push element nnweb-text) - (when (and (consp element) - (listp (cdr element))) - (nnweb-text-1 element))))) - -(defun nnweb-replace-in-string (string match newtext) - (while (string-match match string) - (setq string (replace-match newtext t t string))) - string) - -(provide 'nnweb) - -;;; nnweb.el ends here diff --git a/lisp/nnwfm.el b/lisp/nnwfm.el deleted file mode 100644 index 2de45b7..0000000 --- a/lisp/nnwfm.el +++ /dev/null @@ -1,433 +0,0 @@ -;;; nnwfm.el --- interfacing with a web forum -;; Copyright (C) 2000 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; Note: You need to have `url' and `w3' installed for this -;; backend to work. - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'gnus-clfns)) - -(require 'nnoo) -(require 'message) -(require 'gnus-util) -(require 'gnus) -(require 'nnmail) -(require 'mm-util) -(eval-when-compile - (ignore-errors - (require 'nnweb))) -;; Report failure to find w3 at load time if appropriate. -(eval '(require 'nnweb)) - -(nnoo-declare nnwfm) - -(defvoo nnwfm-directory (nnheader-concat gnus-directory "wfm/") - "Where nnwfm will save its files.") - -(defvoo nnwfm-address "" - "The address of the Ultimate bulletin board.") - -;;; Internal variables - -(defvar nnwfm-groups-alist nil) -(defvoo nnwfm-groups nil) -(defvoo nnwfm-headers nil) -(defvoo nnwfm-articles nil) -(defvar nnwfm-table-regexp - "postings.*editpost\\|forumdisplay\\|Forum[0-9]+/HTML\\|getbio") - -;;; Interface functions - -(nnoo-define-basics nnwfm) - -(deffoo nnwfm-retrieve-headers (articles &optional group server fetch-old) - (nnwfm-possibly-change-server group server) - (unless gnus-nov-is-evil - (let* ((last (car (last articles))) - (did nil) - (start 1) - (entry (assoc group nnwfm-groups)) - (sid (nth 2 entry)) - (topics (nth 4 entry)) - (mapping (nth 5 entry)) - (old-total (or (nth 6 entry) 1)) - (nnwfm-table-regexp "Thread.asp") - headers article subject score from date lines parent point - contents tinfo fetchers map elem a href garticles topic old-max - inc datel table string current-page total-contents pages - farticles forum-contents parse furl-fetched mmap farticle - thread-id tables hstuff bstuff time) - (setq map mapping) - (while (and (setq article (car articles)) - map) - (while (and map - (or (> article (caar map)) - (< (cadar map) (caar map)))) - (pop map)) - (when (setq mmap (car map)) - (setq farticle -1) - (while (and article - (<= article (nth 1 mmap))) - ;; Do we already have a fetcher for this topic? - (if (setq elem (assq (nth 2 mmap) fetchers)) - ;; Yes, so we just add the spec to the end. - (nconc elem (list (cons article - (+ (nth 3 mmap) (incf farticle))))) - ;; No, so we add a new one. - (push (list (nth 2 mmap) - (cons article - (+ (nth 3 mmap) (incf farticle)))) - fetchers)) - (pop articles) - (setq article (car articles))))) - ;; Now we have the mapping from/to Gnus/nnwfm article numbers, - ;; so we start fetching the topics that we need to satisfy the - ;; request. - (if (not fetchers) - (save-excursion - (set-buffer nntp-server-buffer) - (erase-buffer)) - (setq nnwfm-articles nil) - (mm-with-unibyte-buffer - (dolist (elem fetchers) - (erase-buffer) - (setq subject (nth 2 (assq (car elem) topics)) - thread-id (nth 0 (assq (car elem) topics))) - (nnweb-insert - (concat nnwfm-address - (format "Item.asp?GroupID=%d&ThreadID=%d" sid - thread-id))) - (goto-char (point-min)) - (setq tables (caddar - (caddar - (cdr (caddar - (caddar - (ignore-errors - (w3-parse-buffer (current-buffer))))))))) - (setq tables (cdr (caddar (memq (assq 'div tables) tables)))) - (setq contents nil) - (dolist (table tables) - (when (eq (car table) 'table) - (setq table (caddar (caddar (caddr table))) - hstuff (delete ":link" (nnweb-text (car table))) - bstuff (car (caddar (cdr table))) - from (car hstuff)) - (when (nth 2 hstuff) - (setq time (nnwfm-date-to-time (nth 2 hstuff))) - (push (list from time bstuff) contents)))) - (setq contents (nreverse contents)) - (dolist (art (cdr elem)) - (push (list (car art) - (nth (1- (cdr art)) contents) - subject) - nnwfm-articles)))) - (setq nnwfm-articles - (sort nnwfm-articles 'car-less-than-car)) - ;; Now we have all the articles, conveniently in an alist - ;; where the key is the Gnus article number. - (dolist (articlef nnwfm-articles) - (setq article (nth 0 articlef) - contents (nth 1 articlef) - subject (nth 2 articlef)) - (setq from (nth 0 contents) - date (message-make-date (nth 1 contents))) - (push - (cons - article - (make-full-mail-header - article subject - from (or date "") - (concat "<" (number-to-string sid) "%" - (number-to-string article) - "@wfm>") - "" 0 - (/ (length (mapconcat 'identity (nnweb-text (nth 2 contents)) "")) - 70) - nil nil)) - headers)) - (setq nnwfm-headers (sort headers 'car-less-than-car)) - (save-excursion - (set-buffer nntp-server-buffer) - (mm-with-unibyte-current-buffer - (erase-buffer) - (dolist (header nnwfm-headers) - (nnheader-insert-nov (cdr header)))))) - 'nov))) - -(deffoo nnwfm-request-group (group &optional server dont-check) - (nnwfm-possibly-change-server nil server) - (when (not nnwfm-groups) - (nnwfm-request-list)) - (unless dont-check - (nnwfm-create-mapping group)) - (let ((elem (assoc group nnwfm-groups))) - (cond - ((not elem) - (nnheader-report 'nnwfm "Group does not exist")) - (t - (nnheader-report 'nnwfm "Opened group %s" group) - (nnheader-insert - "211 %d %d %d %s\n" (cadr elem) 1 (cadr elem) - (prin1-to-string group)))))) - -(deffoo nnwfm-request-close () - (setq nnwfm-groups-alist nil - nnwfm-groups nil)) - -(deffoo nnwfm-request-article (article &optional group server buffer) - (nnwfm-possibly-change-server group server) - (let ((contents (cdr (assq article nnwfm-articles)))) - (when (setq contents (nth 2 (car contents))) - (save-excursion - (set-buffer (or buffer nntp-server-buffer)) - (erase-buffer) - (nnweb-insert-html contents) - (goto-char (point-min)) - (insert "Content-Type: text/html\nMIME-Version: 1.0\n") - (let ((header (cdr (assq article nnwfm-headers)))) - (mm-with-unibyte-current-buffer - (nnheader-insert-header header))) - (nnheader-report 'nnwfm "Fetched article %s" article) - (cons group article))))) - -(deffoo nnwfm-request-list (&optional server) - (nnwfm-possibly-change-server nil server) - (mm-with-unibyte-buffer - (nnweb-insert - (if (string-match "/$" nnwfm-address) - (concat nnwfm-address "Group.asp") - nnwfm-address)) - (let* ((nnwfm-table-regexp "Thread.asp") - (contents (w3-parse-buffer (current-buffer))) - sid elem description articles a href group forum - a1 a2) - (dolist (row (cdr (nth 2 (car (nth 2 (nnwfm-find-forum-table - contents)))))) - (setq row (nth 2 row)) - (when (setq a (nnweb-parse-find 'a row)) - (setq group (car (last (nnweb-text a))) - href (cdr (assq 'href (nth 1 a)))) - (setq description (car (last (nnweb-text (nth 1 row))))) - (setq articles - (string-to-number - (nnweb-replace-in-string - (car (last (nnweb-text (nth 3 row)))) "," ""))) - (when (and href - (string-match "GroupId=\\([0-9]+\\)" href)) - (setq forum (string-to-number (match-string 1 href))) - (if (setq elem (assoc group nnwfm-groups)) - (setcar (cdr elem) articles) - (push (list group articles forum description nil nil nil nil) - nnwfm-groups)))))) - (nnwfm-write-groups) - (nnwfm-generate-active) - t)) - -(deffoo nnwfm-request-newgroups (date &optional server) - (nnwfm-possibly-change-server nil server) - (nnwfm-generate-active) - t) - -(nnoo-define-skeleton nnwfm) - -;;; Internal functions - -(defun nnwfm-new-threads-p (group time) - "See whether we want to fetch the threads for GROUP written before TIME." - (let ((old-time (nth 7 (assoc group nnwfm-groups)))) - (or (null old-time) - (time-less-p old-time time)))) - -(defun nnwfm-create-mapping (group) - (let* ((entry (assoc group nnwfm-groups)) - (sid (nth 2 entry)) - (topics (nth 4 entry)) - (mapping (nth 5 entry)) - (old-total (or (nth 6 entry) 1)) - (current-time (current-time)) - (nnwfm-table-regexp "Thread.asp") - (furls (list (concat nnwfm-address - (format "Thread.asp?GroupId=%d" sid)))) - fetched-urls - contents forum-contents a subject href - garticles topic tinfo old-max inc parse elem date - url time) - (mm-with-unibyte-buffer - (while furls - (erase-buffer) - (push (car furls) fetched-urls) - (nnweb-insert (pop furls)) - (goto-char (point-min)) - (while (re-search-forward " wr(" nil t) - (forward-char -1) - (setq elem (message-tokenize-header - (nnweb-replace-in-string - (buffer-substring - (1+ (point)) - (progn - (forward-sexp 1) - (1- (point)))) - "\\\\[\"\\\\]" ""))) - (push (list - (string-to-number (nth 1 elem)) - (nnweb-replace-in-string (nth 2 elem) "\"" "") - (string-to-number (nth 5 elem))) - forum-contents)) - (when (re-search-forward "href=\"\\(Thread.*DateLast=\\([^\"]+\\)\\)" - nil t) - (setq url (match-string 1) - time (nnwfm-date-to-time (url-unhex-string (match-string 2)))) - (when (and (nnwfm-new-threads-p group time) - (not (member - (setq url (concat - nnwfm-address - (nnweb-decode-entities-string url))) - fetched-urls))) - (push url furls)))) - ;; The main idea here is to map Gnus article numbers to - ;; nnwfm article numbers. Say there are three topics in - ;; this forum, the first with 4 articles, the seconds with 2, - ;; and the third with 1. Then this will translate into 7 Gnus - ;; article numbers, where 1-4 comes from the first topic, 5-6 - ;; from the second and 7 from the third. Now, then next time - ;; the group is entered, there's 2 new articles in topic one - ;; and 1 in topic three. Then Gnus article number 8-9 be 5-6 - ;; in topic one and 10 will be the 2 in topic three. - (dolist (elem (nreverse forum-contents)) - (setq subject (nth 1 elem) - topic (nth 0 elem) - garticles (nth 2 elem)) - (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) 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)) - (nnwfm-write-groups) - mapping)) - -(defun nnwfm-possibly-change-server (&optional group server) - (nnwfm-init server) - (when (and server - (not (nnwfm-server-opened server))) - (nnwfm-open-server server)) - (unless nnwfm-groups-alist - (nnwfm-read-groups) - (setq nnwfm-groups (cdr (assoc nnwfm-address - nnwfm-groups-alist))))) - -(deffoo nnwfm-open-server (server &optional defs connectionless) - (nnheader-init-server-buffer) - (if (nnwfm-server-opened server) - t - (unless (assq 'nnwfm-address defs) - (setq defs (append defs (list (list 'nnwfm-address server))))) - (nnoo-change-server 'nnwfm server defs))) - -(defun nnwfm-read-groups () - (setq nnwfm-groups-alist nil) - (let ((file (expand-file-name "groups" nnwfm-directory))) - (when (file-exists-p file) - (mm-with-unibyte-buffer - (insert-file-contents file) - (goto-char (point-min)) - (setq nnwfm-groups-alist (read (current-buffer))))))) - -(defun nnwfm-write-groups () - (setq nnwfm-groups-alist - (delq (assoc nnwfm-address nnwfm-groups-alist) - nnwfm-groups-alist)) - (push (cons nnwfm-address nnwfm-groups) - nnwfm-groups-alist) - (with-temp-file (expand-file-name "groups" nnwfm-directory) - (prin1 nnwfm-groups-alist (current-buffer)))) - -(defun nnwfm-init (server) - "Initialize buffers and such." - (unless (file-exists-p nnwfm-directory) - (gnus-make-directory nnwfm-directory))) - -(defun nnwfm-generate-active () - (save-excursion - (set-buffer nntp-server-buffer) - (erase-buffer) - (dolist (elem nnwfm-groups) - (insert (prin1-to-string (car elem)) - " " (number-to-string (cadr elem)) " 1 y\n")))) - -(defun nnwfm-find-forum-table (contents) - (catch 'found - (nnwfm-find-forum-table-1 contents))) - -(defun nnwfm-find-forum-table-1 (contents) - (dolist (element contents) - (unless (stringp element) - (when (and (eq (car element) 'table) - (nnwfm-forum-table-p element)) - (throw 'found element)) - (when (nth 2 element) - (nnwfm-find-forum-table-1 (nth 2 element)))))) - -(defun nnwfm-forum-table-p (parse) - (when (not (apply 'gnus-or - (mapcar - (lambda (p) - (nnweb-parse-find 'table p)) - (nth 2 parse)))) - (let ((href (cdr (assq 'href (nth 1 (nnweb-parse-find 'a parse 20))))) - case-fold-search) - (when (and href (string-match nnwfm-table-regexp href)) - t)))) - -(defun nnwfm-date-to-time (date) - (let ((time (mapcar #'string-to-number (split-string date "[\\.\\+ :]")))) - (encode-time 0 (nth 4 time) (nth 3 time) - (nth 0 time) (nth 1 time) - (if (< (nth 2 time) 70) - (+ 2000 (nth 2 time)) - (+ 1900 (nth 2 time)))))) - -(provide 'nnwfm) - -;; Local Variables: -;; coding: iso-8859-1 -;; End: - -;;; nnwfm.el ends here diff --git a/lisp/parse-time.el b/lisp/parse-time.el deleted file mode 100644 index d003251..0000000 --- a/lisp/parse-time.el +++ /dev/null @@ -1,214 +0,0 @@ -;;; parse-time.el --- Parsing time strings - -;; Copyright (C) 1996, 2000 by Free Software Foundation, Inc. - -;; Author: Erik Naggum -;; Keywords: util - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to -;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; With the introduction of the `encode-time', `decode-time', and -;; `format-time-string' functions, dealing with time became simpler in -;; Emacs. However, parsing time strings is still largely a matter of -;; heuristics and no common interface has been designed. - -;; `parse-time-string' parses a time in a string and returns a list of 9 -;; values, just like `decode-time', where unspecified elements in the -;; string are returned as nil. `encode-time' may be applied on these -;; valuse to obtain an internal time value. - -;;; Code: - -(eval-when-compile (require 'cl)) ;and ah ain't kiddin' 'bout it - -(defvar parse-time-syntax (make-vector 256 nil)) -(defvar parse-time-digits (make-vector 256 nil)) - -;; Byte-compiler warnings -(defvar elt) -(defvar val) - -(unless (aref parse-time-digits ?0) - (loop for i from ?0 to ?9 - do (aset parse-time-digits i (- i ?0)))) - -(unless (aref parse-time-syntax ?0) - (loop for i from ?0 to ?9 - do (aset parse-time-syntax i ?0)) - (loop for i from ?A to ?Z - do (aset parse-time-syntax i ?A)) - (loop for i from ?a to ?z - do (aset parse-time-syntax i ?a)) - (aset parse-time-syntax ?+ 1) - (aset parse-time-syntax ?- -1) - (aset parse-time-syntax ?: ?d) - ) - -(defsubst digit-char-p (char) - (aref parse-time-digits char)) - -(defsubst parse-time-string-chars (char) - (aref parse-time-syntax char)) - -(put 'parse-error 'error-conditions '(parse-error error)) -(put 'parse-error 'error-message "Parsing error") - -(defsubst parse-integer (string &optional start end) - "[CL] Parse and return the integer in STRING, or nil if none." - (let ((integer 0) - (digit 0) - (index (or start 0)) - (end (or end (length string)))) - (when (< index end) - (let ((sign (aref string index))) - (if (or (eq sign ?+) (eq sign ?-)) - (setq sign (parse-time-string-chars sign) - index (1+ index)) - (setq sign 1)) - (while (and (< index end) - (setq digit (digit-char-p (aref string index)))) - (setq integer (+ (* integer 10) digit) - index (1+ index))) - (if (/= index end) - (signal 'parse-error `("not an integer" - ,(substring string (or start 0) end))) - (* sign integer)))))) - -(defun parse-time-tokenize (string) - "Tokenize STRING into substrings." - (let ((start nil) - (end (length string)) - (all-digits nil) - (list ()) - (index 0) - (c nil)) - (while (< index end) - (while (and (< index end) ;skip invalid characters - (not (setq c (parse-time-string-chars (aref string index))))) - (incf index)) - (setq start index all-digits (eq c ?0)) - (while (and (< (incf index) end) ;scan valid characters - (setq c (parse-time-string-chars (aref string index)))) - (setq all-digits (and all-digits (eq c ?0)))) - (if (<= index end) - (push (if all-digits (parse-integer string start index) - (substring string start index)) - list))) - (nreverse list))) - -(defvar parse-time-months '(("jan" . 1) ("feb" . 2) ("mar" . 3) - ("apr" . 4) ("may" . 5) ("jun" . 6) - ("jul" . 7) ("aug" . 8) ("sep" . 9) - ("oct" . 10) ("nov" . 11) ("dec" . 12))) -(defvar parse-time-weekdays '(("sun" . 0) ("mon" . 1) ("tue" . 2) - ("wed" . 3) ("thu" . 4) ("fri" . 5) ("sat" . 6))) -(defvar parse-time-zoneinfo `(("z" 0) ("ut" 0) ("gmt" 0) - ("pst" ,(* -8 3600)) ("pdt" ,(* -7 3600) t) - ("mst" ,(* -7 3600)) ("mdt" ,(* -6 3600) t) - ("cst" ,(* -6 3600)) ("cdt" ,(* -5 3600) t) - ("est" ,(* -5 3600)) ("edt" ,(* -4 3600) t)) - "(zoneinfo seconds-off daylight-savings-time-p)") - -(defvar parse-time-rules - `(((6) parse-time-weekdays) - ((3) (1 31)) - ((4) parse-time-months) - ((5) (100 4038)) - ((2 1 0) - ,#'(lambda () (and (stringp elt) - (= (length elt) 8) - (= (aref elt 2) ?:) - (= (aref elt 5) ?:))) - [0 2] [3 5] [6 8]) - ((8 7) parse-time-zoneinfo - ,#'(lambda () (car val)) - ,#'(lambda () (cadr val))) - ((8) - ,#'(lambda () - (and (stringp elt) - (= 5 (length elt)) - (or (= (aref elt 0) ?+) (= (aref elt 0) ?-)))) - ,#'(lambda () (* 60 (+ (parse-integer elt 3 5) - (* 60 (parse-integer elt 1 3))) - (if (= (aref elt 0) ?-) -1 1)))) - ((5 4 3) - ,#'(lambda () (and (stringp elt) - (= (length elt) 10) - (= (aref elt 4) ?-) - (= (aref elt 7) ?-))) - [0 4] [5 7] [8 10]) - ((2 1 0) - ,#'(lambda () (and (stringp elt) (= (length elt) 5) (= (aref elt 2) ?:))) - [0 2] [3 5] ,#'(lambda () 0)) - ((2 1 0) - ,#'(lambda () (and (stringp elt) - (= (length elt) 4) - (= (aref elt 1) ?:))) - [0 1] [2 4] ,#'(lambda () 0)) - ((2 1 0) - ,#'(lambda () (and (stringp elt) - (= (length elt) 7) - (= (aref elt 1) ?:))) - [0 1] [2 4] [5 7]) - ((5) (50 110) ,#'(lambda () (+ 1900 elt))) - ((5) (0 49) ,#'(lambda () (+ 2000 elt)))) - "(slots predicate extractor...)") - -(defun parse-time-string (string) - "Parse the time-string STRING into (SEC MIN HOUR DAY MON YEAR DOW DST TZ). -The values are identical to those of `decode-time', but any values that are -unknown are returned as nil." - (let ((time (list nil nil nil nil nil nil nil nil nil)) - (temp (parse-time-tokenize (downcase string)))) - (while temp - (let ((elt (pop temp)) - (rules parse-time-rules) - (exit nil)) - (while (and (not (null rules)) (not exit)) - (let* ((rule (pop rules)) - (slots (pop rule)) - (predicate (pop rule)) - (val)) - (when (and (not (nth (car slots) time)) ;not already set - (setq val (cond ((and (consp predicate) - (not (eq (car predicate) - 'lambda))) - (and (numberp elt) - (<= (car predicate) elt) - (<= elt (cadr predicate)) - elt)) - ((symbolp predicate) - (cdr (assoc elt - (symbol-value predicate)))) - ((funcall predicate))))) - (setq exit t) - (while slots - (let ((new-val (and rule - (let ((this (pop rule))) - (if (vectorp this) - (parse-integer - elt (aref this 0) (aref this 1)) - (funcall this)))))) - (rplaca (nthcdr (pop slots) time) (or new-val val))))))))) - time)) - -(provide 'parse-time) - -;;; parse-time.el ends here diff --git a/lisp/pop3.el b/lisp/pop3.el deleted file mode 100644 index 86f045b..0000000 --- a/lisp/pop3.el +++ /dev/null @@ -1,800 +0,0 @@ -;;; pop3.el --- Post Office Protocol (RFC 1460) interface - -;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Richard L. Pieri -;; Daiki Ueno -;; Maintainer: FSF -;; Keywords: mail - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; Most of the standard Post Office Protocol version 3 (RFC 1460) commands -;; are implemented. The LIST command has not been implemented due to lack -;; of actual usefulness. -;; The optional POP3 command TOP has not been implemented. - -;; This program was inspired by Kyle E. Jones's vm-pop program. - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'static)) - -(require 'mail-utils) - -(defvar pop3-maildrop (or (user-login-name) (getenv "LOGNAME") (getenv "USER") nil) - "*POP3 maildrop.") -(defvar pop3-mailhost (or (getenv "MAILHOST") nil) - "*POP3 mailhost.") -(defvar pop3-port 110 - "*POP3 port.") -(defvar pop3-connection-type nil - "*POP3 connection type.") - -(defvar pop3-password-required t - "*Non-nil if a password is required when connecting to POP server.") -(defvar pop3-password nil - "*Password to use when connecting to POP server.") - -(defvar pop3-authentication-scheme 'pass - "*POP3 authentication scheme. -Defaults to 'pass, for the standard USER/PASS authentication. Other valid -values are 'apop.") - -(defvar pop3-timestamp nil - "Timestamp returned when initially connected to the POP server. -Used for APOP authentication.") - -(defvar pop3-leave-mail-on-server nil - "Non-nil if mail is to be left on the server and UIDL used for message retrieval.") - -(defvar pop3-maximum-message-size nil - "If non-nil only download messages smaller than this.") - -(defvar pop3-except-header-regexp nil - "If non-nil we do not retrieve messages whose headers are matching this regexp.") - -(defvar pop3-uidl-file-name "~/.uidls" - "File in which to store the UIDL of processed messages.") - -(defvar pop3-uidl-support 'dont-know - "Whether the server supports UIDL. -Nil means no, t means yes, not-nil-or-t means yet to be determined.") - -(defvar pop3-uidl-obarray (make-vector 31 0) - "Uidl hash table.") - -(defvar pop3-read-point nil) -(defvar pop3-debug nil) - -(eval-and-compile - (autoload 'open-ssl-stream "ssl") - (autoload 'starttls-open-stream "starttls") - (autoload 'starttls-negotiate "starttls")) - -(defvar pop3-ssl-program-name - (if (exec-installed-p "openssl") - "openssl" - "ssleay") - "The program to run in a subprocess to open an SSL connection.") - -(defvar pop3-ssl-program-arguments - '("s_client" "-quiet") - "Arguments to be passed to the program `pop3-ssl-program-name'.") - -(defun pop3-progress-message (format percent &rest args) - (apply (function message) format args)) - -(defun pop3-movemail (&optional crashbox) - "Transfer contents of a maildrop to the specified CRASHBOX." - (or crashbox (setq crashbox (expand-file-name "~/.crashbox"))) - (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 messages) - ;; 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"))) - ;; get messages that are suitable for download - (message "Retrieving message list...") - (setq messages (pop3-get-message-numbers process) - message-count (length (cdr messages))) - (message "Retrieving message list...%d of %d unread" - message-count (pop messages)) - (unwind-protect - (unless (not (stringp crashbox)) - (while messages - (pop3-progress-message - "Retrieving message %d of %d (%d octets) from %s..." - (floor (* (/ (float n) message-count) 100)) - n message-count (cdar messages) pop3-mailhost) - (pop3-retr process (caar messages) crashbuf) - (push (caar messages) retrieved-messages) - (setq messages (cdr messages) - n (1+ n))) - (with-current-buffer crashbuf - (write-region-as-binary (point-min) (point-max) - crashbox 'append 'nomesg)) - ;; mark messages as read - (when pop3-leave-mail-on-server - (pop3-save-uidls)) - ;; now delete the messages we have retrieved - (unless pop3-leave-mail-on-server - (dolist (n retrieved-messages) - (message "Deleting message %d of %d from %s..." - n message-count pop3-mailhost) - (pop3-dele process n))) - ) - (pop3-quit process)) - (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 on PORT. -Returns the process associated with the connection. -Argument PORT specifies connecting port." - (let (process) - (save-excursion - (set-buffer (get-buffer-create (concat " trace of POP session to " - 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) - (let* ((ssl-program-name - pop3-ssl-program-name) - (ssl-program-arguments - `(,@pop3-ssl-program-arguments - ,extra-arg - "-connect" ,(format "%s:%d" host service))) - (process (open-ssl-stream name buffer host service))) - (when process - (with-current-buffer buffer - (goto-char (point-min)) - (while (and (memq (process-status process) '(open run)) - (goto-char (point-max)) - (forward-line -1) - (not (looking-at "+OK"))) - (accept-process-output process 1) - (sit-for 1)) - (delete-region (point-min) (point))) - (and process (memq (process-status process) '(open run)) - process)))) - -(defun pop3-open-ssl-stream (name buffer host service) - "Open a SSL connection for a service to a host. -Returns a subprocess-object to represent the connection. -Args are NAME BUFFER HOST SERVICE." - (cond ((eq system-type 'windows-nt) - (let (selective-display - (coding-system-for-write 'binary) - (coding-system-for-read 'raw-text-dos)) - (or (pop3-open-ssl-stream-1 name buffer host service "-ssl3") - (pop3-open-ssl-stream-1 name buffer host service "-ssl2")))) - (t - (as-binary-process - (or (pop3-open-ssl-stream-1 name buffer host service "-ssl3") - (pop3-open-ssl-stream-1 name buffer host service "-ssl2")))))) - -(defun pop3-open-tls-stream (name buffer host service) - "Open a TLSv1 connection for a service to a host. -Returns a subprocess-object to represent the connection. -Args are NAME BUFFER HOST SERVICE." - (let ((process - (as-binary-process (starttls-open-stream - name buffer host service)))) - (pop3-stls process) - (starttls-negotiate process) - process)) - -;; Support functions - -(defun pop3-process-filter (process output) - (save-excursion - (set-buffer (process-buffer process)) - (goto-char (point-max)) - (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")) - ) - -(defun pop3-read-response (process &optional return) - "Read the response from the server PROCESS. -Return the response string if optional second argument RETURN is non-nil." - (let ((case-fold-search nil) - match-end) - (save-excursion - (set-buffer (process-buffer process)) - (goto-char pop3-read-point) - (while (not (search-forward "\r\n" nil t)) - (accept-process-output process 3) - (goto-char pop3-read-point)) - (setq match-end (point)) - (goto-char pop3-read-point) - (if (looking-at "-ERR") - (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) - (if return - (buffer-substring (point) match-end) - t) - ))))) - -(defvar pop3-read-passwd nil) -(defun pop3-read-passwd (prompt) - (if (not pop3-read-passwd) - (if (fboundp 'read-passwd) - (setq pop3-read-passwd 'read-passwd) - (if (load "passwd" t) - (setq pop3-read-passwd 'read-passwd) - (autoload 'ange-ftp-read-passwd "ange-ftp") - (setq pop3-read-passwd 'ange-ftp-read-passwd)))) - (funcall pop3-read-passwd prompt)) - -(defun pop3-clean-region (start end) - (setq end (set-marker (make-marker) end)) - (save-excursion - (goto-char start) - (while (and (< (point) end) (search-forward "\r\n" end t)) - (replace-match "\n" t t)) - (goto-char start) - (while (re-search-forward "\n\n\\(From \\)" end t) - (replace-match "\n\n>\\1" t nil)) - (goto-char start) - (while (and (< (point) end) (re-search-forward "^\\." end t)) - (replace-match "" t t) - (forward-char))) - (set-marker end nil)) - -(eval-when-compile (defvar parse-time-months)) - -;; Copied from message-make-date. -(defun pop3-make-date (&optional now) - "Make a valid date header. -If NOW, use that time instead." - (require 'parse-time) - (let* ((now (or now (current-time))) - (zone (nth 8 (decode-time now))) - (sign "+")) - (when (< zone 0) - (setq sign "-") - (setq zone (- zone))) - (concat - (format-time-string "%d" now) - ;; The month name of the %b spec is locale-specific. Pfff. - (format " %s " - (capitalize (car (rassoc (nth 4 (decode-time now)) - parse-time-months)))) - (format-time-string "%Y %H:%M:%S " now) - ;; We do all of this because XEmacs doesn't have the %z spec. - (format "%s%02d%02d" sign (/ zone 3600) (/ (% zone 3600) 60))))) - -(defun pop3-munge-message-separator (start end) - "Check to see if a message separator exists. If not, generate one." - (save-excursion - (save-restriction - (narrow-to-region start end) - (goto-char (point-min)) - (if (not (or (looking-at "From .?") ; Unix mail - (looking-at "\001\001\001\001\n") ; MMDF - (looking-at "BABYL OPTIONS:") ; Babyl - )) - (let ((from (mail-strip-quoted-names (mail-fetch-field "From"))) - (date (split-string (or (mail-fetch-field "Date") - (pop3-make-date)) - " ")) - (From_)) - ;; sample date formats I have seen - ;; Date: Tue, 9 Jul 1996 09:04:21 -0400 (EDT) - ;; Date: 08 Jul 1996 23:22:24 -0400 - ;; should be - ;; Tue Jul 9 09:04:21 1996 - (setq date - (cond ((string-match "[A-Z]" (nth 0 date)) - (format "%s %s %s %s %s" - (nth 0 date) (nth 2 date) (nth 1 date) - (nth 4 date) (nth 3 date))) - (t - ;; this really needs to be better but I don't feel - ;; like writing a date to day converter. - (format "Sun %s %s %s %s" - (nth 1 date) (nth 0 date) - (nth 3 date) (nth 2 date))) - )) - (setq From_ (format "\nFrom %s %s\n" from date)) - (while (string-match "," From_) - (setq From_ (concat (substring From_ 0 (match-beginning 0)) - (substring From_ (match-end 0))))) - (goto-char (point-min)) - (insert From_) - (if (search-forward "\n\n" nil t) - nil - (goto-char (point-max)) - (insert "\n")) - (narrow-to-region (point) (point-max)) - (let ((size (- (point-max) (point-min)))) - (goto-char (point-min)) - (widen) - (forward-line -1) - (insert (format "Content-Length: %s\n" size))) - ))))) - -;; UIDL support - -(defun pop3-get-message-numbers (process) - "Get the list of message numbers and lengths to retrieve via PROCESS." - ;; we use the LIST comand first anyway to get the message lengths. - ;; then if we're leaving mail on the server, see if the UIDL command - ;; is implemented. if so, we use it to get the message number list. - (let* ((messages (pop3-list process)) - (total (or (pop messages) 0)) - (uidl (if pop3-leave-mail-on-server - (pop3-get-uidl process))) - out) - (while messages - ;; only retrieve messages matching our regexp or in the uidl list - (when (and - ;; remove elements not in the uidl, this assumes the uidl is short - (or (not (eq pop3-uidl-support t)) - (memq (caar messages) uidl)) - (caar messages) - ;; don't download messages that are too large - (not (and pop3-maximum-message-size - (> (cdar messages) pop3-maximum-message-size))) - (not (and pop3-except-header-regexp - (string-match pop3-except-header-regexp - (pop3-top process (caar messages) 0))))) - (push (car messages) out)) - (setq messages (cdr messages))) - (cons total (reverse out)))) - -(defun pop3-get-uidl (process) - "Use PROCESS to get a list of unread message numbers." - (let ((messages (pop3-uidl process)) uidl) - (if (or (null messages) (null pop3-uidl-support)) - (setq pop3-uidl-support nil) - (setq pop3-uidl-support t) - (save-excursion - (with-temp-buffer - (when (file-readable-p pop3-uidl-file-name) - (insert-file-contents pop3-uidl-file-name)) - (goto-char (point-min)) - (while (looking-at "\\([^ \n\t]+\\)") - (set (intern (match-string 1) pop3-uidl-obarray) - (cons nil t)) - (forward-line 1)) - )) - (dolist (message (cdr messages)) - (if (setq uidl (intern-soft (cdr message) pop3-uidl-obarray)) - (setcar (symbol-value uidl) (car message)) - (set (intern (cdr message) pop3-uidl-obarray) - (cons (car message) nil)))) - (pop3-get-unread-message-numbers)) - )) - -(defun pop3-get-unread-message-numbers () - "Return a sorted list of unread msg numbers to retrieve." - (let (nums) - (mapatoms (lambda (atom) - (if (not (cdr (symbol-value atom))) - (push (car (symbol-value atom)) nums))) - pop3-uidl-obarray) - (sort nums '<))) - -(defun pop3-save-uidls () - "Save the updated UIDLs to disk for use next time." - (when (and pop3-leave-mail-on-server - ;; UIDL hash table is non-empty - (let ((len (length pop3-uidl-obarray))) - (while (< 0 len) - (setq len (if (symbolp (aref pop3-uidl-obarray (1- len))) - -1 (1- len)))) - (minusp len))) - (when (file-readable-p pop3-uidl-file-name) - (copy-file pop3-uidl-file-name - (concat pop3-uidl-file-name ".old") - 'overwrite 'keeptime)) - (save-excursion - (with-temp-file pop3-uidl-file-name - (mapatoms - (lambda (atom) - (when (car (symbol-value atom)) - (insert (format "%s\n" atom)))) - pop3-uidl-obarray))) - (fillarray pop3-uidl-obarray 0))) - - -;; The Command Set - -;; AUTHORIZATION STATE - -(defun pop3-user (process user) - "Send USER information to POP3 server." - (pop3-send-command process (format "USER %s" user)) - (let ((response (pop3-read-response process t))) - (if (not (and response (string-match "+OK" response))) - (error (format "USER %s not valid" user))))) - -(defun pop3-pass (process) - "Send authentication information to the server." - (pop3-send-command process (format "PASS %s" pop3-password)) - (let ((response (pop3-read-response process t))) - (if (not (and response (string-match "+OK" response))) - (pop3-quit process)))) - -(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 ((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" - (pop3-send-command process "STLS") - (let ((response (pop3-read-response process t))) - (if (not (and response (string-match "+OK" response))) - (pop3-quit process)))) - -;; TRANSACTION STATE - -(defun pop3-stat (process) - "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 " ")))) - )) - -(defun pop3-retr (process msg crashbuf) - "Retrieve message-id MSG to buffer CRASHBUF." - (pop3-send-command process (format "RETR %s" msg)) - (pop3-read-response process) - (save-excursion - (let ((region (pop3-get-extended-response process))) - (pop3-munge-message-separator (car region) (cadr region)) - (append-to-buffer crashbuf (car region) (cadr region)) - (delete-region (car region) (cadr region)) - ))) - -(defun pop3-dele (process msg) - "Mark message-id MSG as deleted." - (pop3-send-command process (format "DELE %s" msg)) - (pop3-read-response process)) - -(defun pop3-noop (process msg) - "No-operation." - (pop3-send-command process "NOOP") - (pop3-read-response process)) - -(defun pop3-last (process) - "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 " "))) - )) - -(defun pop3-rset (process) - "Remove all delete marks from current maildrop." - (pop3-send-command process "RSET") - (pop3-read-response process)) - -;; UPDATE - -(defun pop3-quit (process) - "Close connection to POP3 server. -Tell server to remove all messages marked as deleted, unlock the maildrop, -and close the connection." - (pop3-send-command process "QUIT") - (pop3-read-response process t) - (when process - (save-excursion - (set-buffer (process-buffer process)) - (goto-char (point-max)) - (delete-process process)))) - -(defun pop3-uidl (process &optional msgno) - "Return the results of a UIDL command in PROCESS for optional MSGNO. -If UIDL is unsupported on this mail server or if msgno is invalid, return nil. -Otherwise, return a list in the form - - (N (1 UIDL-1) (2 UIDL-2) ... (N UIDL-N)) - -where - - N is an integer for the number of UIDLs returned (could be 0) - UIDL-n is a string." - - (if msgno - (pop3-send-command process (format "UIDL %d" msgno)) - (pop3-send-command process "UIDL")) - - (if (null (pop3-read-response process t)) - nil ;; UIDL is not supported on this server - (let (pairs uidl) - (save-excursion - (save-restriction - (apply 'narrow-to-region (pop3-get-extended-response process)) - (goto-char (point-min)) - (while (looking-at "\\([^ \n\t]*\\) \\([^ \n\t]*\\)") - (setq msgno (string-to-int (match-string 1)) - uidl (match-string 2)) - (push (cons msgno uidl) pairs) - (beginning-of-line 2)) - (cons (length pairs) (nreverse pairs)) - ))))) - -(defun pop3-list (process &optional msgno) - "Return the results of a LIST command for PROCESS and optional MSGNO. -If (optional) msgno is invalid, return nil. Otherwise, return a list -in the form - - (N (1 LEN-1) (2 LEN-2) ... (N LEN-N)) - -where - - N is an integer for the number of msg/len pairs (could be 0) - LEN-n is an integer." - (if msgno - (pop3-send-command process (format "LIST %d" msgno)) - (pop3-send-command process "LIST")) - - (if (null (pop3-read-response process t)) - nil ;; MSGNO is not valid number - (let (pairs len) - (save-excursion - (save-restriction - (apply 'narrow-to-region (pop3-get-extended-response process)) - (goto-char (point-min)) - (while (looking-at "\\([^ \n\t]*\\) \\([^ \n\t]*\\)") - (setq msgno (string-to-int (match-string 1)) - len (string-to-int (match-string 2))) - (push (cons msgno len) pairs) - (beginning-of-line 2)) - (cons (length pairs) (nreverse pairs)) - ))))) - -(defun pop3-top (process msgno &optional lines) - "Return the top LINES of messages for PROCESS and MSGNO. -If msgno is invalid, return nil. Otherwise, return a string." - (pop3-send-command process (format "TOP %d %d" msgno (or lines 1))) - (if (pop3-read-response process t) - nil ;; MSGNO is not valid number - (save-excursion - (apply 'buffer-substring (pop3-get-extended-response process))) - )) - -;;; Utility code - -(defun pop3-get-extended-response (process) - "Get the extended pop3 response in the PROCESS buffer." - (let ((start pop3-read-point) end) - (set-buffer (process-buffer process)) - (goto-char start) - (while (not (re-search-forward "^\\.\r\n" nil t)) - (accept-process-output process 3) - (goto-char start)) - (setq pop3-read-point (point-marker)) - (goto-char (match-beginning 0)) - (setq end (point-marker)) - (pop3-clean-region start end) - (list start end))) - - -;; Summary of POP3 (Post Office Protocol version 3) commands and responses - -;;; AUTHORIZATION STATE - -;; Initial TCP connection -;; Arguments: none -;; Restrictions: none -;; Possible responses: -;; +OK [POP3 server ready] - -;; USER name -;; Arguments: a server specific user-id (required) -;; Restrictions: authorization state [after unsuccessful USER or PASS -;; Possible responses: -;; +OK [valid user-id] -;; -ERR [invalid user-id] - -;; PASS string -;; Arguments: a server/user-id specific password (required) -;; Restrictions: authorization state, after successful USER -;; Possible responses: -;; +OK [maildrop locked and ready] -;; -ERR [invalid password] -;; -ERR [unable to lock maildrop] - -;; STLS -;; Arguments: none -;; Restrictions: authorization state -;; Possible responses: -;; +OK [negotiation is ready] -;; -ERR [security layer is already active] - -;;; TRANSACTION STATE - -;; STAT -;; Arguments: none -;; Restrictions: transaction state -;; Possible responses: -;; +OK nn mm [# of messages, size of maildrop] - -;; LIST [msg] -;; Arguments: a message-id (optional) -;; Restrictions: transaction state; msg must not be deleted -;; Possible responses: -;; +OK [scan listing follows] -;; -ERR [no such message] - -;; TOP msg [lines] -;; Arguments: a message-id (required), number of lines (optional) -;; Restrictions: transaction state; msg must not be deleted -;; Possible responses: -;; +OK [partial message listing follows] -;; -ERR [no such message] - -;; UIDL [msg] -;; Arguments: a message-id (optional) -;; Restrictions: transaction state; msg must not be deleted -;; Possible responses: -;; +OK [uidl listing follows] -;; -ERR [no such message] - -;; RETR msg -;; Arguments: a message-id (required) -;; Restrictions: transaction state; msg must not be deleted -;; Possible responses: -;; +OK [message contents follow] -;; -ERR [no such message] - -;; DELE msg -;; Arguments: a message-id (required) -;; Restrictions: transaction state; msg must not be deleted -;; Possible responses: -;; +OK [message deleted] -;; -ERR [no such message] - -;; NOOP -;; Arguments: none -;; Restrictions: transaction state -;; Possible responses: -;; +OK - -;; LAST -;; Arguments: none -;; Restrictions: transaction state -;; Possible responses: -;; +OK nn [highest numbered message accessed] - -;; RSET -;; Arguments: none -;; Restrictions: transaction state -;; Possible responses: -;; +OK [all delete marks removed] - -;;; UPDATE STATE - -;; QUIT -;; Arguments: none -;; Restrictions: none -;; Possible responses: -;; +OK [TCP connection closed] - -(provide 'pop3) - -;;; pop3.el ends here diff --git a/lisp/qp.el b/lisp/qp.el deleted file mode 100644 index 75d6779..0000000 --- a/lisp/qp.el +++ /dev/null @@ -1,161 +0,0 @@ -;;; qp.el --- Quoted-Printable functions - -;; Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: mail, extensions - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; Functions for encoding and decoding quoted-printable text as -;; defined in RFC 2045. - -;;; Code: - -(require 'mm-util) -(eval-when-compile (defvar mm-use-ultra-safe-encoding)) - -(defun quoted-printable-decode-region (from to &optional coding-system) - "Decode quoted-printable in the region between FROM and TO, per RFC 2045. -If CODING-SYSTEM is non-nil, decode bytes into characters with that -coding-system." - (interactive - ;; Let the user determine the coding system with "C-x RET c". - (list (region-beginning) (region-end) coding-system-for-read)) - (unless (mm-coding-system-p coding-system) ; e.g. `ascii' from Gnus - (setq coding-system nil)) - (save-excursion - (save-restriction - ;; RFC 2045: ``An "=" followed by two hexadecimal digits, one - ;; or both of which are lowercase letters in "abcdef", is - ;; formally illegal. A robust implementation might choose to - ;; recognize them as the corresponding uppercase letters.'' - (let ((case-fold-search t)) - (narrow-to-region from to) - ;; Do this in case we're called from Gnus, say, in a buffer - ;; which already contains non-ASCII characters which would - ;; then get doubly-decoded below. - (if coding-system - (mm-encode-coding-region (point-min) (point-max) coding-system)) - (goto-char (point-min)) - (while (and (skip-chars-forward "^=") - (not (eobp))) - (cond ((eq (char-after (1+ (point))) ?\n) - (delete-char 2)) - ((looking-at "=[0-9A-F][0-9A-F]") - (let ((byte (string-to-int (buffer-substring (1+ (point)) - (+ 3 (point))) - 16))) - (insert byte) - (delete-char 3) - ;; Why backward-char??? - ;;(unless (eq byte 61) ;; 61 is not ?= in XEmacs - ;; (backward-char)) - )) - (t - (message "Malformed quoted-printable text") - (forward-char))))) - (if coding-system - (mm-decode-coding-region (point-min) (point-max) coding-system))))) - -(defun quoted-printable-decode-string (string &optional coding-system) - "Decode the quoted-printable encoded STRING and return the result. -If CODING-SYSTEM is non-nil, decode the region with coding-system." - (with-temp-buffer - (insert string) - (quoted-printable-decode-region (point-min) (point-max) coding-system) - (buffer-string))) - -(defun quoted-printable-encode-region (from to &optional fold class) - "Quoted-printable encode the region between FROM and TO per RFC 2045. - -If FOLD, fold long lines at 76 characters (as required by the RFC). -If CLASS is non-nil, translate the characters not matched by that -regexp class, which is in the form expected by `skip-chars-forward'. -You should probably avoid non-ASCII characters in this arg. - -If `mm-use-ultra-safe-encoding' is set, fold lines unconditionally and -encode lines starting with \"From\"." - (interactive "r") - (unless class - ;; Avoid using 8bit characters. = is \075. - ;; Equivalent to "^\000-\007\013\015-\037\200-\377=" - (setq class "\010-\012\014\040-\074\076-\177")) - (save-excursion - (save-restriction - (narrow-to-region from to) - ;; We can live with characters between 00-FF. - (goto-char (point-min)) - (while (not (eobp)) - (if (>= (char-after) 256) - (error "Multibyte character in QP encoding region")) - (forward-char)) - ;; Encode all the non-ascii and control characters. - (goto-char (point-min)) - (while (and (skip-chars-forward class) - (not (eobp))) - (insert - (prog1 - (format "=%02X" (char-after)) - (delete-char 1)))) - ;; Encode white space at the end of lines. - (goto-char (point-min)) - (while (re-search-forward "[ \t]+$" nil t) - (goto-char (match-beginning 0)) - (while (not (eolp)) - (insert - (prog1 - (format "=%02X" (char-after)) - (delete-char 1))))) - (let ((mm-use-ultra-safe-encoding - (and (boundp 'mm-use-ultra-safe-encoding) - mm-use-ultra-safe-encoding))) - (when (or fold mm-use-ultra-safe-encoding) - (let ((tab-width 1)) ; HTAB is one character. - (goto-char (point-min)) - (while (not (eobp)) - ;; In ultra-safe mode, encode "From " at the beginning - ;; of a line. - (when mm-use-ultra-safe-encoding - (if (looking-at "From ") - (replace-match "From=20" nil t) - (if (looking-at "-") - (replace-match "=2D" nil t)))) - (end-of-line) - ;; Fold long lines. - (while (> (current-column) 76) ; tab-width must be 1. - (beginning-of-line) - (forward-char 75) ; 75 chars plus an "=" - (search-backward "=" (- (point) 2) t) - (insert "=\n") - (end-of-line)) - (forward-line)))))))) - -(defun quoted-printable-encode-string (string) - "Encode the STRING as quoted-printable and return the result." - (let ((default-enable-multibyte-characters (mm-multibyte-string-p string))) - (with-temp-buffer - (insert string) - (quoted-printable-encode-region (point-min) (point-max)) - (buffer-string)))) - -(provide 'qp) - -;;; qp.el ends here diff --git a/lisp/read-passwd.el b/lisp/read-passwd.el deleted file mode 100644 index 4542604..0000000 --- a/lisp/read-passwd.el +++ /dev/null @@ -1,113 +0,0 @@ -;; read-passwd.el.el --- Read password function for Pterodactyl Gnus. -;; Copyright (C) 1996,97,98 Free Software Foundation, Inc. , Tatsuya Ichikawa -;; Author: Tatsuya Ichikawa -;; Version: 0.01 -;; Keywords: mail , gnus , pop3 , password -;; -;; SPECIAL THANKS -;; Katsumi Yamaoka -;; -;; This file is part of Semi-gnus. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. -;; -;; -(require 'mail-source) -(provide 'read-passwd) - -(defun read-pw-read-passwd (prompt) - (read-pw-read-noecho prompt t)) -;; -(defmacro read-pw-read-char-exclusive () - (cond ((featurep 'xemacs) - '(let ((table (quote ((backspace . ?\C-h) (delete . ?\C-?) - (left . ?\C-h)))) - event key) - (while (not - (and - (key-press-event-p (setq event (next-command-event))) - (setq key (or (event-to-character event) - (cdr (assq (event-key event) table))))))) - key)) - ((fboundp 'read-char-exclusive) - '(read-char-exclusive)) - (t - '(read-char)))) -;; -(defun read-pw-read-noecho (prompt &optional stars) - "Read a single line of text from user without echoing, and return it. -Argument PROMPT ." - (let ((ans "") - (c 0) - (echo-keystrokes 0) - (cursor-in-echo-area t) - (log-message-max-size 0) - message-log-max done msg truncate) - (while (not done) - (if (or (not stars) (string-equal "" ans)) - (setq msg prompt) - (setq msg (concat prompt (make-string (length ans) ?*))) - (setq truncate - (1+ (- (length msg) (window-width (minibuffer-window))))) - (and (> truncate 0) - (setq msg (concat "$" (substring msg (1+ truncate)))))) - (message "%s" msg) - (setq c (read-pw-read-char-exclusive)) - (cond ((eq ?\C-g c) - (setq quit-flag t - done t)) - ((memq c '(?\r ?\n ?\e)) - (setq done t)) - ((eq ?\C-u c) - (setq ans "")) - ((and (/= ?\b c) (/= ?\177 c)) - (setq ans (concat ans (char-to-string c)))) - ((> (length ans) 0) - (setq ans (substring ans 0 -1))))) - (if quit-flag - (prog1 - (setq quit-flag nil) - (message "Quit") - (beep t)) - (message "") - ans))) -;; -(defvar pw nil) -(defun read-pw-set-mail-source-passwd-cache () - (if (not mail-source-password-cache) - (car (mapcar - (lambda (x) - (when (eq 'pop (car x)) - (mail-source-bind (pop x) - (let ((from (format "%s:%s:%s" server user port)) - (mail-source-string - (format "pop:%s@%s" user server))) - (setq pw (read-pw-return-passwd-string user server)) - (unless (assoc user mail-source-password-cache) - (set-alist 'mail-source-password-cache - (format "%s:%s:%s" server user port) - pw)) - (cdr (assoc from mail-source-password-cache)))))) - mail-sources)))) -;; -;; -(defvar passwd nil) -(defun read-pw-return-passwd-string (user server) - (setq passwd (read-pw-read-passwd - (message "POP Password for %s at %s : " user server))) - passwd) -;; -;; read-passwd.el ends here. diff --git a/lisp/rfc1843.el b/lisp/rfc1843.el deleted file mode 100644 index ca0c3ea..0000000 --- a/lisp/rfc1843.el +++ /dev/null @@ -1,185 +0,0 @@ -;;; rfc1843.el --- HZ (rfc1843) decoding -;; Copyright (c) 1998, 1999, 2000 Free Software Foundation, Inc. - -;; Author: Shenghuo Zhu -;; Keywords: news HZ HZ+ mail i18n - -;; This file is a part of GNU Emacs. - -;; GNU Emacs 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, or (at your -;; option) any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; Usage: -;; (require 'rfc1843) -;; (rfc1843-gnus-setup) -;; -;; Test: -;; (rfc1843-decode-string "~{<:Ky2;S{#,NpJ)l6HK!#~}") - -;;; Code: - -(eval-when-compile (require 'cl)) -(require 'mm-util) - -(defvar rfc1843-word-regexp - "~\\({\\([\041-\167][\041-\176]\\| \\)+\\)\\(~}\\|$\\)") - -(defvar rfc1843-word-regexp-strictly - "~\\({\\([\041-\167][\041-\176]\\)+\\)\\(~}\\|$\\)") - -(defvar rfc1843-hzp-word-regexp - "~\\({\\([\041-\167][\041-\176]\\| \\)+\\|\ -[<>]\\([\041-\175][\041-\176]\\| \\)+\\)\\(~}\\|$\\)") - -(defvar rfc1843-hzp-word-regexp-strictly - "~\\({\\([\041-\167][\041-\176]\\)+\\|\ -[<>]\\([\041-\175][\041-\176]\\)+\\)\\(~}\\|$\\)") - -(defcustom rfc1843-decode-loosely nil - "Loosely check HZ encoding if non-nil. -When it is set non-nil, only buffers or strings with strictly -HZ-encoded are decoded." - :type 'boolean - :group 'gnus) - -(defcustom rfc1843-decode-hzp t - "HZ+ decoding support if non-nil. -HZ+ specification (also known as HZP) is to provide a standardized -7-bit representation of mixed Big5, GB, and ASCII text for convenient -e-mail transmission, news posting, etc. -The document of HZ+ 0.78 specification can be found at -ftp://ftp.math.psu.edu/pub/simpson/chinese/hzp/hzp.doc" - :type 'boolean - :group 'gnus) - -(defcustom rfc1843-newsgroups-regexp "chinese\\|hz" - "Regexp of newsgroups in which might be HZ encoded." - :type 'string - :group 'gnus) - -(defun rfc1843-decode-region (from to) - "Decode HZ in the region between FROM and TO." - (interactive "r") - (let (str firstc) - (save-excursion - (goto-char from) - (if (or rfc1843-decode-loosely - (re-search-forward (if rfc1843-decode-hzp - rfc1843-hzp-word-regexp-strictly - rfc1843-word-regexp-strictly) to t)) - (save-restriction - (narrow-to-region from to) - (goto-char (point-min)) - (while (re-search-forward (if rfc1843-decode-hzp - rfc1843-hzp-word-regexp - rfc1843-word-regexp) (point-max) t) - ;;; Text with extents may cause XEmacs crash - (setq str (buffer-substring-no-properties - (match-beginning 1) - (match-end 1))) - (setq firstc (aref str 0)) - (insert (mm-decode-coding-string - (rfc1843-decode - (prog1 - (substring str 1) - (delete-region (match-beginning 0) (match-end 0))) - firstc) - (if (eq firstc ?{) 'cn-gb-2312 'cn-big5)))) - (goto-char (point-min)) - (while (search-forward "~" (point-max) t) - (cond ((eq (char-after) ?\n) - (delete-char -1) - (delete-char 1)) - ((eq (char-after) ?~) - (delete-char 1))))))))) - -(defun rfc1843-decode-string (string) - "Decode HZ STRING and return the results." - (let ((m (mm-multibyte-p))) - (with-temp-buffer - (when m - (mm-enable-multibyte)) - (insert string) - (inline - (rfc1843-decode-region (point-min) (point-max))) - (buffer-string)))) - -(defun rfc1843-decode (word &optional firstc) - "Decode HZ WORD and return it." - (let ((i -1) (s (substring word 0)) v) - (if (or (not firstc) (eq firstc ?{)) - (while (< (incf i) (length s)) - (if (eq (setq v (aref s i)) ? ) nil - (aset s i (+ 128 v)))) - (while (< (incf i) (length s)) - (if (eq (setq v (aref s i)) ? ) nil - (setq v (+ (* 94 v) (aref s (1+ i)) -3135)) - (aset s i (+ (/ v 157) (if (eq firstc ?<) 201 161))) - (setq v (% v 157)) - (aset s (incf i) (+ v (if (< v 63) 64 98)))))) - s)) - -(defun rfc1843-decode-article-body () - "Decode HZ encoded text in the article body." - (if (string-match (concat "\\<\\(" rfc1843-newsgroups-regexp "\\)\\>") - (or gnus-newsgroup-name "")) - (save-excursion - (save-restriction - (message-narrow-to-head) - (let* ((inhibit-point-motion-hooks t) - (case-fold-search t) - (ct (message-fetch-field "Content-Type" t)) - (ctl (and ct (ignore-errors - (mail-header-parse-content-type ct))))) - (if (and ctl (not (string-match "/" (car ctl)))) - (setq ctl nil)) - (goto-char (point-max)) - (widen) - (forward-line 1) - (narrow-to-region (point) (point-max)) - (when (or (not ctl) - (equal (car ctl) "text/plain")) - (rfc1843-decode-region (point) (point-max)))))))) - -(defvar rfc1843-old-gnus-decode-header-function nil) -(defvar gnus-decode-header-methods) -(defvar gnus-decode-encoded-word-methods) -(defvar gnus-decode-encoded-word-function) - -(defun rfc1843-gnus-setup () - "Setup HZ decoding for Gnus." - (require 'gnus-art) - (require 'gnus-sum) - (add-hook 'gnus-article-decode-hook 'rfc1843-decode-article-body t) - (setq gnus-decode-encoded-word-function - 'gnus-multi-decode-encoded-word-string - gnus-decode-header-function - 'gnus-multi-decode-header - gnus-decode-encoded-word-methods - (nconc gnus-decode-encoded-word-methods - (list - (cons (concat "\\<\\(" rfc1843-newsgroups-regexp "\\)\\>") - 'rfc1843-decode-string))) - gnus-decode-header-methods - (nconc gnus-decode-header-methods - (list - (cons (concat "\\<\\(" rfc1843-newsgroups-regexp "\\)\\>") - 'rfc1843-decode-region))))) - -(provide 'rfc1843) - -;;; rfc1843.el ends here diff --git a/lisp/rfc2045.el b/lisp/rfc2045.el deleted file mode 100644 index ba3116b..0000000 --- a/lisp/rfc2045.el +++ /dev/null @@ -1,43 +0,0 @@ -;;; rfc2045.el --- Functions for decoding rfc2045 headers - -;; Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;; RFC 2045 is: "Multipurpose Internet Mail Extensions (MIME) Part -;; One: Format of Internet Message Bodies". - -;;; Commentary: - -;;; Code: - -(require 'ietf-drums) - -(defun rfc2045-encode-string (param value) - "Return and PARAM=VALUE string encoded according to RFC2045." - (if (or (string-match (concat "[" ietf-drums-no-ws-ctl-token "]") value) - (string-match (concat "[" ietf-drums-tspecials "]") value) - (string-match "[ \n\t]" value) - (not (string-match (concat "[" ietf-drums-text-token "]") value))) - (concat param "=" (format "%S" value)) - (concat param "=" value))) - -(provide 'rfc2045) - -;;; rfc2045.el ends here diff --git a/lisp/rfc2047.el b/lisp/rfc2047.el deleted file mode 100644 index 71ac476..0000000 --- a/lisp/rfc2047.el +++ /dev/null @@ -1,562 +0,0 @@ -;;; rfc2047.el --- Functions for encoding and decoding rfc2047 messages -;; Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; MORIOKA Tomohiko -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; RFC 2047 is "MIME (Multipurpose Internet Mail Extensions) Part -;; Three: Message Header Extensions for Non-ASCII Text". - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'qp) -(require 'mm-util) -(require 'ietf-drums) -(require 'mail-prsvr) -(require 'base64) -;; Fixme: Avoid this (for gnus-point-at-...) mm dependence on gnus. -(require 'gnus-util) -(autoload 'mm-body-7-or-8 "mm-bodies") - -(defvar rfc2047-header-encoding-alist - '(("Newsgroups" . nil) - ("Message-ID" . nil) - ("\\(Resent-\\)?\\(From\\|Cc\\|To\\|Bcc\\|Reply-To\\|Sender\\)" . - "-A-Za-z0-9!*+/=_") - (t . mime)) - "*Header/encoding method alist. -The list is traversed sequentially. The keys can either be -header regexps or t. - -The values can be: - -1) nil, in which case no encoding is done; -2) `mime', in which case the header will be encoded according to RFC2047; -3) a charset, in which case it will be encoded as that charset; -4) `default', in which case the field will be encoded as the rest - of the article. -5) a string, like `mime', expect for using it as word-chars.") - -(defvar rfc2047-charset-encoding-alist - '((us-ascii . nil) - (iso-8859-1 . Q) - (iso-8859-2 . Q) - (iso-8859-3 . Q) - (iso-8859-4 . Q) - (iso-8859-5 . B) - (koi8-r . B) - (iso-8859-7 . Q) - (iso-8859-8 . Q) - (iso-8859-9 . Q) - (iso-8859-14 . Q) - (iso-8859-15 . Q) - (iso-2022-jp . B) - (iso-2022-kr . B) - (gb2312 . B) - (big5 . B) - (cn-big5 . B) - (cn-gb . B) - (cn-gb-2312 . B) - (euc-kr . B) - (iso-2022-jp-2 . B) - (iso-2022-int-1 . B)) - "Alist of MIME charsets to RFC2047 encodings. -Valid encodings are nil, `Q' and `B'.") - -(defvar rfc2047-encoding-function-alist - '((Q . rfc2047-q-encode-region) - (B . rfc2047-b-encode-region) - (nil . ignore)) - "Alist of RFC2047 encodings to encoding functions.") - -(defvar rfc2047-q-encoding-alist - '(("\\(Resent-\\)?\\(From\\|Cc\\|To\\|Bcc\\|Reply-To\\|Sender\\):" - . "-A-Za-z0-9!*+/" ) - ;; = (\075), _ (\137), ? (\077) are used in the encoded word. - ;; Avoid using 8bit characters. - ;; Equivalent to "^\000-\007\011\013\015-\037\200-\377=_?" - ("." . "\010\012\014\040-\074\076\100-\136\140-\177")) - "Alist of header regexps and valid Q characters.") - -;;; -;;; Functions for encoding RFC2047 messages -;;; - -(defun rfc2047-narrow-to-field () - "Narrow the buffer to the header on the current line." - (beginning-of-line) - (narrow-to-region - (point) - (progn - (forward-line 1) - (if (re-search-forward "^[^ \n\t]" nil t) - (progn - (beginning-of-line) - (point)) - (point-max)))) - (goto-char (point-min))) - -(defun rfc2047-encode-message-header () - "Encode the message header according to `rfc2047-header-encoding-alist'. -Should be called narrowed to the head of the message." - (interactive "*") - (save-excursion - (goto-char (point-min)) - (let (alist elem method) - (while (not (eobp)) - (save-restriction - (rfc2047-narrow-to-field) - (if (not (rfc2047-encodable-p)) - (prog1 - (if (and (eq (mm-body-7-or-8) '8bit) - (mm-multibyte-p) - (mm-coding-system-p - (car message-posting-charset))) - ;; 8 bit must be decoded. - ;; Is message-posting-charset a coding system? - (mm-encode-coding-region - (point-min) (point-max) - (car message-posting-charset))) - ;; No encoding necessary, but folding is nice - (rfc2047-fold-region (save-excursion - (goto-char (point-min)) - (skip-chars-forward "^:") - (and (looking-at ": ") - (forward-char 2)) - (point)) (point-max))) - ;; We found something that may perhaps be encoded. - (setq method nil - alist rfc2047-header-encoding-alist) - (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 - ((stringp method) - (rfc2047-encode-region (point-min) (point-max) method)) - ((eq method 'mime) - (rfc2047-encode-region (point-min) (point-max))) - ((eq method 'default) - (if (and (featurep 'mule) - (if (boundp 'default-enable-multibyte-characters) - default-enable-multibyte-characters) - mail-parse-charset) - (mm-encode-coding-region (point-min) (point-max) - mail-parse-charset))) - ((null method) - (and (delq 'ascii - (mm-find-charset-region (point-min) - (point-max))) - (if (or (message-options-get - 'rfc2047-encode-message-header-encode-any) - (message-options-set - 'rfc2047-encode-message-header-encode-any - (y-or-n-p - "Some texts are not encoded. Encode anyway?"))) - (rfc2047-encode-region (point-min) (point-max)) - (error "Cannot send unencoded text")))) - ((mm-coding-system-p method) - (if (and (featurep 'mule) - (if (boundp 'default-enable-multibyte-characters) - default-enable-multibyte-characters)) - (mm-encode-coding-region (point-min) (point-max) method))) - ;; Hm. - (t))) - (goto-char (point-max))))))) - -;; Fixme: This, and the require below may not be the Right Thing, but -;; should be safe just before release. -- fx 2001-02-08 -(eval-when-compile (defvar message-posting-charset)) - -(defun rfc2047-encodable-p () - "Return non-nil if any characters in current buffer need encoding in headers. -The buffer may be narrowed." - (require 'message) ; for message-posting-charset - (let ((charsets - (mapcar - 'mm-mime-charset - (mm-find-charset-region (point-min) (point-max)))) - (cs (list 'us-ascii (car message-posting-charset))) - found) - (while charsets - (unless (memq (pop charsets) cs) - (setq found t))) - found)) - -(defun rfc2047-dissect-region (b e &optional word-chars) - "Dissect the region between B and E into words." - (unless word-chars - ;; Anything except most CTLs, WSP - (setq word-chars "\010\012\014\041-\177")) - (let (mail-parse-mule-charset - words point current - result word) - (save-restriction - (narrow-to-region b e) - (goto-char (point-min)) - (skip-chars-forward "\000-\177") - (while (not (eobp)) - (setq point (point)) - (skip-chars-backward word-chars b) - (unless (eq b (point)) - (push (cons (buffer-substring b (point)) nil) words)) - (setq b (point)) - (goto-char point) - (setq current (mm-charset-after)) - (forward-char 1) - (skip-chars-forward word-chars) - (while (and (not (eobp)) - (eq (mm-charset-after) current)) - (forward-char 1) - (skip-chars-forward word-chars)) - (unless (eq b (point)) - (push (cons (buffer-substring b (point)) current) words)) - (setq b (point)) - (skip-chars-forward "\000-\177")) - (unless (eq b (point)) - (push (cons (buffer-substring b (point)) nil) words))) - ;; merge adjacent words - (setq word (pop words)) - (while word - (if (and (cdr word) - (caar words) - (not (cdar words)) - (not (string-match "[^ \t]" (caar words)))) - (if (eq (cdr (nth 1 words)) (cdr word)) - (progn - (setq word (cons (concat - (car (nth 1 words)) (caar words) - (car word)) - (cdr word))) - (pop words) - (pop words)) - (push (cons (concat (caar words) (car word)) (cdr word)) - result) - (pop words) - (setq word (pop words))) - (push word result) - (setq word (pop words)))) - result)) - -(defun rfc2047-encode-region (b e &optional word-chars) - "Encode all encodable words in region B to E." - (let ((words (rfc2047-dissect-region b e word-chars)) word) - (save-restriction - (narrow-to-region b e) - (delete-region (point-min) (point-max)) - (while (setq word (pop words)) - (if (not (cdr word)) - (insert (car word)) - (rfc2047-fold-region (gnus-point-at-bol) (point)) - (goto-char (point-max)) - (if (> (- (point) (save-restriction - (widen) - (gnus-point-at-bol))) 76) - (insert "\n ")) - ;; Insert blank between encoded words - (if (eq (char-before) ?=) (insert " ")) - (rfc2047-encode (point) - (progn (insert (car word)) (point)) - (cdr word)))) - (rfc2047-fold-region (point-min) (point-max))))) - -(defun rfc2047-encode-string (string &optional word-chars) - "Encode words in STRING." - (with-temp-buffer - (insert string) - (rfc2047-encode-region (point-min) (point-max) word-chars) - (buffer-string))) - -(defun rfc2047-encode (b e charset) - "Encode the word in the region B to E with CHARSET." - (let* ((mime-charset (mm-mime-charset charset)) - (cs (mm-charset-to-coding-system mime-charset)) - (encoding (or (cdr (assq mime-charset - rfc2047-charset-encoding-alist)) - 'B)) - (start (concat - "=?" (downcase (symbol-name mime-charset)) "?" - (downcase (symbol-name encoding)) "?")) - (first t)) - (save-restriction - (narrow-to-region b e) - (when (eq encoding 'B) - ;; break into lines before encoding - (goto-char (point-min)) - (while (not (eobp)) - (goto-char (min (point-max) (+ 15 (point)))) - (unless (eobp) - (insert "\n")))) - (if (and (mm-multibyte-p) - (mm-coding-system-p cs)) - (mm-encode-coding-region (point-min) (point-max) cs)) - (funcall (cdr (assq encoding rfc2047-encoding-function-alist)) - (point-min) (point-max)) - (goto-char (point-min)) - (while (not (eobp)) - (unless first - (insert " ")) - (setq first nil) - (insert start) - (end-of-line) - (insert "?=") - (forward-line 1))))) - -(defun rfc2047-fold-region (b e) - "Fold long lines in region B to E." - (save-restriction - (narrow-to-region b e) - (goto-char (point-min)) - (let ((break nil) - (qword-break nil) - (bol (save-restriction - (widen) - (gnus-point-at-bol)))) - (while (not (eobp)) - (when (and (or break qword-break) (> (- (point) bol) 76)) - (goto-char (or break qword-break)) - (setq break nil - qword-break nil) - (if (looking-at "[ \t]") - (insert "\n") - (insert "\n ")) - (setq bol (1- (point))) - ;; Don't break before the first non-LWSP characters. - (skip-chars-forward " \t") - (unless (eobp) (forward-char 1))) - (cond - ((eq (char-after) ?\n) - (forward-char 1) - (setq bol (point) - break nil - qword-break nil) - (skip-chars-forward " \t") - (unless (or (eobp) (eq (char-after) ?\n)) - (forward-char 1))) - ((eq (char-after) ?\r) - (forward-char 1)) - ((memq (char-after) '(? ?\t)) - (skip-chars-forward " \t") - (setq break (1- (point)))) - ((not break) - (if (not (looking-at "=\\?[^=]")) - (if (eq (char-after) ?=) - (forward-char 1) - (skip-chars-forward "^ \t\n\r=")) - (setq qword-break (point)) - (skip-chars-forward "^ \t\n\r"))) - (t - (skip-chars-forward "^ \t\n\r")))) - (when (and (or break qword-break) (> (- (point) bol) 76)) - (goto-char (or break qword-break)) - (setq break nil - qword-break nil) - (if (looking-at "[ \t]") - (insert "\n") - (insert "\n ")) - (setq bol (1- (point))) - ;; Don't break before the first non-LWSP characters. - (skip-chars-forward " \t") - (unless (eobp) (forward-char 1)))))) - -(defun rfc2047-unfold-region (b e) - "Unfold lines in region B to E." - (save-restriction - (narrow-to-region b e) - (goto-char (point-min)) - (let ((bol (save-restriction - (widen) - (gnus-point-at-bol))) - (eol (gnus-point-at-eol)) - leading) - (forward-line 1) - (while (not (eobp)) - (looking-at "[ \t]*") - (setq leading (- (match-end 0) (match-beginning 0))) - (if (< (- (gnus-point-at-eol) bol leading) 76) - (progn - (goto-char eol) - (delete-region eol (progn - (skip-chars-forward " \t\n\r") - (1- (point))))) - (setq bol (gnus-point-at-bol))) - (setq eol (gnus-point-at-eol)) - (forward-line 1))))) - -(defun rfc2047-b-encode-region (b e) - "Base64-encode the header contained in region B to E." - (save-restriction - (narrow-to-region (goto-char b) e) - (while (not (eobp)) - (base64-encode-region (point) (progn (end-of-line) (point)) t) - (if (and (bolp) (eolp)) - (delete-backward-char 1)) - (forward-line)))) - -(defun rfc2047-q-encode-region (b e) - "Quoted-printable-encode the header in region B to E." - (save-excursion - (save-restriction - (narrow-to-region (goto-char b) e) - (let ((alist rfc2047-q-encoding-alist) - (bol (save-restriction - (widen) - (gnus-point-at-bol)))) - (while alist - (when (looking-at (caar alist)) - (mm-with-unibyte-current-buffer-mule4 - (quoted-printable-encode-region - (point-min) (point-max) nil (cdar alist))) - (subst-char-in-region (point-min) (point-max) ? ?_) - (setq alist nil)) - (pop alist)) - ;; The size of QP encapsulation is about 20, so set limit to - ;; 56=76-20. - (unless (< (- (point-max) (point-min)) 56) - ;; Don't break if it could fit in one line. - ;; Let rfc2047-encode-region break it later. - (goto-char (1+ (point-min))) - (while (and (not (bobp)) (not (eobp))) - (goto-char (min (point-max) (+ 56 bol))) - (search-backward "=" (- (point) 2) t) - (unless (or (bobp) (eobp)) - (insert "\n") - (setq bol (point))))))))) - -;;; -;;; Functions for decoding RFC2047 messages -;;; - -(defvar rfc2047-encoded-word-regexp - "=\\?\\([^][\000-\040()<>@,\;:\\\"/?.=]+\\)\\?\\(B\\|Q\\)\\?\\([!->@-~ +]*\\)\\?=") - -(defun rfc2047-decode-region (start end) - "Decode MIME-encoded words in region between START and END." - (interactive "r") - (let ((case-fold-search t) - b e) - (save-excursion - (save-restriction - (narrow-to-region start end) - (goto-char (point-min)) - ;; Remove whitespace between encoded words. - (while (re-search-forward - (concat "\\(" rfc2047-encoded-word-regexp "\\)" - "\\(\n?[ \t]\\)+" - "\\(" rfc2047-encoded-word-regexp "\\)") - nil t) - (delete-region (goto-char (match-end 1)) (match-beginning 6))) - ;; Decode the encoded words. - (setq b (goto-char (point-min))) - (while (re-search-forward rfc2047-encoded-word-regexp nil t) - (setq e (match-beginning 0)) - (insert (rfc2047-parse-and-decode - (prog1 - (match-string 0) - (delete-region (match-beginning 0) (match-end 0))))) - (when (and (mm-multibyte-p) - mail-parse-charset - (not (eq mail-parse-charset 'gnus-decoded))) - (mm-decode-coding-region b e mail-parse-charset)) - (setq b (point))) - (when (and (mm-multibyte-p) - mail-parse-charset - (not (eq mail-parse-charset 'us-ascii)) - (not (eq mail-parse-charset 'gnus-decoded))) - (mm-decode-coding-region b (point-max) mail-parse-charset)) - (rfc2047-unfold-region (point-min) (point-max)))))) - -(defun rfc2047-decode-string (string) - "Decode the quoted-printable-encoded STRING and return the results." - (let ((m (mm-multibyte-p))) - (with-temp-buffer - (when m - (mm-enable-multibyte)) - (insert string) - (inline - (rfc2047-decode-region (point-min) (point-max))) - (buffer-string)))) - -(defun rfc2047-parse-and-decode (word) - "Decode WORD and return it if it is an encoded word. -Return WORD if not." - (if (not (string-match rfc2047-encoded-word-regexp word)) - word - (or - (condition-case nil - (rfc2047-decode - (match-string 1 word) - (upcase (match-string 2 word)) - (match-string 3 word)) - (error word)) - word))) - -(defun rfc2047-pad-base64 (string) - "Pad STRING to quartets." - ;; Be more liberal to accept buggy base64 strings. If - ;; base64-decode-string accepts buggy strings, this function could - ;; be aliased to identity. - (case (mod (length string) 4) - (0 string) - (1 string) ;; Error, don't pad it. - (2 (concat string "==")) - (3 (concat string "=")))) - -(defun rfc2047-decode (charset encoding string) - "Decode STRING from the given MIME CHARSET in the given ENCODING. -Valid ENCODINGs are \"B\" and \"Q\". -If your Emacs implementation can't decode CHARSET, return nil." - (if (stringp charset) - (setq charset (intern (downcase charset)))) - (if (or (not charset) - (eq 'gnus-all mail-parse-ignored-charsets) - (memq 'gnus-all mail-parse-ignored-charsets) - (memq charset mail-parse-ignored-charsets)) - (setq charset mail-parse-charset)) - (let ((cs (mm-charset-to-coding-system charset))) - (if (and (not cs) charset - (listp mail-parse-ignored-charsets) - (memq 'gnus-unknown mail-parse-ignored-charsets)) - (setq cs (mm-charset-to-coding-system mail-parse-charset))) - (when cs - (when (and (eq cs 'ascii) - mail-parse-charset) - (setq cs mail-parse-charset)) - (mm-with-unibyte-current-buffer-mule4 - ;; In Emacs Mule 4, decoding UTF-8 should be in unibyte mode. - (mm-decode-coding-string - (cond - ((equal "B" encoding) - (base64-decode-string - (rfc2047-pad-base64 string))) - ((equal "Q" encoding) - (quoted-printable-decode-string - (mm-replace-chars-in-string string ?_ ? ))) - (t (error "Invalid encoding: %s" encoding))) - cs))))) - -(provide 'rfc2047) - -;;; rfc2047.el ends here diff --git a/lisp/rfc2104.el b/lisp/rfc2104.el deleted file mode 100644 index 5496a4f..0000000 --- a/lisp/rfc2104.el +++ /dev/null @@ -1,117 +0,0 @@ -;;; rfc2104.el --- RFC2104 Hashed Message Authentication Codes -;; Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. - -;; Author: Simon Josefsson -;; Keywords: mail - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; This is a quick'n'dirty, low performance, implementation of RFC2104. -;;; -;;; Example: -;;; -;;; (require 'md5) -;;; (rfc2104-hash 'md5 64 16 "Jefe" "what do ya want for nothing?") -;;; "750c783e6ab0b503eaa86e310a5db738" -;;; -;;; (require 'sha-1) -;;; (rfc2104-hash 'sha1-encode 64 20 "Jefe" "what do ya want for nothing?") -;;; "effcdf6ae5eb2fa2d27416d5f184df9c259a7c79" -;;; -;;; 64 is block length of hash function (64 for MD5 and SHA), 16 is -;;; resulting hash length (16 for MD5, 20 for SHA). -;;; -;;; Tested with Emacs 20.2 and XEmacs 20.3. -;;; -;;; Test case reference: RFC 2202. - -;;; Release history: -;;; -;;; 1998-08-16 initial release posted to gnu.emacs.sources -;;; 1998-08-17 use append instead of char-list-to-string -;;; 1998-08-26 don't require hexl -;;; 1998-09-25 renamed from hmac.el to rfc2104.el, also renamed functions -;;; 1999-10-23 included in pgnus -;;; 2000-08-15 `rfc2104-hexstring-to-bitstring' -;;; 2000-05-12 added sha-1 example, added test case reference - -;;; Code: - -(eval-when-compile (require 'cl)) - -;; Magic character for inner HMAC round. 0x36 == 54 == '6' -(defconst rfc2104-ipad ?\x36) - -;; Magic character for outer HMAC round. 0x5C == 92 == '\' -(defconst rfc2104-opad ?\x5C) - -;; Not so magic character for padding the key. 0x00 -(defconst rfc2104-zero ?\x00) - -;; Alist for converting hex to decimal. -(defconst rfc2104-hex-alist - '((?0 . 0) (?a . 10) (?A . 10) - (?1 . 1) (?b . 11) (?B . 11) - (?2 . 2) (?c . 12) (?C . 12) - (?3 . 3) (?d . 13) (?D . 13) - (?4 . 4) (?e . 14) (?E . 14) - (?5 . 5) (?f . 15) (?F . 15) - (?6 . 6) - (?7 . 7) - (?8 . 8) - (?9 . 9))) - -(defun rfc2104-hex-to-int (str) - (if str - (if (listp str) - (+ (* 16 (rfc2104-hex-to-int (cdr str))) - (cdr (assoc (car str) rfc2104-hex-alist))) - (rfc2104-hex-to-int (reverse (append str nil)))) - 0)) - -(defun rfc2104-hexstring-to-bitstring (str) - (let (out) - (while (< 0 (length str)) - (push (rfc2104-hex-to-int (substring str -2)) out) - (setq str (substring str 0 -2))) - (concat out))) - -(defun rfc2104-hash (hash block-length hash-length key text) - (let* (;; if key is longer than B, reset it to HASH(key) - (key (if (> (length key) block-length) - (funcall hash key) key)) - (k_ipad (append key nil)) - (k_opad (append key nil))) - ;; zero pad k_ipad/k_opad - (while (< (length k_ipad) block-length) - (setq k_ipad (append k_ipad (list rfc2104-zero)))) - (while (< (length k_opad) block-length) - (setq k_opad (append k_opad (list rfc2104-zero)))) - ;; XOR key with ipad/opad into k_ipad/k_opad - (setq k_ipad (mapcar (lambda (c) (logxor c rfc2104-ipad)) k_ipad)) - (setq k_opad (mapcar (lambda (c) (logxor c rfc2104-opad)) k_opad)) - ;; perform outer hash - (funcall hash (concat k_opad (rfc2104-hexstring-to-bitstring - ;; perform inner hash - (funcall hash (concat k_ipad text))))))) - -(provide 'rfc2104) - -;;; rfc2104.el ends here diff --git a/lisp/rfc2231.el b/lisp/rfc2231.el deleted file mode 100644 index 2fcf7e2..0000000 --- a/lisp/rfc2231.el +++ /dev/null @@ -1,222 +0,0 @@ -;;; rfc2231.el --- Functions for decoding rfc2231 headers - -;; Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'gnus-clfns)) - -(eval-when-compile (require 'cl)) -(require 'ietf-drums) -(require 'rfc2047) - -(defun rfc2231-get-value (ct attribute) - "Return the value of ATTRIBUTE from CT." - (cdr (assq attribute (cdr ct)))) - -(defun rfc2231-parse-qp-string (string) - "Parse QP-encoded string using `rfc2231-parse-string'. -N.B. This is in violation with RFC2047, but it seem to be in common use." - (rfc2231-parse-string (rfc2047-decode-string string))) - -(defun rfc2231-parse-string (string) - "Parse STRING and return a list. -The list will be on the form - `(name (attribute . value) (attribute . value)...)" - (with-temp-buffer - (let ((ttoken (ietf-drums-token-to-list ietf-drums-text-token)) - (stoken (ietf-drums-token-to-list ietf-drums-tspecials)) - (ntoken (ietf-drums-token-to-list "0-9")) - (prev-value "") - display-name mailbox c display-string parameters - attribute value type subtype number encoded - prev-attribute) - (ietf-drums-init (mail-header-remove-whitespace - (mail-header-remove-comments string))) - (let ((table (copy-syntax-table ietf-drums-syntax-table))) - (modify-syntax-entry ?\' "w" table) - ;; The following isn't valid, but one should be liberal - ;; in what one receives. - (modify-syntax-entry ?\: "w" table) - (set-syntax-table table)) - (setq c (char-after)) - (when (and (memq c ttoken) - (not (memq c stoken))) - (setq type (downcase (buffer-substring - (point) (progn (forward-sexp 1) (point))))) - ;; Do the params - (while (not (eobp)) - (setq c (char-after)) - (unless (eq c ?\;) - (error "Invalid header: %s" string)) - (forward-char 1) - ;; If c in nil, then this is an invalid header, but - ;; since elm generates invalid headers on this form, - ;; we allow it. - (when (setq c (char-after)) - (if (and (memq c ttoken) - (not (memq c stoken))) - (setq attribute - (intern - (downcase - (buffer-substring - (point) (progn (forward-sexp 1) (point)))))) - (error "Invalid header: %s" string)) - (setq c (char-after)) - (setq encoded nil) - (when (eq c ?*) - (forward-char 1) - (setq c (char-after)) - (if (not (memq c ntoken)) - (setq encoded t - number nil) - (setq number - (string-to-number - (buffer-substring - (point) (progn (forward-sexp 1) (point))))) - (setq c (char-after)) - (when (eq c ?*) - (setq encoded t) - (forward-char 1) - (setq c (char-after))))) - ;; See if we have any previous continuations. - (when (and prev-attribute - (not (eq prev-attribute attribute))) - (push (cons prev-attribute prev-value) parameters) - (setq prev-attribute nil - prev-value "")) - (unless (eq c ?=) - (error "Invalid header: %s" string)) - (forward-char 1) - (setq c (char-after)) - (cond - ((eq c ?\") - (setq value - (buffer-substring (1+ (point)) - (progn (forward-sexp 1) (1- (point)))))) - ((and (memq c ttoken) - (not (memq c stoken))) - (setq value (buffer-substring - (point) (progn (forward-sexp 1) (point))))) - (t - (error "Invalid header: %s" string))) - (when encoded - (setq value (rfc2231-decode-encoded-string value))) - (if number - (setq prev-attribute attribute - prev-value (concat prev-value value)) - (push (cons attribute value) parameters)))) - - ;; Take care of any final continuations. - (when prev-attribute - (push (cons prev-attribute prev-value) parameters)) - - (when type - `(,type ,@(nreverse parameters))))))) - -(defun rfc2231-decode-encoded-string (string) - "Decode an RFC2231-encoded string. -These look like \"us-ascii'en-us'This%20is%20%2A%2A%2Afun%2A%2A%2A\"." - (with-temp-buffer - (let ((elems (split-string string "'"))) - ;; The encoded string may contain zero to two single-quote - ;; marks. This should give us the encoded word stripped - ;; of any preceding values. - (insert (car (last elems))) - (goto-char (point-min)) - (while (search-forward "%" nil t) - (insert - (prog1 - (string-to-number (buffer-substring (point) (+ (point) 2)) 16) - (delete-region (1- (point)) (+ (point) 2))))) - ;; Encode using the charset, if any. - (when (and (mm-multibyte-p) - (> (length elems) 1) - (not (equal (intern (car elems)) 'us-ascii))) - (mm-decode-coding-region (point-min) (point-max) - (intern (car elems)))) - (buffer-string)))) - -(defun rfc2231-encode-string (param value) - "Return and PARAM=VALUE string encoded according to RFC2231." - (let ((control (ietf-drums-token-to-list ietf-drums-no-ws-ctl-token)) - (tspecial (ietf-drums-token-to-list ietf-drums-tspecials)) - (special (ietf-drums-token-to-list "*'%\n\t")) - (ascii (ietf-drums-token-to-list ietf-drums-text-token)) - (num -1) - spacep encodep charsetp charset broken) - (with-temp-buffer - (insert value) - (goto-char (point-min)) - (while (not (eobp)) - (cond - ((or (memq (following-char) control) - (memq (following-char) tspecial) - (memq (following-char) special)) - (setq encodep t)) - ((eq (following-char) ? ) - (setq spacep t)) - ((not (memq (following-char) ascii)) - (setq charsetp t))) - (forward-char 1)) - (when charsetp - (setq charset (mm-encode-body))) - (cond - ((or encodep charsetp) - (goto-char (point-min)) - (while (not (eobp)) - (when (> (current-column) 60) - (insert ";\n") - (setq broken t)) - (if (or (not (memq (following-char) ascii)) - (memq (following-char) control) - (memq (following-char) tspecial) - (memq (following-char) special) - (eq (following-char) ? )) - (progn - (insert "%" (format "%02x" (following-char))) - (delete-char 1)) - (forward-char 1))) - (goto-char (point-min)) - (insert (symbol-name (or charset 'us-ascii)) "''") - (goto-char (point-min)) - (if (not broken) - (insert param "*=") - (while (not (eobp)) - (insert (if (>= num 0) " " "\n ") - param "*" (format "%d" (incf num)) "*=") - (forward-line 1)))) - (spacep - (goto-char (point-min)) - (insert param "=\"") - (goto-char (point-max)) - (insert "\"")) - (t - (goto-char (point-min)) - (insert param "="))) - (buffer-string)))) - -(provide 'rfc2231) - -;;; rfc2231.el ends here diff --git a/lisp/score-mode.el b/lisp/score-mode.el deleted file mode 100644 index 1555df9..0000000 --- a/lisp/score-mode.el +++ /dev/null @@ -1,115 +0,0 @@ -;;; score-mode.el --- mode for editing Gnus score files -;; Copyright (C) 1996 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news, mail - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'static)) - -(defvar gnus-score-mode-hook nil - "*Hook run in score mode buffers.") - -(defvar gnus-score-menu-hook nil - "*Hook run after creating the score mode menu.") - -(defvar gnus-score-edit-exit-function nil - "Function run on exit from the score buffer.") - -(defvar gnus-score-mode-map nil) -(unless gnus-score-mode-map - (setq gnus-score-mode-map (make-sparse-keymap)) - (set-keymap-parent gnus-score-mode-map emacs-lisp-mode-map) - (define-key gnus-score-mode-map "\C-c\C-c" 'gnus-score-edit-exit) - (define-key gnus-score-mode-map "\C-c\C-d" 'gnus-score-edit-insert-date) - (define-key gnus-score-mode-map "\C-c\C-p" 'gnus-score-pretty-print)) - -(defvar score-mode-syntax-table - (let ((table (copy-syntax-table lisp-mode-syntax-table))) - (modify-syntax-entry ?| "w" table) - table) - "Syntax table used in score-mode buffers.") - -(defvar score-mode-coding-system (static-if (boundp 'MULE) - '*ctext* - 'ctext)) - -;;;###autoload -(defun gnus-score-mode () - "Mode for editing Gnus score files. -This mode is an extended emacs-lisp mode. - -\\{gnus-score-mode-map}" - (interactive) - (kill-all-local-variables) - (use-local-map gnus-score-mode-map) - (gnus-score-make-menu-bar) - (set-syntax-table score-mode-syntax-table) - (setq major-mode 'gnus-score-mode) - (setq mode-name "Score") - (lisp-mode-variables nil) - (make-local-variable 'gnus-score-edit-exit-function) - (run-hooks 'emacs-lisp-mode-hook 'gnus-score-mode-hook)) - -(defun gnus-score-make-menu-bar () - (unless (boundp 'gnus-score-menu) - (easy-menu-define - gnus-score-menu gnus-score-mode-map "" - '("Score" - ["Exit" gnus-score-edit-exit t] - ["Insert date" gnus-score-edit-insert-date t] - ["Format" gnus-score-pretty-print t])) - (run-hooks 'gnus-score-menu-hook))) - -(defun gnus-score-edit-insert-date () - "Insert date in numerical format." - (interactive) - (princ (time-to-days (current-time)) (current-buffer))) - -(defun gnus-score-pretty-print () - "Format the current score file." - (interactive) - (goto-char (point-min)) - (let ((form (read (current-buffer)))) - (erase-buffer) - (let ((emacs-lisp-mode-syntax-table score-mode-syntax-table)) - (pp form (current-buffer)))) - (goto-char (point-min))) - -(defun gnus-score-edit-exit () - "Stop editing the score file." - (interactive) - (unless (file-exists-p (file-name-directory (buffer-file-name))) - (make-directory (file-name-directory (buffer-file-name)) t)) - (save-buffer-as-coding-system score-mode-coding-system) - (bury-buffer (current-buffer)) - (let ((buf (current-buffer))) - (when gnus-score-edit-exit-function - (funcall gnus-score-edit-exit-function)) - (when (eq buf (current-buffer)) - (switch-to-buffer (other-buffer (current-buffer)))))) - -(provide 'score-mode) - -;;; score-mode.el ends here diff --git a/lisp/smiley-ems.el b/lisp/smiley-ems.el deleted file mode 100644 index f2c28f0..0000000 --- a/lisp/smiley-ems.el +++ /dev/null @@ -1,157 +0,0 @@ -;;; smiley-ems.el --- displaying smiley faces - -;; Copyright (C) 2000 Free Software Foundation, Inc. - -;; Author: Dave Love -;; Keywords: news mail multimedia - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; A re-written, simplified version of Wes Hardaker's XEmacs smiley.el -;; which might be merged back to smiley.el if we get an assignment for -;; that. We don't have assignments for the images smiley.el uses, but -;; I'm not sure we need that degree of rococoness and defaults like a -;; yellow background. Also, using PBM means we can display the images -;; more generally. -- fx - -;;; Test smileys: :-) :-\ :-( :-/ - -;;; Code: - -(eval-when-compile (require 'cl)) -(require 'nnheader) - -(defgroup smiley nil - "Turn :-)'s into real images." - :group 'gnus-visual) - -;; Maybe this should go. -(defcustom smiley-data-directory (nnheader-find-etc-directory "smilies") - "*Location of the smiley faces files." - :type 'directory - :group 'smiley) - -;; The XEmacs version has a baroque, if not rococo, set of these. -(defcustom smiley-regexp-alist - ;; Perhaps :-) should be distinct -- it does appear in the Jargon File. - '(("\\([:;]-?)\\)\\W" 1 "smile.pbm") - ("\\(:-[/\\]\\)\\W" 1 "wry.pbm") - ("\\(:-[({]\\)\\W" 1 "frown.pbm")) - "*A list of regexps to map smilies to images. -The elements are (REGEXP MATCH FILE), where MATCH is the submatch in -rgexp to replace with IMAGE. IMAGE is the name of a PBM file in -`smiley-data-directory'." - :type '(repeat (list regexp - (integer :tag "Regexp match number") - (string :tag "Image name"))) - :set (lambda (symbol value) - (set-default symbol value) - (smiley-update-cache)) - :initialize 'custom-initialize-default - :group 'smiley) - -(defvar smiley-cached-regexp-alist nil) - -(defun smiley-update-cache () - (dolist (elt (if (symbolp smiley-regexp-alist) - (symbol-value smiley-regexp-alist) - smiley-regexp-alist)) - (let* ((data-directory smiley-data-directory) - (image (find-image (list (list :type 'pbm - :file (nth 2 elt) - :ascent 'center))))) - (if image - (push (list (car elt) (cadr elt) image) - smiley-cached-regexp-alist))))) - -(defvar smiley-active nil - "Non-nil means smilies in the buffer will be displayed.") -(make-variable-buffer-local 'smiley-active) - -(defvar smiley-mouse-map - (let ((map (make-sparse-keymap))) - (define-key map [down-mouse-2] 'ignore) ; override widget - (define-key map [mouse-2] - 'smiley-mouse-toggle-buffer) - map)) - -(defun smiley-region (start end) - "Replace in the region `smiley-regexp-alist' matches with corresponding images." - (interactive "r") - (when (and (fboundp 'display-graphic-p) - (display-graphic-p)) - (mapcar (lambda (o) - (if (eq 'smiley (overlay-get o 'smiley)) - (delete-overlay o))) - (overlays-in start end)) - (unless smiley-cached-regexp-alist - (smiley-update-cache)) - (save-excursion - (let ((beg (or start (point-min))) - group overlay image) - (dolist (entry smiley-cached-regexp-alist) - (setq group (nth 1 entry) - image (nth 2 entry)) - (goto-char beg) - (while (re-search-forward (car entry) end t) - (when image - (setq overlay (make-overlay (match-beginning group) - (match-end group))) - (overlay-put overlay - 'display `(when smiley-active ,@image)) - (overlay-put overlay 'mouse-face 'highlight) - (overlay-put overlay 'smiley t) - (overlay-put overlay - 'help-echo "mouse-2: toggle smilies in buffer") - (overlay-put overlay 'keymap smiley-mouse-map)))))) - (setq smiley-active t))) - -(defun smiley-toggle-buffer (&optional arg) - "Toggle displaying smiley faces. -With arg, turn displaying on if and only if arg is positive." - (interactive "P") - (if (numberp arg) - (setq smiley-active (> arg 0)) - (setq smiley-active (not smiley-active)))) - -(defun smiley-mouse-toggle-buffer (event) - "Toggle displaying smiley faces. -With arg, turn displaying on if and only if arg is positive." - (interactive "e") - (save-excursion - (save-window-excursion - (mouse-set-point event) - (smiley-toggle-buffer)))) - -(eval-when-compile (defvar gnus-article-buffer)) - -(defun gnus-smiley-display (&optional arg) - "Display textual emoticaons (\"smilies\") as small graphical icons. -With arg, turn displaying on if and only if arg is positive." - (interactive "P") - (save-excursion - (article-goto-body) - (smiley-region (point) (point-max)) - (if (and (numberp arg) (<= arg 0)) - (smiley-toggle-buffer arg)))) - -(provide 'smiley) - -;;; smiley-ems.el ends here diff --git a/lisp/smiley.el b/lisp/smiley.el deleted file mode 100644 index ad255e6..0000000 --- a/lisp/smiley.el +++ /dev/null @@ -1,441 +0,0 @@ -;;; smiley.el --- displaying smiley faces -;; Copyright (C) 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Wes Hardaker -;; Keywords: fun - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; -;; comments go here. -;; - -;;; Test smileys: :-] :-o :-) ;-) :-\ :-| :-d :-P 8-| :-( - -;; To use: -;; (require 'smiley) -;; (setq gnus-treat-display-smileys t) - -;; The smilies were drawn by Joe Reiss . - -;;; Code: - -(eval-when-compile (require 'cl)) -(require 'custom) - -(eval-and-compile - (when (featurep 'xemacs) - (require 'annotations) - (require 'messagexmas))) - -(defgroup smiley nil - "Turn :-)'s into real images." - :group 'gnus-visual) - -;; FIXME: Where is the directory when using Emacs? -(defcustom smiley-data-directory - (if (featurep 'xemacs) - (message-xmas-find-glyph-directory "smilies") - "/usr/local/lib/xemacs/xemacs-packages/etc/smilies") - "*Location of the smiley faces files." - :type 'directory - :group 'smiley) - -;; Notice the subtle differences in the regular expressions in the -;; two alists below. - -(defcustom smiley-deformed-regexp-alist - '(("\\(\\^_?\\^;;;\\)\\W" 1 "WideFaceAse3.xbm") - ("\\(\\^_?\\^;;\\)\\W" 1 "WideFaceAse2.xbm") - ("\\(\\^_?\\^;\\)\\W" 1 "WideFaceAse1.xbm") - ("\\(\\^_?\\^\\)\\W" 1 "WideFaceSmile.xbm") - ("\\(;_;\\)\\W" 1 "WideFaceWeep.xbm") - ("\\(T_T\\)\\W" 1 "WideFaceWeep.xbm") - ("\\(:-*[<(I+(B]+\\)\\W" 1 "FaceAngry.xpm") - ("\\(:-+\\]+\\)\\W" 1 "FaceGoofy.xpm") - ("\\(:-*D\\)\\W" 1 "FaceGrinning.xpm") - ("\\(:-*[)>}(I;(B]+\\)\\W" 1 "FaceHappy.xpm") - ("\\(=[)>(I;(B]+\\)\\W" 1 "FaceHappy.xpm") - ("\\(:-*[/\\\"]\\)[^/]\\W" 1 "FaceIronic.xpm") - ("[^.0-9]\\([8|]-*[|Oo%]\\)\\W" 1 "FaceKOed.xpm") - ("\\([:|]-*#+\\)\\W" 1 "FaceNyah.xpm") - ("\\(:-*[({]+\\)\\W" 1 "FaceSad.xpm") - ("\\(=[({]+\\)\\W" 1 "FaceSad.xpm") - ("\\(:-*[Oo\*]\\)\\W" 1 "FaceStartled.xpm") - ("\\(:-*|\\)\\W" 1 "FaceStraight.xpm") - ("\\(:-*p\\)\\W" 1 "FaceTalking.xpm") - ("\\(:-*d\\)\\W" 1 "FaceTasty.xpm") - ("[^^;_]\\(;-*[>)}(I;(B]+\\)\\W" 1 "FaceWinking.xpm") - ("\\(:-*[Vv(I5(B]\\)\\W" 1 "FaceWry.xpm") - ("\\([:|]-*P\\)\\W" 1 "FaceYukky.xpm")) - "*Normal and deformed faces for smilies." - :type '(repeat (list regexp - (integer :tag "Match") - (string :tag "Image"))) - :group 'smiley) - -(defcustom smiley-nosey-regexp-alist - '(("\\(:-+[<(I+(B]+\\)\\W" 1 "FaceAngry.xpm") - ("\\(:-+\\]+\\)\\W" 1 "FaceGoofy.xpm") - ("\\(:-+D\\)\\W" 1 "FaceGrinning.xpm") - ("\\(:-+[}(I;(B]+\\)\\W" 1 "FaceHappy.xpm") - ("\\(:-*)+\\)\\W" 1 "FaceHappy.xpm") - ("\\(=[)]+\\)\\W" 1 "FaceHappy.xpm") - ("\\(:-+[/\\\"]+\\)\\W" 1 "FaceIronic.xpm") - ("\\([8|]-+[|Oo%]\\)\\W" 1 "FaceKOed.xpm") - ("\\([:|]-+#+\\)\\W" 1 "FaceNyah.xpm") - ("\\(:-+[({]+\\)\\W" 1 "FaceSad.xpm") - ("\\(=[({]+\\)\\W" 1 "FaceSad.xpm") - ("\\(:-+[Oo\*]\\)\\W" 1 "FaceStartled.xpm") - ("\\(:-+|\\)\\W" 1 "FaceStraight.xpm") - ("\\(:-+p\\)\\W" 1 "FaceTalking.xpm") - ("\\(:-+d\\)\\W" 1 "FaceTasty.xpm") - ("\\(;-+[>)}(I;(B]+\\)\\W" 1 "FaceWinking.xpm") - ("\\(:-+[Vv(I5(B]\\)\\W" 1 "FaceWry.xpm") - ("\\(][:8B]-[)>]\\)\\W" 1 "FaceDevilish.xpm") - ("\\([:|]-+P\\)\\W" 1 "FaceYukky.xpm")) - "*Smileys with noses. These get less false matches." - :type '(repeat (list regexp - (integer :tag "Match") - (string :tag "Image"))) - :group 'smiley) - -(defcustom smiley-regexp-alist smiley-deformed-regexp-alist - "*A list of regexps to map smilies to real images. -Defaults to the contents of `smiley-deformed-regexp-alist'. -An alternative is `smiley-nosey-regexp-alist' that matches less -aggressively. -If this is a symbol, take its value." - :type '(radio (variable-item smiley-deformed-regexp-alist) - (variable-item smiley-nosey-regexp-alist) - symbol - (repeat (list regexp - (integer :tag "Match") - (string :tag "Image")))) - :group 'smiley) - -(defcustom smiley-flesh-color "yellow" - "*Flesh color." - :type 'string - :group 'smiley) - -(defcustom smiley-features-color "black" - "*Features color." - :type 'string - :group 'smiley) - -(defcustom smiley-tongue-color "red" - "*Tongue color." - :type 'string - :group 'smiley) - -(defcustom smiley-circle-color "black" - "*Circle color." - :type 'string - :group 'smiley) - -(defcustom smiley-mouse-face 'highlight - "*Face used for mouse highlighting in the smiley buffer. - -Smiley buttons will be displayed in this face when the cursor is -above them." - :type 'face - :group 'smiley) - -(defvar smiley-glyph-cache nil) - -(defvar smiley-map (make-sparse-keymap "smiley-keys") - "Keymap to toggle smiley states.") - -(define-key smiley-map [(button2)] 'smiley-toggle-extent) -(define-key smiley-map [(button3)] 'smiley-popup-menu) - -(defun smiley-popup-menu (e) - (interactive "e") - (popup-menu - `("Smilies" - ["Toggle This Smiley" (smiley-toggle-extent ,e) t] - ["Toggle All Smilies" (smiley-toggle-extents ,e) t]))) - -(defun smiley-create-glyph (smiley pixmap) - (or - (cdr-safe (assoc pixmap smiley-glyph-cache)) - (let* ((xpm-color-symbols - (and (featurep 'xpm) - (append `(("flesh" ,smiley-flesh-color) - ("features" ,smiley-features-color) - ("tongue" ,smiley-tongue-color)) - xpm-color-symbols))) - (glyph (make-glyph - (list - (cons (if (featurep 'gtk) 'gtk 'x) - (expand-file-name pixmap smiley-data-directory)) - (cons 'mswindows - (expand-file-name pixmap smiley-data-directory)) - (cons 'tty smiley))))) - (setq smiley-glyph-cache (cons (cons pixmap glyph) smiley-glyph-cache)) - (set-glyph-face glyph 'default) - glyph))) - -(defun smiley-create-glyph-ems (smiley pixmap) - (condition-case e - (create-image (expand-file-name pixmap smiley-data-directory)) - (error nil))) - - -;;;###autoload -(defun smiley-region (beg end) - "Smilify the region between point and mark." - (interactive "r") - (smiley-buffer (current-buffer) beg end)) - -(defun smiley-toggle-extent (event) - "Toggle smiley at given point." - (interactive "e") - (let* ((ant (event-glyph-extent event)) - (pt (event-closest-point event)) - ext) - (if (annotationp ant) - (when (extentp (setq ext (extent-property ant 'smiley-extent))) - (set-extent-property ext 'invisible nil) - (hide-annotation ant)) - (when pt - (while (setq ext (extent-at pt (event-buffer event) nil ext 'at)) - (when (annotationp (setq ant - (extent-property ext 'smiley-annotation))) - (reveal-annotation ant) - (set-extent-property ext 'invisible t))))))) - -;; FIXME:: -(defun smiley-toggle-extent-ems (event) - "Toggle smiley at given point. -Note -- this function hasn't been implemented yet." - (interactive "e") - (error "This function hasn't been implemented yet")) - -(defun smiley-toggle-extents (e) - (interactive "e") - (map-extents - (lambda (e void) - (let (ant) - (if (annotationp (setq ant (extent-property e 'smiley-annotation))) - (if (eq (extent-property e 'invisible) nil) - (progn - (reveal-annotation ant) - (set-extent-property e 'invisible t) - ) - (hide-annotation ant) - (set-extent-property e 'invisible nil))) - nil)) - (event-buffer e))) - -;; FIXME:: -(defun smiley-toggle-extents-ems (e) - (interactive "e") - (error "This function hasn't been implemented yet")) - -;;;###autoload -(defun smiley-buffer (&optional buffer st nd) - (interactive) - (when (featurep '(or x gtk mswindows)) - (save-excursion - (when buffer - (set-buffer buffer)) - (let ((buffer-read-only nil) - (alist (if (symbolp smiley-regexp-alist) - (symbol-value smiley-regexp-alist) - smiley-regexp-alist)) - (case-fold-search nil) - entry regexp beg group file) - (map-extents - (lambda (e void) - (when (or (extent-property e 'smiley-extent) - (extent-property e 'smiley-annotation)) - (delete-extent e))) - buffer st nd) - (goto-char (or st (point-min))) - (setq beg (point)) - ;; loop through alist - (while (setq entry (pop alist)) - (setq regexp (car entry) - group (cadr entry) - file (caddr entry)) - (goto-char beg) - (while (re-search-forward regexp nd t) - (let* ((start (match-beginning group)) - (end (match-end group)) - (glyph (smiley-create-glyph (buffer-substring start end) - file))) - (when glyph - (mapcar 'delete-annotation (annotations-at end)) - (let ((ext (make-extent start end)) - (ant (make-annotation glyph end 'text))) - ;; set text extent params - (set-extent-property ext 'end-open t) - (set-extent-property ext 'start-open t) - (set-extent-property ext 'invisible t) - (set-extent-property ext 'keymap smiley-map) - (set-extent-property ext 'mouse-face smiley-mouse-face) - (set-extent-property ext 'intangible t) - ;; set annotation params - (set-extent-property ant 'mouse-face smiley-mouse-face) - (set-extent-property ant 'keymap smiley-map) - ;; remember each other - (set-extent-property ant 'smiley-extent ext) - (set-extent-property ext 'smiley-annotation ant) - ;; Help - (set-extent-property - ext 'help-echo - "button2 toggles smiley, button3 pops up menu") - (set-extent-property - ant 'help-echo - "button2 toggles smiley, button3 pops up menu") - (set-extent-property ext 'balloon-help - "Mouse button2 - toggle smiley -Mouse button3 - menu") - (set-extent-property ant 'balloon-help - "Mouse button2 - toggle smiley -Mouse button3 - menu")) - (when (smiley-end-paren-p start end) - (make-annotation ")" end 'text)) - (goto-char end))))))))) - -;; FIXME: No popup menu, no customized color -(defun smiley-buffer-ems (&optional buffer st nd) - (interactive) - (when window-system - (save-excursion - (when buffer - (set-buffer buffer)) - (let ((buffer-read-only nil) - (alist (if (symbolp smiley-regexp-alist) - (symbol-value smiley-regexp-alist) - smiley-regexp-alist)) - (case-fold-search nil) - entry regexp beg group file) - (dolist (overlay (overlays-in (or st (point-min)) - (or nd (point-max)))) - (when (overlay-get overlay 'smiley) - (remove-text-properties (overlay-start overlay) - (overlay-end overlay) '(display)) - (delete-overlay overlay))) - (goto-char (or st (point-min))) - (setq beg (point)) - ;; loop through alist - (while (setq entry (pop alist)) - (setq regexp (car entry) - group (cadr entry) - file (caddr entry)) - (goto-char beg) - (while (re-search-forward regexp nd t) - (let* ((start (match-beginning group)) - (end (match-end group)) - (glyph (smiley-create-glyph nil file)) - (overlay (make-overlay start end))) - (when glyph - (add-text-properties start end - `(display ,glyph)) - (overlay-put overlay 'smiley glyph) - (goto-char end))))))))) - -(defun smiley-end-paren-p (start end) - "Try to guess whether the current smiley is an end-paren smiley." - (save-excursion - (goto-char start) - (when (and (re-search-backward "[()]" nil t) - (eq (char-after) ?\() - (goto-char end) - (or (not (re-search-forward "[()]" nil t)) - (eq (char-after (1- (point))) ?\())) - t))) - -(defun smiley-toggle-buffer (&optional arg buffer st nd) - "Toggle displaying smiley faces. -With arg, turn displaying on if and only if arg is positive." - (interactive "P") - (let (on off) - (map-extents - (lambda (e void) - (let (ant) - (if (annotationp (setq ant (extent-property e 'smiley-annotation))) - (if (eq (extent-property e 'invisible) nil) - (setq off (cons (cons ant e) off)) - (setq on (cons (cons ant e) on))))) - nil) - buffer st nd) - (if (and (not (and (numberp arg) (< arg 0))) - (or (and (numberp arg) (> arg 0)) - (null on))) - (if off - (while off - (reveal-annotation (caar off)) - (set-extent-property (cdar off) 'invisible t) - (setq off (cdr off))) - (smiley-buffer)) - (while on - (hide-annotation (caar on)) - (set-extent-property (cdar on) 'invisible nil) - (setq on (cdr on)))))) - -;; Simply removing all smiley if existing. -;; FIXME: make it work as the one in XEmacs. -(defun smiley-toggle-buffer-ems (&optional arg buffer st nd) - "Toggle displaying smiley faces. -With arg, turn displaying on if and only if arg is positive." - (interactive "P") - (save-excursion - (when buffer - (set-buffer buffer)) - (let (found) - (dolist (overlay (overlays-in (or st (point-min)) - (or nd (point-max)))) - (when (overlay-get overlay 'smiley) - (remove-text-properties (overlay-start overlay) - (overlay-end overlay) '(display)) - (setq found t))) - (unless found - (smiley-buffer buffer st nd))))) - -(unless (featurep 'xemacs) - (defalias 'smiley-create-glyph 'smiley-create-glyph-ems) - (defalias 'smiley-toggle-extent 'smiley-toggle-extent-ems) - (defalias 'smiley-toggle-extents 'smiley-toggle-extents-ems) - (defalias 'smiley-buffer 'smiley-buffer-ems) - (defalias 'smiley-toggle-buffer 'smiley-toggle-buffer-ems)) - -(defvar gnus-article-buffer) -;;;###autoload -(defun gnus-smiley-display (&optional arg) - "Display \"smileys\" as small graphical icons. -With arg, turn displaying on if and only if arg is positive." - (interactive "P") - (save-excursion - (article-goto-body) - (let (buffer-read-only) - (smiley-toggle-buffer arg (current-buffer) (point) (point-max))))) - -(provide 'smiley) - -;; Local Variables: -;; coding: iso-8859-1 -;; End: - -;;; smiley.el ends here diff --git a/lisp/smime.el b/lisp/smime.el deleted file mode 100644 index 9146963..0000000 --- a/lisp/smime.el +++ /dev/null @@ -1,597 +0,0 @@ -;;; smime.el --- S/MIME support library -;; Copyright (c) 2000, 2001 Free Software Foundation, Inc. - -;; Author: Simon Josefsson -;; Keywords: SMIME X.509 PEM OpenSSL - -;; This file is not a part of GNU Emacs, but the same permissions apply. - -;; GNU Emacs 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, or (at your -;; option) any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; This library perform S/MIME operations from within Emacs. -;; -;; Functions for fetching certificates from public repositories are -;; provided, currently only from DNS. LDAP support (via EUDC) is planned. -;; -;; It uses OpenSSL (tested with version 0.9.5a and 0.9.6) for signing, -;; encryption and decryption. -;; -;; Some general knowledge of S/MIME, X.509, PKCS#12, PEM etc is -;; probably required to use this library in any useful way. -;; Especially, don't expect this library to buy security for you. If -;; you don't understand what you are doing, you're as likely to lose -;; security than gain any by using this library. -;; -;; This library is not intended to provide a "raw" API for S/MIME, -;; PKCSx or similar, it's intended to perform common operations -;; done on messages encoded in these formats. The terminology chosen -;; reflect this. - -;;; Quick introduction: - -;; Get your S/MIME certificate from VeriSign or someplace. I used -;; Netscape to generate the key and certificate request and stuff, and -;; Netscape can export the key into PKCS#12 format. -;; -;; Enter OpenSSL. To be able to use this library, it need to have the -;; SMIME key readable in PEM format. OpenSSL is used to convert the -;; key: -;; -;; $ openssl pkcs12 -in mykey.p12 -clcerts -nodes > mykey.pem -;; ... -;; -;; Now, use M-x customize-variable smime-keys and add mykey.pem as -;; a key. -;; -;; Now you should be able to sign messages! Create a buffer and write -;; something and run M-x smime-sign-buffer RET RET and you should see -;; your message MIME armoured and a signature. Encryption, M-x -;; smime-encrypt-buffer, should also work. -;; -;; To be able to verify messages you need to build up trust with -;; someone. Perhaps you trust the CA that issued your certificate, at -;; least I did, so I export it's certificates from my PKCS#12 -;; certificate with: -;; -;; $ openssl pkcs12 -in mykey.p12 -cacerts -nodes > cacert.pem -;; ... -;; -;; Now, use M-x customize-variable smime-CAs and add cacert.pem as a -;; CA certificate. -;; -;; You should now be able to sign messages, and even verify messages -;; sent by others that use the same CA as you. - -;; Bugs: -;; -;; Don't complain that this package doesn't do encrypted PEM files, -;; submit a patch instead. I store my keys in a safe place, so I -;; didn't need the encryption. Also, programming was made easier by -;; that decision. One might think that this even influenced were I -;; store my keys, and one would probably be right. :-) -;; -;; Update: Mathias Herberts sent the patch. However, it uses -;; environment variables to pass the password to OpenSSL, which is -;; slightly insecure. Hence a new todo: use a better -passin method. -;; -;; Cache password for e.g. 1h -;; -;; Suggestions and comments are appreciated, mail me at simon@josefsson.org. - -;; -;; -;; I would include pointers to introductory text on concepts used in -;; this library here, but the material I've read are so horrible I -;; don't want to recomend them. -;; -;; Why can't someone write a simple introduction to all this stuff? -;; Until then, much of this resemble security by obscurity. -;; -;; Also, I'm not going to mention anything about the wonders of -;; cryptopolitics. Oops, I just did. -;; -;; - -;;; Revision history: - -;; version 0 not released - -;;; Code: - -(require 'dig) -(require 'comint) -(eval-when-compile (require 'cl)) - -(defgroup smime nil - "S/MIME configuration.") - -(defcustom smime-keys nil - "*Map mail addresses to a file containing Certificate (and private key). -The file is assumed to be in PEM format. You can also associate additional -certificates to be sent with every message to each address." - :type '(repeat (list (string :tag "Mail address") - (file :tag "File name") - (repeat :tag "Additional certificate files" - (file :tag "File name")))) - :group 'smime) - -(defcustom smime-CA-directory nil - "*Directory containing certificates for CAs you trust. -Directory should contain files (in PEM format) named to the X.509 -hash of the certificate. This can be done using OpenSSL such as: - -$ ln -s ca.pem `openssl x509 -noout -hash -in ca.pem` - -where `ca.pem' is the file containing a PEM encoded X.509 CA -certificate." - :type '(choice (const :tag "none" nil) - directory) - :group 'smime) - -(defcustom smime-CA-file nil - "*Files containing certificates for CAs you trust. -File should contain certificates in PEM format." - :type '(choice (const :tag "none" nil) - file) - :group 'smime) - -(defcustom smime-certificate-directory "~/Mail/certs/" - "*Directory containing other people's certificates. -It should contain files named to the X.509 hash of the certificate, -and the files themself should be in PEM format." -;The S/MIME library provide simple functionality for fetching -;certificates into this directory, so there is no need to populate it -;manually. - :type 'directory - :group 'smime) - -(defcustom smime-openssl-program - (and (condition-case () - (eq 0 (call-process "openssl" nil nil nil "version")) - (error nil)) - "openssl") - "*Name of OpenSSL binary." - :type 'string - :group 'smime) - -;; OpenSSL option to select the encryption cipher - -(defcustom smime-encrypt-cipher "-des3" - "*Cipher algorithm used for encryption." - :type '(choice (const :tag "Triple DES" "-des3") - (const :tag "DES" "-des") - (const :tag "RC2 40 bits" "-rc2-40") - (const :tag "RC2 64 bits" "-rc2-64") - (const :tag "RC2 128 bits" "-rc2-128")) - :group 'smime) - -(defcustom smime-dns-server nil - "*DNS server to query certificates from. -If nil, use system defaults." - :type '(choice (const :tag "System defaults") - string) - :group 'smime) - -(defvar smime-details-buffer "*OpenSSL output*") - -(eval-and-compile - (defalias 'smime-make-temp-file - (if (fboundp 'make-temp-file) - 'make-temp-file - (lambda (prefix &optional dir-flag) ;; Simple implementation - (expand-file-name - (make-temp-name prefix) - temporary-file-directory))))) - -;; Password dialog function - -(defun smime-ask-passphrase () - "Asks the passphrase to unlock the secret key." - (let ((passphrase - (comint-read-noecho - "Passphrase for secret key (RET for no passphrase): " t))) - (if (string= passphrase "") - nil - passphrase))) - -;; OpenSSL wrappers. - -(defun smime-call-openssl-region (b e buf &rest args) - (case (apply 'call-process-region b e smime-openssl-program nil buf nil args) - (0 t) - (1 (message "OpenSSL: An error occurred parsing the command options.") nil) - (2 (message "OpenSSL: One of the input files could not be read.") nil) - (3 (message "OpenSSL: An error occurred creating the PKCS#7 file or when reading the MIME message.") nil) - (4 (message "OpenSSL: An error occurred decrypting or verifying the message.") nil) - (t (error "Unknown OpenSSL exitcode") nil))) - -(defun smime-make-certfiles (certfiles) - (if certfiles - (append (list "-certfile" (expand-file-name (car certfiles))) - (smime-make-certfiles (cdr certfiles))))) - -;; Sign+encrypt region - -(defun smime-sign-region (b e keyfiles) - "Sign region with certified key in KEYFILES. -If signing fails, the buffer is not modified. Region is assumed to -have proper MIME tags. KEYFILES is expected to contain a PEM encoded -private key and certificate as its car, and a list of additional certificates -to include in its caar." - (smime-new-details-buffer) - (let ((keyfile (car keyfiles)) - (certfiles (and (cdr keyfiles) (cadr keyfiles))) - (buffer (generate-new-buffer (generate-new-buffer-name " *smime*"))) - (passphrase (smime-ask-passphrase)) - (tmpfile (smime-make-temp-file "smime"))) - (if passphrase - (setenv "GNUS_SMIME_PASSPHRASE" passphrase)) - (prog1 - (when (prog1 - (apply 'smime-call-openssl-region b e (list buffer tmpfile) - "smime" "-sign" "-signer" (expand-file-name keyfile) - (append - (smime-make-certfiles certfiles) - (if passphrase - (list "-passin" "env:GNUS_SMIME_PASSPHRASE")))) - (if passphrase - (setenv "GNUS_SMIME_PASSPHRASE" "" t)) - (with-current-buffer smime-details-buffer - (insert-file-contents tmpfile) - (delete-file tmpfile))) - (delete-region b e) - (insert-buffer-substring buffer) - (goto-char b) - (when (looking-at "^MIME-Version: 1.0$") - (delete-region (point) (progn (forward-line 1) (point)))) - t) - (with-current-buffer smime-details-buffer - (goto-char (point-max)) - (insert-buffer-substring buffer)) - (kill-buffer buffer)))) - -(defun smime-encrypt-region (b e certfiles) - "Encrypt region for recipients specified in CERTFILES. -If encryption fails, the buffer is not modified. Region is assumed to -have proper MIME tags. CERTFILES is a list of filenames, each file -is expected to contain of a PEM encoded certificate." - (smime-new-details-buffer) - (let ((buffer (generate-new-buffer (generate-new-buffer-name " *smime*"))) - (tmpfile (smime-make-temp-file "smime"))) - (prog1 - (when (prog1 - (apply 'smime-call-openssl-region b e (list buffer tmpfile) - "smime" "-encrypt" smime-encrypt-cipher - (mapcar 'expand-file-name certfiles)) - (with-current-buffer smime-details-buffer - (insert-file-contents tmpfile) - (delete-file tmpfile))) - (delete-region b e) - (insert-buffer-substring buffer) - (goto-char b) - (when (looking-at "^MIME-Version: 1.0$") - (delete-region (point) (progn (forward-line 1) (point)))) - t) - (with-current-buffer smime-details-buffer - (goto-char (point-max)) - (insert-buffer-substring buffer)) - (kill-buffer buffer)))) - -;; Sign+encrypt buffer - -(defun smime-sign-buffer (&optional keyfile buffer) - "S/MIME sign BUFFER with key in KEYFILE. -KEYFILE should contain a PEM encoded key and certificate." - (interactive) - (with-current-buffer (or buffer (current-buffer)) - (smime-sign-region - (point-min) (point-max) - (if keyfile - (list keyfile (smime-get-certfiles keyfile smime-keys)) - (smime-get-key-by-email - (completing-read "Sign using which signature? " smime-keys nil nil - (and (listp (car-safe smime-keys)) - (cdr smime-keys)))))))) - -(defun smime-encrypt-buffer (&optional certfiles buffer) - "S/MIME encrypt BUFFER for recipients specified in CERTFILES. -CERTFILES is a list of filenames, each file is expected to consist of -a PEM encoded key and certificate. Uses current buffer if BUFFER is -nil." - (interactive) - (with-current-buffer (or buffer (current-buffer)) - (smime-encrypt-region - (point-min) (point-max) - (or certfiles - (list (read-file-name "Recipient's S/MIME certificate: " - smime-certificate-directory nil)))))) - -;; Verify+decrypt region - -(defun smime-verify-region (b e) - "Verify S/MIME message in region between B and E. -Returns non-nil on success. -Any details (stdout and stderr) are left in the buffer specified by -`smime-details-buffer'." - (smime-new-details-buffer) - (let ((CAs (append (if smime-CA-file - (list "-CAfile" - (expand-file-name smime-CA-file))) - (if smime-CA-directory - (list "-CApath" - (expand-file-name smime-CA-directory)))))) - (unless CAs - (error "No CA configured")) - (if (apply 'smime-call-openssl-region b e (list smime-details-buffer t) - "smime" "-verify" "-out" "/dev/null" CAs) - t - (insert-buffer-substring smime-details-buffer) - nil))) - -(defun smime-noverify-region (b e) - "Verify integrity of S/MIME message in region between B and E. -Returns non-nil on success. -Any details (stdout and stderr) are left in the buffer specified by -`smime-details-buffer'." - (smime-new-details-buffer) - (if (apply 'smime-call-openssl-region b e (list smime-details-buffer t) - "smime" "-verify" "-noverify" "-out" '("/dev/null")) - t - (insert-buffer-substring smime-details-buffer) - nil)) - -(defun smime-decrypt-region (b e keyfile) - "Decrypt S/MIME message in region between B and E with key in KEYFILE. -On success, replaces region with decrypted data and return non-nil. -Any details (stderr on success, stdout and stderr on error) are left -in the buffer specified by `smime-details-buffer'." - (smime-new-details-buffer) - (let ((buffer (generate-new-buffer (generate-new-buffer-name " *smime*"))) - CAs (passphrase (smime-ask-passphrase)) - (tmpfile (smime-make-temp-file "smime"))) - (if passphrase - (setenv "GNUS_SMIME_PASSPHRASE" passphrase)) - (if (prog1 - (apply 'smime-call-openssl-region b e - (list buffer tmpfile) - "smime" "-decrypt" "-recip" (expand-file-name keyfile) - (if passphrase - (list "-passin" "env:GNUS_SMIME_PASSPHRASE"))) - (if passphrase - (setenv "GNUS_SMIME_PASSPHRASE" "" t)) - (with-current-buffer smime-details-buffer - (insert-file-contents tmpfile) - (delete-file tmpfile))) - (progn - (delete-region b e) - (insert-buffer-substring buffer) - (kill-buffer buffer) - t) - (with-current-buffer smime-details-buffer - (insert-buffer-substring buffer)) - (kill-buffer buffer) - (delete-region b e) - (insert-buffer-substring smime-details-buffer) - nil))) - -;; Verify+Decrypt buffer - -(defun smime-verify-buffer (&optional buffer) - "Verify integrity of S/MIME message in BUFFER. -Uses current buffer if BUFFER is nil. Returns non-nil on success. -Any details (stdout and stderr) are left in the buffer specified by -`smime-details-buffer'." - (interactive) - (with-current-buffer (or buffer (current-buffer)) - (smime-verify-region (point-min) (point-max)))) - -(defun smime-noverify-buffer (&optional buffer) - "Verify integrity of S/MIME message in BUFFER. -Does NOT verify validity of certificate (only message integrity). -Uses current buffer if BUFFER is nil. Returns non-nil on success. -Any details (stdout and stderr) are left in the buffer specified by -`smime-details-buffer'." - (interactive) - (with-current-buffer (or buffer (current-buffer)) - (smime-noverify-region (point-min) (point-max)))) - -(defun smime-decrypt-buffer (&optional buffer keyfile) - "Decrypt S/MIME message in BUFFER using KEYFILE. -Uses current buffer if BUFFER is nil, and query user of KEYFILE if it's nil. -On success, replaces data in buffer and return non-nil. -Any details (stderr on success, stdout and stderr on error) are left -in the buffer specified by `smime-details-buffer'." - (interactive) - (with-current-buffer (or buffer (current-buffer)) - (smime-decrypt-region - (point-min) (point-max) - (expand-file-name - (or keyfile - (smime-get-key-by-email - (completing-read "Decrypt with which key? " smime-keys nil nil - (and (listp (car-safe smime-keys)) - (caar smime-keys))))))))) - -;; Various operations - -(defun smime-new-details-buffer () - (with-current-buffer (get-buffer-create smime-details-buffer) - (erase-buffer))) - -(defun smime-pkcs7-region (b e) - "Convert S/MIME message between points B and E into a PKCS7 message." - (smime-new-details-buffer) - (when (smime-call-openssl-region b e smime-details-buffer "smime" "-pk7out") - (delete-region b e) - (insert-buffer-substring smime-details-buffer) - t)) - -(defun smime-pkcs7-certificates-region (b e) - "Extract any certificates enclosed in PKCS7 message between points B and E." - (smime-new-details-buffer) - (when (smime-call-openssl-region - b e smime-details-buffer "pkcs7" "-print_certs" "-text") - (delete-region b e) - (insert-buffer-substring smime-details-buffer) - t)) - -(defun smime-pkcs7-email-region (b e) - "Get email addresses contained in certificate between points B and E. -A string or a list of strings is returned." - (smime-new-details-buffer) - (when (smime-call-openssl-region - b e smime-details-buffer "x509" "-email" "-noout") - (delete-region b e) - (insert-buffer-substring smime-details-buffer) - t)) - -;; Utility functions - -(defun smime-get-certfiles (keyfile keys) - (if keys - (let ((curkey (car keys)) - (otherkeys (cdr keys))) - (if (string= keyfile (cadr curkey)) - (caddr curkey) - (smime-get-certfiles keyfile otherkeys))))) - -(eval-and-compile - (defalias 'smime-point-at-eol - (if (fboundp 'point-at-eol) - 'point-at-eol - 'line-end-position))) - -(defun smime-buffer-as-string-region (b e) - "Return each line in region between B and E as a list of strings." - (save-excursion - (goto-char b) - (let (res) - (while (< (point) e) - (let ((str (buffer-substring (point) (smime-point-at-eol)))) - (unless (string= "" str) - (push str res))) - (forward-line)) - res))) - -;; Find certificates - -(defun smime-mail-to-domain (mailaddr) - (if (string-match "@" mailaddr) - (replace-match "." 'fixedcase 'literal mailaddr) - mailaddr)) - -(defun smime-cert-by-dns (mail) - (let* ((dig-dns-server smime-dns-server) - (digbuf (dig-invoke (smime-mail-to-domain mail) "cert" nil nil "+vc")) - (retbuf (generate-new-buffer (format "*certificate for %s*" mail))) - (certrr (with-current-buffer digbuf - (dig-extract-rr (smime-mail-to-domain mail) "cert"))) - (cert (and certrr (dig-rr-get-pkix-cert certrr)))) - (if cert - (with-current-buffer retbuf - (insert "-----BEGIN CERTIFICATE-----\n") - (let ((i 0) (len (length cert))) - (while (> (- len 64) i) - (insert (substring cert i (+ i 64)) "\n") - (setq i (+ i 64))) - (insert (substring cert i len) "\n")) - (insert "-----END CERTIFICATE-----\n")) - (kill-buffer retbuf) - (setq retbuf nil)) - (kill-buffer digbuf) - retbuf)) - -;; User interface. - -(defvar smime-buffer "*SMIME*") - -(defvar smime-mode-map nil) -(put 'smime-mode 'mode-class 'special) - -(unless smime-mode-map - (setq smime-mode-map (make-sparse-keymap)) - (suppress-keymap smime-mode-map) - - (define-key smime-mode-map "q" 'smime-exit) - (define-key smime-mode-map "f" 'smime-certificate-info)) - -(defun smime-mode () - "Major mode for browsing, viewing and fetching certificates. - -All normal editing commands are switched off. -\\ - -The following commands are available: - -\\{smime-mode-map}" - (interactive) - (kill-all-local-variables) - (setq major-mode 'smime-mode) - (setq mode-name "SMIME") - (setq mode-line-process nil) - (use-local-map smime-mode-map) - (buffer-disable-undo) - (setq truncate-lines t) - (setq buffer-read-only t)) - -(defun smime-certificate-info (certfile) - (interactive "fCertificate file: ") - (let ((buffer (get-buffer-create (format "*certificate %s*" certfile)))) - (switch-to-buffer buffer) - (erase-buffer) - (call-process smime-openssl-program nil buffer 'display - "x509" "-in" (expand-file-name certfile) "-text") - (fundamental-mode) - (set-buffer-modified-p nil) - (toggle-read-only t) - (goto-char (point-min)))) - -(defun smime-draw-buffer () - (with-current-buffer smime-buffer - (let (buffer-read-only) - (erase-buffer) - (insert "\nYour keys:\n") - (dolist (key smime-keys) - (insert - (format "\t\t%s: %s\n" (car key) (cadr key)))) - (insert "\nTrusted Certificate Authoritys:\n") - (insert "\nKnown Certificates:\n")))) - -(defun smime () - "Go to the SMIME buffer." - (interactive) - (unless (get-buffer smime-buffer) - (save-excursion - (set-buffer (get-buffer-create smime-buffer)) - (smime-mode))) - (smime-draw-buffer) - (switch-to-buffer smime-buffer)) - -(defun smime-exit () - "Quit the S/MIME buffer." - (interactive) - (kill-buffer (current-buffer))) - -;; Other functions - -(defun smime-get-key-by-email (email) - (cadr (assoc email smime-keys))) - -(provide 'smime) - -;;; smime.el ends here diff --git a/lisp/starttls.el b/lisp/starttls.el deleted file mode 100644 index 3c65e5d..0000000 --- a/lisp/starttls.el +++ /dev/null @@ -1,82 +0,0 @@ -;;; starttls.el --- STARTTLS functions - -;; Copyright (C) 1999, 2000 Free Software Foundation, Inc. - -;; Author: Daiki Ueno -;; Created: 1999/11/20 -;; Keywords: TLS, SSL, OpenSSL, mail, news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; This module defines some utility functions for STARTTLS profiles. - -;; [RFC 2595] "Using TLS with IMAP, POP3 and ACAP" -;; by Chris Newman (1999/06) - -;;; Code: - -(defgroup starttls nil - "Support for `Transport Layer Security' protocol." - :version "21.1" - :group 'mail) - -(defcustom starttls-program "starttls" - "The program to run in a subprocess to open an TLSv1 connection." - :type 'string - :group 'starttls) - -(defcustom starttls-extra-args nil - "Extra arguments to `starttls-program'." - :type '(repeat string) - :group 'starttls) - -(defun starttls-negotiate (process) - (signal-process (process-id process) 'SIGALRM)) - -(defun starttls-open-stream (name buffer host service) - "Open a TLS connection for a service to a host. -Returns a subprocess-object to represent the connection. -Input and output work as for subprocesses; `delete-process' closes it. -Args are NAME BUFFER HOST SERVICE. -NAME is name for process. It is modified if necessary to make it unique. -BUFFER is the buffer (or `buffer-name') to associate with the process. - Process output goes at end of that buffer, unless you specify - an output stream or filter function to handle the output. - BUFFER may be also nil, meaning that this process is not associated - with any buffer -Third arg is name of the host to connect to, or its IP address. -Fourth arg SERVICE is name of the service desired, or an integer -specifying a port number to connect to." - (let* ((process-connection-type nil) - (process (apply #'start-process - name buffer starttls-program - host (format "%s" service) - starttls-extra-args))) - (process-kill-without-query process) - process)) - -(defun starttls-open-ssl-stream (name buffer host service) - (let* ((starttls-extra-args - (cons "--force" starttls-extra-args))) - (starttls-open-stream name buffer host service))) - -(provide 'starttls) - -;;; starttls.el ends here diff --git a/lisp/time-date.el b/lisp/time-date.el deleted file mode 100644 index 771d3b5..0000000 --- a/lisp/time-date.el +++ /dev/null @@ -1,149 +0,0 @@ -;;; time-date.el --- Date and time handling functions -;; Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. - -;; 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 -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'parse-time) - -(autoload 'timezone-make-date-arpa-standard "timezone") - -;;;###autoload -(defun date-to-time (date) - "Convert DATE into time." - (condition-case () - (apply 'encode-time - (parse-time-string - ;; `parse-time-string' isn't sufficiently general or - ;; robust. It fails to grok some of the formats that - ;; timzeone does (e.g. dodgy post-2000 stuff from some - ;; Elms) and either fails or returns bogus values. Lars - ;; reverted this change, but that loses non-trivially - ;; often for me. -- fx - (timezone-make-date-arpa-standard date))) - (error (error "Invalid date: %s" date)))) - -(defun time-to-seconds (time) - "Convert TIME to a floating point number." - (+ (* (car time) 65536.0) - (cadr time) - (/ (or (nth 2 time) 0) 1000000.0))) - -(defun seconds-to-time (seconds) - "Convert SECONDS (a floating point number) to an Emacs time structure." - (list (floor seconds 65536) - (floor (mod seconds 65536)) - (floor (* (- seconds (ffloor seconds)) 1000000)))) - -(defun time-less-p (t1 t2) - "Say whether time T1 is less than time T2." - (or (< (car t1) (car t2)) - (and (= (car t1) (car t2)) - (< (nth 1 t1) (nth 1 t2))))) - -(defun days-to-time (days) - "Convert DAYS into time." - (let* ((seconds (* 1.0 days 60 60 24)) - (rest (expt 2 16)) - (ms (condition-case nil (floor (/ seconds rest)) - (range-error (expt 2 16))))) - (list ms (condition-case nil (round (- seconds (* ms rest))) - (range-error (expt 2 16)))))) - -(defun time-since (time) - "Return the time since TIME, which is either an internal time or a date." - (when (stringp time) - ;; Convert date strings to internal time. - (setq time (date-to-time time))) - (let* ((current (current-time)) - (rest (when (< (nth 1 current) (nth 1 time)) - (expt 2 16)))) - (list (- (+ (car current) (if rest -1 0)) (car time)) - (- (+ (or rest 0) (nth 1 current)) (nth 1 time))))) - -(defun subtract-time (t1 t2) - "Subtract two internal times." - (let ((borrow (< (cadr t1) (cadr t2)))) - (list (- (car t1) (car t2) (if borrow 1 0)) - (- (+ (if borrow 65536 0) (cadr t1)) (cadr t2))))) - -(defun date-to-day (date) - "Return the number of days between year 1 and DATE." - (time-to-days (date-to-time date))) - -(defun days-between (date1 date2) - "Return the number of days between DATE1 and DATE2." - (- (date-to-day date1) (date-to-day date2))) - -(defun date-leap-year-p (year) - "Return t if YEAR is a leap year." - (or (and (zerop (% year 4)) - (not (zerop (% year 100)))) - (zerop (% year 400)))) - -(defun time-to-day-in-year (time) - "Return the day number within the year of the date month/day/year." - (let* ((tim (decode-time time)) - (month (nth 4 tim)) - (day (nth 3 tim)) - (year (nth 5 tim)) - (day-of-year (+ day (* 31 (1- month))))) - (when (> month 2) - (setq day-of-year (- day-of-year (/ (+ 23 (* 4 month)) 10))) - (when (date-leap-year-p year) - (setq day-of-year (1+ day-of-year)))) - day-of-year)) - -(defun time-to-days (time) - "The number of days between the Gregorian date 0001-12-31bce and TIME. -The Gregorian date Sunday, December 31, 1bce is imaginary." - (let* ((tim (decode-time time)) - (month (nth 4 tim)) - (day (nth 3 tim)) - (year (nth 5 tim))) - (+ (time-to-day-in-year time) ; Days this year - (* 365 (1- year)) ; + Days in prior years - (/ (1- year) 4) ; + Julian leap years - (- (/ (1- year) 100)) ; - century years - (/ (1- year) 400)))) ; + Gregorian leap years - -(defun time-to-number-of-days (time) - "Return the number of days represented by TIME. -The number of days will be returned as a floating point number." - (/ (+ (* 1.0 65536 (car time)) (cadr time)) (* 60 60 24))) - -;;;###autoload -(defun safe-date-to-time (date) - "Parse DATE and return a time structure. -If DATE is malformed, a zero time will be returned." - (condition-case () - (date-to-time date) - (error '(0 0)))) - -(provide 'time-date) - -;;; time-date.el ends here diff --git a/lisp/utf7.el b/lisp/utf7.el deleted file mode 100644 index eea6afe..0000000 --- a/lisp/utf7.el +++ /dev/null @@ -1,180 +0,0 @@ -;;; utf7.el --- UTF-7 encoding/decoding for Emacs -;; Copyright (C) 1999, 2000 Free Software Foundation, Inc. - -;; Author: Jon K Hellan -;; Keywords: mail - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to -;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: -;;; UTF-7 - A Mail-Safe Transformation Format of Unicode - RFC 2152 -;;; This is a transformation format of Unicode that contains only 7-bit -;;; ASCII octets and is intended to be readable by humans in the limiting -;;; case that the document consists of characters from the US-ASCII -;;; repertoire. -;;; In short, runs of characters outside US-ASCII are encoded as base64 -;;; inside delimiters. -;;; A variation of UTF-7 is specified in IMAP 4rev1 (RFC 2060) as the way -;;; to represent characters outside US-ASCII in mailbox names in IMAP. -;;; This library supports both variants, but the IMAP variation was the -;;; reason I wrote it. -;;; The routines convert UTF-7 -> UTF-16 (16 bit encoding of Unicode) -;;; -> current character set, and vice versa. -;;; However, until Emacs supports Unicode, the only Emacs character set -;;; supported here is ISO-8859.1, which can trivially be converted to/from -;;; Unicode. -;;; When decoding results in a character outside the Emacs character set, -;;; an error is thrown. It is up to the application to recover. - -;;; Code: - -(require 'base64) -(eval-when-compile (require 'cl)) - -(defvar utf7-direct-encoding-chars " -%'-*,-[]-}" - "Character ranges which do not need escaping in UTF-7.") - -(defvar utf7-imap-direct-encoding-chars - (concat utf7-direct-encoding-chars "+\\~") - "Character ranges which do not need escaping in the IMAP variant of UTF-7.") - -(defsubst utf7-imap-get-pad-length (len modulus) - "Return required length of padding for IMAP modified base64 fragment." - (mod (- len) modulus)) - -(defun utf7-encode-internal (&optional for-imap) - "Encode text in (temporary) buffer as UTF-7. -Use IMAP modification if FOR-IMAP is non-nil." - (let ((start (point-min)) - (end (point-max))) - (narrow-to-region start end) - (goto-char start) - (let ((esc-char (if for-imap ?& ?+)) - (direct-encoding-chars - (if for-imap utf7-imap-direct-encoding-chars - utf7-direct-encoding-chars))) - (while (not (eobp)) - (skip-chars-forward direct-encoding-chars) - (unless (eobp) - (insert esc-char) - (let ((p (point)) - (fc (following-char)) - (run-length - (skip-chars-forward (concat "^" direct-encoding-chars)))) - (if (and (= fc esc-char) - (= run-length 1)) ; Lone esc-char? - (delete-backward-char 1) ; Now there's one too many - (utf7-fragment-encode p (point) for-imap)) - (insert "-"))))))) - -(defun utf7-fragment-encode (start end &optional for-imap) - "Encode text from START to END in buffer as UTF-7 escape fragment. -Use IMAP modification if FOR-IMAP is non-nil." - (save-restriction - (narrow-to-region start end) - (funcall (utf7-get-u16char-converter 'to-utf-16)) - (base64-encode-region start (point-max)) - (goto-char start) - (let ((pm (point-max))) - (when for-imap - (while (search-forward "/" nil t) - (replace-match ","))) - (skip-chars-forward "^= \t\n" pm) - (delete-region (point) pm)))) - -(defun utf7-decode-internal (&optional for-imap) - "Decode UTF-7 text in (temporary) buffer. -Use IMAP modification if FOR-IMAP is non-nil." - (let ((start (point-min)) - (end (point-max))) - (goto-char start) - (let* ((esc-pattern (concat "^" (char-to-string (if for-imap ?& ?+)))) - (base64-chars (concat "A-Za-z0-9+" - (char-to-string (if for-imap ?, ?/))))) - (while (not (eobp)) - (skip-chars-forward esc-pattern) - (unless (eobp) - (forward-char) - (let ((p (point)) - (run-length (skip-chars-forward base64-chars))) - (when (and (not (eobp)) (= (following-char) ?-)) - (delete-char 1)) - (unless (= run-length 0) ; Encoded lone esc-char? - (save-excursion - (utf7-fragment-decode p (point) for-imap) - (goto-char p) - (delete-backward-char 1))))))))) - -(defun utf7-fragment-decode (start end &optional for-imap) - "Decode base64 encoded fragment from START to END of UTF-7 text in buffer. -Use IMAP modification if FOR-IMAP is non-nil." - (save-restriction - (narrow-to-region start end) - (when for-imap - (goto-char start) - (while (search-forward "," nil 'move-to-end) (replace-match "/"))) - (let ((pl (utf7-imap-get-pad-length (- end start) 4))) - (insert (make-string pl ?=)) - (base64-decode-region start (+ end pl))) - (funcall (utf7-get-u16char-converter 'from-utf-16)))) - -(defun utf7-get-u16char-converter (which-way) - "Return a function to convert between UTF-16 and current character set." - ;; Add test to check if we are really Latin-1. - ;; Support other character sets once Emacs groks Unicode. - (if (eq which-way 'to-utf-16) - 'utf7-latin1-u16-char-converter - 'utf7-u16-latin1-char-converter)) - -(defun utf7-latin1-u16-char-converter () - "Convert latin 1 (ISO-8859.1) characters to 16 bit Unicode. -Characters are converted to raw byte pairs in narrowed buffer." - (goto-char (point-min)) - (while (not (eobp)) - (insert 0) - (forward-char))) - -(defun utf7-u16-latin1-char-converter () - "Convert 16 bit Unicode characters to latin 1 (ISO-8859.1). -Characters are in raw byte pairs in narrowed buffer." - (goto-char (point-min)) - (while (not (eobp)) - (if (= 0 (following-char)) - (delete-char 1) - (error "Unable to convert from Unicode")) - (forward-char))) - -(defun utf7-encode (string &optional for-imap) - "Encode UTF-7 STRING. Use IMAP modification if FOR-IMAP is non-nil." - (let ((default-enable-multibyte-characters nil)) - (with-temp-buffer - (insert string) - (utf7-encode-internal for-imap) - (buffer-string)))) - -(defun utf7-decode (string &optional for-imap) - "Decode UTF-7 STRING. Use IMAP modification if FOR-IMAP is non-nil." - (let ((default-enable-multibyte-characters nil)) - (with-temp-buffer - (insert string) - (utf7-decode-internal for-imap) - (buffer-string)))) - -(provide 'utf7) - -;;; utf7.el ends here diff --git a/lisp/uudecode.el b/lisp/uudecode.el deleted file mode 100644 index efd4166..0000000 --- a/lisp/uudecode.el +++ /dev/null @@ -1,221 +0,0 @@ -;;; uudecode.el -- elisp native uudecode - -;; Copyright (c) 1998, 1999, 2000 Free Software Foundation, Inc. - -;; Author: Shenghuo Zhu -;; Keywords: uudecode news - -;; This file is a part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; Lots of codes are stolen from mm-decode.el, gnus-uu.el and -;; base64.el - -;; This looks as though it could be made rather more efficient for -;; internal working. Encoding could use a lookup table and decoding -;; should presumably use a vector or list buffer for partial results -;; rather than with-current-buffer. -- fx - -;; Only `uudecode-decode-region' should be advertised, and whether or -;; not that uses a program should be customizable, but I guess it's -;; too late now. -- fx - -;;; Code: - -(eval-when-compile (require 'cl)) - -(eval-and-compile - (defalias 'uudecode-char-int - (if (fboundp 'char-int) - 'char-int - 'identity)) - - (if (featurep 'xemacs) - (defalias 'uudecode-insert-char 'insert-char) - (defun uudecode-insert-char (char &optional count ignored buffer) - (if (or (null buffer) (eq buffer (current-buffer))) - (insert-char char count) - (with-current-buffer buffer - (insert-char char count)))))) - -(defcustom uudecode-decoder-program "uudecode" - "*Non-nil value should be a string that names a uu decoder. -The program should expect to read uu data on its standard -input and write the converted data to its standard output." - :type 'string - :group 'gnus-extract) - -(defcustom uudecode-decoder-switches nil - "*List of command line flags passed to `uudecode-decoder-program'." - :group 'gnus-extract - :type '(repeat string)) - -(defconst uudecode-alphabet "\040-\140") - -(defconst uudecode-begin-line "^begin[ \t]+[0-7][0-7][0-7][ \t]+\\(.*\\)$") -(defconst uudecode-end-line "^end[ \t]*$") - -(defconst uudecode-body-line - (let ((i 61) (str "^M")) - (while (> (setq i (1- i)) 0) - (setq str (concat str "[^a-z]"))) - (concat str ".?$"))) - -(defvar uudecode-temporary-file-directory - (cond ((fboundp 'temp-directory) (temp-directory)) - ((boundp 'temporary-file-directory) temporary-file-directory) - ("/tmp"))) - -;;;###autoload -(defun uudecode-decode-region-external (start end &optional file-name) - "Uudecode region between START and END using external program. -If FILE-NAME is non-nil, save the result to FILE-NAME. The program -used is specified by `uudecode-decoder-program'." - (interactive "r\nP") - (let ((cbuf (current-buffer)) tempfile firstline status) - (save-excursion - (goto-char start) - (when (re-search-forward uudecode-begin-line nil t) - (forward-line 1) - (setq firstline (point)) - (cond ((null file-name)) - ((stringp file-name)) - (t - (setq file-name (read-file-name "File to Name:" - nil nil nil - (match-string 1))))) - (setq tempfile (if file-name - (expand-file-name file-name) - (if (fboundp 'make-temp-file) - (let ((temporary-file-directory - uudecode-temporary-file-directory)) - (make-temp-file "uu")) - (expand-file-name - (make-temp-name "uu") - uudecode-temporary-file-directory)))) - (let ((cdir default-directory) - default-process-coding-system) - (unwind-protect - (with-temp-buffer - (insert "begin 600 " (file-name-nondirectory tempfile) "\n") - (insert-buffer-substring cbuf firstline end) - (cd (file-name-directory tempfile)) - (apply 'call-process-region - (point-min) - (point-max) - uudecode-decoder-program - nil - nil - nil - uudecode-decoder-switches)) - (cd cdir) (set-buffer cbuf))) - (if (file-exists-p tempfile) - (unless file-name - (goto-char start) - (delete-region start end) - (let (format-alist) - (insert-file-contents-literally tempfile))) - (message "Can not uudecode"))) - (ignore-errors (or file-name (delete-file tempfile)))))) - -;;;###autoload -(defun uudecode-decode-region (start end &optional file-name) - "Uudecode region between START and END without using an external program. -If FILE-NAME is non-nil, save the result to FILE-NAME." - (interactive "r\nP") - (let ((work-buffer nil) - (done nil) - (counter 0) - (remain 0) - (bits 0) - (lim 0) inputpos - (non-data-chars (concat "^" uudecode-alphabet))) - (unwind-protect - (save-excursion - (goto-char start) - (when (re-search-forward uudecode-begin-line nil t) - (cond ((null file-name)) - ((stringp file-name)) - (t - (setq file-name (expand-file-name - (read-file-name "File to Name:" - nil nil nil - (match-string 1)))))) - (setq work-buffer (generate-new-buffer " *uudecode-work*")) - (forward-line 1) - (skip-chars-forward non-data-chars end) - (while (not done) - (setq inputpos (point)) - (setq remain 0 bits 0 counter 0) - (cond - ((> (skip-chars-forward uudecode-alphabet end) 0) - (setq lim (point)) - (setq remain - (logand (- (uudecode-char-int (char-after inputpos)) 32) - 63)) - (setq inputpos (1+ inputpos)) - (if (= remain 0) (setq done t)) - (while (and (< inputpos lim) (> remain 0)) - (setq bits (+ bits - (logand - (- - (uudecode-char-int (char-after inputpos)) 32) - 63))) - (if (/= counter 0) (setq remain (1- remain))) - (setq counter (1+ counter) - inputpos (1+ inputpos)) - (cond ((= counter 4) - (uudecode-insert-char - (lsh bits -16) 1 nil work-buffer) - (uudecode-insert-char - (logand (lsh bits -8) 255) 1 nil work-buffer) - (uudecode-insert-char (logand bits 255) 1 nil - work-buffer) - (setq bits 0 counter 0)) - (t (setq bits (lsh bits 6))))))) - (cond - (done) - ((> 0 remain) - (error "uucode line ends unexpectly") - (setq done t)) - ((and (= (point) end) (not done)) - ;;(error "uucode ends unexpectly") - (setq done t)) - ((= counter 3) - (uudecode-insert-char (logand (lsh bits -16) 255) 1 nil - work-buffer) - (uudecode-insert-char (logand (lsh bits -8) 255) 1 nil - work-buffer)) - ((= counter 2) - (uudecode-insert-char (logand (lsh bits -10) 255) 1 nil - work-buffer))) - (skip-chars-forward non-data-chars end)) - (if file-name - (save-excursion - (set-buffer work-buffer) - (write-file file-name)) - (or (markerp end) (setq end (set-marker (make-marker) end))) - (goto-char start) - (insert-buffer-substring work-buffer) - (delete-region (point) end)))) - (and work-buffer (kill-buffer work-buffer))))) - -(provide 'uudecode) - -;;; uudecode.el ends here diff --git a/lisp/webmail.el b/lisp/webmail.el deleted file mode 100644 index 0bd06e6..0000000 --- a/lisp/webmail.el +++ /dev/null @@ -1,1192 +0,0 @@ -;;; webmail.el --- interface of web mail -;; Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. - -;; Author: Shenghuo Zhu -;; Keywords: hotmail netaddress my-deja netscape - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your -;; option) any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; Note: Now mail.yahoo.com provides POP3 service, the webmail -;; fetching is not going to be supported. - -;; Note: You need to have `url' and `w3' installed for this backend to -;; work. `w3' must be 4.0pre46+one-line-cookie patch or standalone -;; `url'. - -;; Todo: To support more web mail servers. - -;; Known bugs: -;; 1. Net@ddress may corrupt `X-Face'. - -;; Warning: -;; Webmail is an experimental function, which means NO WARRANTY. - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'nnoo) -(require 'message) -(require 'gnus-util) -(require 'gnus) -(require 'nnmail) -(require 'mm-util) -(require 'mml) -(eval-when-compile - (ignore-errors - (require 'w3) - (require 'url) - (require 'url-cookie) - (require 'w3-forms) - (require 'nnweb))) -;; Report failure to find w3 at load time if appropriate. -(eval '(progn - (require 'w3) - (require 'url) - (require 'url-cookie) - (require 'w3-forms) - (require 'nnweb))) - -;;; - -(defvar webmail-type-definition - '((hotmail - ;; Hotmail hate other HTTP user agents and use one line cookie - (paranoid agent cookie post) - (address . "www.hotmail.com") - (open-url "http://www.hotmail.com/") - (open-snarf . webmail-hotmail-open) - ;; W3 hate redirect POST - (login-url - "http://%s/cgi-bin/dologin?login=%s&passwd=%s&enter=Sign+in&sec=no&curmbox=ACTIVE&_lang=&js=yes&id=2&tw=-10000&beta=" - webmail-aux user password) - ;;(login-snarf . webmail-hotmail-login) - ;;(list-url "%s" webmail-aux) - (list-snarf . webmail-hotmail-list) - (article-snarf . webmail-hotmail-article) - (trash-url - "%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 agent cookie post) - (address . "mail.yahoo.com") - (open-url "http://mail.yahoo.com/") - (open-snarf . webmail-yahoo-open) - (login-url;; yahoo will not accept GET - content - ("%s" webmail-aux) - ".tries=&.src=ym&.last=&promo=&.intl=&.bypass=&.partner=&.chkP=Y&.done=&login=%s&passwd=%s" - user password) - (login-snarf . webmail-yahoo-login) - (list-url "%s&rb=Inbox&YN=1" webmail-aux) - (list-snarf . webmail-yahoo-list) - (article-snarf . webmail-yahoo-article) - (trash-url - "%s/ym/ShowFolder?YY=52107&inc=50&order=down&sort=date&pos=0&box=Inbox&DEL=Delete&destBox=&Mid=%s&destBox2=" - webmail-aux id)) - (netaddress - (paranoid cookie post) - (address . "www.netaddress.com") - (open-url "http://www.netaddress.com/") - (open-snarf . webmail-netaddress-open) - (login-url - content - ("%s" webmail-aux) - "LoginState=2&SuccessfulLogin=%%2Ftpl&NewServerName=www.netaddress.com&JavaScript=JavaScript1.2&DomainID=4&Domain=usa.net&NA31site=classic.netaddress.com&NA31port=80&UserID=%s&passwd=%s" - user password) - (login-snarf . webmail-netaddress-login) - (list-url - "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") - "U2_USERNAME=%s&U2_PASSWORD=%s%s" - user password webmail-aux) - (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") - ;;(open-snarf . webmail-my-deja-open) - (login-url - content - ("http://mydeja.google.com/cgi-bin/deja/maillogin.py") - "userid=%s&password=%s" - user password) - (list-snarf . webmail-my-deja-list) - (article-snarf . webmail-my-deja-article) - (trash-url webmail-aux id)))) - -(defvar webmail-variables - '(address article-snarf article-url list-snarf list-url - login-url login-snarf open-url open-snarf site articles - post-process paranoid trash-url)) - -(defconst webmail-version "webmail 1.0") - -(defvar webmail-newmail-only nil - "Only fetch new mails.") - -(defvar webmail-move-to-trash-can t - "Move mail to trash can after fetch it.") - -;;; Internal variables - -(defvar webmail-address nil) -(defvar webmail-paranoid nil) -(defvar webmail-aux nil) -(defvar webmail-session nil) -(defvar webmail-article-snarf nil) -(defvar webmail-article-url nil) -(defvar webmail-list-snarf nil) -(defvar webmail-list-url nil) -(defvar webmail-login-url nil) -(defvar webmail-login-snarf nil) -(defvar webmail-open-snarf nil) -(defvar webmail-open-url nil) -(defvar webmail-trash-url nil) -(defvar webmail-articles nil) -(defvar webmail-post-process nil) - -(defvar webmail-buffer nil) -(defvar webmail-buffer-list nil) - -(defvar webmail-type nil) - -(defvar webmail-error-function nil) - -(defvar webmail-debug-file "~/.emacs-webmail-debug") - -;;; Interface functions - -(defun webmail-debug (str) - (with-temp-buffer - (insert "\n---------------- A bug at " str " ------------------\n") - (mapcar #'(lambda (sym) - (if (boundp sym) - (pp `(setq ,sym ',(eval sym)) (current-buffer)))) - '(webmail-type user)) - (insert "---------------- webmail buffer ------------------\n\n") - (insert-buffer-substring webmail-buffer) - (insert "\n---------------- end of buffer ------------------\n\n") - (append-to-file (point-min) (point-max) webmail-debug-file))) - -(defun webmail-error (str) - (if webmail-error-function - (funcall webmail-error-function str)) - (message "%s HTML has changed or your w3 package is too old.(%s)" - webmail-type str) - (error "%s HTML has changed or your w3 package is too old.(%s)" - webmail-type str)) - -(defun webmail-setdefault (type) - (let ((type-def (cdr (assq type webmail-type-definition))) - (vars webmail-variables) - pair) - (setq webmail-type type) - (dolist (var vars) - (if (setq pair (assq var type-def)) - (set (intern (concat "webmail-" (symbol-name var))) (cdr pair)) - (set (intern (concat "webmail-" (symbol-name var))) nil))))) - -(defun webmail-encode-www-form-urlencoded (pairs) - "Return PAIRS encoded for forms." - (mapconcat - (function - (lambda (data) - (concat (w3-form-encode-xwfu (car data)) "=" - (w3-form-encode-xwfu (cdr data))))) - pairs "&")) - -(defun webmail-fetch-simple (url content) - (let ((url-request-data content) - (url-request-method "POST") - (url-request-extra-headers - '(("Content-type" . "application/x-www-form-urlencoded")))) - (nnweb-insert url)) - t) - -(defun webmail-fetch-form (url pairs) - (let ((url-request-data (webmail-encode-www-form-urlencoded pairs)) - (url-request-method "POST") - (url-request-extra-headers - '(("Content-type" . "application/x-www-form-urlencoded")))) - (nnweb-insert url)) - t) - -(defun webmail-eval (expr) - (cond - ((consp expr) - (cons (webmail-eval (car expr)) (webmail-eval (cdr expr)))) - ((symbolp expr) - (eval expr)) - (t - expr))) - -(defun webmail-url (xurl) - (mm-with-unibyte-current-buffer - (cond - ((eq (car xurl) 'content) - (pop xurl) - (webmail-fetch-simple (if (stringp (car xurl)) - (car xurl) - (apply 'format (webmail-eval (car xurl)))) - (apply 'format (webmail-eval (cdr xurl))))) - ((eq (car xurl) 'post) - (pop xurl) - (webmail-fetch-form (car xurl) (webmail-eval (cdr xurl)))) - (t - (nnweb-insert (apply 'format (webmail-eval xurl))))))) - -(defun webmail-init () - "Initialize buffers and such." - (if (gnus-buffer-live-p webmail-buffer) - (set-buffer webmail-buffer) - (setq webmail-buffer - (nnheader-set-temp-buffer " *webmail*")) - (mm-disable-multibyte))) - -(defvar url-package-name) -(defvar url-package-version) -(defvar url-cookie-multiple-line) -(defvar url-confirmation-func) - -;; Hack W3 POST redirect. See `url-parse-mime-headers'. -;; -;; Netscape uses "GET" as redirect method when orignal method is POST -;; and status is 302, .i.e no security risks by default without -;; confirmation. -;; -;; Some web servers (at least Apache used by yahoo) return status 302 -;; instead of 303, though they mean 303. - -(defun webmail-url-confirmation-func (prompt) - (cond - ((equal prompt (concat "Honor redirection with non-GET method " - "(possible security risks)? ")) - nil) - ((equal prompt "Continue (with method of GET)? ") - t) - (t (error prompt)))) - -(defun webmail-refresh-redirect () - "Redirect refresh url in META." - (goto-char (point-min)) - (while (re-search-forward - "]*URL=\\([^\"]+\\)\"" - nil t) - (let ((url (match-string 1))) - (erase-buffer) - (mm-with-unibyte-current-buffer - (nnweb-insert url))) - (goto-char (point-min)))) - -(defun webmail-fetch (file subtype user password) - (save-excursion - (webmail-setdefault subtype) - (let ((url-package-name (if (memq 'agent webmail-paranoid) - "Mozilla" - url-package-name)) - (url-package-version (if (memq 'agent webmail-paranoid) - "4.0" - url-package-version)) - (url-cookie-multiple-line (if (memq 'cookie webmail-paranoid) - nil - url-cookie-multiple-line)) - (url-confirmation-func (if (memq 'post webmail-paranoid) - 'webmail-url-confirmation-func - url-confirmation-func)) - (url-http-silence-on-insecure-redirection t) - url-cookie-storage url-cookie-secure-storage - url-cookie-confirmation - item id (n 0)) - (webmail-init) - (setq webmail-articles nil) - (when webmail-open-url - (erase-buffer) - (webmail-url webmail-open-url)) - (if webmail-open-snarf (funcall webmail-open-snarf)) - (when webmail-login-url - (erase-buffer) - (webmail-url webmail-login-url)) - (if webmail-login-snarf - (funcall webmail-login-snarf)) - (when webmail-list-url - (erase-buffer) - (webmail-url webmail-list-url)) - (if webmail-list-snarf - (funcall webmail-list-snarf)) - (while (setq item (pop webmail-articles)) - (message "Fetching mail #%d..." (setq n (1+ n))) - (erase-buffer) - (mm-with-unibyte-current-buffer - (nnweb-insert (cdr item))) - (setq id (car item)) - (if webmail-article-snarf - (funcall webmail-article-snarf file id)) - (when (and webmail-trash-url webmail-move-to-trash-can) - (message "Move mail #%d to trash can..." n) - (condition-case err - (progn - (webmail-url webmail-trash-url) - (let (buf) - (while (setq buf (pop webmail-buffer-list)) - (kill-buffer buf)))) - (error - (let (buf) - (while (setq buf (pop webmail-buffer-list)) - (kill-buffer buf))) - (error err)))))) - (if webmail-post-process - (funcall webmail-post-process)))) - -(defun webmail-encode-8bit () - (goto-char (point-min)) - (skip-chars-forward "^\200-\377") - (while (not (eobp)) - (insert (format "&%d;" (mm-char-int (char-after)))) - (delete-char 1) - (skip-chars-forward "^\200-\377"))) - -;;; hotmail - -(defun webmail-hotmail-open () - (goto-char (point-min)) - (if (re-search-forward - "action=\"https?://\\([^/]+\\)/cgi-bin/dologin" nil t) - (setq webmail-aux (match-string 1)) - (webmail-error "open@1"))) - -(defun webmail-hotmail-login () - (let (site) - (goto-char (point-min)) - (if (re-search-forward - "https?://\\([^/]+hotmail\\.msn\\.com\\)/cgi-bin/" nil t) - (setq site (match-string 1)) - (webmail-error "login@1")) - (goto-char (point-min)) - (if (re-search-forward - "\\(/cgi-bin/HoTMaiL\\?[^\"]*a=b[^\"]*\\)" nil t) - (setq webmail-aux (concat "http://" site (match-string 1))) - (webmail-error "login@2")))) - -(defun webmail-hotmail-list () - (goto-char (point-min)) - (skip-chars-forward " \t\n\r") - (let (site url newp (total "0")) - (if (eobp) - (setq total "0") - (if (re-search-forward "\\([0-9]+\\) *(\\([0-9]+\\) new)" nil t) - (message "Found %s (%s new)" (setq total (match-string 1)) - (match-string 2)) - (if (re-search-forward "\\([0-9]+\\) new" nil t) - (message "Found %s new" (setq total (match-string 1))) - (webmail-error "list@0")))) - (unless (equal total "0") - (goto-char (point-min)) - (if (re-search-forward - "https?://\\([^/]+hotmail\\.msn\\.com\\)/cgi-bin/" nil t) - (setq site (match-string 1)) - (webmail-error "list@1")) - (goto-char (point-min)) - (if (re-search-forward "disk=\\([^&]*\\)&" nil t) - (setq webmail-aux - (concat "http://" site "/cgi-bin/HoTMaiL?disk=" - (match-string 1))) - (webmail-error "list@2")) - (goto-char (point-max)) - (while (re-search-backward - "newmail\\.gif\\|href=\"\\(/cgi-bin/getmsg\\?[^\"]+\\)\"" - nil t) - (if (setq url (match-string 1)) - (progn - (if (or newp (not webmail-newmail-only)) - (let (id) - (if (string-match "msg=\\([^&]+\\)" url) - (setq id (match-string 1 url))) - (push (cons id (concat "http://" site url "&raw=0")) - webmail-articles))) - (setq newp nil)) - (setq newp t)))))) - -;; Thank victor@idaccr.org (Victor S. Miller) for raw=0 - -(defun webmail-hotmail-article (file id) - (goto-char (point-min)) - (skip-chars-forward " \t\n\r") - (unless (eobp) - (if (not (search-forward "
    " nil t))
    -	(webmail-error "article@3"))
    -    (skip-chars-forward "\n\r\t ")
    -    (delete-region (point-min) (point))
    -    (if (not (search-forward "
    " nil t)) - (webmail-error "article@3.1")) - (delete-region (match-beginning 0) (point-max)) - (nnweb-remove-markup) - (let ((w3-html-entities (cons '(nbsp . 32) w3-html-entities))) - (nnweb-decode-entities)) - (goto-char (point-min)) - (while (re-search-forward "\r\n?" nil t) - (replace-match "\n")) - (goto-char (point-min)) - (insert "\n\n") - (if (not (looking-at "\n*From ")) - (insert "From nobody " (current-time-string) "\n") - (forward-line)) - (insert "X-Gnus-Webmail: " (symbol-value 'user) - "@" (symbol-name webmail-type) "\n") - (mm-append-to-file (point-min) (point-max) file))) - -(defun webmail-hotmail-article-old (file id) - (let (p attachment count mime hotmail-direct) - (save-restriction - (webmail-encode-8bit) - (goto-char (point-min)) - (if (not (search-forward "
    " nil t)) - (if (not (search-forward "Reply All" nil t)) - (webmail-error "article@1") - (setq hotmail-direct t)) - (goto-char (match-beginning 0))) - (narrow-to-region (point-min) (point)) - (if (not (search-backward "" nil t) - (delete-region p (match-end 0))) - (nnweb-remove-markup) - (let ((w3-html-entities (cons '(nbsp . 32) w3-html-entities))) - (nnweb-decode-entities)) - (goto-char (point-min)) - (delete-blank-lines) - (goto-char (point-min)) - (when (search-forward "\n\n" nil t) - (backward-char) - (delete-region (point) (point-max))) - (goto-char (point-max)) - (widen) - (insert "\n") - (setq p (point)) - (while (re-search-forward - "\\|
    \\|\\(http://[^/]+/cgi-bin/getmsg/\\([^\?]+\\)\?[^\"]*\\)\"" - nil t) - (if (setq attachment (match-string 1)) - (let ((filename (match-string 2)) - bufname);; Attachment - (delete-region p (match-end 0)) - (save-excursion - (set-buffer (generate-new-buffer " *webmail-att*")) - (nnweb-insert attachment) - (push (current-buffer) webmail-buffer-list) - (setq bufname (buffer-name))) - (setq mime t) - (insert "<#part type=" - (or (and filename - (string-match "\\.[^\\.]+$" filename) - (mailcap-extension-to-mime - (match-string 0 filename))) - "application/octet-stream")) - (insert " buffer=\"" bufname "\"") - (insert " filename=\"" filename "\"") - (insert " disposition=\"inline\"") - (insert "><#/part>\n") - (setq p (point))) - (delete-region p (match-end 0)) - (if hotmail-direct - (if (not (search-forward "" nil t)) - (webmail-error "article@1.2") - (delete-region (match-beginning 0) (match-end 0))) - (setq count 1) - (while (and (> count 0) - (re-search-forward "
    \\|\\(
    \\)" nil t)) - (if (match-string 1) - (setq count (1+ count)) - (if (= (setq count (1- count)) 0) - (delete-region (match-beginning 0) - (match-end 0)))))) - (narrow-to-region p (point)) - (goto-char (point-min)) - (cond - ((looking-at "
    ")
    -	    (goto-char (match-end 0))
    -	    (if (looking-at "$") (forward-char))
    -	    (delete-region (point-min) (point))
    -	    (nnweb-remove-markup)
    -	    (let ((w3-html-entities (cons '(nbsp . 32) w3-html-entities)))
    -	      (nnweb-decode-entities))
    -	    nil)
    -	   (t
    -	    (setq mime t)
    -	    (insert "<#part type=\"text/html\" disposition=inline>")
    -	    (goto-char (point-max))
    -	    (insert "<#/part>")))
    -	  (goto-char (point-max))
    -	  (setq p (point))
    -	  (widen)))
    -      (delete-region p (point-max))
    -      (goto-char (point-min))
    -      ;; Some blank line to seperate mails.
    -      (insert "\n\nFrom nobody " (current-time-string) "\n")
    -      (insert "X-Gnus-Webmail: " (symbol-value 'user)
    -	      "@" (symbol-name webmail-type) "\n")
    -      (if id
    -	  (insert (format "X-Message-ID: <%s@hotmail.com>\n" id)))
    -      (unless (looking-at "$")
    -	(if (search-forward "\n\n" nil t)
    -	    (forward-line -1)
    -	  (webmail-error "article@2")))
    -      (narrow-to-region (point) (point-max))
    -      (if mime
    -	  (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)))
    -
    -;;; yahoo
    -
    -(defun webmail-yahoo-open ()
    -  (goto-char (point-min))
    -  (if (re-search-forward "action=\"\\([^\"]+\\)\"" nil t)
    -      (setq webmail-aux (match-string 1))
    -    (webmail-error "open@1")))
    -
    -(defun webmail-yahoo-login ()
    -  (goto-char (point-min))
    -  (if (re-search-forward "http://[^/]+[0-9]\\.mail\\.yahoo\\.com/" nil t)
    -      (setq webmail-aux (match-string 0))
    -    (webmail-error "login@1"))
    -  (if (re-search-forward "YY=[0-9]+" nil t)
    -      (setq webmail-aux (concat webmail-aux "ym/ShowFolder?"
    -				(match-string 0)))
    -    (webmail-error "login@2")))
    -
    -(defun webmail-yahoo-list ()
    -  (let (url (newp t) (tofetch 0))
    -    (goto-char (point-min))
    -    (when (re-search-forward
    -	   "showing [0-9]+-\\([0-9]+\\) of \\([0-9]+\\)" nil t)
    -      ;;(setq listed (match-string 1))
    -      (message "Found %s mail(s)" (match-string 2)))
    -    (if (string-match "http://[^/]+" webmail-aux)
    -	(setq webmail-aux (match-string 0 webmail-aux))
    -      (webmail-error "list@1"))
    -    (goto-char (point-min))
    -    (while (re-search-forward
    -	    "bgcolor=\"#eeeeee\"\\|href=\"\\(/ym/ShowLetter\\?MsgId=\\([^&]+\\)&[^\"]*\\)\""
    -	    nil t)
    -      (if (setq url (match-string 1))
    -	  (progn
    -	    (when (or newp (not webmail-newmail-only))
    -	      (push (cons (match-string 2) (concat webmail-aux url "&toc=1"))
    -		    webmail-articles)
    -	      (setq tofetch (1+ tofetch)))
    -	    (setq newp t))
    -	(setq newp nil)))
    -    (setq webmail-articles (nreverse webmail-articles))
    -    (message "Fetching %d mail(s)" tofetch)))
    -
    -(defun webmail-yahoo-article (file id)
    -  (let (p attachment)
    -    (save-restriction
    -      (goto-char (point-min))
    -      (if (not (search-forward "value=\"Done\"" nil t))
    -	  (webmail-error "article@1"))
    -      (if (not (search-forward "" nil t))
    -	  (webmail-error "article@3"))
    -      (narrow-to-region (point-min) (match-end 0))
    -      (while (search-forward "" nil t)
    -	(delete-region p (match-end 0)))
    -      (nnweb-remove-markup)
    -      (let ((w3-html-entities (cons '(nbsp . 32) w3-html-entities)))
    -	(nnweb-decode-entities))
    -      (goto-char (point-min))
    -      (delete-blank-lines)
    -      (goto-char (point-max))
    -      (widen)
    -      (insert "\n")
    -      (setq p (point))
    -      (while (re-search-forward "[^\"]*/ShowLetter/[^\?]+\?[^\"]*" nil t)
    -	(setq attachment (match-string 0))
    -	(let (bufname ct ctl cd description)
    -	  (if (not (search-forward "" nil t))
    -	      (webmail-error "article@5"))
    -	  (narrow-to-region p (match-end 0))
    -	  (nnweb-remove-markup)
    -	  (let ((w3-html-entities (cons '(nbsp . 32) w3-html-entities)))
    -	    (nnweb-decode-entities))
    -	  (goto-char (point-min))
    -	  (delete-blank-lines)
    -	  (setq ct (mail-fetch-field "content-type")
    -		ctl (ignore-errors (mail-header-parse-content-type ct))
    -		;;cte (mail-fetch-field "content-transfer-encoding")
    -		cd (mail-fetch-field "content-disposition")
    -		description (mail-fetch-field "content-description")
    -		id (mail-fetch-field "content-id"))
    -	  (delete-region (point-min) (point-max))
    -	  (widen)
    -	  (save-excursion
    -	    (set-buffer (generate-new-buffer " *webmail-att*"))
    -	    (nnweb-insert (concat webmail-aux attachment))
    -	    (push (current-buffer) webmail-buffer-list)
    -	    (setq bufname (buffer-name)))
    -	  (insert "<#part")
    -	  (if (and ctl (not (equal (car ctl) "text/")))
    -	      (insert " type=\"" (car ctl) "\""))
    -	  (insert " buffer=\"" bufname "\"")
    -	  (if cd
    -	      (insert " disposition=\"" cd "\""))
    -	  (if description
    -	      (insert " description=\"" description "\""))
    -	  (insert "><#/part>\n")
    -	  (setq p (point))))
    -      (delete-region p (point-max))
    -      (goto-char (point-min))
    -      ;; Some blank line to seperate mails.
    -      (insert "\n\nFrom nobody " (current-time-string) "\n")
    -      (insert "X-Gnus-Webmail: " (symbol-value 'user)
    -	      "@" (symbol-name webmail-type) "\n")
    -      (if id
    -	  (insert (format "X-Message-ID: <%s@yahoo.com>\n" id)))
    -      (unless (looking-at "$")
    -	(if (search-forward "\n\n" nil t)
    -	    (forward-line -1)
    -	  (webmail-error "article@2")))
    -      (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)))
    -
    -;;; netaddress
    -
    -(defun webmail-netscape-open ()
    -  (goto-char (point-min))
    -  (setq webmail-aux "")
    -  (while (re-search-forward
    -	  "TYPE=hidden *NAME=\\([^ ]+\\) *VALUE=\"\\([^\"]+\\)"
    -	  nil t)
    -    (setq webmail-aux (concat webmail-aux "&" (match-string 1) "="
    -			      (match-string 2)))))
    -
    -(defun webmail-netaddress-open ()
    -  (goto-char (point-min))
    -  (if (re-search-forward "action=\"\\([^\"]+\\)\"" nil t)
    -      (setq webmail-aux (concat (car webmail-open-url) (match-string 1)))
    -    (webmail-error "open@1")))
    -
    -(defun webmail-netaddress-login ()
    -  (webmail-refresh-redirect)
    -  (goto-char (point-min))
    -  (if (re-search-forward  "tpl/[^/]+/\\([^/]+\\)" nil t)
    -      (setq webmail-session (match-string 1))
    -    (webmail-error "login@1")))
    -
    -(defun webmail-netaddress-list ()
    -  (webmail-refresh-redirect)
    -  (let (item id)
    -    (goto-char (point-min))
    -    (when (re-search-forward
    -	   "(\\([0-9]+\\) unread, \\([0-9]+\\) total)" nil t)
    -      (message "Found %s mail(s), %s unread"
    -	       (match-string 2) (match-string 1)))
    -    (goto-char (point-min))
    -    (while (re-search-forward
    -	    "MR\\[i\\]\\.R='\\([^']*\\)'\\|MR\\[i\\]\\.Q='\\([^']+\\)'" nil t)
    -      (if (setq id (match-string 2))
    -	  (setq item
    -		(cons id
    -		      (format "%s/tpl/Message/%s/Read?Q=%s&FolderID=-4&SortUseCase=True&Sort=Date&Headers=True"
    -			      (car webmail-article-url)
    -			      webmail-session id)))
    -	(if (or (not webmail-newmail-only)
    -		(equal (match-string 1) "True"))
    -	    (push item webmail-articles))))
    -    (setq webmail-articles (nreverse webmail-articles))))
    -
    -(defun webmail-netaddress-single-part ()
    -  (goto-char (point-min))
    -  (cond
    -   ((looking-at "[\t\040\r\n]*]+>[\t\040\r\n]*")
    -    ;; text/plain
    -    (replace-match "")
    -    (while (re-search-forward "[\t\040\r\n]+" nil t)
    -      (replace-match " "))
    -    (goto-char (point-min))
    -    (while (re-search-forward "
    " nil t) - (replace-match "\n")) - (nnweb-remove-markup) - (let ((w3-html-entities (cons '(nbsp . 32) w3-html-entities))) - (nnweb-decode-entities)) - nil) - (t - (insert "<#part type=\"text/html\" disposition=inline>") - (goto-char (point-max)) - (insert "<#/part>") - t))) - -(defun webmail-netaddress-article (file id) - (webmail-refresh-redirect) - (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 (search-forward "" nil t) - (replace-match "\n")) - (nnweb-remove-markup) - (let ((w3-html-entities (cons '(nbsp . 32) w3-html-entities))) - (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 - "[\040\t]*
    [\040\t\r\n]*
    [\040\t\r\n]*" - 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") - (insert "X-Gnus-Webmail: " (symbol-value 'user) - "@" (symbol-name webmail-type) "\n") - (if id - (insert (format "X-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) - (let ((w3-html-entities (cons '(nbsp . 32) w3-html-entities))) - (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") - (insert "X-Gnus-Webmail: " (symbol-value 'user) - "@" (symbol-name webmail-type) "\n") - (if id - (insert (format "X-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))) - -;;; my-deja - -(defun webmail-my-deja-open () - (webmail-refresh-redirect) - (goto-char (point-min)) - (if (re-search-forward "action=\"\\([^\"]+maillogin\\.py[^\"]*\\)\"" - nil t) - (setq webmail-aux (match-string 1)) - (webmail-error "open@1"))) - -(defun webmail-my-deja-list () - (let (item id newp base) - (goto-char (point-min)) - (when (re-search-forward "href=\"\\(\\([^\"]*\\)/mailnf\\.[^\"]*\\)\"" - nil t) - (let ((url (match-string 1))) - (setq base (match-string 2)) - (erase-buffer) - (nnweb-insert url))) - (goto-char (point-min)) - (when (re-search-forward - "(\\([0-9]+\\) Message.?-[^>]*\\([0-9]+\\) New" - nil t) - (message "Found %s mail(s), %s unread" - (match-string 1) (match-string 2))) - (goto-char (point-min)) - (while (re-search-forward - "newmail\\.gif\\|href=\"[^\"]*\\(mailnf\\.[^\"]+act=view[^\"]+mid=\\([^\"&]+\\)[^\"]+\\)\"" - nil t) - (if (setq id (match-string 2)) - (when (and (or newp (not webmail-newmail-only)) - (not (assoc id webmail-articles))) - (push (cons id (setq webmail-aux - (concat base "/" (match-string 1)))) - webmail-articles) - (setq newp nil)) - (setq newp t))) - (setq webmail-articles (nreverse webmail-articles)))) - -(defun webmail-my-deja-article-part (base) - (let (p) - (cond - ((looking-at "[\t\040\r\n]* - mail-source-delete-incoming. Suggested by Karl Kleinpaste - . - -2000-10-18 Dave Love - - * gnus.texi (NoCeM): Update. - -2000-10-17 Simon Josefsson - - * gnus.texi (IMAP): Add. - -2000-10-05 Kai Gro,A_(Bjohann - - * gnus.texi (Windows Configuration): add examples; first example - suggested by Stein A. Str,Ax(Bmme . (The actual - Lisp code is also from him.) - -2000-10-07 Dave Love - - * doclicense.texi: New file. - -2000-10-07 16:50:14 ShengHuo ZHU - - * Makefile.in: Use install-info. - -2000-10-06 14:38:27 ShengHuo ZHU - - * message.texi (Message Headers): Add. - -2000-10-04 09:23:49 ShengHuo ZHU - - * gnus.texi (Article Hiding): Add. - (Using MIME): Add. - -2000-09-30 Simon Josefsson - - * gnus.texi (Agent and IMAP): Add. - (Splitting in IMAP): Fix. - -2000-09-29 Simon Josefsson - - * gnus.texi (Converting Kill Files): Fix URL. - (Posting Styles): Fix regexp. - (Mail Source Specifiers): Fix. - -2000-09-29 12:53:27 ShengHuo ZHU - - * Makefile.in: A workaround for @ifnottex. - -2000-09-29 12:36:13 ShengHuo ZHU - - * gnus.texi: Remove @c lines in the directory due to a bug in - makeinfo 1.68 (GNU texinfo 3.12). - -2000-09-22 Dave Love - - * message.texi, gnus.texi, emacs-mime.texi: Convert to GFDL. - -2000-09-20 John H. Palmieri - - * gnus.texi (Mail Source Customization): Document of - mail-source-incoming-file-prefix. - -2000-09-20 Simon Josefsson - - * gnus.texi (IMAP): Add examples. - -2000-09-19 Kai Gro,A_(Bjohann - - * gnus.texi (IMAP): Add pointer to description of ~/.authinfo file - format. - -2000-09-17 Felix Natter - - * gnusref.tex: New version. - - * refcard.tex: New version. - -2000-09-17 18:03:52 ShengHuo ZHU - - * gnus.texi (Article Hiding): Doc fix as suggested by Felix Natter - . - -2000-06-22 Michael Totschnig - - * gnus.texi (Agent Basics): Doc fix. - -2000-09-14 Jason R. Mastaler - - * gnus.texi (Mail Source Specifiers): Use $HOME. - -2000-08-14 Kai Grossjohann - - * gnus.texi (Mail Source Specifiers): Replace `@paragraph' with - `@subsubheading'. - -2000-08-14 Kai Grossjohann - - * gnus.texi (Mail Source Specifiers): Try to document the - interface to the functions called via (among others) the - `:function' keyword. - -2000-08-13 20:00:35 ShengHuo ZHU - - * gnus.texi (Topic Commands): Fix typo. - -2000-08-13 20:20:56 Lars Magne Ingebrigtsen - - * gnus.texi (Topic Commands): Addition. - -2000-08-11 Kai Grossjohann - - * gnus.texi (Expiring Mail): Extend documentation of variable - `nnmail-expiry-target' and of group parameter `expiry-target'. - Explain interaction between these. Add Lisp example for setting - `nnmail-expiry-target'. - -2000-08-04 Andreas Oeldenberger - - * message.texi (Forwarding): Fix. - -2000-07-15 Simon Josefsson - - * gnus.texi (nnimap-authinfo-file): - (gnus-invalid-group-regexp): Add. - (Mail Source Specifiers): Fix. - (IMAP): Fix. - (Agent Basics): Fix. - -2000-07-12 19:37:19 ShengHuo ZHU - - * gnus.texi (Article Washing): Add keystroke `t'. - -2000-07-12 15:49:34 ShengHuo ZHU - - * Makefile.in: Add EMACS. Test -x "$(MAKEINFO)" does not work. - Use sed instead of perl (suggested by Nick V. Pakoulin). - -2000-07-03 00:24:55 Lars Magne Ingebrigtsen - - * gnus.texi (Splitting Mail): Mention gnus-summary-respool-trace. - (Searching for Articles): Fix. - (Newest Features): Fix. - -2000-06-28 Simon Josefsson - - * gnus.texi (Splitting in IMAP): Update. - -2000-05-19 15:18:32 Dmitry Yaitskov - - * message.texi (Reply): Doc fix. - -2000-05-17 00:50:29 Shenghuo ZHU - - * gnus.texi (Listing Groups): Addition. - -2000-05-16 21:46:40 Shenghuo ZHU - - * gnus.texi (Misc Group Stuff): Addition. - (Article Washing): Ditto. - -2000-05-15 10:16:29 Shenghuo ZHU - - * gnus.texi (Mail Source Specifiers): Update maildir. - -2000-05-07 Pavel Janik - - * gnus.texi: direntry added. - - * message.texi: direntry added. - - * emacs-mime.texi: direntry added. - -2000-05-02 Pavel Janik - - * gnus.texi (MIME comands): Spelling fix. - -2000-05-03 21:12:05 Shenghuo ZHU - - * gnus.texi (Summary Mail Commands): Addition. - (Summary Post Commands): Ditto. - -2000-04-27 Dave Love - - * gnus.texi (Article Washing): Update x-face bit. - -2000-04-26 Florian Weimer - - * message.texi (Various Message Variables): Document - message-default-charset. - - * emacs-mime.texi (Charset Translation): New section. - -2000-04-26 02:30:06 Shenghuo ZHU - - * gnus.texi (Posting Styles): Addition. - -2000-04-24 17:09:17 Felix Natter - - * gnusref.tex: New version. - - * refcard.tex: New version. - -2000-04-23 00:32:23 Lars Magne Ingebrigtsen - - * gnus.texi (Thread Commands): Add keystrokes. - (Various Summary Stuff): Addition. - -2000-04-22 21:12:25 Alan Shutko - - * Makefile.in: Add pdf support. - -2000-04-21 12:07:20 Shenghuo ZHU - - * gnus.texi (Listing Groups): Addition. - -2000-04-21 13:45:52 Pavel Janik - - * gnus.texi (Mail Source Specifiers): Example for :plugged. - -2000-04-20 20:37:48 Pavel Janik - - * gnus.texi (Limiting): Fix. - -2000-04-20 20:32:40 Dmitry Yaitskov - - * gnus.texi (Charsets): Typo fix. - -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 - - * gnus.texi (MIME Commands): Fix. - -2000-01-03 Karl Kleinpaste - - * gnus.texi (Splitting in IMAP): Add '.' after @xref. - -2000-01-02 08:39:18 Lars Magne Ingebrigtsen - - * gnus.texi: Closing paren. - Doc fix. - -1999-12-28 Simon Josefsson - - * gnus.texi (Article Hiding): Addition. - (Splitting in IMAP): Addition. - -1999-12-17 12:12:41 Shenghuo ZHU - - * gnus.texi (Mail Source Specifiers): Addition. - -1999-12-13 23:47:50 Shenghuo ZHU - - * gnus.texi (Mail Source Specifiers): Addition. - -1999-12-07 00:19:31 Shenghuo ZHU - - * gnus.texi (Web Archive): Addition. - -1999-12-06 05:17:15 Lars Magne Ingebrigtsen - - * gnus.texi (Slashdot): Addition. - -1999-12-05 00:54:28 Lars Magne Ingebrigtsen - - * gnus.texi (Mail Source Specifiers): Removed backslashes. - -1999-12-04 07:35:51 Lars Magne Ingebrigtsen - - * gnus.texi (Setting Process Marks): Addition. - -1999-12-04 05:09:46 Manoj Srivastava - - * gnus.texi: Use defface instead of face-spec-set. - -1999-12-04 02:31:25 Lars Magne Ingebrigtsen - - * gnus.texi (extension): Posting server fix. - Url update. - -1999-12-04 01:16:52 Yoshiki Hayashi - - * gnus.texi (group-buffer): Fix "theese". - -1999-12-04 01:13:51 Thomas Gellekum - - * gnus.texi (Height): Typo fix. - -1999-11-13 Adrian Aichner - - * xemacs.mak: New NMAKE file to support build and install of info - documentation on Windows NT, requiring the `texinfo' XEmacs - package. - -1999-12-03 00:02:11 Lars Magne Ingebrigtsen - - * gnus.texi (Other Gnus Versions): New. - (Gnus Versions): Made into own node. - -1999-12-02 00:00:00 Lars Magne Ingebrigtsen - - * gnus.texi (Paging the Article): Addition. - (History): Addition. - -1999-11-24 Carsten Leonhardt - - * gnus.texi (Mail Source Specifiers): Mention maildir in the - overview and the possibility to use remote maildirs. - -1999-12-01 14:21:19 Lars Magne Ingebrigtsen - - * gnus.texi (Topic Parameters): Addition. - (Summary Message Commands): New. - (Canceling and Superseding): Made into subsection. - (Charsets): Addition. - -1999-11-30 10:54:31 Shenghuo ZHU - - * gnus.texi (Mail Source Specifiers): Add a note. - -1999-11-27 17:15:00 Lars Magne Ingebrigtsen - - * gnus.texi: Typo fixes and @sc. - -1999-11-26 16:59:29 Lars Magne Ingebrigtsen - - * gnus.texi (On Writing Manuals): New. - -1999-11-23 17:23:37 Shenghuo ZHU - - * gnus.texi (Mail Source Specifiers): Update. - -1999-11-23 05:07:59 Shenghuo ZHU - - * gnus.texi (Web Archive): Add nnwarchive. - -1999-11-23 03:05:32 Shenghuo ZHU - - * gnus.texi (Mail Source Specifiers): Add webmail. - -1999-11-19 12:15:23 Lars Magne Ingebrigtsen - - * gnus.texi (Slashdot): Addition. - -1999-11-17 Per Abrahamsen - - * gnus.texi (Finding the Parent): Fix example. - -1999-11-16 10:09:44 Lars Magne Ingebrigtsen - - * gnus.texi: Addition. - (present): Addition. - -1999-11-13 Simon Josefsson - - * gnus.texi (Mail Source Specifiers): Fix. Added documentation for - IMAP mail-source keywords `fetchflag' and `dontexpunge'. - -1999-11-12 18:00:56 Eli Zaretskii - - * gnus.texi (Fancy Mail Splitting): Fix @vars. - -1999-11-12 17:08:35 Gunnar Evermann - - * gnus.texi (Splitting in IMAP): @@ fix. - -1999-11-12 08:17:49 Lars Magne Ingebrigtsen - - * gnus.texi (Mail Source Specifiers): Addition. - -1999-11-12 08:17:44 Ulf Betlehem - - * gnus.texi (Mail Source Specifiers): Example. - -1999-11-12 05:26:22 Lars Magne Ingebrigtsen - - * gnus.texi (Slashdot): Addition. - -1999-11-11 04:32:57 Lars Magne Ingebrigtsen - - * message.texi (News Headers): Fix. - - * gnus.texi (Browsing the Web): New. - (Slashdot): New. - (Ultimate): New. - -1999-11-10 11:32:00 Lars Magne Ingebrigtsen - - * gnus.texi (Archived Messages): Fix. - -1999-11-07 01:28:07 Lars Magne Ingebrigtsen - - * gnus.texi (MIME Commands): Addition. - -1999-11-06 23:09:31 Lars Magne Ingebrigtsen - - * gnus.texi (Customizing Articles): Fix. - -1999-11-05 22:34:23 Lars Magne Ingebrigtsen - - * gnus.texi (Posting Styles): Addition. - -1999-10-23 Simon Josefsson - - * gnus.texi (Mail Source Specifiers): Add imap mail-source. - (IMAP): New subsection. - (SOUP): Typo. - -1999-09-27 16:07:31 Lars Magne Ingebrigtsen - - * emacs-mime.texi (New Viewers): Fix. - -1999-10-29 David S. Goldberg - - * emacs-mime.texi (Customization): Document mm-inline-override-types - -1999-09-25 10:58:17 Lars Magne Ingebrigtsen - - * message.texi (Forwarding): Updated. - - * emacs-mime.texi (New Viewers): New. - -1999-09-24 18:52:34 Lars Magne Ingebrigtsen - - * gnus.texi (Group Line Specification): Doc fix. - -1999-09-24 18:06:33 Bill White - - * gnus.texi (Article Washing): Fix. - -1999-08-27 20:47:39 Lars Magne Ingebrigtsen - - * gnus.texi (Posting Styles): Doc fix. - -1999-08-27 18:51:42 Robin S. Socha - - * gnus.texi: Typo fix. - -1999-08-27 15:09:01 Jim Meyering - - * gnus.texi (The Active File): Typo fix. - -1999-08-27 15:00:23 Yoshiki Hayashi - - * gnus.texi (Generic Marking Commands): Typo fixes. - -1999-08-27 14:46:21 Lee Willis - - * gnus.texi (Customizing Articles): More explanation. - -1999-07-10 Mike McEwan - - * gnus.texi (More Threading): Document new variable - `gnus-sort-gathered-threads-function'. - -1999-07-30 Simon Josefsson - - * gnus.texi: Added `gnus-list-identifiers' stuff. - -1999-07-09 19:41:34 Lars Magne Ingebrigtsen - - * gnus.texi (Using MIME): Addition. - (Topic Commands): Addition. - -1999-07-06 05:37:46 Alexandre Oliva - - * gnus.texi (Fancy Mail Splitting): Document RESTRICT. - -1999-07-07 10:26:59 Robin S. Socha - - * gnus.texi (Scoring Tips): Typo. - -1999-07-06 11:41:59 Lars Magne Ingebrigtsen - - * gnus.texi (Mail Source Specifiers): Fix. - (Mail Source Customization): Deleted obsolete vars. - -1999-07-05 05:16:55 Laura Conrad - - * gnus.texi (Mail in a Newsreader): Rewrite. - -1999-07-04 04:33:50 Lars Magne Ingebrigtsen - - * gnus.texi (Posting Styles): Fix. - (Mail in a Newsreader): New. - -1999-06-13 02:29:22 Lars Magne Ingebrigtsen - - * gnus.texi (MIME Commands): Addition. - (Article Miscellania): New. - (Customizing Articles): Addition. - -1999-06-12 00:13:25 Lars Magne Ingebrigtsen - - * gnus.texi (Comparing Mail Backends): Slight edits. - -1999-06-12 00:13:20 Karl Kleinpaste - - * gnus.texi (Comparing Mail Backends): New. - -1999-06-11 21:47:22 Lars Magne Ingebrigtsen - - * gnus.texi (Group Score): Doc fix. - (The Active File): Addition. - (Document Groups): Addition. - -1999-04-18 Didier Verna - - * gnus.texi (Article treatment): document the new variable - `gnus-article-date-lapsed-new-header'. - -1999-04-26 Robert Bihlmeyer - - * gnus.texi (Posting Styles): Typo. - -1999-04-18 12:46:33 Lars Magne Ingebrigtsen - - * gnus.texi (Summary Score Commands): Typo. - (Choosing a Mail Backend): Addition. - -1999-04-18 09:24:51 Yoshiki Hayashi - - * gnus.texi (Startup Variables): Fix. - -1999-04-18 09:12:28 Starback - - * gnus.texi (Subscription Methods): Typo. - -1999-04-18 08:22:27 Lars Magne Ingebrigtsen - - * gnus.texi (Little Disk Space): Addition. - -1999-03-25 Erik Toubro Nielsen - - * gnus.texi (gnus-thread-sort-functions). 'reverse' => 'not' - -1999-04-17 10:21:01 Jack Twilley - - * gnus.texi (Fancy Mail Splitting): Addition. - -1999-04-07 06:13:08 Lars Magne Ingebrigtsen - - * gnus.texi (Gnus Development): New. - -1999-03-06 20:12:50 Lars Magne Ingebrigtsen - - * gnus.texi (Generic Marking Commands): New. - -1999-03-01 16:41:42 Rob Browning - - * gnus.texi (Score Variables): Clarify. - -1999-02-26 Andreas Jaeger - - * gnus.texi: Add ',' after @xrefs. - -1999-02-26 20:54:34 Jason R. Mastaler - - * gnus.texi (Article Date): Added joke by Colin Rafferty - (colin@xemacs.org). - -1999-02-26 08:26:10 Lars Magne Ingebrigtsen - - * gnus.texi (Mail Source Specifiers): Fix. - -Thu Feb 25 00:28:49 1999 Shenghuo ZHU - - * gnus.texi (Category Syntax): Typo fix. - -1999-02-21 11:42:54 Vladimir Volovich - - * Makefile.in (.texi): Fix check for MAKEINFO. - -1999-02-20 17:33:55 Lars Magne Ingebrigtsen - - * gnus.texi (Mail Source Specifiers): Addition. - -1999-02-11 19:19:02 Carsten Leonhardt - - * gnus.texi (Mail Source Specifiers): Document maildir. - -1999-02-09 16:21:35 Lars Magne Ingebrigtsen - - * gnus.texi (Charsets): New. - -1999-02-04 03:45:15 Lars Magne Ingebrigtsen - - * emacs-mime.texi (Conversion): New. - -1999-02-03 03:04:18 Miguel de Icaza - - * gnus.texi (Fetching Mail): Typo fix. - -1999-02-02 22:28:42 Lars Magne Ingebrigtsen - - * gnus.texi (Mail Source Specifiers): Addition. - -1999-02-01 21:05:18 Lars Magne Ingebrigtsen - - * gnus.texi (Article Hiding): Addition. - -1999-01-28 08:08:28 Lars Magne Ingebrigtsen - - * gnus.texi (Washing Mail): Addition. - -1999-01-27 14:30:39 Lars Magne Ingebrigtsen - - * gnus.texi (Article Washing): Addition. - -1999-01-25 04:24:01 Lars Magne Ingebrigtsen - - * message.texi (MIME): New. - - * gnus.texi (Mail Sources): New. - (Mail Source Specifiers): New. - (Mail Source Customization): New. - (Fetching Mail): New. - -1999-01-23 09:47:16 Lars Magne Ingebrigtsen - - * gnus.texi (Article Washing): Removed. - (Customizing Articles): Addition. - -1999-01-16 20:36:48 Lars Magne Ingebrigtsen - - * gnus.texi (Customizing Articles): Rewrite. - Remove mention of gnus-article-display-hook. - -1999-01-12 07:14:12 Lars Magne Ingebrigtsen - - * gnus.texi (To From Newsgroups): Addition. - -1999-01-03 13:54:51 Lars Magne Ingebrigtsen - - * gnus.texi (Group Agent Commands): Addition. - -1998-12-19 23:29:50 Lars Magne Ingebrigtsen - - * gnus.texi (Splitting Mail): Addition. - -1998-12-13 08:54:07 Lars Magne Ingebrigtsen - - * message.texi (Insertion): Add. - -1998-12-03 13:34:48 James Troup - - * gnus.texi (MIME Commands): Typo fix. - -1998-12-03 Didier Verna - - * gnus.texi (Group Parameters): update for the posting-style group - parameter. - -1998-12-02 01:04:22 Lars Magne Ingebrigtsen - - * gnus.texi (Emacsen): Addition. - (Picon Useless Configuration): Addition. - -1998-12-01 00:27:04 Lars Magne Ingebrigtsen - - * emacs-mime.texi (rfc2045): New. - -1998-11-29 00:03:43 Lars Magne Ingebrigtsen - - * emacs-mime.texi (Composing): New chapter. - -1998-11-25 Karl Eichwalder - - * Makefile.in (install): Remove emacs-info, add emacs-mime. - -1998-11-25 10:56:08 Lars Magne Ingebrigtsen - - * gnus.texi (To From Newsgroups): Addition. - (Anything Groups): Addition. - (Article Washing): Addition. - (MIME Commands): Addition. - -1998-11-19 04:05:15 Lars Magne Ingebrigtsen - - * gnus.texi (Really Various Summary Commands): Addition. - -1998-11-18 00:52:46 Lars Magne Ingebrigtsen - - * gnus.texi (MIME Commands): Addition. - (Expiring Mail): Addition. - -1998-11-07 17:18:07 Lars Magne Ingebrigtsen - - * gnus.texi (Gnus Reference Guide): Renamed. - -1998-10-26 22:03:08 Lars Magne Ingebrigtsen - - * gnus.texi (Article Washing): Fix. - (MIME Commands): Change. - -1998-10-25 01:51:56 Lars Magne Ingebrigtsen - - * gnus.texi (Headers): Addition. - -1998-10-24 08:37:12 Lars Magne Ingebrigtsen - - * gnus.texi (Summary Buffer Lines): Addition. - (To): New. - (To): Addition. - -1998-10-15 18:15:34 Simon Josefsson - - * gnus.texi (Group Info): Must be list of ranges. - -1998-10-19 01:27:26 Lars Magne Ingebrigtsen - - * gnus.texi (Article Washing): Addition. - -1998-10-18 00:20:58 Lars Magne Ingebrigtsen - - * gnus.texi (Changing Servers): Addition. - -1998-10-17 21:34:57 Lars Magne Ingebrigtsen - - * gnus.texi (Windows Configuration): Addition. - -1998-10-01 07:55:35 Lars Magne Ingebrigtsen - - * gnus.texi (Splitting Mail): Fix. - (Washing Mail): Fix. - -1998-09-30 05:54:45 Lars Magne Ingebrigtsen - - * gnus.texi (Selecting a Group): Addition. - -1998-09-13 08:58:56 Lars Magne Ingebrigtsen - - * dir (File): Updated. - -1998-09-12 08:53:05 Lars Magne Ingebrigtsen - - * emacs-mime.texi: New file. - - * gnus.texi (Misc Article): Addition. - -1998-09-11 08:52:50 Lars Magne Ingebrigtsen - - * gnus.texi (Group Score Commands): Fix. - (Saving Articles): Fix. - (Agent Expiry): Fix. - (Using MIME): Change. - -1998-09-10 03:19:14 Lars Magne Ingebrigtsen - - * gnus.texi (Windows Configuration): Addition. - -1998-09-06 Mike McEwan - - * gnus.texi (Category Syntax): Added doc about agent categories - and download scoring. - -1998-09-05 17:36:14 Lars Magne Ingebrigtsen - - * gnus.texi (Sorting Groups): Change. - (Various Summary Stuff): Addition. - -1998-09-04 00:40:07 David S. Goldberg - - * gnus.texi (Article Hiding): Verify. - -1998-08-31 11:46:57 Lars Magne Ingebrigtsen - - * gnus.texi (Mail Folders): Addition. - (Group Parameters): Addition. - (MIME Commands): New. - -1998-08-27 07:29:17 Lars Magne Ingebrigtsen - - * gnus.texi (Mail Folders): Addition. - -;; Local Variables: -;; coding: iso-2022-7bit -;; End: diff --git a/texi/Makefile.in b/texi/Makefile.in deleted file mode 100644 index 0e42c1b..0000000 --- a/texi/Makefile.in +++ /dev/null @@ -1,260 +0,0 @@ -infodir = @infodir@ -prefix = @prefix@ -srcdir = @srcdir@ -subdir = texi -top_srcdir = @top_srcdir@ - -@SET_MAKE@ -VPATH=$(srcdir) -TEXI2DVI=texi2dvi -TEXI2PDF=texi2pdf -MAKEINFO=@MAKEINFO@ -EMACS=@EMACS@ -EMACSCOMP=$(EMACS) -batch -q -no-site-file -EMACSINFO=$(EMACSCOMP) -l $(srcdir)/infohack.el -f batch-makeinfo -PDFLATEX=pdflatex -LATEX=latex -DVIPS=dvips -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -SHELL = /bin/sh -PAPERTYPE=a4 -INFO_DEPS=gnus message emacs-mime -INFO_DEPS_JA=gnus-ja message-ja -INFO_DEPS_INFO=gnus.info message.info emacs-mime.info -INFO_DEPS_JA_INFO=gnus-ja.info message-ja.info - -all: $(INFO_DEPS) -all-info: $(INFO_DEPS_INFO) - -gnus.info: gnus.texi gnus-faq.texi -message.info: message.texi -emacs-mime.info: emacs-mime.texi - -ja: $(INFO_DEPS_JA) -ja-info: $(INFO_DEPS_JA_INFO) - -gnus-ja.info: gnus-ja.texi gnus-faq-ja.texi -message-ja.info: message-ja.texi - -most: texi2latex.elc latex latexps - -%-ja: %-ja.texi - $(EMACSINFO) $< - -%-ja.info: %-ja.texi - $(EMACSINFO) $< t - -%.info: %.texi - if test "x$(MAKEINFO)" = "xno" \ - -o "$<" = "gnus-ja.texi" \ - -o "$<" = "message-ja.texi"; then \ - $(EMACSINFO) $< t; \ - else \ - $(MAKEINFO) -I $(srcdir) -o $@ $<; \ - fi - -.SUFFIXES: .texi .dvi .ps .pdf - -.texi: - if test "x$(MAKEINFO)" = "xno" \ - -o "$<" = "gnus-ja.texi" \ - -o "$<" = "message-ja.texi"; then \ - $(EMACSINFO) $<; \ - else \ - $(MAKEINFO) -I $(srcdir) -o $* $<; \ - fi - -dvi: gnus.dvi message.dvi refcard.dvi emacs-mime.dvi - -pdf: gnus.pdf message.pdf refcard.pdf emacs-mime.pdf - -.texi.dvi : - sed -e '/@iflatex/,/@end iflatex/d' $< > gnustmp.texi - $(TEXI2DVI) -I $(srcdir) gnustmp.texi - cp gnustmp.dvi $*.dvi - rm gnustmp.* - -.texi.pdf : - sed -e '/@iflatex/,/@end iflatex/d' $< > gnustmp.texi - $(TEXI2PDF) -I $(srcdir) gnustmp.texi - cp gnustmp.pdf $*.pdf - rm gnustmp.* - -refcard.dvi: refcard.tex gnuslogo.refcard gnusref.tex - TEXINPUTS=$(srcdir):$$TEXINPUTS $(LATEX) refcard.tex - - -refcard.pdf: refcard.tex gnuslogo.refcard gnusref.tex - epstopdf $(srcdir)/gnuslogo.refcard --outfile=gnuslogo.refcard.pdf - TEXINPUTS=$(srcdir):$$TEXINPUTS $(PDFLATEX) refcard.tex - -clean: - rm -f *.orig *.rej *.elc *~ gnus-[0-9] gnus-[0-9][0-9] - rm -f message-[0-9] - rm -f $(INFO_DEPS) - rm -f gnus-ja-[0-9] gnus-ja-[0-9][0-9] - rm -f message-ja-[0-9] - rm -f $(INFO_DEPS_JA) - rm -f gnus.info-[0-9] gnus.info-[0-9][0-9] - rm -f message.info-[0-9] - rm -f $(INFO_DEPS_INFO) - rm -f gnus-ja.info-[0-9] gnus-ja.info-[0-9][0-9] - rm -f message-ja.info-[0-9] - rm -f $(INFO_DEPS_JA_INFO) - -makeinfo: - makeinfo -o gnus gnus.texi - makeinfo -o message message.texi - -texi2latex.elc: texi2latex.el - srcdir=$(srcdir)/../lisp $(EMACSCOMP) -l $(srcdir)/../lisp/dgnushack.el --eval '(byte-compile-file "$(srcdir)/texi2latex.el")' - -latex gnus.latexi gnus-faq.latexi: $(srcdir)/gnus.texi $(srcdir)/gnus-faq.texi texi2latex.elc - srcdir=$(srcdir) $(EMACSCOMP) -l ./texi2latex.elc -f latexi-translate - -latexps: gnus.latexi tmps - $(MAKE) texi2latex.elc - rm -f gnus.aux - egrep -v "label.*Index|chapter.*Index" gnus.latexi > gnus.tmplatexi1 - TEXINPUTS=$(srcdir):$$TEXINPUTS $(LATEX) gnus.tmplatexi1 - ./splitindex - makeindex -o gnus.kind gnus.kidx - makeindex -o gnus.cind gnus.cidx - makeindex -o gnus.gind gnus.gidx - sed 's/\\char 5E\\relax {}/\\symbol{"5E}/' < gnus.kind > gnus.tmpkind - mv gnus.tmpkind gnus.kind - egrep -v "end\{document\}" gnus.tmplatexi1 > gnus.tmplatexi - cat postamble.tex >> gnus.tmplatexi - $(LATEX) gnus.tmplatexi - $(LATEX) gnus.tmplatexi - $(DVIPS) -t $(PAPERTYPE) -f gnus.dvi > gnus.ps - -pss: - $(MAKE) latex - $(MAKE) latexps - -psout: tmps - $(MAKE) latex - $(MAKE) latexboth - $(MAKE) out - -latexboth: - rm -f gnus-manual-a4.ps.gz gnus-manual-standard.ps.gz - $(MAKE) latexps - mv gnus.ps gnus-manual-a4.ps - gzip gnus-manual-a4.ps - sed 's/,a4paper/,letterpaper/' gnus.latexi > gnus-standard.latexi - mv gnus-standard.latexi gnus.latexi - $(MAKE) latexps PAPERTYPE=letter - mv gnus.ps gnus-manual-standard.ps - gzip gnus-manual-standard.ps - -out: - cp gnus-manual-standard.ps.gz \ - gnus-manual-a4.ps.gz \ - /local/ftp/pub/emacs/gnus/manual - mv gnus-manual-standard.ps.gz \ - gnus-manual-a4.ps.gz \ - /hom/larsi/www_docs/www.gnus.org/documents - -veryclean: clean - rm -f gnus.dvi gnus.ps texi2latex.elc - -distclean: clean - rm -f Makefile - -install: $(INFO_DEPS) - $(SHELL) $(top_srcdir)/mkinstalldirs $(infodir) - @list='$(INFO_DEPS)'; \ - for file in $$list; do \ - for ifile in `echo $$file $$file-[0-9] $$file-[0-9][0-9]`; do \ - if test -f $$ifile; then \ - echo " $(INSTALL_DATA) $$ifile $(infodir)/$$ifile"; \ - $(INSTALL_DATA) $$ifile $(infodir)/$$ifile; \ - else : ; fi; \ - done; \ - done - @if $(SHELL) -c 'install-info --version | sed 1q | fgrep -s -v -i debian' >/dev/null 2>&1; then \ - list='$(INFO_DEPS)'; \ - for file in $$list; do \ - echo " install-info --info-dir=$(infodir) $(infodir)/$$file";\ - install-info --info-dir=$(infodir) $(infodir)/$$file || :;\ - done; \ - else : ; fi - -install-ja: $(INFO_DEPS_JA) - $(MAKE) INFO_DEPS='$(INFO_DEPS_JA)' EMACS="$(EMACS)" \ - infodir="$(infodir)" install - -install-info: $(INFO_DEPS_INFO) - $(MAKE) INFO_DEPS='$(INFO_DEPS_INFO)' EMACS="$(EMACS)" \ - infodir="$(infodir)" install - -install-ja-info: $(INFO_DEPS_JA_INFO) - $(MAKE) INFO_DEPS='$(INFO_DEPS_JA_INFO)' EMACS="$(EMACS)" \ - infodir="$(infodir)" install - -tmps: - if [ ! -e tmp ]; then mkdir tmp; fi - $(MAKE) screens - $(MAKE) herdss - $(MAKE) etcs - $(MAKE) piconss - $(MAKE) xfaces - $(MAKE) smiley - $(MAKE) miscs - -herdss: - cd herds ; for i in new-herd-[0-9]*.gif; do echo $$i; giftopnm $$i | pnmcrop -white | pnmmargin -white 9 | pnmscale 2 | pnmconvol convol5.pnm | ppmtopgm | pnmdepth 255 | pnmtops -width 100 -height 100 -noturn > ../tmp/`basename $$i .gif`.ps; done - cd herds ; giftopnm new-herd-section.gif | pnmscale 4 | pnmconvol convol11.pnm | ppmtopgm | pnmdepth 255 | pnmtops -noturn -width 100 -height 100 > ../tmp/new-herd-section.ps - - -screens: - cd screen ; for i in *.gif; do echo $$i; giftopnm $$i | pnmmargin -black 1 | ppmtopgm | pnmtops -width 100 -height 100 -noturn > ../tmp/`basename $$i .gif`.ps; done - -miscs: - giftopnm misc/larsi.gif | ppmtopgm | pnmtops -noturn > tmp/larsi.ps - tifftopnm misc/eseptember.tif | pnmscale 4 | ppmtopgm | pnmtops -noturn -width 100 -height 100 > tmp/september.ps - tifftopnm misc/fseptember.tif | pnmscale 2 | ppmtopgm | pnmtops -noturn -width 100 -height 100 > tmp/fseptember.ps - tifftopnm misc/fred.tif | pnmscale 2 | ppmtopgm | pnmtops -noturn -width 100 -height 100 > tmp/fred.ps - tifftopnm misc/ered.tif | pnmscale 2 | ppmtopgm | pnmtops -noturn -width 100 -height 100 > tmp/red.ps - -etcs: - cd etc; for i in gnus-*.xpm; do echo $$i; xpmtoppm $$i | ppmtopgm | pnmdepth 255 | pnmtops -noturn > ../tmp/`basename $$i .xpm`.ps; done - -piconss: - cd picons; for i in *.xbm; do echo $$i; xbmtopbm $$i | pnmtops -noturn > ../tmp/picons-`basename $$i .xbm`.ps; done - cd picons; for i in *.gif; do echo $$i; giftopnm $$i | ppmtopgm | pnmtops -noturn > ../tmp/picons-`basename $$i .gif`.ps; done - for i in tmp/picons-*.ps; do echo "\\gnuspicon{$$i}"; done > picons.tex - -xfaces: - cd xface; for i in *.gif; do echo $$i; giftopnm $$i | ppmtopgm | pnmtops -noturn > ../tmp/xface-`basename $$i .gif`.ps; done - for i in tmp/xface-*.ps; do \ - if [ -n "$$a" ]; then a=""; echo "{$$i}"; else \ - a="h"; echo -n "\\gnusxface{$$i}"; fi done > xface.tex; \ - if [ -n "$$a" ]; then echo "{$$i}" >> xface.tex; fi - -smiley: - cd smilies; tifftopnm BigFace.tif | ppmtopgm | pnmtops > ../tmp/BigFace.ps - cd smilies; for i in *.xpm; do echo $$i; sed "s/none/#FFFFFF/" $$i | xpmtoppm | ppmtopgm | pnmdepth 255 | pnmtops > ../tmp/smiley-`basename $$i .xpm`.ps; done - for i in tmp/smiley-*.ps; do \ - if [ -n "$$a" ]; then a=""; echo "{$$i}"; else \ - a="h"; echo -n "\\gnussmiley{$$i}"; fi done > smiley.tex; \ - if [ -n "$$a" ]; then echo "{$$i}" >> smiley.tex; fi - -pspackage: - tar czvf pspackage.tar.gz gnus-faq.texi gnus.texi herds misc pagestyle.sty picons pixidx.sty postamble.tex ps screen smilies splitindex texi2latex.el xface Makefile README etc - -complete: - $(MAKE) texi2latex.elc - $(MAKE) tmps - $(MAKE) pss - -Makefile: $(srcdir)/Makefile.in ../config.status - cd .. \ - && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/texi/TRANSLATION.ja b/texi/TRANSLATION.ja deleted file mode 100644 index 5e0f759..0000000 --- a/texi/TRANSLATION.ja +++ /dev/null @@ -1,27 +0,0 @@ -This file documents about translation policy. -There is an ongoing project to make gnus-ja.texi. -Any volunteers are welcomed. - -$BF|K\8lLu$K4X$9$kN.57$r@bL@$9$k%U%!%$%k$G$9!#(B -gnus-ja.texi $B$r:n@.$9$k%W%m%8%'%/%H$,?J9TCf$G$9!#(B -$B%W%m%8%'%/%H;22C $B$NK]Lu$K4X$9$k5,B'(B -$B$G$9!#$3$N5,B'$O$h$jNI$$$H;W$o$l$k$b$N$,8+$D$+$C$?>l9g$K$OJQ99$5$l$k2D(B -$BG=@-$,$"$j$^$9!#$^$?!"$h$jNI$$0F$d!"B>$N5,B'$rIU$12C$($?$$>l9g$O!"(B -semi-gnus-ja $B%a!<%j%s%0%j%9%H$K$=$N0F$r=q$/$+!"(Bjaist $B$N(B Open CVS $B$K=q(B -$B$-9~$_8"8B$r;}$C$F$$$kJ}$OD>@\=q$-9~$_$r$7$F$/$@$5$$!#(B(CVS $B$N>l9g$G$b!"(B -semi-gnus-ja $B$GJQ99$N9pCN$r$9$k;v$,K>$^$7$$$G$9!#(B) semi-gnus-ja $B%a!<%j(B -$B%s%0%j%9%H$N2CF~$N;EJ}$KIU$$$F$b!">e5-$N(B URI $B$r;2>H$7$F$/$@$5$$!#(B - -1. $B$J$k$Y$/%+%?%+%J$O;H$o$J$$$h$&$K$9$k!#(B - ($BF|K\8l$K$G$-$k$H$3$m$O$J$k$Y$/F|K\8l$K$9$k!#(B - $B>l9g$K$h$C$F$O?7$7$$8l$rDj5A$9$k;v$b$"$k!#(B) - -2. $B1Q8l$rIU2C$7$?J}$,J,$+$j$d$9$$$H;W$o$l$k8l6g$O!"(B - $BF|K\8l$ND>8e$K3g8L$NCf$KF~$l$k!#(B - diff --git a/texi/bembo.sty b/texi/bembo.sty deleted file mode 100644 index e676c3e..0000000 --- a/texi/bembo.sty +++ /dev/null @@ -1,32 +0,0 @@ -% ----------------------------------------------------------------- -% Filename: bembo.sty ( Aldine 401 ) -% Created by: tex bbb -% Created using fontinst v1.335 -% Created for [4allTeX postscript font setup] -% Created on [1996/04/26] -% Use phbfonti.sty file (in 4allTeX package) -% Based on PSNFSS 2.4.1 and 3.x by S. Rahtz -% Put this file in a TEXINPUT directory. -% ----------------------------------------------------------------- -% Can be processed by LaTeX209 and LaTeX2e -\def\fileversion{3q} -\def\filedate{94/10/22} -\def\docdate{94/10/22} -\ifx\ProvidesPackage\undefined -\immediate\write\sixt@@n{File: bembo.sty NFSS1 fontinst (PhB)} -\ifx\selectfont\undefined -\@latexerr{No NFSS1 detected...}\@eha\endinput\fi - -\ifx\declare@font\undefined\input{psnfss.sup}\fi -\def\load@bbb{\postscript@fontdef{Aldine 401 }{bbb}% - {bbbr}{bbbri}{bbbb}{bbbbi}{bbbrc}{bbbro}} -\late@extra@def{bbb}{}{} -\load@bbb -\else -\immediate\write\sixt@@n{File: bembo.sty LaTeX2e fontinst (PhB)} -\ProvidesPackage{bembo}[\filedate\space\fileversion\space - LaTeX2e fontinst (PhB)]\fi - -\def\rmdefault{bbb} -\def\switchfont{} -\endinput diff --git a/texi/dir b/texi/dir deleted file mode 100644 index 08eb94d..0000000 --- a/texi/dir +++ /dev/null @@ -1,10 +0,0 @@ --*- Text -*- -The Gnus-related top node. - -File: dir Node: Top This is the Gnus Info tree - -* Menu: - -* Gnus: (gnus). The news reader Gnus. -* Message: (message). The Message sending thingamabob. -* Emacs MIME: (emacs-mime). Libraries for handling MIME. diff --git a/texi/doclicense.texi b/texi/doclicense.texi deleted file mode 100644 index d580caf..0000000 --- a/texi/doclicense.texi +++ /dev/null @@ -1,368 +0,0 @@ -@c -*-texinfo-*- -@node GNU Free Documentation License, Intro, Copying, Top - -@appendix GNU Free Documentation License -@center Version 1.1, March 2000 - -@display -Copyright (C) 2000 Free Software Foundation, Inc. -59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Everyone is permitted to copy and distribute verbatim copies -of this license document, but changing it is not allowed. -@end display -@sp 1 -@enumerate 0 -@item -PREAMBLE - -The purpose of this License is to make a manual, textbook, or other -written document ``free'' in the sense of freedom: to assure everyone -the effective freedom to copy and redistribute it, with or without -modifying it, either commercially or noncommercially. Secondarily, -this License preserves for the author and publisher a way to get -credit for their work, while not being considered responsible for -modifications made by others. - -This License is a kind of ``copyleft'', which means that derivative -works of the document must themselves be free in the same sense. It -complements the GNU General Public License, which is a copyleft -license designed for free software. - -We have designed this License in order to use it for manuals for free -software, because free software needs free documentation: a free -program should come with manuals providing the same freedoms that the -software does. But this License is not limited to software manuals; -it can be used for any textual work, regardless of subject matter or -whether it is published as a printed book. We recommend this License -principally for works whose purpose is instruction or reference. - -@sp 1 -@item -APPLICABILITY AND DEFINITIONS - -This License applies to any manual or other work that contains a -notice placed by the copyright holder saying it can be distributed -under the terms of this License. The ``Document'', below, refers to any -such manual or work. Any member of the public is a licensee, and is -addressed as ``you''. - -A ``Modified Version'' of the Document means any work containing the -Document or a portion of it, either copied verbatim, or with -modifications and/or translated into another language. - -A ``Secondary Section'' is a named appendix or a front-matter section of -the Document that deals exclusively with the relationship of the -publishers or authors of the Document to the Document's overall subject -(or to related matters) and contains nothing that could fall directly -within that overall subject. (For example, if the Document is in part a -textbook of mathematics, a Secondary Section may not explain any -mathematics.) The relationship could be a matter of historical -connection with the subject or with related matters, or of legal, -commercial, philosophical, ethical or political position regarding -them. - -The ``Invariant Sections'' are certain Secondary Sections whose titles -are designated, as being those of Invariant Sections, in the notice -that says that the Document is released under this License. - -The ``Cover Texts'' are certain short passages of text that are listed, -as Front-Cover Texts or Back-Cover Texts, in the notice that says that -the Document is released under this License. - -A ``Transparent'' copy of the Document means a machine-readable copy, -represented in a format whose specification is available to the -general public, whose contents can be viewed and edited directly and -straightforwardly with generic text editors or (for images composed of -pixels) generic paint programs or (for drawings) some widely available -drawing editor, and that is suitable for input to text formatters or -for automatic translation to a variety of formats suitable for input -to text formatters. A copy made in an otherwise Transparent file -format whose markup has been designed to thwart or discourage -subsequent modification by readers is not Transparent. A copy that is -not ``Transparent'' is called ``Opaque''. - -Examples of suitable formats for Transparent copies include plain -ASCII without markup, Texinfo input format, LaTeX input format, SGML -or XML using a publicly available DTD, and standard-conforming simple -HTML designed for human modification. Opaque formats include -PostScript, PDF, proprietary formats that can be read and edited only -by proprietary word processors, SGML or XML for which the DTD and/or -processing tools are not generally available, and the -machine-generated HTML produced by some word processors for output -purposes only. - -The ``Title Page'' means, for a printed book, the title page itself, -plus such following pages as are needed to hold, legibly, the material -this License requires to appear in the title page. For works in -formats which do not have any title page as such, ``Title Page'' means -the text near the most prominent appearance of the work's title, -preceding the beginning of the body of the text. -@sp 1 -@item -VERBATIM COPYING - -You may copy and distribute the Document in any medium, either -commercially or noncommercially, provided that this License, the -copyright notices, and the license notice saying this License applies -to the Document are reproduced in all copies, and that you add no other -conditions whatsoever to those of this License. You may not use -technical measures to obstruct or control the reading or further -copying of the copies you make or distribute. However, you may accept -compensation in exchange for copies. If you distribute a large enough -number of copies you must also follow the conditions in section 3. - -You may also lend copies, under the same conditions stated above, and -you may publicly display copies. -@sp 1 -@item -COPYING IN QUANTITY - -If you publish printed copies of the Document numbering more than 100, -and the Document's license notice requires Cover Texts, you must enclose -the copies in covers that carry, clearly and legibly, all these Cover -Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on -the back cover. Both covers must also clearly and legibly identify -you as the publisher of these copies. The front cover must present -the full title with all words of the title equally prominent and -visible. You may add other material on the covers in addition. -Copying with changes limited to the covers, as long as they preserve -the title of the Document and satisfy these conditions, can be treated -as verbatim copying in other respects. - -If the required texts for either cover are too voluminous to fit -legibly, you should put the first ones listed (as many as fit -reasonably) on the actual cover, and continue the rest onto adjacent -pages. - -If you publish or distribute Opaque copies of the Document numbering -more than 100, you must either include a machine-readable Transparent -copy along with each Opaque copy, or state in or with each Opaque copy -a publicly-accessible computer-network location containing a complete -Transparent copy of the Document, free of added material, which the -general network-using public has access to download anonymously at no -charge using public-standard network protocols. If you use the latter -option, you must take reasonably prudent steps, when you begin -distribution of Opaque copies in quantity, to ensure that this -Transparent copy will remain thus accessible at the stated location -until at least one year after the last time you distribute an Opaque -copy (directly or through your agents or retailers) of that edition to -the public. - -It is requested, but not required, that you contact the authors of the -Document well before redistributing any large number of copies, to give -them a chance to provide you with an updated version of the Document. -@sp 1 -@item -MODIFICATIONS - -You may copy and distribute a Modified Version of the Document under -the conditions of sections 2 and 3 above, provided that you release -the Modified Version under precisely this License, with the Modified -Version filling the role of the Document, thus licensing distribution -and modification of the Modified Version to whoever possesses a copy -of it. In addition, you must do these things in the Modified Version: - -A. Use in the Title Page (and on the covers, if any) a title distinct - from that of the Document, and from those of previous versions - (which should, if there were any, be listed in the History section - of the Document). You may use the same title as a previous version - if the original publisher of that version gives permission.@* -B. List on the Title Page, as authors, one or more persons or entities - responsible for authorship of the modifications in the Modified - Version, together with at least five of the principal authors of the - Document (all of its principal authors, if it has less than five).@* -C. State on the Title page the name of the publisher of the - Modified Version, as the publisher.@* -D. Preserve all the copyright notices of the Document.@* -E. Add an appropriate copyright notice for your modifications - adjacent to the other copyright notices.@* -F. Include, immediately after the copyright notices, a license notice - giving the public permission to use the Modified Version under the - terms of this License, in the form shown in the Addendum below.@* -G. Preserve in that license notice the full lists of Invariant Sections - and required Cover Texts given in the Document's license notice.@* -H. Include an unaltered copy of this License.@* -I. Preserve the section entitled ``History'', and its title, and add to - it an item stating at least the title, year, new authors, and - publisher of the Modified Version as given on the Title Page. If - there is no section entitled ``History'' in the Document, create one - stating the title, year, authors, and publisher of the Document as - given on its Title Page, then add an item describing the Modified - Version as stated in the previous sentence.@* -J. Preserve the network location, if any, given in the Document for - public access to a Transparent copy of the Document, and likewise - the network locations given in the Document for previous versions - it was based on. These may be placed in the ``History'' section. - You may omit a network location for a work that was published at - least four years before the Document itself, or if the original - publisher of the version it refers to gives permission.@* -K. In any section entitled ``Acknowledgements'' or ``Dedications'', - preserve the section's title, and preserve in the section all the - substance and tone of each of the contributor acknowledgements - and/or dedications given therein.@* -L. Preserve all the Invariant Sections of the Document, - unaltered in their text and in their titles. Section numbers - or the equivalent are not considered part of the section titles.@* -M. Delete any section entitled ``Endorsements''. Such a section - may not be included in the Modified Version.@* -N. Do not retitle any existing section as ``Endorsements'' - or to conflict in title with any Invariant Section.@* -@sp 1 -If the Modified Version includes new front-matter sections or -appendices that qualify as Secondary Sections and contain no material -copied from the Document, you may at your option designate some or all -of these sections as invariant. To do this, add their titles to the -list of Invariant Sections in the Modified Version's license notice. -These titles must be distinct from any other section titles. - -You may add a section entitled ``Endorsements'', provided it contains -nothing but endorsements of your Modified Version by various -parties--for example, statements of peer review or that the text has -been approved by an organization as the authoritative definition of a -standard. - -You may add a passage of up to five words as a Front-Cover Text, and a -passage of up to 25 words as a Back-Cover Text, to the end of the list -of Cover Texts in the Modified Version. Only one passage of -Front-Cover Text and one of Back-Cover Text may be added by (or -through arrangements made by) any one entity. If the Document already -includes a cover text for the same cover, previously added by you or -by arrangement made by the same entity you are acting on behalf of, -you may not add another; but you may replace the old one, on explicit -permission from the previous publisher that added the old one. - -The author(s) and publisher(s) of the Document do not by this License -give permission to use their names for publicity for or to assert or -imply endorsement of any Modified Version. -@sp 1 -@item -COMBINING DOCUMENTS - -You may combine the Document with other documents released under this -License, under the terms defined in section 4 above for modified -versions, provided that you include in the combination all of the -Invariant Sections of all of the original documents, unmodified, and -list them all as Invariant Sections of your combined work in its -license notice. - -The combined work need only contain one copy of this License, and -multiple identical Invariant Sections may be replaced with a single -copy. If there are multiple Invariant Sections with the same name but -different contents, make the title of each such section unique by -adding at the end of it, in parentheses, the name of the original -author or publisher of that section if known, or else a unique number. -Make the same adjustment to the section titles in the list of -Invariant Sections in the license notice of the combined work. - -In the combination, you must combine any sections entitled ``History'' -in the various original documents, forming one section entitled -``History''; likewise combine any sections entitled ``Acknowledgements'', -and any sections entitled ``Dedications''. You must delete all sections -entitled ``Endorsements.'' -@sp 1 -@item -COLLECTIONS OF DOCUMENTS - -You may make a collection consisting of the Document and other documents -released under this License, and replace the individual copies of this -License in the various documents with a single copy that is included in -the collection, provided that you follow the rules of this License for -verbatim copying of each of the documents in all other respects. - -You may extract a single document from such a collection, and distribute -it individually under this License, provided you insert a copy of this -License into the extracted document, and follow this License in all -other respects regarding verbatim copying of that document. -@sp 1 -@item -AGGREGATION WITH INDEPENDENT WORKS - -A compilation of the Document or its derivatives with other separate -and independent documents or works, in or on a volume of a storage or -distribution medium, does not as a whole count as a Modified Version -of the Document, provided no compilation copyright is claimed for the -compilation. Such a compilation is called an ``aggregate'', and this -License does not apply to the other self-contained works thus compiled -with the Document, on account of their being thus compiled, if they -are not themselves derivative works of the Document. - -If the Cover Text requirement of section 3 is applicable to these -copies of the Document, then if the Document is less than one quarter -of the entire aggregate, the Document's Cover Texts may be placed on -covers that surround only the Document within the aggregate. -Otherwise they must appear on covers around the whole aggregate. -@sp 1 -@item -TRANSLATION - -Translation is considered a kind of modification, so you may -distribute translations of the Document under the terms of section 4. -Replacing Invariant Sections with translations requires special -permission from their copyright holders, but you may include -translations of some or all Invariant Sections in addition to the -original versions of these Invariant Sections. You may include a -translation of this License provided that you also include the -original English version of this License. In case of a disagreement -between the translation and the original English version of this -License, the original English version will prevail. -@sp 1 -@item -TERMINATION - -You may not copy, modify, sublicense, or distribute the Document except -as expressly provided for under this License. Any other attempt to -copy, modify, sublicense or distribute the Document is void, and will -automatically terminate your rights under this License. However, -parties who have received copies, or rights, from you under this -License will not have their licenses terminated so long as such -parties remain in full compliance. -@sp 1 -@item -FUTURE REVISIONS OF THIS LICENSE - -The Free Software Foundation may publish new, revised versions -of the GNU Free Documentation License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. See -http://www.gnu.org/copyleft/. - -Each version of the License is given a distinguishing version number. -If the Document specifies that a particular numbered version of this -License ``or any later version'' applies to it, you have the option of -following the terms and conditions either of that specified version or -of any later version that has been published (not as a draft) by the -Free Software Foundation. If the Document does not specify a version -number of this License, you may choose any version ever published (not -as a draft) by the Free Software Foundation. - -@end enumerate - -@unnumberedsec ADDENDUM: How to use this License for your documents - -To use this License in a document you have written, include a copy of -the License in the document and put the following copyright and -license notices just after the title page: - -@smallexample -@group - - Copyright (C) @var{year} @var{your name}. - Permission is granted to copy, distribute and/or modify this document - under the terms of the GNU Free Documentation License, Version 1.1 - or any later version published by the Free Software Foundation; - with the Invariant Sections being @var{list their titles}, with the - Front-Cover Texts being @var{list}, and with the Back-Cover Texts being @var{list}. - A copy of the license is included in the section entitled ``GNU - Free Documentation License''. -@end group -@end smallexample -If you have no Invariant Sections, write ``with no Invariant Sections'' -instead of saying which ones are invariant. If you have no -Front-Cover Texts, write ``no Front-Cover Texts'' instead of -``Front-Cover Texts being @var{list}''; likewise for Back-Cover Texts. - -If your document contains nontrivial examples of program code, we -recommend releasing these examples in parallel under your choice of -free software license, such as the GNU General Public License, -to permit their use in free software. diff --git a/texi/emacs-mime.texi b/texi/emacs-mime.texi deleted file mode 100644 index 778229c..0000000 --- a/texi/emacs-mime.texi +++ /dev/null @@ -1,1479 +0,0 @@ -\input texinfo @c -*-texinfo-*- - -@setfilename emacs-mime -@settitle Emacs MIME Manual -@synindex fn cp -@synindex vr cp -@synindex pg cp -@dircategory Emacs -@direntry -* Emacs MIME: (emacs-mime). The MIME de/composition library. -@end direntry -@iftex -@finalout -@end iftex -@setchapternewpage odd - -@ifnottex - -This file documents the Emacs MIME interface functionality. - -Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. - -Permission is granted to copy, distribute and/or modify this document -under the terms of the GNU Free Documentation License, Version 1.1 or -any later version published by the Free Software Foundation; with no -Invariant Sections, with the Front-Cover texts being ``A GNU -Manual'', and with the Back-Cover Texts as in (a) below. A copy of the -license is included in the section entitled ``GNU Free Documentation -License'' in the Emacs manual. - -(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify -this GNU Manual, like GNU software. Copies published by the Free -Software Foundation raise funds for GNU development.'' - -This document is part of a collection distributed under the GNU Free -Documentation License. If you want to distribute this document -separately from the collection, you can do so by adding a copy of the -license to the document, as described in section 6 of the license. -@end ifnottex - -@tex - -@titlepage -@title Emacs MIME Manual - -@author by Lars Magne Ingebrigtsen -@page - -@vskip 0pt plus 1filll -Copyright @copyright{} 1998, 1999, 2000 Free Software Foundation, Inc. - -Permission is granted to copy, distribute and/or modify this document -under the terms of the GNU Free Documentation License, Version 1.1 or -any later version published by the Free Software Foundation; with the -Invariant Sections being none, with the Front-Cover texts being ``A GNU -Manual'', and with the Back-Cover Texts as in (a) below. A copy of the -license is included in the section entitled ``GNU Free Documentation -License'' in the Emacs manual. - -(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify -this GNU Manual, like GNU software. Copies published by the Free -Software Foundation raise funds for GNU development.'' - -This document is part of a collection distributed under the GNU Free -Documentation License. If you want to distribute this document -separately from the collection, you can do so by adding a copy of the -license to the document, as described in section 6 of the license. -@end titlepage -@page - -@end tex - -@node Top -@top Emacs MIME - -This manual documents the libraries used to compose and display -@sc{mime} messages. - -This is not a manual meant for users; it's a manual directed at people -who want to write functions and commands that manipulate @sc{mime} -elements. - -@sc{mime} is short for @dfn{Multipurpose Internet Mail Extensions}. -This standard is documented in a number of RFCs; mainly RFC2045 (Format -of Internet Message Bodies), RFC2046 (Media Types), RFC2047 (Message -Header Extensions for Non-ASCII Text), RFC2048 (Registration -Procedures), RFC2049 (Conformance Criteria and Examples). It is highly -recommended that anyone who intends writing @sc{mime}-compliant software -read at least RFC2045 and RFC2047. - -@menu -* Interface Functions:: An abstraction over the basic functions. -* Basic Functions:: Utility and basic parsing functions. -* Decoding and Viewing:: A framework for decoding and viewing. -* Composing:: MML; a language for describing MIME parts. -* Standards:: A summary of RFCs and working documents used. -* Index:: Function and variable index. -@end menu - - -@node Interface Functions -@chapter Interface Functions -@cindex interface functions -@cindex mail-parse - -The @code{mail-parse} library is an abstraction over the actual -low-level libraries that are described in the next chapter. - -Standards change, and so programs have to change to fit in the new -mold. For instance, RFC2045 describes a syntax for the -@code{Content-Type} header that only allows ASCII characters in the -parameter list. RFC2231 expands on RFC2045 syntax to provide a scheme -for continuation headers and non-ASCII characters. - -The traditional way to deal with this is just to update the library -functions to parse the new syntax. However, this is sometimes the wrong -thing to do. In some instances it may be vital to be able to understand -both the old syntax as well as the new syntax, and if there is only one -library, one must choose between the old version of the library and the -new version of the library. - -The Emacs MIME library takes a different tack. It defines a series of -low-level libraries (@file{rfc2047.el}, @file{rfc2231.el} and so on) -that parses strictly according to the corresponding standard. However, -normal programs would not use the functions provided by these libraries -directly, but instead use the functions provided by the -@code{mail-parse} library. The functions in this library are just -aliases to the corresponding functions in the latest low-level -libraries. Using this scheme, programs get a consistent interface they -can use, and library developers are free to create write code that -handles new standards. - -The following functions are defined by this library: - -@table @code -@item mail-header-parse-content-type -@findex mail-header-parse-content-type -Parse a @code{Content-Type} header and return a list on the following -format: - -@lisp -("type/subtype" - (attribute1 . value1) - (attribute2 . value2) - ...) -@end lisp - -Here's an example: - -@example -(mail-header-parse-content-type - "image/gif; name=\"b980912.gif\"") -@result{} ("image/gif" (name . "b980912.gif")) -@end example - -@item mail-header-parse-content-disposition -@findex mail-header-parse-content-disposition -Parse a @code{Content-Disposition} header and return a list on the same -format as the function above. - -@item mail-content-type-get -@findex mail-content-type-get -Takes two parameters---a list on the format above, and an attribute. -Returns the value of the attribute. - -@example -(mail-content-type-get - '("image/gif" (name . "b980912.gif")) 'name) -@result{} "b980912.gif" -@end example - -@item mail-header-encode-parameter -@findex mail-header-encode-parameter -Takes a parameter string and returns an encoded version of the string. -This is used for parameters in headers like @code{Content-Type} and -@code{Content-Disposition}. - -@item mail-header-remove-comments -@findex mail-header-remove-comments -Return a comment-free version of a header. - -@example -(mail-header-remove-comments - "Gnus/5.070027 (Pterodactyl Gnus v0.27) (Finnish Landrace)") -@result{} "Gnus/5.070027 " -@end example - -@item mail-header-remove-whitespace -@findex mail-header-remove-whitespace -Remove linear white space from a header. Space inside quoted strings -and comments is preserved. - -@example -(mail-header-remove-whitespace - "image/gif; name=\"Name with spaces\"") -@result{} "image/gif;name=\"Name with spaces\"" -@end example - -@item mail-header-get-comment -@findex mail-header-get-comment -Return the last comment in a header. - -@example -(mail-header-get-comment - "Gnus/5.070027 (Pterodactyl Gnus v0.27) (Finnish Landrace)") -@result{} "Finnish Landrace" -@end example - -@item mail-header-parse-address -@findex mail-header-parse-address -Parse an address and return a list containing the mailbox and the -plaintext name. - -@example -(mail-header-parse-address - "Hrvoje Niksic ") -@result{} ("hniksic@@srce.hr" . "Hrvoje Niksic") -@end example - -@item mail-header-parse-addresses -@findex mail-header-parse-addresses -Parse a string with list of addresses and return a list of elements like -the one described above. - -@example -(mail-header-parse-addresses - "Hrvoje Niksic , Steinar Bang ") -@result{} (("hniksic@@srce.hr" . "Hrvoje Niksic") - ("sb@@metis.no" . "Steinar Bang")) -@end example - -@item mail-header-parse-date -@findex mail-header-parse-date -Parse a date string and return an Emacs time structure. - -@item mail-narrow-to-head -@findex mail-narrow-to-head -Narrow the buffer to the header section of the buffer. Point is placed -at the beginning of the narrowed buffer. - -@item mail-header-narrow-to-field -@findex mail-header-narrow-to-field -Narrow the buffer to the header under point. - -@item mail-encode-encoded-word-region -@findex mail-encode-encoded-word-region -Encode the non-ASCII words in the region. For instance, -@samp{Naïve} is encoded as @samp{=?iso-8859-1?q?Na=EFve?=}. - -@item mail-encode-encoded-word-buffer -@findex mail-encode-encoded-word-buffer -Encode the non-ASCII words in the current buffer. This function is -meant to be called narrowed to the headers of a message. - -@item mail-encode-encoded-word-string -@findex mail-encode-encoded-word-string -Encode the words that need encoding in a string, and return the result. - -@example -(mail-encode-encoded-word-string - "This is naïve, baby") -@result{} "This is =?iso-8859-1?q?na=EFve,?= baby" -@end example - -@item mail-decode-encoded-word-region -@findex mail-decode-encoded-word-region -Decode the encoded words in the region. - -@item mail-decode-encoded-word-string -@findex mail-decode-encoded-word-string -Decode the encoded words in the string and return the result. - -@example -(mail-decode-encoded-word-string - "This is =?iso-8859-1?q?na=EFve,?= baby") -@result{} "This is naïve, baby" -@end example - -@end table - -Currently, @code{mail-parse} is an abstraction over @code{ietf-drums}, -@code{rfc2047}, @code{rfc2045} and @code{rfc2231}. These are documented -in the subsequent sections. - - - -@node Basic Functions -@chapter Basic Functions - -This chapter describes the basic, ground-level functions for parsing and -handling. Covered here is parsing @code{From} lines, removing comments -from header lines, decoding encoded words, parsing date headers and so -on. High-level functionality is dealt with in the next chapter -(@pxref{Decoding and Viewing}). - -@menu -* rfc2045:: Encoding @code{Content-Type} headers. -* rfc2231:: Parsing @code{Content-Type} headers. -* ietf-drums:: Handling mail headers defined by RFC822bis. -* rfc2047:: En/decoding encoded words in headers. -* time-date:: Functions for parsing dates and manipulating time. -* qp:: Quoted-Printable en/decoding. -* base64:: Base64 en/decoding. -* binhex:: Binhex decoding. -* uudecode:: Uuencode decoding. -* rfc1843:: Decoding HZ-encoded text. -* mailcap:: How parts are displayed is specified by the @file{.mailcap} file -@end menu - - -@node rfc2045 -@section rfc2045 - -RFC2045 is the ``main'' @sc{mime} document, and as such, one would -imagine that there would be a lot to implement. But there isn't, since -most of the implementation details are delegated to the subsequent -RFCs. - -So @file{rfc2045.el} has only a single function: - -@table @code -@item rfc2045-encode-string -@findex rfc2045-encode-string -Takes a parameter and a value and returns a @samp{PARAM=VALUE} string. -@var{value} will be quoted if there are non-safe characters in it. -@end table - - -@node rfc2231 -@section rfc2231 - -RFC2231 defines a syntax for the @code{Content-Type} and -@code{Content-Disposition} headers. Its snappy name is @dfn{MIME -Parameter Value and Encoded Word Extensions: Character Sets, Languages, -and Continuations}. - -In short, these headers look something like this: - -@example -Content-Type: application/x-stuff; - title*0*=us-ascii'en'This%20is%20even%20more%20; - title*1*=%2A%2A%2Afun%2A%2A%2A%20; - title*2="isn't it!" -@end example - -They usually aren't this bad, though. - -The following functions are defined by this library: - -@table @code -@item rfc2231-parse-string -@findex rfc2231-parse-string -Parse a @code{Content-Type} header and return a list describing its -elements. - -@example -(rfc2231-parse-string - "application/x-stuff; - title*0*=us-ascii'en'This%20is%20even%20more%20; - title*1*=%2A%2A%2Afun%2A%2A%2A%20; - title*2=\"isn't it!\"") -@result{} ("application/x-stuff" - (title . "This is even more ***fun*** isn't it!")) -@end example - -@item rfc2231-get-value -@findex rfc2231-get-value -Takes one of the lists on the format above and returns -the value of the specified attribute. - -@item rfc2231-encode-string -@findex rfc2231-encode-string -Encode a parameter in headers likes @code{Content-Type} and -@code{Content-Disposition}. - -@end table - - -@node ietf-drums -@section ietf-drums - -@dfn{drums} is an IETF working group that is working on the replacement -for RFC822. - -The functions provided by this library include: - -@table @code -@item ietf-drums-remove-comments -@findex ietf-drums-remove-comments -Remove the comments from the argument and return the results. - -@item ietf-drums-remove-whitespace -@findex ietf-drums-remove-whitespace -Remove linear white space from the string and return the results. -Spaces inside quoted strings and comments are left untouched. - -@item ietf-drums-get-comment -@findex ietf-drums-get-comment -Return the last most comment from the string. - -@item ietf-drums-parse-address -@findex ietf-drums-parse-address -Parse an address string and return a list that contains the mailbox and -the plain text name. - -@item ietf-drums-parse-addresses -@findex ietf-drums-parse-addresses -Parse a string that contains any number of comma-separated addresses and -return a list that contains mailbox/plain text pairs. - -@item ietf-drums-parse-date -@findex ietf-drums-parse-date -Parse a date string and return an Emacs time structure. - -@item ietf-drums-narrow-to-header -@findex ietf-drums-narrow-to-header -Narrow the buffer to the header section of the current buffer. - -@end table - - -@node rfc2047 -@section rfc2047 - -RFC2047 (Message Header Extensions for Non-ASCII Text) specifies how -non-ASCII text in headers are to be encoded. This is actually rather -complicated, so a number of variables are necessary to tweak what this -library does. - -The following variables are tweakable: - -@table @code -@item rfc2047-default-charset -@vindex rfc2047-default-charset -Characters in this charset should not be decoded by this library. -This defaults to @code{iso-8859-1}. - -@item rfc2047-header-encoding-list -@vindex rfc2047-header-encoding-list -This is an alist of header / encoding-type pairs. Its main purpose is -to prevent encoding of certain headers. - -The keys can either be header regexps, or @code{t}. - -The values can be either @code{nil}, in which case the header(s) in -question won't be encoded, or @code{mime}, which means that they will be -encoded. - -@item rfc2047-charset-encoding-alist -@vindex rfc2047-charset-encoding-alist -RFC2047 specifies two forms of encoding---@code{Q} (a -Quoted-Printable-like encoding) and @code{B} (base64). This alist -specifies which charset should use which encoding. - -@item rfc2047-encoding-function-alist -@vindex rfc2047-encoding-function-alist -This is an alist of encoding / function pairs. The encodings are -@code{Q}, @code{B} and @code{nil}. - -@item rfc2047-q-encoding-alist -@vindex rfc2047-q-encoding-alist -The @code{Q} encoding isn't quite the same for all headers. Some -headers allow a narrower range of characters, and that is what this -variable is for. It's an alist of header regexps / allowable character -ranges. - -@item rfc2047-encoded-word-regexp -@vindex rfc2047-encoded-word-regexp -When decoding words, this library looks for matches to this regexp. - -@end table - -Those were the variables, and these are this functions: - -@table @code -@item rfc2047-narrow-to-field -@findex rfc2047-narrow-to-field -Narrow the buffer to the header on the current line. - -@item rfc2047-encode-message-header -@findex rfc2047-encode-message-header -Should be called narrowed to the header of a message. Encodes according -to @code{rfc2047-header-encoding-alist}. - -@item rfc2047-encode-region -@findex rfc2047-encode-region -Encodes all encodable words in the region specified. - -@item rfc2047-encode-string -@findex rfc2047-encode-string -Encode a string and return the results. - -@item rfc2047-decode-region -@findex rfc2047-decode-region -Decode the encoded words in the region. - -@item rfc2047-decode-string -@findex rfc2047-decode-string -Decode a string and return the results. - -@end table - - -@node time-date -@section time-date - -While not really a part of the @sc{mime} library, it is convenient to -document this library here. It deals with parsing @code{Date} headers -and manipulating time. (Not by using tesseracts, though, I'm sorry to -say.) - -These functions convert between five formats: A date string, an Emacs -time structure, a decoded time list, a second number, and a day number. - -Here's a bunch of time/date/second/day examples: - -@example -(parse-time-string "Sat Sep 12 12:21:54 1998 +0200") -@result{} (54 21 12 12 9 1998 6 nil 7200) - -(date-to-time "Sat Sep 12 12:21:54 1998 +0200") -@result{} (13818 19266) - -(time-to-seconds '(13818 19266)) -@result{} 905595714.0 - -(seconds-to-time 905595714.0) -@result{} (13818 19266 0) - -(time-to-days '(13818 19266)) -@result{} 729644 - -(days-to-time 729644) -@result{} (961933 65536) - -(time-since '(13818 19266)) -@result{} (0 430) - -(time-less-p '(13818 19266) '(13818 19145)) -@result{} nil - -(subtract-time '(13818 19266) '(13818 19145)) -@result{} (0 121) - -(days-between "Sat Sep 12 12:21:54 1998 +0200" - "Sat Sep 07 12:21:54 1998 +0200") -@result{} 5 - -(date-leap-year-p 2000) -@result{} t - -(time-to-day-in-year '(13818 19266)) -@result{} 255 - -(time-to-number-of-days - (time-since - (date-to-time "Mon, 01 Jan 2001 02:22:26 GMT"))) -@result{} 4.146122685185185 -@end example - -And finally, we have @code{safe-date-to-time}, which does the same as -@code{date-to-time}, but returns a zero time if the date is -syntactically malformed. - -The five data representations used are the following: - -@table @var -@item date -An RFC822 (or similar) date string. For instance: @code{"Sat Sep 12 -12:21:54 1998 +0200"}. - -@item time -An internal Emacs time. For instance: @code{(13818 26466)}. - -@item seconds -A floating point representation of the internal Emacs time. For -instance: @code{905595714.0}. - -@item days -An integer number representing the number of days since 00000101. For -instance: @code{729644}. - -@item decoded time -A list of decoded time. For instance: @code{(54 21 12 12 9 1998 6 t -7200)}. -@end table - -All the examples above represent the same moment. - -These are the functions available: - -@table @code -@item date-to-time -Take a date and return a time. - -@item time-to-seconds -Take a time and return seconds. - -@item seconds-to-time -Take seconds and return a time. - -@item time-to-days -Take a time and return days. - -@item days-to-time -Take days and return a time. - -@item date-to-day -Take a date and return days. - -@item time-to-number-of-days -Take a time and return the number of days that represents. - -@item safe-date-to-time -Take a date and return a time. If the date is not syntactically valid, -return a "zero" date. - -@item time-less-p -Take two times and say whether the first time is less (i. e., earlier) -than the second time. - -@item time-since -Take a time and return a time saying how long it was since that time. - -@item subtract-time -Take two times and subtract the second from the first. I. e., return -the time between the two times. - -@item days-between -Take two days and return the number of days between those two days. - -@item date-leap-year-p -Take a year number and say whether it's a leap year. - -@item time-to-day-in-year -Take a time and return the day number within the year that the time is -in. - -@end table - - -@node qp -@section qp - -This library deals with decoding and encoding Quoted-Printable text. - -Very briefly explained, qp encoding means translating all 8-bit -characters (and lots of control characters) into things that look like -@samp{=EF}; that is, an equal sign followed by the byte encoded as a hex -string. - -The following functions are defined by the library: - -@table @code -@item quoted-printable-decode-region -@findex quoted-printable-decode-region -QP-decode all the encoded text in the specified region. - -@item quoted-printable-decode-string -@findex quoted-printable-decode-string -Decode the QP-encoded text in a string and return the results. - -@item quoted-printable-encode-region -@findex quoted-printable-encode-region -QP-encode all the encodable characters in the specified region. The third -optional parameter @var{fold} specifies whether to fold long lines. -(Long here means 72.) - -@item quoted-printable-encode-string -@findex quoted-printable-encode-string -QP-encode all the encodable characters in a string and return the -results. - -@end table - - -@node base64 -@section base64 -@cindex base64 - -Base64 is an encoding that encodes three bytes into four characters, -thereby increasing the size by about 33%. The alphabet used for -encoding is very resistant to mangling during transit. - -The following functions are defined by this library: - -@table @code -@item base64-encode-region -@findex base64-encode-region -base64 encode the selected region. Return the length of the encoded -text. Optional third argument @var{no-line-break} means do not break -long lines into shorter lines. - -@item base64-encode-string -@findex base64-encode-string -base64 encode a string and return the result. - -@item base64-decode-region -@findex base64-decode-region -base64 decode the selected region. Return the length of the decoded -text. If the region can't be decoded, return @code{nil} and don't -modify the buffer. - -@item base64-decode-string -@findex base64-decode-string -base64 decode a string and return the result. If the string can't be -decoded, @code{nil} is returned. - -@end table - - -@node binhex -@section binhex -@cindex binhex -@cindex Apple -@cindex Macintosh - -@code{binhex} is an encoding that originated in Macintosh environments. -The following function is supplied to deal with these: - -@table @code -@item binhex-decode-region -@findex binhex-decode-region -Decode the encoded text in the region. If given a third parameter, only -decode the @code{binhex} header and return the filename. - -@end table - - -@node uudecode -@section uudecode -@cindex uuencode -@cindex uudecode - -@code{uuencode} is probably still the most popular encoding of binaries -used on Usenet, although @code{base64} rules the mail world. - -The following function is supplied by this package: - -@table @code -@item uudecode-decode-region -@findex uudecode-decode-region -Decode the text in the region. -@end table - - -@node rfc1843 -@section rfc1843 -@cindex rfc1843 -@cindex HZ -@cindex Chinese - -RFC1843 deals with mixing Chinese and ASCII characters in messages. In -essence, RFC1843 switches between ASCII and Chinese by doing this: - -@example -This sentence is in ASCII. -The next sentence is in GB.~@{<:Ky2;S@{#,NpJ)l6HK!#~@}Bye. -@end example - -Simple enough, and widely used in China. - -The following functions are available to handle this encoding: - -@table @code -@item rfc1843-decode-region -Decode HZ-encoded text in the region. - -@item rfc1843-decode-string -Decode a HZ-encoded string and return the result. - -@end table - - -@node mailcap -@section mailcap - -The @file{~/.mailcap} file is parsed by most @sc{mime}-aware message -handlers and describes how elements are supposed to be displayed. -Here's an example file: - -@example -image/*; gimp -8 %s -audio/wav; wavplayer %s -@end example - -This says that all image files should be displayed with @code{gimp}, and -that realaudio files should be played by @code{rvplayer}. - -The @code{mailcap} library parses this file, and provides functions for -matching types. - -@table @code -@item mailcap-mime-data -@vindex mailcap-mime-data -This variable is an alist of alists containing backup viewing rules. - -@end table - -Interface functions: - -@table @code -@item mailcap-parse-mailcaps -@findex mailcap-parse-mailcaps -Parse the @code{~/.mailcap} file. - -@item mailcap-mime-info -Takes a @sc{mime} type as its argument and returns the matching viewer. - -@end table - - - - -@node Decoding and Viewing -@chapter Decoding and Viewing - -This chapter deals with decoding and viewing @sc{mime} messages on a -higher level. - -The main idea is to first analyze a @sc{mime} article, and then allow -other programs to do things based on the list of @dfn{handles} that are -returned as a result of this analysis. - -@menu -* Dissection:: Analyzing a @sc{mime} message. -* Non-MIME:: Analyzing a non-@sc{mime} message. -* Handles:: Handle manipulations. -* Display:: Displaying handles. -* Customization:: Variables that affect display. -* New Viewers:: How to write your own viewers. -@end menu - - -@node Dissection -@section Dissection - -The @code{mm-dissect-buffer} is the function responsible for dissecting -a @sc{mime} article. If given a multipart message, it will recursively -descend the message, following the structure, and return a tree of -@sc{mime} handles that describes the structure of the message. - -@node Non-MIME -@section Non-MIME - -Gnus also understands some non-MIME attachments, such as postscript, -uuencode, binhex, shar, forward, gnatsweb, pgp. Each of these features -can be disabled by add an item into @code{mm-uu-configure-list}. -For example, - -@lisp -(require 'mm-uu) -(add-to-list 'mm-uu-configure-list '(pgp-signed . disabled)) -@end lisp - -@table @code -@item postscript -@findex postscript -Postscript file. - -@item uu -@findex uu -Uuencoded file. - -@item binhex -@findex binhex -Binhex encoded file. - -@item shar -@findex shar -Shar archive file. - -@item forward -@findex forward -Non-@sc{mime} forwarded message. - -@item gnatsweb -@findex gnatsweb -Gnatsweb attachment. - -@item pgp-signed -@findex pgp-signed -PGP signed clear text. - -@item pgp-encrypted -@findex pgp-encrypted -PGP encrypted clear text. - -@item pgp-key -@findex pgp-key -PGP public keys. - -@item emacs-sources -@findex emacs-sources -Emacs source code. This item works only in the groups matching -@code{mm-uu-emacs-sources-regexp}. - -@end table - -@node Handles -@section Handles - -A @sc{mime} handle is a list that fully describes a @sc{mime} -component. - -The following macros can be used to access elements in a handle: - -@table @code -@item mm-handle-buffer -@findex mm-handle-buffer -Return the buffer that holds the contents of the undecoded @sc{mime} -part. - -@item mm-handle-type -@findex mm-handle-type -Return the parsed @code{Content-Type} of the part. - -@item mm-handle-encoding -@findex mm-handle-encoding -Return the @code{Content-Transfer-Encoding} of the part. - -@item mm-handle-undisplayer -@findex mm-handle-undisplayer -Return the object that can be used to remove the displayed part (if it -has been displayed). - -@item mm-handle-set-undisplayer -@findex mm-handle-set-undisplayer -Set the undisplayer object. - -@item mm-handle-disposition -@findex mm-handle-disposition -Return the parsed @code{Content-Disposition} of the part. - -@item mm-handle-disposition -@findex mm-handle-disposition -Return the description of the part. - -@item mm-get-content-id -Returns the handle(s) referred to by @code{Content-ID}. - -@end table - - -@node Display -@section Display - -Functions for displaying, removing and saving. - -@table @code -@item mm-display-part -@findex mm-display-part -Display the part. - -@item mm-remove-part -@findex mm-remove-part -Remove the part (if it has been displayed). - -@item mm-inlinable-p -@findex mm-inlinable-p -Say whether a @sc{mime} type can be displayed inline. - -@item mm-automatic-display-p -@findex mm-automatic-display-p -Say whether a @sc{mime} type should be displayed automatically. - -@item mm-destroy-part -@findex mm-destroy-part -Free all resources occupied by a part. - -@item mm-save-part -@findex mm-save-part -Offer to save the part in a file. - -@item mm-pipe-part -@findex mm-pipe-part -Offer to pipe the part to some process. - -@item mm-interactively-view-part -@findex mm-interactively-view-part -Prompt for a mailcap method to use to view the part. - -@end table - - -@node Customization -@section Customization - -@table @code - -@item mm-inline-media-tests -This is an alist where the key is a @sc{mime} type, the second element -is a function to display the part @dfn{inline} (i.e., inside Emacs), and -the third element is a form to be @code{eval}ed to say whether the part -can be displayed inline. - -This variable specifies whether a part @emph{can} be displayed inline, -and, if so, how to do it. It does not say whether parts are -@emph{actually} displayed inline. - -@item mm-inlined-types -This, on the other hand, says what types are to be displayed inline, if -they satisfy the conditions set by the variable above. It's a list of -@sc{mime} media types. - -@item mm-automatic-display -This is a list of types that are to be displayed ``automatically'', but -only if the above variable allows it. That is, only inlinable parts can -be displayed automatically. - -@item mm-attachment-override-types -Some @sc{mime} agents create parts that have a content-disposition of -@samp{attachment}. This variable allows overriding that disposition and -displaying the part inline. (Note that the disposition is only -overridden if we are able to, and want to, display the part inline.) - -@item mm-discouraged-alternatives -List of @sc{mime} types that are discouraged when viewing -@samp{multipart/alternative}. Viewing agents are supposed to view the -last possible part of a message, as that is supposed to be the richest. -However, users may prefer other types instead, and this list says what -types are most unwanted. If, for instance, @samp{text/html} parts are -very unwanted, and @samp{text/richtech} parts are somewhat unwanted, -then the value of this variable should be set to: - -@lisp -("text/html" "text/richtext") -@end lisp - -@item mm-inline-large-images-p -When displaying inline images that are larger than the window, XEmacs -does not enable scrolling, which means that you cannot see the whole -image. To prevent this, the library tries to determine the image size -before displaying it inline, and if it doesn't fit the window, the -library will display it externally (e.g. with @samp{ImageMagick} or -@samp{xv}). Setting this variable to @code{t} disables this check and -makes the library display all inline images as inline, regardless of -their size. - -@item mm-inline-override-p -@code{mm-inlined-types} may include regular expressions, for example to -specify that all @samp{text/.*} parts be displayed inline. If a user -prefers to have a type that matches such a regular expression be treated -as an attachment, that can be accomplished by setting this variable to a -list containing that type. For example assuming @code{mm-inlined-types} -includes @samp{text/.*}, then including @samp{text/html} in this -variable will cause @samp{text/html} parts to be treated as attachments. - -@end table - - -@node New Viewers -@section New Viewers - -Here's an example viewer for displaying @code{text/enriched} inline: - -@lisp -(defun mm-display-enriched-inline (handle) - (let (text) - (with-temp-buffer - (mm-insert-part handle) - (save-window-excursion - (enriched-decode (point-min) (point-max)) - (setq text (buffer-string)))) - (mm-insert-inline handle text))) -@end lisp - -We see that the function takes a @sc{mime} handle as its parameter. It -then goes to a temporary buffer, inserts the text of the part, does some -work on the text, stores the result, goes back to the buffer it was -called from and inserts the result. - -The two important helper functions here are @code{mm-insert-part} and -@code{mm-insert-inline}. The first function inserts the text of the -handle in the current buffer. It handles charset and/or content -transfer decoding. The second function just inserts whatever text you -tell it to insert, but it also sets things up so that the text can be -``undisplayed' in a convenient manner. - - -@node Composing -@chapter Composing -@cindex Composing -@cindex MIME Composing -@cindex MML -@cindex MIME Meta Language - -Creating a @sc{mime} message is boring and non-trivial. Therefore, a -library called @code{mml} has been defined that parses a language called -MML (@sc{mime} Meta Language) and generates @sc{mime} messages. - -@findex mml-generate-mime -The main interface function is @code{mml-generate-mime}. It will -examine the contents of the current (narrowed-to) buffer and return a -string containing the @sc{mime} message. - -@menu -* Simple MML Example:: An example MML document. -* MML Definition:: All valid MML elements. -* Advanced MML Example:: Another example MML document. -* Charset Translation:: How charsets are mapped from @sc{mule} to MIME. -* Conversion:: Going from @sc{mime} to MML and vice versa. -@end menu - - -@node Simple MML Example -@section Simple MML Example - -Here's a simple @samp{multipart/alternative}: - -@example -<#multipart type=alternative> -This is a plain text part. -<#part type=text/enriched> -
    This is a centered enriched part
    -<#/multipart> -@end example - -After running this through @code{mml-generate-mime}, we get this: - -@example -Content-Type: multipart/alternative; boundary="=-=-=" - - ---=-=-= - - -This is a plain text part. - ---=-=-= -Content-Type: text/enriched - - -
    This is a centered enriched part
    - ---=-=-=-- -@end example - - -@node MML Definition -@section MML Definition - -The MML language is very simple. It looks a bit like an SGML -application, but it's not. - -The main concept of MML is the @dfn{part}. Each part can be of a -different type or use a different charset. The way to delineate a part -is with a @samp{<#part ...>} tag. Multipart parts can be introduced -with the @samp{<#multipart ...>} tag. Parts are ended by the -@samp{<#/part>} or @samp{<#/multipart>} tags. Parts started with the -@samp{<#part ...>} tags are also closed by the next open tag. - -There's also the @samp{<#external ...>} tag. These introduce -@samp{external/message-body} parts. - -Each tag can contain zero or more parameters on the form -@samp{parameter=value}. The values may be enclosed in quotation marks, -but that's not necessary unless the value contains white space. So -@samp{filename=/home/user/#hello$^yes} is perfectly valid. - -The following parameters have meaning in MML; parameters that have no -meaning are ignored. The MML parameter names are the same as the -@sc{mime} parameter names; the things in the parentheses say which -header it will be used in. - -@table @samp -@item type -The @sc{mime} type of the part (@code{Content-Type}). - -@item filename -Use the contents of the file in the body of the part -(@code{Content-Disposition}). - -@item charset -The contents of the body of the part are to be encoded in the character -set speficied (@code{Content-Type}). - -@item name -Might be used to suggest a file name if the part is to be saved -to a file (@code{Content-Type}). - -@item disposition -Valid values are @samp{inline} and @samp{attachment} -(@code{Content-Disposition}). - -@item encoding -Valid values are @samp{7bit}, @samp{8bit}, @samp{quoted-printable} and -@samp{base64} (@code{Content-Transfer-Encoding}). - -@item description -A description of the part (@code{Content-Description}). - -@item creation-date -RFC822 date when the part was created (@code{Content-Disposition}). - -@item modification-date -RFC822 date when the part was modified (@code{Content-Disposition}). - -@item read-date -RFC822 date when the part was read (@code{Content-Disposition}). - -@item size -The size (in octets) of the part (@code{Content-Disposition}). - -@item sign -What technology to sign this MML part with (@code{smime} or -@code{pgpmime}) - -@item encrypt -What technology to encrypt this MML part with (@code{smime} or -@code{pgpmime}) - -@end table - -Parameters for @samp{application/octet-stream}: - -@table @samp -@item type -Type of the part; informal---meant for human readers -(@code{Content-Type}). -@end table - -Parameters for @samp{message/external-body}: - -@table @samp -@item access-type -A word indicating the supported access mechanism by which the file may -be obtained. Values include @samp{ftp}, @samp{anon-ftp}, @samp{tftp}, -@samp{localfile}, and @samp{mailserver}. (@code{Content-Type}.) - -@item expiration -The RFC822 date after which the file may no longer be fetched. -(@code{Content-Type}.) - -@item size -The size (in octets) of the file. (@code{Content-Type}.) - -@item permission -Valid values are @samp{read} and @samp{read-write} -(@code{Content-Type}). - -@end table - -Parameters for @samp{sign=smime}: - -@table @samp - -@item keyfile -File containing key and certificate for signer. - -@end table - -Parameters for @samp{encrypt=smime}: - -@table @samp - -@item certfile -File containing certificate for recipient. - -@end table - - -@node Advanced MML Example -@section Advanced MML Example - -Here's a complex multipart message. It's a @samp{multipart/mixed} that -contains many parts, one of which is a @samp{multipart/alternative}. - -@example -<#multipart type=mixed> -<#part type=image/jpeg filename=~/rms.jpg disposition=inline> -<#multipart type=alternative> -This is a plain text part. -<#part type=text/enriched name=enriched.txt> -
    This is a centered enriched part
    -<#/multipart> -This is a new plain text part. -<#part disposition=attachment> -This plain text part is an attachment. -<#/multipart> -@end example - -And this is the resulting @sc{mime} message: - -@example -Content-Type: multipart/mixed; boundary="=-=-=" - - ---=-=-= - - - ---=-=-= -Content-Type: image/jpeg; - filename="~/rms.jpg" -Content-Disposition: inline; - filename="~/rms.jpg" -Content-Transfer-Encoding: base64 - -/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRof -Hh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCAAwADABAREA/8QAHwAA -AQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQR -BRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RF -RkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ip -qrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEB -AAA/AO/rifFHjldNuGsrDa0qcSSHkA+gHrXKw+LtWLrMb+RgTyhbr+HSug07xNqV9fQtZrNI -AyiaE/NuBPOOOP0rvRNE880KOC8TbXXGCv1FPqjrF4LDR7u5L7SkTFT/ALWOP1xXgTuXfc7E -sx6nua6rwp4IvvEM8chCxWxOdzn7wz6V9AaB4S07w9p5itow0rDLSY5Pt9K43xO66P4xs71m -2QXiGCbA4yOVJ9+1aYORkdK434lyNH4ahCnG66VT9Nj15JFbPdX0MS43M4VQf5/yr2vSpLnw -5ZW8dlCZ8KFXjOPX0/mK6rSPEGt3Angu44fNEReHYNvIH3TzXDeKNO8RX+kSX2ouZkicTIOc -L+g7E810ulFjpVtv3bwgB3HJyK5L4quY/C9sVxk3ij/xx6850u7t1mtp/wDlpEw3An3Jr3Dw -34gsbWza4nBlhC5LDsaW6+IFgupQyCF3iHH7gA7c9R9ay7zx6t7aX9jHC4smhfBkGCvHGfrm -tLQ7hbnRrV1GPkAP1x1/Hr+Ncr8Vzjwrbf8AX6v/AKA9eQRyYlQk8Yx9K6XTNbkgia2ciSIn -7p5Ga9Atte0LTLKO6it4i7dVRFJDcZ4PvXN+JvEMF9bILVGXJLSZ4zkjivRPDaeX4b08HOTC -pOffmua+KkbS+GLVUGT9tT/0B68eeIpIFYjB70+OOVXyoOM9+M1eaWeCLzHPyHGO/NVWvJJm -jQ8KGH1NfQWhXSXmh2c8eArRLwO3HSv/2Q== - ---=-=-= -Content-Type: multipart/alternative; boundary="==-=-=" - - ---==-=-= - - -This is a plain text part. - ---==-=-= -Content-Type: text/enriched; - name="enriched.txt" - - -
    This is a centered enriched part
    - ---==-=-=-- - ---=-=-= - -This is a new plain text part. - ---=-=-= -Content-Disposition: attachment - - -This plain text part is an attachment. - ---=-=-=-- -@end example - -@node Charset Translation -@section Charset Translation -@cindex charsets - -During translation from MML to @sc{mime}, for each @sc{mime} part which -has been composed inside Emacs, an appropriate charset has to be chosen. - -@vindex mail-parse-charset -If you are running a non-@sc{mule} Emacs, this process is simple: If the -part contains any non-ASCII (8-bit) characters, the @sc{mime} charset -given by @code{mail-parse-charset} (a symbol) is used. (Never set this -variable directly, though. If you want to change the default charset, -please consult the documentation of the package which you use to process -@sc{mime} messages. -@xref{Various Message Variables, , Various Message Variables, message, - Message Manual}, for example.) -If there are only ASCII characters, the @sc{mime} charset US-ASCII is -used, of course. - -@cindex MULE -@cindex UTF-8 -@cindex Unicode -@vindex mm-mime-mule-charset-alist -Things are slightly more complicated when running Emacs with @sc{mule} -support. In this case, a list of the @sc{mule} charsets used in the -part is obtained, and the @sc{mule} charsets are translated to @sc{mime} -charsets by consulting the variable @code{mm-mime-mule-charset-alist}. -If this results in a single @sc{mime} charset, this is used to encode -the part. But if the resulting list of @sc{mime} charsets contains more -than one element, two things can happen: If it is possible to encode the -part via UTF-8, this charset is used. (For this, Emacs must support -the @code{utf-8} coding system, and the part must consist entirely of -characters which have Unicode counterparts.) If UTF-8 is not available -for some reason, the part is split into several ones, so that each one -can be encoded with a single @sc{mime} charset. The part can only be -split at line boundaries, though---if more than one @sc{mime} charset is -required to encode a single line, it is not possible to encode the part. - -@node Conversion -@section Conversion - -@findex mime-to-mml -A (multipart) @sc{mime} message can be converted to MML with the -@code{mime-to-mml} function. It works on the message in the current -buffer, and substitutes MML markup for @sc{mime} boundaries. -Non-textual parts do not have their contents in the buffer, but instead -have the contents in separate buffers that are referred to from the MML -tags. - -@findex mml-to-mime -An MML message can be converted back to @sc{mime} by the -@code{mml-to-mime} function. - -These functions are in certain senses ``lossy''---you will not get back -an identical message if you run @sc{mime-to-mml} and then -@sc{mml-to-mime}. Not only will trivial things like the order of the -headers differ, but the contents of the headers may also be different. -For instance, the original message may use base64 encoding on text, -while @sc{mml-to-mime} may decide to use quoted-printable encoding, and -so on. - -In essence, however, these two functions should be the inverse of each -other. The resulting contents of the message should remain equivalent, -if not identical. - - -@node Standards -@chapter Standards - -The Emacs @sc{mime} library implements handling of various elements -according to a (somewhat) large number of RFCs, drafts and standards -documents. This chapter lists the relevant ones. They can all be -fetched from @samp{http://quimby.gnus.org/notes/}. - -@table @dfn -@item RFC822 -@itemx STD11 -Standard for the Format of ARPA Internet Text Messages. - -@item RFC1036 -Standard for Interchange of USENET Messages - -@item RFC2045 -Format of Internet Message Bodies - -@item RFC2046 -Media Types - -@item RFC2047 -Message Header Extensions for Non-ASCII Text - -@item RFC2048 -Registration Procedures - -@item RFC2049 -Conformance Criteria and Examples - -@item RFC2231 -MIME Parameter Value and Encoded Word Extensions: Character Sets, -Languages, and Continuations - -@item RFC1843 -HZ - A Data Format for Exchanging Files of Arbitrarily Mixed Chinese and -ASCII characters - -@item draft-ietf-drums-msg-fmt-05.txt -Draft for the successor of RFC822 - -@item RFC2112 -The MIME Multipart/Related Content-type - -@item RFC1892 -The Multipart/Report Content Type for the Reporting of Mail System -Administrative Messages - -@item RFC2183 -Communicating Presentation Information in Internet Messages: The -Content-Disposition Header Field - -@end table - - -@node Index -@chapter Index -@printindex cp - -@summarycontents -@contents -@bye - -@c End: diff --git a/texi/gnus-faq-ja.texi b/texi/gnus-faq-ja.texi deleted file mode 100644 index 650ab7b..0000000 --- a/texi/gnus-faq-ja.texi +++ /dev/null @@ -1,441 +0,0 @@ -@c Insert "\input texinfo" at 1st line before texing this file alone. -@c -*-texinfo-*- -@c Copyright (C) 1998 Keiichi Suzuki -@setfilename gnus-faq-ja.info - -@node Frequently Asked Questions -@section $BIQHK$K?R$M$i$l$kR2p!#(B -* Installation FAQ:: Gnus $B$NF3F~!#(B -* Customization FAQ:: Gnus $B$N%+%9%?%^%$%:!#(B -* Reading News FAQ:: $B%K%e!<%9$rFI$`;v$K4X$9$kR2p(B -$B$3$NJ8=q$O(B T-gnus $B$KBP$9$k$h$/$"$ke$GF0:n$9$k%M%C%H%K%e!<%9!&%j!<%@!<(B / $BEE;R%a!<%k!&%f!<(B -$B%6!$=$&$H7h0U$7$^$7$?!#(B - -$B$7$+$7!"(B Gnus $BC1FH$G$O(B MIME $B2=$5$l$?5-;v!&%a!<%k$rFI$`$3$H$O$G$-$^$;$s!#(B -$B$=$3$G!"(B Emacs $B>e$G(B MIME $B%5%]!<%H$r$9$k$?$a$N%Q%C%1!<%8$G$"$k(B SEMI $B$r;H(B -$BMQ$7$F0lIt$N?M$?$A$,(B Gnus $B$r;HMQ$9$k$h$&$K$J$j$^$7$?!#$7$+$7!"$3$l$K$O(B -Gnus $B$K(B patch $B$r$"$F$kI,MW$,$"$k>e$K%*%j%8%J%k$N(B Gnus ($B$3$A$i$b(B -Quassia-Gnus $B$H8F$P$l3+H/ESCf$G$7$?(B)$B$NJQ99FbMF$K$h$C$F$O$=$N(B patch $B<+BN(B -$B$b:n$jD>$5$J$1$l$P$J$j$^$;$s$G$7$?!#$=$s$J(B 1997$BG/$N(B11$B7n!" $B$O<~0O(B($B9%$-/62I]$r46$8$k$+$bCN$l$^$;$s!"$7$+$7!"$"(B -$B$J$?$,$=$N5!G=$rI,MW$K$J$k$^$G$OJ#;($J5!G=$N$[$H$s$I$rL5;k$9$k$3$H$,$G$-(B -$B$^$9!#(B $B$b$7!"$"$J$?$,$^$"$^$"$NNL$N%a%$%k$ro$KN.NL$NB?$$%a!<%j%s%0%j%9%H$K;22C$7(B -$B$F$$$k$N$G$"$l$P!"$"$J$?$O(B T-gnus $B$G%a%$%k$rFI$`$?$a$ND4::$r$O$8$a$?$/$J(B -$B$k$G$7$g$&!#(B - -$B$3$N(B FAQ $B$O!"NkLZ7=0l$K$h$C$FJ]$NJ}K!(B($B%a%$%k!"%M%C%H%K%e!<%9Ey(B)$B$G>pJs$rF@$h$&$H$9$kA0$K!"$^$:$3$N(B FAQ -$B$r8+$F$_$F$/$@$5$$!#(B - -$B$3$N>pJs$O(B Semi-gnus (Ja) $B%a%$%j%s%0!&%j%9%H$N1g=u$re(B, SEMI ($B$^(B -$B$?$O(B WEMI) 1.13.5 $B0J>e$,I,MW$G$9!#(B $B$=$NB>!"(B APEL $B$,I,MW$K$J$j$^$9$,!"I,(B -$BMW$J%P!<%8%g%s$O(B FLIM / SEMI (WEMI) $B%Q%C%1!<%8Fb$N(B README $B$r;2>H$7$F$/$@(B -$B$5$$!#(B - -T-gnus $B$N%P!<%8%g%s$O!"I,MW$J(B SEMI (WEMI) $B$*$h$S(B FLIM $B$N%P!<%8%g%s$K?<$/(B -$B4X78$7$F$$$^$9!#(B $BI,$:!"(B T-gnus $B$N%P!<%8%g%s$K$"$C$?(B SEMI (WEMI) $B$*$h$S(B -FLIM $B$r;HMQ$7$F$/$@$5$$!#(B - -@item -Q1.2: $BF~l=j$+$il=j$+$ie$N(B Mule $B5!G=IU$-!#(B - -@item -XEmacs 21.1.1 $B0J>e$N(B Mule $B5!G=IU$-(B - -@item -Meadow 1.00 $B0J>e!#(B(Mule for Windows $B$G$OF0$-$^$;$s!#(B) - -@end itemize - -$B$H$O8@$&$b$N$N!"(BT-gnus $B$O%P!<%8%g%s(B 21.1.1 $BL$K~$N(B XEmacs, $BNc$($P(B 20.4 $B$G(B -$B$b;H$($k$+$b$7$l$^$;$s!#>\$7$$$3$H$O(B T-gnus $B$NG[I[$K4^$^$l$F$$$k(B README - $B%U%!%$%k$rFI$s$G2<$5$$!#(B - -@item -Q1.4: T-gnus $B$r(B GNU Emacs $B$H(B XEmacs $B$NN>J}$GF0$+$9$3$H$O$G$-$^$9$+(B? - -$B%=!<%9!&%l%Y%k(B( *.el )$B$G$O2DG=$G$9!#(B - -$B$7$+$7!"%P%$%H!&%3%s%Q%$%k$7$?%U%!%$%k(B ( *.elc ) $B$O6&M-$G$-$^$;$s$N$G!"(B -$B$=$l$>$l;HMQ$9$k(B emacs $B$G%P%$%H%3%s%Q%$%k$9$kI,MW$,$"$j$^$9!#(B - -@item -Q1.5: T-gnus $B$K$D$$$F$N>pJs8;$O(B? - -@table @var - -@item $B%K%e!<%9%0%k!<%W(B - -fj.news.reader.gnus $B$,$"$j$^$9$,!"(B T-gnus $B$K4X$7$F$N\$7$/$O!"(B@xref{Mailing list FAQ, $B%a!<%j%s%0%j%9%H(B}, $B$r;2>H$7$F$/$@$5$$!#(B - -$B8=:_!"$3$l$,$b$C$H$b3NpJs8;$G$7$g$&!#(B T-gnus $B$r;H$&$N$G$"$l$P!"@'Hs(B -$B;22C$9$k$3$H$r$*$9$9$a$7$^$9!#(B - -$B%@%$%8%'%9%HHG%5!<%S%9$O$"$j$^$;$s!#(B - -@item WWW - -$B8x<0$N(B Semi-gnus $B%[!<%`%Z!<%8$,$G$-$kM=Dj$G$9!#<9I.$J(B Jamie Zawinski $B$N:n$G!"(BGNU -Emacs $BMQ$N(Brolodex-like $B$J%G!<%?%Y!<%9%W%m%0%i%`$G$9!#(B Jamie $B$O(B BBDB $B$N(B -Web $B%Z!<%8$r;}$C$F$$$^$9!#(B @file{http://people.netscape.com/jwz/bbdb/}$B$3(B -$B$l$O!"l=j$K$"$j$^$9!#(B -@file{http://www.netcom.com/%7Esimmonmt/index.html} - -T-gnus $B$G;HMQ$9$k>l9g$K$O!"I,$:(B Q2.1 $B$r;2>H$7$F$/$@$5$$!#(B - -@item gnus-offline -gnus-offline $B$O!";T@nC#:H(B $B$N:n$G!"(B T-gnus $B$r(B -$B$$$o$f$k!V%*%U%i%$%s;HMQ!W(B($B%K%e!<%95-;v!"%a%$%k$NAwuBV$G9T$&(B)$B$9$k$3$H$rMF(B -$B0W$K$9$k$?$a$N%Q%C%1!<%8$G$9!#(BT-gnus (tag: t-gnus-6_14) $B$K$OI8=`$G4^$^$l(B -$B$F$$$^$9!#(B - -@end table - -@item -Q1.7: Draft $B$KJ]B8$7$?%a%C%;!<%8$r3+$/$HJ8;z$,2=$1$F$7$^$$$^$9!#(B - -gnus $B$,FI$_9~$_$K;HMQ$7$F$$$k$b$N$H0c$&%3!<%G%#%s%0%7%9%F%`$GJ]B8$5$l$F(B -$B$$$k;v$,860x$G$9!#0J2<$N@_Dj$G2r7h$9$k$O$:$G$9!#(B - -@lisp -(add-hook 'message-setup-hook - (lambda () - (set-buffer-file-coding-system 'iso-2022-7bit))) -@end lisp - -Q2.2 $B$b;2>H$7$F2<$5$$!#(B - -@item -Q1.8: T-gnus $B$N5/F0$rAa$/$9$k$K$O(B? - -$B9XFI$7$F$$$J$$%0%k!<%W$r(B ``kill'' (*Group* $B%P%C%U%!!<$G(B C-k) $B$7$F$"$k$3(B -$B$H$r3NG'$7$F$/$@$5$$!#$=$7$F!">o$K(B ``.newsrc'' $B$r>.$5$/J]$D$h$&$K$7$F$/(B -$B$@$5$$!#(B - -@end itemize - -@node Customization FAQ -@subsection $B%+%9%?%^%$%:$K4X$9$k(B FAQ - -@itemize @bullet -@item -Q2.1: T-gnus $B$N%P!<%8%g%s$r$"$2$?$i(B BBDB $B$,F0$+$J$/$J$C$F$7$^$$$^$7$?!#(B - -Semi-gnus 6.8 $B0J9_$N%P!<%8%g%s$G$O!"%*%j%8%J%k$N(B bbdb-gnus.el $B$OF0:n$7$^(B -$B$;$s!#(B $BH$9$k$h$&$K$9$k!#(B - -$B$b$7!"%*%j%8%J%k$N(B Gnus (September $B0J9_(B) $B$r;H$C$F$$$k$N$G$"$l$P!"$3$NJ}(B -$BK!$,NI$$$G$7$g$&!#(B - -$B$3$NJ}K!!"$*$h$S(B bbdb-user-mail-names $B$KBP1~$7$?(B BBDB 2.00.01 $B$KBP$9(B -$B$k(B patch $B!"4pK\E*$J@_DjNc$,!"(B -@file{http://www.mdcnet.co.jp/~keiichi/bbdb.shtml} $B$K$"$j$^$9!#(B - -@item -Q2.2: hook $B$r@_Dj$7$?$i(B T-gnus $B$NF0:n$,$*$+$7$/$J$C$?(B - -$BDL>o$NJQ?t$G$bF1MM$G$9$,!"(B T-gnus $B$G$OB?$/$N(B hook $B$K=i4|CM$,@_Dj$5$l$F$$(B -$B$^$9!#(B - -$B$3$NCM$rJQ99$7$h$&$H$7$F!"JQ?t$,Dj5A$5$l$F$$$k%U%!%$%k$r%m!<%I$9$kA0$K(B -setq / add-hook $BEy$r9T$&$H!"$3$l$i$N=i4|CM$,@_Dj$5$l$:!"(B T-gnus $B$,@5>o$K(B -$BF0:n$7$J$/$J$k>l9g$,$"$j$^$9!#(B($BFC$K(B T-gnus $B$N%P!<%8%g%s$,JQ$C$?>l9g(B) - -$B$3$l$rKI$0$?$a$K$b!"(B T-gnus $B$K4X$9$k@_Dj$O$G$-$k$@$1(B ~/.gnus.el $BFb$G9T$&(B -$B$h$&$K$7$F$/$@$5$$!#(B - -@item -Q2.3: $B08@h$K$h$C$F(B Signature $B$rJQ99$9$k$K$O(B? - -SEMI $B$K$O(B signature.el $B$H$$$&$3$N$?$a$N%D!<%k$,IUB0$7$F$$$^$9!#;HMQJ}K!(B -$B$O0J2<$N$H$*$j$G$9!#(B - -tm $B$N(B info $B$NFbMF$r(B SEMI $B$K9g$o$;$FJQ99$7$?$b$N$G$9!#(B - -SEMI $B$K$O(B *signature* $B$H$$$&(B signature $B$N<+F0@ZBX$((B tool $B$,ImB0$7$F$*$j!"(B -`semi-setup.el' $B$O$3$N@_Dj$b9T$J$$$^$9!#(Bmessage header $B$N(B field $B$K9g$o$;(B -$B$F(B signature $B$N<+F0@ZBX$r9T$J$$$?$$>l9g$O(B `~/.emacs' $B$K0J2<$N$h$&$J$b$N(B -$B$rF~$l$F2<$5$$!#!J>\$7$/$O(B signature.el $B$N@bL@=q$r;2>H$7$F2<$5$$!K(B - -@lisp -(setq signature-file-alist - '((("Newsgroups" . "jokes") . "~/.signature-jokes") - (("Newsgroups" . ("zxr" "nzr")) . "~/.signature-sun") - (("To" . ("ishimaru" "z-suzuki")) . "~/.signature-sun") - (("To" . "tea") . "~/.signature-jokes") - (("To" . ("sim" "oku" "takuo")) . "~/.signature-formal") - )) -@end lisp - -@defvar mime-setup-use-signature - -$B$3$NJQ?t$,(B @code{nil} $B0J30$N;~!"(B@file{signature.el} $B$r;H$$$^$9!#=i4|CM$O(B -@code{t} $B$G$9!#(B -@end defvar - -@defvar mime-setup-signature-key-alist - -$B3F(B major-mode $B$K$*$$$F(B signature $BA^F~L?Na$r@_Dj$9$Y$-(B key $B$r;XDj$7$^$9!#(B -$B=i4|CM$O(B - -@lisp - ((mail-mode . "\C-c\C-w")) -@end lisp - -$B$G$9!#(B - -$B$3$l$rJQ99$7$?$$>l9g$O!"4X?t(B set-alist $B$J$I$r;H$C$F$3$NJQ?t$r=q$-49$((B -$B$F2<$5$$!#(B - -@lisp -(set-alist 'mime-setup-signature-key-alist - 'news-reply-mode "\C-c\C-w") -@end lisp - -@end defvar - -@defvar mime-setup-default-signature-key - -$B$"$k(B major-mode $B$K$*$$$F(B signature $BA^F~L?Na$r@_Dj$9$Y$-(B key $B$,8+$D$+$i$J(B -$B$$>l9g!"$3$NJQ?t$K@_Dj$5$l$?(B key $B$,MQ$$$i$l$^$9!#=i4|CM$O!"(B -@code{"\C-c\C-s"} $B$G$9!#(B -@end defvar - -gnus-posting-style $B$r;HMQ$9$k;v$b$G$-$^$9!#(B - -@end itemize - -@node Reading News FAQ -@subsection $B%K%e!<%9$rFI$`(B - -@node Reading Mail FAQ -@subsection $B%a!<%k$rFI$`(B - -@node Mailing list FAQ -@subsection $B%a!<%j%s%0%j%9%H(B - -@itemize @bullet -@item -Q5.1: $B%a%$%j%s%0!&%j%9%H$+$iC&B`$9$k$K$O(B? - -@table @var -@item $BF|K\8lMQ(B -@file{semi-gnus-ja-unsubscribe@@meadowy.org} $B$K6u$N%a%$%k$rAw$C$F2<$5$$!#(B -(Subject $B$bITMW$G$9!#(B) - -@item $B1Q8lMQ(B -@file{semi-gnus-en-unsubscribe@@meadowy.org} $B$K6u$N%a%$%k$rAw$C$F2<$5$$!#(B -(Subject $B$bITMW$G$9!#(B) - -@end table - -@item -Q5.2: $B%a%$%j%s%0!&%j%9%H$K;22C$9$k$K$O(B? - -T-gnus $B$G$O!"MxMQMh$NB?$/$N%Q%C%1!<%8$G:NMQ$5$l$F$$$k(B -$B3+H/BN@)$O$C$F$/$/$@$5$$!#(B(Subject $B$bITMW$G$9!#(B) - -@item $B1Q8lMQ(B -@file{semi-gnus-en-help@@meadowy.org} $B$K6u$N%a!<%k$rAw$C$F!"Aw$i$l$F$/$k(B -$B%a!<%k$N;X<($K=>$C$F$/$@$5$$!#(B(Subject $B$bITMW$G$9!#(B) - -@end table - -@item -Q5.3: T-gnus $B$K4X$9$kJ}?K7hDj$O(B? - -T-gnus $B$N3+H/Ey$K4X$9$kJ}?K$N7hDj$OA4$F(B Semi-gnus-ja/en $B%a!<%j%s%0%j%9%H(B -$BFb$G9T$o$l$^$9!#(B $B3F%a%s%P!<$+$i$NDs0F$O%"%s%1!<%H$N7A$GDs0F$5$l7h5D$5$l(B -$B$^$9$,!"$=$NJ}K!$Ol9g$KE,MQ$5$l$k!#(B $B;dE*$J;^$dHG$K4X(B -$B$7$F$OE,MQ$5$l$J$$!#(B - -@item -$B8xE*$J0F7o$NDs0F$*$h$S5DO@$O(B semi-gnus-ja@@meadowy.org $B$b$7$/(B -$B$O(B semi-gnus-en@@meadowy.org $B$G9T$&!#(B - -@item -$B:G=*E*$JJ}?K$O%"%s%1!<%H7k2L$NB??t0U8+$r:NMQ$9$k!#(B - -@item -$BDs0Fe$G$J$1$l(B -$B$P$J$i$J$$!#(B - -@item -$BDs0Fl9g!"Ds0FF|$h$j#1=54V8e$r2s(B -$BEz4|8B$H$9$k!#(B - -@item -$BDs0F0J>e$N2sEz$,$"$C(B -$B$?;~E@$G%"%s%1!<%H$N=*N;$r@k8@$G$-$k!#(B $B$3$N>l9g!"%"%s%1!<%H$NB??t0U8+$r(B -$B7kO@$H$9$k!#(B - -@item -$B2sEz4|8B$,2a$.$F$b!"#5L>0J>e$N2sEz$,$J$$>l9g$O!"Ds0Fe$N;22Cl9g!"2sEz4|8B$O1dD9(B -$B$5$l$k!#(B -@end enumerate - -@end itemize diff --git a/texi/gnus-faq.texi b/texi/gnus-faq.texi deleted file mode 100644 index 611a50c..0000000 --- a/texi/gnus-faq.texi +++ /dev/null @@ -1,673 +0,0 @@ -@c Insert "\input texinfo" at 1st line before texing this file alone. -@c -*-texinfo-*- -@c Copyright (C) 1995 Free Software Foundation, Inc. -@setfilename gnus-faq.info - -@node Frequently Asked Questions -@section Frequently Asked Questions - -This is the Gnus Frequently Asked Questions list. -If you have a Web browser, the official hypertext version is at -@file{http://www.ccs.neu.edu/software/contrib/gnus/}, and has -probably been updated since you got this manual. - -@menu -* Installation FAQ:: Installation of Gnus. -* Customization FAQ:: Customizing Gnus. -* Reading News FAQ:: News Reading Questions. -* Reading Mail FAQ:: Mail Reading Questions. -@end menu - - -@node Installation FAQ -@subsection Installation - -@itemize @bullet -@item -Q1.1 What is the latest version of Gnus? - -The latest (and greatest) version is 5.0.10. You might also run -across something called @emph{September Gnus}. September Gnus -is the alpha version of the next major release of Gnus. It is currently -not stable enough to run unless you are prepared to debug lisp. - -@item -Q1.2 Where do I get Gnus? - -Any of the following locations: - -@itemize @minus -@item -@file{ftp://ftp.ifi.uio.no/pub/emacs/gnus/gnus.tar.gz} - -@item -@file{ftp://ftp.pilgrim.umass.edu/pub/misc/ding/} - -@item -@file{gopher://gopher.pilgrim.umass.edu/11/pub/misc/ding/} - -@item -@file{ftp://aphrodite.nectar.cs.cmu.edu/pub/ding-gnus/} - -@item -@file{ftp://ftp.solace.mh.se:/pub/gnu/elisp/} - -@end itemize - -@item -Q1.3 Which version of Emacs do I need? - -At least GNU Emacs 19.28, or XEmacs 19.12 is recommended. GNU Emacs -19.25 has been reported to work under certain circumstances, but it -doesn't @emph{officially} work on it. 19.27 has also been reported to -work. Gnus has been reported to work under OS/2 as well as Unix. - - -@item -Q1.4 Where is timezone.el? - -Upgrade to XEmacs 19.13. In earlier versions of XEmacs this file was -placed with Gnus 4.1.3, but that has been corrected. - - -@item -Q1.5 When I run Gnus on XEmacs 19.13 I get weird error messages. - -You're running an old version of Gnus. Upgrade to at least version -5.0.4. - - -@item -Q1.6 How do I unsubscribe from the Mailing List? - -Send an e-mail message to @file{ding-request@@ifi.uio.no} with the magic word -@emph{unsubscribe} somewhere in it, and you will be removed. - -If you are reading the digest version of the list, send an e-mail message -to @* -@file{ding-rn-digests-d-request@@moe.shore.net} -with @emph{unsubscribe} as the subject and you will be removed. - - -@item -Q1.7 How do I run Gnus on both Emacs and XEmacs? - -The basic answer is to byte-compile under XEmacs, and then you can -run under either Emacsen. There is, however, a potential version -problem with easymenu.el with Gnu Emacs prior to 19.29. - -Per Abrahamsen writes :@* -The internal easymenu.el interface changed between 19.28 and 19.29 in -order to make it possible to create byte compiled files that can be -shared between Gnu Emacs and XEmacs. The change is upward -compatible, but not downward compatible. -This gives the following compatibility table: - -@example -Compiled with: | Can be used with: -----------------+-------------------------------------- -19.28 | 19.28 19.29 -19.29 | 19.29 XEmacs -XEmacs | 19.29 XEmacs -@end example - -If you have Gnu Emacs 19.28 or earlier, or XEmacs 19.12 or earlier, get -a recent version of auc-menu.el from -@file{ftp://ftp.iesd.auc.dk/pub/emacs-lisp/auc-menu.el}, and install it -under the name easymenu.el somewhere early in your load path. - - -@item -Q1.8 What resources are available? - -There is the newsgroup Gnu.emacs.gnus. Discussion of Gnus 5.x is now -taking place there. There is also a mailing list, send mail to -@file{ding-request@@ifi.uio.no} with the magic word @emph{subscribe} -somewhere in it. - -@emph{NOTE:} the traffic on this list is heavy so you may not want to be -on it (unless you use Gnus as your mailer reader, that is). The mailing -list is mainly for developers and testers. - -Gnus has a home World Wide Web page at@* -@file{http://www.ifi.uio.no/~larsi/ding.html}. - -Gnus has a write up in the X Windows Applications FAQ at@* -@file{http://www.ee.ryerson.ca:8080/~elf/xapps/Q-III.html}. - -The Gnus manual is also available on the World Wide Web. The canonical -source is in Norway at@* -@file{http://www.ifi.uio.no/~larsi/ding-manual/gnus_toc.html}. - -There are three mirrors in the United States: -@enumerate -@item -@file{http://www.miranova.com/gnus-man/} - -@item -@file{http://www.pilgrim.umass.edu/pub/misc/ding/manual/gnus_toc.html} - -@item -@file{http://www.rtd.com/~woo/gnus/} - -@end enumerate - -PostScript copies of the Gnus Reference card are available from@* -@file{ftp://ftp.cs.ualberta.ca/pub/oolog/gnus/}. They are mirrored at@* -@file{ftp://ftp.pilgrim.umass.edu/pub/misc/ding/refcard/} in the -United States. And@* -@file{ftp://marvin.fkphy.uni-duesseldorf.de/pub/gnus/} -in Germany. - -An online version of the Gnus FAQ is available at@* -@file{http://www.miranova.com/~steve/gnus-faq.html}. Off-line formats -are also available:@* -ASCII: @file{ftp://ftp.miranova.com/pub/gnus/gnus-faq}@* -PostScript: @file{ftp://ftp.miranova.com/pub/gnus/gnus-faq.ps}. - - -@item -Q1.9 Gnus hangs on connecting to NNTP server - -I am running XEmacs on SunOS and Gnus prints a message about Connecting -to NNTP server and then just hangs. - -Ben Wing writes :@* -I wonder if you're hitting the infamous @emph{libresolv} problem. -The basic problem is that under SunOS you can compile either -with DNS or NIS name lookup libraries but not both. Try -substituting the IP address and see if that works; if so, you -need to download the sources and recompile. - - -@item -Q1.10 Mailcrypt 3.4 doesn't work - -This problem is verified to still exist in Gnus 5.0.9 and Mailcrypt 3.4. -The answer comes from Peter Arius -. - -I found out that mailcrypt uses -@code{gnus-eval-in-buffer-window}, which is a macro. -It seems as if you have -compiled mailcrypt with plain old GNUS in load path, and the XEmacs byte -compiler has inserted that macro definition into -@file{mc-toplev.elc}. -The solution is to recompile @file{mc-toplev.el} with Gnus 5 in -load-path, and it works fine. - -Steve Baur adds :@* -The problem also manifests itself if neither GNUS 4 nor Gnus 5 is in the -load-path. - - -@item -Q1.11 What other packages work with Gnus? - -@itemize @minus -@item -Mailcrypt. - -Mailcrypt is an Emacs interface to PGP. It works, it installs -without hassle, and integrates very easily. Mailcrypt can be -obtained from@* -@file{ftp://cag.lcs.mit.edu/pub/patl/mailcrypt-3.4.tar.gz}. - -@item -Tools for Mime. - -Tools for Mime is an Emacs MUA interface to MIME. Installation is -a two-step process unlike most other packages, so you should -be prepared to move the byte-compiled code somewhere. There -are currently two versions of this package available. It can -be obtained from@* -@file{ftp://ftp.m17n.org/pub/mule/}. -Be sure to apply the supplied patch. It works with Gnus through -version 5.0.9. In order for all dependencies to work correctly -the load sequence is as follows: -@lisp - (load "tm-setup") - (load "gnus") - (load "mime-compose") -@end lisp - -@emph{NOTE:} Loading the package disables citation highlighting by -default. To get the old behavior back, use the @kbd{M-t} command. - -@end itemize - -@end itemize - - -@node Customization FAQ -@subsection Customization - -@itemize @bullet -@item -Q2.1 Custom Edit does not work under XEmacs - -The custom package has not been ported to XEmacs. - - -@item -Q2.2 How do I quote messages? - -I see lots of messages with quoted material in them. I am wondering -how to have Gnus do it for me. - -This is Gnus, so there are a number of ways of doing this. You can use -the built-in commands to do this. There are the @kbd{F} and @kbd{R} -keys from the summary buffer which automatically include the article -being responded to. These commands are also selectable as @i{Followup -and Yank} and @i{Reply and Yank} in the Post menu. - -@kbd{C-c C-y} grabs the previous message and prefixes each line with -@code{ail-indentation-spaces} spaces or @code{mail-yank-prefix} if that is -non-nil, unless you have set your own @code{mail-citation-hook}, which will -be called to do the job. - -You might also consider the Supercite package, which allows for pretty -arbitrarily complex quoting styles. Some people love it, some people -hate it. - - -@item -Q2.3 How can I keep my nnvirtual:* groups sorted? - -How can I most efficiently arrange matters so as to keep my nnvirtual:* -(etc) groups at the top of my group selection buffer, whilst keeping -everything sorted in alphabetical order. - -If you don't subscribe often to new groups then the easiest way is to -first sort the groups and then manually kill and yank the virtuals -wherever you want them. - - -@item -Q2.4 Any good suggestions on stuff for an all.SCORE file? - -Here is a collection of suggestions from the Gnus mailing list. - -@enumerate -@item -From ``Dave Disser'' @* -I like blasting anything without lowercase letters. Weeds out most of -the make $$ fast, as well as the lame titles like ``IBM'' and ``HP-UX'' -with no further description. -@lisp - (("Subject" - ("^\\(Re: \\)?[^a-z]*$" -200 nil R))) -@end lisp - -@item -From ``Peter Arius'' @* -The most vital entries in my (still young) all.SCORE: -@lisp -(("xref" - ("alt.fan.oj-simpson" -1000 nil s)) - ("subject" - (concat "\\<\\(make\\|fast\\|big\\)\\s-*" - "\\(money\\|cash\\|bucks?\\)\\>" - -1000 nil r) - ("$$$$" -1000 nil s))) -@end lisp - -@item -From ``Per Abrahamsen'' @* -@lisp -(("subject" - ;; CAPS OF THE WORLD, UNITE - ("^..[^a-z]+$" -1 nil R) - ;; $$$ Make Money $$$ (Try work) - ("$" -1 nil s) - ;; I'm important! And I have exclamation marks to prove it! - ("!" -1 nil s))) -@end lisp - -@item -From ``heddy boubaker'' @* -I would like to contribute with mine. -@lisp -( - (read-only t) - ("subject" - ;; ALL CAPS SUBJECTS - ("^\\([Rr][Ee]: +\\)?[^a-z]+$" -1 nil R) - ;; $$$ Make Money $$$ - ("$$" -10 nil s) - ;; Empty subjects are worthless! - ("^ *\\([(<]none[>)]\\|(no subject\\( given\\)?)\\)? *$" - -10 nil r) - ;; Sometimes interesting announces occur! - ("ANN?OU?NC\\(E\\|ING\\)" +10 nil r) - ;; Some people think they're on mailing lists - ("\\(un\\)?sub?scribe" -100 nil r) - ;; Stop Micro$oft NOW!! - ;; ("concat" used to avoid overfull box.) - (concat "\\(m\\(icro\\)?[s$]\\(oft\\|lot\\)?-?\\)?" - "wind?\\(ows\\|aube\\|oze\\)?[- ]*" - "\\('?95\\|NT\\|3[.]1\\|32\\)" -1001 nil r) - ;; I've nothing to buy - ("\\(for\\|4\\)[- ]*sale" -100 nil r) - ;; SELF-DISCIPLINED people - ("\\[[^a-z0-9 \t\n][^a-z0-9 \t\n]\\]" +100 nil r) - ) - ("from" - ;; To keep track of posters from my site - (".dgac.fr" +1000 nil s)) - ("followup" - ;; Keep track of answers to my posts - ("boubaker" +1000 nil s)) - ("lines" - ;; Some people have really nothing to say!! - (1 -10 nil <=)) - (mark -100) - (expunge -1000) - ) -@end lisp - -@item -From ``Christopher Jones'' @* -The sample @file{all.SCORE} files from Per and boubaker could be -augmented with: -@lisp - (("subject" - ;; No junk mail please! - ("please ignore" -500 nil s) - ("test" -500 nil e)) - ) -@end lisp - -@item -From ``Brian Edmonds'' @* -Augment any of the above with a fast method of scoring down -excessively cross posted articles. -@lisp - ("xref" - ;; the more cross posting, the exponentially worse the article - ("^xref: \\S-+ \\S-+ \\S-+ \\S-+" -1 nil r) - ("^xref: \\S-+ \\S-+ \\S-+ \\S-+ \\S-+" -2 nil r) - ("^xref: \\S-+ \\S-+ \\S-+ \\S-+ \\S-+ \\S-+" -4 nil r) - ("^xref: \\S-+ \\S-+ \\S-+ \\S-+ \\S-+ \\S-+ \\S-+" -8 nil r) - ("^xref: \\S-+ \\S-+ \\S-+ \\S-+ \\S-+ \\S-+ \\S-+ \\S-+" - -16 nil r) - (concat "^xref: \\S-+ \\S-+ \\S-+ \\S-+ \\S-+ \\S-+ \\S-+" - " \\S-+ \\S-+" - -32 nil r) - (concat "^xref: \\S-+ \\S-+ \\S-+ \\S-+ \\S-+ \\S-+ \\S-+" - " \\S-+ \\S-+ \\S-+" -64 nil r) - (concat "^xref: \\S-+ \\S-+ \\S-+ \\S-+ \\S-+ \\S-+ \\S-+" - " \\S-+ \\S-+ \\S-+ \\S-+" -128 nil r) - (concat "^xref: \\S-+ \\S-+ \\S-+ \\S-+ \\S-+ \\S-+ \\S-+" - " \\S-+ \\S-+ \\S-+ \\S-+ \\S-+" -256 nil r) - (concat "^xref: \\S-+ \\S-+ \\S-+ \\S-+ \\S-+ \\S-+ \\S-+" - " \\S-+" \\S-+ \\S-+ \\S-+ \\S-+ \\S-+" -512 nil r)) -@end lisp - -@end enumerate - - -@item -Q2.5 What do I use to yank-through when replying? - -You should probably reply and followup with @kbd{R} and @kbd{F}, instead -of @kbd{r} and @kbd{f}, which solves your problem. But you could try -something like: - -@example -(defconst mail-yank-ignored-headers - "^.*:" - "Delete these headers from message when it's inserted in reply.") -@end example - - -@item -Q2.6 I don't like the default WWW browser - -Now when choosing an URL Gnus starts up a W3 buffer, I would like it -to always use Netscape (I don't browse in text-mode ;-). - -@enumerate -@item -Activate `Customize...' from the `Help' menu. - -@item -Scroll down to the `WWW Browser' field. - -@item -Click `mouse-2' on `WWW Browser'. - -@item -Select `Netscape' from the pop up menu. - -@item -Press `C-c C-c' - -@end enumerate - -If you are using XEmacs then to specify Netscape do -@lisp - (setq gnus-button-url 'gnus-netscape-open-url) -@end lisp - - -@item -Q2.7 What, if any, relation is between ``ask-server'' and ``(setq -gnus-read-active-file 'some)''? - -In order for Gnus to show you the complete list of newsgroups, it will -either have to either store the list locally, or ask the server to -transmit the list. You enable the first with - -@lisp - (setq gnus-save-killed-list t) -@end lisp - -and the second with - -@lisp - (setq gnus-read-active-file t) -@end lisp - -If both are disabled, Gnus will not know what newsgroups exists. There -is no option to get the list by casting a spell. - - -@item -Q2.8 Moving between groups is slow. - -Per Abrahamsen writes:@* - -Do you call @code{define-key} or something like that in one of the -summary mode hooks? This would force Emacs to recalculate the keyboard -shortcuts. Removing the call should speed up @kbd{M-x gnus-summary-mode -RET} by a couple of orders of magnitude. You can use - -@lisp -(define-key gnus-summary-mode-map KEY COMMAND) -@end lisp - -in your @file{.gnus} instead. - -@end itemize - - -@node Reading News FAQ -@subsection Reading News - -@itemize @bullet -@item -Q3.1 How do I convert my kill files to score files? - -@samp{ethanb@@ptolemy.astro.washington.edu, Ethan Bradford} write a -kill-to-score translator. It is available from@* -@file{http://baugi.ifi.uio.no/~larsi/ding-various/gnus-kill-to-score.el}. - - -@item -Q3.2 My news server has a lot of groups, and killing groups is painfully -slow. - -Don't do that then. The best way to get rid of groups that should be -dead is to edit your newsrc directly. This problem will be addressed -in the near future. - - -@item -Q3.3 How do I use an NNTP server with authentication? - -Put the following into your .gnus: -@lisp - (add-hook 'nntp-server-opened-hook 'nntp-send-authinfo) -@end lisp - - -@item -Q3.4 Not reading the first article. - -How do I avoid reading the first article when a group is selected? - -@enumerate -@item -Use @kbd{RET} to select the group instead of @kbd{SPC}. - -@item -@code{(setq gnus-auto-select first nil)} - -@item -Luis Fernandes writes:@* -This is what I use...customize as necessary... - -@lisp -;;; Don't auto-select first article if reading sources, or -;;; archives or jobs postings, etc. and just display the -;;; summary buffer -(add-hook 'gnus-select-group-hook - (function - (lambda () - (cond ((string-match "sources" gnus-newsgroup-name) - (setq gnus-auto-select-first nil)) - ((string-match "jobs" gnus-newsgroup-name) - (setq gnus-auto-select-first nil)) - ((string-match "comp\\.archives" gnus-newsgroup-name) - (setq gnus-auto-select-first nil)) - ((string-match "reviews" gnus-newsgroup-name) - (setq gnus-auto-select-first nil)) - ((string-match "announce" gnus-newsgroup-name) - (setq gnus-auto-select-first nil)) - ((string-match "binaries" gnus-newsgroup-name) - (setq gnus-auto-select-first nil)) - (t - (setq gnus-auto-select-first t)))))) -@end lisp - -@item -Per Abrahamsen writes:@* -Another possibility is to create an @file{all.binaries.all.SCORE} file -like this: - -@lisp -((local - (gnus-auto-select-first nil))) -@end lisp - -and insert -@lisp - (setq gnus-auto-select-first t) -@end lisp - -in your @file{.gnus}. - -@end enumerate - -@item -Q3.5 Why aren't BBDB known posters marked in the summary buffer? - -Brian Edmonds writes:@* -Due to changes in Gnus 5.0, @file{bbdb-gnus.el} no longer marks known -posters in the summary buffer. An updated version, @file{gnus-bbdb.el} -is available at the locations listed below. This package also supports -autofiling of incoming mail to folders specified in the BBDB. Extensive -instructions are included as comments in the file. - -Send mail to @file{majordomo@@edmonds.home.cs.ubc.ca} with the following -line in the body of the message: @emph{get misc gnus-bbdb.el}. - -Or get it from the World Wide Web:@* -@file{http://www.cs.ubc.ca/spider/edmonds/gnus-bbdb.el}. - -@end itemize - - -@node Reading Mail FAQ -@subsection Reading Mail - -@itemize @bullet -@item -Q4.1 What does the message ``Buffer has changed on disk'' mean in a mail -group? - -Your filter program should not deliver mail directly to your folders, -instead it should put the mail into spool files. Gnus will then move -the mail safely from the spool files into the folders. This will -eliminate the problem. Look it up in the manual, in the section -entitled ``Mail & Procmail''. - - -@item -Q4.2 How do you make articles un-expirable? - -I am using nnml to read news and have used -@code{gnus-auto-expirable-newsgroups} to automagically expire articles -in some groups (Gnus being one of them). Sometimes there are -interesting articles in these groups that I want to keep. Is there any -way of explicitly marking an article as un-expirable - that is mark it -as read but not expirable? - -Use @kbd{u}, @kbd{!}, @kbd{d} or @kbd{M-u} in the summary buffer. You -just remove the @kbd{E} mark by setting some other mark. It's not -necessary to tick the articles. - - -@item -Q4.3 How do I delete bogus nnml: groups? - -My problem is that I have various mail (nnml) groups generated while -experimenting with Gnus. How do I remove them now? Setting the level to -9 does not help. Also @code{gnus-group-check-bogus-groups} does not -recognize them. - -Removing mail groups is tricky at the moment. (It's on the to-do list, -though.) You basically have to kill the groups in Gnus, shut down Gnus, -edit the active file to exclude these groups, and probably remove the -nnml directories that contained these groups as well. Then start Gnus -back up again. - - -@item -Q4.4 What happened to my new mail groups? - -I got new mail, but I have -never seen the groups they should have been placed in. - -They are probably there, but as zombies. Press @kbd{A z} to list -zombie groups, and then subscribe to the groups you want with @kbd{u}. -This is all documented quite nicely in the user's manual. - - -@item -Q4.5 Not scoring mail groups - -How do you @emph{totally} turn off scoring in mail groups? - -Use an nnbabyl:all.SCORE (or nnmh, or nnml, or whatever) file containing: - -@example -((adapt ignore) - (local (gnus-use-scoring nil)) - (exclude-files "all.SCORE")) -@end example - -@end itemize - - diff --git a/texi/gnus-ja.texi b/texi/gnus-ja.texi deleted file mode 100644 index 3f4292f..0000000 --- a/texi/gnus-ja.texi +++ /dev/null @@ -1,22539 +0,0 @@ -@c \input texinfo @c -*- mode: texinfo; coding: iso-2022-7bit; -*- - -@setfilename gnus-ja -@settitle T-gnus 6.15 Manual -@synindex fn cp -@synindex vr cp -@synindex pg cp -@dircategory Emacs -@direntry -* Gnus-ja: (gnus-ja). The newsreader gnus (Japanese). -@end direntry -@iftex -@finalout -@end iftex -@setchapternewpage odd - -@iftex -@iflatex -\documentclass[twoside,a4paper,openright,11pt]{book} -\usepackage[latin1]{inputenc} -\usepackage{pagestyle} -\usepackage{epsfig} -\usepackage{bembo} -\usepackage{pixidx} - -\makeindex -\begin{document} - -\newcommand{\gnuschaptername}{} -\newcommand{\gnussectionname}{} - -\newcommand{\gnusbackslash}{/} - -\newcommand{\gnusref}[1]{``#1'' on page \pageref{#1}} -\newcommand{\gnusuref}[1]{\gnustt{#1}} -\newcommand{\gnusxref}[1]{See ``#1'' on page \pageref{#1}} -\newcommand{\gnuspxref}[1]{see ``#1'' on page \pageref{#1}} - -\newcommand{\gnuskindex}[1]{\index{#1}} -\newcommand{\gnusindex}[1]{\index{#1}} - -\newcommand{\gnustt}[1]{{\fontfamily{pfu}\fontsize{10pt}{10}\selectfont #1}} -\newcommand{\gnuscode}[1]{\gnustt{#1}} -\newcommand{\gnussamp}[1]{``{\fontencoding{OT1}\fontfamily{pfu}\fontsize{10pt}{10}\selectfont #1}''} -\newcommand{\gnuslisp}[1]{\gnustt{#1}} -\newcommand{\gnuskbd}[1]{`\gnustt{#1}'} -\newcommand{\gnusfile}[1]{`\gnustt{#1}'} -\newcommand{\gnusdfn}[1]{\textit{#1}} -\newcommand{\gnusi}[1]{\textit{#1}} -\newcommand{\gnusstrong}[1]{\textbf{#1}} -\newcommand{\gnusemph}[1]{\textit{#1}} -\newcommand{\gnusvar}[1]{{\fontsize{10pt}{10}\selectfont\textsl{\textsf{#1}}}} -\newcommand{\gnussc}[1]{\textsc{#1}} -\newcommand{\gnustitle}[1]{{\huge\textbf{#1}}} -\newcommand{\gnusauthor}[1]{{\large\textbf{#1}}} -\newcommand{\gnusresult}[1]{\gnustt{=> #1}} - -\newcommand{\gnusbullet}{{${\bullet}$}} -\newcommand{\gnusdollar}{\$} -\newcommand{\gnusampersand}{\&} -\newcommand{\gnuspercent}{\%} -\newcommand{\gnushash}{\#} -\newcommand{\gnushat}{\symbol{"5E}} -\newcommand{\gnusunderline}{\symbol{"5F}} -\newcommand{\gnusnot}{$\neg$} -\newcommand{\gnustilde}{\symbol{"7E}} -\newcommand{\gnusless}{{$<$}} -\newcommand{\gnusgreater}{{$>$}} -\newcommand{\gnusbraceleft}{{$>$}} -\newcommand{\gnusbraceright}{{$>$}} - -\newcommand{\gnushead}{\raisebox{-1cm}{\epsfig{figure=ps/gnus-head.eps,height=1cm}}} -\newcommand{\gnusinteresting}{ -\marginpar[\mbox{}\hfill\gnushead]{\gnushead} -} - -\newcommand{\gnuscleardoublepage}{\ifodd\count0\mbox{}\clearpage\thispagestyle{empty}\mbox{}\clearpage\else\clearpage\fi} - -\newcommand{\gnuspagechapter}[1]{ -{\mbox{}} -} - -\newdimen{\gnusdimen} -\gnusdimen 0pt - -\newcommand{\gnuschapter}[2]{ -\gnuscleardoublepage -\ifdim \gnusdimen = 0pt\setcounter{page}{1}\pagestyle{gnus}\pagenumbering{arabic} \gnusdimen 1pt\fi -\chapter{#2} -\renewcommand{\gnussectionname}{} -\renewcommand{\gnuschaptername}{#2} -\thispagestyle{empty} -\hspace*{-2cm} -\begin{picture}(500,500)(0,0) -\put(480,350){\makebox(0,0)[tr]{#1}} -\put(40,300){\makebox(500,50)[bl]{{\Huge\bf{#2}}}} -\end{picture} -\clearpage -} - -\newcommand{\gnusfigure}[3]{ -\begin{figure} -\mbox{}\ifodd\count0\hspace*{-0.8cm}\else\hspace*{-3cm}\fi\begin{picture}(440,#2) -#3 -\end{picture} -\caption{#1} -\end{figure} -} - -\newcommand{\gnusicon}[1]{ -\marginpar[\mbox{}\hfill\raisebox{-1.5cm}{\epsfig{figure=tmp/#1-up.ps,height=1.5cm}}]{\raisebox{-1cm}{\epsfig{figure=tmp/#1-up.ps,height=1cm}}} -} - -\newcommand{\gnuspicon}[1]{ -\margindex{\epsfig{figure=#1,width=2cm}} -} - -\newcommand{\gnusxface}[2]{ -\margindex{\epsfig{figure=#1,width=1cm}\epsfig{figure=#2,width=1cm}} -} - -\newcommand{\gnussmiley}[2]{ -\margindex{\makebox[2cm]{\hfill\epsfig{figure=#1,width=0.5cm}\hfill\epsfig{figure=#2,width=0.5cm}\hfill}} -} - -\newcommand{\gnusitemx}[1]{\mbox{}\vspace*{-\itemsep}\vspace*{-\parsep}\item#1} - -\newcommand{\gnussection}[1]{ -\renewcommand{\gnussectionname}{#1} -\section{#1} -} - -\newenvironment{codelist}% -{\begin{list}{}{ -} -}{\end{list}} - -\newenvironment{kbdlist}% -{\begin{list}{}{ -\labelwidth=0cm -} -}{\end{list}} - -\newenvironment{dfnlist}% -{\begin{list}{}{ -} -}{\end{list}} - -\newenvironment{stronglist}% -{\begin{list}{}{ -} -}{\end{list}} - -\newenvironment{samplist}% -{\begin{list}{}{ -} -}{\end{list}} - -\newenvironment{varlist}% -{\begin{list}{}{ -} -}{\end{list}} - -\newenvironment{emphlist}% -{\begin{list}{}{ -} -}{\end{list}} - -\newlength\gnusheadtextwidth -\setlength{\gnusheadtextwidth}{\headtextwidth} -\addtolength{\gnusheadtextwidth}{1cm} - -\newpagestyle{gnuspreamble}% -{ -{ -\ifodd\count0 -{ -\hspace*{-0.23cm}\underline{\makebox[\gnusheadtextwidth]{\mbox{}}\textbf{\hfill\roman{page}}} -} -\else -{ -\hspace*{-3.25cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\roman{page}\hfill\mbox{}}} -} -} -\fi -} -} -{ -\ifodd\count0 -\mbox{} \hfill -\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}} -\else -\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}} -\hfill \mbox{} -\fi -} - -\newpagestyle{gnusindex}% -{ -{ -\ifodd\count0 -{ -\hspace*{-0.23cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\gnuschaptername\hfill\arabic{page}}}} -} -\else -{ -\hspace*{-3.25cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{page}\hfill\gnuschaptername}}} -} -\fi -} -} -{ -\ifodd\count0 -\mbox{} \hfill -\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}} -\else -\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}} -\hfill \mbox{} -\fi -} - -\newpagestyle{gnus}% -{ -{ -\ifodd\count0 -{ -\makebox[12cm]{\hspace*{3.1cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{chapter}.\arabic{section}} \textbf{\gnussectionname\hfill\arabic{page}}}}} -} -\else -{ -\makebox[12cm]{\hspace*{-2.95cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{page}\hfill\gnuschaptername}}}} -} -\fi -} -} -{ -\ifodd\count0 -\mbox{} \hfill -\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}} -\else -\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}} -\hfill \mbox{} -\fi -} - -\pagenumbering{roman} -\pagestyle{gnuspreamble} - -@end iflatex -@end iftex - -@iftex -@iflatex -\begin{titlepage} -{ - -%\addtolength{\oddsidemargin}{-5cm} -%\addtolength{\evensidemargin}{-5cm} -\parindent=0cm -\addtolength{\textheight}{2cm} - -\gnustitle{\gnustitlename}\\ -\rule{15cm}{1mm}\\ -\vfill -\hspace*{0cm}\epsfig{figure=ps/gnus-big-logo.eps,height=15cm} -\vfill -\rule{15cm}{1mm}\\ -\gnusauthor{by Lars Magne Ingebrigtsen} -\newpage -} - -\mbox{} -\vfill - -\thispagestyle{empty} - -Copyright \copyright{} 1995, 1996, 1997, 1998, 1999, 2000 -Free Software Foundation, Inc. - - -Permission is granted to copy, distribute and/or modify this document -under the terms of the GNU Free Documentation License, Version 1.1 or -any later version published by the Free Software Foundation; with no -Invariant Sections, with the Front-Cover texts being ``A GNU -Manual'', and with the Back-Cover Texts as in (a) below. A copy of the -license is included in the section entitled ``GNU Free Documentation -License'' in the Emacs manual. - -$B$3$NJ8=q$r!"%U%j!<%=%U%H%&%'%":bCDH/9T$N(B GNU $B%U%j!r7o$N2<$GJ#@=!"G[I[!"$"$k$$$OJQ99$9(B -$B$k$3$H$r5v2D$7$^$9!#JQ99IT2DItJ,$O;XDj$7$^$;$s!#!V(BA GNU Manual$B!W$OI=I=;f(B -$B%F%-%9%H!"0J2<$N(B (a) $B$ON"I=;f%F%-%9%H$G$9!#$3$NMxMQ5vBz7@Ls=q$NJ#O$K4^$^$l$F$$$^(B -$B$9!#(B - -(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify -this GNU Manual, like GNU software. Copies published by the Free -Software Foundation raise funds for GNU development.'' - -(a) FSF $B$NN"I=;f%F%-%9%H(B:$B!V$"$J$?$K$O$3$N(B GNU Manual $B$r(B GNU $B%=%U%H%&%'%"(B -$B$N$h$&$KJ#@=$7$?$jJQ99$9$k<+M3$,$"$j$^$9!#J#@=$O%U%j!<%=%U%H%&%'%":bCD$K(B -$B$h$C$F=PHG$5$l$^$7$?!#(B($B%U%j!<%=%U%H%&%'%":bCD$O(B) GNU $B$N3+H/$N$?$a$KI,MW(B -$B$J;q6b$r=8$a$F$$$^$9!#!W(B - -This document is part of a collection distributed under the GNU Free -Documentation License. If you want to distribute this document -separately from the collection, you can do so by adding a copy of the -license to the document, as described in section 6 of the license. - -$B$3$NJ8=q$O!V(BGNU $B%U%j!r7o$N2<$GJ#@=!"G[I[!"$"$k$$$OJQ99$9(B -$B$k$3$H$r5v2D$7$^$9!#JQ99IT2DItJ,$O;XDj$7$^$;$s!#!V(BA GNU Manual$B!W$OI=I=;f(B -$B%F%-%9%H!"0J2<$N(B (a) $B$ON"I=;f%F%-%9%H$G$9!#$3$NMxMQ5vBz7@Ls=q$NJ#O$K4^$^$l$F$$$^(B -$B$9!#(B - -(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify -this GNU Manual, like GNU software. Copies published by the Free -Software Foundation raise funds for GNU development.'' - -(a) FSF $B$NN"I=;f%F%-%9%H(B:$B!V$"$J$?$K$O$3$N(B GNU Manual $B$r(B GNU $B%=%U%H%&%'%"(B -$B$N$h$&$KJ#@=$7$?$jJQ99$9$k<+M3$,$"$j$^$9!#J#@=$O%U%j!<%=%U%H%&%'%":bCD$K(B -$B$h$C$F=PHG$5$l$^$7$?!#(B($B%U%j!<%=%U%H%&%'%":bCD$O(B) GNU $B$N3+H/$N$?$a$KI,MW(B -$B$J;q6b$r=8$a$F$$$^$9!#!W(B - -This document is part of a collection distributed under the GNU Free -Documentation License. If you want to distribute this document -separately from the collection, you can do so by adding a copy of the -license to the document, as described in section 6 of the license. - -$B$3$NJ8=q$O!V(BGNU $B%U%j!r7o$N2<$GJ#@=!"G[I[!"$"$k$$$OJQ99$9(B -$B$k$3$H$r5v2D$7$^$9!#JQ99IT2DItJ,$O;XDj$7$^$;$s!#!V(BA GNU Manual$B!W$OI=I=;f(B -$B%F%-%9%H!"0J2<$N(B (a) $B$ON"I=;f%F%-%9%H$G$9!#$3$NMxMQ5vBz7@Ls=q$NJ#O$K4^$^$l$F$$$^(B -$B$9!#(B - -(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify -this GNU Manual, like GNU software. Copies published by the Free -Software Foundation raise funds for GNU development.'' - -(a) FSF $B$NN"I=;f%F%-%9%H(B:$B!V$"$J$?$K$O$3$N(B GNU Manual $B$r(B GNU $B%=%U%H%&%'%"(B -$B$N$h$&$KJ#@=$7$?$jJQ99$9$k<+M3$,$"$j$^$9!#J#@=$O%U%j!<%=%U%H%&%'%":bCD$K(B -$B$h$C$F=PHG$5$l$^$7$?!#(B($B%U%j!<%=%U%H%&%'%":bCD$O(B) GNU $B$N3+H/$N$?$a$KI,MW(B -$B$J;q6b$r=8$a$F$$$^$9!#!W(B - -This document is part of a collection distributed under the GNU Free -Documentation License. If you want to distribute this document -separately from the collection, you can do so by adding a copy of the -license to the document, as described in section 6 of the license. - -$B$3$NJ8=q$O!V(BGNU $B%U%j!l$G$9!#(BGnus $B$O$9$Y$F$r%K%e!<%9%0(B -$B%k!<%W$N$h$&$KI=<($7$^$9!#(BGnus $B$G%a!<%k$rFI$_!"%G%#%l%/%H%j!<$r%V%i%&%:(B -$B$7!"(B@code{ftp} $B$r$9$k$3$H$,$G$-$^$9!#$"$"!"$=$l$K!"%K%e!<%9$rFI$`$3$H$5(B -$B$($G$-$^$9(B! - -Emacs $B$,J8>O$rJT=8$9$k?M$KNO$rM?$($k$h$&$K!"(Bgnus $B$O%K%e!<%9$rFI$`?M$KNO(B -$B$rM?$($h$&$H$7$F$$$^$9!#(BGnus $B$OMxMQ$`F0:n$r$9$k$h$&$K(B gnus $B$r3HD%$9$k$3$H$r>)Ne$7$F$$$^$9!#(B -$B%W%m%0%i%`$,?M$rA`:n$9$k$Y$-$G$O$"$j$^$;$s!#?M$,%W%m%0%i%`$r;H$&(B ($B$b$7$/(B -$B$OMtMQ$9$k(B) $B$3$H$K$h$C$F!"$d$j$?$$$3$H$r$G$-$k$h$&$K$J$C$F$$$k$Y$-$J$N$G(B -$B$9!#(B - -@end iftex - -@menu -* Starting Up:: $B%K%e!<%9$r8+$D$1$k$N$K$O6lO+$,H<$&$+$bCN(B - $B$l$J$$(B -* Group Buffer:: $B%0%k!<%W$rA*Br$7!"9XFI$7!":o=|$9$k(B -* Summary Buffer:: $B5-;v$rFI$_!"J]B8$7!"Ej9F$9$k(B -* Article Buffer:: $B5-;v$rI=<($7!"07$&(B -* Composing Messages:: $B%a!<%k$H%K%e!<%9$rAw$k$?$a$N>pJs(B -* Select Methods:: Gnus $B$OA4$F$N%a%C%;!<%8$r$$$m$$$m$JA*Br(B - $BJ}K!$GFI$`(B -* Scoring:: $B5-;v$KCM$r$D$1$k(B -* Various:: $B0lHLE*$J@_Dj(B -* The End:: $B$5$i$P!"$=$7$F$5$h$&$J$i(B -* 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$,(B - $B$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 -* Changing Servers:: $B$"$k%5!<%P$+$iJL$N%5!<%P$X0\$j$?$$$+$b$7(B - $B$l$J$$(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:: $BC5n(B -* Group Data:: $B%0%k!<%W$N>pJs$rJQ99$9$k(B -* Group Levels:: $B%l%Y%k(B? $B$=$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$-(B - $B$^$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(B - $B$^$9(B -* Listing Groups:: Gnus $B$O%0%k!<%W$r$$$m$$$m$JJ,$1J}$GI=<((B - $B$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$_(B - $B$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(B - $B$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(B - $B%Q%i%a!<%?(B - -Misc Group Stuff - -* Scanning New Messages:: Gnus $B$K?7$7$$%a%C%;!<%8$,E~Ce$7$?$+$I$&(B - $B$+$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-(B - $BO?$5$;$k(B -* File Commands:: Gnus $B$N%U%!%$%k$NFI$_=q$-(B - -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 -* Delayed Articles:: -* Marking Articles:: $B5-;v$K4{FI$d4|8B@Z$l:o=|2DG=Ey$N0u$rIU$1(B - $B$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 the Summary Buffer:: $B%9%l%C%I$H5-;v$,$I$N$h$&$KJB$S$+$($i$l$k(B - $B$+(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(B - $B$($k(B -* Article Treatment:: $B5-;v%P%C%U%!$O$*K>$_$I$*$j$KL\Cc6lCc$K$G(B - $B$-$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 - $B$^$?$O8=:_$N%0%k!<%W$r:F$SA*Br$9$k(B -* Crosspost Handling:: $B%/%m%9%]%9%H$5$l$?5-;v$,$I$N$h$&$K07$o$l(B - $B$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:: - -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 - $B$$(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$$$?(B - $B4X?t(B -* Article Buttons:: URL $B$d(B Message-ID $B$d(B $B%"%I%l%9$J$I$r%/%j%C(B - $B%/$9$k(B -* Article Date:: $B$0$:$0$:8@$&$J!"@$3&;~$@(B! -* Article Signature:: $B=pL>$C$F2?(B? -* Article Miscellania:: $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:: -* Really Various Summary Commands:: $B$"$N$d$C$+$$$JB>$KE,9g$7$J$$L?Na(B - -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 -* 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(B - $B$m(B -* Posting Styles:: $B$"$J$?$,C/$G$"$k$+$r;XDj$9$k$h$j4JC1$JJ}(B - $BK!(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$-$K(B - $B2?$,5/$3$k(B? -@c * Using GPG:: How to use GPG and MML to sign and encrypt messages - -Select Methods - -* 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(B - $B$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 - -@sc{nntp} - -* Direct Functions:: $B%5!<%P!<$KD>@\@\B3$9$k(B -* Indirect Functions:: $B%5!<%P!<$K4V@\E*$K@\B3$9$k(B -* Common Variables:: $B$$$/$D$+$N@\B3MQ$N4X?t$,;2>H$9$kJQ?t(B - -Getting Mail - -* Mail in a Newsreader:: $B%K%e!<%9%j!<%@$G%a!<%k(B ($BBg;v$JA0CV$-(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%/%((B - $B%s%I$r;H$&(B -* Choosing a Mail Backend:: Gnus $B$O?'!9$J%a!<%kMM<0$rFI$`;v$,$G$-$k(B -* Archiving Mail:: $B%a!<%k$r%P%C%/%"%C%W$9$k$K$O(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 $B%U%)!<(B - $B%^%C%H$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(B - $B$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 -* Web Newspaper:: $B%&%'%V$KJ]4I$5$l$??7J9$rFI$`(B -* RSS:: RDF Site Summary $B$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$&$K(B - $BFI$`(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(B - $B$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 -* Agent and IMAP:: $B%(!<%8%'%s%H$r(B IMAP $B$G;H$&J}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!<%9C5n%U%!%$%k$r%9%3%"%U%!%$%k$KJQ49$9$k(B -* GroupLens:: $B$I$l$rFI$`$N$,9%$-$+$NM=8@$rF@$k(B -* Advanced Scoring:: $B%9%3%"$NK!B'$r:n$k$?$a$KO@M}I=8=$r;H$&(B -* Score Decays:: $B%9%3%"$r8O$l$F$$$+$;$k$N$OLr$KN)$D;v$b$"(B - $B$k(B - -GroupLens - -* Using GroupLens:: $B$I$N$h$&$K(B gnus $B$K(B GroupLens $B$r;H$o$;$k(B - $B$h$&$K$9$k$+(B -* Rating Articles:: GropLens $B$K$"$J$?$,$I$N$h$&$KCM$rIU$1$k(B - $B$+$rCN$i$;$k(B -* Displaying Predictions:: GropuLens $B$K$h$C$FM?$($i$l$?M=8@$rI=<($9(B - $B$k(B -* GroupLens Variables:: GoupLens $B$r%+%9%?%^%$%:$9$k(B - -Advanced Scoring - -* Advanced Scoring Syntax:: $BDj5A(B -* Advanced Scoring Examples:: $B$I$N$h$&$K8+$($k$+(B -* Advanced Scoring Tips:: $B$=$l$r:GBg8BMxMQ$9$k(B - -Various - -* Process/Prefix:: $BB?$/$N07$$L?Na$G;H$o$l$k=,47(B -* Interactive:: Gnus $B$KB?$/$Ne$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==Jb$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:_(B - $B$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$"(B - $B$k(B -* Mode Line Formatting:: $B%b!<%I9T$N=qK!;EMMJQ?t$K4X$9$k$$$/$D$+$N(B - $B5,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 -* Positioning Point:: $BA`:n$N8e$G%]%$%s%H$r0\F0$9$k(B -* Tabulation:: $B=PNO$N@0Ns(B -* Wide Characters:: $BI}$,9-$$J8;z$r07$&(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=<((B - $B$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$?(B - $B$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?4e$N%P!<%8%g%s$N(B Gnus -* Why?:: Gnus $B$NL\E*$O2?(B? -* Compatibility:: Gnus $B$O(B @sc{gnus} $B$H$I$l$/$i$$8_49@-$,$"$k(B - $B$N(B? -* Conformity:: Gnus $B$OA4$F$NI8=`$rK~$?$=$&$H$9$k(B -* Emacsen:: Gnus $B$O$$$/$D$+$N8=BeE*$J(B Emacs $B4D6-$Ge$N$b$N(B---Gnus 5.4/5.5 -* Quassia Gnus:: 2 $B$+$1$k(B 2 $B$O(B 4$B!"$b$7$/$O(B Gnus 5.6/5.7 -* Pterodactyl Gnus:: $B8^HVL\!"(BP $B$G;O$^$k!"$b$7$/$O(B Gnus 5.8 - /5.9 $B$H$7$FCN$i$l$F$$$k$b$N(B - -Customization - -* Slow/Expensive Connection:: $B%m!<%+%k$N(B Emacs $B$rN)$A>e$2$F!"B>$N$H$3(B - $B$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$ro$K4JC1$G$9!#$=$&!"(BEmacs $B$G(B @kbd{M-x gnus} $B$HBG$D$@$1$G$9!#(B - -@findex gnus-other-frame -@kindex M-x gnus-other-frame -$BJL$N%U%l!<%`(B (frame) $B$G(B gnus $B$r5/F0$7$?$$$H$-$O!"L?(B -$BNa(B @kbd{M-x gnus-other-frame} $B$r;H$&$3$H$,$G$-$^$9!#(B - -$B3+;O;~$K2?$+$,$&$^$/$$$+$J$$$H$-$O(B @file{~/.gnus} $B%U%!%$%k$NCf$GJQ?t$r$$(B -$B$/$D$+$$$8$/$j$^$o$5$J$1$l$P$J$i$J$$$G$7$g$&!#$3$N%U%!%$%k(B -$B$O(B @file{~/.emacs} $B$H;w$F$$$^$9$,!"$3$A$i$O(B gnus $B$,5/F0$9$k$H$-$KFI$_9~(B -$B$^$l$^$9!#(B - -$B$3$N@bL@=q$G$h$/$o$+$i$J$$MQ8l$,$G$F$-$?$H$-$O!"MQ8l$N(B -$B9`(B (@pxref{Terminology}) $B$r;2>H$7$F$/$@$5$$!#(B - -@menu -* Finding the News:: $B%K%e!<%9$re$N(B gnus $B$r:nF0$5$;$k$3$H$,(B - $B$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 -* Changing Servers:: $B$"$k%5!<%P$+$iJL$N%5!<%P$X0\$j$?$$$+$b$7(B - $B$l$J$$(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$Nl=j(B} $B$rI=$9%j%9%H$G$"$kI,MW$,$"$j$^$9!#$3$NJ}K!$O$"$J$?$N4pK\J}(B -$BK!(B (native method) $B$K$J$j$^$9!#$3$NJ}K!$Gl9g$O!"(B - -@lisp -(setq gnus-select-method '(nnspool "")) -@end lisp - -@noindent -$B$N$h$&$K$G$-$^$9!#(B - -$B%m!<%+%k$N%9%W!<%k$r;H$($k$N$G$"$l$P!"$+$J$j$N3NN($G$=$NJ}$,$:$C$HB.$$$G(B -$B$7$g$&$7!"$=$l$r;H$&$Y$-$G$7$g$&!#(B - -@vindex gnus-nntpserver-file -@cindex NNTPSERVER -@cindex @sc{nntp} server -$B$b$7$3$NJQ?t$,@_Dj$5$l$F$$$J$1$l$P!"(Bgnus $B$O(B @code{NNTPSERVER} $B4D6-JQ?t$r(B -$BFI$_$K$$$-$^$9!#$b$7$=$NJQ?t$,@_Dj$5$l$F$$$J$1$l$P!"(B -gnus $B$O(B @code{gnus-nntpserver-file} ($B@_Dj$5$l$F$$$J$$>l9g(B -$B$O(B @file{/etc/nntpserver}) $B$,$3$N7o$K4X$7$F2?$+$r8@$C$F$$$J$$$+$rD4$Y$^(B -$B$9!#$b$7$=$l$b<:GT$7$?$J$i!"(Bgnus $B$O(B Emacs $B$,F0:n$7$F$$$k%5!<%P!<(B -$B$r(B @sc{nntp} $B%5!<%P!<$H$7$F;H$*$&$H$7$^$9!#?oJ,$JEv$F?dNL$G$9$1$I$M!#(B - -@vindex gnus-nntp-server -@code{gnus-nntp-server} $B$,@_Dj$5$l$F$$$k$H!"$3$NJQ?t(B -$B$O(B @code{gnus-select-method} $B$r>e=q$-$7$^$9!#$G$9$+$i!"(B -@code{gnus-nntp-server} $B$O(B @code{nil} $B$K@_Dj$9$k$Y$-$G!"=i4|@_Dj$G$b$=$N(B -$B$h$&$K$J$C$F$$$^$9!#(B - -@vindex gnus-secondary-servers -@vindex gnus-nntp-server -Gnus $B$K(B @sc{nntp} $B%5!<%P!<$NL>A0$NF~NO$rBPOCE*$K;XDj$9$k$3$H$b$G$-$^$9!#(B -@code{gnus} $B$K?tCM$G$J$$@\F,0z?t$rEO$9$H(B ($BNc(B: @kbd{C-u M-x gnus})$B!"(B -gnus $B$O(B @code{gnus-secondary-servers} $B%j%9%H(B ($B$b$7B8:_$9$k$J$i$P(B) $B$+$i%5!<(B -$B%P!<$rA*$V$3$H$,$G$-$k$h$&$K$7$^$9!#$?$@C1$K@\B3$7$?$$$H;W$C$?%5!<%P!<$N(B -$BL>A0$rBG$D$3$H$b$G$-$^$9!#(B($B$3$l$O(B @code{gnus-nntp-server} $B$r@_Dj$7!"$3$l(B -$B$O8e$N(B Emacs $B$N%;%C%7%g%s$G(B @kbd{M-x gnus} $B$H$9$k$H!"(Bgnus $B$OF1$8%5!<%P!<(B -$B$K@\B3$7$h$&$H$9$k$H$$$&$3$H$G$9!#(B) - -@findex gnus-group-browse-foreign-server -@kindex B (Group) -$B$7$+$7!"IaCJF|>oE*$K$O0l$D$N(B @sc{nntp} $B%5!<%P$r;H$$!"0c$C$?%5!<%P!<$K$O(B -$B6=L#$N$"$k%0%k!<%W$,>/$7$7$+$J$$>l9g!"%0%k!<%W%P%C%U%!$G(B @kbd{B} $BL?Na$r(B -$B;H$&$3$H$NJ}$,NI$$$G$7$g$&!#$=$l$O!"A*Br2DG=$J%0%k!<%W$rI=<($7!"$=$NCf$+(B -$B$i$I$l$G$b9%$-$J$b$N$r9XFI$9$k$3$H$,$G$-$^$9!#$3$l$O!"(B@file{.newsrc} $B$N(B -$BJ];}$r$:$C$H$d$j$d$9$/$7$^$9!#(B@xref{Foreign Groups, $B30It%0%k!<%W(B}. - -@vindex gnus-secondary-select-methods -@c @head -$B30It%0%k!<%W$KBP$9$k>/$70c$C$?$d$jJ}$O!"JQ(B -$B?t(B @code{gnus-secondary-select-methods} $B$r@_Dj$9$kJ}K!$G$9!#$3$NJQ?t$KI=(B -$B$5$l$F$$$kA*BrJ}K!$O!"B?$/$NE@$G(B @code{gnus-select-method} $B%5!<%P!<$NBr(B -$BJ}K!$HF1$8$h$&$K07$o$l$^$9!#5/F0Cf$K%"%/%F%#%V%U%!%$%k$rC5$7$K$$$-(B ($B$b$7(B -$BMW5a$5$l$F$$$l$P(B)$B!"$3$l$i$N%5!<%P!<>e$K$G$-$??7$7$$%K%e!<%9%0%k!<%W$O85!9(B -$B$N%0%k!<%W$HF1$8$h$&$K9XFI(B ($B$b$7$/$OHs9XFI(B) $B$5$l$^$9!#(B - -$B$?$H$($P!"%a!<%k$rFI$`$?$a$K(B @code{nnmbox} $B%P%C%/%(%s%I(B (backend) $B$r;H$$(B -$B$?$$$H$-$O!"IaDL!"$3$NJQ?t$r!"(B - -@lisp -(setq gnus-secondary-select-methods '((nnmbox ""))) -@end lisp - -@noindent -$B$H@_Dj$7$^$9!#(B - -@node The First Time -@section $B0lHV=i$a(B -@cindex first time usage - -$B5/F0MQ%U%!%$%k$,B8:_$7$J$$$H$-$O!"(Bgnus $B$O%G%#%U%)%k%H$G$I$N%0%k!<%W$,9X(B -$BFI$5$l$F$$$k$Y$-$+$r7hDj$7$h$&$H$7$^$9!#(B - -@vindex gnus-default-subscribed-newsgroups -$BJQ?t(B @code{gnus-default-subscribed-newsgroups} $B$,@_Dj$5$l$F$$$k$H!"(B -gnus $B$O$=$N%j%9%H$NCf$N%0%k!<%W$r9XFI$7!";D$j$r:o=|$7$^$9!#%7%9%F%`4IM}(B -$B$^$l$^$9!#(B - -$B$=$&$G$J$$$H$-$O!"(Bgnus $B$O>/$7$NG$0U$N%0%k!<%W$r9XFI$7$^$9(B ($BNc(B: -@samp{*.newusers})$B!#(B(@dfn{$BG$0U(B}$B$O$3$3$G$O!"(B@dfn{Lars $B$5$s$,FI$`$Y$-$G$"(B -$B$k$H9M$($k$b$N(B}$B$H$$$&$h$&$KDj5A$5$l$F$$$^$9(B) - -$B$^$?!"$?$$$F$$$N6&DL$NLdBj$N2r7h$N$K$$$/$D$+%a!<%k$N%0(B -$B%k!<%W$,$"$l$P!"$=$l$K$b$+$+$o$i$:(B gnus $B$r5/F0$7$?$$$H;W$&$+$b$7$l$^$;$s!#(B - -Gnus $B$O!"?.Mj$G$-$k%W%m%0%i%`$N0l$D$H$7$F!"%5!<%P!<$H@\B3$G$-$J$$$H$-$O(B -$B4pK\A*BrJ}K!$J$7$GB3$1$k$+$I$&$+$r?R$M$^$9!#$3$l$Ol9g(B) $B$d%5!<%P!<$,2?$i$+$NM}M3$G0l(B -$B;~E*$KD4;R$,$*$+$7$/$J$C$F$$$k$H$-$K5/$3$j$^$9!#$b$7$=$N$^$^B39T$9$k$3$H(B -$B$K$7$F!"30It%0%k!<%W$,0l$D$bL5$$>l9g!"uBV$K$7$^$9(B ($B4pK\%0%k!<%W$G$J$$%0%k!<%W$O$=$NFs$D$N%l%Y%k(B -$B$K$7$F$*$/$N$,K>$^$7$$$G$7$g$&(B)$B!#(B@pxref{Group Levels} $B$b;2>H$7$F2<$5$$!#(B - -@node Slave Gnusae -@section gnus $B$r%9%l!<%V$K$9$k(B -@cindex slave - -$B$"$J$?$OFs$D0J>e$N(B Emacs $B$H!"Fs$D0J>e$N(B gnus $B$rF1;~$KF0$+$7$?$$$H;W$&$+(B -$B$b$7$l$^$;$s!#0c$C$?(B @file{.newsrc} $B%U%!%$%k$r;H$C$F$$$k$J$i(B ($BNc$($P!"(B -$BFs$D$N0c$C$?%5!<%P!<$+$iFI$_9~$`$?$a$K!"Fs$D$N0c$C$?(B gnus $B$rF0:n$5$;$F$$(B -$B$k>l9g(B)$B!"$^$C$?$/LdBj$O$"$j$^$;$s!#$=$l$r9T$($PNI$$$@$1$G$9!#(B - -$BLdBj$O!"F1$8(B @code{.newsrc} $B%U%!%$%k$r;H$&Fs$D$N(B gnus $B$rF0$+$=$&$H$7$?$H(B -$B$-$K5/$3$j$^$9!#(B - -$B$3$NLdBj$KBP=h$9$k$?$a$K!"(Bgnus $B%?%o!<$N%7%s%/%?%s%/$K$$$k2f!9$O?7$7$$35(B -$BG0$K$?$I$j$D$-$^$7$?!#(B@dfn{$B%^%9%?!<(B} $B$H(B @dfn{$B%9%l!<%V(B} $B$G$9!#(B($B2f!9$O$3$N(B -$B35G0$KFC5v$r?=@A$7$^$7$?!#$=$7$F!"$=$N8@MU$NCx:n8"$rF@$^$7$?!#$*8_$$$K4X(B -$BO"$7$F$3$l$i$N8@MU$r;H$$$?$$$J$i!"0l2s;H$&Kh$K!";d$K(B $1 $B$rAw$i$J$1$l$P$J(B -$B$j$^$;$s!#$b$C$A$m$s!"(B@dfn{$B%3%s%T%e!<%?!<%"%W%j%1!<%7%g%s$N%^%9%?!$l(B @kbd{M-x gnus-slave} $B$G5/F0(B -$B$7$^$9!#%9%l!<%V$OIaDL$N(B @file{.newsrc} $B$OJ]B8$7$^$;$s$,!"Be$o$j(B -$B$K(B @dfn{$B%9%l!<%V%U%!%$%k(B} $B$K%9%l!<%V$N5/F0Cf$K$I$N$h$&$J%0%k!<%W$,FI$^$l(B -$B$?$+$H$$$&>pJs$@$1$rJ]B8$7$^$9!#%^%9%?!<(B gnus $B$,5/F0$9$k$H$-!"$=$l$O$=$l(B -$B$i$N%9%l!<%V%U%!%$%k$rFI$_9~$_(B ($B$=$7$F>C$7(B)$B!"$=$l$i$+$i$9$Y$F$N>pJs$rpJs$OIaDL$N(B ($B$9$J$o$A!"%^%9%?!<$N(B) $B%U%!(B -$B%$%k$h$j$bM%@h$5$l$^$9!#(B - -@node Fetching a Group -@section $B%0%k!<%W$rA0$r0z?t$H$7$F$H$j$^$9!#(B - -@node New Groups -@section $B?7$7$$%0%k!<%W(B -@cindex new groups -@cindex subscription - -@vindex gnus-check-new-newsgroups -$B?7$7$$%K%e!<%9%0%k!<%W$rA4$/8+$J$$$GK~B-$G$"$k$J$i$P!"(B -@code{gnus-check-new-newsgroups} $B$r(B @code{nil} $B$K@_Dj$9$k$3$H$,$G$-$^$9!#(B -$B$3$l$r@_Dj$7$?>l9g!"5/F0$K$+$+$k;~4V$,C;$/$J$j$^$9!#$3$NJQ?t(B -$B$,(B @code{nil} $B$K@_Dj$5$l$F$$$F$b!"%0%k!<%W%P%C%U%!$G(B @kbd{U} $B$r2!$;$P$$(B -$B$D$G$b?7$7$$%0%k!<%W$r9XFI$9$k$3$H$,$G$-$^$9(B (@pxref{Group Maintenance})$B!#(B -$B=i4|@_Dj$G$O$3$NJQ?t$O(B @code{ask-server} $B$G$9!#$3$NJQ?t(B -$B$,(B @code{always} $B$K@_Dj$5$l$F$$$k$H!"L?Na(B @kbd{g} $B$re$,$j$G$9!#$3$l$K$h$j!":o=|$5$l$?%0%k!<%W$N%j%9(B -$B%H$rJ];}$7$F$*$/$3$H$+$i$+$i40A4$K3+J|$5$l$^$9!#$G$9$+$i!"(B -@code{gnus-save-killed-list} $B$r(B @code{nil} $B$K$9$k$3$H$,$G$-$k$G$7$g$&!#(B -$B$=$&$9$l$P!"5/F0!"=*N;$NN>J}!"$=$7$FA4BN$K$o$?$C$F;~4V$r@aLs$G$-$^$9!#%G%#(B -$B%9%/>CHqNL$b>/$J$/$J$j$^$9!#$=$l$J$i!"$I$&$7$F$3$l$,=i4|@_Dj$G$O$J$$$N$G(B -$B$7$g$&(B? $B;DG0$J$,$i!"$9$Y$F$N%5!<%P!<$,$3$NL?Na$rM}2r$9$k$o$1$G$O$J$$$N$G(B -$B$9!#(B - -$B;d$O:#$"$J$?$,2?$r9M$($F$$$k$+$rEv$F$i$l$^$9!#$I$&$9$l$P%5!<%P!<(B -$B$,(B @code{ask-server} $B$rM}2r$9$k$+$,$o$+$k$N$G$7$g$&(B? $B$(!"0c$&$N$G$9(B -$B$+(B? $B$"$!!"NI$+$C$?!#$H$$$&$N$O!"3N$NJ}K!$H$7$F$O!"%5!<%P!<(B -$B$K(B @code{telnet} $B$r$7$F!"(B@code{HELP} $B$HBG$A!"%5!<%P!<$,M}2r$9$k%3%^%s%I(B -$B$NCf$K(B @samp{NEWGROUPS} $B$,$"$k$+$I$&$+$rD4$Y$k$3$H$b$G$-$^$9!#$b$7$"$l$P!"(B -$B$*$=$i$/F0:n$9$k$G$7$g$&(B ($B$7$+$7!"E,@Z$K5!G=$rDs6!$9$k$3$H$J(B -$B$/(B @samp{NEWGROUPS} $B$r%j%9%H$K4^$a$k%5!<%P!<$b$"$j$^$9(B)$B!#(B - -$B$3$NJQ?t$O!"A*BrJ}K!$N%j%9%H$G$"$k$3$H$b$G$-$^$9!#$=$N$H$-$O!"(Bgnus $B$OL?(B -$BNa(B @code{ask-server} $B$r$=$l$>$l$NA*BrJ}K!$KBP$7$FA0(B -$B$rM#0l$N0z?t$H$7$F8F$P$l$^$9!#(B - -$B$$$/$D$+$N%s%S(B (zombie) $B$K$7$^$9!#$3$l$,=i4|@_Dj(B $B$K$J$C(B -$B$F$$$^$9!#8e$G%>%s%S$r(B (@kbd{A z} $B$K$h$C$F(B) $B354Q$7$?$j!"(B(@kbd{S z} $B$K$h$C(B -$B$F(B) $BE,@Z$KA4$F$r:o=|$7$?$j!"(B(@kbd{u} $B$K$h$C$F(B) $B9XFI$7$?$j$G$-$^$9!#(B - -@item gnus-subscribe-randomly -@vindex gnus-subscribe-randomly -$BG$0U$N=gHV$G$9$Y$F$N?7$7$$%0%k!<%W$r9XFI$7$^$9!#e!Y$K2C$($i$l$^$9!#(B - -@item gnus-subscribe-alphabetically -@vindex gnus-subscribe-alphabetically -$B$9$Y$F$N?7$7$$%0%k!<%W$r%"%k%U%!%Y%C%H=g$K9XFI$7$^$9!#(B - -@item gnus-subscribe-hierarchically -@vindex gnus-subscribe-hierarchically -$B$9$Y$F$N?7$7$$%0%k!<%W$r3,AXE*$K9XFI$7$^$9!#$3$N4X?t(B -$B$H(B @code{gnus-subscribe-alphabetically} $B$N0c$$$O>/$7$7$+$"$j$^$;$s!#(B -@code{gnus-subscribe-alphabetically} $B$O?7$7$$%0%k!<%W$r87L)$K%"%k%U%!%Y%C(B -$B%H=g$K$J$i$Y$^$9$,!"$3$N4X?t$O%0%k!<%W$r$=$N3,AX$NCf$KF~$l$^$9!#$G$9$+$i!"(B -@samp{rec} $B$N3,AX$r(B @samp{comp} $B$N3,AX$NA0$K;}$C$F$-$?$$>l9g!"$3$N4X?t$O(B -$B$=$NG[CV$r$0$A$c$0$A$c$K$O$7$^$;$s!#$b$7$/$O!"$=$N$h$&$J$b$N$G$9!#(B - -@item gnus-subscribe-interactively -@vindex gnus-subscribe-interactively -$B?7$7$$%0%k!<%W$rBPOCE*$K9XFI$7$^$9!#$3$l$O(B gnus $B$,(B @strong{$BA4$F(B} $B$N%0%k!<(B -$B%W$KBP$7$F?R$M$k$3$H$r0UL#$7$F$$$^$9!#9XFI$9$k%0%k!<%W$O3,AXE*$K9XFI$5$l(B -$B$^$9!#(B - -@item gnus-subscribe-killed -@vindex gnus-subscribe-killed -$B$9$Y$F$N?7$7$$%0%k!<%W$r:o=|$7$^$9!#(B - -@item gnus-subscribe-topics -@vindex gnus-subscribe-topics -$B%0%k!<%W$r9gCW$9$k(B @code{subscribe} $B%H%T%C%/%Q%i%a!<%?$N$"$k%0%k!<%W$KF~(B -$B$l$^$9(B (@pxref{Topc Parameters})$B!#Nc$($P!"0J2<$N$h$&(B -$B$J(B @code{subscribe} $B%Q%i%a!<%?(B - -@example -"nnslashdot" -@end example - -$B$O$=$N@55,I=8=$K9gCW$9$kA4$F$N%0%k!<%W$O$=$N%H%T%C%/$N2<$G9XFI$5$l$k$H$$(B -$B$&$3$H$G$9!#(B - -$B%0%k!<%W$K9gCW$9$k%H%T%C%/$,L5$$>l9g!"%0%k!<%W$O:G>e0L$N%H%T%C%/$G9XFI$5(B -$B$l$^$9!#(B -@end table - -@vindex gnus-subscribe-hierarchical-interactive -$B>e$NJQ?t$HNI$/4X78$7$?JQ?t$O!"(B -@code{gnus-subscribe-hierarchical-interactive} $B$G$9!#$3$NJQ?t(B -$B$,(B @code{nil} $B$G$J$$$H!"(Bgnus $B$O3,AXE*$JJ}K!$G?7$7$$%0%k!<%W$r9XFI$9$k$+(B -$B$I$&$+$r?R$M$^$9!#(Bgnus $B$O$=$l$>$l$N3,AX$G!"$=$l$r2<$K9_$j$k$+$I$&$+$r?R(B -$B$M$^$9!#(B - -$B$h$/$"$k4V0c$$$O!"?tCJMnA0$NJQ(B -$B?t(B (@code{gnus-subscribe-newsgroup-method}) $B$r(B @code{gnus-subscribe-herarchical-interactive} $B$K(B -$B@_Dj$9$k$3$H$G$9!#$3$l$O8m$j$G$9!#$3$l$OF0:n$7$^$;$s!#$3$l$O$*$a$G$?$$?M(B -$B$N$9$k$3$H$G$9!#$G$9$+$i!"@dBP$K$7$J$$$G$/$@$5$$!#(B - -@node Filtering New Groups -@subsection $B?7$7$$%0%k!<%W$rA*JL$9$k(B - -$B$I$N?7$7$$%0%k!<%W$,9XFI(B ($B$b$7$/$O!"L5;k(B) $B$5$l$k$Y$-$+$r4IM}$9$k2wE,$GA0$r;}$D%0%k!<%W$OA4$FL5;k$5$l!"(B@samp{sci} $B$G;O$^$kL>A0$r;}$D%0%k!<(B -$B%W$OA4$F9XFI$9$k!"$H$$$&$3$H$rI=$7$F$$$k$+$i$G$9!#(BGnus $B$O$3$l$i$N%0%k!<(B -$B%W$r9XFI$9$k$N$K!"IaDL$N9XFIJ}K!$rMQ$$$^$;$s!#Be$o$j$K!"(B -@code{gnus-subscribe-options-newsgroup-method} $B$,MQ$$$i$l$^$9!#$3$NJQ?t(B -$B$O=i4|@_Dj$G$O(B @code{gnus-subscribe-alphabetically} $B$G$9!#(B - -@vindex gnus-options-not-subscribe -@vindex gnus-options-subscribe -$B%U%!%$%k(B @file{.newsrc} $B$r$$$8$j$?$/$J$$>l9g$O!"(B -@code{gnus-options-subscribe} $B$H(B @code{gnus-options-not-subscribe} $B$NFs(B -$B$D$NJQ?t$@$1$r@_Dj$9$k$3$H$b$G$-$^$9!#$3$NFs$D$NJQ?t$O%U%!%$(B -$B%k(B @file{.newsrc} $B$N(B @samp{optinos -n} $B9T$HA4$/F1$8$3$H$r$7$^$9!#$I$A$i(B -$B$NJQ?t$b@55,I=8=$G!"?7$7$$%0%k!<%W$OA0r7o$K9XFI$5$l!"8e(B -$BJ,$J$b$N$G$9!#$7$+$7!";d$O$3$NFs$D$,$"$C$?J}$,NI$$$H;W$$$^$7$?!#$b$&0l(B -$BJ}$NJQ?t$O%f!<%6$,$$$8$/$k$N$K;H$o$l$k$N$KBP$7$F!"$3$NJQ?t$O$$$/$D$+$N4p(B -$BK\E*$J5,B'$r@_Dj$9$k$?$a$N$b$N$G$9!#=i4|@_Dj$G$O$3$NJQ?t$O%a!<%k%P%C%/%((B -$B%s%I(B (@code{nnml}, @code{nnbabyl}, @code{nnfolder}, @code{nnmbox}@ $B$H(B -@code{nnmh}) $B$+$i$G$-$kA4$F$N?7$7$$%0%k!<%W$r9XFI$9$k$h$&$K$J$C$F$$$^$9!#(B -$B$=$l$,7y$G$"$l$P!"$3$NJQ?t$r(B @code{nil} $B$K@_Dj$7$F$/$@$5$$!#(B - -$B$3$N@55,I=8=$K9gCW$9$k?7$7$$%0%k!<%W(B -$B$O(B @code{gnus-subscribe-options-newsgroup-method} $B$r;H$C$F9XFI$5$l$^$9!#(B - -@node Changing Servers -@section $B%5!<%P!<$r49$($k(B -@cindex changing servers - -$B$H$-$I$-!"$"$k(B @sc{nntp} $B%5!<%P!<$+$iJL$N%5!<%P!<$X0\F0$7$J$1$l$P$J$i$J(B -$B$$$3$H$,$"$j$^$9!#$3$N$h$&$J$3$H$O$a$C$?$K$*$-$^$;$s$,!"$*$=$i$/$"$J$?$,(B -$B;E;v$rJQ$($?$j!";H$C$F$$$k%5!<%P!<$,$H$F$bIT0BDj$G!"JL$N$b$N$K>h$j49$($?(B -$B$$$H$$$&$H$-$KI,MW$K$J$k$G$7$g$&!#(B - -$B%5!<%P!<$rJQ99$9$k$N$O$H$F$b4JC1$G$9$h$M(B? @code{gnus-select-method} $B$r?7(B -$B$7$$%5!<%P!<$r;X$7<($9$h$&$KJQ99$9$l$P$$$$$@$1$G$9$M(B? - -@emph{$B0c$$$^$9(B!} - -$B5-;v$NHV9f$O0c$C$?(B @sc{nntp} $B%5!<%P!<$G$b(B ($B$I$&$K$+$7$F(B) $BF1$8$K$7$F$"$k!"(B -$B$H$$$&$3$H$O$"$j$^$;$s!#$=$7$F!"(Bgnus $B$,$I$N5-;v$rFI$s$@$+$r5-O?$9$kM#0l(B -$B$NJ}K!$O!"5-;vHV9f$r5-O?$9$k$3$H$G$9!#$G$9$+$i!"(B -@code{gnus-select-method} $B$rJQ99$7$?$H$-$O!"%U%!%$%k(B @file{.newsrc} $B$O0U(B -$BL#$,$J$/$J$j$^$9!#(B - -Gnus $B$O%U%!%$%k(B @file{.newsrc} $B$r$"$k%5!<%P!J}$N%5!<%P!<$K@\B3$G$-$k$J$i!"(Bgnus $B$O$"$J$?$,FI$s$@5-;vA4$F$KBP$7(B -$B$F%X%C%@!<(B (headers) $B$rMW5a$7$F!"(B@code{Message-ID} $B$rHf3S$7!"FI$s$@5-;v(B -$B$H5-;v$N0u$r?7$7$/5-O?$7$^$9!#%3%^%s%I(B @kbd{M-x gnus-change-server} $B$O$3(B -$B$l$r$9$Y$F$N4pK\%0%k!<%W$KBP$7$F9T$$$^$9!#$=$N%3%^%s%I$O0\F0@h$NJ}K!$NF~(B -$BNO$rB%$7$^$9!#(B - -@kindex M-x gnus-group-move-group-to-server -@findex gnus-group-move-group-to-server -$B8D!9$N%0%k!<%W$rL?Na(B @kbd{M-x gnus-group-move-group-to-server} $B$G0\(B -$BF0$9$k$3$H$b$G$-$^$9!#$3$l$O$"$k%5!<%P!<$+$iJL$N%5!<%P!<$X0l$D(B -$B$N(B ($B30It(B) $B%0%k!<%W$r0\F0$7$?$$$H$-$KLr$KN)$A$^$9!#(B - -@kindex M-x gnus-group-clear-data-on-native-groups -@findex gnus-group-clear-data-on-native-groups -$B8E$$%5!<%P!<$H?7$7$$%5!<%P!<$NN>J}$K@\B3$9$k$3$H$,$G$-$J$$$H$-!"0u$HFI$s(B -$B$@HO0O$O$9$Y$F0UL#$,L5$/$J$j$^$9!#$=$N$h$&$J$H$-$O!"%3%^%s%I(B @kbd{M-x -gnus-group-clear-data-on-native-groups} $B$r;H$C$F!"4pK\%0%k!<%W$K4X$9$k%G!<(B -$B%?$r$9$Y$F>C5n$9$k$3$H$,$G$-$^$9!#$3$N%3%^%s%I$OCm0U$7$F;H$C$F$/$@$5$$!#(B - -$B%5!<%P!<$rJQ99$7$?8e$G!"%-%c%C%7%e3,AX$r0\F0$5$;$J$1$l$P(B@strong{$B$J$j$^$;(B -$B$s(B}$B!#$H$$$&$N$O!"%-%c%C%7%e5-;v$O4V0c$C$?5-;vHV9f$K$J$C$F$*$j!"$=$l(B -$B$O(B gnus $B$,$I$N5-;v$rFI$s$@$H$_$J$9$+$K1F6A$7$^$9!#(B - -@node Startup Files -@section $B5/F0%U%!%$%k(B -@cindex startup files -@cindex .newsrc -@cindex .newsrc.el -@cindex .newsrc.eld - -$B:#$d!"$"$J$?$O%U%!%$%k(B @file{.newsrc} $B$K$D$$$F$9$Y$FCN$C$F$$$^$9!#$9$Y$F(B -$B$N9XFI>pJs$OEAE}E*$K$3$N%U%!%$%k$KC_@Q$5$l$^$9!#(B - -@sc{gnus} $B$G$OJ*;v$,>/!9J#;($K$J$C$F$$$^$9!#%U%!%$%k(B @file{.newsrc} $B$r:G(B -$B?7$N$b$N$K$9$k$@$1$G$O$J$/!"%U%!%$%k(B @file{.newsrc} $B$K$O9g$o$J$$>pJs$rJ](B -$BB8$7$F$*$/$?$a$K(B @file{.newsrc.el} $B$H8F$P$l$k%U%!%$%k$r;H$$$^$9!#(B($BpJs$rJ#@=$7$FJ];}$7$F$$$^(B -$B$9!#(B) @sc{gnus}$B$O$3$l$i$NCf$G0lHV:G8e$KJ]B8$5$l$?$b$N$r;H$$$^$9!#$3$l$r(B -$B$9$k$3$H$K$h$j!"(B@sc{gnus} $B$HB>$N%K%e!<%9%j!<%@!<$r@Z$jBX$($F;H$&$3$H$,$G(B -$B$-$^$9!#(B - -$B$3$l$O$A$g$C$H$P$+$JJ}K!$J$N$G!"(Bgnus $B$O$b$C$HNI$$J}K!$rJT$_=P$7$^$7$?!#(B -@file{.newsrc} $B$H(B @file{.newsrc.el} $B%U%!%$%k$K2C$($F!"(B -gnus $B$O(B @file{.newsrc.eld} $B$H8F$P$l$k%U%!%$%k$b;}$C$F$$$^$9!#(BGnus $B$O$3$l(B -$B$i$NCf$G0lHV?7$7$$%U%!%$%k$rFI$_$^$9$,!"%U%!%$%k(B @file{.newsrc.el} $B$K=q(B -$B$-9~$`$3$H$O$"$j$^$;$s!#%U%!%$%k(B @file{.newsrc.eld} $B$O@dBP$K>C$9$Y$-$G$O(B -$B$"$j$^$;$s!#(B---$B$=$l$O%U%!%$%k(B @file{.newsrc} $B$K$O$J$$$?$/$5$s$N>pJs$rJ](B -$B;}$7$F$$$^$9!#(B - -@vindex gnus-save-newsrc-file -@vindex gnus-read-newsrc-file -@code{gnus-save-newsrc-file} $B$r(B @code{nil} $B$K$9$k$3$H$K$h$C$F%U%!%$(B -$B%k(B @file{.newsrc} $B$K=q$-9~$`$N$r;_$a$k$3$H$,$G$-$^$9!#$=$&$9$l$P!"$=$N%U%!(B -$B%$%k$r:o=|$9$k$3$H$,$G$-!"%G%#%9%/MFNL$r@aLs$9$k$3$H$,$G$-!"(Bgnus $B$N=*N;(B -$B$,B.$/$J$j$^$9!#$7$+$7!"$=$&$9$k$HB>$N%K%e!<%9%j!<%@!<$r;H$($J$/$J$j$^$9!#(B -$B$G$b!"$A$g$C$H!"C/$+$=$&$7$?$$?M$,$$$k$G$7$g$&$+!#F1$8$h$&(B -$B$K(B @code{gnus-read-newsrc-file} $B$r(B @code{nil} $B$K$9$k$3$H$K$h$C(B -$B$F(B @file{.newsrc} $B$H$9$Y$F$N(B @file{.newsrc-SERVER} $B$r:n$i$J$$$h$&$K$J$j(B -$B$^$9!#$b$7$"$J$?$,;~!9(B Netscape $B$r;H$&$N$J$i$P!"$3$&$9$k$N$,ET9g$,NI$$$G(B -$B$7$g$&!#(B - -@vindex gnus-save-killed-list -@code{gnus-save-killed-list} ($B=i4|@_Dj$G$O(B @code{t}) $B$,(B @code{nil} $B$G$"(B -$B$k$H!"(Bgnus $B$O:o=|$5$l$?%0%k!<%W$r5/F0%U%!%$%k$KJ]B8$7$^$;$s!#$3$l$O!"(B($B5/(B -$BF0;~$H=*N;;~$N(B) $B;~4V$H!"(B($B%G%#%9%/$N(B) $BMFNL$r@aLs$7$^$9!#$3$&$9$k$H!"(B -gnus $B$,$I$N%0%k!<%W$,?7$7$$$+$N5-O?$r;}$C$F$$$J$$$3$H$K$J$j$^$9$N$G!"?7(B -$B$7$$%0%k!<%W$N<+F09XFIJ}K!$O0UL#$,L5$/$J$j$^$9!#$3$NJQ?t$r(B @code{nil} $B$K(B -$B$7$?$H$-$O!"(B@code{gnus-check-new-newsgroups} $B$r>o(B -$B$K(B @code{nil} $B$+(B @code{ask-server} $B$K$7$F$*$/$Y$-$G$7$g(B -$B$&(B (@pxref{New Groups})$B!#$3$NJQ?t$O@55,I=8=$G$"$k$3$H$b$G$-$^$9!#$=$N$h(B -$B$&$J>l9g$O!"%U%!%$%k$rJ]B8$9$kD>A0$K$=$N@55,I=8=$K9gCW$7$J$$$9$Y$F$N%0%k!<(B -$B%W$r>C5n$7$^$9!#$3$l$O!"$9$Y$F$N%5!<%P!<$,(B @code{ask-server} $B$rM}2r$9$k(B -$B$o$1$G$O$J$$!"$H$$$C$?$h$&$J!"FCDj$N$"$$$^$$$J>u67$N$H$-$KLr$KN)$D$G$7$g(B -$B$&!#(B - -@vindex gnus-startup-file -$BJQ?t(B @code{gnus-startup-file} $B$O5/F0%U%!%$%k$,$I$3$K$"$k$+$r;XDj$7$^$9!#(B -$B=i4|CM$O(B @file{~/.newsrc} $B$G!"$=$l$,$I$N$h$&$J$b$N$G$"$l!"KvHx(B -$B$K(B @samp{.eld} $B$r$D$1$?$b$N$,(B gnus (El Dingo) $B$N5/F0%U%!%$%k$K$J$j$^$9!#(B - -@vindex gnus-save-newsrc-hook -@vindex gnus-save-quick-newsrc-hook -@vindex gnus-save-standard-newsrc-hook -@code{gnus-save-newsrc-hook} $B$O(B newsrc $B%U%!%$%k$NCf$N$I$l$+$rJ]B8$9$kA0(B -$B$KA0$N%U%!%$%k$rD4$Y$^$9$,!"@\Hx(B -$B8l(B @file{.elc} $B$H(B @file{.el} $B$,$D$$$F$$$k$b$N$bD4$Y$^$9!#8@$$49$($l$P!"(B -@code{gnus-init-file} $B$r(B @file{~/.gnus} $B$K@_Dj$9$k$H!"(Bgnus $B$O(B ($B$3$N=gHV(B -$B$K(B) @file{~/.gnus.elc}, @file{~/.gnus.el} $B$rC5$7!":G8e(B -$B$K(B @file{~/.gnus} $B$rC5$7$^$9!#(B - -@node Auto Save -@section $B<+F0J]B8(B -@cindex dribble file -@cindex auto-save - -$B2?$+(B gnus $B$N%G!<%?$rJQ99$9$k$3$H(B ($B5-;v$rFI$`!"0u$rIU$1$k!"%0%k!<%W$r:o=|(B -$B$^$?$O9XFI$9$k(B) $B$r$7$?$H$-!"JQ99$OFCJL$J(B@dfn{$B%I%j%V%k%P%C%U%!(B (dribble -buffer)} $B$K=q$-9~$^$l$^$9!#$3$N%P%C%U%!$O(BEmacs $B$,IaDL$9$k$h$&$K<+F0J]B8(B -$B$5$l$^$9!#%U%!%$%k(B @file{.newsrc} $B$rJ]B8$9$kA0$K(B Emacs$B$,Mn$A$?$H$-$O!"$9(B -$B$Y$F$NJQ99$r$3$N%U%!%$%k$+$i2sI|$9$k$3$H$,$G$-$k$G$7$g$&!#(B - -$B5/F0;~$K(B gnus $B$,$3$N%U%!%$%k$NB8:_$rH/8+$9$k$H!"(Bgnus $B$O$=$l$rFI$_9~$`$+(B -$B$I$&$+$rMxMQA0$r;}$D%0%k!<%W$rGS=|$9$k$?$a$K;H$o$l$F$-$^$7$?$,!"6=L#$NL5$$%0(B -$B%k!<%W$N3,AX$rL5;k$9$k$?$a$K;H$&$3$H$b$G$-$^$9!#$7$+$7!"$3$l$O$*4+$a$G$-(B -$B$^$;$s!#K\Ev$N$3$H$r8@$&$H!"A4$/;?@.$G$-$^$;$s!#Be$o$j$K!"$=$N$h$&$JMQES(B -$B$KMQ$$$i$l$kJQ?t$N35N,$rCN$k$?$a$K!"(B@pxref{New Groups} $B$r;2>H$7$F$/$@$5(B -$B$$!#(B - -@c This variable is -@c @code{nil} by default, and will slow down active file handling somewhat -@c if you set it to anything else. - -@vindex gnus-read-active-file -@c @head -$B%"%/%F%#%V%U%!%$%k$OHf3SE*Bg$-$/$J$k798~$,$"$k$N$G!"CY$$2s@~$r;H$C$F$$$k(B -$B$H$-$O!"%"%/%F%#%V%U%!%$%k$rFI$_9~$^$J$$$h$&(B -$B$K(B @code{gnus-read-active-file} $B$r(B @code{nil} $B$K@_Dj$9$k$3$H$,$G$-$^$9!#(B -$B$3$NJQ?t$O=i4|@_Dj$G$O(B @code{some} $B$G$9!#(B - -$B$=$N$h$&$J;~$O!"(Bgnus $B$OpJs$@$1$rF@(B -$B$F$d$C$F$$$3$&$H$7$^$9!#(B - -$B5$$rIU$1$F$[$7$$$N$O!"$"$J$?$,;3$[$I$N$?$/$5$s$N%0%k!<%W$r9XFI$7$F$$$k$H(B -$B$-$K$3$NJQ?t$r(B @code{nil} $B@_Dj$9$k$H!"(Bgnus $B$OB.$/$J$k$I$3$m$+!"CY$/$J$C(B -$B$F$7$^$&$H$$$&$3$H$G$9!#8=>u$G$O!"%K%e!<%9$r(B 2400bps $B0J>e$N%b%G%`$rDL$7(B -$B$FFI$s$G$$$k$N$G$J$$8B$j!"(Bgnus $B$NB.EY$O$+$J$jCY$/$J$k$G$7$g$&!#(B - -$B$3$NJQ?t$O(B @code{some} $B$H$$$&CM$bu$N>pJs$r9XFI$5$l$F$$$k%0%k!<%W$N$b$N$@$1$rF@$h$&$H$7$^$9!#$$$/$D$+$N%5!<(B -$B%P!<(B ($BL?Na(B @code{LIST ACTIVE group} $B$r;H$&$3$H$N$G$-$k!":G?71T$N(B INN $B%5!<(B -$B%P!<(B) $B$G$O!"Hs>o$KAa$/$J$k$G$7$g$&$,!"B>$N%5!<%P!<$G$OB.$/$O$"$j$^$;$s!#(B -$B$I$N$h$&$K$;$h!"CY$$2s@~$G$O(B @code{some} $B$O(B @code{nil} $B$h$j$bB.$/!"$=$l(B -$B$O$b$A$m$s(B@code{t} $B$h$j$bB.$/$J$j$^$9!#(B - -$B$$$/$D$+$N%K%e!<%9%5!<%P!<(B ($BNc$($P8E$$(B Leafnode $B$d8E$$(B INN) $B$K$OL?(B -$BNa(B @code{LIST ACTIVE group} $B$,$"$j$^$;$s!#$=$&$$$&%5!<%P!<$K(B -$B$O(B @code{nil} $B$r$3$NJQ?t$NCM$K@_Dj$9$k$N$,!"$*$=$i$/$b$C$H$bM-8z$G$7$g$&!#(B - -$B$b$7$3$NJQ?t$,(B @code{nil} $B$G$"$k$H!"(Bgnus $B$O40A4$K$,$s$8$,$i$a$NJ}K!$G%0(B -$B%k!<%W$N>pJs$rF@$h$&$H$7$^$9!#$=$7$F!"$3$l$O$"$^$jB.$/$"$j$^$;$s!#$b$7$=(B -$B$l$,(B @code{some} $B$G(B @sc{nntp} $B%5!<%P!<$r;H$C$F$$$k$H$-$O!"(Bgnus $B$O$G$-$k(B -$B$@$1B.$/L?Na$r=P$7!"0l7b$G$9$Y$F$NJVEz$rFI$_9~$_$^$9!#$3$NJ}$,IaDL$O$h$j(B -$BNI$$7k2L$r$b$?$i$7$^$9$,!"%5!<%P!<$,L?Na(B @code{LIST ACTIVE group} $B$rM}2r(B -$B$7$J$$$J$i!"%5!<%P!<$K$H$C$F$O$"$^$jNI$$$H$O8@$($^$;$s!#(B - -Gnus $B$N5/F0$K$"$^$j$K;~4V$,$+$+$k$H;W$C$?$J$i!"$3$NJQ?t$K$3$l$i$N;0$D$N(B -$B0c$C$?CM$r;n$7$F$_$F!"$I$l$,0lHVNI$$$+$rC5$7$F$/$@$5$$!#(B - -@code{some} $B$+(B @code{nil} $B$r;H$&$N$G$"$l$P!"$I$A$i$K$7$mB.EY$r>e$2$k$?$a(B -$B$K$9$Y$F$N6=L#$NL5$$%0%k!<%W$rI,$::o=|$9$k$Y$-$G$7$g$&!#(B - -$B$3$NJQ?t$OFse;J$K5$IU$+$l$K$/$/$J$k$G(B -$B$7$g$&!#$3$NJQ?t$O(B @file{.gnus.el} $B$,%m!<%I$5$l$kA0$K;H$o$l$^$9$N$G!"(B -@code{.emacs} $B$K@_Dj$9$k$Y$-$G$"$kE@$rCm0U$7$F$/$@$5$$!#(B - -@item gnus-no-groups-message -@vindex gnus-no-groups-message -$B%0%k!<%W$,0l$D$bB8:_$7$J$$$H$-$K(B gnus $B$,I=<($9$k%a%C%;!<%8$G$9!#(B - -@item gnus-play-startup-jingle -@vindex gnus-play-startup-jingle -$B$b$7(B @code{nil} $B$G$J$$$H!"5/F0;~$K(B gnus $B$NC;$$6J$r1iAU$7$^$9!#(B - -@item gnus-startup-jingle -@vindex gnus-startup-jingle -$B>e$NJQ?t$,(B @code{nil} $B$G$J$$$H$-$K1iAU$5$l$kC;$$6J$G$9!#=i4|CM(B -$B$O(B @samp{Tuxdemoon.Jingle4.au} $B$G$9!#(B -@end table - -@node Group Buffer -@chapter $B%0%k!<%W%P%C%U%!(B -@cindex group buffer - -$B%0%k!<%W%P%C%U%!(B (@dfn{group buffer}) $B$OM-8z$J%0%k!<%W$rA4It(B ($B$"$k$$$O0l(B -$BIt$r(B) $B0lMwI=<($7$^$9!#$3$l$O(B gnus $B$r5/F0$7$?$H$-$K:G=i$KI=<($5$l$k%P%C%U%!(B -$B$G!"(Bgnus $B$,@8$-$F$$$k8B$j7h$7$F>C$5$l$k$3$H$O$"$j$^$;$s!#(B - -@iftex -@iflatex -\gnusfigure{The Group Buffer}{320}{ -\put(75,50){\epsfig{figure=tmp/group.ps,height=9cm}} -\put(120,37){\makebox(0,0)[t]{Buffer name}} -\put(120,38){\vector(1,2){10}} -\put(40,60){\makebox(0,0)[r]{Mode line}} -\put(40,58){\vector(1,0){30}} -\put(200,28){\makebox(0,0)[t]{Native select method}} -\put(200,26){\vector(-1,2){15}} -} -@end iflatex -@end iftex - -@menu -* Group Buffer Format:: $BI=<($5$l$F$$$k>pJs$HJQ99$NJ}K!(B -* Group Maneuvering:: $B%0%k!<%W%P%C%U%!$r0\F0$9$k%3%^%s%I(B -* Selecting a Group:: $BC5n(B -* Group Data:: $B%0%k!<%W$N>pJs$rJQ99$9$k(B -* Group Levels:: $B%l%Y%k(B? $B$=$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$-(B - $B$^$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(B - $B$^$9(B -* Listing Groups:: Gnus $B$O%0%k!<%W$r$$$m$$$m$JJ,$1J}$GI=<((B - $B$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$_(B - $B$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(B - $B$9$k(B -* Misc Group Stuff:: $BB>$K$G$-$k$3$H(B -@end menu - -@node Group Buffer Format -@section $B%0%k!<%W%P%C%U%!$N7A<0(B - -@menu -* 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 -@end menu - -@node Group Line Specification -@subsection $B%0%k!<%W9T$N;EMM(B -@cindex group buffer format - -$B%0%k!<%W%P%C%U%!$N=i4|@_Dj7A<0$O$-$l$$$G$D$^$s$J$$$1$I!"$3$l$O7/$N9%$-$J(B -$B$h$&$K!"%5%$%3!<$K%@%5$/$9$k$3$H$b$G$-$^$9!#(B - -$B$3$l$,%0%k!<%W9T$NNc$G$9!#(B - -@example - 25: news.announce.newusers - * 0: alt.fan.andrea-dworkin -@end example - -$B$H$C$F$b4JC1$G$7$g(B? - -@samp{news.announce.newusers} $B$K$O(B 25 $B$NL$FI5-;v$,$"$k$N$,$o$+$j$^$9!#(B -@samp{alt.fan.andrea-dworkin} $B$K$OL$FI5-;v$O$J$$$1$l$I$b!"0u$r$D$1$?5-;v(B -$B$,$$$/$D$+$"$j$^$9(B ($B9TF,$N$A$C$A$c$J%"%9%?%j%9%/$,8+$($k(B?)$B!#(B - -@vindex gnus-group-line-format -$B$3$N7A<0$O(B @code{gnus-group-line-format} $BJQ?t$r$$$8$k$3$H$G!"$I$s$JIw$K(B -$B$G$bJQ$($i$l$^$9!#$3$NJQ?t$O(B @code{format} $B$N;EMMIw$KF0:n$7$^$9!#$D$^(B -$B$j(B ($B$"$N%/%=(B) C $B8@8l$r;H$&?M$?$A$N$?$a!"(Bprintf $B$N;EMM$H$[$\F1$8$G$9!#(B -@xref{Formatting Variables} - -@samp{%M%S%5y: %(%g%)\n} $B$H$$$&CM$G>e5-$N9T$r@8@.$7$^$9!#(B - -$B%3%m%s$O!"$3$N9T$NCf$KI,$:L5$/$F$O$$$1$^$;$s!#%+!<%=%k$O!"2?$+$NA`:n$r$7(B -$B$?8e$O>o$K%3%m%s$N$H$3$m$K0\F0$9$k$+$i$G$9!#B>$K$O2?$bI,MW$G$O$"$j$^$;(B -$B$s!=!=%0%k!<%WL>$5$($b$G$9!#I=<($5$l$F$$$kJ8;z$OA4$F$?$@$N2hLL$N>~$j$G$"(B -$B$j!"(Bgnus $B$,$=$l$rD4$Y$k$3$H$O$"$j$^$;$s!#(BGnus $B$OI,MW$H$9$kA4$F$NpJs$r!"(B -$B%F%-%9%HB0@-$r;H$C$F21$($F$$$^$9!#(B - -($B$b$77/$,!"$9$4$/%X%s$J!"AG@2$i$7$$!"I=7W;;Iw$N%l%$%"%&%H$r:n$C$?$H$7$?(B -$B$i!"$_$s$J!"7/$O2q7W$N;E;v$,K;$7$/$C$F!"%K%e!<%9$rFI$s$G;~4V$rL5BL;H$$$7(B -$B$?$j$J$s$+$7$F$J$$!"$C$F?.$8$F$/$l$k$h!#(B) - -$B0J2<$,;HMQ$G$-$k%U%)!<%^%C%HJ8;z$N%j%9%H$G$9!#(B - -@table @samp -@item M -$B$=$N%0%k!<%W$,0u$N$D$$$?5-;v$@$1$N$H$-$O!"%"%9%?%j%9%/J8;z!#(B - -@item S -$B$=$N%0%k!<%W$,9XFI$5$l$F$$$k$+$I$&$+!#(B - -@item L -$B9XFIEY$N%l%Y%k!#(B - -@item N -$BL$FI5-;v$N?t!#(B - -@item I -$BJ]N15-;v$N?t!#(B - -@item T -$B0uIU$-5-;v$N?t!#(B - -@item R -$B4{FI5-;v$N?t!#(B - -@item t -$B?dDjA45-;v?t(B ($B$3$l$O(B Gnus $B%a!<%j%s%0%j%9%H$K(B -$BO"Mm$7$F2<$5$$!#(B - -@item y -$BL$FI$G$b!"0uIU$-$G$b!"J]N1$G$b$J$$5-;v$N?t!#(B - -@item i -$B0uIU$-5-;v$HJ]N15-;v$N?t!#(B - -@item g -$B%0%k!<%WL>$N%U%k%M!<%`!#(B - -@item G -$B%0%k!<%WL>!#(B - -@item D -$B%K%e!<%9%0%k!<%W$N@bL@!#(B - -@item o -$B;J2ql9g(B @samp{m}. - -@item O -$B;J2ql9g(B @samp{(m)}. - -@item s -$BA*BrJ}K!!#(B - -@item n -$B$I$3$+$i$NA*Br$+!#(B - -@item z -$B30ItA*BrJ}K!$,;H$o$l$F$$$k>l9g!"(B@samp{<%s:%n>} $B$HF1$8J8;zNs!#(B - -@item P -$B%H%T%C%/(B (@pxref{Group Topics}) $B$N%l%Y%k$K1~$8$?;z2<$2!#(B - -@item c -@vindex gnus-group-uncollapsed-levels -$BC;$$(B ($B>JN,$7$?(B) $B%0%k!<%WL>!#(B@code{gnus-group-uncollapsed-levels} $BJQ?t$O!"(B -$B$I$N%l%Y%k$^$G%0%k!<%WL>$rA4It;D$9$+$r<($7$^$9!#=i4|CM$O(B 1 $B$G$9!=!=$3(B -$B$N0UL#$O!"(B@samp{gnu.emacs.gnus} $B$N$h$&$J%0%k!<%WL>(B -$B$r(B @samp{g.e.gnus} $B$KC;=L$9$k$H$$$&$3$H$G$9!#(B - -@item m -@vindex gnus-new-mail-mark -@cindex % -$B$=$N%0%k!<%W$K:G6a?7Ce%a!<%k$,FO$$$F$$$k>l9g(B -$B$O(B @samp{%} (@code{gnus-new-mail-mark})$B!#(B - -@item p -@samp{#} (@code{gnus-process-mark}) $B$G!"$=$N%0%k!<%W$K%W%m%;%9%^!<%/$,IU(B -$B$$$F$$$k$3$H$r<($7$^$9!#(B - -@item d -$B:G8e$K$$$D$3$N%0%k!<%W$rFI$s$@$+$r<($9J8;zNs(B (@pxref{Group Timestamp})$B!#(B - -@item u -$BMxMQ$N3F;XDjJ8;z$N>pJs$HF1MM$K!"(B -$B%P%C%U%!$KA^F~$5$l$kJ8;zNs$rJV$5$J$1$l$P$J$j$^$;$s!#(B -@end table - -@cindex * -$BA4$F$N!V!A$N?t!W$N;XDj$G!"$b$7$=$N>pJs$,MxMQ$G$-$J$$>l9g$K$O%"%9%?%j%9(B -$B%/(B (@samp{*}) $B$,Kd$a$i$l$^$9!=!=Nc$($P!"5/F0$5$l$F$$$J$$30It%0%k!<%W$d!"(B -$BIT@5$J4pK\%0%k!<%W$N>l9g$G$9!#(B - -@node Group Modeline Specification -@subsection $B%0%k!<%W%b!<%I9T$N;EMM(B -@cindex group modeline - -@vindex gnus-group-mode-line-format -$B%b!<%I9T(B -$B$O(B @code{gnus-group-mode-line-format} (@pxref{Mode Line Formatting}) $B$r(B -$B@_Dj$9$k$3$H$GJQ99$G$-$^$9!#$3$$$D$O;XDjJ8;z$r$"$s$^$j$?$/$5$sCN$C$F$^$;(B -$B$s!#(B - -@table @samp -@item S -$B4pK\%K%e!<%9%5!<%P!2A$5$l$k(B -$B$b$N$J$i!"$=$N9T$KBP$7$F(B @var{face} $B$,;HMQ$5$l$^$9!#(B - -$B0J2<$,$3$NJQ?t$NCM$NNc$G$9!#$3$l$OGX7J$,0E$$@_Dj$G$O$-$l$$$K8+$($k$+$bCN(B -$B$l$^$;$s!#(B - -@lisp -(cond (window-system - (setq custom-background-mode 'light) - (defface my-group-face-1 - '((t (:foreground "Red" :bold t))) "First group face") - (defface my-group-face-2 - '((t (:foreground "DarkSeaGreen4" :bold t))) "Second group face") - (defface my-group-face-3 - '((t (:foreground "Green4" :bold t))) "Third group face") - (defface my-group-face-4 - '((t (:foreground "SteelBlue" :bold t))) "Fourth group face") - (defface my-group-face-5 - '((t (:foreground "Blue" :bold t))) "Fifth group face"))) - -(setq gnus-group-highlight - '(((> unread 200) . my-group-face-1) - ((and (< level 3) (zerop unread)) . my-group-face-2) - ((< level 3) . my-group-face-3) - ((zerop unread) . my-group-face-4) - (t . my-group-face-5))) -@end lisp - -@pxref{Faces and Fonts} $B$b;2>H$7$F$/$@$5$$!#(B - -$B$3$N(B form $B$,I>2A$5$l$k$H$-$KF0E*$KB+G{$5$l$F$$$kJQ?t$K$O0J2<$N$b$N$,$"$j(B -$B$^$9!#(B - -@table @code -@item group -$B%0%k!<%WL>!#(B -@item unread -$B$=$N%0%k!<%W$NL$FI5-;v$N?t!#(B -@item method -$BA*BrJ}K!!#(B -@item mailp -$B$=$N%0%k!<%W$,%a!<%k$N%0%k!<%W$+$I$&$+!#(B -@item level -$B$=$N%0%k!<%W$N%l%Y%k!#(B -@item score -$B$=$N%0%k!<%W$N%9%3%"!#(B -@item ticked -$B$=$N%0%k!<%WCf$N0u$NIU$$$?5-;v$N?t!#(B -@item total -$B$=$N%0%k!<%WCf$NA45-;v?t!#$b$C$H@53N$K8@$&$H!"(BMAX-NUMBER - MIN_NUMBER + -1. -@item topic -$B%H%T%C%/%^%$%J!<%b!<%I$r;HMQ$7$F$$$k;~!"$3$NJQ?t$OA^F~$5$l$F$$$k8=:_$N%H(B -$B%T%C%/$KB+G{$5$l$^$9!#(B -@end table - -$B$3$N(B form $B$,I>2A(B (@code{eval}) $B$5$l$k$H$-$O!"%]%$%s%H$OLdBj$N%0%k!<%W$N(B -$B9TF,$K$"$j$^$9!#=>$C$F!"DL>o$N(B gnus $B$N4X?t$N$[$H$s$I$r;H$C$F$=$N%0%k!<%W(B -$B$N>pJs$r.$5$$%l%Y%k(B) $B$NL$FI%0%k!<%W$K0\F0$7(B -$B$^$9(B (@code{gnus-group-prev-unread-group-same-level})$B!#(B - -@item M-p -@kindex M-p (Group) -@findex gnus-group-next-unread-group-same-level -$B.$5$$%l%Y%k(B)$B$NL$FI%0%k!<%W$K0\F0$7$^(B -$B$9(B (@code{gnus-group-next-unread-group-same-level})$B!#(B -@end table - -$B.$5$$%l%Y%k$NL$FI%0%k!<%W$K%8%c%s%W$7$^(B -$B$9(B (@code{gnus-group-best-unread-group})$B!#(B - -@item . -@kindex . (Group) -@findex gnus-group-first-unread-group -$B:G=i$NL$FI5-;v$N$"$k%0%k!<%W$K%8%c%s%W$7$^(B -$B$9(B (@code{gnus-group-first-unread-group})$B!#(B -@end table - -@vindex gnus-group-goto-unread -@code{gnus-group-goto-unread} $B$r(B @code{nil} $B$K$9$k$H!"A4$F$N0\F0%3%^%s%I(B -$B$O!"e5-$N%3%^%s%I$HF1$8F0:n$r$7$^$9$,!"!V%4%?%4%?!W$O:GDc8B$K$7$h$&$H(B -$B$7$^$9(B (@code{gnus-group-quick-select-group})$B!#%9%3%"!&(Bkill $B$N=hM}$O9T$o(B -$B$l$:!"%O%$%i%$%H$b5-;v>C5n$b$7$^$;$s!#$3$l$O!"$"$J$?$,K\Ev$K5^$$$G$$$F!"(B -$B$I$C$+$N$d$?$i$G$C$+$$%0%k!<%W$KF~$i$J$1$l$P$$$1$J$$$H$-$KLr$KN)$D$+$b$7(B -$B$l$^$;$s!#$^$?!"@\F,<-$K(B 0 $B$rM?$($l$P(B ($B$9$J$o$A(B @kbd{0 M-RET})$B!"(Bgnus $B$O(B -$B35N,%P%C%U%!$r:n$m$&$H$5$($7$^$;$s!#$3$l$O35N,%P%C%U%!$r:n$kA0$K%9%l%C%I(B -$BI=<($r@Z$jBX$($?$$$H$-Lr$KN)$A$^$9(B (@pxref{Summary Generation Commands})$B!#(B - -@item M-SPACE -@kindex M-SPACE (Group) -@findex gnus-group-visible-select-group -$B$3$l$O(B @kbd{RET} $B%3%^%s%I$HF1$8F0:n$r$9$k$5$i$K$b$&0l$D$N%3%^%s%I$G$9$,!"(B -$B$3$N%3%^%s%I$O5-;v>C5n$HJ]N15-;v$r1#$9=hM}$r9T$$$^$;(B -$B$s(B (@code{gnus-group-visible-select-group})$B!#(B - -@item M-C-RET -@kindex M-C-RET (Group) -@findex gnus-group-select-group-ephemerally -$B:G8e$K$3$N%3%^%s%I$O!"8=:_$N%0%k!<%W$r0lEY8B$j!"$=$NFbMF$K0l@Z$N=hM}$r$9(B -$B$k$3$H$N$J$$$h$&$KA*Br$7$^(B -$B$9(B (@code{gnus-group-select-group-ephemerally})$B!#%9%l%C%II=<($5$($b9T$o(B -$B$l$^$;$s!#$3$NJ}K!$GA*Br$7$?8e$K$3$N%0%k!<%W$KBP$7$F9T$C$?$3$H$OA4$F!"$=(B -$B$N8e$K1F6A$rM?$($k$3$H$O$"$j$^$;$s!#(B -@end table - -@vindex gnus-large-newsgroup -@code{gnus-large-newsgroup} $BJQ?t$O!"2?$rBg$-$J%0%k!<%W$H9M$($k$Y$-$+!"(B -$B$r(B gnus $B$KM?$($^$9!#$3$l$O=i4|@_Dj$G$O(B 200 $B$G$9!#%0%k!<%W$K(B ($BL$FI$H0uIU(B -$B$-$N(B) $B5-;v$,$3$N?t0J>e$"$l$P!"(Bgnus $B$O$=$N%0%k!<%W$KF~$kA0$KMxMQl9g$O!"$=$N4X?t$OI=Bj$N9T$K%]%$(B -$B%s%H$r0\F0$5$;$k$+!"$$$/$D$+$N5-;v$rA*Br$9$k$+$NN>J}$+!"8el9g$K$O!"9XFI$r;_$a$^$9(B (@code{gnus-group-unsubscribe-group})$B!#(B - -@item S k -@itemx C-k -@kindex S k (Group) -@kindex C-k (Group) -@findex gnus-group-kill-group -@c @icon{gnus-group-kill-group} -$B8=:_$N%0%k!<%W$r(B kill $B$7$^$9(B (@code{gnus-group-kill-group})$B!#(B - -@item S y -@itemx C-y -@kindex S y (Group) -@kindex C-y (Group) -@findex gnus-group-yank-group -$B:G8e$K(B kill $B$7$?%0%k!<%W$r(B yank $B$7$^$9(B (@code{gnus-group-yank-group})$B!#(B - -@item C-x C-t -@kindex C-x C-t (Group) -@findex gnus-group-transpose-groups -$BFs$D$N%0%k!<%W$N=g=x$rCV$-49$($^$9(B (@code{gnus-group-transpose-groups})$B!#(B -$B$3$l$O%[%s%H$O9XFI%3%^%s%I$G$O$"$j$^$;$s$,!"(Bkill $B$H(B yank $B$r2?EY$+B3$1$k(B -$BBe$o$j$K$3$N%3%^%s%I$,;H$($^$9!#(B - -@item S w -@itemx C-w -@kindex S w (Group) -@kindex C-w (Group) -@findex gnus-group-kill-region -$B%j!<%8%g%sFb$NA4$F$N%0%k!<%W$r(B kill $B$7$^(B -$B$9(B (@code{gnus-group-kill-region})$B!#(B - -@item S z -@kindex S z (Group) -@findex gnus-group-kill-all-zombies -$BA4$F$N%>%s%S%0%k!<%W$r(B kill $B$7$^$9(B (@code{gnus-group-kill-all-zombies})$B!#(B - -@item S C-k -@kindex S C-k (Group) -@findex gnus-group-kill-level -$B$"$k%l%Y%k$N%0%k!<%W$rA4$F(B kill $B$7$^$9(B (@code{gnus-group-kill-level})$B!#(B -kill $B$7$?8e!"$3$l$i$N%0%k!<%W$r(B yank $B$GLa$9$3$H$O$G$-$J$$$N$G!"$3$N%3%^(B -$B%s%I$O$$$/$i$+Cm0U$7$F;H$C$F$/$@$5$$!#$3$N%3%^%s%I$,K\Ev$KJXMx$K$J$k$N$O!"(B -@file{.newsrc} $B$KH$7$F$/$/$@$5$$!#(B - -@node Group Data -@section $B%0%k!<%W%G!<%?(B - -@table @kbd -@item c -@kindex c (Group) -@findex gnus-group-catchup-current -@vindex gnus-group-catchup-group-hook -@c @icon{gnus-group-catchup-current} -$B$=$N%0%k!<%WFb$NA4$F$NL50u$N5-;v$r4{FI$K$9(B -$B$k(B (@code{gnus-group-catchup-current})$B!#%0%k!<%W%P%C%U%!$+$i4{FI$K$7$?>l(B -$B9g$O(B @code{gnus-group-catchup-group-hook} $B$,8F$S=P$5$l$^$9!#(B - -@item C -@kindex C (Group) -@findex gnus-group-catchup-current-all -$B$=$N%0%k!<%W$NA45-;v$r!"0uIU$-$N5-;v$b4^$a$F4{FI$K$7$^(B -$B$9(B (@code{gnus-group-catchup-current-all})$B!#(B - -@item M-c -@kindex M-c (Group) -@findex gnus-group-clear-data -$B8=:_$N%0%k!<%W$NA4$F$N%G!<%?$r%/%j%"$7$^$9!=!=%^!<%/$H4{FI5-;v$N%j%9%H$r(B -$B>C$75n$j$^$9(B (@code{gnus-group-clear-data})$B!#(B - -@item M-x gnus-group-clear-data-on-native-groups -@kindex M-x gnus-group-clear-data-on-native-groups -@findex gnus-group-clear-data-on-native-groups -$B$b$7(B @sc{nntp} $B%5!<%P$rJL$N$b$N$K@Z$jBX$($?$H$9$k$H!"A4$F$N%^!<%/$H4{FI(B -$B>pJs$O$b$&Lr$K$ON)$A$^$;$s!#$3$N%3%^%s%I$r;H$C$F4pK\%0%k!<%W$NA4$F$N%G!<(B -$B%?$r%/%j%"$9$k$3$H$,$G$-$^$9!#Cm0U$7$F;H$C$F$M!#(B -@end table - -@node Group Levels -@section $B%0%k!<%W%l%Y%k(B -@cindex group level -@cindex level - -$BA4$F$N%0%k!<%W$O(B @dfn{$B9XFIEY(B} (@dfn{subscribedness}) $B$N%l%Y%k$r;}$A$^$9!#(B -$BNc$($P!"$"$k%0%k!<%W$,%l%Y%k(B 2 $B$@$H$9$l$P!"$=$l$O%l%Y%k(B 5 $B$N%0%k!<%W$h$j(B -$B$b!V$h$j9XFI$7$F$$$k!W$H$$$&$3$H$G$9!#(BGnus $B$KBP$7$F!"$"$k%l%Y%k$+$=$l$h(B -$B$j>.$5$$%l%Y%k$N%0%k!<%W$N$_0lMwI=<($9$k$h$&$KMj$`$3$H$b$G$-$k(B -$B$7(B (@pxref{Listing Groups})$B!"$"$k%l%Y%k$+$=$l$h$j>.$5$$%l%Y%k$N%0%k!<%W(B -$B$N?7Ce5-;v$N$_$r3NG'$9$k$3$H$b$G$-$^$9(B(@pxref{Scanning New Messages})$B!#(B - -$BK:$l$J$$$G(B: $B%0%k!<%W$N%l%Y%k$,Bg$-$$$[$I!"=EMWEY$ODc$/$J$k$H$$$&$3$H!#(B - -@table @kbd -@item S l -@kindex S l (Group) -@findex gnus-group-set-current-level -$B8=:_$N%0%k!<%W$N%l%Y%k$r@_Dj$9$k!#?t;z%W%l%U%#%C%/%9$,M?$($i$l$k$H!"$=$3(B -$B$+$i(B @var{n} $B8D$N%0%k!<%W$N%l%Y%k$,@_Dj$5$l$^$9!#%l%Y%k$rF~NO$9$k$?$a$N(B -$B%W%m%s%W%H$,=P$^$9!#(B -@end table - -@vindex gnus-level-killed -@vindex gnus-level-zombie -@vindex gnus-level-unsubscribed -@vindex gnus-level-subscribed -Gnus $B$O%l%Y%k(B 1 $B$+$i(B @code{gnus-level-subscribed} ($B$3$NCM$r4^$`(B) ($B=i4|CM(B -$B$O(B 5) $B$^$G$N%0%k!<%W$r9XFI!"(B@code{gnus-level-subscribed} ($B$3$NCM$r4^$^$J(B -$B$$(B) $B$+$i(B@code{gnus-level-unsubscribed} ($B$3$NCM$r4^$`(B) ($B=i4|CM$O(B 7) $B$^$G(B -$B$N%0%k!<%W$rHs9XFI!"(B@code{gnus-level-zombie} $B$r%>%s%S(B ($BJb$/;S(B) ($B=i4|CM(B -$B$O(B 8)$B!"(B@code{gnus-level-killed} $B$r(B kill $B$5$l$F$$$k(B ($B40A4$K;`$s$G(B -$B$k(B) ($B=i4|CM$O(B 9) $B$HH=CG$7$^$9!#(BGnus $B$O9XFI$HHs9XFI$N%0%k!<%W$OA4$/F1MM$K(B -$B07$$$^$9$,!"%>%s%S$H(B kill $B%0%k!<%W$O!"$I$N5-;v$rFI$s$@$+!"B8:_$9$k$+$J$I(B -$B$N>pJs$r0l@Z;}$A$^$;$s!#$3$N;`$s$G$k%0%k!<%W$H@8$-$F$k%0%k!<%W$N6hJL$O!"(B -$BJL$K$=$l$,$-$l$$$@$+$i$H$+8-$$$+$i$H$$$&$o$1$G$O$J$/!"=c?h$K8zN(E*$JM}M3(B -$B$N$?$a$G$9!#(B - -$B%a!<%kMQ$N%0%k!<%W$O(B ($B$b$7$"$l$P(B) $BHs>o$K>.$5$$%l%Y%k(B ($BNc$($P(B 1 $B$+(B 2) $B$K(B -$B$7$F$*$/$3$H$r$*4+$a$7$^$9!#(B - -$B%s%S$H(B kill $B%0%k!<%W$O!"%G%#%U%)%k%H$G$O1#$5$l$F$$$kE@$GHs9VFI$N%0%k!<(B -$B%W$K;w$F$$$^$9!#$7$+$7!"(Bgnus $B$,%K%e!<%9%5!<%P!<$KBP$7$F%>%s%S$H(B kill $B%0(B -$B%k!<%W$K4X$9$k>pJs(B ($B5-;v?t!"L$FI5-;v?t(B) $B$NLd$$9g$o$;$r$7$J$$E@$G!"9XFI$*(B -$B$h$SHs9XFI$N%0%k!<%W$H$O0c$C$F$$$^$9!#$U$D$&!"$"$J$?$O6=L#$NL5$$%0%k!<%W(B -$B$r(B @kbd{C-k} $B$G(B kill $B$7$^$9$h$M!#$b$7!"$[$H$s$I$N%0%k!<%W$,(B kill $B$5$l$F(B -$B$$$k$H!"(Bgnus $B$OB.$/$J$j$^$9!#(B - -$B$J$<(B gnus $B$O%>%s%S$H(B kill $B%0%k!<%W$r6hJL$9$k$N$G$7$g$&(B? $B$($($H!"%5!<%P!<(B -$B$K?7$7$$%0%k!<%W$,$G$-$k$H!"(Bgnus $B$O%G%#%U%)%k%H$G$=$l$r%>%s%S$K$7$^$9!#(B -$B$3$l$O!"$"$J$?$,$U$D$&$O?7$7$$%0%k!<%W$KHQ$o$5$l$J$$$3$H$r0UL#$7$^$9$,!"(B -$B$"$J$?$O(B @kbd{A z} $B$G?7$7$$%0%k!<%W$N%j%9%H$rF@$k$3$H$,$G$-$^$9!#$"$J$?(B -$B$O9%$_$N$b$N$r9VFI$7!"MW$i$J$$$b$N$O(B kill $B$9$l$PNI$$$N$G$9!#(B -(@kbd{A k} $B$G(B kill $B$5$l$?%0%k!<%W$N%j%9%H$rI=<($7$^$9!#(B) - -$B$b$7%l%Y%kJQ?t$GM7$S$?$$$N$G$"$l$P!"B?>/Cm0U$r$7$F$^$o$kI,MW$,$"$j$^$9!#(B -$B0lC6$=$l$r@_Dj$7$?$i!"FsEY$H$=$l$K?($i$J$$$G$/$@$5$$!#$5$i$K8@$($P!"<+J,(B -$B$G2?$r$d$C$F$$$k$+$r@53N$KM}2r$7$F$$$J$$8B$j!"0l@Z?($i$J$$$G$/$@$5$$!#(B - -@vindex gnus-level-default-unsubscribed -@vindex gnus-level-default-subscribed -$B?H6a$K4X78$9$kFs$D$NJQ?t$O(B @code{gnus-level-default-subscribed} ($B=i4|CM(B -$B$O(B 3) $B$H(B @code{gnus-level-default-unsubscribed} ($B=i4|CM$O(B 6) $B$G$9!#$3$l(B -$B$i$O?7$7$$%0%k!<%W$,(B ($BHs(B) $B9XFI$5$l$?$H$-$N%l%Y%k$G$9!#$b$A$m$s!"$3$l(B -$B$iFs$D$NJQ?t$NCM$O!"0UL#$N$"$k@5$7$$HO0O$G$J$/$F$O$J$j$^$;$s!#(B - -@vindex gnus-keep-same-level -@code{gnus-keep-same-level} $B$,(B @code{nil} $B0J30$G$"$l$P!"0\F0%3%^%s%I$N$$(B -$B$/$D$+$OF10l(B ($B$"$k$$$O$=$l$h$j>.$5$$(B) $B%l%Y%k$N%0%k!<%W$N$_$N0\F0$K$J$j$^(B -$B$9!#FC$K!"$"$k%0%k!<%W$N:G8e$N5-;v$+$i.$5$$(B) $B%l%Y%k$N%0%k!<%W$K0\F0$7$^$9!#$3$l$O;D$j$N%0(B -$B%k!<%W$rFI$`$h$j@h$K!"$h$j=EMW$J%0%k!<%W$rFI$s$G$*$-$?$$$H$-$K$OJXMx$+$b(B -$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$$(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$h$j>.$5$$(B -$B%l%Y%k$N%0%k!<%W$,!"%0%k!<%W%P%C%U%!$K0lMwI=<($5$l$^$9!#(B - -@vindex gnus-group-list-inactive-groups -@code{gnus-group-list-inactive-groups} $B$,(B @code{nil} $B0J30$G$"$l$P!"L$FI(B -$B$N%0%k!<%W$K0l=o$K%"%/%F%#%V$G$J$$%0%k!<%W$bI=<($7$^$9!#$3$NJQ?t$O=i4|@_(B -$BDj$G$O(B @code{t} $B$G$9!#$b$7$3$l$,(B @code{nil} $B$G$"$l$P!"%"%/%F%#%V$G$J$$%0(B -$B%k!<%W$OI=<($5$l$^$;$s!#(B - -@vindex gnus-group-use-permanent-levels -@code{gnus-group-use-permanent-levels} $B$,(B @code{nil} $B0J30$G$"$l$P!"0lC6(B -$B%l%Y%k$r(B @kbd{g} $B$d(B @kbd{l} $B$N%W%l%U%#%C%/%9$KM?$($k$H!"$=$N8e$NA4$F$N%3(B -$B%^%s%I$K$*$$$F$=$N%l%Y%k$,!V:nMQ$9$k!W%l%Y%k$K$J$j$^$9!#(B - -@vindex gnus-activate-level -Gnus $B$ODL>o!"(B@code{gnus-activate-level} $B$+$=$l$h$j>.$5$$%l%Y%k$N%0%k!<%W(B -$B$N$_$r5/F0$7$^$9(B ($B$D$^$j%5!<%P$KLd$$9g$o$;$r$9$k(B)$B!#9XFI$7$F$$$J$$%0%k!<(B -$B%W$r5/F0$7$?$/$J$1$l$P!"$3$NJQ?t$rNc$($P(B 5 $B$K@_Dj$9$k$H$h$$$+$b$7$l$^$;(B -$B$s!#%G%#%U%)%k%H$O(B 6 $B$G$9!#(B - -@node Group Score -@section $B%0%k!<%W$N%9%3%"(B -@cindex group score -@cindex group rank -@cindex rank - -$BIaDL$O=EMW$J%0%k!<%W$O9b%l%Y%k$K$7$F$*$/$G$7$g$&$1$l$I$b!"$3$NJ}K!$G$O>/!9(B -$B@)8B$,$-$D$$$G$9$h$M!#$R$g$C$H$7$?$i!"%0%k!<%W$r$I$l$/$i$$IQHK$KFI$`$+$K(B -$B$h$C$F%0%k!<%W%P%C%U%!$r%=!<%H$7$?$$$J$"!"$J$s$F;W$o$J$$(B? $BM}$K$+$J$C$F$k(B -$B$G$7$g(B? - -@dfn{$B%0%k!<%W%9%3%"(B} (@dfn{group score}) $B$O$=$N$?$a$N$b$N$G$9!#(BGnus $B$K0J(B -$B2<$G@bL@$5$l$F$$$k5!9=$G!"$=$l$>$l$N%0%k!<%W$KBP$7$F%9%3%"$r;XDj$5$;$k$3(B -$B$H$,$G$-$^$9!#$=$7$F%0%k!<%W%P%C%U%!$r$3$N%9%3%"$r4p$K%=!<%H$9$k$3$H$,$G(B -$B$-$^$9!#$"$k$$$O!"%9%3%"=g$G%=!<%H$7$F$=$N8e%l%Y%k$G%=!<%H$9$k$3$H$b$G$-(B -$B$^$9!#(B($B%l%Y%k$H%9%3%"$r$R$H$^$H$a$K$7$F!"%0%k!<%W(B -$B$N(B @dfn{$B%i%s%/(B} (@dfn{rank}) $B$H8F$S$^$9!#%l%Y%k$,(B 4 $B$G%9%3%"$,(B 1 $B$N%0%k!<(B -$B%W$O!"%l%Y%k$,(B 5 $B$G%9%3%"$,(B 300 $B$N%0%k!<%W$h$j$b9b$$%i%s%/$H$J$j$^$9!#(B -($B%l%Y%k$NJ}$,=EMWEY$,9b$/!"%9%3%"$NJ}$O=EMWEY$,Dc$/$J$j$^$9!#(B)) - -@findex gnus-summary-bubble-group -$BIQHK$KFI$`%0%k!<%W$K!"$a$C$?$KFI$^$J$$%0%k!<%W$h$j$b9b$$%9%3%"$rM?$($?$$(B -$B$H$-$O!"(B@code{gnus-summary-exit-hook} $B%U%C%/(B -$B$K(B @code{gnus-summary-bubble-group} $B4X?t$rDI2C$9$k$3$H$,$G$-$^$9!#$3$l$G(B -$B%P%V%k%=!<%H$Nl9g$G!"$=$l$i$,%0(B -$B%k!<%W%P%C%U%!$KO"B3$7$F$"$k>l9g$K$O!"DL>oDL$jL?Na$KBP$7$F?t;z@\F,<-$rM?(B -$B$($k$@$1$G$9!#$=$&$9$l$P$[$H$s$I$N%0%k!<%WL?Na$O!"$3$l$i$N%0%k!<%W$KBP$7(B -$B$F$"$J$?$NL?Na$K=>$$$^$9!#(B - -$B$7$+$7$=$l$i$N%0%k!<%W$,=gHV$KJB$s$G$$$J$$>l9g$K$*$$$F$b!"$$$/$D$+$N%0%k!<(B -$B%W$KBP$7$FL?Na$rH$7$F$/$@$5$$!#(B - -@findex gnus-group-universal-argument -$B%W%m%;%90u$,IU$1$i$l$F$$$kA4$F$N%0%k!<%W$KBP$7$F2?$+$NL?Na$rR2p$7$^$9!#$3$l(B -$B$i$NL?Na$OA4$F!"?75,$K:n@.$7$?%0%k!<%W$r%]%$%s%H0LCV$KA^F~$7$^(B -$B$9!=!=(B@code{gnus-subscribe-newsgroup-method} $B$O;2>H$5$l$^$;$s!#(B - -@table @kbd -@item G m -@kindex G m (Group) -@findex gnus-group-make-group -@cindex making groups -$B?7$7$$%0%k!<%W$r:n@.$7$^$9(B (@code{gnus-group-make-group})$B!#(BGnus $B$O%W%m%s(B -$B%W%H$rI=<($7$F!"L>A0$HJ}K!$H!">l9g$K$h$C$F$O(B @dfn{address} $B$NF~NO$r5a$a(B -$B$F$-$^$9!#$h$j4JC1$K(B @sc{nntp} $B%0%k!<%W$r9XFI$9$kJ}K!$O!"(B -@pxref{Browse Foreign Server}$B!#(B - -@item G r -@kindex G r (Group) -@findex gnus-group-rename-group -@cindex renaming groups -$B8=:_$N%0%k!<%W$NL>A0$r!"2?$+JL$N$b$N$KJQ99$7$^(B -$B$9(B (@code{gnus-group-rename-group})$B!#$3$l$O$"$ko(B -$B$KCY$$$3$H$bM-$jF@$^$9!#(B - -@item G c -@kindex G c (Group) -@cindex customizing -@findex gnus-group-customize -$B%0%k!<%W%Q%i%a!<%?$r%+%9%?%^%$%:$9$k(B (@code{gnus-group-customize})$B!#(B - -@item G e -@kindex G e (Group) -@findex gnus-group-edit-group-method -@cindex renaming groups -$B8=:_$N%0%k!<%W$NA*BrJ}K!$r=$@5$9$k$?$a$N%P%C%U%!$K0\F0$7$^(B -$B$9(B (@code{gnus-group-edit-group-method})$B!#(B - -@item G p -@kindex G p (Group) -@findex gnus-group-edit-group-parameters -$B%0%k!<%W%Q%i%a!<%?$r=$@5$9$k$?$a$N%P%C%U%!$K0\F0$7$^(B -$B$9(B (@code{gnus-group-edit-group-parameters})$B!#(B - -@item G E -@kindex G E (Group) -@findex gnus-group-edit-group -$B%0%k!<%W>pJs$r=$@5$9$k$?$a$N%P%C%U%!$K0\F0$7$^(B -$B$9(B (@code{gnus-group-edit-group})$B!#(B - -@item G d -@kindex G d (Group) -@findex gnus-group-make-directory-group -@cindex nndir -$B%G%#%l%/%H%j%0%k!<%W$r:n@.$7$^$9(B (@pxref{Directory Groups})$B!#%G%#%l%/%H(B -$B%jL>$r%W%m%s%W%H$GF~NO$7$^$9(B (@code{gnus-group-make-directory-group})$B!#(B - -@item G h -@kindex G h (Group) -@cindex help group -@findex gnus-group-make-help-group - -Gnus $B%X%k%W%0%k!<%W$r:n@.$7$^$9(B (@code{gnus-group-make-help-group})$B!#(B - -@item G a -@kindex G a (Group) -@cindex (ding) archive -@cindex archive group -@findex gnus-group-make-archive-group -@vindex gnus-group-archive-directory -@vindex gnus-group-recent-archive-directory -Gnus $B%"!<%+%$%V%0%k!<%W$r:n@.$7$^(B -$B$9(B (@code{gnus-group-make-archive-group})$B!#=i4|@_Dj$G$O:G$b:G6a$N5-;v$r(B -$B;X$7$F$$$k%0%k!<%W$,:n@.$5$l$^$9(B -$B$,(B (@code{gnus-group-recent-archive-directory})$B!"@\F,0z?t$rM?$($k$HA4$F(B -$B$N5-;v$r4^$`%0%k!<%W$,(B @code{gnus-group-archive-directory} $B$r4p$K:n@.$5(B -$B$l$^$9!#(B - -@item G k -@kindex G k (Group) -@findex gnus-group-make-kiboze-group -@cindex nnkiboze -kiboze $B%0%k!<%W$r:n@.$7$^$9!#%W%m%s%W%H$GL>A0$H!"(Bkiboze $B%0%k!<%W$K!V4^$a(B -$B$?$$!W%0%k!<%W$K9g$&@55,I=8=$H!"%X%C%@!<$K9g$&J8;zNs$NAH$rF~NO$7$^(B -$B$9(B (@code{gnus-group-make-kiboze-group})$B!#(B@xref{Kibozed Groups}. - -@item G D -@kindex G D (Group) -@findex gnus-group-enter-directory -@cindex nneething -$BG$0U$N%G%#%l%/%H%j$r(B @code{nneething} $B%P%C%/%(%s%I%K%e!<%9%0%k!<%W$G$"$k(B -$B$+$N$h$&$KFI$_9~$_$^$9(B (@code{gnus-group-enter-directory})$B!#(B -@xref{Anything Groups}. - -@item G f -@kindex G f (Group) -@findex gnus-group-make-doc-group -@cindex ClariNet Briefs -@cindex nndoc -$B%U%!%$%k$J$I$r$b$H$K%0%k!<%W$r:n@.$7$^(B -$B$9(B (@code{gnus-group-make-doc-group})$B!#$3$N%3%^%s%I$K@\F,<-$rM?$($?>l9g!"(B -$B%U%!%$%kL>$H%U%!%$%k%?%$%W$r%W%m%s%W%H$GF~NO$7$^$9!#8=:_%5%]!<%H$5$l$F$$(B -$B$k%U%!%$%k%?%$%W$O!"(B -@code{babyl}, @code{mbox}, @code{digest}, @code{mmdf}, @code{news}, @code{rnews}, @code{clari-briefs}, @code{rfc934}, @code{rfc822-forward}, @code{nsmail}, @code{forward} $B$G(B -$B$9!#@\F,<-$J$7$G$3$N%3%^%s%I$rl9g$K$O!"(B -@samp{~g alt.sysadmin.recovery shaving} $B$N$h$&$J9gCW$9$kJ8;zNs$rMQ$$$k$3(B -$B$H$K$h$C$F!"8!:wBP>]$rFCDj$N%0%k!<%W$K8BDj$9$k$3$H$,2DG=$G$9!#(B - -@item G DEL -@kindex G DEL (Group) -@findex gnus-group-delete-group -$B$3$N4X?t$O8=:_$N%0%k!<%W$r:o=|$7$^$9(B (@code{gnus-group-delete-group})$B!#(B -$B@\F,<-$,M?$($i$l$k$H!"$3$N4X?t$O$=$N%0%k!<%WFb$NA45-;v$rK\Ev$K:o=|$7!"%0(B -$B%k!<%W<+?H$r$3$N@$$+$i6/@)E*$KKu;&$7$F$7$^$$$^$9!#@\F,<-$O!"$"$J$?$,2?$r(B -$B$d$m$&$H$7$F$$$k$+!"K\Ev$K<+?.$,$"$k$H$-$K$N$_;H$C$F$/$@$5$$!#$^$"!"$3$N(B -$B%3%^%s%I$O(B (@code{nntp} $B%0%k!<%W$N$h$&$J(B) $BFI$_=P$7@lMQ%0%k!<%W$K$O;H$($^(B -$B$;$s$1$I!#(B - -@item G V -@kindex G V (Group) -@findex gnus-group-make-empty-virtual -$B?7$7$$!"?7A/$J!"6u$N(B @code{nnvirtual} $B%0%k!<%W$r:n@.$7$^(B -$B$9(B (@code{gnus-group-make-empty-virtual})$B!#(B@xref{Virtual Groups}. - -@item G v -@kindex G v (Group) -@findex gnus-group-add-to-virtual -$B8=:_$N%0%k!<%W$r(B @code{nnvirtual} $B%0%k!<%W$KDI2C$7$^(B -$B$9(B (@code{gnus-group-add-to-virtual})$B!#$3$l$O%W%m%;%90u(B/$B@\F,0z?t$N=,47$K(B -$B=>$$$^$9!#(B -@end table - -$B$5$^$6$^$JA*BrJ}K!$K4X$9$k$5$i$J$k>pJs$O(B @xref{Select Methods} $B$r;2>H$7(B -$B$F$/$@$5$$!#(B - -@vindex gnus-activate-foreign-newsgroups -$B$b$7(B @code{gnus-activate-foreign-newsgroups} $B$,@5$N?t$G$"$l$P!"(Bgnus $B$O5/(B -$BF0;~$K!"$3$N?t$+$=$l$h$j$b>.$5$$%l%Y%k$N30It%0%k!<%W$rA4$F%A%'%C%/$7$^$9!#(B -$B$3$l$OFC$K0c$C$?(B @sc{nntp} $B%5!<%P$+$i$?$/$5$s$N%0%k!<%W$r9XFI$7$F$$$k>l(B -$B9g$J$I!"$7$P$i$/;~4V$,$+$+$k$+$b$7$l$^$;$s!#(B@pxref{Group Levels} $B$b;2>H(B -$B$7$F2<$5$$!#(B@code{gnus-activate-level} $B$b30It%K%e!<%9%0%k!<%W$N3hF02=$K(B -$B1F6A$r5Z$\$7$^$9!#(B - -@node Group Parameters -@section $B%0%k!<%W%Q%i%a!<%?(B -@cindex group parameters - -$B%0%k!<%W%Q%i%a!<%?$O!"$"$kFCDj$N%0%k!<%W$K8GM-$J>pJs$r3JG<$7$^$9!#0J2<$O(B -$B%0%k!<%W%Q%i%a!<%?%j%9%H$NNc$G$9(B: - -@example -((to-address . "ding@@gnus.org") - (auto-expire . t)) -@end example - -$B$=$l$>$l$NMWAG$O!XE@BP!Y(B(dotted pair)$B!=!=$D$^$jE@(B (dot) $B$NA0$K80!"E@$N8e(B -$B$m$KCM$,$"$k$b$N!"$G9=@.$5$l$^$9!#A4$F$N%Q%i%a!<%?$O$3$N7A<0$ro$N%j%9%H$K$J$j$^$9!#(B - -$B$$$/$D$+$N%Q%i%a!<%?$OBP1~$9$k%+%9%?%^%$%:2DG=$JJQ?t$r;}$C$F$$$^$9!#$=$l(B -$B$i$O@55,I=8=$HCM$NO"A[%j%9%H$G$9!#(B - -$B0J2<$OMxMQ2DG=$J%0%k!<%W%Q%i%a!<%?$G$9(B: - -@table @code -@item to-address -@cindex to-address -$B%U%)%m!<%"%C%W$H%K%e!<%9$X$NEj9F$r$9$k$H$-$K;HMQ$5$l$k%"%I%l%9!#(B - -@example -(to-address . "some@@where.com") -@end example - -$B$3$l$OZ$5$l$k$N$G!";22Ce$K$"$C$?$H$7$^$7$g$&!#$3$l$OK\Ev$N%K%e!<%9%0%k!<%W$G$9$,!"%5!<%P$O%a!<(B -$B%k%K%e!<%9%2!<%H%&%'%$$rDL$7$F5-;v$r@\Ej9F$9$k$3$H$OIT2DG=$G!"Be$o$j$K$=$N%a!<%j%s%0%j%9%H$K%a!<%k$rAw(B -$B?.$7$J$1$l$P$J$j$^$;$s!#(B - -@code{gnus-parameter-to-address-alist} $B$b;2>H$7$F2<$5$$!#(B - -@item to-list -@cindex to-list -$B$=$N%0%k!<%W$G(B @kbd{a} $B$r2!$7$?$H$-$K;HMQ$5$l$k%"%I%l%9!#(B - -@example -(to-list . "some@@where.com") -@end example - -$B$3$l$O%U%)%m!<%"%C%W$r$7$?$H$-$O40A4$KL5;k$5$l$^$9!=!=Nc30$O$=$l$,%K%e!<(B -$B%9%0%k!<%W$rI=$o$7$F$$$k$H$-$O!"(B@kbd{f} $B$r2!$7$?$H$-$K%a!<%k%0%k!<%W$N%k!<(B -$B%k$,E,MQ$5$l$k$H$$$&$3$H$G$9!#(B - -$B$b$7(B @kbd{a} $B%3%^%s%I$r%a!<%k%0%k!<%W$GH$7$F2<$5$$!#(B - -@item visible -@cindex visible -$B%0%k!<%W%Q%i%a!<%?$N%j%9%HCf$K(B @code{(visible . t)} $B$H$$$&MWAG$,$"$l$P!"(B -$B$=$N%0%k!<%W$O%0%k!<%W%P%C%U%!$K$*$$$F!"L$FI5-;v$,$"$k$+$I$&$+$K4X$o$i$:!"(B -$B>o$KI=<($5$l$^$9!#(B - -@item broken-reply-to -@cindex broken-reply-to -@code{(broken-reply-to . t)} $B$H$$$&MWAG$,$"$l$P!"$=$N%0%k!<%W$G(B -$B$O(B @code{Reply-To} $B$OL5;k$5$l$k!"$H$$$&0UL#$G$9!#$3$l$O$"$k(B listserv $B$K(B -$B$h$k%a!<%j%s%0%j%9%H$r9XFI$7$F$$$F!"$=$l$,(B @code{Reply-To} $BMs(B -$B$r(B listserv $B<+?H$KJV$9$h$&$K$D$1$i$l$F$$$k>l9g$KM-8z$G$7$g$&!#$3$l$O$*$+(B -$B$7$J?6$kIq$$$G$9!#$@$+$i$3$l$,MW$k$s$G$9(B! - -@item to-group -@cindex to-group -@code{(to-group . "some.group.name")} $B$H$$$&MWAG$O!"$=$N%0%k!<%W$X$NEj9F(B -$B$OA4$F(B @code{some.group.name} $B$KAw$i$l$k!"$H$$$&0UL#$G$9!#(B - -@item newsgroup -@cindex newsgroup -$B%0%k!<%W%Q%i%a!<%?%j%9%H$K(B @code{(newsgroup . t)} $B$,$"$l$P!"(Bgnus $B$OA4$F(B -$B$N1~Ez$r%K%e!<%95-;v$KBP$9$k1~Ez$G$"$k$+$N$h$&$K07$$$^$9!#$3$l$OC5n$5$l$k$h$&$K0u$rIU$1$i$l$^$9!#B>$NJ}K!$O!"(B -@pxref{Expiring Mail}$B!#(B - -@code{gnus-auto-expirable-newsgroups} $B$b;2>H$7$F2<$5$$!#(B - -@item total-expire -@cindex total-expire -$B%0%k!<%W%Q%i%a!<%?$K(B @code{(total-expire . t)} $B$N$h$&$JMWAG$,$"$l$P!"4{(B -$BFI5-;v$O!";~8B>C5n$N0u$,$D$$$F$$$J$/$H$bA4$F;~8B>C5n=hM}$r;\$5$l$^$9!#Cm(B -$B0U$7$F;HMQ$7$F$/$@$5$$!#L$FI5-;v!"0uIU$-5-;v!"J]N15-;v$O;~8B>C5n$5$l$^$;(B -$B$s!#(B - -@code{gnus-total-expirable-newsgroups} $B$b;2>H$7$F2<$5$$!#(B - -@item expiry-wait -@cindex expiry-wait -@vindex nnmail-expiry-wait-function -$B%0%k!<%W%Q%i%a!<%?$K(B @code{(expiry-wait . 10)} $B$N$h$&$JMWAG$,$"$l$P!"$3(B -$B$NCM$O5-;v$r;~8B>C5n$9$k$H$-(B -$B$K(B @code{nnmail-expiry-wait} $B$H(B @code{nnmail-expiry-wait-function} $B$N@_(B -$BDj$h$j$bM%@h$5$l$^$9!#$3$NCM$O;~8B>C5n$NF|?t(B ($B@0?t$G$"$kI,MW$O$J$$(B) $B$+$b(B -$B$7$/$O(B @code{never} $B$+(B @code{immediate} $B$N%7%s%\%k$r;XDj$G$-$^$9!#(B - -@item score-file -@cindex score file group parameter -@code{(score-file . "file")} $B$N$h$&$JMWAG$O!"(B@file{file} $B$r8=:_$N%0%k!<(B -$B%W$KE,MQ$5$l$k%9%3%"%U%!%$%k$K$7$^$9!#E,MQ$5$l$k%9%3%"EPO?$OA4$F$3$N%U%!(B -$B%$%k$KF~$j$^$9!#(B - -@item adapt-file -@cindex adapt file group parameter -@code{(adapt-file . "file")} $B$N$h$&$JMWAG$O!"(B@file{file} $B$r8=:_$N%0%k!<(B -$B%W$NE,1~%U%!%$%k$K$7$^$9!#A4$F$NE,1~%9%3%"EPO?$O$3$N%U%!%$%k$KF~$j$^$9!#(B - -@item admin-address -@cindex admin-address -$B%a!<%j%s%0%j%9%H$+$iC&2q$9$k$H$-$O!"C&2qDLCN%a!<%k$r$=$N%a!<%j%s%0%j%9%H(B -$B<+?H$KAw?.$7$F$O$$$1$^$;$s!#Be$o$j$K4IM}MQ%"%I%l%9$K%a%C%;!<%8$rAw?.$7$^(B -$B$9!#$3$N%Q%i%a!<%?$K$O$I$3$+JXMx$J4IM}MQ%"%I%l%9$r=q$$$F$*$/$3$H$,$G$-$^(B -$B$9!#(B - -@item display -@cindex display -@code{(display . MODE)} $B$N$h$&$JMWAG$O!"%0%k!<%W$KF~$k$H$-$K$I$N5-;v$rI=(B -$B<($9$k$+$r;XDj$7$^$9!#M-8z$JCM$O!"(B - -@table @code -@item all -$BL$FI!"4{FI5-;v$NN>J}$rA4$FI=<($7$^$9!#(B - -@item default -$B=i4|@_Dj$G$NI=<(5-;v$rI=<($7$^$9!#$3$l$ODL>o$OL$FI5-;v$H0uIU$-5-;v$G$9!#(B - -@item $BG[Ns(B -$B=R8l$rK~B-$9$k$h$&$K5-;v$rI=<($7$^$9!#(B - -$B$$$/$D$+Nc$r5s$2$^$9(B: - -@table @code -@item [read] -$B4{FI$N5-;v$@$1$rI=<($7$^$9!#(B - -@item [not expire] -$B4|8B@Z$l>C5n2DG=$J5-;v0J30$N$9$Y$F$rI=<($7$^$9!#(B - -@item [and (not reply) (not expire)] -$B4|8B@Z$l>C5n2DG=$H$9$G$KJV?.$7$?5-;v0J30$N$9$Y$F$rI=<($7$^$9!#(B -@end table - -$BMxMQ$G$-$k1i;;;R$O(B @code{not}$B!"(B@code{and} $B$*$h$S(B @code{or} $B$G$9!#=R8l(B -$B$O(B @code{read}$B!"(B@code{dormant}$B!"(B@code{expire}$B!"(B@code{reply}$B!"(B -@code{killed}$B!"(B@code{bookmark}$B!"(B@code{score}$B!"(B@code{save}$B!"(B@code{cache}$B!"(B -@code{forward}$B!"(B@code{seen} $B$*$h$S(B @code{recent} $B$r4^$_$^$9!#(B -@end table - -@code{display} $B%Q%i%a!<%?$O!"35N,%P%C%U%!$r;XDj$7$?0lIt$NAH$@$1$K@)8B$9(B -$B$k$h$&$KF/$-$^$9!#@)8B$r%9%?%C%/$+$ipJs$r3JG<$9$k>l=j$rDs6!$7$^$9!#(B - -@ignore -@item charset -@cindex charset -Elements that look like @code{(charset . iso-8859-1)} will make -@code{iso-8859-1} the default charset; that is, the charset that will be -used for all articles that do not specify a charset. - -See also @code{gnus-group-charset-alist}. - -@item ignored-charsets -@cindex ignored-charsets -Elements that look like @code{(ignored-charsets x-unknown iso-8859-1)} -will make @code{iso-8859-1} and @code{x-unknown} ignored; that is, the -default charset will be used for decoding articles. - -See also @code{gnus-group-ignored-charsets-alist}. -@end ignore -@item posting-style -@cindex posting-style -$B$3$N%0%k!<%W$NDI2C$NEj9FMM<0$r$3$3$N$_$KJ]B8$9$k$3$H$,$G$-$^(B -$B$9(B (@pxref{Posting Styles})$B!#=q<0$O(B @code{gnus-posting-style} $BO"A[%j%9%H(B -$B$HF1$8$G$9$,!"$3$3$K$O%0%k!<%WL>$K9gCW$9$k@55,I=8=$O$"$j$^$;$s(B ($BEvA3$G(B -$B$9(B)$B!#$3$N%0%k!<%W$NMM<0$NMWAG$O(B @code{gnus-posting-styles} $B$G8+$D$+$C$?(B -$B$b$N$h$j$bM%@h$5$l$^$9!#(B - -$BNc$($P!"$3$N%0%k!<%W$N$_!"$+$C$3$$$$L>A0$H=pL>$K$7$?$$$J$i!"(B -@code{gnus-posting-styles} $B$r$$$8$i$:$K!"$3$N$h$&$J$b$N$r%0%k!<%W%Q%i%a!<(B -$B%?$KF~$l$k$3$H$,$G$-$^$9(B: - -@example -(posting-style - (name "Funky Name") - (signature "Funky Signature")) -@end example - -@item post-method -@cindex post-method -$B$b$7$3$l$,@_Dj$5$l$F$$$k$H!"%a%C%;!<%8$rAw?.$9$k$?$a$NA*BrJ}K!$H$7(B -$B$F(B @code{gnus-post-method} $B$NBe$o$j$K;H$o$l$^$9!#(B - -@item banner -@cindex banner -@code{(banner . "regex")} $B$N$h$&$J9`L\$O!"5-;v$N$9$Y$F$N>l=j$G@55,I=(B -$B8=(B "regex" $B$K%^%C%A$9$k$b$N$r:o=|$7$^$9!#(B"regex" $B$NBe$o$j$K%7%s%\(B -$B%k(B @code{signature} ($B:G8e$N=pL>$r:o(B -$B=|(B) $B$dO"A[%j%9%H(B @code{gnus-article-banner-alist} $B$N3FMWAG$r;H$&$3$H$b$G(B -$B$-$^$9!#(B - -@item (@var{variable} @var{form}) -$B%0%k!<%W$KF~$k$H$-$K!"$=$N%0%k!<%W%m!<%+%k$NJQ?t$r@_Dj$9$k%0%k!<%W%Q%i%a!<(B -$B%?$r;HMQ$9$k$3$H$,$G$-$^$9!#(B@samp{news.answers} $B$K$*$$$F%9%l%C%II=<($r9T(B -$B$$$?$/$J$$$H$-$O!"$=$N%0%k!<%W$K%0%k!<%W%Q%i%a!<%?(B -$B$K(B @code{(gnus-show-threads nil)} $B$H=q$1$^$9!#(B -@code{gnus-show-threads} $B$O!"$=$N35N,%P%C%U%!$NCf$N%m!<%+%kJQ?t$K$J$j!"(B -form $B$N(B @code{nil} $B$O$=$3$GI>2A$5$l$^$9!#(B - -$B$3$l$O$b$7I,MW$G$"$l$P!"%0%k!<%WKh$N%U%C%/4X?t$H$7$F$b;HMQ$G$-$^$9!#$b$7(B -$B$"$k%0%k!<%W$KF~$C$?$H$-$K%S!<%W2;$rLD$i$7$?$1$l$P!"$=$N%0%k!<%W$N%Q%i%a!<(B -$B%?$K(B @code{(dummy-variable (ding))} $B$_$?$$$J$b$N$r=q$$$F$*$/$3$H$b$G$-$^(B -$B$9!#(B@code{dummy-variable} $B$H$$$&JQ?t$K(B @code{(ding)} $B$NI>2A7k2L$,@_Dj$5(B -$B$l$^$9$,!"$^$"!"C/$b5$$K$7$J$$$G$7$g(B? -@end table - -$B%0%k!<%W%Q%i%a!<%?$N=$@5$K$O(B @kbd{G p} $B$+(B @kbd{G c} $BL?Na$r;H$C$F$/$@$5(B -$B$$(B (@kbd{G p} $B$O(B Lisp $B%Y!<%9$N!"(B@kbd{G c} $B$O(B Custom $B$U$&$N%$%s%?!<%U%'!<(B -$B%9$rDs6!$7$^$9(B)$B!#%H%T%C%/%Q%i%a!<%?$K$D$$$FFI$s$G$_$k$3$H$bLLGr$$$G$7$g(B -$B$&(B (@pxref{Topic Parameters})$B!#(B - -$B%0%k!<%W%Q%i%a!<%?$O(B @code{gnus-parameters} $BJQ?t$r2p:_$7$F@_Dj$9$k$3$H$b(B -$B$G$-$^$9!#$G$b$$$/$D$+$N%Q%i%a!<%?!"Nc$($P(B @code{visible} $B$O8zNO$rH/4x$7(B -$B$^$;$s!#Nc$G$9!#(B - -@example -(setq gnus-parameters - '(("mail\\..*" - (gnus-show-threads nil) - (gnus-use-scoring nil) - (gnus-summary-line-format - "%U%R%z%I%(%[%d:%ub%-23,23f%]%) %s\n") - (gcc-self . t) - (display . all)) - - ("^nnimap:\\(foo.bar\\)$" - (to-group . "\\1")) - - ("mail\\.me" - (gnus-use-scoring t)) - - ("list\\..*" - (total-expire . t) - (broken-reply-to . t)))) -@end example - -$BJ8;zNs$NCM$O!"(B@code{to-group} $B$NNc$,<($9$h$&$K!"@55,I=8=$K$h$kCV$-49$($r(B -$B.$5$$%l%Y%k$N%0(B -$B%k!<%W$N$_$rI=<($7$^$9!#=i4|@_Dj$G$O!"$3$l$O%l%Y%k(B 5 ($B$D$^(B -$B$j(B @code{gnus-group-default-list-level}) $B$+$=$l$h$j>.$5$$%l%Y%k(B ($B$9$J$o(B -$B$A9XFI$7$F$$$k%0%k!<%W$N$_(B) $B$rI=<($7$^$9!#(B - -@item L -@itemx A u -@kindex A u (Group) -@kindex L (Group) -@findex gnus-group-list-all-groups -$BL$FI5-;v$N$"$k$J$7$K4X$o$i$:!"A4$F$N%0%k!<%W$rI=<($7$^(B -$B$9(B (@code{gnus-group-list-all-groups})$B!#?t;z@\F,0z?t$r;HMQ$9$k$H!"$3$N%3(B -$B%^%s%I$O0z?t$N?t$+$=$l$h$j$b>.$5$$%l%Y%k$N%0%k!<%W$N$_$rI=<($7$^$9!#=i4|(B -$B@_Dj$G$O(B 7 $B$+$=$l$h$j$b>.$5$$%l%Y%k$N%0%k!<%W(B ($B$9$J$o$A9XFI!"Hs9XFI$N%0(B -$B%k!<%W$N$_(B) $B$,I=<($5$l$^$9!#(B - -@item A l -@kindex A l (Group) -@findex gnus-group-list-level -$B$"$kFCDj$N%l%Y%k$NL$FI5-;v$N$"$k%0%k!<%W$rI=<($7$^(B -$B$9(B (@code{gnus-group-list-level})$B!#@\F,<-$rM?$($k$H!"L$FI5-;v$N$J$$%0%k!<(B -$B%W$b4^$a$FI=<($7$^$9!#(B - -@item A k -@kindex A k (Group) -@findex gnus-group-list-killed -kill $B$5$l$?%0%k!<%W$rA4$FI=<($7$^$9(B (@code{gnus-group-list-killed})$B!#@\(B -$BF,0z?t$rM?$($k$H!"8=:_9XFI!"Hs9XFI$H$J$C$F$$$J$$A4$F$NMxMQ2DG=$J%0%k!<%W(B -$B$rI=<($7$^$9!#$3$l$O%5!<%P$+$i%"%/%F%#%V%U%!%$%k$rFI$`$3$H$K$J$k$G$7$g$&!#(B - -@item A z -@kindex A z (Group) -@findex gnus-group-list-zombies -$BA4$F$N%>%s%S%0%k!<%W$rI=<($7$^$9(B (@code{gnus-group-list-zombies})$B!#(B - -@item A m -@kindex A m (Group) -@findex gnus-group-list-matching -$B@55,I=8=$K9gCW$9$kL>A0$r;}$D%0%k!<%W$G!"L$FI5-;v$N$"$k9XFI%0%k!<%W$rA4$F(B -$BI=<($7$^$9(B (@code{gnus-group-list-matching})$B!#(B - -@item A M -@kindex A M (Group) -@findex gnus-group-list-all-matching -$B@55,I=8=$K9gCW$9$k%0%k!<%W$rI=<($9(B -$B$k(B (@code{gnus-group-list-all-matching})$B!#(B - -@item A A -@kindex A A (Group) -@findex gnus-group-list-active -$B:#@\B3$7$F$$$k%5!<%P$N%"%/%F%#%V%U%!%$%k$K$"$k%0%k!<%W$r!"K\Ev$KA4ItI=<((B -$B$7$^$9(B (@code{gnus-group-list-active})$B!#$3$l$O$7$P$i$/;~4V$,$+$+$k$3$H$b(B -$BM-$jF@$^$9!#$?$V$s(B @kbd{A M} $B$r/3d$j0z$$$FA0$r;}$D%0%k!<%W$rA4$FI=<($9(B -$B$k(B (@code{gnus-group-apropos})$B!#(B - -@item A d -@kindex A d (Group) -@findex gnus-group-description-apropos -$B@55,I=8=$K9gCW$9$kL>A0$+@bL@J8$r;}$D%0%k!<%W$rA4$FI=<($9(B -$B$k(B (@code{gnus-group-description-apropos})$B!#(B - -@item A c -@kindex A c (Group) -@findex gnus-group-list-cached -$B%-%c%C%7%e5-;v$r;}$D%0%k!<%W$rA4$FI=<($9(B -$B$k(B (@code{gnus-group-list-cached})$B!#(B - -@item A ? -@kindex A ? (Group) -@findex gnus-group-list-dormant -$BJ]N15-;v$r;}$D%0%k!<%W$rA4$FI=<($9$k(B (@code{gnus-group-list-dormant})$B!#(B - -@item A / -@kindex A / (Group) -@findex gnus-group-list-limit -$B8=:_$NA*Br$5$l$?HO0O$K8BDj$7$?%0%k!<%W$rI=<($9(B -$B$k(B (@code{gnus-group-list-limit})$B!#(B - -@item A f -@kindex A f (Group) -@findex gnus-group-list-flush -$B8=:_$NA*Br$5$l$?%0%k!<%W$r=q$-=P$9(B (@code{gnus-group-list-flush})$B!#(B - -@item A p -@kindex A p (Group) -@findex gnus-group-list-plus -$B8=:_$NA*Br$5$l$?%0%k!<%W$r2C$($?%0%k!<%W$rI=<($9(B -$B$k(B (@code{gnus-group-list-plus})$B!#(B -@end table - -@vindex gnus-permanently-visible-groups -@cindex visible group parameter -@code{gnus-permanently-visible-groups} $B@55,I=8=$K9gCW$9$k%0%k!<%W$O!"L$(B -$BFI5-;v$,$"$k$+$J$$$+$K4X$o$i$:>o$KI=<($5$l$^$9!#$"$k$$$O%0%k!<%W%Q%i%a!<(B -$B%?$K$*$$$F(B @code{visible} $BMWAG$rDI2C$9$k$3$H$G$bF1MM$N8z2L$rF@$k$3$H$,$G(B -$B$-$^$9!#(B - -@vindex gnus-list-groups-with-ticked-articles -$B0uIU$-$N5-;v$N$_$r;}$D%0%k!<%W$ODL>o%0%k!<%W%P%C%U%!$KI=<($5$l$^$9!#$b(B -$B$7(B @code{gnus-list-groups-with-ticked-articles} $B$,(B @code{nil} $B$G$"$l$P!"(B -$B$=$N%0%k!<%W$O40A4$K6u$N%0%k!<%W$G$"$k$+$N$h$&$K07$o$l$^$9!#=i4|CM(B -$B$O(B @code{t} $B$G$9!#(B - -@node Sorting Groups -@section $B%0%k!<%W$N%=!<%H(B -@cindex sorting groups - -@kindex C-c C-s (Group) -@findex gnus-group-sort-groups -@vindex gnus-group-sort-function -@kbd{C-c C-s} (@code{gnus-group-sort-groups}) $BL?Na$O!"%0%k!<%W%P%C%U%!(B -$B$r(B @code{gnus-group-sort-function} $BJQ?t$GM?$($i$l$k4X?t$K=>$C$FJB$YBX$((B -$B$^$9!#MxMQ2DG=$JJB$YBX$(4X?t(B (sorting function) $B$K$O0J2<$N$b$N$,$"$j$^(B -$B$9(B: - -@table @code -@item gnus-group-sort-by-alphabet -@findex gnus-group-sort-by-alphabet -$B%0%k!<%WL>$G%"%k%U%!%Y%C%H=g$KJB$YBX$($^$9!#$3$l$,=i4|@_Dj$G$9!#(B - -@item gnus-group-sort-by-real-name -@findex gnus-group-sort-by-real-name -$B%0%k!<%W$rK\Ev$N(B ($BA0$K2?$b$D$$$F$$$J$$(B) $B%0%k!<%WL>$G%"%k%U%!%Y%C%H=g$KJB(B -$B$YJQ$($^$9!#(B - -@item gnus-group-sort-by-level -@findex gnus-group-sort-by-level -$B%0%k!<%W%l%Y%k$GJB$YBX$($^$9!#(B - -@item gnus-group-sort-by-score -@findex gnus-group-sort-by-score -$B%0%k!<%W$N%9%3%"$GJB$YBX$($^$9!#(B@xref{Group Score}. - -@item gnus-group-sort-by-rank -@findex gnus-group-sort-by-rank -$B%0%k!<%W$N%9%3%"$GJB$YBX$(!"$N%"%k%U%!%Y%C%H=g$GJB$YBX$($^$9!#(B -@end table - -@code{gnus-group-sort-function} $B$OJB$YBX$(4X?t$N%j%9%H$G$"$C$F$b9=$$$^$;(B -$B$s!#$3$N>l9g!"$b$C$H$b=EMW$JJB$YBX$($N80$r;}$D4X?t$O:G8e$G$J$/$F$O$J$j$^(B -$B$;$s!#(B - -$B$"$k@\JB$YBX$($kL?Na$b$$$/$D$+$"$j$^$9!#(B - -@table @kbd -@item G S a -@kindex G S a (Group) -@findex gnus-group-sort-groups-by-alphabet -$B%0%k!<%W%P%C%U%!$r%0%k!<%WL>$N%"%k%U%!%Y%C%H=g$GJB$YBX$($^(B -$B$9(B (@code{gnus-group-sort-groups-by-alphabet})$B!#(B - -@item G S u -@kindex G S u (Group) -@findex gnus-group-sort-groups-by-unread -$B%0%k!<%W%P%C%U%!$rL$FI5-;v$N?t$GJB$YBX$($^(B -$B$9(B (@code{gnus-group-sort-groups-by-unread})$B!#(B - -@item G S l -@kindex G S l (Group) -@findex gnus-group-sort-groups-by-level -$B%0%k!<%W%P%C%U%!$r%0%k!<%W%l%Y%k$GJB$YBX$($^(B -$B$9(B (@code{gnus-group-sort-groups-by-level})$B!#(B - -@item G S v -@kindex G S v (Group) -@findex gnus-group-sort-groups-by-score -$B%0%k!<%W%P%C%U%!$r%0%k!<%W$N%9%3%"$GJB$YBX$($^(B -$B$9(B (@code{gnus-group-sort-groups-by-score})$B!#(B@xref{Group Score}. - -@item G S r -@kindex G S r (Group) -@findex gnus-group-sort-groups-by-rank -$B%0%k!<%W%P%C%U%!$r%0%k!<%W$N%i%s%/$GJB$YBX$($^(B -$B$9(B (@code{gnus-group-sort-groups-by-rank})$B!#(B@xref{Group Score}. - -@item G S m -@kindex G S m (Group) -@findex gnus-group-sort-groups-by-method -$B%0%k!<%W%P%C%U%!$r%P%C%/%(%s%I$NL>A0$G%"%k%U%!%Y%C%H=g$KJB$YBX$($^(B -$B$9(B (@code{gnus-group-sort-groups-by-method})$B!#(B -@end table - -$B0J2<$NA4$F$NL?Na$O%W%m%;%9(B/$B@\F,<-$N=,47$K=>$$$^(B -$B$9(B (@pxref{Process/Prefix})$B!#(B - -$B%7%s%\%k@\F,<-(B (@pxref{Symbolic Prefixes}) $B$,M?$($i$l$?$H$-$O!"$3$l$iA4(B -$B$F$NL?Na$O5U=g$GJB$S49$($^$9!#(B - -$B$^$?!"%0%k!<%W$N0lIt$rJB$YBX$($k$3$H$b$G$-$^$9!#(B - -@table @kbd -@item G P a -@kindex G P a (Group) -@findex gnus-group-sort-selected-groups-by-alphabet -$B%0%k!<%W$r!"%0%k!<%WL>$N%"%k%U%!%Y%C%H=g$GJB$YBX$($^(B -$B$9(B (@code{gnus-group-sort-selected-groups-by-alphabet})$B!#(B - -@item G P u -@kindex G P u (Group) -@findex gnus-group-sort-selected-groups-by-unread -$B%0%k!<%W$r!"L$FI5-;v$N?t$GJB$YBX$($^(B -$B$9(B (@code{gnus-group-sort-selected-groups-by-unread})$B!#(B - -@item G P l -@kindex G P l (Group) -@findex gnus-group-sort-selected-groups-by-level -$B%0%k!<%W$r!"%0%k!<%W%l%Y%k$GJB$YBX$($^(B -$B$9(B (@code{gnus-group-sort-selected-groups-by-level})$B!#(B - -@item G P v -@kindex G P v (Group) -@findex gnus-group-sort-selected-groups-by-score -$B%0%k!<%W$r!"%0%k!<%W$N%9%3%"$GJB$YBX$($^(B -$B$9(B (@code{gnus-group-sort-selected-groups-by-score})$B!#(B -@xref{Group Score}. - -@item G P r -@kindex G P r (Group) -@findex gnus-group-sort-selected-groups-by-rank -$B%0%k!<%W$r!"%0%k!<%W$N%i%s%/$GJB$YBX$($^(B -$B$9(B (@code{gnus-group-sort-selected-groups-by-rank})$B!#(B@xref{Group Score}. - -@item G P m -@kindex G P m (Group) -@findex gnus-group-sort-selected-groups-by-method -$B%0%k!<%W$r!"%P%C%/%(%s%I$NL>A0$G%"%k%U%!%Y%C%H=g$KJB$YBX$($^(B -$B$9(B (@code{gnus-group-sort-selected-groups-by-method})$B!#(B -@end table - -$B:G8e$K!"(B@kbd{C-k} $B$H(B @kbd{C-y} $B$r;H$C$F!"%s%S$H$7$F(B -$B9XFI$7$^$9!#(B - -@item C-c C-x -@kindex C-c C-x (Group) -@findex gnus-group-expire-articles -$B8=:_$N%0%k!<%W$N%(%/%9%Q%$%"5-;v$KBP$7$F(B ($B$b$7$"$l$P(B) $BA4$F%(%/%9%Q%$%"=h(B -$BM}$r9T$$$^$9(B (@code{gnus-group-expire-articles})$B!#$3$l$O!"$=$N%0%k!<%W$K(B -$B$7$P$i$/B8:_$7$F$$$?4|8B@Z$l:o=|2DG=$J$9$Y$F$N5-;v$r>C5n$9$k$H$$$&$3$H$G(B -$B$9!#(B(@pxref{Expiring Mail})$B!#(B - -@item C-c M-C-x -@kindex C-c M-C-x (Group) -@findex gnus-group-expire-all-groups -$BA4$F$N%0%k!<%W$NA4$F$N4|8B@Z$l:o=|2DG=$J5-;v$KBP$7$F!"%(%/%9%Q%$%"=hM}$r(B -$B9T$$$^$9!#(B(@code{gnus-group-expire-all-groups})$B!#(B -@end table - -@node Browse Foreign Server -@section $B30It%5!<%P$N1\Mw(B -@cindex foreign servers -@cindex browsing servers - -@table @kbd -@item B -@kindex B (Group) -@findex gnus-group-browse-foreign-server -$BA*BrJ}K!$H%5!<%PL>$rJ9$+$l$^$9!#(BGnus $B$O$3$N%5!<%P$K@\B3$7!"$=$3$K$"$k(B -$B%0%k!<%W$r1\Mw$7$h$&$H$7$^$9(B (@code{gnus-group-browse-foreign-server})$B!#(B -@end table - -@findex gnus-browse-mode -$BMxMQ2DG=$J%0%k!<%W$N%j%9%H$r;}$C$??7$7$$%P%C%U%!$,8=$l$^$9!#$3$N%P%C%U%!(B -$B$O(B @code{gnus-browse-mode} $B$r;HMQ$7$^$9!#$3$N%P%C%U%!$ODL>o$N%0%k!<%W%P%C(B -$B%U%!$K$A$g$C$H(B ($B$H$$$&$+!"$H$C$F$b(B) $B;w$F$$$^$9!#(B - -$B0J2<$,1\Mw%b!<%I(B (browse mode) $B$G;HMQ$G$-$k%-!l9g$O9XFI$9$k$3$H$K$J$k$N$@$1$l(B -$B$I(B (@code{gnus-browse-unsubscribe-current-group})$B!#(B - -@item l -@itemx q -@kindex q (Browse) -@kindex l (Browse) -@findex gnus-browse-exit -$B1\Mw%b!<%I(B (browse mode) $B$r=*N;$7$^$9(B (@code{gnus-browse-exit})$B!#(B - -@item ? -@kindex ? (Browse) -@findex gnus-browse-describe-briefly -$B1\Mw%b!<%I(B (browse mode) $B$r4JC1$K@bL@$7$^$9(B ($B$^$"!"Bg$7$F@bL@$9$k$3$H$b(B -$B$J$$$s$@$1$I$5(B) (@code{gnus-browse-describe-briefly})$B!#(B -@end table - -@node Exiting gnus -@section Gnus $B$N=*N;(B -@cindex exiting gnus - -$B$=$&!"(Bgnus $B$O:G8e(B ($B%5%$%3!<(B) $B$G$9(B ($BLuCm(B: $B$/!"6l$7$$!#(B -$B86J8$O(B ``Yes, gnus is ex(c)iting.'')$B!#(B - -@table @kbd -@item z -@kindex z (Group) -@findex gnus-group-suspend -Gnus $B$rCfCG$7$^$9(B (@code{gnus-group-suspend})$B!#$3$l$O(B gnus $B$rC$9$@$1$G$9!#KM$O$3$l$N(B -$B$&$l$7$5$,$h$/$o$+$s$J$$$s$@$1$I!"C/$+J,$+$k?M$$$k(B? - -@item q -@kindex q (Group) -@findex gnus-group-exit -@c @icon{gnus-group-exit} -Gnus $B$r=*N;$7$^$9(B(@code{gnus-group-exit})$B!#(B - -@item Q -@kindex Q (Group) -@findex gnus-group-quit -@file{.newsrc} $B%U%!%$%k$r%;!<%V$;$:$K(B gnus $B$r=*N;$7$^(B -$B$9(B (@code{gnus-group-quit})$B!#%I%j%V%k%U%!%$%k$O%;!<%V$5$l$^$9$1(B -$B$I(B (@pxref{Auto Save})$B!#(B -@end table - -@vindex gnus-exit-gnus-hook -@vindex gnus-suspend-gnus-hook -Gnus $B$rCfCG$9$k$H$-$O(B @code{gnus-suspend-gnus-hook} $B$,8F$S=P$5$l$^$9!#(B -Gnus$B$r=*N;$9$k$H$-$O(B @code{gnus-exit-gnus-hook} $B$,8F$S=P$5$l!"$5$i(B -$B$K(B gnus $B$r=*N;$9$k$H$-$N:G8e$H$7(B -$B$F(B @code{gnus-after-exiting-gnus-hook} $B$,8F$S=P$5$l$^$9!#(B - -@findex gnus-unload -@cindex unloading -$B$b$7(B gnus $B$H$=$l$K4XO"$9$k$b$N$r40A4$K=hJ,$7$?$$$N$G$"$l$P!"(B -@code{gnus-unload} $B%3%^%s%I$,;H$($^$9!#$3$N%3%^%s%I$O!"%a%?JQ?t$r%+%9%?(B -$B%^%$%:$7$h$&$H$7$F$$$k$H$-$K$bJXMx$G$9!#(B - -Note: - -@quotation -$B%_%9(B Lisa Cannifax $B$O1Q8l$N/G/$,H`=w$N%W%i%9%F%#%C(B -$B%/$N0X;R$NGX1[$7$K!"1tI.$G7+$jJV$7@~$rIA$/$N$K$D$i$l$F!"B-$,$7$S$l$F=E$/(B -$B$J$j!"0U<1$,[/[0$H$7$F$-$^$7$?!#(B -@end quotation - -@node Group Topics -@section Group Topics -@cindex topics - -$B$b$7$"$J$?$,$?!<$/$5$s$N%0%k!<%W$rFI$s$G$$$k$N$G$"$l$P!"%0%k!<%W$r%H%T%C(B -$B%/Kh$K3,AXJ,$1$G$-$k$HJXMx$G$7$g$&!#(BEmacs $B$N%0%k!<%W$r$3$C$A$X!"%;%C%/%9(B -$B$N%0%k!<%W$r$"$C$A$X!"$G!";D$j$r(B ($B$((B? $B%0%k!<%W$,Fs(B $B$D$/$i$$$7$+$J$$(B -$B$N(B?) $B$N%;%/%7%g%s$KF~$l$^$7$g$&!#$"$k$$(B -$B$O(B Emacs $B%;%C%/%9$N%0%k!<%W$r(B Emacs $B%0%k!<%W!"%;%C%/%9%0%k!<%W$N$I$A$i$+(B -$B$NI{%H%T%C%/$H$9$k$3$H$5$($b$G$-$^$9!=!=$"$k$$$ON>J}$K(B! $B$9$s$4$$$G$7$g$&(B! - -@iftex -@iflatex -\gnusfigure{Group Topics}{400}{ -\put(75,50){\epsfig{figure=tmp/group-topic.ps,height=9cm}} -} -@end iflatex -@end iftex - -$B$3$l$,Nc$G$9(B: - -@example -Gnus - Emacs -- $B$3$$$D$O$9$2!<$<(B! - 3: comp.emacs - 2: alt.religion.emacs - $B$($C$A$J(B Emacs - 452: alt.sex.emacs - 0: comp.talk.emacs.recovery - $B$=$NB>(B - 8: comp.binaries.fractals - 13: comp.sources.unix -@end example - -@findex gnus-topic-mode -@kindex t (Group) -$B$3$N(B@emph{$BAG@2$i$7$$(B}$B5!G=$r;H$&$K$O!"(B@code{gnus-topic} $B%^%$%J!<%b!<%I(B -$B$r(B ($B2?$H(B!) $BC1$K%9%$%C%A%*%s$9$k$@$1!=!=%0%k!<%W%P%C%U%!$G!"(B@kbd{t} $B$r2!(B -$B$7$F$/$@$5$$(B ($B$3$l$O%H%0%k%3%^%s%I$G$9(B)$B!#(B - -$B$5$"$d$C$F$_$h$&!#$H$K$+$/;n$7$F$_$F!#7/$,La$C$F$/$k$^$G!"KM$O$3$3$GBT$C(B -$B$F$k$+$i$5!#%i%i!"%?%i%i%s!D$s!"$$$$6J$@$M!"$3$l!D%i!"%i!"%i!D$((B? $BLa$C$F(B -$B$-$?(B? $B$h$7!"$8$cv$^$l$^$9!#$3$l!"$H$C$F$b%9%F%-$@(B -$B$H;W$&$s$@$1$I!#(B - -@vindex gnus-topic-line-format -$B%H%T%C%/9T$O!"(B@code{gnus-topic-line-format} $BJQ?t$NCM$K=>$C$F:n@.$5$l$^(B -$B$9(B (@pxref{Formatting Variables})$B!#M-8z$JMWAG$O!"(B - -@table @samp -@item i -$B;z2<$2!#(B -@item n -$B%H%T%C%/L>!#(B -@item v -$B8+$($k$+$I$&$+!#(B -@item l -$B%l%Y%k!#(B -@item g -$B%H%T%C%/Cf$N%0%k!<%W$N?t!#(B -@item a -$B%H%T%C%/Cf$NL$FI5-;v$N?t!#(B -@item A -$B%H%T%C%/$HA4$F$NI{%H%T%C%/$NL$FI5-;v$N?t!#(B -@end table - -@vindex gnus-topic-indent-level -$B3FI{%H%T%C%/(B ($B$HI{%H%T%C%/Fb$N%0%k!<%W(B) $B$O!"%H%T%C%/%l%Y%k?t(B -$B$N(B @code{gnus-topic-indent-level} $BG\$N6uGrJ,$N;z2<$2$,9T$o$l$^$9!#=i4|CM(B -$B$O(B 2 $B$G$9!#(B - -@vindex gnus-topic-mode-hook -@code{gnus-topic-mode-hook} $B$O%H%T%C%/%^%$%J!<%b!<%I%P%C%U%!$G8F$S=P$5$l(B -$B$^$9!#(B - -@vindex gnus-topic-display-empty-topics -@code{gnus-topic-display-empty-topics} $B$O%H%T%C%/$NCf$KL$FI5-;v$,L5$$>l(B -$B9g$G$b$=$N%H%T%C%/$rI=<($9$k$h$&$K$7$^$9!#=i4|CM$O(B @code{t} $B$G$9!#(B - -@node Topic Commands -@subsection $B%H%T%C%/L?Na(B -@cindex topic commands - -$B%H%T%C%/%^%$%J!<%b!<%I$,M-8z$G$"$k$H$-$O!"(B@kbd{T} $B%5%V%^%C%W$,?7$7$/MxMQ(B -$B$G$-$k$h$&$K$J$j$^$9!#$5$i$KI8=`%-!<$NCf$G$b!"Dj5A$,$A$g$C$HJQ$o$k$b$N$,(B -$B>/$7$"$j$^$9!#(B - -@table @kbd -@item T n -@kindex T n (Topic) -@findex gnus-topic-create-topic -$B?7$7$$%H%T%C%/$NL>A0$r%W%m%s%W%HF~NO$7!"$=$l$r:n@.$7$^(B -$B$9(B (@code{gnus-topic-create-topic})$B!#(B - -@item T m -@kindex T m (Topic) -@findex gnus-topic-move-group -$B8=:_$N%0%k!<%W$r!"$I$3$+B>$N%H%T%C%/$K0\F0$5$;$^(B -$B$9(B (@code{gnus-topic-move-group})$B!#$3$N%3%^%s%I$O%W%m%;%9%^!<%/!&%W%l%U%#%C(B -$B%/%9%k!<%k$K=>$$$^$9(B (@pxref{Process/Prefix})$B!#(B - -@item T j -@kindex T j (Topic) -@findex gnus-topic-jump-to-topic -$B%H%T%C%/$K%8%c%s%W$7$^$9(B (@code{gnus-topic-jump-to-topic})$B!#(B - -@item T c -@kindex T c (Topic) -@findex gnus-topic-copy-group -$B8=:_$N%0%k!<%W$r!"$I$3$+B>$N%H%T%C%/$K%3%T!<$7$^(B -$B$9(B (@code{gnus-topic-copy-group})$B!#$3$N%3%^%s%I$O%W%m%;%9%^!<%/!&%W%l%U%#%C(B -$B%/%9%k!<%k$K=>$$$^$9(B (@pxref{Process/Prefix})$B!#(B - -@item T h -@kindex T h (Topic) -@findex gnus-topic-hide-topic -$B8=:_$N%H%T%C%/$r1#$7$^$9!#$b$7%W%l%U%#%C%/%9$,M?$($i$l$?$J$i!"$=$N%H%T%C(B -$B%/$r1J5W$K1#$7$^$9!#(B - -@item T s -@kindex T s (Topic) -@findex gnus-topic-show-topic -$B8=:_$N%H%T%C%/$rI=<($7$^$9!#$b$7%W%l%U%#%C%/%9$,M?$($i$l$?$J$i!"$=$N%H%T%C(B -$B%/$r1J5W$KI=<($7$^$9!#(B - -@item T D -@kindex T D (Topic) -@findex gnus-topic-remove-group -$B%0%k!<%W$r8=:_$N%H%T%C%/$+$i:o=|$7$^$9(B (@code{gnus-topic-remove-group})$B!#(B -$B$3$NL?Na$Ol9g$O!"(Bgnus $B$O$"$J$?$,$$$^$9(B (@pxref{Process/Prefix})$B!#(B - -@item T M -@kindex T M (Topic) -@findex gnus-topic-move-matching -$B@55,I=8=$K%^%C%A$9$kA4$F$N%0%k!<%W$r!"$"$k%H%T%C%/$K0\F0$5$;$^(B -$B$9(B (@code{gnus-topic-move-matching})$B!#(B - -@item T C -@kindex T C (Topic) -@findex gnus-topic-copy-matching -$B@55,I=8=$K%^%C%A$9$kA4$F$N%0%k!<%W$r!"$"$k%H%T%C%/$K%3%T!<$7$^(B -$B$9(B (@code{gnus-topic-copy-matching})$B!#(B - -@item T h -@kindex T h (Topic) -@findex gnus-topic-toggle-display-empty-topics -$B6u$N%H%T%C%/$NI=<(!&HsI=<($r@Z$jBX$($^(B -$B$9(B (@code{gnus-topic-toggle-display-empty-topics})$B!#(B - -@item T # -@kindex T # (Topic) -@findex gnus-topic-mark-topic -$B8=:_$N%H%T%C%/$K$"$k%0%k!<%WA4$F$K%W%m%;%9%^!<%/$r$D$1$^(B -$B$9(B (@code{gnus-topic-mark-topic})$B!#(B - -@item T M-# -@kindex T M-# (Topic) -@findex gnus-topic-unmark-topic -$B8=:_$N%H%T%C%/$K$"$kA4$F$N%0%k!<%W$+$i%W%m%;%9%^!<%/$r>C$7$^(B -$B$9(B (@code{gnus-topic-unmark-topic})$B!#(B - -@item T TAB -@itemx TAB -@kindex T TAB (Topic) -@kindex TAB (Topic) -@findex gnus-topic-indent -$B8=:_$N%H%T%C%/$N(B ``$B;z2<$2(B'' $B$r9T$$!"$=$NA0$N%H%T%C%/$NI{%H%T%C%/$K$7$^(B -$B$9(B (@code{gnus-topic-indent})$B!#@\F,0z?t$rM?$($k$H!"H?BP$K$=$N%H%T%C%/$N(B -$B;z2<$2$rLa$7$^$9!#(B - -@item M-TAB -@kindex M-TAB (Topic) -@findex gnus-topic-unindent -$B8=:_$N%H%T%C%/$N(B ``$B;z2<$22sI|(B'' (un-indent) $B$r9T$$!"$=$l$,8=:_$N?F$N?F$N(B -$BI{%H%T%C%/$K$J$k$h$&$K$7$^$9(B (@code{gnus-topic-unindent})$B!#(B - -@item RET -@kindex RET (Topic) -@findex gnus-topic-select-group -@itemx SPACE -$B%0%k!<%W$rA*Br$9$k$+!"$"$k$$$O%H%T%C%/$r@^$j$?$?$_$^(B -$B$9(B (@code{gnus-topic-select-group})$B!#%0%k!<%W$N>e$G$3$N%3%^%s%I$roDL$j$=$N%0%k!<%W$KF~$j$^$9!#%H%T%C%/9T$N>e$G9T$&$H!"$=$N%H%T%C(B -$B%/$O(B ($B4{$KI=<($5$l$F$$$k$H$-$O(B) $B@^$j$?$?$^$l$k$+!"(B($B4{$K@^$j$?$?$^$l$F$$(B -$B$k$H$-$O(B) $BE83+$5$l$^$9!#$D$^$j%H%T%C%/$KBP$7$F$O$3$l$O%H%0%k%3%^%s%I$G$9!#(B -$B$5$i$K!"?t;z%W%l%U%#%C%/%9$rM?$($k$H!"$=$N%l%Y%k(B ($B$H$=$l$h$j$b>.$5$$%l%Y(B -$B%k(B) $B$N%0%k!<%W$,I=<($5$l$^$9!#(B - -@item C-c C-x -@kindex C-c C-x (Topic) -@findex gnus-topic-expire-articles -($B$b$7$"$l$P(B) $B8=:_$N%0%k!<%W$+%H%T%C%/$+$NA4$F$N;~8B>C5n2DG=5-;v$r;~8B>C(B -$B5n$7$^$9(B (@code{gnus-topic-expire-articles})$B!#(B(@pxref{Expiring Mail})$B!#(B - -@item C-k -@kindex C-k (Topic) -@findex gnus-topic-kill-group -$B%0%k!<%W$"$k$$$O%H%T%C%/$r(B kill $B$7$^$9(B (@code{gnus-topic-kill-group})$B!#(B -$B%H%T%C%/Fb$K$"$C$?%0%k!<%W$bA4$F!"%H%T%C%/$H0l=o$K:o=|$5$l$^$9!#(B - -@item C-y -@kindex C-y (Topic) -@findex gnus-topic-yank-group -$BD>A0$N(B kill $B$5$l$?%0%k!<%W$"$k$$$O%H%T%C%/$r(B yank $B$7$^(B -$B$9(B (@code{gnus-topic-yank-group})$B!#A4$F$N%H%T%C%/$O!"A4$F$N%0%k!<%W$NA0(B -$B$K(B yank $B$5$l$k$3$H$K5$$r$D$1$F$/$@$5$$!#(B - -@item T r -@kindex T r (Topic) -@findex gnus-topic-rename -$B%H%T%C%/$NL>A0$rJQ99$9$k(B (@code{gnus-topic-rename})$B!#(B - -@item T DEL -@kindex T DEL (Topic) -@findex gnus-topic-delete -$B6u$N%H%T%C%/$r:o=|$9$k(B (@code{gnus-topic-delete})$B!#(B - -@item A T -@kindex A T (Topic) -@findex gnus-topic-list-active -Gnus $B$,CN$C$F$$$k%H%T%C%/2=$5$l$?%0%k!<%W$rA4$FI=<($7$^(B -$B$9(B (@code{gnus-topic-list-active})$B!#(B - -@item G p -@kindex G p (Topic) -@findex gnus-topic-edit-parameters -@cindex group parameters -@cindex topic parameters -@cindex parameters -$B%H%T%C%/%Q%i%a!<%?$r=$@5$7$^$9(B (@code{gnus-topic-edit-parameters})$B!#(B -@xref{Topic Parameters}. -@end table - -@node Topic Sorting -@subsection $B%H%T%C%/$NJB$YBX$((B -@cindex topic sorting - -$B0J2<$K<($9L?Na$G!"3F%H%T%C%/Kh$KJL!9$K%0%k!<%W$rJB$YBX$($k$3$H$,$G$-$^$9(B: - -@table @kbd -@item T S a -@kindex T S a (Topic) -@findex gnus-topic-sort-groups-by-alphabet -$B8=:_$N%H%T%C%/$r%0%k!<%WL>$N%"%k%U%!%Y%C%H=g$KJB$YBX$($^(B -$B$9(B (@code{gnus-topic-sort-groups-by-alphabet})$B!#(B - -@item T S u -@kindex T S u (Topic) -@findex gnus-topic-sort-groups-by-unread -$B8=:_$N%H%T%C%/$rL$FI5-;v$N?t$GJB$YBX$($^(B -$B$9(B (@code{gnus-topic-sort-groups-by-unread})$B!#(B - -@item T S l -@kindex T S l (Topic) -@findex gnus-topic-sort-groups-by-level -$B8=:_$N%H%T%C%/$r%0%k!<%W$N%l%Y%k$GJB$YBX$($^(B -$B$9(B (@code{gnus-topic-sort-groups-by-level})$B!#(B - -@item T S v -@kindex T S v (Topic) -@findex gnus-topic-sort-groups-by-score -$B8=:_$N%H%T%C%/$r%0%k!<%W$N%9%3%"$GJB$YBX$($^(B -$B$9(B (@code{gnus-topic-sort-groups-by-score})$B!#(B@xref{Group Score}. - -@item T S r -@kindex T S r (Topic) -@findex gnus-topic-sort-groups-by-rank -$B8=:_$N%H%T%C%/$r%0%k!<%W$N%i%s%/$GJB$YBX$($^(B -$B$9(B (@code{gnus-topic-sort-groups-by-rank})$B!#(B@xref{Group Score}. - -@item T S m -@kindex T S m (Topic) -@findex gnus-topic-sort-groups-by-method -$B8=:_$N%H%T%C%/$r%P%C%/%(%s%I$NL>A0$G%"%k%U%!%Y%C%H=g$KJB$YBX$($^(B -$B$9(B (@code{gnus-topic-sort-groups-by-method})$B!#(B -@end table - -$B%0%k!<%W$N%=!<%H$K$D$$$F$N$5$i$J$k>pJs$O(B @xref{Sorting Groups} $B$r;2>H$7(B -$B$F$/$@$5$$!#(B - -@node Topic Topology -@subsection $B%H%T%C%/$N0LAj9=B$(B -@cindex topic topology -@cindex topology - -$B$=$l$G$O!"%0%k!<%W%P%C%U%!$NNc$r8+$F$$$-$^$7$g$&!#(B - -@example -Gnus - Emacs -- $B$3$$$D$O$9$2!<$<(B! - 3: comp.emacs - 2: alt.religion.emacs - $B$($C$A$J(B Emacs - 452: alt.sex.emacs - 0: comp.talk.emacs.recovery - $B$=$NB>(B - 8: comp.binaries.fractals - 13: comp.sources.unix -@end example - -$B$D$^$j!"$3$3$G$O0l$D$N%H%C%W%l%Y%k$N%H%T%C%/(B (@samp{Gnus}) $B$,$"$j!"$=$N(B -$B2<$KFs$D$N%H%T%C%/$,$"$j!"$=$N$&$A$N0lJ}$NI{%H%T%C%/Cf$K0l$DI{%H%T%C%/$,(B -$B$"$j$^$9(B ($B%H%C%W%l%Y%k%H%T%C%/$O>o$K0l$D$7$+$"$j$^$;$s(B)$B!#$3$N9=B$$O!"0J(B -$B2<$N$h$&$KI=8=$G$-$^$9(B: - -@lisp -(("Gnus" visible) - (("Emacs -- $B$3$$$D$O$9$2!<$<(B!" visible) - (("$B$($C$A$J(B Emacs" visible))) - (("$B$=$NB>(B" visible))) -@end lisp - -@vindex gnus-topic-topology -$B$3$l$Oe5-$NI=<($r9T$&$?$a$N!"JQ?t(B @code{gnus-topic-topology} $B$NCM(B -$B$=$N$b$N$J$N$G$9!#$3$NJQ?t$O(B @file{.newsrc.eld} $B%U%!%$%k$KJ]B8$5$l!"$N%9%?!<%H%"%C(B -$B%W%U%!%$%k$N@_Dj$K$OA4$/1F6A$rM?$($^$;$s!#(B - -$B$3$N9=B$$O!"$I$N%H%T%C%/$,$I$N%H%T%C%/$NI{%H%T%C%/$G$"$k$+$H!"$I$N%H%T%C(B -$B%/$,I=<($5$l$F$$$k$+$r<($7$F$$$^$9!#8=:_$OFs$D$N@_Dj(B -$BCM!=!=(B@code{visible} $B$H(B @code{invisible} $B$,5v$5$l$F$$$^$9!#(B - -@node Topic Parameters -@subsection $B%H%T%C%/%Q%i%a!<%?(B -@cindex topic parameters - -$B%H%T%C%/Fb$NA4$F$N%0%k!<%W$O%0%k!<%W%Q%i%a!<%?$r!"$=$N?F(B ($B$H@hAD(B) $B$N%H%T%C(B -$B%/%Q%i%a!<%?$+$i7Q>5$7$^$9!#%0%k!<%W%Q%i%a!<%?$H$7$F@5$7$$$b$N$OA4$F!"%H(B -$B%T%C%/%Q%i%a!<%?$H$7$F$b@5$7$$$b$N$G$9(B(@pxref{Group Parameters})$B!#(B - -$B$5$i$K!"0J2<$N%Q%i%a!<%?$O%H%T%C%/%Q%i%a!<%?$H$7$F$N$_M-8z$G$9(B: - -@table @code -@item subscribe -$B%H%T%C%/$G?7$7$$%0%k!<%W$r9XFI$7$F$$$k>l(B -$B9g(B (@pxref{Subscription Methods}), @code{subscribe} $B%H%T%C%/%Q%i%a!<%?$O(B -$B$I$N%0%k!<%W$,$I$N%H%T%C%/$K9T$/$+$r;XDj$7$^$9!#CM$O$=$N%H%T%C%/$K9T$/%0(B -$B%k!<%W$K9gCW$9$k@55,I=8=$G$"$kI,MW$,$"$j$^$9!#(B -@end table - -$B%0%k!<%W%Q%i%a!<%?$O(B ($B$b$A$m$s(B) $B%H%T%C%/%Q%i%a!<%?$h$j$bM%@h$5$l!"I{%H%T%C(B -$B%/$N%H%T%C%/%Q%i%a!<%?$O?F%H%T%C%/$N%H%T%C%/%Q%i%a!<%?$h$j$bM%@h$5$l$^$9!#(B -$BJ,$+$k$h$M!#$4$/IaDL$N7Q>5%k!<%k$G$9(B ($B%k!<%k(B (@dfn{Rules}) $B$O$3$3$G$OL>(B -$B;l$G$"$C$F!"F0;l$N!V@~$r0z$/!W$G$O$"$j$^$;$s!#$3$N%k!<%k$K$OH?BP$7$?$/$J(B -$B$k$+$bCN$l$J$$$1$I!"$=$l$O$4<+M3$K(B)$B!#(B - -@example -Gnus - Emacs - 3: comp.emacs - 2: alt.religion.emacs - 452: alt.sex.emacs - $BB)H4$-(B - 452: alt.sex.emacs - 0: comp.talk.emacs.recovery - $B$=$NB>(B - 8: comp.binaries.fractals - 13: comp.sources.unix - 452: alt.sex.emacs -@end example - -@samp{Emacs} $B%H%T%C%/$O%H%T%C%/%Q%i%a!<(B -$B%?(B @code{(score-file . "emacs.SCORE")} $B$r;}$C$F$$$^$9!#(B -@samp{$BB)H4$-(B} $B%H%T%C%/$O%H%T%C%/%Q%i%a!<(B -$B%?(B @code{(score-file . "relief.SCORE")} $B$r;}$A!"(B -@samp{$B$=$NB>(B} $B%H%T%C%/$O%H%T%C%/%Q%i%a!<(B -$B%?(B @code{(score-file . "emacs.SCORE")} $B$r;}$C$F$$$^$9!#(B -$B$5$i$K!"(B@samp{alt.religion.emacs} $B$O%0%k!<%W%Q%i%a!<(B -$B%?(B @code{(score-file . "religion.SCORE")} $B$r;}$C$F$$$^$9!#(B - -$B$5$F!"$3$3$G(B @samp{$BB)H4$-(B} $B%H%T%C%/$N(B @samp{alt.sex.emacs} $B%0%k!<%W$KF~$C(B -$B$?$H$-!"(B@file{relief.SCORE} $B$,4pK\%9%3%"%U%!%$%k$H$J$j$^$9!#$b(B -$B$7(B @samp{Emacs} $B%H%T%C%/$NF1$8%0%k!<%W$KF~$k$H!"(B@file{emacs.SCORE} $B$,4p(B -$BK\%9%3%"%U%!%$%k$K$J$k$G$7$g$&!#(B -@samp{alt.religion.emacs} $B%0%k!<%W$KF~$l$P!"(B@file{religion.SCORE} $B$,4pK\(B -$B%9%3%"%U%!%$%k$K$J$k$G$7$g$&!#(B - -$B$3$l$C$F$H$C$F$b4JC1$G<+L@$N$3$H$N$h$&$K8+$($k$G$7$g(B? $B$^$"!"$=$NDL$j$G$9!#(B -$B$G$9$,LdBj$,$"$k>l9g$b$"$j$^$9!#FC$K(B@code{total-expiry} $B%Q%i%a!<%?$K4X$7(B -$B$F$G$9!#Nc$($P$"$k%a!<%k%0%k!<%W$rFs$D$N%H%T%C%/$NCf$K!"0lJ}(B -$B$O(B @code{total-expiry} $B$"$j$G!"$b$&0lJ}$O$=$l$J$7$G;}$C$F$$$k$H$7$^$7$g(B -$B$&!#$3$3$G(B @kbd{M-x gnus-expire-all-expirable-groups} $B$rl9g$K$O==J,Cm0U$7$J$1$l$P$J$j$^$;$s!#(B - -@node Misc Group Stuff -@section $B$=$NB>$N%0%k!<%W4XO"(B - -@menu -* Scanning New Messages:: Gnus $B$K?7$7$$%a%C%;!<%8$,E~Ce$7$?$+$I$&(B - $B$+$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-(B - $BO?$5$;$k(B -* File Commands:: Gnus $B$N%U%!%$%k$NFI$_=q$-(B -@end menu - -@table @kbd -@item ^ -@kindex ^ (Group) -@findex gnus-group-enter-server-mode -$B%5!<%P%P%C%U%!%b!<%I$KF~$k(B (@code{gnus-group-enter-server-mode})$B!#(B -@xref{Server Buffer}$B!#(B - -@item a -@kindex a (Group) -@findex gnus-group-post-news -$B$"$k%0%k!<%W$K5-;v$rEj9F$9$k(B (@code{gnus-group-post-news})$B!#%W%l%U%#%C%/(B -$B%9$rM?$($k$H!"8=:_$N%0%k!<%WL>$,=i4|CM$H$7$F;HMQ$5$l$^$9!#(B - -@item m -@kindex m (Group) -@findex gnus-group-mail -$B%a!<%k$r$I$3$+$KAw$k(B (@code{gnus-group-mail})$B!#(B -@end table - -$B0J2<$O%0%k!<%W%P%C%U%!$N$?$a$NJQ?t$G$9(B: - -@table @code -@item gnus-group-mode-hook -@vindex gnus-group-mode-hook -$B%0%k!<%W%P%C%U%!$,:n@.$5$l$?;~$K8F$S=P$5$l$^$9!#(B - -@item gnus-group-prepare-hook -@vindex gnus-group-prepare-hook -$B%0%k!<%W%P%C%U%!$,@8@.$5$l$?$"$H$K8F$S=P$5$l$^$9!#$3$l$O%P%C%U%!$r2?$+JQ(B -$B$J!"<+A3$8$c$J$$J}K!$G=$@5$7$?$$$H$-$K;H$o$l$k$+$b$7$l$^$;$s!#(B - -@item gnus-group-prepared-hook -@vindex gnus-group-prepare-hook -$B%0%k!<%W%P%C%U%!$,@8@.$5$l$?8e$N0lHV:G8e$K8F$S=P$5$l$^$9!#Nc$($P%]%$%s%H(B -$B$r$I$3$+$K0\F0$5$;$?$$$H$-$J$I$K;H$($^$9!#(B - -@item gnus-permanently-visible-groups -@vindex gnus-permanently-visible-groups -$B$3$N@55,I=8=$K%^%C%A$9$k%0%k!<%W$O!"$=$l$,6u$G$"$k$+$I$&$+$K4X$o$i$:!">o(B -$B$K%0%k!<%W%P%C%U%!$KI=<($5$l$^$9!#(B - -@item gnus-group-name-charset-method-alist -@vindex gnus-group-name-charset-method-alist -$B%0%k!<%WL>MQ$NA*BrJ}K!$HJ8;z=89g$NO"A[%j%9%H$G$9!#$3$l$O1Q;z$G$O$J$$%0%k!<(B -$B%WL>$rI=<($9$k$?$a$K;H$$$^$9!#(B - -$BNc(B: -@lisp -(setq gnus-group-name-charset-method-alist - '(((nntp "news.com.cn") . cn-gb-2312))) -@end lisp - -@item gnus-group-name-charset-group-alist -@vindex gnus-group-name-charset-group-alist -$B%0%k!<%WL>MQ$N%0%k!<%WL>$N@55,I=8=$HJ8;z=89g$NO"A[%j%9%H$G$9!#$3$l$O1Q;z(B -$B$G$O$J$$%0%k!<%WL>$rI=<($9$k$?$a$K;H$$$^$9!#(B - -$BNc(B: -@lisp -(setq gnus-group-name-charset-group-alist - '(("\\.com\\.cn:" . cn-gb-2312))) -@end lisp -@end table - -@node Scanning New Messages -@subsection $B?7Ce%a%C%;!<%8$rC5$9(B -@cindex new messages -@cindex scanning new news - -@table @kbd -@item g -@kindex g (Group) -@findex gnus-group-get-new-news -@c @icon{gnus-group-get-new-news} -$B%5!<%P$N?7Ce5-;v$r%A%'%C%/$7$^$9!#?t;z%W%l%U%#%C%/%9$r;HMQ$9$k$H!"$3$NL?(B -$BNa$O0z?t(B @var{arg} $B$+$=$l$h$j>.$5$$%l%Y%k$N%0%k!<%W$N$_$r%A%'%C%/$7$^(B -$B$9(B (@code{gnus-group-get-new-news})$B!#?t;z0J30$N%W%l%U%#%C%/%9$rM?$($k$H!"(B -$B$3$NL?Na$O$=$N%P%C%/%(%s%I$+$i%"%/%F%#%V%U%!%$%k$r6/@)E*$KA4ItFI$_D>$7$^(B -$B$9!#(B - -@item M-g -@kindex M-g (Group) -@findex gnus-group-get-new-news-this-group -@vindex gnus-goto-next-group-when-activating -@c @icon{gnus-group-get-new-news-this-group} -$B8=:_$N%0%k!<%W$K?7Ce5-;v$,$"$k$+$I$&$+$r%A%'%C%/$7$^(B -$B$9(B (@code{gnus-group-get-new-news-this-group})$B!#(B -@code{gnus-goto-next-group-when-activating} $B$O$3$NL?Na$,r7o$KA4$F$N%0%k!<%W$r5/F0$7$^$9(B (@code{gnus-activate-all-groups})$B!#(B - -@item R -@kindex R (Group) -@cindex restarting -@findex gnus-group-restart -Gnus $B$r%j%9%?!<%H$7$^$9(B (@code{gnus-group-restart})$B!#$3$l(B -$B$O(B @file{.newsrc} $B%U%!%$%k$r%;!<%V$7!"A4$F$N%5!<%P$N@\B3$rJD$8!"A4$F(B -$B$N(B gnus $B%i%s%?%$%`JQ?t$r%/%j%"$7$?8e!"(Bgnus $B$r$b$&0lEY:G=i$+$i3+;O$7$^$9!#(B -@end table - -@vindex gnus-get-new-news-hook -@code{gnus-get-new-news-hook} $B$O?7Ce%K%e!<%9$r%A%'%C%/$9$kD>A0$KpJs(B -@cindex group information -@cindex information on groups - -@table @kbd -@item H f -@kindex H f (Group) -@findex gnus-group-fetch-faq -@vindex gnus-group-faq-directory -@cindex FAQ -@cindex ange-ftp -$B8=:_$N%0%k!<%W$N(B FAQ $B$ro%j%b!<%H%^%7%s>e$N%G%#%l%/%H%j$G$9!#$3$NJQ?t$O%G%#%l%/%H%j$N%j%9(B -$B%H$G$"$C$F$b9=$$$^$;$s!#$3$N>l9g!"$3$N%3%^%s%I$K%W%l%U%#%C%/%9$rM?$($k$3(B -$B$H$G$$$/$D$+$N%5%$%H$NCf$+$iA*$V$3$H$,$G$-$^$9!#%U%!%$%k$Nl9g!"(B -gnus $B$O(B @code{gnus-group-faq-directory} $B$NCM$rA4$F!"0l$D0l$D%*!<%W%s$7$F(B -$B$_$h$&$H$7$^$9!#(B - -@item H d -@itemx C-c C-d -@c @icon{gnus-group-describe-group} -@kindex H d (Group) -@kindex C-c C-d (Group) -@cindex describing groups -@cindex group description -@findex gnus-group-describe-group -$B8=:_$N%0%k!<%W$N@bL@$rI=<($9$k(B (@code{gnus-group-describe-group})$B!#%W%l(B -$B%U%#%C%/%9$rM?$($k$H!"@bL@J8$r%5!<%P$+$i6/@)E*$K:FFI$_9~$_$7$^$9!#(B - -@item M-d -@kindex M-d (Group) -@findex gnus-group-describe-all-groups -$BA4$F$N%0%k!<%W$N@bL@$rI=<($7$^(B -$B$9(B (@code{gnus-group-describe-all-groups})$B!#%W%l%U%#%C%/%9$rM?$($k$H!"@b(B -$BL@J8%U%!%$%k$r%5!<%P$+$i6/@)E*$K:FFI$_9~$_$7$^$9!#(B - -@item H v -@itemx V -@kindex V (Group) -@kindex H v (Group) -@cindex version -@findex gnus-version -$B8=:_$N(B gnus $B$N%P!<%8%g%sHV9f$rI=<($7$^$9(B (@code{gnus-version})$B!#(B - -@item ? -@kindex ? (Group) -@findex gnus-group-describe-briefly -$B$H$F$bC;$$%X%k%W%a%C%;!<%8$rM?$($^(B -$B$9(B (@code{gnus-group-describe-briefly})$B!#(B - -@item C-c C-i -@kindex C-c C-i (Group) -@cindex info -@cindex manual -@findex gnus-info-find-node -Gnus $B$N(B info $B%N!<%I$K0\F0$7$^$9(B (@code{gnus-info-find-node})$B!#(B -@end table - -@node Group Timestamp -@subsection $B%0%k!<%W$NF|IU(B -@cindex timestamps -@cindex group timestamps - -Gnus $B$K!"$"$J$?$,:G8e$K$$$D%0%k!<%W$rFI$s$@$+$r5-O?$5$;$k$HJXMx$+$b$7$l(B -$B$^$;$s!#$3$N3hF0$r;O$a$5$;$k$K$O!"(B -@code{gnus-group-set-timestamp} $B$r(B @code{gnus-select-group-hook} $B$KDI2C(B -$B$7$F$/$@$5$$!#(B - -@lisp -(add-hook 'gnus-select-group-hook 'gnus-group-set-timestamp) -@end lisp - -$B$3$l$r9T$C$?8e!"$"$J$?$,%0%k!<%W$KF~$k$?$S$K$=$l$,5-O?$5$l$^$9!#(B - -$B$3$N>pJs$O$5$^$6$^$JJ}K!$GI=<($G$-$^$9!=!=$b$C$H$b4JC1$J$N$O!"%0%k!<%W9T(B -$B%U%)!<%^%C%H$G(B @samp{%d} $B;XDj$r;H$&J}K!$G$9(B: - -@lisp -(setq gnus-group-line-format - "%M\%S\%p\%P\%5y: %(%-40,40g%) %d\n") -@end lisp - -$B$3$N7k2L$H$7$F!"3F9T$O0J2<$N$h$&$KI=<($5$l$^$9(B: - -@example -* 0: mail.ding 19961002T012943 - 0: custom 19961002T012713 -@end example - -$B8+$FJ,$+$k$H$*$j!"F|IU$O%3%s%Q%/%H$J(B ISO 8601 $B7A<0$GI=<($5$l$^$9!#(B -$B$3$l$G$O$A$g$C$H$"$s$^$j$J$N$G!"0J2<$N$h$&$J46$8$K$9$k$HF|IU$@$1(B -$B$rI=<($G$-$^$9!#(B - -@lisp -(setq gnus-group-line-format - "%M\%S\%p\%P\%5y: %(%-40,40g%) %6,6~(cut 2)d\n") -@end lisp - -@node File Commands -@subsection $B%U%!%$%kL?Na(B -@cindex file commands - -@table @kbd -@item r -@kindex r (Group) -@findex gnus-group-read-init-file -@vindex gnus-init-file -@cindex reading init file -$B=i4|2=%U%!%$%k$N:FFI$_9~$_$r9T$&(B (@code{gnus-init-file}$B!"$3$N%G(B -$B%U%)%k%H$O(B @file{~/.gnus}) (@code{gnus-group-read-init-file})$B!#(B - -@item s -@kindex s (Group) -@findex gnus-group-save-newsrc -@cindex saving .newsrc -@file{.newsrc.eld} $B%U%!%$%k(B ($B$H!"$b$7$=$&$7$?$1$l$P(B @file{.newsrc} $B%U%!(B -$B%$%k(B) $B$r%;!<%V$9$k(B (@code{gnus-group-save-newsrc})$B!#(B - -@c @item Z -@c @kindex Z (Group) -@c @findex gnus-group-clear-dribble -@c $B%I%j%V%k%U%!%$%k$r%/%j%"$9$k(B -@c (@code{gnus-group-clear-dribble})$B!#(B -@end table - -@node Summary Buffer -@chapter $B35N,%P%C%U%!(B -@cindex summary buffer - -$B35N,%P%C%U%!(B (summary buffer) $B$G$O$=$l$>$l$N5-;v$,0l9T$GI=<($5$l$^$9!#$=(B -$B$NCf$rF0$-2s$j!"5-;v$rFI$_!"Ej9F$7!"JVEz$r$9$k$3$H$,$G$-$^$9!#(B - -$B35N,%P%C%U%!$K0\$k0lHVIaDL$NJ}K!$O!"%0%k!<%W%P%C%U%!$G%0%k!<%W$rA*Br$9$k(B -$B$3$H$G$9(B (@pxref{Selecting a Group})$B!#(B - -$B35N,%P%C%U%!$OK>$`$@$1$?$/$5$s3+$$$?>uBV$K$7$F$*$/$3$H$,$G$-$^$9!#(B - -@menu -* 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 -* Delayed Articles:: -* Marking Articles:: $B5-;v$K4{FI$d4|8B@Z$l:o=|2DG=Ey$N0u$rIU$1(B - $B$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 the Summary Buffer:: $B%9%l%C%I$H5-;v$,$I$N$h$&$KJB$S$+$($i$l$k(B - $B$+(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(B - $B$($k(B -* Article Treatment:: $B5-;v%P%C%U%!$O$*K>$_$I$*$j$KL\Cc6lCc$K$G(B - $B$-$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 - $B$^$?$O8=:_$N%0%k!<%W$r:F$SA*Br$9$k(B -* Crosspost Handling:: $B%/%m%9%]%9%H$5$l$?5-;v$,$I$N$h$&$K07$o$l(B - $B$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 -@end menu - -@findex std11-extract-address-components -@findex mail-extract-address-components -@findex gnus-extract-address-components -@vindex gnus-extract-address-components -Gnus $B$OJQ?t(B @code{gnus-extract-address-components} $B$NCM$r(B @code{From} $B%X%C(B -$B%@!<$NL>A0$H%"%I%l%9$NItJ,$ro$KB.$/F0:n$7$^$9!#(B -@code{mail-extract-address-components} $B$ONI$/F0:n$7$^$9$,!"$d$dCY$/$J$j(B -$B$^$9!#$=$7$F!"(B@code{std11-extract-address-components} $B$O$H$F$bNI$/F0:n$7(B -$B$^$9$,!"CY$/$J$j$^$9!#%G%#%U%)%k%H$N4X?t$O(B 5% $B$N3d9g$G4V0c$C$FEz$($^$9!#(B -$B$b$7$3$l$K2fK}$J$i$J$$$N$G$"$l$P!"B>$N4X?t$rBe$o$j$K;H$&$3$H$,$G$-$^$9(B: - -@lisp -(setq gnus-extract-address-components - 'mail-extract-address-components) -@end lisp - -@vindex gnus-summary-same-subject -@code{gnus-summary-same-subject} $B$O:#FI$s$G$$$k5-;v$,!"$=$NA0$N5-;v$HF1(B -$B$8I=Bj(B (subject) $B$G$"$k$3$H$r<($9J8;zNs$G$9!#$3$NJ8;zNs$O;EMM$,$3$l$rMW(B -$B5a$9$k$H$-$K;H$o$l$^$9!#=i4|@_Dj$G$O(B @code{""} $B$G$9!#(B - -@node Summary Buffer Lines -@subsection $B35N,%P%C%U%!$N9T(B - -@vindex gnus-summary-line-format -$BJQ?t(B @code{gnus-summary-line-format} $B$NCM$rJQ$($k$3$H$K$h$C$F!"35N,%P%C(B -$B%U%!$G$N9T$NMM<0(B (format) $B$rJQ99$9$k$3$H$,$G$-$^$9!#$$$/$D$+$N3H(B -$BD%(B (@pxref{Formatting Variables}) $B$r=|$$$F!"IaDL$N(B @code{format} $BJ8;zNs(B -$B$HF1$8$h$&$KF0:n$7$^$9!#(B - -$B9T$K$O>o$K%3%m%s$+%]%$%s%H0LCV$N%^!<%+!<$,B8:_$7$F$$$J$1$l$P$J$j$^$;$s!#(B -$BA`:n$7$?8e$K!"%+!<%=%k$O$$$D$b%3%m%s$+%]%$%s%H0LCV$N%^!<%+!<$N>l=j$K0\F0(B -$B$7$^$9!#(B($B$b$A$m$s!"$3$NF0:n$rJQ$($k$3$H$,$G$-$J$$$H$7$?$i(B Gnus $B$K$O$"$k(B -$B$^$8$-$3$H$G$9!#4X?t(B @code{gnus-goto-colon} $B$r!"$"$J$?$,9%$-$J%+!<%=%k$N(B -$BF0$-$K$J$k$h$&$K!"?7$?$K=q$1$PNI$$$N$G$9!#(B) - -$B=i4|CM$NJ8;zNs$O(B @samp{%U%R%z%I%(%[%4L: %-23,23n%]%) %s\n} $B$G$9!#(B - -$B0J2<$NMM<0;X<(J8;z$r;H$&$3$H$,$G$-$^$9(B: - -@table @samp -@item N -$B5-;v?t!#(B -@item S -$BI=Bj$NJ8;zNs!#(B@code{gnus-list-identifiers} $B$N@_Dj$K$h$C$F%a!<%j%s%0%j%9(B -$B%H$NI8<1$,:o=|$5$l$^$9!#(B@xref{Article Hiding}$B!#(B -@item s -$B%9%l%C%I(B (thread) $B$N4p5-;v$G$"$k$H$-$+D>A0$N5-;v$,0c$&I=Bj$N$H$-$O$=$NBj(B -$BL>$G!"$=$l0J30$O(B @code{gnus-summary-same-subject}$B!#(B -(@code{gnus-summary-same-subject} $B$N=i4|CM$O(B @code{""}$B!#(B) -@item F -$B40A4$J(B @code{From} $BMs!#(B -@item n -$BL>A0(B (@code{From} $BMs$h$j(B)$B!#(B -@item f -$BL>A0!"(B@code{To} $B%X%C%@!<$+(B @code{Newsgroups} $B%X%C%@!<$G(B -$B$9(B (@pxref{To From Newsgroups})$B!#(B -@item a -$BL>A0(B (@code{From} $BMs$h$j(B)$B!#$3$l$H(B @code{n} $B$H$N0c$$$O!"$3$l$OJQ(B -$B?t(B @code{gnus-extract-address-components} $B$G;XDj$5$l$F$$$k4X?t$r;H$C$FL>(B -$BA0$rA0(B (@code{From} $BMs$h$j(B)$B!#$3$l$O(B @code{a} $B$HF1$8$h$&$KF0:n$7$^$9!#(B -@item L -$B5-;v$N9T?t!#(B -@item c -$B5-;v$NJ8;z?t!#$3$NL>A0;XDj;R$O(B (nnfolder $B$N$h$&$J(B) $B$$$/$D$+$NA*BrJ}K!$r(B -$B%5%]!<%H$7$^$;$s!#(B -@item I -$B%9%l%C%I$N%l%Y%k$K$h$k;z2<$2(B (@pxref{Customizing Threading})$B!#(B -@item B -$BJ#;($J(B trn $BMM<0$N%9%l%C%ILZ(B (tree)$B!#$I$N$h$&$J1~Ez$,9T$J$o$l$?$+$N5-O?$r(B -$BI=<($7$^$9!#(B -@item T -$B5-;v$,K\5-;v$G$"$l$P2?$bI=<($;$:!"$=$&$G$J$$>l9g$O$?$/$5$s$N6uGr$G$9(B ($B8e(B -$B$N$b$N$r$9$Y$F2hLL$N30$KDI$$=P$7$F$7$^$$$^$9(B)$B!#(B -@item [ -$B3+$-3g8L!#IaDL$O(B @samp{[} $B$G$9$,!"M\;R5-;v$K$O(B @samp{<} $B$K$9$k$3$H$,$G$-(B -$B$^$9(B (@pxref{Customizing Threading})$B!#(B -@item ] -$BJD$83g8L!#IaDL$O(B @samp{[} $B$G$9$,!"M\;R5-;v$K$O(B @samp{<} $B$K$9$k$3$H$,$G$-(B -$B$^$9!#(B -@item > -$B$=$l$>$l$N%9%l%C%I$N%l%Y%k$KBP$7$F0l$D$N6uGr!#(B -@item < -$BFs==0z$/%9%l%C%I%l%Y%k$N6uGr!#(B -@item U -$BL$FI!#(B - -@item R -$B$3$NJ6$i$o$7$$L>A0;XDj;R$O(B @dfn{secondary mark} $B$K$h$C$FDj5A$5$l$^$9!#$3(B -$B$N%^!<%/$O5-;v$,4{$KJVEz:Q$_$N$b$N$+!"%-%c%C%7%e$5$l$?$b$N$+!"$"$k$$$OJ](B -$BB8$5$l$?$b$N$+$rI=$7$^$9!#(B - -@item i -$B?t;z$H$7$F$N%9%3%"(B (@pxref{Scoring})$B!#(B -@item z -@vindex gnus-summary-zcore-fuzz -$B$3$l$O!"(Bzcore $B$G=i4|@_Dj$N%l%Y%k$h$j$b>e$G$"$l$P(B @samp{+} $B$G!"=i4|@_Dj$N(B -$B%l%Y%k$h$j$b2<$G$"$l$P(B @samp{-} $B$G$9!#(B -@code{gnus-summary-default-score} $B$H$N:9(B -$B$,(B @code{gnus-summary-zcore-fuzz} $B$h$j$b>.$5$$$H!"$3$N;EMM$O;H$o$l$^$;$s!#(B -@item V -$B%9%l%C%IA4BN$N%9%3%"!#(B -@item x -@code{Xref}. -@item D -@code{$BF|IU(B} (@code{Date})$B!#(B -@item d -@code{DD-MM}$BMM<0$K$h$k(B@code{$BF|IU(B}$B!#(B -@item o -@var{YYYYMMDD}@code{T}@var{HHMMSS}$BMM<0$K$h$k(B@code{$BF|IU(B}$B!#(B -@item M -@code{Message-ID}. -@item r -@code{References}. -@item t -$B8=:_$NI{%9%l%C%I$N5-;v$N?t!#$3$N;EMM$r;H$&$H35N,%P%C%U%!$N@8@.$,4vJ,CY$/(B -$B$J$j$^$9!#(B -@item e -$B5-;v$K;R5-;v$,$"$k$H!"(B@samp{=} (@code{gnus-not-empty-thread-mark}) $B$,I=(B -$B<($5$l$^$9!#(B -@item P -$B9T?t!#(B -@item O -$B%@%&%s%m!<%I$N0u!#(B -@item u -$BMxMQ$N35N,;XDj$HF1MM$K35N,$KA^F~(B -$B$5$l$^$9!#(B -@end table - -@samp{%U} ($B>uBV(B), @samp{%R} ($BJVEz:Q$_(B), @samp{%z} (zcore) $B$N07$$$K$O5$$r(B -$BIU$1$kI,MW$,$"$j$^$9!#8zN($N$?$a$K!"(Bgnus $B$O$3$l$i$NJ8;z$,$I$N7e$K8=$l$k(B -$B$+$r7W;;$7!"!X%O!<%I!&%3!<%I!Y$7$^$9!#$3$l$O!"2DJQD9$N;EMM$N8e$G$O!"$3$l(B -$B$i$O0UL#$r;}$?$J$$$H$$$&$3$H$G$9!#$^$!!"$5$9$,$KBaJa$O$5$l$J$$$G$7$g$&$,!"(B -$B35N,%P%C%U%!$OJQ$K$J$j$^$9!#$=$l$G$b==J,Ha$7$$$G$7$g$&$1$I!#(B - -$B8-$$A*Br$O$3$l$i$N;XDj$r$G$-$k$@$1:8$K;}$C$F$/$k$3$H$G$9!#(B($B$G$b!"$=$&$$(B -$B$&$3$H$O$9$Y$F$KEv$F$O$^$k$N$G$O$J$$$G$7$g$&$+!#4WOC5YBj!#(B) - -$B$3$N@)8B$O>-Mh$NHG$G$OL5$/$J$k$+$bCN$l$^$;$s!#(B - -@node To From Newsgroups -@subsection To From Newsgroups -@cindex To -@cindex Newsgroups - -$B$$$/$D$+$N%0%k!<%W$G$O(B ($BFC$K%"!<%+%$%V%0%k!<%W(B), @code{From} $B%X%C%@!<$O(B -$B$"$^$j6=L#$r0z$-$^$;$s!#$=$3$NA4$F$N5-;v$O$"$J$?$K$h$C$F=q$+$l$?$b$N$G$9(B -$B$+$i!#Be$o$j$K!"(B@code{To} $B$d(B @code{Newsgroups} $B%X%C%@!<$N>pJs$rI=<($9$k(B -$B$?$a$K$O!";0$D$N$3$H$r7h$a$kI,MW$,$"$j$^$9(B: $B$I$N>pJs$r=8$a$k$+(B, $B$I$3$KI=(B -$B<($9$k$+(B, $B$$$DI=<($9$k$+!#(B - -@enumerate -@item -@vindex gnus-extra-headers -$BDI2C$N%X%C%@!<$N>pJs$O(B @code{gnus-extra-headers} $B$K$h$j@)8f$5$l$^$9!#$3(B -$B$l$O%X%C%@!<$N%7%s%\%k$N%j%9%H$G$9!#Nc$($P(B: - -@lisp -(setq gnus-extra-headers - '(To Newsgroups X-Newsreader)) -@end lisp - -$B$3$l$O!"(Bgnus $B$,$3$l$i$N;0$D$N%X%C%@!<$rl9gLrN)$A$^$9!#$7$+$7!"0J2<$N$b$N$r(B @file{overview.fmt} $B%U%!%$(B -$B%k$N:G8e$KDI2C$9$k$h$&$K(B nntp $B4IM}$l$NMWAG$G$9(B: - -@table @samp -@item G -$B%0%k!<%WL>!#(B -@item p -$B@\F,8l$rA0!#(B -@item A -$B8=:_$N5-;vHV9f!#(B -@item z -$B8=:_$N5-;v%9%3%"!#(B -@item V -Gnus $B%P!<%8%g%s!#(B -@item U -$B$=$N%0%k!<%W$G$NL$FI5-;v$N?t!#(B -@item e -$B35N,%P%C%U%!$KI=<($5$l$F$$$J$$L$FI5-;v$N?t!#(B -@item Z -$BL$FI$HL$A*Br$N5-;v$N?t$H$H$b$KI=$5$l$kJ8;zNs$G!"L$FI$+$DL$A*Br$N5-;v$,$"(B -$B$k>l9g$O(B @samp{<%U(+%e) more>} $B$G!"L$FI5-;v$N$_$N>l9g(B -$B$O(B @samp{<%U more>} $B$G$9!#(B -@item g -$BC;=L%0%k!<%WL>!#Nc$($P!"(B@samp{rec.arts.anime} $B$O(B @samp{r.a.anime} $B$KC;=L(B -$B$5$l$^$9!#(B -@item S -$B8=:_$N5-;v$NI=Bj!#(B -@item u -$BMxMQA0(B (@pxref{Scoring})$B!#(B -@item d -$BJ]N15-;v$N?t(B (@pxref{Unread Articles})$B!#(B -@item t -$B2D;k0uIU$-5-;v$N?t(B (@pxref{Unread Articles})$B!#(B -@item r -$B$=$N0lO"$NF0:n$N4V$K4{FI$H$7$F0u$,$D$$$?5-;v$N?t!#(B -@item E -$B%9%3%"%U%!%$%k$K$h$C$FKu>C$5$l$?5-;v$N?t!#(B -@end table - -@node Summary Highlighting -@subsection $B35N,$N%O%$%i%$%H(B - -@table @code -@item gnus-visual-mark-article-hook -@vindex gnus-visual-mark-article-hook -$B$3$N%U%C%/$O5-;v$rA*Br$7$?8e$Kl9g$Ol9g$O score default) . bold)) -@end lisp - -$B$4A[A|$N$H$*$j!"$b$7(B @var{form} $B$,(B @code{nil} $B$G$J$$CM$rJV$9$H!"(B -@var{face} $B$,$=$N9T$KE,MQ$5$l$^$9!#(B -@end table - -@node Summary Maneuvering -@section $B35N,4V$N0\F0(B -@cindex summary movement - -$B$9$Y$F$ND>@\0\F0L?Na$O?tCM@\F,0z?t$r)$a$^$9!#$3$NJQ?t(B -$B$,(B @code{t} $B$Gl(B -$B9g$H$7$F!"$3$NJQ?t$,(B @code{quietly} $B$G$"$k$H!"(Bgnus $B$O3NG'$r$;$:$K!"H$7$F$/$@$5$$!#(B - -@item gnus-auto-select-same -@vindex gnus-auto-select-same -@code{nil} $B$G$J$$$H!"$9$Y$F$N0\F0L?Na$O8=:_$N5-;v$HF1$8I=Bj$N5-;v$K0\F0(B -$B$7$h$&$H$7$^$9!#(B(@dfn{$BF1$8(B} $B$O$3$3$G$O(B @dfn{$BBgBNF1$8(B} $B$H$$$&0UL#$+$bCN$l(B -$B$^$;$s!#>\:Y$O(B @code{gnus-summary-gather-subject-limit} $B$r8+$F$/$@$5(B -$B$$(B (@pxref{Customizing Threading} $B$b;2>H$7$F$/$@$5$$(B)$B!#(B) $BF1$8I=Bj$N5-;v(B -$B$,L5$$$H$-$O:G=i$NL$FI5-;v$K0\F0$7$^$9!#(B - -$B$3$NJQ?t$O!"%9%l%C%II=<($r9T$C$F$$$k$H$-$O$"$^$jLr$KN)$?$J$$$G$7$g$&!#(B - -@item gnus-summary-check-current -@vindex gnus-summary-check-current -@code{nil} $B$G$J$$$H!"$9$Y$F$N!XL$FI!Y0\F0L?Na$O!"o$K??Cf$KJ]$A$^$9!#(B -$B$3$l$r$9$k$H!"$H$F$b$3$.$l$$$K$J$j$^$9$,!"CY$$%M%C%H%o!<%/@\B3$G$"$C$?$j!"(B -$BC1$K$3$N(B Emacsism $B$G$J$$9T0Y$r9%$-$K$J$l$J$$$N$G$"$l$P!"IaDL$N(B Emacs $B$N(B -$B%9%/%m!<%k$K$9$k$?$a$K!"$3$NJQ?t$r(B @code{nil} $B$K$9$k$3$H$,$G$-$^$9!#$3$l(B -$B$O35N,%P%C%U%!$N?eJ?J}8~$N??Cf$X$N:F0\F0$b6X;_$7$^$9$N$G!"Hs>o$KD9$$%9%l%C(B -$B%I$rFI$`$H$-$OITJX$+$b$7$l$^$;$s!#(B -@end table - -@node Choosing Articles -@section $B5-;v$NA*Br(B -@cindex selecting articles - -@menu -* 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 -@end menu - -@node Choosing Commands -@subsection $BL?Na$NA*Br(B - -$B0J2<$N0\F0%3%^%s%I$O$I$l$b?tCM@\F,0z?t$rH$7$F2<$5$$!#(B - -@table @kbd -@item SPACE -@kindex SPACE ($B35N,(B) -@findex gnus-summary-next-page -$B8=:_$N5-;v$+!"$=$l$,4{$KFI$^$l$F$$$k>l9g$OA0$N5-;v$K0\F0$7$^$9(B (@code{gnus-summary-goto-last-article})$B!#(B - -@item G o -@kindex G o ($B35N,(B) -@findex gnus-summary-pop-article -$B35N,$NMzNr(B (history) $B$+$i:G8e$N5-;v$r0l$De$NL?Na$H0c$&$N$O!"(B -@kbd{l} $B$,:G=*Fs$D$N5-;v$N4V$r0\F0$9$k$N$KBP$7$F!"$3$l$O9%$-$J$@$1A0$N5-(B -$B;v$rMzNr$+$iA*$S=P$9$3$H$,$G$-$kE@$G$9!#2?$i$+$N$3$l$K4X78$7$?$3$H(B -$B$O(B ($B$b$7$3$l$i$NL?Na$r$?$/$5$s;H$&$N$G$"$l$P(B)$B!"(B -@pxref{Article Backlog} $B$r;2>H$7$F$/$@$5$$!#(B - -@item G j -@item j -@kindex j ($B35N,(B) -@kindex G j ($B35N,(B) -@findex gnus-summary-goto-article -$B5-;vHV9f$+(B @code{Message-ID} $B$r?R$M!"$=$l$+$i$=$N5-;v$K9T$/!#(B -(@code{gnus-summary-goto-article})$B!#(B -@end table - -@node Choosing Variables -@subsection $BA*$V$?$a$NJQ?t(B - -$B5-;v$r0\F0$7!"A*Br$9$k$N$K4XO"$7$?$$$/$D$+$NJQ?t(B: - -@table @code -@item gnus-auto-extended-newsgroup -@vindex gnus-auto-extend-newsgroup -$B$3$NJQ?t$,(B @code{nil} $B$G$J$$$H!"$9$Y$F$N0\F0L?Na$O!"$b$7$=$N5-;v$,35N,%P%C(B -$B%U%!$KI=<($5$l$F$$$J$$>l9g$G$b!"A0(B ($B$b$7$/$Oo$K8F$P$l$^$9!#=i4|@_Dj$G$O!"A*Br$5$l(B -$B$?5-;v$N2<$K1#$l$F$$$k%9%l%C%I$r8+$;$k$h$&$K$J$C$F$$$^$9!#(B - -@item gnus-mark-article-hook -@vindex gnus-mark-article-hook -@findex gnus-summary-mark-unread-as-read -@findex gnus-summary-mark-read-and-unread-as-read -@findex gnus-unread-mark -$B$3$N%U%C%/$O5-;v$,A*Br$5$l$?$H$-$K>o$K8F$P$l$^$9!#$=$l$O5-;v$K4{FI$N0u$r(B -$BIU$1$k$?$a$K$"$j$^$9!#=i4|CM(B -$B$O(B @code{gnus-summary-mark-read-and-unread-as-read} $B$G!"$[$H$s$I$9$Y$F$N(B -$BFI$s$@5-;v$N0u$r(B @code{gnus-read-mark} $B$KJQ99$7$^$9!#$3$N4X?t$K1F6A$5$l(B -$B$J$$5-;v$O!"2D;k!"J]N1!"4|8B@Z$l:o=|2DG=5-;v$@$1$G$9!#$b$7!"L$FI$K4{FI$N(B -$B0u$rIU$1$?$$$@$1$G$"$l$P!"Be$o$j(B -$B$K(B @code{gnus-summary-mark-unread-as-read} $B$r;H$&$3$H$,$G$-$^$9!#$=$l$O!"(B -@code{gnus-low-score-mark} $B$d(B @code{gnus-del-mark} ($B$J$I$J$I(B) $B$N0u$r$=$N(B -$B$^$^;D$7$^$9!#(B -@end table - -@node Paging the Article -@section $B5-;v$N%9%/%m!<%k(B -@cindex article scrolling - -@table @kbd -@item SPACE -@kindex SPACE ($B35N,(B) -@findex gnus-summary-next-page -@kbd{SPACE} $B$O5-;v$r0l%Z!<%8@h$K%9%/%m!<%k$7$^$9!#5-;v$N:G8e$K$$$k>l9g$O(B -$B -@itemx > -@kindex > ($B35N,(B) -@kindex A > ($B35N,(B) -@findex gnus-summary-end-of-article -$B5-;v$N:G8e$^$G%9%/%m!<%k$7$^$9(B (@code{gnus-summary-end-of-article})$B!#(B - -@item A s -@itemx s -@kindex A s ($B35N,(B) -@kindex s ($B35N,(B) -@findex gnus-summary-isearch-article -$B5-;v%P%C%U%!$G%$%s%/%j%a%s%?%k%5!<%A(B (isearch) $B$r9T$$$^(B -$B$9(B (@code{gnus-summary-isearch-article})$B!#(B - -@item h -@kindex h ($B35N,(B) -@findex gnus-summary-select-article-buffer -$B5-;v%P%C%U%!$rA*Br$7$^$9(B (@code{gnus-summary-select-article-buffer})$B!#(B -@end table - -@node Reply Followup and Post -@section $BJVEz!"%U%)%m!<%"%C%W!"Ej9F(B - -@menu -* 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:: -@end menu - -@node Summary Mail Commands -@subsection $B35N,$G$N%a!<%k$NL?Na(B -@cindex mail -@cindex composing mail - -$B%a!<%k%a%C%;!<%8$r:n@.$9$k$?$a$NL?Na(B: - -@table @kbd -@item S r -@item r -@kindex S r ($B35N,(B) -@kindex r ($B35N,(B) -@findex gnus-summary-reply -@c @icon{gnus-summary-mail-reply} -@c @icon{gnus-summary-reply} -$B8=:_$N5-;v$r=q$$$??M$KJVEz$N%a!<%k$rAw$j$^$9(B (@code{gnus-summary-reply})$B!#(B - -@item S R -@itemx R -@kindex R ($B35N,(B) -@kindex S R ($B35N,(B) -@findex gnus-summary-reply-with-original -@c @icon{gnus-summary-reply-with-original} -$B8=:_$N5-;v$r=q$$$??M$K!"K\5-;v$r4^$s$@JVEz$N%a!<%k$r=P$7$^(B -$B$9(B (@code{gnus-summary-reply-with-original})$B!#$3$NL?Na$O%W%m%;%9(B/$B@\F,0z(B -$B?t$N=,47$r;H$$$^$9!#(B - -@item S w -@kindex S w ($B35N,(B) -@findex gnus-summary-wide-reply -$B8=:_$N5-;v$r=q$$$??M$KBP$7$F!"9-$$JVEz(B (wide reply) $B$r$7$^(B -$B$9(B (@code{gnus-summary-wide-reply})$B!#(B@dfn{$B9-$$JVEz(B} $B$H$O%X%C%@!<(B -$B$N(B @code{To}, @code{From}, ($B$b$7$/$O(B @code{Reply-to}) $B$H(B @code{Cc}) $B$N$9(B -$B$Y$F$N?M$KJVEz$r$9$k$3$H$G$9!#(B - -@item S W -@kindex S W ($B35N,(B) -@findex gnus-summary-wide-reply-with-original -$B8=:_$N5-;v$KK\5-;v$r4^$s$@9-$$JVEz$N%a!<%k$rAw$j$^(B -$B$9(B (@code{gnus-summary-wide-reply-with-original})$B!#$3$NL?Na$O%W%m%;%9(B/$B@\(B -$BF,0z?t$N=,47$r;H$$$^$9!#(B - -@item S v -@kindex S v ($B35N,(B) -@findex gnus-summary-very-wide-reply -$B8=:_$N5-;v$r=q$$$??M$KBP$7$F!"Hs>o$K9-$$JVEz(B (very wide reply) $B$r$7$^(B -$B$9(B (@code{gnus-summary-very-wide-reply})$B!#(B@dfn{$BHs>o$K9-$$JVEz(B} $B$H$O!"%W(B -$B%m%;%9(B/$B@\F,0z?t$G;XDj$5$l$?$9$Y$F$N5-;v$N%X%C%@!<$N(B @code{To}, -@code{From}, ($B$b$7$/$O(B @code{Reply-to}) $B$H(B @code{Cc}) $B$N$9$Y$F$N?M$KJVEz(B -$B$r$9$k$3$H$G$9!#$3$NL?Na$O%W%m%;%9(B/$B@\F,0z?t$N=,47$r;H$$$^$9!#(B - -@item S V -@kindex S V ($B35N,(B) -@findex gnus-summary-very-wide-reply-with-original -$B8=:_$N5-;v$KK\5-;v$r4^$s$@Hs>o$K9-$$JVEz$N%a!<%k$rAw$j$^(B -$B$9(B (@code{gnus-summary-very-wide-reply-with-original})$B!#$3$NL?Na$O%W%m%;(B -$B%9(B/$B@\F,0z?t$N=,47$r;H$$$^$9!#(B - -@item S o m -@itemx C-c C-f -@kindex S o m ($B35N,(B) -@kindex C-c C-f ($B35N,(B) -@findex gnus-summary-mail-forward -@c @icon{gnus-summary-mail-forward} -$BC/$+B>$N?M$K8=:_$N5-;v$rE>Aw$7$^$9(B (@code{gnus-summary-mail-forward})$B!#(B -$B@\F,0z?t$,$"$k$H!"E>Aw5-;v$N40A4$J%X%C%@!<$r$N?M$K%a!<%k$rAw$j$^$9(B (@code{gnus-summary-mail-other-window})$B!#(B - -@item S D b -@kindex S D b ($B35N,(B) -@findex gnus-summary-resend-bounced-mail -@cindex bouncing mail -$B%a!<%k$rAw$C$?$N$K!"2?$i$+$NM}M3(B ($B%"%I%l%9$N4V0c$$!"E>Aw$NITD4(B) $B$GLa$C$F(B -$B$-$?$H$-$K!"$3$NL?Na$r;H$C$FLa$C$F$-$?%a!<%k$r$b$&0l2sAw$k$3$H$,$G$-$^(B -$B$9(B (@code{gnus-summary-resend-bonced-mail})$B!#$b$&0lEY%a!<%k$rAw$kA0$K%X%C(B -$B%@!<$rJT=8$G$-$k$h$&$K!"%a!<%k%P%C%U%!$K$=$N%a!<%k$,8=$l$k$G$7$g$&!#$3$N(B -$BL?Na$K@\F,0z?t$rM?$($F!"La$C$F$-$?%a!<%k$,C/$+$X$NJVEz$G$"$C$?>l9g!"(B -gnus $B$O$=$N%a!<%k$re$NL?Na$H:.F1$7$J$$$h$&$K!"(B@code{gnus-summary-resend-message} $B$O8=:_$N(B -$B%a%C%;!<%8$rAw$k@h$N%"%I%l%9$NF~NO$rB%$7!"$=$l$+$i$=$N>l=j$K%a!<%k$rAw$j(B -$B$^$9!#%a%C%;!<%8$N%X%C%@!<$OJQ99$5$l$^$;$s!=!=$7$+$7!"(B -@code{Resent-To}, @code{Resent-From} $BEy$N%X%C%@!<$,IU$12C$($i$l$^$9!#$3(B -$B$l$O!"(B($B$*$=$i$/(B) $B$"$J$?<+?H$r(B @code{To} $BMs$K=q$$$?K\?M$K$b%a!<%k$rAw$C$F(B -$B$7$^$&$H$$$&$3$H$G$9!#$3$l$O:.Mp$r>7$/$G$7$g$&!#$G$9$+$i!"$b$A$m$s!"K\Ev(B -$B$K(B $BAw$7$?$$$H$-$KMQ$$$i$l$^$9!#(B -($B$b$7$"$J$?$,!"(B@code{$B%k!<%H(B} (root) $B$G$"$j!"(B -@code{$B%]%9%H%^%9%?!<(B} (postmaster) $B$G$b$"$j!"(B@code{$B%k!<%H(B} $B$K(B @code{$B%]%9(B -$B%H%^%9%?!<(B} $B$X$N%a!<%k$rl9g$O!"$=$l(B -$B$r(B @code{$B%]%9%H%^%9%?!<(B} $B$K$b:FAw$7$?$$$H;W$&$G$7$g(B -$B$&!#(BOrdnung mu,A_(B sein!) - -$B$3$NL?Na$O%W%m%;%9(B/$B@\F,0z?t$N=,47$K=>$$$^$9(B (@pxref{Process/Prefix})$B!#(B - -@item S O m -@kindex S O m ($B35N,(B) -@findex gnus-summary-digest-mail-forward -$B8=:_$N0lO"$N5-;v(B (@pxref{Decoding Articles}) $B$NMWLs$r:n$j!"%a!<%k$G$=$N(B -$B7k2L$rAw$j$^$9(B (@code{gnus-summary-digest-mail-forward})$B!#$3$NL?Na$O%W%m(B -$B%;%9(B/$B@\F,0z?t$N=,47$K=>$$$^$9(B (@pxref{Process/Prefix})$B!#(B - -@item S M-c -@kindex S M-c ($B35N,(B) -@findex gnus-summary-mail-crosspost-complaint -@cindex crossposting -@cindex excessive crossposting -$B8=:_$N5-;v$N=q$-j%/%m%9%]%9%H$X$N6l>p$N%a!<%k$rAw$j$^(B -$B$9(B (@code{gnus-summary-mail-crosspost-complaint})$B!#(B - -@findex gnus-crosspost-complaint -$B$3$NL?Na$O!"8=:_(B Usenet $B$K2#9T$7$F$$$k!"%/%m%9%]%9%H$N@$3&E*N.9T$KBP$7$F(B -$BH?7b$r9T$&$$!"$=$l$>$l(B -$B$N%a!<%k$rAw$kA0$KAw?.$9$k$+$I$&$+$N3NG'$r$7$^$9!#(B -@end table - -$B$^$?(B @pxref{(message)Header Commands} $B$K$5$i$J$k>pJs$,$"$j$^$9!#(B - -@node Summary Post Commands -@subsection $B35N,$NEj9FL?Na(B -@cindex post -@cindex composing news - -$B%K%e!<%9$N5-;v$rEj9F$9$k$?$a$NL?Na(B: - -@table @kbd -@item S p -@itemx a -@kindex a ($B35N,(B) -@kindex S p ($B35N,(B) -@findex gnus-summary-post-news -@c @icon{gnus-summary-post-news} -$B8=:_$N%0%k!<%W$K5-;v$rEj9F$7$^$9(B (@code{gnus-summary-post-news})$B!#(B - -@item S f -@itemx f -@kindex f ($B35N,(B) -@kindex S f ($B35N,(B) -@findex gnus-summary-followup -@c @icon{gnus-summary-followup} -$B8=:_$N5-;v$N%U%)%m!<%"%C%W$rEj9F$7$^$9(B (@code{gnus-summary-followup})$B!#(B - -@item S F -@itemx F -@kindex S F ($B35N,(B) -@kindex F ($B35N,(B) -@c @icon{gnus-summary-followup-with-original} -@findex gnus-summary-followup-with-original -$BK\5-;v$rAw$7$^(B -$B$9(B (@code{gnus-summary-post-forward})$B!#@\F,0z?t$,M?$($i$l$?$H$-$O!"E>Aw(B -$B5-;v$N%X%C%@!<$r40A4$KpJs$,$"$j$^$9!#(B - -@c FIXME this is not implemented -@node Summary Message Commands -@subsection $B35N,%a%C%;!<%8L?Na(B - -@table @kbd -@item S y -@kindex S y ($B35N,(B) -@findex gnus-summary-yank-message -$B8=:_$N5-;v$r4{$KB8:_$9$k(B Message $B:n@.%P%C%U%!$KE=$jIU$1$^(B -$B$9(B (@code{gnus-summaryyank-message})$B!#$3$NL?Na$OE=$jIU$1$?$$%a%C%;!<%8%P%C(B -$B%U%!$NF~NO$rB%$7!"%W%m%;%9(B/$B@\F,<-$N=,47$rM}2r$7$^(B -$B$9(B (@pxref{Process/Prefix})$B!#(B -@end table - -@node Canceling and Superseding -@subsection $B5-;v$rC$9(B -@cindex canceling articles -@cindex superseding articles - -$B2?$+$r=q$$$?8e$G!"K\Ev$K!"K\Ev$K!"$[(B $B$s(B $B$H(B $B$&(B $B$K$=$l$rEj9F$7$F$$$J$1$l$P(B -$B$J$!$H;W$C$?$3$H$O$"$j$^$;$s$+!#(B - -$B$(!<$H!"%a!<%k$OC$9$3$H$O$G$-$J$$$N$G$9$,!"%K%e!<%9$NEj9F$OC$9(B -$B$3$H$,$G$-$^$9!#(B - -@findex gnus-summary-cancel-article -@kindex C ($B35N,(B) -@c @icon{gnus-summary-cancel-article} -$BC$7$?$$5-;v$r8+$D$1$F$/$@$5$$(B ($BC$9$3$H$,$G$-$k$N$O<+J,$N5-;v$@(B -$B$1$G$9!#JQ$J$3$H$O;n$5$J$$$G$/$@$5$$(B)$B!#$=$l$+$i!"(B -@kbd{C} $B$+(B @kbd{S c} $B$r2!$7$F$/$@$5(B -$B$$(B (@code{gnus-summary-cancel-article})$B!#$"$J$?$N5-;v$,C$5$l$^(B -$B$9!=!=@$3&Cf$N5!3#$,$"$J$?$N5-;v$rC$7$^$9!#$3$NL?Na$O%W%m%;%9(B/$B@\F,(B -$B0z?t$N=,47$rMQ$$$^$9(B (@pxref{Process/Prefix})$B!#(B - -$B$7$+$7!"Cm0U$7$F$[$7$$$N$O$9$Y$F$N%5%$%H(B (site) $B$,C$7$r07$C$F$$$k$o(B -$B$1$G$O$J$$$3$H$G$9!#$G$9$+$i!"$?$$$F$$$N%5%$%H$,LdBj$N5-;v$rC$7$F$b!"(B -$B$"$A$3$A$G$"$J$?$N5-;v$O@8$-;D$k$+$b$7$l$^$;$s!#(B - -Gnus $B$O!"C$9$H$-$K!X8=:_!Y$NA*BrJ}K!$r;H$$$^$9!#I8=`$NEj9FJ}K!$r;H(B -$B$$$?$$$N$G$"$l$P!"J8;z@\F,0z?t(B @samp{a} $B$r;H$C$F$/$@$5(B -$B$$(B (@pxref{Symbolic Prefixes})$B!#(B - -$B$b$72?$+4V0c$$$r$7$?$N$K5$IU$$$F!"D{@5$r$7$?$$$N$G$"$l$P!"(B -@dfn{$BBeBX(B} (@dfn{superseding}) $B5-;v$rEj9F$7$FK\5-;v$rCV$-49$($k$3$H$,$G(B -$B$-$^$9!#(B - -@findex gnus-summary-supersede-article -@kindex S ($B35N,(B) -$BK\5-;v$N$H$3$m$X0\F0$7$F!"(B@kbd{S s} $B$r2!$7$F$/$@$5(B -$B$$(B (@code{gnus-summary-supersede-article})$B!#IaDL$NJ}K!$G$=$l$rAw$kA0$K!"(B -$B5-;v$r9%$-$J$h$&$KJT=8$9$k$3$H$,$G$-$^$9!#BeBX$K4X$7$F$b!"C$7$HF1$8(B -$B$3$H$,Ev$F$O$^$j$^$9!#$3$A$i$NJ}$,$b$C$H$h$/Ev$F$O$^$k$+$b$7$l$^$;(B -$B$s(B: $B$$$/$D$+$N%5%$%H$OBeBX$rl9g!"5-;v$,:G=i$K$"(B -$B$J$?$N%5%$%H$K8=$l$kA0$KC$7(B/$BBeBX$r$9$k$?$a$N9*L/$JH$7$F2<$5$$!#(B - -@item -$B;~9o!#(Bam/pm $B$r4^$^$J$$(B 24 $B;~4V@)$N!"(B@code{hh:mm} $B$N7A<0$GM?$($^$9!#Aw?.(B -$B$5$l$k$N$O:#F|$N$=$N;~9o$G$9$,!"$9$G$K$=$N;~9o$r2a$.$F$7$^$C$F$$$?>l9g$O(B -$BMbF|$N$=$N;~9o$K$J$j$^$9!#$G$9$+$i!"D+$N(B 10 $B;~$K(B @code{11:15} $B$r;XDj$7$?(B -$B>l9g$O(B 1$B;~4V(B15$BJ,8e$KAw?.$5$l$k$3$H$K$J$j$^$9!#$7$+$7(B @code{9:20} $B$r;XDj(B -$B$7$?>l9g$OMbF|$N;~9o$r0UL#$7$^$9!#(B -@end itemize - -@code{gnus-delay-article} $B$NF0:n$O!"0J2<$N?t8D$NJQ?t$K1F6A$5$l$^$9(B: - -@table @code -@item gnus-delay-default-hour -@vindex gnus-delay-default-hour -$BFCDj$NF|IU$r;XDj$7$?>l9g$K!"%a%C%;!<%8$,$=$NF|$N2?;~$KAw?.$5$l$k$+$rM?$((B -$B$^$9!#2DG=$JCM$O(B 0 $B$+$i(B 23 $B$^$G$N@0?t$G$9!#(B - -@item gnus-delay-default-delay -@vindex gnus-delay-default-delay -$B%G%#%U%)%k%H$NCY1d$rM?$($kJ8;zNs$G$9!#A0=R$N$I$s$J7A<0$G$b2DG=$G$9!#(B - -@item gnus-delay-group -@vindex gnus-delay-group -$BCY1d5-;v$O!"%I%i%U%H%5!<%P!<$N$3$N%0%k!<%W$K4|8B$,Mh$k$^$GJ]4I$5$l$^$9!#(B -$B$?$V$s$"$J$?$O$3$l$rJQ99$9$kI,MW$OL5$$$G$7$g$&!#%G%#%U%)%k%H$NCM(B -$B$O(B @code{"delayed"} $B$G$9!#(B - -@item gnus-delay-header -@vindex gnus-delay-header -$B$=$l$>$l$N5-;v$,Aw?.$5$l$kF|;~$O%X%C%@!<$K5-O?$5$l$^$9!#$3$NJQ?t$O%X%C%@!<(B -$BL>$NJ8;zNs$G$9!#$?$V$s$"$J$?$O$3$l$rJQ99$9$kI,MW$OL5$$$G$7$g$&!#%G%#%U%)(B -$B%k%H$NCM$O(B @code{"X-Gnus-Delayed"} $B$G$9!#(B -@end table - -$BAw?.$N@h1d$P$7$O$3$s$J$U$&$K9T$J$o$l$^$9(B: - -@code{gnus-delay-article} $B%3%^%s%I$G!"$"$J$?$O$I$N$/$i$$CY$i$;$k$+$r;XDj(B -$B$7$^$9!#(Bgnus $B$O%a%C%;!<%8$rAw?.$9$kF|;~$r7W;;$7(B -$B$F(B @code{X-Gnus-Delayed} $B%X%C%@!<$K5-O?$7!"$=$N%a%C%;!<%8(B -$B$r(B @code{nndraft:delayed} $B%0%k!<%W$KG<$a$^$9!#(B - -$B$"$J$?$,?7Ce%K%e!<%9$rj$J$/$i$$$NL?Na$,$"$j$^$9(B: -@end ifinfo - -@menu -* 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$No$K2D;k>uBV$G$"$k5-;v$N$3$H$G$9!#$*$b$7$m$$$H;W$&5-(B -$B;v$,$"$C$?>l9g$d!"C1$KFI$`$N$r@h$K1d$P$7$?$$$H$-$d!"8e$GJVEz$r$7$?$$$H$-(B -$B$K!"IaDL$O2D;k0u$rIU$1$^$9!#$7$+$7!"5-;v$O4|8B@Z$l>C5n$5$l$k$3$H$b$"$j$^(B -$B$9(B ($B%K%e!<%9%5!<%P!<$N%=%U%H%&%'%"$,%K%e!<%9%5!<%P!<>e$N5-;v$r>C5n!"(B -gnus $B<+BN$O2D;k5-;v$r4|8B@Z$l>C5n$7$^$;$s(B) $B$N$G!"1J1s$K5-;v$rJ]B8$7$F$*(B -$B$-$?$$>l9g$O!"$=$N5-;v$r1JB3$K$9$kI,MW$,$"$j$^(B -$B$9(B (@pxref{Persistent Articles})$B!#(B - -@item ? -@vindex gnus-dormant-mark -$BJ]N1$H$7$F0u$rIU$1$^$9(B (@code{gnus-dormant-mark})$B!#(B - -@dfn{$BJ]N15-;v(B}$B$O%U%)%m!<%"%C%W$,$"$C$?$H$-$K$@$135N,%P%C%U%!$K8=$l$^$9!#(B -$B%U%)%m!<%"%C%W$,L5$$$H$-$bI=<($5$;$?$$$H$-$O!"L?Na(B @kbd{/ D} $B$r;H$&$3$H(B -$B$,$G$-$^$9!#$=$l0J30$O(B ($B8+$($k$+$I$&$+$OJL$K$7$F(B)$B!"2D;k5-;v(B (Ticked) $B$H(B -$B;w$?$h$&$J$b$N$G$9!#(B - -@item SPACE -@vindex gnus-unread-mark -$BL$FI$H$7$F0u$rIU$1$^$9(B (@code{gnus-unread-mark})$B!#(B - -@dfn{$BL$FI5-;v(B}$B$O:#$^$GA4$/FI$^$l$F$$$J$$5-;v$N$3$H$G$9!#(B -@end table - -@node Read Articles -@subsection $B4{FI5-;v(B -@cindex expirable mark - -$B0J2<$N$9$Y$F$N0u$O5-;v$K4{FI$N0u$rIU$1$^$9!#(B - -@table @samp -@item r -@vindex gnus-del-mark -$BMxMQC$5$l$?5-;v(B (@code{gnus-canceled-mark})$B!#(B - -@item F -@vindex gnus-souped-mark -@sc{soup} $B$5$l$F$$$k5-;v(B (@code{gnus-souped-mark})$B!#(B@xref{SOUP}. - -@item Q -@vindex gnus-sparse-mark -$B$^$P$i$K;2>H$5$l$?5-;v(B (@code{gnus-sparse-mark})$B!#(B -@xref{Customizing Threading}. - -@item M -@vindex gnus-duplicate-mark -$B=EJ#M^@)$K$h$j4{FI$N0u$N$D$$$?5-;v(B (@code{gnus-duplicate-mark})$B!#(B -@xref{Duplicate Suppression}. -@end table - -$B$3$l$i$N$9$Y$F$N0u$O!"K\Ev$O$?$@5-;v$,4{FI$H$7$F0u$,$D$$$F$$$k$3$H$r0UL#(B -$B$9$k$@$1$G$9!#E,1~%9%3%"%j%s%0$r$7$?$H$-$K$O0c$C$?$h$&$K2r$N0u(B -@cindex process mark -@cindex bookmarks - -$B5-;v$,FI$^$l$?$+$I$&$+$K$O4X78$7$J$$0u$,$$$/$D$+$"$j$^$9!#(B - -@itemize @bullet - -@item -$B8=:_$N5-;v$K$7$*$j$r64$`$3$H$,$G$-$^$9!#$"$J$?$OG-$NG"$N=,47$K4X$9$kD9$$(B -$BO@J8$rFI$s$G$$$F!"$=$l$rFI$_=*$o$kA0$KMAw$7$?5-;v$O$9$Y$FFs7eL\$K(B @samp{F} $B$N0u$,$D$-$^(B -$B$9(B (@code{gnus-forwarded-mark})$B!#(B - -@vindex gnus-recent-mark -$B$=$N%0%k!<%W$G(B ``$B:G6a(B'' (``recently'') $BFO$$$?5-;v$OFs7eL\$K(B @samp{N} $B$N(B -$B$N0u$,$D$-$^$9(B (@code{gnus-recent-mark})$B!#$?$$$F$$$N%P%C%/%(%s%I$O$3$N0u(B -$B$r%5%]!<%H$;$:!"$=$N>l9g$OI=<($5$l$^$;$s!#(B - -@item -@vindex gnus-cached-mark -$B5-;v%-%c%C%7%e$KCy$a$i$l$F$$$k5-;v$OFs7eL\$K(B @samp{*} $B$N0u$,$D$-$^(B -$B$9(B (@code{gnus-replied-mark})$B!#(B@xref{Article Caching}. - -@item -@vindex gnus-saved-mark -($B2?$i$+$NJ}K!$K$h$C$F!(I,$:$7$b=!65E*$H$$$&$o$1$G$O$J$/(B) $B!XJ]B8$5$l$?!Y(B -$B5-;v$OFs7eL\$K(B @samp{S} $B$N0u$,$D$-$^$9(B (@code{gnus-saved-mark})$B!#(B - -@item -@vindex gnus-unseen-mark -$B$^$@FI$^$l$?$3$H$,$J$$5-;v$OFs7eL\$K(B @samp{.} $B$N0u$,$D$-$^(B -$B$9(B (@code{gnus-unseen-mark})$B!#(B - -@item -@vindex gnus-not-empty-thread-mark -@vindex gnus-empty-thread-mark -$B$b$7(B @samp{%e} $B$N;EMM$,;H$o$l$k$H!"%9%l%C%I$,$"$k$+$I$&$+$O!";07eL\(B -$B$K(B @code{gnus-not-empty-thread-mark} $B$H(B @code{gnus-empty-thread-mark} $B$N(B -$B$=$l$>$l$K$h$C$F0u$,$D$-$^$9!#(B - -@item -@vindex gnus-process-mark -$B:G8e$K(B @dfn{$B%W%m%;%90u(B} $B$,$"$j$^$9(B(@code{gnus-process-mark})$B!#$$$m$$$m$J(B -$Bl9g!"$I$N$h$&$K$J$k$N$G$7$g$&(B? - -$B$?$$$7$?$3$H$O$"$j$^$;$s!#M%@h=g0L$Ol9g!"%-%c%C%7%e0u$,$"$k$@$1$G!"JVEz:Q$_0u$O$"$j$^(B -$B$;$s!#(B - -@node Setting Marks -@subsection $B0u$rIU$1$k(B -@cindex setting marks - -$B$9$Y$F$N0u$D$1L?Na$O?tCM@\F,0z?t$rC5n$7$^(B -$B$9(B (@code{gnus-summary-clear-mark-forward})$B!#MW$9$k$K!"5-;v$KL$FI$N0u$r(B -$BIU$1$^$9!#(B - -@item M t -@itemx ! -@kindex ! ($B35N,(B) -@kindex M t ($B35N,(B) -@findex gnus-summary-tick-article-forward -$B8=:_$N5-;v$K2D;k5-;v0u$rIU$1$^(B -$B$9(B (@code{gnus-summary-tick-article-forward})$B!#(B@xref{Article Caching}. - -@item M ? -@itemx ? -@kindex ? ($B35N,(B) -@kindex M ? ($B35N,(B) -@findex gnus-summary-mark-as-dormant -$B8=:_$N5-;v$KJ]N15-;v0u$rIU$1$^(B -$B$9(B (@code{gnus-summary-mark-as-read-forward})$B!#(B@xref{Article Caching}. - -@item D -@kindex D ($B35N,(B) -@findex gnus-summary-mark-as-read-backward -$B8=:_$N5-;v$K4{FI$N0u$rIU$1!"A0$N9T$K%]%$%s%H$r0\F0$7$^(B -$B$9(B (@code{gnus-summary-mark-as-read-backward})$B!#(B - -@item M k -@itemx k -@kindex k ($B35N,(B) -@kindex M k ($B35N,(B) -@findex gnus-summary-kill-same-subject-and-select -$B8=:_$N5-;v$HF1$8I=Bj$r;}$D$9$Y$F$N5-;v$r4{FI$H$7$F0u$rIU$1!"C5n$7$^$9(B (@code{gnus-summary-clar-above})$B!#(B - -@item M V u -@kindex M V u ($B35N,(B) -@findex gnus-summary-tick-above -$B=i4|@_Dj$N%9%3%"(B ($B$b$7$/$O?tCM@\F,0z?t(B) $B$h$j$bBg$-$$%9%3%"$r;}$D$9$Y$F$N(B -$B5-;v$K2D;k0u$rIU$1$^$9(B (@code{gnus-summary-tick-above})$B!#(B - -@item M V m -@kindex M V m ($B35N,(B) -@findex gnus-summary-mark-above -$B0u$NF~NO$rB%$7!"=i4|@_Dj$N%9%3%"(B ($B$b$7$/$O?tCM@\F,0z?t(B) $B$h$j$bBg$-$J%9%3(B -$B%"$r;}$D$9$Y$F$N5-;v$K$=$N0u$rIU$1$^$9(B (@code{gnus-summary-mark-above})$B!#(B -@end table - -@vindex gnus-summary-goto-unread -$BJQ?t(B @code{gnus-summary-goto-unread} $B$O0u$,IU$1$i$l$?8e$K$I$N$h$&$JF0:n(B -$B$,$J$5$l$k$+$r7hDj$7$^$9!#$b$7(B @code{nil} $B$G$J$$$H!"%]%$%s%H$Oe$+2<$K9T$/(B -$B$@$1$G$9!#FCJL$J>l9g$H$7$F!"$3$NJQ?t$,(B @code{never} $B$G$"$k$H!"$9$Y$F$N0u(B -$B$rIU$1$kL?Na$H(B (@kbd{SPACE} $B$N$h$&$J(B) $BB>$NL?Na$O$N(B -$B8=:_$N5-;v$KN1$^$C$F$b$i$$$?$$?M$b$$$k$G$7$g$&!#$=$7$F!"$^$@A0$N(B ($BL$(B -$BFI(B) $B5-;v$K9T$C$F$[$7$$?M$,$$$k$H$OJ9$$$?$3$H$O$"$j$^$;$s$,!"$=$&$7$?$$$H(B -$B;W$&?M$b4V0c$$$J$/$$$k$H;W$$$^$9!#(B - -$B$3$N8^$D$NF0:n$r8^$D$N0c$C$?0uIU$1L?Na$H3]$1;;$9$k$H!"$I$NL?Na$,2?$r$9$Y(B -$B$-$+$NHs>o$KJ#;($JJQ?t$NAH$r$b$D$3$H$K$J$j$^$9!#(B - -$B$3$NHa7`$+$iF($l$k$?$a$K!"(Bgnus $B$O$3$l$i$9$Y$F$N0c$C$?$3$H$r$9$kL?Na$rDs(B -$B6!$7$^$9!#$3$l$i$O35N,%P%C%U%!$N(B @kbd{M M} $B%^%C%W$K$"$j$^$9!#A4$F$r$_$k(B -$B$?$a$K$O(B @kbd{M M C-h} $B$rF~NO$7$F$/$@$5$$(B---$B$3$N%^%K%e%"%k$G0lMw$r=P$9$K(B -$B$OB?2a$.$^$9!#(B - -$B$3$l$i$NL?Na$rD>@\;H$&$3$H$O$G$-$^$9$,!"$[$H$s$I$NMxMQl9g$O!"(B -$B$=$N5-;v$@$1$rL$A*Br$K$7$^$9!#$=$N9T$N%9%l%C%I$+5-;v$rL$A*Br$K$9$k$?$a$K(B -$B$3$N%-!<$K?tCM@\F,0z?t$rM?$($k;v$,$G$-$^$9!#(B - -@item M P u -@itemx M-# -@kindex M P u ($B35N,(B) -@kindex M-# ($B35N,(B) -$B$b$78=:_$N5-;v$K%W%m%;%90u$,$"$l$PH$7$F2<$5$$!#(B - -@node Limiting -@section $B@)8B$r$9$k(B -@cindex limiting - -$B35N,%P%C%U%!$,8=:_%0%k!<%W$K$"$k5-;v$N0lIt$@$1$rI=<($9$k$h$&$K@)8B$G$-$l(B -$B$PJXMx$J$3$H$,$"$j$^$9!#B?$/$N@)8BL?Na$,;}$D8z2L$O35N,%P%C%U%!$+$i>/(B -$B$7(B ($B$b$7$/$OB?$/(B) $B$N5-;v$r35N,%P%C%U%!$+$i:o=|$9$k$3$H$G$9!#(B - -$B$9$Y$F$N@)8BL?Na$O%5!<%P!<$+$i4{$K\:Y$O(B @pxref{Group Parameters} $B$r;2>H$7$F2<$5$$!#(B - -@item / E -@itemx M S -@kindex M S ($B35N,(B) -@kindex / E ($B35N,(B) -@findex gnus-summary-limit-include-expunged -$B$9$Y$F$N>C5n$5$l$?5-;v$rI=<($7$^(B -$B$9(B (@code{gnus-summary-limit-include-expunged})$B!#(B - -@item / D -@kindex / D ($B35N,(B) -@findex gnus-summary-limit-include-dormant -$B$9$Y$F$NJ]N15-;v$rI=<($7$^$9(B (@code{gnus-summary-limit-include-dormant})$B!#(B - -@item / * -@kindex / * ($B35N,(B) -@findex gnus-summary-limit-include-cached -$B$9$Y$F$N%-%c%C%7%e$KF~$C$F$$$k5-;v$rI=<($7$^(B -$B$9(B (@code{gnus-summary-limit-include-cached})$B!#(B - -@item / d -@kindex / d ($B35N,(B) -@findex gnus-summary-limit-exclude-dormant -$B$9$Y$F$NJ]N15-;v$r1#$7$^$9(B (@code{gnus-summary-limit-exclude-dormant})$B!#(B - -@item / M -@kindex / M ($B35N,(B) -@findex gnus-summary-limit-exclude-marks -$BA4$F$N0uIU$-5-;v$r=|30$7$^$9(B (@code{gnus-summary-limit-exclude-marks})$B!#(B - -@item / T -@kindex / T ($B35N,(B) -@findex gnus-summary-limit-include-thread -$B8=:_$N%9%l%C%I$N$9$Y$F$N5-;v$rI=<($7$^(B -$B$9(B (@code{gnus-summary-limit-include-thread})$B!#(B - -@item / c -@kindex / c ($B35N,(B) -@findex gnus-summary-limit-exclude-childless-dormant -$B;R5-;v$NL5$$$9$Y$F$NJ]N15-;v$r1#$7$^(B -$B$9(B (@code{gnus-summary-limit-exclude-childless-dormant})$B!#(B - -@item / C -@kindex / C ($B35N,(B) -@findex gnus-summary-limit-mark-excluded-as-read -$B$9$Y$F$NL$FI$N$_$N0u$N5-;v$r4{FI$H$7$F0u$rIU$1$^(B -$B$9(B (@code{gnus-summary-limit-mark-excluded-as-read})$B!#$b$7@\F,0z?t$,M?$((B -$B$i$l$l$P!"2D;k$HJ]N1$N$_$N0u$N5-;v$b4{FI$H$7$F0u$rIU$1$^$9!#(B -@end table - -@node Threading -@section $B%9%l%C%I(B -@cindex threading -@cindex article threading - -Gnus $B$O=i4|@_Dj$G5-;v$r%9%l%C%I$K$7$^$9!#(B@dfn{$B%9%l%C%I$K$9$k(B} $B$H$O!"$"$k(B -$B5-;v$X$N1~Ez$r1~Ez$7$?5-;v$ND>8e$KCV$/!=!=3,AXE*N.57$G(B $B$H$$$&$3$H$G$9!#(B - -$B%9%l%C%I$O5-;v$N(B @code{References} $BMs$rD4$Y$k$3$H$K$h$C$F9T$o$l$^$9!#40(B -$BA4$J@$3&$G$O!"$3$l$@$1$GNI$$LZ$r:n$j>e$2$k$N$K==J,$J$N$G$9$,!"IT1?$J$3$H(B -$B$K!"(B@code{References} $BMs$O$7$P$7$P2u$l$F$$$k$+!";~$K$OC1$K$J$$$H$$$&$3$H(B -$B$,$"$j$^$9!#IT;W5D$J%K%e!<%9$NA}?#$,LdBj$rA}$d$7$^$9$N$G!"4n$P$7$$7k2L$r(B -$BF@$k$?$a$K$OB>$NH/8+K!$r:NMQ$7$J$1$l$P$J$j$^$;$s!#2a>j$JBP:vK!$OB8:_$7$F(B -$B$$$F!"$=$N62$k$Y$->\:Y$O(B @pxref{Customizing Threading} $B$K>\$7$/=q$$$F$"(B -$B$j$^$9!#(B - -$B$^$:!"35G0$N354Q$G$9(B: - -@table @dfn -@item $B:,K\(B (root) -$B%9%l%C%I$G0lHVD:E@$K$"$k5-;v$G$9!(%9%l%C%I$N:G=i$N5-;v$G$9!#(B - -@item $B%9%l%C%I(B (thread) -$BLZ$N$h$&$J5-;v$N9=@.$G$9!#(B - -@item $BItJ,%9%l%C%I(B (sub-thread) -$BLZ$N$h$&$J9=B$$N(B ($B$h$j(B) $B>.$5$JItJ,$G$9!#(B - -@item $BL5B+G{%9%l%C%I(B (loose threads) -$B5-;v$N4|8B@Z$l:o=|$d!":,K\$,4{$KA02s$N%;%C%7%g%s$GFI$^$l$?$3$H$K$h$j35N,(B -$B%P%C%U%!$KI=<($5$l$J$$!"Ey$NM}M3$K$h$j!"%9%l%C%I$O$7$P$7$P:,K\$r<:$$$^$9!#(B -$B$=$N$h$&$J$H$-$K$O!"IaDL$OB?$/$NItJ,%9%l%C%I$,$"$C$F!"K\Ev$O0l$D$N%9%l%C(B -$B%I$KB0$7$F$$$k$N$G$9$,!":,K\$K$O$D$J$,$C$F$$$J$$!"$H$$$&$3$H$K$J$j$^$9!#(B -$B$3$&$$$&%9%l%C%I$,L5B+G{%9%l%C%I$H8F$P$l$F$$$^$9!#(B - -@item $B%9%l%C%I=8$a(B (thread gathering) -$B$^$P$i%9%l%C%I$rBg$-$J%9%l%C%I$K=8$a$h$&$H$9$k;n$_$G$9!#(B - -@item $B$^$P$i%9%l%C%I(B (sparse threads) -$BL5$$5-;v$,!X?dB,$5$l$?!Y%9%l%C%I$G!"35N,%P%C%U%!$K6u9T$GI=<($5$l$^$9!#(B -@end table - -@menu -* Customizing Threading:: $BJQ992DG=$J%9%l%C%I$K1F6A$9$kJQ?t(B -* Thread Commands:: $B35N,%P%C%U%!$G$N%9%l%C%I$K4p$E$$$?L?Na(B -@end menu - -@node Customizing Threading -@subsection $B%9%l%C%I$r%+%9%?%^%$%:$9$k(B -@cindex customizing threading - -@menu -* Loose Threads:: Gnus $B$,L5B+G{%9%l%C%I$r=8$a$FBg$-$J%9%l%C(B - $B%I$K$9$kJ}K!(B -* Filling In Threads:: $B%9%l%C%I$rKd$a$k(B -* More Threading:: $B%9%l%C%I$r$$$8$/$k$5$i$KB?$/$NJQ?t(B -* Low-Level Threading:: $B$3$l$G=*$o$C$?$H;W$C$?$G$7$g$&(B... $B$G$b$"(B - $B$J$?$O4V0c$C$F$$$?(B! -@end menu - -@node Loose Threads -@subsubsection $BL5B+G{%9%l%C%I(B -@cindex < -@cindex > -@cindex loose threads - -@table @code -@item gnus-summary-make-false-root -@vindex gnus-summary-make-false-root -$B$b$7(B @code{nil} $B$G$J$$$H!"(Bgnus $B$OA4$F$N$D$J$,$C$F$$$J$$ItJ,LZ$r0l$D$NBg(B -$B$-$JLZ$K$7$F!"D:>e$K$_$;$+$1$N:,K\$r:n$j$^$9!#(B($B$A$g$C$HBT$C$F$/$@$5$$!#(B -$BD:>e$K:,85(B (root) $B$G$9$C$F(B? $B$($(!"$=$&$J$N$G$9!#(B) $B$D$J$,$C$F$$$J$$ItJ,LZ(B -$B$OK\Ev$N:,K\$,4|8B@Z$l:o=|$5$l$?$+!"A02s$N%;%C%7%g%s$G:,K\$rFI$s$@$j:o=|(B -$B$7$?$H$-$K$G$-$^$9!#(B - -$BK\Ev$N%9%l%C%I$,L5$$$H$-$O!"(Bgnus $B$O2?$+$G$C$A>e$2$r$9$kI,MW$,$"$j$^$9!#(B -$B$3$NJQ?t$O(B gnus $B$,;H$&$Y$-$4$^$+$7$NJ}K!$r<($7$F$$$^$9!#CM$H$7$F$H$k$3$H(B -$B$,$G$-$k;M$D$N8uJd$,$"$j$^$9!#(B - -@iftex -@iflatex -\gnusfigure{The Summary Buffer}{390}{ -\put(0,0){\epsfig{figure=tmp/summary-adopt.ps,width=7.5cm}} -\put(445,0){\makebox(0,0)[br]{\epsfig{figure=tmp/summary-empty.ps,width=7.5cm}}} -\put(0,400){\makebox(0,0)[tl]{\epsfig{figure=tmp/summary-none.ps,width=7.5cm}}} -\put(445,400){\makebox(0,0)[tr]{\epsfig{figure=tmp/summary-dummy.ps,width=7.5cm}}} -} -@end iflatex -@end iftex - -@cindex adopting articles - -@table @code -@item $BM\;R(B (adopt) -Gnus $B$O:G=i$N8I;y$r?F$K$7$^$9!#$3$N?F$O$9$Y$F$NB>$N5-;v$rM\;R$K$7$^$9!#(B -$B$3$NM\;R5-;v$O!"I8=`$N3Q3g8L(B (@samp{[]}) $B$NBe$o$j$K!"@h$N@m$C$?3g(B -$B8L(B (@samp{<>}) $B$G0uIU$1$i$l$^$9!#$3$l$,=i4|@_Dj$NJ}K!$G$9!#(B - -@item $B$_$;$+$1(B (dummy) -@vindex gnus-summary-dummy-line-format -Gnus $B$O?F$N$U$j$r$9$k$_$;$+$1$N35N,9T$r$D$/$j$^$9!#$_$;$+$1$N9T$O$I$NK\(B -$BEv$N5-;v$K$bBP1~$7$^$;$s$N$G!"$=$l$rA*Br$9$k$3$H$O!"$_$;$+$1$N5-;v$N8e$N(B -$B:G=i$NK\Ev$N5-;v$rA*Br$r$9$k$@$1$K$J$j$^$9!#$_$;$+$1$N:,K\$NMM<0$r;XDj(B -$B$9$k$?$a$K!"(B@code{gnus-summary-dummy-line-format} $B$,;H$o$l$^$9!#$3$l$O$?$C(B -$B$?0l$D$@$1$N%U%)!<%^%C%H$N;EMM$r$N5-;v$r(B -$BI=<($9$k$@$1$G$9!#(B - -@item nil -$BL5B+G{%9%l%C%I$r=8$a$^$;$s!#(B -@end table - -@item gnus-summary-gather-subject-limit -@vindex gnus-summary-gather-subject-limit -$BL5B+G{%9%l%C%I$O5-;v$NI=Bj$rHf3S$9$k$3$H$K$h$C$F=8$a$i$l$^$9!#$b$7$3$NJQ(B -$B?t$,(B @code{nil} $B$G$"$k$H!"(Bgnus $B$OL5B+G{%9%l%C%I$r0l$D$NBg$-$JD6%9%l%C%I(B -$B$K=8$a$kA0$K!"L5B+G{%9%l%C%I$NI=Bj$,40A4$K0lCW$9$k$3$H$rMW5a$7$^$9!#$3$l(B -$B$O!"D9$$I=Bj$N9T$r@Z$jMn$H$7$F$7$^$&4VH4$1$J%K%e!<%9%j!<%@!<$,B8:_$9$k8=(B -$B:_$G$O!"$"$^$j$K87$7$$MW5a$+$bCN$l$^$;$s!#$b$7$=$&;W$&$N$J$i!"$3$NJQ?t$r(B -$BNc$($P(B 20 $B$K@_Dj$7$F!"I=Bj$N:G=i$N(B 20 $BJ8;z$@$1$,0lCW$9$k$3$H$rMW5a$9$k$h(B -$B$&$K$9$k$3$H$,$G$-$^$9!#$3$NJQ?t$rK\Ev$KDc$$?t;z$K@_Dj$9$k$H!"(Bgnus $B$,L\(B -$B$KF~$kA4$F$r0l$D$N%9%l%C%I$K=8$a$k$N$r8+$k$3$H$,$G$-$k$G$7$g$&!#$=$7$F!"(B -$B$=$l$O$"$^$jM-MQ$G$O$"$j$^$;$s!#(B - -@cindex fuzzy article gathering -$B$3$NJQ?t$rFCJL$JCM(B @code{fuzzy} $B$K@_Dj$9$l$P!"(Bgnus $B$OI=Bj$K$"$$$^$$$JJ8(B -$B;zNsHf3S%"%k%4%j%:%`$r;H$$$^$9(B (@pxref{Fuzzy Matching})$B!#(B - -@item gnus-simplify-subject-fuzzy-regexp -@vindex gnus-simplify-subject-fuzzy-regexp -$B$3$l$O@55,I=8=$+!"$"$$$^$$I=Bj;XDj$,;H$o$l$F$$$k$H$-$KI=Bj$+$i9gCW$7$?$b(B -$B$N$, -@lisp -(setq gnus-simplify-ignored-prefixes - (concat - "\\`\\[?\\(" - (mapconcat - 'identity - '("looking" - "wanted" "followup" "summary\\( of\\)?" - "help" "query" "problem" "question" - "answer" "reference" "announce" - "How can I" "How to" "Comparison of" - ;; ... - ) - "\\|") - "\\)\\s *\\(" - (mapconcat 'identity - '("for" "for reference" "with" "about") - "\\|") - "\\)?\\]?:?[ \t]*")) -@end lisp - -$B$3$N@55,I=8=$K9gCW$9$k$9$Y$F$N8l$O!"Fs$D$NI=Bj$rHf3S$9$kA0$Ke=q$-$7$^$9!#$3$NJQ?t$OJ8(B -$B;zNs(B @code{Subject} $B$rH?I|$7$F4JC1$J7A$K$?$I$jCe$/$?$a$KE,MQ$9$k4X?t$N%j(B -$B%9%H$G$"$kI,MW$,$"$j$^$9!#(B - -$B$3$N%j%9%H$KF~$l$FLr$KN)$D$h$&$J4X?t$OJ,$J6uGr(B (whitespace) $B$ru67$r>/$7$h$/$9$k$?$a$K!"$I$NI=Bj$,=8$a$k2a(B -$BDx$+$i=|$+$l$k$+$r7h$a$k@55,I=(B -$B8=(B @code{gnus-summary-gather-exclude-subject} $B$r;H$&$3$H$,$G$-$^$9!#%G%#(B -$B%U%)%k%H$O(B @samp{^ *$\\|^(none)$} $B$G$9!#(B - -@item gnus-summary-thread-gathering-function -@vindex gnus-summmary-thread-gathering-function -Gnus $B$O(B @code{Subject} $BMs$r8+$k$3$H$K$h$C$F%9%l%C%I$r=8$a$^$9!#$3$l$O!"(B -$B7k2LE*$KA4$/4X78$NL5$$5-;v$,F1$8!X%9%l%C%I!Y$K4^$^$l$k$3$H$,$"$k$H$$$&$3(B -$B$H$G!"$3$l$O:.Mp$N85$G$9!#BeBXZ(B -$B$7$^$9$,!"$3$o$l$?%K%e!<%9%j!<%@!<$GEj9F$7$?5-;v$OE,@Z$K=8$a$i$l$J$$$H$$(B -$B$&$3$H$G$b$"$j$^$9!#A*Br8"$O$"$J$?$K$"$j$^$9!=!=1VIB$+%3%l%i$+!#(B - -@table @code -@item gnus-gather-threads-by-subject -@findex gnus-gather-threads-by-subject -$B$3$N4X?t$O%G%#%U%)%k%H$N<}=84X?t$G!"GSB>E*$K(B @code{Subject} $B$r8+$^$9!#(B - -@item gnus-gather-threads-by-references -$B$3$N4X?t$OGSB>E*$K(B @code{References} $BMs$r8+$^$9!#(B -@end table - -@code{References} $B$K$h$C$F=8$a$k$3$H$r;n$7$F$_$?$$$N$G$"$l$P!"/$J$$35N,9T$rI=<($7$?$$$1$l$I!"$G$-$k$@$1$?$/$5$s$NHsL)%9%l%C(B -$B%I$K@\B3$7$F$*$-$?$$$H$-$O!"$3$NJQ?t$r(B @code{some} $B$+?t;z$K@_Dj$9$k$3$H(B -$B$,$G$-$^$9!#$b$7?t;z$K@_Dj$7$?$H$-$O!"$=$l$h$jB?$$DI2C$N%X%C%@!<$Ol9g$G$b!"8E$$%X%C%@!<$Nl9g$K;H$&$3$H$rA[Dj$7$F$$$^$9!#$=$l$Ol9g$O%G%#%U%)%k%H$N(B @code{nil} $B$N$^$^$K$7$F$*$/$N$,L5Fq$G(B -$B$9!#;H$$$?$$>l9g$O%0%k!<%WL>$K9gCW$9$k@55,I=8=$+!"$9$Y$F$N%0%k!<%WL>$K9g(B -$BCW$9$k(B @code{t} $B$K$7$F2<$5$$!#(B -@end table - -@node More Threading -@subsubsection $B$b$C$H%9%l%C%I$r(B - -@table @code -@item gnus-show-threads -@vindex gnus-show-threads -$B$3$NJQ?t$,(B @code{nil} $B$G$"$k$H!"%9%l%C%I$O:n$i$l$:!"$3$3$K$"$k;D$j$N$9$Y(B -$B$F$NJQ?t$OA4$/8z2L$,L5$/$J$j$^$9!#%9%l%C%I:n$j$r;_$a$k$H%0%k!<%W$NA*Br$,(B -$B>/$7B.$/$J$j$^$9$,!"5-;v$rFI$`$N$,$b$C$HCY$/!"ITJX$K$J$k$3$H$O3N/$J$$Am9gE*%9%3%"(B (@code{gnus-thread-score-function}) $B$r;}(B -$B$D$9$Y$F$N%9%l%C%I$O>C5n$5$l$^$9!#$3$NJQ?t$O%G%#%U%)%k%H$G(B -$B$O(B @code{nil} $B$G!"$3$l$O$I$N%9%l%C%I$b>C5n$5$l$J$$$H$$$&$3$H$G$9!#(B - -@item gnus-thread-hide-killed -@vindex gnus-thread-hide-killed -$B$b$7%9%l%C%I$r:o=|$7$F!"$3$NJQ?t$,(B @code{nil} $B$G$J$$$H!"ItJ,LZ$O1#$5$l$^(B -$B$9!#(B - -@item gnus-thread-ignore-subject -@vindex gnus-thread-ignore-subject -$B;~!9!"C/$+$,%9%l%C%I$N??Cf$GI=Bj$rJQ99$9$k$3$H$,$"$j$^$9!#$b$7$3$NJQ?t(B -$B$,(B @code{nil} $B$G$J$$$H!"$3$l$,%G%#%U%)%k%H$G$9$,!"I=Bj$NJQ99$OL5;k$5$l$^(B -$B$9!#$b$7(B @code{nil} $B$@$H!"I=Bj$NJQ99$r$9$k$HJL$N%9%l%C%I$K$J$j$^$9!#(B - -@item gnus-thread-indent-level -@vindex gnus-thread-indent-level -$B$3$N?t;z$OItJ,%9%l%C%I$,$I$l$/$i$$;z2<$2(B (indent) $B$5$l$k$Y$-$+$r7h$a$^$9!#(B -$B%G%#%U%)%k%H$O(B 4 $B$G$9!#(B - -@item gnus-sort-gathered-threads-function -@vindex gnus-sort-gathered-threads-function -$B$H$-$I$-!"FC$K%a!<%j%s%0%j%9%H$G!"$C$F!"I{%9%l%C(B -$B%I$r=i4|@_Dj$N(B @code{gnus-thread-sort-by-number} $B$GJB$S49$($k$H!"1~Ez$N(B -$BJ}$,$=$l$,1~Ez$7$F$$$k5-;v$h$j@h$K8=$l$k$3$H$,$"$j$^$9!#%0%k!<%W%Q%i%a!<(B -$B%?$dE,@Z$J%U%C%/(B ($BNc$($P(B @code{gnus-summary-generate-hook}) $B$G$3$NJQ?t$r(B -$BBe$o$j$NCM(B ($BNc$($P!"(B@code{gnus-thread-sort-by-date}) $B$K@_Dj$9$k$3$H$G!"(B -$B$=$N$h$&$J>l9g$K!"$h$jO@M}E*$JI{%9%l%C%I$N=gHV$r@8@.$9$k$3$H$,$G$-$^$9!#(B -@end table - -@node Low-Level Threading -@subsubsection $BDc%l%Y%k$K$*$1$k%9%l%C%I:n@.(B - -@table @code -@item gnus-parse-headers-hook -@vindex gnus-parse-headers-hook -$B$9$Y$F$N%X%C%@!<$r2r@O$9$kA0$K$N$b$N$rIU$12C(B -$B$($k$3$H$K$h$k(B) $BBN7OE*$JJ}K!$G(B @code{Message-ID} $B$r8r49$9$k%a!<%k$+$i(B -$B%K%e!<%9$X$N%2!<%H%&%'%$$,$"$k>l9g!"(B@code{Message-ID} $B$,$b$C$H0UL#$N$"$k(B -$B$b$N$K$9$k$?$a$K!"$3$NJQ?t$r@_Dj$7$F85$KLa$9$3$H$,$G$-$^$9!#$3$l$O0l$D$N(B -$BNc$G$9(B: - -@lisp -(setq gnus-alter-header-function 'my-alter-message-id) - -(defun my-alter-message-id (header) - (let ((id (mail-header-id header))) - (when (string-match - "\\(<[^<>@@]*\\)\\.?cygnus\\..*@@\\([^<>@@]*>\\)" id) - (mail-header-set-id - (concat (match-string 1 id) "@@" (match-string 2 id)) - header)))) -@end lisp -@end table - -@node Thread Commands -@subsection $B%9%l%C%I$NL?Na(B -@cindex thread commands - -@table @kbd -@item T k -@itemx M-C-k -@kindex T k ($B35N,(B) -@kindex M-C-k ($B35N,(B) -@findex gnus-summary-kill-thread -$B8=:_$N(B ($BItJ,(B) $B%9%l%C%I$K4{FI$N0u$rIU$1$^(B -$B$9(B (@code{gnus-summary-kill-thread})$B!#$b$7@\F,0z?t$,@5$G$"$k$H!"Be$o$j$K(B -$B$9$Y$F$N0u$re$2$^(B -$B$9(B (@code{gnus-summary-raise-thread})$B!#(B - -@item T # -@kindex T # ($B35N,(B) -@findex gnus-uu-mark-thread -$B%W%m%;%90u$r8=:_$N(B ($BItJ,(B) $B%9%l%C%I$KIU$1$^(B -$B$9(B (@code{gnus-uu-mark-thread})$B!#(B - -@item T M-# -@kindex T M-# ($B35N,(B) -@findex gnus-uu-unmark-thread -$B8=:_$N(B ($BItJ,(B) $B%9%l%C%I$+$i%W%m%;%90u$r$7$^(B -$B$9(B (@code{gnus-summary-rethread-current})$B!#$3$l$O35N,%P%C%U%!$,%9%l%C%I(B -$BI=<($5$l$F$$$J$$$H$-$G$bF0:n$7$^$9!#(B - -@item T ^ -@kindex T ^ ($B35N,(B) -@findex gnus-summary-reparent-thread -$B8=:_$N5-;v$r0uIU$-(B ($B$b$7$/$OA0$N(B) $B5-;v$N;R5-;v$K$7$^(B -$B$9(B (@code{gnus-summary-reparent-thread})$B!#(B -@end table - -$B0J2<$NL?Na$O%9%l%C%I0\F0L?Na$G$9!#$3$l$i$O$9$Y$F?tCM@\F,0z?t$re>:$7$^$9(B (@code{gnus-summary-up-thread})$B!#(B - -@item T o -@kindex T o ($B35N,(B) -@findex gnus-summary-top-thread -$B%9%l%C%I$ND:>e$K0\F0$7$^$9(B (@code{gnus-summary-top-thread})$B!#(B -@end table - -@vindex gnus-thread-operation-ignore-subject -$B%9%l%C%I$r:n@.$9$k$H$-$KI=Bj$rL5;k$9$k$H!"<+A3$K%9%l%C%I$K$O$$$/$D$+$N0c$C(B -$B$?I=Bj$,$"$k$3$H$K$J$j$^$9!#$=$l$+(B -$B$i(B `T k' (@code{gnus-summary-kill-thread}) $B$N$h$&$JL?Na$rH/$9$k$H$-$K!"(B -$BA4BN$N%9%l%C%I$r:o=|$9$k$N$G$O$J$/!"8=:_$N5-;v$HF1$8I=Bj$r;}$DItJ,$@$1$r(B -$B:o=|$7$?$$$H$-$,$"$k$+$b$7$l$^$;$s!#$b$7$3$NH/A[$,NI$$$H;W$&$N$G$"$l$P!"(B -@code{gnus-thread-operation-ignore-subject} $B$r$$$8$/$k$3$H$,$G$-$^$9!#$3(B -$B$l$,(B @code{nil} $B$G$J$$$H(B ($B$3$l$,%G%#%U%)%k%H$G$9$,(B)$B!"%9%l%C%I$NL?Na$r$N%9%l%C%I$h$j@h$KJB$SBX(B -$B$($i$l$k$Y$-$G$"$l$P!"(B@code{nil} $B$G$J$$CM$r$+$($7$^$9!#IaDL!"JB$SBX$($O(B -$BK\Ev$O$=$l$>$l$N%9%l%C%I$N:,K\$r8+$k$@$1$K$h$j$J$5$l$k$3$H$K5$$rIU$1$F$/(B -$B$@$5$$!#$b$7Fs$D0J>e$N4X?t$r;H$&>l9g!"M%@hE*JB$SBX$(%-!<$O%j%9%H$N:G8e$N(B -$B4X?t$G$9!#$*$=$i$/$$$D$b(B @code{gnus-thread-sort-by-number} $B$rJB$SBX$(4X(B -$B?t$N%j%9%H!=!=:G=i$,9%$^$7$$(B $B$KF~$l$F$*$/$Y$-$G$7$g$&!#$3$l$OB>$NJB$SBX(B -$B$(4p=`$K4X$7$FEy$7$$%9%l%C%I$O5-;v$,>e$,$C$F$$$/=gHV$KI=<($5$l$k$3$H$rJ](B -$B>Z$7$^$9!#(B - -$B%9%3%"$N5U=g!"I=Bj!"$=$7$F:G8e$KHV9f!"$N=g$KJB$SBX$($?$$$N$G$"$l$P!"l9g$O!"1Q;z=g$KJB$S$+$($i$l$^$9!#%9%3%"$HI=Bj$,F1$8%9%l%C%I$OHV9f(B -$B$GJB$SBX$($i$l!"(B($BIaDL$O(B) $B5-;v$,E~Ce$7$?=gHV$K$J$j$^$9!#(B - -$B%9%3%"!"E~Ce$N5U=g$KJB$SBX$($?$$$N$G$"$l$P!"h!"$b$7$/$O$"$J$?$N9%4q?4$r$/(B -$B$9$0$k$h$&$J2?$+$G$7$g$&!#(B - -@findex gnus-article-sort-functions -@findex gnus-article-sort-by-date -@findex gnus-article-sort-by-score -@findex gnus-article-sort-by-subject -@findex gnus-article-sort-by-author -@findex gnus-article-sort-by-number -$B2?$+4qL/$JM}M3$J$I$G%9%l%C%II=<($r;H$C$F$$$J$$$N$J$i!"JQ(B -$B?t(B @code{gnus-article-sort-functions} $B$r$$$8$/$kI,MW$,$"$j$^$9!#$3$l(B -$B$O(B @code{gnus-thread-sort-functions} $B$HHs>o$K;w$F$$$^$9$,!"5-;v$NHf3S$K(B -$B$O>/!90c$C$?4X?t$r;H$$$^$9!#;HMQ2DG=$JJB$SBX$(=R8l4X?t(B -$B$O(B @code{gnus-article-sort-by-number}, @code{gnus-article-sort-by-author}, @code{gnus-article-sort-by-subject}, @code{gnus-article-sort-by-date} $B$*(B -$B$h$S(B @code{gnus-article-sort-by-score} $B$G$9!#(B - -$B%9%l%C%I$r;H$C$F$$$J$$I=Bj$N35N,I=<($rJB$SBX$($?$$$N$G$"$l$P!"u67$rHr$1$k$?$a$K!"(Bgnus $B$O%5!<%P!<$KFs$D$N(B ($B$=$l$O(B 2 $B$H?t$($F$/$@$5(B -$B$$(B) $B@\B3$rD%$k$3$H$,$G$-$^$9!#$3$l$O$"$^$j$7$FNI$$$3$H$G$O$J$$$H9M$($k?M(B -$B$b$$$k$G$7$g$&$,!";d$K$OJ,$J@\B3$r(B -$B$9$k$?$a$K$O2?$i$+$N;~4V$,$+$+$j$^$9$N$G!"(Bgnus $B$N5/F0$OCY$/$J$j$^$9!#(B - -Gnus $B$O$"$J$?$,FI$`$G$"$m$&5-;v$h$j$b$?$/$5$s$N5-;v$rJ,$J5-;v$NMW5a$H!"M>J,$J@\B3$G!#(B - -$B$O$$!"$3$l$GK\Ev$O$3$N$h$&$J$3$H$r$9$Y$-$GL5$$;v$,J,$+$C$?$G$7$g$&(B... $BK\(B -$BEv$K$=$&$7$?$$$H;W$o$J$$8B$j$O!#(B - -@vindex gnus-asynchronous -$B$3$l$,J}K!$G$9(B: @code{gnus-asynchronous} $B$r(B @code{t} $B$K@_Dj$7$F$/$@$5$$!#(B -$B;D$j$N$3$H$O<+F0E*$K5/$3$j$^$9!#(B - -@vindex gnus-use-article-prefetch -@code{gnus-use-article-prefetch} $B$r@_Dj$9$k$3$H$K$h$j!"$I$l$/$i$$$N5-;v(B -$B$,@h$Ko$K(B}$BCY$$(B @sc{nntp} $B@\B3$G$"$k$J$i$P!"5-;v%-%c%C%7%e$r$9$k$3(B -$B$H$r9M$($k$+$b$7$l$^$;$s!#$=$&$9$k$H!"$=$l$>$l$N5-;v$O$"$J$?$N%[!<%`%G%#(B -$B%l%/%H%j$N2<$K%m!<%+%k$KN/$a$i$^$9!#4{$K?dB,$5$l$F$$$k$+$bCN$l$^$;$s$,!"(B -$B$3$l$O(B @emph{$B5pBg$J(B}$B%G%#%9%/%9%Z!<%9$r?)$$!"(Bi$B%N!<%I$bHs>o$KB.$/?)$$$D$V(B -$B$92DG=@-$,$"$k$?$a!"$=$l$O$"$J$?$NF,$r1K$,$;$k;v$K$J$k$+$b$7$l$^$;$s!#(B -$B%&%)%C%+$NCf$G!#(B - -$B$G$bCm0U?<$/;H$o$l$l$P!"$=$l$O5-;v$rJ]B8$9$k4JC1$JJ}K!$K$J$jF@$^$9!#(B - -@vindex gnus-use-long-file-name -@vindex gnus-cache-directory -@vindex gnus-use-cache -$B%-%c%C%7%e$rl9g$O!"%5!<%P!<$NBe$o$j$K%-%c%C%7%e$+$iJ}$H$b%7%s%\%k$N%j%9%H$G$9!#A0/(B -$B$J$/$9$k0l$D$NJ}K!$O!"M_$7$/$J$$5-;v$N%9%3%"$rDc$/$7!"4{FI$N0u$rIU$1$k;v(B -$B$G$9!#$=$&$7$?>l9g!"$=$l$i$O$3$NL?Na$G$O%@%&%s%m!<%I$5$l$^$;$s!#(B - -@vindex gnus-uncacheable-groups -@vindex gnus-cacheable-groups -$B$$$/$D$+$N%0%k!<%W$G$O%-%c%C%7%e$r$7$?$/$J$$$H$$$&$N$ONI$/$"$k;v$G$9!#Nc(B -$B$($P!"(B@code{nnml} $B%a!<%k%G%#%l%/%H%j!<$,%[!<%`%G%#%l%/%H%j!<$N2<$K$"$l$P!"(B -$B$=$l$r$"$J$?$N%[!<%`%G%#%l%/%H%j!<$N2<$NJL$N>l=j$K%-%c%C%7%e$9$k$N$O0UL#(B -$B$NL5$$;v$G$9!#$"$J$?$,FsG\$NMFNL$r;H$&;v$,NI$$$H46$8$J$$8B$j$O!#(B - -$B%-%c%C%7%e$r@)8B$9$k$?$a$K!"(B@code{gnus-cacheable-groups} $B$r(B $B$r%-%c%C%7%e(B -$B$9$k%0%k!<%W$NO"A[%j%9%H!"Nc$($P(B @samp{^nntp}$B!"$H$9$k$+!"@55,I=(B -$B8=(B @code{gnus-uncacheable-groups} $B$rNc$($P!"(B@samp{^nnml} $B$K@_Dj$7$F2<$5(B -$B$$!#N>J}$NJQ?t$N=i4|CM$O(B @code{nil} $B$G$9!#$b$7%0%k!<%W$,N>J}$N@55,I=8=$K(B -$B9gCW$9$k$H!"$=$N%0%k!<%W$O%-%c%C%7%e$5$l$^$;$s!#(B - -@findex gnus-cache-generate-nov-databases -@findex gnus-cache-generate-active -@vindex gnus-cache-active-file -$B%-%c%C%7%e$O$I$N5-;v$,4^$^$l$F$$$k$+$N>pJs$r%"%/%F%#%V%U%!%$(B -$B%k(B (@code{gnus-cache-active-file}) $B$KN/$a$^$9!#$3$N%U%!%$%k(B ($B$b$7$/$O%-%c%C(B -$B%7%e$NB>$NItJ,(B) $B$,2?$i$+$NM}M3$G$0$A$c$0$A$c$K$J$C$F$7$^$C$?>l9g!"(B -gnus $B$OJ*;v$r@5$7$/$9$k$?$a$KFs$D$N4X?t$r$*4+$a$7$^$9!#(B -@kbd{M-x gnus-cache-generate-nov-databases} $B$O$9$Y$F$N(B @sc{nov} $B%U%!%$%k(B -$B$r(B ($B:F(B) $B:n@.$7!"(B@kbd{gnus-cache-generate-active} $B$O%"%/%F%#%V%U%!%$%k(B -$B$r(B ($B:F(B) $B:n@.$7$^$9!#(B - -@node Persistent Articles -@section $B1JB35-;v(B -@cindex persistent articles -$B5-;v$N%-%c%C%7%e$H6a$$4X78$K$"$k$b$K!"(B@dfn{$B1JB35-;v(B}$B$,$"$j$^$9!#l=j$K1J1s$K;D$C$F$$$k(B -$B$Y$-$G$7$g$&!#%K%e!<%9%5!<%P!<$K$*$1$k4|8B:o=|$K$O1F6A$5$l$J$$$G!#(B - -$B$3$l$,(B@dfn{$B1JB35-;v(B}$B$G$9!=!=5-;v$O:o=|$5$l$^$;$s!#$=$l$OIaDL$N%-%c%C%7%e(B -$BL?Na$r;H$C$FJ}$H$b%W%m%;%9(B/$B@\F,0z?t$N=,47$rM}2r$7$^$9!#(B - -$B$b$71JB35-;v$K$@$16=L#$,$"$k$N$G$7$?$i!"2D;k5-;v(B ($B$d$=$NB>$N$b$N(B) $B$,%-%c%C(B -$B%7%e$KF~$k$N$rHr$1$k$?$a$K!"(B@code{gnus-use-cache} $B$r(B @code{passive} $B$K@_(B -$BDj$9$k$N$,NI$$$G$7$g$&(B: - -@lisp -(setq gnus-use-cache 'passive) -@end lisp - -@node Article Backlog -@section $B5-;v$N%P%C%/%m%0(B -@cindex backlog -@cindex article backlog -$B$b$7CY$$@\B3$7$+$J$$>l9g$G!"%-%c%C%7%e$r;H$&$H$$$&H/A[$O$"$^$jL%NOE*$G$O(B -$B$J$$$H$-(B ($Bu67$r2?$H$+$9$k$3$H$,$G$-$^$9!#$3$l$O4{$KFI$s$@5-;v$r:F/$7CY$/$7!"(B -$B%a%b%j!<$N;HMQNL$r$$$/$i$+A}$d$7$^$9!#(B - -@vindex gnus-keep-backlog -$B$b$7(B @code{gnus-keep-backlog} $B$r?t;z(B @var{n} $B$K@_Dj$9$k$H!"(Bgnus $B$O:GBg(B -$B$G(B @var{n} $B$N8E$$5-;v$r8e$N:Fl9g!"(Bgnus $B$O(B@emph{$BA4$F(B}$B$N4{FI5-(B -$B;v$r$?$/$o$($^$9!#$3$l$O$"$J$?$N(B Emacs $B$,!"K=H/$7$F$"$J$?$N%^%7%s$,Mn$A(B -$B$k$^$G@)8B$J$/KD$l>e$,$k$H$$$&$3$H$G$9!#;d$O$"$J$?J}A4$F$,855$$G$$$i$l$k(B -$B$h$&$K$3$3$K=q$-2C$($^$7$?!#(B - -$B$3$NJQ?t$O%G%#%U%)%k%H$G$O(B @code{nil} $B$G$9!#(B - -@node Saving Articles -@section $B5-;v$NJ]B8(B -@cindex saving articles - -Gnus $B$O$?$/$5$s$NJ}K!$G5-;v$rJ]B8$9$k;v$,$G$-$^$9!#0J2<$N$b$N$OHs>o$KN((B -$BD>$JJ}K!(B ($BNc$($P!"5-;v$,J]B8$9$kA0$K$[$H$s$I2?$b$J$5$l$J$$(B) $B$G5-;v$rJ]B8(B -$B$9$k$?$a$N@bL@$G$9!#0c$C$?$^$7$/$J$$%X%C%@!<$r>C5n$7$^$;$s!#(B - -@vindex gnus-saved-headers -$B$b$7>e$NJQ?t$,(B @code{nil} $B$G$"$k$H!"@55,I=(B -$B8=(B @code{gnus-saved-headers} $B$K9gCW$9$k$9$Y$F$N%X%C%@!<$O;D$5$l!";D$j$N(B -$B$b$N$OJ]B8$9$kA0$K:o=|$5$l$^$9!#(B - -@table @kbd -@item O o -@itemx o -@kindex O o ($B35N,(B) -@kindex o ($B35N,(B) -@findex gnus-summary-save-article -@c @icon{gnus-summary-save-article} -$B%G%#%U%)%k%H$N5-;vJ]B8$rMQ$$$F8=:_$N5-;v$rJ]B8$7$^(B -$B$9(B (@code{gnus-summary-save-article})$B!#(B - -@item O m -@kindex O m ($B35N,(B) -@findex gnus-summary-save-article-mail -$B8=:_$N5-;v$r%a!<%k$NMM<0$GJ]B8$7$^(B -$B$9(B (@code{gnus-summary-save-article-mail})$B!#(B - -@item O r -@kindex O r ($B35N,(B) -@findex gnus-summary-save-article-rmail -$B8=:_$N5-;v$r(B rmail $B$NMM<0$GJ]B8$7$^(B -$B$9(B (@code{gnus-summary-save-article-rmail})$B!#(B - -@item O f -@kindex O f ($B35N,(B) -@findex gnus-summary-save-article-file -@c @icon{gnus-summary-save-article-file} -$B8=:_$N5-;v$rIaDL$N%U%!%$%k(B (plain file) $BMM<0$GJ]B8$7$^(B -$B$9(B (@code{gnus-summary-save-article-file})$B!#(B - -@item O F -@kindex O F ($B35N,(B) -@findex gnus-summary-write-article-file -$B8=:_$N5-;v$rIaDL$N%U%!%$%kMM<0$GJ]B8$7!"0JA0$N%U%!%$%k$NFbMF$r>e=q$-$7$^(B -$B$9(B (@code{gnus-summary-write-article-file})$B!#(B - -@item O b -@kindex O b ($B35N,(B) -@findex gnus-summary-save-article-body-file -$B8=:_$N5-;v$NK\J8(B (body) $B$rIaDL$N%U%!%$%kMM<0$GJ]B8$7$^(B -$B$9(B (@code{gnus-summary-save-article-body-file})$B!#(B - -@item O h -@kindex O h ($B35N,(B) -@findex gnus-summary-save-article-folder -$B8=:_$N5-;v$r(B mh $B$N%U%)%k%@!<$NMM<0$GJ]B8$7$^(B -$B$9(B (@code{gnus-summary-save-article-folder})$B!#(B - -@item O v -@kindex O v ($B35N,(B) -@findex gnus-summary-save-article-vm -$B8=:_$N5-;v$r(B VM $B%U%)%k%@!<$KJ]B8$7$^(B -$B$9(B (@code{gnus-summary-save-article-vm})$B!#(B - -@item O p -@itemx | -@kindex O p ($B35N,(B) -@kindex | ($B35N,(B) -@findex gnus-summary-pipe-output -$B8=:_$N5-;v$r%Q%$%W$KJ]B8$7$^$9!#$&!<$s$H!"$"$N$)!";d$,8@$*$&$H$7$F$$$k;v(B -$B$O!=!=8=:_$N5-;v$r%W%m%;%9$K%Q%$%W$9$k$H$$$&$3$H$G(B -$B$9(B (@code{gnus-summary-pipe-output})$B!#(B -@end table - -@vindex gnus-prompt-before-saving -$B$9$Y$F$N$3$l$i$NL?Na$O%W%m%;%9(B/$B@\F,0z?t$N=,47$r;H$$$^(B -$B$9(B (@pxref{Process/Prefix})$B!#$b$7$3$l$i$N4X?t$r;H$C$F$?$/$5$s$N5-;v$rJ](B -$BB8$7$?>l9g!"$=$l$>$l$N$9$Y$F$N5-;v$KBP$7$F%U%!%$%kL>$NF~NO$rMW5a$5$l$k;v(B -$B$KK0$-K0$-$9$k$G$7$g$&!#F~NOB%?JF0:n$OJQ(B -$B?t(B @code{gnus-prompt-before-saving} $B$K$h$C$F@)8f$5$l$^$9!#$3$l$O%G%#%U%)(B -$B%k%H$G$O(B @code{always} $B$G!"$"$J$?$,CN$C$F$$$F7y$,$C$F$$$k!"2a>j$JB%?JF0(B -$B:n$r$7$^$9!#Be$o$j$K$3$NJQ?t$r(B @code{t} $B$K@_Dj$9$k$H!"$"$J$?$,J]B8$9$k$=(B -$B$l$>$l$N0lO"$N5-;v$KBP$7$F0l2s$@$1B%$5$l$^$9!#K\Ev$K(B gnus $B$K$9$Y$F$N;W9M(B -$B$r$5$;$?$$$N$G$"$l$P!"$3$NJQ?t$r(B @code{nil} $B$K$9$k$3$H$5$($G$-$^$9!#$=$7(B -$B$F!"5-;v$rJ]B8$9$k$?$a$N%U%!%$%k$rB%$5$l$k;v$O$"$j$^$;$s!#(BGnus $B$OC1=c$K(B -$B$9$Y$F$N5-;v$r%G%#%U%)%k%H$N%U%!%$%k$KJ]B8$7$^$9!#(B - -@vindex gnus-default-article-saver -Gnus $B$,$"$J$?$NK>$`$H$*$j$K$J$k$h$&$K!"JQ(B -$B?t(B @code{gnus-default-article-saver} $B$r%+%9%?%^%$%:$9$k;v$,$G$-$^$9!#2<(B -$B$NO;$D$N4{@=4X?t$r;H$&;v$,$G$-$^$9$7!"<+J,<+?H$N4X?t$r:n$k;v$b$G$-$^$9!#(B - -@table @code -@item gnus-summary-save-in-rmail -@findex gnus-summary-save-in-rmail -@vindex gnus-rmail-save-name -@findex gnus-plain-save-name -$B$3$l$O%G%#%U%)%k%H$NMM<0!"(B@dfn{babyl} $B$G$9!#JQ(B -$B?t(B @code{gnus-ramil-save-name} $B$KF~$C$F$$$k4X?t$r!"5-;v$rJ]B8$9$k$?$a$N(B -$B%U%!%$%kL>$r$ro$N%U%!%$%k$N8e$KDI2C$7$^$9!#JQ?t(B @code{gnus-file-save-name} $B$K(B -$BF~$C$F$$$k4X?t$r!"5-;v$rJ]B8$9$k$?$a$N%U%!%$%kL>$ro$N%U%!%$%k$N8e$KDI2C$7$^$9!#JQ(B -$B?t(B @code{gnus-file-save-name} $B$KF~$C$F$$$k4X?t$r!"5-;v$rJ]B8$9$k$?$a$N%U%!(B -$B%$%kL>$r$r.J8;z$K$J$C$?L>A0$r$D$/$j$^(B -$B$9!#(B - -@item gnus-summary-save-in-vm -@findex gnus-summary-save-in-vm -$B5-;v$r(B VM $B%U%)%k%@!<$KJ]B8$7$^$9!#$3$N@_Dj$r;H$&$?$a$K$O(B VM $B%a!<%k%j!<%@!<(B -$B$,I,MW$G$9!#(B -@end table - -@vindex gnus-article-save-directory -$B$3$l$i$NA4$F$N4X?t$O:G8e$N0l$D$r=|$$$F!"4D6-JQ?t(B @code{SAVEDIR} $B$K$h$C$F(B -$B=i4|2=$5$l$k(B @code{gnus-article-save-directory} $B$K5-;v$rJ]B8$7$^$9!#$3$l(B -$B$O%G%#%U%)%k%H$G$O(B @file{~/News/} $B$G$9!#(B - -$B>e$K$"$k$h$&$K!"5-;v$rJ]B8$9$k$?$a$N%U%!%$%k$NE,@Z$JL>A0$r8+$D$1$k$?$a$K!"(B -$B4X?t$O0c$C$?4X?t$rMQ$$$^$9!#0J2<$OL>A0$r@8@.$9$k$?$a$K;HMQ2DG=$J4X?t$N%j(B -$B%9%H$G$9(B: - -@table @code -@item gnus-Numeric-save-name -@findex gnus-Numeric-save-name -@file{~/News/Alt.andera-dworkin/45} $B$N$h$&$J%U%!%$%kL>!#(B - -@item gnus-numeric-save-name -@findex gnus-numeric-save-name -@file{~/News/alt.andera-dworkin/45} $B$N$h$&$J%U%!%$%kL>!#(B - -@item gnus-Plain-save-name -@findex gnus-Plain-save-name -@file{~/News/Alt.andera-dworkin} $B$N$h$&$J%U%!%$%kL>!#(B - -@item gnus-plain-save-name -@findex gnus-plain-save-name -@file{~/News/alt.andera-dworkin} $B$N$h$&$J%U%!%$%kL>!#(B - -@item gnus-sender-save-name -@findex gnus-sender-save-name -@file{~/News/larsi} $B$N$h$&$J%U%!%$%kL>!#(B -@end table - -@vindex gnus-split-methods -$BO"A[%j%9%H(B @code{gnus-split-methods} $B$K@55,I=8=$rJ|$j9~$`;v$K$h$C$F!"(B -gnus $B$K5-;v$rJ]B8$9$k>l=j$rDs0F$9$k;v$,$G$-$^$9!#Nc$($P!"(Bgnus $B$K4XO"$7$?(B -$B5-;v$r%U%!%$%k(B @file{gnus-stuff} $B$K!"(BVM $B$K4XO"$7$?5-;v(B -$B$r(B @code{vm-stuff} $BJ]B8$7$?$1$l$P!"$3$NJQ?t$r0J2<$N$h$&$K$9$k;v$,$G$-$^(B -$B$9(B: - -@lisp -(("^Subject:.*gnus\\|^Newsgroups:.*gnus" "gnus-stuff") - ("^Subject:.*vm\\|^Xref:.*vm" "vm-stuff") - (my-choosing-function "../other-dir/my-stuff") - ((equal gnus-newsgroup-name "mail.misc") "mail-stuff")) -@end lisp - -$B$3$l$O$=$l$>$l$NMWAG$,!"Fs$D$NMWAG!=!=(B@dfn{$B9gCW(B} $B$H(B @dfn{$B%U%!%$%k(B} $B$r;}(B -$B$D%j%9%H$G$"$k%j%9%H$G$"$k$H$$$&;v$,$o$+$j$^$9!#9gCW$OJ8;zNs(B ($B$3$N>l9g$O(B -$B5-;v$N%X%C%@!<$K9gCW$9$k@55,I=8=$H$7$F;H$o$l$^$9(B) $B$*$h$S!"%7%s%\%k(B ($B%0%k!<(B -$B%WL>$r0z?t$H$7$F!"4X?t$H$7$F8F$P$l$^$9(B) $B$*$h$S!"%j%9%H(B ($B$3$l$OI>(B -$B2A(B (@code{eval}) $B$5$l$^$9(B) $B$G$"$k$3$H$,$G$-$^$9!#$b$7$3$l$i$NF0:n$N0l$D(B -$B$G$b(B @code{nil} $B$G$J$$7k2L$rJV$9$H!"(B@dfn{$B%U%!%$%k(B}$B$,%G%#%U%)%k%H$NB%?J$H(B -$B$7$F;H$o$l$^$9!#2C$($F!"8F$P$l$?4X?t$+<0$,J8;zNs$+J8;zNs$N%j%9%H$rJV$7$?(B -$B$H$-$O!"1i;;$N7k2L<+BN$,;H$o$l$^$9!#(B - -$B4pK\E*$K$O!"8=:_$N5-;v$rJ]B8$9$k$N$K;H$o$l$k2DG=@-$N$"$k%U%!%$%kL>$N%j%9(B -$B%H$rA0$H$7$F;H$$$?$$$b$N$rB%$5$l!"$3$NJQ?t$rE,MQ$9$k;v$K$h$jF@$i$l$?7k(B -$B2L$+$i%U%!%$%kL>Jd40$r$7$FF~NO$7$^$9!#(B - -$B$3$NJQ?t$O%G%#%U%)%k%H$G$O(B @code{((gnus-article-archive-name))} $B$G!"(B -gnus $B$,J]B8$9$k5-;v$N(B @code{Archive-name} $B9T$rD4$Y$F!"$=$l$r%U%!%$%kL>$N(B -$BDs0F$H$7$F;H$&$H$$$&;v$G$9!#(B - -$B$3$l$O%U%!%$%kL>$r>/$7$-$l$$$K$9$k4X?t$NNc$G$9!#(B -@samp{nnml:mail.whatever} $B$N$h$&$J%a!<%k%0%k!<%W$,$?$/$5$s$"$k$N$G$"$l$P!"(B -$BJ]B8$9$k$?$a$N%U%!%$%kL>$r:n$kA0$K$3$l$i$N%0%k!<%WL>$N:G=i$r@Z$jMn$H$7$?(B -$B$$$+$b$7$l$^$;$s!#e5-$N4X?t$O%0%k!<%WL>$N$9$Y$F$N%T%j%*(B -$B%I(B (@samp{.}) $B$r%9%i%C%7%e(B (@samp{/}) $B$GCV$-49$($^$9!=!=$3$l$O4X?t$O$9$Y(B -$B$F$N%U%!%$%k$r0lHV>e$N%G%#%l%/%H%j!<$KCV$/$N$G$O$J$/!"3,AXE*$J%G%#%l%/%H(B -$B%j!<$r:n$k$H$$$&;v$G$9(B (@file{~/News/alt.andrea-dworkin} $B$NBe$o$j(B -$B$K(B @file{~/News/alt/andrea-dworkin}$B!#(B) $B$3$NJQ?t$O$?$$$F$$$N%7%9%F%`$K$*(B -$B$$$F%G%#%U%)%k%H$G(B @code{t} $B$G$9!#$7$+$7!"Nr;KE*$JM}M3$+(B -$B$i(B Xenix $B$H(B usg-unix-v $B%^%7%s$G$O%G%#%U%)%k%H$G(B @code{nil} $B$G$9!#(B - -$B$3$N4X?t$O:o=|$H%9%3%"$N%U%!%$%kL>$K1F6A$7$^$9!#$3$NJQ?t$,%j%9%H$G!"%j%9(B -$B%H$KMWAG(B @code{not-score} $B$,$"$k$H!"D9$$%U%!%$%kL>$O%9%3%"%U%!%$%k$K$O;H(B -$B$o$l$:!"%j%9%H$KMWAG(B @code{not-save} $B$,$"$k$H!"D9$$%U%!%$%kL>$OJ]B8$K$O(B -$B;H$o$l$:!"MWAG(B @code{not-kill} $B$,$"$k$H!"D9$$%U%!%$%kL>$O:o=|%U%!%$%k$K(B -$B$O;H$o$l$^$;$s!#(B - -$B$b$75-;v$r%9%W!<%k$N$h$&$J3,AX$KJ]B8$7$?$$$N$G$"$l$P!"e$N%G%#%l%/%H%j!<$r0z?t(B (@file{~/News/}) $B$H$7$F(B -$BEO$7$^$9!#(B - -@node Decoding Articles -@section $B5-;v$NI|9f2=(B -@cindex decoding articles - -$B$H$-$I$-MxMQA0!"(B -@samp{[Cc][Ii][Nn][Dd][Yy][0-9]+.\\(gif\\|jpg\\)} $B$K%O!<%I%3!<%I$5$l$k!"(B -$B$r;}$D5-;v$rI|9f2=$7$h$&$H$7$?$H$-$O!"(B@code{gnus-uu} $B$OLdBj$N5-;v$r$A$g(B -$B$&$I1\Mw$7$?;v$rCN$i$;$k$?$a$K!"<+F0E*$K(B @samp{comp.unix.wizards} $B$K5-;v(B -$B$rEj9F$7$^$9!#$3$N5!G=$r;H$o$J$$$h$&$K$9$k;v$O$G$-$^$;$s!#(B - -@node Shell Archives -@subsection $B%7%'%k%"!<%+%$%V(B -@cindex unshar -@cindex shell archives -@cindex shared articles - -$B%7%'%k%"!<%+%$%V(B ($B!X(Bshar $B%U%!%$%k!Y(B) $B$O%=!<%9$rG[I[$9$k$?$a$N?M5$$N$"$k(B -$BJ}K!$G$7$?$,!":#F|$G$O$=$s$J$K;H$o$l$F$$$^$;$s!#$H$K$+$/$3$l$i$r07$&$?$a(B -$B$NL?Na$,$"$j$^$9(B: - -@table @kbd -@item X s -@kindex X s ($B35N,(B) -@findex gnus-uu-decode-unshar -$B8=:_$N72$r2rE`$7$^$9(B (@code{gnus-uu-decode-unshar})$B!#(B - -@item X S -@kindex X S ($B35N,(B) -@findex gnus-uu-decode-unshar-and-save -$B8=:_$N72$r2rE`$7J]B8$7$^$9(B (@code{gnus-uu-decode-unshar-and-save})$B!#(B - -@item X v s -@kindex X v s ($B35N,(B) -@findex gnus-uu-decode-unshar-view -$B8=:_$N72$r2rE`$7I=<($7$^$9(B (@code{gnus-uu-decode-unshar-view})$B!#(B - -@item X v S -@kindex X v S ($B35N,(B) -@findex gnus-uu-decode-unshar-and-save-view -$B8=:_$N72$r2rE`$7!"I=<($7$FJ]B8$7$^(B -$B$9(B (@code{gnus-uu-decode-unshar-and-save-view})$B!#(B -@end table - -@node PostScript Files -@subsection $B%]%9%H%9%/%j%W%H%U%!%$%k(B -@cindex PostScript - -@table @kbd -@item X p -@kindex X p ($B35N,(B) -@findex gnus-uu-decode-postscript -$B8=:_$N%]%9%H%9%/%j%W%H72$rE83+$7$^$9(B (@code{gnus-uu-decode-postscript})$B!#(B - -@item X P -@kindex X P ($B35N,(B) -@findex gnus-uu-decode-postscript-and-save -$B8=:_$N%]%9%H%9%/%j%W%H72$rE83+$7$FJ]B8$7$^(B -$B$9(B (@code{gnus-uu-decode-postscript-and-save})$B!#(B - -@item X v p -@kindex X v p ($B35N,(B) -@findex gnus-uu-decode-postscript-view -$B8=:_$N%]%9%H%9%/%j%W%H72$rI=<($7$^(B -$B$9(B (@code{gnus-uu-decode-postscript-view})$B!#(B - -@item X v P -@kindex X v P ($B35N,(B) -@findex gnus-uu-decode-ostscript-and-save-view -$B8=:_$N%]%9%H%9%/%j%W%H72$rI=<($7J]B8$7$^(B -$B$9(B (@code{gnus-uu-decode-postscript-and-save-view})$B!#(B -@end table - -@node Other Files -@subsection $BB>$N%U%!%$%k(B - -@table @kbd -@item X o -@kindex X o ($B35N,(B) -@findex gnus-uu-decode-save -$B8=:_$N72$rJ]B8$7$^$9(B (@code{gnus-uu-decode-save})$B!#(B - -@item X b -@kindex X b ($B35N,(B) -@findex gnus-uu-decode-binhex -$B8=:_$N5-;v$r(B binhex $B2rE`$7$^$9(B (@code{gnus-uu-decode-binhex})$B!#$3$l$OK\(B -$BEv$OF0:n$7$^$;$s!#(B -@end table - -@node Decoding Variables -@subsection $BI|9f2=$N$?$a$NJQ?t(B - -$B7AMF;l$G$9!#F0;l$G$O$"$j$^$;$s!#(B - -@menu -* Rule Variables:: $B%U%!%$%k$,$I$N$h$&$KI=<($5$l$k$+$r7h$a$k(B - $BJQ?t(B -* Other Decode Variables:: $BB>$NI|9f2=$NJQ?t(B -* Uuencoding and Posting:: uuencode $B$9$k$N$r%+%9%?%^%$%:$9$kJQ?t(B -@end menu - -@node Rule Variables -@subsubsection $B5,B'JQ?t(B -@cindex rule variables - -Gnus $B$O%U%!%$%k$r1\Mw$9$k$N$r7hDj$9$k$N$K(B@dfn{$B5,B'JQ?t(B}$B$rMQ$$$^$9!#$3$l(B -$B$i$NJQ?t$O$9$Y$F0J2<$N$h$&$JMM<0$G$9!#(B - -@lisp - (list '(regexp1 command2) - '(regexp2 command2) - ...) -@end lisp - -@table @code -@item gnus-uu-user-view-rules -@vindex gnus-uu-user-view-rules -@cindex sox -$B$3$NJQ?t$O%U%!%$%k$r1\Mw$9$k$H$-$K:G=i$KD4$Y$i$l$^$9!#Nc$($P!"$b(B -$B$7(B @samp{.au} $B2;%U%!%$%k$rJQ49$9$k$?$a$K(B @code{sox} $B$r;H$$$?$$$H$-$O!" /dev/audio"))) -@end lisp - -@item gnus-uu-user-view-rules-end -@vindex gnus-uu-user-view-rules-end -$B$3$NJQ?t$O(B gnus $B$,MxMQ$NI|9f2=$NJQ?t(B - -@table @code -@vindex gnus-uu-grabbed-file-functions - -@item gnus-uu-grabbed-file-functions -$B$3$N%j%9%H$N$9$Y$F$N4X?t$O$=$l$>$l$N%U%!%$%k$,>e8e$K8F(B -$B$P$l$^$9!=!=$G$9$+$i!"$9$0$K%U%!%$%k$r0\F0$d1\Mw$7$?$j$9$k$3$H$,$G$-!"2?(B -$B$+$r$9$kA0$K$9$Y$F$N%U%!%$%k$,I|9f2=$5$l$k$N$rBT$DI,MW$O$"$j$^$;$s!#$3$N(B -$B%j%9%H$KF~$l$k;v$N$G$-$k4{@=4X?t$O(B: - -@table @code -@item gnus-uu-grab-view -@findex gnus-uu-grab-view -$B%U%!%$%k$r1\Mw$7$^$9!#(B - -@item gnus-uu-grab-move -@findex gnus-uu-grab-move -$B%U%!%$%k$r0\F0$7$^$9(B ($B$b$7J]B84X?t$r;H$C$F$$$k$N$G$"$l$P(B)$B!#(B -@end table - -@item gnus-uu-be-dangerous -@vindex gnus-uu-be-dangerous -$BI|9f2=$N:GCf$KJQ$J>u67$,5/$3$C$?$H$-$K2?$r$9$k$+$r;XDj$7$^$9!#$b(B -$B$7(B @code{nil} $B$G$"$k$H!"$G$-$k$@$1J]e=q$-$7$^$9!#$=$NB>$N>l(B -$B9g$O!"$=$l$>$l$N$H$-$K?R$M$^$9!#(B - -@item gnus-uu-ignore-files-by-name -@vindex gnus-uu-ignore-files-by-name -$B$3$N@55,I=8=$K9gCW$9$kL>A0$N%U%!%$%k$O1\Mw$5$l$^$;$s!#(B - -@item gnus-uu-ignore-files-by-type -@vindex gnus-uu-ignore-files-by-type -$B$3$NJQ?t$K9gCW$9$k(B @sc{mime} $B$N7?$r;}$D%U%!%$%k$O1\Mw$5$l$^$;$s!#(BGnus $B$O(B -$B%U%!%$%kL>$K4p$E$$$F7?$r?dB,$7$F$$$k;v$KCm0U$7$F$/$@$5$$!#(B -@code{gnus-uu} $B$O(B ($B$^$@(B) @sc{mime} $B%Q%C%1!<%8$G$O$"$j$^$;$s$N$G!"$3$l$O(B -$B>/$7JQ$G$9!#(B - -@item gnus-uu-tmp-dir -@vindex gnus-uu-tmp-dir -@code{gnus-uu} $B$,$=$N;E;v$r$9$k>l=j$G$9!#(B - -@item gnus-uu-do-not-unpack-archives -@vindex gnus-uu-do-not-unpack-archives -@code{nil} $B$G$J$$$N$O!"(B@code{gnus-uu} $B$OI=<($9$k$?$a$N%U%!%$%k$rC5$9$?$a(B -$B$K%"!<%+%$%V$NCf$^$G$OF~$C$F$$$+$J$$$H$$$&;v$G$9!#(B - -@item gnus-uu-view-and-save -@vindex gnus-uu-view-and-save -@code{nil} $B$G$J$$$N$O!"MxMQo$KJ]B8$9$k$+$I$&(B -$B$+$r?R$M$i$l$k$H$$$&;v$G$9!#(B - -@item gnus-uu-ignore-default-view-rules -@vindex gnus-uu-ignore-default-view-rules -@code{nil} $B$G$J$$$N$O!"(B@code{gnus-uu} $B$O%G%#%U%)%k%H$N1\Mw5,B'$rL5;k$9$k(B -$B$H$$$&;v$G$9!#(B - -@item gnus-uu-ignore-default-archive-rules -@vindex gnus-uu-ignore-default-archive-rules -@code{nil} $B$G$J$$$N$O!"(B@code{gnus-uu} $B$O%G%#%U%)%k%H$N%"!<%+%$%VE83+L?Na(B -$B$rL5;k$9$k$H$$$&;v$G$9!#(B - -@item gnus-uu-kill-carriage-return -@vindex gnus-uu-kill-carriage-return -@code{nil} $B$G$J$$$N$O!"(B@code{gnus-uu} $B$O5-;v$+$i$9$Y$F$N%-%c%j%C%8%j%?!<(B -$B%s(B (carriage return) $B$r$K4p$E$$$?(B @sc{mime} $BFbMF$N7?$K~$j$r$7$J$$$GA4$F$r%U%!%$%k$KJ]B8$7$^$9!#MWLs(B -$B$O(B RFC1153 $B=`$8$F$$$^$9!=!=0UL#$N$"$kNL$r;XDj$7$F!"HV9f$rH/9T$9$k4JC1$J(B -$BJ}K!$,8+$D$+$i$J$+$C$?$N$G!"C1=c$K$=$l$i$O@Z$jMn$H$7$F$$$^$9!#(B -@end table - -@node Uuencoding and Posting -@subsubsection uuencode $B$HEj9F(B - -@table @code -@item gnus-uu-post-include-before-composing -@vindex gnus-uu-post-include-before-composing -@code{nil} $B$G$J$$$N$O!"(B@code{gnus-uu} $B$,5-;v$r:n@.$9$kA0$KId9f2=$9$k%U%!(B -$B%$%k$r?R$M$k$H$$$&;v$G$9!#$3$NJQ?t$,(B @code{t} $B$G$"$k$H!"(B@kbd{C-c C-i} $B$K(B -$B$h$C$FId9f2=$5$l$?%U%!%$%k$r$NI|9fAuCV$,B8:_$7$J$$$+$i$G$9!#(B($B$(!<$H!";d$O$=$l$r$9(B -$B$k0l$D$N%Q%C%1!<%8$r8+$?;v$,$"$j$^$9!=!=(B@code{gnus-uu} $B$G$9!#$7$+$7$J$<(B -$B$+!"$=$l$,?t$N$&$A$KF~$k$H$O;W$($J$$$N$G$9(B...) $B%G%#%U%)%k%H(B -$B$O(B @code{nil} $B$G$9!#(B - -@item gnus-uu-post-separate-description -@vindex gnus-uu-post-separate-description -@code{nil} $B$G$J$$$N$O!"5-=R$OJL$N5-;v$GEj9F$5$l$k$H$$$&;v$G$9!#:G=i$N5-(B -$B;v$OIaDL$O(B (0/x) $B$N$h$&$KHV9f$,IU$1$i$l$^$9!#$b$7$3$NJQ?t(B -$B$,(B @code{nil} $B$G$"$k$H!"MxMQl9g!"(Bgnus $B$O%"!<%+%$%V(B -$B$rE83+$7$h$&$H;n$_!"%"!<%+%$%V$NCf$K1\Mw$G$-$k%U%!%$%k$,$"$k$+$rD4$Y$^$9!#(B -$BNc$($P!"(Bgzip $B$5$l$?(B tar $B%U%!%$%k(B @file{pics.tar.gz} $B$,$"$C$F!"%U%!%$(B -$B%k(B @file{pic1.jpg} $B$H(B @file{pic2.gif} $B$r4^$s$G$$$k>l9g!"(Bgnus $B$O$l$NCj=P$5$l$?5-;v$4$H$K(B@dfn{$B5?;w5-;v(B}$B$r35N,(B -$B%P%C%U%!$KA^F~$7$^$9!#$3$l$i$N!X5-;v!Y$K0\F0$7$?>l9g$O!"$l$N%U%!%$%k$KBP$7$F:n@.$5$l$^$9!#(B@code{nil} $B$G$"$k(B -$B$H!"F1$81\MwL?Na$r;H$&$9$Y$F$NL?Na$,$=$NL?Na$N0z?t$N%j%9%H$H$7$FEO$5$l$^(B -$B$9!#(B - -@vindex gnus-insert-pseudo-articles -@code{gnus-insert-pseudo-articles} $B$,(B @code{nil} $B$G$J$$$H!"I|9f2=$N$H$-(B -$B$K5?;w5-;v$rA^F~$7$^$9!#%G%#%U%)%k%H$G$O(B @code{t}$B$G$9!#(B - -$B$=$l$G!"$=$N$h$&$J46$8$G$9!#(B@emph{$Bo$K6lpJs$O>C$75n$j$?$$$H$b;W$&(B -* Article Washing:: $B?M@8$r$b$C$H$h$/$9$k$?$/$5$s$N5$$NMx$$$?(B - $B4X?t(B -* Article Buttons:: URL $B$d(B Message-ID $B$d(B $B%"%I%l%9$J$I$r%/%j%C(B - $B%/$9$k(B -* Article Date:: $B$0$:$0$:8@$&$J!"@$3&;~$@(B! -* Article Signature:: $B=pL>$C$F2?(B? -* Article Miscellania:: $BB>$N$$$m$$$m$J$b$N(B -@end menu - -@node Article Highlighting -@subsection $B5-;v$N%O%$%i%$%H(B -@cindex highlighting - -$B5-;v%P%C%U%!$r2LJ*%5%i%@$N$h$&$K$7$?$$$@$1$G$J$/!"2Z$d$+$J2LJ*%5%i%@$N$h(B -$B$&$K8+$($k$h$&$K$7$?$$$G$7$g$&!#(B - -@table @kbd -@item W H a -@kindex W H a ($B35N,(B) -@findex gnus-article-highlight -@findex gnus-article-maybe-highlight -$B8=:_$N5-;v$r$b$C$H%O%$%i%$%H(B (highlight) $B$7$^$9!#$3$N4X?t$O!"%X%C%@!$r%O%$%i%$%H$7!"K\BN(B (body) $B$HF,(B (head) $B$K%\%?%s$r2C$($^$9!#(B - -@item W H h -@kindex W H h ($B35N,(B) -@findex gnus-article-highlight-headers -@vindex gnus-header-face-alist -$B%X%C%@!<$r%O%$%i%$%H$7$^$9(B (@code{gnus-article-highlight-headers})$B!#%O%$(B -$B%i%$%H$OJQ?t(B @code{gnus-header-face-alist} $B$K$7$?$,$C$F$J$5$l!"$=$l$O$=(B -$B$l$>$l$NMWAG$,(B @code{(@var{$B@55,I=8=(B} @var{$BL>A0(B} @var{$BFbMF(B})} $B$H$$$&MM<0(B -$B$N%j%9%H$G$9!#(B -@var{$B@55,I=8=(B}$B$O%X%C%@!<$K9gCW$9$k@55,I=8=!"(B@var{$BL>A0(B}$B$O%X%C%@!<$NL>A0$r(B -$B%O%$%i%$%H$9$k$N$K;H$o$l$k%U%'%$%9(B (face) (@pxref{Faces and Fonts})$B!"(B -@var{$BFbMF(B}$B$O%X%C%@!<$NCM$r%O%$%i%$%H$9$k%U%'%$%9$G$9!#:G=i$K9gCW$7$?$b$N(B -$B$,;H$o$l$^$9!#(B@var{$B@55,I=8=(B}$B$O(B @samp{^} $B$,IU$1$i$l$k$Y$-$G$O$J$$;v$KCm0U(B -$B$7$F$/$@$5$$!=!=(Bgnus $B$,$=$l$rIU$12C$($^$9!#(B - -@item W H c -@kindex W H c ($B35N,(B) -@findex gnus-article-highlight-citation -$B0zMQ$5$l$?J8$r%O%$%i%$%H$7$^$9(B (@code{gnus-article-highlight-citation})$B!#(B - -$B0zMQ%O%$%i%$%H$r%+%9%?%^%$%:$9$k$$$/$D$+$NJQ?t$O(B: - -@table @code -@vindex gnus-cite-parse-max-size - -@item gnus-cite-parse-max-size -$B5-;v$NBg$-$5$,$3$NJQ?t(B ($B%G%#%U%)%k%H$G$O(B 25000) $B$h$jBg$-$$5-;v$O!"0zMQ%O(B -$B%$%i%$%H$O9T$o$l$^$;$s!#(B - -@item gnus-cite-max-prefix -@vindex gnus-cite-max-prefix -$B0zMQ@\F,8l$N:GBg$ND9$5$G$9(B ($B%G%#%U%)%k%H$G$O(B 20 $B$G$9(B)$B!#(B - -@item gnus-cite-face-list -@vindex gnus-cite-face-list -$B0zMQ$r%O%$%i%$%H$9$k$?$a$K;H$o$l$k%U%'%$%9$N%j%9%H$G$9(B (@pxref{Faces and -Fonts})$B!#F1$8%a%C%;!<%8$NCf$KJ#?t$N5-;v$+$i$N0zMQ$,$"$k$H!"(Bgnus $B$O$=$l$>(B -$B$l$N5-;v$+$i$N0zMQ$r$=$lMQ$N%U%'%$%9$GI=<($7$h$&$H$7$^$9!#$3$l$K$h$j!"C/(B -$B$,2?$r=q$$$?$+$,J,$+$j$d$9$/$J$k$G$7$g$&!#(B - -@item gnus-supercite-regexp -@vindex gnus-supercite-regexp -$BIaDL$N(B Supercite $BB0@-9T$K9gCW$9$k@55,I=8=$G$9!#(B - -@item gnus-supercite-secondary-regexp -@vindex gnus-supercite-secondary-regexp -$B0z$-Nv$+$l$?(B Supercite $BB0@-9T$K9gCW$9$k@55,I=8=$G$9!#(B - -@item gnus-cite-minimum-match-count -@vindex gnus-cite-minimum-match-count -$B$=$l$,0zMQ$G$"$k$H7hDj$9$kA0$KD4$Y$J$1$l$P$J$i$J$$:G>.$NF10l@\F,8l$G$9!#(B - -@item gnus-cite-attribution-prefix -@vindex gnus-cite-attribution-prefix -$BB0@-9T$N;O$^$j$K9gCW$9$k@55,I=8=$G$9!#(B - -@item gnus-cite-attribution-suffix -@vindex gnus-cite-attribution-suffix -$BB0@-9T$N:G8e$K9gCW$9$k@55,I=8=$G$9!#(B - -@item gnus-cite-attribution-face -@vindex gnus-cite-attribution-face -$BB0@-9T$K;H$o$l$k%U%'%$%9$G$9!#$=$NB0@-$KB0$9$kJ8$N$?$a$N%U%'%$%9$HM;9g$5(B -$B$l$^$9!#(B -@end table - -@item W H s -@kindex W H s ($B35N,(B) -@vindex gnus-signature-separator -@vindex gnus-signature-face -@findex gnus-article-highlight-signature -$B=pL>(B (signature) $B$r%O%$%i%$%H$7$^(B -$B$9(B (@code{gnus-article-highlight-signature})$B!#(B -@code{gnus-signature-separator} (@pxref{Article Signature}) $B$N8e$NA4$F$N(B -$B$b$N$O=pL>$H9M$($i$l!"(B@code{gnus-signature-face} $B$G%O%$%i%$%H$5$l$^$9!#(B -$B$=$l$O%G%#%U%)%k%H$G$O(B @code{italic} $B$G$9!#5-;v$r<+F0E*$K%O%$%i%$%H$9$k(B -$BJ}K!$K$D$$$F$O(B @xref{Customizing Articles} $B$r;2>H$7$F2<$5$$!#(B -@end table - -@node Article Fontisizing -@subsection $B5-;v$N%U%)%s%HJQ99(B -@cindex emphasis -@cindex article emphasis - -@cindex gnus-article-emphasize -@kindex W e ($B35N,(B) -$B?M!9$O$h$/%K%e!<%9$N5-;v$G(B @samp{_$B$3$l(B_} $B$d(B @samp{*$B$3$l(B*} $B$^$?(B -$B$O(B @samp{/$B$3$l(B/} $B$N$h$&$J$b$N$r;H$C$FC18l$r6/D4$7$^$9!#(BGnus $B$O(B $B5-;v$rL?(B -$BNa(B @kbd{W e} (@code{gnus-article-emphasize}) $B$K$+$1$k;v$K$h$C$FAGE($K8+(B -$B$($k$h$&$K$G$-$^$9!#(B - -@vindex gnus-emphasis-alist -$B6/D4$,$I$N$h$&$K1i;;$5$l$k$+$OJQ?t(B @code{gnus-emphasis-alist} $B$K$h$C$F@)(B -$B8f$5$l$^$9!#$3$l$O:G=i$NMWAG$,9gCW$9$k$Y$-@55,I=8=$G$"$kO"A[%j%9%H$G$9!#(B -$BFsHVL\$NMWAG$O$I$N@55,I=8=$N%0%k!<%W$,6/D48lA4BN$r8+$D$1$k$?$a$K;H$o$l$k(B -$B$+$r<($9?t;z$G$9!#;0HVL\$O$I$N@55,I=8=$N%0%k!<%W$,I=<($5$l%O%$%i%$%H$5$l(B -$B$k$+$r7h$a$k?t;z$G$9!#(B -($B$3$NFs$D$N%0%k!<%W$N4V$N5-;v$O1#$5$l$^$9!#(B) $B;MHVL\$O%O%$%i%$%H$N%U%'%$(B -$B%9$G$9!#(B - -@lisp -(setq gnus-emphasis-alist - '(("_\\(\\w+\\)_" 0 1 gnus-emphasis-underline) - ("\\*\\(\\w+\\)\\*" 0 1 gnus-emphasis-bold))) -@end lisp - -@cindex slash -@cindex asterisk -@cindex underline -@cindex / -@cindex * - -@vindex gnus-emphasis-underline -@vindex gnus-emphasis-bold -@vindex gnus-emphasis-italic -@vindex gnus-emphasis-underline-bold -@vindex gnus-emphasis-underline-italic -@vindex gnus-emphasis-bold-italic -@vindex gnus-emphasis-underline-bold-italic -$B=i4|@_Dj$G$O<7$D$N5,B'$,$"$j!"$=$l$i$O0J2<$N%U%'%$%9$rMQ$$$^(B -$B$9(B: @code{gnus-emphasis-bold}, @code{gnus-emphasis-italic}, @code{gnus-emphasis-underline}, @code{gnus-emphasis-bold-italic}, @code{gnus-emphasis-underline-italic}, @code{gnus-emphasis-underline-bold}, @code{gnus-emphasis-underline-bold-italic}. - -$B$3$l$i$N%U%'%$%9$rJQ99$7$?$$$N$G$"$l$P!"(B -@kbd{M-x customize} $B$+(B @code{copy-face} $B$r;H$&;v$,$G$-$^$9!#Nc$($P!"(B -@code{gnus-emphasis-italic} $B$KBe$o$j$K@V$N%U%'%$%9$r;H$&$h$&$K$7$?$$$H$-(B -$B$O!"H$7$F2<$5$$!#(B - -@node Article Hiding -@subsection $B5-;v$r1#$9(B -@cindex article hiding - -$B$b$7$/$O!"$=$l$>$l$N5-;v$NFCDj$N$b$N$r1#$7$?$$$+$b$7$l$^$;$s!#$?$$$F$$$N(B -$B5-;v$K$OIaDL$O$"$j$9$.$k$/$i$$:n$j$+$($k$b$N$,$"$j$^$9!#(B - -@table @kbd -@item W W a -@kindex W W a ($B35N,(B) -@findex gnus-article-hide -$B5-;v%P%C%U%!$G$?$/$5$s$N1#F?$r$7$^$9(B (@kbd{gnus-article-hide})$B!#FC$K!"$3(B -$B$N4X?t$O%X%C%@!$r1#$7$^$9!#(B - -@item W W h -@kindex W W h ($B35N,(B) -@findex gnus-article-toggle-headers -$B%X%C%@!<$r1#$7$^$9(B (@code{gnus-article-toggle-headers})$B!#(B -@xref{Hiding Headers}. - -@item W W b -@kindex W W b ($B35N,(B) -@findex gnus-article-hide-boring-headers -$B$"$^$j6=L#$N$b$F$J$$%X%C%@!<$r1#$7$^(B -$B$9(B (@code{gnus-article-hide-boring-headers})$B!#(B@xref{Hiding Headers}. - -@item W W s -@kindex W W s ($B35N,(B) -@findex gnus-article-hide-signature -$B=pL>$r1#$7$^$9(B (@code{gnus-article-hide-signature})$B!#(B -@xref{Article Signature}. - -@item W W l -@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$r:o(B -$B=|$7$^$9!#$3$l$i$O$$$/$D$+$N%a!<%j%s%0%j%9%H$N%5!<%P!<$,A4$F(B -$B$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@code{gnus-list-identifiers} $B$K(B @code{\\(..\\)} $B$r4^$a$F(B -$B$O$$$1$^$;$s!#(B - -@table @code -@item gnus-list-identifiers -@vindex gnus-list-identifiers -$BI=Bj$+$i:o=|$5$l$k$Y$-I8<1$N%j%9%H$K9gCW$9$k@55,I=8=$G$9!#$3$l$O@55,I=8=(B -$B$N%j%9%H$G$"$k$3$H$b$G$-$^$9!#(B -@end table - -@item W W p -@kindex W W p ($B35N,(B) -@findex gnus-article-hide-pgp -@vindex gnus-article-hide-pgp-hook -@sc{pgp} $B=pL>$r1#$7$^$9(B (@code{gnus-article-hide-pgp})$B!#(B@sc{pgp} $B=pL>$,(B -$B1#$5$l$?8e$K%U%C%/(B @code{gnus-article-hide-pgp-hook} $B$,$r;}$D5-;v$r<+F0E*$KG'>Z$9$k$K$O(B: - -@lisp -;;; Hide pgp cruft if any. - -(setq gnus-treat-strip-pgp t) - -;;; After hiding pgp, verify the message; -;;; only happens if pgp signature is found. - -(add-hook 'gnus-article-hide-pgp-hook - (lambda () - (save-excursion - (set-buffer gnus-original-article-buffer) - (mc-verify)))) -@end lisp - -@item W W P -@kindex W W P ($B35N,(B) -@findex gnus-article-hide-pem -@sc{pem} (privacy enhanced messages ($B%W%i%$%P%7!<3HD%%a%C%;!<%8(B)) $BItJ,$r(B -$B1#$7$^$9(B (@code{gnus-article-hide-pem})$B!#(B - -@item W W B -@kindex W W B ($B35N,(B) -@findex gnus-article-strip-banner -@cindex banner -@cindex OneList -@cindex stripping advertisements -@cindex advertisements -@code{banner} $B%0%k!<%W%Q%i%a!<%?$G;XDj$5$l$?%P%J!<$r$r1#$9$?$a$K;EMM$5$l$^$9!#$3$N4X?t$r;H$&J}K!(B -$B$O(B @code{banner} $B%0%k!<%W%Q%i%a!<%?(B (@pxref{Group Parameters}) $B$r%P%J!<(B -$B$rC5n$5$l$k%F%-%9%H$K9gCW$9(B -$B$k@55,I=8=$H$7$F2r$,>C5n$5$l$k$H$$$&0UL#(B -$B$G$"$k%7%s%\%k(B @code{signature}$B!"$^$?(B -$B$O(B @code{gnus-article-banner-alist} $B$N@55,I=8=$KBP1~$7$?%7%s%\%k$G$"$k$3(B -$B$H$,$G$-$^$9!#(B - -@item W W c -@kindex W W c ($B35N,(B) -@findex gnus-article-hide-citation -$B0zMQ$r1#$7$^$9(B (@code{gnus-article-hide-citation})$B!#1#JC$r%+%9%?%^%$%:$9(B -$B$k$$$/$D$+$NJQ?t$O(B: - -@table @code -@item gnus-cited-opend-text-button-line-format -@itemx gnus-cited-closed-text-button-line-format -@vindex gnus-cited-closed-text-button-line-format -@vindex gnus-cited-opend-text-button-line-format - -Gnus $B$O$I$3$N0zMQJ8$,1#$5$l$F$$$k$+$r<($9$?$a$K%\%?%s$rIU$12C$(!"J8>O$N(B -$B1#JC$r@Z$jBX$($i$l$k$h$&$K$7$^$9!#$3$NJQ?t$NMM<0$O$3$l$i$N%U%)!<%^%C%H$N(B -$B$h$&$JJQ?t$K$h$C$F;XDj$5$l$^$9(B (@pxref{Formatting Variables})$B!#/$J$/$H$b$3$ND9$5(B ($B=i4|CM(B 10) $B$G$J$1$l$P$J$j$^$;$s!#(B -@end table -@end table - -$B$3$l$i$NA4$F$N!X1#JC!YL?Na$O@Z$jBX$(L?Na$G$9$,!"$3$l$i$NL?Na$KIi$N@\F,0z(B -$B?t$rM?$($k$H!"$=$l$i$OA0$K1#$5$l$F$$$?$b$N$rI=<($7$^$9!#@5$N@\F,0z?t$rM?(B -$B$($l$P!"$=$l$i$O>o$K1#$7$^$9!#(B - -$B0zMQ%+%9%?%^%$%:$N$?$a$NB>$NJQ?t$N>pJs$N$?$a(B -$B$K(B @pxref{Article Highlighting} $B$b;2>H$7$F$/$@$5$$!#(B - -$B<+F0E*$K5-;v$NMWAG$r1#$9$?$a$NJ}K!$O(B @xref{Customizing Articles} $B$r;2>H(B -$B$7$F2<$5$$!#(B - -@node Article Washing -@subsection $B5-;v@vBu(B -@cindex washing -@cindex article washing - -$B;d$?$A$O$3$l$r$b$C$H$b$JM}M3$N2<$G!X5-;v@vBu!Y(B(article washing) $B$H8F$s$G(B -$B$$$^$9!#$9$J$o$A!"%-!<(B @kbd{A} $B$O;H$o$l$F$$$k$N$G!"Be$o$j$K(B -$B%-!<(B @kbd{W} $B$r;H$&I,MW$,$"$k$N$G$9!#(B - -$B;d$?$A$O(B @dfn{$B@vBu(B} $B$r!X2?$+$N2?$+$r2?$+JL$N$b$N$KJQ49$9$k!Y$HDj5A$7$F$$(B -$B$^$9$,!"IaDL$O$b$C$HNI$/8+$($k2?$+$KMn$ACe$-$^$9!#$=$l$K$b$C$H$-$l$$$G$9!"(B -$B$?$V$s!#(B - -gnus $B$,5-;v$rI=<($9$k4{Dj$N$d$jJ}$rJQ$($?$$$H$-(B -$B$O(B @xref{Customizing Articles} $B$r;2>H$7$F2<$5$$!#(B - -@table @kbd -@item C-u g -$B$3$l$O5-;v@vBu$G$O$J$/$F!"$=$N5U$G$9!#$3$l$r%?%$%W$9$k$H!"%G%#%9%/$d%5!<(B -$B%P!<$K$"$k$,$^$^$N5-;v$,8+$($^$9!#(B - -@item W l -@kindex W l ($B35N,(B) -@findex gnus-summary-stop-page-breaking -$B%Z!<%8$N6h@Z$j$r8=:_$N5-;v$+$iH$7$F2<$5$$!#(B - -@item W r -@kindex W r ($B35N,(B) -@findex gnus-summary-caesar-message -@c @icon{gnus-summary-caesar-message} -$B5-;v%P%C%U%!$G%+%(%5%kJQ49(B (Caesar rotate) (rot13) $B$r$7$^(B -$B$9(B (@code{gnus-summary-caesar-message})$B!#%+%(%5%kJQ49$+(B rot13 $B$rMQ$$$FFI(B -$B$`;v$N$G$-$k!"H=FIIT2DG=$J5-;v$G$9(B ($BE57?E*$K$O!"967bE*$J>iCL$J$I$G$9!#(B) - -$BIaDL$O(B ``rot13'' $B$H8F$P$l$F$$$^$9!#$=$l$O%"%k%U%!%Y%C%H$N0LCV$,(B 13 $B8D2s(B -$BE>$9$k$+$i$G$9!#Nc$($P!"(B@samp{B} (2 $BHVL\$NJ8;z(B) $B"*(B @samp{O} (15 $BHVL\$NJ8(B -$B;z(B)$B!#$3$l$O;~!9!X%+%(%5%kJQ49!Y$H8F$P$l$k;v$b$"$j$^$9!#$H$$$&$N$O!"%+%((B -$B%5%k$,$3$N7A<0$N!"$(!<$H!"$A$g$C$H4JC1$J0E9f2=$r:NMQ$7$?$H$$$&1=$,$"$k$+(B -$B$i$G$9!#(B - -@item W t -@item t -@kindex W t ($B35N,(B) -@kindex t ($B35N,(B) -@findex gnus-article-toggle-headers -$B5-;v%P%C%U%!$K$9$Y$F$N%X%C%@!<$rI=<($9$k$+$I$&$+$r@Z$jBX$($^(B -$B$9(B (@code{gnus-article-toggle-headers})$B!#(B - -@item W v -@kindex W v ($B35N,(B) -@findex gnus-summary-verbose-header -$B5-;v%P%C%U%!$K$9$Y$F$N%X%C%@!<$r1J1s$KI=<($9$k$+$I$&$+$r@Z$jBX$($^(B -$B$9(B (@code{gnus-summary-verbose-header})$B!#(B - -@item W m -@kindex W m ($B35N,(B) -@findex gnus-summary-toggle-mime -$BI=<($9$kA0$K5-;v$K(B @sc{mime} $B=hM}$r!$l$NJ,$N:G=i$N8l$rBgJ8;z$K$7$^(B -$B$9(B (@code{gnus-article-capitalize-sentences})$B!#(B - -@item W c -@kindex W c ($B35N,(B) -@findex gnus-article-remove-cr -CRLF $B$NAH(B ($B$9$J$o$A!"9T$N:G8e$N(B @samp{^M}) $B$r(B LF $B$KJQ49$7$^$9(B ($B$3$l(B -$B$O(B DOS $B$N9TKv$N@$OC$r$7$^$9(B)$B!"$=$7$F$=$l$+$i;D$j$N(B CR $B$r(B LF $B$KJQ49$7$^(B -$B$9(B ($B$3$l$O(B MAC $B$N9TKv$N@$OC$r$7$^$9(B) (@code{gnus-article-remove-cr})$B!#(B - -@c @item W q -@c @kindex W q (Summary) -@c @findex gnus-article-de-quoted-unreadable -@c Treat quoted-printable (@code{gnus-article-de-quoted-unreadable}). -@c Quoted-Printable is one common @sc{mime} encoding employed when sending -@c non-ASCII (i. e., 8-bit) articles. It typically makes strings like -@c @samp{d,Ai(Bj,A`(B vu} look like @samp{d=E9j=E0 vu}, which doesn't look very -@c readable to me. Note that the this is usually done automatically by -@c Gnus if the message in question has a @code{Content-Transfer-Encoding} -@c header that says that this encoding has been done. -@c If a prefix is given, a charset will be asked for. - -@c @item W 6 -@c @kindex W 6 (Summary) -@c @findex gnus-article-de-base64-unreadable -@c Treat base64 (@code{gnus-article-de-base64-unreadable}). -@c Base64 is one common @sc{mime} encoding employed when sending non-ASCII -@c (i. e., 8-bit) articles. Note that the this is usually done -@c automatically by Gnus if the message in question has a -@c @code{Content-Transfer-Encoding} header that says that this encoding has -@c been done. -@c If a prefix is given, a charset will be asked for. - -@item W Z -@kindex W Z (Summary) -@findex gnus-article-decode-HZ -HZ $B$^$?$O(B HZP $B$r=hM}$7$^$9!#(BHZ ($B$^$?$O(B HZP) $B$OCf9q8l$N5-;v$rEAAw$9$k$H$-(B -$B$K;H$o$l$k0lHLE*$JId9f$G$9!#$3$l$O(B @samp{~@{<:Ky2;S@{#,NpJ)l6HK!#~@}} $B$N(B -$B$h$&$JE57?E*$JJ8;zNs$r:n$j$^$9!#(B - -@c @item W h -@c @kindex W h (Summary) -@c @findex gnus-article-wash-html -@c Treat HTML (@code{gnus-article-wash-html}). -@c Note that the this is usually done automatically by Gnus if the message -@c in question has a @code{Content-Type} header that says that this type -@c has been done. -@c If a prefix is given, a charset will be asked for. - -@item W f -@kindex W f ($B35N,(B) -@cindex x-face -@findex gnus-article-display-x-face -@findex gnus-article-x-face-command -@vindex gnus-article-x-face-command -@vindex gnus-article-x-face-too-ugly -@iftex -@iflatex -\include{xface} -@end iflatex -@end iftex -@c @anchor{X-Face} -$B$9$Y$F$N(B X-Face $BMs$rC5$7$FI=<($7$^$9(B(@code{gnus-article-display-x-face})$B!#(B -$B$3$NL?Na$OJQ?t(B @code{gnus-article-x-face-command} $B$K$h$C$FM?$($i$l$?4X?t(B -$B$K$h$C$F%W%m%0%i%`$K$D$$$F$O!"(B -`compface' $B$d(B GNU/Linux $B%7%9%F%`$K$*$1$k(B `faces-xface' $B$N$h$&$J%Q%C%1!<(B -$B%8$rC5$7$F2<$5$$!#(B} $B$r%U%)!<%/$7$F8+$h$&$H$7$^$9!#(BXEmacs $B$G$N%G%#%U%)%k(B -$B%H$NF0:n$O(B @code{From} $BMs$NA0$K4i$rI=<($7$^$9!#(B(XEmacs $B$,(B X-Face $B5!G=IU(B -$B$-$G%3%s%Q%$%k$5$l$F$$$k$HNI$$$G$7$g$&!=!=$=$l$OI=<($r>/$7Aa$/$7$^$9!#$b(B -$B$7:,K\E*(B X-Face $B5!G=$,$J$$$N$G$"$l$P!"(Bgnus $B$O(B @code{pbmplus} $B$d$=$NCg4V(B -$B$N30It%W%m%0%i%`$r;H$C$F(B @code{X-Face} $BMs$rJQ49$7$h$&$H;n$_$^$9!#(B) $B$3$N(B -$B4X?t$rI=<(%U%C%/$KF~$l$?$$$N$G$"$l$P!"$*$=$i$/$=$l$O:G8e$K$J$k$Y$-$G$7$g(B -$B$&!#(B - -@item W b -@kindex W b ($B35N,(B) -@findex gnus-article-add-buttons -$B%/%j%C%/$G$-$k%\%?%s$r5-;v$K2C$($^$9(B (@code{gnus-article-add-buttons})$B!#(B -@xref{Article Buttons}. - -@item W B -@kindex W B ($B35N,(B) -@findex gnus-article-add-buttons-to-head -$B%/%j%C%/$G$-$k%\%?%s$r5-;v$N%X%C%@!<$K2C$($^(B -$B$9(B (@code{gnus-article-add-buttons-to-head})$B!#(B - -@item W p -@kindex W p ($B35N,(B) -@findex gnus-article-verify-x-pgp-sig -$B=pL>IU$-%3%s%H%m!<%k%a%C%;!<%8$NG'>Z$r9T$J$$$^(B -$B$9(B (@code{gnus-article-verify-x-pgp-sig})$B!#(B -@code{newgroup} $B$d(B @code{checkgroups} $B$H$$$C$?%3%s%H%m!<%k%a%C%;!<%8$O!"(B -$BDL>o$=$N%K%e!<%9%0%k!<%W3,AX$N%a%$%s%F%$%J!<$K$h$C$F=pL>$5$l$F$$$^$9!#G'(B -$B>Z$r9T$J$&$?$a$K$O!"%a%$%s%F%$%J!<$N8x3+80$r$"$J$?$N%-!<%j%s%0$KDI2C$7$J(B -$B$1$l$P$J$j$^$;$s!#(B@footnote{$BB?$/$N%K%e!<%9%0%k!<%W3,AX$N%a%$%s%F%$%J!<(B -$B$N(B PGP $B$N80$O(B @uref{ftp://ftp.isc.org/pub/pgpcontrol/README.html} $B$+$iF~(B -$Be$N;0$D$NL?Na$r$9$Y$F9T$$$^$9(B (@code{gnus-article-strip-blank-lines})$B!#(B - -@item W E A -@kindex W E A ($B35N,(B) -@findex gnus-article-strip-all-blank-lines -$B$9$Y$F$N6uGr9T$rC5n$7$^(B -$B$9(B (@code{gnus-article-strip-trailing-space})$B!#(B -@end table - -$B5-;v$N@vBu$r<+F0E*$K$9$k$?$a$NJ}K!$O(B @xref{Customizing Articles} $B$r;2>H(B -$B$7$F2<$5$$!#(B - -@node Article Buttons -@subsection $B5-;v$N%\%?%s(B -@cindex buttons - -$B$h$/5-;v$NCf$KB>$N$b$N$X$N;2>H$,F~$l$i$l$k;v$,$"$j$^$9!#$=$7$F!"(Bgnus $B$,(B -$B$=$l$K4X$9$k;v$r!"$=$l$i$N;2>H$N>e$G(B @kbd{RET} $B$rBG$D$+!"%^%&%9$N??Cf$N(B -$B%\%?%s$r;H$&;v$K$h$C$F!":G>.8B$NEXNO$GH$K(B@dfn{$B%\%?%s(B}$B$rIU$1$^$9(B: $B$A$c$s$H(B -$B$7$?(B URL$B!"%a!<%k%"%I%l%9!"(BMessage-ID $B$G$9!#$3$l$OFs$D$NJQ?t$K$h$C$F@)8f(B -$B$5$l$F$$$F!"$=$N0l$D$O5-;v$NK\BN$r07$$!"$b$&0l$D$O5-;v$N%X%C%@!<$r07$$$^(B -$B$9!#(B - -@table @code -@item gnus-button-alist -@vindex gnus-button-alist -$B$=$l$>$l$NF~NOMWAG$,H$G$"$k$H$_$J$5$l$^$9!#(B -$B$3$l$OKd$a9~$^$l$?(B URL $B$K9gCW$9$kE57?E*$J@55,I=8=$G(B -$B$9(B @samp{]*\\)>}$B!#(B - -@item button-par -Gnus $B$O9gCW$7$?$b$N$N$I$NItJ,$,%O%$%i%$%H$5$l$k$N$+$rCN$i$J$1$l$P$J$j$^(B -$B$;$s!#$3$l$O@55,I=8=$N$I$NI{I=8=$,%O%$%i%$%H$5$l$k$+$r;XDj$9$kHV9f$G$9!#(B -$BA4$F$r%O%$%i%$%H$7$?$$$N$J$i!"$3$3$G(B 0 $B$r;H$C$F$/$@$5$$!#(B - -@item use-p -$B$3$N<0$O(B @code{$BI>2A(B} $B$5$l!"7k2L$,(B @code{nil} $B$G$J$1$l$P!"$3$l$O9gCW$G$"(B -$B$k$H$_$J$5$l$^$9!#$3$l$O4V0c$C$?9gCW$rHr$1$k$?$a$KFCJL$JA*JL$r$7$?$$$H$-(B -$B$KLr$KN)$A$^$9!#(B - -@item function -$B$3$N4X?t(B (function) $B$O$3$N%\%?%s$r%/%j%C%/$7$?$H$-$K8F$P$l$^$9!#(B - -@item data-par -@var{button-par} $B$N$h$&$K!"$3$l$OItJ,I=8=$NHV9f$G$9$,!"$3$l$O9gCW$N$I$N(B -$BItJ,$,(B @var{function} $B$K%G!<%?$H$7$FAw$i$l$k$+$r;XDj$7$^$9!#(B -@end table - -$B$G$9$+$i!"(BURL $B$r%\%?%s$K$9$k40A4$JF~NOMWAG$O(B - -@lisp -("]*\\)>" 0 t gnus-button-url 1) -@end lisp - -@item gnus-header-button-alist -@vindex gnus-header-button-alist -$B$=$l$,5-;v$N%X%C%@!<$@$1$KE,MQ$5$l!"$=$l$>$l$NF~NOMWAG$,$I$N%X%C%@!<$K%\(B -$B%?%s2=$rE,MQ$9$k$+$r<($9DI2C$NMWAG$,$"$k;v$r=|$-!"$3$l$OB>$NO"A[%j%9%H$H(B -$BF1$8$h$&$J$b$N$G$9(B: - -@lisp -(HEADER REGEXP BUTTON-PAR USE-P FUNCTION DATA-PAR) -@end lisp - -@var{header} $B$O@55,I=8=$G$9!#(B - -@item gnus-button-url-regexp -@vindex gnus-button-url-regexp -$BKd$a9~$^$l$?(B URL $B$K9gCW$9$k@55,I=8=$G$9!#$=$l$O>e$NJQ?t$N%G%#%U%)%k%H$N(B -$BCM$G;H$o$l$^$9!#(B - -@item gnus-article-button-face -@vindex gnus-article-button-face -$B%\%?%s$K;H$o$l$k%U%'%$%9$G$9!#(B - -@item gnus-article-mouse-face -@vindex gnus-article-mouse-face -$B%^%&%9$N%+!<%=%k$,%\%?%s$N>e$K$"$k$H$-$K;H$o$l$k%U%'%$%9$G$9!#(B -@end table - -$B5-;v$r<+F0E*$K%\%?%s2=$9$kJ}K!$O(B @xref{Customizing Articles} $B$r;2>H$7$F(B -$B2<$5$$!#(B - -@node Article Date -@subsection $B5-;v$NF|IU(B - -$BF|IU$OJ9$$$?;v$NL5$$2?$+JUnA$J;~4VBS(B (timezone) $B$G:n@.$5$l$F$$$k;v$,NI$/(B -$B$"$k$N$G!"5-;v$,Aw$i$l$?$H$-$K2?;~$G$"$C$?$+$rCN$k;v$,$G$-$k$N$OHs>o$KNI(B -$B$$;v$G$7$g$&!#(B - -@table @kbd -@item W T u -@kindex W T u ($B35N,(B) -@findex gnus-article-date-ut -UT ($BJLL>(B GMT, ZULU) $B$GF|IU$rI=<($7$^$9(B (@code{gnus-article-date-ut})$B!#(B - -@item W T i -@kindex W T i ($B35N,(B) -@findex gnus-article-date-iso-8601 -@cindex ISO 8601 -$BF|IU$r9q:]E*$J7A<0!"(BISO 8601 $B$GI=<($7$^(B -$B$9(B (@code{gnus-article-date-iso8601})$B!#(B - -@item W T l -@kindex W T l ($B35N,(B) -@findex gnus-article-date-local -$BF|IU$r$=$NCO0h$N;~4VBS$GI=<($7$^$9(B (@code{gnus-article-date-local})$B!#(B - -@item W T p -@kindex W T p (Summary) -@findex gnus-article-date-english -$BF|IU$r1Q8l$GH/2;$G$-$k7A<0$GI=<($7$^(B -$B$9(B (@code{gnus-article-date-english})$B!#(B - -@item W T s -@kindex W T s ($B35N,(B) -@vindex gnus-article-time-format -@findex gnus-article-date-user -@findex format-time-string -$BF|IU$rMxMQrM}$KCV$-(B -$B49$($k$3$H$G$9!#(B - -$B$3$N9T$,O"B3$7$F99?7$5$l$k$h$&$K$7$?$$$N$G$"$l$P!"(B - -@lisp -(gnus-start-date-timer) -@end lisp - -$B$r$"$J$?$N(B @file{.gnus.el} $B%U%!%$%k$KF~$l$k$+!"2?$+$N%U%C%/$G$NJQ494X?t$r;H$C$F$$$F!"$=$l$,40A4$K4V0c$C$?;v$r$7$F$$$k$N$G$O(B -$B$J$$$+$H?4G[$7$F$$$k$H$-$KLr$KN)$A$^$9!#Nc$($P!"5-;v$,(B 1854$BG/$KEj9F$5$l(B -$B$?$H$J$C$F$$$k$H$7$^$7$g$&!#$7$+$7!"$=$N$h$&$J;v$O(B @emph{$B40A4$K(B }$BIT2DG=(B -$B$G$9!#;d$,?.MQ$G$-$^$;$s$+(B? *$B$/$9$/$9(B($B>P(B)* -@end table - -$B<+F0E*$K9%$`=q<0$GF|IU$rI=<($9$kJ}K!$O(B @xref{Customizing Articles} $B$r;2(B -$B>H$7$F2<$5$$!#(B - -@node Article Signature -@subsection $B5-;v$N=pL>(B -@cindex signatures -@cindex article signature - -@vindex gnus-signature-separator -$B$=$l$>$l$N5-;v$OFs$D$NItJ,$KJ,$1$i$l$^$9!=!=8+=P$7(B (header) $B$HK\(B -$BBN(B (body) $B$G$9!#K\BN$O=pL>ItJ,$HJ8>OItJ,$KJ,$1$i$l$^$9!#$I$l$,=pL>$H$_$J(B -$B$5$l$k$+$r7h$a$kJQ?t$O(B @code{gnus-signature-separator} $B$G$9!#$3$l$OIaDL(B -$B$O(B son-of-RFC 1036 $B$G;X<($5$l$F$$$kI8=`$N(B @samp{^-- $} $B$G$9!#$7$+$7!"B?(B -$B$/$N?M$,I8=`$G$J$$=pL>J,N%$rMQ$$$^$9$N$G!"$3$NJQ?t$O0l$D0l$D;n$5$l$k!"@5(B -$B5,I=8=$N%j%9%H$G$"$k$3$H$b$G$-$^$9!#(B($BC5:w$OK\BN$N:G8e$+$i;O$a$X$H$J$5$l(B -$B$^$9!#(B) $B$h$/$"$j$=$&$JCM$O(B: - -@lisp -(setq gnus-signature-separator - '("^-- $" ; $BI8=`(B - "^-- *$" ; $BIaDL$N2u$7J}(B - "^-------*$" ; $BB?$/$N?M$OD9!$H$_$J$5$l$k(B -$B$+$X$N@)8B$rDs6!$7$^$9!#(B - -@enumerate -@item -$B$3$l$,@0?t$G$"$l$P!"=pL>$O$3$N@0?t$h$j(B ($BJ8;z$G(B) $BD9$/$J$C$F$$$F$O$$$1$^$;(B -$B$s!#(B -@item -$B$3$l$,IbF0>.?tE@?t$G$"$l$P!"=pL>$O$=$N?t;z$h$j(B ($B9T$G(B) $BD9$/$J$C$F$$$F$O$$(B -$B$1$^$;$s!#(B -@item -$B$3$l$,4X?t$G$"$l$P!"$=$N4X?t$O0z?t$J$7$G8F$P$l!"$=$l$,(B @code{nil} $B$rJV$;(B -$B$P!"%P%C%U%!$K$O=pL>$,$"$j$^$;$s!#(B -@item -$B$3$l$,J8;zNs$G$"$l$P!"$=$l$O@55,I=8=$H$7$F;H$o$l$^$9!#$b$7$=$l$,9gCW$9$l(B -$B$P!"$=$NEv$NJ8;zNs$O=pL>$G$O$"$j$^$;$s!#(B -@end enumerate - -$B$3$NJQ?t$OMWAG$,>e$K5s$2$i$l$?7?$N%j%9%H$G$"$k;v$b$G$-$^$9!#$3$l$ONc$G$9(B: - -@lisp -(setq gnus-signature-limit - '(200.0 "^---*Forwarded article")) -@end lisp - -$B$3$l$O=pL>J,N%J*$N8e$K(B 200 $B$rD6$($k9T$+!"=pL>J,N%J*$N8e$NJ8>O$,@55,I=(B -$B8=(B @samp{^---*Forwarded article} $B$K9gCW$9$l$P!"7k6I$=$l$O=pL>$G$O$J$$$H(B -$B$$$&;v$G$9!#(B - -@node Article Miscellania -@subsection $B5-;v$$$m$$$m(B - -@table @kbd -@item A t -@kindex A t (Summary) -@findex gnus-article-babel -$B5-;v$r$"$k8@8l$+$iJL$N$b$N$XJQ49$7$^(B -$B$9(B (@code{gnus-article-babel})$B!#(B -@end table - -@c node `MIME Commands' and node `Charsets' is stripped, which is -@c pGnus specific. - -@node Article Commands -@section $B5-;vL?Na(B - -@table @kbd -@item A P -@cindex PostScript -@cindex printing -@kindex A P ($B35N,(B) -@vindex gnus-ps-print-article -@findex gnus-summary-print-article -$B5-;v%P%C%U%!$N%]%9%H%9%/%j%W%H(B (PostScript) $B%$%a!<%8$r:n@.$7$F0u:~$7$^(B -$B$9(B (@code{gnus-summary-print-article})$B!#(B@code{gnus-ps-print-hook} $B$,%P%C(B -$B%U%!$r0u:~$9$kD>A0$KJ}$GF0:n$7$^(B -$B$9!#8el9g$O!"$9$Y$F$N35N,9T$,0l9T0l9TJB$SBX$($i$l$^$9!#A0l9g$O!"(B -$B:,K\$H:,K\$r4pK\$H$7$FJB$SBX$($i$l!"$=$l$O$"$J$?$,5a$a$F$$$k;v$H$O0[(B -$B$J$C$F$$$k$+$b$7$l$^$;$s!#%9%l%C%I$r;H$&;v$r@Z$jBX$($k$K$O(B @kbd{T T} $B$r(B -$BBG$C$F$/$@$5$$(B (@pxref{Thread Commands})$B!#(B - -@node Finding the Parent -@section $B?F5-;v$rC5$9(B -@cindex parent articles -@cindex referring articles - -@table @kbd -@item ^ -@kindex ^ ($B35N,(B) -@findex gnus-summary-refer-parent-article -$B8=:_$N5-;v$N?F5-;v$rFI$_$?$/$F!"$=$l$,35N,%P%C%U%!$KI=<($5$l$F$$$J$$$/$F(B -$B$b!"$*$=$i$/$=$l$O2DG=$G$7$g$&!#$H$$$&$N$O!"8=:_$N%0%k!<%W(B -$B$,(B @sc{nntp} $B$GC5n$5$l$F$$$J$$>e!"8=:_$N5-(B -$B;v$N(B @code{References} $B$,$V$A2u$5$l$F$$$J$1$l$P!"$?$@!"(B -@kbd{^} $B$+(B @kbd{A r} $B$r2!$;$PNI$$$@$1$G(B -$B$9(B (@code{gnus-summary-refer-parent-article})$B!#$b$7A4$F$,>e/$7;~4V$,(B -$B$+$+$j$^$9!#$b$7!"$3$l$r$7$P$7$P9T$&$N$G$"$l$P!"(B -@code{gnus-fetch-old-headers} $B$r(B @code{invisible} $B$K@_Dj$9$k$3$H$r9M$($?(B -$B$[$&$,NI$$$G$7$g$&(B (@pxref{Filling In Threads})$B!#$3$l$OIaDL$O;k3PE*$J8z(B -$B2L$O$"$j$^$;$s$,!"$3$NL?Na$NF0:n$r$+$J$jB.$/$9$k$G$7$g$&!#$b$A$m$s!"%0%k!<(B -$B%W$KF~$k$N$O>/$7CY$/$J$j$^$9!#(B - -@vindex gnus-refer-thread-limit -$BJQ?t(B @code{gnus-refer-thread-limit} $B$O$3$NL?Na$re=q$-$9$k;v$,$G$-$^$9!#(B - -@item M-^ ($B35N,(B) -@findex gnus-summary-refer-article -@kindex M-^ ($B35N,(B) -@cindex Message-ID -@cindex fetching by Message-ID -$B$I$N%0%k!<%W$KB0$7$F$$$k$+$K4X$o$i$:!"G$0U$N5-;v$r(B @sc{nntp} $B%5!<%P!<$K(B -$B?R$M$k;v$,$G$-$^$9!#(B -@kbd{M-^} (@code{gnus-summary-refer-article}) $B$O(B @code{Message-ID}$B!"$=$l(B -$B$O$"$ND9$/!"$J$+$J$+FI$`;v$N$G$-$J(B -$B$$(B @samp{<38o6up$6f2@@hymir.ifi.uio.no>} $B$N$h$&$J;2>H$r$"$J$?$K?R$M$^$9!#(B -$B$"$J$?$O$9$Y$F$r@53N$KBG$A9~$^$J$1$l$P$J$j$^$;$s!#;DG0$J$,$i!"$"$$$^$$$J(B -$B8!:w$O$G$-$J$$$N$G$9!#(B -@end table - -$B%K%e!<%9$G$J$$A*BrJ}K!$+$i(B @code{Message-ID} $B$Ge=q$-$9$k;v$,(B -$B$G$-$^$9!#(B - -@vindex gnus-refer-article-method -$B$b$7$"$J$?$NFI$s$G$$$k%0%k!<%W$,(B @code{Message-ID} $B$G$Nl9g!"(B -@code{gnus-refer-article-method} $B$r(B @sc{nntp} $B$K@_Dj$9$k;v$,$G$-$^$9!#$*(B -$B$=$i$/!"$"$J$?$,2qOC$7$F$$$k(B @sc{nntp} $B%5!<%P!<$,$"$J$?$NFI$s$G$$$k%9%W!<(B -$B%k$r99?7$7$F$$$k$HHs>o$KNI$$$G$7$g$&!#$7$+$7!"$=$l$O$I$&$7$F$bI,MW$J$o$1(B -$B$G$O$"$j$^$;$s!#(B - -$B$=$l$OA*BrJ}K!$N%j%9%H$G$"$k$3$H$b$G$-!"FCJL$J%7%s%\%k(B @code{current} $B$G(B -$B$"$k$3$H$b$G$-$^$9!#8el9g$O!"(Bgnus $B$O9g$&$b$N$rH/8+$9$k$^$G%j%9%H$NA4$F$NJ}K!$r;n$7$^$9!#(B - -$B$3$l$O8=:_$NJ}K!$r;n$7$F!"$=$l$,<:GT$7$?>l9g$K$O(B Deja $B$K?V$/@_Dj$NNc$G$9(B: - -@lisp -(setq gnus-refer-article-method - '(current - (nnweb "refer" (nnweb-type dejanews)))) -@end lisp - -$B$[$H$s$I$N%a!<%k%P%C%/%(%s%I$O(B @code{Message-ID} $B$G$N$N$b$N$O;~4V$,$+$+$j$9$.$^$9!#(B) -@code{nnmh} $B$G$OA4$/IT2DG=$G$9!#(B - -@node Alternative Approaches -@section $BBeBX/$7$NA*Br;h$rM?$($F$"$j$^$9!#(B - -@menu -* 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 -@end menu - -@node Pick and Read -@subsection $BA*$s$GFI$`(B -@cindex pick and read - -$B$$$/$D$+$N%K%e!<%9%j!<%@!<(B (@code{nn} $B$d!"$"$N$)!"(BVM/CMS $B$G(B -$B$N(B @code{Netnews} $B$J$I(B) $B$OFsAj$NFI$`$?$a$N3&LL$r;H$$$^$9!#MxMQ/(B -$B$7$N%W%m%;%90uL?Na$,0lBG80L?Na$K$J$j!"35N,%P%C%U%!$X@Z$jBX$($k$?$a$NDI2C(B -$BL?Na$r0l$DDs6!$7$^$9!#(B - -$B$3$l$,(B pick mode $B$r;H$C$?$H$-$K;HMQ2DG=$J%-!<$G$9(B: - -@table @kbd -@item . -@kindex . ($BA*Br(B) -@findex gnus-pick-article-or-thread -$B8=:_$N9T$N5-;v$+%9%l%C%I$rA*Br$7$^(B -$B$9(B (@code{gnus-pickd-article-or-thread})$B!#$b$7JQ(B -$B?t(B @code{gnus-thread-hide-subtree} $B$,(B true $B$G$"$l$P!"$3$N%-!<$O%9%l%C%I(B -$B$N:G=i$N5-;v$G;H$o$l$?$H$-$O%9%l%C%IA4BN$rA*Br$7$^$9!#$=$&$G$J$1$l$P!"$=(B -$B$l$O$=$N5-;v$@$1$rA*Br$7$^$9!#$b$7?tCM@\F,0z?t$rM?$($i$l$l$P$=$N%9%l%C%I(B -$B$+5-;v$X$H@8$s$G$$$-!"$=$l$rA*Br$7$^$9!#(B($B9T?t$OIaDL$O35N,A*Br9T$N:G=i$K(B -$BI=<($5$l$F$$$^$9!#(B) - -@item SPACE -@kindex SPACE ($BA*Br(B) -@findex gnus-pick-next-page -$B35N,%P%C%U%!$r0l%Z!<%8l9g$O$=$l$O5-;v$@(B -$B$1$rL$A*Br$K$7$^$9!#$=$N9T$K$"$k%9%l%C%I$+5-;v$rL$A*Br$K$9$k$?$a$K$3$N%-!<(B -$B$K?tCM@\F,0z?t$rM?$($k;v$,$G$-$^$9!#(B - -@item RET -@kindex RET ($BA*Br(B) -@findex gnus-pick-start-reading -@vindex gnus-pick-display-summary -$BA*Br$5$l$?5-;v$rFI$_;O$a$^$9(B (@code{gnus-pick-start-reading})$B!#@\F,0z?t(B -$B$rM?$($i$l$l$P!"$^$:$9$Y$F$NL$A*Br5-;v$K4{FI$N0u$rIU$1$^$9!#(B -@code{gnus-pick-display-summary} $B$,(B @code{nil} $B$G$J$$$H!"35N,%P%C%U%!$O(B -$BFI$s$G$$$k4V$bI=<($5$l$^$9!#(B -@end table - -$BA4$F$NIaDL$N35N,%b!<%IL?Na$OA*Br%b!<%I(B (pick-mode)$B$G$b;HMQ2DG=$G$9$,!"(B -@kbd{u} $B$ONc30$G$9!#$7$+$7!"F1$84X(B -$B?t(B @code{gnus-summary-tick-article-forward} $B$K3d$jEv$F$i$l$F$$(B -$B$k(B @kbd{!} $B$r;H$&;v$,$G$-$^$9!#(B - -$B$3$l$,NI$$9M$($@$H;W$&$N$G$"$l$P!"/$70c$$$^$9!#$=$l$>$l$N9T$N(B -$B:G=i$K9T?t$,I=<($5$l$^$9!#(BPick $B%b!<%I$N9T$NMM<0$OJQ(B -$B?t(B @code{gnus-summary-pick-line-format} $B$G@)8f$5$l$^(B -$B$9(B (@pxref{Formatting Variables})$B!#$3$l(B -$B$O(B @code{gnus-summary-line-format} $B$HF1$8MM<0;XDj$r/$7$"$j$^$9(B: - -@table @code -@item gnus-tree-mode-hook -@vindex gnus-tree-mode-hook -$B$9$Y$F$NLZ%b!<%I%P%C%U%!$GH$7$F$/$@$5$$!#(B - -@item gnus-selected-tree-face -@vindex gnus-selected-tree-face -$BLZ%P%C%U%!$GA*Br$5$l$?5-;v$r%O%$%i%$%H$9$k$?$a$K;H$o$l$k%U%'%$%9$G$9!#%G%#(B -$B%U%)%k%H$G$O(B @code{modeline} $B$G$9!#(B - -@item gnus-tree-line-format -@vindex gnus-tree-line-format -$BLZ$N@a$N$?$a$N%U%)!<%^%C%HJ8;zNs$G$9!#$G$b$3$NL>A0$O>/$78m$C$?L>>N$G(B -$B$9!=!=$=$l$O9T$G$O$J$/!"$?$@@a$rDj5A$9$k$@$1$G$9!#%G%#%U%)%k%H$NCM(B -$B$O(B @samp{%(%[%3,3n%]%)} $B$G!"$=$l$OEj9FA0$N:G=i$N;0J8;z$rI=<($7$^$9!#(B -$B$9$Y$F$N@a$,F1$8D9$5$G$"$k$N$O=EMW$G$9$N$G!"(B@samp{%4,4n} $B$N$h$&$J;XDj(B -$B$r(B @emph{$B;H$o$J$1$l$P$J$i$J$$(B} $B$N$G$9!#(B - -$BM-8z$J;XDj$O(B: - -@table @samp -@item n -$BEj9FA0!#(B -@item f -@code{From} $BMs!#(B -@item N -$B5-;v$NHV9f!#(B -@item [ -$B3+$-3g8L!#(B -@item ] -$BJD$83g8L!#(B -@item s -$BI=Bj!#(B -@end table - -@xref{Formatting Variables}$B!#(B - -$BI=<($K4XO"$7$?JQ?t$O(B: - -@table @code -@item gnus-tree-brackets -@vindex gnus-tree-brackets -$B$3$l$O!XK\Ev$N!Y5-;v$H!X$^$P$i5-;v!Y$K0c$$$rIU$1$k$?$a$K;H$o$l$^$9!#MM<0(B -$B$O(B @code{((@var{$BK\Ev$N3+(B} . @var{$BK\Ev$NJD(B}) (@var{$B$^$P$i3+(B} . @var{$B$^$P$iJD(B}) (@var{$B56$N3+(B} . @var{$B56$NJD(B}))} $B$H(B -$B$J$C$F$$$F!"%G%#%U%)%k%H(B -$B$O(B @code{((?[ . ?]) (?( . ?)) (?@{ . ?@}) (?< . ?>))} $B$G$9!#(B - -@item gnus-tree-parent-child-edges -@vindex gnus-tree-parent-child-edges -$B$3$l$O?F$N@a$r;R$K@\B3$9$k$?$a$K;H$o$l$kJ8;z$r4^$s$@%j%9%H$G$9!#%G%#%U%)(B -$B%k%H$O(B @code{(?- ?\\ ?|)} $B$G$9!#(B -@end table - -@item gnus-tree-minimize-window -@vindex gnus-tree-minimize-winodw -$B$b$7$3$NJQ?t$,(B @code{nil} $B$G$J$$$H!"B>$N(B gnus $B%&%#%s%I%&$,$b$C$H>l=j$r.$5$/$7$^$9!#$b$7$3$NJQ?t$,?t;z(B -$B$G$"$k$H!"LZ%P%C%U%!$O$=$N?t;z$h$jBg$-$/$J$k;v$O$"$j$^$;$s!#%G%#%U%)%k%H(B -$B$O(B @code{t} $B$G$9!#%U%l!<%`$G$$$/$D$+$N%&%#%s%I%&$,2#$KJB$s$GI=<($5$l$F$$(B -$B$F!"LZ%P%C%U%!$,$=$N$&$A$N0l$D$G$"$k>l9g!"LZ%&%#%s%I%&$r:G>.2=$9$k$3$H$O(B -$B$=$NNY$KI=<($5$l$F$$$k$9$Y$F$N%&%#%s%I%&$NBg$-$5$rJQ99$9$k;v$KCm0U$7$F$/(B -$B$@$5$$!#(B - -@item gnus-generate-tree-function -@vindex gnus-generate-tree-function -@findex gnus-generate-horizontal-tree -@findex gnus-generate-vertical-tree -$BLZ%P%C%U%!(B (vertical tree buffer) $B$GI=<($5$l$?$b$N$G$9(B: - -@example -@{***@} - |--------------------------\-----\-----\ -(***) [Bjo] [Gun] [Gun] - |--\-----\-----\ | -[odd] [Jan] [odd] (***) [Jor] - | | |--\ -[Gun] [Eri] [Eri] [odd] - | - [Paa] -@end example - -$B$b$7?eJ?LZ$r;H$C$F$$$k$N$J$i!"35N,%P%C%U%!$GLZ$rNY$j9g$o$;$GI=<($G$-$l$P(B -$B4r$7$$$G$7$g$&!#C5n$9$k$H$$$&$3(B -$B$H$G$9!#(B(@pxref{Expiring Mail})$B!#(B - -@item B M-C-e -@kindex B M-C-e ($B35N,(B) -@findex gnus-summary-expire-articles-now -$B%0%k!<%W$N$9$Y$F$N4|8B:o=|2DG=$J5-;v$r:o=|$7$^(B -$B$9(B (@code{gnus-summay-expire-articles-now})$B!#$3$l$O8=:_$N%0%k!<%W$N3:Ev(B -$B$9$k(B @strong{$BA4$F(B}$B$N4|8B:o=|5-;v$O1J1s$K6u$NBg$-$J(B @file{/dev/null} $B$X>C(B -$B$(5n$k$H$$$&;v$G$9!#(B - -@item B DEL -@kindex B DEL ($B35N,(B) -@findex gnus-summary-delete-article -@c @icon{gnus-summary-mail-delete} -$B%a!<%k5-;v$r:o=|$7$^$9!#$3$l$O!X$"$J$?$N%G%#%9%/$+$i:#$+$i1J1s$K:o=|$7$F!"(B -$BFsEY$HLa$i$J$$!Y$N!X:o=|!Y$G$9!#Cm0U$7$F;H$C$F$/$@$5(B -$B$$(B (@code{gnus-summary-delete-article})$B!#(B - -@item B m -@kindex B m ($B35N,(B) -@cindex move mail -@findex gnus-summary-move-article -@vindex gnus-preserve-marks -$B$"$k%a!<%k%0%k!<%W$+$iJL$N$H$3$m$X5-;v$r0\F0$7$^(B -$B$9(B (@code{gnus-summary-move-article})$B!#(B@var{gnus-preserve-marks} $B$NCM(B -$B$,(B nil $B$G$O$J$$$J$i$P(B ($B$3$l$,=i4|CM$G$9$,(B)$B!"%^!<%/$OJ]B8$5$l$^$9!#(B - -@item B c -@kindex B c ($B35N,(B) -@cindex copy mail -@findex gnus-summary-copy-article -@c @icon{gnus-summary-mail-copy} -$B$"$k%0%k!<%W(B ($B%a!<%k%0%k!<%W$dB>$N$b$N(B) $B$+$i%a!<%k%0%k!<%W$K5-;v$rJ#@=$7(B -$B$^$9(B (@code{gnus-summary-copy-article})$B!#(B@var{gnus-preserve-marks} $B$NCM(B -$B$,(B nil $B$G$O$J$$$J$i$P(B ($B$3$l$,=i4|CM$G$9$,(B)$B!"%^!<%/$OJ]B8$5$l$^$9!#(B - -@item B B -@kindex B B ($B35N,(B) -@cindex crosspost mail -@findex gnus-summary-crosspost-article -$B8=:_$N5-;v$rB>$N%0%k!<%W$K%/%m%9%]%9%H$7$^(B -$B$9(B (@code{gnus-summary-crosspost-article})$B!#$3$l$OB>$N%0%k!<%W5-;v$N?7$7(B -$B$$J#@=$r:n@.$7!"5-;v$N(B Xref $BMs$bE,@Z$K99?7$5$l$^$9!#(B - -@item B i -@kindex B i ($B35N,(B) -@findex gnus-summary-import-article -$BG$0U$N%U%!%$%k$r8=:_$N%a!<%k%0%k!<%W$K$H!"(B -@code{From} $BMs$H(B @code{Subject} $BMs$NF~NO$rB%$5$l$^$9!#(B - -@item B r -@kindex B r ($B35N,(B) -@findex gnus-summary-respool-article -$B%a!<%k5-;v$r%9%W!<%k$7D>$7$^$9(B (@code{gnus-summary-move-article})$B!#(B -@code{gnus-summary-respool-default-method} $B$,:F%9%W!<%k$9$k$H$-$N%G%#%U%)(B -$B%k%H$NA*BrJ}K!$H$7$F;HMQ$5$l$^$9!#$3$NJQ?t$O%G%#%U%)%k%H$G(B @code{nil} $B$G!"(B -$B$3$l$O8=:_$N%0%k!<%W$NA*BrJ}K!$,Be$o$j$K;H$o$l$k$H$$$&;v$G$9!#(B -@var{gnus-preserve-marks} $B$NCM$,(B nil $B$G$O$J$$$J$i$P(B ($B$3$l$,=i4|CM$G$9$,(B)$B!"(B -$B%^!<%/$OJ]B8$5$l$^$9!#(B - -@item B w -@itemx e -@kindex B w ($B35N,(B) -@kindex e ($B35N,(B) -@findex gnus-summary-edit-article -@kindex C-c C-c ($B5-;v(B) -$B8=:_$N5-;v$rJT=8$7$^$9(B (@code{gnus-summary-edit-article})$B!#JT=8$r=*N;$7(B -$B$FJQ99$r1J1s$K$9$k$?$a$K!"(B@kbd{C-c C-c} $B$rBG$A$^$9!#$b$7L?(B -$BNa(B @kbd{C-c C-c} $B$K?tCM@\F,0z?t$rM?$($k$H!"(Bgnus $B$O5-;v$r:F%O%$%i%$%H$7$^(B -$B$;$s!#(B - -@item B q -@kindex B q ($B35N,(B) -@findex gnus-summary-respool-query -$B$b$75-;v$r:F%9%W!<%k$7$?$$$H$-$O!":F%9%W!<%k$r$9$kA0$K$I$N%0%k!<%W$K5-;v(B -$B$,0\$k$+$K6=L#$,$"$k$G$7$g$&!#$3$NL?Na$G$=$l$,$o$+$j$^(B -$B$9(B (@code{gnus-summary-respool-query})$B!#(B - -@item B t -@kindex B t ($B35N,(B) -@findex gnus-summary-respool-trace -$BF1MM$K!"$3$NL?Na$O:FN/$a9~$_$r$9$k$H$-$K;H$o$l$?A4$F$NFC5iJ,3dJ}<0$r!"$b(B -$B$7$=$l$,$"$l$PI=<($7$^$9(B (@code{gnus-summary-respool-trace})$B!#(B - -@item B p -@kindex B p ($B35N,(B) -@findex gnus-summary-article-posted-p -$B0lIt$N?M$O$"$J$?$NEj9F$X$N%U%)%m!<%"%C%W$r$9$k$H$-$K!"!X?F@Z$J!YJ#@=$rAw(B -$B$k798~$,$"$j$^$9!#$3$l$i$OIaDL$O$=$3$K(B @code{Newsgroups} $BMs$,IU$$$F$$$k(B -$B$N$G$9$,!"$$$D$b$=$&$G$"$k$H$O8B$j$^$;$s!#$3$NL?(B -$BNa(B (@code{gnus-summary-article-posted-p}) $B$O8=:_$N5-;v$r$"$J$?$N%K%e!<%9(B -$B%5!<%P!<$+$i(B ($B$H$$$&$h$j$O!"$`$7(B -$B$m(B @code{gnus-refer-article-method} $B$d(B @code{gnus-select-method} $B$+(B -$B$i(B) $B$r;H$&$N$KBP$7(B -$B$F(B @code{gnus-move-split-methods} $B$O%0%k!<%WL>$r;H$&$3$H$KCm0U$7$F2<$5(B -$B$$!#(B) - -@lisp -(setq gnus-move-split-methods - '(("^From:.*Lars Magne" "nnml:junk") - ("^Subject:.*gnus" "nnfolder:important") - (".*" "nnml:misc"))) -@end lisp - -@node Various Summary Stuff -@section $B$$$m$$$m$J35N,$NJ*7o(B - -@menu -* Summary Group Information:: $B>pJs;X8~$NL?Na(B -* Searching for Articles:: $BJ#?t5-;vL?Na(B -* Summary Generation Commands:: -* Really Various Summary Commands:: $B$"$N$d$C$+$$$JB>$KE,9g$7$J$$L?Na(B -@end menu - -@table @code -@vindex gnus-summary-mode-hook -@item gnus-summary-mode-hook -$B35N,%b!<%I%P%C%U%!$r:n@.$9$k$H$-$K$3$N%U%C%/$,8F$P$l$^$9!#(B - -@vindex gnus-summary-generate-hook -@item gnus-summary-generate-hook -$B$3$l$O%9%l%C%I:n@.$H35N,%P%C%U%!:n@.$NA0$Ko$KJXMx$G$9!#$3$N%U%C%/$O$[$H$s$I$N35N,%P%C%U%!(B -$BJQ?t$,@_Dj$5$l$?8e$K8F$P$l$^$9!#(B - -@vindex gnus-summary-prepare-hook -@item gnus-summary-prepare-hook -$B$=$l$O35N,%P%C%U%!$,:n@.$5$l$?8e$K8F$P$l$^$9!#Nc$($P!"$=$l$O2?$+B>$N$N5-;v$HF1$8$h$&$KI=<($7$^$9!#$3$NJQ?t$,(B @code{t} $B$G$"$k$H!"(B -$B$=$l$O5-;v$rI=<($7$^$;$s(B---$B:G=i$+$iB8:_$7$J$+$C$?$+$N$h$&$K!#(B - -@vindex gnus-alter-articles-to-read-function -@item gnus-alter-articles-to-read-function -$B$3$NJQ?t$K@_Dj$7$?4X?t$G!"A*Br$9$k5-;v$N%j%9%H$rJQ99$9$k$3$H$,$G$-$^$9!#(B -$B4X?t$OFs$D$N0z?t(B ($B%0%k!<%WL>$HA*Br$9$k5-;v$N%j%9%H(B) $B$rpJs(B - -@table @kbd -@item H f -@kindex H f ($B35N,(B) -@findex gnus-summary-fetch-faq -@vindex gnus-grou-faq-directory -$B8=:_$N%0%k!<%W$N(B FAQ (frequently asked questions ($BIQHK$K$5$l$kl9g$O!"$3$NL?Na$K@\F,0z?t$rM?$($k;v$G$$$m$$$m$J%5%$(B -$B%H(B (site) $B$+$iA*$V;v$,$G$-$^$9!#$*$=$i$/(B @code{ange-ftp} $B$b$7$/(B -$B$O(B @code{efs} $B$,%U%!%$%k$No$KC;$$5-=R$rM?$($^(B -$B$9(B (@code{gnus-summary-describe-briefly})$B!#(B - -@item H i -@kindex H i ($B35N,(B) -@findex gnus-info-find-node -Gnus $B$N(B info $B$N@a(B (node) $B$K0\F0$7$^$9(B (@code{gnus-info-find-node})$B!#(B -@end table - -@node Searching for Articles -@subsection $B5-;v$rC5$9(B - -@table @kbd -@item M-s -@kindex M-s ($B35N,(B) -@findex gnus-summary-search-article-forward -$BD>8e$K$"$kA4$F$N(B ($B@8$N(B) $B5-;v$r@55,I=8=$G8!:w$7$^(B -$B$9(B (@code{gnus-summary-search-article-forward})$B!#(B - -@item M-r -@kindex M-r ($B35N,(B) -@findex gnus-summary-search-article-backward -$BA0$K$"$kA4$F$N(B ($B@8$N(B) $B5-;v$r@55,I=8=$G8!:w$7$^(B -$B$9(B (@code{gnus-summary-search-article-backward})$B!#(B - -@item & -@kindex & ($B35N,(B) -@findex gnus-summary-execute-command -$B$3$NL?Na$O$"$J$?$K%X%C%@!l9g(B -$B$K$N5-;v$N=8$^$j$G$"$k$J$i$P(B ($BNc$($P!"E&MW(B (digest))$B!"(B -$B$=$N$h$&$J5-;v$G$G$-$F$$$k%0%k!<%W$KF~$k$?$a$K$3$NL?Na$r;H$&$+$b$7$l$^$;(B -$B$s(B(@code{gnus-summary-enter-digest-group})$B!#(BGnus $B$O$3$NL?Na$K@\F,0z?t$r(B -$BM?$($J$$8B$j!"$I$N$h$&$J7?$N5-;v$,8=:_I=<($5$l$F$$$k$+$r?dB,$7$h$&$H$7!"(B -$B$=$l$O6/@)E*$K!XE&MW!Y$H$$$&2r$NMM<0$+$i$J$kB>(B -$B$N%a%C%;!<%8$N=89g$G$"$C$?$H$-$O!"(B@kbd{C-d} $B$H$9$k$3$H$K$h$j$b$C$HJXMx$J(B -$BJ}K!$G$=$l$i$N%a%C%;!<%8$rFI$`;v$,$G$-$k$h$&$K$J$j$^$9!#(B - -@item M-C-d -@kindex M-C-d ($B35N,(B) -@findex gnus-summary-read-document -$B$3$NL?Na$O>e$N$b$N$KHs>o$K;w$F$$$^$9$,!"$$$/$D$+$NJ8=q$r0l$D$NBg!<$-$$%0(B -$B%k!<%W$K=8$a$^$9(B (@code{gnus-summary-read-read-document})$B!#$=$l$O$$$/$D(B -$B$+$N(B @code{nndoc} $B%0%k!<%W$r$=$l$>$l$NJ8=q$N$?$a$K(B $B3+$-!"$=$l$+$i$3$l$i(B -$B$N(B @code{nndoc} $B%0%k!<%W$N>e$K(B @code{nnvirtual} $B%0%k!<%W$r3+$/;v$K$h$C$F(B -$B$3$N;v$r2DG=$K$7$F$$$^$9!#$3$NL?Na$O%W%m%;%9(B/$B@\F,0z?t$N=,47$rM}2r$7$^(B -$B$9(B (@pxref{Process/Prefix})$B!#(B - -@item C-t -@kindex C-t ($B35N,(B) -@findex gnus-summary-togle-truncation -$B35N,9T$N@ZCG$r@Z$jBX$($^$9(B (@code{gnus-summary-toggle-truncation})$B!#$3$l(B -$B$O$*$=$i$/35N,%P%C%U%!$N9TCf1{I=<(4X?t$r:.Mp$5$;$^$9$N$G!"5-;v$rFI$s$G$$(B -$B$k4V$K@ZCG$r@Z$C$F$$$k$N$ONI$$9M$($G$O$J$$$G$7$g$&!#(B - -@item = -@kindex = ($B35N,(B) -@findex gnus-summary-expand-window -$B35N,%P%C%U%!$N%&%#%s%I%&$r3HBg$7$^(B -$B$9(B (@code{gnus-summary-expand-window})$B!#@\F,0z?t$rM?$($i$l$l$P!"(B -@code{$B5-;v(B} $B%&%#%s%I%&$r3HBg$7$^$9!#(B - -@item M-C-e -@kindex M-C-e ($B35N,(B) -@findex gnus-summary-edit-parameters -$B8=:_$N%0%k!<%W$N%0%k!<%W$NG^2pJQ?t(B (parameter) (@pxref{Group -Parameters}) $B$rJT=8$7$^$9(B (@code{gnus-summary-edit-parameters})$B!#(B - -@item M-C-a -@kindex M-C-a ($B35N,(B) -@findex gnus-summary-customize-parameters -$B8=:_$N%0%k!<%W$N%0%k!<%W%Q%i%a!<%?(B (@pxref{Group Parameters}) $B$r%+%9%?%^(B -$B%$%:$7$^$9(B (@code{gnus-summary-customize-parameters})$B!#(B -@end table - -@node Exiting the Summary Buffer -@section $B35N,%P%C%U%!$rH4$1$k(B -@cindex summary exit -@cindex exiting groups - -$BIaDL$O35N,%P%C%U%!$+$iH4$1$k$H!"%0%k!<%W$NA4$F$N>pJs$r99?7$7$F%0%k!<%W%P%C(B -$B%U%!$KLa$j$^$9!#(B - -@table @kbd -@item Z Z -@itemx q -@kindex Z Z (Summary) -@findex q ($B35N,(B) -@findex gnus-summary-exit -@vindex gnus-summary-exit-hook -@vindex gnus-summary-prepare-exit-hook -@c @icon{gnus-summary-exit} -$B8=:_$N%0%k!<%W$r=P$F!"%0%k!<%W$NA4$F$N>pJs$r99?7$7$^(B -$B$9(B (@code{gnus-summary-exit})$B!#H4$1=P$k$?$a$N$?$$$F$$$N;v$r$9$kA0(B -$B$K(B @code{gnus-summary-prepare-exit-hook} $B$,8F$P$l!"$=$l$O%G%#%U%)%k%H(B -$B$G(B @code{gnus-summary-expire-articles} $B$r8F$S$^$9!#H4$1=P$k2aDx$rDI$($?(B -$B8e$K(B @code{gnus-summary-exit-hook} $B$,8F$P$l$^$9!#(B($BL$FI$N(B) $B%0%k!<%W$,;D$C(B -$B$F$$$J$$$H$-$K%0%k!<%W%b!<%I$KLa$k$H$-(B -$B$K(B @code{gnus-group-no-more-groups-hook} $B$,pJs$b99?7$;$:$K8=:_$N%0%k!<%W$rH4$1=P$^(B -$B$9(B (@code{gnus-summary-exit-no-update})$B!#(B - -@item Z c -@itemx c -@kindex Z c ($B35N,(B) -@kindex c ($B35N,(B) -@findex gnus-summary-catchup-and-exit -@c @icon{gnus-summary-catchup-and-exit} -$B%0%k!<%W$NA4$F$NJ]N1$G$J$$5-;v(B (unticked article) $B$K4{FI$N0u$rIU$1$F!"$=(B -$B$l$+$iH4$1$^$9(B (@code{gnus-summary-catchup-and-exit})$B!#(B - -@item Z C -@kindex Z C ($B35N,(B) -@findex gnus-summary-catchup-all-and-exit -$BJ]N15-;v$b4^$a$F!"A4$F$N5-;v$K4{FI$N0u$rIU$1$F!"$=$l$+$iH4$1$^(B -$B$9(B (@code{gnus-summary-catchup-all-and-exit})$B!#(B - -@item Z n -@kindex Z n ($B35N,(B) -@findex gnus-summary-catchup-and-goto-next-group -$BA4$F$N5-;v$K4{FI$N0u$rIU$1$F$7$^(B -$B$9(B (@code{gnus-summary-reselect-current-group})$B!#$b$7@\F,0z?t$rM?$($i$l(B -$B$l$P!"4{FI$HL$FI$NN>J}$NA4$F$N5-;v$rA*Br$7$^$9!#(B - -@item Z G -@itemx M-g -@kindex Z G ($B35N,(B) -@kindex M-g ($B35N,(B) -@findex gnus-summary-rescan-group -@c @icon{gnus-summary-mail-get} -$B%0%k!<%W$rH4$1!"%0%k!<%W$N?7$7$$5-;v$rD4$Y!"%0%k!<%W$rA*Br$7$^(B -$B$9(B (@code{gnus-summary-rescan-group})$B!#$b$7@\F,0z?t$rM?$($i$l$l$P!"4{FI(B -$B$HL$FI$NN>J}$NA4$F$N5-;v$rA*Br$7$^$9!#(B - -@item Z N -@kindex Z N ($B35N,(B) -@findex gnus-summary-next-group -$B%0%k!<%W$rH4$1$F!"pJs$r99?7$7$FH4$1$k$H$-(B -$B$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 -@vindex gnus-kill-summary-on-exit -$B$"$J$?$K%0%k!<%W$rH4$1$F!"$=$l$+$i9M$($rJQ$($kJJ$,$"$k$N$G$"$l$P!"(B -@code{gnus-kill-summary-on-exit} $B$r(B @code{nil} $B$K@_Dj$9$k$N$,NI$$$+$b$7(B -$B$l$^$;$s!#$b$7$=$&$9$l$P!"(Bgnus $B$O$=$l$+$iH4$1=P$k$H$-$K35N,%P%C%U%!$r:o(B -$B=|$7$^$;$s!#(B($B2?$H$$$&6C$-(B!) $B$=$NBe$o$j$K!"$=$l$O%P%C%U%!$NL>A0(B -$B$r(B @samp{*Dead Summary ... *} $B$N$h$&$J$b$N$KJQ99$7!"(B -@code{gnus-dead-summary-mode} $B$H8F$P$l$k%^%$%J!<%b!<%I$rF3F~$7$^$9!#:#$d!"(B -$B$=$N%P%C%U%!$K@Z$jBX$($l$P!"A4$F$N%-!<$,4X(B -$B?t(B @code{gnus-summary-wake-up-the-dead} $B$K3d$jEv$F$i$l$F$$$k$3$H$K5$IU$/(B -$B$G$7$g$&!#;`$s$@35N,%P%C%U%!(B (dead summary buffer) $B$G$I$l$+$N%-!<$rC!$/(B -$B;v$H!"@8$-$?IaDL$N35N,%P%C%U%!$K$J$k$G$7$g$&!#(B - -$B;`$s$@35N,%P%C%U%!$OF1;~$K0l$D$7$+B8:_$9$k;v$O$G$-$^$;$s!#(B - -@vindex gnus-use-cross-reference -$B35N,%P%C%U%!$rH4$1=P$k$H!"8=:_$N%0%k!<%W$N%G!<%?$O99?7$5$l$^$9(B ($B$I$N5-;v(B -$B$rFI$s$G!"$I$N5-;v$KJVEz$7$?$+!"$J$I$J$I!#(B) $B$b$7JQ(B -$B?t(B @code{gnus-use-cross-reference} $B$,(B @code{t} $B$G$"$k$H(B ($B$=$l$,%G%#%U%)(B -$B%k%H$G$9(B)$B!"$=$N%0%k!<%W$KAj8_;2>H$5$l$?(B (cross referenced) $B5-;v$O4{FI$N(B -$B0u$,IU$-!"$=$l$,Aj8_Ej9F(B (cross post) $B$5$l$?B>$N9XFI$7$F$$$k%0%k!<%W$G$b(B -$B4{FI$N0u$,IU$-$^$9!#$3$NJQ?t$,(B @code{nil} $B$G$b(B @code{t} $B$G$J$1$l$P!"5-;v(B -$B$O9XFI$HL$9XFI$NN>J}$N%0%k!<%W$G4{FI$N0u$,IU$-$^(B -$B$9(B (@pxref{Crosspost Handling})$B!#(B - -@node Crosspost Handling -@section $BAj8_Ej9F$N07$$(B - -@cindex velveeta -@cindex spamming -$BAj8_Ej9F(B (cross post) $B$5$l$?5-;v$K4{FI$N0u$rIU$1$k;v$O!"F1$85-;v$rFs2s0J(B -$B>eFI$^$J$$$G$9$`$H$$$&;v$rJ]>Z$7$^$9!#$b$A$m$s!"$@$l$+$,$=$l$r$$$/$D$+$N(B -$B%0%k!<%W$KJL!9$KEj9F$7$J$$8B$j$O!#F1$85-;v$r$$$/$D$+$N%0%k!<%W$KEj9F$9$k(B -$B;v(B ($BAj8_Ej9F$G$J$/$F(B) $B$O(B @dfn{spamming} $B$H8F$P$l!"$"$J$?$O$=$N$h$&$JA~$`(B -$B$Y$-HH:a$r9T$&$b$N$K$KBP$7$F!"K!N'$K$h$C$FIT2w$J5-;v$rAw$k$3$H$,5AL3$E$1(B -$B$i$l$F$$$^$9!#(Bspam $B$rA*JL$9$k$?$a$K!"(BNoCeM $BjAj8_Ej9F$KBP$7$FITK~$r8@$&$?$a$KL?(B -$BNa(B @code{gnus-summary-mail-crosspost-complaint} $B$r;H$&$3$H$5$($G$-$^$9!#(B - -@cindex cross-posting -@cindex Xref -@cindex @sc{nov} -$BAj8_Ej9F$r(B gnus $B$,@5$7$/07$($J$$$h$&$K$J$k860x$N0l$D$O!"(B@sc{nov} $B9T(B -$B$K(B @code{Xref} $BMs$r4^$^$J$$!"(B@sc{xover} ($B$3$l$OHs>o$KNI$$$G$9!"$H$$$&$N(B -$B$O$=$l$OB.EY$r$H$F$bB.$/$9$k$+$i$G$9(B) $B$N;HMQ2DG=$J(B @sc{nntp} $B%5!<%P!<$r(B -$B;H$C$F$$$k$3$H$G$9!#$3$l$O320-$J$N$G$9$,!"$"$!!"Ha$7$$$+$J!"Hs>o$KNI$/$"(B -$B$k;v$G$9!#(BGnus $B$O$"$J$?$,FI$s$@A4$F$N5-;v$K(B @code{Xref} $B9T$rEPO?$9$k;v$G!"(B -$B@5$7$$;v$r$7$h$&(B $B$H$7$^$9$,!"5-;v$r:o=|$9$k$+!"FI$^$J$$$G4{FI$N0u$rIU$1(B -$B$k$H!"(Bgnus $B$O$3$l$i$N5-;v$K(B @code{Xref} $B$N9T$r$N$>$-$^$o$k5!2q$rF@$k;v$,(B -$BL5$/!"Aj8_;2>H5!9=$rMQ$$$k;v$,$G$-$^$;$s!#(B - -@cindex LIST overview.fmt -@cindex overview.fmt -$B$"$J$?$N(B @sc{nntp} $B%5!<%P!<$,$=$N354Q%U%!%$(B -$B%k(B (overview file) $B$K(B @code{Xref} $BMs$r4^$s$G$$$k$+$rD4$Y$k$K$O!"(B -@samp{telnet your.nntp.server nntp} $B$H$7$F!"(B@code{inn} $B%5!<%P!<(B -$B$G(B @samp{More READER} $B$H$7!"$=$l$+$i(B @samp{LIST overview.fmt} $B$H$9$k;v$r(B -$B;n$7$F$/$@$5$$!#$3$l$OF0:n$7$J$$$G$7$g$&$,!"$b$7F0:n$7$F!"o$KB.EY$r(B -$BCY$/$7$^$9!#(B - -$B$^!"?M@8$O$=$N$h$&$J$b$N$G$9!#(B - -$BBeBXH$7$F$/$@$5$$!#(B - -@node Duplicate Suppression -@section $B=EJ#$NM^@)(B - -$B%G%#%U%)%k%H$G$O(B gnus $B$OAj8_Ej9F5!9=$rMxMQ$9$k;v$K$h$C$F!"F1$85-;v(B -$B$rFs2s0J>eFI$^$J$$$h$&$K$7$h$&$H$7$^$9(B (@pxref{Crosspost Handling})$B!#$7(B -$B$+$7!"$=$NC1=c$G8z2LE*$JJ}K!$O!"$$$m$$$m$JM}M3$K$h$j!"K~B-$9$k7k2L$r$b$?(B -$B$i$5$J$$$+$bCN$l$^$;$s!#(B - -@enumerate -@item -@sc{nntp} $B%5!<%P!<$O(B @code{Xref} $BMs$N@8@.$K<:GT$9$k$+$bCN$l$^$;$s!#$3$l(B -$B$O0-$$;v$G!"$"$^$j5/$3$j$^$;$s!#(B - -@item -@sc{nntp} $B%5!<%P!<$O(B @file{.overview} $B%G!<%?%Y!<%9$K(B @code{Xref} $BMs$r4^(B -$B$a$k$N$K<:GT$9$k$+$bCN$l$^$;$s!#$3$l$O0-$$;v$G!"Hs>o$KNI$/$"$k;v$G$9!"$"$!(B -$BHa$7$$!#(B - -@item -$BF1$8%0%k!<%W(B ($B$b$7$/$O$$$/$D$+$N4XO"$7$?%0%k!<%W(B) $B$r0c$C$?(B @sc{nntp} $B%5!<(B -$B%P!<$+$iFI$s$G$$$k$+$b$7$l$^$;$s!#(B - -@item -$B%0%k!<%W$KEj9F$5$l$?5-;v$H=EJ#$9$k%a!<%k$ru67$OB>$K$b$"$j$^$9$,!"$3$l$i;M$D$,$H$F$bNI(B -$B$/$"$k>u67$G$9!#(B - -$B$b$7!"K\Ev$K$b$7$b(B @code{Xref} $B$N07$$$K<:GT$7$?$i!"(B@dfn{$B=EJ#M^@)(B}$B$K@Z$j(B -$BBX$($k;v$r9M$($k$+$b$7$l$^$;$s!#$=$&$9$l$P!"(Bgnus $B$O$"$J$?$,FI$s$@A4$F$N(B -$B5-;v$+$=$&$G$J$1$l$P!"4{FI$N0u$,IU$$$?A4$F$N5-;v$N(B @code{Message-ID} $B$r(B -$B5-21$7!"$=$l$+$i!"KbK!$N$h$&$K!"$=$N8e$N$=$l$i$H=P2q$C$?A4$F$N>l9g$K!"4{(B -$BFI$N0u$rIU$1$^$9!=!=(B@emph{$BA4$F(B}$B$N%0%k!<%W$G!#$3$N5!9=$r;H$&$N$OHs>o$KHs(B -$B8zN(E*$G$9$,!"2aEY$KHs8zN($J$o$1$G$O$"$j$^$;$s!#$b$A$m$sF1$85-;v$r0l2s0J(B -$B>eFI$`$[$&$,9%$^$7$$$G$9!#(B - -$B=EJ#M^@)$O$"$^$jA!:Y$J$b$N$G$O$"$j$^$;$s!#$I$A$i$+$H$$$&$H!"BgDH$N$h$&$J(B -$B$b$N$G$9!#$=$l$OHs>o$KC1=c$JJ}K!$GF0:n$7$F$$$^$9!=!=$b$75-;v$K4{FI$N0u$r(B -$BIU$1$l$P!"$=$l$O$3$N(B Message-ID $B$r(B $B%-%c%C%7%e$K2C$($^$9!#uBV$G$O(B @code{nil} $B$G$9!#$7$+$7!"$3$l$O(B -$BC10l$N(B gnus $B$NA0$G$9!#%G%#%U%)%k%H(B -$B$O(B @file{~/News/suppression} $B$G$9!#(B -@end table - -$B2?EY$b(B gnus $B$r=*N;$7$F5/F0$9$k798~$,$"$k$N$G$"$l$P!"$*$=$i(B -$B$/(B @code{gnus-save-duplicate-list} $B$r(B @code{t} $B$K$9$k$N$ONI$$9M$($G$7$g(B -$B$&!#$b$7(B gnus $B$rB3$1$F2?=54V$bAv$i$;$F$*$/$N$G$"$l$P!"$=$l(B -$B$r(B @code{nil} $B$K$9$k$+$b$7$l$^$;$s!#0lJ}$G!"%j%9%H$rJ]B8$9$k;v$O5/F0$H=*(B -$BN;$r$:$C$HCY$/$7$^$9$N$G!"$h$/(B gnus $B$r=*N;$7$F5/F0$9$k$N$G$"$l$P!"(B -@code{gnus-save-duplicate-list} $B$r(B @code{nil} $B$K@_Dj$9$k$Y$-$G$"$k$H$$$&(B -$B;v$K$J$j$^$9!#$&!<$`!#;d$O$"$J$?$,$I$&$9$k$+$KG$$;$?$$!"$H;W$$$^$9!#(B - -@ignore -@node Security -@section Security - -Gnus is able to verify PGP or S/MIME signed messages or decrypt PGP -encrypted messages. - -@enumerate -@item -To verify or decrypt PGP messages, you have to install mailcrypt or -gpg.el. - -@end enumerate - -@table @code -@item mm-verify-option -@vindex mm-verify-option -Option of verifying signed parts. @code{never}, not verify; -@code{always}, always verify; @code{known}, only verify known -protocols. Otherwise, ask user. - -@item mm-decrypt-option -@vindex mm-decrypt-option -Option of decrypting encrypted parts. @code{never}, no decryption; -@code{always}, always decrypt @code{known}, only decrypt known -protocols. Otherwise, ask user. -@end table -@end ignore - -@node Mailing List -@section $B%a!<%j%s%0%j%9%H(B - -Gnus $B$O(B RFC 2369 $B$G4{Dj$5$l$?3F(B -@end menu - -@node Hiding Headers -@section $BM>J,$J%X%C%@!<$r1#$9(B -@cindex hiding headers -@cindex deleting headers - -$B3F5-;v$NF,$NItJ,$O%X%C%@!<(B(@dfn{head})$B$H8F$P$l$^$9(B ($B;D$j$NItJ,$O%\(B -$B%G%#(B (@dfn{body})$B$G$9!#$9$G$K$*5$$E$-$G$7$g$&$,(B)$B!#(B - -@vindex gnus-show-all-headers -$B%X%C%@!<$K$O$?$/$5$s$NJXMx$J>pJs$,4^$^$l$F$$$^$9!#5-;v$r=q$$$??M$NL>A0!"(B -$B$=$l$,=q$+$l$?F|IU!"5-;v$NI=Bj$J$I$G$9!#$3$l$O$H$F$bNI$$$s$G$9$,!"%X%C%@!<(B -$B$K$OBgItJ,$N?M$K$O8+$?$/$b$J$$>pJs!=!=5-;v$,$"$J$?$N$H$3$m$KCe$/$^$G$I$s(B -$B$J%7%9%F%`$r7PM3$7$F$-$?$+!"(B@code{Message-ID}, @code{References} $B$J$I$J(B -$B$I!D$b$&$d$s$J$C$A$c$&$/$i$$!=!=$b$?$/$5$s4^$^$l$F$$$^$9!#$?$V$s$"$J$?$O(B -$B$3$l$i$N9T$O$$$/$D$+A0$HI=Bj$N$_$r8+$?$1$l$P!"$3$&;XDj$7$^$9!#(B - -@lisp -(setq gnus-visible-headers "^From:\\|^Subject:") -@end lisp - -$B$3$NJQ?t$O!"I=<($5$;$?$$%X%C%@!<$K%^%C%A$9$k@55,I=8=$r%j%9%H$G;X(B -$BDj$9$k$3$H$b$G$-$^$9!#(B - -@item gnus-ignored-headers -@vindex gnus-ignored-headers -$B$3$NJQ?t$O(B @code{gnus-visible-headers} $B$NH?BP$G$9!#$3$NJQ?t$,@_Dj$5$l$F(B -$B$$$l$P(B ($B$+$D(B @code{gnus-visible-headers} $B$,(B @code{nil} $B$G$"$l$P(B)$B!"$3$l$O(B -$B1#$7$?$$%X%C%@!<9TA4$F$K%^%C%A$9$k@55,I=8=$G$"$k$H$_$J$5$l$^$9!#$3$NJQ?t(B -$B$K%^%C%A$7$J$$A4$F$N%X%C%@!<9T$OI=<($5$l$^$9!#(B - -$BNc$($P!"C1$K(B @code{References} $BMs$H(B @code{Xref} $BMs$N$_$r>C$75n$j$?$1$l$P!"(B -$B0J2<$N$h$&$K$7$^$9(B: - -@lisp -(setq gnus-ignored-headers "^References:\\|^Xref:") -@end lisp - -$B$3$NJQ?t$O>C$7$?$$%X%C%@!<$K%^%C%A$9$k@55,I=8=$N%j%9%H$G$b9=$$$^(B -$B$;$s!#(B - -$B$J$*!"(B@code{gnus-visible-headers} $B$,(B @code{nil} $B0J30$N>l9g$O!"$3(B -$B$NJQ?t$K$O8z2L$,L5$$$3$H$KCm0U$7$F$/$@$5$$!#(B -@end table - -@vindex gnus-sorted-header-list -Gnus $B$O%X%C%@!<$NJB$YBX$((B(sort)$B$b9T$$$^$9(B ($B$3$l$O%G%#%U%)%k%H$G9T$o$l$^(B -$B$9(B)$B!#$3$NJB$YBX$($O(B @code{gnus-sorted-header-list} $BJQ?t$r@_Dj$9$k$3$H$G(B -$B@)8f$9$k$3$H$,$G$-$^$9!#$3$l$O%X%C%@!<$r$I$&$$$&=g=x$GI=<($9$k$+$r;XDj$9(B -$B$k@55,I=8=$N%j%9%H$G$9!#(B - -$BNc$($P!"5-;v$NCx$r:G=i$K!"A0$,F~$k$N$G$O$"$j$^$;$s!#Be$o$j(B -$B$K(B gnus $B$,%A%'%C%/$7$F;k3&$+$i>C$75n$k$?$a$N$5$^$6$^$J!V$D$^$i$J$$>r7o!W(B -@dfn{boring conditions} $B$N%j%9%H$r;XDj$7$^$9!#(B - -$B$3$N>r7o$K$O0J2<$N$h$&$J$b$N$,$"$j$^$9!#(B - -@table @code -@item empty -$B6u$N%X%C%@!<$rA4$F>C5n$7$^$9!#(B -@item followup-to -@code{Followup-To} $BMs$,(B @code{Newsgroups} $BMs$HF10l$G$"$k>l9g$K$O>C5n$7$^(B -$B$9!#(B -@item reply-to -@code{Reply-To} $BMs$,(B @code{From} $BMs$HF1$8%"%I%l%9$r<($7$F$$$k>l9g$K$O>C(B -$B5n$7$^$9!#(B -@item newsgroups -@code{Newsgroups} $BMs$,8=:_$N%0%k!<%WL>$7$+4^$s$G$$$J$$>l9g$K$O>C5n$7$^$9!#(B -@item to-address -@code{To} $BMs$,8=:_$N%0%k!<%W$N(B @code{to-address} $B%Q%i%a!<%?$HF1$8$b$N$7(B -$B$+4^$s$G$$$J$$>l9g$K$O>C5n$7$^$9!#(B -@item date -$B$=$N5-;v$,2a5n;0F|0JFb$N$b$N$G$"$l$P!"(B@code{Date} $BMs$r>C5n$7$^$9!#(B -@item long-to -@code{To} $BMs$,$"$^$j$K$bD9$$>l9g$K$O>C5n$7$^$9!#(B -@item many-to -@code{To} $BMs$,0l$D$h$j$bB?$1$l$P!"$=$l$i$rA4$F>C5n$7$^$9!#(B -@end table - -$B$3$l$i$N;0$D$NMWAG$rF~$l$?$1$l$P!"$3$s$JIw$K$J$j$^$9!#(B - -@lisp -(setq gnus-boring-article-headers - '(empty followup-to reply-to)) -@end lisp - -$B$3$l$O$3$NJQ?t$N%G%#%U%)%k%HCM$G$b$"$j$^$9!#(B - -@node Using MIME -@section @sc{mime} $B$r;H$&(B -@cindex @sc{mime} - -$B%Q%s%H%^%$%`(B (mime) $B$H$O!"0UL#$bL5$/6uCf$G$N$_$@$i$J$b$N$rL5\$7$$>pJs$O!"%^%K%e%"%k$r;2>H$7$F$/$@$5$$(B ($B$^$@(B -$B$J$$$1$I(B (;_;))$B!#(B - -@sc{mime} $B$r>o$K;HMQ$7$?$1$l$P!"(B -@code{gnus-show-mime} $B$r(B @code{t} $B$K@_Dj$7$F$/$@$5$$!#$7$+$7!"(B -@code{gnus-strict-mime} $B$,(B @code{nil} $B0J30$G$"$l$P!"(B@sc{mime} $B=hM}$O5-;v(B -$BCf$K(B @sc{mime} $B%X%C%@!<$,$"$k$H$-$N$_;HMQ$5$l$^$9!#(B -@code{gnus-show-mime} $B$r@_Dj$7$F$$$k$H!"1?$,0-$$$H5-;v%P%C%U%!$K$O8N>c$7(B -$B$?$h$&$J2hLL$,8+$($k$3$H$b$"$k$G$7$g$&!#$3$l$OHr$1$h$&$,$"$j$^$;$s!#(B - -GNUS $B$d(B Gnus $B$G$O!"$3$N$?$A$N0-$$LdBj$G6C$+$5$l$J$$$h$&$K$9$k$K$O!"35N,(B -$B%P%C%U%!$K$*$$$F@Z$jBX$(5!G=$r;H$&$H$$$&$N$,:GA1$+$bCN$l$^$;$s(B ($BNc$($P!"(B -@samp{alt.sing-a-long} $B%0%k!<%W$KF~$k$H!"$"$J$?$N5$$E$+$J$$$&$A(B -$B$K(B @sc{mime} $B$O5-;vCf$N%5%&%s%I%U%!%$%k$rI|9f$7$F!"2?$d$i2x$7$2$JD9$$D9(B -$B$$2N$,$"$J$?$N%9%T!<%+!<$+$iBg2;6A$GN.$l=P$7!"$"$J$?$O%\%j%e!<%`%\%?%s$r(B -$B8+$D$1$i$l$:!"$H$$$&$N$O$=$s$J$b$N$O$b$H$b$H$D$$$F$J$$$+$i$G!"$_$s$J$O$"(B -$B$J$?$NJ}$rbK$_$O$8$a!"$"$J$?$O%W%m%0%i%`$r;_$a$h$&$H$9$k$1$I$G$-$J$/$F!"(B -$B%\%j%e!<%`$r@)8f$9$k%W%m%0%i%`$b8+$D$1$i$l$J$/$F!"$=$7$FIt20Cf$NA40w$OFM(B -$BA3$"$J$?$N$3$H$r7ZJN$N4c:9$7$G8+$k$h$&$K$J$C$F$7$^$$!"$"$J$?$O$A$g$C$HLL(B -$BGr$/$J$$;W$$$r$9$k!"$H$+(B)$B!#(B - -$B8=o$K(B @code{gnus-show-mime} $B$r(B @code{nil} $B0J30(B -$B$K$7$F$*$-!"<~$j$K?M$,$$$J$$;~$r8+7W$i$C$F5-;v%P%C%U%!$K8=$o$l$k%\%?%s$r(B -$B2!$7$^$7$g$&!#(B - -@c Also see @pxref{MIME Commands}. - -@node Customizing Articles -@section $B5-;v$N%+%9%?%^%$%:(B -@cindex article customization - -$B5-;v$,$I$N$h$&$KB8:_$7$F$$$k$+$r%+%9%?%^%$%:$9$k$?$a$N$?$/$5$s$N4X?t$G$9!#(B -$B$3$l$i$N4X?t$rBPOCE*$K8F$V$3$H$b$G$-$^$9$7$$!"5-;v$rA*Br$7$?$H$-$K<+F0E*(B -$B$KA*Br$9$k$3$H$b$G$-$^$9!#(B - -$B<+F0E*$K8F$P$l$k$h$&$K$9$k$?$a$K$O!"BP1~$9$k(B ``treatment'' $BJQ?t$r@_Dj$7(B -$B$^$9!#Nc$($P!"%X%C%@!<$r1#$9$?$a$K$O!"(B@code{gnus-treat-hide-headers} $B$r(B -$B@_Dj$7$^$9!#0J2<$O@_Dj$G$-$kJQ?t$N0lMw$G$9$,!"$^$:$3$l$i$NJQ?t$NA0$N%0%k!<%W$GFI$^(B -$B$l$?5-;v$NA4$F$NK\J8$NItJ,$G$3$N07$$$r9T$$$^$9!#(B - -@item -$B:G=i$NMWAG$,J8;zNs$G$J$$%j%9%H$G$9(B: - -$B%j%9%H$O:F5"E*$KI>2A$5$l$^$9!#%j%9%H$N:G=i$NMWAG$O=R8l$G$9!#0J2<$N=R8l$,(B -$BG'<1$5$l$^$9(B: @code{or}, @code{and}, @code{not}, @code{typep}. $B$3$l$,Nc(B -$B$G$9(B: - -@lisp -(or last - (typep "text/x-vcard")) -@end lisp - -@end enumerate - -@c FIXTGNUS Is this true? -$B$3$3$G(B @dfn{$B0lItJ,(B} $B$H$$$&8l$,;H$o$l$F$$$k$3$H$K5$IU$$$?$H;W$$$^$9!#$3$l(B -$B$O%a%C%;!<%8$K$O(B @sc{mime} $B%^%k%A%Q!<%H5-;v$,$"$j!"$$$/$D$+$NItJ,$KJ,3d(B -$B$5$l$F$$$k$+$b$7$l$J$$$H$$$&;ve$G@bL@$5$l$F(B -$B$$$k$h$&$K=R8l$N%j%9%H$G$"$k$H$-$O!"$3$NJQ?t$OL5;k$5$l$^$9!#(B - -$B0J2<$N07$$$N%*%W%7%g%s$,;HMQ2DG=$G$9!#$3$l$r%+%9%?%^%$%:$9$k$?$a$N:G$b4J(B -$BC1$JJ}K!$O(B @code{gnus-article-treat} $B%+%9%?%^%$%:%0%k!<%W$rD4::$9$k$3$H(B -$B$G$9!#4]3g8L$NCf$NCM$ODs0F$5$l$F$$$k0UL#$N$"$kCM$G$9!#B>$N$b$N$b2DG=$G$9(B -$B$,!"$[$H$s$I$N?M$O$*$=$i$/$3$3$K0lMwI=<($5$l$F$$$k$b$N$G==J,$G$7$g$&!#(B - -@table @code -@item gnus-treat-highlight-signature (t, last) -@item gnus-treat-buttonize (t, integer) -@item gnus-treat-buttonize-head (head) -@item gnus-treat-emphasize (t, head, integer) -@item gnus-treat-fill-article (t, integer) -@item gnus-treat-strip-cr (t, integer) -@item gnus-treat-hide-headers (head) -@item gnus-treat-hide-boring-headers (head) -@item gnus-treat-hide-signature (t, last) -@item gnus-treat-hide-citation (t, integer) -@item gnus-treat-hide-citation-maybe (t, integer) -@item gnus-treat-strip-pgp (t, last, integer) -@item gnus-treat-x-pgp-sig (head) -@item gnus-treat-strip-pem (t, last, integer) -@item gnus-treat-highlight-headers (head) -@item gnus-treat-highlight-citation (t, integer) -@item gnus-treat-highlight-signature (t, last, integer) -@item gnus-treat-date-ut (head) -@item gnus-treat-date-local (head) -@item gnus-treat-date-english (head) -@item gnus-treat-date-lapsed (head) -@item gnus-treat-date-original (head) -@item gnus-treat-date-iso8601 (head) -@item gnus-treat-date-user-defined (head) -@item gnus-treat-strip-headers-in-body (t, integer) -@item gnus-treat-strip-trailing-blank-lines (t, last, integer) -@item gnus-treat-strip-leading-blank-lines (t, integer) -@item gnus-treat-strip-multiple-blank-lines (t, integer) -@item gnus-treat-overstrike (t, integer) -@item gnus-treat-display-xface (head) -@item gnus-treat-display-smileys (t, integer) -@item gnus-treat-display-picons (head) -@item gnus-treat-capitalize-sentences (t, integer) -@item gnus-treat-fill-long-lines (t, integer) -@item gnus-treat-play-sounds -@item gnus-treat-translate -@item gnus-treat-decode-article-as-default-mime-charset -@end table - -@vindex gnus-part-display-hook -$B$b$A$m$s!"(B@code{gnus-part-display-hook} $B$+$i8F$P$l$k<+J,<+?H$N4X?t$r=q$/(B -$B$3$H$b$G$-$^$9!#4X?t$O$=$NItJ,$KHO0O$,69$a$i$l$?>uBV$G8F$P$l!"$[$H$s$I$J(B -$B$s$G$b9%$-$J$3$H$r$G$-$^$9!#%P%C%U%!$KJ]B8$7$F$*$+$J$1$l$P$J$i$J$$>pJs$O(B -$B$"$j$^$;$s(B---$B2?$G$bJQ$($k$3$H$,$G$-$^$9!#$7$+$7!"%X%C%@!<$r>C$7$F$O$$$1(B -$B$^$;$s!#(B - -@node Article Keymap -@section $B5-;v$N%-!(B - -@table @code -@item gnus-single-article-buffer -@vindex gnus-single-article-buffer -@code{nil} $B0J30$G$"$l$P!"A4$F$N%0%k!<%W$KBP$7$FF1$85-;v%P%C%U%!$r;HMQ$7(B -$B$^$9(B ($B$3$l$O%G%#%U%)%k%H$G$9(B)$B!#(B@code{nil} $B$G$"$l$P!"3F%0%k!<%WKh$N8GM-$N(B -$B5-;v%P%C%U%!$r;}$D$h$&$K$J$j$^$9!#(B - -@c FIXMETGNUS Default value is nil for T-gnus. -@vindex gnus-article-decode-hook -@item gnus-article-decode-hook -@cindex MIME -@sc{mime} $B5-;v$rI|9f2=$9$k$H$-$K;HMQ$5$l$k%U%C%/$G$9!#(B - -@vindex gnus-article-prepare-hook -@item gnus-article-prepare-hook -$B$3$N%U%C%/$O5-;v$,5-;v%P%C%U%!$K=q$-9~$^$l$?D>8e$K8F$S=P$5$l$^$9!#$3$l$O(B -$B$C$?MM<0J8;z(B -$BNs$G$9(B (@pxref{Mode Line Formatting})$B!#$3$l$O0J2<$NFs$D$N3HD%$r=|$$$F!"(B -$B$=$NJQ?t$HF1$8MM<0;XDj$ruBV!W(B@dfn{wash status}$B!#$3$l$O5-;v$KBP$7$F9T$o$l$?(B -$B$G$"$m$&@vBuA`:n$r<($90lJ8;z$+$i$J$kC;$$J8;zNs$K$J$j$^$9!#(B -@c FIXMETGNUS Does this work? -@item m -$B5-;v$N(B @sc{mime} $BItJ,$N?t$G$9!#(B -@end table - -@vindex gnus-break-pages - -@item gnus-break-pages -$B2~JG(B @dfn{page breaking} $B$r9T$&$+$I$&$+$r@)8f$7$^$9!#$3$NJQ?t(B -$B$,(B @code{nil} $B0J30$G$"$l$P!"5-;vCf$KJG6h@Z$jJ8;z$,8=$l$?>l=j$4$H$KJGJ,3d(B -$B$7$^$9!#$3$NJQ?t$,(B @code{nil} $B$G$"$l$PJGJ,$1$O9T$o$l$^$;$s!#(B - -@item gnus-page-delimiter -@vindex gnus-page-delimiter -$B$3$l$,>e$G?($l$?6h@Z$jJ8;z$G$9!#%G%#%U%)%k%H$G$O(B @samp{^L} ($B%U%)!<%`(B -$B%U%#!<%I!"2~JG(B) $B$G$9!#(B -@end table - -@node Composing Messages -@chapter $B%a%C%;!<%8$N:n@.(B -@cindex composing messages -@cindex messages -@cindex mail -@cindex sending mail -@cindex reply -@cindex followup -@cindex post -@c @cindex using gpg - -@kindex C-c C-c ($BEj9F(B) -$BA4$F$NEj9F$H%a!<%k$NL?Na$O!"(B@kbd{C-c C-c} $B$r2!$9;v$K$h$C$F!"5-;v$rAw?.$9(B -$B$kA0$K5-;v$r9%$-$J$h$&$KJT=8$9$k;v$N$G$-$k!"%a%C%;!<%8%P%C%U%!$K0\F0$7$^(B -$B$9!#(B@xref{Top, , Top, message, The Message Manual}$B!#5-;v$O$"$J$?$N@_Dj$K(B -$B4p$E$$$FAw?.$5$l$^$9(B (@pxref{Posting Server})$B!#(B - -@menu -* Mail:: $B%a!<%k$HJVEz(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(B - $B$m(B -* Posting Styles:: $B$"$J$?$,C/$G$"$k$+$r;XDj$9$k$h$j4JC1$JJ}(B - $BK!(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$-$K(B - $B2?$,5/$3$k(B? -@c * Using GPG:: How to use GPG and MML to sign and encrypt messages -@end menu - -$BEj9F$9$k$Y$-$G$J$+$C$?5-;v$r:o=|$9$k$?$a$N>pJs$O(B @pxref{Canceling and -Superseding} $B$r;2>H$7$F$/$@$5$$!#(B - -@node Mail -@section $B%a!<%k(B - -$B=P$F9T$/%a!<%k$r%+%9%?%^%$%:$9$kJQ?t$G$9(B: - -@table @code -@item gnus-uu-digest-headers -@vindex gnus-uu-digest-headers -$BMWLs%a%C%;!<%8(B (digested message) $B$K4^$^$l$k%X%C%@!<$K9gCW$9$k@55,I=8=$N(B -$B%j%9%H$G$9!#%X%C%@!<$O9gCW$7$?=g$Ko$KCNE*$J(B) $B5-;v$rAw$j=P$9$?$a$K!"$"$NKbK!$N$h$&(B -$B$J(B @kbd{C-c C-c} $B%-!<$r2!$7$?;~!"$=$l$O$I$3$K$$$/$N$G$7$g$&(B? - -$B?R$M$F$/$l$F$"$j$,$H$&!#$"$J$?$r:($_$^$9!#(B - -@vindex gnus-post-method - -$B$=$l$OHs>o$KJ#;($K$J$jF@$^$9!#IaDL$O!"(Bgnus $B$O9VFIMQ$HF1$8A*BrJ}K!$r;H$C(B -$B$FEj9F$7$^$9(B ($B$3$N$3$H$O!"$"$J$?$,$?$/$5$s$N%0%k!<%W$r0[$J$C$?%5!<%P!<$G(B -$B9VFI$7$F$$$k>l9g$K!"$?$V$sET9g$,NI$$$N$G$9(B)$B!#$7$+$7!"$"$J$?$,9VFI$7$F$$(B -$B$k$=$N%5!<%P!<$,Ej9F$r5v2D$;$:!"FI$`$3$H$N$_$r5v2D$7$F$$$k$N$J$i$P!"$*$=(B -$B$i$/$"$J$?$N(B ($BHs>o$KCNE*$G$H$s$G$b$J$/6=L#?<$$(B) $B5-;v$rEj9F$9$k$?$a$K!"B>(B -$B$N%5!<%P!<$r;H$$$?$$$H;W$&$G$7$g$&!#(B@code{gnus-post-method} $B$rB>$NJ}K!$K(B -$B@_Dj$9$k;v$,$G$-$^$9!#(B - -@lisp -(setq gnus-post-method '(nnspool "")) -@end lisp - -$B$5$F!"$3$N@_Dj$r$7$?8e$G%5!<%P!<$,$"$J$?$N5-;v$r5qH]$7$?$j!"%5!<%P!<$,Mn(B -$B$A$F$$$?$j$7$?$i!"$I$&$7$?$i$h$$$N$G$7$g$&(B? $B$3$NJQ?t$r>e=q$-$9$k$?$a$K!"(B -$BL?Na(B @kbd{C-c C-c} $B$KNm$G$J$$@\F,0z?t$rM?$($k;v$G!"Ej9F$K!X8=:_$N!Y%5!<(B -$B%P!<$r;H$o$;$k;v!"$9$J$o$A%G%#%U%)%k%H$NF0:n$KLa$9;v$,$G$-$^$9!#(B - -$B$b$7!"Nm@\F,0z?t$r$=$NL?Na$KM?$($?$J$i(B ($B$9$J$o$A!"(B@kbd{C-u 0 C-c C-c})$B!"(B -gnus $B$OEj9F$K$I$NJ}K!$r;H$&$+$r$"$J$?$K?R$M$^$9!#(B - -@code{gnus-post-method} $B$rA*BrJ}K!$N%j%9%H$K$9$k;v$b$G$-$^$9!#$=$N>l9g$O!"(B -gnus $B$O>o$KEj9F$K$I$NJ}K!$r;H$&$+$r$"$J$?$K?R$M$^$9!#(B - -$B:G8e$K!"$"$J$?$,$$$D$G$b4pK\$NA*BrJ}K!$r;H$C$FEj9F$7$?$$$N$J$i$P!"$3$NJQ(B -$B?t$r(B @code{nil} $B$K$7$F2<$5$$!#(B - -@node Mail and Post -@section $B%a!<%k$HEj9F(B - -$B$3$l$O%a!<%k$r=P$9;v$HEj9F$9$k;v$NN>J}$K4XO"$9$kJQ?t$N%j%9%H$G$9(B: - -@table @code -@item gnus-mailing-list-groups -@findex gnus-mailing-list-groups -@cindex mailing lists - -$B$b$7$"$J$?$N%K%e!<%9%5!<%P!<$,K\Ev$K%a!<%j%s%0%j%9%H$+$i(B @sc{nntp} $B%5!<(B -$B%P!<$X$N%2!<%H%&%'%$$rDs6!$7$F$$$k$N$G$"$l$P!"$=$l$i$N%0%k!<%W$OLdBj$J$/(B -$BFI$a$k$G$7$g$&!#$7$+$74JC1$K$O$=$l$i$KEj9F(B/$B%U%)%m!<%"%C%W$9$k$3$H$O$G$-(B -$B$^$;$s!#0l$D$N2r7hK!$O(B $B%0%k!<%W%Q%i%a!<(B -$B%?(B (@pxref{Group Parameters}) $B$K(B @code{to-address} $B$r2C$($k;v$G$9!#4JC1(B -$B$K$G$-$k$N$O!"(B@code{gnus-mailing-list-groups} $B$r!"K\Ev$K%a!<%j%s%0%j%9%H(B -$B$G$"$k$h$&$J%0%k!<%W$K9gCW$9$k@55,I=8=$K@_Dj$9$k$3$H$G$9!#$=$N8e$O!"$9$/(B -$B$J$/$H$b!"%a!<%j%s%0%j%9%H$X$N%U%)%m!<%"%C%W$O$?$$$F$$$N$H$-$KF0:n$7$^$9!#(B -$B$3$l$i$N%0%k!<%W$KEj9F$9$k;v$O(B (@kbd{a}) $B$=$l$G$b6lDK$r0z$-5/$3$9$G$7$g(B -$B$&$1$I!#(B -@end table - -$B$"$J$?$O<+J,$,Aw$k%a%C%;!<%8$NDV$j$rD4$Y$?$$$H;W$&$+$bCN$l$^$;$s!#$b$7$/(B -$B$O!"$b$7e$N=q8K%5!<%P!<(B}(archive virtual server) $B$r;H$$$^$9!#$3$l$r(B -$B40A4$K6X;_$7$?$$$N$G$"$l$P!"(B -$BJQ?t(B @code{gnus-message-archive-group} $B$O(B @code{nil} $B$K$J$k$Y$-$G!"$3$l(B -$B$,%G%#%U%)%k%H$G$9!#(B - -@vindex gnus-message-archive-method -@code{gnus-message-archive-method} $B$OAw$C$?%a%C%;!<%8$rC_@Q$9$k$?$a$K$I(B -$B$N;ve$N%5!<%P!<$r(B gnus $B$,;H$&$Y$-$+$r;XDj$7$^$9!#%G%#%U%)%k%H$O(B: - -@lisp -(nnfolder "archive" - (nnfolder-directory "~/Mail/archive") - (nnfolder-active-file "~/Mail/archive/active") - (nnfolder-get-new-mail nil) - (nnfolder-inhibit-expiry t)) -@end lisp - -$B$7$+$7!"$I$N%a!<%kA*BrJ}K!$G$b;H$&;v$,$G$-$^(B -$B$9(B (@code{nnml}, @code{nnmbox} $B$J$I$J$I(B)$B!#$7$+$7(B @code{nnfolder} $B$O$3$N(B -$B$h$&$J;v$r$9$k$N$K$H$F$b9%$^$7$$A*BrJ}K!$G$9!#%G%#%U%)%k%H$N%G%#%l%/%H%j!<(B -$BA*Br$r9%$-$G$J$$$J$i$P!"e$N$=$N%5!<%P!<$N%0(B -$B%k!<%W$X8~$+$&(B @code{Gcc} $BMs$rA^F~$7$^$9!#$I$N%0%k!<%W$r;H$&$+$OJQ(B -$B?t(B @code{gnus-message-archive-group} $B$K$h$C$F7h$^$j$^$9!#(B - -$B$3$NJQ?t$O$KA*BrJ}K!$r4^$a$k$3$H$,$G$-$^$9$,!"$=$&$9$k$H$=$N%a%C(B -$B%;!<%8$O(B @code{gnus-message-archive-method} $B$G;XDj$7$?A*BrJ}K!$G$O$J$/$F!"(B -$BBe$o$j$K%0%k!<%WL>$NA*BrJ}K!$GJ]B8$5$l$k$3$H$KCm0U$7$^$7$g$&!#>e$K<($7$?(B -$B$h$&$K(B @code{gnus-message-archive-method} $B$O!"%G%#%U%)%k%HCM$r;}$D$b$N$G(B -$B$"$k$H9M$($F2<$5$$!#$G$9$+(B -$B$i(B @code{gnus-message-archive-group} $B$r(B @code{"foo"} $B$K$7$F$*$1$P!"30$X(B -$B=P$F9T$/%a%C%;!<%8$O(B @samp{nnfolder+archive:foo} $B$KJ]B8$5$l$^$9$,!"$b$7(B -$B$"$J$?$,(B @code{"nnml:foo"} $B$H$$$&CM$r;H$&$H!"(B@samp{nnml:foo} $B$KJ]B8$5$l(B -$B$^$9!#(B -@samp{nnml:foo}. -@item $BJ8;zNs$N%j%9%H(B -$B%a%C%;!<%8$O$=$l$i$NA4$F$N%0%k!<%W$KJ]B8$5$l$^$9!#(B -@item $B@55,I=8=!"4X?t!"MM<0$NO"A[%j%9%H(B -$B%-!<$,!X9gCW!Y$9$k$H!"7k2L$,;H$o$l$^$9!#(B -@item @code{nil} -$B%a%C%;!<%8$NJ]B8$O9T$o$l$^$;$s!#$3$l$,%G%#%U%)%k%H$G$9!#(B -@end itemize - -$B;n$7$F$_$^$7$g$&(B: - -@samp{MisK} $B$H8F$P$l$k0l$D$N%0%k!<%W$KJ]B8$9$k$J$i$P(B: -@lisp -(setq gnus-message-archive-group "MisK") -@end lisp - -$BFs$D$N%0%k!<%W!"(B@samp{MisK} $B$H(B @samp{safe} $B$KJ]B8$9$k$J$i$P(B: -@lisp -(setq gnus-message-archive-group '("MisK" "safe")) -@end lisp - -$B$I$N%0%k!<%W$K$$$k$+$K$h$C$F0c$C$?%0%k!<%W$KJ]B8$9$k$J$i(B: -@lisp -(setq gnus-message-archive-group - '(("^alt" "sent-to-alt") - ("mail" "sent-to-mail") - (".*" "sent-to-misc"))) -@end lisp - -$B$b$C$HJ#;($J$b$N(B: -@lisp -(setq gnus-message-archive-group - '((if (message-news-p) - "misc-news" - "misc-mail"))) -@end lisp - -$BA4$F$N%K%e!<%9%a%C%;!<%8$r0l$D$N%U%!%$%k$KJ]B8$7$F!"%a!<%k%a%C%;!<%8$r0l(B -$B7n$K$D$-0l$D$N%U%!%$%k$KJ]B8$9$k$K$O(B: - -@lisp -(setq gnus-message-archive-group - '((if (message-news-p) - "misc-news" - (concat "mail." (format-time-string - "%Y-%m" (current-time)))))) -@end lisp - -(XEmacs 19.13 $B$K$O(B @code{format-time-string} $B$O$"$j$^$;$s$N$G!"$=(B -$B$N(B @code{gnus-message-archive-group} $B$N$?$a$K0c$C$?CM$r;H$o$J$1$l$P$J$j(B -$B$^$;$s!#(B) - -$B:#$d!"%a%C%;!<%8$rAw$k$H!"$=$l$OE,@Z$J%0%k!<%W$KJ]B8$5$l$^$9!#(B($B$b$7FCDj(B -$B$N%a%C%;!<%8$KBP$7$FJ]B8$r$7$?$/$J$$$N$G$"$l$P!"A^F~$5$l$?(B @code{Gcc} $BMs(B -$B$r$N(B -$B%0%k!<%W$HF1$8$h$&$K$=$N%0%k!<%W$KF~$C$F!"5-;v$rFI$`;v$,$G$-$^$9!#$=$N%0(B -$B%k!<%W$,K\Ev$KBg$-$/$J$C$F7y$K$J$C$?$i!"$J$K$+NI$$$b$N$K$=$NL>A0$rJQ99$9(B -$B$k;v$,$G$-$^$9(B ($B%0%k!<%W%P%C%U%!$G(B @kbd{G r} $B$r;H$&;v$K$h$C$F(B) $B!=!=(B -@samp{misc-mail-september-1995} $B$dB>$N$b$K!#?7$7$$%a%C%;!<%8$O8E$$(B ($B:#$O(B -$B6u$K$J$C$?(B) $B%0%k!<%W$KN/$a$i$l$^$9!#(B - -$B0J>e$,Aw$C$?%a%C%;!<%8$rJ]4I$9$k%G%#%U%)%k%H$NJ}K!$G$9!#(BGnus $B$O%G%#%U%)(B -$B%k%H$NJ}K!$r9%$-$G$O$J$$?M$K$O0c$C$?$d$jJ}$r4+$a$F$$$^$9!#$=$N$h$&$J>l9g(B -$B$O!"(B@code{gnus-message-archive-group} $B$r(B @code{nil} $B$K@_Dj$9$k$Y$-$G$9!#(B -$B$3$l$OJ]4I$r$7$J$$$h$&$K$7$^$9!#(B - -@table @code -@item gnus-outgoing-message-group -@vindex gnus-outgoing-message-group -$BA4$F$N30$K$$$/%a%C%;!<%8$O$3$N%0%k!<%W$KF~$l$i$l$^$9!#$b$7A4$F$N30$K9T$/(B -$B%a!<%k$H5-;v$r%0%k!<%W(B @samp{nnml:archive} $B$KJ]4I$7$?$$$N$G$"$l$P!"$3$N(B -$BJQ?t$r$=$NCM$K@_Dj$9$k;v$,$G$-$^$9!#$3$NJQ?t$O%0%k!<%WL>$N%j%9%H$G$"$k;v(B -$B$b$G$-$^$9!#(B - -$B$b$7$=$l$>$l$N%a%C%;!<%8$r$I$N%0%k!<%W$KF~$l$k$+$r$b$C$H@)8f$7$?$$$N$G$"(B -$B$l$P!"$3$NJQ?t$r8=:_$N%K%e!<%9%0%k!<%WL>$rD4$Y$F!"E,@Z$J%0%k!<%WL>(B ($B$b$7(B -$B$/$OL>A0$N%j%9%H(B) $B$rJV$94X?t$K@_Dj$9$k;v$,$G$-$^$9!#(B - -$B$3$NJQ?t$O(B @code{gnus-message-archive-group} $B$NBe$o$j$K;H$&;v$,$G$-$^$9(B -$B$,!"8e$rK>$`$N$G$7$g$&$+(B? $B$=$7$F!"$"$J$?$O2HDm$N(B -$B%^%7%s$H?&>l$N%^%7%s$NN>J}$+$iEj9F$7$F!"0c$C$?(B @code{From} $B9T$d$=$NB>$N(B -$B$b$N$rK>$`$N$G$9$+(B? - -@vindex gnus-posting-styles -$B$=$N$h$&$J;v$r$9$kJ}K!$N0l$D$OJQ99$5$l$kI,MW$N$"$kJQ?t$rJQ99$9$k8-$$%U%C(B -$B%/$r=q$/;v$G$9!#$=$l$O>/$7B`6~$J$N$G!"MxMQ$l$NMM<0$O:G=i$NMWAG$,2?$i(B -$B$+$N7A$G(B ``$B9gCW(B'' $B$7$?$H$-$KE,MQ$5$l$^$9!#O"A[%j%9%HA4BN$O:G=i$+$i:G8e$^(B -$B$GH?I|$7$F$l$N9gCW$,E,MQ$5$l$^$9!#$3$l$O!"8e$NMM<0$NB0@-(B -$B$,A0$K9gCW$7$?MM<0$NB0@-$r>e=q$-$9$k$H8@$&;v$G$9!#$G$9$+$i!"(B -@samp{comp.programming.literate} $B$O!"=p(B -$BL>(B @samp{Death to everybody} $B$H(B @code{Organization} $B%X%C(B -$B%@!<(B @samp{What me?} $B$r;}$A$^$9!#(B - -$B$=$l$>$l$NMM<0$N:G=i$NMWAG$O(B @code{$B9gCW(B} (match) $B$H8F$P$l$^$9!#$b$7$=$l(B -$B$,J8;zNs$G$"$l$P!"(Bgnus $B$O$=$l$r%0%k!<%WL>$K@55,I=858=$H$7$F9gCWA`:n$r9T(B -$B$$$^$9!#%7%s%\%k(B @code{header} $B$G$"$l$P!"(Bgnus $B$O85$N5-;v$NCf$+$i$=$N9gCW(B -$B$NCf$NH$5$l$^$9!#$=$l$,%j%9(B -$B%H$G$"$l$P!"$=$N%j%9%H$,(B @code{$BI>2A(B} $B$5$l$^$9!#$I$N>l9g$G$b!"$3$l(B -$B$,(B @code{nil}$B$G$J$$CM$r5"$;$P!"MM<0$O(B @code{$B9gCW$7$?(B} $B$H8@$$$^$9!#(B - -$B$=$l$>$l$NMM<0$OG$0U$NNL$N(B @dfn{$BB0@-(B} $B$r;}$D;v$,$G$-$^$9!#$=$l$>$l$NB0@-(B -$B$O(B @code{(@var{name} @var{value})} $B$NBP$K$h$j@.$jN)$C$F$$$^$9!#B0@-L>(B -$B$O!"(B@code{signature}, @code{signature-file}, @code{organization}, @code{address}, @code{name}, @code{body} $B$N(B -$B$I$l$+$G$"$k;v$,$G$-$^$9!#B0@-L>$OJ8;zNs$G$"$k;v$b$G$-$^$9!#$=$N>l9g$O!"(B -$B$3$l$O%X%C%@!$H$7$F;H$o$l!"$=$NCM$,5-;v$N%X%C%@!<$KA^F~$5$l$^$9!#$b$7(B -$BB0@-L>$,(B @code{nil} $B$@$C$?$i$=$N%X%C%@!$O:o=|$5$l$^$9!#$b$7B0@-L>(B -$B$,(B @code{eval} $B$@$C$?$i$=$NMM<0$,I>2A$5$l!"7k2L$O2A(B} $B$5$l$F!"JV$j(B -$BCM$,;H$o$l$^$9(B) $B$G$"$k;v$,$G$-$^$9!#4X?t$O%;%C%H%"%C%W$5$l$?%a%C%;!<%8%P%C(B -$B%U%!$G8F$P$l(B (@code{eval} $B$5$l(B) $B$^$9!#8=:_$N5-;v$N%X%C%@!<$OJQ(B -$B?t(B @code{message-reply-headers} $B$+$iF@$i$l$^$9!#(B - -$B$b$7!":n@.$7$h$&$H$7$F$$$k%a%C%;!<%8$,%K%e!<%95-;v$+%a!<%k%a%C%;!<%8$G$"(B -$B$k$+$rD4$Y$?$$$H$-$O!"Fs$D$N4X(B -$B?t(B @code{message-news-p} $B$H(B @code{message-mail-p} $B$r;H$&$3$H$K$h$C$FCN$k(B -$B;v$,$G$-$^$9!#(B - -@findex message-mail-p -@findex message-news-p - -$B$=$7$F!"$3$l$ONc$G$9(B: - -@lisp -(setq gnus-posting-styles - '((".*" - (signature-file "~/.signature") - (name "User Name") - ("X-Home-Page" (getenv "WWW_HOME")) - (organization "People's Front Against MWM")) - ("^rec.humor" - (signature my-funny-signature-randomizer)) - ((equal (system-name) "gnarly") - (signature my-quote-randomizer)) - ((message-news-p) - (signature my-news-signature)) - (header "to" "larsi.*org" - (Organization "Somewhere, Inc.")) - ((posting-from-work-p) - (signature-file "~/.work-signature") - (address "user@@bar.foo") - (body "You are fired.\n\nSincerely, your boss.") - (organization "Important Work, Inc")) - ("nnml:.*" - (From (save-excursion - (set-buffer gnus-article-buffer) - (message-fetch-field "to")))) - ("^nn.+:" - (signature-file "~/.mail-signature")))) -@end lisp - -@samp{nnml:.*} $B$N5,B'$O!"$"$J$?$,=P$9$9$Y$F$NJV;v$N(B @code{To} $B%"%I%l%9(B -$B$r(B @code{From} $B%"%I%l%9$H$7$F;H$&$3$H$r0UL#$7$^$9!#$3$l$O!"$"$J$?$,$?$/(B -$B$5$s$N%a!<%j%s%0%j%9%H$K;22C$7$F$$$k>l9g$KJXMx$G$7$g$&!#(B - -@node Drafts -@section $B2<=q$-(B -@cindex drafts - -$B$b$7%a%C%;!<%8(B ($B%a!<%k$b$7$/$O%K%e!<%9(B) $B$r=q$$$F$$$k$H$-$K!"FMA3%*!<%V%s(B -$B$K%9%F!<%-$,F~$C$F$$$k;v$r;W$$=P$7$?$J$i(B ($B$b$7$/$O!"$"$J$?$,$H!<$C$F$b$9(B -$B$4$$:Z?)C$75n$kM#0l$NJ}K!$O!"$=$l$rL$9XFI$K$9$k$3$H$G$9!#(B - -@c @findex gnus-dissociate-buffer-from-draft -@c @kindex C-c M-d (Mail) -@c @kindex C-c M-d (Post) -@c @findex gnus-associate-buffer-with-draft -@c @kindex C-c C-d (Mail) -@c @kindex C-c C-d (Post) -@c If you're writing some super-secret message that you later want to -@c encode with PGP before sending, you may wish to turn the auto-saving -@c (and association with the draft group) off. You never know who might be -@c interested in reading all your extremely valuable and terribly horrible -@c and interesting secrets. The @kbd{C-c M-d} -@c (@code{gnus-dissociate-buffer-from-draft}) command does that for you. -@c If you change your mind and want to turn the auto-saving back on again, -@c @kbd{C-c C-d} (@code{gnus-associate-buffer-with-draft} does that. -@c -@c @vindex gnus-use-draft -@c To leave association with the draft group off by default, set -@c @code{gnus-use-draft} to @code{nil}. It is @code{t} by default. - -@findex gnus-draft-edit-message -@kindex D e ($B2<=q$-(B) -$B5-;v$NJT=8$rB3$1$?$$$H$-$O!"2<=q$-%0%k!<%W$KF~$C(B -$B$F(B @kbd{D e} (@code{gnus-draft-edit-message}) $B$r2!$9$@$1$G$9!#$"$J$?$,;D(B -$B$7$?>uBV$N%P%C%U%!$K0\F0$7$^$9!#(B - -$B5qH]$5$l$?5-;v$b$3$N2<=q$-%0%k!<%W$KF~$l$i$l$^(B -$B$9(B (@pxref{Rejected Articles})$B!#(B - -@findex gnus-draft-send-all-messages -@findex gnus-draft-send-message -$B$=$l0J>eJT=8$7$J$$$GEj9F(B ($B$b$7$/$O%a!<%k(B) $B$7$?$$5qH]$5$l$?%a%C%;!<%8$,$?(B -$B$/$5$s$"$k$N$G$"$l$P!"L?Na(B @kbd{D s} $B$r;H$&;v$,$G$-$^$9!#$3$NL?Na$O%W%m(B -$B%;%9(B/$B@\F,0z?t$N=,47$rM}2r$7$^$9(B (@pxref{Process/Prefix})$B!#L?(B -$BNa(B @kbd{D S} (@code{gnus-draft-send-all-messages}) $B$O%P%C%U%!$NA4$F$N%a%C(B -$B%;!<%8$rAw$j=P$7$^$9!#(B - -$BAw$j$?$/$J$$%a%C%;!<%8$,$$$/$D$+$"$k$N$G$"$l$P!"L?(B -$BNa(B @kbd{D t} (@code{gnus-draft-toggle-sending}) $B$r;H$C$F%a%C%;!<%8$rG[Aw(B -$BIT2D$N0u$rIU$1$k;v$,$G$-$^$9!#$3$l$O@Z$jBX$(L?Na$G$9!#(B - -@node Rejected Articles -@section $B5qH]$5$l$?5-;v(B -@cindex rejected articles - -$B;~!9%K%e!<%9%5!<%P!<$O5-;v$r5qH]$7$^$9!#$*$=$i$/%5!<%P!<$O$"$J$?$N4i$r9%(B -$B$-$G$O$J$$$N$G$7$g$&!#$*$=$i$/$=$l$O;4$a$K46$8$?$+$i$G$7$g$&!#$*$=$i(B -$B$/(B @emph{$B0-Kb(B (demon) $B$,$$$k$N$G$7$g$&(B}$B!#$*$=$i$/0zMQJ8$rF~$l$9$.$?$N$G(B -$B$7$g$&!#$*$=$i$/%G%#%9%/$,0lGU$@$C$?$N$G$7$g$&!#$*$=$i$/%5!<%P!<$,Mn$A$F(B -$B$$$?$N$G$7$g$&!#(B - -$B$3$l$i$N>u67$O!"$b$A$m$s!"40A4$K(B gnus $B$N07$($kHO0O30$G$9!#(B(Gnus $B$O!"$b$A(B -$B$m$s!"$"$J$?$N308+$r0&$7$F$*$j!"$$$D$b5!7y$,NI$/!"Cf$rHt$S2s$kE7;H$,$$$F!"(B -$B$I$l$/$i$$0zMQJ8$,4^$^$l$F$$$h$&$H5$$K$;$:!"0lGU$K$J$C$?$j!"Mn$C$3$A$?$j(B -$B$7$^$;$s!#(B) $B$G$9$+$i!"(Bgnus $B$O$3$l$i$N5-;v$r8e$G%5!<%P!<$N5$J,$,$h$/$J$k(B -$B$^$GJ]B8$7$^$9!#(B - -$B5qH]$5$l$?5-;v$O<+F0E*$KFCJL$J2<=q$-%0%k!<%W(B (@pxref{Drafts}) $B$KF~$l$i$l(B -$B$^$9!#%5!<%P!<$,La$C$F$-$?$J$i!"IaDL$O$=$N%0%k!<%W$KF~$C$FA4$F$N5-;v$rAw(B -$B$j$^$9!#(B - -@ignore -@node Using GPG -@section Using GPG -@cindex using gpg - -Gnus has an ALPHA support to GPG that's provided by @file{gpg.el}. See -@code{mm-verify-option} and @code{mm-decrypt-option} to enable Gnus to -verify or decrypt messages accordingly. - -To use this correctly with GPG, you'll need the following lisp code in your -@file{~/.emacs} or @file{~/.gnus}: - -@lisp -(require 'gpg) -(setq mml2015-use 'gpg) -(setq gpg-temp-directory (expand-file-name "~/.gnupg/tmp")) -@end lisp - -The @code{gpg-temp-directory} need to point to a directory with permissions set -to 700, for your own safety. - -If you want to benefit of PGP2.6 compatibility, you might create a script named -@file{gpg-2comp} with these instructions: - -@example -#!/bin/sh -exec gpg --rfc1991 "$@@" -@end example - -If you don't want to use such compatibility, you can add the following line to -your @file{~/.emacs} or @file{~/.gnus}: - -@lisp -(setq gpg-command-default-alist (quote ((gpg . "gpg") (gpg-2comp . "gpg")))) -@end lisp - -To sign or encrypt your message you may choose to use the MML Security -menu or @kbd{C-c C-m s p} to sign your message using PGP/MIME, @kbd{C-c -C-m s s} to sign your message using S/MIME. There's also @kbd{C-c C-m c -p} to encrypt your message with PGP/MIME and @kbd{C-c C-m c s} to -encrypt using S/MIME. - -Gnus will ask for your passphrase and then it will send your message, if -you've typed it correctly. - -@end ignore -@node Select Methods -@chapter $BA*BrJ}K!(B -@cindex foreign groups -@cindex select methods - -@dfn{$B30It%0%k!<%W(B} (foreign group) $B$H$O!"IaDL(B ($B$b$7$/$O%G%#%U%)%k%H(B) $B$N(B -$BJ}K!$GFI$^$l$J$$%0%k!<%W$N;v$G$9!#Nc$($P!"$=$l$O0c$C$?(B @sc{nntp} $B%5!<%P!<(B -$B$N%0%k!<%W$G$"$C$?$j!";ve$N%0%k!<%W$G$"$C$?$j!"8D?ME*$J%a!<%k%0%k!<%W(B -$B$G$"$C$?$j$9$k$G$7$g$&!#(B - -$B30It%0%k!<%W(B ($B$b$7$/$O!"K\Ev$KA4$F%0%k!<(B -$B%W(B) $B$O(B @dfn{$BL>A0(B} $B$H(B @dfn{$BA*BrJ}K!(B} $B$G;XDj$5$l$^$9!#8e(B} $B$G$"$kO"A[%j%9%H$G$9!#A*BrJ}K!$K$O!"$=$N(B -$BEv$N%P%C%/%(%s%I$K$H$C$FFCJL$N0UL#$r;}$DCM$G$"$kDI2C$NMWAG$,$"$k$+$bCN$l(B -$B$^$;$s!#(B - -$BA*BrJ}K!$O(B @dfn{$B;ve$N%5!<%P!<(B} $B$rDj5A$9$k$H8@$&$3$H$,$G$-$k$+$b$7$l$^(B -$B$;$s(B---$B$G$9$+$i;d$?$A$O$A$g$&$I$=$l$r$7$^$7(B -$B$?(B (@pxref{Server Buffer})$B!#(B - -$B%0%k!<%W$N(B @dfn{$BL>A0(B} $B$O%P%C%/%(%s%I$,%0%k!<%W$rG'<1$9$kL>A0$G$9!#(B - -$B$?$H$($P!"(B@sc{nntp} $B%5!<%P!<$N%0%k!<%W(B @samp{soc.motss} $B$OL>(B -$BA0(B @samp{soc.motss} $B$HA*BrJ}K!(B @code{(nntp "some.where.edu")} $B$r;}$A$^$9!#(B -@code{nntp} $B%P%C%/%(%s%I$O$3$N%0%k!<%W$r(B @samp{soc.motss} $B$H$7$FCN$C$F$$(B -$B$k$@$1$G$9$,!"(Bgnus $B$O$3$N%0%k!<%W(B -$B$r(B @samp{nntp+some.where.edu:soc.motss}$B$H8F$S$^$9!#(B - -$B$b$A$m$s!"0c$C$?J}K!$OA4$F$=$lFCM-$N$b$N$,$"$j$^$9!#(B - -@menu -* 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$rpJs$rMW5a$9$k%^%7%s(B -$B$+%=%U%H%&%'%"$G$9!#(Bgnus $B$OK\Ev$N$I$s$J%5!<%P!<$K$bD>@\$K$O@\B3$;$:!"%P%C(B -$B%/%(%s%I$+B>$N$b$N$rDL$7$F$9$Y$F$N=hM}$r9T$J$$$^$9!#$7$+$7!"$=$l$Oe$N3,AX$rCV$/$3$H$G$"$C$F!"$=$l$>$l$N(B -$B%P%C%/%(%s%I$,$^$5$K5?;wE*$J%5!<%P!<$KAjEv$9$k$H8@$C$F$bNI$$$G$7$g$&!#(B - -$BNc$($P(B @code{nntp} $B%P%C%/%(%s%I$O!"0[$J$k$$$/$D$+$Nc(B -$B$,$A$J(B @sc{nntp} $B%5!<%P!<(B @samp{news.funet.fi} $B$N%]!<%H(B 13 $B$rFI$_$?$$>l(B -$B9g$H$+!#$&$*$C$[$s!#$H$K$+$/$G$9$M!"$3$N%5!<%P!<$r;H$&$=$l$>$l$N%0%k!<%W(B -$B$K$D$$$F$=$&$$$&$3$H$r@_Dj$7$J$1$l$P$J$i$J$$$H$7$?$i!"BgJQ$J:n6H$K$J$C$F(B -$B$7$^$&$G$7$g$&!#$=$3$G(B gnus $B$O!"$=$&$$$&:n6H$r%5!<%P!<%P%C%U%!$G9T$J$&$?(B -$B$a$K!"A*BrJ}K!$KL>A0$rIU$1$k$rA*BrJ}K!$H$7$F;H$&;v$,$G$-$k(B -* Unavailable Servers:: $B@\B3$7$h$&$H;n$_$?%5!<%P!<$N$$$/$D$+$,Mn(B - $B$A$F$$$k$+$b$7$l$J$$(B -@end menu - -@vindex gnus-server-mode-hook -$B%5!<%P!<%P%C%U%!$r:n@.$9$k$H$-$K(B @code{gnus-server-mode-hook} $B$,A0!#(B - -@item n -$B%5!<%P!<$NL>A0!#(B - -@item w -$B$I$3$+$i%K%e!<%9$,uBV!#(B -@end table - -@vindex gnus-server-mode-line-format -$B%b!<%I9T$bJQ?t(B @code{gnus-server-mode-line-format} $B$r;H$&;v$K$h$C$F%+%9(B -$B%?%^%$%:$9$k;v$,$G$-$^$9(B (@pxref{Mode Line Formatting})$B!#0J2<$N;XDj$OM}(B -$B2r$5$l$^$9(B: - -@table @samp -@item S -$B%5!<%P!!#(B - -@item M -$B%5!<%P!H$7$F$/$@$5$$!#(B - -@node Server Commands -@subsection $B%5!<%P!o$K4JC1$G!"<+J,<+?H$r$h$/@bL@$7$F$$$^$9(B: - -@lisp -(nntp "news.funet.fi") -@end lisp - -$BD>@\%9%W!<%k$+$iFI$`$N$O$b$C$H4JC1$G$9(B: - -@lisp -(nnspool "") -@end lisp - -$B8+$?$H$*$j!"A*BrJ}K!$N:G=i$NMWAG$O%P%C%/%(%s%I$NL>A0$G!"FsHVL\(B -$B$O(B @dfn{$B%"%I%l%9(B} (address)$B!"$b$7$/$O$=$&8F$S$?$$$N$G$"$l$P!"(B -@dfn{$BL>A0(B} $B$G$9!#(B - -$B$3$l$i$NFs$D$NMWAG$N8e$K$O!"G$0U$N?t(B -$B$N(B @code{(@var{$BJQ?t(B} @var{$BMM<0(B})} $B$NBP$rF~$l$k;v$,$G$-$^$9!#(B - -$B:G=i$NNc$KLa$j$^$7$g$&(B---$B$=$N%^%7%s$N%]!<%H(B 15 $B$+$iFI$_$?$+$C$?$H;W$C$F(B -$B$/$@$5$$!#$3$l$,$=$N;~$K!"$J$k$Y$-A*BrJ}K!$G$9(B: - -@lisp -(nntp "news.funet.fi" (nntp-port-number 15)) -@end lisp - -$B$I$NJQ?t$,4XO"$9$k$+$r8+$D$1$k$?$a$K!"$=$l$>$l$N%P%C%/%(%s%I$N@bL@J8=q$r(B -$BFI$`$Y$-$G$7$g$&$,!"$3$l$O(B @code{nnmh} $B$NNc$G$9!#(B - -@code{nnml} $B$O%9%W!<%k$N$h$&$J9=B$$GFI$`%a!<%k%P%C%/%(%s%I$G$9!#Nc$($P!"(B -$B@\?($r?^$j$?$$Fs$D$N9=B$$,$"$k$H$7$^$7$g$&(B: $B0l$D$O$"$J$?$N;dE*$J%a!<%k%9(B -$B%W!<%k$G!"B>J}$O8xE*$J$b$N$G$9!#$3$l$O;dE*$J%a!<%k$N$?$a$K;HMQ2DG=$J;XDj(B -$B$G$9(B: - -@lisp -(nnmh "private" (nnmh-directory "~/private/mail/")) -@end lisp - -($B$=$&$9$k$H$3$N%5!<%P!<$O(B @samp{private} $B$H8F$P$l$^$9$,!"$"$J$?$O4{$K?d(B -$BB,$7$F$$$?$+$b$7$l$^$;$s!#(B) - -$B$3$l$O8xE*%9%W!<%k$N$?$a$NJ}K!$G$9(B: - -@lisp -(nnmh "public" - (nnmh-directory "/usr/information/spool/") - (nnmh-get-new-mail nil)) -@end lisp - -@cindex proxy -@cindex firewall - -$BKIJI(B (firewall) $B$NCf$K$$$F!"KIJI%^%7%s$+$i$N(B @sc{nntp} $B%5!<%P!<$X$N@\B3(B -$B$7$+$J$$$N$G$"$l$P!"(Bgnus $B$KKIJI%^%7%s$K(B @code{rlogin} $B$7$F!"$=$3$+(B -$B$i(B @sc{nntp} $B%5!<%P!<$K(B telnet $B$r$9$k$h$&$K;X<($9$k;v$,$G$-$^$9!#(B -$B$3$l$r$9$k;v$O>/$7$P$+$i$7$$$G$9$,!";ve$N%5!<%P!<$NDj5A$O$*$=$i$/$3$N(B -$B$h$&$J$b$N$K$J$k$Y$-$G$9(B: - -@lisp -(nntp "firewall" - (nntp-open-connection-function nntp-open-via-rlogin-and-telnet) - (nntp-via-address "the.firewall.machine") - (nntp-address "the.real.nntp.host") - (nntp-end-of-line "\n")) -@end lisp - -$B$b$7!"$9$P$i$7$$(B @code{ssh} $B%W%m%0%i%`$r!"%b%G%`@~$+$i$N05=L$5$l$?@\B3$r(B -$BDs6!$9$k$?$a$K;H$$$?$$$N$G$"$l$P!">e5-$NNc$K0J2<$N@_Dj$r2C$($k$3$H$,$G$-(B -$B$^$9!#(B - -@lisp - (nntp-via-rlogin-command "ssh") -@end lisp - -$B$b$7$"$J$?$,KIJI$NCf$K$$$?$H$7$F$b!"(B"runsocks" $B$N$h$&$J%i%C%Q!<%3%^%s%I(B -$B$rDL$7$F30$N@$3&$rD>@\%"%/%;%9$G$-$k$N$J$i$P!"0J2<$N$h$&$K(B socks $B$rDL$7(B -$B$F%K%e!<%9%5!<%P!<$H(B telnet $B@\B3$9$k$3$H$,$G$-$^$9(B: - -@lisp -(nntp "outside" - (nntp-pre-command "runsocks") - (nntp-open-connection-function nntp-open-via-telnet) - (nntp-address "the.news.server") - (nntp-end-of-line "\n")) -@end lisp - -$B$3$l$O$b$A$m$s!"<+F0G'>Z$rDs6!$9$k$?$a$K(B @code{ssh-agent} $B$rE,@Z$K@_Dj$7(B -$B$J$1$l$P$J$j$^$;$s!#05=L$5$l$?@\B3$rF@$k$?$a$K$O!"(B@code{ssh}$B$N%U%!%$(B -$B%k(B @file{config} $B$G(B @samp{Compression} $B%*%W%7%g%s$,$"$kI,MW$,$"$j$^$9!#(B - -@node Creating a Virtual Server -@subsection $B;ve$N%5!<%P!<$r:n@.$9$k(B - -$B$b$7$"$J$?$O1JB35-;v$r;H$C$F$?$/$5$s$N5-;v$r%-%c%C%7%e$KJ]B8$7$F$$$k$N$G(B -$B$"$l$P!"%-%c%C%7%e$rFI$`$?$a$N;ve$N%5!<%P!<$r:n$j$?$$$H;W$&$+$b$7$l$^(B -$B$;$s!#(B - -$B:G=i$K!"?7$7$$%5!<%P!<$rIU$12C$($kI,MW$,$"$j$^$9!#L?Na(B @kbd{a} $B$,$=$l$r(B -$B$7$^$9!#$*$=$i$/%-%c%C%7%e$rFI$`$?$a$K$O(B @code{nnspool} $B$r;H$&$N$,0lHVNI(B -$B$$$G$7$g$&!#(B@code{nnml} $B$d(B @code{nnmh} $B$b;H$&;v$,$G$-$^$9$1$I!#(B - -@kbd{a nnspool RET cache RET} $B$HBG$C$F$/$@$5$$!#(B - -$B:#$dA4$/?7$7$$(B @samp{cache} $B$H8F$P$l$k(B @code{nnspool} $B$N;ve$N%5!<%P!<(B -$B$"$k$O$:$G$9!#e$N%5!<%P!<$G(B @kbd{RET} $B$r2!$9$H!"1\Mw%P%C%U%!$KF~$k$Y$-$G!"I=<($5$l(B -$B$F$$$k$I$N%0%k!<%W$K$G$bF~$k;v$,$G$-$k$O$:$G$9!#(B - -@node Server Variables -@subsection $B%5!<%P!J}$G(B)$B!"(B -$BJQ?t$NDj5A$,%m!<%I$5$l$k$F$$$k4V$K!"$$$/$D$+$NJQ?t$OB>$NJQ?t$+$i=i4|2=$5(B -$B$l$k$H$$$&;v$G$9!#$b$7(B "$B4p$H$J$k(B" $BJQ?t$,%m!<%I$5$l$?8e$KJQ99$7$F$b!"(B"$BF3(B -$B$-=P$5$l$?(B" $BJQ?t$OJQ99$5$l$^$;$s!#(B - -$B$3$l$OIaDL$O%G%#%l%/%H%j!<$d%U%!%$%k$NJQ?t$K1F6A$7$^$9!#Nc$($P!"(B -@code{nnml-directory} $B$O%G%#%U%)%k%H$G(B @file{~/Mail} $B$G$9$,!"A4$F(B -$B$N(B @code{nnml} $B%G%#%l%/%H%j!e$N(B @code{nnml} $B%5!<%P!<$rDj5A$7$?>l9g!"(B@code{nnml-directory} $B$r@_Dj(B -$B$9$k$@$1$G$O=$s$@>uBV$K$J$k$h$&$K!"(B -$BA4$F$N%U%!%$%kJQ?t$rL@<(E*$K@_Dj$7$J$1$l$P$J$j$^$;$s!#$=$l$>$l$N%P%C%/%((B -$B%s%I$KBP$9$k40A4$JJQ?t$N%j%9%H$r8+$k$?$a$K$O!"$3$N%^%K%e%"%k$N8e$KB3$/$=(B -$B$l$>$l$N%P%C%/%(%s%I$NItJ,$rFI$s$G$/$@$5$$!#$G$b!"(B@code{nnml} $B$NDj5A$NNc(B -$B$O$3$3$K$"$j$^$9(B: - -@lisp -(nnml "public" - (nnml-directory "~/my-mail/") - (nnml-active-file "~/my-mail/active") - (nnml-newsgroups-file "~/my-mail/newsgroups")) -@end lisp - -@node Servers and Methods -@subsection $B%5!<%P!<$HJ}K!(B - -$BIaDL$OA*BrJ}K!$r;H$&$H$3$m(B ($BNc$($P!"30It%5!<%P!<$r354Q$7$F$$$k$H$-$N%0%k!<(B -$B%WA*BrJ}K!$G$N(B @code{gnus-secondary-select-method}) $B$O$I$3$G$b!";ve$N(B -$B%5!<%P!$r$=$l$NBe$o$j$K;H$&;v$,$G$-$^$9!#$3$N$3$H$K$h$j$?$/$5$s%-!<%\!<(B -$B%I$rC!$+$J$/$F$9$`2DG=@-$,$"$j$^$9!#$=$7$F!"A4$F$K$o$?$C$F!"$=$NJ}$,NI$$(B -$B$G$9!#(B - -@node Unavailable Servers -@subsection $B;HMQIT2DG=$J%5!<%P!<(B - -$B$b$7%5!<%P!<$K@\B3IT2DG=$G$"$k$J$i$P!"(Bgnus $B$O%5!<%P!<$r(B @code{$B5qH](B} $B$H$7(B -$B$F0u$rIU$1$^$9!#$3$l$O$=$N8e$N$=$N%5!<%P!<$H$N@\B3$r$O$+$k$I$N$h$&$J;n$_(B -$B$bL5;k$5$l$k$H$$$&;v$G$9!#(BGnus $B$O@\B3$,3+$1$J$$$3$H$,K\Ev$G$"$k$+$I$&$+(B -$B$r>/$7$b3N$+$a$:!"(B``It can't be opend,'' ($B@\B3$r3+$/;v$,$G$-$^$;$s(B) $B$H9p(B -$B$2$^$9!#(B - -$B$=$l$O9T57$,0-$$$H;W$&;v$,$"$k$+$b$7$l$^$;$s$,!"$=$l$O$?$$$F$$$N$H$-$K$O(B -$BNI$$J}K!$G$9!#Nc$($P!"%5!<%P!<(B @samp{nephelococcdyia.com} $B$K(B 10 $B8D9XFI$7(B -$B$F$$$k%0%k!<%W$,$"$k$H$7$^$7$g$&!#%5!<%P!<$O$I$3$+Hs>o$K1s$/$K$"$j!"%^%7(B -$B%s$O$H$F$bCY$$$N$G!"$=$l$,:#F|$O$"$J$?$H$N@\B3$r5qH]$9$k$+$I$&$+$rD4$Y$k(B -$B$@$1$G0lJ,$+$+$j$^$9!#$b$7(B gnus $B$,$=$l$r(B 10 $B2s;n$9$h$&$K$J$C$F$$$?$J$i!"(B -$B$"$J$?$OHs>o$K$&$k$5$/;W$&$G$7$g$&!#$G$9$+$i!"(Bgnus $B$O$=$l$r;n$=$&$H$O$7(B -$B$^$;$s!#0lEY(B ``connection refused'' ($B@\B3$O5qH]$5$l$^$7$?(B) $B$rC5n$7$^(B -$B$9(B (@code{gnus-server-remove-denials})$B!#(B -@end table - -@node Getting News -@section $B%K%e!<%9$NpJs$rJT=8$7$J$1$l$P$J$j$^$;(B -$B$s(B (@pxref{Foreign Groups})$B!#(B - -$B30It%0%k!<%W$NL>A0$O4pK\%0%k!<%W$HF1$8$G$"$k;v$,$G$-$^$9!#A0$N>WFM$O5/$3$j$^$;$s!#(B - -$B0J2<$NJQ?t$O;ve$N(B @code{nntp} $B%5!<%P!<$r:n$k$?$a$K;H$o$l$^$9(B: - -@table @code -@item nntp-server-opened-hook -@vindex gnus-server-opend-hook -@cindex @sc{mode reader} -@cindex authinfo -@cindex authentification -@cindex nntp authentification -@findex nntp-send-authinfo -@findex nntp-send-mode-reader -$B$O@\B3$,$G$-$?8e$Ko$K$3$N%U%C%/$K$"$k$Y$-$G$9!#(B - -@item nntp-authinfo-function -@vindex nntp-authinfo-function -@findex nntp-send-authoinfo -@vindex nntp-authinfo-file -$B$3$N4X?t$O(B @sc{nntp} $B%5!<%P!<$K(B @samp{AUTHINFO} $B$rAw$k$?$a$K;H$o$l$^$9!#(B -$B%G%#%U%)%k%H$N4X?t$O(B @code{nntp-send-authinfo} $B$G!"(B -@file{~/.authinfo} ($B$b$7$/$OJQ?t(B @code{nntp-authinfo-file} $B$K@_Dj$7$?$I(B -$B$N$h$&$J$b$N$G$b(B) $B$r;HMQ2DG=$J5-:\$rD4$Y$k$?$a$KC5$7$^$9!#$b$70l$D$b8+$D(B -$B$+$i$J$+$C$?$i!"$"$J$?$K%m%0%$%sL>$H%Q%9%o!<%I$NF~NO$rB%?J$7$^$9!#%U%!%$(B -$B%k(B @file{~/.authinfo} $B$NMM<0$O(B ($B$[$H$s$I(B) @code{ftp} $B$N%U%!%$(B -$B%k(B @file{~/.netrc} $B$HF1$8$G!"$=$l$O(B @code{ftp} $B$N%^%K%e%"%k%Z!<%8$KDj5A(B -$B$5$l$F$$$^$9$,!"$3$3$N$b$N$O82Cx$J;ve$N9T$r4^$_!"$=$l$>$l$O0l$D$N%5!<%P!<$rDj5A$7$^$9!#(B - -@item -$B$=$l$>$l$N9T$OG$0U$N?t$N(B $B6h@Z$j0u(B/$BCM(B $B$NBP$r4^$`;v$,$G$-$^$9!#(B - -$BM-8z$J6h@Z$j0u$O(B @samp{machine}, @samp{login}, @samp{password}, -@samp{default} $B$G$9!#2C$($F!"(Bgnus $B$O(B @file{.netrc}/@code{ftp} $B$N9=J8$N86(B -$B7?$K$O8=$l$J$$Fs$D$N?7$7$$6h@Z$j0u!"L>IU$1(B -$B$F(B @samp{port} $B$H(B @samp{force} $B$rF3F~$7$^$9!#(B -($B$3$l$,(B @file{.authinfo} $B%U%!%$%k$NMM<0$,(B @file{.netrc} $B%U%!%$%k$NMM<0$+(B -$B$i0o$l$kM#0l$NJ}K!$G$9!#(B) @samp{port} $B$O%5!<%P!<$N$I$N%]!<%H$rG'>Z$KMQ$$(B -$B$k$+$r<($7!"(B@samp{force} $B$O0J2<$G@bL@$7$^$9!#(B - -@end enumerate - -$B$3$l$,$=$N%U%!%$%k$NNc$G$9(B: - -@example -machine news.uio.no login larsi password geheimnis -machine nntp.ifi.uio.no login larsi force yes -@end example - -$B6h@Z$j0u(B/$BCM(B $B$NBP$O$I$N$h$&$J=gHV$G$G$b8=$l$k;v$,$G$-$^$9!#Nc$($P!"(B -@samp{machine} $B$O:G=i$K8=$l$kI,MW$O$"$j$^$;$s!#(B - -$B$3$NNc$G$O!"%m%0%$%sL>$H%Q%9%o!<%I$NN>J}$,A0$@$1$r5s$2$F$$$F!"MxMQZ>pJs(B (authinfo) $B$,Aw$i$l$k$H$$$&;v$G$9!#%G%#(B -$B%U%)%k%H(B ($B$9$P$o$A!"(B@samp{force} $B%?%0$,L5$$$H$-(B) $B$G$O(B @var{nntp} $B%5!<%P!<(B -$B$,G'>Z>pJs$r?R$M$J$$8B$j$=$l$r(B @var{nntp} $B%5!<%P!<$KAw$j$^$;$s!#(B - -@samp{machine} $B9T$K9gCW$7$J$$A4$F$N%5!<%P!<$KE,MQ$5$l(B -$B$k(B @samp{default} $B9T$rDI2C$9$k;v$b$G$-$^$9!#(B - -@example -default force yes -@end example - -$B$3$l$O0JA0$K=q$+$l$F$$$J$$A4$F$N%5!<%P!<$KL?Na(B @samp{AUTHINFO} $B$r6/@)E*(B -$B$KAw$j$^$9!#(B - -$B%U%!%$%k(B @file{~/.authinfo} $B$r@$3&Cf$,FI$a$k$h$&$J@_Dj$KJ|CV$7$J$$$h$&$K(B -$BCm0U$7$F$/$@$5$$!#(B - -@item nntp-server-action-alist -@vindex nntp-server-action-alist -$B$3$l$O%5!<%P!<$N7?$K9gCW$9$k@55,I=8=$H!"9gCW$,5/$3$C$?$H$-$Kc$,$A$G$"$k$J$i!"$3$NJQ?t$r(B 1 $B$K@_Dj$9$k$Y$-$G$7$g(B -$B$&!#(B - -@item nntp-connection-timeout -@vindex nntp-connection-timeout -$BDj4|E*$K@\B3$9$k30It(B @code{nntp} $B%0%k!<%W$,$?$/$5$s$"$k$J$i!"E,@Z$K1~Ez(B -$B$7$J$$(B @code{nntp} $B%5!<%P!<$,$"$C$?$j!"$"$k%5!<%P!<$O>o<1E*$J;~4VFb$G$O(B -$BJVEz$G$-$J$$$/$i$$Ii2Y$,$+$+$C$F$$$k!"$J$I$NLdBj$,$"$k$G$7$g$&!#$3$l$O:$$C(B -$B$?LdBj$K$J$k$3$H$,$"$j$^$9$,!"(B@code{nntp-connection-timeout} $B$r@_Dj$9$k(B -$B;v$K$h$j$"$kDxEY2r>C$9$k;v$,$G$-$^$9!#$3$l$O@\B3$r$"$-$i$a$k$^$($K!"(B -@code{nntp} $B%P%C%/%(%s%I$,2?ICBT$D$+$r<($9@0?t$G$9!#$b$7$3$l(B -$B$,(B @code{nil} $B$G$"$k$H!"$3$l$,=i4|@_Dj$G$9$,!";~4V@Z$l@ZCG$O$J$5$l$^$;$s!#(B - -@c @item nntp-command-timeout -@c @vindex nntp-command-timeout -@c @cindex PPP connections -@c @cindex dynamic IP addresses -@c If you're running Gnus on a machine that has a dynamically assigned -@c address, Gnus may become confused. If the address of your machine -@c changes after connecting to the @sc{nntp} server, Gnus will simply sit -@c waiting forever for replies from the server. To help with this -@c unfortunate problem, you can set this command to a number. Gnus will -@c then, if it sits waiting for a reply from the server longer than that -@c number of seconds, shut down the connection, start a new one, and resend -@c the command. This should hopefully be transparent to the user. A -@c likely number is 30 seconds. -@c -@c @item nntp-retry-on-break -@c @vindex nntp-retry-on-break -@c If this variable is non-@code{nil}, you can also @kbd{C-g} if Gnus -@c hangs. This will have much the same effect as the command timeout -@c described above. - -@item nntp-server-hook -@vindex nntp-server-hook -$B$3$N%U%C%/$O(B @sc{nntp} $B%5!<%P!<$K@\B3$9$k:G8e$N0lJb$H$7$Fc$,$A$G$"$k$H$-$K$3$l$r(B @code{nil} $B$G$J$$CM(B -$B$K@_Dj$7$F$/$@$5$$!#(B - -@item nntp-nov-is-evil -@vindex nntp-nov-is-evil -@sc{nntp} $B%5!<%P!<$,(B @sc{nov} $B5!G=$rDs6!$7$F$$$J$1$l$P$3$NJQ?t(B -$B$r(B @code{t} $B$K@_Dj$9$k;v$,$G$-$^$9$,!"(B@code{nntp} $B$OIaDL$O(B @sc{nov} $B$,;H(B -$B$o$l$k$+$I$&$+$r<+F0E*$KD4$Y$^$9!#(B - -@item nntp-xover-commands -@vindex nntp-xover-commands -@cindex nov -@cindex XOVER -$B%5!<%P!<$+$i(B @sc{nov} $B9T$rl(B -$B9g$O!"$3$NJQ?t$rK\Ev$K>.$5$J?t;z$K@_Dj$9$k$H$*$=$i$//$7;(2;$,$?(B -$B$F$i$l$^$9!#(B - -@item nntp-record-commands -@vindex nntp-record-commands -$B$b$7(B @code{nil} $B$G$J$$$H!"(B@code{nntp} $B$O(B @sc{nntp} $B%5!<%P!<$KAw$C$?A4$F(B -$B$NL?Na$r(B ($B;~9o$H6&$K(B) @samp{*nntp-log*} $B%P%C%U%!$K5-O?$7$^$9!#$3$l$OF0:n(B -$B$7$F$$$J$$$H;W$o$l$k(B gnus/@sc{nntp} $B@\B3$r%G%#%P%C%0$7$F$$$k$H$-$KLr$KN)(B -$B$A$^$9!#(B - -@item nntp-open-connection-function -@vindex nntp-open-connection-function -$B$I$N$h$&$K(B nntp $B%5!<%P!<$H@\B3$9$k$+$r%+%9%?%^%$%:$9$k$3$H$,$G$-$^$9!#%Q(B -$B%i%a!<%?(B @code{nntp-open-connection-function} $B$r@_Dj$9$k$H!"(Bgnus $B$O@\B3(B -$B$r3NN)$9$k$?$a$K$=$N4X?t$r;H$$$^$9!#$=$N$?$a$K8^$D$N4X?t$,$"$i$+$8$aMQ0U(B -$B$5$l$F$$$^$9!#$=$l$i$OFs@\@\B3$9$k$?$a$N4X?t(B -$B72(B ($B;0$D(B) $B$H4V@\E*$K@\B3$9$k$?$a$N$b$N(B ($BFs$D(B) $B$,$"$j$^$9!#(B - -@item nntp-list-options -@vindex nntp-list-options -LIST $B%3%^%s%I$N%*%W%7%g%s$K;H$C$F!"(B($B%5!<%P!<$N(B) $B%j%9%H=PNO$r@_Dj$7$?%K%e!<(B -$B%9%0%k!<%W$@$1$K@)8B$9$k$?$a$N!"%K%e!<%9%0%k!<%WL>$N%j%9%H$G$9!#$=$l$>$l(B -$B$N%K%e!<%9%0%k!<%WL>$K$O(B @dfn{fj.*} $B$d(B @dfn{japan.*} $B$N$h$&$J!"%7%'%k7A(B -$B<0$N%o%$%k%I%+!<%I$r;H$&$3$H$,$G$-$^$9!#$b$79,1?$K$b%5!<%P!<$,$=$N$h$&$J(B -$B%*%W%7%g%s$rr7o$G9VFI$9$k%K%e!<%9%0%k!<%WL>$N@55,I=8=$G$9!#@55,I=8=$NJ8(B -$B;zNs$G$O(B @dfn{$} $B$NBe$o$j$K(B @dfn{ } $B$r;H$C$F2<$5$$!#%5!<%P!<$,(B LIST $B%3%^(B -$B%s%I$N%*%W%7%g%s$K%7%'%k7A<0$N%o%$%k%I%+!<%I$rl9g$G$b!"(B -@code{nntp-list-options} $B$HF1MM$N8z2L$,$"$k$G$7$g$&!#$3$l$O!"0J2<$N$h$&(B -$B$K%5!<%P!r7o$G9VFI$9$k%K%e!<%9%0%k!<%WL>$N@55,I=8=$G$9!#@55,I=(B -$B8=$NJ8;zNs$G$O(B @dfn{$} $B$NBe$o$j$K(B @dfn{ } $B$r;H$C$F2<$5$$!#%5!<%P!<(B -$B$,(B LIST $B%3%^%s%I$N%*%W%7%g%s$K%7%'%k7A<0$N%o%$%k%I%+!<%I$rl9g$G$b!"(B@code{nntp-list-options} $B$HF1MM$N8z2L$,$"$k$G$7$g$&!#$3$l(B -$B$O!"0J2<$N$h$&$K%5!<%P!@\@\B3$9$k(B -* Indirect Functions:: $B%5!<%P!<$K4V@\E*$K@\B3$9$k(B -* Common Variables:: $B$$$/$D$+$N@\B3MQ$N4X?t$,;2>H$9$kJQ?t(B -@end menu - -@node Direct Functions -@subsubsection $BD>@\@\B3$9$k$?$a$N4X?t(B -@cindex direct connection functions - -$B$3$l$i$N4X?t$O!"$"$J$?$N%^%7%s$H(B @sc{nntp}$B%5!<%P!<$r@\B3$9$k$?$a$KD>@\8F(B -$B$P$l$^$9!#$^$?!"$=$l$i$NF0:n$O$=$l$i$,6&DL$K;2>H$9$kJQ?t$K1F6A$5$l$^(B -$B$9(B (@pxref{Common Variables})$B!#(B - -@table @code -@findex nntp-open-network-stream -@item nntp-open-network-stream -$B$3$l$O%G%#%U%)%k%H$G!"C1=c$K1s3V%7%9%F%`$N%]!<%H$J$I$K@\B3$7$^$9!#(B - -@findex nntp-open-ssl-stream -@item nntp-open-ssl-stream -@dfn{$B0BA4$J(B} $B%A%c%s%M%k$r;H$C$F%5!<%P!<$K@\B3$7$^$9!#$3$l$r;H$&$?$a$K$O!"(B -SSLeay $B$,%$%s%9%H!<%k$5$l$F$$$J$1$l$P$J$j$^$;(B -$B$s(B (@uref{ftp://ftp.psy.uq.oz.au/pub/Crypto/SSL} $B$H!"(B@file{ssl.el} ($BNc$((B -$B$P!"(BW3 $B$NG[I[$+$i(B) $B$,I,MW$K$J$j$^$9(B)$B!#$=$l$+$i%5!<%P!<$r@\%"%/%;%9$G$-$k$J$i$P!"$"$J$?$O$=$l$r$3$N$h$&$K;H(B -$B$&$3$H$,$G$-$k$N$G$9(B: - -@lisp -(nntp "socksified" - (nntp-pre-command "runsocks") - (nntp-open-connection-function nntp-open-telnet-stream) - (nntp-address "the.news.server")) -@end lisp - -Emacs $B$N%;%C%7%g%sA4BN$r%i%C%W$7$F!"%G%#%U%)%k%H$N%a%=%C%I$r;H$&$H$$$&$N(B -$B$O!"NI$$0F$G$O$"$j$^$;$s!#(B -@end table - -@node Indirect Functions -@subsubsection $B4V@\E*$K@\B3$9$k$?$a$N4X?t(B -@cindex indirect connection functions - -$B$3$l$i$N4X?t$O!"H$9$kJQ?t$K1F6A$5$l$^$9(B (@pxref{Common Variables})$B!#(B - -@table @code -@item nntp-open-via-rlogin-and-telnet -@findex nntp-open-via-rlogin-and-telnet -$B1s3V%7%9%F%`$K(B @samp{rlogin} $B$7$F!"$=$3$+$iK\Ev(B -$B$N(B @sc{nntp} $B%5!<%P!<$K(B @samp{telnet} $B$7$^$9!#$3$l$O!"Nc$($P$"$J$?$,;O$a(B -$B$KKIJI%^%7%s$K@\B3$7$J$1$l$P$J$i$J$$>l9g$KJXMx$G$9!#(B - -@code{nntp-open-via-rlogin-and-telnet}-$BMQ$NJQ?t(B: - -@table @code -@item nntp-via-rlogin-command -@vindex nntp-via-rlogin-command -$BCf4V$N%[%9%H$K%m%0%$%s$9$k$?$a$K;H$o$l$k%3%^%s%I$G$9!#%G%#%U%)%k%H(B -$B$O(B @samp{rsh} $B$G$9$,!"(B@samp{ssh} $B$,?M5$$N$"$kBeBXJ}(B) $B$G(B @code{ENVIRON} $B%*%W%7%g%s$r%5%]!<%H$7!"%m%0%$%sL>$NF~(B -$BNO$rMW5a$7$^$;$s!#$3$l$ONc$($P(B Solaris $B$N(B @code{telnet} $B$GF0:n$7$^$9!#(B - -@item nntp-via-shell-prompt -@vindex nntp-via-shell-prompt -$BCf4V$N%[%9%H$G$N%7%'%k$N%W%m%s%W%H$K9gCW$9$k@55,I=8=$G$9!#%G%#%U%)%k%H(B -$B$O(B @samp{bash\\|\$ *\r?$\\|> *\r?} $B$G$9!#(B -@end table -@end table - -$B$3$l$i$O>e5-$N4X?t$,;2>H$9$kIU2CE*$JJQ?t$G$9(B: - -@table @code -@item nntp-via-user-name -@vindex nntp-via-user-name -$BCf4V$N%[%9%H$K@\B3$9$k$H$-$K;H$&MxMQ$G$9!#(B - -@item nntp-via-address -@vindex nntp-via-address -$B@\B3$9$kCf4V$N%[%9%H$N%"%I%l%9$G$9!#(B -@end table - -@node Common Variables -@subsubsection $B6&DL$NJQ?t(B - -$B0J2<$NJQ?t$O!"$9$Y$F$N!"$^$?$O$$$/$D$+$N$"$i$+$8$aMQ0U$5$l$F$$$k4X?t$NF0(B -$B:n$K1F6A$r5Z$\$7$^$9!#@_Dj$5$l$F$$$J$1$l$P!"$9$Y$F$N4X?t$,1F6A$5$l$^$9!#(B - -@table @code -@item nntp-pre-command -@vindex nntp-pre-command -$BAG$N@\B3MQ$N4X(B -$B?t(B (@code{nntp-open-network-stream} $B$H(B @code{nntp-open-ssl-stream} $B$@$1(B -$B$@$H;W$&(B) $B$G$O$J$$$b$N$rDL$7$F@\B3$9$k$H$-$K;H$&%3%^%s%I%i%C%Q!<$G$9!#Nc(B -$B$($P$"$J$?$O(B @samp{SOCKS} $B%i%C%Q!<$r3d$jEv$F$k$G$7$g$&!#(B - -@item nntp-address -@vindex nntp-address -@sc{nntp} $B%5!<%P!<$N%"%I%l%9$G$9!#(B - -@item nntp-port-number -@vindex nntp-port-number -$B@\B3$9$k(B @sc{nntp} $B%5!<%P!<$N%]!<%HHV9f$G$9!#%G%#%U%)%k%H(B -$B$O(B @samp{nntp} $B$G$9!#(B - -@item nntp-end-of-line -@vindex nntp-end-of-line -@sc{nntp} $B%5!<%P!<$H$*OC$r$7$F$$$k$H$-$K9T$N=*$o$j$N0u$H$7$F;H$o$l$kJ8;z(B -$BNs$G$9!#$3$l$O%G%#%U%)%k%H$G(B @samp{\r\n} $B$G$9$,!"AG$G$O$J$$@\B3MQ$N4X?t(B -$B$r;H$C$F$$$k$H$-$O(B @samp{\n} $B$G$"$k$Y$-$G$9!#(B - -@item nntp-telnet-command -@vindex nntp-telnet-command -@samp{telnet} $B$rDL$7$F(B @sc{nntp} $B%5!<%P!<$H@\B3$9$k$H$-$K;H$&%3%^%s%I$G(B -$B$9!#$3$l$OCf4V$N%[%9%H$H@\B3$9$k$?$a$N$b$N$G$O(B $B!v$"$j$^$;$s!v!#$3$l$OC1(B -$B$KK\Ev$N(B @sc{nntp} $B%5!<%P!<$H@\B3$9$k$?$a$N$b$N$G$9!#%G%#%U%)%k%H(B -$B$O(B @samp{telnet} $B$G$9!#(B - -@item nntp-telnet-switches -@vindex nntp-telnet-switches -@code{nntp-telnet-command} $B$KEO$9%9%$%C%A$N%j%9%H$G$9!#%G%#%U%)%k%H(B -$B$O(B @samp{("-8")} $B$G$9!#(B -@end table - -@node News Spool -@subsection $B%K%e!<%9%9%W!<%k(B -@cindex nnspool -@cindex new spool - -$B%m!<%+%k%9%W!<%k$+$i30It%0%k!<%W$r9XFI$9$k;v$OHs>o$K4JC1$G!"Lr$KN)$A$^$9!#(B -$B$?$H$($P!"Hs>o$KBg$-$J5-;v$,$"$k%0%k!<%W(B---$BNc$((B -$B$P(B @samp{alt.binaries.pictures.furniture} $B$rFI$`B.EY$,B.$/$J$j$^$9!#(B - -$B$H$K$+$/!"(B@code{nnspool} $B$rJ}K!$H$7$F!"(B@code{""} ($B$b$7$/$O2?$G$b(B) $B$r%"%I(B -$B%l%9$H$7$F;XDj$9$k$@$1$G$9!#(B - -$B$b$7%m!<%+%k%9%W!<%k$K$D$J$0;v$,2DG=$J$i!"$*$=$i$/$=$l$r4pK\A*BrJ}K!$H$7(B -$B$F;H$&$Y$-$G$7$g$&(B (@pxref{Finding the News})$B!#$=$l$OIaDL(B -$B$O(B @code{nntp} $BA*BrJ}K!$h$jB.$$$G$9$,!"$=$&$G$J$$$+$b$7$l$^$;$s!#$=$l$O(B -$B>u67$K0MB8$7$^$9!#2?$,$"$J$?$N%5%$%H$G0lHVNI$$$+$r8+$D$1$k$?$a$K!"$$$m$$(B -$B$m$H;n$7$F$_$J$1$l$P$J$j$^$;$s!#(B - -@table @code -@item nnspool-inews-program -@vindex nnspool-inews-program -$B5-;v$rEj9F$9$k$?$a$K;H$o$l$k%W%m%0%i%`$G$9!#(B - -@item nnspool-inews-switches -@vindex nnspool-inews-switches -$B5-;v$rEj9F$9$k$H$-$K(B inews $B%W%m%0%i%`$KM?$($i$l$k%Q%i%a!<%?$G$9!#(B - -@item nnspool-spool-directory -@code{nnspool} $B$,5-;v$rC5$9$H$3$m$G$9!#$3$l$OIaDL(B -$B$O(B @file{/usr/spool/news/} $B$G$9!#(B - -@item nnspool-nov-directory -@vindex nnspool-nov-directory -@code{nnspool} $B$,(B @sc{nov} $B%U%!%$%k$rC5$9$H$3$m$G$9!#$3$l$OIaDL(B -$B$O(B @file{/usr/spool/news/over.view/} $B$G$9!#(B - -@item nnspool-lib-dir -@vindex nnspool-lib-dir -$B%K%e!<%9$N%i%$%V%i%j!<%G%#%l%/%H%j!<$N>l=j$G$9(B ($B%G%#%U%)%k%H(B -$B$G(B @file{/usr/lib/news/} $B$G$9(B)$B!#(B - -@item nnspool-active-file -@vindex nnspool-active-file -$B%"%/%F%#%V%U%!%$%k$X$N%Q%9$G$9!#(B - -@item nnspool-newsgroups-file -@vindex nnspool-newsgroups-file -$B%0%k!<%W5-=R%U%!%$%k$X$N%Q%9$G$9!#(B - -@item nnspool-history-file -@vindex nnspool-history-file -$B%K%e!<%9MzNr%U%!%$%k$X$N%Q%9$G$9!#(B - -@item nnspool-active-times-file -@vindex nnspool-active-times-file -$B8=>uF|IU%U%!%$%k$X$N%Q%9$G$9!#(B - -@item nnspool-nov-is-evil -@vindex nnspool-nov-is-evil -@code{nil} $B$G$J$$$H!"(B@code{nnspool} $B$O$=$l$,8+$D$1$?$I$s$J(B @sc{nov} $B%U%!(B -$B%$%k$b;H$*$&$H$O$7$^$;$s!#(B - -@item nnspool-sift-nov-with-sed -@vindex nnspool-sift-nov-with-sed -@cindex sed -@code{nil} $B$G$J$$$H!"$3$l$,%G%#%U%)%k%H$G$9$,!"354Q%U%!%$%k(B (overview) -$B$+$i4XO"$9$kItJ,$rF@$k$?$a$K(B @code{sed} $B$r;H$$$^$9!#$b$7(B @code{nil} $B$@$H!"(B -@code{nnspool} $B$O%U%!%$%kA4BN$r%P%C%U%!$KFI$_9~$s$G!"$=$3$G$N%U%!%$%k$rFI$`$?$a$K%a!<%k%P%C%/%((B - $B%s%I$r;H$&(B -* Choosing a Mail Backend:: Gnus $B$O?'!9$J%a!<%kMM<0$rFI$`;v$,$G$-$k(B -* Archiving Mail:: $B%a!<%k$r%P%C%/%"%C%W$9$k$K$O(B -@end menu - -@node Mail in a Newsreader -@subsection $B%K%e!<%9%j!<%@$G%a!<%k(B - -$B$"$J$?$,EAE}E*$J%a!<%k%j!<%@$+$i(B gnus $B$K>h$j49$($k$3$H$r7hCG$7$?$J$i$P!"(B -$B$"$J$?$O$$$m$$$m$J%+%k%A%c!<%7%g%C%/$r$`$J(B -$B$i$=$N$h$&$K$b$G$-$^$9$,!"$=$l$O9|@^$jB;$N$/$?$S$lLY$1$G$9!#(B - -gnus $B$O$U$D$&F1$8C$9$?$a$KFCJL$JA`:n$O$7$^$;$s!#(B - -$B$3$N$3$H$O4{FI$N5-;v$O$9$Y$F>C$5$l$F$7$^$&$3$H$r0UL#$9$k$N$+$C$F(B? $B$=$j$c(B -$B$"$s$^$j$G$9$h$M(B! - -$B$=$&$G$O$"$j$^$;$s!#8E$$5-;v$O$$$m$s$J;EAH$_$K$h$C$F(B @dfn{expire} $B$5$l(B -$B$k$N$G$9!#%K%e!<%95-;v$O%K%e!<%9$N4IM}?M(B ($B$,4IM}$7$F$$$k%5!<%P(B) $B$K$h$C(B -$B$F(B expire $B$N=hM}$,@)8f$5$l!"%a!<%k$N(B expire $B$N=hM}$O$"$J$?$,@)8f$7$^$9!#(B -$B%a!<%k$N(B expire $B$K$D$$$F$O(B @pxref{Expiring Mail} $B$r;2>H$7$F2<$5$$!#(B - -$B$7$P$i$/%a!<%k$H%K%e!<%9$NN>J}$r;H$C$F$_$l$P!"5-;v$N.?M?t$KMxMQ$5$l$F$$$k%m!<%+%k%K%e!<%9%0%k!<%W$r9VFI$7$F$$(B -$B$^$9!#$=$l$i$O(B @sc{nntp} $B$GG[Aw$5$l$k!"%K%e!<%9!"$G$9!#;d$?$A$O<+J,$N;E(B -$B;v$KLrN)$F$k$?$a$K!"$=$l$i$NKDBg$J5-;v$NCGJR$rFI$s$@$jJV;v$r$7$J$1$l$P(B -$B$J$j$^$;$s!#$=$7$F$=$l$i$OJ]B8$5$l$F$$$J$$$+$b$7$l$^$;$s$+$i!"6=L#$N$"(B -$B$k5-;v$r8D?M%a!<%k$HF1$8$h$&$KJ]B8$7$J$1$l$P$J$i$J$$$G$7$g$&!#(B - -$BG[Aw$N;EAH$_$N0c$$$O$I$&$G$b$h$$$3$H$G!"Bg;v$J$N$O$$$+$K/$/$H$b!";d$,(B gnus $B$KF~$l$?!"(BEmacs $B$N%5%V%j%_%J%kG>L#A9@vBu4X?t$rGd$C(B -$B$F$/$l$??M$O$=$l$rJ]>Z$7$F$$$^$9!#$"$J$?$bF12=$7$^$9!#$"$J$?$O(B gnus $B$r0&(B -$B$7$^$9!#$"$J$?$O(B gnus $B$G$N%a!<%k$NJ}K!$r0&$7$^$9!#@dBP$K!#(B) - -@node Getting Started Reading Mail -@subsection $B%a!<%k$rFI$`;v$r;O$a$k(B - -Gnus $B$r;H$C$F?7$7$$%a!<%k$rFI$`;v$OHs>o$K4JC1$G$9!#$"$J$?$N%a!<%k%P%C%/(B -$B%(%s%I$N$"$J$?$NA*Br$r(B @code{gnus-secondary-select-methods} $B$KJ|$j9~$`$@(B -$B$1$G!"$"$H$N$3$H$O<+F0E*$K5/$3$j$^$9!#(B - -$BNc$($P!"(B@code{nnml} ($B$3$l$O(B "$B0l%a!<%k0l%U%!%$%k(B" $B%P%C%/%(%s%I$G$9(B) $B$r;H(B -$B$$$?$$$J$i!"$N%0%k!<%W$HF1$8$h$&$KFI$`;v$,$G$-$^(B -$B$9!#(B - -$B$"$J$?$O$*$=$i$/%a!<%k$r$$$/$D$+$N%0%k!<%W$KJ,3d$7$?$$$G$7$g$&$1$I(B: - -@lisp -(setq nnmail-split-methods - '(("junk" "^From:.*Lars Ingebrigtsen") - ("crazy" "^Subject:.*die\\^Organization:.*flabby") - ("other" ""))) -@end lisp - -$B$3$l$O7k2L$H$7$F;0$D$N?7$7$$(B @code{nnml} $B%a!<%k%0%k!<%W$r:n$j$^(B -$B$9(B: @samp{nnml:junk}, @samp{nnml:crazy}, @samp{nnml:other} $B$G$9!#:G=i(B -$B$NFs$D$N%0%k!<%W$K9g$o$J$$%a!<%k$OA4$F:G8e$N%0%k!<%W$KF~$l$i$l$^$9!#(B - -$B$3$l$O(B gnus $B$G%a!<%k$rFI$`$?$a$K=$N9`$r=OFI$7$?$$$H;W$&$+$b$7$l$^$;$s$,!#FC(B -$B$K(B @pxref{Choosing a Mail Backend} $B$H(B @pxref{Expiring Mail} $B$r!#(B - -@node Splitting Mail -@subsection $B%a!<%k$NJ,3d(B -@cindex splitting mail -@cindex mail splitting - -@vindex nnmail-split-methods -$BJQ?t(B @code{nnmail-split-methods} $B$OF~$C$F$/$k%a!<%k$r$I$N$h$&$K%0%k!<%W(B -$BJ,$1$9$k$+$r;XDj$7$^$9!#(B - -@lisp -(setq nnmail-split-methods - '(("mail.junk" "^From:.*Lars Ingebrigtsen") - ("mail.crazy" "^Subject:.*die\\|^Organization:.*flabby") - ("mail.other" ""))) -@end lisp - -$B$3$NJQ?t$O%j%9%H$N%j%9%H$G!"$3$l$i$N%j%9%H$N:G=i$N$=$l$>$l$NMWAG$,%a!<%k(B -$B%0%k!<%W$NL>A0$G(B ($B$H$3$m$G!"$=$l$i$O(B @samp{mail} $B$G;O$^$kI,MW$O$"$j$^$;(B -$B$s(B)$B!"Fs$D$a$NMWAG$,$=$l$>$l$N%a!<%k$N%X%C%@!<$+$i$=$l$,$I$N%0%k!<%W$KB0(B -$B$9$k$+$r7hDj$9$k@55,I=8=$G$9!#:G=i$NJ8;zNs$O!"(B@code{replace-match} $B$K$h$C(B -$B$F!"9gCW$7$?J8>O$+$i$NI{I=8=$rA^F~$9$k$?$a$K;H$o$l$k$h$&$J!"(B -@code{samp\\1} $B$NMM<0$r4^$`$+$b$7$l$^$;$s!#$?$H$($P(B: - -@lisp -("list.\\1" "From:.* \\(.*\\)-list@@majordomo.com") -@end lisp - -$BFsHVL\$NMWAG$O4X?t$G$"$k;v$b$G$-$^$9!#$=$N>l9g$O!"$=$l$OK!B'$N:G=i$NMWAG(B -$B$r0z?t$H$7$F!"%X%C%@!<$KHO0O$r69$a$F(B (narrowed to headers) $B8F$P$l$^$9!#(B -$B$=$l$O!"%a!<%k$,$=$N%0%k!<%W$KB0$9$k$H9M$($k$N$G$"$l$P!"(B@code{nil} $B$G$J(B -$B$$CM$r5"$9I,MW$,$"$j$^$9!#(B - -$B$3$l$i$N:G8e$O>o$KAm9gE*$J$b$N$G$"$k$Y$-$G!"B>$N@55,I=8=$K9gCW$7$J$$%a!<(B -$B%k$K9gCW$9$k$?$a$K!"$3$N@55,I=8=$O(B @emph{$B$$$D$b(B} @samp{}$B$G$"$k$Y$-$G$9!#(B -($B$3$l$i$NK!B'$OO"A[%j%9%H$N=i$a$+$i=*$o$j$^$G=gHV$K!$A$^(B -$B$9(B"$B!#Aj8_Ej9F$r;HMQ2DG=$K$7$F$$$k>l9g!"A4$F$N9gCW$7$?K!B'$,(B "$B>!$A$^$9(B"$B!#(B) - -$B$b$7$"$J$?<+?H$G$3$l$r$$$8$/$j$^$o$7$?$$$H$-$O!"$"$J$?$NA*$s$@4X?t$r$3$N(B -$BJQ?t$K@_Dj$9$k;v$,$G$-$^$9!#$3$N4X?t$OF~$C$FMh$?%a!<%k%a%C%;!<%8$N%X%C%@!<(B -$B$KHO0O$r69$a$i$l$?%P%C%U%!$G0z?t$J$7$G8F$P$l$^$9!#$3$N4X?t$O!"$=$l$,$3$N(B -$B%a!<%k%a%C%;!<%8$r1?$V$Y$-$G$"$k!"$H9M$($k%0%k!<%WL>$N%j%9%H$rJV$9$Y$-$G(B -$B$9!#(B - -$BA4$F$N%a!<%k%P%C%/%(%s%I$O!"F~$C$FMh$?IOK3$G=c?h$J%X%C%@!<$rMpK=$K07$C$F(B -$B$bNI$$;v$KCm0U$7$F$/$@$5$$!#$=$l$i$O$9$Y$F(B @code{Lines} $B%X%C%@!<$rDI2C$7(B -$B$^$9!#$$$/$D$+$O(B @code{X-Gnus-Group} $B%X%C%@!<$r2C$($^$9!#$?$$$F$$$N$b$N(B -$B$O(B Unix $B$N(B mbox $B$N(B @code{From} $B9T$r2?$+JL$NL>A0$KJQ$($^$9!#(B - -@vindex nnmail-crosspost -$B%a!<%k%P%C%/%(%s%I$O$9$Y$FAj8_Ej9F$N5!G=$rDs6!$7$F$$$^$9!#$$$/$D$+$N@55,(B -$BI=8=$,9gCW$9$k$H!"%a!<%k$OA4$F$N%0%k!<%W$K(B ``$BAj8_Ej9F(B'' $B$5$l$^$9!#(B -@code{nnmail-crosspost} $B$O$3$N5!G=$r;H$&$+$I$&$+$r;XDj$7$^$9!#$I$N5-;v$b(B -$BAm9g$N(B (@samp{}) $B%0%k!<%W$KAj8_Ej9F$5$l$J$$;v$KCm0U$7$F$/$@$5$$!#(B - -@vindex nnmail-crosspost-link-function -@cindex crosspost -@cindex links -@code{nnmh} $B$H(B @code{nnml} $B$OAj8_Ej9F$5$l$?5-;v$K%O!<%I%j%s%/(B (hardlink) -$B$r:n$k;v$K$h$C$FAj8_Ej9F$r9T$$$^$9!#$7$+$7!"A4$F$N%U%!%$%k%7%9%F%`$,%O!<(B -$B%I%j%s%/$N5!G=$rDs6!$7$F$$$k$o$1$G$O$"$j$^$;$s!#$b$7$"$J$?$,$=$N>l9g$KEv(B -$B$F$O$^$k$N$G$"$l$P!"(B -@code{nnmail-crosspost-link-function} $B$r(B @code{copy-file} $B$K@_Dj$7$F$/$@(B -$B$5$$!#(B($B$3$NJQ?t$O%G%#%U%)%k%H$G(B @code{add-name-to-file} $B$G$9!#(B) - -@kindex M-x nnmail-split-history -@kindex nnmail-split-history -$BA0$N%a!<%kJ,3d$,%a%C%;!<%8$r$I$3$KF~$l$?$+$r8+$?$$>l9g$O!"L?Na(B @kbd{M-x -nnmail-split-history} $B$r;H$&;v$,$G$-$^$9!#$3$l$+$i%9%W!<%k$7D>$=$&$H$9$k(B -$B%a%C%;!<%8$,$I$3$KF~$k$+$r8+$?$$>l9g$O!"(B -@code{gnus-summary-respool-trace} $B$H4XO"$9$kL?(B -$BNa(B (@pxref{Mail Group Commands}) $B$r;H$&;v$,$G$-$^$9!#(B - -Gnus $B$O$"$J$?$K<+J,<+?H$KD7$MJV$C$F$/$k$h$&$J2DG=@-$N$"$kA4$F$N5!2q$rDs(B -$B6!$7$^$9!#Nc$($P!"$"$J$?$N>e;J$+$i$/$kA4$F$N%a!<%k$r4^$s$@%0%k!<%W$r:n$C(B -$B$?$H$7$^$7$g$&!#$=$l$+$i!"6vH/E*$K$=$N%0%k!<%W$N9XFIe;J$+$i$NA4$F$N%a!<%k$rL$9XFI$N%0%k!<%W$KF~$l$^(B -$B$9$N$G!">e;J$,(B ''$B7nMKF|$^$G$K$=$NJs9p=q$r=`Hw$7$J$$$Hl9g$O!"(BPOP $B$d(B @sc{imap} $B$J(B -$B$I$G%a!<%k$r$O;HMQ$G(B -$B$-$^$;$s(B---$B%a!<%k$r0\F0$7$F$$$k$H$-$K%a!<%k%9%W!<%k$r%m%C%/$9$kJ}K!$,$"(B -$B$j$^$;$s!#(B - -$BE,@Z$J%5!<%P!<$r@_CV$9$k$3$H$,IT2DG=$J$i!"JQ$o$j$K(B ssh $B$r;H$&$3$H$,$G$-(B -$B$^$9!#(B - -@lisp -(setq mail-sources - '((file :prescript "ssh host bin/getmail >%t"))) -@end lisp - -@samp{getmail} $B%9%/%j%W%H$O0J2<$N$h$&$J$b$N$K$J$j$^$9(B: - -@example -#!/bin/sh -# getmail - move mail from spool to stdout -# flu@@iki.fi - -MOVEMAIL=/usr/lib/emacs/20.3/i386-redhat-linux/movemail -TMP=$HOME/Mail/tmp -rm -f $TMP; $MOVEMAIL $MAIL $TMP >/dev/null && cat $TMP -@end example - -$BL\E*$K9g$&$h$&$K;HMQ$7$?$$(B @samp{movemail} $B$K9g$o$;$F%9%/%j%W%H$r=q$-49(B -$B$($F$/$@$5$$!#(B - -@item directory -$B%G%#%l%/%H%j!A0$G$9!#=i4|CM$O(B @code{MAILHOST} $B4D6-JQ?t$+$i$G$J$1$l$P$J$j$^$;$s!#=i(B -$B4|CM$O(B @samp{pop3} $B$G$9!#%7%9%F%`$K$h$C$F$O(B @samp{"pop-3"} $B$H$7$J$1$l$P(B -$B$J$i$J$$$+$b$7$l$^$;$s!#(B - -@item :user -POP $B%5!<%P!<$KM?$($kMxMQ$G$9!#=i4|CM$O%m%0%$%sL>$G$9!#(B - -@item :password -POP $B%5!<%P!<$KM?$($k%Q%9%o!<%I$G$9!#;XDj$5$l$J$$>l9g$O!"MxMQA0$G$9!#$3$l$O>o$K$3$NJ8;zNs$K4^$^$l$F$$$J(B -$B$1$l$P$J$j$^$;$s!#(B - -@item s -$B%5!<%P!<$NL>A0$G$9!#(B - -@item P -$B%5!<%P!<$N%]!<%HHV9f$G$9!#(B - -@item u -$B;HMQ$9$kMxMQ$G$9!#(B - -@item p -$B;HMQ$9$k%Q%9%o!<%I$G$9!#(B -@end table - -$B$3$l$i$N;EMM$G;H$o$l$kCM$OBP1~$9$k%-!<%o!<%I$KM?$($?CM$+$iZJ}<0$r;H$&$+$r(B -$B7h$a$k$b$N$N$I$A$i$+$G$9!#=i4|@_Dj$O(B @code{password} $B$G$9!#(B -@end table - -@code{:program} $B$H(B @code{:function} $B%-!<%o!<%I$,;XDj$5$l$F$$$J$$$H!"(B -@code{pop3-movemail} $B$,;HMQ$5$l$^$9!#(B - -$B$3$l$O$$$/$D$+$NNc$G$9!#=i4|MxMQ$G!"=i4|(B POP $B%5!<%P!<$+$i$5$l$?%5!<%P!<$+$i;XL>$5$l$?MxMQ$l$N%U%!%$%k$,(B -$B@53N$K(B 1 $B%a!<%k$H$J$C$F$$$^$9!#(B - -$B%-!<%o!<%I(B: - -@table @code -@item :path -$B%a!<%k$,J]B8$5$l$k%G%#%l%/%H%j!<$N%Q%9$G$9!#=i4|CM$O4D6-JQ(B -$B?t(B @code{MAILDIR} $B$+$ie$G%a!<%k$rFI$`%W%m%H%3%k$H$7$F07$$$?$/$J$$$H$-$O!"(B -gnus $B$G$O(B POP $B%5!<%P!<$HF1MM$K07$&$3$H$,$G$-!"M?$($i$l$?(B IMAP $B%a!<%k%\%C(B -$B%/%9$+$i5-;v$r\$7$/$O(B @xref{IMAP} $B$r;2>H$7$F2<$5$$!#(B - -$B%-!<%o!<%I(B: - -@table @code -@item :server -IMAP $B%5!<%P!<$NL>A0!#=i4|CM$O4D6-JQ?t(B @code{MAILHOST} $B$+$iF@$^$9!#(B - -@item :port -IMAP $B%5!<%P!<$N%]!<%HHV9f!#IaDL$O=i4|CM$O(B @samp{143} $B$G!"(BSSL $B@\B3$K(B -$B$O(B @samp{993} $B$G$9!#(B - -@item :user -IMAP $B%5!<%P!<$KEO$9MxMQ$G$9!#=i4|CM$O%m%0%$%sL>$G$9!#(B - -@item :password -IMAP $B%5!<%P!<$KEO$9%Q%9%o!<%I$G$9!#;XDj$5$l$F$$$J$$$H$-$O!"MxMQu$G$O!"(B -@samp{kerberos4} $B$+(B @samp{ssl} $B$+=i4|CM$N(B @samp{network} $B$K$J$j$^$9!#(B - -@item :authentication -$B%5!<%P!<$G$NG'>Z$K$I$NG'>ZK!$r;H$&$+!#$3$l(B -$B$O(B @code{imap-authenticator-alist} $B$N%7%s%\%k$N0l$D$r@_Dj$7$^$9!#8=>u$G(B -$B$O!"(B@samp{kerberos4}, @samp{cram-md5}, @samp{anonymous} $B$+=i4|CM(B -$B$N(B @samp{login} $B$K$J$j$^$9!#(B - -@item :program -:stream $B$K(B `shell' $B$,@_Dj$5$l$F$$$k$H$-$O!"$3$NCM$,JQ(B -$B?t(B `imap-shell-program' $B$K3d$jEv$F$i$l$^$9!#$3$l$O(B @code{format} $B$U$&$N(B -$BJ8;zNs(B ($B$^$?$OJ8;zNs$N%j%9%H(B) $B$G$J$1$l$P$J$j$^$;$s!#Nc$r<($7$^$7$g$&!#(B - -@example -ssh %s imapd -@end example - -$BM-8z$J(B format $B;X<(;R$O0J2<$NDL$j$G$9!#(B - -@table @samp -@item s -$B%5!<%P!<$NL>A0!#(B - -@item l -`imap-default-user' $B$G@_Dj$5$l$?%f!<%6L>!#(B - -@item p -$B%5!<%P!<$N%]!<%HHV9f!#(B -@end table - -$B$3$l$i$N;XDj$K;H$o$l$kCM$O!"BP1~$9$k%-!<%o!<%I$KM?$($?CM$+$iA0!#=i4|CM$O(B @samp{INBOX} $B$G!"$3$l$OIa(B -$BDL$OF~$C$F$/$k%a!<%k$rC5n$N0u$rIU$1$^$9$,!"B>$K(B @samp{\Seen} $B$G$OC1$K4{FI$N0u$rIU$1$^$9!#(B -$B$3$l$i$O:G$b$"$j$=$&$JFs$D$NA*Br$G$9$,!"B>$N0u$b(B RFC2060 ,A'(B2.3.2 $B$GDj5A$5(B -$B$l$F$$$^$9!#(B - -@item :dontexpunge -@code{nil} $B$G$J$+$C$?$i!"5-;v$rC5n$N0u$,IU$$$F$$(B -$B$F$b:o=|$7$^$;$s!#(B -@end table - -IMAP $B%a!<%k%=!<%9$NNc(B: - -@lisp -(imap :server "mail.mycorp.com" - :stream kerberos4 - :fetchflag "\\Seen") -@end lisp - -@item webmail -www.hotmail.com, webmail.netscape.com, www.netaddress.com, -www.my-deja.com $B$J$I$N%&%'%V%a!<%k%5!<%P!<$+$i%a!<%k$rl9g(B -$B$O(B "one-line-cookie" $B%Q%C%A$rEv$F$kI,MW$,$"$j$^$9!#(B - -$B7Y9p(B: $B%a!<%k$,<:$o$l$k$+$b$7$l$^$;$s!#L5J]>Z$G$9!#(B - -$B%-!<%o!<%I(B: - -@table @code -@item :subtype -$B%&%'%V%a!<%k%5!<%P!<$N7?$G$9!#=i4|CM$O(B @code{hotmail} $B$G$9!#B>$N8uJd(B -$B$O(B @code{netscape}, @code{netaddress}, @code{my-deja} $B$G$9!#(B - -@item :user -$B%&%'%V%a!<%k%5!<%P!<$NMxMQ$G$9!#=i4|CM$O%m%0%$%sL>$G$9!#(B - -@item :password -$B%&%'%V%a!<%k%5!<%P!<$N%Q%9%o!<%I$G$9!#;XDj$7$J$$>l9g$O!"MxMQl9g$KJXMx$G$9!#(B -@end table -@end table - -@subsubsection Function Interface - -$B>e5-$N$$$/$D$+$N%-!<%o!<%I$O!"$l$N%-!<%o!<%I(B @code{:foo} $B$NCM$H$7$F(B Lisp - $BJQ?t(B @code{foo} $B$,;H$o$l$^$9!#Nc$($P!"0J2<$N%a!<%k%=!<%9$N@_DjNc$K$D$$(B -$B$F9M$($F$_$F2<$5$$!#(B - -@lisp -(setq mail-sources '((pop :user "jrl" - :server "pophost" :function fetchfunc))) -@end lisp - -$B4X?t(B @code{fetchfunc} $B$,$l$N7?$N%a!<%k%=!<%9$N$?$a$N%-!<%o!<%I$N%j%9%H$K$D$$$F$O!">e5-$r;2(B -$B>H$7$F2<$5$$!#(B - -@node Mail Source Customization -@subsubsection $B%a!<%k%=!<%9$N%+%9%?%^%$%:(B - -$B0J2<$O%a!<%k$Nl=j$G$9!#=i4|CM(B -$B$O(B @file{~/.emacs-mail-crash-box} $B$G$9!#(B - -@item mail-source-delete-incoming -@vindex mail-source-delete-incoming -@code{nil} $B$G$J$1$l$P!"F~$C$FMh$?%U%!%$%k$O!"$=$l$r=hM}$7$?8e$K>C5n$5$l(B -$B$^$9!#(B - -@item mail-source-directory -@vindex mail-source-directory -$B%U%!%$%k$,(B ($B$b$7$"$l$P(B) $BJ]B8$5$l$k%G%#%l%/%H%j!<$G$9!#=i4|CM(B -$B$O(B @file{~/Mail/} $B$G$9!#8=;~E@$G$O!"$3$l$,;H$o$l$kM#0l$N$b$N$OA0$NJQ?t(B -$B$,(B @code{nil} $B$G$"$C$?>l9g!"F~$C$F$-$?%U%!%$%k$,J]B8$5$l$k>l=j$N;XDj$G$9!#(B - -@item mail-source-incoming-file-prefix -@vindex mail-source-incoming-file-prefix -$BF~$C$F$-$?%a!<%k$rJ]B8$9$k%U%!%$%k$N%W%l%U%#%C%/%9$G$9!#=i4|CM(B -$B$O(B @file{Incoming} $B$G!"$3$N>l9g%U%!%$%k(B -$B$O(B @file{Incoming30630D_} $B$d(B @file{Incoming298602ZD} $B$N$h$&$K$J$j$^$9!#(B -@code{mail-source-delete-incoming} $B$,(B @code{nil} $B$N>l9g$@$1$G$9$,!#(B - -@item mail-source-default-file-modes -@vindex mail-source-default-file-modes -$BA4$F$N?7$7$$%a!<%k%U%!%$%k$O$3$N%U%!%$%k%b!<%I$K$J$j$^$9!#=i4|CM(B -$B$O(B 384 $B$G$9!#(B -@end table - -@node Fetching Mail -@subsubsection $B%a!<%k$NJ}$+$i%a!<%k$re$2(B -$B$F!"%[!<%`%G%#%l%/%H%j!<$KJ|$jEj$2$^$9!#$"$J$?$,%a!<%k%P%C%/%(%s%I$r;H$C(B -$B$F$$$J$$>l9g$O!"(Bgnus $B$O0lDL$b%a!<%k$r0\F0$7$^$;$s(B---$B:G=i$KKbK!$N8F$S=P$7(B -$B$r$?$/$5$s$7$J$1$l$P$J$j$^$;$s!#$^$:8^3Q7A$rIA$-!"O9?$$K2P$rIU$1!";3MS$r(B -$B@8$1lS$H$7$FJ{$2=*$($?8e$G!"(Bgnus $B$,$"$J$?$N%a!<%k$r0\F0$7$F$bK\Ev$K$"$^(B -$B$j6C$$$F$O$$$1$^$;$s!#(B - -@node Mail Backend Variables -@subsection $B%a!<%k%P%C%/%(%s%IJQ?t(B - -$B$3$l$i$NJQ?t$O(B ($B$?$$$F$$$N>l9g(B) $BA4$F$N0c$C$?%a!<%k%P%C%/%(%s%I$K4XO"$7$^(B -$B$9!#(B - -@table @code -@vindex nnmail-read-incoming-hook -@item nnmail-read-incoming-hook -$B%a!<%k%P%C%/%(%s%I$O?7$7$$%a!<%k$rFI$_9~$s$@8e$K$3$N%U%C%/$r8F$S$^$9!#$b(B -$B$7$=$&$7$?$$$H;W$&$J$i!"$3$N%U%C%/$r%a!<%k4F;k%W%m%0%i%`$KCN$i$;$k$?$a$K(B -$B;H$&;v$,$G$-$^$9!#(B - -@vindex nnmail-split-hook -@item nnmail-split-hook -@findex article-decode-encoded-words -@findex RFC1522 decoding -@findex RFC2047 decoding -$B$=$l$>$l$N%a%C%;!<%8$,$=$N%X%C%@!<$K4p$E$$$FJ,3d$,$J$5$l$kD>A0$K$=$l$,J](B -$BB8$5$l$F$$$k%P%C%U%!$GC5n$5$l!"%P%C%U%!$G9T$o$l$?JQ99$O$I$N%U%!%$%k$K$b8=$l$^$;(B -$B$s!#(B@code{gnus-article-decode-rfc1522} $B$,$3$N%U%C%/$K2C$($k;v$,E,@Z$J4X(B -$B?t$N0l$D$G$9!#(B - -@vindex nnmail-pre-get-new-mail-hook -@vindex nnmail-post-get-new-mail-hook -@item nnmail-pre-get-new-mail-hook -@itemx nnmail-post-get-new-mail-hook -$B$3$l$i$OF~$C$F$/$k%a!<%k$r07$&$H$-$KA0$K(B -$B8F$P$l$^$9(B) $B$H(B @code{nnmail-post-get-new-mail-hook} ($B$3$l$O%a!<%k$N07$$(B -$B$,=*$o$C$?$H$-$K8F$P$l$^$9(B) $B$G$9!#$H%G%#%l%/%H%j!<(B -$BL>$r;H$$$^$9!#(B@samp{mail.misc} $B$N$h$&$J%0%k!<%WL>$O(B @file{mail.misc} $B$H(B -$B$$$&%G%#%l%/%H%j!<(B (@code{nnml} $B%P%C%/%(%s%I$,;H$o$l$F$$$k$H$_$J$9$H(B) $B$+(B -$B%U%!%$%k(B (@code{nnfolder} $B%P%C%/%(%s%I$,;H$o$l$F$$$k$H$_$J$9$H(B) $B$H$$$&7k(B -$B2L$K$J$j$^$9!#$b$7$=$l$,(B @code{nil} $B$G$"$k$J$i!"F1$8%0%k!<%W(B -$B$O(B @file{mail/misc} $B$H$$$&7k2L$K$J$j$^$9!#(B - -@item nnmail-delete-file-function -@vindex nnmail-delete-file-function -@findex delete-file -$B%U%!%$%k$r>C5n$9$k$?$a$K8F$P$l$k4X?t$G$9!#=i4|CM(B -$B$O(B @code{delete-file} $B$G$9!#(B - -@item nnmail-cache-accepted-message-ids -@vindex nnmail-cache-accepted-message-ids -@code{nil} $B$G$J$$$H!"%P%C%/%(%s%I$KF~$C$FMh$?5-;v(B ($BNc$($P!"(B@code{Gcc} $B$K(B -$B$h$C$F(B) $B$N(B @code{Message-ID} $B$r%a!<%k=EJ#H/8+%U%!%$%k$KF~$l$^$9!#%G%#%U%)(B -$B%k%H$O(B @code{nil} $B$G$9!#(B -@end table - -@node Fancy Mail Splitting -@subsection $BFC5i%a!<%kJ,3d(B -@cindex mail splitting -@cindex fancy mail splitting - -@vindex nnmail-split-fancy -@findex nnmail-split-fancy -$BHf3SE*C1=c$JI8=`$N%a!<%kJ,3d;XDj$NJ}K!$G$O$"$J$?$NK>$`;v$,$G$-$J$$>l9g!"(B -@code{nnmail-split-methods} $B$r(B @code{nnmail-split-fancy} $B$K@_Dj$9$k;v$,(B -$B$G$-$^$9!#$=$l$+$iJQ?t(B @code{nnmail-split-fancy} $B$GM7$V;v$,$G$-$^$9!#(B - -$B$^$:$3$NJQ?t$NCM$NNc$r8+$F$_$^$7$g$&(B: - -@lisp -;; $B%a!<%k%G!<%b%s(B (mailer deamon) $B$OIaDL$N%0%k!<%W$K$OAj8_Ej9F$5$l$^$;(B -;; $B$s!#7Y9p$OK\Ev$N%(%i!<$H$O0c$C$?%0%k!<%W$KF~$l$i$l$^$9!#(B -(| ("from" mail (| ("subject" "warn.*" "mail.warning") - "mail.misc")) - ;; $B%(%i!<$G$J$$%a%C%;!<%8$OA4$F$N4XO"$7$?%0%k!<%W$KAj8_Ej9F$5$l$^$9(B - ;; $B$,!"(B(ding) $B%j%9%H$HB>$N(B (ding) $B4XO"$N%a!<%k$N$?$a$N%0%k!<%W$K$O(B - ;; $BAj8_Ej9F$7$^$;$s!#(B - (& (| (any "ding@@ifi\\.uio\\.no" "ding.list" "ding.list") - ("subject "ding" "ding.misc")) - ;; $BB>$N%a!<%j%s%0%j%9%H(B... - (any "procmail@@informatik\\.rwth-aachen\\.de" "procmail.list") - (any "SmartList@@informatik\\.rwth-aachen\\.de" "SmartList.list") - ;; $B0J2<$N$I$A$i$N%a!<%j%s%0%j%9%H$bF1$8@\F,<-$J$N$G!"(Bbugs- - ;; $B$@$1$KEj9F$5$l$?$b$N$,(B mypkg.list $B$KAj8_Ej9F$5$l$J$$$h(B - ;; $B$&$K$7$F$$$^$9!#$7$+$7K\Ev$KAj8_Ej9F$5$l$?5-;v$rAj8_Ej9F(B - ;; $B$9$k$3$H$O5v$7$F$$$^$9!#(B - (any "bugs-mypackage@@somewhere" "mypkg.bugs") - (any "mypackage@@somewhere\" - "bugs-mypackage" "mypkg.list") - ;; $B?M!9(B... - (any "larsi@@ifi\\.uio\\.no" "people.Lars_Magne_Ingebrigtsen")) - ;; $B9gCW$7$J$+$C$?%a!<%k$OA4$F$rJa$^$($k%0%k!<%W$X9T$-$^$9!#(B - "misc.misc") -@end lisp - -$B$3$NJQ?t$O(B @dfn{$BJ,3d(B} $B$NMM<0$K$J$C$F$$$^$9!#J,3d$O(B ($B$"$k$$$O(B) $B$=$l$>$l$N(B -$BJ,3d$,B>$NJ,3d$r4^$`:F5"E*9=B$$G$9!#$3$l$O;HMQ2DG=$J8^$D$NJ,3d9=J8$G$9(B: - -@enumerate - -@item -@samp{group}: $B$b$7J,3d$,J8;zNs$G$"$k$H!"$=$l$O%0%k!<%WL>$H$7$F$_$J$5$l$^(B -$B$9!#IaDL$N@55,I=8=$N9gCW$,$J$5$l$^$9!#Nc$O2<$NJ}$r8+$F2<$5$$!#(B - -@item -@code{(@var{field} @var{value} @code{[-} @var{restrict} @code{[@dots{}]}@code{]} @var{split})}: -$B$b$7J,3d$,%j%9%H$G!":G=i$NMWAG$,J8;zNs$G$"$j!"%X%C%@!<(B @var{field} ($B@55,(B -$BI=8=(B) $B$,(B @var{value} ($B$3$l$b@55,I=8=(B) $B$r4^$s$G$$$k>l9g!"%a%C%;!<%8(B -$B$r(B @var{split} $B$G;XDj$5$l$?$H$3$m$KC_@Q$7$^$9!#(B@var{restrict} ($B$^$?B>$N(B -$B@55,I=8=(B) $B$,(B @var{field} $B$N8e$G!"9gCW$7$?(B @var{value} $B$N:G8e$NA0$N$$$/$D(B -$B$+$NJ8;zNs$K9gCW$7$?$i!"(B@var{split} $B$OL5;k$5$l$^$9!#(B@var{restrict} $B$NJD(B -$BJq$N$I$l$b$,9gCW$7$J$1$l$P(B @var{split} $B$,K@(B) $B$G$"$k$H!"$=$l$>$l$N(B @var{split} $B$r$=$N$&$A$N0l$D$,(B -$B9gCW$9$k$^$Ge$N%0%k!<(B -$B%W$KC_@Q$5$l$?$H$-$K(B ``$B9gCW$7$?(B'' $B$H$7$^$9!#(B - -@item -@code{(& @var{split}@dots{})}: $BJ,3d$,%j%9%H$G!":G=i$NMWAG$,(B @code{&} $B$G(B -$B$"$k$H!"%j%9%H$NA4$F$N(B @var{split} ($BJ#?t(B) $B$ro$KCm0U$7$F;H$C$F2<$5$$!#(B - -@item -@code{(: @var{function} @var{arg1} @var{arg2} @dots{})}: $B$b$7J,3d$,%j%9(B -$B%H$G!":G=i$NMWAG$,(B @code{:} $B$G$"$k$H!"FsHVL\$NMWAG$,(B @var{args} $B$r0z?t$H(B -$B$7$F4X?t$H$7$F8F$P$l$^$9!#4X?t$O(B @var{split} $B$rJV$9$Y$-$G$9!#(B - -@cindex body split -$BNc$($P0J2<$N4X?t$O!"5-;v$N%\%G%#$K4p$E$$$?J,3d$K;H$($k$G$7$g$&(B: - -@lisp -(defun split-on-body () - (save-excursion - (set-buffer " *nnmail incoming*") - (goto-char (point-min)) - (when (re-search-forward "Some.*string" nil t) - "string.group"))) -@end lisp - -@code{:} $B$,;H$o$l$k$H$-!"%P%C%U%!(B @samp{" *nnmail incoming*"} $B$O%a%C%;!<(B -$B%8$NItJ,$K69$a$i$l$^$9!#(B - -@item -@code{(! @var{func} @var{split})}: $BJ,3d$,%j%9%H$G!":G=i$NMWAG(B -$B$,(B @code{!} $B$G$"$k$H(B @var{split} $B$,$K9gCW$7$J$1$l$P$J$j$^(B -$B$;$s!#(B@var{value} $B$O4pAC%b!<%I(B (fundamental mode) $B9=J8%F!<%V%k(B (syntax -table) $B$K=>$C$F40A4$K9gCW$7$J$1$l$P$J$j$^$;$s!#@55,I=8=$G%U%#!<%k%IL>$+(B -$B8l$NItJ,$K9gCW$5$;$k$?$a$K(B @code{.*} $B$r;H$&;v$,$G$-$^$9!#8@$$49$($l$P!"(B -$BA4$F$N(B @var{value} $B$O(B @samp{\<} $B$H(B @samp{\>} $B$NBP$G0O$^$l$^$9!#(B - -@vindex nnmail-split-abbrev-alist -@var{field} $B$H(B @var{value} $B$O(B lisp $B%7%s%\%k(B (symbol) $B$G$"$k;v$b$G$-!"$=(B -$B$N>l9g$O$=$l$i$O(B @code{nnmail-split-abbrev-alist} $B$G;XDj$5$l$F$$$k$h$&$K(B -$BE83+$5$l$^$9!#$3$l$O%;%k$N(B @code{car} $B$,%-!<$r4^$s$G$$$F!"(B@code{cdr} $B$,(B -$B4XO"IU$1$i$l$?CM$r;}$C$F$$$k%3%s%9%;%k(B (cons cell) $B$NO"A[%j%9%H$G$9!#(B - -@vindex nnmail-split-fancy-syntax-table -@code{nnmail-split-fancy-syntax-table} $B$,$3$l$i$NA4$F$NJ,3d$,pJs$K4p$E$$$F!"(Bgnus $B$KF0E*$K%0%k!<%W$r:n$i$;$?$$$N(B -$B$G$"$l$P(B ($BNc$($P!"%0%k!<%WL>$G(B @code{replace-match} $B$N$h$&$JBeMQ$r$9$k(B)$B!"(B -$Be;J$+$i8D?M08$F(B -$B$N%a!<%k$,FO$$$?$H$7$^$9!#<+J,$,7H$C$F$$$k%W%m%8%'%/%H$H$OJL$NOC$G$9!#$1(B -$B$l$I!VB>$N%a!<%k$H6hJL$G$-$k$h$&$K$3$l$3$l$3$&$$$&8@MU$rI=Bj$K=q$$$F$/$@(B -$B$5$$!W$H>e;J$K8~$+$C$F;X?^$9$k$o$1$K$O$$$-$^$;$s$+$i!"7k6I<+J,$Nl9g!"(BGnus $B$O8+$D$1$?A45-(B -$B;v$N%a%C%;!<%8(B ID $B$r(B $BJQ?t(B @code{nnmail-message-id-cache-file} $B$,;XDj$9$k(B -$B%U%!%$%k$K5-O?$7$^$9!#$3$N$H$-!"$=$l$>$l$N5-;v$,B8:_$9$k%0%k!<%W$NL>A0$r(B -$BJ;5-$7$^$9(B ($B$?$@$7%a!<%k$N>l9g$@$1!"$5$b$J$1$l$P%0%k!<%WL>$OD4$Y$^$;$s(B)$B!#(B -$B$5$F!"$$$h$$$h%a!<%k$N?6$jJ,$1$,;O$^$k$H!"4X?t(B -@code{nnmail-split-fancy-with-parent} $B$O!"BP>]$H$J$k3F5-;v$N(B References -($B$H(B In-Reply-To) $B%X%C%@$rD4$Y!"(B@code{nnmail-message-id-cache-file} $B$K;X(B -$BDj$5$l$F$$$k%U%!%$%k$K$=$l$i$N%a%C%;!<%8(B ID $B$,$"$k$+$I$&$+D4$Y$^$9!#?F5-(B -$B;v$,8+$D$+$k$H!"$=$N%0%k!<%WL>$,@55,I=(B -$B8=(B @code{nnmail-split-fancy-with-parent-ignore-groups} $B$K%^%C%A$7$J$1$l(B -$B$P!"$3$N4X?t$OBP1~$9$k%0%k!<%WL>$rJV$9$o$1$G$9!#$3$3$G!"JQ(B -$B?t(B @code{nnmail-message-id-cache-length} $B$NCM$r4{DjCM$h$j$b4v$i$+Bg$-$J(B -$BCM$K@_Dj$9$k$3$H$r$*4+$a$7$^$9!#$=$&$9$k$H!":#D4$Y$i$l$?%a%C%;!<%8(B ID $BC#(B -$B$O:#$7$P$i$/%-%c%C%7%e$NCf$KB8B3$G$-$^$9(B (5000 $B$K@_Dj$9$k$H%-%c%C%7%e%U%!(B -$B%$%k$NBg$-$5$O$@$$$?$$(B 300 $B%-%m%P%$%H$0$i$$$K$J$k$_$?$$$G$9(B)$B!#(B -@vindex nnmail-cache-accepted-message-ids -$B$5$i$K!"JQ?t(B @code{nnmail-cache-accepted-message-ids} $B$NCM$r(B -$BHs(B @code{nil} $B$K@_Dj$9$l$P!"(Bgnus $B$O0\F0$5$l$?5-;v$N%a%C%;!<%8(B ID $B$r$b5-(B -$BO?$9$k$N$G!"%U%)%m!<%"%C%W5-;v$O?F5-;v$N0\F0@h$HF1$8%0%k!<%W$KF~$k$h$&$K(B -$B$J$j$^$9!#(B - -@node Group Mail Splitting -@subsection $B%0%k!<%W%a!<%kJ,3d(B -@cindex mail splitting -@cindex group mail splitting - -@findex gnus-group-split -$B$?!<$/$5$s$N%a!<%j%s%0%j%9%H$r9XFI$7$F$$$k$1$l$I!"J}$b$7$/$O$I$A$i$+$r@_Dj$7(B -$B$F(B @code{nnmail-split-methods} $B$r(B @code{gnus-group-split} $B$K@_Dj$9$k$@$1(B -$B$G$9!#J,3d4X?t$OA4$F$N%0%k!<%W$G$3$l$i$N%Q%i%a!<%?$rAv::$7!"$=$l$K=>$C$F(B -$BJ,3d$7$^$9!#$9$J$o$A!"%a!<%k%0%k!<%W$N%Q%i%a!<(B -$B%?(B @var{to-list} $B$+(B @var{to-address} $B$G;XDj$5$l$?%"%I%l%9$+$iEj9F$5$l$?(B -$B$b$N$+!"$=$N%"%I%l%9$XEj9F$5$l$?%a%C%;!<%8$,$=$N%0%k!<%W$KJ]B8$5$l$^$9!#(B - -$B$H$-$K$O!"%a!<%j%s%0%j%9%H$K$OJ#?t$N%"%I%l%9$,$"$j!"%a!<%kJ,3d$K$=$l$iA4(B -$B$F$rG'<1$5$;$?$$$H;W$&$H$-$,$"$k$+$b$7$l$^$;$s(B: @var{extra-aliases} $B%0%k!<(B -$B%W%Q%i%a!<%?$rDI2C$N%"%I%l%9$N%j%9%H$K@_Dj$9$k$@$1$G=*$j$G$9!#@55,I=8=$r(B -$B;H$$$?$1$l$P!"(B@var{split-regexp} $B$r@_Dj$7$F$/$@$5$$!#(B - -$B$3$l$i$NA4$F$N%0%k!<%W$N%Q%i%a!<%?$O!"(B@code{nnmail-split-fancy} $BJ,3d$r:n(B -$B@.$9$k$?$a$K;HMQ$5$l!"$=$l$O(B @var{field} $B$,(B @samp{any} $B$G!"(B -@var{value} $B$,(B @var{to-list}, @var{to-address}, @var{extra-aliases} $B$NA4(B -$B$F!"(B@var{split-regexp} $B$NA4$F$N9gCW$K9gCW$9$kC1FH$N@55,I=8=!"(B -@var{split} $B$,%0%k!<%W$NL>A0$K$J$j$^$9!#(B@var{restrict} $B$b;HMQ$G$-$^$9(B: -@var{split-exclude} $B%Q%i%a!<%?$r@55,I=8=$N%j%9%H$K@_Dj$9$k$@$1$G$9!#(B - -$B$3$l$i$NA4$F$N%Q%i%a!<%?$r;H$C$F@5$7$$J,3d$,@8@.$5$l$J$$$H$-$d!"2?$+0c$C(B -$B$?$b$N$,I,MW$J$H$-$O!"%Q%i%a!<(B -$B%?(B @var{split-spec} $B$r(B @code{nnmail-split-fancy} $BJ,3d$K@_Dj$9$k$3$H$,$G(B -$B$-$^$9!#$3$N>l9g$O!"B>$NA0$K=q$$$?A4$F$N%Q%i%a!<%?(B -$B$O(B @code{gnus-group-split} $B$KL5;k$5$l$^$9!#FC$K!"(B -@var{split-spec} $B$O(B @code{nil} $B$K@_Dj$9$k$3$H$,$G$-!"$=$N>l9g$O%0%k!<%W(B -$B$O(B @code{gnus-group-split} $B$KL5;k$5$l$^$9!#(B - -@vindex gnus-group-split-default-catch-all-group -@code{gnus-group-split} $B$O$=$l$>$l$N%0%k!<%W$K0l$D$NJ,3d$r4^$`C10l(B -$B$N(B @code{&} $BFC5iJ,3d$rDj5A$9$k$3$H$G9gCW$9$kA4$F$N%0%k!<%W$KAj8_Ej9F$r$7(B -$B$^$9!#%a%C%;!<%8$,$I$NJ,3d$K$b9gCW$7$J$1$l$P!"$I$l$+$N%0%k!<%W(B -$B$G(B @var{split-spec} $B$,(B @code{catch-all} $B$K@_Dj$5$l$F$$$J$$>l9g(B -$B$O(B @code{gnus-group-split-default-catch-all-group} $B$G;XDj$5$l$F$$$k%0%k!<(B -$B%W$KJ]B8$5$l$^$9!#(B@var{split-spec} $B$,(B @code{catch-all} $B$K@_Dj$5$l$F$$$k(B -$B%0%k!<%W$,$"$k>l9g$O!"$=$N%0%k!<%W$,A4$F$rJa3M$9$k%0%k!<%W$H$7$F;HMQ$5$l(B -$B$^$9!#$3$NJQ?t$O$7$P$7$PC1$K%0%k!<%W$r;XDj$9$k$?$a$K;H$o$l$^$9$,!"G$0U$N(B -$BJ#;($JFC5iJ,3d$r$b@_Dj$9$k(B ($B7k6I!"%0%k!<%WL>$OFC5iJ,3d$J$N$G$9(B) $B$N$G!"8D(B -$B?M$N%a!<%k%U%)%k%@!<$N$I$N%a!<%j%s%0%j%9%H$K$bEv$F$O$^$i$J$$%a!<%k$rJ,3d(B -$B$9$k$N$KJXMx$G$7$g$&!#$J$*$3$NFC5iJ,3d$O!"(B@code{|} $BJ,3d%j%9%H$N:G8e$NMW(B -$BAG(B - $B%0%k!<%W%Q%i%a!<%?$+$iCj=P$5$l$?5,B'$r;}$D(B @code{&} $BJ,3d$r4^$`(B - $B$H(B -$B$7$FDI2C$5$l$k$3$H$KCm0U$7$F$/$@$5$$!#(B - -$B$=$m$=$mNc$r=P$9$Y$-$G$7$g$&!#0J2<$N%0%k!<%W%Q%i%a!<%?$,Dj5A$5$l$F$$$k$H(B -$B$7$^$9(B: - -@example -nnml:mail.bar: -((to-address . "bar@@femail.com") - (split-regexp . ".*@@femail\\.com")) -nnml:mail.foo: -((to-list . "foo@@nowhere.gov") - (extra-aliases "foo@@localhost" "foo-redist@@home") - (split-exclude "bugs-foo" "rambling-foo") - (admin-address . "foo-request@@nowhere.gov")) -nnml:mail.others: -((split-spec . catch-all)) -@end example - -@code{nnmail-split-methods} $B$r(B @code{gnus-group-split} $B$K@_Dj$9$k$H!"(B -@code{nnmail-split-fancy} $B$,A*Br$5$l$F!"JQ(B -$B?t(B @code{nnmail-split-fancy} $B$,0J2<$N$h$&$K@_Dj$5$l$F$$$k$+$N$h$&$K?6Iq(B -$B$$$^$9(B: - -@lisp -(| (& (any "\\(bar@@femail\\.com\\|.*@@femail\\.com\\)" "mail.bar") - (any "\\(foo@@nowhere\\.gov\\|foo@@localhost\\|foo-redist@@home\\)" - - "bugs-foo" - "rambling-foo" "mail.foo")) - "mail.others") -@end lisp - -@findex gnus-group-split-fancy -$BA4$F$N%a!<%k%0%k!<%W$G%0%k!<%WJ,3d$r;HMQ$7$?$/$O$J$$$H$-$O!"(B -@code{nnmail-split-fancy} $BJ,3d$r$N%j%9%H$+@55,I=8=$G$9!#(B@var{no-crosspost} $B$OAj8_Ej9F$r;HMQ6X;_$K$k$?(B -$B$a$K;H$&$3$H$,$G$-$^$9!#$=$N>l9g!"C10l$N(B @code{|} $BJ,3d$,=PNO$5$l$^$9!#(B -@var{catch-all} $B$O(B @var{gnus-group-split-default-catch-all-group} $B$N$h$&(B -$B$K!":G8e$Nl9g!"%0%k!<%W(B -$B$K(B @var{split-spec} $B$,(B @code{catch-all} $B$K@_Dj$5$l$F$$$k$b$N$,$"$k$H!"$3(B -$B$N%0%k!<%W$,(B @var{catch-all} $B0z?t$r>e=q$-$7$^$9!#(B - -@findex gnus-group-split-setup -$BIT1?$J$3$H$K!"A4$F$N%0%k%W$H%Q%i%a!<%?$rAv::$9$k$3$H$OHs>o$KCY$$$G$9!#FC(B -$B$KA4$F$N%a%C%;!<%8$KBP$7$F$J$5$l$k$3$H$r9M$($k$H!#$1$l$I$b!"@dK>$7$J$$(B -$B$G(B! $B4X?t(B @code{gnus-group-split-setup} $B$,(B @code{gnus-group-split} $B$r$h$j(B -$B$:$C$H8zN(E*$JJ}K!$G;H$&$3$H$,$G$-$^$9!#$=$l(B -$B$O(B @code{nnmail-split-methods} $B$r(B @code{nnmail-split-fancy} $B$K@_Dj$7!"(B -@code{nnmail-split-fancy} $B$r(B @code{gnus-group-split-fancy} $B$G@8@.$5$l$?(B -$BJ,3d$K@_Dj$7$^$9!#$3$&$7$F$I$s$J$KJ,3d$9$k%a%C%;!<%8$,$?$/$5$s$"$C$F$b!"(B -$B%0%k!<%W%Q%i%a!<%?$O0lEY$@$1Av::$5$l$^$9!#(B - -@findex gnus-group-split-update -$B$7$+$7!"%0%k!<%W%Q%i%a!<%?$rJQ99$9$k$H!"(B@code{nnmail-split-fancy} $B$rJN,$7$J$$>l9g$O(B ($B$=$l$O%*%W%7%g%s(B -$B$G(B @code{nil} $B$HEy(B -$B2A(B)$B!"(B@code{gnus-group-split-default-catch-all-group} $B$O$=$NCM$K@_Dj$5$l(B -$B$^$9!#(B - -@vindex gnus-group-split-updated-hook -@code{nnmail-split-fancy} $B$,(B @code{gnus-group-split-update} $B$G@_Dj$5$l$?(B -$B8e$K!"JQ99$7$?$$$H$-$N$?$a$K!"$3$N4X?t(B -$B$O(B @code{gnus-group-split-update-hook} $B$r=*N;$9$kD>A0$Kc$b$J$/J*;v$,>efIW$J$h$&$G$"$l$P!"(Bmbox $B%U%!%$%k$r>C$9;v(B -$B$r9M$($k$+$b$7$l$^$;$s$,!";d$OA4$F$N%a!<%k$,$"$k$Y$-$H$3$m$KG<$^$C$F$$$k(B -$B$N$r40A4$K3NG'$9$k$^$G$O!"$=$&$O$7$^$;$s!#(B - -@node Expiring Mail -@subsection $B%a!<%k$N4|8B@Z$l>C5n(B -@cindex article expiry - -$BEAE}E*$J%a!<%k%j!<%@!<$O!"2?$+!"4{FI$N0u$rIU$1$k$H5-;v$r:o=|$9$k798~$,$"(B -$B$j$^$9!#(BGnus $B$O%a!<%k$rFI$`;v$KBP$7$F!"4pK\E*$KA4$/0c$C$?J}K!$rC$98"NO$,$"(B -$B$k$H$O9M$($^$;$s!#%a!<%k%0%k!<%W$KF~$C$F!"5-;v$K(B ``$B4{FI(B'' $B$N0u$rIU$1$?$j!"(B -$BB>$NN.57$G@Z$C$?$j$7$F$b!"%a!<%k5-;v$O$^$@%7%9%F%`$KB8:_$7$F$$$^$9!#7+$j(B -$BJV$7$^$9(B: gnus $B$O$"$J$?$N8E$$!"4{FI%a!<%k$r>C5n$7$^$;$s!#$b$A$m$s!"$"$J(B -$B$?$,$=$&$7$m$H?R$M$J$$8B$j$NOC$G$9$,!#(B - -Gnus $B$KK>$^$7$/$J$$%a!<%k$r:o=|$5$;$k$?$a$K$O!"5-;v$r(B @dfn{$B4|8B@Z$l>C5n(B -$B2DG=(B} (expirable) $B$H$7$F0u$rIU$1$J$1$l$P$J$j$^$;$s!#$7$+$7$J$,$i!"$3$l$O(B -$B5-;v$,B(:B$K>C$(5n$k$H$$$&;v$G$O$"$j$^$;$s!#0lHLE*$K!"%a!<%k5-;v$Ol9g$K%7%9%F%`$K$h$C$F:o=|$5$l$^$9(B 1) $B4|8B@Z$l>C5n2DG=$N0u$rIU$1$i$l(B -$B$k(B 2) $B0l=54V0J>e7P$C$?5-;v$G$"$k!#$b$75-;v$r4|8B@Z$l>C5n2DG=$K$7$J$1$l$P!"(B -$B$=$l$OCO9v$,E`$j$D$/$^$G%7%9%F%`$K;D$j$D$E$1$^$9!#$3$l$O$b$&0lEY6/D4IU$-(B -$B$G7+$jJV$5$l$k$KB-$k$b$N$G$9(B: ``$B$b$7(B'' $B$"$J$?$,5-;v(B -$B$r(B ``$B4|8B@Z$l>C5n2DG=(B'' $B$G$"$k$H(B ``$B$7$J$$(B'' $B$J$i!"(Bgnus $B$O(B ``$B7h$7$F(B'' $B$=(B -$B$l$i$N(B ``$B5-;v(B'' $B$r>C5n$7$^$;$s!#(B - -@vindex gnus-auto-expirable-newsgroups -$BC5n2DG=$N0u$rIU$1$J$1$l$P$J$i$J$$$o$1$G$O$"$j$^$;$s!#(B -$B@55,I=8=(B @code{gnus-auto-expirable-newsgroups} $B$K9gCW$9$k%0%k!<%W$OA4$F(B -$B$N4{FI5-;v$K<+F0E*$K4|8B@Z$l>C5n2DG=$N0u$,IU$1$i$l$^$9!#A4$F$N4|8B@Z$l>C(B -$B5n2DG=$N0u$NIU$$$?5-;v$O35N,%P%C%U%!$N:G=i$N7e$K(B @samp{E} $B$,I=<($5$l$^$9!#(B - -$B%G%#%U%)%k%H$G$O<+F04|8B@Z$l>C5n2DG=$r;HMQ$9$k$H!"(Bgnus $B$O$"$J$?$,FI$s$@(B -$BA4$F$N5-;v$r!"$=$l$,4{FI$G$"$C$?$+L$FI$G$"$C$?$+$K4X$o$i$:!"4|8B@Z$l>C5n(B -$B2DG=$H$7$F0u$rIU$1$^$9!#4{FI$N0u$NIU$$$?5-;v$,<+F0E*$K4|8B@Z$l>C5n2DG=$H(B -$B$7$F0uIU$1$i$l$k$N$rHr$1$k$?$a$K!"0J2<$N$h$&$J$b$N$r(B @file{.gnus} $B%U%!%$(B -$B%k$K=q$/;v$,$G$-$^$9(B: - -@vindex gnus-mark-article-hook -@lisp -(remove-hook 'gnus-mark-article-hook - 'gnus-summary-mark-read-and-unread-as-read) -(add-hook 'gnus-mark-article-hook 'gnus-summary-mark-unread-as-read) -@end lisp - -$B<+F04|8B@Z$l>C5n2DG=%0%k!<%W$r:n$k;v$O!"A4$F$N4{FI5-;v$,4|8B@Z$l>C5n$5$l(B -$B$k;v$G$O$J$$;v$K5$$rIU$1$F$/$@$5$$(B---$B4|8B@Z$l>C5n2DG=$H$7$F0u$NIU$$$?5-(B -$B;v$@$1$,4|8B@Z$l>C5n$5$l$^$9!#L?Na(B @kbd{d}$B$,<+F0E*$K5-;v$r4|8B@Z$l>C5n2D(B -$BG=$K$9$k$N$G$OL5$$$H$$$&;v$K$b5$$rIU$1$F$/$@$5$$(B---$BH><+F0$N!"<+F04|8B@Z(B -$B$l>C5n2DG=%0%k!<%W$G5-;v$r4{FI$K0uIU$1$k$3$H$@$1$,5-;v$r4|8B@Z$l>C5n2DG=(B -$B$K$7$^$9!#(B - -@lisp -(setq gnus-auto-expirable-newsgroups - "mail.nosense-list\\|mail.nice-list") -@end lisp - -$B<+F04|8B@Z$l>C5n$r$NJ}K!$O!"%0%k!<%W$N%0%k!<%W%Q%i%a!<%?$H$7$F!"(B -$BMWAG(B @code{auto-expirable} $B$r;}$D;v$G$9!#(B - -$B$b$7E,1~%9%3%"IU$1(B (@pxref{Adaptive Scoring}) $B$H<+F04|8B@Z$l>C5n$r;HMQ$7(B -$B$F$$$k$J$i!"LdBj$,5/$3$k$G$7$g$&!#<+F04|8B@Z$l>C5n$HE,1~%9%3%"IU$1$O$"$^(B -$B$jNI$/Aj8_:nMQ$7$^$;$s!#(B - -@vindex nnmail-expiry-wait -$BJQ?t(B @code{nnmail-expiry-wait} $B$O4|8B@Z$l>C5n2DG=5-;v$,$I$l$/$i$$$N4|4V(B -$B@8B8$7$F$$$k$+$N%G%#%U%)%k%H$N;~4V@_Dj$rDs6!$7$^$9!#(BGnus $B$O%a%C%;!<%8$,(B -$BAw$i$l$?$H$-$G$O$J$/!"$=$l$,(B @emph{$BE~Ce(B} $B$7$F$+$i$NF|$r7W;;$7$^$9!#%G%#(B -$B%U%)%k%H$O(B 7 $BF|4V$G$9!#(B - -Gnus $B$O5-;v$,$I$N%0%k!<%W$KB0$7$F$$$k$+$K4p$E$$$F!"$=$l$,$I$N$/$i$$@8B8(B -$B$9$k$+$r@.8y$K@_Dj$9$k4X?t$bDs6!$7$F$$$^$9!#%0%k!<(B -$B%W(B @samp{mail.private} $B$O4|8B$r(B 1$B%v7n$K!"%0%k!<%W(B @samp{mail.junk} $B$G$O(B -$B4|8B$r(B 1 $BF|$K!"$=$NB>$N$b$N$K$O4|8B$r(B 6 $BF|4V$K$9$k$K$O(B: - -@vindex nnmail-expiry-wait-function -@lisp -(setq nnmail-expiry-wait-function - (lambda (group) - (cond ((string= group "mail.private") - 31) - ((string= group "mail.junk") - 1) - ((string= group "important") - 'never) - (t - 6)))) -@end lisp - -$B$3$N4X?t$KM?$($i$l$k%0%k!<%WL>$O(B ``$BAu>~L5$7(B'' $B$N%0%k!<%WL>$G$9(B--- -@samp{nnml:} $B$d$=$NB>$N;w$?$h$&$J$b$N$OIU$-$^$;$s!#(B - -$BJQ?t(B @code{nnmail-expiry-wait} $B$H4X(B -$B?t(B @code{nnmail-expiry-wait-function} $B$O?t;z(B ($B@0?t$G$"$kI,MW$O$"$j$^$;(B -$B$s(B) $B$+%7%s%\%k(B @code{immediate} $B$+(B @code{never} $B$N$I$A$i$+$G$"$k;v$,$G$-(B -$B$^$9!#(B - -$B4|8B@Z$l4|4V$rA*BrE*$KJQ99$9$k$?$a$K%0%k!<%W%Q%i%a!<(B -$B%?(B @code{expiry-wait} $B$r;H$&;v$b$G$-$^$9(B (@pxref{Group Parameters})$B!#(B - -@vindex nnmail-expiry-target -$B5-;v$N4|8B@Z$l>C5n$NIaDL$NF0:n$O$=$l$i$r>C5n$9$k$3$H$G$9!#$7$+$7!">l9g$K(B -$B$h$C$F$O$=$l$i$r>C5n$9$k$h$j$bJL$N%0%k!<%W$K0\F0$7$?J}$,M-0U5A$+$b$7$l$^(B -$B$;$s!#JQ?t(B @code{nnmail-expiry-target} ($B$H%0%k!<%W%Q%i%a!<(B -$B%?(B @code{expiry-target}) $B$O$3$l$r@)8f$7$^$9!#$3$NJQ?t$NCM$O$9$Y$F$N%0%k!<(B -$B%W$KBP$9$k%G%#%U%)%k%H$K$J$j$^$9$,!"FCDj$N%0%k!<%W$4$H$K%0%k!<%W%Q%i%a!<(B -$B%?$r;H$C$F;XDj$9$l$P>e=q$-$9$k$3$H$,$G$-$^$9!#%G%#%U%)%k%H$NCM(B -$B$O(B @code{delete} $B$G$9$,!"J8;zNs(B ($B5-;v$r0\F0$9$k@h$N%0%k!<%WL>(B) $B$^$?$O0\(B -$BF0@h$N%0%k!<%WL>$+(B @code{delete} $B$rJV$94X?t(B ($B5-;v$KHO0O$r69$a$?%P%C%U%!(B -$B$G!"$=$N5-;v$,B8:_$7$F$$$k%0%k!<%WL>$,0z?t$H$7$FM?$($i$l$^$9(B) $B$K$9$k$3$H(B -$B$,$G$-$^$9!#(B - -$B%0%k!<%WL>$r;XDj$9$k>l9g$NNc(B: -@lisp -(setq nnmail-expiry-target "nnml:expired") -@end lisp - -@vindex nnmail-keep-last-article -@code{nnmail-keep-last-article} $B$,(B @code{nil} $B$G$J$$$H!"(Bgnus $B$O%a!<%k%K%e!<(B -$B%9%0%k!<%W$N:G8e$N5-;v$r7h$7$F4|8B@Z$l>C5n$7$^$;$s!#$3$l$O(B procmail $B$NMx(B -$BMQC5n2DG=$G$J$$5-;v$r4|8B@Z$l(B -$B>C5n$9$k;v$O$J$$!"$H$$$&$N$O13$G$9!#(B@code{total-expire} $B$r%0%k!<%W%Q%i%a!<(B -$B%?$KF~$l$k$H!"5-;v$O4|8B@Z$l>C5n$N0u$,IU$-$^$;$s$,!"A4$F$N5-;v$O4|8B@Z$l(B -$B>C5n2aDx$KF~$l$i$l$^$9!#Hs>o$KCm0U$7$F;H$C$F$/$@$5$$!#$5$i$K$b$C$H4m81$J(B -$B$b$N$OJQ?t(B @code{gnus-total-expirable-newsgroups} $B$G$9!#$3$N@55,I=8=$K9g(B -$BCW$9$kA4$F$N%0%k!<%W$OA4$F$N4{FI5-;v$,4|8B@Z$l>C5n2DG=$N2aDx$KFM$C9~$^$l(B -$B$^$9!#$3$l$O!"Ev$N%0%k!<%W$N(B @emph{$BA4$F(B} $B$N8E$$%a!<%k5-;v$O>/$78e$G:o=|(B -$B$5$l$k$H$$$&;v$G$9!#Hs>o$KCm0U$7$F;H$C$F!"$"$J$?$,;HMQ$7$?@55,I=8=$,4V0c$C(B -$B$?%0%k!<%W$K9gCW$7$F!"$"$J$?$NA4$F$N=EMW$J%a!<%k$,>C$($F$7$^$C$?$H8@$C$F!"(B -$B;d$N$H$3$m$K5c$-IU$$$FMh$J$$$G$/$@$5$$!#(B@emph{$BCK(B}$B$K$J$j$J$5$$(B! $B$b$7$/$O!"(B -@emph{$B=w(B} $B$K$J$j$J$5$$(B! $B$"$J$?$,5$;}$A$h$$$H46$8$kA4$F$N$b$N$H(B! $B$G$9$+$i(B -$B$=$3$K(B! - -$B$?$$$F$$$N?M$O$[$H$s$I$N%a!<%k%0%k!<%W$r(B total-expirable ($BA4BN4|8B@Z$l>C(B -$B5n2DG=(B) $B$K$7$^$9$,!#(B - -@vindex gnus-inhibit-user-auto-expire -@code{gnus-inhibit-user-auto-expire} $B$,(B @code{nil} $B$G$J$1$l$P!"%0%k!<%W(B -$B$,<+F0;~8B>C5n$,;HMQ$5$l$k$h$&$K$J$C$F$$$F$b!"MxMQC5n2DG=$N0u$rIU$1$^$;$s!#(B - -@node Washing Mail -@subsection $B%a!<%k@vBu(B -@cindex mail washing -@cindex list server brain damage -@cindex incoming mail treatment - -$B%a%$%i!<(B (mailer) $B$d%j%9%H%5!<%P!<(B (list server) $B$OK\Ev$KK\Ev$KGO9b$$$G$9!#(B``$B$o$!!"(BRFC822 $B$O2f!9$N%5!<%P!<$rDL$C$F$$$/(B -$B%a%C%;!<%8$NA4$F$N9T$N:G8e$K(B @code{wE aRe ElIte!!!!!1!!} $B$r2C$($k;v$rL@(B -$B<(E*$K6X;_$O$7$F$$$J$$$>!#$5$!!"$d$C$F$_$h$&(B!!!!1'' $B$($'!"$=$N$H$*$j$G$9(B -$B$,!"(BRFC822 $B$OG=NO$NDc$$?M$K$h$C$FFI$^$l$k$h$&$K$O=q$+$l$F$$$^$;$s!#L@Gr(B -$B$J;v$O$=$3$G$O5DO@$5$l$F$$$^$;$s!#$G$9$+$i!#$=$&$$$&$3$H$G$9!#(B - -$BLdBjE@(B: $B%I%$%DHG(B Microsoft Exchange $B$OJVEz$NI=Bj$K(B @samp{Re: } $B$NBe$o$j(B -$B$K(B @samp{AW: } $B$rIU$12C$($^$9!#;d$O$3$l$KF0MI$7$FO5Gb$7$F$$$k$U$j$r$9$k(B -$B$3$H$b$G$-$^$7$?$,!"$=$&$9$k5$NO$,$"$j$^$;$s$G$7$?!#$=$l$O>P$&$Y$-;v$G$9!#(B - -Gnus $B$O5-;v$rI=<($9$k$H$-$K$=$l$r@vBu$9$k$?$a$K2aEY$N4X?t$rDs6!$7$F$$$^(B -$B$9$,!"%a!<%k$r%G%#%9%/$KJ]B8$9$kA0$KA*JL$r$9$k$3$H$,$G$-$?J}$,NI$$$G$7$g(B -$B$&!#$=$NL\E*$N$?$a$K!";0$D$N%U%C%/$H$=$N%U%C%/$KF~$l$k;v$N$G$-$k?'!9$J4X(B -$B?t$,$"$j$^$9!#(B - -@table @code -@item nnmail-prepare-incoming-hook -@vindex nnmail-prepare-incoming-hook -$B$3$N%U%C%/$O%a!<%k$K2?$+$r$9$kA0$K8F$P$l!"4pK\E*$J!"%a!<%k$rA]$$$F$-$l$$(B -$B$K$9$k=j:n$N$?$a$K$"$j$^$9!#$=$l$OA4$F$N?7$7$$!"F~$C$F$-$?%a!<%k$r4^$s$G(B -$B$$$k%P%C%U%!$G8F$P$l$^$9!#;H$&;v$N$G$-$k4X?t$O(B: - -@table @code -@item nnheader-ms-strip-cr -@findex nnheader-ms-strip-cr -$B$=$l$>$l$N9T$+$i!":G8e$K$"$k%-%c%j%C%8%j%?!<%s(B (carriage return) $B$re$GF0:n$7$F$$$k(B Emacs $B$N%G%#%U%)%k%H$G$9!#(B -@end table - -@item nnmail-prepare-incoming-header-hook -@vindex nnmail-prepare-incoming-header-hook -$B$3$N%U%C%/$O$=$l$>$l$N%X%C%@!<$KHO0O$r69$a$i$l$F(B (narrowed) $B8F$P$l$^$9!#(B -$B%X%C%@!<$r$-$l$$$K$9$k$H$-$K;H$&;v$,$G$-$^$9!#;H$&;v$N$G$-$k4X?t$O(B: - -@table @code -@item nnmail-remove-leading-whitespace -@findex nnmail-remove-leading-whitespace -$B%X%C%@!<$K$=$l$,NI$/8+$($k$h$&$K(B ``$BM-MQ$J(B'' $B%j%9%H%5!<%P!<$,A0$NJ}$KIU$1(B -$B2C$($?6uGr$rL5$/$7$^$9!#$"$!$!!#(B - -@item nnmail-remove-list-identifiers -@findex nnmail-remove-list-identifiers -$B$$$/$D$+$N%j%9%H%5!<%P!<$OF10l<1JL;R$rIU$12C$($^$9(B---$BNc$($P!"(B -@samp{(idm)}---$B$rA4$F$N(B @code{Subject} $B%X%C%@!<$N:G=i$KIU$1$^$9!#$=$l$O!"(B -$B@P4o;~Be$N%a!<%k%X%C%@!<$r;H$C$F$$$k?M$K$ONI$$;v$@$H;W$$$^$9!#$3$N4X?t$O(B -$B@55,I=8=(B @code{nnmail-list-identifiers} $B$K9gCW$9$kJ8;zNs$r$l$N%a%C%;!<%8$KHO0O$r69$a$i$l$F8F$P$l$^$9!#;H$&;v$N$G(B -$B$-$k4X?t$O(B: - -@table @code -@item article-de-quoted-unreadable -@findex article-de-quoted-unreadable -Quoted Readable $BId9f2=$rI|9f2=$7$^$9!#(B -@end table -@end table - -@node Duplicates -@subsection $B=EJ#(B - -@vindex nnmail-treat-duplicates -@vindex nnmail-message-id-cache-length -@vindex nnmail-message-id-cache-file -@cindex duplicate mails -$B$$$/$D$+$N%a!<%j%s%0%j%9%H$N%a%s%P!<$J$i!";~!9F1$8%a!<%k$rFs$DC5n$7$^$;$s!#$=$NBe$o$j$K!"%a!<%k$N@hF,$K$3$l$O0c$C$?%a%C%;!<%8$N=E(B -$BJ#$G$"$k$H$$$&7Y9p$rA^F~$7$^$9!#(B - -$B$3$NJQ?t$O4X?t$G$"$k;v$b$G$-$^$9!#$=$N>l9g$O!"4X?t(B -$B$O(B @code{Message-ID} $B$r0z?t$H$7$F!"Ev$N%a%C%;!<%8$KHO0O$r69$a$i$l$?%P%C(B -$B%U%!$+$i8F$P$l$^$9!#$3$N4X?t$O(B @code{nil}, @code{warn}, @code{delete} $B$N(B -$B$I$l$+$rJV$5$J$1$l$P$J$j$^$;$s!#(B - -$BJQ?t$r(B @code{nil} $B$K@_Dj$9$k;v$K$h$C$F!"$3$N5!G=$r40A4$K;H$o$J$$$h$&$K$9(B -$B$k;v$,$G$-$^$9!#(B - -$B$b$7A4$F$N=EJ#%a!<%k$rFCJL$J(B @dfn{duplicate} $B%0%k!<%W$KF~$l$?$$$N$G$"$l(B -$B$P!"IaDL$N%a!<%kJ,3dJ}K!$r;H$C$F$=$l$r$9$k$3$H$,$G$-$^$9(B: - -@lisp -(setq nnmail-split-fancy - '(| ;; $B=EJ#%a%C%;!<%8$OJ,N%$5$l$?%0%k!<%W$X9T$-$^$9!#(B - ("gnus-warning" "duplicat\\(e\\|ion\\) of message" "duplicate") - ;; $B%G!<%b%s$d%]%9%H%^%9%?!<$d;w$?$h$&$J$b$N$+$i$N(B - ;; $B%a%C%;!<%8$OB>$N$H$3$m$X!#(B - (any mail "mail.misc") - ;; $BB>$NK!B'!#(B - [ ... ] )) -@end lisp - -$B$b$7$/$O$NK!B'!#(B - [...])) -@end lisp - -$B$9$P$i$7$$5!G=$,$"$j$^$9(B: $B$b$7Dj$9$k$H$$$&$&$k$5$$JJ$,$"$j$^$9!#$3$l$O$b$C$H$b$G$J(B -$B$$;v$G$O$J$$$+$b$7$l$^$;$s$,!"$"$J$?$NK>$`;v$G$O$J$$$+$b$7$l$^$;$s!#(B - -$B$b$7(B @code{mail-sources} $B$H(B @code{nnmail-spool-file} $B$r(B @code{nil} $B$K@_(B -$BDj$9$k$H!"$I$N%P%C%/%(%s%I$bF~$C$F$/$k%a!<%k$rFI$b$&$H;n$_$k;v$O$J$/!"K>(B -$B$`;v$No$KK~B-$7$F$$$F!"8E(B -$B$$(B @sc{rmail} $B%U%!%$%k$,(B @code{nnbabyl} $B$G1#$5$l$F$$$k$N$r$5$C$H8+$?$$$@(B -$B$1$J$i!"$3$l$OM>J,$G$7$g$&!#$9$Y$F$N%P%C%/%(%s%I$O(B $B%P%C%/%(%s%I(B- -@code{get-new-mail} $B$H$$$&JQ?t$r;}$C$F$$$^$9!#$b$7(B @code{nnbabyl} $B$N%a!<(B -$B%kFI$_9~$_$r;HMQIT2D$K$7$?$$$N$G$"$l$P!"%0%k!<%W$N;ve$N%5!<%P!<(B -$B$r(B @code{nnbabyl-get-new-mail} $B$r(B @code{nil} $B$K@_Dj$9$k$h$&$KJT=8$7$^$9!#(B - -$BA4$F$N%a!<%k%P%C%/%(%s%I$OF~$C$F$/$k%a!<%k$rFI$_9~$`$H$-$K!"J]B8$5$l$k$Y(B -$B$-5-;v$KHO0O$r69$a$F(B @code{nn}*@code{-prepare-save-mail-hook} $B$r8F$S$^$9!#(B - -@node Choosing a Mail Backend -@subsection $B%a!<%k%P%C%/%(%s%I$rA*$V(B - -Gnus $B$O%a!<%k%0%k!<%W$rF0:n$9$k$h$&$K$9$k$H%a!<%k%9%W!<%k$rFI$_9~$_$^$9!#(B -$B%a!<%k%U%!%$%k$O$^$:$"$J$?$N%[!<%`%G%#%l%/%H%j!<$KJ#$l$N%0%k!<%W$KBP$7$F0l$D$N%U%!%$%k(B - $B$r;}$D(B -* Comparing Mail Backends:: $BF@<:$N?<$$F6;!(B -@end menu - -@node Unix Mail Box -@subsubsection Unix $B%a!<%k%\%C%/%9(B -@cindex nnmbox -@cindex unix mail box - -@vindex nnmbox-active-file -@vindex nnmbox-mbox-file -@dfn{nnmbox} $B%P%C%/%(%s%I$O%a!<%k$rC_B"$9$k$?$a$KI8=`$N(B Un*x mbox $B%U%!%$(B -$B%k$rMQ$$$^$9!#(B@code{nnmbox} $B$O$=$l$>$l$N%a!<%k5-;v$K$=$l$,$I$N%0%k!<%W$K(B -$BB0$7$F$$$k$+$r<($9DI2C$N%X%C%@!<$r2C$($^$9!#(B - -$B;ve$N%5!<%P!<$N@_Dj(B: - -@table @code -@item nnmbox-mbox-file -@vindex nnmbox-mbox-file -$BMxMQA0!#4{DjCM(B -$B$O(B @file{~/mbox} $B$G$9!#(B - -@item nnmbox-activate-file -@vindex nnmbox-active-file -$B%a!<%k%\%C%/%9$N%"%/%F%#%V%U%!%$%k$NL>A0!#4{DjCM(B -$B$O(B @file{~/.mbox-active} $B$G$9!#(B - -@item nnmbox-get-new-mail -@vindex nnmbox-get-new-mail -@code{nil} $B$G$J$1$l$P!"(B@code{nnmbox} $B$OF~$C$FMh$?%a!<%k$rFI$_9~$s$G%0%k!<(B -$B%W$KJ,3d$7$^$9!#4{DjCM$O(B @code{t} $B$G$9!#(B -@end table - -@node Rmail Babyl -@subsubsection Rmail Babyl -@cindex nnbabyl -@cindex rmail mbox - -@vindex nnbabyl-active-file -@vindex nnbabyl-mbox-file -@dfn{nnbabyl} $B%P%C%/%(%s%I$O%a!<%k$rC_B"$9$k$?$a$K(B babyl $B%a!<%k%\%C%/(B -$B%9(B ($BJLL>(B @dfn{rmail mbox}) $B$r;H$$$^$9!#(B@code{nnbabyl} $B$O$=$l$>$l$N5-;v$K(B -$B$=$l$,$I$N%0%k!<%W$KB0$7$F$$$k$+$r<($9DI2C$N%X%C%@!<$r2C$($^$9!#(B - -$B;ve$N%5!<%P!<$N@_Dj(B: - -@table @code -@item nnbabyl-mbox-file -@vindex nnbabyl-mbox-file -rmail mbox $B%U%!%$%k$NL>A0!#4{DjCM$O(B @file{~/RMAIL} $B$G$9!#(B - -@item nnbabyl-active-file -@vindex nnbabyl-active-file -rmail box $B$N$?$a$N%"%/%F%#%V%U%!%$%k$NL>A0!#4{DjCM(B -$B$O(B @file{~/.rmail-active} $B$G$9!#(B - -@item nnbabyl-get-new-mail -@vindex nnbabyl-get-new-mail -@code{nil} $B$G$J$1$l$P!"(B@code{nnbabyl} $B$OF~$C$F$/$k%a!<%k$rFI$_9~$_$^$9!#(B -$B4{DjCM$O(B @code{t} $B$G$9!#(B -@end table - -@node Mail Spool -@subsubsection $B%a!<%k%9%W!<%k(B -@cindex nnml -@cindex mail @sc{nov} spool - -@dfn{nnml} $B%9%W!<%k%a!<%kMM<0$OB>$NCN$i$l$?MM<0$H$O8_49@-$,$"$j$^$;$s!#(B -$B$=$l$O>/$7Cm0U$7$F;H$o$l$k$Y$-$G$9!#(B - -@vindex nnml-directory -$B$b$7$3$N%P%C%/%(%s%I$r;H$&$H!"(Bgnus $B$OF~$C$F$/$k%a!<%k$r!"$=$l$>$l$N%a!<(B -$B%k$r(B 1 $B%U%!%$%k$H$7$F%U%!%$%k$KJ,3d$7!"5-;v$rJQ(B -$B?t(B @code{nnml-directory} $B$G;XDj$5$l$?%G%#%l%/%H%j!<$N2<$NBP1~$9$k%G%#%l(B -$B%/%H%j!<$KF~$l$^$9!#%G%#%U%)%k%H$NCM$O(B @file{~/Mail/} $B$G$9!#(B - -$BA0$b$C$F%G%#%l%/%H%j!<$r:n$C$F$*$/I,MW$O$"$j$^$;$s!#$=$l$NLLE]$O(B gnus $B$,(B -$B8+$F$/$l$^$9!#(B - -$B$b$7$"$J$?$N%"%+%&%s%H$KC_@Q$G$-$k%U%!%$%k$N?t$K87L)$J@)8B$,$"$k$J$i!"$3(B -$B$N%P%C%/%(%s%I$r;H$&$Y$-$G$O$"$j$^$;$s!#$=$l$>$l$N%a!<%k$O$=$l<+?H$N%U%!(B -$B%$%k$rF@$^$9$N$G!"?t=54V$G$?$/$5$s$N(B i$B%N!<%I$r@jM-$9$k2DG=@-$O==J,$K$"$j(B -$B$^$9!#JL$K$3$l$,LdBj$G$J$/!"?F@Z$J%7%9%F%`4IM}uBV$G(B gnus $B$KLa$9(B ($BK\Mh$N(B @code{nnml} $B%5!<(B -$B%P!<$K$h$C$FDI2C$9$k(B) $B$3$H$,$G$-$kFC$l$N(B @code{nnml} $B%0%k!<%W$N%G%#%l%/%H%jFb$N!"DL(B -$B>o(B @code{.marks} $B%U%!%$%k(B (@code{nnml-marks-file-name} $B$r;2>H(B) $B$K3JG<$5(B -$B$l$^$9!#$^$?!"8D!9$N(B @code{nnml} $B%0%k!<%W$K$D$$$F$b%P%C%/%"%C%W$9$k$3$H(B -$B$,2DG=$G!"(B($B%P%C%/%"%C%W$r(B nnml $B%G%#%l%/%$%H%j$KLa$7$?8e$G(B) @kbd{G m} $B%-!<(B -$B$r;H$C$F$=$N%0%k!<%W$r85$KLa$7$^$9!#(B - -$B;ve$N%5!<%P!<$N@_Dj(B: - -@table @code -@item nnml-directory -@vindex nnml-directory -$BA4$F$N(B @code{nnml} $B%G%#%l%/%H%j!<$O$3$N%G%#%l%/%H%j!<$N2<$KCV$+$l$^$9!#(B -$B4{DjCM$O(B `message-directory' $B$NCM(B ($B$=$N4{DjCM$O(B @file{~/Mail}) $B$G$9!#(B - -@item nnml-active-file -@vindex nnml-active-file -@code{nnml} $B%5!<%P!<$N$?$a$N%"%/%F%#%V%U%!%$%k!#4{DjCM(B -$B$O(B @file{~/Mail/active"} $B$G$9!#(B - -@item nnml-newsgroups-file -@vindex nnml-newgroups-file -@code{nnml} $B%0%k!<%W5-=R%U%!%$%k!#(B@xref{Newsgroups File Format}$B!#4{DjCM(B -$B$O(B @file{~/Mail/newsgroups"} $B$G$9!#(B - -@item nnml-get-new-mail -@vindex nnml-get-new-mail -@code{nil} $B$G$J$1$l$P!"(B@code{nnml} $B$OF~$C$FMh$?%a!<%kFI$_9~$_$^$9!#4{Dj(B -$BCM$O(B @code{t} $B$G$9!#(B - -@item nnml-nov-is-evil -@vindex nnml-nov-is-evil -@code{nil} $B$G$J$1$l$P!"$3$N%P%C%/%(%s%I$O$I$N(B @sc{nov} $B%U%!%$%k$bL5;k$7(B -$B$^$9!#4{DjCM$O(B @code{nil} $B$G$9!#(B - -@item nnml-nov-file-name -@vindex nnml-nov-file-name -@sc{nov} $B%U%!%$%k$NL>A0!#%G%#%U%)%k%H$O(B @file{.overview} $B$G$9!#(B - -@item nnml-prepare-save-mail-hook -@vindex nnml-prepare-save-mail-hook -$BJ]B8$9$kA0$K5-;v$KHO0O$r69$a$FA0$G$9!#%G%#%U%)%k%H$O(B @file{.marks} $B$G$9!#(B -@end table - -@findex nnml-generate-nov-databases -@code{nnml} $B%0%k!<%W$H(B @sc{nov} $B%U%!%$%k$,40A4$KNI$$>uBV$G$J$/$J$C$F$7$^$C(B -$B$?$J$i!"(B@kbd{M-x nnml-generate-nov-databases} $B$HBG$D;v$K$h$C$F!"40A4$K99(B -$B?7$9$k;v$,$G$-$^$9!#$3$NL?Na$O!"$=$l$>$lA4$F$N%U%!%$%k$r8+$k;v$K$h$C(B -$B$F(B @code{nnml} $B3,AXA4BN$r%H%m!<%k5{LV$G$5$i$$$^$9$N$G!"$=$l$,=*$o$k$^$G(B -$B$K$O;~4V$,$+$+$k$+$b$7$l$^$;$s!#$3$N5!G=$X$N$h$jNI$$%$%s%?!<%U%'!<%9$O%5!<(B -$B%P!<%P%C%U%!$G8+$D$+$k$G$7$g$&(B (@pxref{Server Commands})$B!#(B - -@node MH Spool -@subsubsection MH $B%9%W!<%k(B -@cindex nnmh -@cindex mh-e mail spool - -@code{nnmh} $B$O!"(B@sc{nov} $B%G!<%?%Y!<%9$r:n$i$J$$$3$H$H%"%/%F%#%V%U%!%$%k(B -$B$d0u%U%!%$%k$rJ];}$7$J$$;v$r=|$$$F!"(B@code{nnml} $B$H;w$F$$$^$9!#$=$N$3$H(B -$B$O(B @code{nnmh} $B$r(B @code{nnml} $B$h$j(B @emph{$B$+$J$j(B} $BCY$$%P%C%/%(%s%I$K$7$F(B -$B$$$^$9$,!"$=$l$O(B procmail $B$N%9%/%j%W%H$r=q$/$?$a$K$:$C$H$d$j$d$9$/$J$C$F(B -$B$b$$$^$9!#(B - -$B;ve$N%5!<%P!<$N@_Dj(B: - -@table @code -@item nnmh-directory -@vindex nnmh-directory -$BA4$F$N(B @code{nnmh} $B%G%#%l%/%H%j!<$O$3$N%G%#%l%/%H%j!<$N2<$KCV$+$l$^$9!#(B -$B4{DjCM$O(B @code{message-directory} $B$NCM(B ($B$=$N4{DjCM$O(B @file{~/Mail}) $B$G$9!#(B - -@item nnmh-get-new-mail -@vindex nnmh-get-new-mail -@code{nil} $B$G$J$1$l$P!"(B@code{nnmh} $B$OF~$C$F$/$k%a!<%k$rFI$_9~$_$^$9!#4{(B -$BDjCM$O(B @code{t} $B$G$9!#(B - -@item nnmh-be-safe -@vindex nnmh-be-safe -@code{nil} $B$G$J$1$l$P!"(B@code{nnmh} $B$O%U%)%k%@!<$K$"$k5-;v$,pJs$rD4$Y$^$9$N$G!"$3$l$r(B @code{t} $B$K@_Dj$9$k;v$O?<(B -$B9o$JB.EYDc2<$,5/$3$k$H$$$&;v$G$9!#$b$7(B @code{nnmh} $B5-;v$rFI$`$N(B -$B$K(B gnus $B0J30$N$b$N$r;H$C$F$$$J$$$N$G$"$l$P!"$3$NJQ?t$r(B @code{t} $B$K@_Dj$9(B -$B$kI,MW$O$"$j$^$;$s!#4{DjCM$O(B @code{nil} $B$G$9!#(B -@end table - -@node Mail Folders -@subsubsection $B%a!<%k%U%)%k%@!<(B -@cindex nnfolder -@cindex mbox folders -@cindex mail folders - -@code{nnfolder} $B$O$=$l$>$l$N%a!<%k%0%k!<%W$r0c$C$?%U%!%$%k$KC_B"$9$k%P%C(B -$B%/%(%s%I$G$9!#$=$l$>$l$N%U%!%$%k$OI8=`$N(B Un*x mbox $BMM<0$G$9!#(B -@code{nnfolder} $B$O5-;vHV9f$HE~CeF|$r5-O?$7$F$*$/$?$a$NDI2C$N%X%C%@!<$r2C(B -$B$($^$9!#(B - -@cindex self contained nnfolder servers -$B0u%U%!%$%k(B ($BLuCm(B: marks file) $B$,;H$o$l$k$H(B ($B$=$l$,%G%#%U%)%k%H$G$9$,(B)$B!"(B -@code{nnfolder} $B%5!<%P!<$O(B @code{tar} $B$J$I$r;H$C$F%P%C%/%"%C%W$7$?$j!"8e(B -$B$G$"$J$?$,IU$1$?0u$,$9$Y$FJ]$?$l$?>uBV$G(B gnus $B$KLa$9(B ($BK\Mh(B -$B$N(B @code{nnfolder} $B%5!<%P!<$K$h$C$FDI2C$9$k(B) $B$3$H$,$G$-$kFCo(B @code{.mrk} (@code{nnfolder-marks-file-name} $B$r;2>H(B) $B$,IU2C$5$l(B -$B$?L>A0$N%U%!%$%k$K3JG<$5$l$^$9!#$^$?!"8D!9$N(B @code{nnfolder} $B%0%k!<%W$K(B -$B$D$$$F$b%P%C%/%"%C%W$9$k$3$H$,2DG=$G!"(B($B%P%C%/%"%C%W$r(B nnfolder $B%G%#%l%/(B -$B%$%H%j$KLa$7$?8e$G(B) @kbd{G m} $B%-!<$r;H$C$F$=$N%0%k!<%W$r85$KLa$7$^$9!#(B - -$B;ve$N%5!<%P!<$N@_Dj(B: - -@table @code -@item nnfolder-directory -@vindex nnfolder-directory -$BA4$F$N(B @code{nnfolder} $B%a!<%k%\%C%/%9$O$3$N%G%#%l%/%H%j!<$N2<$KCV$+$l$^(B -$B$9!#4{DjCM$O(B @code{message-directory} $B$NCM(B ($B$=$N4{DjCM(B -$B$O(B @file{~/Mail}) $B$G$9!#(B - -@item nnfolder-active-file -@vindex nnfolder-active-file -$B%"%/%F%#%V%U%!%$%k$NL>A0!#4{DjCM$O(B @file{~/Mail/active} $B$G$9!#(B - -@item nnfolder-newgroups-file -@vindex nnfolder-newsgroups-file -$B%0%k!<%W5-=R%U%!%$%k$NL>A0!#(B@xref{Newsgroups File Format}$B!#4{DjCM(B -$B$O(B @file{~/Mail/newsgroups"} $B$G$9!#(B - -@item nnfolder-get-new-mail -@vindex nnfolder-get-new-mail -@code{nil} $B$G$J$1$l$P!"(B@code{nnfolder} $B$OF~$C$F$/$k%a!<%k$rFI$_9~$_$^$9!#(B -$B4{DjCM$O(B @code{t} $B$G$9!#(B - -@item nnfolder-save-buffer-hook -@vindex nnfolder-save-buffer-hook -@cindex backup files -$B%U%)%k%@!<$rJ]B8$9$kA0$Ko$N%P%C%/%"%C%W$NJQL>$r$9$k;v$KCm0U$7$F2<$5$$!#(B -$B$3$N5!G=$rL58z$K$7$?$$$N$G$"$l$P!"%U%!%$%k(B @file{.emacs} $B$GC5n$5$l$k%a%C%;!<%8$KHO0O$r69$a$i$l$FC5n$9$k$^$($K2?$i$+$N>pJs$r(B -$B$r;H$C$F$$$k$H$-$K$N$_F0:n$7$^$9$,!#(B - -@node Comparing Mail Backends -@subsubsection $B%a!<%k%P%C%/%(%s%I$NHf3S(B - -$B$^$:!"MQ8l$H$7$F!"(B@dfn{$B%P%C%/%(%s%I(B} (backend) $B$ODc$`$J$i!"F)2aE*$G$"$j!"$=$l$O2?$+$r@.$7?k$2$k$b$N$G(B -$B$9!#$=$N$3$3$m$O!"%a!<%k$O$I$3$+$i$+Mh$J$1$l$P$J$i$:!"E,@Z$J%P%C%/%(%s%I(B -$B$NA*Br$O!"%a!<%k$r(B gnus $B$N$9$06a$/$K@\5-;v$N%G%#%l%/%H%j!<%9%W!<%k$KF'$_9~$`$H$$$&$b$N(B -$B$G$7$?!#$=$l$G$b!"$?$^$?$^%5!<%P!<(B ($B$b$7$/$O!"(BNFS $B$G%9%W!<%k$,FI$a$k$h(B -$B$&$J>l9g(B) $B$K$$$k$h$&$J>l9g$O!"$3$l$i$NJ}K!$rA*$V$?$a(B -$B$K(B @code{nntp} $B$d(B @code{nnspool} $B%P%C%/%(%s%I$N$I$A$i$+$rA*$V$3$H$,$G$-(B -$B$^$7$?!#(B - -$B%a!<%k%P%C%/%(%s%I$rA*Br$9$k$3$H$N%4!<%k$O!"85$N7A<0$r07$&$N$KE,$7$?J}K!(B -$B$H!">-Mh;HMQ$9$k$?$a$KJXMx$J7A<0$K%a!<%k$r;D$9$3$H$NN>J}$rF1;~$KI=8=$9$k(B -$B$3$H$G$9!#$=$l$>$l$K$ONI$$E@$H0-$$E@$,$$$/$D$+$"$j$^$9(B: - -@table @code -@item nnmbox - -UNIX $B%7%9%F%`$ONr;KE*$KC10l$N!"Hs>o$K0lHLE*$J!">e2A$G$-$k(B) $BJQ99$r$;$:$KJ#@=$9$k$3$H$G$9!#$=$l$O(B gnus $B$N4D6-$N;H(B -$BMQ2DG=HO0O$K%a!<%k$r0\F0$9$k(B ``$B:G$b6r$+$J(B''$BJ}K!$G$9!#$3$l$ODj$a$i$l$?>l(B -$B=j$K0\F0$9$k$N$rB.$/$7$^$9$,!"(Bgnus $B$,$I$3$K2?$,$"$k$+$rD4$Y$k$H$-$O!"2r(B -$B@O$,CY$/$J$j$^$9!#(B - -@item nnbabyl - -$B$`$+$7$`$+$7!"(BTOPS $B$H8F$P$l$k%*%Z%l!<%F%#%s%0%7%9%F%`$d!";w$?$h$&$J$b$N(B -$B$ruBV%S%C%H$r%U%!(B -$B%$%k$N$=$l$>$l$N%a%C%;!<%8$N@hF,$K2C$($k$3$H$r$7$F$$$^$7$?!#(B -RMAIL $B$O(B Emacs $B$N:G=i$N%a!<%k%j!<%@!<$G!"(BRichard Stallman $B$K$h$C$F=q$+$l!"(B -Stallman $B$O$=$N(B TOPS/Babyl $B4D6-$N=P?H$G$"$k$?$a!"(BRMAIL $B$r4{$KB8:_$7$F$$(B -$B$?%a!<%k%U%!%$%k$N0lB2$rM}2r$9$kMM$K=q$-$^$7$?!#(BGnus ($B$3$NLdBj$K4X$7$F(B -$B$O(B VM $B$b(B) $B$3$N7A<0$r%5%]!<%H$7B3$1$F$$$^$9!#$=$l$O!"$=$N%a!<%i!e$N7A<0$NN>J}$O%a!<%k$r%U%!%$%k%7%9%F%`$NC1FH$N%U%!%$%k$KF~$l!"%a!<%k$r(B -$B8+$k$?$S$K!"%U%!%$%kA4BN$r2r@O$7$J$1$l$P$J$j$^$;$s!#(B - -@item nnml - -@code{nnml} $B$O$[$H$s$I(B @code{nnspool} $B@\B3$N(B Usenet $B%7%9%F%`$rA`:n$7$F$$(B -$B$k$h$&$J46$8$N$9$k%P%C%/%(%s%I$G$9!#(B($Bo$K$?$/$5$s>CHq$7$^$9!#$9$J$o$A!"%U%!%$(B -$B%k%7%9%F%`$G?7$7$$%U%!%$%k$rF~$l$k$?$a$N2DG=$J>l=j$rDj5A$9$k;q8;$r$?$/$5(B -$B$s@jM-$7$^$9!#%7%9%F%`4IM}e$G@83h$7$F$$$k$J$i!"(B@code{nnml} $B$OHs>o$KBg$-$JMxE@$,(B -$B$"$j$^$9!#(B - -$B$^$?!"(BFAT16 $B$N(B Windows $B$N@$3&$K@8$-$F$$$k$J$i!"LdBj$,$"$k$G$7$g$&!#$?$/(B -$B$5$s$N>.$5$J%U%!%$%k$GB?$/$N>l=j$r/$7$+!"A4$/$J$$$+$H$$$&DxEY$G$9(B -- @code{nnmh} $B$O0UL#E*(B -$B$K$O(B ``@code{nnml} $B$K%"%/%F%#%V%U%!%$%k$H(B overview $B$N$J$$$b$N(B'' $B$HEy2A$G(B -$B$9!#$3$l$O5DO@$N$"$k$H$3$m$G$9$,!":G0-$NA*Br$G$9!#$H$$$&$N$O!"8D!9$N%U%!(B -$B%$%k$N:n@.$NCY$5$,!"%0%k!<%W$G2?$,?7$7$$$+$rCN$k$H$-$N2r@O$N$?$a$N;HMQ$N(B -$BCY$5$,7k$SIU$/$+$i$G$9!#(B - -@item nnfolder - -$B4pK\E*$K(B @code{nnfolder} $B$N8z2L$O%0%k!<%WKh$N(B @code{nnmbox} ($B>e$G@bL@$5(B -$B$l$F$$$k:G=i$NJ}K!(B) $B$G$9!#$9$J$o$A!"(B@code{nnmbox} $B<+?H$O(B *$BA4$F(B* $B$N%a!<%k(B -$B$r0l$D$N%U%!%$%k$KF~$l$^$9(B; @code{nnfolder} $B$O%a!<%k%0%k!<%W$=$l$>$l(B -$B$,(B Unix mail box $B%U%!%$%k$r;}$D$h$&$K>/$7:GE,2=$r$7$^$9!#(B -@code{nnmobx} $B$h$j$b!"$=$l$>$l$N%0%k!<%W$rJL$K2r@O$9$k$N$GB.$/!"$=$N$&$((B -$B%a!<%k$r0\F0$5$;$k$N$K:G>.8B$NO+NO$rMW5a$9$kC1=c$J(B Unix mail box $B7A<0$r(B -$BDs6!$7$^$9!#2C$($F!"(Bgnus $B$,$=$l$>$l$NJL$N%0%k!<%W$K$I$N$/$i$$$N%a%C%;!<(B -$B%8$,$"$k$+$rD4$Y$k$?$a$N(B ``$B%"%/%F%#%V(B'' $B%U%!%$%k$r0];}$7$^$9!#(B - -$B$b$7$?$/$5$s$NNL$N%a%C%;!<%8$rl$O$I$s$I$s9-$^$C$F$$$^$9!#B?$/$NJ,Ln$G!"%&%'%V$N(B -$B7G<(HD$O:G$b=EMW$J>l$K$J$j!"%a!<%j%s%0%j%9%H$d%K%e!<%9%0%k!<%W$N=EMW@-$r(B -$BfJ$i$;$F$$$^$9!#M}M3$O4JC1$G$9(B---$B?7$7$$MxMQl(B -$B=j$r%/%j%C%/$9$k$@$1$G!"5DO@$N>l$,$"$j$^$9!#%a!<%j%s%0%j%9%H$G$O!"LLE]$J(B -$B9XFI/$7Hw$($D$D$"$j(B -$B$^$9!#(B - -@menu -* 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 -* Web Newspaper:: $B%&%'%V$KJ]4I$5$l$??7J9$rFI$`(B -* RSS:: RDF Site Summary $B$rFI$`(B -* Customizing w3:: Gnus $B$+$i(B Emacs/w3 $B$rA`:n$9$k(B -@end menu - -@samp{Web Newspaper} $B$r=|$/$9$Y$F$N%&%'%V%=!<%9$O!"F0:n$5$;$k$?$a(B -$B$K(B Emacs/w3 $B$H(B url $B%i%$%V%i%j$,I,MW$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 -$B%/%(%s%I$r;H$C$F$$$l$PBg>fIW$N$O$:$G$9!#(B - -$B$3$l$i$N%&%'%VJ}K!$K6&DL$9$k$3$H$O!"%&%'%V%=!<%9$O$7$P$7$PMn$A$F$$$?$j!"(B -$B;HMQ2DG=$G$J$+$C$?$j!"C1=c$K3Z$7$`$K$OCY$9$.$k$3$H$,$"$k!"$H$$$&$3$H$G$9!#(B -$B$=$&$$$&>l9g$K$O!"(BGnu Agent (@pxref{Gnus Unplugged}) $B$K5-;v$N%@%&%s%m!<(B -$B%I$rG$$;$F!"%m!<%+%k%G%#%9%/$+$i9%$-$J$H$-$KFI$`$h$&$K$9$k$3$H$,$G$-$^$9!#(B -$B$3$l$G!"(BWorld Wide Wait $B$H$O$*$5$i$P$G$9!#(B - -@node Archiving Mail -@subsection $B%a!<%k$NJ]B8(B -@cindex archiving mail -@cindex backup of mail - -$B$$$/$D$+$N%P%C%/%(%s%I!"FC$K(B nnml $B$H(B nnfolder $B$O!"$=$l$>$l$N%0%k!<%W$N5-(B -$B;v$N0u$rK\Ev$KJ];}$7$^$9!#$3$l$i$N%5!<%P!<$G!"%0%k!<%W$N0u$rJ]$A$D$DJ]B8(B -$B$7$?$j85$KLa$9$N$O$+$J$j4JC1$G$9!#(B - -($B$G$b!"%0%k!<%W%l%Y%k$H%0%k!<%W%Q%i%a!<%?$r$bJ];}$9$k$K$O!":#$^$G$H$*(B -$B$j(B @code{.newsrc.eld} $B$N?@$K!"Iq$$$H@8lS$rJ{$2$J$1$l$P$J$j$^$;$s!#(B) - -@code{nnml} $B$+(B @code{nnfolder} $B$K$^$k$4$HJ]B8$9$k$K$O!"%5!<%P!<$N%G%#%l(B -$B%/%H%j$r:F5"E*$K%3%T!<$7$^$9!#(Bgnus $B$r=*N;$9$kI,MW$OL5$$$N$G!"J]B8(B -$B$O(B @code{cron} $B$d$=$l$KN`$9$k$b$N$,9T$J$&$3$H$,$G$-$^$9!#%G!<%?$rI|5"$5(B -$B$;$k$K$O%G%#%l%/%H%jLZ(B (tree) $B$r85$KLa$9$3$H$G9T$J$$!"$=$N%G%#%l%/%H%j$r(B -$B;X$7<($9$h$&$K(B gnus $B$N%5!<%P!<$NDj5A$KDI2C$7$^$9!#(B@ref{Article Backlog}$B!"(B -@ref{Asynchronous Fetching} $B$*$h$S$=$NB>$O!"%G!<%?$r>e=q$-$7$FJ}$r%3%T!<$9$kI,MW$,$"(B -$B$j$^$9!#%0%k!<%W$r85$KLa$9$N$O!"%0%k!<%W%P%C%U%!$G(B @kbd{G m} $B%-!<$r;H$$(B -$B$^$9!#$=$N:G8e$N$NIaDL$N%0%k!<%W$N$h$&$K5-;v$rFI$_$^$9!#%0%k!<(B -$B%W%P%C%U%!(B (@pxref{Foreign Groups}) $B$N(B @kbd{G w} $BL?Na$K$h$C$F$*A[%5!<%P!$l$N?7$7$$%K%e!<%95-;v$r?7$7(B -$B$$(B gnus $B$N%0%k!<%W$H$7$F9XFI$7!"$3$l$i$N%0%k!<%W$KF~$k$3$H$G%3%a%s%H$rFI(B -$B$`$3$H$,$G$-$^$9!#(B($B=i4|@_Dj$N9XFIJ}K!$G$O!"?7$7$$%0%k!<%W$r%>%s%S$H$7$F(B -$B9XFI$9$k$3$H$KCm0U$7$F$/$@$5$$!#B>$NJ}K!$b;H$($^(B -$B$9(B (@pxref{Subscription Methods})$B!#(B - -$B$b$7$"$J$?$,8E$$(B @code{nnslashdot} $B%0%k!<%W$r:o=|$7$?$$$N$J$i$P!"(B -@kbd{G DEL} $B$,:G$b/$7(B @sc{html} $B$KJQ49$5$l$^$9!#FC$K!"(B@samp{> } $B$G0zMQ$5$l(B -$B$?%F%-%9%H$O$=$NBe$o$j$K(B @code{blockquote} $B$G0zMQ$5$l!"=pL>$K$O$=$l$>$l(B -$B$N9T$N:G8e$K(B @code{br} $B$,DI2C$5$l$^$9!#$=$l0J30$O!"%a%C%;!<%8%P%C%U%!$K(B -$BD>@\(B @sc{html} $B$r=q$/$3$H$,$G$-$^$9!#(BSlashdot $B$O$$$/$D$+(B @sc{html} $B$rA*(B -$BJL$9$k$3$H$K5$$r$D$1$F$/$@$5$$!#(B - -$B0J2<$NJQ?t$G?6$kIq$$$rJQ$($k$3$H$,$G$-$^$9(B: - -@table @code -@item nnslashdot-threaded -@code{nnslashdot} $B$,%0%k!<%W$r%9%l%C%I$GI=<($9$k$+$I$&$+!#=i4|CM(B -$B$O(B @code{t} $B$G$9!#%9%l%C%I$rI=<($G$-$k$?$a$K$O!"(B@code{nnslashdot} $B$O%0%k!<(B -$B%W$KF~$k:]$K$=$NA4$F$N%3%a%s%H$r$G$9!#(B - -@item nnslashdot-password -@vindex nnslashdot-password -$BEj9F;~$K;H$&%Q%9%o!<%I$G$9!#(B - -@item nnslashdot-directory -@vindex nnslashdot-directory -@code{nnslashdot} $B$,%U%!%$%k$rJ]B8$9$k>l=j$G$9!#=i4|CM(B -$B$O(B @samp{~/News/slashdot/} $B$G$9!#(B - -@item nnslashdot-active-url -@vindex nnslashdot-active-url -$B%K%e!<%95-;v$H%3%a%s%H$ruBV$KJ]$C$F$*$/$?$a$K>pJs$rF@$k$3$H$,2DG=$G(B -$B$9!#(B - -@code{nnultimate} $B$r;O$a$k$?$a$N0lHV4JC1$JJ}K!$O%0%k!<%W%P%C%U%!$G0J2<$N(B -$B$h$&$J$b$N$r$9$k$3$H$G$9(B: @kbd{B nnultimate RET -http://www.tcj.com/messboard.ubbcgi/ RET}$B!#(B($B6=L#$N$"$k2q5D<<(B -$B$N(B @sc{url} (@samp{Ultimate.cgi} $BEy$r:G8e$K4^$s$G$$$J$$$b$N(B) $B$KJQ$($F$/(B -$B$@$5$$!#(BUltimate $B%&%'%V%5%$%H$K$O$?$/$5$s5s$2$i$l$F$$$^$9!#(B) $B$=$l$+$i%5!<(B -$B%P!<%P%C%U%!$G6=L#$N$"$k%0%k!<%W$r9XFI$7!"%0%k!<%W%P%C%U%!$+$i$=$l$i$rFI(B -$B$s$G$/$@$5$$!#(B - -$B0J2<$N(B @code{nnutimate} $BJQ?t$rJQ992DG=$G$9(B: - -@table @code -@item nnultimate-directory -@vindex nnultimate-directory -@code{nnultimate} $B$,%U%!%$%k$rJ]B8$9$k%G%#%l%/%H%j!<$G$9!#=i4|CM(B -$B$O(B @samp{~/News/ultimate/} $B$G$9!#(B -@end table - -@node Web Archive -@subsection Web Archive -@cindex nnwarchive -@cindex Web Archive - -$B%a!<%j%s%0%j%9%H$NCf$K$ONc$($P!"(B -@uref{http://www.egroups.com/} $B$d(B @uref{http://www.mail-archive.com/} $B$N(B -$B$h$&$K%&%'%V%5!<%P!<$K$7$+%"!<%+%$%V$,L5$$$b$N$b$"$j$^$9!#$H$F$b@0A3$H$7(B -$B$FNI$$3&LL$G!"(Bgnus $B$,%0%k!<%W$r:G?7$N>uBV$KJ]$C$F$*$/$?$a$K>pJs$rF@$k$3(B -$B$H$,2DG=$G$9!#(B - -@code{nnwarchive} $B$r;O$a$k$?$a$N0lHV4JC1$JJ}K!$O%0%k!<%W%P%C%U%!$G0J2<$N(B -$B$h$&$J$b$N$r$9$k$3$H$G$9(B: @kbd{M-x gnus-group-make-warchive-group RET -an_egroup RET egroups RET www.egroups.comRET your@@email.address RET}$B!#(B -(@sc{an_egroup} $B$r9XFI$7$F$$$k%a!<%j%s%0%j%9%H$K!"(B -@sc{your@@emailaddress} $B$rEE;R%a!<%k%"%I%l%9$KCV$-49$($F$/$@$5$$!#(B) -$B$^$?$O(B @kbd{B nnwarchive RET mail-archive RET} $B$G%P%C%/%(%s%I$r%V%i%&%:(B -$B$7$F2<$5$$!#(B - -$B0J2<$N(B @code{nnwarchive} $BJQ?t$rJQ$($k$3$H$,2DG=$G$9(B: - -@table @code -@item nnwarchive-directory -@vindex nnwarchive-directory -@code{nnwarchive} $B$,%U%!%$%k$rJ]B8$9$k%G%#%l%/%H%j!<$G$9!#=i4|CM(B -$B$O(B @samp{~/News/warchive} $B$G$9!#(B - -@item nnwarchive-login -@vindex nnwarchive-login -$B%&%'%V%5!<%P!<$G$N%"%+%&%s%HL>$G$9!#(B - -@item nnwarchive-passwd -@vindex nnwarchive-passwd -$B%&%'%V%5!<%P!<$G$N%"%+%&%s%H$N%Q%9%o!<%I$G$9!#(B -@end table - -@node Web Newspaper -@subsection Web Newspaper -@cindex nnshimbun -@cindex Web Newspaper - -$B:G6a$G$O4v$D$+$N?7J9$,%&%'%V$G8x3+$5$l$F$$$^$9!#(BGnus $B$O$3$l$i$bE,@Z$K\$7$$$3$H$O0J2<$N%Z!<%8$GCN$k$3$H$,$G$-$^$9!#(B - -@example - @uref{http://emacs-w3m.namazu.org/} - @uref{http://ei5nazha.yz.yamagata-u.ac.jp/~aito/w3m/} -@end example - -@code{nnshimbun} $B$r;O$a$k$?$a$N0lHV4JC1$JJ}K!$O%0%k!<%W%P%C%U%!$G0J2<$N(B -$B$h$&$J$b$N$r$9$k$3$H$G$9(B: - -@example - @kbd{M-x gnus-group-make-shimbun-group RET asahi RET a_group RET} -@end example - -$B>e$N(B @samp{a_group} $B$O1\Mw$7$?$$5-;v%0%k!<%W$KCV$-49$($F$/$@$5$$!#(B -$B$^$?$O(B @kbd{B nnshimbun RET asahi RET} $B$G%P%C%/%(%s%I$r%V%i%&%:$7$F2<$5(B -$B$$!#2C$($F!"(B@sc{html} $B$N%I%-%e%a%s%H$r%$%s%i%$%sI=<($5$;$?$$>l9g$O!"(B -@file{~/.gnus} $B%U%!%$%k$K0J2<$N@_Dj$r$7$F2<$5$$!#(B - -@lisp -(setq mime-setup-enable-inline-html nil) -(eval-after-load "mime-view" - '(progn - (autoload 'mime-w3m-preview-text/html "mime-w3m") - (ctree-set-calist-strictly - 'mime-preview-condition - '((type . text) - (subtype . html) - (body . visible) - (body-presentation-method . mime-w3m-preview-text/html))) - (set-alist 'mime-view-type-subtype-score-alist - '(text . html) 3))) -@end lisp - -Web Newspaper $B$K4X$9$k0J2<$N(B @code{nnshimbun} $BJQ?t$rJQ$($k$3$H$,2DG=$G$9(B: - -@table @code -@item nnshimbun-directory -@vindex nnshimbun-directory -@code{nnshimbun} $B$,%U%!%$%k$rJ]B8$9$k%G%#%l%/%H%j!<$G$9!#=i4|CM(B -$B$O(B @samp{~/News/shimbun} $B$G$9!#(B -@end table - -@cindex group parameters -@code{nnshimbun} $B$O(B Gnus $B$,Ds6!$9$kHFMQ$N%0%k!<%W%Q%i%a!<(B -$B%?(B @footnote{$B%0%k!<%W%Q%i%a!<%?$r@_Dj$9$k$?$a$N:G$bl=j$K%+!<%=%k$,$"$k>uBV(B -$B$G(B @kbd{G c} $B$r%?%$%W$9$k$3$H$G$9(B (@xref{Group Parameters})$B!#(B} $B$K2C$($F!"(B -@code{nnshimbun} $B@lMQ$N%0%k!<%W%Q%i%a!<%?$rMxMQ$9$k$3$H$,$G$-$^$9!#$=$l(B -$B$i$O(B @code{nnshimbun-group-parameters} $B$H$$$&C10l$N%0%k!<%W%Q%i%a!<%?$K(B -$B$^$H$a$i$l$F$$$^$9$,!"$=$l$,3F%0%k!<%WKh$K;}$D$3$H$,$G$-$kCM$O%W%m%Q%F%#(B -$B%j%9%H$G!"Nc$($P/$J$/$J$j$^$9!#%0%k!<%W%Q%i%a!<(B -$B%?(B @code{prefetch-articles} $B$,@_Dj$5$l$F$$$J$$$+!"$=$NCM$,(B @code{nil} $B$K(B -$B$J$C$F$$$k%0%k!<%W$G$O!"%0%k!<%W%Q%i%a!<%?(B @code{prefetch-articles} $B$NBe(B -$B$o$j$K%G%#%U%)%k%HCM$H$7$FJQ?t(B @code{nnshimbun-pre-fetch-article} $B$NCM$,(B -$B;H$o$l$^$9!#$3$NJQ?t(B @code{nnshimbun-pre-fetch-article} $B$N=i4|CM(B -$B$O(B @code{off} $B$G$9!#(B - -@item encapsulate-images -@vindex nnshimbun-encapsulate-images -$B$3$N%0%k!<%W%Q%i%a!<%?$,(B @code{off} $B$^$?$O(B @code{nil} $B0J30$NCM$K%;%C%H$5(B -$B$l$F$$$k%0%k!<%W$G$O!"(B@code{nnshimbun} $B$O85$N5-;v$KKd$a9~$^$l$F$$$k2hA|(B -$B%G!<%?$r(B @samp{multipart/related} $B$N7A<0$G5-;v$K$O$a9~$_$^$9!#%0%k!<%W%Q(B -$B%i%a!<%?(B @code{encapsulate-images} $B$,@_Dj$5$l$F$$$J$$$+!"$=$NCM$,(B -@code{nil} $B$K$J$C$F$$$k%0%k!<%W$G$O!"%0%k!<%W%Q%i%a!<(B -$B%?(B @code{encapsulate-images} $B$NBe$o$j$K%G%#%U%)%k%HCM$H$7$FJQ(B -$B?t(B @code{nnshimbun-encapsulate-images} $B$NCM$,;H$o$l$^$9!#$3$NJQ(B -$B?t(B @code{nnshimbun-encapsulate-images} $B$N%G%#%U%)%k%HCM$O!"(B -@code{shimbun} $B%i%$%V%i%j$NJQ?t(B @code{shimbun-encapsulate-images} $B$NCM$G(B -$B$9(B ($B$?$V$s$=$N=i4|CM$O(B @code{t} $B$G$9(B)$B!#(B - -@item index-range -@vindex nnshimbun-index-range -$B%0%k!<%W%Q%i%a!<%?(B @code{index-range} $B$G!"%&%'%V%5!<%P!<$+$ie$KB8:_$9$kL\l9g$,(B -$B$"$j$^$9!#Nc$($P!"%a!<%j%s%0%j%9%H$N5-;v$rDs6!$7$F$$$k%5!<%P!<$N>l9g$O!"(B -$B$=$N5-;v$,Ej9F$5$l$?F|IU$K$h$C$FJ,N`$5$l$?L\l9g$O(B @code{last} $B$r(B -$B;H$C$F2<$5$$!#$3$&$9$k$H:G?7$NL\H$7$F?7Ce5-;v$N8!::$r9T$&$h$&(B -$B$K$J$j$^$9!#(B - -$B%0%k!<%W%Q%i%a!<%?(B @code{index-range} $B$,@_Dj$5$l$F$$$J$$$+!"CM(B -$B$,(B @code{nil} $B$K$J$C$F$$$k%0%k!<%W$G$O!"JQ(B -$B?t(B @code{nnshimbun-index-range} $B$NCM$,%G%#%U%)%k%H$H$7$F;H$o$l$^$9!#(B -$B$J$*!"(B@code{nnshimbun-index-range} $B$N%G%#%U%)%k%HCM$O(B @code{nil} $B$G$9!#(B - -@item nnshimbun-group-parameters-alist -@vindex nnshimbun-group-parameters-alist -@code{nnshimbun-group-parameters-alist} $B$O%+%9%?%^%$%:2DG=$J%f!<%6%*%W%7%g(B -$B%s$G!"3FMWAG$K%0%k!<%WL>$N@55,I=8=$H(B @code{nnshimbun} $B@lMQ$N%0%k!<%W%Q%i(B -$B%a!<%?$HF1$8%W%m%Q%F%#%j%9%H$r;}$D$3$H$,$G$-$kO"A[%j%9%H$G$9!#O"A[%j%9%H(B -$B$N3FMWAG$O$l%0%k!<%W%Q%i%a!<%?$r@_Dj$9$kBe$o$j$K;H$&$3$H$,(B -$B$G$-$^$9!#$b$7@55,I=8=$K%^%C%A$9$k%0%k!<%W$G%0%k!<%W%Q%i%a!<%?$N@_Dj$,9T(B -$B$J$o$l$F$$$?>l9g$O!"$=$N@_DjCM$NJ}$,M%@h$5$l$^$9!#(B -@end table - -@cindex article expiry -@cindex auto-expire -@cindex expiry-wait -@vindex nnmail-expiry-wait-function -@vindex nnmail-expiry-wait -$B$H$3$m$G(B @code{nnshimbun} $B%P%C%/%(%s%I$G$O!"5-;v$N4|8B@Z$l>C5n$r9T$J$&$3(B -$B$H$,$G$-$^$9(B @footnote{@code{nnshimbun} $B%0%k!<%W$G<+F04|8B@Z$l>C5n$r9T$J(B -$B$&J}K!$K$O$N@55,I=8=$r(B @code{gnus-auto-expirable-newsgroups} $B$KDI2C$7$F!">C5n$9(B -$B$k$^$G$NF|?t$r3F%0%k!<%WKh$K(B @code{nnmail-expiry-wait-function} $B$G;XDj$9(B -$B$k$3$H!#$b$&0l$D$O(B @code{nnshimbun} $B$N3F%0%k!<%WKh$K%0%k!<%W%Q%i%a!<(B -$B%?(B @code{auto-expire} $B$r(B @code{t} $B$K$7$F!"F1$8$/%0%k!<%W%Q%i%a!<(B -$B%?(B @code{expiry-wait} $B$G>C5n$9$k$^$G$NF|?t$r;XDj$9$k$d$jJ}$G$9!#>\$7$$$3(B -$B$H$O(B @xref{Expiring Mail} $B$r;2>H$7$F2<$5$$!#$J$*K\JT$G$b?($l$F$$$^$9$,!"(B -$B8D!9$KF|?t$r@_Dj$7$J$$>l9g$O%G%#%U%)%k%H$NCM$,E,MQ$5$l$^$9!#(B}$B!#$"$"!"$b(B -$B$A$m$s$"$J$?$,;0F|A0$N?7J95-;v$r>C5n$9$k$h$&$K@_Dj$7$?$+$i$H$$$C$F!"?7J9(B -$BC$($F$7$^$&$o$1$G$O$"$j$^$;$s!#>C$($k$N(B -$B$O$"$J$?8D?M$,;}$C$F$$$k(B @code{nnshimbun} $BMQ$N(B @sc{nov} $B%U%!%$(B -$B%k(B @footnote{@code{nnshimbun} $BMQ$N(B @sc{nov} $B%U%!%$%k$H(B -$B$O(B ``~/News/shimbun/asahi/national/.overview'' $B$N$h$&$J$b$N$G$9!#(B} $B$N3:(B -$BEv$9$kItJ,$G!"$=$l$K$h$C$F$=$N5-;v$OFsEY$H35N,%P%C%U%!$K8=$l$J$/$J$j$^$9!#(B - -@code{nnshimbun} $B%P%C%/%(%s%I$G$O5-;v$N4|8B@Z$l>C5n$r9T$J$o$J$$(B -$B$H(B @sc{nov} $B%U%!%$%k$,:]8BL5$/B@$jB3$1!"?7J9l9g$K$O!"2a5n$NA45-;v$rJ]M-$7$F(B -$B$$$k>l9g$,>/$J$/$J$$$G$7$g$&!#@N$"$J$?$,6=$8$?0lO"$N5-;v$rFI$_JV$7$F2{$+(B -$B$7$`$?$a$K!"$=$&$$$&%0%k!<%W$G$O4|8B@Z$l>C5n$O$5$;$?$/$J$$$H;W$&$+$b$7$l(B -$B$^$;$s!#(B - -$B$N%a!<%k%P%C%/%(%s%I$HF1MM$NJ}(B -$BK!$G%0%k!<%WKh$K<+F04|8B@Z$l>C5n2DG=$K$7$?$j!";D$7$F$*$/4|4V$r@_Dj$9$k$3(B -$B$H$,$G$-$k$N$G$9!#(B - -$B$?$@(B @code{nnshimbun} $B%P%C%/%(%s%I$N4|8B@Z$l>C5n$K$O!"B>$N%a!<%k%P%C%/%((B -$B%s%I$H>/$7$@$10c$&E@$,$"$j$^$9!#Bh0l$K!";D$7$F$*$/4|4V$N%G%#%U%)%k%HCM$K(B -@code{shimbun} $B%i%$%V%i%j$,Ds6!$9$kCM$,4X78$7!"0J2<$NM%@hEY$G4|4V$,7hDj(B -$B$5$l$k$3$H$G$9!#(B - -@example -$B%0%k!<%W%Q%i%a!<%?$N(B @code{expiry-wait} -@code{nnmail-expiry-wait-function} $B$rI>2A$7$?CM(B -@code{shimbun} $B%i%$%V%i%j$,Ds6!$9$k%0%k!<%WKh$N%G%#%U%)%k%HCM(B -@code{nnmail-expiry-wait} $B$NCM(B -@end example - -$BBhFs$K!"(B@code{nnmail-expiry-wait-function} $B$,4X?t$@$C$?>l9g$K!"$=$N0z?t(B -$B$KM?$($i$l$kJ8;zNs$K(B ``nnshimbin+asahi:national'' $B$N$h$&$K%P%C%/%(%s%I$H(B -$B%5!<%P!<$NL>A0$,4^$^$l$k$3$H$G$9!#B>$N%a!<%k%P%C%/%(%s%I$N>l9g$K$O%0%k!<(B -$B%WL>$@$1$,M?$($i$l$k$N$K!"$G$9!#0l$DNc$r5s$2$^$7$g$&!#(B - -@lisp -(setq nnmail-expiry-wait-function - (lambda (group) - (cond ((string-equal group "wl") 7) - ((string-equal group "nnshimbun+airs:wl") 'never)))) -@end lisp - -$B$3$l$O!"Nc$($P(B @code{nnml} $B$d(B @code{nnmh} $B$GC5n$9$k$,!"(B@code{nnshimbun} $B$GFI$`F1(B -$B$8%a!<%j%s%0%j%9%H$N%"!<%+%$%V$O$9$Y$FFI$a$k>uBV$K$7$F$*$/!"$H$$$&$3$H$G(B -$B$9!#$I$&$G$9!"$J$+$J$+8-$$$G$7$g(B? - -$BBh;0$K!"$3$l$O$"$J$?$,IT?3$K;W$C$?$H$-$K;W$$=P$7$F$/$l$k$3$H$r4|BT$7$F=q(B -$B$$$F$*$-$^$9$,!"%0%k!<%W$N$9$Y$F$N5-;v$,4|8B@Z$l>C5n$NBP>]$K$J$C$F$7$^$C(B -$B$?$H$-$K!"(B@code{nnshimbun} $B$O:G8e$N0lDL$@$1$O>C$5$:$K;D$7$F$*$-$^$9!#$3(B -$B$l$O$"$J$?$NL$N}?4$rK~B-$5$;$k$?$a$G$O$J$/!"%5!<%P!<$+$i8E$$5-;v$r:F$S$N:v$J$N$G$9!#(B - -@code{nnshimbun} $B$N4|8B@Z$l>C5n$K4X78$9$k%0%k!<%W%Q%i%a!<%?$HJQ?t$O0J2<(B -$B$NDL$j$G$9!#(B - -@table @code -@item expiry-wait -@cindex expiry-wait -$B$I$&$+:.Mp$J$5$i$J$$$h$&$K!#(Bgnus $B$,Ds6!$7$F$$$kHFMQ$N%0%k!<%W%Q%i%a!<(B -$B%?(B @code{expiry-wait} $B$HF1$8L>A0$G0UL#$bF1$8$b$N$,(B @code{nnshimbun} $B@lMQ(B -$B$N%0%k!<%W%Q%i%a!<%?$K$bMQ0U$5$l$F$$$^$9!#$"$J$?$O$I$A$i$r;H$C$F$b9=$$$^(B -$B$;$s!#$b$7(B @code{nnshimbun} $B@lMQ$N%0%k!<%W%Q%i%a!<%?$NJ}$r(B @code{nil} $B0J(B -$B30$NCM$K@_Dj$9$k$H!"HFMQ$N%0%k!<%W%Q%i%a!<%?$NCM$h$j$bM%@h$7$F;H$o$l$^$9!#(B -$B$3$l$O!"%0%k!<%W%P%C%U%!$G(B @kbd{G c} $B$r%?%$%W$7$?$H$-$K8=$l$kJT=82hLL$K(B -$B$*$$$F!"(B@code{nnshimbun} $B$K4X78$9$k$b$N$r0l2U=j$K=8$a$k$?$a$H!"%f!<%6%*(B -$B%W%7%g%s(B @code{nnshimbun-group-parameters-alist} $B$G0l3g$7$F4IM}$G$-$k$h(B -$B$&$K$9$k$3$H$rL\E*$KMQ0U$7$?$b$N$G$9(B @footnote{$B$J(B -$B$<(B @code{auto-expire} $B$J$I$b(B @code{nnshimbun} $B@lMQ$N%0%k!<%W%Q%i%a!<%?$K(B -$B4^$a$F$*$$$F$/$l$J$$$N(B? $B$H$$$&Ld$$$KBP$9$kEz$($rMQ0U$7$F$$$^$9!#(B -@code{expiry-wait} $B$r;2>H$9$k$N$,(B @code{nnshimbun} $B%P%C%/%(%s%I$J$N$KBP(B -$B$7$F!"(B@code{auto-expire} $B$J$I$r;2>H$9$k$N$O(B Gnus $B$NK\BN$J$N$G$9$,!"K\BN(B -$B$N5!G=$rFCDj$N%P%C%/%(%s%I$NLLE]$r8+$k$h$&$K3HD%$9$k$N$O!"(BGnus $B$N@_7W;W(B -$BA[$KH?$7$F$$$k$+$i$G$9!#(B}$B!#@_Dj$G$-$kCM$OHFMQ$N%0%k!<%W%Q%i%a!<%?$HF1MM(B -$B$K!";~8B>C5n$NF|?t!"(B@code{never} $B$^$?$O(B @code{immediate} $B$G$9!#(B - -@item nnshimbun-keep-unparsable-dated-articles -@vindex nnshimbun-keep-unparsable-dated-articles -$B$3$NJQ?t$NCM$,(B @code{nil} $B$G$J$$>l9g$O!":n@.$5$l$?$jAw?.$5$l$?;~9o$,$h$/(B -$B$o$+$i$J$$5-;v$r4|8B@Z$l>C5n$7$^$;$s!#$J$K$7$m4|8B$,$o$+$i$J$$$s$G$9$+$i!#(B -$B=i4|CM$O(B @code{t} $B$G$9$,!"(B@code{nil} $B$K$9$k$H4|8B@Z$l>C5n$N=hM}$,9T$J$o(B -$B$l$k$H$-$K!"4|8B$,$o$+$i$J$$5-;v$G$bM-L5$r8@$o$:>C$7$F$7$^$$$^$9!#$^$"!"(B -$BG/$NJk$l$NBgA]=|$N$H$-$K$G$b;H$C$F2<$5$$!#(B -@end table - -@node RSS -@subsection RSS -@cindex nnrss -@cindex RSS - -$B$$$/$D$+$N%5%$%H$O(B RDF site summary (RSS) $B$r;}$C$F$$$^(B -$B$9(B @uref{http://purl.org/rss/1.0/spec}$B!#$3$l$O$H$F$b5,B'E*$+$DNIo$K?7$7$/$7$F$*$/$?$a$N>pJs$rF@$k$3$H(B -$B$,$G$-$^$9!#(B - -$B4JC1$K(B @code{nnrss} $B$r;H$$;O$a$k$K$O!"%0%k!<%W%P%C%U%!(B -$B$G(B @kbd{B nnrss RET RET} $B$H%?%$%W$7$F!"%0%k!<%W$r9VFI$7$F2<$5$$!#(B - -$B0J2<$N(B @code{nnrss} $BJQ?t$,JQ992DG=$G$9(B: - -@table @code -@item nnrss-directory -@vindex nnrss-directory -@code{nnrss} $B$,%U%!%$%k$r=q$-9~$`%G%#%l%/%H%j!<$G!"%G%#%U%)%k%H(B -$B$O(B @samp{~/News/rss/} $B$G$9!#(B -@end table - -$B35N,%P%C%U%!$K@bL@$rI=<($5$;$?$$$J$i$P!"0J2<$N%3!<%I$,Lr$KN)$D$G$7$g$&!#(B - -@lisp -(add-to-list 'nnmail-extra-headers nnrss-description-field) -(setq gnus-summary-line-format "%U%R%z%I%(%[%4L: %-15,15f%]%) %s%uX\n") - -(defun gnus-user-format-function-X (header) - (let ((descr - (assq nnrss-description-field (mail-header-extra header)))) - (if descr (concat "\n\t" (cdr descr)) ""))) -@end lisp - -$B0J2<$N%3!<%I$O!"35N,%P%C%U%!$+$iD>@\(B nnrss $B$N(B url $B$r%*!<%W%s$9$k$N$KJXMx(B -$B$+$b$7$l$^$;$s!#(B -@lisp -(require 'browse-url) - -(defun browse-nnrss-url( arg ) - (interactive "p") - (let ((url (assq nnrss-url-field - (mail-header-extra - (gnus-data-header - (assq (gnus-summary-article-number) - gnus-newsgroup-data)))))) - (if url - (browse-url (cdr url)) - (gnus-summary-scroll-up arg)))) - -(eval-after-load "gnus" - #'(define-key gnus-summary-mode-map - (kbd "") 'browse-nnrss-url)) -(add-to-list 'nnmail-extra-headers nnrss-url-field) -@end lisp - -@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 - -Gnus $B$O$?$@C1$K%K%e!<%9$d%a!<%k$rFI$`0J>e$N$3$H$,$G$-$^$9!#0J2<(B -$B$K<($9J}K!$K$h$C$F!"(Bgnus $B$G%G%#%l%/%H%j!<$d%U%!%$%k$r!"$"$?$+$b(B -$B%K%e!<%9%0%k!<%W$G$"$k$+$N$h$&$K1\Mw$9$k$3$H$,$G$-$k$h$&$K$J$j$^(B -$B$9!#(B - -@menu -* Directory Groups:: $B%G%#%l%/%H%j!<$r%K%e!<%9%0%k!<%W$N$h$&$K(B - $BFI$`(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(B - $B$F5-;v$rEj9F$9$k(B -* IMAP:: Gnus $B$r(B IMAP $B$N%/%i%$%"%s%H$H$7$F;H$&(B -@end menu - -@node Directory Groups -@subsection $B%G%#%l%/%H%j!<%0%k!<%W(B -@cindex nndir -@cindex directory groups - -$B$b$7!"$?$/$5$s$N5-;v$,8DJL$N%U%!%$%k$H$7$FF~$C$F$$$k%G%#%l%/%H%j!<$,$"$l(B -$B$P!"$=$l$r%K%e!<%9%0%k!<%W$H$7$F07$&$3$H$,$G$-$^$9!#$b$A$m$s!"%U%!%$%k$O(B -$B?t;z$N%U%!%$%kL>$r$b$C$F$$$J$1$l$P$J$j$^$;$s!#(B - -$B$3$3$G(B Emacs $B$NAG@2$i$7$$%Q%C%1!<%8$NCf$G$b:G$bAG@2$i$7(B -$B$$(B @code{ange-ftp} ($B$H$=$N8e7Q$N(B @code{efs}) $B$K$D$$$F?($l$kNI$$5!2q$G$7$g(B -$B$&!#;d$,(B @code{nndir} $B$r=q$$$?$H$-$O!"$3$l(B --- $B%G%#%l%/%H%j!<$rFI$`%P%C(B -$B%/%(%s%I$K$D$$$F$O$"$^$j9M$($F$$$^$;$s$G$7$?!#$H$s$G$b$J$$$3$H$@$M!#(B - -@code{ange-ftp} $B$O$3$N>p67$r7`E*$KJQ2=$5$;$^$7$?!#Nc$($P!"(B -@code{ange-ftp} $B%U%!%$%k(B -$BL>(B @file{/ftp.hpc.uh.edu:/pub/emacs/ding-list/} $B$r%G%#%l%/%H%j!$H$7$F(B -$BF~NO$7$?$H$9$k$H!"(B@code{ange-ftp} $B$"$k$$$O(B @code{efs} $B$OC5n$r9T$J$&$3$H$O$G$-$^$;$s!#(B@code{nndir} $B$,;H$($k(B -$B$b$N$J$i2?$G$b(B @code{nnmh} $B$"$k$$$O(B @code{nnml} $B$r;H$&$3$H$,$G$-$k$N$G!"(B -$B$b$7FI$_=P$7@lMQ$G$O$J$$(B @code{nndir} $B$,I,MW$@$H;W$C$?$i!"$3$l$i$N$I$A$i(B -$B$+$NJ}K!$K@Z$jBX$($k$3$H$b$G$-$^$9!#(B - -@node Anything Groups -@subsection $B$J$s$G$b%0%k!<%W(B -@cindex nneething - -($B0l$D$N%9%W!<%kIw%G%#%l%/%H%j!<$H2r$lA':w$7$F$^$o$j$^$9!#$b$7$=$N%U%!%$%k$,5-;v$N$h$&$K8+$((B -$B$?$J$i(B ($B$9$J$o$A!":G=i$N?t9T$,%X%C%@!<$N$h$&$K8+$($?$i(B) $B$=$l$r%X%C%@$H$7(B -$B$F;H$$$^$9!#$b$7$=$l$,%X%C%@!<$N$J$$$?$@$NE,Ev$J%U%!%$%k(B ($BNc$($P(B C $B$N%=!<(B -$B%9%U%!%$%k(B) $B$G$"$C$?$J$i!"(B@code{nneething} $B$O%X%C%@!<$r5u6u$+$i:n$j=P$7(B -$B$^$9!#$3$l$O%U%!%$%k$N=jM-A0!"F|IU$r;H$$!"$3$l$i$NMWAG$KBP$7$F$G$-(B -$B$k$3$H$r2?$G$b$d$j$^$9!#(B - -$B$3$l$O$"$J$?$K$H$C$F$OA4$F<+F0E*$K5/$3$k$3$H$G!"$"$J$?$O%K%e!<%9%0%k!<%W(B -$B$K$H$F$bNI$/;w$?2?$+$r8+$;$i$l$k$3$H$K$J$k$G$7$g$&!#$[$s$H$&$K@#J,0c$o$J(B -$B$$!"%K%e!<%9%0%k!<%W$N$h$&$J$b$N$r!#5-;v$rA*Br$9$k$H!"$=$l$O$$$D$b$N$h$&(B -$B$K!"5-;v%P%C%U%!$KI=<($5$l$k$G$7$g$&!#(B - -$B%G%#%l%/%H%j!<$rI=$o$7$F$$$k9T$rA*Br$9$k$H!"(Bgnus $B$O$"$J$?$r$3(B -$B$N(B @code{nneething} $B%0%k!<%W$N$?$a$N?7$7$$35N,%P%C%U%!$KO"$l$F9T$/$G$7$g(B -$B$&!#0J2pJs$r21$($F$*$-$^$;$s!#$b$7(B @kbd{G m} $B$GIaDL$K8G(B -$BDj(B @code{nneething} $B%0%k!<%W$r:n$k$H!"(Bgnus $B$O5-;vHV9f$H%U%!%$%kL>$NBP1~(B -$BI=$r21$($F$*$-!"$3$N%0%k!<%W$rB>$N%0%k!<%W$HF1MM$K07$&$3$H$,$G$-$k$h$&$K(B -$B$J$j$^$9!#8GDj(B @code{nneething} $B%0%k!<%W$r:nF0$5$;$k$H!"L$FI5-;v$,$$$/$D(B -$B4^$^$l$F$$$k$+$rCN$i$5$l$?$j!"$J$I$J$I!#(B - -$B$$$/$D$+$NJQ?t$,$"$j$^$9!#(B - -@table @code -@item nneething-map-file-directory -@vindex nneething-map-file-directory -$BA4$F$N8GDj(B @code{nneething} $B%0%k!<%W$NBP1~I=$O$3$N%G%#%l%/%H%j!<$K3JG<$5(B -$B$l$^$9!#$3$N=i4|@_DjCM$O(B @file{~/.nneething/} $B$G$9!#(B - -@item nneething-exclude-files -@vindex nneething-exclude-files -$B$3$N@55,I=8=$K%^%C%A$9$k%U%!%$%k$O$9$Y$FL5;k$5$l$^$9!#<+F0J]B8%U%!%$%k$J(B -$B$I$r=|$/$N$KJXMx$K;H$($^$9!#$=$7$F$=$l$,$^$5$K=i4|@_Dj$G9T$J$o$l$kF0:n$G(B -$B$9!#(B - -@item nneething-include-files -@vindex nneething-include-files -$B$=$N%U%!%$%k$r%0%k!<%W$K4^$a$k$+$r<($9@55,I=8=$G$9!#$3$NJQ?t(B -$B$,(B @code{nil} $B$G$J$1$l$P!"$3$N@55,I=8=$K9gCW$9$k%U%!%$%k$@$1$,4^$^$l$^$9!#(B - -@item nneething-map-file -@vindex nneething-map-file -$BBP1~I=%U%!%$%k$NL>A0!#(B -@end table - -@node Document Groups -@subsection $BJ8=q%0%k!<%W(B -@cindex nndoc -@cindex documentation group -@cindex help group - -@code{nndoc} $B$O0l$D$N%U%!%$%k$r%K%e!<%9%0%k!<%W$H$7$FFI$`$3$H$r$G$-$k$h(B -$B$&$K$9$k!"$A$g$C$H5$$NMx$$$?$d$D$G$9!#$$$/$D$+$N%U%!%$%kAw7A<0!#(B -@cindex forwarded messages - -@item forward -$BE>Aw$5$l$?5-;v!#(B - -@item nsmail -Netscape mail box$B!#(B - -@item mime-digest -@item mime-parts -MIME $BB>ItJ,%a%C%;!<%8(B (multipart) $B$G$9!#(B - -@item standard-digest -$BI8=`(B (RFC 1153) $B$^$H$aAw$j7A<0!#(B - -@item slack-digest -$BHsI8=`$^$H$aAw$j7A<0(B --- $B$@$$$?$$$O$&$^$/%^%C%A$9$k$,!"$G$b07$$$O2<J,$J%X%C%@!<$rA^F~$7$h(B -$B$&$H$7$?$j$O$7$^$;$s(B --- $BC1=c$K!"%U%!%$%k$r$=$N%0%k!<%W$NA[%5!<%P!A0(B (@dfn{name}) $B$H$=$l$KB3$/@55,I=8=$H2>A[JQ?t@_(B -$BDj$NNs$+$i$J$j$^$9!#0J2<$,$3$l$K;H$($kJQ?t$G$9(B --- $BJQ?t$N?t$K05E]$5$l$J(B -$B$$$G$/$@$5$$!#$[$H$s$I$NJ8=ql9g!"$3$l$O5-;v$N@hF,$K%]%$%s%H$r0\F0$5$;$k4X?t$G$J$/$F$O$J$j(B -$B$^$;$s!#(B - -@item nndoc-head-begin -$B$3$l$,$"$k>l9g!"$3$l$O5-;v$N%X%C%@!<$K%^%C%A$9$k@55,I=8=$G$J$/$F$O$J$j$^(B -$B$;$s!#(B - -@item nndoc-head-end -$B$3$l$O5-;v$N%X%C%@!<$N:G8e$K%^%C%A$7$J$/$F$O$J$j$^$;$s!#$3$N=i4|@_DjCM(B -$B$O(B @samp{^$} --- $B6u9T$G$9!#(B - -@item body-begin-function -$B$3$l$,$"$k>l9g!"$3$N4X?t$O5-;v$N%\%G%#$N3+;O0LCV$K%]%$%s%H$r0\F0$5$;$k4X(B -$B?t$G$J$/$F$O$J$j$^$;$s!#(B - -@item body-begin -$B$3$l$O5-;v$N%\%G%#$N3+;O0LCV$K%^%C%A$7$J$/$F$O$J$j$^$;$s!#$3$N=i4|@_DjCM(B -$B$O(B @samp{^\n} $B$G$9!#(B - -@item body-end-function -$B$3$l$,$"$k>l9g!"$3$N4X?t$O5-;v$N%\%G%#$N:G8e$N0LCV$K%]%$%s%H$r0\F0$5$;$k(B -$B4X?t$G$J$/$F$O$J$j$^$;$s!#(B - -@item body-end -$B$3$l$,$"$l$P!"5-;v$N%\%G%#$N:G8e$K%^%C%A$7$J$/$F$O$J$j$^$;$s!#(B - -@item file-end -$B$3$l$,$"$k>l9g!"$3$l$O%U%!%$%k$N:G8e$K%^%C%A$7$J$/$F$O$J$j$^$;$s!#$3$N@5(B -$B5,I=8=$N8e$m$N%F%-%9%H$OA4$F!"40A4$KL5;k$5$l$^$9!#(B -@end table - -$B$3$N$h$&$K!"$3$l$i$NJQ?t$r;H$C$F(B @code{nndoc} $B$OJ8=q%U%!%$%k$r!"$=$l$>$l(B -$B%X%C%@!<$H%\%G%#$r;}$C$?5-;v$NO"$J$j$H$7$F2rK6$9$k$3$H$,$G$-$^$9!#$7$+$7!"(B -$BA4$F$NJ8=ql9g$KM-MQ$G$9!#(B - -@item article-transform-function -$B$3$l$,$"$l$P!"$3$N4X?t$O5-;v$,MW5a$5$l$?$H$-$K8F$S=P$5$l$^$9!#$3$l$O!"5-(B -$B;v$N%X%C%@!<$H%\%G%#$NN>J}$K$h$j9-HO0O$JJQ7A$r9T$J$&$?$a$K;H$o$l$k$b$N$G(B -$B$9!#(B - -@item generate-head-function -$B$3$l$,$"$l$P!"$3$N4X?t$O(B gnus $B$,M}2r$G$-$k%X%C%@!<$r@8@.$9$k$?$a$K8F$S=P(B -$B$5$l$^$9!#$3$l$O5-;vHV9f$r%Q%i%a!<%?$H$7$F8F$S=P$5$l!"LdBj$N5-;v$N$-$l$$(B -$B$J%X%C%@!<$r@8@.$9$k$3$H$r5a$a$i$l$^$9!#$3$l$OA4$F$N5-;v$N%X%C%@!<$,MW5a(B -$B$5$l$k$H$-$K8F$S=P$5$l$^$9!#(B -@end table - -$B;d$,:n$C$?Cf$G:G$bJ#;($JNc(B --- $BI8=`$^$H$aAw$j7A<0$r8+$F$_$^$7$g$&!#(B - -@example -(standard-digest - (first-article . ,(concat "^" (make-string 70 ?-) "\n\n+")) - (article-begin . ,(concat "\n\n" (make-string 30 ?-) "\n\n+")) - (prepare-body-function . nndoc-unquote-dashes) - (body-end-function . nndoc-digest-body-end) - (head-end . "^ ?$") - (body-begin . "^ ?\n") - (file-end . "^End of .*digest.*[0-9].*\n\\*\\*\\|^End of.*Digest *$") - (subtype digest guess)) -@end example - -70 $BJ8;z$N%@%C%7%e(B(`-')$B$N9T$h$jA0$OA4$FL5;k$5$l$k$H$$$&$N$,J,$+$j$^$9!#$^(B -$B$?(B @samp{^End of} $B$G;O$^$k9T$h$j8e$m$bA4$FL5;k$5$l$^$9!#3F5-;v$O(B 30 $BJ8;z(B -$B$N%@%C%7%e$N9T$G;O$^$j!"%X%C%@!<$H%\%G%#$N6h@Z$j$N9T$O0l8D$N%9%Z!<%9$r4^(B -$B$`$3$H$,$"$j!"$=$7$F%\%G%#$O$=$l$,EO$5$l$kA0(B -$B$K(B @code{nndoc-unquote-dashes} $B$rDL$5$l$^$9!#(B - -$B$"$J$?FH<+$NJ8=qDj5A$r(B @code{nndoc} $B$K@\B3$9$k$K$O!"(B -@code{nndoc-add-type} $B4X?t$r;HMQ$7$^$9!#$3$l$OFs$D$N%Q%i%a!<%?$r$H$j$^(B -$B$9(B --- $B0l$DL\$O$=$NDj5A<+?H$G!"Fs$DL\$N(B ($B>JN,2DG=$J(B) $B%Q%i%a!<%?$O$3$NDj(B -$B5A$r!"J8=ql9g$O(B @code{nil} $B$rJV$7!"$=(B -$B$Nl9g$O(B @code{t} $B$rJV$7!"$=$N$_$=$K3Z$r$5$;$kJ}$r$9$k$N$b;~$K$OJXMx$G$9!#(B - -@sc{soup} $B$H8F$P$l$k%U%!%$%k7A<0$O%K%e!<%9$H%a!<%k$r%5!<%P!<$+$i2H$N%^%7(B -$B%s$X$HE>Aw$7!"$=$l$r$^$?La$9$?$a$K3+H/$5$l$^$7$?!#$A$g$C$HLLE]$/$5$$$+$b(B -$B$7$l$J$$$1$I$M!#(B - -$B$O$8$a$K$$$/$D$+MQ8l$r!#(B - -@table @dfn -@item server -$B$3$l$O30$N@$3&$K7R$,$C$F$$$F!"$"$J$?$,%K%e!<%9$H%a!<%k$rAw$N@$3&$H$$$+$J$k7A$G$b@\B3$5$l$F$$$^$;$s!#(B - -@item packet -$B%a%C%;!<%8$HL?Na$r4^$s$@$b$N!#%Q%1%C%H$K$OFsA0$G$9!#$3$3$G(B @var{x} $B$O?t;z$G$9!#(B - -@item response packets -($BJV?.%Q%1%C%H(B) $B$3$N%Q%1%C%H$O<+Bp%^%7%s$G:n$i$l$k%Q%1%C%H$G!"IaDL$O$"$J(B -$B$?$N=q$$$?JV;v$,4^$^$l$F$$$^$9!#$3$l$i$O=i4|@_Dj$G(B -$B$O(B @file{SoupinX.tgz} $B$H$$$&L>A0$G$9!#$3$3$G(B @var{x} $B$O?t;z$G$9!#(B -@end table -@end table - -@enumerate - -@item -$B$^$:(B @sc{soup} $B%Q%1%C%H$r:n$k$?$a$K%5!<%P!<$K%m%0%$%s$7$^$9!#(B -@sc{soup} $B$N$?$a$N@lMQ$N%V%D(B (@code{awk} $B%W%m%0%i%`$N$h$&$J(B) $B$r;H$C$F$b(B -$BNI$$$7!"(Bgnus $B$N(B @sc{soup} $BL?Na$r;H$C$F%Q%1%C%H$r:n$C$F$bNI$$$G(B -$B$9(B (@kbd{O s} $B$"$k$$$O(B @kbd{G s b} $B$=$7$F(B @kbd{G s p}) - -(@pxref{SOUP Commands})$B!#(B - -@item -$B%Q%1%C%H$r<+Bp$KE>Aw$7$^$9!#EEAw$7$^$9!#(B - -@item -Gnus $B$+$i(B @kbd{G s s} $BL?Na$r;H$C$F$3$N%Q%1%C%H$+$i%a!<%k$r=P$7$^$9!#(B - -@item -$B$"$H$O$3$l$r;`$L$^$GB3$1$^$9!#(B - -@end enumerate - -$B$D$^$j4pK\E*$KFs$$$^$9!#(B - -@item G s w -@kindex G s w (Group) -@findex gnus-soup-save-areas -$BA4$F$N(B @sc{soup} $B%G!<%?%U%!%$%k$rJ]B8$7$^(B -$B$9(B (@code{gnus-soup-save-areas})$B!#(B - -@item G s s -@kindex G s s (Group) -@findex gnus-soup-send-replies -$BJV?.%Q%1%C%H$+$iA4$F$NJV?.$rAw=P$9$k(B (@code{gnus-soup-send-replies})$B!#(B - -@item G s p -@kindex G s p (Group) -@findex gnus-soup-pack-packet -$BA4$F$N%U%!%$%k$r(B @sc{soup} $B%Q%1%C%H$K:-Jq$9(B -$B$k(B (@code{gnus-soup-pack-packet})$B!#(B - -@item G s r -@kindex G s r (Group) -@findex nnsoup-pack-replies -$BA4$F$NJV?.$rJV?.%Q%1%C%H$K:-Jq$9$k(B (@code{nnsoup-pack-replies})$B!#(B - -@item O s -@kindex O s (Summary) -@findex gnus-soup-add-article -$B$3$N35N,%b!<%IL?Na$O!"8=:_$N5-;v$r(B @sc{soup} $B%Q%1%C%H$KDI2C$7$^(B -$B$9(B (@code{gnus-soup-add-article})$B!#$3$l$O%W%m%;%9(B/$B@\F,0z?t$N=,47$K=>$$$^(B -$B$9(B (@pxref{Process/Prefix})$B!#(B -@end table - -gnus $B$,$3$l$i$N!#=i4|@_DjCM(B -$B$O(B @samp{gnus-prefix}$B!#(B - -@item gnus-soup-packer -@vindex gnus-soup-packer -@sc{soup} $B%Q%1%C%H$r:-Jq$9$kL?NaJ8;zNs$N7A<0!#=i4|@_DjCM(B -$B$O(B @samp{tar cf - %s | gzip > $HOME/Soupout%d.tgz}$B!#(B - -@item gnus-soup-unpacker -@vindex gnus-soup-unpacker -@sc{soup} $B%Q%1%C%H$rl=j!#=i4|@_DjCM$O(B @file{~/}$B!#(B - -@item gnus-soup-packet-regexp -@vindex gnus-soup-packet-regexp -@code{gnus-soup-packet-directory} $BFb$N(B @sc{soup} $B%Q%1%C%H$K%^%C%A$9$k@5(B -$B5,I=8=!#(B -@end table - -@node SOUP Groups -@subsubsection @sc{soup} $B%0%k!<%W(B -@cindex nnsoup - -@code{nnsoup} $B$O(B @sc{soup} $B%Q%1%C%H$rFI$`$?$a$N%P%C%/%(%s%I$G$9!#$3$l$O(B -$BF~$C$F$-$?%Q%1%C%H$rFI$_!"$=$l$r$l$N%a%C%;!<%8$H:w0z%U%!%$%k$r$3$N%G%#%l%/(B -$B%H%j!<$K0\F0$5$;$k!#=i4|@_Dj$O(B @file{~/SOUP/}$B!#(B - -@item nnsoup-replies-directory -@vindex nnsoup-replies-directory -$BA4$F$NJV?.$O!"JV?.%Q%1%C%H$K:-Jq$5$l$kA0$K$3$N%G%#%l%/%H%j!<$K3JG<$5$l$k!#(B -$B=i4|@_Dj$O(B @file{~/SOUP/replies/"}$B!#(B - -@item nnsoup-replies-format-type -@vindex nnsoup-replies-format-type -$BJV?.%Q%1%C%H$N(B @sc{soup} $B7A<0!#=i4|@_DjCM(B -$B$O(B @samp{?n} (rnews) $B$G!"$3$NJQ?t$K$O?($k$Y$-$G$O$J$$$H;d$O;W$$$^$9!#$?(B -$B$V$sJ8=q$KL@5-$9$Y$-$G$5$($J$+$C$?$M!#$A$'$C(B! $B$b$&pJs$r3JG<$9$k>l=j!#$3$l$O(B @code{nntp} $B$N0UL#(B -$B$G$N(B ``$B%"%/%F%#%V%U%!%$%k(B'' $B$G$O$J$/!"(BEmacs Lisp $B$N%U%!%$%k$G$9!#$3$N%U%!(B -$B%$%k$rL5$/$7$F$7$^$C$?$j!"2?$+2u$7$F$7$^$C$?$i!"$"$J$?$O;`$K$^$9!#=i4|@_(B -$BDjCM$O(B @file{~/SOUP/active} $B$G$9!#(B - -@item nnsoup-packer -@vindex nnsoup-packer -$BJV?.(B @sc{soup} $B%Q%1%C%H$r:-Jq$9$kL?NaJ8;zNs$N7A<0!#=i4|@_DjCM(B -$B$O(B @samp{tar cf - %s | gzip > $HOME/Soupin%d.tgz}$B!#(B - -@item nnsoup-unpacker -@vindex nnsoup-unpacker -$BF~$C$F$/$k(B @sc{soup} $B%Q%1%C%H$rl=j!#=i4|@_DjCM$O(B @file{~/}$B!#(B - -@item nnsoup-packet-regexp -@vindex nnsoup-packet-regexp -$BF~$C$F$-$?(B @sc{soup} $B%Q%1%C%H$K%^%C%A$9$k@55,I=8=!#=i4|@_DjCM(B -$B$O(B @samp{Soupout}$B!#(B - -@item nnsoup-always-save -@vindex nnsoup-always-save -@code{nil} $B0J30$G$"$l$P!"%a%C%;!<%8$rEj9F$7$?8e$KJV?.%P%C%U%!$rJ]B8$9$k!#(B -@end table - -@node SOUP Replies -@subsubsection SOUP $BJV?.(B - -$BC1$K(B @code{nnsoup} $B$r;H$&$@$1$G$O!"(B@sc{soup} $BJV?.%Q%1%C%HCf$N$"$J$?$NEj(B -$B9F$H%a!<%k$NAw?.$,!"KbK!$N$h$&$K<+F0E*$K=*N;$9$k$o$1$G$O$"$j$^$;$s!#$=$l(B -$B$r5/$3$9$K$O$b$&$A$g$C$HF/$+$J$/$F$O$$$1$^$;$s!#(B - -@findex nnsoup-set-variables -@code{nnsoup-set-variables} $BL?Na$O!"$"$J$?$NA4$F$N%U%)%m!<%"%C%W5-;v$HJV(B -$B?.$r(B @sc{soup} $B%7%9%F%`$K3No$K;w$F$$$F!"$=$N%5!<%P!<$N%M%C%H%o!<%/%"(B -$B%I%l%9$r;XDj$9$k$@$1$K$J$C$F$$$^$9!#(B - -@sc{imap} $B$K$OFs$D$NFCH$7$F2<$5$$!#(B - -@sc{imap} $B$r%a!<%k$rCyB"$9$k%W%m%H%3%k$H$7$F;H$$$?$$$H$-$O!"(B -gnus-secondary-select-methods $B$K(B nnimap $B$rEPO?$7$F2<$5$$!#$3$l$K$h$C(B -$B$F(B gnus $B$O(B @sc{imap} $B%5!<%P!<$KCyB"$5$l$F$$$k%a!<%k$rA`:n$9$k$h$&$K$J$j(B -$B$^$9!#$3$l$,$3$3$G@bL@$9$k;H$$J}$G$9!#(B - -$B$$$/$D$+$N(B @sc{imap} $B%5!<%P!<$r(B @code{~/.gnus} $B$G@_Dj$9$k$H!"$?$V$s$3$N(B -$B$h$&$J$b$N$K$J$k$G$7$g$&(B: - -@lisp -(setq gnus-secondary-select-methods - '((nnimap "simpleserver") ; $BIaDL$N@_Dj(B - ; SSH $B%]!<%H$r%U%)%o!<%I$7$?%5!<%P!<(B: - (nnimap "dolk" - (nnimap-address "localhost") - (nnimap-server-port 1430)) - ; $B%m!<%+%k%[%9%H$G1?E>$7$F$$$k(B UW $B%5!<%P!<(B: - (nnimap "barbar" - (nnimap-server-port 143) - (nnimap-address "localhost") - (nnimap-list-pattern ("INBOX" "mail/*"))) - ; $BF?L>$G;H$($k(B cyrus $B$N8x=0%5!<%P!<(B: - (nnimap "cyrus.andrew.cmu.edu" - (nnimap-authenticator anonymous) - (nnimap-list-pattern "archive.*") - (nnimap-stream network)) - ; $BI8=`$G$O$J$$%]!<%H$N(B SSL $B%5!<%P!<(B: - (nnimap "vic20" - (nnimap-address "vic20.somewhere.com") - (nnimap-server-port 9930) - (nnimap-stream ssl)))) -@end lisp - -$B0J2<$NJQ?t$O2>A[(B @code{nnimap} $B%5!<%P!<$r:n@.$9$k$?$a$K;H$&$3$H$,$G$-$^(B -$B$9!#(B - -@table @code -@item nnimap-address -@vindex nnimap-address - -$B1s3V(B IMAP $B%5!<%P!<$N%"%I%l%9$G$9!#;XDj$5$l$F$$$J$$>l9g$O2>A[%5!<%P!<$N$b(B -$B$N$K$J$j$^$9!#(B - -@item nnimap-server-port -@vindex nnimap-server-port -$B@\B3$r;n$_$k%5!<%P!<$N%]!<%H$G$9!#=i4|CM$G$O!"%]!<%H(B 143 $B$+!"(BSSL $B$G(B -$B$O(B 993 $B$G$9!#(B - -$B$3$l$O@0?t$G$J$1$l$P$J$j$^$;$s!#0J2<$O%5!<%P!<;XDj$NNc$G$9!#(B - -@lisp -(nnimap "mail.server.com" - (nnimap-server-port 4711)) -@end lisp - -@item nnimap-list-pattern -@vindex nnimap-list-pattern -$B;HMQ2DG=$J%a!<%k%\%C%/%9$r@)8B$9$k$?$a$NJ8;zNs$+%j%9%H$G$9!#$3$l$O!"%5!<(B -$B%P!<$KHs>o$KB?$/$N%a!<%k%\%C%/%9$,$"$k$1$l$I!"6=L#$N$"$k$b$N$O>/$7$@$1$G(B -$B$"$k$H$-$K;HMQ$7$^$9!#%5!<%P!<$K$O%[!<%`%G%#%l%/%H%j!<$r(B IMAP $B7PM3$G=P$9(B -$B$b$N$b$"$j$^$9$N$G!"$=$N>l9g$O$*$=$i$/%a!<%k%\%C%/%9(B -$B$r(B @file{~/Mail/*} $B$K@)8B$7$?$$$G$7$g$&!#(B - -$BJ8;zNs$O(B REFERENCE $B$H>e$NJ8;zNs$H$N(B cons $B$G$"$k$3$H$b$G$-$^$9!#$I(B -$B$N(B REFERENCE $B$,;HMQ$5$l$k$+$O%5!<%P!l9g!"JQ(B -$B?t(B @code{imap-shell-program} $B$O2?$N%W%m%0%i%`$r8F$V$+$r;XDj$7$^$9!#(B - -@item nnimap-authenticator -@vindex nnimap-authenticator - -$B%5!<%P!<$K@\B3$9$k$?$a$K;H$o$l$kG'>Z$G$9!#=i4|@_Dj$G$O!"(Bnnimap $B$O%5!<%P!<(B -$B$,;HMQ2DG=$J0lHV0BA4$JG'>Z$r;HMQ$7$^$9!#(B - -$B0J2<$O%5!<%P!<;XDj$NNc$G$9!#(B - -@lisp -(nnimap "mail.server.com" - (nnimap-authenticator anonymous)) -@end lisp - -@code{nnimap-authenticator} $B$NCM$O%7%s%\%k$G$J$1$l$P$J$i$J$$$3$H$KCm0U$7(B -$B$F2<$5$$(B! - -@itemize @bullet -@item -@dfn{gssapi:} GSSAPI ($BIaDL$O(B kerberos 5) $BG'>Z$G$9!#30It%W%m%0%i(B -$B%`(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 -@dfn{login:} LOGIN $B7PM3$G$N@8$N(B $BMxMQ(B/$B%Q%9%o!<%I(B $B$G$9!#(B -@item -@dfn{anonymous:} $BEE;R%a!<%k%"%I%l%9$r%Q%9%o!<%I$H$7!"(B`anonymous' $B$H$7$F(B -$B%m%0%$%s$7$^$9!#(B -@end itemize - -@item nnimap-expunge-on-close -@cindex Expunging -@vindex nnimap-expunge-on-close - -$B%Q%k%a%K%G%9$H0c$C$F!"(BIMAP $B$N@_7W\$7$/@bL@$9$k$H!"(BIMAP $B$OC(B -$B5n$7$J$$!"5-;v$K(B @code{Deleted} $B$H$$$&0u$rIU$1$k35G0$,$"$j!"$3$l(B ($B$($C(B -$B$H!"(B@code{Deleted} $B$H$$$&0u$rIU$1$k$3$H$G$9(B) $B$,(B nnimap $B$,(B Gnus $B$G5-;v$r(B -$B>C5n$9$k$H$-$K$9$k$3$H$G$9(B (@kbd{G DEL} $B$J$I$G(B)$B!#(B -($BLuCm(B: $B%Q%k%a%K%G%9$O5*85A0(B 5 $B@$5*$N%.%j%7%"$N(B Elea $BGI$NE/3XC5n$5$l$F$$$J$$$N(B -$B$G!"C5n$9$k$?$a$NJ}K!$,I,MW$H$J$j$^$9!#=[4D$7$F$$$k$h$&$K46$8$^$9(B -$B$+(B? - -$BEAE}E*$K!"(Bnnimap $B$O%a!<%k%\%C%/%9$rJD$8$k$H$-$K(B @code{Deleted} $B$H$$$&0u(B -$B$NIU$$$?A4$F$N5-;v$r>C5n$7$F$-$^$7$?$,!":#$O%5!<%P!C5n$7$^$9!#(B -@item never -$B7h$7$F5-;v$r>C5n$7$^$;$s!#8=:_$O!">C5n$N0u$,IU$$$?5-;v$r(B nnimap $B$GI=<($9(B -$B$kJ}K!$O$"$j$^$;$s$,!"B>$N(B IMAP $B%/%i%$%"%s%H$O$G$O$G$-$k$+$b$7$l$^$;$s!#(B -$BC5n$5$l$?5-;v$r:o=|$9$k$+$I$&$+(B -$B$r?R$M$^$9!#(B -@end table - -@item nnimap-importantize-dormant -@vindex nnimap-importantize-dormant - -$BHs(B nil $B$@$C$?$i!"B>$N(B IMAP $B%/%i%$%"%s%H$N$?$a$KJ]N15-;v$r0uIU$-$H$7$F$b(B -$B0u$rIU$1$^$9!#(Bgnus $B$NFbIt$G$O!"J]N15-;v$O85!9$9$G$K0uIU$-$H$7$F$N$_0u$,(B -$BIU$1$i$l$F$$$^$9!#$3$l$O!"B>$N(B IMAP $B%/%i%$%"%s%H$K$*$1$kJ]N15-;v$r!"$"$?(B -$B$+$b0uIU$-$N$h$&$K$-$oN)$?$;$^$9!#(B($BJL$N8@$$J}$r$9$k$H!"(Bgnus $B$OFs$D$N0u$r(B -$BIU$1!"(BIMAP $B$O$?$C$?0l$D$@$H$$$&$3$H$G$9!#(B) - -$B$?$V$s$3$l$r$$$8$j$^$o$9$N$O!"$"$J$?$,%f!<%6C10L$NJ]N1%U%i%0$rIU$1$h$&$H(B -$B$9$k$@$1$NM}M3$K$h$k$G$7$g$&!#$3$s$J46$8$G(B: - -@lisp -(setcdr (assq 'dormant nnimap-mark-to-flag-alist) - (format "gnus-dormant-%s" (user-login-name))) -(setcdr (assq 'dormant nnimap-mark-to-predicate-alist) - (format "KEYWORD gnus-dormant-%s" (user-login-name))) -@end lisp - -$B$3$N>l9g!"$"$J$?$O%f!<%6C10L$NJ]N1%U%i%0$r!"B>$N%f!<%6$K0uIU$-$H$7$F8+$i(B -$B$l$?$/$J$$$H;W$C$F$$$^$9!#(B - -@item nnimap-expunge-search-string -@cindex Expunging -@vindex nnimap-expunge-search-string - -$B$3$NJQ?t$K$O!"4|8B@Z$l>C5n$9$k$N$,K>$^$7$$5-;v$rC5$9$H$-$K%5!<%P!<$KAw$C(B -$B$?(B IMAP $B$N8!:w%3%^%s%I$,F~$C$F$$$^$9!#%G%#%U%)%k%H(B -$B$O(B @code{"UID %s NOT SINCE %s"} $B$G!"$3$3$G:G=i$N(B @code{%s} $B$O(B UID $B$GCV$-(B -$B49$($i$l!"FsHVL\$N(B @code{%s} $B$OF|IU$GCV$-49$($i$l$^$9!#(B - -$B$?$V$s;H$$$b$N$K$J$kJL$NCM$O(B @code{"UID %s NOT SENTSINCE %s"} $B$G!"(B -nnimap $B$K5-;v$NFbItE*$JF|IU$NBe$o$j$K(B Date: $B$r;H$&$h$&$K$5$;$^$9!#$5$i$J(B -$B$k>pJs$d;H$&$3$H$,$G$-$kJ8;zNs$K$D$$$F$O!"(BRFC 2060 $B$N%;%/%7%g%s(B 6.4.4 $B$r(B -$B8+$F$/$@$5$$!#(B - -@item nnimap-authinfo-file -@vindex nnimap-authinfo-file - -$B%5!<%P$K%m%0%$%s$9$k$?$a$K;H$&G'>Z>pJs(B (authinfo) $B$r4^$`%U%!%$%k$G$9!#$=(B -$B$N7A<0$O(B ($B$[$H$s$I(B) @code{ftp} $B$N(B @file{~/.netrc} $B%U%!%$%k$HF1$8$G$9!#87(B -$BL)$JDj5A$O!"JQ?t(B @code{nntp-authinfo-file} $B$r8+$F2<$5$$!#$=$7(B -$B$F(B @ref{NNTP} $B$b8+$F2<$5$$!#(B -@end table - -@menu -* Splitting in IMAP:: nnimap $B$G%a!<%k$rJ,3d$9$k(B -* Editing IMAP ACLs:: $B%a!<%k%\%C%/%9$X$NB>$NMxMQA0$r;XDj$7$?J8;zNs$+J8;zNs$N%j%9(B -$B%H$G$9!#=i4|CM$O(B @code{nil} $B$G!"J,3d$O;HMQ$7$J$$$h$&$K$J$C$F$$$^$9(B! - -@lisp -(setq nnimap-split-inbox - '("INBOX" ("~/friend/Mail" . "lists/*") "lists.imap")) -@end lisp - -Nnmail $B$KBP1~$9$k$b$N$O$"$j$^$;$s!#(B - -@item nnimap-split-rule -@cindex Splitting, rules -@vindex nnimap-split-rule - -@code{nnimap-split-inbox} $B$G8+$D$+$C$??7$7$$%a!<%k$O$3$NJQ?t$K=>$C$FJ,3d(B -$B$5$l$^$9!#(B - -$B$3$NJQ?t$O%j%9%H$N%j%9%H$+$i@.$j$^$9!#I{%j%9%H$N:G=i$NMWAG$O(B IMAP $B$N%a!<(B -$B%k%\%C%/%9$G!"Fs$D$a$NMWAG$N@55,I=8=$K9gCW$7$?5-;v$N0\F0@h$r;XDj$7$^$9!#(B -$B$o$+$j$^$7$?$+(B? $B$$$$$(!";d$b$o$+$j$^$;$s!#Nc$,I,MW$G$9!#(B - -@lisp -(setq nnimap-split-rule - '(("INBOX.nnimap" - "^Sender: owner-nnimap@@vic20.globalcom.se") - ("INBOX.junk" "^Subject:.*MAKE MONEY") - ("INBOX.private" ""))) -@end lisp - -$B$3$l$O(B nnimap $B%a!<%j%s%0%j%9%H$+$i$NA4$F$N5-;v$r%a!<%k%\%C%/(B -$B%9(B INBOX.nnimap $B$KF~$l!"(BSubject: $B9T$K(B MAKE MONEY $B$N$"$kA4$F$N5-;v(B -$B$r(B INBOX.junk $B$KF~$l!"$=$NB>A4$F$N$b$N$r(B INBOX.private $B$KF~$l$^$9!#(B - -$B:G=i$NJ8;zNs$O!"(Breplace-match $B$G9gCW$7$?%F%-%9%H$+$iI{I=8=$rA^F~$9$k$H$-(B -$B$K;HMQ$5$l$k$N$HF1$8$h$&$J!"(B`\\1' $B7A<0$r4^$`$3$H$,$G$-$^$9!#Nc$($P(B: - -@lisp -("INBOX.lists.\\1" "^Sender: owner-\\([a-z-]+\\)@@") -@end lisp - -$BFs$DL\$NMWAG$O4X?t$G$"$k$3$H$b$G$-$^$9!#$=$N>l9g$O!"5-;v$N%X%C%@!<$,$"$k(B -$B%P%C%U%!$G!"$=$N5,B'$N:G=i$NMWAG$r0z?t$H$7$F8F$P$l$^$9!#%a!<%k$,$=$N%0%k!<(B -$B%W$KB0$9$k$H9M$($k>l9g$O!"(B@code{nil} $B$G$J$$CM$rJV$9I,MW$,$"$j$^$9!#(B - -Nnmail $B$NMxMQe$NNc$N$h$&$K(B)$B!#$3$l(B -$B$O(B nnimap $B$G$OI,MW$G$O$"$j$^$;$s!#@55,I=8=$N$I$l$K$b9gCW$7$J$$5-;v(B -$B$O(B inbox $B$+$i0\F0$5$l$^$;$s!#(B(inbox $B$KL$FI5-;v$rBgNL$KCV$$$F$*$/$H!"J,3d(B -$B$N%3!<%I$O?7$7$$%a!<%k$r!$A(B" $B$^$9!#Aj8_Ej9F(B -$B$r$7$F$$$k>l9g$O!"A4$F$N9gCW$7$?5,B'$,(B "$B>!$A(B" $B$^$9!#(B - -$B$3$NJQ?t$O$=$NCM$H$7$F4X?t$r;}$D$3$H$b$G$-$^$9!#$=$N4X?t$O5-;v$N%X%C%@$N(B -$BItJ,$KHO0O$,69$a$i$l$?>uBV$G8F$P$l!"5-;v$N0\F0@h$@$H;W$&%0%k!<%W$rJV$9$b(B -$B$N$G$J$1$l$P$J$j$^$;$s!#(B@code{nnimap-split-fancy} $B$r;2>H$7$F2<$5$$!#(B - -$BJ,3d%3!<%I$OI,MW$J$i%a!<%k%\%C%/%9$r:n@.$7$^$9!#(B - -$B0[$J$k2>A[%5!<%P!A[%5!<%P!$Oe5-$NJ,3d$N5,B'$NJ}$G$9!#(B - -Nnmail $B$GBP1~$9$k$b$N(B: @code{nnmail-split-methods}. - -@item nnimap-split-predicate -@cindex splitting -@vindex nnimap-split-predicate - -$B$3$N=R8l$K%^%C%A$9$k(B @code{nnimap-split-inbox} $B$K$"$k%a!<%k$OJ,3d$5$l$^(B -$B$9!#$3$l$OJ8;zNs$G4{DjCM$O(B @samp{UNSEEN UNDELETED} $B$G$9!#(B - -$B$b$7$"$J$?$,(B inbox $B$K$"$k%a!<%k$rFI$`$?$a$KJL$N(B @sc{imap} $B%/%i%$%"%s%H$r(B -$B;H$C$F$$$k$,!"9XFIEY$K4X$o$i$:$K$9$Y$F$N5-;v$r(B gnus $B$KJ,3d$5$;$?$$$J$i$P!"(B -$B$3$l$OLr$KN)$D$+$b$7$l$^$;$s!#$=$N>l9g$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(B -$B$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 -@subsubsection IMAP $B$N(B ACL $B$rJT=8$9$k!#(B -@cindex editing imap acls -@cindex Access Control Lists -@cindex Editing IMAP ACLs -@kindex G l -@findex gnus-group-nnimap-edit-acl - -ACL $B$O(B Access Control List ($B;HMQ@)8B0lMw(B) $B$NN,$G$9!#(BIMAP $B$G$O(B ACL $B$OB>$N(B -$BMxMQ\$7$$;X<($H$H$b$K(B ACL $BJT=8%&%#%s%I%&$,8=$l$^$9!#(B - -$B;HMQ$NNc(B: - -@itemize @bullet -@item -$B%a!<%j%s%0%j%9%H$N%a!<%k%\%C%/%9$G(B "anyone" $B$K(B "lrs" $B5v(B -$B2D(B (lookup, read, seen/unseen $B%U%i%0$NJ];}(B) $B$rM?$($k$3$H$G!"F1$8%5!<%P!<(B -$B$NB>$NMxMQ/$J$/$H$b(B Cyrus $B$N%5!<%P!<$K$*$$$F$O!"(B"plussing" $B$,F0:n$9$k$?$a$K(B ($B$D$^(B -$B$j!"(Buser+mail@@domain $B$,(B INBOX.mailbox $B$H$$$&(B IMAP $B$N%a!<%k%\%C%/%9$K$J(B -$B$k(B)$B!"MxMQC5n$5$l$?5-;v$rC5n$5$l$?5-;v$rI=<($9$kJ}K!$O$"$j$^$;$s!#$?$@>C5n$G$-$k$@$1(B -$B$G$9!#(B - -@node Combined Groups -@section $B7k9g%0%k!<%W(B - -Gnus $B$O!"A4$F$N%0%k!<%W$NA[%0%k!<%W(B -@cindex nnvirtual -@cindex virtual groups - -nnvirtual $B%0%k!<%W(B (@dfn{nnvirtual group}) $B$O$N%0%k!<%W$N=89g0J>e(B -$B$N2?J*$G$b$"$j$^$;$s!#(B - -$BNc$($P!"$b$7>.$5$J%0%k!<%W$r$?$/$5$sFI$`$N$,7y$K$J$C$F$-$?$i!"$=$l$i$r0l(B -$B$D$NBg$-$J%0%k!<%W$KF~$l$F!"7y$K$J$k$/$i$$5pBg$GA[%0%k!<%WFb$GIU$1$i$l$?A4$F$N0u$O!"$=$N9=@.%0%k!<%W$N5-;v$K$/$C$D$1$i(B -$B$l$^$9!#$D$^$j!"$b$72>A[%0%k!<%WFb$G5-;v$K2D;k5-;v$N0u$r$D$1$k$H!"$=$N5-(B -$B;v$O$b$H$b$H$N9=@.%0%k!<%W$NCf$G$b2D;k5-;v$K$J$j$^$9!#(B($B$=$7$F5U$b@.$jN)(B -$B$A$^$9(B --- $B9=@.%0%k!<%WFb$GIU$1$?0u$O2>A[%0%k!<%WFb$G$bI=<($5$l$^$9!#(B) - -$B$3$l$,!"(BAndrea Dworkin $B$K4X$9$kA4$F$N%K%e!<%9%0%k!<%W$r!"0l$D$N5pBg$G%7(B -$B%"%o%;$J%K%e!<%9%0%k!<%W$K$^$H$a$k(B @code{nnvirtual} $BJ}K!$NNc$G$9!#(B - -@lisp -(nnvirtual "^alt\\.fan\\.andrea-dworkin$\\|^rec\\.dworkin.*") -@end lisp - -$B9=@.%0%k!<%W$O4pK\%0%k!<%W$G$b30It%0%k!<%W$G$b9=$$$^$;$s!#A4$FLdBjL5$/F0(B -$B$/$O$:$G$9$,!"$b$7$"$J$?$N%3%s%T%e!<%?!<$,GzH/$G$b$7$F$7$^$C$?$i!"$=$l$O(B -$B$?$V$s;d$,0-$$$s$G$7$g$&$M!#(B - -$B$$$/$D$+$N%5!<%P!<$+$iF1$8%0%k!<%W$r=8$a$k$3$H$O!"MxMQl9g$O!"Hs>o$KNI$$(B -$B$+$bCN$l$^$;$s!#$b$7$"$J$?$,(B @samp{soc.motss} $B$r!"F|K\$N%5!<%P!<$H%N%k%&%'!<(B -$B$N%5!<%P!<$NN>J}$+$iFI$_$?$1$l$P!"%0%k!<%W$N@55,I=8=$H$7$F0J2<$NCM$,;H$((B -$B$^$9!#(B - -@example -"^nntp\\+server\\.jp:soc\\.motss$\\|^nntp\\+server\\.no:soc\\.motss$" -@end example - -($B$G$b$A$g$C$HCm0U!#(B@kbd{G m} $B$G%0%k!<%W$r:n@.$9$k$H$-$O!"%P%C%/%9%i%C%7%e(B -$B$rFs=E$KIU$1$F$O$$$1$^$;$s!#$=$7$FJ8;zNs$N:G=i$H:G8e$N0zMQ5-9f$bJ}$N%0%k!<%W$N5-;v$OA4It40A4(B -$B$K0l$D$N%0%k!<%W$K$J$j!"=EJ#$bL5$$$O$:$G$9!#%9%l%C%II=<((B ($B$H$=$NB>(B) $B$bDL(B -$B>oDL$j$&$^$/F0:n$9$k$G$7$g$&$1$I!"5-;v$NJB$V=g=x$K$OLdBj$,$"$k$+$b$7$l$^(B -$B$;$s!#F|IU$K$h$kJB$YBX$($O$3$3$G$O;EMM30$H$J$k$+$b$7$l$^$;(B -$B$s(B (@pxref{Selecting a Group})$B!#(B - -$B$J$*!"$3$3$G0l$D$@$1@)8B$,$"$j$^$9(B --- $B2>A[%0%k!<%W$K4^$^$l$k%0%k!<%W$O(B -$BA4$F@8$-$F$$$k(B($B$9$J$o$A!"9XFI$^$?$OHs9XFI$N(B)$B>uBV$G$J$/$F$O$J$j$^$;$s!#:o(B -$B=|$"$k$$$O%>%s%S%0%k!<%W$O(B @code{nnvirtual} $B%0%k!<%W$N9=@.%0%k!<%W$K$J$k(B -$B$3$H$O$G$-$^$;$s!#(B - -@vindex nnvirtual-always-rescan -@code{nnvirtual-always-rescan} $B$,(B @code{nil} $B0J30$G$"$l$P!"(B -@code{nnvirtual} $B$O2>A[%0%k!<%W$KF~$C$?$H$->o$K!"L$FI5-;v$rAv::$7$^$9!#(B -$B$3$NJQ?t$,(B @code{nil} ($B$3$l$,=i4|@_Dj(B)$B$G$"$C$F!"2>A[%0%k!<%W$r:n@.$7$?8e(B -$B$K9=@.%0%k!<%WFb$N5-;v$rFI$s$@>l9g$O!"$=$N9=@.%0%k!<%W$GFI$^$l$?5-;v$O!"(B -$B2>A[%0%k!<%W$KF~$C$?$H$-$KI=<($5$l(B $B$k$G$7$g$&!#$b$76&DL$N9=@.%0%k!<%W$r(B -$B;}$DFs$D$N2>A[%0%k!<%W$,$"$k>l9g$K$b$3$N1F6A$,$"$j$^$9!#$=$N>l9g$O$3$NJQ(B -$B?t$r(B @code{t} $B$K$7$?J}$,NI$$$G$9!#$"$k$$$O2>A[%0%k!<%W$KF~$k;~$K!"Kh2s$=(B -$B$N%0%k!<%W$N>e$G(B @code{M-g} $B$rC!$$$F$bNI$$$G$9(B --- $B$3$l$O$[$\F1MM$N8z2L(B -$B$,$"$j$^$9!#(B - -@code{nnvirtual} $B$O%a!<%k$H%K%e!<%9$NN>J}$N%0%k!<%W$r9=@.%0%k!<%W$H$9$k(B -$B;v$,$G$-$^$9!#(B@code{nnvirtual} $B%0%k!<%W$N5-;v$KJVEz$9$k$H$-$O!"(B -@code{nnvirtual} $B$O5-;v$N=P=j$N9=@.%0%k!<%W$N%P%C%/%(%s%I$K$=$l$,%K%e!<(B -$B%9$N%P%C%/%(%s%I$G$"$k$+%a!<%k$N%P%C%/%(%s%I$G$"$k$+$r?R$M$J$1$l$P$J$j$^(B -$B$;$s!#$7$+$7!"(B@kbd{^} $B$r$7$?$H$-$K$O!"IaDL$O9=@.%P%C%/%(%s%I$,$3$l$rCN$k(B -$B3N$+$JJ}K!$O$J$/!"$=$N>l9g$O!"(B@code{nnvirtual} $B$O(B gnus $B$K5-;v$O%K%e!<%9(B -$B$G$J$$%P%C%/%(%s%I$+$iMh$?$H9p$2$k;v$K$J$j$^$9!#(B($B0BA4$N$?$a$K!#(B) - -$B$3$N$h$&$J>l9g$O!"%a%C%;!<%8%P%C%U%!$G$N(B @kbd{C-c C-t} $B$,1~Ez$7$h$&$H$7(B -$B$F$$$k5-;v$+$i(B @code{Newsgroups} $B9T$rH4$-=P$7$FA^F~$7$^$9!#(B - -@node Kibozed Groups -@subsection Kiboze $B%0%k!<%W(B -@cindex nnkiboze -@cindex kibozing - -@dfn{Kiboze} $B$9$k!"$H$O!"(B``$B%K%e!<%9%9%W!<%kA4It(B ($B$"$k$$$O$=$N0lIt(B) $B$+(B -$B$i(B grep $B$9$k$3$H(B'' $B$H%*%C%/%9%U%)!<%IBg<-E5$K$h$C$FDj5A$5$l$F$$$^$9!#(B -@code{nnkiboze} $B$O$3$l$r$"$J$?$N$?$a$K9T$C$F$/$l$k%P%C%/%(%s%I$G$9!#4r$7(B -$B$$$M(B! $B$3$l$G$I$s$J(B @sc{nntp} $B%5!<%P!<$G$b!"Lr$KN)$?$J$$MW5a$G;_$^$C$F$7(B -$B$^$&$^$G9s;H$9$k$3$H$,$G$-$k$M!#$"$"!"$J$s$F9,$;$J$s$@(B! - -@kindex G k (Group) -kiboze $B%0%k!<%W$r:n@.$9$k$K$O!"%0%k!<%W%P%C%U%!$G(B @kbd{G k} $BL?Na$r;H$$$^(B -$B$9!#(B - -@code{nnkiboze} $BJ}K!$K$*$1$k%"%I%l%9Ms$O!"(B@code{nnvirtual} $B$HF1MM$K!"(B -@code{nnkiboze} $B$K(B ``$B4^$a$?$$(B'' $B%0%k!<%W$K%^%C%A$9$k@55,I=8=$G$9!#$3$3(B -$B$,(B @code{nnkiboze} $B$H(B @code{nnvirtual} $B%P%C%/%(%s%I$N:G$bN`;w$7$F$$$kE@(B -$B$G$9!#(B - -$B$3$N9=@.%0%k!<%W$rNs5s$9$k@55,I=8=$K2C$($F!"(B@code{nnkiboze} $B%0%k!<%W$K$O!"(B -$B%0%k!<%WFb$N$I$N5-;v$r4^$a$k$+$r7h$a$k%9%3%"%U%!%$%k$,$J$/$F$O$J$j$^$;(B -$B$s(B (@pxref{Scoring})$B!#(B - -@kindex M-x nnkiboze-generate-groups -@findex nnkiboze-generate-groups -$B$"$J$?$NM_$7$$(B @code{nnkiboze} $B%0%k!<%W$r:n@.$7$?8e$K$O!"(B -@kbd{M-x nnkiboze-generate-groups} $B$rpJs$r3JG<$9$k!"(B@file{.newsrc} $B$NJd=u%U%!%$%k(B -$B$G$9!#(B - -@code{nnkiboze} $B%0%k!<%WFb$N4{FI$H$J$C$?5-;v$O!"$=$N5-;v$N(B @sc{nov} $B9T(B -$B$,(B @sc{nov} $B%U%!%$%k$+$i:o=|$5$l$^$9!#(B - -@node Gnus Unplugged -@section Gnus $B$N@Z$jN%$7(B -@cindex offline -@cindex unplugged -@cindex Agent -@cindex Gnus Agent -@cindex Gnus Unplugged - -$B$$$K$7$($N;~Be(B($B$*$h$=(B 1988 $BG/(B2$B7n:"(B)$B!"?M!9$O%K%e!<%9%j!<%@!<$r!"Bg$-$J%^(B -$B%7%s$N>e$G%M%C%H%o!<%/$K1JB3E*$K@\B3$7$FAv$i$;$F$$$^$7$?!#%K%e!<%9$NG[Aw(B -$B$O%K%e!<%9%5!<%P!<$K$h$C$Fe$i$J$$$h$&$K!"(B -$BA4$F$N%K%e!<%9$H%a!<%k$r5[$$>e$2!"EEOC$r@Z$j!"?t;~4V3]$1$FFI$_!"$=$7$FAw(B -$B$j$?$$JV?.$rA4$FAw?.$9$k!"$H$$$&e$G%K%e!<(B -$B%9$rFI$`?M$,$"$J$?$7$+$$$J$1$l$P!"%K%e!<%9%5!<%P!<$N5!G=$r%K%e!<%9%j!<%@!<(B -$B$KG$$;$k$h$&$K$9$k$3$H$OM}$K$+$J$C$F$$$^$9!#(B - -Gnus $B$r(B ``$B%*%U%i%$%s(B'' $B$N%K%e!<%9%j!<%@!<$H$7$F;H$&$N$O6K$a$F4JC1$G$9!#(B - -@itemize @bullet -@item -$B$^$:!"%M%C%H%o!<%/$K40A4$K7R$,$C$F$$$k%^%7%s>e$GF0:n$5$;$k$N$HF1$8$h$&$K!"(B -gnus $B$r@_Dj$7$^$9!#$^$:$d$C$F$*$$$G!#KM$O$3$3$GBT$C$F$k$+$i!#(B - -@item -$B$=$7$?$i!"0J2<$NKbK!$NC$9J}K!(B -* Agent and IMAP:: $B%(!<%8%'%s%H$r(B IMAP $B$G;H$&J}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!<%9uBV$G5/F0$7$^$9!#$3$N>uBV$G$O!"$9$G$KH$7$F2<$5$$!#(B - -@item -$B$=$7$F!"$=$N>l$G$9$0$K?7$7$$%K%e!<%9$rFI$`$3$H$b$G$-$^$9$7!"%K%e!<%9$r%m!<(B -$B%+%k%^%7%s$K%@%&%s%m!<%I$9$k$3$H$b$G$-$^$9!#8eH$7$F$/$@$5$$!#(B) - -@item -$B5-;v$ruBV$K$5$;!"(B -PPP $B4X78(B($B$J$I(B)$B$rJD$8$^$9!#$=$&$7$F%K%e!<%9$r%*%U%i%$%s$GFI$`$3$H$,$G$-$^(B -$B$9!#(B - -@item -$B$=$7$FBhFs%9%F%C%W$KLa$j$^$9!#(B -@end itemize - -$B0J2<$K%(!<%8%'%s%H$r=i$a$F(B($B$+$=$3$i$K(B)$B;H$&$H$-$KI,MW$J$$$/$D$+$N:n6H$r<((B -$B$7$^$9!#(B - -@itemize @bullet - -@item -$B$I$N%5!<%P!<$r%(!<%8%'%s%H$GLLE]$r8+$k$+$r7h$a$^$9!#$b$7%a!<%k%P%C%/%(%s(B -$B%I$,$"$l$P!"$=$l$r%(!<%8%'%s%H$KLLE]$r8+$5$;$k$N$O$*$=$i$/L50UL#$G$7$g$&!#(B -$B%5!<%P!<%P%C%U%!!<$K0\F0$7(B ($B%0%k!<%W%P%C%U%!!<$G(B @kbd{^})$B!"%(!<%8%'%s%H(B -$B$K07$C$FM_$7$$%5!<%P!<(B($BJ#?t2D(B)$B$G(B @kbd{J a} $B$r2!$7$^(B -$B$9(B (@pxref{Server Agent Commands})$B!#$3$l$OBgDq$N>l9g!"%P%C%U%!!<$N2<$K0l(B -$BMwI=<($5$l$F$$$k4pK\A*BrJ}K!$@$1$G$7$g$&!#(B - -@item -$B%@%&%s%m!<%IJ}?K$r7hDj$7$^$9!#(B@xref{Agent Categories}. - -@item -$B$($($H!D!"0J>e$G$9!#(B -@end itemize - -@node Agent Categories -@subsection $B%(!<%8%'%s%HJ,N`(B - -$B%K%e!<%9G[Aw5!9=$H%K%e!<%9%j!<%@!<$rE}9g$9$k0l$D$NBg$-$JM}M3$O!"$I$N5-;v(B -$B$r%@%&%s%m!<%I$9$k$+$K$D$$$F!"$h$jNI$$@)8f$r2DG=$H$9$k$3$H$G$9!#G|Bg$JNL(B -$B$N5-;v$r%@%&%s%m!<%I$7$F$b$"$^$j0UL#$O$J$/!"$=$l$i$rFI$s$G$b$"$^$jLLGr$/(B -$B$J$$$3$H$,J,$+$k$@$1$G$9!#2?$r%@%&%s%m!<%I$9$k$+$NA*Br$O$b$C$H?5=E$G$"$k(B -$B$Y$-$G$"$j!"$=$N5-;v$,LLGr$$$HJ,$+$C$?;~E@$G!"%@%&%s%m!<%I$9$k$?$a$N0u$r(B -$B$NJ,N`$KB0$5$J$$%0%k!<%W$O(B @code{$B=i4|(B} $BJ,N`$KB0$7$^$9!#(BGnus $B$OJ,N`$N:n(B -$B@.$H4IM}$N$?$a$NFH<+$N%P%C%U%!!<$r;}$C$F$$$^$9!#(B - -@menu -* Category Syntax:: $BJ,N`$H$O$I$s$J$b$N$+(B -* Category Buffer:: $BJ,N`$r4IM}$9$k%P%C%U%!!<(B -* Category Variables:: $B%+%9%?%^%$%6(B"$B$i(B"$B%9(B -@end menu - -@node Category Syntax -@subsubsection $BJ,N`$NJ8K!(B - -$BJ,N`$OFs$D$N$b$N$+$i$J$j$^$9!#(B - -@enumerate -@item -($BDL>o(B) $B$I$N5-;v$r%@%&%s%m!<%I$9$k$N$,E,Ev$+$H$$$&Bg$^$+$JNX3T$rM?$($k=R(B -$B8l!#$=$7$F(B - -@item -($BDL>o(B) $B$I$N5-;v$r%@%&%s%m!<%I$9$k$+$r7h$a$k$H$-$N$h$j$-$a$N:Y$+$$%9%3%"(B -$B5,B'!#(B($B$3$N%@%&%s%m!<%I%9%3%"(B (@dfn{download score}) $B$ODL>o$N%9%3%"$H$O(B -$BI,$:$7$b4X78$,L5$$$3$H$KCm0U$7$F$/$@$5$$!#(B) -@end enumerate - -$B=R8l$N0lHVC1=c$J7A<0$O(B @code{true} $B$d(B @code{false} $B$N$h$&$JC1FH$N=R8l$+(B -$B$i$J$j$^$9!#$3$l$i$NFs$D$O$=$l$>$l!"A4$F$N2DG=$J5-;v$r%@%&%s%m!<%I$9$k$+!"(B -$BA4$/2?$b$7$J$$$+!"$G$9!#$3$l$i$NFs$D$NFCJL$J=R8l$N>l9g$O!"DI2C$N%9%3%"5,(B -$BB'$OM>J,$G$9!#(B - -@code{high} $B$d(B @code{low} $B$H$$$&=R8l$O2<$G@bL@$5$l$F$$$k$h$&$K!"(B -@code{gnus-agent-high-score} $B$H(B @code{gnus-agent-low-score} $B$H$N5-;v$N%9(B -$B%3%"$H$N4X78$K$h$j5-;v$r%@%&%s%m!<%I$7$^$9!#(B - -$B%@%&%s%m!<%I$,E,@Z$+$I$&$+$N!"$5$i$K:Y$+$$@)8f$rF@$k$?$a$K!"=R8l$OO@M}1i(B -$B;;;R$,4V$K;6$j$P$a$i$l$?=R8l$NAH$_9g$o$;$+$i$J$k$3$H$,$G$-$^$9!#(B - -$B$*$=$i$/$$$/$D$+$NNc$,$=$N$^$^;H$($^$9!#(B - -$B0J2<$O4JC1$J=R8l$G$9!#(B($B$3$l$O=i4|@_Dj$N=R8l$G$9!#$D$^$j!"B>$N$I$NJ,N`$K(B -$B$b4^$^$l$J$$A4$F$N%0%k!<%W$KBP$7$F;HMQ$5$l$^$9!#(B) - -@lisp -short -@end lisp - -$B$H$C$F$b4JC1$G$7$g(B? $B$3$N=R8l$O!"5-;v$,C;$$(B(``$BC;$$(B'' $B2ACM$,$"$k(B) $B>l9g$K8B(B -$B$j??$K$J$j$^$9!#(B - -$B$3$l$O$b$C$HJ#;($J=R8l$G$9!#(B - -@lisp -(or high - (and - (not low) - (not long))) -@end lisp - -$B$3$N0UL#$O!"9b$$%9%3%"$r;}$C$F$$$k$+!"$"$k$$$O%9%3%"$,Dc$/$J$/$F$+$DD9$/(B -$B$J$$!"$H$$$&5-;v$r%@%&%s%m!<%I$9$k!"$H$$$&$3$H$G$9!#$o$+$k$@$m!#(B - -$B;H$C$F$b$h$$O@M}1i;;;R$O!"(B@code{or}, @code{and}, @code{not} $B$G$9!#(B($B$b$7(B -$B;H$$$?$1$l$P!"$h$j(B ``C'' $BIw$N1i;;;R(B @samp{|}, @code{&}, @code{!} $B$rBe$j(B -$B$K;H$&$3$H$,$G$-$^$9!#(B) - -$B0J2<$N=R8l$O$"$i$+$8$aDj5A$5$l$F$$$^$9$,!"$3$l$i$N$I$l$b$"$J$?$N$d$j$?$$(B -$B$3$H$K0lCW$7$J$1$l$P!"<+J,$GFH<+$N$b$N$r=q$/$3$H$b$G$-$^$9!#(B - -@table @code -@item short -$B5-;v$,(B @code{gnus-agent-short-article} $B9T$h$jC;$+$1$l$P??!#=i4|@_DjCM(B -$B$O(B 100$B!#(B - -@item long -$B5-;v$,(B @code{gnus-agent-long-article} $B9T$h$jD9$1$l$P??!#=i4|@_DjCM$O(B 200$B!#(B - -@item low -$B5-;v$N%@%&%s%m!<%I%9%3%"$,(B @code{gnus-agent-low-score} $B0J2<$G$"$l$P??!#(B -$B=i4|@_DjCM$O(B 0$B!#(B - -@item high -$B5-;v$N%@%&%s%m!<%I%9%3%"$,(B @code{gnus-agent-high-score} $B0J>e$G$"$l$P??!#(B -$B=i4|@_DjCM$O(B 0$B!#(B - -@item spam -gnus $B%(!<%8%'%s%H$,$=$N5-;v$r(B SPAM $B$@$H8+Pv$7$?$i??!#$3$NH/8+E*o$K??!#(B - -@item false -$B>o$K56!#(B -@end table - -$B$"$J$?$,<+J,$NFH<+$N=R8l4X?t$r:n@.$7$?$1$l$P!"$3$l$rCN$C$F$*$$$F$/$@$5(B -$B$$(B: -$B4X?t$O0z?tL5$7$G8F$S=P$5$l$^$9$,!"(B -@code{gnus-headers} $B$H(B @code{gnus-score} $BF0E*JQ?t$K$OJXMx$JCM$,B+G{$5$l(B -$B$^$9!#(B - -$BNc$($P!"0lDj$NF|IU0J>eA0$KEj9F$5$l$?5-;v(B ($BNc$($P!"(B -@code{gnus-agent-expire-days} $B0JA0$KEj9F$5$l$?$b$N(B) $B$r%@%&%s%m!<%I$7$J$$(B -$B$H$9$k$3$H$b$G$-$^$9!#$=$N>l9g!"0J2<$N$h$&$J4X?t$r=q$/$G$7$g$&(B: - -@lisp -(defun my-article-old-p () - "Say whether an article is old." - (< (time-to-days (date-to-time (mail-header-date gnus-headers))) - (- (time-to-days (current-time)) gnus-agent-expire-days))) -@end lisp - -$B$=$&$9$k$H!"=R8l$O$3$N$h$&$KDj5A$7$^$9(B: - -@lisp -(not my-article-old-p) -@end lisp - -$B$b$7$/$O!"(B@file{~/.gnus.el} $B$d2?$+B>$N$b$N$G$b!"4{Dj(B -$B$N(B @code{gnus-category-predicate-list} $B$K<+J,$N=R8l$rDI2C$9$k$3$H$b$G$-(B -$B$^$9!#(B($BCm0U(B: $B$3$l$O!"(B@code{gnus-agent} $B$G(B @code{(gnus-agentize)} $B$,FI$_(B -$B9~$^$l$?8e$G$"$kI,MW$,$"$k$G$7$g$&(B) - -@lisp -(setq gnus-category-predicate-alist - (append gnus-category-predicate-alist - '((old . my-article-old-p)))) -@end lisp - -$B$=$7$F!"C1$Ke$N$h$&$J$b$N$r;H$&$H$-$O!"@$$NCf$K$O@5$7$/@_Dj$5$l$F$$$J$$%7%9%F%`(B/$B%a(B -$B!<%i!<$,$"$j!"5-;v$NF|IU$O$$$DEj9F$5$l$?$+$r>o$K3Ne$N=R8l$O$=$NJ,N`$KB0$9$k(B*$BA4$F(B*$B$N%0%k!<%W$KE,MQ$5$l$^$9!#$7$+$7!"J,N`Cf(B -$B$N8D!9$N%0%k!<%W$KFCDj$N=R8l$rK>$s$@$j!"BUBF2a$.$F?7$7$$J,N`$r@_Dj$G$-$J(B -$B$$$H$-$O!"%0%k!<%W$N8D!9$N=R8l$r%0%k!<%W%Q%i%a!<%?$Ge$N$b$N$HEy2A$JD9$$J}$NNc$O(B: - -@lisp -(agent-predicate or high (and (not low) (not long))) -@end lisp - -$BJ,N`$N;XDj$GMW5a$5$l$k30$N4]3g8L$O$3$3$G$OF~NO$5$l$F$*$i$:!"%I%C%HBP$N5-(B -$BK!$G$b$J$/!"=R8l$NCM$O%j%9%H$"$k$H$_$J$5$l$^$9!#(B - -$B$5$F!"%@%&%s%m!<%I%9%3%"$NJ8K!$ODL>o$N%9%3%"%U%!%$%k$NJ8K!$HF1$8$G$9$,!"(B -$BNc30$H$7$F!"J}$N>l=j$G!"(B@code{$B%@%&%s%m!<%I%9%3%"5,B'(B} $B$O0J2<$N;0$D$N7A<0$re$G=q$+$l$F$$$k$h$&$K!"%9%3%"IU$1%-!<%o!<%I$N0lItJ,$7$+;H$($J$$$3$H$r=|(B -$B$1$P!"$3$l$OIaDL$N(B gnus $B%9%3%"%U%!%$%k$N9=J8$HF1$8$G$9!#(B - -$BNc(B: - -@itemize @bullet -@item -$BJ,N`;XDj(B - -@lisp -(("from" - ("Lars Ingebrigtsen" 1000000 nil s)) -("lines" - (500 -100 nil <))) -@end lisp - -@item -$B%0%k!<%W%Q%i%a!<%?;XDj(B - -@lisp -(agent-score ("from" - ("Lars Ingebrigtsen" 1000000 nil s)) - ("lines" - (500 -100 nil <))) -@end lisp - -$B$^$?!"$3$3$G0lHV30$N3g8L$,>JN,$5$l$F$$$k$3$H$KCm0U$7$F$/$@$5$$!#(B -@end itemize - -@item -$B%(!<%8%'%s%H%9%3%"%U%!%$%k(B - -$B$3$l$i$N%9%3%"%U%!%$%k$O>e$G=R$Y$i$l$F$$$k;HMQ2DG=$J%9%3%"IU$1%-!<%o!<%I(B -*$B$N$_(B* $B$G$"$kI,MW$,$"$j$^$9!#(B - -$BNc(B: - -@itemize @bullet -@item -$BJ,N`;XDj(B - -@lisp -("~/News/agent.SCORE") -@end lisp - -$B$b$7$/$O!"$?$V$s(B - -@lisp -("~/News/agent.SCORE" "~/News/agent.group.SCORE") -@end lisp - -@item -$B%0%k!<%W%Q%i%a!<%?;XDj(B - -@lisp -(agent-score "~/News/agent.SCORE") -@end lisp - -$B>e$NMM$K!"DI2C$N%9%3%"%U%!%$%k$r;XDj$9$k$3$H$,$G$-$^$9!#$^$?3g8L$K$D$$$F(B -$B8@$o$J$1$l$P$$$1$^$;$s$+(B? -@end itemize - -@item -@code{$BIaDL(B} $B$N%9%3%"%U%!%$%k$N;HMQ(B - -$B0l$D$N%0%k!<%W$GFs$D$N%9%3%"5,B'$r0];}$7$?$/$J$/!"%0%k!<%W$NK>$_(B -$B$N(B @code{$B%@%&%s%m!<%I(B} $B$N4p=`$,(B @code{$BFI$`(B} $B4p=`$HF1$8$J$i!"%(!<%8%'%s%H(B -$B$K2?$r%@%&%s%m!<%I$9$k$+$r7h$a$k:]$K(B @code{$BIaDL(B} $B$N%9%3%"%U%!%$%k$r;2>H(B -$B$9$k$h$&$K$9$k$3$H$,$G$-$^$9!#(B - -$BJ,N`Dj5A$+!"%0%k!<%W%Q%i%a!<%?$N$3$l$i$N;X<($O%(!<%8%'%s%H$K%0%k!<%W$KE,(B -$BMQ2DG=$JA4$F$N%9%3%"%U%!%$%k$rFI$^$;!"%9%3%"IU$1%-!<%o!<%I$N;HMQ2DG=$JIt(B -$BJ,=89g$KL5$$$b$N$r(B *$BA*JL$7$FH4$-o$OA4$F$NJ,N`$OJ,N`%P%C%U%!!<$+$i4IM}$7$^$9!#(B($B%0%k!<%W%P%C%U%!!<(B -$B$+$i(B @kbd{J c} $BL?Na$K$h$C$F(B) $B=i$a$F$3$l$KF~$C$?$H$-!"=i4|@_Dj$N(B -$BJ,N`$@$1$,I=<($5$l$^$9!#(B - -$B0J2<$NL?Na$,$3$N%P%C%U%!!<$G;HMQ$G$-$^$9!#(B - -@table @kbd -@item q -@kindex q (Category) -@findex gnus-category-exit -$B%0%k!<%W%P%C%U%!!<$KLa$k(B (@code{gnus-category-exit})$B!#(B - -@item k -@kindex k (Category) -@findex gnus-category-kill -$B8=:_$NJ,N`$r>C5n$9$k(B (@code{gnus-category-kill})$B!#(B - -@item c -@kindex c (Category) -@findex gnus-category-copy -$B8=:_$NJ,N`$rJ#@=$9$k(B (@code{gnus-category-copy})$B!#(B - -@item a -@kindex a (Category) -@findex gnus-category-add -$B?7$7$$J,N`$rDI2C$9$k(B (@code{gnus-category-add})$B!#(B - -@item p -@kindex p (Category) -@findex gnus-category-edit-predicate -$B8=:_$NJ,N`$N=R8l$rJT=8$9$k(B (@code{gnus-category-edit-predicate})$B!#(B - -@item g -@kindex g (Category) -@findex gnus-category-edit-groups -$B8=:_$NJ,N`$KB0$9$k%0%k!<%W$N0lMw$rJT=8$9(B -$B$k(B (@code{gnus-category-edit-groups})$B!#(B - -@item s -@kindex s (Category) -@findex gnus-category-edit-score -$B8=:_$NJ,N`$N%@%&%s%m!<%I%9%3%"5,B'$rJT=8$9(B -$B$k(B (@code{gnus-category-edit-score})$B!#(B - -@item l -@kindex l (Category) -@findex gnus-category-list -$BA4$F$NJ,N`$rI=<($9$k(B (@code{gnus-category-list})$B!#(B -@end table - -@node Category Variables -@subsubsection $BJ,N`JQ?t(B - -@table @code -@item gnus-category-mode-hook -@vindex gnus-category-mode-hook -$BJ,N`%P%C%U%!!<$GA0!#(B - -@item g -$BJ,N`$KB0$9$k%0%k!<%W$N?t!#(B -@end table - -@item gnus-category-mode-line-format -@vindex gnus-category-mode-line-format -$BJ,N`%b!<%I9T$NMM<0(B (@pxref{Mode Line Formatting})$B!#(B - -@item gnus-agent-short-article -@vindex gnus-agent-short-article -$B$3$NJQ?t$h$j>/$J$$9T?t$N5-;v$OC;$$!#=i4|@_DjCM$O(B 100$B!#(B - -@item gnus-agent-long-article -@vindex gnus-agent-long-article -$B$3$NJQ?t$h$jB?$$9T?t$N5-;v$OD9$$!#=i4|@_DjCM$O(B 200$B!#(B - -@item gnus-agent-low-score -@vindex gnus-agent-low-score -$B$3$NCM$h$j>.$5$$%9%3%"$r;}$D5-;v$ODc%9%3%"$G$"$k!#=i4|@_DjCM$O(B 0$B!#(B - -@item gnus-agent-high-score -@vindex gnus-agent-high-score -$B$3$NCM$h$jBg$-$$%9%3%"$r;}$D5-;v$O9b%9%3%"$G$"$k!#=i4|@_DjCM$O(B 0$B!#(B -@end table - -@node Agent Commands -@subsection $B%(!<%8%'%s%HL?Na(B - -$BA4$F$N(B gnus $B%(!<%8%'%s%HL?Na$O(B @kbd{J} $B%5%V%^%C%W$K$"$j$^$9!#(B -@kbd{J j} (@code{gnus-agent-toggle-plugged}) $BL?Na$OA4$F$N%b!<%I(B -$B$GF0:n$7!"(Bgnus $B%(!<%8%'%s%H$N@Z$jN%$7(B/$B:9$79~$_>uBV$r@Z$jBX$($^$9!#(B - -@menu -* Group Agent Commands:: -* Summary Agent Commands:: -* Server Agent Commands:: -@end menu - -$B40A4$J0l3gC5n$7$^(B -$B$9(B (@code{gnus-agent-remove-group})$B!#$3$NL?Na$O%W%m%;%9(B/$B@\F,<-$N=,47$rM}(B -$B2r$7$^$9!#(B(@pxref{Process/Prefix})$B!#(B - -@item J Y -@kindex J Y (Agent Group) -@findex gnus-agent-synchronize-flags -$B%j%b!<%H%5!<%P!<$,(B @dfn{unplugged} $B$N$H$-$KJQ99$5$l$?%U%i%0$,$"$l$PF14|(B -$B$5$;$^$9!#(B -@end table - -@node Summary Agent Commands -@subsubsection $B35N,%(!<%8%'%s%HL?Na(B - -@table @kbd -@item J # -@kindex J # (Agent Summary) -@findex gnus-agent-mark-article -$B5-;v$K%@%&%s%m!<%I$9$k$h$&$K0u$rIU$1$k(B (@code{gnus-agent-mark-article})$B!#(B - -@item J M-# -@kindex J M-# (Agent Summary) -@findex gnus-agent-unmark-article -$B5-;v$+$i%@%&%s%m!<%I$9$k0u$r>C5n$9$k(B (@code{gnus-agent-unmark-article})$B!#(B - -@item @@ -@kindex @@ (Agent Summary) -@findex gnus-agent-toggle-mark -$B5-;v$r%@%&%s%m!<%I$9$k$+$I$&$+$r@Z$jBX$((B -$B$k(B (@code{gnus-agent-toggle-mark})$B!#(B - -@item J c -@kindex J c (Agent Summary) -@findex gnus-agent-catchup -$B%@%&%s%m!<%I0u$NL5$$5-;v$rA4$F4{FI$K$9$k(B (@code{gnus-agent-catchup})$B!#(B - -@item J u -@kindex J u (Agent Summary) -@findex gnus-agent-summary-fetch-group -$B8=:_$N%0%k!<%W$N%@%&%s%m!<%I2DG=$J5-;v$r!"$9$Y$F%@%&%s%m!<%I$7$^(B -$B$9(B (@code{gnus-agent-summary-fetch-group})$B!#(B -@end table - -@node Server Agent Commands -@subsubsection $B%5!<%P!<%(!<%8%'%s%HL?Na(B - -@table @kbd -@item J a -@kindex J a (Agent Server) -@findex gnus-agent-add-server -$B8=:_$N%5!<%P!<$r!"(Bgnus $B%(!<%8%'%s%H$G07$o$l$k%5!<%P!<$N0lMw$KDI2C$9(B -$B$k(B (@code{gnus-agent-add-server})$B!#(B - -@item J r -@kindex J r (Agent Server) -@findex gnus-agent-remove-server -$B8=:_$N%5!<%P!<$r!"(Bgnus $B%(!<%8%'%s%H$G07$o$l$k%5!<%P!<$N0lMw$+$i:o=|$9(B -$B$k(B (@code{gnus-agent-remove-server})$B!#(B -@end table - -@node Agent Expiry -@subsection $B%(!<%8%'%s%H4|8B@Z$l>C5n(B - -@vindex gnus-agent-expire-days -@findex gnus-agent-expire -@kindex M-x gnus-agent-expire -@cindex Agent expiry -@cindex Gnus Agent expiry -@cindex expiry - -@code{nnagent} $B$O4|8B@Z$l>C5n$r07$$$^$;$s!#$=$NBe$o$j$K!"FCJL(B -$B$J(B @code{gnus-agent-expire} $BL?Na$,(B @code{gnus-agent-expire-days} $BF|$h$j(B -$B$b8E$$4{FI5-;v$rA4$F>C5n$7$^$9!#$3$l$O$"$J$?$,%G%#%9%/MFNL$r;H$$@Z$j$=$&(B -$B$@$H;W$C$?$H$-$K$$$D$G$b$G(B) $BCfCG$9$k$3$H$b$"(B -$B$^$jNI$$$3$H$G$O$"$j$^$;$s!#(B - -@vindex gnus-agent-expire-all -@code{gnus-agent-expire-all} $B$,(B @code{nil} $B$G$J$1$l$P!"$3$NL?Na$OA4$F$N(B -$B5-;v(B --- $BL$FI!"4{FI!"2D;k!"J]N15-;v$r>C5n$7$^$9!#$b$7(B @code{nil} ($B$3$l$,(B -$B=i4|@_DjCM(B) $B$G$"$l$P!"4{FI5-;v$N$_$,>C5n$NBP>]$H$J$j!"L$FI!"2D;k!"J]N15-(B -$B;v$O$5$i$KL54|8B$KJ];}$7$^$9!#(B - -@node Agent and IMAP -@subsection $B%(!<%8%'%s%H$r(B IMAP $B$G;H$&J}K!(B - -$B%(!<%8%'%s%H$O(B nnimap $B$r4^$`(B gnus $B$N$I$s$J%P%C%/%(%s%I$G$bF0:n$7$^$9!#$7(B -$B$+$7(B @sc{nntp} $B$H(B @sc{imap} $B$K$O$$$/$D$+$N35G0$N0c$$$,$"$k$N$G!"$3$N9`$G(B -$B$O(B gnus $B%(!<%8%'%s%H$r(B @sc{imap} $B$N(B @dfn{unplugged} $B$J%b!<%I$N%/%i%$%"%s(B -$B%H$H$7$F1_3j$K;H$($k$h$&$K$9$k$?$a$N!"$$$/$D$+$N>pJs$rDs6!$7$^$9!#(B - -$B?4$KN1$a$F$*$/:G=i$N$3$H$O!"A4$F$N%U%i%0(B (read, ticked $B$J$I(B) $B$O(B nntp $B$N(B -$B>l9g$K$*$1$k(B @code{.newsrc} $B$G$O$J$/$F(B @sc{imap} $B%5!<%P!<$KJ];}$5$l$k$H(B -$B$$$&$3$H$G$9!#$7$?$,$C$F!"(Bgnus $B$O(B @dfn{unplugged} $B$N$H$-$N%U%i%0$NJQ2=$r(B -$B3P$($F$*$$$F!":F$S@\B3$7$?$H$-$K$=$l$i$N%U%i%0$rF14|$5$;$kI,MW$,$"$j$^$9!#(B - -gnus $B$O%(!<%8%'%s%H$N85$G(B nnimap $B%0%k!<%W$rFI$`$H$-!"%G%#%U%)%k%H$G%U%i(B -$B%0$NJQ2=$K@d$($:Cm0U$7$F$$$^$9!#$"$J$?$,:F$S@\B3$7$?$H$-!"%G%#%U%)%k%H(B -$B$G(B gnus $B$O$"$J$?$,2?$i$+$N%U%i%0$rJQ99$7$?$+$I$&$+$rD4$Y$F!"$"$J$?$,$=$l(B -$B$i$r%5!<%P!<$HF14|$5$;$?$$$+$I$&$+$r?R$M$^$9!#$3$N5sF0(B -$B$O(B @code{gnus-agent-synchronize-flags} $B$G%+%9%?%^%$%:$9$k$3$H$,$G$-$^$9!#(B - -@vindex gnus-agent-synchronize-flags -$B$b$7(B @code{gnus-agent-synchronize-flags} $B$,(B @code{nil} $B$@$C$?$i!"%(!<%8%'(B -$B%s%H$O<+F0E*$K%U%i%0$rF14|$5$;$k$3$H$O$7$^$;$s!#$b$7$=$l$,=i4|CM(B -$B$N(B @code{ask} $B$@$C$?$i!"%(!<%8%'%s%H$O$"$J$?$,:F@\B3$7$?$H$-$K$"$J$?$,2?(B -$B$i$+$NJQ99$r9T$J$C$F$$$?$+$I$&$+$rD4$Y$F!"$=$l$i$rF14|$5$;$?$$$+$I$&$+$r(B -$B?R$M$^$9!#$b$7$=$l$i0J30$NCM$@$C$?>l9g$O!"A4$F$N%U%i%0$O<+F0E*$KF14|$5$;(B -$B$i$l$^$9!#(B - -$B$b$7$"$J$?$,!":F@\B3$7$?$H$-$K<+F0$G%U%i%0$rF14|$5$;$?$/$J$$$J$i!"C$;$P!"$"$J$?$,!VF14|!W$NA`:n$r9T$J$C$?$H$-(B -$B$K!"$=$N%U%i%0$O%;%C%H$5$l$F%5!<%P!<$+$i$O:o=|$5$l$^$9!#(B -@c FIXMETGNUS Does it make sense? -"The queued flag" $B$K4X$9$kF0:n$O!"%(!<%8%'%s%H%G%#%l%/%H%j$K$"$k%5!<%P!<(B -$BKh$N(B @code{flags} $B%U%!%$%k$NCf$G8+$D$+$k$G$7$g$&!#$=$l$i$O$"$J$?$,%U%i%0(B -$B$rF14|$5$;$?$H$-$K6u$K$J$j$^$9!#(B - -@node Outgoing Messages -@subsection $B:9=PMQ%a%C%;!<%8(B - -Gnus $B$,@Z$jN%$5$l$F$$$k$H$-!"A4$F$N:9=PMQ%a%C%;!<%8(B ($B%a!<%k$H%K%e!<%9$N(B -$BN>J}(B) $B$O2<=q$-%0%k!<%W(B (@pxref{Drafts}) $B$K3JG<$5$l$^$9!#Ej9F$7$?8e$G$b!"(B -$B$3$3$G$=$N%a%C%;!<%8$r8+$?$j!"JT=8$7$?$j$9$k$N$O0U$N$^$^$G$9!#(B - -Gnus $B$,:F$S:9$79~$^$l$?$H$-!"%a%C%;!<%8$rAw?.$9$k$?$a$K!"FCJL$JL?Na$r;H$C(B -$B$F2<=q$-%0%k!<%W$+$iAw$k$3$H$b!"%0%k!<%W%P%C%U%!Fb$G(B @kbd{J S} $B$r;H$C$F!"(B -$B2<=q$-%0%k!<%WFb$NA4$F$NAw?.2DG=%a%C%;!<%8Aw?.$9$k$3$H$b$G$-$^$9!#(B - -@node Agent Variables -@subsection $B%(!<%8%'%s%HJQ?t(B - -@table @code -@item gnus-agent-directory -@vindex gnus-agent-directory -Gnus $B%(!<%8%'%s%H$,%U%!%$%k$r3JG<$9$k>l=j!#=i4|@_DjCM(B -$B$O(B @file{~/News/agent/}$B!#(B - -@item gnus-agent-handle-level -@vindex gnus-agent-handle-level -$B$3$NJQ?t$NCM$h$j9b$$%l%Y%k(B (@pxref{Group Levels}) $B$N%0%k!<%W$O!"%(!<%8%'(B -$B%s%H$+$i$OL5;k$5$l$^$9!#=i4|@_DjCM$O(B @code{gnus-level-subscribed} $B$G!"$3(B -$B$l$O=i4|@_Dj$G$O!"9XFI$7$F$$$k%0%k!<%W$N$_$,%(!<%8%'%s%H$N=hM}$NBP>]$H$J(B -$B$k$H$$$&$3$H$G$9!#(B - -@item gnus-agent-plugged-hook -@vindex gnus-agent-plugged-hook -$B%M%C%H%o!<%/$K@\B3$5$l$?$H$-$K$K9g$o$;$FJT=8$7!"(BPPP ($B$d2?$+(B) $B$r5/F0$7$F!"(B -@kbd{M-x gnus} $B$HBG80$7$F$/$@$5$$!#(B - -$B$"$J$?$,=i$a$F(B gnus $B$ro$H$F$b;~4V$,(B -$B$+$+$j$^$9$,!"0lEY$@$1$7$+C5n$7$^$9!#(B(@kbd{A k} $B$G:o=|(B -$B%0%k!<%W$OA4$FLa$C$F$-$^$9!#(B) - -$B$5$F!"$3$3$G$=$N>l$G%0%k!<%W$rFI$`$3$H$b$G$-$^$9$7!"$"$k$$(B -$B$O(B @kbd{J s} $BL?Na$G5-;v$r%@%&%s%m!<%I$9$k$3$H$b$G$-$^$9!#$"$H$O$3$N%^%K%e(B -$B%"%k$N;D$j$rFI$s$G!"$=$NB>$N2?I42/$N9`L\$+$i%+%9%?%^%$%:$7$?$$$3$H$r8+$D(B -$B$1=P$7$F$/$@$5$$!#(B - -@node Batching Agents -@subsection $B0l3g%(!<%8%'%s%H=hM}(B - -Gnus $B%(!<%8%'%s%H$K5-;v$ro$K4JC1$G$9!#(B -$B0J2<$N%7%'%k%9%/%j%W%H$OI,MW$J$3$H$rA4$F$d$C$F$/$l$k$G$7$g$&!#(B - -@example -#!/bin/sh -emacs -batch -l ~/.emacs -f gnus-agent-batch >/dev/null -@end example - -@node Control Agents -@subsection gnus-agent $B4D6-$r(B Control $B$9$k(B -$B$3$3$^$GFI$s$GMh$i$l$F!"%(!<%8%'%s%H$,Hs>o$KJXMx$J5!G=$G$"$k;v$,J,$+$C$?(B -$B$H;W$$$^$9!#$?$@!"ITK~$JE@$,$"$k$H$9$k$H!"Kh2s(B @kbd{J j} $B$d(B @kbd{J S} $BEy(B -$B$r%-!<$G:n6H$7$J$1$l$P$J$i$J$$$3$H$G$7$g$&!#%*%s%i%$%s$HF1$8$h$&$JA`:n$G(B -$B$d$j$H$j$G$-$?$i!"$H9M$($?;v$O$"$j$^$;$s$+(B? -gnus-offline $B$O$=$N5!G=$rDs6!$7$^$9!#(B($BI.)$7$^$9!#(B@code{MIEE} $B$K$D$$$F$O8e=R;2>H(B) - -*Group* $B%P%C%U%!$G(B @kbd{g} $B$r2!$9;v$G(B - -@lisp - (Dialup $B$NI,MW$J4D6-$G$O(B Dialup) -> - Mail $B$N - Spool $B$KN/$C$?(B message $B$NAw?.(B -> - News $B$NAw?.(B -> - $BITMW$J5-;v$N(B expire -@end lisp - -$B$^$G$r9T$$$^$9!#(B - -$B%$%s%9%H!<%k$O$$$?$C$F4JC1!#(B($B$3$3$^$G$G(B gnus-agent $B$N@_Dj$O=*$C$F$$$k$H(B -$B2>Dj$7$^(B -$B$9(B) @file{~/.emacs} $B$N(B gnus-agent $B$N@_Dj$N$A$g$$$HA0$K(B - -@lisp -(load "gnus-ofsetup") -(gnus-setup-for-offline) -(load gnus-offline-setting-file) -@end lisp - -$B$H$$$l!"(BEmacs $B$r:F5/F0$7$F$/$@$5$$!#$9$k$H!"$5$^$6$^$Jl9g$K(B -$B$O!"(B@code{MIEE} $B$N@_Dj$O$$$C$5$$$7$J$/$F$b$+$^$$$^$;$s!#(B - -@table @code -@vindex gnus-offline-articles-to-fetch -@item gnus-offline-articles-to-fetch -$B$3$NJQ?t$Ol9g$O!"(BMail $B$@$1$rl9g$O!"(BNews $B$@$1$rl9g$O!"(B -Mail/News $BN>J}$r2A$5$l$k(B hook $B$G$9!#(B - -@vindex gnus-offline-before-online-hook -@item gnus-offline-before-online-hook -$B$3$NJQ?t$O(B Gnus $B$,(B Online(Plugged) $B>uBV$K$J$kD>A0$KI>2A$5$l$k(B hook $B$G$9!#(B - -@vindex gnus-offline-after-online-hook -@item gnus-offline-after-online-hook -$B$3$NJQ?t$O(B Gnus $B$,(B Offline(UnPlugged) $B>uBV$K$J$C$?8e$KI>2A$5$l$k(B hook $B$G(B -$B$9!#(B - -@vindex gnus-offline-interval-time -@item gnus-offline-interval-time -$B$3$NJQ?t$G;XDj$5$l$?4V(B -$B3V(B ($BIC?t(B) $B$G(B @code{gnus-offline-articles-to-fetch} $B$G;XDj$5$l(B -$B$?(B article $B$r$N%*%U%i%$%s%K%e!<%9%j!<%@!<$N$h$&$K$OF0:n$7$^$;(B -$B$s!#$3$l$i$OA[A|E*$J?M$+$i$NNI$/$"$kl9g!"(B -$B$b$&0l2s%@%&%s%m!<%I$5$l$k$N$G$9$+(B? - -@strong{$B$O$$!#(B} -@end table - -$BMWLs$9$k$H!"(Bgnus $B$,@Z$jN%$5$l$F$$$k$H$-$O!"%m!<%+%k$KJ]B8$5$l$?5-;v$r8+(B -$B$k$@$1$G$9!#@\B3$5$l$F$$$k$H$-$O!"(BISP $B$HOC$9$@$1$G$9!#(B - -@node Scoring -@chapter $B%9%3%"(B -@cindex scoring - -$BB>$N?M!9$O(B @dfn{$B:o=|%U%!%$%k(B} $B$r;H$$$^$9$,!"$3$3(B gnus $B%?%o!<$O:o=|$h$j$b(B -$B%9%3%"$NJ}$r9%$_$^$9$N$G!"B>$H3JF.$9$k$h$j$O@Z$jBX$($k;v$K$7$^$7$?!#$=$l(B -$B$i$O40A4$K0c$&;v$r$7$^$9$N$G!"??$CD>$0$K:B$C$FCm0U$rJ'$C$F$/$@$5$$(B! - -@vindex gnus-summary-below -$BA4$F$N5-;v$O%9%3%"$N=i4|CM$r;}$C$F$*(B -$B$j(B (@code{gnus-summary-default-score})$B!"$3$l$O%G%#%U%)%k%H$G(B 0 $B$G$9!#$3(B -$B$N%9%3%"$OBPOCE*$d!"%9%3%"%U%!%$%k(B (score file) $B$NJ}K!$K$h$j!">e$2$i$l$?(B -$B$j2<$2$i$l$?$j$7$^$9!#(B@code{gnus-summary-bark-below} $B$h$j$bDc$$%9%3%"$N(B -$B5-;v$K$O4{FI$N0u$,IU$-$^$9!#(B - -Gnus $B$O35N,%P%C%U%!$r:n@.$9$kA0$K!"8=:_$N%0%k!<%W$KE,MQ$5$l$k$I$s(B -$B$J(B @dfn{$B%9%3%"%U%!%$%k(B} $B$bFI$_9~$_$^$9!#(B - -$B8=:_$N5-;v$K4p$E$$$F%9%3%"$NEPO?$rA^F~$9$k$$$/$D$+$NL?Na$,35N,%P%C%U%!$K(B -$B$"$j$^$9!#Nc$($P!"(Bgnus $B$KFCDj$NI=Bj$N5-;v$N%9%3%"$r2<$2$?$j>e$2$?$j$9$k(B -$B$h$&$K5a$a$k;v$,$G$-$^$9!#(B - -$BFse;H$o$l$F$$$J$$$I$s$J(B -$BEPO?$b!"%9%3%"%U%!%$%k$NBg$-$5$r>.$5$/$9$k$?$a$K!"@E$+$K:o=|$5$l$^$9!#(B - -@menu -* Summary Score Commands:: $B8=:_$N%0%k!<%W$N$?$a$N%9%3%"EPO?$rDI2C$9(B - $B$k(B -* Group Score Commands:: $B0lHLE*$J%9%3%"L?Na(B -* Score Variables:: $B$"$J$?$N%9%3%"$r%+%9%?%^%$%:$9$k(B - ($B$^$!!"$J$s$FMQ8l$G$7$g$&(B) -* Score File Format:: $B%9%3%"%U%!%$%k$K2?$rF~$l$k$+(B -* Score File Editing:: $BC5n%U%!%$%k$r%9%3%"%U%!%$%k$KJQ49$9$k(B -* GroupLens:: $B$I$l$rFI$`$N$,9%$-$+$NM=8@$rF@$k(B -* Advanced Scoring:: $B%9%3%"$NK!B'$r:n$k$?$a$KO@M}I=8=$r;H$&(B -* Score Decays:: $B%9%3%"$r8O$l$F$$$+$;$k$N$OLr$KN)$D;v$b$"(B - $B$k(B -@end menu - -@node Summary Score Commands -@section $B35N,%9%3%"L?Na(B -@cindex score commands - -$B%9%3%"EPO?$rJQ99$9$k%9%3%"L?Na$Ol9g$G$b!"=i4|@_Dj$G%0%k!<%W$N%m!<%+%k%9%3%"%U%!%$%k$K$J$C$F$$(B -$B$^$9!#%9%3%"L?Na$r2?$+B>$N%9%3%"%U%!%$%k(B ($BNc!"(B@file{all.SCORE}) $B$KA^F~$7(B -$B$?$$$J$i!"$^$:$3$N%9%3%"%U%!%$%k$r8=:_$N$b$N$K$7$J$1$l$P$J$j$^$;$s!#(B - -$B0lHLE*$J%9%3%"L?Na$Oo$K5,B'@5$7$$K!B'$K=>$$$^$9(B -$B$N$G!"$=$l$i$NL?NaA4$F$rI=$K>e$2$kI,MW$O$"$j$^$;$s!#(B($B$?!<$/$5$s$"$j$^$9!#(B) - -@findex gnus-summary-increase-score -@findex gnus-summary-lower-score - -@enumerate -@item -$B:G=i$N%-!<$O%9%3%"$rA}$d$9$?$a$N(B @kbd{I} (i $B$NBgJ8;z(B) $B$+!"%9%3%"$r2<$2$k(B -$B$?$a$N(B @kbd{L} $B$G$9!#(B -@item -$BFsHVL\$N%-!<$O$I$N%X%C%@!<$K%9%3%"$r$7$?$$$+$rI=$7$^$9!#0J2<$N%-!<$,;HMQ(B -$B2DG=$G$9(B: - -@table @kbd -@item a -$BCxA0$K%9%3%"$rIU$1$^$9!#(B - -@item s -$BI=Bj(B (subject) $B$N9T$K%9%3%"$rIU$1$^$9!#(B - -@item x -@code{Xref} $B9T$K%9%3%"$rIU$1$^$9(B---$B$9$J$o$A!"Aj8_Ej9F9T$G$9!#(B - -@item r -@code{References} $B9T$K%9%3%"$r$D$1$^$9!#(B - -@item d -$BF|IU(B (date) $B$K%9%3%"$rIU$1$^$9!#(B - -@item l -$B9T?t(B (number of lines) $B$K%9%3%"$rIU$1$^$9!#(B - -@item i -@code{Messsage-ID} $B%X%C%@!<$K%9%3%"$rIU$1$^$9!#(B - -@item f -$B%U%)%m!<%"%C%W(B (followup) $B$K%9%3%"$rIU$1$^$9(B---$B$3$l$OCx$H$N9gCW$r$7!"(B -$B$3$NCx.$5$$$b$N$G$9!#(B - -@item = -$B?t;z$HEy$7$$$b$N$G$9!#(B - -@item > -$B?t;z$h$jBg$-$$$b$N$G$9!#(B -@end table -@end table - -@item -$B;M$D$a$G!":G8e$N%-!<$O$3$l$,0l;~E*(B ($B$9$J$o$A!"4|8B@Z$l>C5n(B) $B$N%9%3%"EPO?(B -$B$+!"1JB3E*$J(B ($B$9$J$o$A!"4|8B@Z$l>C5n$G$J$$(B) $B%9%3%"EPO?$G$"$k$+$H$$$&$3$H!"(B -$B$b$7$/$O$9$0$K$J$5$l$k$Y$-$+!"%9%3%"%U%!%$%k$KDI2C$9$k;v$O$7$J$$$+$H$$$&(B -$B;v$r;XDj$7$^$9!#(B - -@table @kbd -@item t -$B0l;~E*$J(B (temporary) $B%9%3%"EPO?$G$9!#(B - -@item p -$B1JB3E*$J(B (permanent) $B%9%3%"EPO?$G$9!#(B - -@item i -$BB(:B$N(B (immediate) $B%9%3%"IU$1$G$9!#(B -@end table - -@end enumerate - -$B$G$9$+$i!"8=:_$NCxo$K4JC1$G$9!#(B - -$BJ*;v$rJ#;($K$9$k$N$O!"C;=LBG80$,B8:_$9$k$+$i$G$9!#FsHVL\$+;0HVL\$NJ8;z$K(B -$BBgJ8;z$r;H$&$H!"(Bgnus $B$O;D$k0l$D$+Fs$D$NBG80$K=i4|CM$r;H$$$^$9!#=i4|CM(B -$B$O(B ``$BJ8;zNs$N0lIt(B'' $B$H(B ``$B0l;~E*(B'' $B$G$9!#$G$9$+$i!"(B -@kbd{I A} $B$O(B @kbd{I a s t} $B$HF1$8$G!"(B@kbd{I a R} $B$O(B @kbd{I a r t} $B$HF1$8(B -$B$G$9!#(B - -$B$3$l$i$N4X?t$O?t;z@\F,0z?t$H!"%7%s%\%k@\F,0z?t$re$2$k(B) $B$+$r;XDj$7$^$9!#%7%s%\%k@\F,0z?t(B @code{a} $B$OL?Na$,(B -$B8=:_$N%9%3%"%U%!%$%k$G$O$J$/%U%!%$%k(B @file{all.SCORE} $B$r;H$&;v$r;XDj$7$^(B -$B$9!#(B - -@vindex gnus-score-mimic-keymap -@code{gnus-score-mimic-keymap} $B$O$3$l$i$NL?Na$,%-!<%^%C%W$G$"$k$+$N$h$&(B -$B$K?6$kIq$&$+$I$&$+$r;XDj$7$^$9!#(B - -@node Group Score Commands -@section $B%0%k!<%W%9%3%"L?Na(B -@cindex group score commands - -$B;DG0$J$,$i!"$^$@$?$/$5$s$O$"$j$^$;$s!#(B - -@table @kbd -@item W f -@kindex W f ($B%0%k!<%W(B) -@findex gnus-score-flush-cache -Gnus $B$O2?EY$b%9%3%"O"A[%j%9%H$rFI$_9~$`$N$rHr$1$k$?$a$K!"$=$l$N%-%c%C%7%e(B -$B$rJ];}$7$F$$$^$9!#$3$NL?Na$O%-%c%C%7%e$r=q$-=P$7$^(B -$B$9(B (@code{gnus-score-flush-cache})$B!#(B -@end table - -$B0J2<$N$h$&$J;v$r$9$k;v$K$h$C$F!"%3%^%s%I9T$+$i%9%3%"IU$1$r$9$k;v$,$G(B -$B$-$^$9!#(B - -@findex gnus-batch-score -@cindex batch scoring -@example -& emacs -batch -l ~/.emacs -l ~/.gnus.el -f gnus-batch-score -@end example - -@node Score Variables -@section $B%9%3%"JQ?t(B -@cindex score variables - -@table @code -@item gnus-use-scoring -@vindex gnus-use-scoring -@code{nil} $B$G$"$l$P!"(Bgnus $B$O%9%3%"%U%!%$%k$rD4$Y$:!"0lHLE*$K!"%9%3%"4XO"(B -$B$N;E;v$rA4$/$7$^$;$s!#$3$l$O=i4|@_Dj$G(B @code{t} $B$G$9!#(B - -@item gnus-kill-killed -@vindex gnus-kill-killed -$B$3$NJQ?t$,(B @code{nil} $B$G$"$l$P!"(Bgnus $B$O4{$K:o=|2aDx$r$K2C$($k@\Hx8l$G$9(B ($B=i4|CM(B -$B$G(B @samp{SCORE} $B$G$9!#(B) - -@item gnus-score-uncacheable-files -@vindex gnus-score-uncacheable-files -@cindex score cache -$BA4$F$N%9%3%"%U%!%$%k$OIaDL$O%9%3%"%U%!%$%k$N2a>jFI$_9~$_$rHr$1$k$?$a$K(B -$B%-%c%C%7%e$5$l$^$9!#$7$+$7!"$3$l$K$h$j$"$J$?$N(B Emacs $B$,Bg$-$/HnBg2=$9$k(B -$B$N$G$"$l$P!":F$SI,MW$H$5$l$J$$$h$&$J%9%3%"%U%!%$%k$r=|5n$9$k$?$a$K$3$N@5(B -$B5,I=8=$r;H$&;v$,$G$-$^$9!#(B@file{all.SCORE} $B$N%-%c%C%7%e$r;_$a$k$N$O0-$$(B -$B9M$($G$9$,!"(B@file{comp.infosystems.www.authoring.misc.ADAPT} $B$r%-%c%C%7%e(B -$B$7$J$$$N$ONI$$9M$($G$7$g$&!#e$2(B/$B2<$2L?Na$K$h$C$F;H$o$l$k>e$2(B/$B2<$2$9$k%9%3%"$G$9!#(B -$B%G%#%U%)%k%H$O(B 1000 $B$G!"2a>j$@$H;W$&$+$b$7$l$^$;$s$,!"$3$l$OE,1~%9%3%"IU(B -$B$1$r$9$kM>CO$NB8:_$9$k;v$r3N.$5$JJQ99$G>e=q$-$5$l$?$/$O$"$j$^$;$s!#(B - -@item gnus-summary-default-score -@vindex gnus-summary-default-score -$B5-;v$N%9%3%"$N=i4|CM$G!"=i4|@_Dj$G$O(B 0 $B$K$J$C$F$$$^$9!#(B - -@item gnus-summary-expunge-below -@vindex gnus-summary-expunge-below -$B$3$NJQ?t$h$jDc$$%9%3%"$r;}$D5-;v$O35N,$N9T$KI=<($5$l$^$;$s!#$3$l$O=i4|@_(B -$BDj$G(B @code{nil} $B$G!"$3$l$O$I$N5-;v$b1#$5$l$J$$$H$$$&;v$G$9!#$3$NJQ?t$O3F(B -$B35N,%P%C%U%!$K8GM-$G!"(B@code{gnus-summary-mode-hook} $B$K$h$C$F@_Dj$5$l$k$Y(B -$B$-$G$9!#(B - -@item gnus-score-over-mark -@vindex gnus-score-over-mark -$B=i4|@_Dj$N%9%3%"$h$jBg$-$J%9%3%"$r;}$D5-;v$KBP$7$F(B ($B;07eL\$K(B) $B;H$o$l$k0u(B -$B$G$9!#=i4|@_Dj$O(B @samp{+} $B$G$9!#(B - -@item gnus-score-below-mark -@vindex gnus-score-below-mark -$B=i4|@_Dj$N%9%3%"$h$j>.$5$J%9%3%"$r;}$D5-;v$KBP$7$F(B ($B;07eL\$K(B) $B;H$o$l$k0u(B -$B$G$9!#=i4|@_Dj$O(B @samp{-} $B$G$9!#(B - -@item gnus-score-find-score-files-function -@vindex gnus-score-find-score-files-function -$B8=:_$N%0%k!<%W$N%9%3%"%U%!%$%k$r8+$D$1$k$?$a$K;H$o$l$k4X?t$G$9!#$3$N4X?t(B -$B$O%0%k!<%WL>$r0z?t$H$7$F8F$P$l$^$9!#(B - -$B;HMQ2DG=$J4{Dj4X?t$O(B: - -@table @code -@item gnus-score-find-single -@findex gnus-score-find-single -$B%0%k!<%W<+?H$N%9%3%"%U%!%$%k$@$1$rE,MQ$7$^$9!#(B - -@item gnus-score-find-bnews -@findex gnus-score-find-bnews -bnews $B9=J8$r;H$C$F!"A4$F$N9gCW$9$k%9%3%"%U%!%$%k$rE,MQ$7$^$9!#$3$l$,=i4|(B -$B@_Dj$G$9!#Nc$($P!"8=:_$N%0%k!<%W$,(B @samp{gnu.emacs.gnus} $B$J$i$P!"(B -@file{gnu.all.SCORE}, @file{not.alt.SCORE} $B$H(B @file{gnu.all.SCORE} $B$,$9(B -$B$Y$FE,MQ$5$l$^$9!#MW$9$k$K!"%9%3%"%U%!%$%kL>(B -$B$N(B @samp{all} $B$,(B @samp{.*} $B$KJQ49$5$l!"$=$l$+$i@55,I=8=$N9gCW$,$J$5$l$^(B -$B$9!#(B - -$B$3$l$O!"A4$F$N%0%k!<%W$KE,MQ$7$?$$%9%3%"EPO?$,$$$/$D$+$"$k>l9g$O!"$=$l$i(B -$B$NEPO?$r(B @file{all.SCORE} $B%U%!%$%k$KF~$l$k$H$$$&$3$H$G$9!#(B - -Gnus $B$O0lHLE*$J%9%3%"%U%!%$%k$rFCDj$N%9%3%"%U%!%$%k8~$1$N$b$N$h$jA0$KE,(B -$BMQ$7$h$&$H;n$_$^$9$,!"%9%3%"%U%!%$%k$O$[$H$s$IL5:n0Y$N=gHV$GE,MQ$5$l$^$9!#(B -$B$3$l$O%9%3%"%U%!%$%kL>$NMWAG$N?t$rD4$Y$k;v$K$h$C$F$J$5$l$^$9(B--- -@samp{all} $BMWAG$r$l(B -$B$N%5!<%P!<$KBP$7$F;}$D;v$,$G$-$k$H$$$&;v$G$9!#(B -@end table - -$B$3$NJQ?t$O4X?t$N%j%9%H$G$"$k;v$b$G$-$^$9!#$=$N>l9g$O!"$3$l$i$NA4$F$N4X?t(B -$B$,%0%k!<%WL>$r0z?t$H$7$F8F$P$l!"%9%3%"%U%!%$%k$NJV$5$l$?A4$F$N%j%9%H$,E,(B -$BMQ$5$l$^$9!#$3$l$i$N4X?t$OD>@\%9%3%"O"A[%j%9%H$N%j%9%H$N%j%9%H$rJV$9;v$b(B -$B$G$-$^$9!#$=$N>l9g$O!"$=$l$i$N%U%!%$%k$G$J$$%9%3%"O"A[%j%9%H$rJV$94X?t$O!"(B -$BJV$5$l$k:G8e$N%9%3%"%U%!%$%k$,%m!<%+%k%9%3%"%U%!%$%k$G$"$k;v$r3NC5n$rA`:n$7$F$$$kJ}K!$G$9(B---$BA4$F$N9gCW$7$J$$EPO?(B -$B$O8E$/$J$j$9$.!"9gCW$9$kEPO?$r?7A/$GLL$9$k;v$K$J$k$G$7$g$&!#(B - -@item gnus-score-after-write-file-function -@vindex gnus-score-after-write-file-function -$B$=$3$G$A$g$&$I=q$+$l$?%9%3%"%U%!%$%k$NL>A0$H6&$K8F$P$l$k4X?t$G$9!#(B - -@item gnus-score-thread-simplify -@vindex gnus-score-thread-simplify -$B$3$NJQ?t$,(B @code{nil} $B$G$J$$$H!"5-;vI=Bj$O%9%l%C%I$HF1$8J}K!$GI=Bj%9%3%"(B -$B$N$?$a$KC1=c2=$5$l$^$9(B---$B8=:_$N(B gnus-simplify-subject-functions $B$NCM$K$h$C(B -$B$F!#%9%3%"EPO?$,(B @code{$BJ8;zNsItJ,(B} $B$+(B @code{$B@53N$J(B} $B9gCW$r;H$C$F$$$k$H!"(B -$B9gCW$b$3$NJ}K!$GC1=c2=$5$l$^$9!#(B -@end table - -@node Score File Format -@section $B%9%3%"%U%!%$%kMM<0(B -@cindex score file format - -$B%9%3%"%U%!%$%k$OIaDL$OC1=c$JMM<0$N$b$N$@$1$r4^$`(B @code{emacs-lisp} $B%U%!(B -$B%$%k$G$9!#L5F\Ce$JMxMQ2A(B} (eval) $B$5$l$^$;$s!#$7$+$7!"(Blisp $B%j!<%@!<$,$3$NMM<0$rFI$_(B -$B9~$`$N$K;H$o$l$^$9$N$G!"0UL#E*$KM-8z$G$J$$$H$7$F$b!"J8K!E*$K$OM-8z$G$9!#(B - -$B$3$NO"A[%j%9%H$G$OO;$D$N%-!<$r;H$&;v$,$G$-$^$9!#(B - -@table @code -@item $BJ8;zNs(B (STRING) -$B$b$7%-!<$,J8;zNs$G$"$k$H!"$=$l$O9gCW$,A0$G$9!#%9%3(B -$B%"$O$3$l$i$NH,$D$N%X%C%@!<$@$1$K$l$N%9%3%"EPO?$O0l$D$+$i(B -$B;M$D$^$G$NMWAG$r;}$A$^$9!#(B -@enumerate - -@item -$B:G=i$NMWAG$O(B @dfn{$B9gCWMWAG(B} $B$G$9!#$?$$$F$$$N%X%C%@!<$G$O$3$l$OJ8;zNs$G$9(B -$B$,!"(BLines $B$H(B Chars $B%X%C%@!<$G$O$3$l$O@0?t$G$J$1$l$P$J$j$^$;$s!#(B - -@item -$B$b$7FsHVL\$NMWAG$,B8:_$9$k$J$i!"$=$l$O?t;z$G$"$k$Y$-$G(B -$B$9(B---@dfn{$B%9%3%"MWAG(B}$B!#$3$N?t;z$OIi$NL58BBg$+$i@5$NL58BBg$^$G$N4V$N@0?t(B -$B$G$"$k$Y$-$G$9!#$b$79gCW$,@.8y$9$l$P!"$3$N?t;z$,5-;v$N%9%3%"$K2C$($i$l$^(B -$B$9!#$b$7$3$NMWAG$,B8:_$7$F$$$J$1$l$P!"?t(B -$B;z(B @code{gnus-score-interactive-default-score}$B$,Be$o$j$K;H$o$l$^$9!#$3$l(B -$B$O=i4|@_Dj$G(B 1000 $B$G$9!#(B - -@item -$B$b$7;0HVL\$NMWAG$,B8:_$7$F$$$k$H!"$=$l$O?t;z$G$"$k$Y$-$G(B -$B$9(B---@dfn{$BF|IUMWAG(B} $B$G$9!#$3$NF|IU$O:G8e$K$3$N%9%3%"EPO?$,9gCW$7$?;~9o$r(B -$B<($7!"$3$l$O%9%3%"EPO?$N4|8B@Z$l>C5n5!9=$N5!G=$N$?$a$K;H$o$l$^$9!#$3$NMW(B -$BAG$,B8:_$7$F$$$J$1$l$P!"%9%3%"EPO?$O1JB3$7$^$9!#F|IU$O5*85A0(B 1$BG/(B12$B7n(B31$BF|(B -$B$+$i7P2a$7$?F|$K$A$N?t$GI=$5$l$^$9!#(B - -@item -$B$b$7;MHVL\$NMWAG$,B8:_$7$F$$$k$H!"$=$l$O%7%s%\%k$G$"$k$Y$-$G(B -$B$9(B---@dfn{$B7?MWAG(B} $B$G$9!#$3$NMWAG$O$3$N%9%3%"EPO?$,5-;v$K9gCW$9$k$+$I$&$+(B -$B$rD4$Y$k$N$K$I$N4X?t$,;H$o$l$k$Y$-$G$"$k$+$r;XDj$7$^$9!#(B - -@table @dfn -@item From, Subject, References, Xref, Message-ID -$B$?$$$F$$$N%X%C%@!<$N7?$KBP$7$F!"(B@code{r} $B$H(B @code{R} ($B@55,I=(B -$B8=(B) (regexp) $B$d!"(B@code{s} $B$H(B @code{S} ($BJ8;zNs$N0lIt(B) (substring) $B7?!"(B -@code{e} $B$H(B @code{E} ($B@53N$J9gCW(B) (exact match)$B!"(B -@code{w} ($B8l$N9gCW(B) (word match) $B7?$,B8:_$7$^$9!#$b$7$3$NMWAG$,B8:_$7$J(B -$B$$$H!"(Bgnus $B$OJ8;zNs$N0lIt$N9gCW$,MQ$$$i$l$k$Y$-$G$"$k$H$_$J$7$^$9!#(B -@code{R}, @code{S}, @code{E} $B$O9gCW$,BgJ8;z$H>.J8;z$r6hJL$9$kJ}K!$G9T$o(B -$B$l$k$H$$$&E@$GB>$N$b$N$H0[$J$j$^$9!#A4$F$N$3$l$i$N0lJ8;z7?$OK\Ev(B -$B$O(B @code{regexp}, @code{exact}, @code{word} $B7?$NC;=L7A$G!"$b$7$=$&$7$?$$(B -$B$H;W$($P$3$A$i$rBe$o$j$K;H$&;v$,$G$-$^$9!#(B - -@item Lines, Chars -$B$3$l$i$NFs$D$N%X%C%@!<$O0c$C$?9gCW$N7?$r;H$$$^$9(B: @code{<}, @code{>}, @code{=}, @code{>=}, @code{<=} $B$G(B -$B$9!#(B - -$B$3$l$i$N=R8l$O$b$7(B - -@example -(PREDICATE HEADER MATCH) -@end example - -$B$NI>2A$,(B @code{nil} $B$G$J$$$H!"??$H$J$j$^$9!#Nc$($P!">e5i9g(B -$BCW(B @code{("lines" 4 <)} (@pxref{Advanced Scoring}) $B$O7k2L$H$7$F0J2<$N<0(B -$B$K$J$j$^$9!#(B - -@lisp -(< header-value 4) -@end lisp - -$B$b$7$/$OB>$NJ}K!$K$7$^$7$g$&(B: @code{<} $B$r(B @code{Lines} $B$G(B 4 $B$r9gCW$H$7$F(B -$B;H$C$F$$$k$H$-$O!"5-;v$,(B 4 $B9T$h$j$b>/$J$$$H$-$K%9%3%"$,DI2C$5$l$^$9!#(B($B:.(B -$BMp$7$F!"H?BP$G$O$J$$$+$H9M$(0W$$$G$9!#$G$b!"$=$&$G$O$J$$$N$G$9!#;d$,;W$&(B -$B$K!#(B) - -$B9gCW$,(B @code{Lines} $B$G$J$5$l$F$$$k$H!"$$$/$D$+$N%P%C%/%(%s(B -$B%I(B (@code{nndir}$B$N$h$&$J$b$N(B) $B$O(B @code{Lines} $B%X%C%@!<$r:n@.$7$J$$$?$a$K(B -$BA4$F$N5-;v$,(B 0 $B9T$G$"$k$H$7$F07$o$l$k;v$K5$$rIU$1$F$/$@$5$$!#$3$l$O$b$7(B -$B>/$7$N9T$7$+$J$$5-;v$N%9%3%"$r2<$2$F$$$k$N$J$i!"JQ$J7k2L$,5/$3$jF@$k;v$K(B -$B$J$j$^$9!#(B - -@item Date -Date ($BF|IU(B) $B%X%C%@!<$K$O;0$D$N$J$s$H$J$/$P$+$2$F$$$k9gCW$N7?$,$"$j$^$9(B: -@code{before}, @code{at}, @code{after} $B$G$9!#;d$OK\Ev$K$3$l$,LrN)$D$h$&(B -$B$J5!2q$rA[A|$G$-$J$$$N$G$9$,!"$3$N4X?t$rDs6!$7$J$$$N$b$J$s$H$J$/$P$+$2$F(B -$B$$$^$9!#$=$&$7$?>l9g$N$?$a$K$"$k$N$G$9!#$$$DI,MW$K$J$k$+$OC/$K$b$o$+$j$^(B -$B$;$s!#E>$P$L@h$N>s!#C;5$$OB;5$!#K\$r%+%P!<$GH=CG$7$F$O9T$1$^$;$s!#=i$a$F(B -$B$N%G!<%H$G%(%C%A$7$F$O$$$1$^$;$s!#(B($B$7$+$7!";d$O>/$J$/$H$b0l?M!"0zMQ$7$^(B -$B$9$,!"(B``$B$3$N4X?t$O7g$+$;$J$$$b$N$G$"$k;v$,$o$+$C$?(B'' $B$H8@$C$??M$,$$$k$H(B -$BJ9$$$F$$$^$9!#(B) - -($BLuCm(B: $B86E5$N(B "Once burnt, twice shy" $B$r(B "$BC;5$$OB;5$(B" $B$H$7$^$7$?$,!"$b$C(B -$B$HE,@Z$JLu$,$"$l$P$*CN$i$;2<$5$$!#(B) - -@cindex ISO8601 -@cindex date -$B$b$C$HLrN)$D9gCW$N7?$O(B @code{$B@55,I=8=(B} $B$G$9!#$=$l$K$h$C$FF|IUJ8;zNs$K@5(B -$B5,I=8=$rMQ$$$F9gCW$5$;$k;v$,$G$-$^$9!#F|IU$O$^$:(B ISO8601 $BC;=LMM(B -$B<0(B (compact format) $B$KI8=`2=$5$l$^(B -$B$9(B---@var{YYYYMMDD}@code{T}@var{HHMMSS} $B$G$9!#Nc$($P!"$b$7A4$F$NG/(B -$B$N(B 4$B7n(B1$BF|(B $B$KEj9F$5$l$?A4$F$N5-;v$K$,<#$5$;$?$$$N$G$"$l$P!"(B -@samp{....0401.........} $B$r9gCWJ8;zNs$H$7$F;H$&;v$,$G$-$^$9!#(B($BF|IU$O85!9(B -$B$NI8=`;~$GJ]B8$5$l$F$$$^$9$N$G!"$=$N5-;v$,Ej9F$5$l$?$H$3$m$G(B 4$B7n(B1$BF|(B $B$KEj(B -$B9F$5$l$?5-;v$K9gCW$9$k;v$KCm0U$7$F$/$@$5$$!#I8=`;~$O0l2H$K$H$C$FHs>o$KM-(B -$B1W$J3Z$7$_$G$7$g$&(B?) - -@item Head, Body All -$B$3$l$i$N;0$D$N9gCW$N%-!<$O(B @code{From} $B%X%C%@!<(B ($B$J$I(B) $B$HF1$89gCW$N7?$r(B -$B;H$$$^$9!#(B - -@item Followup -$B$3$N9gCW$N%-!<$O>/$7FCJL$G!"$=$l$O(B @code{From} $B%X%C%@!<$K9gCW$7!"9gCW$7(B -$B$?5-;v$@$1$G$J$/$=$N5-;v$X$NA4$F$N%U%)%m!<%"%C%W$N%9%3%"$K$b1F6A$7$^$9!#(B -$B$3$l$O$?$H$($P!"$"$J$?<+?H$N5-;v$X$N%U%)%m!<%"%C%W$N%9%3%"$rA}$d$7$?$j!"(B -$BNI$/CN$i$l$?LdBj;y$X$N%U%)%m!<%"%C%W5-;v$N%9%3%"$r2<$2$?$j$9$k$N$K;H$o$l(B -$B$^$9!#(B@code{From} $B%X%C%@!<$,;H$&$N$HF1$87?$N9gCW$r;H$$$^$9!#(B($B$3$N9gCW%-!<(B -$B$r;H$&$H!"%U%!%$%k(B @file{ADAPT} $B$r:n$k;v$K$J$j$^$9!#(B) - -@item Thread -$B$3$N9gCW%-!<$O(B @code{Followup} $B9gCW%-!<$HF1$89T$KF0:n$7$^$9!#(B -@code{Message-ID} @var{x} $B$G;O$^$C$F$$$k(B ($BI{(B)$B%9%l%C%I$K%9%3%"$rIU$1$?$$(B -$B$N$G$"$l$P!"(B@samp{thread} $B9gCW$rIU$12C$($^$9!#$3$l$O(B @code{Reference} $B%X%C(B -$B%@!<$K(B @var{x} $B$r;}$D$=$l$>$l$N5-;v$K?7$7$$(B @samp{thread} $B9gCW$rDI2C$7$^(B -$B$9!#(B($B$3$l$i$N?7$7$$(B @samp{thread} $B9gCW$O$3$l$i$N9gCW$9$k5-;v(B -$B$N(B @code{Message-ID} $B$r;H$$$^$9!#(B) $B$3$l$O%9%l%C%I$N$$$/$D$+$N5-;v$,40A4(B -$B$J(B @code{References} $B%X%C%@!<$r;}$C$F$$$J$+$C$?$H$7$F$b!"%9%l%C%IA4BN$N(B -$B%9%3%"$r>e$2(B/$B2<$2$G$-$k;v$rJ]>Z$7$^$9!#$3$l$r;H$&$H!"%9%l%C%I$N5-;v$K7h(B -$BDjE*$G$J$$%9%3%"$,IU$/$+$b$7$l$J$$$H$$$&$3$H$KCm0U$7$F$/$@$5$$!#(B($B$3$N9g(B -$BCW%-!<$r;H$&$H!"%U%!%$%k(B @file{ADAPT} $B$r:n$k;v$K$J$j$^$9!#(B) -@end table -@end enumerate - -@cindex Score File Atoms -@item mark -$B$3$NEPO?$NCM$O?t;z$G$"$k$Y$-$G$9!#$3$N?t;z$h$jDc$$%9%3%"$N5-;v$K$O4{FI$N(B -$B0u$,IU$-$^$9!#(B - -@item expunge -$B$3$NEPO?$NCM$O?t;z$G$"$k$Y$-$G$9!#$3$N?t;z$h$jDc$$%9%3%"$N5-;v$O35N,%P%C(B -$B%U%!$+$i:o=|$5$l$^$9!#(B - -@item mark-and-expunge -$B$3$NEPO?$NCM$O?t;z$G$"$k$Y$-$G$9!#$3$N?t;z$h$jDc$$%9%3%"$N5-;v$K$O4{FI$N(B -$B0u$,IU$-!"35N,%P%C%U%!$+$i:o=|$5$l$^$9!#(B - -@item thread-mark-and-expunge -$B$3$NEPO?$NCM$O?t;z$G$"$k$Y$-$G$9!#%9%3%"$NAm7W$,$3$N?t;z$h$jDc$$%9%l%C%I(B -$B$K$O4{FI$N0u$,IU$-!"35N,%P%C%U%!$+$i:o=|$5$l$^$9!#(B -@code{gnus-thread-score-function} $B$O%9%l%C%I$N%9%3%"$NAm7W$r$I$N$h$&$K7W(B -$B;;$9$k$+$r;XDj$7$^$9!#(B - -@item files -$B$3$NEPO?$NCM$OG$0U$N?t$N%U%!%$%kL>$G$"$k$Y$-$G$9!#$3$l$i$N%U%!%$%k$b%9%3(B -$B%"%U%!%$%k$G$"$k$H$_$J$5$l!"$3$l$,$5$l$?$N$HF1$8$h$&$JJ}K!$GFI$_9~$^$l$^(B -$B$9!#(B - -@item exclude-files -$B$3$NEPO?$N$G$"$k$Y$-$G$9!#$3$l$i$N%U%!%$%k(B -$B$O2?$i$+$NM}M3$GIaDL$OFI$_9~$^$l$k$h$&$K$J$C$F$$$?$H$7$F$b!"FI$_9~$^$l$^(B -$B$;$s!#(B - -@item eval -$B$3$NEPO?$NCM$O(B @code{$BI>2A(B} $B$5$l$^$9!#$3$NMWAG$OA4BNE*%9%3%"%U%!%$%k$r07$C(B -$B$F$$$k$H$-$OL5;k$5$l$^$9!#(B - -@item read-only -$BFI$_9~$_@lMQ%9%3%"%U%!%$%k$O99?7$5$l$?$jJ]B8$5$l$?$j$7$^$;$s!#A4BNE*%9%3(B -$B%"%U%!%$%k$O$3$N%"%H%`$r;HMQ$9$k$Y$-$G$9(B (@pxref{Global Score Files})$B!#(B -($BCm0U(B: @dfn{$BA4BNE*(B} $B$O$3$3$G$OK\Ev$K(B @dfn{$BA4BNE*(B} $B$H$$$&0UL#$G$9!#8D?ME*(B -$B$JA4$F$N%0%k!<%W$KE,MQ$9$k%9%3%"%U%!%$%k$N;v$G$O$"$j$^$;$s!#(B) - -@item orphan -$B$3$NEPO?$NCM$O?t;z$G$"$k$Y$-$G$9!#?F5-;v$r;}$?$J$$5-;v$O%9%3%"$K$3$N?t;z(B -$B$,2C$($i$l$^$9!#(B@samp{comp.lang.c} $B$N$h$&$JNL$NB?$$%K%e!<%9%0%k!<%W$rDI(B -$B$$$+$1$F$$$k$H$7$F$/$@$5$$!#$*$=$i$/Fs!";0$N%9%l%C%I$H?7$7$$%9%l%C%I$@$1(B -$B$rDI$$$?$$$G$7$g$&!#(B - -$B0J2<$N;0$D$N%9%3%"%U%!%$%kEPO?$K$h$C$F$=$l$r$9$k;v$,$G$-$^$9(B: - -@example - (orphan -500) - (mark-and-expunge -100) -@end example - -$B:G=i$K$3$N%0%k!<%W$KF~$C$?$H$-$O!"?7$7$$%9%l%C%I$@$1$r8+$^$9!#$=$l$+$i$*(B -$B$b$7$m$$$H;W$C$?%9%l%C%I$N%9%3%"$r>e$2(B (@kbd{I T} $B$b$7$/$O(B @kbd{I S} $B$K(B -$B$h$C$F(B)$B!";D$j$rL5;k(B (@kbd{C y}) $B$7$^$9!#/$7B8:_$7$9$kNL$NB?$$%0%k!<%W$N$?$a$K$"$j$^$9!#(B - -@item adapt -$B$3$NEPO?$OE,1~%9%3%"$r@)8f$7$^$9!#$b$7$3$l$,(B @code{t} $B$G$"$k$H!"=i4|@_Dj(B -$B$NE,1~%9%3%"K!B'$,;H$o$l$^$9!#$b$7$3$l$,(B @code{ignore} $B$G$"$k$H!"$3$N%0(B -$B%k!<%W$K$OE,1~%9%3%"$O$N$b$N$G$"$l$P!"=i4|@_Dj$NE,1~%9%3%"K!(B -$BB'$,;H$o$l$^$9!#$?$$$F$$$N%0%k!<%W$KE,1~%9%3%"$r;H$$$?$$$N$G$"$l$P!"(B -@code{gnus-use-adaptive-scorint} $B$r(B @code{t} $B$K@_Dj$7!"(B@code{(adapt -ignore)} $B$rE,1~%9%3%"$r$7$?$/$J$$%0%k!<%W$KA^F~$9$k$G$7$g$&!#>/$7$N%0%k!<(B -$B%W$G$@$1E,1~%9%3%"$r9T$$$?$$$N$G$"$l$P!"(B -@code{gnus-use-adaptive-scoring} $B$r(B @code{nil} $B$K@_Dj$7!"(B -@code{(adaptive t)} $B$r$=$l$r9T$$$?$$%0%k!<%W$N%9%3%"%U%!%$%k$KA^F~$9$k$G(B -$B$7$g$&!#(B - -@item adaptive-file -$BA4$F$NE,1~%9%3%"EPO?$O$3$NEPO?$K$h$C$FL>$E$1$i$l$?%U%!%$%k$KF~$j$^$9!#$=(B -$B$l$O%0%k!<%W$KF~$k$H$-$K$bE,MQ$5$l$^$9!#$3$N%"%H%`$OB?$/$N%0%k!<%W$KF1$8(B -$BE,1~%9%3%"%U%!%$%k$rMQ$$$k;v$K$h$C$F!"J#?t$N%0%k!<%W$K0lEY$KE,1~%9%3%"$r(B -$BIU$1$?$$$H$-$KJXMx$G$7$g$&!#(B - -@item local -@cindex local variables -$B$3$NEPO?$NCM$O(B @code{(VAR VALUE)} $BBP$N%j%9%H$G$"$k$Y$-$G$9!#$=$l$>$l(B -$B$N(B @var{var} $B$O8=:_$N35N,%P%C%U%!$N%P%C%U%!8GM-$K$J$j!";XDj$5$l$?(B -$BCM(B (value) $B$K@_Dj$5$l$^$9!#$3$l$OJXMx$J!"$b$7>/$7JQ$@$H$7$F$b!"%U%C%/$r(B -$B$"$^$j9%$^$J$$$$$/$D$+$N%0%k!<%W$GJQ?t$r@_Dj$9$kJ}K!$G$9!#(B@var{value} $B$O(B -$BI>2A$5$l$J$$;v$KCm0U$7$F$/$@$5$$!#(B -@end table - -@node Score File Editing -@section $B%9%3%"%U%!%$%kJT=8(B - -$BIaDL$OA4$F$N%9%3%"L?Na$r35N,%P%C%U%!$+$iH/9T$7$^$9$,!"/$7%+%9%?%^%$%:$5$l$?(B @code{emacs-lisp} $B%b!<%I$G!"0J2<$NDI(B -$B2C$NL?Na$,B8:_$7$^$9(B: - -@table @kbd -@item C-c C-c -@kindex C-c C-c ($B%9%3%"(B) -@findex gnus-score-edit-done -$B$"$J$?$,9T$C$?JQ99$rJ]B8$7$F35N,%P%C%U%!$KLa$j$^(B -$B$9(B (@code{gnus-score-edit-done})$B!#(B - -@item C-c C-d -@kindex C-c C-d ($B%9%3%"(B) -@findex gnus-score-edit-insert-date -$B8=:_$NF|IU$r?t;zMM<0$GA^F~$7$^$9(B (@code{gnus-score-edit-insert-date})$B!#(B -$B$b$7$3$l$,$I$N$h$&$J$b$N$G$"$m$&$H9M$($F$$$k$N$G$"$l$P!"$3$l$OK\Ev$KF|$N(B -$B?t;z$G$9!#(B - -@item C-c C-p -@kindex C-c C-p ($B%9%3%"(B) -@findex gnus-score-pretty-print -$BE,1~%9%3%"%U%!%$%k$O@0$($i$l$F$$$J$$N.57$GJ]B8$5$l$^$9!#$b$7$3$l$i$N%U%!(B -$B%$%k$NFb$N0l$D$rFI$_$?$$$H;W$C$F$$$k$N$G$"$l$P!"$^$:(B @dfn{$BAGE($JI=<((B} $B$r(B -$B$7$?$$$G$7$g$&!#$3$NL?Na(B (@code{gnus-score-pretty-print}) $B$,$"$J$?$N$?$a(B -$B$K$=$l$r$7$^$9!#(B -@end table - -$B$3$N%b!<%I$r;H$&$?$a$K$O(B @kbd{M-x gnus-score-mode} $B$HBG$C$F$/$@$5$$!#(B - -@vindex gnus-score-mode-hook -@code{gnus-score-menu-hook} $B$,%9%3%"%b!<%I%P%C%U%!$GJ}$NE,1~(B -$BJ}K!$r;H$$$?$1$l$P!"$3$NJQ?t$r(B@code{(wordline)} $B$K@_Dj$7$F$/$@$5$$!#(B - -@vindex gnus-default-adaptive-score-alist -@code{gnus-default-adaptive-score-alist} $BJQ?t$r%+%9%?%^%$%:$9$k$3$H$G!"(B -$B%9%3%"IU$1$N=hM}$r40A4$K@)8f$G$-$^$9!#Nc$($P!"$3$N$h$&$J46$8$K$J$j$^$9!#(B - -@lisp -(setq gnus-default-adaptive-score-alist - '((gnus-unread-mark) - (gnus-ticked-mark (from 4)) - (gnus-dormant-mark (from 5)) - (gnus-del-mark (from -4) (subject -1)) - (gnus-read-mark (from 4) (subject 2)) - (gnus-expirable-mark (from -1) (subject -1)) - (gnus-killed-mark (from -1) (subject -3)) - (gnus-kill-file-mark) - (gnus-ancient-mark) - (gnus-low-score-mark) - (gnus-catchup-mark (from -1) (subject -1)))) -@end lisp - -$B8+$F$*J,$+$j$N$h$&$K!"$3$NO"A[%j%9%H$N3FMWAG$O!"%-!<$H$7$F0u(B ($BJQ?tL>$+$b(B -$B$7$/$O(B ``$BK\Ev$N(B'' $B0u(B --- $B$D$^$jJ8;z(B)$B$r;}$A$^$9!#$3$N%-!<$N8e$K$OG$0U$N?t(B -$B$N%X%C%@!<(B/$B%9%3%"$NAH$,B3$-$^$9!#$b$7$=$N%-!<$N8e$K%X%C%@!<(B/$B%9%3%"$NAH$,(B -$B0l$D$b$J$1$l$P!"$=$N%-!<$,5-;v$N0u$H$7$F$D$$$F$$$k5-;v$KBP$7$F$OE,1~@-%9(B -$B%3%"$Oe5-$NNc$G$O!"(B@code{gnus-unread-mark} $B$,$D$$(B -$B$F$$$k5-;v$OE,1~@-%9%3%"$NEPO?9`L\$K$O$J$j$^$;$s!#(B - -$B3F5-;v$O$?$@0l$D$N0u$7$+;}$AF@$J$$$N$G!"$=$l$>$l$N5-;v$K$O$3$l$i$N5,B'$N(B -$B$&$A$?$@0l$D$7$+E,MQ$5$l$^$;$s!#(B - -@code{gnus-del-mark} $B$rNc$KC5n(B ($B%a!<%k(B) $B%0%k!<%W(B (@pxref{Expiring Mail})$B$,$"$l$P!"(B -$B4{FI5-;v$K$OA4$F(B @samp{E} $B0u$,$D$1$i$l$^$9!#$3$l$O$*$=$i$/!"E,1~@-%9%3%"(B -$BIU$1$r$A$g$C$H$P$+$jIT2DG=$K$9$k$N$G!"<+F04|8B@Z$l>C5n$HE,1~@-%9%3%"$O0l(B -$B=o$K$O$&$^$/$d$C$F$$$1$^$;$s!#(B - -$B%9%3%"$r$D$1$i$l$k%X%C%@!<$K(B -$B$O(B @code{from}, @code{subject}, @code{message-id}, @code{references}, @code{xref}, @code{lines}, @code{chars}, @code{date} $B$,(B -$B$"$j$^$9!#$5$i$K(B @code{followup} $B$K$b%9%3%"IU$1$G$-$^$9!#$3$l$O8=:_$N5-(B -$B;v$N(B @code{Message-ID} $B$r;HMQ$7$F(B @code{References} $B%X%C%@!<$K%^%C%A!"$9(B -$B$J$o$A$3$l$KB3$$$?%9%l%C%I$K%^%C%A$9$kE,1~@-%9%3%"EPO?$r:n@.$7$^$9!#(B - -$B$^$?(B @code{thread} $B$K$b%9%3%"IU$1$9$k$3$H$,$G$-$^$9!#$3$l$O%9%l%C%ICf$N(B -$BA4$F$N5-;v$K%9%3%"IU$1$7$h$&$H$7$^$9!#(B@code{thread} $B$N%^%C%A$O!"(B -@code{Message-ID} $B$r;H$C$F5-;v$N(B @code{References} $B%X%C%@!<$K%^%C%A$5$;(B -$B$^$9!#%^%C%A$,5/$3$C$?$i$=$N5-;v$N(B @code{Message-ID} $B$,(B @code{thread} $B5,(B -$BB'$KDI2C$5$l$^$9!#(B($B$A$g$C$H9M$($F$_$F$/$@$5$$!#8e$GF,DKLt$rFsN3$*4+$a$7(B -$B$H$-$^$9$,(B) - -$B$3$N5!9=$r;H$&$J$i$P!"$H$-$I$-5-;v$r4{FI$K$7$F$7$^$&>.$5$JJQ99$rHr$1$k$?(B -$B$a$K!"%9%3%"%U%!%$%k$N(B @code{mark} $B%"%H%`$r2?$+>.$5$$CM(B --- $B$3$H$K$h$l(B -$B$P(B -300 $B$/$i$$$K@_Dj$7$F$*$$$?J}$,NI$$$G$9!#(B - -$BE,1~@-%9%3%"$r0l=54V$+$=$3$i;H$C$F$/$k$H!"(Bgnus $B$O$=$lAj1~$KD465$5$l!"$"(B -$B$J$?$,2?$b8@$o$J$/$F$b!"$"$J$?$N9%$-$JEj9FC5n$9$k$h$&$K$J$k$O$:$G$9!#(B - -$B$I$N%0%k!<%W$K$*$$$FE,1~@-%9%3%"$r:nF0$5$;$k$+$O!"%9%3%"%U%!%$(B -$B%k(B (@pxref{Score File Format}) $B$r;H$&$3$H$K$h$C$F@)8f$G$-$^$9!#$^$?$3$l(B -$B$r;H$C$F!"0c$C$?%0%k!<%W$KBP$7$F0c$C$?5,B'$r;H$&$h$&$K$b$G$-$^$9!#(B - -@vindex gnus-adaptive-file-suffix -$BE,1~@-%9%3%"EPO?9`L\$O!"%0%k!<%WL>$K(B @code{gnus-adaptive-file-suffix} $B$r(B -$BIU2C$7$?L>A0$N%U%!%$%k$KF~$l$i$l$^$9!#=i4|@_DjCM$O(B @samp{ADAPT} $B$G$9!#(B - -@vindex gnus-score-exact-adapt-limit -$BE,1~@-%9%3%"$r9T$&$H$-$O!"ItJ,J8;zNs0lCW$d%U%!%8!<$J0lCW$r9T$C$?J}$,!"$*(B -$B$=$i$/$[$H$s$I$N>l9g$K$*$$$FNI$$7k2L$,F@$i$l$k$G$7$g$&!#$7$+$7!"%X%C%@!<(B -$B$N0lCW$7$?ItJ,$,C;$$>l9g!"0U?^$KH?$9$k$h$&$JF0:n$r$9$k2DG=@-$,Bg$-$/$J$k(B -$B$N$G!"(B@code{gnus-score-exact-adapt-limit} $B$h$jC;$$D9$5$7$+0lCW$7$J$$>l9g(B -$B$O40A40lCW$,9T$o$l$^$9!#$3$NJQ?t$,(B @code{nil} $B$G$"$l$P!"$3$NLdBj$,5/$3$i(B -$B$J$$$h$&$K>o$K40A40lCW$,9T$o$l$^$9!#(B - -@vindex gnus-default-adaptive-word-score-alist -$B>e$G=R$Y$?$h$&$K!"8DJL$NC18l$KBP$7$F$b%X%C%@!l9g!"(B -@code{gnus-default-adaptive-word-score-alist} $BJQ?t$K$h$C$F!"3FC18l$KBP$7(B -$B$F$"$k0u$X$I$s$J%9%3%"$rM?$($k$+$r;XDj$7$^$9!#(B - -@lisp -(setq gnus-default-adaptive-word-score-alist - `((,gnus-read-mark . 30) - (,gnus-catchup-mark . -10) - (,gnus-killed-mark . -20) - (,gnus-del-mark . -15))) -@end lisp - -$B$3$l$,=i4|@_DjCM$G$9!#C18l$KBP$9$kE,1~$rM-8z$K$9$k$H!"(B -@code{gnus-read-mark} $B$N0u$N$D$$$?5-;v$NI=Bj$K8=$l$kA4$F$NC18l$,!"%9%3%"(B -$B$K(B 30 $BE@DI2C$9$k$H$$$&%9%3%"5,B'$r@8$_=P$7$^$9!#(B - -@vindex gnus-default-ignored-adaptive-words -@vindex gnus-ignored-adaptive-words -@code{gnus-default-ignored-adaptive-words} $B$N%j%9%H$K8=$l$kC18l$OL5;k$5(B -$B$l$^$9!#L5;k$7$?$$C18l$rDI2C$7$?$$$H$-$O!"$3$NJQ?t$G$O$J(B -$B$/(B @code{gnus-ignored-adaptive-words} $B%j%9%H$NJ}$r;H$C$F$/$@$5$$!#(B - -@vindex gnus-adaptive-word-length-limit -$BC;$$C18l$G$OE,1~@-%9%3%"$r:nF0$5$;$k$Y$-$G$O$J$$$H;W$&?M$b$$$k$G$7$g$&!#(B -$B$b$7$=$&$J$i(B @code{gnus-adaptive-word-length-limit} $B$K@0?t$r@_Dj$9$k$3$H(B -$B$,$G$-!"$3$N?tCM$h$jC;$$C18l$OL5;k$5$l$^$9!#$3$NJQ?t$N=i4|@_DjCM(B -$B$O(B @code{nil} $B$G$9!#(B - -@vindex gnus-adaptive-word-syntax-table -$B%9%3%"IU$1$,=*N;$7$?$H$-!"(B@code{gnus-adaptive-word-syntax-table} $B$NJ8K!(B -$BI=$,$=$N1F6A$r.$5$/$J$k$3$H$O(B -$B$"$j$^$;$s!#=i4|@_DjCM$O(B @code{nil} $B$G$9!#(B - -@vindex gnus-adaptive-word-no-group-words -@code{gnus-acaptive-word-no-group-words} $B$,(B @code{t} $B$K@_Dj$5$l$F$$$k$H!"(B -gnus $B$O%0%k!<%WL>$NA4$F$N8l$K$D$$$F!"C18lE,1~@-%9%3%"$r$7$^$;$s!#$[$H$s(B -$B$I$NI=Bj$,(B @samp{emacs} $B$H$$$&8l$r4^$s$G$$$k(B @samp{comp.editor.emacs} $B$N(B -$B$h$&$J%0%k!<%W$GJXMx$G$9!#(B - -$B$3$N5!9=$r$7$P$i$/;H$C$F$_$?8e$K$O!"$"$J$?$,$I$s$JC18l$,9%$-$G$I$s$JC18l(B -$B$,7y$$$+$r!"$3$N5,B'$rDL$7$F?GCG$9$kMxMQo$K]$G$O!"$3$l$O8=>u$G$OA4$/;H(B -$B$$J*$K$J$i$J$$$h$&$K;W$($^$9!#$3$l$r$b$C$H;H$($k$h$&$K$9$k$?$a$K$O!"(B($B$h(B -$B$j87L)$JE}7WE*o(B ($B=i4|@_Dj$G(B) $B$=$N%0(B -$B%k!<%WMQ$N%9%3%"%U%!%$%k$K$J$j$^$9!#Nc$($P!"(B@samp{gnu.emacs.gnus} $BMQ$N%[!<(B -$B%`%9%3%"%U%!%$%k$O(B @file{gnu.emacs.gnus.SCORE} $B$H$J$k$o$1$G$9!#(B - -$B$7$+$7$J$,$i!"$3$l$O$"$J$?$N$*K>$_$G$O$J$$$+$b$7$l$^$;$s!#$?$/$5$s$N%0%k!<(B -$B%W4V$G6&DL$N%[!<%`%9%3%"%U%!%$%k$r6&M-$9$k$HJXMx$J$H$-$,B?$$$G$7$g(B -$B$&(B --- $BNc$($PA4$F$N(B @samp{emacs} $B%0%k!<%W$GF1$8%[!<%`%9%3%"%U%!%$%k$r;H(B -$B$&$3$H$b$G$-$^$9!#(B - -@vindex gnus-home-score-file -$B$3$l$r@)8f$9$kJQ?t$,(B @code{gnus-home-score-file} $B$G$9!#$3$l$O0J2<$NCM$r(B -$Bl9g$3$N%U%!%$%k$,A4$F$N%0%k!<%W$G%[!<%`%9%3%"%U%!%$%k$H$7$F(B -$B;HMQ$5$l$^$9!#(B - -@item -$B4X?t!#$3$N4X?t$N7k2L$,%[!<%`%9%3%"%U%!%$%k$H$7$F;HMQ$5$l$^$9!#$3$N4X?t$O(B -$B%0%k!<%W$NL>A0$r0z?t$H$7$F8F$S=P$5$l$^$9!#(B - -@item -$B%j%9%H!#$3$N%j%9%H$NMWAG$O0J2<$NCM$r$K%^%C%A(B -$B$9$l$P!"(B@var{file-name} $B$,%[!<%`%9%3%"%U%!%$%k$H$7$F;HMQ$5$l$^$9!#(B - -@item -$B4X?t!#$3$N4X?t$,(B @code{nil} $B0J30$rJV$;$P!"$=$NJV5QCM$,%[!<%`%9%3%"%U%!%$(B -$B%k$H$7$F;HMQ$5$l$^$9!#(B - -@item -$BJ8;zNs!#$3$NJ8;zNs$r%[!<%`%9%3%"%U%!%$%k$H$7$F;HMQ$7$^$9!#(B -@end enumerate - -$B$3$N%j%9%H$NCf$+$i%^%C%A$9$k$b$N$r!":G=i$+$i8e$m$NJ}$K8~$+$C$FC5$7$F$$$-(B -$B$^$9!#(B - -@end enumerate - -$B$H$$$&$o$1$G!"C1$K0l8D$N%9%3%"%U%!%$%k$r;H$$$?$$>l9g$O!"0J2<$N$h$&$K$9$l(B -$B$P$G$-$^$9!#(B - -@lisp -(setq gnus-home-score-file - "my-total-score-file.SCORE") -@end lisp - -$B$b$7A4(B @samp{gnu} $B%0%k!<%W$KBP$7$F(B @file{gnu.SCORE} $B$r!"A4(B @samp{rec} $B%0(B -$B%k!<%W$KBP$7$F(B @file{rec.SCORE} ($BEy!9(B) $B$r;H$$$?$1$l$P!"$3$N$h$&$K$G$-$^(B -$B$9!#(B - -@findex gnus-hierarchial-home-score-file -@lisp -(setq gnus-home-score-file - 'gnus-hierarchial-home-score-file) -@end lisp - -$B$3$l$OJXMx$J$h$&$K$"$i$+$8$aDs6!$5$l$F$$$k4X?t$G$9!#B?$N4X?t$O0J2<$N0J2<(B -$B$N$b$N$r4^$_$^$9!#(B - -@table @code -@item gnus-current-home-scre-file -@findex gnus-current-home-score-file -``$B8=:_$N(B'' $BI8=`%9%3%"%U%!%$%k$rJV$7$^$9!#$3$l$O%9%3%"L?Na$K%9%3%"%U%!%$(B -$B%k$N(B ``$B:GFbIt(B'' $B9gCW$X$NEPO?$r2C$($k$h$&$K$7$^$9!#(B -@end table - -$B$b$7(B @samp{emacs} $B%0%k!<%WMQ$N%9%3%"%U%!%$%k$H!"$=$l$H$OJL(B -$B$N(B @samp{comp} $B%0%k!<%WMQ$N%9%3%"%U%!%$%k$r;H$$!"B>$NA4It$N%0%k!<%W$G$O(B -$B$=$l$>$lFH<+$N%9%3%"%U%!%$%k$r;H$$$?$$$N$G$"$l$P!"(B - -@lisp -(setq gnus-home-score-file - ;; All groups that match the regexp "\\.emacs" - '(("\\.emacs" "emacs.SCORE") - ;; All the comp groups in one score file - ("^comp" "comp.SCORE"))) -@end lisp - -@vindex gnus-home-adapt-file -@code{gnus-home-adapt-file} $B$O(B @code{gnus-home-score-file} $B$HA4$/F1$8$h(B -$B$&$KF0:n$7$^$9$,!"$3$l$OBe$o$j$K2?$r%[!<%`E,MQ%9%3%"%U%!%$%k$K$9$k$+$r;X(B -$BDj$7$^$9!#?7$7$$E,MQ%U%!%$%kEPO?9`L\$OA4$F!"$3$NJQ?t$G;XDj$5$l$k%U%!%$%k(B -$B$KF~$l$i$l$^$9!#CM$K$OF1$8J8K!$,5v$5$l$^$9!#(B - -@code{gnus-home-score-file} $B$H(B @code{gnus-home-adapt-file} $B$N;HMQ$K2C$((B -$B$F!"%0%k!<%W%Q%i%a!<%?(B (@pxref{Group Parameters}) $B$H%H%T%C%/%Q%i%a!<(B -$B%?(B (@pxref{Topic Parameters}) $B$r;H$C$F$[$\F1MM$N$3$H$,$G$-$^$9!#%0%k!<%W!"(B -$B%H%T%C%/%Q%i%a!<%?$O$3$NJQ?t$h$j$bM%@h$5$l$^$9!#(B - -@node Followups To Yourself -@section $B<+J,<+?H$X$N%U%)%m!<%"%C%W(B - -Gnus $B$O8=:_$N%P%C%U%!!<$+$i(B @code{Message-ID} $B%X%C%@!<$r8+$D$1=P$9$?$a$K(B -$BFs$D$NL?Na$rDs6!$7$F$$$^$9!#$=$7$F(B gnus $B$O!"B>$N5-;v$K$*$1(B -$B$k(B @code{References} $B%X%C%@!@\%U%)%m!<%"%C%W$7$?5-;v$K%9%3%"$r2C;;$7$^$9!#(B - -@item gnus-score-followup-thread -@findex gnus-score-followup-thread -$B$3$l$O$"$J$?$N5-;v$h$j(B ``$B2<(B'' $B$N%9%l%C%I$K8=$l$k5-;vA4$F$KBP$7$F%9%3%"$r(B -$B2C;;$7$^$9!#(B -@end table - -@vindex message-sent-hook -$B$3$l$iFs$D$N4X?t$O!"4pK\E*$K$O$I$A$i$b(B @code{message-sent-hook} $B$N$h$&$J(B -$B%U%C%/$NCf$G;H$&$?$a$N$b$N$G$9!#Nc$($P$3$N$h$&$K(B: -@lisp -(add-hook 'message-sent-hook 'gnus-score-followup-thread) -@end lisp - -$B$"$J$?$N<+J,$N(B @code{Message-ID} $B$r$8$C$/$j$HD/$a$F$_$k$H!"$O$8$a$NFs!"(B -$B;0J8;z$O>o$KF1$8$G$"$k$3$H$K5$$,$D$/$G$7$g$&!#0J2<$NFs$D$O;d$N$b$N$G$9!#(B - -@example - - -@end example - -$B$D$^$j$3$N%^%7%s>e$G$N(B ``$B;d$N(B'' $B$N<1JL$O(B @samp{x6} $B$G$"$k$H$$$&$3$H$G$9!#(B -$B$3$l$O;H$($^$9(B --- $B0J2<$N5,B'$O;d<+?H$X$N%U%)%m!<%"%C%WA4$F$KBP$7$F%9%3(B -$B%"$rA}2C$5$;$k$G$7$g$&!#(B - -@lisp -("references" - ("" - 1000 nil r)) -@end lisp - -``$B$"$J$?$N(B'' $B$,:G=i$NFsJ8;z$K$J$k$+:G=i$N;0J8;z$K$J$k$+$O%7%9%F%`$K0MB8(B -$B$7$^$9!#(B - -@node Scoring On Other Headers -@section $BB>$N%X%C%@!<$K%9%3%"$rIU$1$k(B -@cindex scoring on other headers - -gnus $B$,(B ``$BEAE}E*(B'' $B$J%X%C%@!<(B -- @samp{From}, @samp{Subject} $B$J$I(B -- $B$K(B -$B%9%3%"$rIU$1$k$N$O$H$F$bB.$$$G$9!#$G$9$,!"B>$N%X%C%@!<$K%9%3%"$rIU$1$k$K(B -$B$O(B @code{head} $B$N%9%3%"$N$?$a$N5,B'$r=q$/I,MW$,$"$j!"$=$l$O9gCW$rC5$9$?(B -$B$a$K(B gnus $B$,Kh2s%P%C%/%(%s%I$+$iC1FH$N5-;v$r\$7$/@bL@$5(B -$B$l$F$$$^$9$,!"$3$3$G$O(B @code{nnml} $B$G(B @samp{To} $B$H(B @samp{Cc} $B%X%C%@!<$K(B -$B%9%3%"$rIU$1$kJ}K!$ND4M}$NNc$r5s$2$^$7$g$&!#(B - -$B0J2<$r(B @file{.gnus.el} $B%U%!%$%k$KCV$$$F2<$5$$!#(B - -@lisp -(setq gnus-extra-headers '(To Cc Newsgroups Keywords) - nnmail-extra-headers gnus-extra-headers) -@end lisp - -gnus $B$r:F5/F0$7$F!"(B@kbd{M-x nnml-generate-nov-databases} $B%3%^%s%I(B -$B$G(B @code{nnml} $B$N(B overview $B%U%!%$%k$r:n$jD>$7$^$9!#$b$7$"$J$?$,$?$/$5$s(B -$B$N%a!<%k$r;}$C$F$$$k$H!"$3$l$K$OD9$$;~4V$,$+$+$j$^$9!#(B - -$B$=$7$F(B @kbd{I e s p To RET RET} $B$N$h$&$K$9$k$H!"$"$J$?(B -$B$O(B @samp{To} $B$H(B @samp{Cc} $B%X%C%@!<$K(B ``extra headers'' $B$H$7$F%9%3%"$rIU(B -$B$1$k$3$H$,$G$-$^$9!#(B - -$B$o$+$C$?$+$J(B? $B4JC1$@$h$M!#(B - -@node Scoring Tips -@section $B%9%3%"IU$1$N1|5A(B -@cindex scoring tips - -@table @dfn -@item $B%/%m%9%]%9%H(B -@cindex crossposts -@cindex scoring crossposts -$B%/%m%9%]%9%H$N%9%3%"$rDc$/$7$?$1$l$P!"%^%C%A$5$;$k$Y$-9T(B -$B$O(B @code{Xref} $B%X%C%@!<$G$9!#(B - -@lisp -("xref" (" talk.politics.misc:" -1000)) -@end lisp - -@item $BJ#?t$N%/%m%9%]%9%H(B -$B$"$k?t!"Nc$($P;0$D0J>e$N%0%k!<%W$K%/%m%9%]%9%H$5$l$F$$$k5-;v$N%9%3%"$rDc(B -$B$/$7$?$1$l$P!"(B - -@lisp -("xref" - ("[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+" - -1000 nil r)) -@end lisp - -@item $BK\J8$X$N%^%C%A(B -$B$3$l$O0lHLE*$K$O$"$^$jNI$$9M$($G$O$"$j$^$;$s(B --- $B$=$l$O$H$F$bD9;~4V$+$+$C(B -$B$F$7$^$&$+$i$G$9!#$l$N5-;v$r8DJL$K%5!<%P!<$+$i$l$N5-;v$O(B @emph{$BFs2s(B} $B$K(B @code{All} $B$r;H$C$FA4It%^%C%A$5$;$F$/$@$5(B -$B$$!#(B - -@item $B4{FI$N0uIU$1(B -$B$"$k0lDj?t;z0J2<$N%9%3%"$r;}$D5-;v$K$O!"$*$=$i$/4{FI$N0u$r$D$1$F$7$^$$$?(B -$B$/$J$k$G$7$g$&!#$3$l$O(B @file{all.SCORE} $B%U%!%$%k$K0J2<$N$b$N$rF~$l$F$*$/(B -$B$3$H$K$h$C$F:G$b4JC1$K$N5-;vA4$F$r>C5n$7$F$7$^$$$?$1$l$P!"%9%3%"%U%!%$%k$K0J2<$N$h(B -$B$&$J$b$N$rF~$l$k$3$H$b$G$-$^$9!#(B - -@lisp -(("subject" - ("Sex with Emacs" 2)) - (mark 1) - (expunge 1)) -@end lisp - -$B$=$7$F(B @samp{Sex with Emacs} $B$K%^%C%A$9$kA4$F$N5-;v$r=8$a$F!";D$j$r=3Ht(B -$B$P$9$?$a$K4{FI$N0u$r$D$1!">C5n$7$^$9!#(B - -@node Global Score Files -@section $B%0%m!<%P%k%9%3%"%U%!%$%k(B -@cindex global score files - -$B4V0c$$$J$/!"B>$N%K%e!<%9%j!<%@!<$O(B ``$B%0%m!<%P%k:o=|%U%!%$(B -$B%k(B (global kill file)'' $B$r;}$C$F$$$^$9!#$3$l$OIaDL!"A4$F$N%0%k!<%W$KE,MQ(B -$B$5$l$k!"%f!<%6$N%[!<%`%G%#%l%/%H%j!<$K3JG<$5$l$F$$$k0l$D$N:o=|%U%!%$%k0J(B -$B>e$N2?J*$G$b$"$j$^$;$s!#$O$s(B! $B$A$C$]$1$J%K%e!<%9%j!<%@!<$@$M!#$N?M$N%9%3%"%U%!%$%k$r;H$&$?$a$K$7$J$1$l$P$J$i$J$$$3$H$O!"(B -@code{gnus-global-score-files} $BJQ?t$r@_Dj$9$k$3$H$@$1$G$9!#$=$l$>$l$N%9(B -$B%3%"%U%!%$%kKh$K!"$"$k$$$O$=$l$>$l$N%9%3%"%U%!%$%k%G%#%l%/%H%jKh$KBP$7$F(B -$B0l$D$N9`L\$K$J$j$^$9!#(BGnus $B$O$I$N%9%3%"%U%!%$%k$r$I$N%0%k!<%W$K;H$&$N$,(B -$BE,@Z$G$"$k$+$r<+J,$G7hDj$7$^$9!#(B - -$BNc$($P(B @file{/ftp@@ftp.gnus.org:/pub/larsi/ding/score/soc.motss.SCORE} $B$N(B -$B%9%3%"%U%!%$%k$H(B @file{/ftp@@ftp.some-where:/pub/score} $B%G%#%l%/%H%j$K$"(B -$B$kA4$F$N%9%3%"%U%!%$%k$r;H$$$?$1$l$P!"(B - -@lisp -(setq gnus-global-score-files - '("/ftp@@ftp.gnus.org:/pub/larsi/ding/score/soc.motss.SCORE" - "/ftp@@ftp.some-where:/pub/score/")) -@end lisp - -@findex gnus-score-search-global-directories -@noindent -$B$I$&$@$$!"4JC1$@$m$&(B? $B%G%#%l%/%H%jL>$O(B @samp{/} $B$G=*$o$i$J$/$F$O$J$j$^$;(B -$B$s!#$3$l$i$N%G%#%l%/%H%j$OIaDL$O!"0l2s$N(B gnus $B;HMQ4|4VCf$K0l2s$@$1$7$+FI(B -$B$_9~$_$^$;$s!#$b$71s3V%G%#%l%/%H%j$r$N?M$?$A$K;H$C$F$b$i$&$h$&$K0];}$7$?$/$J$C$F$-$?(B -$B$i!"C1$K$"$J$?$N%9%3%"%U%!%$%k$rF?L>(B FTP $B$KCV$$$F!"@$3&Cf$K8xI=$7$F$/$@(B -$B$5$$!#5U;J2q!$Ao$KB?$/$N>l=j$K%/%m%9%]%9%H$5$l$F$$$k5-;v$O4V0c$$$J$/6}$G$"$k!#(B -@item -$B0l8D$NITE,@Z$J5-;v$r8:E@$9$k$K$O!"(B@code{Message-ID} $B$G8:E@$9$k!#(B -@item -$BFC$KAG@2$i$7$$Ej9FOL5;k$NEj9F$rIQHK$K7+$jJV$9Ej9FC5n$N%9%3%"9`L\$r;H$C$F%U%!%$%k$NBg$-$5$r>.$5$/M^$($k!#$G$b$*$=$i$/$O!"(B -$B%5%$%H$K$h$C$F8E$$5-;v$rD94|4VJ]B8$9$k$h$&$K!"4|8B@Z$l>C5n$N4|4V$OD9$/$N%K%e!<%9%j!<%@!<$O>-Mh!"%0%m!<%P%k%9%3%"%U%!%$%k$r%5%]!<(B -$B%H$9$k$G$7$g$&$+(B? @emph{$B$&$U$U(B}$B!#$=$&!"$I$&9M$($F$_$?$C$F!"(B -Blue Wave $B$d(B xrn $B$d(B 1stReader $B$H$+$$$C$?%K%e!<%9%j!<%@!<$O%9%3%"$r%5%]!<(B -$B%H$9$k$Y$-$@$M!#:#$O8GBC$r0{$s$G8+C5n%U%!%$%k(B -@cindex kill files - -Gnus $B$O$^$@!"$"$N$&$6$C$?$$8E$$>C5n%U%!%$%k$r%5%]!<%H$7$F$$$^$9!#C(B -$B5n%U%!%$%k$N9`L\$O$b$&>C$7$F$b$h$$$N$G$9$,!"$=$l$O(B Daniel Quinlan $B$,%9%3(B -$B%"%U%!%$%k$r9M$(=P$9A0$K;d$,=q$$$?$b$N$J$N$G!"$=$N%3!<%I$O$^$@;D$C$F$$$^(B -$B$9!#(B - -$BMW$9$k$K!">C5n=hM}$O%9%3%"=hM}$h$j$b$+$J$jCY$$$N$G(B ($B;d$N8@$$$?$$$N(B -$B$O(B @emph{$B$b$N$9$4$/(B})$B!"$"$J$?$N>C5n%U%!%$%k$O%9%3%"%U%!%$%k$K=q$-49$($?(B -$BJ}$,NI$$$+$b$7$l$^$;$s!#(B - -$B$$$:$l$K$;$h!">C5n%U%!%$%k$OIaDL$N(B @code{emacs-lisp} $B%U%!%$%k$G$9!#$3$N(B -$B%U%!%$%k$NCf$K$O$I$s$J7A<0$G$bF~$l$k$3$H$,$G$-$^$9!#$D$^$j>C5n%U%!%$%k$r(B -$B%0%k!<%W$KF~$C$?$H$-$Ko$N>C5n%U%!%$%k$O0J2<$N$h$&$K$J$j$^$9!#(B - -@lisp -(gnus-kill "From" "Lars Ingebrigtsen") -(gnus-kill "Subject" "ding") -(gnus-expunge "X") -@end lisp - -$B$3$l$O;d$,=q$$$?A4$F$N5-;v$K4{FI$N0u$r$D$1!"35N,%P%C%U%!$+$i0u$N$D$$$?5-(B -$B;v$r:o=|$7$^$9!#$H$C$F$bJXMx$G$9!#$"$J$?$b$=$&;W$&$G$7$g!#(B - -$BB>$N%W%m%0%i%`$G$OA4$/0c$&>C5n%U%!%$%k$N9=J8$r;H$C$F$$$^$9!#$b(B -$B$7(B gnus $B$,(B @code{rn} $B$N>C5n%U%!%$%k$i$7$-$b$N$K=P2q$C$?$i!"2?$H$+$=$l$r(B -$B2rC5n%U%!%$%k$rJT=8$9$k$?$a$NFs$D$N35N,%P%C%U%!4X?t$,$"$j$^$9!#(B - -@table @kbd -@item M-k -@kindex M-k (Summary) -@findex gnus-summary-edit-local-kill -$B$=$N%0%k!<%W$N>C5n%U%!%$%k$rJT=8$9(B -$B$k(B (@code{gnus-summary-edit-local-kill})$B!#(B - -@item M-K -@kindex M-K (Summary) -@findex gnus-summary-edit-global-kill -$B0lHL>C5n%U%!%$%k$rJT=8$9$k(B (@code{gnus-summary-edit-global-kill})$B!#(B -@end table - -$B>C5n%U%!%$%k$rJT=8$9$kFs$D$N%0%k!<%W%b!<%I4X?t$,$"$j$^$9!#(B - -@table @kbd -@item M-k -@kindex M-k (Group) -@findex gnus-group-edit-local-kill -$B$=$N%0%k!<%W$N>C5n%U%!%$%k$rJT=8$9$k(B (@code{gnus-group-edit-local-kill})$B!#(B - -@item M-K -@kindex M-K (Group) -@findex gnus-group-edit-global-kill -$B0lHL>C5n%U%!%$%k$rJT=8$9$k(B (@code{gnus-group-edit-global-kill})$B!#(B -@end table - -$B>C5n%U%!%$%kJQ?t!#(B - -@table @code -@item gnus-kill-file-name -@vindex gnus-kill-file-name -@samp{soc.motss} $B%0%k!<%WMQ$N>C5n%U%!%$%k$ODL(B -$B>o(B @file{soc.motss.KILL} $B$H$$$&L>A0$G$9!#$3$N%U%!%$%kL>$rF@$k$?$a$K%0%k!<(B -$B%WL>$KIU2C$5$l$k@\Hx<-$O!"(B@code{gnus-kill-file-name} $BJQ?t$GM?$($i$l$^$9!#(B -``$B%0%m!<%P%k(B'' $B>C5n%U%!%$%k$O(B ($B%9%3%"%U%!%$%k$N0UL#$G(B -$B$N(B ``$B%0%m!<%P%k(B'' $B$8$c$J$$$h!"$b$A$m$s(B) $BC1$K(B @file{KILL}$B$H$$$&L>A0$G$9!#(B - -@vindex gnus-kill-save-kill-file -@item gnus-kill-save-kill-file -$B$3$NJQ?t$,(B @code{nil} $B0J30$G$"$l$P!"(Bgnus $B$O=hM}$N8e$K>C5n%U%!%$%k$rJ]B8(B -$B$7$^$9!#$3$l$O4|8B@Z$l:o=|$r9T$&>C5n$r;H$C$F$$$k$H$-$KI,MW$G$9!#(B - -@item gnus-apply-kill-hook -@vindex gnus-apply-kill-hook -@findex gnus-apply-kill-file-unless-scored -@findex gnus-apply-kill-file -$B%0%k!<%W$K>C5n%U%!%$%k$rE,MQ$9$k$?$a$K8F$S=P$5$l$k%U%C%/!#$3$l$O=i4|@_Dj(B -$B$G$O(B @code{(gnus-apply-kill-file)} $B$G$9!#$b$7F1$8%0%k!<%W$KBP$7$F%9%3%"(B -$B%U%!%$%k$,$"$k>l9g$K$O>C5n%U%!%$%k$rL5;k$7$?$1$l$P!"$3$N%U%C%/(B -$B$r(B @code{(gnus-apply-kill-file-unless-scored)} $B$K@_Dj$7$^$9!#>C5n%U%!%$(B -$B%k$r=hM}$5$;$?$/$J$1$l$P!"$3$NJQ?t$r(B@code{nil} $B$K@_Dj$7$F$/$@$5$$!#(B - -@item gnus-kill-file-mode-hook -@vindex gnus-kill-file-mode-hook -$B>C5n%U%!%$%k%b!<%I%P%C%U%!Fb$G8F$S=P$5$l$k%U%C%/!#(B -@end table - -@node Converting Kill Files -@section $B>C5n%U%!%$%k$NJQ49(B -@cindex kill files -@cindex converting kill files - -$B$"$J$?$,8E$$>C5n%U%!%$%k$r$I$C$5$j;}$C$F$$$k$N$G$"$l$P!"$=$l$i$r%9%3%"%U%!(B -$B%$%k$KJQ49$7$?$/$J$k$G$7$g$&!#$b$7$=$l$i$,(B ``$BIaDL$N(B''$B$d$D$G$"$l$P!"(B -@file{gnus-kill-to-score.el} $B%Q%C%1!<%8$r;H$&$3$H$,$G$-$^$9!#$=$&$G$J$1(B -$B$l$P!"C5n%U%!%$%k$+$i%9%3%"%U%!%$%k$X$NJQ49%Q%C%1!<%8$O!"I8=`$G$O(Bgnus $B$K$O4^(B -$B$^$l$^$;$s!#(B -@uref{http://www.stud.ifi.uio.no/~larsi/ding-various/gnus-kill-to-score.el} $B$+(B -$B$iF~C5n%U%!%$%k$,Hs>o$KJ#;($J$b$N$G$"$l$P(B --- $B$=$l(B -$B$K(B @code{gnus-kill} $B7A<00J30$N$b$N$,$?$/$5$s4^$^$l$F$$$l$P!"$=$l$i$r$N(B -$B?M$H6&$K8+$D$1$k$N$r=u$1$k$?$a$N6&F1A*JL5!9=$G$9!#(B - -$B$3$l$rC#@.$9$k$?$a$K!"(BGroupLens $B5!9=$O$"$J$?$,4{$KFI$s$@5-;v$KBP$9$k0U8+(B -$B$r!"F1$8$h$&$J;v$r$7$?B>$N?M$N0U8+$H7k9g$7$F!"$=$l$>$l$NL$FI%K%e!<%95-;v(B -$B$K8D?M2=$5$l$?M=8@$rM?$($^$9!#(BGroupLens $B$rCg?M$N$h$&$J$b$N$@$H8+$J$7$F$/(B -$B$@$5$$!#(BGroupLens $B$O$"$J$?$,$I$N$h$&$K5-;v$N2ACM$rIU$1$k$+$r8+$F!"F1$8$h(B -$B$&$K5-;v$N2ACM$rIU$1$k?M$rC5$7$^$9!#0lEY$"$J$?$N0U8+$H0lCW$9$k?M$rH/8+$9(B -$B$l$P!"M=8@$N7A$G!"$=$l$i$N?M$,5-;v$r$I$&;W$&$+$r$"$J$?$K9p$2$^$9!#$"$J$?(B -$B$O$3$NM=8@$r5-;v$rFI$_$?$$$+$I$&$+$r7hDj$9$k$N$KLrN)$F$k;v$,$G$-$^$9!#(B - -@menu -* Using GroupLens:: $B$I$N$h$&$K(B gnus $B$K(B GroupLens $B$r;H$o$;$k(B - $B$h$&$K$9$k$+(B -* Rating Articles:: GropLens $B$K$"$J$?$,$I$N$h$&$KCM$rIU$1$k(B - $B$+$rCN$i$;$k(B -* Displaying Predictions:: GropuLens $B$K$h$C$FM?$($i$l$?M=8@$rI=<($9(B - $B$k(B -* GroupLens Variables:: GoupLens $B$r%+%9%?%^%$%:$9$k(B -@end menu - -@node Using GroupLens -@subsection GroupLens $B$r;H$&(B - -GroupLens $B$r;H$&$?$a$K$O!"%m!<%+%k$N(B Better Bit Berau (BBB) $B$KI.(B -$BL>(B (pseudonym) $B$rEPO?$7$J$1$l$P$J$j$^$;$s!#(B -@uref{http://www.cs.umn.edu/Research/GroupLens/bbb.html} $B$,8=:_!"$A$^$?(B -$B$KB8:_$9$kM#0l$N(B better bit $B$G$9!#(B - -$BEPO?$7$?8e$G!"$$$/$D$+$NJQ?t$r@_Dj$9$kI,MW$,$"$j$^$9!#(B - -@table @code -@item gnus-use-grouplens -@vindex gnus-use-grouplens -$B$3$NJQ?t$r(B @code{nil} $B$G$J$$CM$K@_Dj$9$k$H!"(BGnus $B$,A4$F$N(B GroupLens $B4XO"(B -$B4X?t$r%U%C%/$9$k$h$&$K$J$j$^$9!#(B - -@item grouplens-pseudonym -@vindex grouplens-pseudonym -$B$3$NJQ?t$O(B Better Bit Bureau $B$KEPO?$7$?$H$-$K$b$i$C$?I.L>$K@_Dj$5$l$k$Y(B -$B$-$G$9!#(B - -@item grouplens-newsgroups -@vindex grouplens-newsgroups -GroupLens $B$NM=8@$rF@$?$$$H;W$&%0%k!<%W$N%j%9%H$G$9!#(B -@end table - -$B$3$l$,5/$->e$,$C$F(B GroupLens $B$r$N?M$,9M$($kJ?6Q$K4p$E$$$?%9%3%"$r$"(B -$B$J$?$KDs6!$9$k$3$H$r;O$a$^$9!#$7$+$7!"(BGroupLens $B$NK\Ev$NMx1W$ro$KLr$KN)$A$^(B -$B$9!#(B -@end table - -$Be=q$-$9$k$+$rA*$V;v$,$G$-$^$9!#>e(B -$B=q$-$,=i4|@_Dj$G$9!#$7$+$7!"(Bgnus $B$N%9%3%"$r(B grouplens $B$N%9%3%"$KB-$9$N$r(B -$B9%$`?M$b$$$^$9!#J,N%%9%3%"$N?6$kIq$$$rF@$k$?$a$K$O!"(B -@code{gnus-grouplens-override-scoring} $B$r(B @code{'separate} $B$K@_Dj$9$kI,(B -$BMW$,$"$j$^$9!#(BGroupLens $B$NM=8@$H(B grouplens $B%9%3%"$r7k9g$9$k$?$a$K$O$=$l(B -$B$r(B @code{'override} $B$K@_Dj$7!"%9%3%"$r7k9g$9$k$?$a$K(B -$B$O(B @code{gnus-grouplens-override-scoring} $B$r(B @code{'combine} $B$K@_Dj$7$^(B -$B$9!#7k9gIU2C5!G=$rMQ$$$k$H$-$O!"(B -@code{grouplens-prediction-offset} $B$H(B @code{grouplens-score-scale-factor} $B$N(B -$BCM$r@_Dj$7$?$$$H;W$&$G$7$g$&!#(B - -@vindex grouplens-prediction-display -$B$I$A$i$N>l9g$G$b!"(BGroupLens $B$OFs!";0$NM=8@$,$I$N$h$&I=<($5$l$?$$$+$NA*Br(B -$B$rM?$($^$9!#M=8@$NI=<($OJQ?t(B @code{grouplens-prediction-display} $B$K$h$C(B -$B$F@)8f$5$l$^$9!#(B - -$B0J2<$N$b$N$,$=$NJQ?t$GM-8z$JCM$G$9!#(B - -@table @code -@item prediction-spot -$BM=8@$,9b$$$[$I!"1&$NJ}$K(B @samp{*} $B$,I=<($5$l$^$9!#(B - -@item confidence-interval -$B?t;z$N3N?.(B (confidence) $B4V3V$G$9!#(B - -@item prediction-bar -$BM=8@$,9b$$$[$I!"K@$,D9$/$J$j$^$9!#(B - -@item confidence-bar -$B?t;z3N?.$G$9!#(B - -@item confidence-spot -$B3N?.$,9b$$$[$IE@$,Bg$-$/$J$j$^$9!#(B - -@item prediction-num -$BIaDL$N@N$J$,$i$N?tCM$G$9!#(B - -@item confidence-plus-minus -$BM=8@$N(B +/- $B3N?.$G$9!#(B -@end table - -@node GroupLens Variables -@subsection GroupLens $BJQ?t(B - -@table @code -@item gnus-summary-grouplens-line-format -GropuLens $B3HD%$N35N,%P%C%U%!$G;H$o$l$k35N,9TMM<0$G$9!#IaDL$N35N,9TMM<0$,(B -$Be5i%9%3%"IU$1(B - -$BI=Bj$d(B From $B%X%C%@!<$K%9%3%"$rIU$1$k$N$O==J,AGE($G$9$,!"$"$k?MFCDj$NBj$K(B -$B4X$7$F8@$C$F$$$k;v$K$@$1K\Ev$K6=L#$,$"$k>l9g$O$I$&$9$l$PNI$$$N$G$7$g(B -$B$&(B? $B$b$7$/$O!"(BA $B$5$s$,(B B $B$5$s$K%U%)%m!<%"%C%W$7$F$$$k$H$-$K8@$C$F$$$k;v(B -$B$rFI$_$?$/$J$$$1$l$I!"(BC$B$5$s$K%U%)%m!<%"%C%W$7$F$$$k$H$-$O2?$r8@$C$F$$$k(B -$B$+$rCN$j$?$$$H$$$&>l9g$O(B? - -$B>e5i%9%3%"K!B'$r;H$&;v$G!"G$0U$NJ#;($J%9%3%"$NIU$1J}$r:n@.$9$k;v$,$G$-$^(B -$B$9!#(B - -@menu -* Advanced Scoring Syntax:: $BDj5A(B -* Advanced Scoring Examples:: $B$I$N$h$&$K8+$($k$+(B -* Advanced Scoring Tips:: $B$=$l$r:GBg8BMxMQ$9$k(B -@end menu - -@node Advanced Scoring Syntax -@subsection $B>e5i%9%3%"IU$19=J8(B - -$BIaDL$N%9%3%"K!B'$OK!B'$N:G=i$NMWAG$KJ8;zNs$,$"$j$^$9!#>e5i%9%3%"IU$1K!B'(B -$B$O:G=i$NMWAG$K%j%9%H$,$"$j$^$9!#FsHVL\$N%j%9%H$O:G=i$NMWAG(B -$B$,(B @code{nil} $B$G$J$$CM$KI>2A$5$l$?$H$-$KE,MQ$5$l$^$9!#(B - -$B$3$l$i$N%j%9%H$O;0$D$NO@M}:nMQ;R$+$i$J$C$F$*$j!"$=$l$i$O0lJ}8~:nMQ;R$G!"(B -$B?'!9$J9gCW:nMQ;R$G$9!#(B - -$BO@M}:nMQ;R(B: - -@table @code -@item & -@itemx and -$B$3$NO@M}:nMQ;R$O$=$l$>$l$N0z?t$r(B @code{false} $B$KI>2A$5$l$k$b$N$r8+$D$1$k(B -$B$^$GI>2A$7!"$=$l$+$iDd;_$7$^$9!#A4$F$N0z?t$,(B @code{true} $B$NCM$KI>2A$5$l(B -$B$?>l9g$O!"$3$N:nMQ;R$O(B @code{true} $B$rJV$7$^$9!#(B - -@item | -@itemx or -$B$3$NO@M}:nMQ;R$O$=$l$>$l$N0z?t$r(B @code{true} $B$KI>2A$5$l$k$b$N$r8+$D$1$k(B -$B$^$GI>2A$7$^$9!#$b$7$I$N0z?t$b(B @code{true} $B$G$J$$$H!"$3$N:nMQ;R(B -$B$O(B @code{false} $B$rJV$7$^$9!#(B - -@item ! -@itemx not -@itemx ,A,(B -$B$3$NO@M}:nMQ;R$OC10l$N0z?t$N$_$r$H$j$^$9!#$=$l$O$=$N0z?t$NCM$NO@M}H]Dj$r(B -$BJV$7$^$9!#(B -@end table - -$B0z?t$r%9%3%"IU$1$5$l$F$$$k8=:_$N5-;v$NAD@h$KE,MQ$9$k(B @dfn{$B4V@\:nMQ;R(B} $B$,(B -$B$"$j$^$9!#Nc$($P!"(B@code{1-} $B$O8=:_$N5-;v$N?F$K$b%9%3%"K!B'$rE,MQ$7$^$9!#(B -@code{2-} $B$O8=:_$N5-;v$NADIcJl$K%9%3%"K!B'$rE,MQ$7$^$9!#Be$o$j$K!"(B -@code{^^} $B$r=q$/;v$b$G$-!"$3$N;~!"(B@code{^} ($B%-%c%i%C%H(B) (carat) $B$N?t$O$I(B -$B$N$/$i$$AD@h$N5-;v$^$G$5$+$N$\$k$+$r<($7$^$9!#(B - -$B:G8e$K!"9gCW:nMQ;R$,$"$j$^$9!#$3$l$i$,K\Ev$N;E;v$r$9$k$b$N$G$9!#9gCW:nMQ(B -$B;R$O%X%C%@!$NJ8;zNs$G!"$=$N8e$K9gCW$H9gCW$N7?$,B3$-$^$9!#E57?E*$J9gCW(B -$B:nMQ;R$O(B @samp{("form" "Lars Ingebrigtsen" s)} $B$N$h$&$J$b$N$G$9!#%X%C%@!<(B -$BL>$OC1=c$J%9%3%"IU$1$r$9$k$H$-$N$b$N$HF1$8$G!"9gCW$N7?$bF1$8$G$9!#(B - -@node Advanced Scoring Examples -@subsection $B>e5i%9%3%"IU$1$NNc(B - -Lars $B$,(B Gnus $B$K4X$7$FOC$r$7$F$$$k$H$-$KH`$K$h$C$F=q$+$l$?5-;v$N%9%3%"$r(B -$BA}$d$7$?$$$H$7$^$7$g$&(B: - -@example -((& - ("from" "Lars Ingebrigtsen") - ("subject" "Gnus")) - 1000) -@end example - -$B$M!"$H$F$bC1=c$G$7$g(B? - -$BD9$$5-;v$r=q$$$F$$$k$H$-$O!";~!92?$+AGE($J;v$r8@$$$^$9(B: - -@example -((& - ("from" "Lars Ingebrigtsen") - (| - ("subject" "Gnus") - ("lines" 100 >))) - 1000) -@end example - -$B$7$+$7!"H`$,(B Reig Eigil Logge $B$K$h$C$F=q$+$l$?$b$N$KH?1~$7$F$$$k$H$-$O!"(B -$BH`$,=q$$$?$b$N$rFI$_$?$/$"$j$^$;$s(B: - -@example -((& - ("from" "Lars Ingebrigtsen") - (1- ("from" "Reig Eigir Logge"))) - -100000) -@end example - -Redmondo $B$,>C$($?7$2<$K$D$$$F=q$$$?$H$-$K%U%)%m!<%"%C%W$7$?A4$F$N?M$O%9(B -$B%3%"$,>e$2$i$l$^$9$,!"$=$l$OH`$i$,Gr$$7$2<$K$D$$$F8l$C$F$$$k$H$-$N$_$G$9!#(B -$B$7$+$7!"(BLars $B$,7$2<$K$D$$$FOC$r$7$F$$$k$H$-$O!"$?$$$F$$$"$^$j$*$b$7$m$/(B -$B$"$j$^$;$s(B: - -@example -((& - (1- - (& - ("from" "redmondo@@.*no" r) - ("body" "disappearing.*socks" t))) - (! ("from" "Lars Ingebrigtsen")) - ("body" "white.*socks")) - 1000) -@end example - -$B2DG=@-$OL58BBg$G$9!#(B - -@node Advanced Scoring Tips -@subsection $B>e5i%9%3%"$N$A$g$C$H$7$?Hk7m(B - -@code{&} $B$H(B @code{|} $BO@M}:nMQ;R$O!"C;=L2sO)O@M}$r9T$$$^$9!#$9$J$o$A!"$=(B -$B$N:nMQ$N7k2L$,L@$i$+$K$J$C$F;~E@$G!"0z?t$r2A$,(B @code{false} $B$K$J$k$H!";D$j$N0z?t$rI>2A(B -$B$9$kL\E*$OB8:_$7$J$/$J$j$^$9!#$3$l$OCY$$9g(B -$BCW(B (@samp{body} $B$d(B @samp{header}) $B$r:G8e$K;}$C$F$-$F!"B.$$9g(B -$BCW(B (@samp{from} $B$d(B @samp{subject}) $B$r:G=i$K;}$C$F$/$k$Y$-$G$"$k$H$$$&;v(B -$B$r0UL#$7$^$9!#(B - -$B4V@\:nMQ;R(B (@code{1-} $B$J$I(B) $B$O$=$l$i$N0z?t$r%9%l%C%I$N0l@$BeA0$K:nMQ$9$k(B -$B$h$&$K$7$^$9!#e$,$k798~$,$"$k;v$K5$IU$/$+$b$7$l$^$;$s!#FC$K!"E,1~(B -$B%9%3%"$r;H$C$F$$$k$H$-$O!#%9%3%"$,Bg$-$/$J$j$9$.$k$H!"$=$l$i$O0UL#$r<:$$(B -$B$^$9(B---$B$=$l$i$OC1$K:GBg$rDL$j1[$7$F$7$^$C$F!"$=$l$r0UL#$N$"$kJ}K!$G;H$&(B -$B;v$OFq$7$/$J$j$^$9!#(B - -@vindex gnus-decay-scores -@findex gnus-decay-score -@vindex gnus-decay-score-function -Gnus $B$O$3$NLdBj$N2r7h$r=u$1$k$?$a$K%9%3%"$rIe$i$;$k5!9=$rDs6!$7$^$9!#%9(B -$B%3%"%U%!%$%k$OFI$_9~$^$l!"(B@code{gnus-decay-scores} $B$,(B @code{nil} $B$G$J$$(B -$B$H!"(Bgnus $B$O%9%3%"%U%!%$%k$rIeGT5!9=$rDL$7!"A4$F$N1JB3$G$J$$%9%3%"K!B'$N(B -$B%9%3%"$r2<$2$^$9!#IeGT<+?H$O4X?t(B @code{gnus-decay-score-function} $B$K$h$C(B -$B$Fe$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==Jb$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:_(B - $B$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 -@end menu - -@node Process/Prefix -@section $B%W%m%;%9(B/$B@\F,0z?t(B -@cindex process/prefix convention - -$BB?$/$N4X?t!"$=$NCf$G$b5-;v$N0\F0!"I|9f2=!"J]B8$r$9$k$?$a$N4X?t$O!"(B -@dfn{$B%W%m%;%9(B/$B@\F,0z?t$N=,47(B} $B$H$7$FCN$i$l$F$$$k$b$N$r;H$$$^$9!#(B - -$B$3$l$OMxMQl(B -$B9g$O!"%W%m%;%90u$NIU$$$F$$$k5-;v$K:n6H$,l9g$O!"8=:_$N5-;v$K$@$1:n(B -$B6H$ro$K4JC1$G$9$,!"6CC2$rHr$1$i$l$k$h$&$K>\:Y$rL@$i$+$K$7$F$*(B -$B$/I,MW$,$"$k$N$G$9!#(B - -$B%W%m%;%90u$KH?1~$9$k5-;v$O8=:_$N%W%m%;%90u$NIU$$$F$$$k5-;v$N%j%9%H$r%9%?%C(B -$B%/$K@Q$_!"A4$F$N%W%m%;%90u$N5-;v$N%j%9%H$r>C5n$7$^$9!#A02s$N@_Dj(B -$B$r(B @kbd{M P y} $B$GI|5l$5$;$k;v$,$G$-$^$9(B (@pxref{Setting Process Marks})$B!#(B - -@vindex gnus-summary-goto-unread -$BB?$/$N?M!9$r6C$+$;!"62$,$i$;$k$H;W$o$l$k$3$H$O!"Nc$($P!"(B@kbd{3 d} $B$OK\Ev(B -$B$K(B @kbd{d} @kbd{d} @kbd{d} $B$HF1$8;v$r$9$k;v$G$9!#$=$l$>$l$N(B @kbd{d} ($B$3(B -$B$l$O8=:_$N5-;v$K4{FI$N0u$rIU$1$^$9(B) $B$O=i4|@_Dj$G$O0u$rIU$1$?8e$Ko$K?5=E$J?M$G!"$3$l$OK\Ev$KNI$$;v$G$9!#2?$+4m81$J;v$r(B -$B$9$kA0$K!"(B``$BK\Ev$K$3$l$r$7$?$$$N$G$9$+(B?'' $B$H$$$&$h$&$Jo$KB?$/$N(B Emacs $B$NL?Na$O(B ($B?tCM(B) $B@\F,0z?t$KH?1~$7$^$9!#Nc$($P!"(B -@kbd{C-u 4 C-f} $B$O%]%$%s%H$r(B 4 $BJ8;z@h$K0\F0$7!"(B -@kbd{C-u 9 0 0 I s s p} $B$O1JB3(B @code{Suject} $BJ8;zNs$N0lIt%9%3%"K!B'(B -$B$N(B 900 $B$r8=:_$N5-;v$K2C$($^$9!#(B - -$B$3$l$OAGE($GNI$$$N$G$9$,!"L?Na$K$b$&>/$7DI2C$N>pJs$rM?$($?$$$H$-$O$I$&$9(B -$B$l$PNI$$$N$G$7$g$&(B? $B$(!<$H!"$?$$$F$$$NL?Na$,$7$F$$$k;v$O!"(B``$B@8$N(B'' $B@\F,(B -$B0z?t$rFCJL$JJ}K!$G2r$`$@$1B?$/$N(B @kbd{M-i} $B@\F,8l$r@Q$_=E$M$k;v$,$G$-$^$9!#(B -@kbd{M-i a M-C-u} $B$O(B ``$BL?Na(B @kbd{M-C-u} $B$K%7%s%\%k@\F,0z?t(B @code{a} $B$rM?(B -$B$($k(B'' $B$H$$$&$3$H$G$9!#(B@kbd{M-i a M-i b M-C-u} $B$OL?Na(B @kbd{M-C-u} $B$K%7%s(B -$B%\%k@\F,0z?t(B @code{a} @code{b} $B$rM?$($k(B'' $B$H$$$&;v$G$9!#o$K$?$/$5$s$N$b(B -$B$N$,$"$j$^$9!#9,1?$J;v$K!"$=$l$i$O$9$Y$FF1$89=J8$r;H$$$^$9$N$G!"$"$^$j7y(B -$B$JL\$K$O2q$o$J$$$G$7$g$&!#(B - -$B=qK!;EMM(B (format) $B;XDj$NNc$,$"$j$^$9(B ($B%0%k!<%W%P%C%U%!$h$j(B): -@samp{%M%S%5y: %(%g%)\n}$B!#$=$l$Oo$K=9$/!"$?$/$5$s$N%Q!<%;%s%H5-(B -$B9f$,$I$3$K$G$b$"$j$^$9!#(B - -@menu -* Formatting Basics:: $B=qK!;EMMJQ?t$O4pK\E*$K=qK!;XDjJ8;zNs$G$"(B - $B$k(B -* Mode Line Formatting:: $B%b!<%I9T$N=qK!;EMMJQ?t$K4X$9$k$$$/$D$+$N(B - $B5,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 -* Positioning Point:: $BA`:n$N8e$G%]%$%s%H$r0\F0$9$k(B -* Tabulation:: $B=PNO$N@0Ns(B -* Wide Characters:: $BI}$,9-$$J8;z$r07$&(B -@end menu - -$B8=:_$N$H$3$m!"(Bgnus $B$O0J2<$N=qK!;EMMJQ?t$r;H$$$^$9(B: -@code{gnus-group-line-format}, @code{gnus-summary-line-format}, @code{gnus-server-line-format}, @code{gnus-topic-line-format}, @code{gnus-group-mode-line-format}, @code{gnus-summary-mode-line-format}, @code{gnus-article-mode-line-format}, @code{gnus-server-mode-line-format}, @code{gnus-summary-pick-line-format}$B!#(B - -$B$3$l$iA4$F$N=qK!;EMMJQ?t$OG$0U$N(B elisp $B<0$G$"$k;v$b$G$-$^$9!#$=$N>l9g$O!"(B -$B$=$l$i$OMW5a$5$l$k9T$KA^F~$9$k$?$a$K(B @code{$BI>2A(B} $B$5$l$^$9!#(B - -@kindex M-x gnus-update-format -@findex gnus-update-format -Gnus $B$O$"$J$?<+?H$N=qK!;EMM;XDj$r:n$k2A(B} $B$7!"Ev$N;XDj$r99?7(B -$B$7!"7k2L$N(B lisp $B<0$r$l$NMWAG(B @samp{%} $B$OEv$N%P%C%U%!$,:n@.$5$l$k$H$-$K2?$i$+$NJ8;zNs$d(B -$BB>$N$b$N$GCV$-49$($i$l$^$9!#(B@samp{%5y} $B$O(B ``@samp{y} $B;XDj$rA^F~$7!"(B5 $BJ8(B -$B;z$N>l=j$rF@$k$?$a$K6uGr$rF~$l$J$5$$(B'' $B$H$$$&;v$G$9!#(B - -$BIaDL$N(B C $B$d(B Emacs Lisp $B$N=qK!;EMM(B (format) $BJ8;zNs$HF1$8$h$&$K!"(B -@samp{%} $B$H=qK!;EMM$N7?$NJ8;z$N4V$N?tCM=$>~;R$O>o$K>/$J$/$H$b$=$ND9$5$K(B -$B$J$k$h$&$K!"=PNO$K(B @dfn{$B5M$a(B} $B$l$i$l$^$9!#(B@samp{%5y} $B$O$=$NItJ,$r>o(B -$B$K(B ($B>/$J$/$H$b(B) 5 $BJ8;z$ND9$5$K$J$k$h$&$K!":8$K6uGr$r5M$a$^$9!#$b(B -$B$7(B @samp{%-5y} $B$H$9$l$P!"Be$o$j$K1&B&$K5M$a9~$_$^$9!#(B - -$BFC$KD9$$CM$+$i$=$NItJ,$rJ]8n$9$k$?$a$K!"D9$5$r@)8B$7$?$$$H$b;W$&$G$7$g$&!#(B -$B$=$N$?$a$K$O!"(B@samp{%4,6y} $B$H$9$k;v$,$G$-$F!"$3$l$O$=$NNN0h$O7h$7$F(B 6 $BJ8(B -$B;z$rD6$($kD9$5$K$O$J$i$:!"(B4 $BJ8;z$h$j>/$J$$D9$5$K$J$i$J$$$H$$$&;v$G$9!#(B - -@node Mode Line Formatting -@subsection $B%b!<%I9T=qK!;EMM(B - -$B%b!<%I9T=qK!;EMMJQ?t(B ($B$9$J$o$A!"(B@code{gnus-summary-mode-line-format}) $B$O(B -$B0J2<$NFs$D$N0c$$0J30$O!"%P%C%U%!9T$K4p$E$/=qK!;EMMJQ?t(B -$B$H(B (@pxref{Formatting Basics}) $BF1$8$h$&$J5,B'$K=>$$$^$9(B: - -@enumerate - -@item -$B:G8e$K2~9T(B (@samp{\n}) $B$,$"$C$F$O$J$j$^$;$s!#(B - -@item -$BFCJL$J(B @samp{%%b} $B;XDj$r%P%C%U%!L>$rI=<($9$k$?$a$K;H$&$3$H$,$G$-$^$9!#$(!<(B -$B$H!"K\Ev$O$=$l$O;XDj$G$O$J$$$N$G$9(B---@samp{%%} $B$OC1$K=qK!;EMM$,5!3#E*$K(B -$B@Z$jNv$/$N$r@Z$jH4$1$F(B @samp{%} $B$r$=$N$^$^EO$9$?$a$NJ}K!$G!"(B -Emacs $B$,(B @samp{%b} $B$r$rI=<($7$J$5$$(B'' $B$H2re5i=qK!;EMM(B - -$B2?$i$+$NJ}K!$GNN0h$r8e$G=hM}$9$k$N$OIQHK$KLr$KN)$A$^$9!#ItJ,$r5M$a9~$`!"(B -$B@)8B$9$k!"@Z$j~;R(B} $B$r;H(B -$B$&;v$K$h$jC#@.$5$l$^$9!#$h$/$"$k%A%k%@;XDj$O$3$N$h$&$K8+$($k$+$b$7$l$^$;(B -$B$s(B @samp{%~(cut 3)~(ignore "0")y}$B!#(B - -$B$3$l$i$OM-8z$J=$>~;R$G$9(B: - -@table @code -@item pad -@itemx pad-left -$BMW5a$5$l$?D9$5$K$J$k$^$G!"NN0h$K6uGr$r:8B&$+$i5M$a9~$_$^$9!#(B - -@item pad-right -$BMW5a$5$l$?D9$5$K$J$k$^$G!"NN0h$K6uGr$r1&B&$+$i5M$a9~$_$^$9!#(B - -@item max -@itemx max-left -$B;XDj$5$l$?D9$5$K$J$k$h$&$K!"J8;z$r:8B&$+$i@Z$j.7?$N(B ISO0861 $BMM(B -$B<0$NF|IU$rJV$7$^$9(B---@samp{19960809T230410} $B$G$9!#$3$l$OH/2;$7$K$/$$$N$G!"(B -$B@$5*$rI=$9?t$H;~4V$r:o$.Mn$H$7$F!"(B6 $BJ8;z$NF|IU$r;D$7$?$$$H;W$$$^$9!#$=$l(B -$B$O(B @samp{%~(cut-left 2)~(max-right 6)~(pad 6)o} $B$H$J$k$G$7$g$&!#(B($B@Z$jMn(B -$B$H$7(B (cutting) $B$O(B $B:GBg8B(B (maxing) $B$h$j@h$K$J$5$l$^$9$N$G!"7e$GAGE($K8+$((B -$B$k$h$&$K$9$k$?$a$KF|IU$,(B 6 $BJ8;z$h$j>/$J$/L5$/$J$i$J$$;v$rJ]>Z$9$k$?$a$K(B -$B5M$a9~$_(B (padding) $B$,I,MW$K$J$j$^$9!#(B) - -$BL5;k(B (ignore) $B$,:G=i$K$J$5$l$^$9!#$=$l$+$i@Z$jMn$H$7(B (cut) $B$,9T$o$l$^$9!#(B -$B$=$7$F!"$=$l$+$i:G8e$NA`:n!"5M$a9~$_(B (pad) $B$,9T$o$l$^$9!#(B - -@vindex gnus-compile-user-specs -$B$b$7$"$J$?$,6/$$8D@-$N;}$Ae5i;2>H$r$?$/$5$s;H$C(B -$B$F$$$k$J$i!"(BT-gnus $B$,$H$F$bCY$/$J$k$N$,$o$+$k$G$7$g$&!#$3$l$O$"$J$?$,9T(B -$B$N308+$KK~B-$7$?$H$-$K(B @kbd{M-x gnus-compile} $B$r$N;XDj$+$i$N>pJs$HA4$/F1$8(B -$B$h$&$K%P%C%U%!$KA^F~$5$l$^$9!#4X?t$O0UL#$NL5$$CM$H6&$K8F$P$l$k;v$b$"$j$((B -$B$^$9$N$G!"$=$l$NBP:v$r$9$k$Y$-$G$9!#(B - -$B?7$7$$4X?t$rDj5A$7$J$$$G$b!"%A%k%@=$>~(B -$B;R(B (@pxref{Advanced Formatting}) $B$r;H$C$F$[$H$s$IF1$8;v$rC#@.$9$k;v$,$G(B -$B$-$^$9!#Nc$G$9(B: @samp{%~(form (count-lines (point-min) (point)))@@}$B!#(B -$B$3$3$GM?$($i$l$?<0$OI>2A$5$l$F!"8=:_$N9T?t$r$b$?$i$7!"$=$l$+$iA^F~$5$l$^(B -$B$9!#(B - -@node Formatting Fonts -@subsection $B=qK!;EMM%U%)%s%H(B - -$B%O%$%i%$%H$N$?$a$N;XDj$,$"$j!"$=$l$i$OA4$F$N=qK!;EMMJQ?t$K$h$C$F6&M-$5$l(B -$B$F$$$^$9!#(B@samp{%(} $B$H(B @samp{%)} $B;XDj$N4V$NJ8>O$OFCJL(B -$B$J(B @code{mouse-face} $B%W%m%Q%F%#$,@_Dj$5$l!"$=$l$O$=$3$K%^%&%9$N%]%$%s%?!<(B -$B$r$"$o$;$?$H$-$K(B (@code{gnus-mouse-face} $B$K$h$C$F(B) $B%O%$%i%$%H$5$l$k$3$H(B -$B$K$J$j$^$9!#(B - -@samp{%@{} $B$H(B @samp{%@}} $B;XDj$N4V$NJ8>O$O(B @code{gnus-face-0} $B$r;H$C$FIa(B -$BDL$N%U%'%$%9$,@_Dj$5$l!"$=$l$O=i4|@_Dj$G(B @code{bold} $B$G$9!#$b(B -$B$7(B @samp{%@{1} $B$H$7$?$J$i!"Be$o$j$K(B @code{gnus-face-1} $B$rF@!"0J2} $B;X<(;R$N4V$N%F%-%9%H$OFCJL(B -$B$J(B @code{balloon-help} $B%W%m%Q%F%#$,(B @code{gnus-balloon-face-0} $B$K@_Dj$5(B -$B$l$^$9!#(B@samp{%1<} $B$H$9$k$H!"(B@code{gnus-balloon-face-1} $B$rF@$F!"B>$bF1MM(B -$B$G$9!#(B@code{gnus-balloon-face-*} $BJQ?t$OJ8;zNs$+J8;zNs$rJV$94X?t$r;X$9%7(B -$B%s%\%k$N$I$A$i$+$G$"$kI,MW$,$"$j$^$9!#(B@code{balloon-help-mode} $B$G$O!"%^(B -$B%&%9$,%W%m%Q%F%#$N@_Dj$5$l$F$$$k%F%-%9%H$N>e$rDL2a$9$k$H!"%P%k!<%s%&%#%s(B -$B%I%&$,8=$l$F!"J8;zNs$rI=<($7$^$9!#$3$l$N>\$7$$>pJs(B -$B$O(B @code{balloon-help-mode} $B$N@bL@J8;zNs$r;2>H$7$F$/$@$5$$!#(B - -$B$3$l$O%0%k!<%W%P%C%U%!$NBeBXeEy$N=qK!;EMM$r@_Dj$9$k!#(B -(setq gnus-group-line-format - "%M%S%3@{%5y%@}%2[:%] %(%1@{%g%@}%)\n") -@end lisp - -$B$"$J$?$,$3$N0F$r;H$C$F40A4$KFI$a$J$/$FHs>o$K2o$[$H$s$I$N%P%C%U%!$G!"%]%$%s%H$r3F9T$N$"$i$+$8$a7h$a$i$l$?>l(B -$B=j$K0\F0$7$^$9!#%G%#%U%)%k%H$G$O!"%]%$%s%H$O9T$N:G=i$N%3%m%s$K0\F0$7$^$9!#(B -$B$"$J$?$O$3$N?6$k$^$$$r!";0$D$N0c$&J}K!$G%+%9%?%^%$%:$9$k$3$H$,$G$-$^$9!#(B - -$B$^$?!"$"$J$?$O%3%m%s$r9T$N$I$N>l=j$K$G$b0\F0$9$k$3$H$,$G$-$^$9!#(B - -@findex gnus-goto-colon -$B$"$J$?$O%3%m%s$N0LCV$K%]%$%s%H$r0\F0$5$;$k$?$a$N4X?t$rDj5A$7D>$9$3$H$,$G(B -$B$-$^$9!#$=$N4X?t$O(B @code{gnus-goto-colon} $B$H8F$P$l$F$$$^$9!#(B - -$B$G$b!"$b$7$"$J$?$,9T$K%3%m%s$r4^$a$?$/$J$$$J$i$P!"$3$l$r07$&$?$a$N$*$=$i(B -$B$/:G$bo$O!"1d$P$7$?$j=L$a$?$j$7$FJ8;zNs$r%G%#%9%W%l%$$KJB$Y$k$3$H$,(B -$B$G$-$^$9!#$G$bBg$-$5$,0c$&0[$J$kJ8;zNs$rO"7k$5$;$k>l9g$O!"C1$KJ8;zNs$r=P(B -$BNO$7$F$7$^$&$N$,$h$jl9g$O2?$bA^F~$7$^$;$s!#$3$l$O2:$d(B -$B$+(B (soft) $B$J@0Ns;R$G$9!#(B - -@samp{%-50=} $B$b$^$?!"J8;zNs$,(B 50$B7e$+$i;O$^$k$h$&$K6uGrJ8;z$r5M$a9~$_$^$9!#(B -$B$G$9$,!"$b$7(B 50$B7e$h$j8e$m$K$9$G$K%F%-%9%H$,$"$k>l9g!"(B50$B7e$h$j8e$m$K$"$k(B -$B2a>j$J%F%-%9%H$O:o=|$5$l$^$9!#$3$l$O87L)(B (hard) $B$J@0Ns;R$G$9!#(B - -@node Wide Characters -@subsection Wide Characters - -$BB?$/$NCO0h$K$*$$$F!"%W%m%]!<%7%g%J%k$J%U%)%s%H$OF1$8I}$NJ8;z$r;}$C$F$$$^(B -$B$9!#$7$+$7$$$/$D$+$NCO0h!"$h$/CN$i$l$F$$$kEl%"%8%"$N9q!9$G$O!"%i%F%sJ8;z(B -$B$HI}$N9-$$J8;z$,:.:_$7$F;H$o$l$F$$$^$9!#(B - -$B@07A$K$*$$$F!"(Bgnus $B$OJ8;zNs$,(B 10$B8D$NJ8;z$NI}$@$H$7$?$i!"%9%/%j!<%s$G(B -$B$b(B 10$B8DJ,$N%i%F%sJ8;z$NI}$K$J$k$H2>Dj$7$^$9$,!"$=$l$OLdBj$G$9!#$+$N9q!9(B -$B$G$O!"$=$l$O@5$7$/$"$j$^$;$s!#(B - -@vindex gnus-use-correct-string-widths -$B$=$l$r5_:Q$9$k$?$a$K!"$"$J$?(B -$B$O(B @code{gnus-use-correct-string-widths} $B$r(B @code{t} $B$K@_Dj$9$k$3$H$,$G(B -$B$-$^$9!#$3$l$O%P%C%U%!$N@8@.$rCY$/$7$^$9$,!"$h$jH~$7$$7k2L$rF@$k$3$H$,$G(B -$B$-$k$G$7$g$&!#4{DjCM$O(B @code{t} $B$G$9!#(B - -@node Window Layout -@section $B%&%#%s%I%&$NG[CV(B -@cindex window layout - -$B$$$(!"(BX $B$K4X$9$k;v$O$"$j$^$;$s$N$G!"$*$H$J$7$/$7$F2<$5$$!#(B - -@vindex gnus-use-full-window -$B$b$7(B @code{gnus-use-full-window} $B$,(B @code{nil} $B$G$J$$$H!"(Bgnus $B$OA4$F$NB>(B -$B$N%&%#%s%I%&$r>C$7$F!"(BEmacs $B$N2hLLA4BN$r@jM-$7$^$9!#$3$l$O=i4|@_Dj(B -$B$G(B @code{t} $B$G$9!#(B - -$B$3$NJQ?t$r(B @code{nil} $B$K@_Dj$9$k$N$O$=$l$J$j$KF0:n$7$^$9$,!"LdBj$b$"$j$^(B -$B$9!#4m81$r3P8g$N>e$G;H$C$F$/$@$5$$!#(B - -@vindex gnus-buffer-configuration -@code{gnus-buffer-configuration} $B$O$=$l$>$l$N(B gnus $B$N%P%C%U%!$,$I$N$/$i(B -$B$$$N6u4V$rM?$($i$l$k$Y$-$+$r8=$7$^$9!#$3$l$O$3$NJQ?t$NH4?h$G$9(B: - -@lisp -((group (vertical 1.0 (group 1.0 point) - (if gnus-carpal (group-carpal 4)))) - (article (vertical 1.0 (summary 0.25 point) - (article 1.0)))) -@end lisp - -$B$3$l$OO"A[%j%9%H$G$9!#(B@dfn{$B%-!<(B} $B$O2?$i$+$NF0:n$dB>$N$b$N$rG$L?$9$k%7%s(B -$B%\%k$G$9!#Nc$($P!"%0%k!<%W%P%C%U%!$rI=<($9$k$H$-$O!"%&%#%s%I%&@_Dj4X?t(B -$B$O(B @code{group} $B$r%-!<$H$7$F;H$$$^$9!#;HMQ2DG=$JL>A0$N40A4$J0lMw$O2<$K5s(B -$B$2$i$l$F$$$^$9!#(B - -@dfn{$BCM(B} ($B$9$J$o$A!"(B@dfn{$BJ,3d(B}) $B$O$=$l$>$l$N%P%C%U%!$,$I$l$/$i$$$r@j$a$k(B -$B$Y$-$+$r;XDj$7$^$9!#(B@code{article} $BJ,3d$rNc$Ke$N(B 25% $B$r@j$a(B -$B$k$Y$-$G!"$=$l$O5-;v%P%C%U%!(B (article buffer) $B$N>e$KG[CV$5$l$^$9!#$*5$$E(B -$B$-$NDL$j!"(B100% + 25% $B$OJN,2DG=$J;0$DL\$NMWAG!"(B@code{point} $B$r;}$D%P%C%U%!$KCV$+$l$^(B -$B$9!#(B@code{frame} $BJ,3d$G$O!"%?%0(B @code{frame-focus} $B$,9=@.MWAG$G$"$k(B ($B$9(B -$B$J$o$A!"(B@code{point} $B%?%0$,B8:_$9$k$+$I$&$+$K$h$C$F!"%j%9%H$N;0HVL\$+;M(B -$BHVL\$+$KB8:_$9$kMWAG(B) $BMUJ,3d$r;}$D:G8e$NI{J,3d$,>GE@$rF@$k;v$K$J$j$^$9!#(B - -$B.?tE@?t$NBe$o$j$K@0?t$G$"$C$?$J$i!"$=$l$O3d9g$G$O$J(B -$B$/!"$I$N$/$i$$B?$/$N9T$r%P%C%U%!$,@j$a$k$Y$-$+$r;XDj$9$k$?$a$K;H$o$l$^$9!#(B - -$B$b$7(B @dfn{$BJ,3d(B} $B$,(B @code{$BI>2A(B} $B$5$l$k$b$N$N$h$&$K8+$($k$H$-$O(B ($BL@3N$K$9(B -$B$k$H(B---$BJ,3d$N(B @code{car} $B$,4X?t$+86;O4X?t(B (subr) $B$G$"$k$H$-$O(B)$B!"$3$NJ,3d(B -$B$O(B @code{$BI>2A(B} $B$5$l$^$9!#7k2L$,(B @code{nil} $B$G$J$$$J$i!"$=$l$OJ,3d$H$7$F(B -$BMQ$$$i$l$^$9!#$3$l$O!"(B@code{gnus-carpal} $B$,(B @code{nil} $B$G$"$l$P;0$D$N%P%C(B -$B%U%!$,!"(B@code{gnus-carpal} $B$,(B @code{nil} $B$G$J$$$J$i!";M$D$N%P%C%U%!$,B8(B -$B:_$9$k$H$$$&;v$G$9!#(B - -$B$^$@J#;($G$O$J$$$G$9$C$F(B? $B$=$l$G$O!"Bg$-$5$K$3$l$r;n$7$F$_$F2<$5$$(B: - -@lisp -(article (horizontal 1.0 - (vertical 0.5 - (group 1.0) - (gnus-carpal 4)) - (vertical 1.0 - (summary 0.25 point) - (summary-carpal 4) - (article 1.0)))) -@end lisp - -$B$*$)$C$H!#Fs$D$N%P%C%U%!$KIT;W5D$J(B 100% $B%?%0$,IU$$$F$$$^$9!#$=$7$F!"$"(B -$B$N(B @code{horizontal} $B$C$F$$$&$b$N$O2?$G$7$g$&(B? - -$B$b$7J,3d$N0l$D$N:G=i$NMWAG$,(B @code{horizontal} $B$G$"$C$?$J$i!"(Bgnus $B$O(B $B%&%#(B -$B%s%I%&$r?eJ?$KJ,3d$7!"Fs$D$N%&%#%s%I%&$r2#$KJB$Y$^$9!#$3$l$i$N$=$l$>$l$N(B -$B>.JR$NCf$G$O!"A4$F$rIaDL$NN.57$G9T$&;v$,$G$-$^$9!#(B@code{horizontal} $B$N8e(B -$B$N?t;z$O!"$3$N>.JR$K2hLL$N$I$l$/$i$$$N3d9g$,M?$($i$l$k$+$r;XDj$7$^$9!#(B - -$B$=$l$>$l$NJ,3d$G$O!"(B100% $B$N%?%0$r;}$DMWAG$,(B @emph{$BI,$:(B} $B0l$D$"$kI,MW$,$"(B -$B$j$^$9!#J,3d$O7h$7$F@53N$K$O9T$o$l$^$;$s$N$G!"$3$N%P%C%U%!$,J,3d$+$i;D$5(B -$B$l$?A4$F$N9T$r@jNN$7$^$9!#(B - -$B$b$&>/$7@5<0$K$9$k$?$a$K!"$3$3$KM-8z$JJ,3d$,$I$N$h$&$K$J$k$+$NDj5A$,$"$j(B -$B$^$9(B: - -@example -split = frame | horizontal | vertical | buffer | form -frame = "(frame " size *split ")" -horizontal = "(horizontal " size *split ")" -vertical = "(vertical " size *split ")" -buffer = "(" buf-name " " size *[ "point" ] *[ "frame-focus"] ")" -size = number | frame-params -buf-name = group | article | summary ... -@end example - -$B@)8B$K$O!"(B@code{frame} $B$O:G>e0L$NJ,3d$H$7$F$7$+8=$l$k;v$,$G$-$J$$$H$$$&(B -$B$b$N$,$"$j$^$9!#(B@var{form} $B$OM-8z$JJ,3d$rJV$9(B Emacs Lisp $B$N<0(B (form) $B$G(B -$B$J$1$l$P$J$j$^$;$s!#$=$l$>$l$NJ,3d$O40A4$K:F5"E*$G!"G$0U$N?t(B -$B$N(B @code{vertical} $B$H(B @code{horizontal} $BJ,3d$r4^$`;v$,$G$-$^$9!#(B - -@vindex gnus-window-min-width -@vindex gnus-window-min-height -@cindex window height -@cindex window width -$B@5$7$$Bg$-$5$r8+$D$1$k$N$O>/$7J#;($G$9!#$I$N%&%#%s%I%&(B -$B$b(B @code{gnus-window-min-height} ($B=i4|CM(B 1) $B$NJ8;z$N9b$5$h$j$b>.$5$/$F$O(B -$B$J$i$:!">/$J$/$H$b(B @code{gnus-window-min-width} ($B=i4|CM(B 1) $B$NJ8;zI}$G$J(B -$B$/$F$O$J$j$^$;$s!#(BGnus $B$OJ,3d$rE,MQ$9$kA0$K$3$l$r6/@)$7$h$&$H;n$_$^$9!#(B -$B$b$7IaDL$N(B Emacs $B$N%&%#%s%I%&$NI}(B/$B9b$5@)8B$r;H$$$?$$$J$i!"$3$NFs$D$NJQ?t(B -$B$r(B @code{nil} $B$K$9$k$@$1$GNI$$$G$9!#(B - -$B$b$7(B Emacs $B$NMQ8l$K$J$8$s$G$$$J$$$N$J$i!"(B -@code{horizontal} $B$H(B @code{vertical} $BJ,3d$O!"4|BT$9$k$b$N$HH?BP$NF0:n$r(B -$B$9$k$G$7$g$&!#(B@code{horizontal} $BJ,3d$NCf$N%&%#%s%I%&$O2#$KJB$s$GI=<($5$l!"(B -@code{vertical} $BJ,3d$NCf$N%&%#%s%I%&$O>e2<$KI=<($5$l$^$9!#(B - -@findex gnus-configure-frame -$B%&%#%s%I%&$N@_CV$K4X$7$F(B -$B@\(B @code{gnus-configure-frame} $B$r8F$V$3$H$G$9!#$3$l$O%P%C%U%!$rJ,3d$9$k(B -$B$H$-$KA4$F$NK\Ev$N;E;v$r$9$k4X?t$G$9!#2<$N$b$N$O(B 5 $B%&%#%s%I%&$N$H$F$b$P(B -$B$+$2$?@_Dj$G$9!#Fs$D$r%0%k!<%W%P%C%U%!$K!";0$D$r5-;v%P%C%U%!$N$?$a$K=<$F(B -$B$^$9!#(B($B$=$l$O$P$+$2$F$$$k$H8@$C$?$G$7$g!#(B) $B$b$72<$NJ8$r(B @code{$BI>2A(B} $B$9$k(B -$B$H!"IaDL$N(B gnus $B$N7PO)$r;H$o$J$$$G!"$9$0$K$=$l$,$I$N$h$&$K8+$($k$+$N9M$((B -$B$rF@$k;v$,$G$-$^$9!#K~B-$9$k$^$G$=$l$GM7$s$G!"$=$l$+(B -$B$i(B @code{gnus-add-configuration} $B$r;H$C$F?7$7$$A[A|$r%P%C%U%!@_Dj%j%9%H(B -$B$K2C$($F2<$5$$!#(B - -@lisp -(gnus-configure-frame - '(horizontal 1.0 - (vertical 10 - (group 1.0) - (article 0.3 point)) - (vertical 1.0 - (article 1.0) - (horizontal 4 - (group 1.0) - (article 10))))) -@end lisp - -$B$$$/$D$+$N%U%l!<%`$bM_$7$$$+$b$7$l$^$;$s!#4JC1$G$9(B---@code{frame} $BJ,3d$r(B -$B;H$&$@$1$G$9(B: - -@lisp -(gnus-configure-frame - '(frame 1.0 - (vertical 1.0 - (summary 0.25 point frame-focus) - (article 1.0)) - (vertical ((height . 5) (width . 15) - (user-position . t) - (left . -1) (top . 1)) - (picon 1.0)))) - -@end lisp - -$B$3$NJ,3d$N7k2L$O!":G=i(B ($B$b$7$/$O!"(B``$B.$5$JDI2C$N%U%l!<%`$,(B picon $B$rI=<($9$k$?$a$K:n$i$l$k(B -$B$H$$$&;v$K$J$j$^$9!#$4Mw$NDL$j!"IaDL$N(B @code{1.0} $B:G>e0L;XDj$NBe$o$j$K!"(B -$B$=$l$>$l$NDI2C$NJ,3d$,%U%l!<%`%Q%i%a!<%?O"A[%j%9%H$rBg$-$5;XDj$H$7$F;}$?(B -$B$J$1$l$P$J$j$^$;$s!#(B@xref{Frame Parameters, , Frame Parameters, elisp, -The GNU Emacs Lisp Reference Manual}. XEmacs $B$G$O!"%U%l!<%`%W%m%Q%F%#%j(B -$B%9%H$b;H$($^$9(B---$BNc$($P!"(B@code{(height 5 width 15 left -1 top 1)} $B$O$=$N(B -$B$h$&$J%Q%i%a!<%?%j%9%H$G$9!#(B -@code{gnus-buffer-configuration} $B$K;HMQ2DG=$JA4$F$N%-!<$N0lMw$O$=$N=i4|(B -$BCM$G8+$D$1$k$3$H$,$G$-$^$9!#(B - -$B%-!<(B @code{message} $B$O(B @code{gnus-group-mail} $B$H(B @code{gnus-summary-mail-other-window} $B$N(B -$BN>J}$G;H$o$l$k;v$KCm0U$7$F2<$5$$!#$b$7Fs$D$r6hJL$9$k$[$&$,K>$^$7$$$J$i!"(B -$B$3$N$h$&$JJ*$r;H$&;v$,$G$-$^$9(B: - -@lisp -(message (horizontal 1.0 - (vertical 1.0 (message 1.0 point)) - (vertical 0.24 - (if (buffer-live-p gnus-summary-buffer) - '(summary 0.5)) - (group 1.0))))) -@end lisp - -$BJ#?t$N%U%l!<%`$X$NNI$/$"$kMWK>$O!"%a!<%k$H%K%e!<%9$N:n@.$K$OJL$N%U%l!<%`(B -$B$r;H$$!"85$N%U%l!<%`$O$=$N$^$^$K;D$9$H$$$&$b$N$G$9!#$3$l$NC#@.$K$O!"0J2<(B -$B$N$h$&$J$b$N$G$G$-$^$9!#(B - -@lisp -(message - (frame 1.0 - (if (not (buffer-live-p gnus-summary-buffer)) - (car (cdr (assoc 'group gnus-buffer-configuration))) - (car (cdr (assoc 'summary gnus-buffer-configuration)))) - (vertical ((user-position . t) (top . 1) (left . 1) - (name . "Message")) - (message 1.0 point)))) -@end lisp - -@findex gnus-add-configuration -$BJQ?t(B @code{gnus-buffer-configuration} $B$O$H$F$bD9$/J#;($J$N$G!"C10l$N@_Dj(B -$B$NJQ99$r4JC1$K$9$k$?$a$N4X?t$,$"$j$^$9(B: @code{gnus-add-configuration} $B$G(B -$B$9!#$b$7!"Nc$($P!"(B@code{article} $B$N@_Dj$rJQ$($?$$$N$J$i!"o$K(B ``$B@5$7$$(B'' $B%&%#%s%I%&@_Dj$r6/@)(B -$B$7$?$$$N$G$"$l$P!"(B -@code{gnus-always-force-window-configuration} $B$r(B @code{nil} $B$G$J$$CM$K@_(B -$BDj$9$k;v$,$G$-$^$9!#(B - -$BLZI=<($r;H$C$F$$$F(B (@pxref{Tree Display})$B!"LZ%&%#%s%I%&$O?bD>J}8~$KJL$N(B -$B%&%#%s%I%&$GI=<($5$l$k$J$i!"%&%#%s%I%&$NBg$-$5$,JQ99$5$l$k$3$H$rHr$1$k$?(B -$B$a$K(B @code{gnus-tree-minimize-window} $B$r$$$8$k$N$,NI$$$G$7$g$&!#(B - -@subsection $B%&%#%s%I%&@_Dj$NNc(B - -@itemize @bullet -@item -$B:8B&$r69$a$F%0%k!<%W%P%C%U%!$K!#1&B&$rJ,3d$7$F35N,%P%C%U%!(B ($B>e(B 1/6) $B$H(B -$B5-;v%P%C%U%!(B ($B2<(B) $B$K!#(B - -@ifinfo -@example -+---+---------+ -| G | Summary | -| r +---------+ -| o | | -| u | Article | -| p | | -+---+---------+ -@end example -@end ifinfo - -@lisp -(gnus-add-configuration - '(article - (horizontal 1.0 - (vertical 25 (group 1.0)) - (vertical 1.0 - (summary 0.16 point) - (article 1.0))))) - -(gnus-add-configuration - '(summary - (horizontal 1.0 - (vertical 25 (group 1.0)) - (vertical 1.0 (summary 1.0 point))))) -@end lisp -@end itemize - -@node Faces and Fonts -@section $B%U%'%$%9$H%U%)%s%H(B -@cindex faces -@cindex fonts -@cindex colors - -$B%U%)%s%H$H%U%'%$%9$rO.$k$N$OHs>o$KFq$7$+$C$?$N$G$9$,!":#F|$G$OHs>o$K4JC1(B -$B$G$9!#C1$K(B @kbd{M-x customize-face} $B$H$d$C$F!"JQ$($?$$%U%'%$%9$rA*$S=P$7(B -$B$F!"I8=`$N%+%9%?%^%$%:%$%s%?!<%U%'!<%9$r;H$C$FJQ99$9$k;v$,$G$-$^$9!#(B - -@node Compilation -@section $B%3%s%Q%$%k(B -@cindex compilation -@cindex byte-compilation - -@findex gnus-compile - -$B$"$N9T=qK!;EMM;XDjJQ?t$r3P$($F$$$^$9(B -$B$+(B? @code{gnus-summary-line-format}, @code{gnus-group-line-format} $B$J$I(B -$B$J$I$G$9!#DL>o(B T-gnus $B$O$3$l$i$NJQ?t$r%P%$%H%3%s%Q%$%k$7$F;H$&$N$G!"B.EY(B -$BDc2<$O:G>.8B$K?)$$;_$a$i$l$^$9!#$7$+(B -$B$7(B @code{gnus-compile-user-specs} $B$r(B @code{nil} ($B=i4|CM$O(B @code{t}) $B$K$7(B -$B$?>l9g$O!"IT1?$J;v$K$=$l$i$rJQ99$9$k$HBgJQ=EBg$JB.EYDc2<$r0z$-5/$3$9;v$K(B -$B$J$j$^$9!#(B($B$3$l$i$NJQ?t$N=i4|CM$O$=$l$i$K4XO"IU$1$i$l$?%P%$%H%3%s%Q%$%k(B -$B$5$l$?4X?t$r;}$C$F$$$^$9$,!"MxMQo$K:G?7$N(B -$B$b$N$K$7$F$*$/$+$r;XDj$7$^$9!#$=$l$O%7%s%\%k$N%j%9%H$G$9!#;H$&;v$N$G$-$k(B -$B%7%s%\%k(B -$B$O(B @code{group}, @code{article}, @code{summary}, @code{server}, @code{browse}, @code{tree} $B$J(B -$B$I$G$9!#$b$7BP1~$9$k%7%s%\%k$,B8:_$9$k$H!"(Bgnus $B$O3:Ev$9$k$G$"$m$&>pJs$G(B -$B%b!<%I9T$r99?7$7$^$9!#$3$NJQ?t$,(B @code{nil} $B$G$"$k$J$i!"2hLL$N:FIA2h$O$b$C(B -$B$HB.$$$G$7$g$&!#(B - -@cindex display-time - -@vindex gnus-mode-non-string-length -$B=i4|@_Dj$G$O!"(Bgnus $B$O35N,%P%C%U%!$H5-;v%P%C%U%!$N%b!<%I9T$K8=:_$N5-;v$N(B -$B>pJs$rI=<($7$^$9!#(BGnus $B$,I=<($7$?$$>pJs(B ($BNc$($P!"5-;v$NI=Bj(B) $B$O$7$P$7$P(B -$B%b!<%I9T$h$j$bD9$$$3$H$,$"$k$N$G!"$I$3$+$G@Z$jMn$H$5$l$J$1$l$P$J$j$^$;$s!#(B -$BJQ?t(B @code{gnus-mode-non-string-length} $B$O$=$N9T$NB>$NMWAG(B ($B$9$J$o$A!">p(B -$BJs$G$J$$ItJ,(B) $B$,$I$N$/$i$$$ND9$5$G$"$k$+$r;XDj$7$^$9!#$b$7%b!<%I9T$KDI2C(B -$B$NMWAG$rF~$l$?$J$i!"$3$NJQ?t$r=$@5$9$kI,MW$,$"$j$^$9(B: - -@c Hook written by Francesco Potorti` -@lisp -(add-hook 'display-time-hook - (lambda () (setq gnus-mode-non-string-length - (+ 21 - (if line-number-mode 5 0) - (if column-number-mode 4 0) - (length display-time-string))))) -@end lisp - -$B$b$7$3$NJQ?t$,(B @code{nil} $B$G$"$k$J$i(B ($B$3$l$,=i4|CM$G$9$,(B)$B!"%b!<%I9T$O@Z(B -$B$jMn$H$5$l$:!"5M$a9~$_$b$5$l$^$;$s!#=i4|@_Dj$O!"%P%C%U%!$N40A4$J%Q!<%;%s(B -$B%HI=<($5$($b%b!<%I9T$+$iDI$$$d$i$l$k2DG=@-$b$"$j$^$9$N$G!"$*$=$i$/K>$^$7(B -$B$$@_Dj$G$O$J$$$H$$$&;v$KCm0U$7$F2<$5$$!#MxMQl9g$O!"$3$N$h$&$K$9$k;v$,$G$-$^$9(B: - -@lisp -(setq gnus-visual '(article-highlight menu)) -@end lisp - -$B$b$7%O%$%i%$%H$@$1$G!"%a%K%e!<$NN`$OM_$7$/$J$$$H$-$O!"$NA4$F$N%P%C%U%!$N308+$K1F6A$9$kAm9gE*$JJQ?t$O(B: - -@table @code -@item gnus-mouse-face -@vindex gnus-mouse-face -$B$3$l$O(B gnus $B$G%^%&%9$N%O%$%i%$%H$K;H$o$l$k%U%'%$%9(B ($B$9$J$o$A!"%U%)%s(B -$B%H(B) $B$G$9!#(B@code{gnus-visual} $B$,(B @code{nil} $B$G$"$k$H!"%^%&%9%O%$%i%$%H$O(B -$B$J$5$l$^$;$s!#(B -@end table - -$BA4$/0c$C$?%a%K%e!<$r:n@.$9$k$?$a$K4XO"$9$k%U%C%/$,$"$j$^$9(B: - -@table @code -@item gnus-article-menu-hook -@vindex gnus-article-menu-hook -$B5-;v%b!<%I(B (article mode) $B%a%K%e!<$r:n@.$7$?8e$K8F$P$l$k%U%C%/$G$9!#(B - -@item gnus-group-menu-hook -@vindex gnus-group-menu-hook -$B%0%k!<%W%b!<%I(B (group mode) $B%a%K%e!<$r:n@.$7$?8e$K8F$P$l$k%U%C%/$G$9!#(B - -@item gnus-summary-menu-hook -@vindex gnus-summary-menu-hook -$B35N,%b!<%I(B (summary mode) $B%a%K%e!<$r:n@.$7$?8e$K8F$P$l$k%U%C%/$G$9!#(B - -@item gnus-server-menu-hook -@vindex gnus-server-menu-hook -$B%5!<%P!<%b!<%I(B (server mode) $B%a%K%e!<$r:n@.$7$?8e$K8F$P$l$k%U%C%/$G$9!#(B - -@item gnus-browse-menu-hook -@vindex gnus-browse-menu-hook -$B354Q%b!<%I(B (browse mode) $B%a%K%e!<$r:n@.$7$?8e$K8F$P$l$k%U%C%/$G$9!#(B - -@item gnus-score-menu-hook -@vindex gnus-score-menu-hook -$B%9%3%"%b!<%I(B (score mode) $B%a%K%e!<$r:n@.$7$?8e$K8F$P$l$k%U%C%/$G$9!#(B -@end table - -@node Buttons -@section $B%\%?%s(B -@cindex buttons -@cindex mouse -@cindex click - -$B:G6a$G$O!":G?7N.9T$N%^%&%9(B @dfn{mouse} $BAuCV$,!"$A$c$s$H$7$?A`:nK!$r3X$S(B -$B$?$,$i$J$$%J%&$J%d%s%0$N4V$GBg?M5$$G$9!#$=$l$G$O!";d$,(B Tops 20 $B%7%9%F%`(B -$B>e$G(B Emacs $B$r;H$C$F$$$?:"$N(B '89 $BG/$N2F$r;W$$5/$3$7$F$_$^$7$g$&!#(B300 $B?M$N(B -$BMxMQe$G!"$_$s$J$,(B Simula $B%3%s%Q%$%i$rAv$i$;$F$$$^$7$?!#(B -$B$"$"!"$P$+$P$+$7$$(B! - -$B$[$s$H$K$=$&$@$M!#(B - -@vindex gnus-carpal -$B$^$:$G$9$M!"(B@code{gnus-carpal} $B$r(B @code{t} $B$K@_Dj$9$k$3$H$K$h$C$F!"%/%j%C(B -$B%/$9$k$@$1$G2?$G$b$G$-$k%\%?%s$@$i$1$N%P%C%U%!$r(B gnus $B$KI=<($5$;$k$3$H$,(B -$B$G$-$^$9!#$H$C$F$b4JC1$G$9!"$[$s$H$K!#;X05NEK!$N@h@8$K65$($F$"$2$F!#(B($BLu(B -$BCm(B: carpal $B$H$O$K$b2?$+$=$&(B -$B$$$C$?$3$H$G$9!#(B - -Gnus $B$O$5$^$6$^$J@)8f;R(B @dfn{handlers} $B$rDj5A$9$k$3$H$K$h$C$F$=$N$h$&$J(B -$B$3$H$r2DG=$K$7$^$9!#3F@)8f;R$O;0$D$NMWAG$+$i@.$j$^$9!#(B -@var{$B4X?t(B}, @var{$B;~4V(B}, @var{$B6uE>(B} $B%Q%i%a!<%?$G$9!#(B - -$B0J2<$O(B Emacs $B$,2?$b$7$J$$6uE>>uBV$,;0==J,B3$$$?$H$-$K@\B3$r@ZCG$9$k@)8f(B -$B;R$NNc$G$9!#(B - -@lisp -(gnus-demon-close-connections nil 30) -@end lisp - -$B0J2<$O(B Emacs $B$,2?$b$7$F$$$J$$$H$-!"0l;~4VKh$K(B PGP $B%X%C%@!<$rAv::$9$k@)8f(B -$B;R$G$9!#(B - -@lisp -(gnus-demon-scan-pgp 60 t) -@end lisp - -$B$3$N(B @var{$B;~4V(B} $B%Q%i%a!<%?$H$=$7$F(B @var{$B6uE>(B} $B%Q%i%a!<%?$O!"4qL/$G$+$DAG(B -$B@2$i$7$$J}K!$G0l=o$KF0:n$7$^$9!#4pK\E*$K$O!"(B@var{$B6uE>(B} $B$,(B @code{nil} $B$N(B -$B;~$K$O$3$N4X?t$O(B @var{$B;~4V(B} $BJ,Kh$K8F$S=P$5$l$^$9!#(B - -$B$b$7(B @var{$B6uE>(B} $B$,(B @code{t} $B$G$"$l$P!"$3$N4X?t$O(B Emacs $B$,2?$b$7$F$$$J$$(B -$B;~$K8B$j!"(B@var{$B;~4V(B} $BJ,8e$K8F$S=P$5$l$^$9!#0lC6(B Emacs $B$,$:$C$H6uE>>uBV$K(B -$B$J$C$?8e$O!"$3$N4X?t$O(B @var{$B;~4V(B} $BJ,Kh$K8F$S=P$5$l$^$9!#(B - -@var{$B6uE>(B} $B$,?t$G(B @var{$B;~4V(B} $B$b?t$G$"$k>l9g!"$3$N4X?t$O!"(BEmacs $B$N6uE>>u(B -$BBV$,(B @var{$B6uE>(B} $BJ,B3$$$?;~$K8B$j!"(B@var{$B;~4V(B} $BJ,Kh$K8F$S=P$5$l$^$9!#(B - -@var{$B6uE>(B} $B$,?t$G(B @var{$B;~4V(B} $B$,(B @code{nil} $B$N>l9g!"$3$N4X?t$O!"(BEmacs $B$N(B -$B6uE>>uBV$,(B @var{$B6uE>(B} $BJ,B3$/EY$K0lEY8F$S=P$5$l$^$9!#(B - -$B$=$7$F(B @var{$B;~4V(B} $B$,J8;zNs$N>l9g$O!"(B@samp{07:31} $B$N$h$&$J7A<0$G$J$1$l$P(B -$B$J$i$:!"$3$N4X?t$OKhF|$=$N:"$N;~4V$K$J$k$H0lEY8F$S=P$5$l$^$9!#$b$A$m$s!"(B -@var{$B6uE>(B} $B%Q%i%a!<%?$GF0:n$,JQ$o$j$^$9!#(B - -@vindex gnus-demon-timestep -($B$3$3$G(B ``$BJ,(B'' $B$H8@$C$?$H$-!"$=$l$O@\DI2C$7$?>l9g$K$O!"$=$l$r8z(B -$B$+$;$k$?$a$K(B @code{gnus-demon-init} $B$rC$9$K$O!"(B@code{gnus-demon-cancel} $B4X?t$r;H$&$3$H$,$G$-$^$9!#(B - -$B%G!<%b%s$NDI2C$O!"$d$j$9$.$k$N$O$H$C$F$b$*9T57$N$h$/$J$$$3$H$G$9!#A4$F$N(B -$B%5!<%P!<$+$iA4$F$N%K%e!<%9$H%a!<%k$rFsICKh$KD4$Y$^$o$94X?t$rIU$12C$($A$c$C(B -$B$?$j$9$k$H!"$I$s$JN)GI$J%7%9%F%`$G$b4V0c$$$J$/$*J'$$H"$K$7$F$7$^$$$^$9!#(B -$B$=$&F0$/$s$@$b$s!#(B - -@node NoCeM -@section NoCeM -@cindex nocem -@cindex spam - -$B%9%Q%`(B @dfn{Spam} $B$H$O!"F1$85-;v$r2?2s$b2?2s$b2?2s$bEj9F$9$k$3$H$G$9!#%9(B -$B%Q%`$O0-$$$3$H$G$9!#%9%Q%`$O6'0-$G$9!#(B - -$B%9%Q%`$ODL>o0lF|$+$=$3$i$G!"$5$^$6$^$JH?%9%Q%`5!4X$+$iC$7$5$l$^$9!#(B -$B$3$l$i$N5!4X$ODL>o0l=o$K!"(B@dfn{NoCeM} $B%a%C%;!<%8$bAw?.$7$^$9!#(B -@dfn{NoCeM} $B$O(B ``no see-'em'' ($BH`$i$r8+$?$/$J$$(B)$B$HH/2;$5$l!"0UL#$O$=$NL>(B -$BA0$NDL$j$G$9(B --- $B$3$N%a%C%;!<%8$O!":a$rHH$7$F$$$k5-;v$r!"$D$^$j!">C$7$F(B -$B$7$^$$$^$9!#(B - -$B$I$&$;$=$N5-;v$,C$7$5$l$F$7$^$&$N$J$i!"$3$l$i(B NoCeM $B%a%C%;!<%8$O2?(B -$B$K;H$o$l$k$N$G$7$g$&(B? $B$"$k%5%$%H$G$OC$7%a%C%;!<%8$r0z$-C$7%a%C%;!<%8$N$_$7$+0z$-C$75n$j$^$9!#(B - -$B$b$A$m$s!"$3$l$i$r%+%9%?%^%$%:$9$k$?$a$NJQ?t$,$$$/$D$+$"$j$^$9!#(B - -@table @code -@item gnus-use-nocem -@vindex gnus-use-nocem -$B$3$NJQ?t$r(B @code{t} $B$K@_Dj$9$k$3$H$G3hF0$r3+;O$5$;$^$9!#=i4|@_Dj$G(B -$B$O(B @code{nil} $B$G$9!#(B - -@item gnus-nocem-groups -@vindex gnus-nocem-groups -Gnus $B$O$3$N%0%k!<%W%j%9%H$+$i(B NoCeM $B%a%C%;!<%8$rC5$7$^$9!#=i4|@_DjCM(B -$B$O(B @code{("news.lists.filters" "news.admin.net-abuse.bulletins" "alt.nocem.misc" "news.admin.net-abuse.announce")} $B$G(B -$B$9!#(B - -@item gnus-nocem-issuers -@vindex gnus-nocem-issuers -NoCeM $B%a%C%;!<%8$rH/9T$9$k?M$O$?$/$5$s$$$^$9!#$3$N%j%9%H$G$O!"C/$N8@$&$3(B -$B$H$K=>$$$?$$$+$r;XDj$7$^$9!#=i4|@_DjCM$O(B @code{(("Automoose-1" -"clewis@@ferret.ocunix.on.ca" "cosmo.roadkill" "SpamHippo" -"hweede@@snafu.de")} $B$G$9!#H`$i$O$_$s$J!"N)GI$G9b7i$J;TL1$G$9!#(B - -$B$3$N%j%9%H$K4^$a$i$l$kM-L>$JH?%9%Q%`2H$?$A(B -$B$O(B @uref{http://www.xs4all.nl/~rosalind/nocemreg/nocemreg.html} $B$K:\$C$F(B -$B$$$^$9!#(B - -$B$3$l$iA4$F$N?M!9$N(B NoCeM $B%a%C%;!<%8$KN10U$9$kI,MW$O$"$j$^$;$s(B --- $B8@$&$3(B -$B$H$rJ9$-$?$$?M$@$1$G$$$$$s$G$9!#$^$?$=$N?M$+$i$N(B NoCeM$B%a%C%;!<%8A4$F$r$l/$O(B -$B87L)$J!"DxEY$M!#$?$$$F$$$O>/$@$1$I(B)$B!#NI$/;H$o$l$kr(B -$B7o(B} @dots{})} $BMWAG$r;H$&I,MW$,$"$j$^$9!#3F>r7o$OJ8;zNs(B ($B;H$$$?$$l9g$O(B @var{$BJ8;zNs(B} $B$O;H$$$?$/$J$$l9g$K$O!"(B - -@lisp -("clewis@@ferret.ocunix.on.ca" ".*" (not "troll")) -@end lisp - -$B0lJ}!"H`$N(B @samp{spam} $B$H(B @samp{spew} $B%a%C%;!<%80J30$O2?$b$7$?$/$J$1$l$P!"(B -$B0J2<$N$h$&$K$G$-$^$9!#(B - -@lisp -("clewis@@ferret.ocunix.on.ca" (not ".*") "spew" "spam") -@end lisp - -$B$3$N;XDj$O:8$+$i1&$KE,MQ$5$l$^$9!#(B - -@item gnus-nocem-verifyer -@vindex gnus-nocem-verifyer -@findex mc-verify -$B$3$l$O(B NoCeM $BH/9TZL@$9$k4X?t$G$J$/$F$O$J(B -$B$j$^$;$s!#=i4|@_Dj$G$O(B @code{mc-verify} $B$G$"$j!"$3$l$O(B Mailcrypt $B4X?t$G(B -$B$9!#$b$7$3$l$,Hs>o$KCY$/$F!"$"$J$?$,>ZL@7k2L$r5$$K$7$J$$(B ($B$3$l$O$?$V$s4m(B -$B81$G$9(B) $B$N$G$"$l$P!"$3$NJQ?t$r(B @code{nil} $B$K$9$k$3$H$,$G$-$^$9!#(B - -$B$b$7=pL>:Q$_$N(B NoCeM $B%a%C%;!<%8$r>ZL@:Q$_!"L$=pL>$N%a%C%;!<%8$rL$>Z(B -$BL@(B ($B$G$b$=$l$r;H$&(B) $B$H$7$?$$$N$J$i!"0J2<$N$h$&$K$9$k$3$H$,$G$-$^$9!#(B - -@lisp -(setq gnus-nocem-verifyer 'my-gnus-mc-verify) - -(defun my-gnus-mc-verify () - (not (eq 'forged - (ignore-errors - (if (mc-verify) - t - 'forged))))) -@end lisp - -$B$^$"!"$3$l$O$?$V$s4m81$G$7$g$&$1$I$M!#(B - -@item gnus-nocem-directory -@vindex gnus-nocem-directory -$B$3$l$O(B gnus $B$,(B NoCeM $B%-%c%C%7%e%U%!%$%k$rJ]B8$9$k>l=j$G$9!#=i4|@_DjCM(B -$B$O(B @file{~/News/NoCeM/} $B$G$9!#(B - -@item gnus-nocem-expiry-wait -@vindex gnus-nocem-expiry-wait -$B8E$$(B NoCeM $B9`L\$r%-%c%C%7%e$+$i>C$9$^$G$NF|?t!#=i4|@_DjCM$O(B 15 $B$G$9!#$3(B -$B$l$rC;$/$9$k$[$I(B gnus $B$OB.$/$J$j$^$9$,!"8E$$%9%Q%`$r8+$k$3$H$K$J$C$F$7$^(B -$B$&$+$b$7$l$^$;$s!#(B - -@item gnus-nocem-check-from -@vindex gnus-nocem-check-from -$BHs(B@code{nil} $B$G$O!"5-;v$N%\%G%#$K$"$kH/9T?M$N@5Ev@-$rD4$Y$^$9!#$=$&$G$J(B -$B$$>l9g$O!"CxC$75n$C$F$7$^$C$?J}$,NI$$$G(B -$B$9(B (@pxref{Subscription Commands})$B!#(B - -@node Undo -@section $B$d$jD>$7(B -@cindex undo - -$B$7$,$G$-$k$H!"$H$F$bJXMx$G$9!#IaDL$N(B Emacs $B%P%C%U%!(B -$B$G$O!"$3$l$O==J,4JC1$G$9(B --- $BC1$K(B @code{undo} $B%\%?%s$r2!$9$@$1$G$9!#$7$+(B -$B$7(B gnus $B$N%P%C%U%!$G$O!"$3$l$O4JC1$G$O$"$j$^$;$s!#(B - -Gnus $B$,%P%C%U%!!C5n$9$k(B -$B$N$O!"$=$N9T$O>C$(5n$j$^$9$,!"$=$l$O$7$O!"DL>o$N(B Emacs $B$N(B @code{undo} $B4X?t$G$O9T$J$&$3$H$,$G$-$^(B -$B$;$s!#(B - -Gnus $B$O!"MxMQ$72DG=$J%-!<4X?t$O6O$+$7$+Ds6!$7$F$$$^$;$s!#(B -$B$3$l$i$O!"%0%k!<%W$N:o=|!"%0%k!<%W$NE=$jIU$1!"%0%k!<%W$N4{FI5-;v$N%j%9%H(B -$B$NJQ99!"$=$l$@$1$J$s$G$9!#>-Mh$O$b$C$H4X?t$,DI2C$5$l$k$+$b$7$l$^$;$s$,!"(B -$B4X?t$NDI2C$O$=$l$>$lJ]B8$9$k$Y$-%G!<%?$rA}$d$9$3$H$K$J$k$N$G!"(Bgnus $B$O7h(B -$B$7$F40A4$d$jD>$72DG=$K$O$J$i$J$$$G$7$g$&!#(B - -@findex gnus-undo-mode -@vindex gnus-use-undo -@findex gnus-undo -$B$d$jD>$75!G=$O(B @code{gnus-undo-mode} $B%^%$%J!<%b!<%I$K$h$C$FDs6!$5$l$^$9!#(B -$B$3$l$O(B @code{gnus-use-undo} $B$,(B @code{nil} $B0J30$G$"$l$P;HMQ$5$l!"$3$l$,=i(B -$B4|@_Dj$G$9!#(B@kbd{M-C-_} $B%-!<$,(B @code{gnus-undo} $BL?Na$ro$N(B Emacs $B$N(B @code{undo} $BL?Na$K$A$g$C$H$@$1;w$F$$$k$H;W$o$l$k$G$7$g$&!#(B - -@node Moderation -@section $B;J2qLr(B -@cindex moderation - -$B$b$7$"$J$?$,;J2q5G'$7(B -$B$F$$$J$$5-;v$r$?$^$?$^8+$D$1$?$H$7$?$i!"(B@kbd{c} $BL?Na$GC$7$G$-$^$9!#(B -@end enumerate - -$BFs$D$N%0%k!<%W$G;J2q$N$b$N$rI=<($9$k$3$H$,$G$-$k$N$G!"(Bgnus $B$O$3$l$rMxMQ$9(B -$B$k$3$H$K$7$^$9!#(B - -@menu -* 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=<((B - $B$9$kJ}K!(B -* Toolbar:: $B%/%j%C%/1n(B -* XVarious:: $B$=$NB>$N(B XEmacs $B$G(B Gnus $B$JJQ?t(B -@end menu - -@node Picons -@subsection Picons - -@iftex -@iflatex -\include{picons} -@end iflatex -@end iftex - -$B$=$l$G!D!"$"$J$?$O$3$N%K%e!<%9%j!<%@!<$r$5$i$K$b$C$HCY$/$7$?$$$C$F$o$1$@(B -$B$M(B! $B$3$l$O$=$&$9$k$N$K$T$C$?$j$JJ}K!$G$9!#$5$i$K$3$l$O!"$"$J$?$,%K%e!<%9(B -$B$rFI$s$G$$$k$s$@$H$$$&$3$H$r!"$"$J$?$N8*1[$7$K8+$D$a$F$$$k?M$K0u>]$E$1$k(B -$B$?$a$NAG@2$i$7$$J}K!$G$b$"$j$^$9!#(B - -@menu -* Picon Basics:: picon $B$H$O2?$G!"$I$&$d$C$F$N$V$C2u$7$?$j$R$M$C$?$j$$$8$C$?(B - $B$jM7$s$@$j$9$kJQ?t(B -@end menu - -@node Picon Basics -@subsubsection Picon $B$N4pAC(B - -Picon $B$H$O$J$s$G$7$g$&(B? Picons $B%&%'%V%5%$%H$+$iD>@\0zMQ$7$^$7$g$&!#(B - -@iftex -@iflatex -\margindex{} -@end iflatex -@end iftex - -@quotation -@dfn{Picon} $B$H$O!"(B``$B8D?M%"%$%3%s(B (personal icons)'' $B$NN,$G$9!#$3$l$O!"%M%C(B -$B%H>e$NMxMQ.$5$J2hA|$G!"%G!<%?%Y!<(B -$B%9$r;}$?$;$F!"$"$kEE;R%a!<%k%"%I%l%9$,$"$C$?$i!"$=$l$KE,@Z$J2hA|$r8+$D$1(B -$B$i$l$k$h$&$K$7$F$*$/$b$N$G$9!#MxMQo;~@\B3$7$F$$$k$N$J$i$P!"(B -@code{gnus-picons-piconsearch-url} $B$KJ8;z(B -$BNs(B @uref{http://www.cs.indiana.edu/picons/search.html} $B$r@_Dj$9$k$3$H$G!"(B -Steve Kinzler $B$N(B picon $B8!:w%(%s%8%s$r;H$&$3$H$,$G$-$^$9!#(B - -@vindex gnus-picons-database -$B$=$&$G$J$1$l$P!"H`$N%G!<%?%Y!<%9$rl=j$K%$(B -$B%s%9%H!<%k$7$F$"$k$b$N$H4|BT$7$^$9!#(B - -@node Picon Requirements -@subsubsection Picon $B$NF0:n>r7o(B - -Gnus $B$K(B picon $B$rI=<($5$;$k$K$O!"(BXEmacs 19.13 $B$+$=$l0J9_$r$NHG$N(B Emacs $B$G$O$I$l$b$^$@2hA|$rI=<($G$-$J$$$+$i$G$9!#(B - -$B$5$i$K!"(B@code{x} $B%5%]!<%HIU$-$G(B XEmacs $B$r%3%s%Q%$%k$7$F$$$J$/$F$O$J$j$^(B -$B$;$s!#Gr9u$h$j$b$b$C$H4qNo$J?'IU$-$N(B picon $B$rI=<($9$k$?$a$K$O!"(B -@code{xpm} $B$+(B @code{gif} $B$I$A$i$+$r(B XEmacs $B$H0l=o$K%3%s%Q%$%k$7$F$$$kI,(B -$BMW$b$"$j$^$9!#(B - -@vindex gnus-picons-convert-x-face -@code{X-Face} $B%X%C%@!<$N4i$rI=<($7$?$$$N$J$i!"(BXEmacs $B$r(B @code{xface} $B%5(B -$B%]!<%HIU$-$G%3%s%Q%$%k$7$J$1$l$P$J$j$^$;$s!#$=$&$G$J$1$l$P!"(B -@code{netpbm} $B%f!<%F%#%j%F%#$r%$%s%9%H!<%k$7$F$*$/$+!"$"$k$$$OB>$N2?$+$r(B -$B;H$&$h$&$K(B @code{gnus-picons-convert-x-face} $BJQ?t$r$$$8$/$C$F$/$@$5$$!#(B - -@node Easy Picons -@subsubsection $B3Z!9(B Picons - -picon $BI=<($rM-8z$K$9$k$K$O!"C1$K0J2<$N9T$r(B @file{~/.gnus} $B%U%!%$%k$KF~$l(B -$B$F!"(Bgnus $B$r5/F0$7$F$/$@$5$$!#(B - -@lisp -(setq gnus-use-picons t) -(setq gnus-treat-display-picons t) -@end lisp - -@code{gnus-picons-database} $B$,(B picon $B%G!<%?%Y!<%9$,4^$^$l$F$$$k%G%#%l%/(B -$B%H%j$r;X$7$F$$$k$3$H$r3NG'$7$F$/$@$5$$!#(B - -$B$=$NBe$o$j$K(B Web $B>e$N(B picon $B8!:w%(%s%8%s$r;H$$$?$1$l$P!"$3$l$rDI2C$7$^$9!#(B - -@lisp -(setq gnus-picons-piconsearch-url - "http://www.cs.indiana.edu:800/piconsearch") -@end lisp - -@node Hard Picons -@subsubsection $BFq2r(B Picons - -@iftex -@iflatex -\margindex{} -@end iflatex -@end iftex - -Gnus $B$O!"%0%k!<%W$d5-;v$KF~$C$?$j=P$?$j$9$k$N$K=>$C$F(B picon $B$rI=<($9$k$3(B -$B$H$,$G$-$^$9!#(BGnus $B$O(B picon $B%G!<%?%Y!<%9$N;0$D$N>O$H$I$&Aj8_:nMQ$9$l$P$h(B -$B$$$+$rCN$C$F$$$^$9!#$9$J$o$A!"(Bgnus $B$O%K%e!<%9%0%k!<%W$N3(!"Cxl=j!#(B@file{news}, @file{domains}, @file{users} ($B$J(B -$B$I$J$I(B) $B$N%5%V%G%#%l%/%H%j!<$,4^$^$l$F$$$k%G%#%l%/%H%j!<$r;X$7$F$$$J$1$l(B -$B$P$J$j$^$;$s!#$3$l$O(B @code{gnus-picons-piconsearch-url} $B$,(B @code{nil} $B$G(B -$B$"$k$H$-$N$_;HMQ$5$l$^$9!#=i4|@_DjCM$O(B @file{/usr/local/faces/} $B$G$9!#(B - -@item gnus-picons-piconsearch-url -@vindex gnus-picons-piconsearch-url -Web $B>e$N(B picon $B8!:w%(%s%8%s$N(B URL$B!#8=:_CN$i$l$F$$$kM#0l$N%(%s%8%s(B -$B$O(B @uref{http://www.cs.indiana.edu:800/piconsearch} $B$G$9!#%M%C%H%o!<%/CY(B -$B1d$r2sHr$9$k$?$a$K(B icon $B$O%P%C%/%0%i%&%s%I$Gl=j!#$3$l$O=i4|@_Dj$G$O(B @code{picons} $B$G$9(B ($B$3$l(B -$B$O=i4|@_Dj$G(B @samp{*Picons*} $B%P%C%U%!$K0LCV$7$^$9(B)$B!#B>$NM-8z$J>l=j$H$7$F(B -$B$O(B @code{article}, @code{summary} $B$"$k$$$O(B @samp{*scratch*} $B$@$m$&$HCN$C(B -$B$?$3$H$G$O$"$j$^$;$s!#$?$@$=$N%P%C%U%!$rI8=`$N(B gnus $BAkG[CV=h(B -$BM}(B --- @pxref{Window Layout} $B$K$h$C$F8+$($k$h$&$K$7$F$*$/$3$H$r3NG'$7$F(B -$B$/$@$5$$!#(B - -@item gnus-picons-group-excluded-groups -@vindex gnus-picons-group-excluded-groups -$B$3$N@55,I=8=$K%^%C%A$9$k%0%k!<%W$G$O$=$N%0%k!<%W%"%$%3%s$rI=<($5$;$^$;$s!#(B -@end table - -$BCm0U(B: $B$b$7(B @code{gnus-use-picons} $B$r(B @code{t} $B$K@_Dj$9$k$H!"AkG[CV(B -$B$K(B @code{picons} $B%P%C%U%!$r4^$a$k$h$&$K@_Dj$5$l$^$9!#(B - -$B$5$F!"$3$l$i$r7hDj$7$?8e$K$O!"$3$l$i$N3($,@5$7$$;~$KI=<($5$l$k$h$&$K!"0J(B -$B2<$N4X?t$rE,@Z$J%U%C%/$KDI2C$9$kI,MW$,$"$j$^$9!#(B - -@vindex gnus-picons-display-where - -@table @code -@item gnus-article-display-picons -@findex gnus-article-display-picons -$BCxLr$K(B -$B$bN)$?$J$$$I$&$G$b$h$$$3$H$r@)8f$G$-$k$h$&$K$7$^$9!#(B - -@table @code -@item gnus-picons-news-directories -@vindex gnus-picons-news-directories -@code{gnus-picons-database} $B$+$i%K%e!<%9%0%k!<%W%U%'%$%9$rC5$9$?$a$N%5%V(B -$B%G%#%l%/%H%j!<$N%j%9%H!#(B@code{("news")} $B$,=i4|@_DjCM$G$9!#(B - -@item gnus-picons-user-directories -@vindex gnus-picons-user-directories -@code{gnus-picons-database} $B$+$iMxMQ%U%'%$%9$rC5$9$?$a$N%5%V%G%#%l(B -$B%/%H%j!<$N%j%9%H!#=i4|@_DjCM$O(B @code{("domains")} $B$G$9!#$3$N%j%9%H(B -$B$K(B @samp{"unknown"} $B$rDI2C$7$F$*$-$?$/$J$k?M$b$$$k$G$7$g$&!#(B - -@item gnus-picons-convert-x-face -@vindex gnus-picons-convert-x-face -$B$b$7(B XEmacs $B$K(B @code{xface} $B%5%]!<%H$,AH$_9~$^$l$F$$$J$1$l$P!"$3$NL?Na$,(B -@code{X-Face} $B%X%C%@!<$r(B X $B%S%C%H%^%C%W(B (@code{xbm}) $B$KJQ49$9$k$N$K;HMQ(B -$B$5$l$^$9!#=i4|@_DjCM(B -$B$O(B @code{(format "@{ echo '/* Width=48, Height=48 */'; uncompface; @} | icontopbm | pbmtoxbm > %s" gnus-picons-x-face-file-name)} $B$G(B -$B$9!#(B - -@item gnus-picons-x-face-file-name -@vindex gnus-picons-x-face-file-name -@code{X-Face} $B%S%C%H%^%C%W$r3JG<$7$F$*$/0l;~%U%!%$%k$NL>A0!#=i4|@_DjCM(B -$B$O(B @code{(format "/tmp/picon-xface.%s.xbm" (user-login-name))}$B!#(B - -@item gnus-picons-has-modeline-p -@vindex gnus-picons-has-modeline-p -@code{gnus-picons-display-where} $B$r(B @code{picons} $B$K@_Dj$7$F$7$^$&$H!"(B -XEmacs $B$N%U%l!<%`$O$a$A$c$a$A$c$K$J$C$F$7$^$&$G$7$g$&!#$3$l$rB?>/$J$j$H(B -$B$b7Z8:$9$k$K$O!"(B@code{gnus-picons-has-modeline-p} $B$r(B @code{nil} $B$K@_Dj$7(B -$B$F$/$@$5$$!#$3$l$O(B picon $B%P%C%U%!$+$i%b!<%I9T$r$H$7$F;n$7$F$_$k3HD%;R$N=g=x%j%9%H!#=i4|@_DjCM(B -$B$O(B @code{("xpm" "gif" "xbm")} $B$+$i(B XEmacs $B$KAH$_9~$^$l$F$$$J$$$b$N$r0z$$(B -$B$?$b$N$G$9!#(B - -@item gnus-picons-setup-hook -@vindex gnus-picons-setup-hook -picon $B$,$b$7I=<($5$l$F$$$l$P!"(Bpicon $B%P%C%U%!$GC$75n$k$+$I$&$+!#(BGnus $B$O/@aLs(B -$B$G$-$^$9$,!"%a%b%j$r$$$/$i$+?)$$$^$9!#$b$7$3$NJQ?t$r(B @code{nil} $B$K@_Dj$9(B -$B$l$P!"(Bgnus $B$O$=$N%-%c%C%7%e$r7h$7$F>C$7$^$;$s!#$=$l$r>C$75n$k$K$OC5n$5$l$^$9!#=i(B -$B4|@_DjCM$O(B @code{t} $B$G$9!#(B - -@iftex -@iflatex -\margindex{} -@end iflatex -@end iftex -@end table - -@node Smileys -@subsection $B%9%^%$%j!<(B -@cindex smileys - -@iftex -@iflatex -\gnusfig{-3cm}{0.5cm}{\epsfig{figure=tmp/BigFace.ps,height=20cm}} -\input{smiley} -@end iflatex -@end iftex - -$B%9%^%$%j!<(B @dfn{smiley} $B$O(B gnus $B$H$OJL$N%Q%C%1!<%8$G$9$,!"%9%^%$%j!<$r;H$C(B -$B$F$$$k%Q%C%1!<%8$O8=:_(B gnus $B$@$1$G$9$N$G!"$3$3$G@bL@$7$^$9!#(B - -$B0l8@$G8@$($P(B --- gnus $B$G%9%^%$%j!<$r;H$&$K$O!"0J2<$r(B @file{.gnus.el} $B%U%!(B -$B%$%k$K=q$$$F$/$@$5$$!#(B - -@lisp -(setq gnus-treat-display-smileys t) -@end lisp - -$B%9%^%$%j!<$O!"J8;z$N4i%^!<%/(B --- @samp{:-)}, @samp{:-=}, @samp{:-(} $B$J$I(B -$B$H$$$C$?$b$N(B --- $B$r3($KBP1~$5$;!"J8;z$N4i%^!<%/$NBe$o$j$K$=$N3($rI=<($7(B -$B$^$9!#$3$NJQ49$OJ8;z$K%^%C%A$9$k@55,I=8=$H$=$l$N%U%!%$%kL>$X$NBP1~$N%j%9(B -$B%H$G@)8f$5$l$^$9!#(B - -@vindex smiley-nosey-regexp-alist -@vindex smiley-deformed-regexp-alist -$B%9%^%$%j!<$O=i4|@_Dj$G$OFs$D$NJQ49O"A[%j%9%H$NNc$rDs6!$7$F$$$^$9!#(B -@code{smiley-deformed-regexp-alist} (@samp{:)}, @samp{:(} $B$J$I$K%^%C%A(B -$B$9$k(B) $B$H!"(B@code{smiley-nosey-regexp-alist} (@samp{:-)}, @samp{:-(} $B$J$I(B -$B$K%^%C%A$9$k(B) $B$G$9!#(B - -$B;HMQ$5$l$kO"A[%j%9%H$O(B @code{smiley-regexp-alist} $BJQ?t$G;XDj$5$l$^$9!#$3(B -$B$N=i4|@_DjCM$O(B @code{smiley-deformed-regexp-alist} $B$G$9!#(B - -$B3FMWAG$N:G=i$N9`L\$O%^%C%A$5$;$?$$@55,I=8=$G!"FsHVL\$NMWAG$O3($GCV$-49$((B -$B$?$$%0%k!<%W$K%^%C%A$9$k@55,I=8=!"$=$7$F;0HVL\$NMWAG$OI=<($5$;$?$$%U%!%$(B -$B%k$NL>A0$G$9!#(B - -$B0J2<$NJQ?t$O!"%9%^%$%j!<$,$3$l$i$N%U%!%$%k$rC5$9>l=j!"$"$k$$$O$I$N?'$r;H(B -$B$&$+$H!"$=$NB>$N$b$N$r%+%9%?%^%$%:$7$^$9!#(B - -@table @code -@item smiley-data-directory -@vindex smiley-data-directory -$B%9%^%$%j!<$,4i%U%!%$%k$rC5$9>l=j!#(B - -@item smiley-flesh-color -@vindex smiley-flesh-color -$BH)$N?'!#=i4|@_DjCM$O!"?Ml9g$O!"(B -@code{default-toolbar}, @code{top-toolbar}, @code{bottom-toolbar}, @code{right-toolbar}, @code{left-toolbar} $B$N(B -$B$I$l$+$G$J$/$F$O$J$j$^$;$s!#(B - -@item gnus-group-toolbar -@vindex gnus-group-toolbar -$B%0%k!<%W%P%C%U%!Fb$N%D!<%k%P!l=j$G$9!#(BGnus $B$ODL>o$3$N%G%#%l%/%H%j$r<+F08!=P$7(B -$B$^$9$,!"$b$7I8=`E*$G$J$$%G%#%l%/%H%j!<9=B$$r;}$C$F$$$k>l9g$O!"$3$l$rl9gBEEv$J7k2L$r=P$7$^$9(B --- $B$?$H$(%K%e!<%9%j!<(B -$B%@!<$N2>LL$r$+$V$C$?J8;zNs@Z$j9o$_5!$G@8@.$5$l$?J8;zNs$,:9$7=P$5$l$F$b!"(B -$B$G$9!#(B - -@node Thwarting Email Spam -@section spam $B%a!<%k$NN"$r$+$/(B -@cindex email spam -@cindex spam -@cindex UCE -@cindex unsolicited commercial email - -$B$3$3:G6a$N(B USENET $B$G$O!"@kEA$N%O%2%?%+$I$b$,!"H`$i$N:>5=$d@=IJ$r2!$7IU$1(B -$B$k$?$a$NEE;R%a!<%k%"%I%l%9$rC5$=$&$H$7$F!"5$0c$$$N$h$&$K%K%e!<%9>e$r$&$m(B -$B$D$$$F(B grep $B$7$^$/$C$F$$$^$9!#$3$l$KBP$9$kH?F0$H$7$F!"B?$/$N?M!9(B -$B$,(B @code{From} $B9T$KL50UL#$J%"%I%l%9$rF~$l$O$8$a$k$h$&$K$J$C$F$7$^$$$^$7(B -$B$?!#$3$l$OHs@8;:E*$J$3$H$@$H;d$O;W$$$^$9(B --- $B$"$J$?$,=q$$$?$3$H$KBP$9$k(B -$BJV?.$H$7$F@5Ev$J%a!<%k$rAw$k$3$H$rLLE]$K$5$;!"$^$?C/$,=q$$$?$b$N$J$N$+$r(B -$BJ,$+$j$E$i$/$7$^$9!#$3$s$J=q$-49$($O7k6I$O!"2!$7IU$1@kEA%a!<%k$=$l<+?H$h(B -$B$j$bBg$-$J6<0R$H$J$k$+$b$7$l$^$;$s!#(B - -$B;d$K$H$C$F$N(B spam $B%a!<%k$N:GBg$NLdBj$O!"13$N8}\n") -@end lisp - -$B$=$7$F(B @code{nnmail-split-fancy} $B$K0J2<$NJ,N%5,B'$rF~$l$^(B -$B$9(B (@pxref{Fancy Mail Splitting})$B!#(B - -@lisp -( - ... - (to "larsi@@trym.ifi.uio.no" - (| ("subject" "re:.*" "misc") - ("references" ".*@@.*" "misc") - "spam")) - ... -) -@end lisp - -$B$3$N0UL#$O!"$3$N%"%I%l%9$KFO$$$?A4$F$N%a!<%k$r$^$:5?$$$^$9$,!"(B -@samp{Re:} $B$G;O$^$k(B @code{Subject} $B$,$D$$$F$$$k$+!"(B@code{References} $B%X%C(B -$B%@!<$,$D$$$F$$$l$P$*$=$i$/(B OK $B$@$m$&!"$H$$$&$3$H$G$9!#;D$j$OA4$F(B -@samp{spam} $B%0%k!<%W$K9T$-$^$9!#(B($B$3$N%"%$%G%"$O$*$=$i$/(B Tim Pierce $B;a$K(B -$B$h$k$b$N$G$9!#(B) - -$B$3$l$K2C$($F!"B?$/$N%a!<%k(B spam $B20$O!"$"$J$?$N$H$3$m$N(B @code{smtp} $B%5!<(B -$B%P!<$HD>@\OC$7!"(B@code{To} $B%X%C%@!<$K$"$J$?$N%a!<%k%"%I%l%9$,L@<($5$l$J$$(B -$B$h$&$K$7$^$9!#$J$s$G$=$s$J$3$H$r$9$k$N$+$O$o$+$j$^$;$s$,(B --- $B$*$=$i$/;d(B -$B$?$A$NN"$r$+$/5!9=$NN"$r$+$/$?$a$+$J(B? $B$I$A$i$K$7$F$b!"BP=h$O4JC1$J$3$H$G(B -$B$9(B --- $B$"$J$?08$F$G$J$$$b$N$rA4It(B @samp{spam} $B%0%k!<%W$K$$$l$k$@$1$G$9!#(B -$B$3$l$O$*9%$_J,N%5,B'$N:G8e$K$3$s$JIw$KF~$l$k$3$H$G$G$-$^$9!#(B - -@lisp -( - ... - (to "larsi" "misc") - "spam") -@end lisp - -$B;d$N7P83$G$O!"$3$l$G;veA4$F$,@5$7$$%0%k!<%W$KJ,N`$5$l$^$9!#$^$"!"$=$l(B -$B$G$b$H$-$I$-(B @samp{spam} $B%0%k!<%W$r%A%'%C%/$7$F!"@5$7$$%a!<%k$,$"$k$+%A%'%C(B -$B%/$7$J$/$F$O$$$1$^$;$s$1$I$M!#$b$7$"$J$?$O<+J,$,NI$$%M%C%H%o!<%/;TL1$G$"(B -$B$k$H;W$C$F$$$k$J$i!"$=$l$>$l$N2!$7IU$1@kEA%a!<%k$N4X78Ev6I$K6l>p$rAw$jIU(B -$B$1$k$3$H$5$($b$G$-$^$9(B --- $B2K$J$H$-$K$G$b$M!#(B - -$B$^$?!"$"$J$?$,BU$1p$r$$$&J}$,NI$$$H;W$&$+(B -$B$b$7$l$^$;$s!#$3$l(B -$B$O(B @* @uref{http://stud2.tuwien.ac.at/~e9426626/gnus-junk.html} $B$+(B -$B$i!VL5NA$G!WMxMQ$G$-$^$9!#$[$H$s$I$N(B spam $B%a!<%k$O<+F0E*$KAw$i$l$F$$$k$N(B -$B$G!"$A$g$C$H$@$11'Ch$N%P%i%s%9$,$H$l$k$+$b$7$l$^$;$s!#(B - -$B$3$l$G;d$N$H$3$m$G$OF0$$$F$$$^$9!#$3$l$G$_$s$J$O4JC1$JJ}K!$G;d$KO"Mm$ruBV$G$9!#;d$N0U8+$H$7$F$O!"(B@code{From} $B%X%C%@!<(B -$B$K56B$$7$FB8:_$7$J$$%I%a%$%s$KAw$i$;$k$N$O%-%?%J%$$G$9!#(B - -@node Various Various -@section $B$$$m$$$m$N$$$m$$$m(B -@cindex mode lines -@cindex highlights - -@table @code -@item gnus-home-directory -$BA4$F$N(B gnus $B$N%Q%9JQ?t$O$3$NJQ?t$K$h$C$F=i4|2=$5$l$^$9!#$=$N=i4|@_DjCM(B -$B$O(B @file{~/} $B$G$9!#(B - -@item gnus-directory -@vindex gnus-directory -$B$?$/$5$s$N(B gnus $B3JG<%Q%9JQ?t$O$3$NJQ?t$K$h$C$F=i4|2=$5$l$^$9!#$=$N=i4|@_(B -$BDjCM$O(B @samp{SAVEDIR} $B4D6-JQ?t$NCM$+!"$=$NJQ?t$,@_Dj$5$l$F$$$J$$>l9g(B -$B$O(B @file{~/News/} $B$G$9!#(B - -@file{.gnus.el} $B%U%!%$%k$,FI$^$l$?$H$-$O(B gnus $B$N$[$H$s$I$O$9$G$KFI$_9~$^(B -$B$l$F$$$k$H$$$&$3$H$KCm0U$7$F$/$@$5$$!#$3$l$O$D$^$j!"$3$NJQ?t(B -$B$r(B @file{.gnus.el} $B$NCf$G@_Dj$7$F$b!"$3$NJQ?t$K$h$C$F=i4|2=$5$l$kB>$N%G%#(B -$B%l%/%H%j!e5-$NJQ?t$K$OA4$/4X78$"$j$^$;$s(B --- $B$3$NJQ?t$OA4$F$N(B gnus $B%P%C%U%!!<$N(B -$B%G%#%U%)%k%H%G%#%l%/%H%j!<$r$I$&$9$Y$-$+$r@_Dj$7$^$9!#$b(B -$B$7(B @kbd{C-x C-f} $B$N$h$&$JL?Na$r/$J$$(B -$BNL$@$1$rFI$b$&$HEXNO$7$^$9!#$3$NJQ?t(B ($B=i4|@_DjCM(B 4096) $B$O!"%P%C%/%(%s%I(B -$B$,%X%C%@!<$HK\J8$N4V$N6h@Z$j9T$r8+$D$1$k$^$G$KFI$_9~$b$&$H$9$k@dBP:GBgD9(B -$B$r;XDj$7$^$9!#$3$NJQ?t$,(B @code{nil} $B$G$"$l$P!"FI$_9~$_>e8B$O$"$j$^$;$s!#(B -$B$b$7(B @code{t} $B$G$"$l$P!"%P%C%/%(%s%I$O5-;v$rItJ,ItJ,$GFI$_9~$b$&$H$O$;$:!"(B -$B5-;vA4BN$rFI$_9~$_$^$9!#$3$l$O(B @code{ange-ftp} $B$d(B @code{efs} $B$N$"$k%P!<(B -$B%8%g%s$G0UL#$r$b$A$^$9!#(B - -@item nnheader-head-chop-length -@vindex nnheader-head-chop-length -$B$3$NJQ?t(B ($B=i4|@_DjCM(B 2048) $B$O!"A05-$NA`:n$r9T$C$F$$$k$H$-$K!"$I$l$/$i$$(B -$B$NBg$-$5$NC10L$G3F5-;v$rFI$_9~$`$+$r@_Dj$7$^$9!#(B - -@item nnheader-file-name-translation-alist -@vindex nnheader-file-name-translation-alist -@cindex file names -@cindex invalid characters in file names -@cindex characters in file names -$B$3$l$O%U%!%$%kL>$NJ8;z$r$I$N$h$&$KJQ49$9$k$+$r;XDj$9$kO"A[%j%9%H$G$9!#Nc(B -$B$($P!"$b$7(B @samp{:} $B$,$"$J$?$N%7%9%F%`$G$O%U%!%$%kL>$NJ8;z$H$7$F$O;H$($J(B -$B$$>l9g(B ($B$"$J$?$O(B OS/2 $B%f!<%6$G$9(B)$B!"0J2<$N$h$&$K$9$k$3$H$,$G$-$^$9!#(B - -@lisp -(setq nnheader-file-name-translation-alist - '((?: . ?_))) -@end lisp - -$Be$G$N$3$NJQ?t$N=i4|(B -$B@_DjCM$G$9!#(B - -@item gnus-hidden-properties -@vindex gnus-hidden-properties -$B$3$l$O(B ``$BIT2D;k(B'' $B%F%-%9%H$r1#$9$?$a$K;H$o$l$kB0@-$N%j%9%H$G$9!#$[$H$s$I(B -$B$N%7%9%F%`$G$O=i4|@_DjCM$O(B @code{(invisible t intangible t)} $B$G!"$3$l$O(B -$BIT2D;k%F%-%9%H$r8+$($J$/$7$F?($l$J$/$7$^$9!#(B - -@item gnus-parse-headers-hook -@vindex gnus-parse-headers-hook -$B%X%C%@!<$r2rpJs$r$r3NG'$9$k$H$-$K;H$&!"(B``$B;H$($J$$(B'' $B%0%k!<%WL>$K%^%C%A(B -$B$9$k@55,I=8=$G$9!#4{DjCM$O(B gnus $B$NFbItF0:n(B ($BA*BrJ}K!$H%0%k!<%W$N6-3&$K!"(B -$BDL>o(B @samp{:} $B$r;H$C$F$$$k(B) $B$r$a$A$c$a$A$c$K$7$F$7$^$&$+$b$7$l$J$$!"$$$/(B -$B$D$+$N(B @strong{$BK\Ev$K(B} $B;H$($J$$%0%k!<%WL>$rJa$^$($^$9!#(B - -@sc{imap} $B%f!<%6$O%0%k!<%WL>$K(B @samp{/} $B$r;H$$$?$$$H;W$&$G$7$g$&$1$l$I!#(B -@end table - -@node The End -@chapter $B=*$o$j(B - -$B$O$$!"0J>e$,%^%K%e%"%k$G$9(B---$B$"$J$?$O$b$&<+J,<+?H$N?M@8$rAw$k;v$,$G$-$^(B -$B$9!#O"Mm$r$H$C$F2<$5$$!#$"$J$?$NG-$K:#F|$O!"$H$$$C$F$*$$$F2<$5$$!#(B - -$B$*$*!"(B@strong{$B?@$h(B}---$B$5$h$J$i$rBQ$($k;v$O$G$-$^$;$s!#(B($B$9$9$j5c$-!#(B) - -Ol' Charles Reznikoff $B$O$=$l$rHs>o$K$h$/8=$7$F$$$^$9$N$G!"$3$3$OH`$N$?$a(B -$B$K>y$j$^$9(B: - -@quotation -@strong{Te Deum} - -@sp 1 -Not because of victories @* -I sing,@* -having none,@* -but for the common sunshine,@* -the breeze,@* -the largess of the spring. - -@sp 1 -Not for victory@* -but for the day's work done@* -as well as I was able;@* -not for a seat upon the dais@* -but at the common table.@* -@end quotation - -$B;nLu(B: - -@quotation -@strong{Te Deum} - -@sp 1 -$B>!Mx$7$?$+$i$G$O$J$/(B @* -$B;d$O2N$&(B @* -$B2?$bL5$$$1$l$I(B @* -$B$"$NF|8w$d(B @* -$BB)?a$d(B @* -$B=U$NBg$-$5$N$?$a$K(B @* - -@sp 1 -$B>!Mx$N$?$a$G$O$J$/(B @* -$B0lF|$NO+F/$N$?$a$K(B @* -$B$^$?!"$=$l$rC#@.$G$-$?$3$H$K(B @* -$B9b:B$N>e$N@J$N$?$a$G$O$J$/(B @* -$BIaDL$N%F!<%V%k$N$H$3$m$G(B @* -@end quotation - -@node Appendices -@chapter $BIUO?(B - -@menu -* History:: $B$I$&$d$C$F(B gnus $B$,:#F|$N$h$&$K$J$C$?$+(B -* On Writing Manuals:: $B$J$<$3$l$,=i?4e$=$&$H7h?4$7$^$7(B -$B$?!#(B - -$B$3$NL5Ni$r9T$C$??MJ*$rD4$Y$F$_$?$$$N$J$i!"$"$J$?$N(B ($B$/$=(B!) $B%&%'%V%V%i%&(B -$B%6!<$r(B @uref{http://quimby.gnus.org/} $B$K8~$1$k;v$,$G$-$^$9!#(B -$B$3$l$O?7$7$/$F?h$JHG$N(B gnus $B$NBh0lG[I[>l=j$G!"(BNewsrc $B$r$V$C2u$7$F?M!9$r(B -$B7cE\$5$l$k%5%$%H$H$7$FCN$i$l$F$$$^$9!#(B - -$B:G=i$N%"%k%U%!HG$N3+H/4|4V$K!"?7$7$$(B Gnus $B$O(B ``(ding) Gnus'' $B$H8F$P$l$F(B -$B$$$^$7$?!#(B@dfn{(ding)} $B$O$b$A$m$s!"(B@dfn{ding is not Gnus} $B$NC;=L7A$G!"$3(B -$B$l$OA4$/40A4$J13$G$9$,!"$@$l$,$=$s$J$3$H$r5$$K$9$k$G$7$g$&$+(B? ($B$H$3$m$G!"(B -$B$3$NC;=L7A$N(B ``Gnus'' $B$O$*$=$i$/G_ED$5$s$N0U?^DL$j(B ``$B%K%e!<%9(B'' $B$HH/2;$5(B -$B$l$k$Y$-$G!"$=$&$9$k$H$b$C$HE,@Z$JL>A0$K$J$j$^$9!#$=$&;W$$$^$;$s$+(B?) - -$B$I$A$i$K$;$h!"A4$F$N%(%M%k%.!<$r?7$7$$855$$NNI$$L>A0$rIU$1$k$N$K;H$$2L$?(B -$B$7$?8e!"$=$NL>A0$O(B @emph{$B$"$^$j$K(B} $B855$$,NI$9$.$k$H$$$&;v$K$J$j!"$=$l(B -$B$r(B ``Gnus'' $B$H:F$SL?L>$7$^$7$?!#$G$b!":#2s$OBgJ8;z$H>.J8;z$r:.$<$F$$$^$9!#(B -``Gnus'' $B$H(B ``@sc{gnus}'' $B$G$9!#?7$7$$$b$N(B $B$H(B $B8E$$$b$N!#(B - -@menu -* Gnus Versions:: $B$I$s$J%P!<%8%g%s$N(B Gnus $B$,%j%j!<%9$5$l$F(B - $B$$$k$+(B -* Other Gnus Versions:: $B%j%j!<%9$5$l$F$$$kB>$N%P!<%8%g%s$N(B Gnus -* Why?:: Gnus $B$NL\E*$O2?(B? -* Compatibility:: Gnus $B$O(B @sc{gnus} $B$H$I$l$/$i$$8_49@-$,$"$k(B - $B$N(B? -* Conformity:: Gnus $B$OA4$F$NI8=`$rK~$?$=$&$H$9$k(B -* Emacsen:: Gnus $B$O$$$/$D$+$N8=BeE*$J(B Emacs $B4D6-$G(B ``September Gnus'' (99 $B%j%j!<%9$N8e(B -$B$G(B)) $B$,(B ''Gnus 5.2`` $B$H$$$&L>A0$G%j%j!<%9$5$l$^$7$?(B (40 $B%j%j!<%9(B)$B!#(B - -1996$BG/$N(B 7$B7n(B28$BF|$K(B Red Gnus $B$N:n6H$,;O$^$j!"$=$l$O(B 1997$BG/(B1$B7n(B25$BF|(B -$B$K(B (84 $B%j%j!<%9$N8e$G(B) ``Gnus 5.4'' $B$H$7$F%j%j!<%9$5$l$^$7$?(B (67 $B%j%j!<(B -$B%9(B)$B!#(B - -1997$BG/(B9$B7n(B13$BF|$K!"(BQuassia Gnus $B$,3+;O$5$l!"(B37 $B%j%j!<%9B3$-$^$7$?!#$=$l(B -$B$O(B ``Gnus 5.6'' $B$H$7$F(B 1998$BG/(B3$B7n(B8$BF|$K%j%j!<%9$5$l$^$7$?(B (46 $B%j%j!<%9(B)$B!#(B - -1998$BG/(B8$B7n(B29$BF|$K(B Gnus 5.6 $B$+$i(B Pterodactyl Gnus $B$,@8$^$l!"(B1999$BG/(B12$B7n(B3$BF|(B -$B$K(B (99 $B%j%j!<%9$H(B CVS $B%j%]%8%H%j$G$N:n6H$N8e(B) ``Gnus 5.8'' $B$H$7$F%j%j!<(B -$B%9$5$l$^$7$?!#(B - -2000$BG/(B10$B7n(B26$BF|$K(B Oort Gnus $B$,3+;O$5$l$^$7$?!#(B - -$B$b$7@\F,<-$r;}$C$?HG$N(B Gnus -- ``(ding) Gnus'', ``September Gnus'', -``Red Gnus'', ``Quassia Gnus'', ``Pterodactyl Gnus'', ``Oort Gnus'' --- $B$K=P2q$C$F$b!":.Mp$7$J$$$G$/$@$5$$!#$"$J$?$,62$,$C$F$$$k;v$rCN$i$l$F(B -$B$O$$$1$^$;$s!#8e$m$K2<$,$j$J$5$$!#$f$C$/$j$H!#B>$K2?$r$7$F$b!"Av$C$F$O$$(B -$B$1$^$;$s!#$=$l$,FO$+$/$J$k$^$G!"@E$+$KJb$-5n$j$J$5$$!#E,@Z$K%j%j!<%9$5$l(B -$B$?HG$N(B Gnus $B$r8+$D$1$F!"Be$o$j$K$=$l$K4s$jE:$C$F2<$5$$!#(B - -@node Other Gnus Versions -@subsection $BB>$N(B gnus $B$N%P!<%8%g%s(B -@cindex Semi-gnus - -Lars $B$5$s$,D4@=$7$F%j%j!<%9$7$?(B Gnus $B$K2C$($F!"F|K\$G$O(B Semi-gnus $B$N3+H/(B -$B$,9T$J$o$l$F$$$^$9!#$3$l$O(B SEMI $B$H$$$&(B MIME $B$N5!G=$rN$5$l!"(BT-gnus, Nana-gnus $B$*$h$S(B Chaos $B$N0[$J$C$?7O(B -$BE}$,$"$j$^$9!#$3$l$i$O6/NO$J(B MIME $B$N5!G=$H3F9q8lBP1~$N5!G=$rDs6!$9$k$b$N(B -$B$G!"FC$KF|K\?M$N%f!<%6$K$H$C$FBg;v$J$b$N$G$9!#(B - -@node Why? -@subsection $B$J$<(B? - -Gnus $B$NL\E*$O2?$G$9$+(B? - -$B;d$O!"$"$J$?$N9M$(IU$/;v$rA4$F$G$-$k(B ``$B$9$P$i$7$$(B'' ``$B$+$C$3$$$$(B'' ``$B$$(B -$B$+$9(B'' ``$B$O$d$j$N(B'' $B%K%e!<%9%j!<%@$rDs6!$7$?$$$H;W$$$^$9!#$3$l$O;d$NBg85(B -$B$NF05!$G$9$,!"(BGnus $B$N:n6H$r$7$F$$$k4V$K!"$3$N@$Be$N%K%e!<%9%j!<%@!<$OK\(B -$BEv$K@P4o;~Be$KB0$7$F$$$k$H$$$&;v$,L@$i$+$K$J$j$^$7$?!#%K%e!<%9%j!<%@!<$O!"(B -$B%$%s%?!<%M%C%H$NMD;y4|$+$i$[$H$s$IH/E8$7$F$$$^$;$s$G$7$?!#$b$78=:_$NA}2C(B -$BN($GNL$,A}2C$7$D$E$1$l$P!"A4$F$N8=:_$N%K%e!<%9%j!<%@!<$OA4$/Lr$KN)$?$J$/(B -$B$J$k$G$7$g$&!#0lF|$K(B 1000 $B$d$b$C$H$?$/$5$s$N?7$7$$5-;v$N$"$k%K%e!<%9%0%k!<(B -$B%W$r07$&$K$O$I$&$9$l$PNI$$$N$G$7$g$&(B? $BEj9F$r$9$kI4K|$d$=$l$h$jB?$$?M!9$K(B -$BCY$l$J$$$h$&$KIU$$$F$$$/$K$O$I$&$9$l$PNI$$$N$G$7$g$&(B? - -Gnus $B$O$3$l$i$Nl$H$7$F;H$o$l$FM_$7$$$G$9!#G_ED$5(B -$B$s$N%K%e!<%9%j!<%@!<$r%P%C%/%(%s%I$+$iJ,N%$9$k$H$$$&8-L@$JJ}?K$r3HD%$9$k(B -$B;v$K$h$C$F!"(BGnus $B$O%a!<%k$r7$$$F$$$k$N$G$9!#(B - -$B$*$=$i$/(B Gnus $B$O40@.$9$k;v$O$J$$$N$+$b$7$l$^$;$s!#(B -@kbd{C-u 100 M-x all-hail-emacs} $B$H(B @kbd{C-u 100 M-x all-hail-xemacs} $B$G(B -$B$9!#(B - -@node Compatibility -@subsection $B8_49@-(B - -@cindex compatibility -Gnus $B$O(B @sc{gnus} $B$H40A4$K8_49@-$,$"$k$h$&$K@_7W$5$l$F$$$^$9!#$[$H$s$IA4(B -$B$F$N%-!<%P%$%s%G%#%s%0$O$=$N$^$^;D$C$F$$$^$9!#$b$A$m$s!"B?$/$N%-!<%P%$%s(B -$B%G%#%s%0$,DI2C$5$l$^$7$?$,!"0l$D$+Fs$D$N$"$$$^$$$J>l9g$r=|$$$F!"8E$$%P%$(B -$B%s%G%#%s%0$,JQ99$5$l$?;v$O$"$j$^$;$s!#(B - -$B2f!9$N%b%C%H!<$O(B: -@quotation -@cartouche -@center $B9]E4$N9|AH$_$N6u9b$/!#(B -@end cartouche -@end quotation -$B$G$9!#(B - -$BA4$F$NL?Na$O$=$NL>A0$,JQ$o$C$F$$$^$;$s!#$$$/$D$+$NFbIt4X?t$OL>A0$rJQ$($^(B -$B$7$?!#(B - -@code{gnus-uu} $B%Q%C%1!<%8$O7`E*$KJQ2=$7$F$$$^$9!#(B@xref{Decoding -Articles}. - -$B0l$D$Ne$2$^$9(B)$B!"D>@\O"A[%j%9%H$rJQ99$9$k;v$O0[>o$J7k2L$r$b$?$i$9$G$7$g$&!#(B - -@cindex hilit19 -@cindex highlighting -$B8E$$(B hilit19 $B$N%3!<%I$OA4$/F0:n$7$^$;$s!#$N%3!<(B -$B%I(B) $B$r>C5n$9$k$Y$-$G$7$g$&!#(B@sc{gnus} $B$Ko$K(B} $B$h$/%P%0Js9p$rAw$kJJ$,$"$k$N$G$"$l$P!"$7$P$i$/$9$k$HLr$KN)(B -$B$D(B help $B%P%C%U%!$,$&$k$5$$$H46$8$k$+$b$7$l$^$;$s!#$=$&$G$"$l$P!"$=$l$,I=(B -$B<($5$l$k$N$rHr$1$k$?$a$K!"(B -@code{gnus-bug-create-help-buffer} $B$r(B @code{nil} $B$K@_Dj$7$F2<$5$$!#(B - -@node Conformity -@subsection $B0lCW@-(B - -$B$3$l$O!"M}M3L5$-H?93!"$8$c$J$$$G$9$h!"1|$5$s!#2f!9$OA4$F$NCN$i$l$F$$$kI8(B -$B=`$K1h$C$F$$$^$9!#$b$A$m$s!"2f!9$,;?@.$G$-$J$$I8=`$H(B/$B$b$7$/$O=,47$O=|$-(B -$B$^$9$,!#(B - -@table @strong -@item RFC 822 -@cindex RFC 822 -$B$3$NI8=`$X$NCN$i$l$F$$$k0cH?$O$"$j$^$;$s!#(B - -@item RFC 1036 -@cindex RFC 1036 -$B$3$NI8=`$bCN$i$l$F$$$k0cH?$O$"$j$^$;$s!#(B - -@item Son-of RFC 1036 -@cindex Son-of RFC 1036 -$B$3$l$K$O$$$/$D$+$N0cH?$,$"$j$^$9!#(B - -@table @emph -@item X-Newsreader -@item User-Agent -$B$3$l$O(B ``$B$D$^$i$J$$%X%C%@!<(B'' $B$H9M$($i$l$F$$$^$9$,!";d$O>CHqpJs$G$"(B -$B$k$H8+$J$7$F$$$^$9!#(B@code{tin} $B$H(B @code{Netscape} $B$+$iAw$i$l$F$/$kHs>o$K(B -$BB?$/$NMM<0$K1h$C$F$$$J$$5-;v$r8+$?8e$G!";d$O$=$l$i$r5-;v$rEj9F$9$k$?$a$K(B -$B$O;H$o$J$$J}$,NI$$$H$$$&;v$rCN$j$^$7$?!#$b$7(B @code{X-Newsreader} $B%X%C%@!<(B -$B$,L5$1$l$P;d$O$=$N>pJs$rF@$k;v$O$J$+$C$?$G$7$g$&!#(B -@end table - -@item USEFOR -@cindex USEFOR -USEFOR $B$O!"(BIETF $B$N(B working group $B$,(B Son-of-RFC 1036 $B$K4p$E$$$F!"(B -RFC 1036 $B$N8e7Q$H$7$F=q$$$F$$$k$b$N$G$9!#%K%e!<%95-;v$NMM<0$KBP$7$F!"$$(B -$B$m$$$m$JJQ99$rDs0F$7$?(B draft $B$r:n@.$7$^$7$?!#(BGnus $B%?%o!<(B -$B$O(B draft $B$,(B RFC $B$H$7$FG'$a$i$l$?$H$-$KJQ99$Ne$K=q$+$l$F$$$kJ8>O$K4X$9$k;v$G!"(BGnus $B$,$=$l$rK~$?$7$F$$$J$$$h$&$JF0:n(B -$B$r$7$F$$$k;v$K5$IU$$$?$i!"$?$a$i$o$:$K(B Gnus $B%?%o!<$H2f!9$KCN$i$;$F2<$5$$!#(B - -@node Emacsen -@subsection Emacsen -@cindex Emacsen -@cindex XEmacs -@cindex Mule -@cindex Emacs - -Gnus $B$O0J2<$N$b$N$GF0:n$7$^$9(B: - -@itemize @bullet - -@item -Emacs 19.34 $B$H$=$l0J>e$N(B Mule $B5!G=IU$-!#(B - -@item -XEmacs 21.1.1 $B0J>e$N(B Mule $B5!G=IU$-(B - -@item -Meadow 1.00 $B0J>e!#(B(Mule for Windows $B$G$OF0$-$^$;$s!#(B) - -@end itemize - -$B$3$N(B Gnus $B$NHG$O$3$l$h$j8E$$$I$s$J(B Emacsen $B$G$b40A4$KF0:n$7$J$$$G$7$g$&!#(B -$B>/$J$/$H$b!"?.Mj$G$-$kF0:n$O$7$J$$$G$7$g$&!#8E$$HG$N(B gnus $B$O8E(B -$B$$(B Emacs $B$NHG$G$bF0:n$9$k$G$7$g$&!#$H$O8@$&$b$N$N!"(BT-gnus $B$O%P!<%8%g(B -$B%s(B 21.1.1 $BL$K~$N(B XEmacs, $BNc$($P(B 20.4 $B$G$b;H$($k$+$b$7$l$^$;$s!#>\$7$$$3(B -$B$H$O(B T-gnus $B$NG[I[$K4^$^$l$F$$$k(B README $B%U%!%$%k$rFI$s$G2<$5$$!#(B - -$B$$$m$$$m$J%W%i%C%H%U%)!<%`$N(B Gnus $B$N4V$K$O$$$/$D$+$NGyA3$H$7$?0c$$$,$"$j(B -$B$^$9(B---XEmacs $B$O$b$C$H2hA|5!G=(B ($B%m%4$H%D!<%k%P!<(B) $B$rFCD'$K$7$F$$$^$9(B--$B$7(B -$B$+$7!"$=$NB>$O!"A4$F$N(B Emacsen $B$G$[$H$s$IF1$8$O$:$G$9!#(B - -@node Gnus Development -@subsection Gnus $B$N3+H/(B - -Gnus $B$OFs$D$NCJ3,$N=[4D$G3+H/$5$l$F$$$^$9!#:G=i$NCJ3,(B -$B$O(B @samp{ding@@gnus.org} $B$G$N$?$/$5$s$N5DO@$,$"$j!"$=$3$GJQ99$d?7$7$$5!(B -$BG=$rDs0F$7$^$9!#$3$NCJ3,$O(B @dfn{$B%"%k%U%!(B} $BCJ3,$H8F$P$l$^$9!#$H$$$&$N$O!"(B -$B$3$NCJ3,$G%j%j!<%9$5$l$?(B Gnusae $B$O(B @dfn{$B%"%k%U%!%j%j!<%9(B}$B!"$b$7$/$O(B ($BB>(B -$B$NCDBN$G$O$h$jNI$/;H$o$l$k(B) @dfn{$B%9%J%C%W%7%g%C%H(B} $B$H8F$P$l$k$b$N$@$+$i(B -$B$G$9!#$3$NCJ3,$G$O!"(Bgnus $B$OIT0BDj$G$"$k$H9M$($i$l$F$*$j!"0lHL$NMxMQA0$K$J$C$F$$$^$9!#(B - -50-100 $B$/$i$$$N%j%j!<%9$N8e$G!"(BGnus $B$O(B @dfn{$BE`7k(B} $B$5$l$?$H@k8@$5$l!"%P%0(B -$B=$@5$N$_$,E,MQ$5$l$^$9!#(BGnus $B$O@\F,<-$,l$G=q$/$N$O!"3'$r62$l(B -$B$5$;$k$H$$$&$N$b;ve!";d$OKhF|$H$F$b$?$/$5$s$NAGE($J%P%0%l%]!<%H$r(B -$B$l$,;d$r4n$S$GK~$?$7$^$7$?!#0&Io!#$3$N%j%9%H$N?M!9$O(B -$BG&BQ$rD6$($F;d$N(B ``$B$"$!!"$=$l$O$9$P$i$7$$9M$($@(B $B!"$&$s!";d$O(B -$BBT$?$:$K$=$l$r$9$0%j%j!<%9$7$h$&(B $B!"$=$l$OA4$/F0:n$7$J$$(B $B!"$&$s!";d$O$9$0$K=P$=$&(B $B$$$d!"E;$&!"$=$l$OA4$/F0:n$7$J(B -$B$$$>(B''' $B$H$$$&%j%j!<%9$K4X$9$k$N7A<0$NId9f2=(B/$BI|9f2=$d%P%0=$@5!"?7$7$$5!G=(B -$B$J$I$N$[$s$H$&$KB?$/$N$b$N!#(B - -@item -Per Abrahamsen--custom$B!"%9%3%"!"%O%$%i%$%H$H(B @sc{soup} $B%3!<%I(B ($BB>$NB?$/(B -$B$N;v$H6&$K(B)$B!#(B - -@item -Luis Fernandes---$B%G%6%$%s$H%0%i%U%#%C%/!#(B - -@item -Joe Reiss---$B%9%^%$%j!<$N4i$N:n!#(B - -@item -Wes Hardaker---@file{gnus-picon.el} $B$H(B @dfn{picon} $B$NItJ,$N%^%K%e%"(B -$B%k(B (@pxref{Picons})$B!#(B - -@item -Kim-Minh Kaplan---picon $B%3!<%I$KCV$1$k99$J$k:n6H!#(B - -@item -Brad Miller---@file{gnus-gl.el} $B$H(B Grouplens $B$NItJ,$N%^%K%e%"(B -$B%k(B (@pxref{GroupLens})$B!#(B - -@item -Sudish Joseph---$B?t$(@Z$l$J$$$[$I$N%P%0$N=$@5!#(B - -@item -Ilja Weis---@file{gnus-topic.el}$B!#(B - -@item -Steven L. Baur---$B$?$/$5$s$N$?$/$5$s$N$?$/$5$s$N%P%0$NH/8+$H=$@5!#(B - -@item -Vladimir Alexiev---refcard $B$H%j%U%!%l%s%9$N>.:};R!#(B - -@item -Felix Lee & Jamie Zawinski---$B;d$O(B Felix Lee $B$H(B JWZ $B$N(B XGnus $BG[I[$+$i$$$/(B -$B$D$+$NItJ,$rEp$_$^$7$?!#(B - -@item -Scott Byer---@file{nnfolder.el} $B$N3HD%$H2~D{!#(B - -@item -Peter Mutsaers---$B8E;v5-;v$N%9%3%"%3!<%I!#(B - -@item -Ken Raebburn---POP $B%a!<%k%5%]!<%H!#(B - -@item -Hallvard B Furuseth---$B$$$m$$$m$J>.$5$JJ*$dItJ,!"FC$K(B .newsrc $B%U%!%$%k$r(B -$B07$&ItJ,!#(B - -@item -Brian Edmonds---@file{gnus-bbdbb.el}$B!#(B - -@item -David Moore--@file{nnvirtual.el} $B$N2~D{$HB?$/$NB>$N;v!#(B - -@item -Kevin Davidson---@dfn{ding} $B$NL>A0$r;W$$IU$-$^$7$?!#$G$9$+$i!"H`$r@U$a$F(B -$B2<$5$$!#(B - -@item -Fran,Ag(Bois Pinard---$BB?$/$N!"B?$/$N6=L#?<$/40A4$J%P%0%l%]!<%H$H(B autoconf $B$N(B -$B%5%]!<%H!#(B - -@end itemize - -$B$3$N%^%K%e%"%k(B (Gnus $B1Q8lHG(B) $B$O(B Adrian Aichner $B$H(B Ricardo Nassif, Mark -Borges $B$K$h$C$F9;@5$5$l!"(BJost Krieger $B$K$h$C$F0lItJ,$r9;@5$5$l$^$7$?!#(B - -$B0J2<$N?M!9$OB?$/$N%Q%C%A$HDs0F$G9W8%$7$^$7$?(B: - -Christopher Davis, -Andrew Eskilsson, -Kai Grossjohann, -David K,Ae(Bgedal, -Richard Pieri, -Fabrice Popineau, -Daniel Quinlan, -Jason L. Tibbitts, III, -and -Jack Vinson. - -$B$=$l$H!"0J2<$N?M$K$b%Q%C%A$d$=$NB>$N$b$N$r46$l$N?M!9$,9T$C$?;v$N40A4$J354Q$rF@$k$?$a$K!"(BChangeLog $B$,(B Gnus $B$N%"(B -$B%k%U%!G[I[$K$O4^$^$l$F$$$F!"K-IY$JFI$_J*$rM?$($k$G$7$g$&!#(B(550KB $B$H$$$/(B -$B$i$+(B)$B!#(B - -$B;d$,K:$l$?A4$F$N?M$Ke$N$b$N(B---Gnus 5.4/5.5 -* Quassia Gnus:: 2 $B$+$1$k(B 2 $B$O(B 4$B!"$b$7$/$O(B Gnus 5.6/5.7 -* Pterodactyl Gnus:: $B8^HVL\!"(BP $B$G;O$^$k!"$b$7$/$O(B Gnus 5.8 - /5.9 $B$H$7$FCN$i$l$F$$$k$b$N(B -@end menu - -$B$3$N%j%9%H$O!"$b$A$m$s!"(B@emph{$B$?$$$F$$$N(B} $B=EMW$J?7$7$$5!G=$K4X$9(B -$B$k(B @emph{$BC;$$(B}$B354Q$G$7$+$"$j$^$;$s!#$$$$$(!"K\Ev$O$=$&$G$O$"$j$^$;$s!#$b$C(B -$B$H$b$C$H$?$/$5$s$N$b$N$,$"$j$^$9!#$O$$!"2f!9$OAOB$@-$N40A4$J8z2L$r46$8$F(B -$B$$$k$N$G$9!#(B - -@node ding Gnus -@subsubsection (ding) Gnus - -Gnus 5.0/5.1 $B$N?7$7$$5!G=(B: - -@itemize @bullet - -@item -$BA4$F$N%P%C%U%!$N304Q$O%U%)!<%^%C%H$N$h$&$JJQ?t(B (@pxref{Group Buffer -Format} $B$H(B @pxref{Summary Buffer Format}) $B$K$h$C$F@_Dj$rJQ$($k;v$,$G$-$k(B -$B$h$&$K$J$j$^$7$?!#(B - -@item -$B%m!<%+%k%9%W!<%k$H!"$$$/$D$+$N(B @sc{nntp} $B%5!<%P!<$rF1;~$K;H$&;v$,$G$k$h(B -$B$&$K$J$j$^$7$?(B (@pxref{Select Methods})$B!#(B - -@item -$B%0%k!<%W$r;ve$N%0%k!<%W$K7k9g$G$-$k$h$&$K$J$j$^$7$?(B (@pxref{Virtual -Groups})$B!#(B - -@item -$BB?$/$N0c$C$?%a!<%kMM<0(B (@pxref{Getting Mail}) $B$rFI$a$k$h$&$K$J$j$^$7$?!#(B -$BA4$F$N%a!<%k%P%C%/%(%s%I$OJXMx$J%a!<%k4|8B@Z$l>C5n5!9=$re$2$k$N$K==J,$J%X%C%@!<$r$C$F5-;v$K%9%3%"$rIU$1$k;v$,$G$-$^$9(B (@pxref{Scoring})$B!#(B -$B$"$J$?$N$?$a$K5-;v$r$I$N$h$&$K%9%3%"$rIU$1$k$+$r(B Gnus $B$K8+$D$1$5$;$k;v$b(B -$B$G$-$^$9(B (@pxref{Adaptive Scoring})$B!#(B - -@item -Gnus $B$OIaDL$N(B Emacs $B$NJ}K!$G<+F0J]B8$5$l$k%I%j%V%k%P%C%U%!$rJ];}$7$F$$$^(B -$B$9$N$G!"$"$J$?$N%^%7%s$,Mn$C$3$A$?$H$-$G$b$"$^$j%G!<%?$r<:$o$J$$$G$7$g(B -$B$&(B (@pxref{Auto Save})$B!#(B - -@item -Gnus $B$O:#$d%U%!%$%k(B @file{.emacs} $B$r$0$A$c$0$A$c$K$9$k;v$rHr$1$k$?$a$K@l(B -$BMQ$N5/F0%U%!%$%k(B (@file{.gnus}) $B$r;}$D$h$&$K$J$j$^$7$?!#(B - -@item -$B%0%k!<%W$H5-;v$NN>J}$K%W%m%;%90u$rIU$1$k$3$H$,$G$-!"A4$F$N0u$NIU$$$?9`L\(B -$B$K1i;;$r$9$k;v$,$G$-$^$9(B (@pxref{Process/Prefix})$B!#(B - -@item -$B%0%k!<%W$N0lIt$r(B grep $B$7$F!"$=$N7k2L$+$i%0%k!<%W$r:n$k;v$,$G$-$^(B -$B$9(B (@pxref{Kibozed Groups})$B!#(B - -@item -$B$(!<$H!"A4$F$K$7$?$,$C$F!"%0%k!<%W$N0lMw$r5s$2$k;v$,$G$-$^(B -$B$9(B (@pxref{Listing Groups})$B!#(B - -@item -$B30It%5!<%P!<$r354Q$7$F!"$=$l$i$N%5!<%P!<$N%0%k!<%W$r9XFI$9$k;v$,$G$-$^(B -$B$9(B (@pxref{Browse Foreign Server})$B!#(B - -@item -Gnus $B$O%5!<%P!<$H$NFs$D@\B3$G!"5-;v$rHsF14|$K$H$C$F$/$k;v$,$G$-$^(B -$B$9(B (@pxref{Asynchronous Fetching})$B!#(B - -@item -$B5-;v$r%m!<%+%k$K%-%c%C%7%e$9$k;v$,$G$-$^$9(B (@pxref{Article Caching})$B!#(B - -@item -uudecode $B$N4X?t$,3HD%$5$l!"0lHL2=$5$l$^$7$?(B (@pxref{Decoding Articles})$B!#(B - -@item -$B2a5n$N(B @sc{gnus} $B$N$"$^$jCN$i$l$F$$$J$$5!G=$N(B uuencode $B$5$l$?5-;v$r$^$@(B -$BEj9F$9$k;v$,$G$-$^$9(B (@pxref{Uuencoding and Posting})$B!#(B - -@item -$B?F5-;v(B ($B$HB>$N5-;v(B) $B$Nc$9$k;vL5$/F0:n$9$k$h$&$K(B -$B$J$j$^$7$?(B (@pxref{Finding the Parent})$B!#(B - -@item -Gnus $B$O(B FAQ $B$H%0%k!<%W$N5-=R$r$N30It;2>H$,%\%?%s$K$J$k$h$&$K$J$j$^$7$?(B (@pxref{Article -Buttons})$B!#(B - -@item -Gnus $B$N%&%#%s%I%&$H%U%l!<%`$N@_Dj$G$?$/$5$s$NJQ$J;v$r$G$-$k$h$&$K$J$j$^(B -$B$7$?(B (@pxref{Window Layout})$B!#(B - -@item -$B%-!<%\!<%I$r;H$&Be$o$j$K!"%\%?%s$r%/%j%C%/$G$-$k$h$&$K$J$j$^$7(B -$B$?(B (@pxref{Buttons})$B!#(B - -@end itemize - -@node September Gnus -@subsubsection September Gnus - -@iftex -@iflatex -\gnusfig{-28cm}{0cm}{\epsfig{figure=tmp/september.ps,height=20cm}} -@end iflatex -@end iftex - -Gnus 5.2/5.3 $B$N?7$7$$5!G=(B: - -@itemize @bullet - -@item -$B?7$7$$%a%C%;!<%8:n@.%b!<%I$,;H$o$l$^$9!#(B -@code{mail-mode}, @code{rnews-reply-mode} $B$H(B @code{gnus-msg} $B$NA4$F$N8E(B -$B$$%+%9%?%^%$%:JQ?t$O:#$d5l<0$K$J$j$^$7$?!#(B - -@item -Gnus $B$O(B @dfn{$B$^$P$i(B} $B%9%l%C%I$r:n@.$9$k;v$,$G$-$k$h$&$K$J$j$^$7$?(B---$B%9%l%C(B -$B%I$N<:$o$l$?5-;v$,$"$k$H$3$m$O6u$N@a$GI=8=$5$l$k$h$&$K$J$C$F$$$^(B -$B$9(B (@pxref{Customizing Threading})$B!#(B - -@lisp -(setq gnus-build-sparse-threads 'some) -@end lisp - -@item -$B30$K=P$F$$$/5-;v$OFCJL$JJ]4I%5!<%P!<$KJ]B8$5$l$k$h$&$K$J$j$^$7(B -$B$?(B (@pxref{Archived Messages})$B!#(B - -@item -$B5-;v$,;2>H$5$l$?$H$-$K!"%9%l%C%I$NItJ,:n@.$,5/$3$k$h$&$K$J$j$^$7$?!#(B - -@item -Gnus $B$O(B GroupLens $B$NM=8@$r;H$&;v$,$G$-$k$h$&$K$J$j$^$7(B -$B$?(B (@pxref{GroupLens})$B!#(B - -@item -Picons (personal icons) ($B8D?M%"%$%3%s(B) $B$,(B XEmacs $B$GI=<($G$-$k$h$&$K$J$j(B -$B$^$7$?(B (@pxref{Picons})$B!#(B - -@item -@code{trn} $B$N$h$&$JLZ%P%C%U%!$,I=<($5$l$k$h$&$K$J$j$^$7$?(B (@pxref{Tree -Display})$B!#(B - -@lisp -(setq gnus-use-trees t) -@end lisp - -@item -@code{nn} $B$N$h$&$Jv$_%H%T%C%/3,AX$K%0%k!<%WJ,$1$G$-$k$h$&$K$J$j$^$7(B -$B$?(B (@pxref{Group Topics})$B!#(B - -@lisp -(add-hook 'gnus-group-mode-hook 'gnus-topic-mode) -@end lisp - -@item -Gnus $B$,<:GT%a!<%k$r:FAw$G$-$k$h$&$K$J$j$^$7$?(B (@pxref{Summary Mail -Commands})$B!#(B - -@item -$B%0%k!<%W$,%9%3%"$r;}$D;v$,$G$-$k$h$&$K$J$j!"K,$l$k2s?t$K4p$E$$$FJB$SBX$((B -$B$r$G$-$k$h$&$K$J$j$^$7$?(B (@pxref{Group Score})$B!#(B - -@lisp -(add-hook 'gnus-summary-exit-hook 'gnus-summary-bubble-group) -@end lisp - -@item -$B%0%k!<%W$K%W%m%;%90u$rIU$1$i$l$k$h$&$K$J$j!"%0%k!<%W$N$0%k!<%W$KL?Na$,e$N%0%k!<%W$G%-%c%C%7%e$,$G$-$k$h$&$K$J$j$^$7$?!#(B - -@item -@code{nndoc} $B$OA4$F$N=8G[G[Aw!"%a!<%k%\%C%/%9!"(Brnews $B%K%e!<%90l3g!"(B -ClariNet $BC;<}=8!"$=$7$FA4$F$N$=$NB>$rM}2r$G$-$k$h$&$K$J$j$^$7(B -$B$?(B (@pxref{Document Groups})$B!#(B - -@item -Gnus $B$O(B SOUP $B%Q%1%C%H$r:n@.(B/$BFI$_9~$_$r$9$k$?$a$N?7$7$$%P%C%/%(%s(B -$B%I(B (@code{nnsoup}) $B$r;}$C$F$$$^$9!#(B - -@item -Gnus $B%-%c%C%7%e$,$:$C$HB.$/$J$j$^$7$?!#(B - -@item -$B%0%k!<%W$rB?$/$N4p=`$K=>$C$FJB$SBX$($G$-$k$h$&$K$J$j$^$7(B -$B$?(B (@pxref{Sorting Groups})$B!#(B - -@item -$B%"%I%l%9$N%j%9%H$H4|8B@Z$l>C5n$N;~4V$r@_Dj$9$k?7$7$$%0%k!<%W%Q%i%a!<%?$,(B -$BF3F~$5$l$^$7$?(B (@pxref{Group Parameters})$B!#(B - -@item -$BA4$F$N%U%)!<%^%C%H;XDj$,;H$o$l$k%U%'%$%9$r;XDj$G$-$k$h$&$K$J$j$^$7(B -$B$?(B (@pxref{Formatting Fonts})$B!#(B - -@item -@kbd{M P} $BI{%^%C%W$K%W%m%;%90u$NIU$$$?5-;v$N@_Dj(B/$B:o=|(B/$B@\;HMQ$G$-$k$h$&$K$J$j$^$7(B -$B$?(B (@pxref{Article Keymap})$B!#(B - -@item -$B%U%l!<%`$,(B @code{gnus-buffer-configuration} $B$NItJ,$K$J$k;v$,$G$-$^(B -$B$9(B (@pxref{Window Layout})$B!#(B - -@item -$B%G!<%b%s$N%W%m%;%9$G%a!<%k$r:FAv::$9$k$3$H$,$G$-$k$h$&$K$J$j$^$7(B -$B$?(B (@pxref{Daemons})$B!#(B -@iftex -@iflatex -\marginpar[\mbox{}\hfill\epsfig{figure=tmp/fseptember.ps,height=5cm}]{\epsfig{figure=tmp/fseptember.ps,height=5cm}} -@end iflatex -@end iftex - -@item -Gnus $B$O%9%Q%`$r:,@d$d$7$K$9$k$?$a$K(B NoCeM $B%U%!%$%k$r;H$&;v$,$G$-$k$h$&$K(B -$B$J$j$^$7$?(B (@pxref{NoCeM})$B!#(B - -@lisp -(setq gnus-use-nocem t) -@end lisp - -@item -$B%0%k!<%W$r1J5W2D;k$K$9$k;v$,$G$-$k$h$&$K$J$j$^$7$?(B (@pxref{Listing -Groups})$B!#(B - -@lisp -(setq gnus-permanently-visible-groups "^nnml:") -@end lisp - -@item -$B%+%9%?%^%$%:$r4JC1$K$9$k$?$a$KB?$/$N?7$7$$%U%C%/$,F3F~$5$l$^$7$?!#(B - -@item -Gnus $B$O(B @code{Mail-Copies-To} $B%X%C%@!<$KCm0U$rJ'$&$h$&$K$J$j$^$7$?!#(B - -@item -@code{References} $B%X%C%@!<$r=8$a$k;v$K$h$j%9%l%C%I$r=8$a$k;v$,$G$-$k$h$&(B -$B$K$J$j$^$7$?(B (@pxref{Customizing Threading})$B!#(B - -@lisp -(setq gnus-summary-thread-gathering-function - 'gnus-gather-threads-by-references) -@end lisp - -@item -$B4{FI5-;v$O:FO$KBP$7$F!"5-;v%P%C%U%!$G$N@^$jJV$7$,E,@Z$KF0:n$9$k$h$&$K$J(B -$B$j$^$7$?(B (@pxref{Article Washing})$B!#(B - -@item -$B1#$5$l$?0zMQJ8$O1#$9;v$r@Z$jBX$($k%\%?%s$r2C$(!"$I$N$/$i$$$N0zMQJ8$r1#$9(B -$B$+$r%+%9%?%^%$%:$G$-$k$h$&$K$J$j$^$7$?(B (@pxref{Article Hiding})$B!#(B - -@lisp -(setq gnus-cited-lines-visible 2) -@end lisp - -@item -$BB`6~$J%X%C%@!<$r1#$9;v$,$G$-$^$9(B (@pxref{Article Hiding})$B!#(B - -@item -$B%9%3%"$N=i4|CM$,%a%K%e!<%P!<$+$i@_Dj$G$-$k$h$&$K$J$j$^$7$?!#(B - -@item -$B=P$F9T$/5-;v$N99$J$k9=J8%A%'%C%/$,$G$-$k$h$&$K$J$j$^$7$?!#(B - -@end itemize - -@node Red Gnus -@subsubsection Red Gnus - -Gnus 5.4/5.5 $B$N?7$7$$5!G=(B: - -@iftex -@iflatex -\gnusfig{-5.5cm}{-4cm}{\epsfig{figure=tmp/red.ps,height=20cm}} -@end iflatex -@end iftex - -@itemize @bullet - -@item -@file{nntp.el} $B$OHsF14|$NN.57$G40A4$K2~D{$5$l$^$7$?!#(B - -@item -$B%9%3%"IU$1$O(B @code{and}, @code{or}, @code{not} $B$N$h$&$JO@M}1i;;;R$H!"?F(B -$B$N:FJ}8~$GuBV$,5-;v%b!<%I9T$KI=<($5$l$k$h$&$K$J$j$^$7(B -$B$?(B (@pxref{Misc Article})$B!#(B - -@item -@file{gnus.el} $B$,B?$/$N>.$5$$%U%!%$%k$KJ,3d$5$l$^$7$?!#(B - -@item -Message-ID $B$K4p$E$$$?!"=EJ#5-;v$NM^@)$,$J$5$l$k$h$&$K$J$j$^$7(B -$B$?(B (@pxref{Duplicate Suppression})$B!#(B - -@lisp -(setq gnus-suppress-duplicates t) -@end lisp - -@item -$B$I$N%9%3%"$HE,1~%U%!%$%k$,%[!<%`$N%9%3%"$HE,1~%U%!%$%k$G$"$k$+$r;XDj$9(B -$B$k(B (@pxref{Home Score File}) $B?7$7$$JQ?t$,2C$($i$l$^$7$?!#(B - -@item -@code{nndoc} $B$,4JC1$K3HD%2DG=$K$J$k$h$&$K2~D{$5$l$^$7(B -$B$?(B (@pxref{Document Server Internals})$B!#(B - -@item -$B%0%k!<%W$O?F$N%H%T%C%/$+$i%0%k!<%W%Q%i%a!<%?$r7Q>5$G$-$k$h$&$K$J$j$^$7(B -$B$?(B (@pxref{Topic Parameters})$B!#(B - -@item -$B5-;vJT=8$,2~D{$5$l!"$,$b$C$HCNE*$JJ}K!$GG'<1$5$l$k$h$&$K$J$j$^$7$?(B (@pxref{Article -Signature})$B!#(B - -@item -$B35N,%T%C%/%b!<%I$,$b$C$H(B @code{nn} $B$N$h$&$K$J$j$^$7$?!#9T?t$,I=<($5$l$F!"(B -$BL?Na(B @kbd{.} $B$,5-;v$re(B -$B$G(B) $B$,2C$($i$l$^$7$?(B---@kbd{M-C-d} (@pxref{Really Various Summary -Commands})$B!#(B - -@item -$B%W%m%;%90u$N@_Dj$,(B push $B$H(B pop $B$G$-$k$h$&$K$J$j$^$7$?(B (@pxref{Setting -Process Marks})$B!#(B - -@item -$B?7$7$$%a!<%k$+$i%K%e!<%9$X$N%P%C%/%(%s%I$,(B @sc{nntp} $B%5!<%P!<$,Ej9F$r(B -$B5v2D$7$F$$$J$$>l9g$G$b!"Ej9F$G$-$k$h$&$K$J$j$^$7(B -$B$?(B (@pxref{Mail-To-News Gateways})$B!#(B - -@item -$B%&%'%V8!:w%(%s%8(B -$B%s(B (@dfn{DejaNews}, @dfn{Alta Vista}, @dfn{InReference}) $B$+$i$N8!:w7k2L(B -$B$rFI$`?7$7$$%P%C%/%(%s%I$,2C$($i$l$^$7$?(B (@pxref{Web Searches})$B!#(B - -@item -$BI8=`$NJB$SBX$(4X?t$r;H$C$F%0%k!<%W$NCf$N%H%T%C%/$rJB$SBe$($9$k;v$,$G$-!"(B -$B$=$l$>$l$N%H%T%C%/$,FHN)$7$FJB$SBX$($G$-$k$h$&$K$J$j$^$7(B -$B$?(B (@pxref{Topic Sorting})$B!#(B - -@item -$B%0%k!<%W$N0lItJ,$,FHN)$7$FJB$SBX$($G$-$k$h$&$K$J$j$^$7(B -$B$?(B (@code{Sorting})$B!#(B - -@item -$B%-%c%C%7%e$5$l$?5-;v$,%0%k!<%W$KF~$l$i$l$k$h$&$K$J$j$^$7(B -$B$?(B (@pxref{Summary Generation Commands})$B!#(B -@iftex -@iflatex -\marginpar[\mbox{}\hfill\epsfig{figure=tmp/fred.ps,width=3cm}]{\epsfig{figure=tmp/fred.ps,width=3cm}} -@end iflatex -@end iftex - -@item -$B%9%3%"%U%!%$%k$,$b$C$H?.Mj$G$-$k=gHV$GE,MQ$G$-$k$h$&$K$J$j$^$7(B -$B$?(B (@pxref{Score Variables})$B!#(B - -@item -$B%a!<%k%a%C%;!<%8$,$I$3$K9T$/$+$NJs9p$r:n@.$9$k;v$,$G$-$k$h$&$K$J$j$^$7(B -$B$?(B (@pxref{Splitting Mail})$B!#(B - -@item -$BF~$C$FMh$?%a!<%k$rJ]B8$9$kA0$K$,$i$/$?$rj(B -$B$J$[$I$N?7$7$$L?Na$H%b!<%I$,DI2C$5$l$^$7$?!#40A4$JOC$KIU$$$F(B -$B$O(B @pxref{Gnus Unplugged} $B$r8+$F2<$5$$!#(B - -@item -@code{nndraft} $B%P%C%/%(%s%I$,La$C$F$-$^$7$?$,!"0MA3$H$O0c$&$h$&$KF0:n$9(B -$B$k$h$&$K$J$j$^$7$?!#A4$F$N%a%C%;!<%8%P%C%U%!$O(B @code{nndraft} $B%0%k!<%W$N(B -$B5-;v$G$b$"$j!"$=$l$O<+F0E*$K:n@.$5$l$^$9!#(B - -@item -@code{gnus-alter-header-function} $B$,%X%C%@!<$NCM$rJQ$($k$?$a$K;H$o$l$k$h(B -$B$&$K$J$j$^$7$?!#(B - -@item -@code{gnus-summary-goto-article} $B$,(B Message-ID $B$rO$r>C5n$9$k$?$a$N?7$7$$%a%C%;!<%8L?(B -$BNa$,$"$j$^$9(B: @kbd{C-c C-v}$B!#(B - -@item -@kbd{C-u C-c C-c} $B$K$h$C$F(B @code{nnvirtual} $B%0%k!<%W$r@8@.$7$F$$$k%0%k!<(B -$B%W$KEj9F$G$-$k$h$&$K$J$j$^$7$?!#(B - -@item -@code{nntp-rlogin-program}---$B%+%9%?%^%$%:$r4JC1$K$9$k$?$a$N?7$7$$JQ?t$G(B -$B$9!#(B - -@item -@code{gnus-article-edit-mode} $B$N(B @code{C-u C-c C-c} $B$O5-;v%P%C%U%!$N:F%O(B -$B%$%i%$%H$r6X;_$9$k$h$&$K$J$j$^$7$?!#(B - -@item -@code{gnus-boring-article-headers} $B$K?7$7$$MWAG$,$"$j$^$9(B--- -@code{long-to}$B!#(B - -@item -@kbd{M-i} $B%7%s%\%k@\F,0z?tL?Na$,$"$j$^$9!#>\:Y$O(B "Symbolic Prefixes" $B$N(B -$BItJ,$r8+$F2<$5$$!#(B - -@item -$B35N,%P%C%U%!$N(B @kbd{L} $B$H(B @kbd{I} $B$O%U%!%$%k(B "all.SCORE" $B$K%9%3%"K!B'$r(B -$B2C$($k$?$a$K%7%s%\%k@\F,0z?t(B @kbd{a} $B$r$5$J$1$l$P$J$j$^$;$s!#(B - -@item -$BEj9FC$7$O8=:_$NA*BrJ}K!$r;H$&$h$&$K$J$j$^$7$?!#%7%s%\%k@\F,(B -$B<-(B @kbd{a} $B$OIaDL$NEj9FJ}K!$r6/@)$7$^$9!#(B - -@item -M******** sm*rtq**t*s $B$rE,@Z$JJ8>O$KK]0F$9$k?7$7$$L?Na$,$"$j$^$9(B--- -@kbd{W d}$B!#(B - -@item -@code{nntp} $B$N$h$j4JC1$J%G%P%C%0$N$?$a$K!"(B -@code{nntp-record-commands} $B$r(B @code{nil} $B$G$J$$CM$K@_Dj$9$k;v$,$G$-$^$9!#(B - -@item -@code{nntp} $B$O(B @file{~/.authinfo} $B$r;H$&$h$&$K$J$j!"$3$l(B -$B$O(B @file{.netrc} $B$N$h$&$J%U%!%$%k$G!"$I$3$G$I$N$h$&(B -$B$K(B @sc{authinfo} $B$r(B @sc{nntp} $B%5!<%P!<$KAw$k$+$r@)8f$9$k$?$a$N$b$N$G$9!#(B - -@item -$B35N,%P%C%U%!$N%0%k!<%W%Q%i%a!<%?$rJT=8$9$k$?$a$NL?Na$,2C$($i$l$^$7$?!#(B - -@item -$B%a!<%k$,$I$3$KJ,3d$5$l$?$+$NMzNr$r;HMQ2DG=$K$J$j$^$7$?!#(B - -@item -$B?7$7$$5-;vF|IUL?Na$,2C$($i$l$^$7$?(B---@code{article-date-iso8601}$B!#(B - -@item -@code{gnus-score-thread-simplify} $B$r@_Dj$9$k;v$K$h$j%9%l%C%I$r:n@.$7$F$$(B -$B$k$H$-$OI=Bj$,C1=c2=$5$l$k$h$&$K$J$j$^$7$?!#(B - -@item -$B%a%C%;!<%8$G0zMQ$r$9$k$?$a$N?7$7$$4X?t$,2C$($i$l$^$7$?(B--- -@code{message-cite-original-without-signature}$B!#(B - -@item -@code{article-strip-all-blank-lines}---$B?7$7$$5-;vL?Na$G$9!#(B - -@item -$B5-;v$N=*$o$j$^$G$r@Z$k?7$7$$%a%C%;!<%8L?Na$,2C$($i$l$^$7$?!#(B - -@item -$BJQ?t(B @code{gnus-adaptive-word-minimum} $B$r;H$&;v$K$h$j:G>.8BE,1~%9%3%"$r(B -$B;XDj$9$k;v$,$G$-$^$9!#(B - -@item -$BL?Na(B @code{gnus-start-date-timer} $B$K$h$j(B ``$B2a<:F|IU(B'' $B5-;v%X%C%@!<$,7QB3(B -$BE*$K99?7$5$l$k$h$&$K$J$j$^$7$?!#(B - -@item -$B%&%'%V(B listserv $B%"!<%+%$%V$,(B @code{nnlistserv} $B%P%C%/%(%s%I$K$h$jFI$`;v(B -$B$,$G$-$k$h$&$K$J$j$^$7$?!#(B - -@item -$B8E$$(B dejanews $B%"!<%+%$%V$,(B @code{nnweb} $B$+$iFI$`;v$,$G$-$k$h$&$K$J$j$^$7(B -$B$?!#(B - -@end itemize - -@node Pterodactyl Gnus -@subsubsection Pterodactyl Gnus - -Gnus 5.8 $B$N?7$7$$5!G=(B: - -@itemize @bullet - -@item $B%a!<%k$r\:Y$K$D$$$F$O%^%K%e(B -$B%"%k$r8+$F2<$5$$!#FC$K!"(Bprocmail $B$G\$7$$>pJs$O(B info $B$N(B Select Methods -> Getting Mail -> Mail -Sources $B$GF@$k$3$H$,$G$-$^$9!#(B - -@item Gnus $B$O(B MIME $B$KBP1~$7$?%j!<%@!<$K$J$j$^$7$?!#$3$l$O(B Gnus $B$NB?$/$N(B -$BItJ,$K1F6A$7$F$$$F!"$?$/$5$s$N?7$7$$%3%^%s%I$,DI2C$5$l$F$$$^$9!#>\:Y$O%^(B -$B%K%e%"%k$r;2>H$7$F2<$5$$!#(B($BLuCm(B: T-gnus $B$O(B SEMI $B$*$h$S(B FLIM $B$N=t5!G=$K4p(B -$B$E$$$F$$$^$9!#(B) - -@item Gnus $B$O$^$?3F9q8lBP1~$K$J$j$^$7$?!#$3$3$G$OMWLs$G$-$J$$$/$i$$(B -$B$K(B Gnus $B$NB?$/$NItJ,$K1F6A$7$F$$$F!"?7$7$$$?$/$5$s$NJQ?t$,DI2C$5$l$F$$$^(B -$B$9!#(B($BLuCm(B: T-gnus $B$O(B SEMI $B$*$h$S(B FLIM $B$N=t5!G=$K4p$E$$$F$$$^$9!#(B) - -@item @code{gnus-auto-select-first} $B$,4X?t$G$"$C$F$b$h$/$J$j$^$7$?!#(B - -@item Summary $B%P%C%U%!$H(B NOV $B%U%!%$%k$K4^$a$kDI2C$N%X%C%@!<$r!"%f!<%6$,(B -$B7h$a$k$3$H$,$G$-$k$h$&$K$J$j$^$7$?!#(B - -@item @code{gnus-article-display-hook} $B$,:o=|$5$l$^$7$?!#Be$o$j(B -$B$K(B @code{gnus-treat-} $B$G;O$^$k$?$/$5$s$NJQ?t$,DI2C$5$l$^$7$?!#(B - -@item Gnus posting styles $B$,:F$S2~Au$5$l$^$7$?!#8=:_$OHyL/$K0c$&5,B'$GF0(B -$B:n$7$^$9!#(B - -@item $B?7$7$$%&%'%V$K4p$E$$$?%P%C%/%(%s%I$,DI2C$5$l$^$7$?!#(B -@code{nnslashdot}, @code{nnwarchive} $B$*$h$S(B @code{nnultimate} $B$G$9!#(B -nnweb $B$O:F$S2~:n$5$l!">o$KJQ2=$9$k9=@.$rB3$1$^$9!#(B - -@item Gnus $B$O(B @code{nnimap} $B$K$h$C$F(B IMAP $B%a!<%k$rFI$`$3$H$,$G$-$^$9!#(B - -@end itemize - -@iftex - -@page -@node History -@section $B%^%K%e%"%k(B -@cindex colophon -@cindex manual - -$B$3$N%^%K%e%"%k$O(B TeXinfo $B%U%!%$%k$+$i:n@.$5$l!"$=$l$+(B -$B$i(B @code{texi2dvi} -@iflatex -$B$b$7$/$O!"(BLars $B$5$s$N:n$i$l$?(B Texinfo to \LaTeX $BJQ49$rDL$j!"$=$l$+$i!"(B -@code{latex} $B$H(B @code{dvips} -@end iflatex -$B$r/$7(B -$B$@$H$$$&$3$H$G$9!#(Bgnus $B$N40A4$KA4$F$N$3$H$,@bL@$5$l$F$$$^$9$,!"C5$7$F$$(B -$B$k>l=j$G$O$J$$$H$$$&$3$H$,$h$/$"$j$^$9!#$3$l$O%j%U%!%l%s%9%^%K%e%"%k$G$"(B -$B$j!"(Bgnus $B$r;O$a$k$?$a$NP$o$l$k$G$7$g$&!#$"$J$?$NCN$i$J$$$H$3$m$G!#(B - -@item $B%a!<%k(B (mail) -@cindex mail -$B$"$J$?$K8D?ME*$KG[Aw$5$l$k$b$NA4$F$,%a!<%k$G$9!#$$$/$D$+$N%K%e!<%9(B/$B%a!<(B -$B%k%j!<%@!<(B (gnus $B$N$h$&$J(B) $B$O%a!<%k$H%K%e!<%9$N0c$$$r$\$d$1$5$;$^$9$,!"(B -$B$=$3$K$O0c$$$OB8:_$7$^$9!#%a!<%k$O;dE*$G$9!#%K%e!<%9$O8xE*$G$9!#%a!<%k$r(B -$BAw?.$9$k;v$OEj9F$G$O$J$/!"JV?.$O%U%)%m!<%"%C%W$G$O$"$j$^$;$s!#(B - -@item $BJV?.(B (reply) -@cindex reply -$B$"$J$?$,FI$s$G$$$k$b$N$r=q$$$??M$K%a!<%k$rAw$k;v$G$9!#(B - -@item $B%U%)%m!<%"%C%W(B (follow up) -@cindex follow up -$B$"$J$?$,FI$s$G$$$k5-;v$K1~Ez$7$F8=:_$N%K%e!<%9%0%k!<%W$K5-;v$rEj9F$9$k;v(B -$B$G$9!#(B - -@item $B%P%C%/%(%s%I(B (backend) -@cindex backend -Gnus $B$O%K%e!<%9$H%a!<%k$NN>J}$N$$$m$$$m$J%P%C%/%(%s%I$,M?$($?5-;v$rF@$^(B -$B$9!#(BGnus $B$O!"$$$o$f$k2<$K2#$?$o$C$F$$$k%a%G%#%"$r07$&;v$O$7$^$;$s(B---$B$3$l(B -$B$O$9$Y$F%P%C%/%(%s%I$K$h$C$F$J$5$l$^$9!#(B - -@item $B4pK\(B (native) -@cindex native -Gnus $B$O$$$D$b0l$D$NJ}K!(B ($B$H%P%C%/%(%s%I(B) $B$r%K%e!<%9$rF@$k$?$a$N(B @dfn{$B4p(B -$BK\(B}$B!"$b$7$/$O=i4|@_Dj(B $B$H$7$F;H$$$^$9!#(B - -@item $B30It(B (foreign) -@cindex foreign -$BF1;~$KG$0U$N?t$N30It%0%k!<%W$r3hF0>uBV$K$9$k$3$H$b$G$-$^$9!#$3$l$i$O%K%e!<(B -$B%9$reIt$G!"G'>Z>pJs(B ($BEy(B) $B$,F~$l$i$l$F$$$k$H$3$m$G$9!#(B - -@item $BK\BN(B (body) -@cindex body -$B5-;v$N;D$j$NItJ,$G$9!#%X%C%I$G$J$$$b$N$O$9$Y$FK\BN$G$9!#(B - -@item $B%X%C%@!<(B (header) -@cindex header -$B5-;v$N%X%C%I$+$i$N9T$G$9!#(B - -@item $B%X%C%@!<72(B (headers) -@cindex headers -$B$=$N$h$&$J9T$N=89g$b$7$/$O!"%X%C%I$N=89g$G$9!#$b$7$/$O!"(B@sc{nov} $B9T$N=8(B -$B9g$G$9!#(B - -@item @sc{nov} -@cindex nov -Gnus $B$,%0%k!<%W$KF~$k$H!"%0%k!<%W$NA4$F$NL$FI5-;v$N%X%C%@!<$r%P%C%/%(%s(B -$B%I$K5a$a$^$9!#$[$H$s$I$N%5!<%P!<$O(B News OverView $BMM<0$,;HMQ2DG=$G!"$=$l(B -$B$OIaDL$N(B @sc{head} $BMM<0$h$j$b$C$H$l$N%0%k!<%W$O2?$i$+$N(B @dfn{$B%l%Y%k(B} $B$+B>$N$b$N(B (1-9) $B$G9XFI$5$l$F(B -$B$$$^$9!#Dc$$%l%Y%k$N$b$N$O9b$$%l%Y%k$N$b$N$h$j(B ``$B$h$j(B'' $B9XFI$5$l$F$$$^$9!#(B -$B%s%S(B}; 9 $B$O(B @dfn{$B@Z$i$l$?(B} $B$H8+$J$5$l$^$9!#%0%k!<%W$r%j(B -$B%9%H$7$?$j!"?7$7$$%0%k!<%W$rAv::$7$?$j$9$kL?Na$O$9$Y$F?tCM@\F,0z?t(B -$B$r(B @dfn{$BF0:n%l%Y%k(B} $B$H$7$F;H$$$^$9!#(B - -@item $B@Z$i$l$?%0%k!<%W(B (killed groups) -@cindex killed groups -$B@Z$i$l$?%0%k!<%W$N>pJs$OC_@Q$5$l$?$j99?7$5$l$?$j$7$^$;$s$N$G!"@Z$i$l$?%0(B -$B%k!<%W$r9XFI$5$l$?%0%k!<%W$h$j4JC1$K07$($k$h$&$K$J$j$^$9!#(B - -@item $B%>%s%S%0%k!<%W(B (zombie groups) -@cindex zombie groups -$B$[$H$s$I@Z$i$l$?%0%k!<%W$HF1$8$G!"$=$l$h$j>/$7;`$s$G$$$k$@$1$G$9!#(B - -@item $B%"%/%F%#%V%U%!%$%k(B (active file) -@cindex active file -$B%K%e!<%9%5!<%P!<$O$I$N5-;v$r1?$s$G$$$k$+!"$I$N%0%k!<%W$,B8:_$9$k$+$r5-O?(B -$B$7$F$*$+$J$1$l$P$J$j$^$;$s!#A4$F$N$3$N>pJs$O8=>u%U%!%$%k$KC_@Q$5$l!"$=$l(B -$B$O$"$J$?$,A[A|$9$k$h$&$KHf3SE*Bg$-$$$G$9!#(B - -@item $B56%0%k!<%W(B (bogus groups) -@cindex bogus groups -$B%U%!%$%k(B @file{.newsrc} $B$KB8:_$9$k%0%k!<%W$G$9$,!"%5!<%P!<$KCN$i$l$F$$$J(B -$B$$%0%k!<%W(B ($B$9$J$o$A!"$=$l$O%"%/%F%#%V%U%!%$%k$K$"$j$^$;$s(B) $B$O(B @emph{$B56(B -$B%0%k!<%W(B} $B$G$9!#$3$l$O!"$*$=$i$/(B ($B$9$G$K(B) $B$=$N%0%k!<%W$OB8:_$7$F$$$J$$$N(B -$B$G$7$g$&!#(B - -@item $B3hF02=(B (activating) -@cindex activating groups -$B%5!<%P!<$K%0%k!<%W$N>pJs$r?R$M!"L$FI5-;v$N?t$r1i;;$9$k9T0Y$O(B @dfn{$B%0%k!<(B -$B%W$r3hF02=$9$k(B} $B$H8F$P$l$F$$$^$9!#Hs3hF0%0%k!<%W$O%0%k!<%W%P%C%U%!(B -$B$K(B @samp{*} $B$H$H$b$K0lMwI=<($5$l$^$9!#(B - -@item $B%5!<%P!<(B (server) -@cindex server -$B@\B3$7$F!"%K%e!<%9(B ($B$b$7$/$O%a!<%k(B) $B$re$N%5!<%P!<@_Dj$r;XDj$9$k9=B$$G$9!#(B - -@item $B;ve$N%5!<%P!<(B (virtual server) -@cindex virtual server -$BL?L>$5$l$?A*BrJ}K!$G$9!#A*BrJ}K!$O(B ($BJ*M}E*(B) $B%5!<%P!<$K@\B3$9$k$?$a$KI,MW(B -$B$JJ}K!$rDj5A$9$k$?$a!"J*;v$rA4BN$H$7$Fe$N%5!<%P!<$K$J$j$^(B -$B$9!#(B - -@item $B@vBu(B (washing) -@cindex washing -$B%P%C%U%!$r;}$C$F$-$F!"2?$i$+$N/$J$+$l(B) $B85$N$b$N$h$j$b$h$j$-$l$$$G4n$P$7$$$b$N$K$J$k$G$7$g$&!#(B - -@item $B0l;~%0%k!<%W(B (ephemeral groups) -@cindex ephemeral groups -$B$?$$$F$$$N%0%k!<%W$O$I$N5-;v$rFI$s$@$+$N%G!<%?$rC_@Q$7$^$9!#(B -@dfn{$B0l;~(B} $B%0%k!<%W$O%G!<%?$,N/$a$i$l$J$$%0%k!<%W$G$9(B---$B%0%k!<%W$r=P$k$H!"(B -$B$=$l$OE76u$K>C$(5n$j$^$9!#(B - -@item $B8GDj%0%k!<%W(B (solid groups) -@cindex solid groups -$B$3$l$O0l;~%0%k!<%W$NH?BP$G$9!#%0%k!<%W%P%C%U%!$K5s$2$i$l$F$$$kA4$F$N%0%k!<(B -$B%W$O8GDj%0%k!<%W$G$9!#(B - -@item $B$^$P$i5-;v(B (sparse articles) -@cindex sparse articles -@code{gnus-build-sparse-threads} $B$N5!G=$r;HMQ$7$F$$$k$H$-$O!"35N,%P%C%U%!(B -$B$K5-;v$NF~$l>l=j$,I=<($5$l$^$9!#(B - -@item $B%9%l%C%I:n$j(B (threading) -@cindex threading -$B$=$l$,1~Ez$7$?5-;v$ND>8e$K$=$N5-;v$X$N1~Ez$rCV$/$3$H$G$9(B---$B3,AXE*N.57$G!#(B - -@item $B:,(B (root) -@cindex root -@cindex thread root -$B%9%l%C%I$N:G=i$N5-;v$,:,$G$9!#$=$l$O%9%l%C%I$NA4$F$N5-;v$NAD@h$G$9!#(B - -@item $B?F(B (parent) -@cindex parent -$B1~Ez$N$"$k5-;v$G$9!#(B - -@item $B;R(B (child) -@cindex child -$B0c$C$?5-;v(B---$B$=$N?F(B $B$K1~Ez$9$k5-;v$G$9!#(B - -@item $B=8G[(B (digest) -@cindex digest -$BJ#?t$N%a%C%;!<%8$r0l$D$N%U%!%$%k$K=8$a$?$b$N$G$9!#$b$C$H$bIaDL$N=8G[MM<0(B -$B$O(B RFC1153 $B$G;XDj$5$l$F$$$^$9!#(B -@end table - -@page -@node Customization -@section $B%+%9%?%^%$%:(B -@cindex gerenal customization - -$BA4$F$NJQ?t$O$3$N%^%K%e%"%k$N$I$3$+JL$N$H$3$m$GE,@Z$K@bL@$5$l$F$$$^$9!#$3(B -$B$NItJ,$OHs>o$KNI$/$"$k>u67$G$I$N$h$&$K(B gnus $B$r%+%9%?%^%$%:$9$l$PNI$$$+$N(B -$BAm9gE,;X<(@h$rM?$($k$?$a$K9M0F$5$l$F$$$^$9!#(B - -@menu -* Slow/Expensive Connection:: $B%m!<%+%k$N(B Emacs $B$rN)$A>e$2$F!"B>$N$H$3(B - $B$m$+$i%K%e!<%9$rF@$k;v$,$G$-$k!#(B -* Slow Terminal Connection:: $B1s3V(B Emacs $B$ro$K:Y$$@~$N8~$3$&$N%^%7(B -$B%s$+$i%K%e!<%9$ro$KBg(B -$B$-$/$J$C$F$$$^$9!#$=$l$K2C$($F!"(Bgnus $B$,FMA3$H$K$+$/8=>u%U%!%$%k$ro$K35N,%P%C%U%!$rCf?4:F@_Dj$r$9$k$3$H$r6X;_$9$k$?$a$K$3$l(B -$B$r(B @code{nil} $B$K@_Dj$7$F2<$5$$!#$3$l$,(B @code{vertical} $B$G$"$k$H!"?bD>J}(B -$B8~$N(B (vertical) $BCf?4:F@_Dj$N$_$r$7$^$9!#(B@code{nil} $B$G(B -$B$b(B @code{vertical} $B$G$bL5$1$l$P!"?eJ?J}8~$H?bD>J}8~$NN>J}$NCf?4:F@_Dj$r(B -$B9T$$$^$9!#(B - -@item gnus-visible-headers -$B5-;v$K4^$^$l$k%X%C%@!<$r:G>.8B$K8:$i$7$^$9!#.$5$/$9$k;v$,$G$-$^(B -$B$9!#$3$l$OAm$8$F$=$s$J$K8:$i$7$^$;$s!#$3$l$O!"5-;v$r$I$C$A$K$7$mFI$_$?$/(B -$B$J$$$H$$$&;v$r7hDj$9$kA0$K!">/$7$NItJ,$7$+8+$kI,MW$,L5$$$H$$$&;v$G$9!#(B - -@item gnus-threada-hide-subtree -$B$3$l$,(B @code{nil} $B$G$J$1$l$P!"A4$F$N35N,%P%C%U%!$N%9%l%C%I$O=i$a$K1#$5$l(B -$B$^$9!#(B - -@item gnus-updated-mode-lines -$B$3$l$,(B @code{nil} $B$G$"$k$H!"(Bgnus $B$O%P%C%U%!$N%b!<%I9T$K>pJs$rF~$l$^$;$s(B -$B$N$G!";~4V$r@aLs$G$-$k$G$7$g$&!#(B -@end table - -@node Little Disk Space -@subsection $B>/$7$N%G%#%9%/MFNL(B -@cindex disk space - -$B5/F0%U%!%$%k$OHf3SE*Bg$-$/$J$j$^$9$N$G!"6u$-MFNL$,>/$J$/$J$C$F$-$F$$$k$H(B -$B$-$O$=$NBg$-$5$r>/$7>.$5$/$7$?$$$H;W$&$G$7$g$&!#(B - -@table @code -@item gnus-save-newsrc-file -$B$3$l$,(B @code{nil} $B$G$"$k$H!"(Bgnus $B$O7h$7$F(B @file{.newsrc} $B$rJ]B8$7$^$;(B -$B$s(B---$B$=$l$O(B @file{.newsrc.eld} $B$N$_$rJ]B8$7$^$9!#$3$l$O!"(Bgnus $B$NB>$N%K%e!<(B -$B%9%j!<%@!<$r;H$($J$$$H$$$&;v$G$9!#$3$NJQ?t$O=i4|@_Dj$G(B @code{t} $B$G$9!#(B - -@item gnus-read-newsrc-file -$B$3$l$,(B @code{nil} $B$G$"$l$P!"(Bgnus $B$O(B @file{.newsrc} $B$r7h$7$FFI$_$^$;(B -$B$s(B ---@file{.newsrc.eld} $B$@$1$rFI$_$^$9!#$3$l$O!"(Bgnus $B0J30$N%K%e!<%9%j!<(B -$B%@!<$r;H$($J$/$J$k!"$H$$$&$3$H$G$9!#$3$NJQ?t$O=i4|@_Dj$G$O(B @code{t} $B$G$9!#(B - -@item gnus-save-killed-list -$B$3$l$,(B @code{nil} $B$G$"$k$H!"(Bgnus $B$O;`$s$@%0%k!<%W$N%j%9%H$rJ]B8$7$^$;$s!#(B -$B$3$NJQ?t$r(B @code{nil} $B$K@_Dj$7$?$H$-$O!"(B -@code{gnus-check-new-newsgroups} $B$r(B @code{ask-server} $B$K!"(B -@code{gnus-check-bogus-newsgroups} $B$r(B @code{nil} $B$K@_Dj$9$k$Y$-$G$7$g$&!#(B -$B$3$NJQ?t$O=i4|@_Dj$G(B @code{t} $B$G$9!#(B -@end table - -@node Slow Machine -@subsection $BCY$$5!3#(B -@cindex slow machine - -$B$b$7CY$$5!3#$r;}$C$F$$$k$+!"$b$7$/$OC1$KK\Ev$KG&BQNO$,$J$$;~$O!"(Bgnus $B$N(B -$B/$7$"$j$^$9!#(B - -$B5/F0$rB.$/$9$k$?$a(B -$B$K(B @code{gnus-check-new-newsgroups} $B$H(B @code{gnus-check-bogus-newsgroups} $B$r(B @code{nil} $B$K(B -$B@_Dj$7$F2<$5$$!#35N,%P%C%U%!$KF~$k;v$HH4$1$k;v$rB.$/$9$k$?$a$K!"(B -@code{gnus-show-threads} $B$H(B @code{gnus-use-cross-reference} $B$H(B @code{gnus-nov-is-evil} $B$r(B @code{nil} $B$K(B -$B@_Dj$7$F2<$5$$!#(B - -@page -@node Troubleshooting -@section $BLdBj2r7h(B -@cindex troubleshooting - -Gnus $B$OH"$+$i=P$7$F$9$0$K(B @emph{$BHs>o$K(B} $B$h$/F0:n$7$^$9(B---$B2?$bLdBj$N5/$3(B -$B$k$3$H$OA[A|$G$-$^$;$s!"K\Ev$K!#(B - -$B%*%C%[%s!#(B - -@enumerate - -@item -$B$"$J$?$N%3%s%T%e!<%?$N%9%$%C%A$,F~$C$F$$$k;v$r3N$+$a$F2<$5$$!#(B - -@item -$BK\Ev$K8=9T$N(B gnus $BHG$rFI$_9~$s$G$$$k;v$r3NG'$7$F2<$5$$!#:#$^(B -$B$G(B @sc{gnus} $B$rC$7$F2<$5$$!#(B - -@item -FAQ $B$H(B how-to $B$rFI$`$?$a$K%X%k%W%0%k!<%W(B ($B%0%k!<%W%P%C%U%!(B -$B$G(B @kbd{G h}) $B$rFI$s$G2<$5$$!#(B - -@item -@vindex max-lisp-eval-depth -Gnus $B$OB?$/$NB?$/$N:F5"9=B$$GF0:n$7!"2?$i$+$N6KC<$J(B ($B$=$7$FHs>o$K$^$l(B -$B$J(B) $B;vNc$G$O!"(Bgnus $B$O:F5"$r(B ``$B$"$^$j$K?<$/(B'' $B9_$j$9$.$F!"(BEmacs $B$,$"$J$?(B -$B$K%S!<%W2;$rLD$i$9;v$,$"$j$^$9!#$b$7$3$l$,5/$3$C$?$J$i!"(B -@code{max-lisp-eval-depth} $B$r(B 500 $B$+$=$l$/$i$$$NCM$K@_Dj$7$F2<$5$$!#(B -@end enumerate - -$B$b$7B>$NA4$F$,<:GT$7$?$J$i!"%P%0$H$7$FLdBj$rJs9p$7$F2<$5$$!#(B - -@cindex bugs -@cindex reporting bugs - -@kindex M-x gnus-bug -@findex gnus-bug -$B$b$7(B gnus $B$N%P%0$r8+$D$1$?$J$i!"L?Na(B @kbd{M-x gnus-bug} $B$K$h$C$F$=$l$rJs(B -$B9p$9$k;v$,$G$-$^$9!#(B -@kbd{M-x set-variable RET debug-on-error RET t RET} $B$H$7$F!"$=$l$+$i;d$K(B -$B%P%C%/%H%l!<%9$rAw$C$F2<$5$$!#;d$O%P%0$r=$@5$7$h$&$H$7$^$9$,!"$"$J$?$,%P(B -$B%0$r:F8=$5$;$kJ}K!$r@53N$K=q$$$F$/$l$?$H$-$N$_!"$=$l$r=$@5$9$k;v$,$G$-$^(B -$B$9!#(B - -$B%P%0Js9p$G$O!">\:Y$9$.$k$3$H$O7h$7$F$"$j$^$;$s!#%P%0Js9p$r$9$k$H$-$O!"$=(B -$B$l$,;H$&$?$S$K(B 10Kb $B%a!<%k$r:n$j!"$b$7$"$J$?$N4D6-$r0JA0;d$K(B 500 $B2sAw$C(B -$B$F$-$?$H$7$F$b!"L?Na(B @kbd{M-x gnus-bug} $B$r;H$C$F2<$5$$!#(B - -$B;d$O!"5-21$H$$$&o$K!"A4$F$r@bL@$7$9$.$F(B -$B2<$5$$!#$=$l$O2f!9A4$F$K$H$C$F$b$C$H4JC1$K$J$j$^$9(B---$B$b$7;d$,I,MW$JA4$F(B -$B$N>pJs$rF@$i$l$J$+$C$?$i!";d$O$"$J$?$K%a!<%k$rAw$C$F$5$i$J$k>pJs$r5a$a!"(B -$B$=$N7k2LA4$F$,$h$jB?$/$N;~4V$rLL$7$F$$$kLdBj$,Hs>o$K;k3PE*$G!"$=$l$r>el(B -$B9g$O!"(BEmacs $B$N%&%#%s%I%&$r%U%!%$%k$K%3%T!<$7$F(B ($BNc$($P!"(B@kbd{xwd} $B$G(B)$B!"(B -$B$=$l$r$I$3$+H%,%$%I(B - -$B;d$N4j$$$O!"B>$NC/$+$,(B gnus $B$G$G$-$k2?$+8-$$$b$N$r9M$(=P$7!"$=$N>e$=$N8-(B -$B$$$b$N$r=q$$$F$/$l$k$H$$$&$3$H$G$9!#$3$l$rMF0W$K$9$k$?$a$K$O!"(Bgnus $B$NFb(B -$BItF0:n$r5-=R$9$k$N$,NI$$J}K!$@$m$&$H;d$O;W$$$^$7$?!#$"$H!"$=$s$J$KFbIt$8$c(B -$B$J$$F0:n$r$$$/$D$+$H!";d$,:#$d$C$F$k$3$H$H!#(B - -$B%W%m%0%i%`$NFbIt9=B$$,JQ99$5$l$k$3$H$O$J$$!"$J$I$H;W$C$F$O$$$1$^$;$s$,!"(B -gnus $B$H$=$N%P%C%/%(%s%I4V$N%$%s%?!<%U%'!<%9(B ($B$3$l$O40A4$K5-=R$5$l$F$$(B -$B$k(B) $B$d!"%9%3%"%U%!%$%k$N7A<0(B ($B$3$l$bF1MM(B)$B!"%G!<%?9=B$(B ($B$3$l$OB>$h$jJQ99(B -$B$5$l$d$9$$$b$N$b$"$k(B)$B!"A`:nMQ$N0lHL%a%=%C%I!"$J$I$r(B ($B:YIt$K$o$?$C$F(B) $BDj(B -$B5A$7$F$$$-$^$9!#(B - -@menu -* Gnus Utility Functions:: $B;HMQ$G$-$k6&DL$N4X?t$HJQ?t(B -* Backend Interface:: Gnus $B$O$I$&$d$C$F%5!<%P!<$HDL?.$9$k$N$+(B -* Score File Syntax:: $B%9%3%"%U%!%$%k5,3J$N(B BNF $BDj5A(B -* Headers:: Gnus $B$O%X%C%@!<$rFbItE*$K$I$N$h$&$K3JG<(B - $B$9$k$+(B -* Ranges:: $B$?$/$5$s$N?t$r3JG<$9$kJXMx$J7A<0(B -* Group Info:: $B%0%k!<%W>pJs7A<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 -@end menu - -@node Gnus Utility Functions -@subsection Gnus $B$NM-MQ$J4X?t(B -@cindex Gnus utility functions -@cindex utility functions -@cindex functions -@cindex internal variables - -$B%U%C%/$J$I$+$i.$5$J4X?t$r=q$/$H$-$O!"(Bgnus $B$NFbIt4X?t(B -$B$dJQ?t$K%"%/%;%9$9$k$3$H$O@dBPI,MW$G$9!#0J2<$,:G$b$h$/;H$o$l$k$b(B -$B$N$N0lMw$G$9!#(B - -@table @code -@item gnus-newsgroup-name -@vindex gnus-newsgroup-name -$B$3$NJQ?t$O8=:_$N%K%e!<%9%0%k!<%W$NL>A0$rJ];}$7$F$$$^$9!#(B - -@item gnus-find-method-for-group -@findex gnus-find-method-for-group -@var{group} $B$NA*BrJ}K!$rJV$94X?t$G$9!#(B - -@item gnus-group-real-name -@findex gnus-group-real-name -$B@55,$N(B ($B@\F,<-IU$-$N(B) gnus $B%0%k!<%WL>$rA0(B -$B$rJV$7$^$9!#(B - -@item gnus-group-prefixed-name -@findex gnus-group-prefixed-name -$B@\F,<-L5$7$N%0%k!<%WL>$HA*BrJ}K!$r$rJV$7$^$9!#(B - -@item gnus-get-info -@findex gnus-get-info -@var{group} $B$N%0%k!<%W>pJs0lMw$rJV$7$^$9!#(B - -@item gnus-group-unread -@findex gnus-group-unread -@var{group} $B$NL$FI5-;v$N?t$+!"$b$7$/$O$=$l$,J,$+$i$J$$>l9g$O(B @code{t} $B$G(B -$B$9!#(B - -@item gnus-active -@findex gnus-active -@var{group} $B$N3hF0EPO?$G$9!#(B - -@item gnus-set-active -@findex gnus-set-active -@var{group} $B$K3hF0EPO?$r@_Dj$7$^$9!#(B - -@item gnus-add-current-to-buffer-list -@findex gnus-add-current-to-buffer-list -Gnus $B=*N;;~$K>C5n$9$k%P%C%U%!$N0lMw$K8=:_$N%P%C%U%!$rDI2C$7$^$9!#(B - -@item gnus-continuum-version -@findex gnus-continuum-version -$B0z?t$H$7$F(B gnus $B$N%P!<%8%g%sJ8;zNs$r.?tE@?t$rJV$7(B -$B$^$9!#8E$$%P!<%8%g%s$OI,$:?7$7$$%P!<%8%g%s$h$j$b>.$5$$?t$K$J$j$^(B -$B$9!#(B - -@item gnus-group-read-only-p -@findex gnus-group-read-only-p -@var{group} $B$,FI$_=P$7@lMQ$G$"$k$+$I$&$+$r<($7$^$9!#(B - -@item gnus-news-group-p -@findex gnus-news-group-p -@var{group} $B$,%K%e!<%9%P%C%/%(%s%I$G$"$k$+$I$&$+$r<($7$^$9!#(B - -@item gnus-ephemeral-group-p -@findex gnus-ephemeral-group-p -@var{group} $B$,C;4|%0%k!<%W$G$"$k$+$I$&$+$r<($7$^$9!#(B - -@item gnus-server-to-method -@findex gnus-server-to-method -@var{server} $B$KBP1~$7$F$$$kA*BrJ}K!$rJV$7$^$9!#(B - -@item gnus-server-equal -@findex gnus-server-equal -$BFs$D$N2>A[%5!<%P!<$,F10l$N$b$N$G$"$k$+$I$&$+$r<($7$^$9!#(B - -@item gnus-group-native-p -@findex gnus-group-native-p -@var{group} $B$,4pK\%0%k!<%W$G$"$k$+$I$&$+$r<($7$^$9!#(B - -@item gnus-group-secondary-p -@findex gnus-group-secondary-p -@var{group} $B$,FsA[%0%k!<%W$K$D$$$F$O2?$K$bCN$j$^(B -$B$;$s!#$?$@2>A[%5!<%P!<(B @dfn{virtual servers} $B$HBPOC$9$kJ}K!$rCN$C$F$$$k(B -$B$@$1$G$9!#2>A[%5!<%P!<$O%P%C%/%(%s%I(B @dfn{backend} $B$H$$$/$D$+$N%P%C%/%((B -$B%s%IJQ?t(B @dfn{backend variables} $B$+$i$J$j$^$9!#A0pJs$rMW5a$9$k$H(B -$B$-$O!"DL>o4X?t$N0z?t$H$7$F2>A[%5!<%P!$r4^$a$^$9!#(B($B$b$7$J$1$l$P!"%P%C(B -$B%/%(%s%I$O(B ``$B8=:_$N(B'' $B2>A[%5!<%P!<$r;HMQ$7$^$9!#(B) $BNc$($P!"(B -@code{nntp-request-list} $B$O$=$NM#0l$N(B ($B>JN,2DG=$J(B) $B0z?t$H$7$F2>A[%5!<%P!<(B -$B$rA[%5!<%P!<$,3+$+$l$F$$$J$1$l$P!"$3$N4X?t$O<:GT$7$^(B -$B$9!#(B - -$B2>A[%5!<%P!$O!"J*M}E*$J%5!<%P!$H$O2?$N4X78$bL5$$$3$H$KCm0U$7$F$/$@(B -$B$5$$!#$3$NNc$r8+$F$/$@$5$$!#(B - -@lisp -(nntp "odd-one" - (nntp-address "ifi.uio.no") - (nntp-port-number 4324)) -@end lisp - -$B$3$3$G!"J*M}%5!<%P!$O(B @samp{ifi.uio.no} $B$G$"$k$N$KBP$7!"2>A[%5!<%P!<(B -$BL>$O(B @samp{odd-one} $B$G$9!#(B - -$B%P%C%/%(%s%I$OJ#?t$N2>A[%5!<%P!<$r@Z$jBX$(2DG=$G$J$1$l$P$J$j$^$;$s!#I8=`(B -$B$N%P%C%/%(%s%I$O$3$l$r!"2>A[%5!<%P!<4D6-$rI,MW$J$H$-$Ko$K3NG'$9$kG$0U4X?t(B @dfn{optional functions} $B$G$9!#(B - -$B$3$l$i$N4X?t$OA4$F!"JV5Q%G!<%?(B -$B$r(B @code{nntp-server-buffer} (@samp{*nntpd*}) $B%P%C%U%!!<$KJV$9$3$H$,5a$a(B -$B$i$l$^$9!#$3$l$O$A$g$C$HIT1?$JL>A0IU$1$G$9$,!"$3$l$G2fK}$7$J$1$l$P$J$j$^(B -$B$;$s!#;d$,7k2L$N%G!<%?(B @dfn{resulting data} $B$H8@$C$?$H$-$O!"$=$N%P%C%U%!!<(B -$B$NCf$N%G!<%?$r;X$7$F$$$^$9!#JV5QCM(B @dfn{return value} $B$H8@$C$?$H$-$O!"4X(B -$B?t8F$S=P$7$K$h$C$FJV$5$l$k4X?t$NCM$N$3$H$r8@$C$F$$$^$9!#4X?t$,<:GT$7$?$H(B -$B$-$OJV5QCM$H$7$F(B@code{nil} $B$rJV$5$J$/$F$O$$$1$^$;$s!#(B - -$B%P%C%/%(%s%I$K$O%5!<%P!<7A<0(B @dfn{server-forming} $B$N%P%C%/%(%s%I$G$"$k$H(B -$B8F$P$l$k$b$N$,$"$j!"$^$?$=$&8F$P$l$J$$$b$N$b$"$j$^$9!#8epJs$rG[Aw$9$k$b$N(B -$B$G!"$=$l0J>e$N$b$N$G$O$"$j$^$;$s!#(B - -Gnus $B$O%0%k!<%WL>$H5-;vHV9f$K$h$C$F$=$l$>$l$N%a%C%;!<%8$rFCDj$7$^$9!#$=(B -$B$l$i5-;vHV9f$K4X$9$k$A$g$C$H$7$?@bL@$r$9$k$3$H$OM-1W$+$b$7$l$^$;$s!#$^$:(B -$BBh0l$K!"$=$N?t;z$O@5$N@0?t$G$9!#BhFs$K!"(BGnus $B$r:.Mp$5$;$k$3$H$J$/8E$$5-(B -$B;vHV9f$r8e$G:F;HMQ$9$k$3$H$OIaDL$O$G$-$^$;$s!#$=$l$O!"$b$7$"$k%0%k!<%W$,(B -$B$+$D$F(B 42 $BHV$N5-;v$r;}$C$F$$$?$H$7$?$i!"$=$NHV9f$GB>$N5-;v$r;}$D$3$H$O$G(B -$B$-$J$$$+!"$^$?$O(B Gnus $B$,:.Mp$7$F$7$^$&$+$b$7$l$J$$$H$$$&$3$H$G$9!#(B -@footnote{See the function @code{nnchoke-request-update-info}, -@ref{Optional Backend Functions}$B!#(B} $BBh;0$K!"5-;vHV9f$O$=$N%0%k!<%W$G$NE~(B -$BCe=g$K$J$C$F$$$J$1$l$P$J$i$J$$$3$H$G$9!#$H$O8@$(%a%C%;!<%8$NF|IU$bE~Ce=g(B -$B$G$"$kI,MW$O$"$j$^$;$s$,!#(B - -$B$9$G$KA0$N@a$G!"5-;vHV9f$O0l2s;H$o$l$?$@$1$GLrL\$r=*$o$i$J$1$l$P$J$i$J(B -$B$$(B `$B87$7$$(B' $B@)8B$K$D$$$F@bL@$7$^$7$?!#$7$+$7!"5-;vHV9f$NJB$S$KH4$1$,$"$k(B -$B$H(B Gnus $B$O$H$F$b:.Mp$7$F$7$^$&$N$G!"(B@emph{$BDL$7(B} $BHV9f$rIU$1$k$3$H$,M-MQ$J(B -$B$N$+$b$7$l$^$;$s!#$?$@$7(B `$B:F;HMQIT2D(B' $B$N@)8B$,$"$k$N$G!"$$$D$G$bHV9f$NH4(B -$B$1$r2sHr$G$-$k$H$O8B$j$^$;$s!#$^$?!"2DG=$J8B$j5-;vHV9f$r(B 1 $B$+$i;O$a$k$3(B -$B$H$O!"HV9f$r;H$$@Z$C$F$7$^$&$3$H$rHr$1$k$?$a$KLrN)$A$^$9!#(B - -$B$3$3$G$NNc$HDj5A$G$O!"A[A|>e$N%P%C%/%(%s%I(B @code{nnchoke} $B$r0z$-9g$$$K=P(B -$B$9$3$H$K$7$^$9!#(B - -@cindex @code{nnchoke} - -@menu -* Required Backend Functions:: $BJ,$J%X%C%@!o!"(B@code{articles} $B$NCf$N:G>.HV9f$N5-;v$h(B -$B$j$b>.$5$$5-;v$+$i(B ($B>/$J$/$H$b(B) @var{fetch-old} $B8D$NM>J,$J%X%C%@!<$r$&$3$H$r(B -$BHQ$o$7$$$H;W$C$?>l9g$K$O!"$3$N%Q%i%a!<%?$NB8:_$OL5;k$5$l$k$3$H$b$"$j$^$9!#(B -$B$3$NCM$,(B @code{nil} $B$G$b?t;z$G$b$J$1$l$P!":GBg8B$N -References: <38jdmq$4qu@@visbur.ifi.uio.no> -NNTP-Posting-Host: holmenkollen.ifi.uio.no -. -@end example - -$B$D$^$j!"JV5QCM$,(B @code{headers} $B$G$"$k$H$-$O!"%G!<%?%P%C%U%!$K$3$l$i%X%C(B -$B%@!<$,$$$/$D$+$"$k$H$$$&$3$H$r0UL#$7$^$9!#(B - -$B$3$l$,$=$N%P%C%U%!!<$N(B BNF $BDj5A$G$9!#(B - -@example -headers = *head -head = error / valid-head -error-message = [ "4" / "5" ] 2number " " eol -valid-head = valid-message *header "." eol -valid-message = "221 " " Article retrieved." eol -header = eol -@end example - -$B$b$7JV5QCM$,(B @code{nov} $B$G$"$l$P!"%G!<%?%P%C%U%!!<$K(B -$B$O(B @dfn{network overview database} $B9T$,4^$^$l$F$J$/$F$O$J$j$^$;$s!#(B -$B$3$l$O4pK\E*$K$OJ#?t$NMs$r%?%V$G6h@Z$C$?$b$N$G$9!#(B - -@example -nov-buffer = *nov-line -nov-line = 8*9 [ field ] eol -field = -@end example - -$B$3$l$i$NMs$K$I$N$h$&$J$b$N$,4^$^$l$k$+$r$h$j>\$7$/8+$?$1$l$P!"(B -@pxref{Headers} $B$r;2>H$7$F$/$@$5$$!#(B - -@item (nnchoke-open-server SERVER &optional DEFINITIONS) - -$B$3$3$G$N(B @var{server} $B$O2>A[%5!<%P!$G$9!#(B@var{definitions} $B$O(B -$B$3$N2>A[%5!<%P!<$rDj5A$9$k(B @code{(VARIABLE VALUE)} $BAH$N%j%9%H$G(B -$B$9!#(B - -$B$b$7%5!<%P!<$r3+$/$3$H$,$G$-$J$1$l$P!"%(%i!<$O%7%0%J%k$G$ODLCN$5(B -$B$l$^$;$s!#$=$7$F%P%C%/%(%s%I$O!"$=$l0J8e$N$3$N%5!<%P!<$X$N@\B3MW(B -$B5a$r5qH]$9$k$3$H$b$G$-$^$9!#o!"(Bgnus $B$,=*N;$9$k$H$-$K$N$_8F$S=P$5$l$^$9!#(B - -$BJV$5$l$k7k2L$N%G!<%?$O$"$j$^$;$s!#(B - -@item (nnchoke-server-opened &optional SERVER) - -$B$b$7(B @var{server} $B$,8=:_$N2>A[%5!<%P!<$G!"$=$NJ*M}%5!<%P!<$X$N@\(B -$BB3$,@8$-$F$$$l$P!"$3$N4X?t$O(B @code{nil} $B0J30$NCM$rJV$7$^$9!#$3$N(B -$B4X?t$O$I$s$J>l9g$G$b!"@\B3$,<:$o$l$?%5!<%P!<$X$N:F@\B3$r9T$J$&$3(B -$B$H$O$"$j$^$;$s!#(B - -$BJV$5$l$k7k2L$N%G!<%?$O$"$j$^$;$s!#(B - -@item (nnchoke-status-message &optional SERVER) - -$B$3$N4X?t$O(B @var{server} $B$+$i$N:G8e$N%(%i!<%a%C%;!<%8$rJV5Q$7$^$9!#(B - -$BJV$5$l$k7k2L$N%G!<%?$O$"$j$^$;$s!#(B - -@item (nnchoke-request-article ARTICLE &optional GROUP SERVER TO-BUFFER) - -$B$3$N4X?t$N7k2L$N%G!<%?$O!"(B@var{article} $B$G;XDj$5$l$?5-;v$G$9!#$3$N;XDj(B -$B$O(B @code{Message-ID} $B$+HV9f$N$$$:$l$+$G$9!#(B@code{Message-ID} $B$K$h$k5-;v(B -$B$No$N%G!<%?%P%C(B -$B%U%!$NBe$o$j$K!"$3$N%P%C%U%!$KJV$5$l$^$9!#$3$l$K$h$jB?NL$N%G!<%?$r$"$k%P%C(B -$B%U%!$+$iJL$N%P%C%U%!$K%3%T!<$9$k$3$H$rHr$1$k$3$H$,$G$-!"$=$7$F(B gnus $B$ODL(B -$B>o!"5-;v%P%C%U%!$KD>@\5-;v$rA^F~$9$k$h$&$KMW5a$7$F$$$^$9!#(B - -$B$b$72DG=$G$"$k$N$J$i!"$3$N4X?t$O!"(B@code{car}$B$,$G!"(B@code{cdr} $B$,5-;vHV9f$G$"$k(B cons $B%;%k$rJV$9$Y$-$G$9!#$3$l$K$h(B -$B$j(B @code{Message-ID} $B$K$h$C$F5-;v$rl9g$K$O!"5-(B -$B;v$NuBV$G!"$3$l$O(B 211 $B$G$J$/$F$O$J$j$^$;$s!#.$N5-;vHV9f!":GBg$N5-;vHV9f!"$=$7$F:G8e$,%0%k!<%WL>$G(B -$B$9!#5-;v$NAm?t$O!":GBg!&:G>.5-;vHV9f$+$iC1=c$K9M$($i$l$k?t$h$j$b>.$5$$$3(B -$B$H$,$"$k$3$H$KCm0U$7$F$/$@$5$$!#$$$/$D$+$N5-;v$OC$5$l$F$$$k$+$b$7$l(B -$B$^$;$s!#(BGnus $B$OAm?t$OC1$K " " -info = "211 " 3* [ " " ] -@end example - -@item (nnchoke-close-group GROUP &optional SERVER) - -@var{group} $B$rJD$8!"$=$l$K@\B3$5$l$F$$$kA4$F$N;q8;$r3+J|$7$^$9!#$3$l$O$[(B -$B$H$s$I$N%P%C%/%(%s%I$G$O2?$b$9$k$3$H$,$J$$$G$7$g$&!#(B - -$BJV$5$l$k7k2L$N%G!<%?$O$"$j$^$;$s!#(B - -@item (nnchoke-request-list &optional SERVER) - -@var{server} $B>e$GMxMQ2DG=$JA4$F$N%0%k!<%W$N0lMw$rJV$7$^$9!#$3$l(B -$B$O(B @emph{$BA4It(B} $B$H$$$&0UL#$G$9!#(B - -$B$3$l$,!"$?$C$?Fs$D$7$+%0%k!<%W$r;}$C$F$$$J$$%5!<%P!<$+$i$NNc$G$9!#(B - -@example -ifi.test 0000002200 0000002000 y -ifi.discussion 3324 3300 n -@end example - -$B3F9T$K$O%0%k!<%WL>$,$"$j!"$=$7$F$=$N%0%k!<%WFb$N:GBg$N5-;vHV9f!":G>.$N5-(B -$B;vHV9f!"$=$7$F:G8e$K%U%i%0$G$9!#(B - -@example -active-file = *active-line -active-line = name " " " " " " flags eol -name = -flags = "n" / "y" / "m" / "x" / "j" / "=" name -@end example - -$B%U%i%0$O!"$=$N%0%k!<%W$,FI$_=P$7@lMQ(B (@samp{n}) $B$G$"$k$+!";J2q$N%0%k!<%W$NJL(B -$BL>(B (@samp{=other-group}) $B$G$"$k$+!">e5-$N$I$l$G$b$J$$(B (@samp{y}) $B$+!"$H(B -$B$$$&$3$H$r<($7$F$$$^$9!#(B - -@item (nnchoke-request-post &optional SERVER) - -$B$3$N4X?t$O!"8=:_$N%P%C%U%!$rEj9F$7$^$9!#$3$l$OEj9F$,@.8y$7$?$+$I$&$+$rJV(B -$B5Q$7$F$b9=$$$^$;$s$,!"I,?\$G$O$"$j$^$;$s!#Nc$($P!"Ej9F$,HsF14|$K9T$o$l$k(B -$B$N$G$"$l$P!"$3$N4X?t$,=*N;$7$?;~E@$G$OEj9F$OIaDL40N;$7$F$$$^$;$s!#$=$N>l(B -$B9g$3$N4X?t$O!"Ej9F$r40N;$5$;$k$3$H$,$G$-$J$$$H$-!"$=$l$r$O$C$-$j$HMxMQpJs(B (@pxref{Group Info}) $B$,JQ992U=j$H$7$F%P%C%/%((B -$B%s%I$KEO$5$l$^$9!#$3$l$O%P%C%/%(%s%I$,(B ($B2>A[%0%k!<%W$d(B imap $B%0%k!<(B -$B%W$N>l9g$N$h$&$K(B) $BK\Ev$KA4$F$N>pJs$r;}$C$F$$$k>l9g$KJXMx$K$J$j$^(B -$B$9!#$3$N4X?t$O!"$=$NMW5a$KE,9g$5$;$k>pJs$rGK2uE*$KCV$-49$(!"$=(B -$B$N(B ($BCV$-49$($i$l$?(B) $B%0%k!<%W>pJs$rJV$7$^$9!#(B - -$B$3$N4X?t$+$iJV$5$l$k7k2L$N%G!<%?$O$"$j$^$;$s!#(B - -@item (nnchoke-request-type GROUP &optional ARTICLE) - -$BMxMQJ}$H$b(B @code{nil} $B$G$"$k(B -$B$+$b$7$l$^$;$s!#(B - -$B$3$N4X?t$+$iJV$5$l$k7k2L$N%G!<%?$O$"$j$^$;$s!#(B - -@item (nnchoke-request-set-mark GROUP ACTION &optional SERVER) - -$B5-;v$N0u$r@_Dj(B/$B>C5n(B/$BDI2C$7$^$9!#IaDL$O(B gnus $B$O5-;v$N0u(B ($B4{FI!"2D;k!";~8B(B -$B>C5n$J$I(B) $B$rFbIt$G07$$!"(B@code{~/.newsrc.eld} $B$KJ]B8$7$^$9!#$7$+$7!"%P%C(B -$B%/%(%s%I$K$O(B (@sc{imap} $B$N$h$&$K(B) $B5-;v$NA4$F$N>pJs$r%5!<%P!<$K<}$a$k$N(B -$B$G!"(Bgnus $B$O0u$N>pJs$r%5!<%P!<$KEAC#$7$J$1$l$P$J$i$J$$$b$N$,$"$j$^$9!#(B - -ACTION $B$O$3$N$h$&$JMM<0$N0u@_Dj$NMW5a$N%j%9%H$G$9(B: - -@example -(RANGE ACTION MARK) -@end example - -RANGE $B$O0u$rIU$1$?$$5-;v$NHO0O$G$9!#(BACTION $B$O(B @code{add} $B$^$?(B -$B$O(B @code{del} $B$G!"0u$rDI2C$7$?$j>C$7$^$9(B ($B8@5Z$5$l$F$$$J$$$9$Y$F$N0u$OJ](B -$BB8$7$^$9(B)$B!"0u$N>C5n(B ($B8@5Z$5$l$F$$$J$$0u$OJ]B8$7$^$9(B) $B$G$9!#(BMARK $B$O0u(B -$B$N%j%9%H$G$9!#$=$l$>$l$N0u$O%7%s%\%k$G$9!#8=:_;H$o$l$F$$$k0u(B -$B$O(B @code{read}, @code{tick}, @code{reply}, @code{expire}, @code{killed}, -@code{dormant}, @code{save}, @code{download}, @code{unsend}, -@code{forward} $B$*$h$S(B @code{recent} $B$G$9$,!"$b$72DG=$J$i!"$"$J$?$N%P%C%/(B -$B%(%s%I$O$3$l$i$K@)8B$r$9$k$Y$-$G$O$"$j$^$;$s!#(B - -$BL7=b$9$kF0:n$,;XDj$5$l$?$H$-!"%j%9%H$N:G8e$NF0:n$,8zNO$r;}$D$b$N$K$J$j$^(B -$B$9!#$9$J$o$A!"F0:n$K5-;v(B 1 $B$K(B @code{$B2D;k(B} $B0u$rDI2C$9$kMW5a$,$"$j!"%j%9%H(B -$B$N8e$GF1$85-;v$+$i0u$r>C5n$9$k$3$H$rMW5a$7$F$$$l$P!"0u$OC5n$5$l$k(B -$B$Y$-$G$9!#(B - -$BF0:n%j%9%H$NNc$G$9(B: - -@example -(((5 12 30) 'del '(tick)) - ((10 . 90) 'add '(read expire)) - ((92 94) 'del '(read))) -@end example - -$B4X?t$O0u$r@_Dj$G$-$J$+$C$?5-;v$NHO0O$rJV$9$Y$-$G$9(B ($B8=:_$OA4$/;H$o$l$F$$(B -$B$^$;$s(B)$B!#(B - -$B$3$N4X?t$+$i$O7k2L$N%G!<%?$O$"$j$^$;$s!#(B - -@item (nnchoke-request-update-mark GROUP ARTICLE MARK) - -$B$b$7MxMQ$N%4%_$rJV$7$F$O$$$1$^$;$s!#(B - -$B;d$,CN$C$F$$$k$3$l$N$3$l$NMxMQK!$O!"(B@code{nnvirtual} $B$,9T$J$C$F$$$k$3$H(B -$B$@$1$G$9(B --- $B$b$79=@.%0%k!<%W$,<+F04|8B@Z$l>C5n2DG=$G$"$l$P!"$3$N2>A[%0(B -$B%k!<%W$G4{FI$N0u$rIU$1$k$H!"7k2L$H$7$F$=$N5-;v$K4|8B@Z$l>C5n$N0u$,IU$1$i(B -$B$l$^$9!#(B - -$B$3$N4X?t$+$iJV$5$l$k7k2L$N%G!<%?$O$"$j$^$;$s!#(B - -@item (nnchoke-request-scan &optional GROUP SERVER) - -$B$3$N4X?t$O!"%P%C%/%(%s%I$,E~Ce5-;v$r3NG'$9$kMW5a$r9T$J$&$H$-$K$$$D$G(B -$B$b(B (gnus $B$+$=$l0J30$K$h$C$F(B)$B!"$"$l$d$3$l$d$H8F$S=P$5$l$k$3$H$,$"$j$^$9!#(B -$B%a!<%k%P%C%/%(%s%I$O$3$N4X?t$,5/F0$5$l$?$H$-!"E57?E*$K$O%9%W!<%k%U%!%$%k(B -$B$rFI$`$+(B POP $B%5!<%P!<$KLd$$9g$o$;$K$$$-$^$9!#(B@var{group} $B$OFC$K5$$KN1$a(B -$B$kI,MW$O$"$j$^$;$s(B --- $B$b$7%P%C%/%(%s%I$,!"0l$D$@$1$N%0%k!<%W$rAv::$9$k(B -$B$N$OBgJQ$9$.$k$HH=CG$7$?>l9g$K$O!"A4%0%k!<%W$NA4Av::$r9T$J$C$F$b9=$$$^$;(B -$B$s!#$G$9$,!" description eol -name = -description = -@end example - -@item (nnchoke-request-list-newsgroups &optional SERVER) - -$B$3$N4X?t$K$h$C$FJV$5$l$k7k2L$N%G!<%?$O!"%5!<%P!<>e$GMxMQ$G$-$k%0(B -$B%k!<%WA4$F$N@bL@$G$9!#(B - -@example -description-buffer = *description-line -@end example - -@item (nnchoke-request-newgroups DATE &optional SERVER) - -$B$3$N4X?t$+$iJV$5$l$k7k2L$N%G!<%?$O!"(B@samp{date} $B0J9_$K:n@.$5$l$?(B -$BA4$F$N%0%k!<%W$G$9!#(B@samp{date} $B$ODL>o$N?M4V$,FI$a$kF|IU$N7A<0$G(B -$B$9!#%G!<%?$O(B active $B%P%C%U%!$N7A<0$G$J$1$l$P$J$j$^$;$s!#(B - -@item (nnchoke-request-create-group GROUP &optional SERVER) - -$B$3$N4X?t$O!"(B@var{group} $B$H$$$&L>A0$N6u$N%0%k!<%W$r:n@.$7$^$9!#(B - -$BJV$5$l$k7k2L$N%G!<%?$O$"$j$^$;$s!#(B - -@item (nnchoke-request-expire-articles ARTICLES &optional GROUP SERVER FORCE) - -$B$3$N4X?t$O!"(B@var{articles} $B$NHO0O$NA4$F$N5-;v$KBP$7$F4|8B@Z$l>C5n=hM}$r(B -$B9T$J$$$^$9!#(B(@var{articles} $B$O8=:_$O5-;vHV9f$NC1=c$J%j%9%H$G$9!#(B) $B$3$N(B -$B4X?t$G>C5n$5$l$kA0$N!"5-;v$,$I$l$@$18E$$5-;v$G$"$k$+$N7hDj$O%P%C%/%(%s%I(B -$B$KG$$5$l$F$$$^$9!#(B@var{force} $B$,(B @code{nil} $B0J30$G$"$l$P!"$=$l$,$I$s$J$K(B -$B?7$7$$$b$N$G$"$C$F$b!"A4$F$N(B@var{articles} $B$,>C5n$5$l$^$9!#(B - -$B$3$N4X?t$O:o=|$7$J$+$C$?!"$"$k$$$O:o=|$9$k$3$H$,$G$-$J$+$C$?5-;v$N%j%9%H(B -$B$rJV$7$^$9!#(B - -$BJV$5$l$k7k2L$N%G!<%?$O$"$j$^$;$s!#(B - -@item (nnchoke-request-move-article ARTICLE GROUP SERVER ACCEPT-FORM -&optional LAST) - -$B$3$N4X?t$O(B @var{article} ($BHV9f(B) $B$r!"(B@var{group} $B$+(B -$B$i(B @var{accept-form} $B$r8F$S=P$7$F0\F0$7$^$9!#(B - -$B$3$N4X?t$O!"LdBj$N5-;v$r0\F0$5$;$k$?$a$N=`Hw$H$7$F!"5-;v$KIU2C$5$l$?%X%C(B -$B%@!<9T$rA4$F:o=|$7!"0lHL$K5-;v$r!V$-$l$$$5$C$Q$j!W$K$7$^$9!#$=$7$F(B ``$B$-(B -$B$l$$$J(B'' $B5-;v$N$"$k%P%C%U%!!<$G(B @var{accept-form} $B$r(B @code{eval} $B$7$^$9!#(B -$B$3$l$OK\Ev$KJ#@=$r9T$J$$$^$9!#$b$7(B @code{eval} $B$,(B @code{nil} $B0J30$NCM$r(B -$BJV$7$?$i!"$=$N5-;v$O:o=|$5$l$^$;$s!#(B - -@var{last} $B$,(B @code{nil} $B$G$"$l$P!"$3$ND>8e$K$5$i$KMW5a$,H/9T$5$l$k8+9~(B -$B$_$,9b$$!"$H$$$&0UL#$K$J$j!"$3$l$K$h$C$F:GE,2=$,$$$/$i$+$G$-$k$h$&$K$J$j(B -$B$^$9!#(B - -$B$3$N4X?t$O!"%0%k!<%WL>$,(B @code{car} $B$G!"$=$N5-;v$N0\F0@h$N5-;vHV9f$,(B -@code{cdr} $B$G$"$k(B cons $B%;%k$rJV$7$^$9!#(B - -$BJV$5$l$k7k2L$N%G!<%?$O$"$j$^$;$s!#(B - -@item (nnchoke-request-accept-article GROUP &optional SERVER LAST) - -$B$3$N4X?t$O!"8=:_$N%P%C%U%!$r$A$K(B -$B9T$o$l$k$H$$$&0UL#$G$9!#(B - -$B$3$N4X?t$O%0%k!<%WL>$,(B @code{car} $B$G!"$=$N5-;v$N0\F0@h$N5-;vHV9f$,(B -@code{cdr} $B$G$"$k(B cons $B%;%k$rJV$7$^$9!#(B - -$BJV$5$l$k7k2L$N%G!<%?$O$"$j$^$;$s!#(B - -@item (nnchoke-request-replace-article ARTICLE GROUP BUFFER) - -$B$3$N4X?t$O(B @var{article} ($BHV9f(B) $B$r(B @var{group} $B$+$i:o=|$7!"Be$o$j$K(B -@var{buffer} $B$r$=$3$KA^F~$7$^$9!#(B - -$BJV$5$l$k7k2L$N%G!<%?$O$"$j$^$;$s!#(B - -@item (nnchoke-request-delete-group GROUP FORCE &optional SERVER) - -$B$3$N4X?t$O(B @var{group} $B$r>C5n$7$^$9!#$b$7(B @var{force} $B$,$"$l$P!"$=$N%0(B -$B%k!<%WFb$NA4$F$N5-;v$rK\Ev$K>C5n$7!"$=$7$F$=$N%0%k!<%W<+?H$r>C5n$7$^$9!#(B -($B$b$7(B ``$B%0%k!<%W<+?H(B'' $B$H$$$&$b$N$,$"$l$P!#(B) - -$BJV$5$l$k7k2L$N%G!<%?$O$"$j$^$;$s!#(B - -@item (nnchoke-request-rename-group GROUP NEW-NAME &optional SERVER) - -$B$3$N4X?t$O(B @var{group} $B$+$i(B @var{new-name} $B$KL>A0$rJQ99$7$^$9!#(B -@var{group} $BFb$K$"$k5-;v$OA4$F(B @var{new-name} $B$K0\F0$7$^$9!#(B - -$BJV$5$l$k7k2L$N%G!<%?$O$"$j$^$;$s!#(B -@end table - -@node Error Messaging -@subsubsection $B%(%i!<%a%C%;!<%8I=<((B - -@findex nnheader-report -@findex nnheader-get-report -$B%P%C%/%(%s%I$O%(%i!<>u67$rJs9p$9$k$N$K(B @code{nnheader-report} $B$r;H$o$J$/(B -$B$F$O$J$j$^$;$s(B --- $BMW5a$r$N%7%s%\%k$G!";D$j$O!"J#?t$N0z?t(B -$B$,$"$l$P(B @code{format} $B$X$N0z?t$H$7$F2ro$K(B@code{nil} $B$rJV$5$J$/$F$O$J$j$^$;$s!#(B - -@lisp -(nnheader-report 'nnchoke "You did something totally bogus") - -(nnheader-report 'nnchoke "Could not request group %s" group) -@end lisp - -$B0lJ}(B gnus $B$O!"%5!<%P!<$+$i(B @code{nil} $B$rJV$5$l$?$H$-(B -$B$K(B @code{nnheader-get-report} $B$r8F$S=P$7!"$=$7$F$3$N4X?t$,LdBj$N%P%C%/%((B -$B%s%I$KBP$7$F:G8e$KJs9p$5$l$?%a%C%;!<%8$rJV$7$^$9!#$3$N4X?t$O0l$D$N0z(B -$B?t(B --- $B%5!<%P!<$N%7%s%\%k$re$N5-;v$rJT(B -$B=8$9$k$3$H$,$G$-$^$9!#(B@code{nnmh} $B$O(B @code{nnml} $B$K$H$F$b;w$F$$$^$9$,!"(B -$B$3$l$O%"%/%F%#%V%U%!%$%k$r;H$o$:!"35MW%G!<%?%Y!<%9$bJ];}$7$^$;$s!#(B -@code{nndir} $B$O(B @code{nnml} $B$K$H$F$b;w$F$$$^$9$,!"$3$l$K$O(B ``$B%0%k!<%W(B'' -$B$N35G0$O$J$/!"5-;v$N=$@5$O$G$-$^$;$s!#(B - -$B?7$7$$%P%C%/%(%s%I$r=q$/$H$-$KB>$N%P%C%/%(%s%I$+$i4X?t$r(B ``$B7Q>5(B'' $B$9$k$3(B -$B$H$,2DG=$G$"$C$F$[$7$$!"$H;W$&$N$OM}$KE,$C$F$$$^$9!#$=$7$F$^$5$K!"$"$J$?(B -$B$,$=$&$7$?$1$l$P!"$=$l$,$G$-$k$N$G$9!#(B($B$"$J$?$,$=$&$7$?$/$J$1$l$P$7$J$/(B -$B$F$bNI$$$G$9$h!"$b$A$m$s!#(B) - -$BA4$F$N%P%C%/%(%s%I$O8x3+JQ?t$H8x3+4X?t$r!"(B@code{nnoo} $B$H8F$P$l$k%Q%C%1!<(B -$B%8$r;H$C$F@k8@$7$^$9!#(B - -$BB>$N%P%C%/%(%s%I$+$i4X?t$r7Q>5$9$k$K$O(B ($B$=$7$F8=:_$N%P%C%/%(%s%I$+$iB>$N(B -$B%P%C%/%(%s%I$K4X?t$r7Q>5$G$-$k$h$&$K$9$k$K$O(B)$B!"0J2<$N%^%/%m$r;HMQ$7$J$1(B -$B$l$P$J$j$^$;$s!#(B - -@table @code -@item nnoo-declare -$B$3$N%^%/%m$O!":G=i$N0z?t$r!"$=$N8e$KB3$/0z?t$N;R6!$G$"$k$3$H$r@k8@$7$^$9!#(B -$BNc$($P!"(B - -@lisp -(nnoo-declare nndir - nnml nnmh) -@end lisp - -$B$3$l$G(B @code{nndir}$B$O!"(B@code{nnml} $B$H(B @code{nnmh} $B$NN>J}$+$i4X?t$r7Q>5$7(B -$B$h$&$H$7$F$$$k$3$H$r@k8@$7$^$9!#(B - -@item defvoo -$B$3$N%^%/%m$O(B @code{defvar} $B$HF15A$G$9$,!"$=$NJQ?t$r8x3+%5!<%P!uBV;X8~7?$NJQ?t$O(B @code{defvar} $B$G$O$J(B -$B$/(B @code{defvoo} $B$K$h$C$F@k8@$9$k$Y$-$G$9!#(B - -$BDL>o$N(B @code{defvar} $B0z?t$K2C$($F!"$3$N%^%/%m$O?F%P%C%/%(%s%I$NJQ?t$N%j(B -$B%9%H$ro$N(B @code{defun} $B=hM}$K2C$($F!"$3$N%^%/%m$O$=$N4X?t$r8x3+$7$F$$$k$b$N$H(B -$B$7$FEPO?$7!"B>$N%P%C%/%(%s%I$,$=$l$r7Q>5$G$-$k$h$&$K$7$^$9!#(B - -@item nnoo-map-functions -$B$3$N%^%/%m$O8=:_$N%P%C%/%(%s%I$N4X?t$+$i?F%P%C%/%(%s%I$N4X?t$X$NCV$-49$((B -$B$r9T$J$($k$h$&$K$7$^$9!#(B - -@example -(nnoo-map-functions nndir - (nnml-retrieve-headers 0 nndir-current-group 0 0) - (nnmh-request-article 0 nndir-current-group 0 0)) -@end example - -$B$3$l$O(B @code{nndir-retrieve-headers} $B$,8F$S=P$5$l$?$H$-!"0lHVL\!";0HVL\!"(B -$B;MHVL\$N0z?t$,(B @code{nnml-retrieve-headers} $B$KEO$5$l!"0lJ}!"FsHVL\$N0z?t(B -$B$O(B @code{nndir-current-group} $B$NCM$H$7$F@_Dj$5$l$k!"$H$$$&0UL#$G$9!#(B - -@item nnoo-import -$B$3$N%^%/%m$OB>$N%P%C%/%(%s%I$+$i4X?t$r(B -$BA0$HE,Ev$J?t$NG=NO(B @dfn{abilities} $B$G$9!#(B - -$B$3$l$,Nc$G$9!#(B - -@lisp -(gnus-declare-backend "nnchoke" 'mail 'respool 'address) -@end lisp - -$B$=$7$F>e5-$N9T$O(B @file{nnchoke.el} $B%U%!%$%k$KF~$l$^$9!#(B - -$BG=NO$K$O0J2<$N$b$N$,$"$j$^$9!#(B - -@table @code -@item mail -$B$3$l$O%a!<%kIw%P%C%/%(%s%I$G$9(B --- $B%U%)%m!<%"%C%W$O(B ($B$?$$$F$$$O(B) $B%a!<%k(B -$B$GAw$i$l$^$9!#(B -@item post -$B$3$l$O%K%e!<%9Iw%P%C%/%(%s%I$G$9(B --- $B%U%)%m!<%"%C%W$O(B ($B$?$$$F$$$O(B) $B%K%e!<(B -$B%9$GAw$i$l$^$9!#(B -@item post-mail -$B$3$N%P%C%/%(%s%I$O%a!<%k$H%K%e!<%9$NN>J}$r%5%]!<%H$7$^$9!#(B -@item none -$B$3$l$O%K%e!<%9$G$b%a!<%k$G$b$J$$%P%C%/%(%s%I$G$9(B --- $BA4$/0c$C$?2?$+$G$9!#(B -@item respool -$B$3$l$O:F%9%W!<%k$r%5%]!<%H$7$^$9(B --- $B$H$$$&$h$j$O!"$=$N85$N5-;v$H%0%k!<(B -$B%W$r=$@5$9$k$3$H$,$G$-$^$9!#(B -@item address -$B2>A[%5!<%P!$NCf$K%5!<%P!<$NL>A0$,4^$^$k$H$$$&$3$H$G$9!#$3$l$O$[$H$s$I(B -$BA4It$N%P%C%/%(%s%I$GI,MW$K$J$j$^$9!#(B -@item prompt-address -$B%0%k!<%W%P%C%U%!$G(B @kbd{B} $B$J$I$G$3$NL?Na$r$N%P%C%/%(%s%I$KBP$7$F0l@~$r2h$7$F$$$kE@$O!"%a!<(B -$B%k%P%C%/%(%s%I$O(B @file{nnmail.el} $B$NCf$N6&DL4X?t$K6/$/0MB8$7$F$$$k$H$$$&(B -$BE@$G$9!#Nc$($P!"(B@code{nnml-request-scan} $B$NDj5A$O$3$N$h$&$K$J$j$^$9!#(B - -@lisp -(deffoo nnml-request-scan (&optional group server) - (setq nnml-article-file-alist nil) - (nnmail-get-new-mail 'nnml 'nnml-save-nov nnml-directory group)) -@end lisp - -$BC1$K(B @code{nnmail-get-new-mail} $B$K$$$/$D$+0z?t$rM?$($F8F$S=P$9$@$1$G!"(B -@code{nnmail} $B$,%a!<%k$N0\F0$dJ,N%$rA4$F$NLLE]$r8+$F$/$l$^$9!#(B - -$B$3$N4X?t$O;M$D$N0z?t$rl=j$G$9!#(B - -@item group -$B$3$N>JN,2DG=$J0z?t$O!"J,N%$,0l$D$N%0%k!<%W$KBP$7$F$N$_$G$9!#(B -@end table - -@code{nnmail-get-new-mail} $B$O3F5-;v$rJ]B8$9$k$?$a(B -$B$K(B @var{backend}@code{-save-mail} $B$r8F$S=P$7$^$9!#(B -@var{backend}@code{-active-number} $B$O$3$N5-;v$K3d$jEv$F$i$l$?5-;vHV9f$r(B -$BD4$Y$k$?$a$K8F$S=P$5$l$^$9!#(B - -$B$3$N4X?t$Oo$K=@Fp$J$h$&$K0U?^$5$l$F$$$^(B -$B$9!#$=$l$K$O(B Emacs Lisp $B$N%j%9%H$HF1$8FI$_9~$_9=J8$JMM$J$b$N$,$=$N;XDj$K(B -$B9g$&$@$m$&$H$$$&;v$,7hDj$5$l$^$7$?!#(B - -$B$3$l$ONI$/$"$k%9%3%"%U%!%$%k$G$9(B: - -@lisp -(("summary" - ("win95" -10000 nil s) - ("Gnus")) - ("from" - ("Lars" -1000)) - (mark -100)) -@end lisp - -$B%9%3%"%U%!%$%k$N(B BNF $BDj5A$G$9!#(B - -@example -score-file = "" / "(" *element ")" -element = rule / atom -rule = string-rule / number-rule / date-rule -string-rule = "(" quote string-header quote space *string-match ")" -number-rule = "(" quote number-header quote space *number-match ")" -date-rule = "(" quote date-header quote space *date-match ")" -quote = -string-header = "subject" / "from" / "references" / "message-id" / - "xref" / "body" / "head" / "all" / "followup" -number-header = "lines" / "chars" -date-header = "date" -string-match = "(" quote quote [ "" / [ space score [ "" / - space date [ "" / [ space string-match-t ] ] ] ] ] ")" -score = "nil" / -date = "nil" / -string-match-t = "nil" / "s" / "substring" / "S" / "Substring" / - "r" / "regex" / "R" / "Regex" / - "e" / "exact" / "E" / "Exact" / - "f" / "fuzzy" / "F" / "Fuzzy" -number-match = "(" [ "" / [ space score [ "" / - space date [ "" / [ space number-match-t ] ] ] ] ] ")" -number-match-t = "nil" / "=" / "<" / ">" / ">=" / "<=" -date-match = "(" quote quote [ "" / [ space score [ "" / - space date [ "" / [ space date-match-t ] ] ] ] ")" -date-match-t = "nil" / "at" / "before" / "after" -atom = "(" [ required-atom / optional-atom ] ")" -required-atom = mark / expunge / mark-and-expunge / files / - exclude-files / read-only / touched -optional-atom = adapt / local / eval -mark = "mark" space nil-or-number -nil-or-number = "nil" / -expunge = "expunge" space nil-or-number -mark-and-expunge = "mark-and-expunge" space nil-or-number -files = "files" *[ space ] -exclude-files = "exclude-files" *[ space ] -read-only = "read-only" [ space "nil" / space "t" ] -adapt = "adapt" [ space "ignore" / space "t" / space adapt-rule ] -adapt-rule = "(" *[ *[ "(" ")" ] ")" -local = "local" *[ space "(" space ")" ] -eval = "eval" space -space = *[ " " / / ] -@end example - -$B%9%3%"%U%!%$%k$NG'<1IT2DG=$JMWAG$OL5;k$5$l$k$Y$-$G$9$,!"o$KIiC4$N$+$1$i$l$9$.$?8l$G$9!#(B -``$B%X%C%@!<(B'' $B$O(B RFC1036 $B$G$O5-;v$NF,$N9T$N;v(B ($BNc$($P!"(B@code{From}) $B$rOC(B -$B$9$N$KMQ$$$i$l$F$$$^$9!#$=$l$OB?$/$N?M$+(B -$B$i(B ``$B%X%C%I(B''---``$B%X%C%@!<$HK\BN(B'' $B$NF15A8l$H$7$F;H$o$l$F$$$^$9!#(B($B$3$l(B -$B$O!";d$N0U8+$G$OHr$1$i$l$k$Y$-$G$9!#(B) $B$=$7$F!"(Bgnus $B$OFbIt$G(B -$B$O(B ``$B%X%C%@!<(B'' $B$H8F$VMM<0$r;H$C$F$*$j!";d$O$3$3$G$=$l$K$D$$$F@bL@$7$^$9!#(B -$B$3$l$O6e$D$NMWAG$+$i$J$k%Y%/%H%k$G!"4pK\E*$K!"$=$l$>$l$N%X%C(B -$B%@!<(B ($B$"DK(B) $B$,0l$D$N6u$->l=j$r@j$a$F$$$^$9!#(B - -$B$3$l$i$N6u$->l=j$O!"=gHV(B -$B$K(B: @code{number}, @code{subject}, @code{from}, @code{date}, @code{id}, @code{chars}, @code{lines}, @code{xref}, @code{extra} $B$G(B -$B$9!#$3$l$i$N6u$->l=j$K?($C$F@_Dj$9$k%^%/%m$,$"$j$^$9(B---$B$=$l$i$OA4$F!"$=(B -$B$l$>$l(B @code{mail-header-} $B$H(B @code{mail-header-set-} $B$$$&M=A[$5$l$kL>A0(B -$B$r;}$C$F$$$^$9!#(B - -@code{extra} $B$N>l=j$O%X%C%@!<(B/$BCM$NBP$NO"A[%j%9%H$G$"$k0J30$O$3$l$i$NA4$F(B -$B$N>l=j$OJ8;zNs$G$9(B (@pxref{To From Newsgroups})$B!#(B - -@node Ranges -@subsection $BHO0O(B - -@sc{gnus} $B$O;d$K$OHs>o$KLr$KN)$D$H;W$o$l$k35G0$rF3F~$7$^$7$?$N$G!";d$O$=(B -$B$l$r$?$/$5$s;H$$!"$+$J$jG0F~$j$K:n$j>e$2$F$-$^$7$?!#(B - -$BZ$5$l$k(B $B$b(B -$B$N(B (object) (@emph{$BMpK=$J(B} $BNc$r5s$2$k$H!"5-;v$,$=$&$G(B -$B$9(B) $B$r(B ``$B4^$^$l$F$$$k(B'' $B$H$7$F8+$J$7$?$$$H$-$O!"IaDL$NO"B3E*9T0Y$O$"$^$j(B -$BLr$KN)$A$^$;$s!#(B($BD9$5(B 200,000 $B$NO"B3J*$O>/$7B)$,D9$9$.$^$9!#(B) - -$B$3$l$N2r7h:v$O/$7e$NMW5a$O2<9_$7$F$$$J$$(B -$B$H$$$&;v$O3P$($F$*$/I,MW$,$"$j$^$9!#(B($BG$0U$N2s?t$NF1$8?t;z$N7+$jJV$7$O5v(B -$B$5$l$F$$$^$9$,!"HO0O$N07$$$+$i$O>C$(5n$k798~$,$"$j$^$9!#(B) - -@example -range = simple-range / normal-range -simple-range = "(" number " . " number ")" -normal-range = "(" start-contents ")" -contents = "" / simple-range *[ " " contents ] / - number *[ " " contents ] -@end example - -Gnus $B$O8=:_$N$H$3$m4{FI5-;v$H5-;v$N0u$N>pJs$rIU$1$F$*$/$?$a$KHO0O$r;H$C(B -$B$F$$$^$9!#;d$O(B $B$5$J$$$G@$$NCf$r40A4$KHO0O$K4p$E$$$?$b$N$K$9$k(B -$B$?$a$K$b$&>/$79M$($kI,MW$,$"$k$+$i$G$9!#(B) - -@node Group Info -@subsection $B%0%k!<%W>pJs(B - -Gnus $B$O%0%k!<%W$NA4$F$N1JB3>pJs$r(B @dfn{group info} $B%j%9%H$KJ]B8$7$^$9!#(B -$B$3$N%j%9%H$ND9$5$O(B 3 $B$+$i(B 6 ($B$b$7$/$O$b$C$H(B) $B$NMWAG$GE0DlE*$K%0%k!<%W$r(B -$B5-=R$7$^$9!#(B - -$B$3$3$K$"$k$N$O%0%k!<%W>pJs(B (group info) $B$NFs$D$NNc$G$9!#0l$D$OHs>o$KC1=c(B -$B$J%0%k!<%W$G!"Fs$D$a$O$b$C$HJ#;($J$b$N$G$9(B: - -@example -("no.group" 5 ((1 . 54324))) - -("nnml:my.mail" 3 ((1 . 5) 9 (20 . 55)) - ((tick (15 . 19)) (replied 3 6 (19 . 3))) - (nnml "") - ((auto-expire . t) (to-address . "ding@@gnus.org"))) -@end example - -$B:G=i$NMWAG$O(B @dfn{$B%0%k!<%WL>(B} $B$G$9(B---$B$I$N$h$&$K$7$m!"(Bgnus $B$,$=$l$K$h$C$F(B -$B%0%k!<%W$rCN$C$F$$$k$b$N$G$9!#FsHVL\$NMWAG$O(B @dfn{$B9XFIEY(B} $B$G!"IaDL$O>.$5(B -$B$J@0?t$G$9!#(B($B$=$l$O(B @dfn{$B3,5i(B} $B$K$J$k;v$b$G$-$^$9!#$=$l$O!"%3%s%9%;%k$G!"(B -@code{car} $B$,%l%Y%k$G!"(B@code{cdr} $B$,%9%3%"$G$9!#(B) $B;0HVL\$NMWAG$O4{FI5-;v(B -$B$NHO0O$N%j%9%H$G$9!#;MHVL\$NMWAG$O$$$m$$$m$Je$N%5!<%P!<$G$9(B)$B!#O;HVL\$NMWAG$O(B @dfn{$B%0%k!<%W%Q%i%a!<%?(B} $B$N%j%9%H(B -$B$G!"$3$NItJ,$O$=$N$?$a$K$"$j$^$9!#(B - -$B:G8e$N;0$D$NMWAG$O$I$l$G$b!"I,MW$,L5$1$l$PB8:_$7$J$$;v$b$"$j$^$9!#o$KBgItJ,$O:G=i$N;0$D$NMWAG$@$1$r;}$A!"$=$l$O$?$/$5$s$N%3%s(B -$B%9%;%k$r@aLs$9$k;v$,$G$-$^$9!#(B - -$B$3$l$O%0%k!<%W>pJsMM<0$N(B BNF $BDj5A$G$9(B: - -@example -info = "(" group space ralevel space read - [ "" / [ space marks-list [ "" / [ space method [ "" / - space parameters ] ] ] ] ] ")" -group = quote quote -ralevel = rank / level -level = -rank = "(" level "." score ")" -score = -read = range -marks-lists = nil / "(" *marks ")" -marks = "(" range ")" -method = "(" *elisp-forms ")" -parameters = "(" *elisp-forms ")" -@end example - -$B} $B$,(B @samp{range} $B$N>e$K9=@.$5$l$F$$$k$b$N(B -$B$G$9$,!"5?;w(B BNF $B$G$=$l$r8=$9$N$OITL{2w$J$b$N$G$9!#(B - -$B$b$7(B gnus $B>pJs$r;}$C$F$$$F!"MWAG$rD4$Y$?$$$N$H$-$O!"(Bgnus $B$O$=$l$i$NMWAG(B -$B$r$rpJs$N%j%9%H$G$9!#@_Dj4X?t$OFs$D(B -$B$N0z?t$rpJs%j%9%H$H?7$7$$CM$G$9!#(B - -$B%0%k!<%W>pJs$N:G8e$N;0$D$NMWAG$O6/@)E*$J$b$N$G$O$"$j$^$;$s$N$G!"MWAG$r@_(B -$BDj$9$kA0$K%0%k!<%W>pJs$r3HD%$9$kI,MW$,$"$k$+$bCN$l$^$;$s!#$b$7$3$l$,I,MW(B -$B$J>l9g$O!"$3$l$,<+F0E*$K5/$3$k$?$a$K(B @code{nil} $B$G$J$$;0HVL\$N0z?t$r;0$D(B -$B$N:G=*@_Dj4X?t$KM?$($k$@$1$G$9!#(B - -@node Extended Interactive -@subsection $B3HD%BPOC(B -@cindex interactive -@findex gnus-interactive - -Gnus $B$O(B Emacs $B$NI8=`$N(B @code{interactive} $B;XDj$r%7%s%\%k@\F,<-$r4JC1$K;H(B -$B$($k$?$a$K>/$73HD%$7$F$$$^$9(B (@pxref{Symbolic Prefixes})$B!#$3$l$O$=$N;H$$(B -$BJ}$NNc$G$9(B: - -@lisp -(defun gnus-summary-increase-score (&optional score symp) - (interactive (gnus-interactive "P\ny")) - ... - ) -@end lisp - -$B:G>e$NJ}K!$O(B @code{gnus-interactive} $B$r<0(B @code{interactive} $B$rJV$9%^%/(B -$B%m$H$7$F/$72C$($^$9!#(B - -@table @samp -@item y -@vindex gnus-current-prefix-symbol -$B8=:_$N@\F,0z?t%7%s%\%k(B---$BJQ?t(B @code{gnus-current-prefix-symbol} $B$G$9!#(B - -@item Y -@vindex gnus-current-prefix-symbols -$B8=:_$N@\F,0z?t%7%s%\%k$N%j%9%H$G$9(B---$BJQ(B -$B?t(B @code{gnus-current-prefix-symbol} $B$G$9!#(B - -@item A -$B8=:_$N5-;vHV9f$G$9(B---$B4X?t(B @code{gnus-summary-article-number} $B$G$9!#(B - -@item H -$B8=:_$N5-;v%X%C%@!<$G$9(B---$B4X?t(B @code{gnus-summary-article-header} $B$G$9!#(B - -@item g -$B8=:_$N%0%k!<%WL>$G$9(B---$B4X?t(B @code{gnus-group-group-name} $B$G$9!#(B -@end table - -@node Emacs/XEmacs Code -@subsection Emacs/XEmacs $B%3!<%I(B -@cindex XEmacs -@cindex Emacsen - -Gnus $B$O(B Emacs, XEmacs $B$H(B Mule $B$GF0:n$7$^$9$N$G!"$=$N$&$A$N0l$D$ro$KLr$KN)$A$^$9!#(B - -$B;d$O7QB3E*$K(B Emacs $B$N4X?t$N3&LL(B (interface) $B$r;H$C$F$-$^$7$?$,!"4X?t$K(B -$B$O(B gnus $B$NJLL>4X?t(B (alias) $B$r;H$C$F$-$^$7$?!#Nc$r=P$7$^$7$g$&(B: Emacs $B$O(B -$B4X?t(B @code{run-at-time} $B$rDj5A$7$F$$$^$9$,!"(BXEmacs $B$O4X(B -$B?t(B @code{start-itimer} $B$rDj5A$7$F$$$^$9!#$=$3$G;d(B -$B$O(B @code{gnus-run-at-time} $B$H8F$P$l$k4X?t$rDj5A$7!"$=$l(B -$B$O(B Emacs $B$N(B @code{run-at-time} $B$HF1$80z?t$r4X?t(B (alias) $B$K$J$C$F$$$^(B -$B$9!#$7$+$7!"(BXEmacs $B$G4X?t(B (alias) $B$H(B -$B$J$C$F$$$^$9(B: - -@lisp -(defun gnus-xmas-run-at-time (time repeat function &rest args) - (start-itimer - "gnus-run-at-time" - `(lambda () - (,function ,@@args)) - time repeat)) -@end lisp - -$B$3$Nl9g$O!";d$OBe$o$j$K$=$l$r;H$$$^(B -$B$9!#Nc$($P!"(B@code{gnus-region-active-p} $B$O(B XEmacs $B$G(B -$B$O(B @code{region-active-p} $B$NJLL>$G$"$k$N$KBP$7$F!"(BEmacs $B$G$O4X?t$G$9!#(B - -$B$b$A$m$s!";d$O(B XEmacs $B$r;d$N4pK\%W%i%C%H%U%)!<%`$KA*$s$G!"4X?t$N3d$jEv$F(B -$B$r5U$K$9$k;v$b$G$-$^$7$?!#$G$b!";d$O$=$&$7$^$;$s$G$7$?!#(B -XEmacs $B$G(B gnus $B$r/$7$G(B -$B$7$g$&!#(B - -@node Various File Formats -@subsection $B$$$m$$$m$J%U%!%$%kMM<0(B - -@menu -* Active File Format:: $B;HMQ2DG=$J5-;v%0%k!<%W$N>pJs(B -* Newsgroups File Format:: $B%0%k!<%W$N5-=R(B -@end menu - -@node Active File Format -@subsubsection $B%"%/%F%$%V%U%!%$%kMM<0(B - -$B%"%/%F%#%V%U%!%$%k$OEv$N%5!<%P!<$NA4$F$N;HMQ2DG=$J%0%k!<%W$N0lMw$r5s$2$^(B -$B$9!#$=$l$O$=$l$>$l$N%0%k!<%W$N:GDc$H:G9b$N5-;vHV9f$N0lMw$b$"$j$^$9!#(B - -$B$3$l$OIaDL$N%"%/%F%#%V%U%!%$%k$+$i$NH4?h$G$9(B: - -@example -soc.motss 296030 293865 y -alt.binaries.pictures.fractals 3922 3913 n -comp.sources.unix 1605 1593 m -comp.binaries.ibm.pc 5097 5089 y -no.general 1000 900 y -@end example - -$B$3$l$O$3$N%U%!%$%k$N5?;w(B BNF $BDj5A$G$9!#(B - -@example -active = *group-line -group-line = group spc high-number spc low-number spc flag -group = -spc = " " -high-number = -low-number = -flag = "y" / "n" / "m" / "j" / "x" / "=" group -@end example - -$B$3$N%U%!%$%k$N40A4$J5-=R$rF@$k$?$a$K$O!"(B@samp{innd} $B$N%^%K%e%"%kJG!"FC(B -$B$K(B @samp{active(5)} $B$r8+$F2<$5$$!#(B - -@node Newsgroups File Format -@subsubsection $B%K%e!<%9%0%k!<%W%U%!%$%kMM<0(B - -$B%K%e!<%9%0%k!<%W%U%!%$%k$O%0%k!<%W$r$=$N5-=R$H6&$K0lMw$r5s$2$^$9!#%5!<%P!<(B -$B$K$"$kA4$F$N%0%k!<%W$,0lMw$K$5$l$J$1$l$P$J$i$J$$$N$G$O$J$/!"$^$?!"%U%!%$(B -$B%k$NA4$F$N%0%k!<%W$,%5!<%P!<$KB8:_$7$J$1$l$P$J$i$J$$$N$G$O$"$j$^$;$s!#$3(B -$B$N%U%!%$%k$O=c?h$KMxMQpJs$N$?$a$K$"$j$^$9!#(B - -$BMM<0$OHs>o$K4JC1$G$9(B: $B%0%k!<%WL>!"%?%V!"$=$7$F5-=R$G$9!#$3$l$ODj5A$G$9(B: - -@example -newsgroups = *line -line = group tab description -group = -tab = -description = -@end example - -@page -@node Emacs for Heathens -@section $B0[65EL$X$N(B Emacs - -$B?.$8$k$+$I$&$+$OCN$j$^$;$s$,!"(Bgnus $B$r;H$&?M$NCf$K$O(B Gnus Love Boat $B$G$N(B -$BN9$KEk>h$9$kA0$K$"$^$j(B Emacs $B$r;H$C$?;v$,L5$$$H$$$&?M$,$$$^$9!#$b$7$"$J(B -$B$?$,(B ``@kbd{M-C-a}'' $B$d(B ``$B%j!<%8%g%s$r@Z$k(B''$B!"$=$7(B -$B$F(B ``@code{gnus-flargblossen} $B$rO"A[%j%9%H$K@_Dj$7$F$/$@$5$$!#$=$N%-!<$O(B -$B%0%k!<%WL>$K9gCW$9$k$?$a$K;H$o$l$k@55,I=8=$G$9(B'' $B$,>/$7$N0UL#$+A4$/0UL#(B -$B$NL5$$KbK!$N8@MU$G$"$kIT9,$J?M$G$"$l$P!"$3$NIUO?$O$"$J$?$N$?$a$K$"$j$^$9!#(B -$B$b$7$"$J$?$,4{$K(B Emacs $B$K?F$7$s$G$$$k$N$G$"$l$P!"$3$l$rL5;k$7$FO$rF~NO$7$FL?Na$ro$K$&$k$5$/46$8$i$l$k$G$7$g$&!#;D$j$N?M!9$O!"$=(B -$B$l$K$h$j$b$?$i$5$l$kCO9v$r0&$7$^$9!#$"$-$i$a$FI~=>$7$F2<$5$$!#(BEmacs $B$OK\(B -$BEv$O(B ``Escape-Meta-Alt-Control-Shift'' $B$NN,$G!"B>$NI>H=$N0-$$=P(B -$B=j(B (Emacs $B$N:n.;X$N6a$/$K0LCV$7$F$*$j!"IaDL$OBgJ8;z$d$=$NB>$N$b$rF@(B -$B$k$?$a$K;H$o$l$^$9!#$"$J$?$O$:$C$H$=$l$r;H$&;v$G$7$g$&!#%3%s%H%m!<%k%-!<(B -$B$OIaDL$O(B ``CTRL'' $B$d$=$N$h$&$J$b$N$G0u$,IU$$$F$$$^$9!#%a%?%-!<$O!"$*$b$7(B -$B$m$$;v$K!"$I$N%-!<%\!<%I$G$b$=$N$h$&$K0u$,IU$1$i$l$F$$$^$;$s!#$=$l$OIaDL(B -$B$O%-!<%\!<%I$N:8/$7J#;($K$J$C$F$$$^$9!#$=$N$h$&$J>l9g$O!"(B``$B%(%9%1!<%W(B'' $B%-!<$r;H$&;v$,(B -$B$G$-$^$9!#$=$l$O%a%?%-!<$r;}$C$F$$$k$H$-$h$j$b$C$H:n6H$,BgJQ$K$J$j$^$9$N(B -$B$G!"$=$&$$$&>l9g$O!";d$O%a%?%-!<$N$"$k%-!<%\!<%I$r$l$NA4$F$N%-!<$O2?$i$+$N(B Emacs Lisp $B$N%3!<%I$N(B -$B>.JR$r/$J$/$H$b(B Lisp $B%3!<%I$N=q$-J}$rCN$C$F$$$l$P!#(B) $B$7$+$7!"$=$l$O$3$N%^(B -$B%K%e%"%k$NHO0O30$J$N$G!"2f!9$OC1$K(B gnus $B$r%+%9%?%^%$%:$9$k$?$a$K%U%!%$(B -$B%k(B @file{.emacs} $B$GIaDL;H$o$l$k$$$/$D$+$NIaDL$N9=J8$K$D$$$F$@$1OC$r$7$^(B -$B$9!#(B - -$B$b$7JQ?t(B@code{gnus-florgbnize} $B$r;M(B (4) $B$K@_Dj$7$?$$$N$G$"$l$P!"0J2<$N$b(B -$B$N$r=q$-$^$9(B: - -@lisp -(setq gnus-florgbnize 4) -@end lisp - -$B$3$N4X?t(B @code{setq} ($BK\Ev$O(B ``$BFC2A(B} ($B$=$l$O(B ``$B2A(B} $B$7!"$=$l$O$3$3$G$O4JC1$J(B @code{setq} $BJ8$G$9!#(B - -$B$,$s$P$C$F(B---$B$b$7$"$J$?$,(B Emacs $B$NA0$K$"$k$N$G$"$l$P$A$g$C$H;n$7$F2<$5$$!#(B -@kbd{C-x C-e} $B$N8e$G!"H?6A6h0h(B (echo area) $B$K(B @samp{4} $B$,8=$o$l$k$N$,8+(B -$B$($k$G$7$g$&!#$=$l$O$"$J$?$,(B @code{$BI>2A(B} $B$7$?<0$NJV$jCM$G$9!#(B - -$B$$$/$D$+$NMn$H$77j(B: - -$B$b$7%^%K%e%"%k$,(B ``@code{gnus-read-active-file} $B$r(B @code{some} $B$K@_Dj$7(B -$B$J$5$$(B'' $B$H8@$C$?$J$i!"$=$l$O(B: - -@lisp -(setq gnus-read-active-file 'some) -@end lisp - -$B$H8@$&;v$G$9!#(B - -$B0lJ}!"%^%K%e%"%k(B -$B$,(B ``@code{gnus-nntp-server} $B$r(B @samp{nntp.ifi.uio.no} $B$K@_Dj$7$J$5$$(B'' $B$H(B -$B8@$C$?$J$i!"$=$l$O(B: - -@lisp -(setq gnus-nntp-server "nntp.ifi.uio.no") -@end lisp - -$B$H8@$&;v$G$9!#(B - -$B$G$9$+$i!"J8;zNs(B ($B8eu%U%!%$%k!"%"%/%F%#%V%U%!%$%k(B -adapt $BE,MQ(B -adaptive $BE,1~@-(B -address $B%"%I%l%9(B -agent $B%(!<%8%'%s%H(B -alist $BO"A[%j%9%H(B -alternate $BBeBX(B -anything group $B$J$s$G$b%0%k!<%W(B -archive $B%"!<%+%$%V(B -asterisk $B%"%9%?%j%9%/(B -auto-save file $B<+F0J]B8%U%!%$%k(B -backend $B%P%C%/%(%s%I(B -batch $B0l3g(B -bogus group $B56%0%k!<%W(B -browse $B%V%i%&%:!";2>H!"354Q(B -buffer $B%P%C%U%!(B -buggy $B8N>c$,$A(B -category $BJ,N`(B -collapsed group name $BC;=L%0%k!<%WL>(B -combined groups $B7k9g%0%k!<%W(B -command $BL?Na(B -command line $B%3%^%s%I9T(B -configure (shell script) $B4D6-@_Dj(B -copy $B%3%T!C5n!"4|8B@Z$l:o=|(B -expunge $B>C5n(B -field $B%U%#!<%k%I(B -firewall $BKIJI(B -flush cache $B%-%c%C%7%e$r=q$-9~$`(B -follow up $B%U%)%m!<%"%C%W(B -foreign $B30It(B -format $BMM<0!"%U%)!<%^%C%H(B -frame $B%U%l!<%`(B -gateway $B%2!<%H%&%'%$(B -global $B%0%m!<%P%k(B -Gnus gnus -group buffer $B%0%k!<%W%P%C%U%!(B -header $B%X%C%@!<(B -highlight $B%O%$%i%$%H(B -history $BMzNr(B -home score file $B%[!<%`%9%3%"%U%!%$%k(B -hook $B%U%C%/(B -inbox $B%$%s%\%C%/%9(B -indentation $B;z2<$2(B -interactive command $BBPOCL?Na(B -interface $B%$%s%?!<%U%'!<%9(B -kiboze kiboze -key (alist) $B%-!<(B -keymap $B%-!<%^%C%W(B -kiboze kiboze -kill $B:o=|!"@Z$k!"%-%k(B -kill file $B:o=|%U%!%$%k!"(B($B>C5n%U%!%$%k(B) -level $B%l%Y%k(B -load $B%m!<%I(B -local variable $B6I=jJQ?t!"%m!<%+%kJQ?t(B -lower lebel $B>.$5$$%l%Y%k(B -mail $B%a!<%k(B -mailbox $B%a!<%k%\%C%/%9(B -mail-to-news gateway $B%a!<%k$+$i%K%e!<%:$X$N%2!<%H%&%'%$(B -mark $B0u(B -meta-variable $B%a%?JQ?t(B -message $B%a%C%;!<%8(B -method $BJ}K!(B -minor mode $B%^%$%J!<%b!<%I(B -modeline $B%b!<%I9T(B -moderated $B%b%G%l!<%F%C%I!"=$@5$5$l$?(B -native $B4pK\(B -native method $B4pK\J}K!(B -native server $B4pK\%5!<%P!<(B -news $B%K%e!<%9(B ($B%K%e!<%:(B) -newsgroup $B%K%e!<%9%0%k!<%W(B ($B%K%e!<%:%0%k!<%W(B) -news reader $B%K%e!<%9%j!<%@(B -numeric prefix $B?t;z@\F,0z?t(B -operator $B:nMQ;R(B -outgoing $B:9=PMQ(B -overview $B354Q%U%!%$%k(B -pack $B:-Jq$9$k(B -parameter $B%Q%i%a!<%?(B -plugged $B:9$79~$_(B -point $B%]%$%s%H!"%+!<%=%k0LCV(B -predicate function $B=R8l4X?t(B -prefix $B@\F,0z?t(B -process $B%W%m%;%9(B -process mark ($B%W%m%;%9%^!<%/(B)$B!"%W%m%;%90u(B -process/prefix convention $B%W%m%;%9(B/$B@\F,0z?t$N=,47(B ($B%W%m%;%9%^!<%/!&%W%l%U%#%C%/%9%k!<%k(B) -prompt $BF~NOB%?J(B -rank $B%i%s%/(B -region ($B%j!<%8%g%s(B) -release $B%j%j!<%9(B -remote system $B1s3V%7%9%F%`(B -reply packet $BJV?.%Q%1%C%H(B -response packet $BJV?.%Q%1%C%H(B -startup file $B5/F0%U%!%$%k(B -score $B%9%3%"(B -score entry $B%9%3%"EPO?(B -secondary server $BFs%s%S(B - -summary $B35N,(B -body $B%\%G%#(B -head $B%X%C%@!<(B -subject $BI=Bj(B -match $B%^%C%A(B -encode $BId9f2=(B -character set $BJ8;z=89g(B -hook $B%U%C%/(B -keystroke $B%-! #1}} - -\newcommand{\gnusbullet}{{${\bullet}$}} -\newcommand{\gnusdollar}{\$} -\newcommand{\gnusampersand}{\&} -\newcommand{\gnuspercent}{\%} -\newcommand{\gnushash}{\#} -\newcommand{\gnushat}{\symbol{"5E}} -\newcommand{\gnusunderline}{\symbol{"5F}} -\newcommand{\gnusnot}{$\neg$} -\newcommand{\gnustilde}{\symbol{"7E}} -\newcommand{\gnusless}{{$<$}} -\newcommand{\gnusgreater}{{$>$}} -\newcommand{\gnusbraceleft}{{$>$}} -\newcommand{\gnusbraceright}{{$>$}} - -\newcommand{\gnushead}{\raisebox{-1cm}{\epsfig{figure=ps/gnus-head.eps,height=1cm}}} -\newcommand{\gnusinteresting}{ -\marginpar[\mbox{}\hfill\gnushead]{\gnushead} -} - -\newcommand{\gnuscleardoublepage}{\ifodd\count0\mbox{}\clearpage\thispagestyle{empty}\mbox{}\clearpage\else\clearpage\fi} - -\newcommand{\gnuspagechapter}[1]{ -{\mbox{}} -} - -\newdimen{\gnusdimen} -\gnusdimen 0pt - -\newcommand{\gnuschapter}[2]{ -\gnuscleardoublepage -\ifdim \gnusdimen = 0pt\setcounter{page}{1}\pagestyle{gnus}\pagenumbering{arabic} \gnusdimen 1pt\fi -\chapter{#2} -\renewcommand{\gnussectionname}{} -\renewcommand{\gnuschaptername}{#2} -\thispagestyle{empty} -\hspace*{-2cm} -\begin{picture}(500,500)(0,0) -\put(480,350){\makebox(0,0)[tr]{#1}} -\put(40,300){\makebox(500,50)[bl]{{\Huge\bf{#2}}}} -\end{picture} -\clearpage -} - -\newcommand{\gnusfigure}[3]{ -\begin{figure} -\mbox{}\ifodd\count0\hspace*{-0.8cm}\else\hspace*{-3cm}\fi\begin{picture}(440,#2) -#3 -\end{picture} -\caption{#1} -\end{figure} -} - -\newcommand{\gnusicon}[1]{ -\marginpar[\mbox{}\hfill\raisebox{-1.5cm}{\epsfig{figure=tmp/#1-up.ps,height=1.5cm}}]{\raisebox{-1cm}{\epsfig{figure=tmp/#1-up.ps,height=1cm}}} -} - -\newcommand{\gnuspicon}[1]{ -\margindex{\epsfig{figure=#1,width=2cm}} -} - -\newcommand{\gnusxface}[2]{ -\margindex{\epsfig{figure=#1,width=1cm}\epsfig{figure=#2,width=1cm}} -} - -\newcommand{\gnussmiley}[2]{ -\margindex{\makebox[2cm]{\hfill\epsfig{figure=#1,width=0.5cm}\hfill\epsfig{figure=#2,width=0.5cm}\hfill}} -} - -\newcommand{\gnusitemx}[1]{\mbox{}\vspace*{-\itemsep}\vspace*{-\parsep}\item#1} - -\newcommand{\gnussection}[1]{ -\renewcommand{\gnussectionname}{#1} -\section{#1} -} - -\newenvironment{codelist}% -{\begin{list}{}{ -} -}{\end{list}} - -\newenvironment{kbdlist}% -{\begin{list}{}{ -\labelwidth=0cm -} -}{\end{list}} - -\newenvironment{dfnlist}% -{\begin{list}{}{ -} -}{\end{list}} - -\newenvironment{stronglist}% -{\begin{list}{}{ -} -}{\end{list}} - -\newenvironment{samplist}% -{\begin{list}{}{ -} -}{\end{list}} - -\newenvironment{varlist}% -{\begin{list}{}{ -} -}{\end{list}} - -\newenvironment{emphlist}% -{\begin{list}{}{ -} -}{\end{list}} - -\newlength\gnusheadtextwidth -\setlength{\gnusheadtextwidth}{\headtextwidth} -\addtolength{\gnusheadtextwidth}{1cm} - -\newpagestyle{gnuspreamble}% -{ -{ -\ifodd\count0 -{ -\hspace*{-0.23cm}\underline{\makebox[\gnusheadtextwidth]{\mbox{}}\textbf{\hfill\roman{page}}} -} -\else -{ -\hspace*{-3.25cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\roman{page}\hfill\mbox{}}} -} -} -\fi -} -} -{ -\ifodd\count0 -\mbox{} \hfill -\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}} -\else -\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}} -\hfill \mbox{} -\fi -} - -\newpagestyle{gnusindex}% -{ -{ -\ifodd\count0 -{ -\hspace*{-0.23cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\gnuschaptername\hfill\arabic{page}}}} -} -\else -{ -\hspace*{-3.25cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{page}\hfill\gnuschaptername}}} -} -\fi -} -} -{ -\ifodd\count0 -\mbox{} \hfill -\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}} -\else -\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}} -\hfill \mbox{} -\fi -} - -\newpagestyle{gnus}% -{ -{ -\ifodd\count0 -{ -\makebox[12cm]{\hspace*{3.1cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{chapter}.\arabic{section}} \textbf{\gnussectionname\hfill\arabic{page}}}}} -} -\else -{ -\makebox[12cm]{\hspace*{-2.95cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{page}\hfill\gnuschaptername}}}} -} -\fi -} -} -{ -\ifodd\count0 -\mbox{} \hfill -\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}} -\else -\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}} -\hfill \mbox{} -\fi -} - -\pagenumbering{roman} -\pagestyle{gnuspreamble} - -@end iflatex -@end iftex - -@iftex -@iflatex -\begin{titlepage} -{ - -%\addtolength{\oddsidemargin}{-5cm} -%\addtolength{\evensidemargin}{-5cm} -\parindent=0cm -\addtolength{\textheight}{2cm} - -\gnustitle{\gnustitlename}\\ -\rule{15cm}{1mm}\\ -\vfill -\hspace*{0cm}\epsfig{figure=ps/gnus-big-logo.eps,height=15cm} -\vfill -\rule{15cm}{1mm}\\ -\gnusauthor{by Lars Magne Ingebrigtsen} -\newpage -} - -\mbox{} -\vfill - -\thispagestyle{empty} - -Copyright \copyright{} 1995, 1996, 1997, 1998, 1999, 2000 -Free Software Foundation, Inc. - - -Permission is granted to copy, distribute and/or modify this document -under the terms of the GNU Free Documentation License, Version 1.1 or -any later version published by the Free Software Foundation; with no -Invariant Sections, with the Front-Cover texts being ``A GNU -Manual'', and with the Back-Cover Texts as in (a) below. A copy of the -license is included in the section entitled ``GNU Free Documentation -License'' in the Emacs manual. - -(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify -this GNU Manual, like GNU software. Copies published by the Free -Software Foundation raise funds for GNU development.'' - -This document is part of a collection distributed under the GNU Free -Documentation License. If you want to distribute this document -separately from the collection, you can do so by adding a copy of the -license to the document, as described in section 6 of the license. -\newpage -\end{titlepage} -@end iflatex -@end iftex - -@ifnottex - -This file documents gnus, the GNU Emacs newsreader. - -Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. - -Permission is granted to copy, distribute and/or modify this document -under the terms of the GNU Free Documentation License, Version 1.1 or -any later version published by the Free Software Foundation; with the -Invariant Sections being none, with the Front-Cover texts being ``A GNU -Manual'', and with the Back-Cover Texts as in (a) below. A copy of the -license is included in the section entitled ``GNU Free Documentation -License'' in the Emacs manual. - -(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify -this GNU Manual, like GNU software. Copies published by the Free -Software Foundation raise funds for GNU development.'' - -This document is part of a collection distributed under the GNU Free -Documentation License. If you want to distribute this document -separately from the collection, you can do so by adding a copy of the -license to the document, as described in section 6 of the license. -@end ifnottex - -@tex - -@titlepage -@title T-gnus 6.15 Manual - -@author by Lars Magne Ingebrigtsen -@page - -@vskip 0pt plus 1filll -Copyright @copyright{} 1995, 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. - -Permission is granted to copy, distribute and/or modify this document -under the terms of the GNU Free Documentation License, Version 1.1 or -any later version published by the Free Software Foundation; with no -Invariant Sections, with the Front-Cover texts being ``A GNU -Manual'', and with the Back-Cover Texts as in (a) below. A copy of the -license is included in the section entitled ``GNU Free Documentation -License'' in the Emacs manual. - -(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify -this GNU Manual, like GNU software. Copies published by the Free -Software Foundation raise funds for GNU development.'' - -This document is part of a collection distributed under the GNU Free -Documentation License. If you want to distribute this document -separately from the collection, you can do so by adding a copy of the -license to the document, as described in section 6 of the license. - -@end titlepage -@page - -@end tex - - -@node Top -@top The gnus Newsreader - -@ifinfo - -You can read news (and mail) from within Emacs by using gnus. The news -can be gotten by any nefarious means you can think of---@sc{nntp}, local -spool or your mbox file. All at the same time, if you want to push your -luck. - -T-gnus provides MIME features based on SEMI API. So T-gnus supports -your right to read strange messages including big images or other -various kinds of formats. T-gnus also supports -internationalization/localization and multiscript features based on MULE -API. So T-gnus does not discriminate various language communities. -Oh, if you are a Klingon, please wait Unicode Next Generation. - -This manual corresponds to T-gnus 6.15. - -@end ifinfo - -@iftex - -@iflatex -\tableofcontents -\gnuscleardoublepage -@end iflatex - -Gnus is the advanced, self-documenting, customizable, extensible -unreal-time newsreader for GNU Emacs. - -Oops. That sounds oddly familiar, so let's start over again to avoid -being accused of plagiarism: - -Gnus is a message-reading laboratory. It will let you look at just -about anything as if it were a newsgroup. You can read mail with it, -you can browse directories with it, you can @code{ftp} with it---you -can even read news with it! - -Gnus tries to empower people who read news the same way Emacs empowers -people who edit text. Gnus sets no limits to what the user should be -allowed to do. Users are encouraged to extend gnus to make it behave -like they want it to behave. A program should not control people; -people should be empowered to do what they want by using (or abusing) -the program. - -@end iftex - -@menu -* Starting Up:: Finding news can be a pain. -* Group Buffer:: Selecting, subscribing and killing groups. -* Summary Buffer:: Reading, saving and posting articles. -* Article Buffer:: Displaying and handling articles. -* Composing Messages:: Information on sending mail and news. -* Select Methods:: Gnus reads all messages from various select methods. -* Scoring:: Assigning values to articles. -* Various:: General purpose settings. -* The End:: Farewell and goodbye. -* 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? -* Changing Servers:: You may want to move from one server to another. -* 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. -* 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. - -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. -* Subscription Commands:: Unsubscribing, killing, subscribing. -* Group Data:: Changing the info for a group. -* 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. - -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. -* Delayed Articles:: -* Marking Articles:: Marking articles as read, expirable, etc. -* Limiting:: You can limit the summary buffer. -* Threading:: How threads are made. -* Sorting the Summary Buffer:: 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, - or reselecting the current group. -* Crosspost Handling:: How crossposted articles are dealt with. -* Duplicate Suppression:: An alternative when crosspost handling fails. -* Security:: Decrypt and Verify. -* Mailing List:: Mailing list minor mode. - -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:: - -Marking Articles - -* Unread Articles:: Marks for unread articles. -* Read Articles:: Marks for read articles. -* Other Marks:: Marks that do not affect readedness. -* Setting Marks:: -* Generic Marking Commands:: -* Setting Process Marks:: - -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:: -* Really Various Summary Commands:: Those pesky non-conformant commands. - -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. -* 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? -* Using GPG:: How to use GPG and MML to sign and encrypt messages - -Select Methods - -* 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. - -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. - -@sc{nntp} - -* Direct Functions:: Connecting directly to the server. -* Indirect Functions:: Connecting indirectly to the server. -* Common Variables:: Understood by several connection functions. - -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. -* Archiving Mail:: How to backup your mail. - -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. -* RSS:: Reading RDF site summary. -* Customizing w3:: Doing stuff to Emacs/w3 from Gnus. - -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. -* Agent and IMAP:: How to use the Agent with IMAP. -* 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. -* 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 On Other Headers:: Scoring on non-standard headers. -* 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. -* Window Layout:: 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 tendinitis 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. -* Positioning Point:: Moving point to a position after an operation. -* Tabulation:: Tabulating your output. -* Wide Characters:: Dealing with wide characters. - -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. - -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. - -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.2/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. -* Pterodactyl Gnus:: Pentad also starts with P, AKA Gnus 5.8/5.9. - -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 -@chapter Starting gnus -@cindex starting up - -@kindex M-x gnus -@findex gnus -If your system administrator has set things up properly, starting gnus -and reading news is extremely easy---you just type @kbd{M-x gnus} in -your Emacs. - -@findex gnus-other-frame -@kindex M-x gnus-other-frame -If you want to start gnus in a different frame, you can use the command -@kbd{M-x gnus-other-frame} instead. - -If things do not go smoothly at startup, you have to twiddle some -variables in your @file{~/.gnus} file. This file is similar to -@file{~/.emacs}, but is read when gnus starts. - -If you puzzle at any terms used in this manual, please refer to the -terminology section (@pxref{Terminology}). - -@menu -* 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? -* Changing Servers:: You may want to move from one server to another. -* 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. -* Startup Variables:: Other variables you might change. -@end menu - - -@node Finding the News -@section Finding the News -@cindex finding news - -@vindex gnus-select-method -@c @head -The @code{gnus-select-method} variable says where gnus should look for -news. This variable should be a list where the first element says -@dfn{how} and the second element says @dfn{where}. This method is your -native method. All groups not fetched with this method are -foreign groups. - -For instance, if the @samp{news.somewhere.edu} @sc{nntp} server is where -you want to get your daily dosage of news from, you'd say: - -@lisp -(setq gnus-select-method '(nntp "news.somewhere.edu")) -@end lisp - -If you want to read directly from the local spool, say: - -@lisp -(setq gnus-select-method '(nnspool "")) -@end lisp - -If you can use a local spool, you probably should, as it will almost -certainly be much faster. - -@vindex gnus-nntpserver-file -@cindex NNTPSERVER -@cindex @sc{nntp} server -If this variable is not set, gnus will take a look at the -@code{NNTPSERVER} environment variable. If that variable isn't set, -gnus will see whether @code{gnus-nntpserver-file} -(@file{/etc/nntpserver} by default) has any opinions on the matter. If -that fails as well, gnus will try to use the machine running Emacs as an @sc{nntp} server. That's a long shot, though. - -@vindex gnus-nntp-server -If @code{gnus-nntp-server} is set, this variable will override -@code{gnus-select-method}. You should therefore set -@code{gnus-nntp-server} to @code{nil}, which is what it is by default. - -@vindex gnus-secondary-servers -@vindex gnus-nntp-server -You can also make gnus prompt you interactively for the name of an -@sc{nntp} server. If you give a non-numerical prefix to @code{gnus} -(i.e., @kbd{C-u M-x gnus}), gnus will let you choose between the servers -in the @code{gnus-secondary-servers} list (if any). You can also just -type in the name of any server you feel like visiting. (Note that this -will set @code{gnus-nntp-server}, which means that if you then @kbd{M-x -gnus} later in the same Emacs session, Gnus will contact the same -server.) - -@findex gnus-group-browse-foreign-server -@kindex B (Group) -However, if you use one @sc{nntp} server regularly and are just -interested in a couple of groups from a different server, you would be -better served by using the @kbd{B} command in the group buffer. It will -let you have a look at what groups are available, and you can subscribe -to any of the groups you want to. This also makes @file{.newsrc} -maintenance much tidier. @xref{Foreign Groups}. - -@vindex gnus-secondary-select-methods -@c @head -A slightly different approach to foreign groups is to set the -@code{gnus-secondary-select-methods} variable. The select methods -listed in this variable are in many ways just as native as the -@code{gnus-select-method} server. They will also be queried for active -files during startup (if that's required), and new newsgroups that -appear on these servers will be subscribed (or not) just as native -groups are. - -For instance, if you use the @code{nnmbox} backend to read your mail, you -would typically set this variable to - -@lisp -(setq gnus-secondary-select-methods '((nnmbox ""))) -@end lisp - - -@node The First Time -@section The First Time -@cindex first time usage - -If no startup files exist, gnus will try to determine what groups should -be subscribed by default. - -@vindex gnus-default-subscribed-newsgroups -If the variable @code{gnus-default-subscribed-newsgroups} is set, gnus -will subscribe you to just those groups in that list, leaving the rest -killed. Your system administrator should have set this variable to -something useful. - -Since she hasn't, gnus will just subscribe you to a few arbitrarily -picked groups (i.e., @samp{*.newusers}). (@dfn{Arbitrary} is defined -here as @dfn{whatever Lars thinks you should read}.) - -You'll also be subscribed to the gnus documentation group, which should -help you with most common problems. - -If @code{gnus-default-subscribed-newsgroups} is @code{t}, gnus will just -use the normal functions for handling new groups, and not do anything -special. - - -@node The Server is Down -@section The Server is Down -@cindex server errors - -If the default server is down, gnus will understandably have some -problems starting. However, if you have some mail groups in addition to -the news groups, you may want to start gnus anyway. - -Gnus, being the trusting sort of program, will ask whether to proceed -without a native select method if that server can't be contacted. This -will happen whether the server doesn't actually exist (i.e., you have -given the wrong address) or the server has just momentarily taken ill -for some reason or other. If you decide to continue and have no foreign -groups, you'll find it difficult to actually do anything in the group -buffer. But, hey, that's your problem. Blllrph! - -@findex gnus-no-server -@kindex M-x gnus-no-server -@c @head -If you know that the server is definitely down, or you just want to read -your mail without bothering with the server at all, you can use the -@code{gnus-no-server} command to start gnus. That might come in handy -if you're in a hurry as well. This command will not attempt to contact -your primary server---instead, it will just activate all groups on level -1 and 2. (You should preferably keep no native groups on those two -levels.) Also @pxref{Group Levels}. - - -@node Slave Gnusae -@section Slave Gnusae -@cindex slave - -You might want to run more than one Emacs with more than one gnus at the -same time. If you are using different @file{.newsrc} files (e.g., if you -are using the two different gnusae to read from two different servers), -that is no problem whatsoever. You just do it. - -The problem appears when you want to run two Gnusae that use the same -@code{.newsrc} file. - -To work around that problem some, we here at the Think-Tank at the gnus -Towers have come up with a new concept: @dfn{Masters} and -@dfn{slaves}. (We have applied for a patent on this concept, and have -taken out a copyright on those words. If you wish to use those words in -conjunction with each other, you have to send $1 per usage instance to -me. Usage of the patent (@dfn{Master/Slave Relationships In Computer -Applications}) will be much more expensive, of course.) - -Anyway, you start one gnus up the normal way with @kbd{M-x gnus} (or -however you do it). Each subsequent slave gnusae should be started with -@kbd{M-x gnus-slave}. These slaves won't save normal @file{.newsrc} -files, but instead save @dfn{slave files} that contain information only -on what groups have been read in the slave session. When a master gnus -starts, it will read (and delete) these slave files, incorporating all -information from them. (The slave files will be read in the sequence -they were created, so the latest changes will have precedence.) - -Information from the slave files has, of course, precedence over the -information in the normal (i.e., master) @code{.newsrc} file. - - -@node Fetching a Group -@section Fetching a Group -@cindex fetching a group - -@findex gnus-fetch-group -It is sometimes convenient to be able to just say ``I want to read this -group and I don't care whether gnus has been started or not''. This is -perhaps more useful for people who write code than for users, but the -command @code{gnus-fetch-group} provides this functionality in any case. -It takes the group name as a parameter. - - -@node New Groups -@section New Groups -@cindex new groups -@cindex subscription - -@vindex gnus-check-new-newsgroups -If you are satisfied that you really never want to see any new groups, -you can set @code{gnus-check-new-newsgroups} to @code{nil}. This will -also save you some time at startup. Even if this variable is -@code{nil}, you can always subscribe to the new groups just by pressing -@kbd{U} in the group buffer (@pxref{Group Maintenance}). This variable -is @code{ask-server} by default. If you set this variable to -@code{always}, then gnus will query the backends for new groups even -when you do the @kbd{g} command (@pxref{Scanning New Messages}). - -@menu -* 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. -@end menu - - -@node Checking New Groups -@subsection Checking New Groups - -Gnus normally determines whether a group is new or not by comparing the -list of groups from the active file(s) with the lists of subscribed and -dead groups. This isn't a particularly fast method. If -@code{gnus-check-new-newsgroups} is @code{ask-server}, gnus will ask the -server for new groups since the last time. This is both faster and -cheaper. This also means that you can get rid of the list of killed -groups altogether, so you may set @code{gnus-save-killed-list} to -@code{nil}, which will save time both at startup, at exit, and all over. -Saves disk space, too. Why isn't this the default, then? -Unfortunately, not all servers support this command. - -I bet I know what you're thinking now: How do I find out whether my -server supports @code{ask-server}? No? Good, because I don't have a -fail-safe answer. I would suggest just setting this variable to -@code{ask-server} and see whether any new groups appear within the next -few days. If any do, then it works. If none do, then it doesn't -work. I could write a function to make gnus guess whether the server -supports @code{ask-server}, but it would just be a guess. So I won't. -You could @code{telnet} to the server and say @code{HELP} and see -whether it lists @samp{NEWGROUPS} among the commands it understands. If -it does, then it might work. (But there are servers that lists -@samp{NEWGROUPS} without supporting the function properly.) - -This variable can also be a list of select methods. If so, gnus will -issue an @code{ask-server} command to each of the select methods, and -subscribe them (or not) using the normal methods. This might be handy -if you are monitoring a few servers for new groups. A side effect is -that startup will take much longer, so you can meditate while waiting. -Use the mantra ``dingnusdingnusdingnus'' to achieve permanent bliss. - - -@node Subscription Methods -@subsection Subscription Methods - -@vindex gnus-subscribe-newsgroup-method -What gnus does when it encounters a new group is determined by the -@code{gnus-subscribe-newsgroup-method} variable. - -This variable should contain a function. This function will be called -with the name of the new group as the only parameter. - -Some handy pre-fab functions are: - -@table @code - -@item gnus-subscribe-zombies -@vindex gnus-subscribe-zombies -Make all new groups zombies. This is the default. You can browse the -zombies later (with @kbd{A z}) and either kill them all off properly -(with @kbd{S z}), or subscribe to them (with @kbd{u}). - -@item gnus-subscribe-randomly -@vindex gnus-subscribe-randomly -Subscribe all new groups in arbitrary order. This really means that all -new groups will be added at ``the top'' of the group buffer. - -@item gnus-subscribe-alphabetically -@vindex gnus-subscribe-alphabetically -Subscribe all new groups in alphabetical order. - -@item gnus-subscribe-hierarchically -@vindex gnus-subscribe-hierarchically -Subscribe all new groups hierarchically. The difference between this -function and @code{gnus-subscribe-alphabetically} is slight. -@code{gnus-subscribe-alphabetically} will subscribe new groups in a strictly -alphabetical fashion, while this function will enter groups into its -hierarchy. So if you want to have the @samp{rec} hierarchy before the -@samp{comp} hierarchy, this function will not mess that configuration -up. Or something like that. - -@item gnus-subscribe-interactively -@vindex gnus-subscribe-interactively -Subscribe new groups interactively. This means that gnus will ask -you about @strong{all} new groups. The groups you choose to subscribe -to will be subscribed hierarchically. - -@item gnus-subscribe-killed -@vindex gnus-subscribe-killed -Kill all new groups. - -@item gnus-subscribe-topics -@vindex gnus-subscribe-topics -Put the groups into the topic that has a matching @code{subscribe} topic -parameter (@pxref{Topic Parameters}). For instance, a @code{subscribe} -topic parameter that looks like - -@example -"nnslashdot" -@end example - -will mean that all groups that match that regex will be subscribed under -that topic. - -If no topics match the groups, the groups will be subscribed in the -top-level topic. - -@end table - -@vindex gnus-subscribe-hierarchical-interactive -A closely related variable is -@code{gnus-subscribe-hierarchical-interactive}. (That's quite a -mouthful.) If this variable is non-@code{nil}, gnus will ask you in a -hierarchical fashion whether to subscribe to new groups or not. Gnus -will ask you for each sub-hierarchy whether you want to descend the -hierarchy or not. - -One common mistake is to set the variable a few paragraphs above -(@code{gnus-subscribe-newsgroup-method}) to -@code{gnus-subscribe-hierarchical-interactive}. This is an error. This -will not work. This is ga-ga. So don't do it. - - -@node Filtering New Groups -@subsection Filtering New Groups - -A nice and portable way to control which new newsgroups should be -subscribed (or ignored) is to put an @dfn{options} line at the start of -the @file{.newsrc} file. Here's an example: - -@example -options -n !alt.all !rec.all sci.all -@end example - -@vindex gnus-subscribe-options-newsgroup-method -This line obviously belongs to a serious-minded intellectual scientific -person (or she may just be plain old boring), because it says that all -groups that have names beginning with @samp{alt} and @samp{rec} should -be ignored, and all groups with names beginning with @samp{sci} should -be subscribed. Gnus will not use the normal subscription method for -subscribing these groups. -@code{gnus-subscribe-options-newsgroup-method} is used instead. This -variable defaults to @code{gnus-subscribe-alphabetically}. - -@vindex gnus-options-not-subscribe -@vindex gnus-options-subscribe -If you don't want to mess with your @file{.newsrc} file, you can just -set the two variables @code{gnus-options-subscribe} and -@code{gnus-options-not-subscribe}. These two variables do exactly the -same as the @file{.newsrc} @samp{options -n} trick. Both are regexps, -and if the new group matches the former, it will be unconditionally -subscribed, and if it matches the latter, it will be ignored. - -@vindex gnus-auto-subscribed-groups -Yet another variable that meddles here is -@code{gnus-auto-subscribed-groups}. It works exactly like -@code{gnus-options-subscribe}, and is therefore really superfluous, but I -thought it would be nice to have two of these. This variable is more -meant for setting some ground rules, while the other variable is used -more for user fiddling. By default this variable makes all new groups -that come from mail backends (@code{nnml}, @code{nnbabyl}, -@code{nnfolder}, @code{nnmbox}, and @code{nnmh}) subscribed. If you -don't like that, just set this variable to @code{nil}. - -New groups that match this regexp are subscribed using -@code{gnus-subscribe-options-newsgroup-method}. - - -@node Changing Servers -@section Changing Servers -@cindex changing servers - -Sometimes it is necessary to move from one @sc{nntp} server to another. -This happens very rarely, but perhaps you change jobs, or one server is -very flaky and you want to use another. - -Changing the server is pretty easy, right? You just change -@code{gnus-select-method} to point to the new server? - -@emph{Wrong!} - -Article numbers are not (in any way) kept synchronized between different -@sc{nntp} servers, and the only way Gnus keeps track of what articles -you have read is by keeping track of article numbers. So when you -change @code{gnus-select-method}, your @file{.newsrc} file becomes -worthless. - -Gnus provides a few functions to attempt to translate a @file{.newsrc} -file from one server to another. They all have one thing in -common---they take a looong time to run. You don't want to use these -functions more than absolutely necessary. - -@kindex M-x gnus-change-server -@findex gnus-change-server -If you have access to both servers, Gnus can request the headers for all -the articles you have read and compare @code{Message-ID}s and map the -article numbers of the read articles and article marks. The @kbd{M-x -gnus-change-server} command will do this for all your native groups. It -will prompt for the method you want to move to. - -@kindex M-x gnus-group-move-group-to-server -@findex gnus-group-move-group-to-server -You can also move individual groups with the @kbd{M-x -gnus-group-move-group-to-server} command. This is useful if you want to -move a (foreign) group from one server to another. - -@kindex M-x gnus-group-clear-data-on-native-groups -@findex gnus-group-clear-data-on-native-groups -If you don't have access to both the old and new server, all your marks -and read ranges have become worthless. You can use the @kbd{M-x -gnus-group-clear-data-on-native-groups} command to clear out all data -that you have on your native groups. Use with caution. - -After changing servers, you @strong{must} move the cache hierarchy away, -since the cached articles will have wrong article numbers, which will -affect which articles Gnus thinks are read. - - -@node Startup Files -@section Startup Files -@cindex startup files -@cindex .newsrc -@cindex .newsrc.el -@cindex .newsrc.eld - -Now, you all know about the @file{.newsrc} file. All subscription -information is traditionally stored in this file. - -Things got a bit more complicated with @sc{gnus}. In addition to -keeping the @file{.newsrc} file updated, it also used a file called -@file{.newsrc.el} for storing all the information that didn't fit into -the @file{.newsrc} file. (Actually, it also duplicated everything in -the @file{.newsrc} file.) @sc{gnus} would read whichever one of these -files was the most recently saved, which enabled people to swap between -@sc{gnus} and other newsreaders. - -That was kinda silly, so Gnus went one better: In addition to the -@file{.newsrc} and @file{.newsrc.el} files, Gnus also has a file called -@file{.newsrc.eld}. It will read whichever of these files that are most -recent, but it will never write a @file{.newsrc.el} file. You should -never delete the @file{.newsrc.eld} file---it contains much information -not stored in the @file{.newsrc} file. - -@vindex gnus-save-newsrc-file -@vindex gnus-read-newsrc-file -You can turn off writing the @file{.newsrc} file by setting -@code{gnus-save-newsrc-file} to @code{nil}, which means you can delete -the file and save some space, as well as exiting from gnus faster. -However, this will make it impossible to use other newsreaders than -gnus. But hey, who would want to, right? Similarly, setting -@code{gnus-read-newsrc-file} to @code{nil} makes gnus ignore the -@file{.newsrc} file and any @file{.newsrc-SERVER} files, which is -convenient if you have a tendency to use Netscape once in a while. - -@vindex gnus-save-killed-list -If @code{gnus-save-killed-list} (default @code{t}) is @code{nil}, Gnus -will not save the list of killed groups to the startup file. This will -save both time (when starting and quitting) and space (on disk). It -will also mean that Gnus has no record of what groups are new or old, -so the automatic new groups subscription methods become meaningless. -You should always set @code{gnus-check-new-newsgroups} to @code{nil} or -@code{ask-server} if you set this variable to @code{nil} (@pxref{New -Groups}). This variable can also be a regular expression. If that's -the case, remove all groups that do not match this regexp before -saving. This can be useful in certain obscure situations that involve -several servers where not all servers support @code{ask-server}. - -@vindex gnus-startup-file -The @code{gnus-startup-file} variable says where the startup files are. -The default value is @file{~/.newsrc}, with the Gnus (El Dingo) startup -file being whatever that one is, with a @samp{.eld} appended. - -@vindex gnus-save-newsrc-hook -@vindex gnus-save-quick-newsrc-hook -@vindex gnus-save-standard-newsrc-hook -@code{gnus-save-newsrc-hook} is called before saving any of the newsrc -files, while @code{gnus-save-quick-newsrc-hook} is called just before -saving the @file{.newsrc.eld} file, and -@code{gnus-save-standard-newsrc-hook} is called just before saving the -@file{.newsrc} file. The latter two are commonly used to turn version -control on or off. Version control is on by default when saving the -startup files. If you want to turn backup creation off, say something like: - -@lisp -(defun turn-off-backup () - (set (make-local-variable 'backup-inhibited) t)) - -(add-hook 'gnus-save-quick-newsrc-hook 'turn-off-backup) -(add-hook 'gnus-save-standard-newsrc-hook 'turn-off-backup) -@end lisp - -@vindex gnus-init-file -When gnus starts, it will read the @code{gnus-site-init-file} -(@file{.../site-lisp/gnus} by default) and @code{gnus-init-file} -(@file{~/.gnus} by default) files. These are normal Emacs Lisp files -and can be used to avoid cluttering your @file{~/.emacs} and -@file{site-init} files with gnus stuff. Gnus will also check for files -with the same names as these, but with @file{.elc} and @file{.el} -suffixes. In other words, if you have set @code{gnus-init-file} to -@file{~/.gnus}, it will look for @file{~/.gnus.elc}, @file{~/.gnus.el}, -and finally @file{~/.gnus} (in this order). - - - -@node Auto Save -@section Auto Save -@cindex dribble file -@cindex auto-save - -Whenever you do something that changes the gnus data (reading articles, -catching up, killing/subscribing groups), the change is added to a -special @dfn{dribble buffer}. This buffer is auto-saved the normal -Emacs way. If your Emacs should crash before you have saved the -@file{.newsrc} files, all changes you have made can be recovered from -this file. - -If gnus detects this file at startup, it will ask the user whether to -read it. The auto save file is deleted whenever the real startup file is -saved. - -@vindex gnus-use-dribble-file -If @code{gnus-use-dribble-file} is @code{nil}, gnus won't create and -maintain a dribble buffer. The default is @code{t}. - -@vindex gnus-dribble-directory -Gnus will put the dribble file(s) in @code{gnus-dribble-directory}. If -this variable is @code{nil}, which it is by default, gnus will dribble -into the directory where the @file{.newsrc} file is located. (This is -normally the user's home directory.) The dribble file will get the same -file permissions as the @code{.newsrc} file. - -@vindex gnus-always-read-dribble-file -If @code{gnus-always-read-dribble-file} is non-@code{nil}, Gnus will -read the dribble file on startup without querying the user. - - -@node The Active File -@section The Active File -@cindex active file -@cindex ignored groups - -When gnus starts, or indeed whenever it tries to determine whether new -articles have arrived, it reads the active file. This is a very large -file that lists all the active groups and articles on the server. - -@vindex gnus-ignored-newsgroups -Before examining the active file, gnus deletes all lines that match the -regexp @code{gnus-ignored-newsgroups}. This is done primarily to reject -any groups with bogus names, but you can use this variable to make gnus -ignore hierarchies you aren't ever interested in. However, this is not -recommended. In fact, it's highly discouraged. Instead, @pxref{New -Groups} for an overview of other variables that can be used instead. - -@c This variable is -@c @code{nil} by default, and will slow down active file handling somewhat -@c if you set it to anything else. - -@vindex gnus-read-active-file -@c @head -The active file can be rather Huge, so if you have a slow network, you -can set @code{gnus-read-active-file} to @code{nil} to prevent gnus from -reading the active file. This variable is @code{some} by default. - -Gnus will try to make do by getting information just on the groups that -you actually subscribe to. - -Note that if you subscribe to lots and lots of groups, setting this -variable to @code{nil} will probably make gnus slower, not faster. At -present, having this variable @code{nil} will slow gnus down -considerably, unless you read news over a 2400 baud modem. - -This variable can also have the value @code{some}. Gnus will then -attempt to read active info only on the subscribed groups. On some -servers this is quite fast (on sparkling, brand new INN servers that -support the @code{LIST ACTIVE group} command), on others this isn't fast -at all. In any case, @code{some} should be faster than @code{nil}, and -is certainly faster than @code{t} over slow lines. - -Some news servers (old versions of Leafnode and old versions of INN, for -instance) do not support the @code{LIST ACTIVE group}. For these -servers, @code{nil} is probably the most efficient value for this -variable. - -If this variable is @code{nil}, gnus will ask for group info in total -lock-step, which isn't very fast. If it is @code{some} and you use an -@sc{nntp} server, gnus will pump out commands as fast as it can, and -read all the replies in one swoop. This will normally result in better -performance, but if the server does not support the aforementioned -@code{LIST ACTIVE group} command, this isn't very nice to the server. - -If you think that starting up Gnus takes too long, try all the three -different values for this variable and see what works best for you. - -In any case, if you use @code{some} or @code{nil}, you should definitely -kill all groups that you aren't interested in to speed things up. - -Note that this variable also affects active file retrieval from -secondary select methods. - - -@node Startup Variables -@section Startup Variables - -@table @code - -@item gnus-load-hook -@vindex gnus-load-hook -A hook run while gnus is being loaded. Note that this hook will -normally be run just once in each Emacs session, no matter how many -times you start gnus. - -@item gnus-before-startup-hook -@vindex gnus-before-startup-hook -A hook run after starting up gnus successfully. - -@item gnus-startup-hook -@vindex gnus-startup-hook -A hook run as the very last thing after starting up gnus - -@item gnus-started-hook -@vindex gnus-started-hook -A hook that is run as the very last thing after starting up gnus -successfully. - -@item gnus-setup-news-hook -@vindex gnus-setup-news-hook -A hook that is run after reading the @file{.newsrc} file(s), but before -generating the group buffer. - -@item gnus-check-bogus-newsgroups -@vindex gnus-check-bogus-newsgroups -If non-@code{nil}, gnus will check for and delete all bogus groups at -startup. A @dfn{bogus group} is a group that you have in your -@file{.newsrc} file, but doesn't exist on the news server. Checking for -bogus groups can take quite a while, so to save time and resources it's -best to leave this option off, and do the checking for bogus groups once -in a while from the group buffer instead (@pxref{Group Maintenance}). - -@item gnus-inhibit-startup-message -@vindex gnus-inhibit-startup-message -If non-@code{nil}, the startup message won't be displayed. That way, -your boss might not notice as easily that you are reading news instead -of doing your job. Note that this variable is used before -@file{.gnus.el} is loaded, so it should be set in @code{.emacs} instead. - -@item gnus-no-groups-message -@vindex gnus-no-groups-message -Message displayed by gnus when no groups are available. - -@item gnus-play-startup-jingle -@vindex gnus-play-startup-jingle -If non-@code{nil}, play the gnus jingle at startup. - -@item gnus-startup-jingle -@vindex gnus-startup-jingle -Jingle to be played if the above variable is non-@code{nil}. The -default is @samp{Tuxedomoon.Jingle4.au}. - -@end table - - -@node Group Buffer -@chapter Group Buffer -@cindex group buffer - -The @dfn{group buffer} lists all (or parts) of the available groups. It -is the first buffer shown when gnus starts, and will never be killed as -long as gnus is active. - -@iftex -@iflatex -\gnusfigure{The Group Buffer}{320}{ -\put(75,50){\epsfig{figure=tmp/group.ps,height=9cm}} -\put(120,37){\makebox(0,0)[t]{Buffer name}} -\put(120,38){\vector(1,2){10}} -\put(40,60){\makebox(0,0)[r]{Mode line}} -\put(40,58){\vector(1,0){30}} -\put(200,28){\makebox(0,0)[t]{Native select method}} -\put(200,26){\vector(-1,2){15}} -} -@end iflatex -@end iftex - -@menu -* 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. -* Subscription Commands:: Unsubscribing, killing, subscribing. -* Group Data:: Changing the info for a group. -* 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. -@end menu - - -@node Group Buffer Format -@section Group Buffer Format - -@menu -* 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. -@end menu - - -@node Group Line Specification -@subsection Group Line Specification -@cindex group buffer format - -The default format of the group buffer is nice and dull, but you can -make it as exciting and ugly as you feel like. - -Here's a couple of example group lines: - -@example - 25: news.announce.newusers - * 0: alt.fan.andrea-dworkin -@end example - -Quite simple, huh? - -You can see that there are 25 unread articles in -@samp{news.announce.newusers}. There are no unread articles, but some -ticked articles, in @samp{alt.fan.andrea-dworkin} (see that little -asterisk at the beginning of the line?). - -@vindex gnus-group-line-format -You can change that format to whatever you want by fiddling with the -@code{gnus-group-line-format} variable. This variable works along the -lines of a @code{format} specification, which is pretty much the same as -a @code{printf} specifications, for those of you who use (feh!) C. -@xref{Formatting Variables}. - -@samp{%M%S%5y: %(%g%)\n} is the value that produced those lines above. - -There should always be a colon on the line; the cursor always moves to -the colon after performing an operation. Nothing else is required---not -even the group name. All displayed text is just window dressing, and is -never examined by gnus. Gnus stores all real information it needs using -text properties. - -(Note that if you make a really strange, wonderful, spreadsheet-like -layout, everybody will believe you are hard at work with the accounting -instead of wasting time reading news.) - -Here's a list of all available format characters: - -@table @samp - -@item M -An asterisk if the group only has marked articles. - -@item S -Whether the group is subscribed. - -@item L -Level of subscribedness. - -@item N -Number of unread articles. - -@item I -Number of dormant articles. - -@item T -Number of ticked articles. - -@item R -Number of read articles. - -@item t -Estimated total number of articles. (This is really @var{max-number} -minus @var{min-number} plus 1.) - -Gnus uses this estimation because the NNTP protocol provides efficient -access to @var{max-number} and @var{min-number} but getting the true -unread message count is not possible efficiently. For hysterical -raisins, even the mail backends, where the true number of unread -messages might be available efficiently, use the same limited -interface. To remove this restriction from Gnus means that the -backend interface has to be changed, which is not an easy job. If you -want to work on this, please contact the Gnus mailing list. - -@item y -Number of unread, unticked, non-dormant articles. - -@item i -Number of ticked and dormant articles. - -@item g -Full group name. - -@item G -Group name. - -@item D -Newsgroup description. - -@item o -@samp{m} if moderated. - -@item O -@samp{(m)} if moderated. - -@item s -Select method. - -@item n -Select from where. - -@item z -A string that looks like @samp{<%s:%n>} if a foreign select method is -used. - -@item P -Indentation based on the level of the topic (@pxref{Group Topics}). - -@item c -@vindex gnus-group-uncollapsed-levels -Short (collapsed) group name. The @code{gnus-group-uncollapsed-levels} -variable says how many levels to leave at the end of the group name. -The default is 1---this will mean that group names like -@samp{gnu.emacs.gnus} will be shortened to @samp{g.e.gnus}. - -@item m -@vindex gnus-new-mail-mark -@cindex % -@samp{%} (@code{gnus-new-mail-mark}) if there has arrived new mail to -the group lately. - -@item p -@samp{#} (@code{gnus-process-mark}) if the group is process marked. - -@item d -A string that says when you last read the group (@pxref{Group -Timestamp}). - -@item u -User defined specifier. The next character in the format string should -be a letter. Gnus will call the function -@code{gnus-user-format-function-}@samp{X}, where @samp{X} is the letter -following @samp{%u}. The function will be passed a single dummy -parameter as argument. The function should return a string, which will -be inserted into the buffer just like information from any other -specifier. -@end table - -@cindex * -All the ``number-of'' specs will be filled with an asterisk (@samp{*}) -if no info is available---for instance, if it is a non-activated foreign -group, or a bogus native group. - - -@node Group Modeline Specification -@subsection Group Modeline Specification -@cindex group modeline - -@vindex gnus-group-mode-line-format -The mode line can be changed by setting -@code{gnus-group-mode-line-format} (@pxref{Mode Line Formatting}). It -doesn't understand that many format specifiers: - -@table @samp -@item S -The native news server. -@item M -The native select method. -@end table - - -@node Group Highlighting -@subsection Group Highlighting -@cindex highlighting -@cindex group highlighting - -@vindex gnus-group-highlight -Highlighting in the group buffer is controlled by the -@code{gnus-group-highlight} variable. This is an alist with elements -that look like @code{(@var{form} . @var{face})}. If @var{form} evaluates to -something non-@code{nil}, the @var{face} will be used on the line. - -Here's an example value for this variable that might look nice if the -background is dark: - -@lisp -(cond (window-system - (setq custom-background-mode 'light) - (defface my-group-face-1 - '((t (:foreground "Red" :bold t))) "First group face") - (defface my-group-face-2 - '((t (:foreground "DarkSeaGreen4" :bold t))) "Second group face") - (defface my-group-face-3 - '((t (:foreground "Green4" :bold t))) "Third group face") - (defface my-group-face-4 - '((t (:foreground "SteelBlue" :bold t))) "Fourth group face") - (defface my-group-face-5 - '((t (:foreground "Blue" :bold t))) "Fifth group face"))) - -(setq gnus-group-highlight - '(((> unread 200) . my-group-face-1) - ((and (< level 3) (zerop unread)) . my-group-face-2) - ((< level 3) . my-group-face-3) - ((zerop unread) . my-group-face-4) - (t . my-group-face-5))) -@end lisp - -Also @pxref{Faces and Fonts}. - -Variables that are dynamically bound when the forms are evaluated -include: - -@table @code -@item group -The group name. -@item unread -The number of unread articles in the group. -@item method -The select method. -@item mailp -Whether the group is a mail group. -@item level -The level of the group. -@item score -The score of the group. -@item ticked -The number of ticked articles in the group. -@item total -The total number of articles in the group. Or rather, MAX-NUMBER minus -MIN-NUMBER plus one. -@item topic -When using the topic minor mode, this variable is bound to the current -topic being inserted. -@end table - -When the forms are @code{eval}ed, point is at the beginning of the line -of the group in question, so you can use many of the normal gnus -functions for snarfing info on the group. - -@vindex gnus-group-update-hook -@findex gnus-group-highlight-line -@code{gnus-group-update-hook} is called when a group line is changed. -It will not be called when @code{gnus-visual} is @code{nil}. This hook -calls @code{gnus-group-highlight-line} by default. - - -@node Group Maneuvering -@section Group Maneuvering -@cindex group movement - -All movement commands understand the numeric prefix and will behave as -expected, hopefully. - -@table @kbd - -@item n -@kindex n (Group) -@findex gnus-group-next-unread-group -Go to the next group that has unread articles -(@code{gnus-group-next-unread-group}). - -@item p -@itemx DEL -@kindex DEL (Group) -@kindex p (Group) -@findex gnus-group-prev-unread-group -Go to the previous group that has unread articles -(@code{gnus-group-prev-unread-group}). - -@item N -@kindex N (Group) -@findex gnus-group-next-group -Go to the next group (@code{gnus-group-next-group}). - -@item P -@kindex P (Group) -@findex gnus-group-prev-group -Go to the previous group (@code{gnus-group-prev-group}). - -@item M-n -@kindex M-n (Group) -@findex gnus-group-next-unread-group-same-level -Go to the next unread group on the same (or lower) level -(@code{gnus-group-next-unread-group-same-level}). - -@item M-p -@kindex M-p (Group) -@findex gnus-group-prev-unread-group-same-level -Go to the previous unread group on the same (or lower) level -(@code{gnus-group-prev-unread-group-same-level}). -@end table - -Three commands for jumping to groups: - -@table @kbd - -@item j -@kindex j (Group) -@findex gnus-group-jump-to-group -Jump to a group (and make it visible if it isn't already) -(@code{gnus-group-jump-to-group}). Killed groups can be jumped to, just -like living groups. - -@item , -@kindex , (Group) -@findex gnus-group-best-unread-group -Jump to the unread group with the lowest level -(@code{gnus-group-best-unread-group}). - -@item . -@kindex . (Group) -@findex gnus-group-first-unread-group -Jump to the first group with unread articles -(@code{gnus-group-first-unread-group}). -@end table - -@vindex gnus-group-goto-unread -If @code{gnus-group-goto-unread} is @code{nil}, all the movement -commands will move to the next group, not the next unread group. Even -the commands that say they move to the next unread group. The default -is @code{t}. - - -@node Selecting a Group -@section Selecting a Group -@cindex group selection - -@table @kbd - -@item SPACE -@kindex SPACE (Group) -@findex gnus-group-read-group -Select the current group, switch to the summary buffer and display the -first unread article (@code{gnus-group-read-group}). If there are no -unread articles in the group, or if you give a non-numerical prefix to -this command, gnus will offer to fetch all the old articles in this -group from the server. If you give a numerical prefix @var{N}, @var{N} -determines the number of articles gnus will fetch. If @var{N} is -positive, gnus fetches the @var{N} newest articles, if @var{N} is -negative, Gnus fetches the @code{abs(@var{N})} oldest articles. - -Thus, @kbd{SPC} enters the group normally, @kbd{C-u SPC} offers old -articles, @kbd{C-u 4 2 SPC} fetches the 42 newest articles, and @kbd{C-u -- 4 2 SPC} fetches the 42 oldest ones. - -When you are in the group (in the Summary buffer), you can type -@kbd{M-g} to fetch new articles, or @kbd{C-u M-g} to also show the old -ones. - -@item RET -@kindex RET (Group) -@findex gnus-group-select-group -Select the current group and switch to the summary buffer -(@code{gnus-group-select-group}). Takes the same arguments as -@code{gnus-group-read-group}---the only difference is that this command -does not display the first unread article automatically upon group -entry. - -@item M-RET -@kindex M-RET (Group) -@findex gnus-group-quick-select-group -This does the same as the command above, but tries to do it with the -minimum amount of fuzz (@code{gnus-group-quick-select-group}). No -scoring/killing will be performed, there will be no highlights and no -expunging. This might be useful if you're in a real hurry and have to -enter some humongous group. If you give a 0 prefix to this command -(i.e., @kbd{0 M-RET}), gnus won't even generate the summary buffer, -which is useful if you want to toggle threading before generating the -summary buffer (@pxref{Summary Generation Commands}). - -@item M-SPACE -@kindex M-SPACE (Group) -@findex gnus-group-visible-select-group -This is yet one more command that does the same as the @kbd{RET} -command, but this one does it without expunging and hiding dormants -(@code{gnus-group-visible-select-group}). - -@item M-C-RET -@kindex M-C-RET (Group) -@findex gnus-group-select-group-ephemerally -Finally, this command selects the current group ephemerally without -doing any processing of its contents -(@code{gnus-group-select-group-ephemerally}). Even threading has been -turned off. Everything you do in the group after selecting it in this -manner will have no permanent effects. - -@end table - -@vindex gnus-large-newsgroup -The @code{gnus-large-newsgroup} variable says what gnus should consider -to be a big group. This is 200 by default. If the group has more -(unread and/or ticked) articles than this, gnus will query the user -before entering the group. The user can then specify how many articles -should be fetched from the server. If the user specifies a negative -number (@code{-n}), the @code{n} oldest articles will be fetched. If it -is positive, the @code{n} articles that have arrived most recently will -be fetched. - -@vindex gnus-select-group-hook -@vindex gnus-auto-select-first -@code{gnus-auto-select-first} control whether any articles are selected -automatically when entering a group with the @kbd{SPACE} command. - -@table @code - -@item nil -Don't select any articles when entering the group. Just display the -full summary buffer. - -@item t -Select the first unread article when entering the group. - -@item best -Select the highest scored article in the group when entering the -group. - -@end table - -This variable can also be a function. In that case, that function will -be called to place point on a subject line, and/or select some article. -Useful functions include: - -@table @code -@item gnus-summary-first-unread-subject -Place point on the subject line of the first unread article, but -don't select the article. - -@item gnus-summary-first-unread-article -Select the first unread article. - -@item gnus-summary-best-unread-article -Select the highest-scored unread article. -@end table - - -If you want to prevent automatic selection in some group (say, in a -binary group with Huge articles) you can set this variable to @code{nil} -in @code{gnus-select-group-hook}, which is called when a group is -selected. - - -@node Subscription Commands -@section Subscription Commands -@cindex subscription - -@table @kbd - -@item S t -@itemx u -@kindex S t (Group) -@kindex u (Group) -@findex gnus-group-unsubscribe-current-group -@c @icon{gnus-group-unsubscribe} -Toggle subscription to the current group -(@code{gnus-group-unsubscribe-current-group}). - -@item S s -@itemx U -@kindex S s (Group) -@kindex U (Group) -@findex gnus-group-unsubscribe-group -Prompt for a group to subscribe, and then subscribe it. If it was -subscribed already, unsubscribe it instead -(@code{gnus-group-unsubscribe-group}). - -@item S k -@itemx C-k -@kindex S k (Group) -@kindex C-k (Group) -@findex gnus-group-kill-group -@c @icon{gnus-group-kill-group} -Kill the current group (@code{gnus-group-kill-group}). - -@item S y -@itemx C-y -@kindex S y (Group) -@kindex C-y (Group) -@findex gnus-group-yank-group -Yank the last killed group (@code{gnus-group-yank-group}). - -@item C-x C-t -@kindex C-x C-t (Group) -@findex gnus-group-transpose-groups -Transpose two groups (@code{gnus-group-transpose-groups}). This isn't -really a subscription command, but you can use it instead of a -kill-and-yank sequence sometimes. - -@item S w -@itemx C-w -@kindex S w (Group) -@kindex C-w (Group) -@findex gnus-group-kill-region -Kill all groups in the region (@code{gnus-group-kill-region}). - -@item S z -@kindex S z (Group) -@findex gnus-group-kill-all-zombies -Kill all zombie groups (@code{gnus-group-kill-all-zombies}). - -@item S C-k -@kindex S C-k (Group) -@findex gnus-group-kill-level -Kill all groups on a certain level (@code{gnus-group-kill-level}). -These groups can't be yanked back after killing, so this command should -be used with some caution. The only time where this command comes in -really handy is when you have a @file{.newsrc} with lots of unsubscribed -groups that you want to get rid off. @kbd{S C-k} on level 7 will -kill off all unsubscribed groups that do not have message numbers in the -@file{.newsrc} file. - -@end table - -Also @pxref{Group Levels}. - - -@node Group Data -@section Group Data - -@table @kbd - -@item c -@kindex c (Group) -@findex gnus-group-catchup-current -@vindex gnus-group-catchup-group-hook -@c @icon{gnus-group-catchup-current} -Mark all unticked articles in this group as read -(@code{gnus-group-catchup-current}). -@code{gnus-group-catchup-group-hook} is called when catching up a group from -the group buffer. - -@item C -@kindex C (Group) -@findex gnus-group-catchup-current-all -Mark all articles in this group, even the ticked ones, as read -(@code{gnus-group-catchup-current-all}). - -@item M-c -@kindex M-c (Group) -@findex gnus-group-clear-data -Clear the data from the current group---nix out marks and the list of -read articles (@code{gnus-group-clear-data}). - -@item M-x gnus-group-clear-data-on-native-groups -@kindex M-x gnus-group-clear-data-on-native-groups -@findex gnus-group-clear-data-on-native-groups -If you have switched from one @sc{nntp} server to another, all your marks -and read ranges have become worthless. You can use this command to -clear out all data that you have on your native groups. Use with -caution. - -@end table - - -@node Group Levels -@section Group Levels -@cindex group level -@cindex level - -All groups have a level of @dfn{subscribedness}. For instance, if a -group is on level 2, it is more subscribed than a group on level 5. You -can ask gnus to just list groups on a given level or lower -(@pxref{Listing Groups}), or to just check for new articles in groups on -a given level or lower (@pxref{Scanning New Messages}). - -Remember: The higher the level of the group, the less important it is. - -@table @kbd - -@item S l -@kindex S l (Group) -@findex gnus-group-set-current-level -Set the level of the current group. If a numeric prefix is given, the -next @var{n} groups will have their levels set. The user will be -prompted for a level. -@end table - -@vindex gnus-level-killed -@vindex gnus-level-zombie -@vindex gnus-level-unsubscribed -@vindex gnus-level-subscribed -Gnus considers groups from levels 1 to -@code{gnus-level-subscribed} (inclusive) (default 5) to be subscribed, -@code{gnus-level-subscribed} (exclusive) and -@code{gnus-level-unsubscribed} (inclusive) (default 7) to be -unsubscribed, @code{gnus-level-zombie} to be zombies (walking dead) -(default 8) and @code{gnus-level-killed} to be killed (completely dead) -(default 9). Gnus treats subscribed and unsubscribed groups exactly the -same, but zombie and killed groups have no information on what articles -you have read, etc, stored. This distinction between dead and living -groups isn't done because it is nice or clever, it is done purely for -reasons of efficiency. - -It is recommended that you keep all your mail groups (if any) on quite -low levels (e.g. 1 or 2). - -Maybe the following description of the default behavior of Gnus helps to -understand what these levels are all about. By default, Gnus shows you -subscribed nonempty groups, but by hitting @kbd{L} you can have it show -empty subscribed groups and unsubscribed groups, too. Type @kbd{l} to -go back to showing nonempty subscribed groups again. Thus, unsubscribed -groups are hidden, in a way. - -Zombie and killed groups are similar to unsubscribed groups in that they -are hidden by default. But they are different from subscribed and -unsubscribed groups in that Gnus doesn't ask the news server for -information (number of messages, number of unread messages) on zombie -and killed groups. Normally, you use @kbd{C-k} to kill the groups you -aren't interested in. If most groups are killed, Gnus is faster. - -Why does Gnus distinguish between zombie and killed groups? Well, when -a new group arrives on the server, Gnus by default makes it a zombie -group. This means that you are normally not bothered with new groups, -but you can type @kbd{A z} to get a list of all new groups. Subscribe -the ones you like and kill the ones you don't want. (@kbd{A k} shows a -list of killed groups.) - -If you want to play with the level variables, you should show some care. -Set them once, and don't touch them ever again. Better yet, don't touch -them at all unless you know exactly what you're doing. - -@vindex gnus-level-default-unsubscribed -@vindex gnus-level-default-subscribed -Two closely related variables are @code{gnus-level-default-subscribed} -(default 3) and @code{gnus-level-default-unsubscribed} (default 6), -which are the levels that new groups will be put on if they are -(un)subscribed. These two variables should, of course, be inside the -relevant valid ranges. - -@vindex gnus-keep-same-level -If @code{gnus-keep-same-level} is non-@code{nil}, some movement commands -will only move to groups of the same level (or lower). In -particular, going from the last article in one group to the next group -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 -by default. - -@vindex gnus-group-list-inactive-groups -If @code{gnus-group-list-inactive-groups} is non-@code{nil}, non-active -groups will be listed along with the unread groups. This variable is -@code{t} by default. If it is @code{nil}, inactive groups won't be -listed. - -@vindex gnus-group-use-permanent-levels -If @code{gnus-group-use-permanent-levels} is non-@code{nil}, once you -give a level prefix to @kbd{g} or @kbd{l}, all subsequent commands will -use this level as the ``work'' level. - -@vindex gnus-activate-level -Gnus will normally just activate (i. e., query the server about) groups -on level @code{gnus-activate-level} or less. If you don't want to -activate unsubscribed groups, for instance, you might set this variable -to 5. The default is 6. - - -@node Group Score -@section Group Score -@cindex group score -@cindex group rank -@cindex rank - -You would normally keep important groups on high levels, but that scheme -is somewhat restrictive. Don't you wish you could have Gnus sort the -group buffer according to how often you read groups, perhaps? Within -reason? - -This is what @dfn{group score} is for. You can have Gnus assign a score -to each group through the mechanism described below. You can then sort -the group buffer based on this score. Alternatively, you can sort on -score and then level. (Taken together, the level and the score is -called the @dfn{rank} of the group. A group that is on level 4 and has -a score of 1 has a higher rank than a group on level 5 that has a score -of 300. (The level is the most significant part and the score is the -least significant part.)) - -@findex gnus-summary-bubble-group -If you want groups you read often to get higher scores than groups you -read seldom you can add the @code{gnus-summary-bubble-group} function to -the @code{gnus-summary-exit-hook} hook. This will result (after -sorting) in a bubbling sort of action. If you want to see that in -action after each summary exit, you can add -@code{gnus-group-sort-groups-by-rank} or -@code{gnus-group-sort-groups-by-score} to the same hook, but that will -slow things down somewhat. - - -@node Marking Groups -@section Marking Groups -@cindex marking groups - -If you want to perform some command on several groups, and they appear -subsequently in the group buffer, you would normally just give a -numerical prefix to the command. Most group commands will then do your -bidding on those groups. - -However, if the groups are not in sequential order, you can still -perform a command on several groups. You simply mark the groups first -with the process mark and then execute the command. - -@table @kbd - -@item # -@kindex # (Group) -@itemx M m -@kindex M m (Group) -@findex gnus-group-mark-group -Set the mark on the current group (@code{gnus-group-mark-group}). - -@item M-# -@kindex M-# (Group) -@itemx M u -@kindex M u (Group) -@findex gnus-group-unmark-group -Remove the mark from the current group -(@code{gnus-group-unmark-group}). - -@item M U -@kindex M U (Group) -@findex gnus-group-unmark-all-groups -Remove the mark from all groups (@code{gnus-group-unmark-all-groups}). - -@item M w -@kindex M w (Group) -@findex gnus-group-mark-region -Mark all groups between point and mark (@code{gnus-group-mark-region}). - -@item M b -@kindex M b (Group) -@findex gnus-group-mark-buffer -Mark all groups in the buffer (@code{gnus-group-mark-buffer}). - -@item M r -@kindex M r (Group) -@findex gnus-group-mark-regexp -Mark all groups that match some regular expression -(@code{gnus-group-mark-regexp}). -@end table - -Also @pxref{Process/Prefix}. - -@findex gnus-group-universal-argument -If you want to execute some command on all groups that have been marked -with the process mark, you can use the @kbd{M-&} -(@code{gnus-group-universal-argument}) command. It will prompt you for -the command to be executed. - - -@node Foreign Groups -@section Foreign Groups -@cindex foreign groups - -Below are some group mode commands for making and editing general foreign -groups, as well as commands to ease the creation of a few -special-purpose groups. All these commands insert the newly created -groups under point---@code{gnus-subscribe-newsgroup-method} is not -consulted. - -@table @kbd - -@item G m -@kindex G m (Group) -@findex gnus-group-make-group -@cindex making groups -Make a new group (@code{gnus-group-make-group}). Gnus will prompt you -for a name, a method and possibly an @dfn{address}. For an easier way -to subscribe to @sc{nntp} groups, @pxref{Browse Foreign Server}. - -@item G r -@kindex G r (Group) -@findex gnus-group-rename-group -@cindex renaming groups -Rename the current group to something else -(@code{gnus-group-rename-group}). This is valid only on some -groups---mail groups mostly. This command might very well be quite slow -on some backends. - -@item G c -@kindex G c (Group) -@cindex customizing -@findex gnus-group-customize -Customize the group parameters (@code{gnus-group-customize}). - -@item G e -@kindex G e (Group) -@findex gnus-group-edit-group-method -@cindex renaming groups -Enter a buffer where you can edit the select method of the current -group (@code{gnus-group-edit-group-method}). - -@item G p -@kindex G p (Group) -@findex gnus-group-edit-group-parameters -Enter a buffer where you can edit the group parameters -(@code{gnus-group-edit-group-parameters}). - -@item G E -@kindex G E (Group) -@findex gnus-group-edit-group -Enter a buffer where you can edit the group info -(@code{gnus-group-edit-group}). - -@item G d -@kindex G d (Group) -@findex gnus-group-make-directory-group -@cindex nndir -Make a directory group (@pxref{Directory Groups}). You will be prompted -for a directory name (@code{gnus-group-make-directory-group}). - -@item G h -@kindex G h (Group) -@cindex help group -@findex gnus-group-make-help-group -Make the gnus help group (@code{gnus-group-make-help-group}). - -@item G a -@kindex G a (Group) -@cindex (ding) archive -@cindex archive group -@findex gnus-group-make-archive-group -@vindex gnus-group-archive-directory -@vindex gnus-group-recent-archive-directory -Make a gnus archive group (@code{gnus-group-make-archive-group}). By -default a group pointing to the most recent articles will be created -(@code{gnus-group-recent-archive-directory}), but given a prefix, a full -group will be created from @code{gnus-group-archive-directory}. - -@item G k -@kindex G k (Group) -@findex gnus-group-make-kiboze-group -@cindex nnkiboze -Make a kiboze group. You will be prompted for a name, for a regexp to -match groups to be ``included'' in the kiboze group, and a series of -strings to match on headers (@code{gnus-group-make-kiboze-group}). -@xref{Kibozed Groups}. - -@item G D -@kindex G D (Group) -@findex gnus-group-enter-directory -@cindex nneething -Read an arbitrary directory as if it were a newsgroup with the -@code{nneething} backend (@code{gnus-group-enter-directory}). -@xref{Anything Groups}. - -@item G f -@kindex G f (Group) -@findex gnus-group-make-doc-group -@cindex ClariNet Briefs -@cindex nndoc -Make a group based on some file or other -(@code{gnus-group-make-doc-group}). If you give a prefix to this -command, you will be prompted for a file name and a file type. -Currently supported types are @code{babyl}, @code{mbox}, @code{digest}, -@code{mmdf}, @code{news}, @code{rnews}, @code{clari-briefs}, -@code{rfc934}, @code{rfc822-forward}, @code{nsmail} and @code{forward}. -If you run this command without a prefix, Gnus will guess at the file -type. @xref{Document Groups}. - -@item G u -@kindex G u (Group) -@vindex gnus-useful-groups -@findex gnus-group-make-useful-group -Create one of the groups mentioned in @code{gnus-useful-groups} -(@code{gnus-group-make-useful-group}). - -@item G w -@kindex G w (Group) -@findex gnus-group-make-web-group -@cindex DejaNews -@cindex Alta Vista -@cindex InReference -@cindex nnweb -Make an ephemeral group based on a web search -(@code{gnus-group-make-web-group}). If you give a prefix to this -command, make a solid group instead. You will be prompted for the -search engine type and the search string. Valid search engine types -include @code{dejanews}, @code{altavista} and @code{reference}. -@xref{Web Searches}. - -If you use the @code{dejanews} search engine, you can limit the search -to a particular group by using a match string like -@samp{~g alt.sysadmin.recovery shaving}. - -@item G DEL -@kindex G DEL (Group) -@findex gnus-group-delete-group -This function will delete the current group -(@code{gnus-group-delete-group}). If given a prefix, this function will -actually delete all the articles in the group, and forcibly remove the -group itself from the face of the Earth. Use a prefix only if you are -absolutely sure of what you are doing. This command can't be used on -read-only groups (like @code{nntp} group), though. - -@item G V -@kindex G V (Group) -@findex gnus-group-make-empty-virtual -Make a new, fresh, empty @code{nnvirtual} group -(@code{gnus-group-make-empty-virtual}). @xref{Virtual Groups}. - -@item G v -@kindex G v (Group) -@findex gnus-group-add-to-virtual -Add the current group to an @code{nnvirtual} group -(@code{gnus-group-add-to-virtual}). Uses the process/prefix convention. -@end table - -@xref{Select Methods}, for more information on the various select -methods. - -@vindex gnus-activate-foreign-newsgroups -If @code{gnus-activate-foreign-newsgroups} is a positive number, -gnus will check all foreign groups with this level or lower at startup. -This might take quite a while, especially if you subscribe to lots of -groups from different @sc{nntp} servers. Also @pxref{Group Levels}; -@code{gnus-activate-level} also affects activation of foreign -newsgroups. - - -@node Group Parameters -@section Group Parameters -@cindex group parameters - -The group parameters store information local to a particular group. -Here's an example group parameter list: - -@example -((to-address . "ding@@gnus.org") - (auto-expire . t)) -@end example - -We see that each element consists of a "dotted pair"---the thing before -the dot is the key, while the thing after the dot is the value. All the -parameters have this form @emph{except} local variable specs, which are -not dotted pairs, but proper lists. - -Some parameters have correspondant customizable variables, each of which -is an alist of regexps and values. - -The following group parameters can be used: - -@table @code -@item to-address -@cindex to-address -Address used by when doing followups and new posts. - -@example -(to-address . "some@@where.com") -@end example - -This is primarily useful in mail groups that represent closed mailing -lists---mailing lists where it's expected that everybody that writes to -the mailing list is subscribed to it. Since using this parameter -ensures that the mail only goes to the mailing list itself, it means -that members won't receive two copies of your followups. - -Using @code{to-address} will actually work whether the group is foreign -or not. Let's say there's a group on the server that is called -@samp{fa.4ad-l}. This is a real newsgroup, but the server has gotten -the articles from a mail-to-news gateway. Posting directly to this -group is therefore impossible---you have to send mail to the mailing -list address instead. - -See also @code{gnus-parameter-to-address-alist}. - -@item to-list -@cindex to-list -Address used when doing @kbd{a} in that group. - -@example -(to-list . "some@@where.com") -@end example - -It is totally ignored -when doing a followup---except that if it is present in a news group, -you'll get mail group semantics when doing @kbd{f}. - -If you do an @kbd{a} command in a mail group and you have neither a -@code{to-list} group parameter nor a @code{to-address} group parameter, -then a @code{to-list} group parameter will be added automatically upon -sending the message if @code{gnus-add-to-list} is set to @code{t}. -@vindex gnus-add-to-list - -If you do an @kbd{a} command in a mail group and you don't have a -@code{to-list} group parameter, one will be added automatically upon -sending the message. - -@findex gnus-mailing-list-mode -@cindex Mail List Groups -If this variable is set, @code{gnus-mailing-list-mode} is turned on when -entering summary buffer. - -See also @code{gnus-parameter-to-list-alist}. - -@item visible -@cindex visible -If the group parameter list has the element @code{(visible . t)}, -that group will always be visible in the Group buffer, regardless -of whether it has any unread articles. - -@item broken-reply-to -@cindex broken-reply-to -Elements like @code{(broken-reply-to . t)} signals that @code{Reply-To} -headers in this group are to be ignored. This can be useful if you're -reading a mailing list group where the listserv has inserted -@code{Reply-To} headers that point back to the listserv itself. This is -broken behavior. So there! - -@item to-group -@cindex to-group -Elements like @code{(to-group . "some.group.name")} means that all -posts in that group will be sent to @code{some.group.name}. - -@item newsgroup -@cindex newsgroup -If you have @code{(newsgroup . t)} in the group parameter list, gnus -will treat all responses as if they were responses to news articles. -This can be useful if you have a mail group that's really a mirror of a -news group. - -@item gcc-self -@cindex gcc-self -If @code{(gcc-self . t)} is present in the group parameter list, newly -composed messages will be @code{Gcc}'d to the current group. If -@code{(gcc-self . none)} is present, no @code{Gcc:} header will be -generated, if @code{(gcc-self . "string")} is present, this string will -be inserted literally as a @code{gcc} header. This parameter takes -precedence over any default @code{Gcc} rules as described later -(@pxref{Archived Messages}). - -@item auto-expire -@cindex auto-expire -If the group parameter has an element that looks like @code{(auto-expire -. t)}, all articles read will be marked as expirable. For an -alternative approach, @pxref{Expiring Mail}. - -See also @code{gnus-auto-expirable-newsgroups}. - -@item total-expire -@cindex total-expire -If the group parameter has an element that looks like -@code{(total-expire . t)}, all read articles will be put through the -expiry process, even if they are not marked as expirable. Use with -caution. Unread, ticked and dormant articles are not eligible for -expiry. - -See also @code{gnus-total-expirable-newsgroups}. - -@item expiry-wait -@cindex expiry-wait -@vindex nnmail-expiry-wait-function -If the group parameter has an element that looks like @code{(expiry-wait -. 10)}, this value will override any @code{nnmail-expiry-wait} and -@code{nnmail-expiry-wait-function} when expiring expirable messages. -The value can either be a number of days (not necessarily an integer) or -the symbols @code{never} or @code{immediate}. - -@item score-file -@cindex score file group parameter -Elements that look like @code{(score-file . "file")} will make -@file{file} into the current score file for the group in question. All -interactive score entries will be put into this file. - -@item adapt-file -@cindex adapt file group parameter -Elements that look like @code{(adapt-file . "file")} will make -@file{file} into the current adaptive file for the group in question. -All adaptive score entries will be put into this file. - -@item admin-address -@cindex admin-address -When unsubscribing from a mailing list you should never send the -unsubscription notice to the mailing list itself. Instead, you'd send -messages to the administrative address. This parameter allows you to -put the admin address somewhere convenient. - -@item display -@cindex display -Elements that look like @code{(display . MODE)} say which articles to -display on entering the group. Valid values are: - -@table @code -@item all -Display all articles, both read and unread. - -@item default -Display the default visible articles, which normally includes unread and -ticked articles. - -@item an array -Display articles that satisfy a predicate. - -Here are some examples: - -@table @code -@item [read] -Display only read articles. - -@item [not expire] -Display everything except expirable articles. - -@item [and (not reply) (not expire)] -Display everything except expirable and articles you've already -responded to. -@end table - -The available operators are @code{not}, @code{and} and @code{or}. -Predicates include @code{tick}, @code{unsend}, @code{undownload}, -@code{read}, @code{dormant}, @code{expire}, @code{reply}, -@code{killed}, @code{bookmark}, @code{score}, @code{save}, -@code{cache}, @code{forward}, @code{seen} and @code{recent}. - -@end table - -The @code{display} parameter works by limiting the summary buffer to -the subset specified. You can pop the limit by using the @kbd{/ w} -command (@pxref{Limiting}). - -@item comment -@cindex comment -Elements that look like @code{(comment . "This is a comment")} -are arbitrary comments on the group. They are currently ignored by -gnus, but provide a place for you to store information on particular -groups. - -@item charset -@cindex charset -Elements that look like @code{(charset . iso-8859-1)} will make -@code{iso-8859-1} the default charset; that is, the charset that will be -used for all articles that do not specify a charset. - -See also @code{gnus-group-charset-alist}. - -@item ignored-charsets -@cindex ignored-charset -Elements that look like @code{(ignored-charsets x-unknown iso-8859-1)} -will make @code{iso-8859-1} and @code{x-unknown} ignored; that is, the -default charset will be used for decoding articles. - -See also @code{gnus-group-ignored-charsets-alist}. - -@item posting-style -@cindex posting-style -You can store additional posting style information for this group only -here (@pxref{Posting Styles}). The format is that of an entry in the -@code{gnus-posting-styles} alist, except that there's no regexp matching -the group name (of course). Style elements in this group parameter will -take precedence over the ones found in @code{gnus-posting-styles}. - -For instance, if you want a funky name and signature in this group only, -instead of hacking @code{gnus-posting-styles}, you could put something -like this in the group parameters: - -@example -(posting-style - (name "Funky Name") - (signature "Funky Signature")) -@end example - -@item post-method -@cindex post-method -If it is set, the value is used as the method for posting message -instead of @code{gnus-post-method}. - -@item banner -@cindex banner -An item like @code{(banner . "regex")} causes any part of an article -that matches the regular expression "regex" to be stripped. Instead of -"regex", you can also use the symbol @code{signature} which strips the -last signature or any of the elements of the alist -@code{gnus-article-banner-alist}. - -@item (@var{variable} @var{form}) -You can use the group parameters to set variables local to the group you -are entering. If you want to turn threading off in @samp{news.answers}, -you could put @code{(gnus-show-threads nil)} in the group parameters of -that group. @code{gnus-show-threads} will be made into a local variable -in the summary buffer you enter, and the form @code{nil} will be -@code{eval}ed there. - -This can also be used as a group-specific hook function, if you'd like. -If you want to hear a beep when you enter a group, you could put -something like @code{(dummy-variable (ding))} in the parameters of that -group. @code{dummy-variable} will be set to the result of the -@code{(ding)} form, but who cares? - -@end table - -Use the @kbd{G p} or the @kbd{G c} command to edit group parameters of a -group. (@kbd{G p} presents you with a Lisp-based interface, @kbd{G c} -presents you with a Customize-like interface. The latter helps avoid -silly Lisp errors.) You might also be interested in reading about topic -parameters (@pxref{Topic Parameters}). - -Group parameters can be set via the @code{gnus-parameters} variable too. -But some variables, such as @code{visible}, have no effect. For -example: - -@example -(setq gnus-parameters - '(("mail\\..*" - (gnus-show-threads nil) - (gnus-use-scoring nil) - (gnus-summary-line-format - "%U%R%z%I%(%[%d:%ub%-23,23f%]%) %s\n") - (gcc-self . t) - (display . all)) - - ("^nnimap:\\(foo.bar\\)$" - (to-group . "\\1")) - - ("mail\\.me" - (gnus-use-scoring t)) - - ("list\\..*" - (total-expire . t) - (broken-reply-to . t)))) -@end example - -String value of parameters will be subjected to regexp substitution, as -the @code{to-group} example shows. - - -@node Listing Groups -@section Listing Groups -@cindex group listing - -These commands all list various slices of the groups available. - -@table @kbd - -@item l -@itemx A s -@kindex A s (Group) -@kindex l (Group) -@findex gnus-group-list-groups -List all groups that have unread articles -(@code{gnus-group-list-groups}). If the numeric prefix is used, this -command will list only groups of level ARG and lower. By default, it -only lists groups of level five (i. e., -@code{gnus-group-default-list-level}) or lower (i.e., just subscribed -groups). - -@item L -@itemx A u -@kindex A u (Group) -@kindex L (Group) -@findex gnus-group-list-all-groups -List all groups, whether they have unread articles or not -(@code{gnus-group-list-all-groups}). If the numeric prefix is used, -this command will list only groups of level ARG and lower. By default, -it lists groups of level seven or lower (i.e., just subscribed and -unsubscribed groups). - -@item A l -@kindex A l (Group) -@findex gnus-group-list-level -List all unread groups on a specific level -(@code{gnus-group-list-level}). If given a prefix, also list the groups -with no unread articles. - -@item A k -@kindex A k (Group) -@findex gnus-group-list-killed -List all killed groups (@code{gnus-group-list-killed}). If given a -prefix argument, really list all groups that are available, but aren't -currently (un)subscribed. This could entail reading the active file -from the server. - -@item A z -@kindex A z (Group) -@findex gnus-group-list-zombies -List all zombie groups (@code{gnus-group-list-zombies}). - -@item A m -@kindex A m (Group) -@findex gnus-group-list-matching -List all unread, subscribed groups with names that match a regexp -(@code{gnus-group-list-matching}). - -@item A M -@kindex A M (Group) -@findex gnus-group-list-all-matching -List groups that match a regexp (@code{gnus-group-list-all-matching}). - -@item A A -@kindex A A (Group) -@findex gnus-group-list-active -List absolutely all groups in the active file(s) of the -server(s) you are connected to (@code{gnus-group-list-active}). This -might very well take quite a while. It might actually be a better idea -to do a @kbd{A M} to list all matching, and just give @samp{.} as the -thing to match on. Also note that this command may list groups that -don't exist (yet)---these will be listed as if they were killed groups. -Take the output with some grains of salt. - -@item A a -@kindex A a (Group) -@findex gnus-group-apropos -List all groups that have names that match a regexp -(@code{gnus-group-apropos}). - -@item A d -@kindex A d (Group) -@findex gnus-group-description-apropos -List all groups that have names or descriptions that match a regexp -(@code{gnus-group-description-apropos}). - -@item A c -@kindex A c (Group) -@findex gnus-group-list-cached -List all groups with cached articles (@code{gnus-group-list-cached}). - -@item A ? -@kindex A ? (Group) -@findex gnus-group-list-dormant -List all groups with dormant articles (@code{gnus-group-list-dormant}). - -@item A / -@kindex A / (Group) -@findex gnus-group-list-limit -List groups limited within the current selection -(@code{gnus-group-list-limit}). - -@item A f -@kindex A f (Group) -@findex gnus-group-list-flush -Flush groups from the current selection (@code{gnus-group-list-flush}). - -@item A p -@kindex A p (Group) -@findex gnus-group-list-plus -List groups plus the current selection (@code{gnus-group-list-plus}). - -@end table - -@vindex gnus-permanently-visible-groups -@cindex visible group parameter -Groups that match the @code{gnus-permanently-visible-groups} regexp will -always be shown, whether they have unread articles or not. You can also -add the @code{visible} element to the group parameters in question to -get the same effect. - -@vindex gnus-list-groups-with-ticked-articles -Groups that have just ticked articles in it are normally listed in the -group buffer. If @code{gnus-list-groups-with-ticked-articles} is -@code{nil}, these groups will be treated just like totally empty -groups. It is @code{t} by default. - - -@node Sorting Groups -@section Sorting Groups -@cindex sorting groups - -@kindex C-c C-s (Group) -@findex gnus-group-sort-groups -@vindex gnus-group-sort-function -The @kbd{C-c C-s} (@code{gnus-group-sort-groups}) command sorts the -group buffer according to the function(s) given by the -@code{gnus-group-sort-function} variable. Available sorting functions -include: - -@table @code - -@item gnus-group-sort-by-alphabet -@findex gnus-group-sort-by-alphabet -Sort the group names alphabetically. This is the default. - -@item gnus-group-sort-by-real-name -@findex gnus-group-sort-by-real-name -Sort the group alphabetically on the real (unprefixed) group names. - -@item gnus-group-sort-by-level -@findex gnus-group-sort-by-level -Sort by group level. - -@item gnus-group-sort-by-score -@findex gnus-group-sort-by-score -Sort by group score. @xref{Group Score}. - -@item gnus-group-sort-by-rank -@findex gnus-group-sort-by-rank -Sort by group score and then the group level. The level and the score -are, when taken together, the group's @dfn{rank}. @xref{Group Score}. - -@item gnus-group-sort-by-unread -@findex gnus-group-sort-by-unread -Sort by number of unread articles. - -@item gnus-group-sort-by-method -@findex gnus-group-sort-by-method -Sort alphabetically on the select method. - -@item gnus-group-sort-by-server -@findex gnus-group-sort-by-server -Sort alphabetically on the Gnus server name. - - -@end table - -@code{gnus-group-sort-function} can also be a list of sorting -functions. In that case, the most significant sort key function must be -the last one. - - -There are also a number of commands for sorting directly according to -some sorting criteria: - -@table @kbd -@item G S a -@kindex G S a (Group) -@findex gnus-group-sort-groups-by-alphabet -Sort the group buffer alphabetically by group name -(@code{gnus-group-sort-groups-by-alphabet}). - -@item G S u -@kindex G S u (Group) -@findex gnus-group-sort-groups-by-unread -Sort the group buffer by the number of unread articles -(@code{gnus-group-sort-groups-by-unread}). - -@item G S l -@kindex G S l (Group) -@findex gnus-group-sort-groups-by-level -Sort the group buffer by group level -(@code{gnus-group-sort-groups-by-level}). - -@item G S v -@kindex G S v (Group) -@findex gnus-group-sort-groups-by-score -Sort the group buffer by group score -(@code{gnus-group-sort-groups-by-score}). @xref{Group Score}. - -@item G S r -@kindex G S r (Group) -@findex gnus-group-sort-groups-by-rank -Sort the group buffer by group rank -(@code{gnus-group-sort-groups-by-rank}). @xref{Group Score}. - -@item G S m -@kindex G S m (Group) -@findex gnus-group-sort-groups-by-method -Sort the group buffer alphabetically by backend name -(@code{gnus-group-sort-groups-by-method}). - -@end table - -All the commands below obey the process/prefix convention -(@pxref{Process/Prefix}). - -When given a symbolic prefix (@pxref{Symbolic Prefixes}), all these -commands will sort in reverse order. - -You can also sort a subset of the groups: - -@table @kbd -@item G P a -@kindex G P a (Group) -@findex gnus-group-sort-selected-groups-by-alphabet -Sort the groups alphabetically by group name -(@code{gnus-group-sort-selected-groups-by-alphabet}). - -@item G P u -@kindex G P u (Group) -@findex gnus-group-sort-selected-groups-by-unread -Sort the groups by the number of unread articles -(@code{gnus-group-sort-selected-groups-by-unread}). - -@item G P l -@kindex G P l (Group) -@findex gnus-group-sort-selected-groups-by-level -Sort the groups by group level -(@code{gnus-group-sort-selected-groups-by-level}). - -@item G P v -@kindex G P v (Group) -@findex gnus-group-sort-selected-groups-by-score -Sort the groups by group score -(@code{gnus-group-sort-selected-groups-by-score}). @xref{Group Score}. - -@item G P r -@kindex G P r (Group) -@findex gnus-group-sort-selected-groups-by-rank -Sort the groups by group rank -(@code{gnus-group-sort-selected-groups-by-rank}). @xref{Group Score}. - -@item G P m -@kindex G P m (Group) -@findex gnus-group-sort-selected-groups-by-method -Sort the groups alphabetically by backend name -(@code{gnus-group-sort-selected-groups-by-method}). - -@end table - -And finally, note that you can use @kbd{C-k} and @kbd{C-y} to manually -move groups around. - - -@node Group Maintenance -@section Group Maintenance -@cindex bogus groups - -@table @kbd -@item b -@kindex b (Group) -@findex gnus-group-check-bogus-groups -Find bogus groups and delete them -(@code{gnus-group-check-bogus-groups}). - -@item F -@kindex F (Group) -@findex gnus-group-find-new-groups -Find new groups and process them (@code{gnus-group-find-new-groups}). -With 1 @kbd{C-u}, use the @code{ask-server} method to query the server -for new groups. With 2 @kbd{C-u}'s, use most complete method possible -to query the server for new groups, and subscribe the new groups as -zombies. - -@item C-c C-x -@kindex C-c C-x (Group) -@findex gnus-group-expire-articles -Run all expirable articles in the current group through the expiry -process (if any) (@code{gnus-group-expire-articles}). That is, delete -all expirable articles in the group that have been around for a while. -(@pxref{Expiring Mail}). - -@item C-c M-C-x -@kindex C-c M-C-x (Group) -@findex gnus-group-expire-all-groups -Run all expirable articles in all groups through the expiry process -(@code{gnus-group-expire-all-groups}). - -@end table - - -@node Browse Foreign Server -@section Browse Foreign Server -@cindex foreign servers -@cindex browsing servers - -@table @kbd -@item B -@kindex B (Group) -@findex gnus-group-browse-foreign-server -You will be queried for a select method and a server name. Gnus will -then attempt to contact this server and let you browse the groups there -(@code{gnus-group-browse-foreign-server}). -@end table - -@findex gnus-browse-mode -A new buffer with a list of available groups will appear. This buffer -will use the @code{gnus-browse-mode}. This buffer looks a bit (well, -a lot) like a normal group buffer. - -Here's a list of keystrokes available in the browse mode: - -@table @kbd -@item n -@kindex n (Browse) -@findex gnus-group-next-group -Go to the next group (@code{gnus-group-next-group}). - -@item p -@kindex p (Browse) -@findex gnus-group-prev-group -Go to the previous group (@code{gnus-group-prev-group}). - -@item SPACE -@kindex SPACE (Browse) -@findex gnus-browse-read-group -Enter the current group and display the first article -(@code{gnus-browse-read-group}). - -@item RET -@kindex RET (Browse) -@findex gnus-browse-select-group -Enter the current group (@code{gnus-browse-select-group}). - -@item u -@kindex u (Browse) -@findex gnus-browse-unsubscribe-current-group -Unsubscribe to the current group, or, as will be the case here, -subscribe to it (@code{gnus-browse-unsubscribe-current-group}). - -@item l -@itemx q -@kindex q (Browse) -@kindex l (Browse) -@findex gnus-browse-exit -Exit browse mode (@code{gnus-browse-exit}). - -@item ? -@kindex ? (Browse) -@findex gnus-browse-describe-briefly -Describe browse mode briefly (well, there's not much to describe, is -there) (@code{gnus-browse-describe-briefly}). -@end table - - -@node Exiting Gnus -@section Exiting gnus -@cindex exiting gnus - -Yes, gnus is ex(c)iting. - -@table @kbd -@item z -@kindex z (Group) -@findex gnus-group-suspend -Suspend gnus (@code{gnus-group-suspend}). This doesn't really exit gnus, -but it kills all buffers except the Group buffer. I'm not sure why this -is a gain, but then who am I to judge? - -@item q -@kindex q (Group) -@findex gnus-group-exit -@c @icon{gnus-group-exit} -Quit gnus (@code{gnus-group-exit}). - -@item Q -@kindex Q (Group) -@findex gnus-group-quit -Quit gnus without saving the @file{.newsrc} files (@code{gnus-group-quit}). -The dribble file will be saved, though (@pxref{Auto Save}). -@end table - -@vindex gnus-exit-gnus-hook -@vindex gnus-suspend-gnus-hook -@code{gnus-suspend-gnus-hook} is called when you suspend gnus and -@code{gnus-exit-gnus-hook} is called when you quit gnus, while -@code{gnus-after-exiting-gnus-hook} is called as the final item when -exiting gnus. - -@findex gnus-unload -@cindex unloading -If you wish to completely unload gnus and all its adherents, you can use -the @code{gnus-unload} command. This command is also very handy when -trying to customize meta-variables. - -Note: - -@quotation -Miss Lisa Cannifax, while sitting in English class, felt her feet go -numbly heavy and herself fall into a hazy trance as the boy sitting -behind her drew repeated lines with his pencil across the back of her -plastic chair. -@end quotation - - -@node Group Topics -@section Group Topics -@cindex topics - -If you read lots and lots of groups, it might be convenient to group -them hierarchically according to topics. You put your Emacs groups over -here, your sex groups over there, and the rest (what, two groups or so?) -you put in some misc section that you never bother with anyway. You can -even group the Emacs sex groups as a sub-topic to either the Emacs -groups or the sex groups---or both! Go wild! - -@iftex -@iflatex -\gnusfigure{Group Topics}{400}{ -\put(75,50){\epsfig{figure=tmp/group-topic.ps,height=9cm}} -} -@end iflatex -@end iftex - -Here's an example: - -@example -Gnus - Emacs -- I wuw it! - 3: comp.emacs - 2: alt.religion.emacs - Naughty Emacs - 452: alt.sex.emacs - 0: comp.talk.emacs.recovery - Misc - 8: comp.binaries.fractals - 13: comp.sources.unix -@end example - -@findex gnus-topic-mode -@kindex t (Group) -To get this @emph{fab} functionality you simply turn on (ooh!) the -@code{gnus-topic} minor mode---type @kbd{t} in the group buffer. (This -is a toggling command.) - -Go ahead, just try it. I'll still be here when you get back. La de -dum... Nice tune, that... la la la... What, you're back? Yes, and now -press @kbd{l}. There. All your groups are now listed under -@samp{misc}. Doesn't that make you feel all warm and fuzzy? Hot and -bothered? - -If you want this permanently enabled, you should add that minor mode to -the hook for the group mode: - -@lisp -(add-hook 'gnus-group-mode-hook 'gnus-topic-mode) -@end lisp - -@menu -* 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. -@end menu - - -@node Topic Variables -@subsection Topic Variables -@cindex topic variables - -Now, if you select a topic, it will fold/unfold that topic, which is -really neat, I think. - -@vindex gnus-topic-line-format -The topic lines themselves are created according to the -@code{gnus-topic-line-format} variable (@pxref{Formatting Variables}). -Valid elements are: - -@table @samp -@item i -Indentation. -@item n -Topic name. -@item v -Visibility. -@item l -Level. -@item g -Number of groups in the topic. -@item a -Number of unread articles in the topic. -@item A -Number of unread articles in the topic and all its subtopics. -@end table - -@vindex gnus-topic-indent-level -Each sub-topic (and the groups in the sub-topics) will be indented with -@code{gnus-topic-indent-level} times the topic level number of spaces. -The default is 2. - -@vindex gnus-topic-mode-hook -@code{gnus-topic-mode-hook} is called in topic minor mode buffers. - -@vindex gnus-topic-display-empty-topics -The @code{gnus-topic-display-empty-topics} says whether to display even -topics that have no unread articles in them. The default is @code{t}. - - -@node Topic Commands -@subsection Topic Commands -@cindex topic commands - -When the topic minor mode is turned on, a new @kbd{T} submap will be -available. In addition, a few of the standard keys change their -definitions slightly. - -@table @kbd - -@item T n -@kindex T n (Topic) -@findex gnus-topic-create-topic -Prompt for a new topic name and create it -(@code{gnus-topic-create-topic}). - -@item T m -@kindex T m (Topic) -@findex gnus-topic-move-group -Move the current group to some other topic -(@code{gnus-topic-move-group}). This command uses the process/prefix -convention (@pxref{Process/Prefix}). - -@item T j -@kindex T j (Topic) -@findex gnus-topic-jump-to-topic -Go to a topic (@code{gnus-topic-jump-to-topic}). - -@item T c -@kindex T c (Topic) -@findex gnus-topic-copy-group -Copy the current group to some other topic -(@code{gnus-topic-copy-group}). This command uses the process/prefix -convention (@pxref{Process/Prefix}). - -@item T h -@kindex T h (Topic) -@findex gnus-topic-hide-topic -Hide the current topic (@code{gnus-topic-hide-topic}). If given -a prefix, hide the topic permanently. - -@item T s -@kindex T s (Topic) -@findex gnus-topic-show-topic -Show the current topic (@code{gnus-topic-show-topic}). If given -a prefix, show the topic permanently. - -@item T D -@kindex T D (Topic) -@findex gnus-topic-remove-group -Remove a group from the current topic (@code{gnus-topic-remove-group}). -This command is mainly useful if you have the same group in several -topics and wish to remove it from one of the topics. You may also -remove a group from all topics, but in that case, Gnus will add it to -the root topic the next time you start Gnus. In fact, all new groups -(which, naturally, don't belong to any topic) will show up in the root -topic. - -This command uses the process/prefix convention -(@pxref{Process/Prefix}). - -@item T M -@kindex T M (Topic) -@findex gnus-topic-move-matching -Move all groups that match some regular expression to a topic -(@code{gnus-topic-move-matching}). - -@item T C -@kindex T C (Topic) -@findex gnus-topic-copy-matching -Copy all groups that match some regular expression to a topic -(@code{gnus-topic-copy-matching}). - -@item T H -@kindex T H (Topic) -@findex gnus-topic-toggle-display-empty-topics -Toggle hiding empty topics -(@code{gnus-topic-toggle-display-empty-topics}). - -@item T # -@kindex T # (Topic) -@findex gnus-topic-mark-topic -Mark all groups in the current topic with the process mark -(@code{gnus-topic-mark-topic}). - -@item T M-# -@kindex T M-# (Topic) -@findex gnus-topic-unmark-topic -Remove the process mark from all groups in the current topic -(@code{gnus-topic-unmark-topic}). - -@item T TAB -@itemx TAB -@kindex T TAB (Topic) -@kindex TAB (Topic) -@findex gnus-topic-indent -``Indent'' the current topic so that it becomes a sub-topic of the -previous topic (@code{gnus-topic-indent}). If given a prefix, -``un-indent'' the topic instead. - -@item M-TAB -@kindex M-TAB (Topic) -@findex gnus-topic-unindent -``Un-indent'' the current topic so that it becomes a sub-topic of the -parent of its current parent (@code{gnus-topic-unindent}). - -@item RET -@kindex RET (Topic) -@findex gnus-topic-select-group -@itemx SPACE -Either select a group or fold a topic (@code{gnus-topic-select-group}). -When you perform this command on a group, you'll enter the group, as -usual. When done on a topic line, the topic will be folded (if it was -visible) or unfolded (if it was folded already). So it's basically a -toggling command on topics. In addition, if you give a numerical -prefix, group on that level (and lower) will be displayed. - -@item C-c C-x -@kindex C-c C-x (Topic) -@findex gnus-topic-expire-articles -Run all expirable articles in the current group or topic through the -expiry process (if any) -(@code{gnus-topic-expire-articles}). (@pxref{Expiring Mail}). - -@item C-k -@kindex C-k (Topic) -@findex gnus-topic-kill-group -Kill a group or topic (@code{gnus-topic-kill-group}). All groups in the -topic will be removed along with the topic. - -@item C-y -@kindex C-y (Topic) -@findex gnus-topic-yank-group -Yank the previously killed group or topic -(@code{gnus-topic-yank-group}). Note that all topics will be yanked -before all groups. - -@item T r -@kindex T r (Topic) -@findex gnus-topic-rename -Rename a topic (@code{gnus-topic-rename}). - -@item T DEL -@kindex T DEL (Topic) -@findex gnus-topic-delete -Delete an empty topic (@code{gnus-topic-delete}). - -@item A T -@kindex A T (Topic) -@findex gnus-topic-list-active -List all groups that gnus knows about in a topics-ified way -(@code{gnus-topic-list-active}). - -@item G p -@kindex G p (Topic) -@findex gnus-topic-edit-parameters -@cindex group parameters -@cindex topic parameters -@cindex parameters -Edit the topic parameters (@code{gnus-topic-edit-parameters}). -@xref{Topic Parameters}. - -@end table - - -@node Topic Sorting -@subsection Topic Sorting -@cindex topic sorting - -You can sort the groups in each topic individually with the following -commands: - - -@table @kbd -@item T S a -@kindex T S a (Topic) -@findex gnus-topic-sort-groups-by-alphabet -Sort the current topic alphabetically by group name -(@code{gnus-topic-sort-groups-by-alphabet}). - -@item T S u -@kindex T S u (Topic) -@findex gnus-topic-sort-groups-by-unread -Sort the current topic by the number of unread articles -(@code{gnus-topic-sort-groups-by-unread}). - -@item T S l -@kindex T S l (Topic) -@findex gnus-topic-sort-groups-by-level -Sort the current topic by group level -(@code{gnus-topic-sort-groups-by-level}). - -@item T S v -@kindex T S v (Topic) -@findex gnus-topic-sort-groups-by-score -Sort the current topic by group score -(@code{gnus-topic-sort-groups-by-score}). @xref{Group Score}. - -@item T S r -@kindex T S r (Topic) -@findex gnus-topic-sort-groups-by-rank -Sort the current topic by group rank -(@code{gnus-topic-sort-groups-by-rank}). @xref{Group Score}. - -@item T S m -@kindex T S m (Topic) -@findex gnus-topic-sort-groups-by-method -Sort the current topic alphabetically by backend name -(@code{gnus-topic-sort-groups-by-method}). - -@end table - -@xref{Sorting Groups}, for more information about group sorting. - - -@node Topic Topology -@subsection Topic Topology -@cindex topic topology -@cindex topology - -So, let's have a look at an example group buffer: - -@example -Gnus - Emacs -- I wuw it! - 3: comp.emacs - 2: alt.religion.emacs - Naughty Emacs - 452: alt.sex.emacs - 0: comp.talk.emacs.recovery - Misc - 8: comp.binaries.fractals - 13: comp.sources.unix -@end example - -So, here we have one top-level topic (@samp{Gnus}), two topics under -that, and one sub-topic under one of the sub-topics. (There is always -just one (1) top-level topic). This topology can be expressed as -follows: - -@lisp -(("Gnus" visible) - (("Emacs -- I wuw it!" visible) - (("Naughty Emacs" visible))) - (("Misc" visible))) -@end lisp - -@vindex gnus-topic-topology -This is in fact how the variable @code{gnus-topic-topology} would look -for the display above. That variable is saved in the @file{.newsrc.eld} -file, and shouldn't be messed with manually---unless you really want -to. Since this variable is read from the @file{.newsrc.eld} file, -setting it in any other startup files will have no effect. - -This topology shows what topics are sub-topics of what topics (right), -and which topics are visible. Two settings are currently -allowed---@code{visible} and @code{invisible}. - - -@node Topic Parameters -@subsection Topic Parameters -@cindex topic parameters - -All groups in a topic will inherit group parameters from the parent (and -ancestor) topic parameters. All valid group parameters are valid topic -parameters (@pxref{Group Parameters}). - -In addition, the following parameters are only valid as topic -parameters: - -@table @code -@item subscribe -When subscribing new groups by topic (@pxref{Subscription Methods}), the -@code{subscribe} topic parameter says what groups go in what topic. Its -value should be a regexp to match the groups that should go in that -topic. - -@end table - -Group parameters (of course) override topic parameters, and topic -parameters in sub-topics override topic parameters in super-topics. You -know. Normal inheritance rules. (@dfn{Rules} is here a noun, not a -verb, although you may feel free to disagree with me here.) - -@example -Gnus - Emacs - 3: comp.emacs - 2: alt.religion.emacs - 452: alt.sex.emacs - Relief - 452: alt.sex.emacs - 0: comp.talk.emacs.recovery - Misc - 8: comp.binaries.fractals - 13: comp.sources.unix - 452: alt.sex.emacs -@end example - -The @samp{Emacs} topic has the topic parameter @code{(score-file -. "emacs.SCORE")}; the @samp{Relief} topic has the topic parameter -@code{(score-file . "relief.SCORE")}; and the @samp{Misc} topic has the -topic parameter @code{(score-file . "emacs.SCORE")}. In addition, -@* @samp{alt.religion.emacs} has the group parameter @code{(score-file -. "religion.SCORE")}. - -Now, when you enter @samp{alt.sex.emacs} in the @samp{Relief} topic, you -will get the @file{relief.SCORE} home score file. If you enter the same -group in the @samp{Emacs} topic, you'll get the @file{emacs.SCORE} home -score file. If you enter the group @samp{alt.religion.emacs}, you'll -get the @file{religion.SCORE} home score file. - -This seems rather simple and self-evident, doesn't it? Well, yes. But -there are some problems, especially with the @code{total-expiry} -parameter. Say you have a mail group in two topics; one with -@code{total-expiry} and one without. What happens when you do @kbd{M-x -gnus-expire-all-expirable-groups}? Gnus has no way of telling which one -of these topics you mean to expire articles from, so anything may -happen. In fact, I hereby declare that it is @dfn{undefined} what -happens. You just have to be careful if you do stuff like that. - - -@node Misc Group Stuff -@section Misc Group Stuff - -@menu -* 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. -@end menu - -@table @kbd - -@item ^ -@kindex ^ (Group) -@findex gnus-group-enter-server-mode -Enter the server buffer (@code{gnus-group-enter-server-mode}). -@xref{Server Buffer}. - -@item a -@kindex a (Group) -@findex gnus-group-post-news -Post an article to a group (@code{gnus-group-post-news}). If given a -prefix, the current group name will be used as the default. - -@item m -@kindex m (Group) -@findex gnus-group-mail -Mail a message somewhere (@code{gnus-group-mail}). - -@end table - -Variables for the group buffer: - -@table @code - -@item gnus-group-mode-hook -@vindex gnus-group-mode-hook -is called after the group buffer has been -created. - -@item gnus-group-prepare-hook -@vindex gnus-group-prepare-hook -is called after the group buffer is -generated. It may be used to modify the buffer in some strange, -unnatural way. - -@item gnus-group-prepared-hook -@vindex gnus-group-prepare-hook -is called as the very last thing after the group buffer has been -generated. It may be used to move point around, for instance. - -@item gnus-permanently-visible-groups -@vindex gnus-permanently-visible-groups -Groups matching this regexp will always be listed in the group buffer, -whether they are empty or not. - -@item gnus-group-name-charset-method-alist -@vindex gnus-group-name-charset-method-alist -An alist of method and the charset for group names. It is used to show -non-ASCII group names. - -For example: -@lisp -(setq gnus-group-name-charset-method-alist - '(((nntp "news.com.cn") . cn-gb-2312))) -@end lisp - -@item gnus-group-name-charset-group-alist -@vindex gnus-group-name-charset-group-alist -An alist of regexp of group name and the charset for group names. -It is used to show non-ASCII group names. - -For example: -@lisp -(setq gnus-group-name-charset-group-alist - '(("\\.com\\.cn:" . cn-gb-2312))) -@end lisp - -@end table - -@node Scanning New Messages -@subsection Scanning New Messages -@cindex new messages -@cindex scanning new news - -@table @kbd - -@item g -@kindex g (Group) -@findex gnus-group-get-new-news -@c @icon{gnus-group-get-new-news} -Check the server(s) for new articles. If the numerical prefix is used, -this command will check only groups of level @var{arg} and lower -(@code{gnus-group-get-new-news}). If given a non-numerical prefix, this -command will force a total re-reading of the active file(s) from the -backend(s). - -@item M-g -@kindex M-g (Group) -@findex gnus-group-get-new-news-this-group -@vindex gnus-goto-next-group-when-activating -@c @icon{gnus-group-get-new-news-this-group} -Check whether new articles have arrived in the current group -(@code{gnus-group-get-new-news-this-group}). -@code{gnus-goto-next-group-when-activating} says whether this command is -to move point to the next group or not. It is @code{t} by default. - -@findex gnus-activate-all-groups -@cindex activating groups -@item C-c M-g -@kindex C-c M-g (Group) -Activate absolutely all groups (@code{gnus-activate-all-groups}). - -@item R -@kindex R (Group) -@cindex restarting -@findex gnus-group-restart -Restart gnus (@code{gnus-group-restart}). This saves the @file{.newsrc} -file(s), closes the connection to all servers, clears up all run-time -gnus variables, and then starts gnus all over again. - -@end table - -@vindex gnus-get-new-news-hook -@code{gnus-get-new-news-hook} is run just before checking for new news. - -@vindex gnus-after-getting-new-news-hook -@code{gnus-after-getting-new-news-hook} is run after checking for new -news. - - -@node Group Information -@subsection Group Information -@cindex group information -@cindex information on groups - -@table @kbd - - -@item H f -@kindex H f (Group) -@findex gnus-group-fetch-faq -@vindex gnus-group-faq-directory -@cindex FAQ -@cindex ange-ftp -Try to fetch the FAQ for the current group -(@code{gnus-group-fetch-faq}). Gnus will try to get the FAQ from -@code{gnus-group-faq-directory}, which is usually a directory on a -remote machine. This variable can also be a list of directories. In -that case, giving a prefix to this command will allow you to choose -between the various sites. @code{ange-ftp} (or @code{efs}) will be used -for fetching the file. - -If fetching from the first site is unsuccessful, gnus will attempt to go -through @code{gnus-group-faq-directory} and try to open them one by one. - -@item H d -@itemx C-c C-d -@c @icon{gnus-group-describe-group} -@kindex H d (Group) -@kindex C-c C-d (Group) -@cindex describing groups -@cindex group description -@findex gnus-group-describe-group -Describe the current group (@code{gnus-group-describe-group}). If given -a prefix, force Gnus to re-read the description from the server. - -@item M-d -@kindex M-d (Group) -@findex gnus-group-describe-all-groups -Describe all groups (@code{gnus-group-describe-all-groups}). If given a -prefix, force gnus to re-read the description file from the server. - -@item H v -@itemx V -@kindex V (Group) -@kindex H v (Group) -@cindex version -@findex gnus-version -Display current gnus version numbers (@code{gnus-version}). - -@item ? -@kindex ? (Group) -@findex gnus-group-describe-briefly -Give a very short help message (@code{gnus-group-describe-briefly}). - -@item C-c C-i -@kindex C-c C-i (Group) -@cindex info -@cindex manual -@findex gnus-info-find-node -Go to the gnus info node (@code{gnus-info-find-node}). -@end table - - -@node Group Timestamp -@subsection Group Timestamp -@cindex timestamps -@cindex group timestamps - -It can be convenient to let gnus keep track of when you last read a -group. To set the ball rolling, you should add -@code{gnus-group-set-timestamp} to @code{gnus-select-group-hook}: - -@lisp -(add-hook 'gnus-select-group-hook 'gnus-group-set-timestamp) -@end lisp - -After doing this, each time you enter a group, it'll be recorded. - -This information can be displayed in various ways---the easiest is to -use the @samp{%d} spec in the group line format: - -@lisp -(setq gnus-group-line-format - "%M\%S\%p\%P\%5y: %(%-40,40g%) %d\n") -@end lisp - -This will result in lines looking like: - -@example -* 0: mail.ding 19961002T012943 - 0: custom 19961002T012713 -@end example - -As you can see, the date is displayed in compact ISO 8601 format. This -may be a bit too much, so to just display the date, you could say -something like: - -@lisp -(setq gnus-group-line-format - "%M\%S\%p\%P\%5y: %(%-40,40g%) %6,6~(cut 2)d\n") -@end lisp - - -@node File Commands -@subsection File Commands -@cindex file commands - -@table @kbd - -@item r -@kindex r (Group) -@findex gnus-group-read-init-file -@vindex gnus-init-file -@cindex reading init file -Re-read the init file (@code{gnus-init-file}, which defaults to -@file{~/.gnus}) (@code{gnus-group-read-init-file}). - -@item s -@kindex s (Group) -@findex gnus-group-save-newsrc -@cindex saving .newsrc -Save the @file{.newsrc.eld} file (and @file{.newsrc} if wanted) -(@code{gnus-group-save-newsrc}). If given a prefix, force saving the -file(s) whether Gnus thinks it is necessary or not. - -@c @item Z -@c @kindex Z (Group) -@c @findex gnus-group-clear-dribble -@c Clear the dribble buffer (@code{gnus-group-clear-dribble}). - -@end table - - -@node Summary Buffer -@chapter Summary Buffer -@cindex summary buffer - -A line for each article is displayed in the summary buffer. You can -move around, read articles, post articles and reply to articles. - -The most common way to a summary buffer is to select a group from the -group buffer (@pxref{Selecting a Group}). - -You can have as many summary buffers open as you wish. - -@menu -* 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. -* Delayed Articles:: -* Marking Articles:: Marking articles as read, expirable, etc. -* Limiting:: You can limit the summary buffer. -* Threading:: How threads are made. -* Sorting the Summary Buffer:: 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, - or reselecting the current group. -* Crosspost Handling:: How crossposted articles are dealt with. -* Duplicate Suppression:: An alternative when crosspost handling fails. -* Security:: Decrypt and Verify. -* Mailing List:: Mailing list minor mode. -@end menu - - -@node Summary Buffer Format -@section Summary Buffer Format -@cindex summary buffer format - -@iftex -@iflatex -\gnusfigure{The Summary Buffer}{180}{ -\put(0,0){\epsfig{figure=tmp/summary.ps,width=7.5cm}} -\put(445,0){\makebox(0,0)[br]{\epsfig{figure=tmp/summary-article.ps,width=7.5cm}}} -} -@end iflatex -@end iftex - -@menu -* 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. -@end menu - -@findex mail-extract-address-components -@findex gnus-extract-address-components -@vindex gnus-extract-address-components -Gnus will use the value of the @code{gnus-extract-address-components} -variable as a function for getting the name and address parts of a -@code{From} header. Three pre-defined functions exist: -@code{gnus-extract-address-components}, which is the default, quite -fast, and too simplistic solution; -@code{mail-extract-address-components}, which works nicely, but is -slower; and @code{std11-extract-address-components}, which works very -nicely, but is slower. The default function will return the wrong -answer in 5% of the cases. If this is unacceptable to you, use the -other function instead: - -@lisp -(setq gnus-extract-address-components - 'mail-extract-address-components) -@end lisp - -@vindex gnus-summary-same-subject -@code{gnus-summary-same-subject} is a string indicating that the current -article has the same subject as the previous. This string will be used -with those specs that require it. The default is @code{""}. - - -@node Summary Buffer Lines -@subsection Summary Buffer Lines - -@vindex gnus-summary-line-format -You can change the format of the lines in the summary buffer by changing -the @code{gnus-summary-line-format} variable. It works along the same -lines as a normal @code{format} string, with some extensions -(@pxref{Formatting Variables}). - -There should always be a colon or a point position marker on the line; -the cursor always moves to the point position marker or the colon after -performing an operation. (Of course, Gnus wouldn't be Gnus if it wasn't -possible to change this. Just write a new function -@code{gnus-goto-colon} which does whatever you like with the cursor.) - -The default string is @samp{%U%R%z%I%(%[%4L: %-23,23n%]%) %s\n}. - -The following format specification characters are understood: - -@table @samp -@item N -Article number. -@item S -Subject string. List identifiers stripped, -@code{gnus-list-identifies}. @xref{Article Hiding}. -@item s -Subject if the article is the root of the thread or the previous article -had a different subject, @code{gnus-summary-same-subject} otherwise. -(@code{gnus-summary-same-subject} defaults to @code{""}.) -@item F -Full @code{From} header. -@item n -The name (from the @code{From} header). -@item f -The name, code @code{To} header or the @code{Newsgroups} header -(@pxref{To From Newsgroups}). -@item a -The name (from the @code{From} header). This differs from the @code{n} -spec in that it uses the function designated by the -@code{gnus-extract-address-components} variable, which is slower, but -may be more thorough. -@item A -The address (from the @code{From} header). This works the same way as -the @code{a} spec. -@item L -Number of lines in the article. -@item c -Number of characters in the article. This specifier is not supported -in some methods (like nnfolder). -@item I -Indentation based on thread level (@pxref{Customizing Threading}). -@item B -A complex trn-style thread tree, showing response-connecting trace -lines. -@item T -Nothing if the article is a root and lots of spaces if it isn't (it -pushes everything after it off the screen). -@item [ -Opening bracket, which is normally @samp{[}, but can also be @samp{<} -for adopted articles (@pxref{Customizing Threading}). -@item ] -Closing bracket, which is normally @samp{]}, but can also be @samp{>} -for adopted articles. -@item > -One space for each thread level. -@item < -Twenty minus thread level spaces. -@item U -Unread. - -@item R -This misleadingly named specifier is the @dfn{secondary mark}. This -mark will say whether the article has been replied to, has been cached, -or has been saved. - -@item i -Score as a number (@pxref{Scoring}). -@item z -@vindex gnus-summary-zcore-fuzz -Zcore, @samp{+} if above the default level and @samp{-} if below the -default level. If the difference between -@code{gnus-summary-default-score} and the score is less than -@code{gnus-summary-zcore-fuzz}, this spec will not be used. -@item V -Total thread score. -@item x -@code{Xref}. -@item D -@code{Date}. -@item d -The @code{Date} in @code{DD-MMM} format. -@item o -The @code{Date} in @var{YYYYMMDD}@code{T}@var{HHMMSS} format. -@item M -@code{Message-ID}. -@item r -@code{References}. -@item t -Number of articles in the current sub-thread. Using this spec will slow -down summary buffer generation somewhat. -@item e -An @samp{=} (@code{gnus-not-empty-thread-mark}) will be displayed if the -article has any children. -@item P -The line number. -@item O -Download mark. -@item u -User defined specifier. The next character in the format string should -be a letter. Gnus will call the function -@code{gnus-user-format-function-}@samp{X}, where @samp{X} is the letter -following @samp{%u}. The function will be passed the current header as -argument. The function should return a string, which will be inserted -into the summary just like information from any other summary specifier. -@end table - -The @samp{%U} (status), @samp{%R} (replied) and @samp{%z} (zcore) specs -have to be handled with care. For reasons of efficiency, gnus will -compute what column these characters will end up in, and ``hard-code'' -that. This means that it is invalid to have these specs after a -variable-length spec. Well, you might not be arrested, but your summary -buffer will look strange, which is bad enough. - -The smart choice is to have these specs as far to the left as possible. -(Isn't that the case with everything, though? But I digress.) - -This restriction may disappear in later versions of gnus. - - -@node To From Newsgroups -@subsection To From Newsgroups -@cindex To -@cindex Newsgroups - -In some groups (particularly in archive groups), the @code{From} header -isn't very interesting, since all the articles there are written by -you. To display the information in the @code{To} or @code{Newsgroups} -headers instead, you need to decide three things: What information to -gather; where to display it; and when to display it. - -@enumerate -@item -@vindex gnus-extra-headers -The reading of extra header information is controlled by the -@code{gnus-extra-headers}. This is a list of header symbols. For -instance: - -@lisp -(setq gnus-extra-headers - '(To Newsgroups X-Newsreader)) -@end lisp - -This will result in Gnus trying to obtain these three headers, and -storing it in header structures for later easy retrieval. - -@item -@findex gnus-extra-header -The value of these extra headers can be accessed via the -@code{gnus-extra-header} function. Here's a format line spec that will -access the @code{X-Newsreader} header: - -@example -"%~(form (gnus-extra-header 'X-Newsreader))@@" -@end example - -@item -@vindex gnus-ignored-from-addresses -The @code{gnus-ignored-from-addresses} variable says when the @samp{%f} -summary line spec returns the @code{To}, @code{Newsreader} or -@code{From} header. If this regexp matches the contents of the -@code{From} header, the value of the @code{To} or @code{Newsreader} -headers are used instead. - -@end enumerate - -@vindex nnmail-extra-headers -A related variable is @code{nnmail-extra-headers}, which controls when -to include extra headers when generating overview (@sc{nov}) files. If -you have old overview files, you should regenerate them after changing -this variable. - -@vindex gnus-summary-line-format -You also have to instruct Gnus to display the data by changing the -@code{%n} spec to the @code{%f} spec in the -@code{gnus-summary-line-format} variable. - -In summary, you'd typically put something like the following in -@file{~/.gnus}: - -@lisp -(setq gnus-extra-headers - '(To Newsgroups)) -(setq nnmail-extra-headers gnus-extra-headers) -(setq gnus-summary-line-format - "%U%R%z%I%(%[%4L: %-23,23f%]%) %s\n") -(setq gnus-ignored-from-addresses - "Your Name Here") -@end lisp - -Now, this is mostly useful for mail groups, where you have control over -the @sc{nov} files that are created. However, if you can persuade your -nntp admin to add: - -@example -Newsgroups:full -@end example - -to the end of her @file{overview.fmt} file, then you can use that just -as you would the extra headers from the mail groups. - - -@node Summary Buffer Mode Line -@subsection Summary Buffer Mode Line - -@vindex gnus-summary-mode-line-format -You can also change the format of the summary mode bar (@pxref{Mode Line -Formatting}). Set @code{gnus-summary-mode-line-format} to whatever you -like. The default is @samp{Gnus: %%b [%A] %Z}. - -Here are the elements you can play with: - -@table @samp -@item G -Group name. -@item p -Unprefixed group name. -@item A -Current article number. -@item z -Current article score. -@item V -Gnus version. -@item U -Number of unread articles in this group. -@item e -Number of unread articles in this group that aren't displayed in the -summary buffer. -@item Z -A string with the number of unread and unselected articles represented -either as @samp{<%U(+%e) more>} if there are both unread and unselected -articles, and just as @samp{<%U more>} if there are just unread articles -and no unselected ones. -@item g -Shortish group name. For instance, @samp{rec.arts.anime} will be -shortened to @samp{r.a.anime}. -@item S -Subject of the current article. -@item u -User-defined spec (@pxref{User-Defined Specs}). -@item s -Name of the current score file (@pxref{Scoring}). -@item d -Number of dormant articles (@pxref{Unread Articles}). -@item t -Number of ticked articles (@pxref{Unread Articles}). -@item r -Number of articles that have been marked as read in this session. -@item E -Number of articles expunged by the score files. -@end table - - -@node Summary Highlighting -@subsection Summary Highlighting - -@table @code - -@item gnus-visual-mark-article-hook -@vindex gnus-visual-mark-article-hook -This hook is run after selecting an article. It is meant to be used for -highlighting the article in some way. It is not run if -@code{gnus-visual} is @code{nil}. - -@item gnus-summary-update-hook -@vindex gnus-summary-update-hook -This hook is called when a summary line is changed. It is not run if -@code{gnus-visual} is @code{nil}. - -@item gnus-summary-selected-face -@vindex gnus-summary-selected-face -This is the face (or @dfn{font} as some people call it) used to -highlight the current article in the summary buffer. - -@item gnus-summary-highlight -@vindex gnus-summary-highlight -Summary lines are highlighted according to this variable, which is a -list where the elements are of the format @code{(@var{form} -. @var{face})}. If you would, for instance, like ticked articles to be -italic and high-scored articles to be bold, you could set this variable -to something like -@lisp -(((eq mark gnus-ticked-mark) . italic) - ((> score default) . bold)) -@end lisp -As you may have guessed, if @var{form} returns a non-@code{nil} value, -@var{face} will be applied to the line. -@end table - - -@node Summary Maneuvering -@section Summary Maneuvering -@cindex summary movement - -All the straight movement commands understand the numeric prefix and -behave pretty much as you'd expect. - -None of these commands select articles. - -@table @kbd -@item G M-n -@itemx M-n -@kindex M-n (Summary) -@kindex G M-n (Summary) -@findex gnus-summary-next-unread-subject -Go to the next summary line of an unread article -(@code{gnus-summary-next-unread-subject}). - -@item G M-p -@itemx M-p -@kindex M-p (Summary) -@kindex G M-p (Summary) -@findex gnus-summary-prev-unread-subject -Go to the previous summary line of an unread article -(@code{gnus-summary-prev-unread-subject}). - -@item G g -@kindex G g (Summary) -@findex gnus-summary-goto-subject -Ask for an article number and then go to the summary line of that article -without displaying the article (@code{gnus-summary-goto-subject}). -@end table - -If gnus asks you to press a key to confirm going to the next group, you -can use the @kbd{C-n} and @kbd{C-p} keys to move around the group -buffer, searching for the next group to read without actually returning -to the group buffer. - -Variables related to summary movement: - -@table @code - -@vindex gnus-auto-select-next -@item gnus-auto-select-next -If you issue one of the movement commands (like @kbd{n}) and there are -no more unread articles after the current one, gnus will offer to go to -the next group. If this variable is @code{t} and the next group is -empty, gnus will exit summary mode and return to the group buffer. If -this variable is neither @code{t} nor @code{nil}, gnus will select the -next group, no matter whether it has any unread articles or not. As a -special case, if this variable is @code{quietly}, gnus will select the -next group without asking for confirmation. If this variable is -@code{almost-quietly}, the same will happen only if you are located on -the last article in the group. Finally, if this variable is -@code{slightly-quietly}, the @kbd{Z n} command will go to the next group -without confirmation. Also @pxref{Group Levels}. - -@item gnus-auto-select-same -@vindex gnus-auto-select-same -If non-@code{nil}, all the movement commands will try to go to the next -article with the same subject as the current. (@dfn{Same} here might -mean @dfn{roughly equal}. See @code{gnus-summary-gather-subject-limit} -for details (@pxref{Customizing Threading}).) If there are no more -articles with the same subject, go to the first unread article. - -This variable is not particularly useful if you use a threaded display. - -@item gnus-summary-check-current -@vindex gnus-summary-check-current -If non-@code{nil}, all the ``unread'' movement commands will not proceed -to the next (or previous) article if the current article is unread. -Instead, they will choose the current article. - -@item gnus-auto-center-summary -@vindex gnus-auto-center-summary -If non-@code{nil}, gnus will keep the point in the summary buffer -centered at all times. This makes things quite tidy, but if you have a -slow network connection, or simply do not like this un-Emacsism, you can -set this variable to @code{nil} to get the normal Emacs scrolling -action. This will also inhibit horizontal re-centering of the summary -buffer, which might make it more inconvenient to read extremely long -threads. - -This variable can also be a number. In that case, center the window at -the given number of lines from the top. - -@end table - - -@node Choosing Articles -@section Choosing Articles -@cindex selecting articles - -@menu -* Choosing Commands:: Commands for choosing articles. -* Choosing Variables:: Variables that influence these commands. -@end menu - - -@node Choosing Commands -@subsection Choosing Commands - -None of the following movement commands understand the numeric prefix, -and they all select and display an article. - -If you want to fetch new articles or redisplay the group, see -@ref{Exiting the Summary Buffer}. - -@table @kbd -@item SPACE -@kindex SPACE (Summary) -@findex gnus-summary-next-page -Select the current article, or, if that one's read already, the next -unread article (@code{gnus-summary-next-page}). - -@item G n -@itemx n -@kindex n (Summary) -@kindex G n (Summary) -@findex gnus-summary-next-unread-article -@c @icon{gnus-summary-next-unread} -Go to next unread article (@code{gnus-summary-next-unread-article}). - -@item G p -@itemx p -@kindex p (Summary) -@findex gnus-summary-prev-unread-article -@c @icon{gnus-summary-prev-unread} -Go to previous unread article (@code{gnus-summary-prev-unread-article}). - -@item G N -@itemx N -@kindex N (Summary) -@kindex G N (Summary) -@findex gnus-summary-next-article -Go to the next article (@code{gnus-summary-next-article}). - -@item G P -@itemx P -@kindex P (Summary) -@kindex G P (Summary) -@findex gnus-summary-prev-article -Go to the previous article (@code{gnus-summary-prev-article}). - -@item G C-n -@kindex G C-n (Summary) -@findex gnus-summary-next-same-subject -Go to the next article with the same subject -(@code{gnus-summary-next-same-subject}). - -@item G C-p -@kindex G C-p (Summary) -@findex gnus-summary-prev-same-subject -Go to the previous article with the same subject -(@code{gnus-summary-prev-same-subject}). - -@item G f -@itemx . -@kindex G f (Summary) -@kindex . (Summary) -@findex gnus-summary-first-unread-article -Go to the first unread article -(@code{gnus-summary-first-unread-article}). - -@item G b -@itemx , -@kindex G b (Summary) -@kindex , (Summary) -@findex gnus-summary-best-unread-article -Go to the article with the highest score -(@code{gnus-summary-best-unread-article}). - -@item G l -@itemx l -@kindex l (Summary) -@kindex G l (Summary) -@findex gnus-summary-goto-last-article -Go to the previous article read (@code{gnus-summary-goto-last-article}). - -@item G o -@kindex G o (Summary) -@findex gnus-summary-pop-article -@cindex history -@cindex article history -Pop an article off the summary history and go to this article -(@code{gnus-summary-pop-article}). This command differs from the -command above in that you can pop as many previous articles off the -history as you like, while @kbd{l} toggles the two last read articles. -For a somewhat related issue (if you use these commands a lot), -@pxref{Article Backlog}. - -@item G j -@itemx j -@kindex j (Summary) -@kindex G j (Summary) -@findex gnus-summary-goto-article -Ask for an article number or @code{Message-ID}, and then go to that -article (@code{gnus-summary-goto-article}). - -@end table - - -@node Choosing Variables -@subsection Choosing Variables - -Some variables relevant for moving and selecting articles: - -@table @code -@item gnus-auto-extend-newsgroup -@vindex gnus-auto-extend-newsgroup -All the movement commands will try to go to the previous (or next) -article, even if that article isn't displayed in the Summary buffer if -this variable is non-@code{nil}. Gnus will then fetch the article from -the server and display it in the article buffer. - -@item gnus-select-article-hook -@vindex gnus-select-article-hook -This hook is called whenever an article is selected. By default it -exposes any threads hidden under the selected article. - -@item gnus-mark-article-hook -@vindex gnus-mark-article-hook -@findex gnus-summary-mark-unread-as-read -@findex gnus-summary-mark-read-and-unread-as-read -@findex gnus-unread-mark -This hook is called whenever an article is selected. It is intended to -be used for marking articles as read. The default value is -@code{gnus-summary-mark-read-and-unread-as-read}, and will change the -mark of almost any article you read to @code{gnus-unread-mark}. The -only articles not affected by this function are ticked, dormant, and -expirable articles. If you'd instead like to just have unread articles -marked as read, you can use @code{gnus-summary-mark-unread-as-read} -instead. It will leave marks like @code{gnus-low-score-mark}, -@code{gnus-del-mark} (and so on) alone. - -@end table - - -@node Paging the Article -@section Scrolling the Article -@cindex article scrolling - -@table @kbd - -@item SPACE -@kindex SPACE (Summary) -@findex gnus-summary-next-page -Pressing @kbd{SPACE} will scroll the current article forward one page, -or, if you have come to the end of the current article, will choose the -next article (@code{gnus-summary-next-page}). - -@item DEL -@kindex DEL (Summary) -@findex gnus-summary-prev-page -Scroll the current article back one page (@code{gnus-summary-prev-page}). - -@item RET -@kindex RET (Summary) -@findex gnus-summary-scroll-up -Scroll the current article one line forward -(@code{gnus-summary-scroll-up}). - -@item M-RET -@kindex M-RET (Summary) -@findex gnus-summary-scroll-down -Scroll the current article one line backward -(@code{gnus-summary-scroll-down}). - -@item A g -@itemx g -@kindex A g (Summary) -@kindex g (Summary) -@findex gnus-summary-show-article -@vindex gnus-summary-show-article-charset-alist -(Re)fetch the current article (@code{gnus-summary-show-article}). If -given a prefix, fetch the current article, but don't run any of the -article treatment functions. This will give you a ``raw'' article, just -the way it came from the server. - -If given a numerical prefix, you can do semi-manual charset stuff. -@kbd{C-u 0 g cn-gb-2312 RET} will decode the message as if it were -encoded in the @code{cn-gb-2312} charset. If you have - -@lisp -(setq gnus-summary-show-article-charset-alist - '((1 . cn-gb-2312) - (2 . big5))) -@end lisp - -then you can say @kbd{C-u 1 g} to get the same effect. - -@item A < -@itemx < -@kindex < (Summary) -@kindex A < (Summary) -@findex gnus-summary-beginning-of-article -Scroll to the beginning of the article -(@code{gnus-summary-beginning-of-article}). - -@item A > -@itemx > -@kindex > (Summary) -@kindex A > (Summary) -@findex gnus-summary-end-of-article -Scroll to the end of the article (@code{gnus-summary-end-of-article}). - -@item A s -@itemx s -@kindex A s (Summary) -@kindex s (Summary) -@findex gnus-summary-isearch-article -Perform an isearch in the article buffer -(@code{gnus-summary-isearch-article}). - -@item h -@kindex h (Summary) -@findex gnus-summary-select-article-buffer -Select the article buffer (@code{gnus-summary-select-article-buffer}). - -@end table - - -@node Reply Followup and Post -@section Reply, Followup and Post - -@menu -* Summary Mail Commands:: Sending mail. -* Summary Post Commands:: Sending news. -* Summary Message Commands:: Other Message-related commands. -* Canceling and Superseding:: -@end menu - - -@node Summary Mail Commands -@subsection Summary Mail Commands -@cindex mail -@cindex composing mail - -Commands for composing a mail message: - -@table @kbd - -@item S r -@itemx r -@kindex S r (Summary) -@kindex r (Summary) -@findex gnus-summary-reply -@c @icon{gnus-summary-mail-reply} -@c @icon{gnus-summary-reply} -Mail a reply to the author of the current article -(@code{gnus-summary-reply}). - -@item S R -@itemx R -@kindex R (Summary) -@kindex S R (Summary) -@findex gnus-summary-reply-with-original -@c @icon{gnus-summary-reply-with-original} -Mail a reply to the author of the current article and include the -original message (@code{gnus-summary-reply-with-original}). This -command uses the process/prefix convention. - -@item S w -@kindex S w (Summary) -@findex gnus-summary-wide-reply -Mail a wide reply to the author of the current article -(@code{gnus-summary-wide-reply}). A @dfn{wide reply} is a reply that -goes out to all people listed in the @code{To}, @code{From} (or -@code{Reply-to}) and @code{Cc} headers. - -@item S W -@kindex S W (Summary) -@findex gnus-summary-wide-reply-with-original -Mail a wide reply to the current article and include the original -message (@code{gnus-summary-wide-reply-with-original}). This command uses -the process/prefix convention. - -@item S v -@kindex S v (Summary) -@findex gnus-summary-very-wide-reply -Mail a very wide reply to the author of the current article -(@code{gnus-summary-wide-reply}). A @dfn{very wide reply} is a reply -that goes out to all people listed in the @code{To}, @code{From} (or -@code{Reply-to}) and @code{Cc} headers in all the process/prefixed -articles. This command uses the process/prefix convention. - -@item S o m -@itemx C-c C-f -@kindex S o m (Summary) -@kindex C-c C-f (Summary) -@findex gnus-summary-mail-forward -@c @icon{gnus-summary-mail-forward} -Forward the current article to some other person -(@code{gnus-summary-mail-forward}). If given a prefix, include the full -headers of the forwarded article. - -@item S m -@itemx m -@kindex m (Summary) -@kindex S m (Summary) -@findex gnus-summary-mail-other-window -@c @icon{gnus-summary-mail-originate} -Send a mail to some other person -(@code{gnus-summary-mail-other-window}). - -@item S D b -@kindex S D b (Summary) -@findex gnus-summary-resend-bounced-mail -@cindex bouncing mail -If you have sent a mail, but the mail was bounced back to you for some -reason (wrong address, transient failure), you can use this command to -resend that bounced mail (@code{gnus-summary-resend-bounced-mail}). You -will be popped into a mail buffer where you can edit the headers before -sending the mail off again. If you give a prefix to this command, and -the bounced mail is a reply to some other mail, gnus will try to fetch -that mail and display it for easy perusal of its headers. This might -very well fail, though. - -@item S D r -@kindex S D r (Summary) -@findex gnus-summary-resend-message -Not to be confused with the previous command, -@code{gnus-summary-resend-message} will prompt you for an address to -send the current message off to, and then send it to that place. The -headers of the message won't be altered---but lots of headers that say -@code{Resent-To}, @code{Resent-From} and so on will be added. This -means that you actually send a mail to someone that has a @code{To} -header that (probably) points to yourself. This will confuse people. -So, natcherly you'll only do that if you're really eVIl. - -This command is mainly used if you have several accounts and want to -ship a mail to a different account of yours. (If you're both -@code{root} and @code{postmaster} and get a mail for @code{postmaster} -to the @code{root} account, you may want to resend it to -@code{postmaster}. Ordnung muß sein! - -This command understands the process/prefix convention -(@pxref{Process/Prefix}). - -@item S O m -@kindex S O m (Summary) -@findex gnus-summary-digest-mail-forward -Digest the current series (@pxref{Decoding Articles}) and forward the -result using mail (@code{gnus-summary-digest-mail-forward}). This -command uses the process/prefix convention (@pxref{Process/Prefix}). - -@item S M-c -@kindex S M-c (Summary) -@findex gnus-summary-mail-crosspost-complaint -@cindex crossposting -@cindex excessive crossposting -Send a complaint about excessive crossposting to the author of the -current article (@code{gnus-summary-mail-crosspost-complaint}). - -@findex gnus-crosspost-complaint -This command is provided as a way to fight back against the current -crossposting pandemic that's sweeping Usenet. It will compose a reply -using the @code{gnus-crosspost-complaint} variable as a preamble. This -command understands the process/prefix convention -(@pxref{Process/Prefix}) and will prompt you before sending each mail. - -@end table - -Also @pxref{(message)Header Commands} for more information. - - -@node Summary Post Commands -@subsection Summary Post Commands -@cindex post -@cindex composing news - -Commands for posting a news article: - -@table @kbd -@item S p -@itemx a -@kindex a (Summary) -@kindex S p (Summary) -@findex gnus-summary-post-news -@c @icon{gnus-summary-post-news} -Post an article to the current group -(@code{gnus-summary-post-news}). - -@item S f -@itemx f -@kindex f (Summary) -@kindex S f (Summary) -@findex gnus-summary-followup -@c @icon{gnus-summary-followup} -Post a followup to the current article (@code{gnus-summary-followup}). - -@item S F -@itemx F -@kindex S F (Summary) -@kindex F (Summary) -@c @icon{gnus-summary-followup-with-original} -@findex gnus-summary-followup-with-original -Post a followup to the current article and include the original message -(@code{gnus-summary-followup-with-original}). This command uses the -process/prefix convention. - -@item S n -@kindex S n (Summary) -@findex gnus-summary-followup-to-mail -Post a followup to the current article via news, even if you got the -message through mail (@code{gnus-summary-followup-to-mail}). - -@item S N -@kindex S N (Summary) -@findex gnus-summary-followup-to-mail-with-original -Post a followup to the current article via news, even if you got the -message through mail and include the original message -(@code{gnus-summary-followup-to-mail-with-original}). This command uses -the process/prefix convention. - -@item S o p -@kindex S o p (Summary) -@findex gnus-summary-post-forward -Forward the current article to a newsgroup -(@code{gnus-summary-post-forward}). If given a prefix, include the full -headers of the forwarded article. - -@item S O p -@kindex S O p (Summary) -@findex gnus-summary-digest-post-forward -@cindex digests -@cindex making digests -Digest the current series and forward the result to a newsgroup -(@code{gnus-summary-digest-post-forward}). This command uses the -process/prefix convention. - -@item S u -@kindex S u (Summary) -@findex gnus-uu-post-news -@c @icon{gnus-uu-post-news} -Uuencode a file, split it into parts, and post it as a series -(@code{gnus-uu-post-news}). (@pxref{Uuencoding and Posting}). -@end table - -Also @pxref{(message)Header Commands} for more information. - - -@node Summary Message Commands -@subsection Summary Message Commands - -@table @kbd -@item S y -@kindex S y (Summary) -@findex gnus-summary-yank-message -Yank the current article into an already existing Message composition -buffer (@code{gnus-summary-yank-message}). This command prompts for -what message buffer you want to yank into, and understands the -process/prefix convention (@pxref{Process/Prefix}). - -@end table - - -@node Canceling and Superseding -@subsection Canceling Articles -@cindex canceling articles -@cindex superseding articles - -Have you ever written something, and then decided that you really, -really, really wish you hadn't posted that? - -Well, you can't cancel mail, but you can cancel posts. - -@findex gnus-summary-cancel-article -@kindex C (Summary) -@c @icon{gnus-summary-cancel-article} -Find the article you wish to cancel (you can only cancel your own -articles, so don't try any funny stuff). Then press @kbd{C} or @kbd{S -c} (@code{gnus-summary-cancel-article}). Your article will be -canceled---machines all over the world will be deleting your article. -This command uses the process/prefix convention (@pxref{Process/Prefix}). - -Be aware, however, that not all sites honor cancels, so your article may -live on here and there, while most sites will delete the article in -question. - -Gnus will use the ``current'' select method when canceling. If you -want to use the standard posting method, use the @samp{a} symbolic -prefix (@pxref{Symbolic Prefixes}). - -If you discover that you have made some mistakes and want to do some -corrections, you can post a @dfn{superseding} article that will replace -your original article. - -@findex gnus-summary-supersede-article -@kindex S (Summary) -Go to the original article and press @kbd{S s} -(@code{gnus-summary-supersede-article}). You will be put in a buffer -where you can edit the article all you want before sending it off the -usual way. - -The same goes for superseding as for canceling, only more so: Some -sites do not honor superseding. On those sites, it will appear that you -have posted almost the same article twice. - -If you have just posted the article, and change your mind right away, -there is a trick you can use to cancel/supersede the article without -waiting for the article to appear on your site first. You simply return -to the post buffer (which is called @code{*sent ...*}). There you will -find the article you just posted, with all the headers intact. Change -the @code{Message-ID} header to a @code{Cancel} or @code{Supersedes} -header by substituting one of those words for the word -@code{Message-ID}. Then just press @kbd{C-c C-c} to send the article as -you would do normally. The previous article will be -canceled/superseded. - -Just remember, kids: There is no 'c' in 'supersede'. - -@node Delayed Articles -@section Delayed Articles -@cindex delayed sending -@cindex send delayed - -Sometimes, you might wish to delay the sending of a message. For -example, you might wish to arrange for a message to turn up just in time -to remind your about the birthday of your Significant Other. For this, -there is the @code{gnus-delay} package. Setup is simple: - -@lisp -(gnus-delay-initialize) -@end lisp - -@findex gnus-delay-article -Normally, to send a message you use the @kbd{C-c C-c} command from -Message mode. To delay a message, use @kbd{C-c C-j} -(@code{gnus-delay-article}) instead. This will ask you for how long the -message should be delayed. Possible answers are: - -@itemize -@item -A time span. Consists of an integer and a letter. For example, -@code{42d} means to delay for 42 days. Available letters are @code{m} -(minutes), @code{h} (hours), @code{d} (days), @code{w} (weeks), @code{M} -(months) and @code{Y} (years). - -@item -A specific date. Looks like @code{YYYYY-MM-DD}. The message will be -delayed until that day, at a specific time (eight o'clock by default). -See also @code{gnus-delay-default-hour}. - -@item -A specific time of day. Given in @code{hh:mm} format, 24h, no am/pm -stuff. The deadline will be at that time today, except if that time has -already passed, then it's at the given time tomorrow. So if it's ten -o'clock in the morning and you specify @code{11:15}, then the deadline -is one hour and fifteen minutes hence. But if you specify @code{9:20}, -that means a time tomorrow. -@end itemize - -The action of the @code{gnus-delay-article} command is influenced by a -couple of variables: - -@table @code -@item gnus-delay-default-hour -@vindex gnus-delay-default-hour -When you specify a specific date, the message will be due on that hour -on the given date. Possible values are integers 0 through 23. - -@item gnus-delay-default-delay -@vindex gnus-delay-default-delay -This is a string and gives the default delay. It can be of any of the -formats described above. - -@item gnus-delay-group -@vindex gnus-delay-group -Delayed articles will be kept in this group on the drafts server until -they are due. You probably don't need to change this. The default -value is @code{"delayed"}. - -@item gnus-delay-header -@vindex gnus-delay-header -The deadline for each article will be stored in a header. This variable -is a string and gives the header name. You probably don't need to -change this. The default value is @code{"X-Gnus-Delayed"}. -@end table - -The way delaying works is like this: when you use the -@code{gnus-delay-article} command, you give a certain delay. Gnus -calculates the deadline of the message and stores it in the -@code{X-Gnus-Delayed} header and puts the message in the -@code{nndraft:delayed} group. - -And whenever you get new news, Gnus looks through the group for articles -which are due and sends them. It uses the @code{gnus-delay-send-drafts} -function for this. By default, this function is added to the hook -@code{gnus-get-new-news-hook}. But of course, you can change this. -Maybe you want to use the demon to send drafts? Just tell the demon to -execute the @code{gnus-delay-send-drafts} function. - -@table @code -@item gnus-delay-initialize -@findex gnus-delay-initialize -By default, this function installs the @kbd{C-c C-j} key binding in -Message mode and @code{gnus-delay-send-drafts} in -@code{gnus-get-new-news-hook}. But it accepts two optional arguments, -@code{no-keymap} and @code{no-check}. If @code{no-keymap} is non-nil, -the @kbd{C-c C-j} binding is not intalled. If @code{no-check} is -non-nil, @code{gnus-get-new-news-hook} is not changed. - -For example, @code{(gnus-delay-initialize nil t)} means to change the -keymap but not to change @code{gnus-get-new-news-hook}. Presumably, you -want to use the demon for sending due delayed articles. Just don't -forget to set that up :-) -@end table - - -@node Marking Articles -@section Marking Articles -@cindex article marking -@cindex article ticking -@cindex marks - -There are several marks you can set on an article. - -You have marks that decide the @dfn{readedness} (whoo, neato-keano -neologism ohoy!) of the article. Alphabetic marks generally mean -@dfn{read}, while non-alphabetic characters generally mean @dfn{unread}. - -In addition, you also have marks that do not affect readedness. - -@menu -* Unread Articles:: Marks for unread articles. -* Read Articles:: Marks for read articles. -* Other Marks:: Marks that do not affect readedness. -@end menu - -@ifinfo -There's a plethora of commands for manipulating these marks: -@end ifinfo - -@menu -* 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. -@end menu - - -@node Unread Articles -@subsection Unread Articles - -The following marks mark articles as (kinda) unread, in one form or -other. - -@table @samp -@item ! -@vindex gnus-ticked-mark -Marked as ticked (@code{gnus-ticked-mark}). - -@dfn{Ticked articles} are articles that will remain visible always. If -you see an article that you find interesting, or you want to put off -reading it, or replying to it, until sometime later, you'd typically -tick it. However, articles can be expired (from news servers by the -news server software, Gnus itself never expires ticked messages), so if -you want to keep an article forever, you'll have to make it persistent -(@pxref{Persistent Articles}). - -@item ? -@vindex gnus-dormant-mark -Marked as dormant (@code{gnus-dormant-mark}). - -@dfn{Dormant articles} will only appear in the summary buffer if there -are followups to it. If you want to see them even if they don't have -followups, you can use the @kbd{/ D} command (@pxref{Limiting}). -Otherwise (except for the visibility issue), they are just like ticked -messages. - -@item SPACE -@vindex gnus-unread-mark -Marked as unread (@code{gnus-unread-mark}). - -@dfn{Unread articles} are articles that haven't been read at all yet. -@end table - - -@node Read Articles -@subsection Read Articles -@cindex expirable mark - -All the following marks mark articles as read. - -@table @samp - -@item r -@vindex gnus-del-mark -These are articles that the user has marked as read with the @kbd{d} -command manually, more or less (@code{gnus-del-mark}). - -@item R -@vindex gnus-read-mark -Articles that have actually been read (@code{gnus-read-mark}). - -@item O -@vindex gnus-ancient-mark -Articles that were marked as read in previous sessions and are now -@dfn{old} (@code{gnus-ancient-mark}). - -@item K -@vindex gnus-killed-mark -Marked as killed (@code{gnus-killed-mark}). - -@item X -@vindex gnus-kill-file-mark -Marked as killed by kill files (@code{gnus-kill-file-mark}). - -@item Y -@vindex gnus-low-score-mark -Marked as read by having too low a score (@code{gnus-low-score-mark}). - -@item C -@vindex gnus-catchup-mark -Marked as read by a catchup (@code{gnus-catchup-mark}). - -@item G -@vindex gnus-canceled-mark -Canceled article (@code{gnus-canceled-mark}) - -@item F -@vindex gnus-souped-mark -@sc{soup}ed article (@code{gnus-souped-mark}). @xref{SOUP}. - -@item Q -@vindex gnus-sparse-mark -Sparsely reffed article (@code{gnus-sparse-mark}). @xref{Customizing -Threading}. - -@item M -@vindex gnus-duplicate-mark -Article marked as read by duplicate suppression -(@code{gnus-duplicate-mark}). @xref{Duplicate Suppression}. - -@end table - -All these marks just mean that the article is marked as read, really. -They are interpreted differently when doing adaptive scoring, though. - -One more special mark, though: - -@table @samp -@item E -@vindex gnus-expirable-mark -Marked as expirable (@code{gnus-expirable-mark}). - -Marking articles as @dfn{expirable} (or have them marked as such -automatically) doesn't make much sense in normal groups---a user doesn't -control expiring of news articles, but in mail groups, for instance, -articles marked as @dfn{expirable} can be deleted by gnus at -any time. -@end table - - -@node Other Marks -@subsection Other Marks -@cindex process mark -@cindex bookmarks - -There are some marks that have nothing to do with whether the article is -read or not. - -@itemize @bullet - -@item -You can set a bookmark in the current article. Say you are reading a -long thesis on cats' urinary tracts, and have to go home for dinner -before you've finished reading the thesis. You can then set a bookmark -in the article, and gnus will jump to this bookmark the next time it -encounters the article. @xref{Setting Marks}. - -@item -@vindex gnus-replied-mark -All articles that you have replied to or made a followup to (i.e., have -answered) will be marked with an @samp{A} in the second column -(@code{gnus-replied-mark}). - -@vindex gnus-forwarded-mark -All articles that you have forwarded will be marked with an @samp{F} in -the second column (@code{gnus-forwarded-mark}). - -@vindex gnus-recent-mark -Articles that are ``recently'' arrived in the group will be marked -with an @samp{N} in the second column (@code{gnus-recent-mark}). Most -backend doesn't support the mark, in which case it's not shown. - -@item -@vindex gnus-cached-mark -Articles stored in the article cache will be marked with an @samp{*} in -the second column (@code{gnus-cached-mark}). @xref{Article Caching}. - -@item -@vindex gnus-saved-mark -Articles ``saved'' (in some manner or other; not necessarily -religiously) are marked with an @samp{S} in the second column -(@code{gnus-saved-mark}). - -@item -@vindex gnus-unseen-mark -Articles that haven't been seen by the user before are marked with a -@samp{.} in the second column (@code{gnus-unseen-mark}). - -@item -@vindex gnus-not-empty-thread-mark -@vindex gnus-empty-thread-mark -If the @samp{%e} spec is used, the presence of threads or not will be -marked with @code{gnus-not-empty-thread-mark} and -@code{gnus-empty-thread-mark} in the third column, respectively. - -@item -@vindex gnus-process-mark -Finally we have the @dfn{process mark} (@code{gnus-process-mark}). A -variety of commands react to the presence of the process mark. For -instance, @kbd{X u} (@code{gnus-uu-decode-uu}) will uudecode and view -all articles that have been marked with the process mark. Articles -marked with the process mark have a @samp{#} in the second column. - -@end itemize - -You might have noticed that most of these ``non-readedness'' marks -appear in the second column by default. So if you have a cached, saved, -replied article that you have process-marked, what will that look like? - -Nothing much. The precedence rules go as follows: process -> cache -> -replied -> saved. So if the article is in the cache and is replied, -you'll only see the cache mark and not the replied mark. - - -@node Setting Marks -@subsection Setting Marks -@cindex setting marks - -All the marking commands understand the numeric prefix. - -@table @kbd -@item M c -@itemx M-u -@kindex M c (Summary) -@kindex M-u (Summary) -@findex gnus-summary-clear-mark-forward -@cindex mark as unread -Clear all readedness-marks from the current article -(@code{gnus-summary-clear-mark-forward}). In other words, mark the -article as unread. - -@item M t -@itemx ! -@kindex ! (Summary) -@kindex M t (Summary) -@findex gnus-summary-tick-article-forward -Tick the current article (@code{gnus-summary-tick-article-forward}). -@xref{Article Caching}. - -@item M ? -@itemx ? -@kindex ? (Summary) -@kindex M ? (Summary) -@findex gnus-summary-mark-as-dormant -Mark the current article as dormant -(@code{gnus-summary-mark-as-dormant}). @xref{Article Caching}. - -@item M d -@itemx d -@kindex M d (Summary) -@kindex d (Summary) -@findex gnus-summary-mark-as-read-forward -Mark the current article as read -(@code{gnus-summary-mark-as-read-forward}). - -@item D -@kindex D (Summary) -@findex gnus-summary-mark-as-read-backward -Mark the current article as read and move point to the previous line -(@code{gnus-summary-mark-as-read-backward}). - -@item M k -@itemx k -@kindex k (Summary) -@kindex M k (Summary) -@findex gnus-summary-kill-same-subject-and-select -Mark all articles that have the same subject as the current one as read, -and then select the next unread article -(@code{gnus-summary-kill-same-subject-and-select}). - -@item M K -@itemx C-k -@kindex M K (Summary) -@kindex C-k (Summary) -@findex gnus-summary-kill-same-subject -Mark all articles that have the same subject as the current one as read -(@code{gnus-summary-kill-same-subject}). - -@item M C -@kindex M C (Summary) -@findex gnus-summary-catchup -@c @icon{gnus-summary-catchup} -Mark all unread articles as read (@code{gnus-summary-catchup}). - -@item M C-c -@kindex M C-c (Summary) -@findex gnus-summary-catchup-all -Mark all articles in the group as read---even the ticked and dormant -articles (@code{gnus-summary-catchup-all}). - -@item M H -@kindex M H (Summary) -@findex gnus-summary-catchup-to-here -Catchup the current group to point (before the point) -(@code{gnus-summary-catchup-to-here}). - -@item M h -@kindex M h (Summary) -@findex gnus-summary-catchup-from-here -Catchup the current group from point (after the point) -(@code{gnus-summary-catchup-from-here}). - -@item C-w -@kindex C-w (Summary) -@findex gnus-summary-mark-region-as-read -Mark all articles between point and mark as read -(@code{gnus-summary-mark-region-as-read}). - -@item M V k -@kindex M V k (Summary) -@findex gnus-summary-kill-below -Kill all articles with scores below the default score (or below the -numeric prefix) (@code{gnus-summary-kill-below}). - -@item M e -@itemx E -@kindex M e (Summary) -@kindex E (Summary) -@findex gnus-summary-mark-as-expirable -Mark the current article as expirable -(@code{gnus-summary-mark-as-expirable}). - -@item M b -@kindex M b (Summary) -@findex gnus-summary-set-bookmark -Set a bookmark in the current article -(@code{gnus-summary-set-bookmark}). - -@item M B -@kindex M B (Summary) -@findex gnus-summary-remove-bookmark -Remove the bookmark from the current article -(@code{gnus-summary-remove-bookmark}). - -@item M V c -@kindex M V c (Summary) -@findex gnus-summary-clear-above -Clear all marks from articles with scores over the default score (or -over the numeric prefix) (@code{gnus-summary-clear-above}). - -@item M V u -@kindex M V u (Summary) -@findex gnus-summary-tick-above -Tick all articles with scores over the default score (or over the -numeric prefix) (@code{gnus-summary-tick-above}). - -@item M V m -@kindex M V m (Summary) -@findex gnus-summary-mark-above -Prompt for a mark, and mark all articles with scores over the default -score (or over the numeric prefix) with this mark -(@code{gnus-summary-clear-above}). -@end table - -@vindex gnus-summary-goto-unread -The @code{gnus-summary-goto-unread} variable controls what action should -be taken after setting a mark. If non-@code{nil}, point will move to -the next/previous unread article. If @code{nil}, point will just move -one line up or down. As a special case, if this variable is -@code{never}, all the marking commands as well as other commands (like -@kbd{SPACE}) will move to the next article, whether it is unread or not. -The default is @code{t}. - - -@node Generic Marking Commands -@subsection Generic Marking Commands - -Some people would like the command that ticks an article (@kbd{!}) go to -the next article. Others would like it to go to the next unread -article. Yet others would like it to stay on the current article. And -even though I haven't heard of anybody wanting it to go to the -previous (unread) article, I'm sure there are people that want that as -well. - -Multiply these five behaviors with five different marking commands, and -you get a potentially complex set of variable to control what each -command should do. - -To sidestep that mess, Gnus provides commands that do all these -different things. They can be found on the @kbd{M M} map in the summary -buffer. Type @kbd{M M C-h} to see them all---there are too many of them -to list in this manual. - -While you can use these commands directly, most users would prefer -altering the summary mode keymap. For instance, if you would like the -@kbd{!} command to go to the next article instead of the next unread -article, you could say something like: - -@lisp -(add-hook 'gnus-summary-mode-hook 'my-alter-summary-map) -(defun my-alter-summary-map () - (local-set-key "!" 'gnus-summary-put-mark-as-ticked-next)) -@end lisp - -or - -@lisp -(defun my-alter-summary-map () - (local-set-key "!" "MM!n")) -@end lisp - - -@node Setting Process Marks -@subsection Setting Process Marks -@cindex setting process marks - -@table @kbd - -@item M P p -@itemx # -@kindex # (Summary) -@kindex M P p (Summary) -@findex gnus-summary-mark-as-processable -Mark the current article with the process mark -(@code{gnus-summary-mark-as-processable}). -@findex gnus-summary-unmark-as-processable - -@item M P u -@itemx M-# -@kindex M P u (Summary) -@kindex M-# (Summary) -Remove the process mark, if any, from the current article -(@code{gnus-summary-unmark-as-processable}). - -@item M P U -@kindex M P U (Summary) -@findex gnus-summary-unmark-all-processable -Remove the process mark from all articles -(@code{gnus-summary-unmark-all-processable}). - -@item M P i -@kindex M P i (Summary) -@findex gnus-uu-invert-processable -Invert the list of process marked articles -(@code{gnus-uu-invert-processable}). - -@item M P R -@kindex M P R (Summary) -@findex gnus-uu-mark-by-regexp -Mark articles that have a @code{Subject} header that matches a regular -expression (@code{gnus-uu-mark-by-regexp}). - -@item M P G -@kindex M P G (Summary) -@findex gnus-uu-unmark-by-regexp -Unmark articles that have a @code{Subject} header that matches a regular -expression (@code{gnus-uu-unmark-by-regexp}). - -@item M P r -@kindex M P r (Summary) -@findex gnus-uu-mark-region -Mark articles in region (@code{gnus-uu-mark-region}). - -@item M P t -@kindex M P t (Summary) -@findex gnus-uu-mark-thread -Mark all articles in the current (sub)thread -(@code{gnus-uu-mark-thread}). - -@item M P T -@kindex M P T (Summary) -@findex gnus-uu-unmark-thread -Unmark all articles in the current (sub)thread -(@code{gnus-uu-unmark-thread}). - -@item M P v -@kindex M P v (Summary) -@findex gnus-uu-mark-over -Mark all articles that have a score above the prefix argument -(@code{gnus-uu-mark-over}). - -@item M P s -@kindex M P s (Summary) -@findex gnus-uu-mark-series -Mark all articles in the current series (@code{gnus-uu-mark-series}). - -@item M P S -@kindex M P S (Summary) -@findex gnus-uu-mark-sparse -Mark all series that have already had some articles marked -(@code{gnus-uu-mark-sparse}). - -@item M P a -@kindex M P a (Summary) -@findex gnus-uu-mark-all -Mark all articles in series order (@code{gnus-uu-mark-series}). - -@item M P b -@kindex M P b (Summary) -@findex gnus-uu-mark-buffer -Mark all articles in the buffer in the order they appear -(@code{gnus-uu-mark-buffer}). - -@item M P k -@kindex M P k (Summary) -@findex gnus-summary-kill-process-mark -Push the current process mark set onto the stack and unmark all articles -(@code{gnus-summary-kill-process-mark}). - -@item M P y -@kindex M P y (Summary) -@findex gnus-summary-yank-process-mark -Pop the previous process mark set from the stack and restore it -(@code{gnus-summary-yank-process-mark}). - -@item M P w -@kindex M P w (Summary) -@findex gnus-summary-save-process-mark -Push the current process mark set onto the stack -(@code{gnus-summary-save-process-mark}). - -@end table - -Also see the @kbd{&} command in @pxref{Searching for Articles} for how to -set process marks based on article body contents. - - -@node Limiting -@section Limiting -@cindex limiting - -It can be convenient to limit the summary buffer to just show some -subset of the articles currently in the group. The effect most limit -commands have is to remove a few (or many) articles from the summary -buffer. - -All limiting commands work on subsets of the articles already fetched -from the servers. None of these commands query the server for -additional articles. - -@table @kbd - -@item / / -@itemx / s -@kindex / / (Summary) -@findex gnus-summary-limit-to-subject -Limit the summary buffer to articles that match some subject -(@code{gnus-summary-limit-to-subject}). - -@item / a -@kindex / a (Summary) -@findex gnus-summary-limit-to-author -Limit the summary buffer to articles that match some author -(@code{gnus-summary-limit-to-author}). - -@item / x -@kindex / x (Summary) -@findex gnus-summary-limit-to-extra -Limit the summary buffer to articles that match one of the ``extra'' -headers (@pxref{To From Newsgroups}) -(@code{gnus-summary-limit-to-extra}). - -@item / u -@itemx x -@kindex / u (Summary) -@kindex x (Summary) -@findex gnus-summary-limit-to-unread -Limit the summary buffer to articles not marked as read -(@code{gnus-summary-limit-to-unread}). If given a prefix, limit the -buffer to articles strictly unread. This means that ticked and -dormant articles will also be excluded. - -@item / m -@kindex / m (Summary) -@findex gnus-summary-limit-to-marks -Ask for a mark and then limit to all articles that have been marked -with that mark (@code{gnus-summary-limit-to-marks}). - -@item / t -@kindex / t (Summary) -@findex gnus-summary-limit-to-age -Ask for a number and then limit the summary buffer to articles older than (or equal to) that number of days -(@code{gnus-summary-limit-to-age}). If given a prefix, limit to -articles younger than that number of days. - -@item / n -@kindex / n (Summary) -@findex gnus-summary-limit-to-articles -Limit the summary buffer to the current article -(@code{gnus-summary-limit-to-articles}). Uses the process/prefix -convention (@pxref{Process/Prefix}). - -@item / w -@kindex / w (Summary) -@findex gnus-summary-pop-limit -Pop the previous limit off the stack and restore it -(@code{gnus-summary-pop-limit}). If given a prefix, pop all limits off -the stack. - -@item / v -@kindex / v (Summary) -@findex gnus-summary-limit-to-score -Limit the summary buffer to articles that have a score at or above some -score (@code{gnus-summary-limit-to-score}). - -@item / p -@kindex / p (Summary) -@findex gnus-summary-limit-to-display-parameter -Limit the summary buffer to articles that satisfy the @code{display} -group parameter predicate -(@code{gnus-summary-limit-to-display-parameter}). See @pxref{Group -Parameters} for more on this predicate. - -@item / E -@itemx M S -@kindex M S (Summary) -@kindex / E (Summary) -@findex gnus-summary-limit-include-expunged -Include all expunged articles in the limit -(@code{gnus-summary-limit-include-expunged}). - -@item / D -@kindex / D (Summary) -@findex gnus-summary-limit-include-dormant -Include all dormant articles in the limit -(@code{gnus-summary-limit-include-dormant}). - -@item / * -@kindex / * (Summary) -@findex gnus-summary-limit-include-cached -Include all cached articles in the limit -(@code{gnus-summary-limit-include-cached}). - -@item / d -@kindex / d (Summary) -@findex gnus-summary-limit-exclude-dormant -Exclude all dormant articles from the limit -(@code{gnus-summary-limit-exclude-dormant}). - -@item / M -@kindex / M (Summary) -@findex gnus-summary-limit-exclude-marks -Exclude all marked articles (@code{gnus-summary-limit-exclude-marks}). - -@item / T -@kindex / T (Summary) -@findex gnus-summary-limit-include-thread -Include all the articles in the current thread in the limit. - -@item / c -@kindex / c (Summary) -@findex gnus-summary-limit-exclude-childless-dormant -Exclude all dormant articles that have no children from the limit -(@code{gnus-summary-limit-exclude-childless-dormant}). - -@item / C -@kindex / C (Summary) -@findex gnus-summary-limit-mark-excluded-as-read -Mark all excluded unread articles as read -(@code{gnus-summary-limit-mark-excluded-as-read}). If given a prefix, -also mark excluded ticked and dormant articles as read. - -@end table - - -@node Threading -@section Threading -@cindex threading -@cindex article threading - -Gnus threads articles by default. @dfn{To thread} is to put responses -to articles directly after the articles they respond to---in a -hierarchical fashion. - -Threading is done by looking at the @code{References} headers of the -articles. In a perfect world, this would be enough to build pretty -trees, but unfortunately, the @code{References} header is often broken -or simply missing. Weird news propagation exacerbates the problem, -so one has to employ other heuristics to get pleasing results. A -plethora of approaches exists, as detailed in horrible detail in -@pxref{Customizing Threading}. - -First, a quick overview of the concepts: - -@table @dfn -@item root -The top-most article in a thread; the first article in the thread. - -@item thread -A tree-like article structure. - -@item sub-thread -A small(er) section of this tree-like structure. - -@item loose threads -Threads often lose their roots due to article expiry, or due to the root -already having been read in a previous session, and not displayed in the -summary buffer. We then typically have many sub-threads that really -belong to one thread, but are without connecting roots. These are -called loose threads. - -@item thread gathering -An attempt to gather loose threads into bigger threads. - -@item sparse threads -A thread where the missing articles have been ``guessed'' at, and are -displayed as empty lines in the summary buffer. - -@end table - - -@menu -* Customizing Threading:: Variables you can change to affect the threading. -* Thread Commands:: Thread based commands in the summary buffer. -@end menu - - -@node Customizing Threading -@subsection Customizing Threading -@cindex customizing threading - -@menu -* 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! -@end menu - - -@node Loose Threads -@subsubsection Loose Threads -@cindex < -@cindex > -@cindex loose threads - -@table @code -@item gnus-summary-make-false-root -@vindex gnus-summary-make-false-root -If non-@code{nil}, gnus will gather all loose subtrees into one big tree -and create a dummy root at the top. (Wait a minute. Root at the top? -Yup.) Loose subtrees occur when the real root has expired, or you've -read or killed the root in a previous session. - -When there is no real root of a thread, gnus will have to fudge -something. This variable says what fudging method gnus should use. -There are four possible values: - -@iftex -@iflatex -\gnusfigure{The Summary Buffer}{390}{ -\put(0,0){\epsfig{figure=tmp/summary-adopt.ps,width=7.5cm}} -\put(445,0){\makebox(0,0)[br]{\epsfig{figure=tmp/summary-empty.ps,width=7.5cm}}} -\put(0,400){\makebox(0,0)[tl]{\epsfig{figure=tmp/summary-none.ps,width=7.5cm}}} -\put(445,400){\makebox(0,0)[tr]{\epsfig{figure=tmp/summary-dummy.ps,width=7.5cm}}} -} -@end iflatex -@end iftex - -@cindex adopting articles - -@table @code - -@item adopt -Gnus will make the first of the orphaned articles the parent. This -parent will adopt all the other articles. The adopted articles will be -marked as such by pointy brackets (@samp{<>}) instead of the standard -square brackets (@samp{[]}). This is the default method. - -@item dummy -@vindex gnus-summary-dummy-line-format -Gnus will create a dummy summary line that will pretend to be the -parent. This dummy line does not correspond to any real article, so -selecting it will just select the first real article after the dummy -article. @code{gnus-summary-dummy-line-format} is used to specify the -format of the dummy roots. It accepts only one format spec: @samp{S}, -which is the subject of the article. @xref{Formatting Variables}. - -@item empty -Gnus won't actually make any article the parent, but simply leave the -subject field of all orphans except the first empty. (Actually, it will -use @code{gnus-summary-same-subject} as the subject (@pxref{Summary -Buffer Format}).) - -@item none -Don't make any article parent at all. Just gather the threads and -display them after one another. - -@item nil -Don't gather loose threads. -@end table - -@item gnus-summary-gather-subject-limit -@vindex gnus-summary-gather-subject-limit -Loose threads are gathered by comparing subjects of articles. If this -variable is @code{nil}, gnus requires an exact match between the -subjects of the loose threads before gathering them into one big -super-thread. This might be too strict a requirement, what with the -presence of stupid newsreaders that chop off long subject lines. If -you think so, set this variable to, say, 20 to require that only the -first 20 characters of the subjects have to match. If you set this -variable to a really low number, you'll find that gnus will gather -everything in sight into one thread, which isn't very helpful. - -@cindex fuzzy article gathering -If you set this variable to the special value @code{fuzzy}, gnus will -use a fuzzy string comparison algorithm on the subjects (@pxref{Fuzzy -Matching}). - -@item gnus-simplify-subject-fuzzy-regexp -@vindex gnus-simplify-subject-fuzzy-regexp -This can either be a regular expression or list of regular expressions -that match strings that will be removed from subjects if fuzzy subject -simplification is used. - -@item gnus-simplify-ignored-prefixes -@vindex gnus-simplify-ignored-prefixes -If you set @code{gnus-summary-gather-subject-limit} to something as low -as 10, you might consider setting this variable to something sensible: - -@c Written by Michael Ernst -@lisp -(setq gnus-simplify-ignored-prefixes - (concat - "\\`\\[?\\(" - (mapconcat - 'identity - '("looking" - "wanted" "followup" "summary\\( of\\)?" - "help" "query" "problem" "question" - "answer" "reference" "announce" - "How can I" "How to" "Comparison of" - ;; ... - ) - "\\|") - "\\)\\s *\\(" - (mapconcat 'identity - '("for" "for reference" "with" "about") - "\\|") - "\\)?\\]?:?[ \t]*")) -@end lisp - -All words that match this regexp will be removed before comparing two -subjects. - -@item gnus-simplify-subject-functions -@vindex gnus-simplify-subject-functions -If non-@code{nil}, this variable overrides -@code{gnus-summary-gather-subject-limit}. This variable should be a -list of functions to apply to the @code{Subject} string iteratively to -arrive at the simplified version of the string. - -Useful functions to put in this list include: - -@table @code -@item gnus-simplify-subject-re -@findex gnus-simplify-subject-re -Strip the leading @samp{Re:}. - -@item gnus-simplify-subject-fuzzy -@findex gnus-simplify-subject-fuzzy -Simplify fuzzily. - -@item gnus-simplify-whitespace -@findex gnus-simplify-whitespace -Remove excessive whitespace. -@end table - -You may also write your own functions, of course. - - -@item gnus-summary-gather-exclude-subject -@vindex gnus-summary-gather-exclude-subject -Since loose thread gathering is done on subjects only, that might lead -to many false hits, especially with certain common subjects like -@samp{} and @samp{(none)}. To make the situation slightly better, -you can use the regexp @code{gnus-summary-gather-exclude-subject} to say -what subjects should be excluded from the gathering process.@* -The default is @samp{^ *$\\|^(none)$}. - -@item gnus-summary-thread-gathering-function -@vindex gnus-summary-thread-gathering-function -Gnus gathers threads by looking at @code{Subject} headers. This means -that totally unrelated articles may end up in the same ``thread'', which -is confusing. An alternate approach is to look at all the -@code{Message-ID}s in all the @code{References} headers to find matches. -This will ensure that no gathered threads ever include unrelated -articles, but it also means that people who have posted with broken -newsreaders won't be gathered properly. The choice is yours---plague or -cholera: - -@table @code -@item gnus-gather-threads-by-subject -@findex gnus-gather-threads-by-subject -This function is the default gathering function and looks at -@code{Subject}s exclusively. - -@item gnus-gather-threads-by-references -@findex gnus-gather-threads-by-references -This function looks at @code{References} headers exclusively. -@end table - -If you want to test gathering by @code{References}, you could say -something like: - -@lisp -(setq gnus-summary-thread-gathering-function - 'gnus-gather-threads-by-references) -@end lisp - -@end table - - -@node Filling In Threads -@subsubsection Filling In Threads - -@table @code -@item gnus-fetch-old-headers -@vindex gnus-fetch-old-headers -If non-@code{nil}, gnus will attempt to build old threads by fetching -more old headers---headers to articles marked as read. If you -would like to display as few summary lines as possible, but still -connect as many loose threads as possible, you should set this variable -to @code{some} or a number. If you set it to a number, no more than -that number of extra old headers will be fetched. In either case, -fetching old headers only works if the backend you are using carries -overview files---this would normally be @code{nntp}, @code{nnspool} and -@code{nnml}. Also remember that if the root of the thread has been -expired by the server, there's not much gnus can do about that. - -This variable can also be set to @code{invisible}. This won't have any -visible effects, but is useful if you use the @kbd{A T} command a lot -(@pxref{Finding the Parent}). - -@item gnus-build-sparse-threads -@vindex gnus-build-sparse-threads -Fetching old headers can be slow. A low-rent similar effect can be -gotten by setting this variable to @code{some}. Gnus will then look at -the complete @code{References} headers of all articles and try to string -together articles that belong in the same thread. This will leave -@dfn{gaps} in the threading display where gnus guesses that an article -is missing from the thread. (These gaps appear like normal summary -lines. If you select a gap, gnus will try to fetch the article in -question.) If this variable is @code{t}, gnus will display all these -``gaps'' without regard for whether they are useful for completing the -thread or not. Finally, if this variable is @code{more}, gnus won't cut -off sparse leaf nodes that don't lead anywhere. This variable is -@code{nil} by default. - -@item gnus-read-all-available-headers -@vindex gnus-read-all-available-headers -This is a rather obscure variable that few will find useful. It's -intended for those non-news newsgroups where the backend has to fetch -quite a lot to present the summary buffer, and where it's impossible to -go back to parents of articles. This is mostly the case in the -web-based groups, like the @code{nnultimate} groups. - -If you don't use those, then it's safe to leave this as the default -@code{nil}. If you want to use this variable, it should be a regexp -that matches the group name, or @code{t} for all groups. - -@end table - - -@node More Threading -@subsubsection More Threading - -@table @code -@item gnus-show-threads -@vindex gnus-show-threads -If this variable is @code{nil}, no threading will be done, and all of -the rest of the variables here will have no effect. Turning threading -off will speed group selection up a bit, but it is sure to make reading -slower and more awkward. - -@item gnus-thread-hide-subtree -@vindex gnus-thread-hide-subtree -If non-@code{nil}, all threads will be hidden when the summary buffer is -generated. - -@item gnus-thread-expunge-below -@vindex gnus-thread-expunge-below -All threads that have a total score (as defined by -@code{gnus-thread-score-function}) less than this number will be -expunged. This variable is @code{nil} by default, which means that no -threads are expunged. - -@item gnus-thread-hide-killed -@vindex gnus-thread-hide-killed -if you kill a thread and this variable is non-@code{nil}, the subtree -will be hidden. - -@item gnus-thread-ignore-subject -@vindex gnus-thread-ignore-subject -Sometimes somebody changes the subject in the middle of a thread. If -this variable is non-@code{nil}, which is the default, the subject -change is ignored. If it is @code{nil}, a change in the subject will -result in a new thread. - -@item gnus-thread-indent-level -@vindex gnus-thread-indent-level -This is a number that says how much each sub-thread should be indented. -The default is 4. - -@item gnus-sort-gathered-threads-function -@vindex gnus-sort-gathered-threads-function -Sometimes, particularly with mailing lists, the order in which mails -arrive locally is not necessarily the same as the order in which they -arrived on the mailing list. Consequently, when sorting sub-threads -using the default @code{gnus-thread-sort-by-number}, responses can end -up appearing before the article to which they are responding to. -Setting this variable to an alternate value -(e.g. @code{gnus-thread-sort-by-date}), in a group's parameters or in an -appropriate hook (e.g. @code{gnus-summary-generate-hook}) can produce a -more logical sub-thread ordering in such instances. - -@end table - - -@node Low-Level Threading -@subsubsection Low-Level Threading - -@table @code - -@item gnus-parse-headers-hook -@vindex gnus-parse-headers-hook -Hook run before parsing any headers. The default value is -@code{(gnus-set-summary-default-charset)}, which sets up local value of -@code{default-mime-charset} in summary buffer based on variable -@code{gnus-newsgroup-default-charset-alist}. - -@item gnus-alter-header-function -@vindex gnus-alter-header-function -If non-@code{nil}, this function will be called to allow alteration of -article header structures. The function is called with one parameter, -the article header vector, which it may alter in any way. For instance, -if you have a mail-to-news gateway which alters the @code{Message-ID}s -in systematic ways (by adding prefixes and such), you can use this -variable to un-scramble the @code{Message-ID}s so that they are more -meaningful. Here's one example: - -@lisp -(setq gnus-alter-header-function 'my-alter-message-id) - -(defun my-alter-message-id (header) - (let ((id (mail-header-id header))) - (when (string-match - "\\(<[^<>@@]*\\)\\.?cygnus\\..*@@\\([^<>@@]*>\\)" id) - (mail-header-set-id - (concat (match-string 1 id) "@@" (match-string 2 id)) - header)))) -@end lisp - -@end table - - -@node Thread Commands -@subsection Thread Commands -@cindex thread commands - -@table @kbd - -@item T k -@itemx M-C-k -@kindex T k (Summary) -@kindex M-C-k (Summary) -@findex gnus-summary-kill-thread -Mark all articles in the current (sub-)thread as read -(@code{gnus-summary-kill-thread}). If the prefix argument is positive, -remove all marks instead. If the prefix argument is negative, tick -articles instead. - -@item T l -@itemx M-C-l -@kindex T l (Summary) -@kindex M-C-l (Summary) -@findex gnus-summary-lower-thread -Lower the score of the current (sub-)thread -(@code{gnus-summary-lower-thread}). - -@item T i -@kindex T i (Summary) -@findex gnus-summary-raise-thread -Increase the score of the current (sub-)thread -(@code{gnus-summary-raise-thread}). - -@item T # -@kindex T # (Summary) -@findex gnus-uu-mark-thread -Set the process mark on the current (sub-)thread -(@code{gnus-uu-mark-thread}). - -@item T M-# -@kindex T M-# (Summary) -@findex gnus-uu-unmark-thread -Remove the process mark from the current (sub-)thread -(@code{gnus-uu-unmark-thread}). - -@item T T -@kindex T T (Summary) -@findex gnus-summary-toggle-threads -Toggle threading (@code{gnus-summary-toggle-threads}). - -@item T s -@kindex T s (Summary) -@findex gnus-summary-show-thread -Expose the (sub-)thread hidden under the current article, if any -(@code{gnus-summary-show-thread}). - -@item T h -@kindex T h (Summary) -@findex gnus-summary-hide-thread -Hide the current (sub-)thread (@code{gnus-summary-hide-thread}). - -@item T S -@kindex T S (Summary) -@findex gnus-summary-show-all-threads -Expose all hidden threads (@code{gnus-summary-show-all-threads}). - -@item T H -@kindex T H (Summary) -@findex gnus-summary-hide-all-threads -Hide all threads (@code{gnus-summary-hide-all-threads}). - -@item T t -@kindex T t (Summary) -@findex gnus-summary-rethread-current -Re-thread the current article's thread -(@code{gnus-summary-rethread-current}). This works even when the -summary buffer is otherwise unthreaded. - -@item T ^ -@kindex T ^ (Summary) -@findex gnus-summary-reparent-thread -Make the current article the child of the marked (or previous) article -(@code{gnus-summary-reparent-thread}). - -@end table - -The following commands are thread movement commands. They all -understand the numeric prefix. - -@table @kbd - -@item T n -@kindex T n (Summary) -@itemx M-C-n -@kindex M-C-n (Summary) -@itemx M-down -@kindex M-down (Summary) -@findex gnus-summary-next-thread -Go to the next thread (@code{gnus-summary-next-thread}). - -@item T p -@kindex T p (Summary) -@itemx M-C-p -@kindex M-C-p (Summary) -@itemx M-up -@kindex M-up (Summary) -@findex gnus-summary-prev-thread -Go to the previous thread (@code{gnus-summary-prev-thread}). - -@item T d -@kindex T d (Summary) -@findex gnus-summary-down-thread -Descend the thread (@code{gnus-summary-down-thread}). - -@item T u -@kindex T u (Summary) -@findex gnus-summary-up-thread -Ascend the thread (@code{gnus-summary-up-thread}). - -@item T o -@kindex T o (Summary) -@findex gnus-summary-top-thread -Go to the top of the thread (@code{gnus-summary-top-thread}). -@end table - -@vindex gnus-thread-operation-ignore-subject -If you ignore subject while threading, you'll naturally end up with -threads that have several different subjects in them. If you then issue -a command like `T k' (@code{gnus-summary-kill-thread}) you might not -wish to kill the entire thread, but just those parts of the thread that -have the same subject as the current article. If you like this idea, -you can fiddle with @code{gnus-thread-operation-ignore-subject}. If it -is non-@code{nil} (which it is by default), subjects will be ignored -when doing thread commands. If this variable is @code{nil}, articles in -the same thread with different subjects will not be included in the -operation in question. If this variable is @code{fuzzy}, only articles -that have subjects fuzzily equal will be included (@pxref{Fuzzy -Matching}). - - -@node Sorting the Summary Buffer -@section Sorting the Summary Buffer - -@findex gnus-thread-sort-by-total-score -@findex gnus-thread-sort-by-date -@findex gnus-thread-sort-by-score -@findex gnus-thread-sort-by-subject -@findex gnus-thread-sort-by-author -@findex gnus-thread-sort-by-number -@vindex gnus-thread-sort-functions -If you are using a threaded summary display, you can sort the threads by -setting @code{gnus-thread-sort-functions}, which can be either a single -function, a list of functions, or a list containing functions and -@code{(not some-function)} elements. - -By default, sorting is done on article numbers. Ready-made sorting -predicate functions include @code{gnus-thread-sort-by-number}, -@code{gnus-thread-sort-by-author}, @code{gnus-thread-sort-by-subject}, -@code{gnus-thread-sort-by-date}, @code{gnus-thread-sort-by-score}, and -@code{gnus-thread-sort-by-total-score}. - -Each function takes two threads and returns non-@code{nil} if the first -thread should be sorted before the other. Note that sorting really is -normally done by looking only at the roots of each thread. - -If you use more than one function, the primary sort key should be the -last function in the list. You should probably always include -@code{gnus-thread-sort-by-number} in the list of sorting -functions---preferably first. This will ensure that threads that are -equal with respect to the other sort criteria will be displayed in -ascending article order. - -If you would like to sort by reverse score, then by subject, and finally -by number, you could do something like: - -@lisp -(setq gnus-thread-sort-functions - '(gnus-thread-sort-by-number - gnus-thread-sort-by-subject - (not gnus-thread-sort-by-total-score))) -@end lisp - -The threads that have highest score will be displayed first in the -summary buffer. When threads have the same score, they will be sorted -alphabetically. The threads that have the same score and the same -subject will be sorted by number, which is (normally) the sequence in -which the articles arrived. - -If you want to sort by score and then reverse arrival order, you could -say something like: - -@lisp -(setq gnus-thread-sort-functions - '((lambda (t1 t2) - (not (gnus-thread-sort-by-number t1 t2))) - gnus-thread-sort-by-score)) -@end lisp - -@vindex gnus-thread-score-function -The function in the @code{gnus-thread-score-function} variable (default -@code{+}) is used for calculating the total score of a thread. Useful -functions might be @code{max}, @code{min}, or squared means, or whatever -tickles your fancy. - -@findex gnus-article-sort-functions -@findex gnus-article-sort-by-date -@findex gnus-article-sort-by-score -@findex gnus-article-sort-by-subject -@findex gnus-article-sort-by-author -@findex gnus-article-sort-by-number -If you are using an unthreaded display for some strange reason or other, -you have to fiddle with the @code{gnus-article-sort-functions} variable. -It is very similar to the @code{gnus-thread-sort-functions}, except that -it uses slightly different functions for article comparison. Available -sorting predicate functions are @code{gnus-article-sort-by-number}, -@code{gnus-article-sort-by-author}, @code{gnus-article-sort-by-subject}, -@code{gnus-article-sort-by-date}, and @code{gnus-article-sort-by-score}. - -If you want to sort an unthreaded summary display by subject, you could -say something like: - -@lisp -(setq gnus-article-sort-functions - '(gnus-article-sort-by-number - gnus-article-sort-by-subject)) -@end lisp - - - -@node Asynchronous Fetching -@section Asynchronous Article Fetching -@cindex asynchronous article fetching -@cindex article pre-fetch -@cindex pre-fetch - -If you read your news from an @sc{nntp} server that's far away, the -network latencies may make reading articles a chore. You have to wait -for a while after pressing @kbd{n} to go to the next article before the -article appears. Why can't gnus just go ahead and fetch the article -while you are reading the previous one? Why not, indeed. - -First, some caveats. There are some pitfalls to using asynchronous -article fetching, especially the way gnus does it. - -Let's say you are reading article 1, which is short, and article 2 is -quite long, and you are not interested in reading that. Gnus does not -know this, so it goes ahead and fetches article 2. You decide to read -article 3, but since gnus is in the process of fetching article 2, the -connection is blocked. - -To avoid these situations, gnus will open two (count 'em two) -connections to the server. Some people may think this isn't a very nice -thing to do, but I don't see any real alternatives. Setting up that -extra connection takes some time, so gnus startup will be slower. - -Gnus will fetch more articles than you will read. This will mean that -the link between your machine and the @sc{nntp} server will become more -loaded than if you didn't use article pre-fetch. The server itself will -also become more loaded---both with the extra article requests, and the -extra connection. - -Ok, so now you know that you shouldn't really use this thing... unless -you really want to. - -@vindex gnus-asynchronous -Here's how: Set @code{gnus-asynchronous} to @code{t}. The rest should -happen automatically. - -@vindex gnus-use-article-prefetch -You can control how many articles are to be pre-fetched by setting -@code{gnus-use-article-prefetch}. This is 30 by default, which means -that when you read an article in the group, the backend will pre-fetch -the next 30 articles. If this variable is @code{t}, the backend will -pre-fetch all the articles it can without bound. If it is -@code{nil}, no pre-fetching will be done. - -@vindex gnus-async-prefetch-article-p -@findex gnus-async-read-p -There are probably some articles that you don't want to pre-fetch---read -articles, for instance. The @code{gnus-async-prefetch-article-p} variable controls whether an article is to be pre-fetched. This function should -return non-@code{nil} when the article in question is to be -pre-fetched. The default is @code{gnus-async-read-p}, which returns -@code{nil} on read articles. The function is called with an article -data structure as the only parameter. - -If, for instance, you wish to pre-fetch only unread articles shorter than 100 lines, you could say something like: - -@lisp -(defun my-async-short-unread-p (data) - "Return non-nil for short, unread articles." - (and (gnus-data-unread-p data) - (< (mail-header-lines (gnus-data-header data)) - 100))) - -(setq gnus-async-prefetch-article-p 'my-async-short-unread-p) -@end lisp - -These functions will be called many, many times, so they should -preferably be short and sweet to avoid slowing down gnus too much. -It's probably a good idea to byte-compile things like this. - -@vindex gnus-prefetched-article-deletion-strategy -Articles have to be removed from the asynch buffer sooner or later. The -@code{gnus-prefetched-article-deletion-strategy} says when to remove -articles. This is a list that may contain the following elements: - -@table @code -@item read -Remove articles when they are read. - -@item exit -Remove articles when exiting the group. -@end table - -The default value is @code{(read exit)}. - -@c @vindex gnus-use-header-prefetch -@c If @code{gnus-use-header-prefetch} is non-@code{nil}, prefetch articles -@c from the next group. - - -@node Article Caching -@section Article Caching -@cindex article caching -@cindex caching - -If you have an @emph{extremely} slow @sc{nntp} connection, you may -consider turning article caching on. Each article will then be stored -locally under your home directory. As you may surmise, this could -potentially use @emph{huge} amounts of disk space, as well as eat up all -your inodes so fast it will make your head swim. In vodka. - -Used carefully, though, it could be just an easier way to save articles. - -@vindex gnus-use-long-file-name -@vindex gnus-cache-directory -@vindex gnus-use-cache -To turn caching on, set @code{gnus-use-cache} to @code{t}. By default, -all articles ticked or marked as dormant will then be copied -over to your local cache (@code{gnus-cache-directory}). Whether this -cache is flat or hierarchical is controlled by the -@code{gnus-use-long-file-name} variable, as usual. - -When re-selecting a ticked or dormant article, it will be fetched from the -cache instead of from the server. As articles in your cache will never -expire, this might serve as a method of saving articles while still -keeping them where they belong. Just mark all articles you want to save -as dormant, and don't worry. - -When an article is marked as read, is it removed from the cache. - -@vindex gnus-cache-remove-articles -@vindex gnus-cache-enter-articles -The entering/removal of articles from the cache is controlled by the -@code{gnus-cache-enter-articles} and @code{gnus-cache-remove-articles} -variables. Both are lists of symbols. The first is @code{(ticked -dormant)} by default, meaning that ticked and dormant articles will be -put in the cache. The latter is @code{(read)} by default, meaning that -articles marked as read are removed from the cache. Possibly -symbols in these two lists are @code{ticked}, @code{dormant}, -@code{unread} and @code{read}. - -@findex gnus-jog-cache -So where does the massive article-fetching and storing come into the -picture? The @code{gnus-jog-cache} command will go through all -subscribed newsgroups, request all unread articles, score them, and -store them in the cache. You should only ever, ever ever ever, use this -command if 1) your connection to the @sc{nntp} server is really, really, -really slow and 2) you have a really, really, really huge disk. -Seriously. One way to cut down on the number of articles downloaded is -to score unwanted articles down and have them marked as read. They will -not then be downloaded by this command. - -@vindex gnus-uncacheable-groups -@vindex gnus-cacheable-groups -It is likely that you do not want caching on all groups. For instance, -if your @code{nnml} mail is located under your home directory, it makes no -sense to cache it somewhere else under your home directory. Unless you -feel that it's neat to use twice as much space. - -To limit the caching, you could set @code{gnus-cacheable-groups} to a -regexp of groups to cache, @samp{^nntp} for instance, or set the -@code{gnus-uncacheable-groups} regexp to @samp{^nnml}, for instance. -Both variables are @code{nil} by default. If a group matches both -variables, the group is not cached. - -@findex gnus-cache-generate-nov-databases -@findex gnus-cache-generate-active -@vindex gnus-cache-active-file -The cache stores information on what articles it contains in its active -file (@code{gnus-cache-active-file}). If this file (or any other parts -of the cache) becomes all messed up for some reason or other, gnus -offers two functions that will try to set things right. @kbd{M-x -gnus-cache-generate-nov-databases} will (re)build all the @sc{nov} -files, and @kbd{gnus-cache-generate-active} will (re)generate the active -file. - - -@node Persistent Articles -@section Persistent Articles -@cindex persistent articles - -Closely related to article caching, we have @dfn{persistent articles}. -In fact, it's just a different way of looking at caching, and much more -useful in my opinion. - -Say you're reading a newsgroup, and you happen on to some valuable gem -that you want to keep and treasure forever. You'd normally just save it -(using one of the many saving commands) in some file. The problem with -that is that it's just, well, yucky. Ideally you'd prefer just having -the article remain in the group where you found it forever; untouched by -the expiry going on at the news server. - -This is what a @dfn{persistent article} is---an article that just won't -be deleted. It's implemented using the normal cache functions, but -you use two explicit commands for managing persistent articles: - -@table @kbd - -@item * -@kindex * (Summary) -@findex gnus-cache-enter-article -Make the current article persistent (@code{gnus-cache-enter-article}). - -@item M-* -@kindex M-* (Summary) -@findex gnus-cache-remove-article -Remove the current article from the persistent articles -(@code{gnus-cache-remove-article}). This will normally delete the -article. -@end table - -Both these commands understand the process/prefix convention. - -To avoid having all ticked articles (and stuff) entered into the cache, -you should set @code{gnus-use-cache} to @code{passive} if you're just -interested in persistent articles: - -@lisp -(setq gnus-use-cache 'passive) -@end lisp - - -@node Article Backlog -@section Article Backlog -@cindex backlog -@cindex article backlog - -If you have a slow connection, but the idea of using caching seems -unappealing to you (and it is, really), you can help the situation some -by switching on the @dfn{backlog}. This is where gnus will buffer -already read articles so that it doesn't have to re-fetch articles -you've already read. This only helps if you are in the habit of -re-selecting articles you've recently read, of course. If you never do -that, turning the backlog on will slow gnus down a little bit, and -increase memory usage some. - -@vindex gnus-keep-backlog -If you set @code{gnus-keep-backlog} to a number @var{n}, gnus will store -at most @var{n} old articles in a buffer for later re-fetching. If this -variable is non-@code{nil} and is not a number, gnus will store -@emph{all} read articles, which means that your Emacs will grow without -bound before exploding and taking your machine down with you. I put -that in there just to keep y'all on your toes. - -This variable is @code{nil} by default. - - -@node Saving Articles -@section Saving Articles -@cindex saving articles - -Gnus can save articles in a number of ways. Below is the documentation -for saving articles in a fairly straight-forward fashion (i.e., little -processing of the article is done before it is saved). For a different -approach (uudecoding, unsharing) you should use @code{gnus-uu} -(@pxref{Decoding Articles}). - -@vindex gnus-save-all-headers -If @code{gnus-save-all-headers} is non-@code{nil}, gnus will not delete -unwanted headers before saving the article. - -@vindex gnus-saved-headers -If the preceding variable is @code{nil}, all headers that match the -@code{gnus-saved-headers} regexp will be kept, while the rest will be -deleted before saving. - -@table @kbd - -@item O o -@itemx o -@kindex O o (Summary) -@kindex o (Summary) -@findex gnus-summary-save-article -@c @icon{gnus-summary-save-article} -Save the current article using the default article saver -(@code{gnus-summary-save-article}). - -@item O m -@kindex O m (Summary) -@findex gnus-summary-save-article-mail -Save the current article in mail format -(@code{gnus-summary-save-article-mail}). - -@item O r -@kindex O r (Summary) -@findex gnus-summary-save-article-rmail -Save the current article in rmail format -(@code{gnus-summary-save-article-rmail}). - -@item O f -@kindex O f (Summary) -@findex gnus-summary-save-article-file -@c @icon{gnus-summary-save-article-file} -Save the current article in plain file format -(@code{gnus-summary-save-article-file}). - -@item O F -@kindex O F (Summary) -@findex gnus-summary-write-article-file -Write the current article in plain file format, overwriting any previous -file contents (@code{gnus-summary-write-article-file}). - -@item O b -@kindex O b (Summary) -@findex gnus-summary-save-article-body-file -Save the current article body in plain file format -(@code{gnus-summary-save-article-body-file}). - -@item O h -@kindex O h (Summary) -@findex gnus-summary-save-article-folder -Save the current article in mh folder format -(@code{gnus-summary-save-article-folder}). - -@item O v -@kindex O v (Summary) -@findex gnus-summary-save-article-vm -Save the current article in a VM folder -(@code{gnus-summary-save-article-vm}). - -@item O p -@itemx | -@kindex O p (Summary) -@kindex | (Summary) -@findex gnus-summary-pipe-output -Save the current article in a pipe. Uhm, like, what I mean is---Pipe -the current article to a process (@code{gnus-summary-pipe-output}). -@end table - -@vindex gnus-prompt-before-saving -All these commands use the process/prefix convention -(@pxref{Process/Prefix}). If you save bunches of articles using these -functions, you might get tired of being prompted for files to save each -and every article in. The prompting action is controlled by -the @code{gnus-prompt-before-saving} variable, which is @code{always} by -default, giving you that excessive prompting action you know and -loathe. If you set this variable to @code{t} instead, you'll be prompted -just once for each series of articles you save. If you like to really -have Gnus do all your thinking for you, you can even set this variable -to @code{nil}, which means that you will never be prompted for files to -save articles in. Gnus will simply save all the articles in the default -files. - - -@vindex gnus-default-article-saver -You can customize the @code{gnus-default-article-saver} variable to make -gnus do what you want it to. You can use any of the six ready-made -functions below, or you can create your own. - -@table @code - -@item gnus-summary-save-in-rmail -@findex gnus-summary-save-in-rmail -@vindex gnus-rmail-save-name -@findex gnus-plain-save-name -This is the default format, @dfn{babyl}. Uses the function in the -@code{gnus-rmail-save-name} variable to get a file name to save the -article in. The default is @code{gnus-plain-save-name}. - -@item gnus-summary-save-in-mail -@findex gnus-summary-save-in-mail -@vindex gnus-mail-save-name -Save in a Unix mail (mbox) file. Uses the function in the -@code{gnus-mail-save-name} variable to get a file name to save the -article in. The default is @code{gnus-plain-save-name}. - -@item gnus-summary-save-in-file -@findex gnus-summary-save-in-file -@vindex gnus-file-save-name -@findex gnus-numeric-save-name -Append the article straight to an ordinary file. Uses the function in -the @code{gnus-file-save-name} variable to get a file name to save the -article in. The default is @code{gnus-numeric-save-name}. - -@item gnus-summary-save-body-in-file -@findex gnus-summary-save-body-in-file -Append the article body to an ordinary file. Uses the function in the -@code{gnus-file-save-name} variable to get a file name to save the -article in. The default is @code{gnus-numeric-save-name}. - -@item gnus-summary-save-in-folder -@findex gnus-summary-save-in-folder -@findex gnus-folder-save-name -@findex gnus-Folder-save-name -@vindex gnus-folder-save-name -@cindex rcvstore -@cindex MH folders -Save the article to an MH folder using @code{rcvstore} from the MH -library. Uses the function in the @code{gnus-folder-save-name} variable -to get a file name to save the article in. The default is -@code{gnus-folder-save-name}, but you can also use -@code{gnus-Folder-save-name}, which creates capitalized names. - -@item gnus-summary-save-in-vm -@findex gnus-summary-save-in-vm -Save the article in a VM folder. You have to have the VM mail -reader to use this setting. -@end table - -@vindex gnus-article-save-directory -All of these functions, except for the last one, will save the article -in the @code{gnus-article-save-directory}, which is initialized from the -@code{SAVEDIR} environment variable. This is @file{~/News/} by -default. - -As you can see above, the functions use different functions to find a -suitable name of a file to save the article in. Below is a list of -available functions that generate names: - -@table @code - -@item gnus-Numeric-save-name -@findex gnus-Numeric-save-name -File names like @file{~/News/Alt.andrea-dworkin/45}. - -@item gnus-numeric-save-name -@findex gnus-numeric-save-name -File names like @file{~/News/alt.andrea-dworkin/45}. - -@item gnus-Plain-save-name -@findex gnus-Plain-save-name -File names like @file{~/News/Alt.andrea-dworkin}. - -@item gnus-plain-save-name -@findex gnus-plain-save-name -File names like @file{~/News/alt.andrea-dworkin}. - -@item gnus-sender-save-name -@findex gnus-sender-save-name -File names like @file{~/News/larsi}. -@end table - -@vindex gnus-split-methods -You can have gnus suggest where to save articles by plonking a regexp into -the @code{gnus-split-methods} alist. For instance, if you would like to -save articles related to gnus in the file @file{gnus-stuff}, and articles -related to VM in @code{vm-stuff}, you could set this variable to something -like: - -@lisp -(("^Subject:.*gnus\\|^Newsgroups:.*gnus" "gnus-stuff") - ("^Subject:.*vm\\|^Xref:.*vm" "vm-stuff") - (my-choosing-function "../other-dir/my-stuff") - ((equal gnus-newsgroup-name "mail.misc") "mail-stuff")) -@end lisp - -We see that this is a list where each element is a list that has two -elements---the @dfn{match} and the @dfn{file}. The match can either be -a string (in which case it is used as a regexp to match on the article -head); it can be a symbol (which will be called as a function with the -group name as a parameter); or it can be a list (which will be -@code{eval}ed). If any of these actions have a non-@code{nil} result, -the @dfn{file} will be used as a default prompt. In addition, the -result of the operation itself will be used if the function or form -called returns a string or a list of strings. - -You basically end up with a list of file names that might be used when -saving the current article. (All ``matches'' will be used.) You will -then be prompted for what you really want to use as a name, with file -name completion over the results from applying this variable. - -This variable is @code{((gnus-article-archive-name))} by default, which -means that gnus will look at the articles it saves for an -@code{Archive-name} line and use that as a suggestion for the file -name. - -Here's an example function to clean up file names somewhat. If you have -lots of mail groups called things like -@samp{nnml:mail.whatever}, you may want to chop off the beginning of -these group names before creating the file name to save to. The -following will do just that: - -@lisp -(defun my-save-name (group) - (when (string-match "^nnml:mail." group) - (substring group (match-end 0)))) - -(setq gnus-split-methods - '((gnus-article-archive-name) - (my-save-name))) -@end lisp - - -@vindex gnus-use-long-file-name -Finally, you have the @code{gnus-use-long-file-name} variable. If it is -@code{nil}, all the preceding functions will replace all periods -(@samp{.}) in the group names with slashes (@samp{/})---which means that -the functions will generate hierarchies of directories instead of having -all the files in the top level directory -(@file{~/News/alt/andrea-dworkin} instead of -@file{~/News/alt.andrea-dworkin}.) This variable is @code{t} by default -on most systems. However, for historical reasons, this is @code{nil} on -Xenix and usg-unix-v machines by default. - -This function also affects kill and score file names. If this variable -is a list, and the list contains the element @code{not-score}, long file -names will not be used for score files, if it contains the element -@code{not-save}, long file names will not be used for saving, and if it -contains the element @code{not-kill}, long file names will not be used -for kill files. - -If you'd like to save articles in a hierarchy that looks something like -a spool, you could - -@lisp -(setq gnus-use-long-file-name '(not-save)) ; to get a hierarchy -(setq gnus-default-article-saver - 'gnus-summary-save-in-file) ; no encoding -@end lisp - -Then just save with @kbd{o}. You'd then read this hierarchy with -ephemeral @code{nneething} groups---@kbd{G D} in the group buffer, and -the top level directory as the argument (@file{~/News/}). Then just walk -around to the groups/directories with @code{nneething}. - - -@node Decoding Articles -@section Decoding Articles -@cindex decoding articles - -Sometime users post articles (or series of articles) that have been -encoded in some way or other. Gnus can decode them for you. - -@menu -* 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? -@end menu - -@cindex series -@cindex article series -All these functions use the process/prefix convention -(@pxref{Process/Prefix}) for finding out what articles to work on, with -the extension that a ``single article'' means ``a single series''. Gnus -can find out by itself what articles belong to a series, decode all the -articles and unpack/view/save the resulting file(s). - -Gnus guesses what articles are in the series according to the following -simplish rule: The subjects must be (nearly) identical, except for the -last two numbers of the line. (Spaces are largely ignored, however.) - -For example: If you choose a subject called @samp{cat.gif (2/3)}, gnus -will find all the articles that match the regexp @samp{^cat.gif -([0-9]+/[0-9]+).*$}. - -Subjects that are non-standard, like @samp{cat.gif (2/3) Part 6 of a -series}, will not be properly recognized by any of the automatic viewing -commands, and you have to mark the articles manually with @kbd{#}. - - -@node Uuencoded Articles -@subsection Uuencoded Articles -@cindex uudecode -@cindex uuencoded articles - -@table @kbd - -@item X u -@kindex X u (Summary) -@findex gnus-uu-decode-uu -@c @icon{gnus-uu-decode-uu} -Uudecodes the current series (@code{gnus-uu-decode-uu}). - -@item X U -@kindex X U (Summary) -@findex gnus-uu-decode-uu-and-save -Uudecodes and saves the current series -(@code{gnus-uu-decode-uu-and-save}). - -@item X v u -@kindex X v u (Summary) -@findex gnus-uu-decode-uu-view -Uudecodes and views the current series (@code{gnus-uu-decode-uu-view}). - -@item X v U -@kindex X v U (Summary) -@findex gnus-uu-decode-uu-and-save-view -Uudecodes, views and saves the current series -(@code{gnus-uu-decode-uu-and-save-view}). - -@end table - -Remember that these all react to the presence of articles marked with -the process mark. If, for instance, you'd like to decode and save an -entire newsgroup, you'd typically do @kbd{M P a} -(@code{gnus-uu-mark-all}) and then @kbd{X U} -(@code{gnus-uu-decode-uu-and-save}). - -All this is very much different from how @code{gnus-uu} worked with -@sc{gnus 4.1}, where you had explicit keystrokes for everything under -the sun. This version of @code{gnus-uu} generally assumes that you mark -articles in some way (@pxref{Setting Process Marks}) and then press -@kbd{X u}. - -@vindex gnus-uu-notify-files -Note: When trying to decode articles that have names matching -@code{gnus-uu-notify-files}, which is hard-coded to -@samp{[Cc][Ii][Nn][Dd][Yy][0-9]+.\\(gif\\|jpg\\)}, @code{gnus-uu} will -automatically post an article on @samp{comp.unix.wizards} saying that -you have just viewed the file in question. This feature can't be turned -off. - - -@node Shell Archives -@subsection Shell Archives -@cindex unshar -@cindex shell archives -@cindex shared articles - -Shell archives (``shar files'') used to be a popular way to distribute -sources, but it isn't used all that much today. In any case, we have -some commands to deal with these: - -@table @kbd - -@item X s -@kindex X s (Summary) -@findex gnus-uu-decode-unshar -Unshars the current series (@code{gnus-uu-decode-unshar}). - -@item X S -@kindex X S (Summary) -@findex gnus-uu-decode-unshar-and-save -Unshars and saves the current series (@code{gnus-uu-decode-unshar-and-save}). - -@item X v s -@kindex X v s (Summary) -@findex gnus-uu-decode-unshar-view -Unshars and views the current series (@code{gnus-uu-decode-unshar-view}). - -@item X v S -@kindex X v S (Summary) -@findex gnus-uu-decode-unshar-and-save-view -Unshars, views and saves the current series -(@code{gnus-uu-decode-unshar-and-save-view}). -@end table - - -@node PostScript Files -@subsection PostScript Files -@cindex PostScript - -@table @kbd - -@item X p -@kindex X p (Summary) -@findex gnus-uu-decode-postscript -Unpack the current PostScript series (@code{gnus-uu-decode-postscript}). - -@item X P -@kindex X P (Summary) -@findex gnus-uu-decode-postscript-and-save -Unpack and save the current PostScript series -(@code{gnus-uu-decode-postscript-and-save}). - -@item X v p -@kindex X v p (Summary) -@findex gnus-uu-decode-postscript-view -View the current PostScript series -(@code{gnus-uu-decode-postscript-view}). - -@item X v P -@kindex X v P (Summary) -@findex gnus-uu-decode-postscript-and-save-view -View and save the current PostScript series -(@code{gnus-uu-decode-postscript-and-save-view}). -@end table - - -@node Other Files -@subsection Other Files - -@table @kbd -@item X o -@kindex X o (Summary) -@findex gnus-uu-decode-save -Save the current series -(@code{gnus-uu-decode-save}). - -@item X b -@kindex X b (Summary) -@findex gnus-uu-decode-binhex -Unbinhex the current series (@code{gnus-uu-decode-binhex}). This -doesn't really work yet. -@end table - - -@node Decoding Variables -@subsection Decoding Variables - -Adjective, not verb. - -@menu -* 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. -@end menu - - -@node Rule Variables -@subsubsection Rule Variables -@cindex rule variables - -Gnus uses @dfn{rule variables} to decide how to view a file. All these -variables are of the form - -@lisp - (list '(regexp1 command2) - '(regexp2 command2) - ...) -@end lisp - -@table @code - -@item gnus-uu-user-view-rules -@vindex gnus-uu-user-view-rules -@cindex sox -This variable is consulted first when viewing files. If you wish to use, -for instance, @code{sox} to convert an @samp{.au} sound file, you could -say something like: -@lisp -(setq gnus-uu-user-view-rules - (list '("\\\\.au$" "sox %s -t .aiff > /dev/audio"))) -@end lisp - -@item gnus-uu-user-view-rules-end -@vindex gnus-uu-user-view-rules-end -This variable is consulted if gnus couldn't make any matches from the -user and default view rules. - -@item gnus-uu-user-archive-rules -@vindex gnus-uu-user-archive-rules -This variable can be used to say what commands should be used to unpack -archives. -@end table - - -@node Other Decode Variables -@subsubsection Other Decode Variables - -@table @code -@vindex gnus-uu-grabbed-file-functions - -@item gnus-uu-grabbed-file-functions -All functions in this list will be called right after each file has been -successfully decoded---so that you can move or view files right away, -and don't have to wait for all files to be decoded before you can do -anything. Ready-made functions you can put in this list are: - -@table @code - -@item gnus-uu-grab-view -@findex gnus-uu-grab-view -View the file. - -@item gnus-uu-grab-move -@findex gnus-uu-grab-move -Move the file (if you're using a saving function.) -@end table - -@item gnus-uu-be-dangerous -@vindex gnus-uu-be-dangerous -Specifies what to do if unusual situations arise during decoding. If -@code{nil}, be as conservative as possible. If @code{t}, ignore things -that didn't work, and overwrite existing files. Otherwise, ask each -time. - -@item gnus-uu-ignore-files-by-name -@vindex gnus-uu-ignore-files-by-name -Files with name matching this regular expression won't be viewed. - -@item gnus-uu-ignore-files-by-type -@vindex gnus-uu-ignore-files-by-type -Files with a @sc{mime} type matching this variable won't be viewed. -Note that Gnus tries to guess what type the file is based on the name. -@code{gnus-uu} is not a @sc{mime} package (yet), so this is slightly -kludgey. - -@item gnus-uu-tmp-dir -@vindex gnus-uu-tmp-dir -Where @code{gnus-uu} does its work. - -@item gnus-uu-do-not-unpack-archives -@vindex gnus-uu-do-not-unpack-archives -Non-@code{nil} means that @code{gnus-uu} won't peek inside archives -looking for files to display. - -@item gnus-uu-view-and-save -@vindex gnus-uu-view-and-save -Non-@code{nil} means that the user will always be asked to save a file -after viewing it. - -@item gnus-uu-ignore-default-view-rules -@vindex gnus-uu-ignore-default-view-rules -Non-@code{nil} means that @code{gnus-uu} will ignore the default viewing -rules. - -@item gnus-uu-ignore-default-archive-rules -@vindex gnus-uu-ignore-default-archive-rules -Non-@code{nil} means that @code{gnus-uu} will ignore the default archive -unpacking commands. - -@item gnus-uu-kill-carriage-return -@vindex gnus-uu-kill-carriage-return -Non-@code{nil} means that @code{gnus-uu} will strip all carriage returns -from articles. - -@item gnus-uu-unmark-articles-not-decoded -@vindex gnus-uu-unmark-articles-not-decoded -Non-@code{nil} means that @code{gnus-uu} will mark unsuccessfully -decoded articles as unread. - -@item gnus-uu-correct-stripped-uucode -@vindex gnus-uu-correct-stripped-uucode -Non-@code{nil} means that @code{gnus-uu} will @emph{try} to fix -uuencoded files that have had trailing spaces deleted. - -@item gnus-uu-pre-uudecode-hook -@vindex gnus-uu-pre-uudecode-hook -Hook run before sending a message to @code{uudecode}. - -@item gnus-uu-view-with-metamail -@vindex gnus-uu-view-with-metamail -@cindex metamail -Non-@code{nil} means that @code{gnus-uu} will ignore the viewing -commands defined by the rule variables and just fudge a @sc{mime} -content type based on the file name. The result will be fed to -@code{metamail} for viewing. - -@item gnus-uu-save-in-digest -@vindex gnus-uu-save-in-digest -Non-@code{nil} means that @code{gnus-uu}, when asked to save without -decoding, will save in digests. If this variable is @code{nil}, -@code{gnus-uu} will just save everything in a file without any -embellishments. The digesting almost conforms to RFC 1153---no easy way -to specify any meaningful volume and issue numbers were found, so I -simply dropped them. - -@end table - - -@node Uuencoding and Posting -@subsubsection Uuencoding and Posting - -@table @code - -@item gnus-uu-post-include-before-composing -@vindex gnus-uu-post-include-before-composing -Non-@code{nil} means that @code{gnus-uu} will ask for a file to encode -before you compose the article. If this variable is @code{t}, you can -either include an encoded file with @kbd{C-c C-i} or have one included -for you when you post the article. - -@item gnus-uu-post-length -@vindex gnus-uu-post-length -Maximum length of an article. The encoded file will be split into how -many articles it takes to post the entire file. - -@item gnus-uu-post-threaded -@vindex gnus-uu-post-threaded -Non-@code{nil} means that @code{gnus-uu} will post the encoded file in a -thread. This may not be smart, as no other decoder I have seen is able -to follow threads when collecting uuencoded articles. (Well, I have -seen one package that does that---@code{gnus-uu}, but somehow, I don't -think that counts...) Default is @code{nil}. - -@item gnus-uu-post-separate-description -@vindex gnus-uu-post-separate-description -Non-@code{nil} means that the description will be posted in a separate -article. The first article will typically be numbered (0/x). If this -variable is @code{nil}, the description the user enters will be included -at the beginning of the first article, which will be numbered (1/x). -Default is @code{t}. - -@end table - - -@node Viewing Files -@subsection Viewing Files -@cindex viewing files -@cindex pseudo-articles - -After decoding, if the file is some sort of archive, gnus will attempt -to unpack the archive and see if any of the files in the archive can be -viewed. For instance, if you have a gzipped tar file @file{pics.tar.gz} -containing the files @file{pic1.jpg} and @file{pic2.gif}, gnus will -uncompress and de-tar the main file, and then view the two pictures. -This unpacking process is recursive, so if the archive contains archives -of archives, it'll all be unpacked. - -Finally, gnus will normally insert a @dfn{pseudo-article} for each -extracted file into the summary buffer. If you go to these -``articles'', you will be prompted for a command to run (usually Gnus -will make a suggestion), and then the command will be run. - -@vindex gnus-view-pseudo-asynchronously -If @code{gnus-view-pseudo-asynchronously} is @code{nil}, Emacs will wait -until the viewing is done before proceeding. - -@vindex gnus-view-pseudos -If @code{gnus-view-pseudos} is @code{automatic}, Gnus will not insert -the pseudo-articles into the summary buffer, but view them -immediately. If this variable is @code{not-confirm}, the user won't even -be asked for a confirmation before viewing is done. - -@vindex gnus-view-pseudos-separately -If @code{gnus-view-pseudos-separately} is non-@code{nil}, one -pseudo-article will be created for each file to be viewed. If -@code{nil}, all files that use the same viewing command will be given as -a list of parameters to that command. - -@vindex gnus-insert-pseudo-articles -If @code{gnus-insert-pseudo-articles} is non-@code{nil}, insert -pseudo-articles when decoding. It is @code{t} by default. - -So; there you are, reading your @emph{pseudo-articles} in your -@emph{virtual newsgroup} from the @emph{virtual server}; and you think: -Why isn't anything real anymore? How did we get here? - - -@node Article Treatment -@section Article Treatment - -Reading through this huge manual, you may have quite forgotten that the -object of newsreaders is to actually, like, read what people have -written. Reading articles. Unfortunately, people are quite bad at -writing, so there are tons of functions and variables to make reading -these articles easier. - -@menu -* 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. -@end menu - - -@node Article Highlighting -@subsection Article Highlighting -@cindex highlighting - -Not only do you want your article buffer to look like fruit salad, but -you want it to look like technicolor fruit salad. - -@table @kbd - -@item W H a -@kindex W H a (Summary) -@findex gnus-article-highlight -@findex gnus-article-maybe-highlight -Do much highlighting of the current article -(@code{gnus-article-highlight}). This function highlights header, cited -text, the signature, and adds buttons to the body and the head. - -@item W H h -@kindex W H h (Summary) -@findex gnus-article-highlight-headers -@vindex gnus-header-face-alist -Highlight the headers (@code{gnus-article-highlight-headers}). The -highlighting will be done according to the @code{gnus-header-face-alist} -variable, which is a list where each element has the form -@code{(@var{regexp} @var{name} @var{content})}. -@var{regexp} is a regular expression for matching the -header, @var{name} is the face used for highlighting the header name -(@pxref{Faces and Fonts}) and @var{content} is the face for highlighting -the header value. The first match made will be used. Note that -@var{regexp} shouldn't have @samp{^} prepended---Gnus will add one. - -@item W H c -@kindex W H c (Summary) -@findex gnus-article-highlight-citation -Highlight cited text (@code{gnus-article-highlight-citation}). - -Some variables to customize the citation highlights: - -@table @code -@vindex gnus-cite-parse-max-size - -@item gnus-cite-parse-max-size -If the article size if bigger than this variable (which is 25000 by -default), no citation highlighting will be performed. - -@item gnus-cite-max-prefix -@vindex gnus-cite-max-prefix -Maximum possible length for a citation prefix (default 20). - -@item gnus-cite-face-list -@vindex gnus-cite-face-list -List of faces used for highlighting citations (@pxref{Faces and Fonts}). -When there are citations from multiple articles in the same message, -gnus will try to give each citation from each article its own face. -This should make it easier to see who wrote what. - -@item gnus-supercite-regexp -@vindex gnus-supercite-regexp -Regexp matching normal Supercite attribution lines. - -@item gnus-supercite-secondary-regexp -@vindex gnus-supercite-secondary-regexp -Regexp matching mangled Supercite attribution lines. - -@item gnus-cite-minimum-match-count -@vindex gnus-cite-minimum-match-count -Minimum number of identical prefixes we have to see before we believe -that it's a citation. - -@item gnus-cite-attribution-prefix -@vindex gnus-cite-attribution-prefix -Regexp matching the beginning of an attribution line. - -@item gnus-cite-attribution-suffix -@vindex gnus-cite-attribution-suffix -Regexp matching the end of an attribution line. - -@item gnus-cite-attribution-face -@vindex gnus-cite-attribution-face -Face used for attribution lines. It is merged with the face for the -cited text belonging to the attribution. - -@end table - - -@item W H s -@kindex W H s (Summary) -@vindex gnus-signature-separator -@vindex gnus-signature-face -@findex gnus-article-highlight-signature -Highlight the signature (@code{gnus-article-highlight-signature}). -Everything after @code{gnus-signature-separator} (@pxref{Article -Signature}) in an article will be considered a signature and will be -highlighted with @code{gnus-signature-face}, which is @code{italic} by -default. - -@end table - -@xref{Customizing Articles}, for how to highlight articles automatically. - - -@node Article Fontisizing -@subsection Article Fontisizing -@cindex emphasis -@cindex article emphasis - -@findex gnus-article-emphasize -@kindex W e (Summary) -People commonly add emphasis to words in news articles by writing things -like @samp{_this_} or @samp{*this*} or @samp{/this/}. Gnus can make -this look nicer by running the article through the @kbd{W e} -(@code{gnus-article-emphasize}) command. - -@vindex gnus-emphasis-alist -How the emphasis is computed is controlled by the -@code{gnus-emphasis-alist} variable. This is an alist where the first -element is a regular expression to be matched. The second is a number -that says what regular expression grouping is used to find the entire -emphasized word. The third is a number that says what regexp grouping -should be displayed and highlighted. (The text between these two -groupings will be hidden.) The fourth is the face used for -highlighting. - -@lisp -(setq gnus-emphasis-alist - '(("_\\(\\w+\\)_" 0 1 gnus-emphasis-underline) - ("\\*\\(\\w+\\)\\*" 0 1 gnus-emphasis-bold))) -@end lisp - -@cindex slash -@cindex asterisk -@cindex underline -@cindex / -@cindex * - -@vindex gnus-emphasis-underline -@vindex gnus-emphasis-bold -@vindex gnus-emphasis-italic -@vindex gnus-emphasis-underline-bold -@vindex gnus-emphasis-underline-italic -@vindex gnus-emphasis-bold-italic -@vindex gnus-emphasis-underline-bold-italic -By default, there are seven rules, and they use the following faces: -@code{gnus-emphasis-bold}, @code{gnus-emphasis-italic}, -@code{gnus-emphasis-underline}, @code{gnus-emphasis-bold-italic}, -@code{gnus-emphasis-underline-italic}, -@code{gnus-emphasis-underline-bold}, and -@code{gnus-emphasis-underline-bold-italic}. - -If you want to change these faces, you can either use @kbd{M-x -customize}, or you can use @code{copy-face}. For instance, if you want -to make @code{gnus-emphasis-italic} use a red face instead, you could -say something like: - -@lisp -(copy-face 'red 'gnus-emphasis-italic) -@end lisp - -@vindex gnus-group-highlight-words-alist - -If you want to highlight arbitrary words, you can use the -@code{gnus-group-highlight-words-alist} variable, which uses the same -syntax as @code{gnus-emphasis-alist}. The @code{highlight-words} group -parameter (@pxref{Group Parameters}) can also be used. - -@xref{Customizing Articles}, for how to fontize articles automatically. - - -@node Article Hiding -@subsection Article Hiding -@cindex article hiding - -Or rather, hiding certain things in each article. There usually is much -too much cruft in most articles. - -@table @kbd - -@item W W a -@kindex W W a (Summary) -@findex gnus-article-hide -Do quite a lot of hiding on the article buffer -(@kbd{gnus-article-hide}). In particular, this function will hide -headers, PGP, cited text and the signature. - -@item W W h -@kindex W W h (Summary) -@findex gnus-article-toggle-headers -Toggle hiding of headers (@code{gnus-article-toggle-headers}). @xref{Hiding -Headers}. - -@item W W b -@kindex W W b (Summary) -@findex gnus-article-hide-boring-headers -Hide headers that aren't particularly interesting -(@code{gnus-article-hide-boring-headers}). @xref{Hiding Headers}. - -@item W W s -@kindex W W s (Summary) -@findex gnus-article-hide-signature -Hide signature (@code{gnus-article-hide-signature}). @xref{Article -Signature}. - -@item W W l -@kindex W W l (Summary) -@findex gnus-article-hide-list-identifiers -@vindex gnus-list-identifiers -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. @code{gnus-list-identifiers} -may not contain @code{\\(..\\)}. - -@table @code - -@item gnus-list-identifiers -@vindex gnus-list-identifiers -A regular expression that matches list identifiers to be removed from -subject. This can also be a list of regular expressions. - -@end table - -@item W W p -@kindex W W p (Summary) -@findex gnus-article-hide-pgp -@vindex gnus-article-hide-pgp-hook -Hide @sc{pgp} signatures (@code{gnus-article-hide-pgp}). The -@code{gnus-article-hide-pgp-hook} hook will be run after a @sc{pgp} -signature has been hidden. For example, to automatically verify -articles that have signatures in them do: -@lisp -;;; Hide pgp cruft if any. - -(setq gnus-treat-strip-pgp t) - -;;; After hiding pgp, verify the message; -;;; only happens if pgp signature is found. - -(add-hook 'gnus-article-hide-pgp-hook - (lambda () - (save-excursion - (set-buffer gnus-original-article-buffer) - (mc-verify)))) -@end lisp - -@item W W P -@kindex W W P (Summary) -@findex gnus-article-hide-pem -Hide @sc{pem} (privacy enhanced messages) cruft -(@code{gnus-article-hide-pem}). - -@item W W B -@kindex W W B (Summary) -@findex gnus-article-strip-banner -@cindex banner -@cindex OneList -@cindex stripping advertisements -@cindex advertisements -Strip the banner specified by the @code{banner} group parameter -(@code{gnus-article-strip-banner}). This is mainly used to hide those -annoying banners and/or signatures that some mailing lists and moderated -groups adds to all the messages. The way to use this function is to add -the @code{banner} group parameter (@pxref{Group Parameters}) to the -group you want banners stripped from. The parameter either be a string, -which will be interpreted as a regular expression matching text to be -removed, or the symbol @code{signature}, meaning that the (last) -signature should be removed, or other symbol, meaning that the -corresponding regular expression in @code{gnus-article-banner-alist} is -used. - -@item W W c -@kindex W W c (Summary) -@findex gnus-article-hide-citation -Hide citation (@code{gnus-article-hide-citation}). Some variables for -customizing the hiding: - -@table @code - -@item gnus-cited-opened-text-button-line-format -@itemx gnus-cited-closed-text-button-line-format -@vindex gnus-cited-closed-text-button-line-format -@vindex gnus-cited-opened-text-button-line-format -Gnus adds buttons to show where the cited text has been hidden, and to -allow toggle hiding the text. The format of the variable is specified -by these format-like variable (@pxref{Formatting Variables}). These -specs are valid: - -@table @samp -@item b -Starting point of the hidden text. -@item e -Ending point of the hidden text. -@item l -Number of characters in the hidden region. -@item n -Number of lines of hidden text. -@end table - -@item gnus-cited-lines-visible -@vindex gnus-cited-lines-visible -The number of lines at the beginning of the cited text to leave -shown. This can also be a cons cell with the number of lines at the top -and bottom of the text, respectively, to remain visible. - -@end table - -@item W W C-c -@kindex W W C-c (Summary) -@findex gnus-article-hide-citation-maybe - -Hide citation (@code{gnus-article-hide-citation-maybe}) depending on the -following two variables: - -@table @code -@item gnus-cite-hide-percentage -@vindex gnus-cite-hide-percentage -If the cited text is of a bigger percentage than this variable (default -50), hide the cited text. - -@item gnus-cite-hide-absolute -@vindex gnus-cite-hide-absolute -The cited text must have at least this length (default 10) before it -is hidden. -@end table - -@item W W C -@kindex W W C (Summary) -@findex gnus-article-hide-citation-in-followups -Hide cited text in articles that aren't roots -(@code{gnus-article-hide-citation-in-followups}). This isn't very -useful as an interactive command, but might be a handy function to stick -have happen automatically (@pxref{Customizing Articles}). - -@end table - -All these ``hiding'' commands are toggles, but if you give a negative -prefix to these commands, they will show what they have previously -hidden. If you give a positive prefix, they will always hide. - -Also @pxref{Article Highlighting} for further variables for -citation customization. - -@xref{Customizing Articles}, for how to hide article elements -automatically. - - -@node Article Washing -@subsection Article Washing -@cindex washing -@cindex article washing - -We call this ``article washing'' for a really good reason. Namely, the -@kbd{A} key was taken, so we had to use the @kbd{W} key instead. - -@dfn{Washing} is defined by us as ``changing something from something to -something else'', but normally results in something looking better. -Cleaner, perhaps. - -@xref{Customizing Articles}, if you want to change how Gnus displays -articles by default. - -@table @kbd - -@item C-u g -This is not really washing, it's sort of the opposite of washing. If -you type this, you see the article exactly as it exists on disk or on -the server. - -@item W l -@kindex W l (Summary) -@findex gnus-summary-stop-page-breaking -Remove page breaks from the current article -(@code{gnus-summary-stop-page-breaking}). @xref{Misc Article}, for page -delimiters. - -@item W r -@kindex W r (Summary) -@findex gnus-summary-caesar-message -@c @icon{gnus-summary-caesar-message} -Do a Caesar rotate (rot13) on the article buffer -(@code{gnus-summary-caesar-message}). -Unreadable articles that tell you to read them with Caesar rotate or rot13. -(Typically offensive jokes and such.) - -It's commonly called ``rot13'' because each letter is rotated 13 -positions in the alphabet, e. g. @samp{B} (letter #2) -> @samp{O} (letter -#15). It is sometimes referred to as ``Caesar rotate'' because Caesar -is rumored to have employed this form of, uh, somewhat weak encryption. - -@item W t -@item t -@kindex W t (Summary) -@kindex t (Summary) -@findex gnus-article-toggle-headers -Toggle whether to display all headers in the article buffer -(@code{gnus-article-toggle-headers}). - -@item W v -@kindex W v (Summary) -@findex gnus-summary-verbose-header -Toggle whether to display all headers in the article buffer permanently -(@code{gnus-summary-verbose-header}). - -@item W m -@kindex W m (Summary) -@findex gnus-summary-toggle-mime -Toggle whether to run the article through @sc{mime} before displaying -(@code{gnus-summary-toggle-mime}). - -@item W o -@kindex W o (Summary) -@findex gnus-article-treat-overstrike -Treat overstrike (@code{gnus-article-treat-overstrike}). - -@item W d -@kindex W d (Summary) -@findex gnus-article-treat-dumbquotes -@vindex gnus-article-dumbquotes-map -@cindex Smartquotes -@cindex M****s*** sm*rtq**t*s -@cindex Latin 1 -Treat M****s*** sm*rtq**t*s according to -@code{gnus-article-dumbquotes-map} -(@code{gnus-article-treat-dumbquotes}). Note that this function guesses -whether a character is a sm*rtq**t* or not, so it should only be used -interactively. - -Sm*rtq**t*s are M****s***'s unilateral extension to the character map in -an attempt to provide more quoting characters. If you see something -like @code{\222} or @code{\264} where you're expecting some kind of -apostrophe or quotation mark, then try this wash. - -@item W w -@kindex W w (Summary) -@findex gnus-article-fill-cited-article -Do word wrap (@code{gnus-article-fill-cited-article}). - -You can give the command a numerical prefix to specify the width to use -when filling. - -@item W Q -@kindex W Q (Summary) -@findex gnus-article-fill-long-lines -Fill long lines (@code{gnus-article-fill-long-lines}). - -@item W C -@kindex W C (Summary) -@findex gnus-article-capitalize-sentences -Capitalize the first word in each sentence -(@code{gnus-article-capitalize-sentences}). - -@item W c -@kindex W c (Summary) -@findex gnus-article-remove-cr -Translate CRLF pairs (i. e., @samp{^M}s on the end of the lines) into LF -(this takes care of DOS line endings), and then translate any remaining -CRs into LF (this takes care of Mac line endings) -(@code{gnus-article-remove-cr}). - -@item W 6 -@kindex W 6 (Summary) -@findex gnus-article-de-base64-unreadable -Treat base64 (@code{gnus-article-de-base64-unreadable}). -Base64 is one common @sc{mime} encoding employed when sending non-ASCII -(i. e., 8-bit) articles. Note that the this is usually done -automatically by Gnus if the message in question has a -@code{Content-Transfer-Encoding} header that says that this encoding has -been done. -If a prefix is given, a charset will be asked for. - -@item W Z -@kindex W Z (Summary) -@findex gnus-article-decode-HZ -Treat HZ or HZP (@code{gnus-article-decode-HZ}). HZ (or HZP) is one -common encoding employed when sending Chinese articles. It typically -makes strings look like @samp{~@{<:Ky2;S@{#,NpJ)l6HK!#~@}}. - -@item W h -@kindex W h (Summary) -@findex gnus-article-wash-html -Treat HTML (@code{gnus-article-wash-html}). -Note that the this is usually done automatically by Gnus if the message -in question has a @code{Content-Type} header that says that this type -has been done. -If a prefix is given, a charset will be asked for. - -@item W f -@kindex W f (Summary) -@cindex x-face -@findex gnus-article-display-x-face -@findex gnus-article-x-face-command -@vindex gnus-article-x-face-command -@vindex gnus-article-x-face-too-ugly -@iftex -@iflatex -\include{xface} -@end iflatex -@end iftex -@c @anchor{X-Face} -Look for and display any X-Face headers -(@code{gnus-article-display-x-face}). The command executed by this -function is given by the @code{gnus-article-x-face-command} variable. -If this variable is a string, this string will be executed in a -sub-shell. If it is a function, this function will be called with the -face as the argument. If the @code{gnus-article-x-face-too-ugly} (which -is a regexp) matches the @code{From} header, the face will not be shown. -The default action under Emacs is to fork off the @code{display} -program@footnote{@code{display} is from the ImageMagick package. For the -@code{uncompface} and @code{icontopbm} programs look for a package -like `compface' or `faces-xface' on a GNU/Linux system.} -to view the face. Under XEmacs or Emacs 21+ with suitable image -support, the default action is to display the face before the -@code{From} header. (It's nicer if XEmacs has been compiled with X-Face -support---that will make display somewhat faster. If there's no native -X-Face support, Gnus will try to convert the @code{X-Face} header using -external programs from the @code{pbmplus} package and -friends.@footnote{On a GNU/Linux system look for packages with names -like @code{netpbm} or @code{libgr-progs}.}) If you -want to have this function in the display hook, it should probably come -last. - -@item W b -@kindex W b (Summary) -@findex gnus-article-add-buttons -Add clickable buttons to the article (@code{gnus-article-add-buttons}). -@xref{Article Buttons}. - -@item W B -@kindex W B (Summary) -@findex gnus-article-add-buttons-to-head -Add clickable buttons to the article headers -(@code{gnus-article-add-buttons-to-head}). - -@item W p -@kindex W p (Summary) -@findex gnus-article-verify-x-pgp-sig -Verify a signed control message (@code{gnus-article-verify-x-pgp-sig}). -Control messages such as @code{newgroup} and @code{checkgroups} are -usually signed by the hierarchy maintainer. You need to add the PGP -public key of the maintainer to your keyring to verify the -message.@footnote{PGP keys for many hierarchies are available at -@uref{ftp://ftp.isc.org/pub/pgpcontrol/README.html}} - -@item W W H -@kindex W W H (Summary) -@findex gnus-article-strip-headers-from-body -Strip headers like the @code{X-No-Archive} header from the beginning of -article bodies (@code{gnus-article-strip-headers-from-body}). - -@item W E l -@kindex W E l (Summary) -@findex gnus-article-strip-leading-blank-lines -Remove all blank lines from the beginning of the article -(@code{gnus-article-strip-leading-blank-lines}). - -@item W E m -@kindex W E m (Summary) -@findex gnus-article-strip-multiple-blank-lines -Replace all blank lines with empty lines and then all multiple empty -lines with a single empty line. -(@code{gnus-article-strip-multiple-blank-lines}). - -@item W E t -@kindex W E t (Summary) -@findex gnus-article-remove-trailing-blank-lines -Remove all blank lines at the end of the article -(@code{gnus-article-remove-trailing-blank-lines}). - -@item W E a -@kindex W E a (Summary) -@findex gnus-article-strip-blank-lines -Do all the three commands above -(@code{gnus-article-strip-blank-lines}). - -@item W E A -@kindex W E A (Summary) -@findex gnus-article-strip-all-blank-lines -Remove all blank lines -(@code{gnus-article-strip-all-blank-lines}). - -@item W E s -@kindex W E s (Summary) -@findex gnus-article-strip-leading-space -Remove all white space from the beginning of all lines of the article -body (@code{gnus-article-strip-leading-space}). - -@item W E e -@kindex W E e (Summary) -@findex gnus-article-strip-trailing-space -Remove all white space from the end of all lines of the article -body (@code{gnus-article-strip-trailing-space}). - -@end table - -@xref{Customizing Articles}, for how to wash articles automatically. - - -@node Article Buttons -@subsection Article Buttons -@cindex buttons - -People often include references to other stuff in articles, and it would -be nice if Gnus could just fetch whatever it is that people talk about -with the minimum of fuzz when you hit @kbd{RET} or use the middle mouse -button on these references. - -Gnus adds @dfn{buttons} to certain standard references by default: -Well-formed URLs, mail addresses and Message-IDs. This is controlled by -two variables, one that handles article bodies and one that handles -article heads: - -@table @code - -@item gnus-button-alist -@vindex gnus-button-alist -This is an alist where each entry has this form: - -@lisp -(REGEXP BUTTON-PAR USE-P FUNCTION DATA-PAR) -@end lisp - -@table @var - -@item regexp -All text that match this regular expression will be considered an -external reference. Here's a typical regexp that matches embedded URLs: -@samp{]*\\)>}. - -@item button-par -Gnus has to know which parts of the matches is to be highlighted. This -is a number that says what sub-expression of the regexp is to be -highlighted. If you want it all highlighted, you use 0 here. - -@item use-p -This form will be @code{eval}ed, and if the result is non-@code{nil}, -this is considered a match. This is useful if you want extra sifting to -avoid false matches. - -@item function -This function will be called when you click on this button. - -@item data-par -As with @var{button-par}, this is a sub-expression number, but this one -says which part of the match is to be sent as data to @var{function}. - -@end table - -So the full entry for buttonizing URLs is then - -@lisp -("]*\\)>" 0 t gnus-button-url 1) -@end lisp - -@item gnus-header-button-alist -@vindex gnus-header-button-alist -This is just like the other alist, except that it is applied to the -article head only, and that each entry has an additional element that is -used to say what headers to apply the buttonize coding to: - -@lisp -(HEADER REGEXP BUTTON-PAR USE-P FUNCTION DATA-PAR) -@end lisp - -@var{header} is a regular expression. - -@item gnus-button-url-regexp -@vindex gnus-button-url-regexp -A regular expression that matches embedded URLs. It is used in the -default values of the variables above. - -@item gnus-article-button-face -@vindex gnus-article-button-face -Face used on buttons. - -@item gnus-article-mouse-face -@vindex gnus-article-mouse-face -Face used when the mouse cursor is over a button. - -@end table - -@xref{Customizing Articles}, for how to buttonize articles automatically. - - -@node Article Date -@subsection Article Date - -The date is most likely generated in some obscure timezone you've never -heard of, so it's quite nice to be able to find out what the time was -when the article was sent. - -@table @kbd - -@item W T u -@kindex W T u (Summary) -@findex gnus-article-date-ut -Display the date in UT (aka. GMT, aka ZULU) -(@code{gnus-article-date-ut}). - -@item W T i -@kindex W T i (Summary) -@findex gnus-article-date-iso8601 -@cindex ISO 8601 -Display the date in international format, aka. ISO 8601 -(@code{gnus-article-date-iso8601}). - -@item W T l -@kindex W T l (Summary) -@findex gnus-article-date-local -Display the date in the local timezone (@code{gnus-article-date-local}). - -@item W T p -@kindex W T p (Summary) -@findex gnus-article-date-english -Display the date in a format that's easily pronounceable in English -(@code{gnus-article-date-english}). - -@item W T s -@kindex W T s (Summary) -@vindex gnus-article-time-format -@findex gnus-article-date-user -@findex format-time-string -Display the date using a user-defined format -(@code{gnus-article-date-user}). The format is specified by the -@code{gnus-article-time-format} variable, and is a string that's passed -to @code{format-time-string}. See the documentation of that variable -for a list of possible format specs. - -@item W T e -@kindex W T e (Summary) -@findex gnus-article-date-lapsed -@findex gnus-start-date-timer -@findex gnus-stop-date-timer -Say how much time has elapsed between the article was posted and now -(@code{gnus-article-date-lapsed}). It looks something like: - -@example -X-Sent: 6 weeks, 4 days, 1 hour, 3 minutes, 8 seconds ago -@end example - -The value of @code{gnus-article-date-lapsed-new-header} determines -whether this header will just be added below the old Date one, or will -replace it. - -An advantage of using Gnus to read mail is that it converts simple bugs -into wonderful absurdities. - -If you want to have this line updated continually, you can put - -@lisp -(gnus-start-date-timer) -@end lisp - -in your @file{.gnus.el} file, or you can run it off of some hook. If -you want to stop the timer, you can use the @code{gnus-stop-date-timer} -command. - -@item W T o -@kindex W T o (Summary) -@findex gnus-article-date-original -Display the original date (@code{gnus-article-date-original}). This can -be useful if you normally use some other conversion function and are -worried that it might be doing something totally wrong. Say, claiming -that the article was posted in 1854. Although something like that is -@emph{totally} impossible. Don't you trust me? *titter* - -@end table - -@xref{Customizing Articles}, for how to display the date in your -preferred format automatically. - - -@node Article Signature -@subsection Article Signature -@cindex signatures -@cindex article signature - -@vindex gnus-signature-separator -Each article is divided into two parts---the head and the body. The -body can be divided into a signature part and a text part. The variable -that says what is to be considered a signature is -@code{gnus-signature-separator}. This is normally the standard -@samp{^-- $} as mandated by son-of-RFC 1036. However, many people use -non-standard signature separators, so this variable can also be a list -of regular expressions to be tested, one by one. (Searches are done -from the end of the body towards the beginning.) One likely value is: - -@lisp -(setq gnus-signature-separator - '("^-- $" ; The standard - "^-- *$" ; A common mangling - "^-------*$" ; Many people just use a looong - ; line of dashes. Shame! - "^ *--------*$" ; Double-shame! - "^________*$" ; Underscores are also popular - "^========*$")) ; Pervert! -@end lisp - -The more permissive you are, the more likely it is that you'll get false -positives. - -@vindex gnus-signature-limit -@code{gnus-signature-limit} provides a limit to what is considered a -signature when displaying articles. - -@enumerate -@item -If it is an integer, no signature may be longer (in characters) than -that integer. -@item -If it is a floating point number, no signature may be longer (in lines) -than that number. -@item -If it is a function, the function will be called without any parameters, -and if it returns @code{nil}, there is no signature in the buffer. -@item -If it is a string, it will be used as a regexp. If it matches, the text -in question is not a signature. -@end enumerate - -This variable can also be a list where the elements may be of the types -listed above. Here's an example: - -@lisp -(setq gnus-signature-limit - '(200.0 "^---*Forwarded article")) -@end lisp - -This means that if there are more than 200 lines after the signature -separator, or the text after the signature separator is matched by -the regular expression @samp{^---*Forwarded article}, then it isn't a -signature after all. - - -@node Article Miscellania -@subsection Article Miscellania - -@table @kbd -@item A t -@kindex A t (Summary) -@findex gnus-article-babel -Translate the article from one language to another -(@code{gnus-article-babel}). - -@end table - - -@node MIME Commands -@section @sc{mime} Commands -@cindex MIME decoding -@cindex attachments -@cindex viewing attachments - -The following commands all understand the numerical prefix. For -instance, @kbd{3 b} means ``view the third @sc{mime} part''. - -@table @kbd -@item b -@itemx K v -@kindex b (Summary) -@kindex K v (Summary) -View the @sc{mime} part. - -@item K o -@kindex K o (Summary) -Save the @sc{mime} part. - -@item K c -@kindex K c (Summary) -Copy the @sc{mime} part. - -@item K e -@kindex K e (Summary) -View the @sc{mime} part externally. - -@item K i -@kindex K i (Summary) -View the @sc{mime} part internally. - -@item K | -@kindex K | (Summary) -Pipe the @sc{mime} part to an external command. -@end table - -The rest of these @sc{mime} commands do not use the numerical prefix in -the same manner: - -@table @kbd -@item K b -@kindex K b (Summary) -Make all the @sc{mime} parts have buttons in front of them. This is -mostly useful if you wish to save (or perform other actions) on inlined -parts. - -@item K m -@kindex K m (Summary) -@findex gnus-summary-repair-multipart -Some multipart messages are transmitted with missing or faulty headers. -This command will attempt to ``repair'' these messages so that they can -be viewed in a more pleasant manner -(@code{gnus-summary-repair-multipart}). - -@item X m -@kindex X m (Summary) -@findex gnus-summary-save-parts -Save all parts matching a @sc{mime} type to a directory -(@code{gnus-summary-save-parts}). Understands the process/prefix -convention (@pxref{Process/Prefix}). - -@item M-t -@kindex M-t (Summary) -@findex gnus-summary-display-buttonized -Toggle the buttonized display of the article buffer -(@code{gnus-summary-toggle-display-buttonized}). - -@item W M w -@kindex W M w (Summary) -Decode RFC 2047-encoded words in the article headers -(@code{gnus-article-decode-mime-words}). - -@item W M c -@kindex W M c (Summary) -Decode encoded article bodies as well as charsets -(@code{gnus-article-decode-charset}). - -This command looks in the @code{Content-Type} header to determine the -charset. If there is no such header in the article, you can give it a -prefix, which will prompt for the charset to decode as. In regional -groups where people post using some common encoding (but do not include -MIME headers), you can set the @code{charset} group/topic parameter to -the required charset (@pxref{Group Parameters}). - -@item W M v -@kindex W M v (Summary) -View all the @sc{mime} parts in the current article -(@code{gnus-mime-view-all-parts}). - -@end table - -Relevant variables: - -@table @code -@item gnus-ignored-mime-types -@vindex gnus-ignored-mime-types -This is a list of regexps. @sc{mime} types that match a regexp from -this list will be completely ignored by Gnus. The default value is -@code{nil}. - -To have all Vcards be ignored, you'd say something like this: - -@lisp -(setq gnus-ignored-mime-types - '("text/x-vcard")) -@end lisp - -@item gnus-unbuttonized-mime-types -@vindex gnus-unbuttonized-mime-types -This is a list of regexps. @sc{mime} types that match a regexp from -this list won't have @sc{mime} buttons inserted unless they aren't -displayed. The default value is @code{(".*/.*")}. - -@item gnus-article-mime-part-function -@vindex gnus-article-mime-part-function -For each @sc{mime} part, this function will be called with the @sc{mime} -handle as the parameter. The function is meant to be used to allow -users to gather information from the article (e. g., add Vcard info to -the bbdb database) or to do actions based on parts (e. g., automatically -save all jpegs into some directory). - -Here's an example function the does the latter: - -@lisp -(defun my-save-all-jpeg-parts (handle) - (when (equal (car (mm-handle-type handle)) "image/jpeg") - (with-temp-buffer - (insert (mm-get-part handle)) - (write-region (point-min) (point-max) - (read-file-name "Save jpeg to: "))))) -(setq gnus-article-mime-part-function - 'my-save-all-jpeg-parts) -@end lisp - -@vindex gnus-mime-multipart-functions -@item gnus-mime-multipart-functions -Alist of @sc{mime} multipart types and functions to handle them. - -@vindex mm-file-name-rewrite-functions -@item mm-file-name-rewrite-functions -List of functions used for rewriting file names of @sc{mime} parts. -Each function takes a file name as input and returns a file name. - -Ready-made functions include@* -@code{mm-file-name-delete-whitespace}, -@code{mm-file-name-trim-whitespace}, -@code{mm-file-name-collapse-whitespace}, and -@code{mm-file-name-replace-whitespace}. The later uses the value of -the variable @code{mm-file-name-replace-whitespace} to replace each -whitespace character in a file name with that string; default value -is @code{"_"} (a single underscore). -@findex mm-file-name-delete-whitespace -@findex mm-file-name-trim-whitespace -@findex mm-file-name-collapse-whitespace -@findex mm-file-name-replace-whitespace -@vindex mm-file-name-replace-whitespace - -The standard functions @code{capitalize}, @code{downcase}, -@code{upcase}, and @code{upcase-initials} may be useful, too. - -Everybody knows that whitespace characters in file names are evil, -except those who don't know. If you receive lots of attachments from -such unenlightened users, you can make live easier by adding - -@lisp -(setq mm-file-name-rewrite-functions - '(mm-file-name-trim-whitespace - mm-file-name-collapse-whitespace - mm-file-name-replace-whitespace)) -@end lisp - -@noindent -to your @file{.gnus} file. - -@end table - - -@node Charsets -@section Charsets -@cindex charsets - -People use different charsets, and we have @sc{mime} to let us know what -charsets they use. Or rather, we wish we had. Many people use -newsreaders and mailers that do not understand or use @sc{mime}, and -just send out messages without saying what character sets they use. To -help a bit with this, some local news hierarchies have policies that say -what character set is the default. For instance, the @samp{fj} -hierarchy uses @code{iso-2022-jp-2}. - -@vindex gnus-group-charset-alist -This knowledge is encoded in the @code{gnus-group-charset-alist} -variable, which is an alist of regexps (use the first item to match full -group names) and default charsets to be used when reading these groups. - -In addition, some people do use soi-disant @sc{mime}-aware agents that -aren't. These blithely mark messages as being in @code{iso-8859-1} even -if they really are in @code{koi-8}. To help here, the -@code{gnus-newsgroup-ignored-charsets} variable can be used. The -charsets that are listed here will be ignored. The variable can be set -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. - -@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 -@cindex coding system aliases -@cindex preferred charset - -Other charset tricks that may be useful, although not Gnus-specific: - -If there are several @sc{mime} charsets that encode the same Emacs -charset, you can choose what charset to use by saying the following: - -@lisp -(put-charset-property 'cyrillic-iso8859-5 - 'preferred-coding-system 'koi8-r) -@end lisp - -This means that Russian will be encoded using @code{koi8-r} instead of -the default @code{iso-8859-5} @sc{mime} charset. - -If you want to read messages in @code{koi8-u}, you can cheat and say - -@lisp -(define-coding-system-alias 'koi8-u 'koi8-r) -@end lisp - -This will almost do the right thing. - -And finally, to read charsets like @code{windows-1251}, you can say -something like - -@lisp -(codepage-setup 1251) -(define-coding-system-alias 'windows-1251 'cp1251) -@end lisp - - -@node Article Commands -@section Article Commands - -@table @kbd - -@item A P -@cindex PostScript -@cindex printing -@kindex A P (Summary) -@vindex gnus-ps-print-hook -@findex gnus-summary-print-article -Generate and print a PostScript image of the article buffer -(@code{gnus-summary-print-article}). @code{gnus-ps-print-hook} will be -run just before printing the buffer. - -@end table - - -@node Summary Sorting -@section Summary Sorting -@cindex summary sorting - -You can have the summary buffer sorted in various ways, even though I -can't really see why you'd want that. - -@table @kbd - -@item C-c C-s C-n -@kindex C-c C-s C-n (Summary) -@findex gnus-summary-sort-by-number -Sort by article number (@code{gnus-summary-sort-by-number}). - -@item C-c C-s C-a -@kindex C-c C-s C-a (Summary) -@findex gnus-summary-sort-by-author -Sort by author (@code{gnus-summary-sort-by-author}). - -@item C-c C-s C-s -@kindex C-c C-s C-s (Summary) -@findex gnus-summary-sort-by-subject -Sort by subject (@code{gnus-summary-sort-by-subject}). - -@item C-c C-s C-d -@kindex C-c C-s C-d (Summary) -@findex gnus-summary-sort-by-date -Sort by date (@code{gnus-summary-sort-by-date}). - -@item C-c C-s C-l -@kindex C-c C-s C-l (Summary) -@findex gnus-summary-sort-by-lines -Sort by lines (@code{gnus-summary-sort-by-lines}). - -@item C-c C-s C-c -@kindex C-c C-s C-c (Summary) -@findex gnus-summary-sort-by-chars -Sort by article length (@code{gnus-summary-sort-by-chars}). - -@item C-c C-s C-i -@kindex C-c C-s C-i (Summary) -@findex gnus-summary-sort-by-score -Sort by score (@code{gnus-summary-sort-by-score}). - -@item C-c C-s C-o -@kindex C-c C-s C-o (Summary) -@findex gnus-summary-sort-by-original -Sort using the default sorting method -(@code{gnus-summary-sort-by-original}). -@end table - -These functions will work both when you use threading and when you don't -use threading. In the latter case, all summary lines will be sorted, -line by line. In the former case, sorting will be done on a -root-by-root basis, which might not be what you were looking for. To -toggle whether to use threading, type @kbd{T T} (@pxref{Thread -Commands}). - - -@node Finding the Parent -@section Finding the Parent -@cindex parent articles -@cindex referring articles - -@table @kbd -@item ^ -@kindex ^ (Summary) -@findex gnus-summary-refer-parent-article -If you'd like to read the parent of the current article, and it is not -displayed in the summary buffer, you might still be able to. That is, -if the current group is fetched by @sc{nntp}, the parent hasn't expired -and the @code{References} in the current article are not mangled, you -can just press @kbd{^} or @kbd{A r} -(@code{gnus-summary-refer-parent-article}). If everything goes well, -you'll get the parent. If the parent is already displayed in the -summary buffer, point will just move to this article. - -If given a positive numerical prefix, fetch that many articles back into -the ancestry. If given a negative numerical prefix, fetch just that -ancestor. So if you say @kbd{3 ^}, gnus will fetch the parent, the -grandparent and the grandgrandparent of the current article. If you say -@kbd{-3 ^}, gnus will only fetch the grandgrandparent of the current -article. - -@item A R (Summary) -@findex gnus-summary-refer-references -@kindex A R (Summary) -Fetch all articles mentioned in the @code{References} header of the -article (@code{gnus-summary-refer-references}). - -@item A T (Summary) -@findex gnus-summary-refer-thread -@kindex A T (Summary) -Display the full thread where the current article appears -(@code{gnus-summary-refer-thread}). This command has to fetch all the -headers in the current group to work, so it usually takes a while. If -you do it often, you may consider setting @code{gnus-fetch-old-headers} -to @code{invisible} (@pxref{Filling In Threads}). This won't have any -visible effects normally, but it'll make this command work a whole lot -faster. Of course, it'll make group entry somewhat slow. - -@vindex gnus-refer-thread-limit -The @code{gnus-refer-thread-limit} variable says how many old (i. e., -articles before the first displayed in the current group) headers to -fetch when doing this command. The default is 200. If @code{t}, all -the available headers will be fetched. This variable can be overridden -by giving the @kbd{A T} command a numerical prefix. - -@item M-^ (Summary) -@findex gnus-summary-refer-article -@kindex M-^ (Summary) -@cindex Message-ID -@cindex fetching by Message-ID -You can also ask the @sc{nntp} server for an arbitrary article, no -matter what group it belongs to. @kbd{M-^} -(@code{gnus-summary-refer-article}) will ask you for a -@code{Message-ID}, which is one of those long, hard-to-read thingies -that look something like @samp{<38o6up$6f2@@hymir.ifi.uio.no>}. You -have to get it all exactly right. No fuzzy searches, I'm afraid. -@end table - -The current select method will be used when fetching by -@code{Message-ID} from non-news select method, but you can override this -by giving this command a prefix. - -@vindex gnus-refer-article-method -If the group you are reading is located on a backend that does not -support fetching by @code{Message-ID} very well (like @code{nnspool}), -you can set @code{gnus-refer-article-method} to an @sc{nntp} method. It -would, perhaps, be best if the @sc{nntp} server you consult is the one -updating the spool you are reading from, but that's not really -necessary. - -It can also be a list of select methods, as well as the special symbol -@code{current}, which means to use the current select method. If it -is a list, Gnus will try all the methods in the list until it finds a -match. - -Here's an example setting that will first try the current method, and -then ask Deja if that fails: - -@lisp -(setq gnus-refer-article-method - '(current - (nnweb "refer" (nnweb-type dejanews)))) -@end lisp - -Most of the mail backends support fetching by @code{Message-ID}, but do -not do a particularly excellent job at it. That is, @code{nnmbox} and -@code{nnbabyl} are able to locate articles from any groups, while -@code{nnml} and @code{nnfolder} are only able to locate articles that -have been posted to the current group. (Anything else would be too time -consuming.) @code{nnmh} does not support this at all. - - -@node Alternative Approaches -@section Alternative Approaches - -Different people like to read news using different methods. This being -gnus, we offer a small selection of minor modes for the summary buffers. - -@menu -* Pick and Read:: First mark articles and then read them. -* Binary Groups:: Auto-decode all articles. -@end menu - - -@node Pick and Read -@subsection Pick and Read -@cindex pick and read - -Some newsreaders (like @code{nn} and, uhm, @code{Netnews} on VM/CMS) use -a two-phased reading interface. The user first marks in a summary -buffer the articles she wants to read. Then she starts reading the -articles with just an article buffer displayed. - -@findex gnus-pick-mode -@kindex M-x gnus-pick-mode -Gnus provides a summary buffer minor mode that allows -this---@code{gnus-pick-mode}. This basically means that a few process -mark commands become one-keystroke commands to allow easy marking, and -it provides one additional command for switching to the summary buffer. - -Here are the available keystrokes when using pick mode: - -@table @kbd -@item . -@kindex . (Pick) -@findex gnus-pick-article-or-thread -Pick the article or thread on the current line -(@code{gnus-pick-article-or-thread}). If the variable -@code{gnus-thread-hide-subtree} is true, then this key selects the -entire thread when used at the first article of the thread. Otherwise, -it selects just the article. If given a numerical prefix, go to that -thread or article and pick it. (The line number is normally displayed -at the beginning of the summary pick lines.) - -@item SPACE -@kindex SPACE (Pick) -@findex gnus-pick-next-page -Scroll the summary buffer up one page (@code{gnus-pick-next-page}). If -at the end of the buffer, start reading the picked articles. - -@item u -@kindex u (Pick) -@findex gnus-pick-unmark-article-or-thread. -Unpick the thread or article -(@code{gnus-pick-unmark-article-or-thread}). If the variable -@code{gnus-thread-hide-subtree} is true, then this key unpicks the -thread if used at the first article of the thread. Otherwise it unpicks -just the article. You can give this key a numerical prefix to unpick -the thread or article at that line. - -@item RET -@kindex RET (Pick) -@findex gnus-pick-start-reading -@vindex gnus-pick-display-summary -Start reading the picked articles (@code{gnus-pick-start-reading}). If -given a prefix, mark all unpicked articles as read first. If -@code{gnus-pick-display-summary} is non-@code{nil}, the summary buffer -will still be visible when you are reading. - -@end table - -All the normal summary mode commands are still available in the -pick-mode, with the exception of @kbd{u}. However @kbd{!} is available -which is mapped to the same function -@code{gnus-summary-tick-article-forward}. - -If this sounds like a good idea to you, you could say: - -@lisp -(add-hook 'gnus-summary-mode-hook 'gnus-pick-mode) -@end lisp - -@vindex gnus-pick-mode-hook -@code{gnus-pick-mode-hook} is run in pick minor mode buffers. - -@vindex gnus-mark-unpicked-articles-as-read -If @code{gnus-mark-unpicked-articles-as-read} is non-@code{nil}, mark -all unpicked articles as read. The default is @code{nil}. - -@vindex gnus-summary-pick-line-format -The summary line format in pick mode is slightly different from the -standard format. At the beginning of each line the line number is -displayed. The pick mode line format is controlled by the -@code{gnus-summary-pick-line-format} variable (@pxref{Formatting -Variables}). It accepts the same format specs that -@code{gnus-summary-line-format} does (@pxref{Summary Buffer Lines}). - - -@node Binary Groups -@subsection Binary Groups -@cindex binary groups - -@findex gnus-binary-mode -@kindex M-x gnus-binary-mode -If you spend much time in binary groups, you may grow tired of hitting -@kbd{X u}, @kbd{n}, @kbd{RET} all the time. @kbd{M-x gnus-binary-mode} -is a minor mode for summary buffers that makes all ordinary Gnus article -selection functions uudecode series of articles and display the result -instead of just displaying the articles the normal way. - -@kindex g (Binary) -@findex gnus-binary-show-article -The only way, in fact, to see the actual articles is the @kbd{g} -command, when you have turned on this mode -(@code{gnus-binary-show-article}). - -@vindex gnus-binary-mode-hook -@code{gnus-binary-mode-hook} is called in binary minor mode buffers. - - -@node Tree Display -@section Tree Display -@cindex trees - -@vindex gnus-use-trees -If you don't like the normal gnus summary display, you might try setting -@code{gnus-use-trees} to @code{t}. This will create (by default) an -additional @dfn{tree buffer}. You can execute all summary mode commands -in the tree buffer. - -There are a few variables to customize the tree display, of course: - -@table @code -@item gnus-tree-mode-hook -@vindex gnus-tree-mode-hook -A hook called in all tree mode buffers. - -@item gnus-tree-mode-line-format -@vindex gnus-tree-mode-line-format -A format string for the mode bar in the tree mode buffers (@pxref{Mode -Line Formatting}). The default is @samp{Gnus: %%b %S %Z}. For a list -of valid specs, @pxref{Summary Buffer Mode Line}. - -@item gnus-selected-tree-face -@vindex gnus-selected-tree-face -Face used for highlighting the selected article in the tree buffer. The -default is @code{modeline}. - -@item gnus-tree-line-format -@vindex gnus-tree-line-format -A format string for the tree nodes. The name is a bit of a misnomer, -though---it doesn't define a line, but just the node. The default value -is @samp{%(%[%3,3n%]%)}, which displays the first three characters of -the name of the poster. It is vital that all nodes are of the same -length, so you @emph{must} use @samp{%4,4n}-like specifiers. - -Valid specs are: - -@table @samp -@item n -The name of the poster. -@item f -The @code{From} header. -@item N -The number of the article. -@item [ -The opening bracket. -@item ] -The closing bracket. -@item s -The subject. -@end table - -@xref{Formatting Variables}. - -Variables related to the display are: - -@table @code -@item gnus-tree-brackets -@vindex gnus-tree-brackets -This is used for differentiating between ``real'' articles and -``sparse'' articles. The format is @code{((@var{real-open} . @var{real-close}) -(@var{sparse-open} . @var{sparse-close}) (@var{dummy-open} . @var{dummy-close}))}, and the -default is @code{((?[ . ?]) (?( . ?)) (?@{ . ?@}) (?< . ?>))}. - -@item gnus-tree-parent-child-edges -@vindex gnus-tree-parent-child-edges -This is a list that contains the characters used for connecting parent -nodes to their children. The default is @code{(?- ?\\ ?|)}. - -@end table - -@item gnus-tree-minimize-window -@vindex gnus-tree-minimize-window -If this variable is non-@code{nil}, gnus will try to keep the tree -buffer as small as possible to allow more room for the other gnus -windows. If this variable is a number, the tree buffer will never be -higher than that number. The default is @code{t}. Note that if you -have several windows displayed side-by-side in a frame and the tree -buffer is one of these, minimizing the tree window will also resize all -other windows displayed next to it. - -@item gnus-generate-tree-function -@vindex gnus-generate-tree-function -@findex gnus-generate-horizontal-tree -@findex gnus-generate-vertical-tree -The function that actually generates the thread tree. Two predefined -functions are available: @code{gnus-generate-horizontal-tree} and -@code{gnus-generate-vertical-tree} (which is the default). - -@end table - -Here's an example from a horizontal tree buffer: - -@example -@{***@}-(***)-[odd]-[Gun] - | \[Jan] - | \[odd]-[Eri] - | \(***)-[Eri] - | \[odd]-[Paa] - \[Bjo] - \[Gun] - \[Gun]-[Jor] -@end example - -Here's the same thread displayed in a vertical tree buffer: - -@example -@{***@} - |--------------------------\-----\-----\ -(***) [Bjo] [Gun] [Gun] - |--\-----\-----\ | -[odd] [Jan] [odd] (***) [Jor] - | | |--\ -[Gun] [Eri] [Eri] [odd] - | - [Paa] -@end example - -If you're using horizontal trees, it might be nice to display the trees -side-by-side with the summary buffer. You could add something like the -following to your @file{.gnus.el} file: - -@lisp -(setq gnus-use-trees t - gnus-generate-tree-function 'gnus-generate-horizontal-tree - gnus-tree-minimize-window nil) -(gnus-add-configuration - '(article - (vertical 1.0 - (horizontal 0.25 - (summary 0.75 point) - (tree 1.0)) - (article 1.0)))) -@end lisp - -@xref{Window Layout}. - - -@node Mail Group Commands -@section Mail Group Commands -@cindex mail group commands - -Some commands only make sense in mail groups. If these commands are -invalid in the current group, they will raise a hell and let you know. - -All these commands (except the expiry and edit commands) use the -process/prefix convention (@pxref{Process/Prefix}). - -@table @kbd - -@item B e -@kindex B e (Summary) -@findex gnus-summary-expire-articles -Run all expirable articles in the current group through the expiry -process (@code{gnus-summary-expire-articles}). That is, delete all -expirable articles in the group that have been around for a while. -(@pxref{Expiring Mail}). - -@item B M-C-e -@kindex B M-C-e (Summary) -@findex gnus-summary-expire-articles-now -Delete all the expirable articles in the group -(@code{gnus-summary-expire-articles-now}). This means that @strong{all} -articles eligible for expiry in the current group will -disappear forever into that big @file{/dev/null} in the sky. - -@item B DEL -@kindex B DEL (Summary) -@findex gnus-summary-delete-article -@c @icon{gnus-summary-mail-delete} -Delete the mail article. This is ``delete'' as in ``delete it from your -disk forever and ever, never to return again.'' Use with caution. -(@code{gnus-summary-delete-article}). - -@item B m -@kindex B m (Summary) -@cindex move mail -@findex gnus-summary-move-article -@vindex gnus-preserve-marks -Move the article from one mail group to another -(@code{gnus-summary-move-article}). Marks will be preserved if -@var{gnus-preserve-marks} is non-@code{nil} (which is the default). - -@item B c -@kindex B c (Summary) -@cindex copy mail -@findex gnus-summary-copy-article -@c @icon{gnus-summary-mail-copy} -Copy the article from one group (mail group or not) to a mail group -(@code{gnus-summary-copy-article}). Marks will be preserved if -@var{gnus-preserve-marks} is non-@code{nil} (which is the default). - -@item B B -@kindex B B (Summary) -@cindex crosspost mail -@findex gnus-summary-crosspost-article -Crosspost the current article to some other group -(@code{gnus-summary-crosspost-article}). This will create a new copy of -the article in the other group, and the Xref headers of the article will -be properly updated. - -@item B i -@kindex B i (Summary) -@findex gnus-summary-import-article -Import an arbitrary file into the current mail newsgroup -(@code{gnus-summary-import-article}). You will be prompted for a file -name, a @code{From} header and a @code{Subject} header. - -@item B r -@kindex B r (Summary) -@findex gnus-summary-respool-article -Respool the mail article (@code{gnus-summary-respool-article}). -@code{gnus-summary-respool-default-method} will be used as the default -select method when respooling. This variable is @code{nil} by default, -which means that the current group select method will be used instead. -Marks will be preserved if @var{gnus-preserve-marks} is non-@code{nil} -(which is the default). - -@item B w -@itemx e -@kindex B w (Summary) -@kindex e (Summary) -@findex gnus-summary-edit-article -@kindex C-c C-c (Article) -Edit the current article (@code{gnus-summary-edit-article}). To finish -editing and make the changes permanent, type @kbd{C-c C-c} -(@kbd{gnus-summary-edit-article-done}). If you give a prefix to the -@kbd{C-c C-c} command, gnus won't re-highlight the article. - -@item B q -@kindex B q (Summary) -@findex gnus-summary-respool-query -If you want to re-spool an article, you might be curious as to what group -the article will end up in before you do the re-spooling. This command -will tell you (@code{gnus-summary-respool-query}). - -@item B t -@kindex B t (Summary) -@findex gnus-summary-respool-trace -Similarly, this command will display all fancy splitting patterns used -when repooling, if any (@code{gnus-summary-respool-trace}). - -@item B p -@kindex B p (Summary) -@findex gnus-summary-article-posted-p -Some people have a tendency to send you "courtesy" copies when they -follow up to articles you have posted. These usually have a -@code{Newsgroups} header in them, but not always. This command -(@code{gnus-summary-article-posted-p}) will try to fetch the current -article from your news server (or rather, from -@code{gnus-refer-article-method} or @code{gnus-select-method}) and will -report back whether it found the article or not. Even if it says that -it didn't find the article, it may have been posted anyway---mail -propagation is much faster than news propagation, and the news copy may -just not have arrived yet. - -@end table - -@vindex gnus-move-split-methods -@cindex moving articles -If you move (or copy) articles regularly, you might wish to have gnus -suggest where to put the articles. @code{gnus-move-split-methods} is a -variable that uses the same syntax as @code{gnus-split-methods} -(@pxref{Saving Articles}). You may customize that variable to create -suggestions you find reasonable. (Note that -@code{gnus-move-split-methods} uses group names where -@code{gnus-split-methods} uses file names.) - -@lisp -(setq gnus-move-split-methods - '(("^From:.*Lars Magne" "nnml:junk") - ("^Subject:.*gnus" "nnfolder:important") - (".*" "nnml:misc"))) -@end lisp - - -@node Various Summary Stuff -@section Various Summary Stuff - -@menu -* Summary Group Information:: Information oriented commands. -* Searching for Articles:: Multiple article commands. -* Summary Generation Commands:: -* Really Various Summary Commands:: Those pesky non-conformant commands. -@end menu - -@table @code -@vindex gnus-summary-mode-hook -@item gnus-summary-mode-hook -This hook is called when creating a summary mode buffer. - -@vindex gnus-summary-generate-hook -@item gnus-summary-generate-hook -This is called as the last thing before doing the threading and the -generation of the summary buffer. It's quite convenient for customizing -the threading variables based on what data the newsgroup has. This hook -is called from the summary buffer after most summary buffer variables -have been set. - -@vindex gnus-summary-prepare-hook -@item gnus-summary-prepare-hook -It is called after the summary buffer has been generated. You might use -it to, for instance, highlight lines or modify the look of the buffer in -some other ungodly manner. I don't care. - -@vindex gnus-summary-prepared-hook -@item gnus-summary-prepared-hook -A hook called as the very last thing after the summary buffer has been -generated. - -@vindex gnus-summary-ignore-duplicates -@item gnus-summary-ignore-duplicates -When gnus discovers two articles that have the same @code{Message-ID}, -it has to do something drastic. No articles are allowed to have the -same @code{Message-ID}, but this may happen when reading mail from some -sources. Gnus allows you to customize what happens with this variable. -If it is @code{nil} (which is the default), gnus will rename the -@code{Message-ID} (for display purposes only) and display the article as -any other article. If this variable is @code{t}, it won't display the -article---it'll be as if it never existed. - -@vindex gnus-alter-articles-to-read-function -@item gnus-alter-articles-to-read-function -This function, which takes two parameters (the group name and the list -of articles to be selected), is called to allow the user to alter the -list of articles to be selected. - -For instance, the following function adds the list of cached articles to -the list in one particular group: - -@lisp -(defun my-add-cached-articles (group articles) - (if (string= group "some.group") - (append gnus-newsgroup-cached articles) - articles)) -@end lisp - -@end table - - -@node Summary Group Information -@subsection Summary Group Information - -@table @kbd - -@item H f -@kindex H f (Summary) -@findex gnus-summary-fetch-faq -@vindex gnus-group-faq-directory -Try to fetch the FAQ (list of frequently asked questions) for the -current group (@code{gnus-summary-fetch-faq}). Gnus will try to get the -FAQ from @code{gnus-group-faq-directory}, which is usually a directory -on a remote machine. This variable can also be a list of directories. -In that case, giving a prefix to this command will allow you to choose -between the various sites. @code{ange-ftp} or @code{efs} will probably -be used for fetching the file. - -@item H d -@kindex H d (Summary) -@findex gnus-summary-describe-group -Give a brief description of the current group -(@code{gnus-summary-describe-group}). If given a prefix, force -rereading the description from the server. - -@item H h -@kindex H h (Summary) -@findex gnus-summary-describe-briefly -Give an extremely brief description of the most important summary -keystrokes (@code{gnus-summary-describe-briefly}). - -@item H i -@kindex H i (Summary) -@findex gnus-info-find-node -Go to the gnus info node (@code{gnus-info-find-node}). -@end table - - -@node Searching for Articles -@subsection Searching for Articles - -@table @kbd - -@item M-s -@kindex M-s (Summary) -@findex gnus-summary-search-article-forward -Search through all subsequent (raw) articles for a regexp -(@code{gnus-summary-search-article-forward}). - -@item M-r -@kindex M-r (Summary) -@findex gnus-summary-search-article-backward -Search through all previous (raw) articles for a regexp -(@code{gnus-summary-search-article-backward}). - -@item & -@kindex & (Summary) -@findex gnus-summary-execute-command -This command will prompt you for a header, a regular expression to match -on this field, and a command to be executed if the match is made -(@code{gnus-summary-execute-command}). If the header is an empty -string, the match is done on the entire article. If given a prefix, -search backward instead. - -For instance, @kbd{& RET some.*string #} will put the process mark on -all articles that have heads or bodies that match @samp{some.*string}. - -@item M-& -@kindex M-& (Summary) -@findex gnus-summary-universal-argument -Perform any operation on all articles that have been marked with -the process mark (@code{gnus-summary-universal-argument}). -@end table - -@node Summary Generation Commands -@subsection Summary Generation Commands - -@table @kbd - -@item Y g -@kindex Y g (Summary) -@findex gnus-summary-prepare -Regenerate the current summary buffer (@code{gnus-summary-prepare}). - -@item Y c -@kindex Y c (Summary) -@findex gnus-summary-insert-cached-articles -Pull all cached articles (for the current group) into the summary buffer -(@code{gnus-summary-insert-cached-articles}). - -@end table - - -@node Really Various Summary Commands -@subsection Really Various Summary Commands - -@table @kbd - -@item A D -@itemx C-d -@kindex C-d (Summary) -@kindex A D (Summary) -@findex gnus-summary-enter-digest-group -If the current article is a collection of other articles (for instance, -a digest), you might use this command to enter a group based on the that -article (@code{gnus-summary-enter-digest-group}). Gnus will try to -guess what article type is currently displayed unless you give a prefix -to this command, which forces a ``digest'' interpretation. Basically, -whenever you see a message that is a collection of other messages of -some format, you @kbd{C-d} and read these messages in a more convenient -fashion. - -@item M-C-d -@kindex M-C-d (Summary) -@findex gnus-summary-read-document -This command is very similar to the one above, but lets you gather -several documents into one biiig group -(@code{gnus-summary-read-document}). It does this by opening several -@code{nndoc} groups for each document, and then opening an -@code{nnvirtual} group on top of these @code{nndoc} groups. This -command understands the process/prefix convention -(@pxref{Process/Prefix}). - -@item C-t -@kindex C-t (Summary) -@findex gnus-summary-toggle-truncation -Toggle truncation of summary lines -(@code{gnus-summary-toggle-truncation}). This will probably confuse the -line centering function in the summary buffer, so it's not a good idea -to have truncation switched off while reading articles. - -@item = -@kindex = (Summary) -@findex gnus-summary-expand-window -Expand the summary buffer window (@code{gnus-summary-expand-window}). -If given a prefix, force an @code{article} window configuration. - -@item M-C-e -@kindex M-C-e (Summary) -@findex gnus-summary-edit-parameters -Edit the group parameters (@pxref{Group Parameters}) of the current -group (@code{gnus-summary-edit-parameters}). - -@item M-C-a -@kindex M-C-a (Summary) -@findex gnus-summary-customize-parameters -Customize the group parameters (@pxref{Group Parameters}) of the current -group (@code{gnus-summary-customize-parameters}). - -@end table - - -@node Exiting the Summary Buffer -@section Exiting the Summary Buffer -@cindex summary exit -@cindex exiting groups - -Exiting from the summary buffer will normally update all info on the -group and return you to the group buffer. - -@table @kbd - -@item Z Z -@itemx q -@kindex Z Z (Summary) -@kindex q (Summary) -@findex gnus-summary-exit -@vindex gnus-summary-exit-hook -@vindex gnus-summary-prepare-exit-hook -@c @icon{gnus-summary-exit} -Exit the current group and update all information on the group -(@code{gnus-summary-exit}). @code{gnus-summary-prepare-exit-hook} is -called before doing much of the exiting, which calls -@code{gnus-summary-expire-articles} by default. -@code{gnus-summary-exit-hook} is called after finishing the exit -process. @code{gnus-group-no-more-groups-hook} is run when returning to -group mode having no more (unread) groups. - -@item Z E -@itemx Q -@kindex Z E (Summary) -@kindex Q (Summary) -@findex gnus-summary-exit-no-update -Exit the current group without updating any information on the group -(@code{gnus-summary-exit-no-update}). - -@item Z c -@itemx c -@kindex Z c (Summary) -@kindex c (Summary) -@findex gnus-summary-catchup-and-exit -@c @icon{gnus-summary-catchup-and-exit} -Mark all unticked articles in the group as read and then exit -(@code{gnus-summary-catchup-and-exit}). - -@item Z C -@kindex Z C (Summary) -@findex gnus-summary-catchup-all-and-exit -Mark all articles, even the ticked ones, as read and then exit -(@code{gnus-summary-catchup-all-and-exit}). - -@item Z n -@kindex Z n (Summary) -@findex gnus-summary-catchup-and-goto-next-group -Mark all articles as read and go to the next group -(@code{gnus-summary-catchup-and-goto-next-group}). - -@item Z R -@kindex Z R (Summary) -@findex gnus-summary-reselect-current-group -Exit this group, and then enter it again -(@code{gnus-summary-reselect-current-group}). If given a prefix, select -all articles, both read and unread. - -@item Z G -@itemx M-g -@kindex Z G (Summary) -@kindex M-g (Summary) -@findex gnus-summary-rescan-group -@c @icon{gnus-summary-mail-get} -Exit the group, check for new articles in the group, and select the -group (@code{gnus-summary-rescan-group}). If given a prefix, select all -articles, both read and unread. - -@item Z N -@kindex Z N (Summary) -@findex gnus-summary-next-group -Exit the group and go to the next group -(@code{gnus-summary-next-group}). - -@item Z P -@kindex Z P (Summary) -@findex gnus-summary-prev-group -Exit the group and go to the previous group -(@code{gnus-summary-prev-group}). - -@item Z s -@kindex Z s (Summary) -@findex gnus-summary-save-newsrc -Save the current number of read/marked articles in the dribble buffer -and then save the dribble buffer (@code{gnus-summary-save-newsrc}). If -given a prefix, also save the @file{.newsrc} file(s). Using this -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 -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 -@vindex gnus-kill-summary-on-exit -If you're in the habit of exiting groups, and then changing your mind -about it, you might set @code{gnus-kill-summary-on-exit} to @code{nil}. -If you do that, gnus won't kill the summary buffer when you exit it. -(Quelle surprise!) Instead it will change the name of the buffer to -something like @samp{*Dead Summary ... *} and install a minor mode -called @code{gnus-dead-summary-mode}. Now, if you switch back to this -buffer, you'll find that all keys are mapped to a function called -@code{gnus-summary-wake-up-the-dead}. So tapping any keys in a dead -summary buffer will result in a live, normal summary buffer. - -There will never be more than one dead summary buffer at any one time. - -@vindex gnus-use-cross-reference -The data on the current group will be updated (which articles you have -read, which articles you have replied to, etc.) when you exit the -summary buffer. If the @code{gnus-use-cross-reference} variable is -@code{t} (which is the default), articles that are cross-referenced to -this group and are marked as read, will also be marked as read in the -other subscribed groups they were cross-posted to. If this variable is -neither @code{nil} nor @code{t}, the article will be marked as read in -both subscribed and unsubscribed groups (@pxref{Crosspost Handling}). - - -@node Crosspost Handling -@section Crosspost Handling - -@cindex velveeta -@cindex spamming -Marking cross-posted articles as read ensures that you'll never have to -read the same article more than once. Unless, of course, somebody has -posted it to several groups separately. Posting the same article to -several groups (not cross-posting) is called @dfn{spamming}, and you are -by law required to send nasty-grams to anyone who perpetrates such a -heinous crime. You may want to try NoCeM handling to filter out spam -(@pxref{NoCeM}). - -Remember: Cross-posting is kinda ok, but posting the same article -separately to several groups is not. Massive cross-posting (aka. -@dfn{velveeta}) is to be avoided at all costs, and you can even use the -@code{gnus-summary-mail-crosspost-complaint} command to complain about -excessive crossposting (@pxref{Summary Mail Commands}). - -@cindex cross-posting -@cindex Xref -@cindex @sc{nov} -One thing that may cause Gnus to not do the cross-posting thing -correctly is if you use an @sc{nntp} server that supports @sc{xover} -(which is very nice, because it speeds things up considerably) which -does not include the @code{Xref} header in its @sc{nov} lines. This is -Evil, but all too common, alas, alack. Gnus tries to Do The Right Thing -even with @sc{xover} by registering the @code{Xref} lines of all -articles you actually read, but if you kill the articles, or just mark -them as read without reading them, Gnus will not get a chance to snoop -the @code{Xref} lines out of these articles, and will be unable to use -the cross reference mechanism. - -@cindex LIST overview.fmt -@cindex overview.fmt -To check whether your @sc{nntp} server includes the @code{Xref} header -in its overview files, try @samp{telnet your.nntp.server nntp}, -@samp{MODE READER} on @code{inn} servers, and then say @samp{LIST -overview.fmt}. This may not work, but if it does, and the last line you -get does not read @samp{Xref:full}, then you should shout and whine at -your news admin until she includes the @code{Xref} header in the -overview files. - -@vindex gnus-nov-is-evil -If you want Gnus to get the @code{Xref}s right all the time, you have to -set @code{gnus-nov-is-evil} to @code{t}, which slows things down -considerably. - -C'est la vie. - -For an alternative approach, @pxref{Duplicate Suppression}. - - -@node Duplicate Suppression -@section Duplicate Suppression - -By default, gnus tries to make sure that you don't have to read the same -article more than once by utilizing the crossposting mechanism -(@pxref{Crosspost Handling}). However, that simple and efficient -approach may not work satisfactory for some users for various -reasons. - -@enumerate -@item -The @sc{nntp} server may fail to generate the @code{Xref} header. This -is evil and not very common. - -@item -The @sc{nntp} server may fail to include the @code{Xref} header in the -@file{.overview} data bases. This is evil and all too common, alas. - -@item -You may be reading the same group (or several related groups) from -different @sc{nntp} servers. - -@item -You may be getting mail that duplicates articles posted to groups. -@end enumerate - -I'm sure there are other situations where @code{Xref} handling fails as -well, but these four are the most common situations. - -If, and only if, @code{Xref} handling fails for you, then you may -consider switching on @dfn{duplicate suppression}. If you do so, Gnus -will remember the @code{Message-ID}s of all articles you have read or -otherwise marked as read, and then, as if by magic, mark them as read -all subsequent times you see them---in @emph{all} groups. Using this -mechanism is quite likely to be somewhat inefficient, but not overly -so. It's certainly preferable to reading the same articles more than -once. - -Duplicate suppression is not a very subtle instrument. It's more like a -sledge hammer than anything else. It works in a very simple -fashion---if you have marked an article as read, it adds this Message-ID -to a cache. The next time it sees this Message-ID, it will mark the -article as read with the @samp{M} mark. It doesn't care what group it -saw the article in. - -@table @code -@item gnus-suppress-duplicates -@vindex gnus-suppress-duplicates -If non-@code{nil}, suppress duplicates. - -@item gnus-save-duplicate-list -@vindex gnus-save-duplicate-list -If non-@code{nil}, save the list of duplicates to a file. This will -make startup and shutdown take longer, so the default is @code{nil}. -However, this means that only duplicate articles read in a single gnus -session are suppressed. - -@item gnus-duplicate-list-length -@vindex gnus-duplicate-list-length -This variable says how many @code{Message-ID}s to keep in the duplicate -suppression list. The default is 10000. - -@item gnus-duplicate-file -@vindex gnus-duplicate-file -The name of the file to store the duplicate suppression list in. The -default is @file{~/News/suppression}. -@end table - -If you have a tendency to stop and start gnus often, setting -@code{gnus-save-duplicate-list} to @code{t} is probably a good idea. If -you leave gnus running for weeks on end, you may have it @code{nil}. On -the other hand, saving the list makes startup and shutdown much slower, -so that means that if you stop and start gnus often, you should set -@code{gnus-save-duplicate-list} to @code{nil}. Uhm. I'll leave this up -to you to figure out, I think. - -@node Security -@section Security - -Gnus is able to verify PGP or S/MIME signed messages or decrypt PGP -encrypted messages. - -@enumerate -@item -To verify or decrypt PGP messages, you have to install mailcrypt or -gpg.el. - -@end enumerate - -@table @code -@item mm-verify-option -@vindex mm-verify-option -Option of verifying signed parts. @code{never}, not verify; -@code{always}, always verify; @code{known}, only verify known -protocols. Otherwise, ask user. - -@item mm-decrypt-option -@vindex mm-decrypt-option -Option of decrypting encrypted parts. @code{never}, no decryption; -@code{always}, always decrypt @code{known}, only decrypt known -protocols. Otherwise, ask user. - -@end table - -@node Mailing List -@section Mailing List - -Gnus understands some mailing list fields of RFC 2369. - -@table @kbd - -@item C-c C-n h -@kindex C-c C-n h (Summary) -@findex gnus-mailing-list-help -Send a message to fetch mailing list help, if List-Help field exists. - -@item C-c C-n s -@kindex C-c C-n s (Summary) -@findex gnus-mailing-list-subscribe -Send a message to subscribe the mailing list, if List-Subscribe field exists. - -@item C-c C-n u -@kindex C-c C-n u (Summary) -@findex gnus-mailing-list-unsubscribe -Send a message to unsubscribe the mailing list, if List-Unsubscribe -field exists. - -@item C-c C-n p -@kindex C-c C-n p (Summary) -@findex gnus-mailing-list-post -Post to the mailing list, if List-Post field exists. - -@item C-c C-n o -@kindex C-c C-n o (Summary) -@findex gnus-mailing-list-owner -Send a message to the mailing list owner, if List-Owner field exists. - -@item C-c C-n a -@kindex C-c C-n a (Summary) -@findex gnus-mailing-list-owner -Browse the mailing list archive, if List-Archive field exists. - -@end table - -@node Article Buffer -@chapter Article Buffer -@cindex article buffer - -The articles are displayed in the article buffer, of which there is only -one. All the summary buffers share the same article buffer unless you -tell gnus otherwise. - -@menu -* 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. -@end menu - - -@node Hiding Headers -@section Hiding Headers -@cindex hiding headers -@cindex deleting headers - -The top section of each article is the @dfn{head}. (The rest is the -@dfn{body}, but you may have guessed that already.) - -@vindex gnus-show-all-headers -There is a lot of useful information in the head: the name of the person -who wrote the article, the date it was written and the subject of the -article. That's well and nice, but there's also lots of information -most people do not want to see---what systems the article has passed -through before reaching you, the @code{Message-ID}, the -@code{References}, etc. ad nauseum---and you'll probably want to get rid -of some of those lines. If you want to keep all those lines in the -article buffer, you can set @code{gnus-show-all-headers} to @code{t}. - -Gnus provides you with two variables for sifting headers: - -@table @code - -@item gnus-visible-headers -@vindex gnus-visible-headers -If this variable is non-@code{nil}, it should be a regular expression -that says what headers you wish to keep in the article buffer. All -headers that do not match this variable will be hidden. - -For instance, if you only want to see the name of the person who wrote -the article and the subject, you'd say: - -@lisp -(setq gnus-visible-headers "^From:\\|^Subject:") -@end lisp - -This variable can also be a list of regexps to match headers to -remain visible. - -@item gnus-ignored-headers -@vindex gnus-ignored-headers -This variable is the reverse of @code{gnus-visible-headers}. If this -variable is set (and @code{gnus-visible-headers} is @code{nil}), it -should be a regular expression that matches all lines that you want to -hide. All lines that do not match this variable will remain visible. - -For instance, if you just want to get rid of the @code{References} field -and the @code{Xref} field, you might say: - -@lisp -(setq gnus-ignored-headers "^References:\\|^Xref:") -@end lisp - -This variable can also be a list of regexps to match headers to -be removed. - -Note that if @code{gnus-visible-headers} is non-@code{nil}, this -variable will have no effect. - -@end table - -@vindex gnus-sorted-header-list -Gnus can also sort the headers for you. (It does this by default.) You -can control the sorting by setting the @code{gnus-sorted-header-list} -variable. It is a list of regular expressions that says in what order -the headers are to be displayed. - -For instance, if you want the name of the author of the article first, -and then the subject, you might say something like: - -@lisp -(setq gnus-sorted-header-list '("^From:" "^Subject:")) -@end lisp - -Any headers that are to remain visible, but are not listed in this -variable, will be displayed in random order after all the headers listed in this variable. - -@findex gnus-article-hide-boring-headers -@vindex gnus-boring-article-headers -You can hide further boring headers by setting -@code{gnus-treat-hide-boring-headers} to @code{head}. What this function -does depends on the @code{gnus-boring-article-headers} variable. It's a -list, but this list doesn't actually contain header names. Instead is -lists various @dfn{boring conditions} that Gnus can check and remove -from sight. - -These conditions are: -@table @code -@item empty -Remove all empty headers. -@item followup-to -Remove the @code{Followup-To} header if it is identical to the -@code{Newsgroups} header. -@item reply-to -Remove the @code{Reply-To} header if it lists the same address as the -@code{From} header. -@item newsgroups -Remove the @code{Newsgroups} header if it only contains the current group -name. -@item to-address -Remove the @code{To} header if it only contains the address identical to -the current groups's @code{to-address} parameter. -@item date -Remove the @code{Date} header if the article is less than three days -old. -@item long-to -Remove the @code{To} header if it is very long. -@item many-to -Remove all @code{To} headers if there are more than one. -@end table - -To include these three elements, you could say something like; - -@lisp -(setq gnus-boring-article-headers - '(empty followup-to reply-to)) -@end lisp - -This is also the default value for this variable. - - -@node Using MIME -@section Using @sc{mime} -@cindex @sc{mime} - -Mime is a standard for waving your hands through the air, aimlessly, -while people stand around yawning. - -@sc{mime}, however, is a standard for encoding your articles, aimlessly, -while all newsreaders die of fear. - -@sc{mime} may specify what character set the article uses, the encoding -of the characters, and it also makes it possible to embed pictures and -other naughty stuff in innocent-looking articles. - -@vindex gnus-show-mime -@vindex gnus-article-display-method-for-mime -@vindex gnus-strict-mime -@findex gnus-article-display-mime-message -Gnus handles @sc{mime} by pushing the articles through -@code{gnus-article-display-method-for-mime}, which is -@code{gnus-article-display-mime-message} by default. This function -calls the SEMI MIME-View program to actually do the work. For more -information on SEMI MIME-View, see its manual page (however it is not -existed yet, sorry). - -Set @code{gnus-show-mime} to @code{t} if you want to use -@sc{mime} all the time. However, if @code{gnus-strict-mime} is -non-@code{nil}, the @sc{mime} method will only be used if there are -@sc{mime} headers in the article. If you have @code{gnus-show-mime} -set, then you'll see some unfortunate display glitches in the article -buffer. These can't be avoided. - -In GNUS or Gnus, it might be best to just use the toggling functions -from the summary buffer to avoid getting nasty surprises. (For instance, -you enter the group @samp{alt.sing-a-long} and, before you know it, -@sc{mime} has decoded the sound file in the article and some horrible -sing-a-long song comes screaming out your speakers, and you can't find -the volume button, because there isn't one, and people are starting to -look at you, and you try to stop the program, but you can't, and you -can't find the program to control the volume, and everybody else in the -room suddenly decides to look at you disdainfully, and you'll feel -rather stupid.) - -Any similarity to real events and people is purely coincidental. Ahem. - -To avoid such kind of situation, gnus stops to use -@code{metamail-buffer}. So now, you can set @code{gnus-show-mime} to -non-@code{nil} every-time, then you can push button in the article -buffer when there are nobody else. - -Also see @pxref{MIME Commands}. - - -@node Customizing Articles -@section Customizing Articles -@cindex article customization - -A slew of functions for customizing how the articles are to look like -exist. You can call these functions interactively, or you can have them -called automatically when you select the articles. - -To have them called automatically, you should set the corresponding -``treatment'' variable. For instance, to have headers hidden, you'd set -@code{gnus-treat-hide-headers}. Below is a list of variables that can -be set, but first we discuss the values these variables can have. - -Note: Some values, while valid, make little sense. Check the list below -for sensible values. - -@enumerate -@item -@code{nil}: Don't do this treatment. - -@item -@code{t}: Do this treatment on all body parts. - -@item -@code{head}: Do the treatment on the headers. - -@item -@code{last}: Do this treatment on the last part. - -@item -An integer: Do this treatment on all body parts that have a length less -than this number. - -@item -A list of strings: Do this treatment on all body parts that are in -articles that are read in groups that have names that match one of the -regexps in the list. - -@item -A list where the first element is not a string: - -The list is evaluated recursively. The first element of the list is a -predicate. The following predicates are recognized: @code{or}, -@code{and}, @code{not} and @code{typep}. Here's an example: - -@lisp -(or last - (typep "text/x-vcard")) -@end lisp - -@item -@code{mime}: Do this treatment if the value of @code{gnus-show-mime}' is -non-nil. - -@end enumerate - -You may have noticed that the word @dfn{part} is used here. This refers -to the fact that some messages are @sc{mime} multipart articles that may -be divided into several parts. Articles that are not multiparts are -considered to contain just a single part. - -@vindex gnus-article-treat-types -Are the treatments applied to all sorts of multipart parts? Yes, if you -want to, but by default, only @samp{text/plain} parts are given the -treatment. This is controlled by the @code{gnus-article-treat-types} -variable, which is a list of regular expressions that are matched to the -type of the part. This variable is ignored if the value of the -controlling variable is a predicate list, as described above. - -The following treatment options are available. The easiest way to -customize this is to examine the @code{gnus-article-treat} customization -group. Values in parenthesis are suggested sensible values. Others are -possible but those listed are probably sufficient for most people. - -@table @code -@item gnus-treat-highlight-signature (t, last) -@item gnus-treat-buttonize (t, integer) -@item gnus-treat-buttonize-head (head) -@item gnus-treat-emphasize (t, head, integer) -@item gnus-treat-fill-article (t, integer) -@item gnus-treat-strip-cr (t, integer) -@item gnus-treat-hide-headers (head) -@item gnus-treat-hide-boring-headers (head) -@item gnus-treat-hide-signature (t, last) -@item gnus-treat-hide-citation (t, integer) -@item gnus-treat-hide-citation-maybe (t, integer) -@item gnus-treat-strip-pgp (t, last, integer) -@item gnus-treat-x-pgp-sig (head) -@item gnus-treat-strip-pem (t, last, integer) -@item gnus-treat-highlight-headers (head) -@item gnus-treat-highlight-citation (t, integer) -@item gnus-treat-highlight-signature (t, last, integer) -@item gnus-treat-date-ut (head) -@item gnus-treat-date-local (head) -@item gnus-treat-date-english (head) -@item gnus-treat-date-lapsed (head) -@item gnus-treat-date-original (head) -@item gnus-treat-date-iso8601 (head) -@item gnus-treat-date-user-defined (head) -@item gnus-treat-strip-headers-in-body (t, integer) -@item gnus-treat-strip-trailing-blank-lines (t, last, integer) -@item gnus-treat-strip-leading-blank-lines (t, integer) -@item gnus-treat-strip-multiple-blank-lines (t, integer) -@item gnus-treat-overstrike (t, integer) -@item gnus-treat-display-xface (head) -@item gnus-treat-display-smileys (t, integer) -@item gnus-treat-display-picons (head) -@item gnus-treat-capitalize-sentences (t, integer) -@item gnus-treat-fill-long-lines (t, integer) -@item gnus-treat-play-sounds -@item gnus-treat-translate -@item gnus-treat-decode-article-as-default-mime-charset -@end table - -@vindex gnus-part-display-hook -You can, of course, write your own functions to be called from -@code{gnus-part-display-hook}. The functions are called narrowed to the -part, and you can do anything you like, pretty much. There is no -information that you have to keep in the buffer---you can change -everything. - - -@node Article Keymap -@section Article Keymap - -Most of the keystrokes in the summary buffer can also be used in the -article buffer. They should behave as if you typed them in the summary -buffer, which means that you don't actually have to have a summary -buffer displayed while reading. You can do it all from the article -buffer. - -A few additional keystrokes are available: - -@table @kbd - -@item SPACE -@kindex SPACE (Article) -@findex gnus-article-next-page -Scroll forwards one page (@code{gnus-article-next-page}). - -@item DEL -@kindex DEL (Article) -@findex gnus-article-prev-page -Scroll backwards one page (@code{gnus-article-prev-page}). - -@item C-c ^ -@kindex C-c ^ (Article) -@findex gnus-article-refer-article -If point is in the neighborhood of a @code{Message-ID} and you press -@kbd{C-c ^}, Gnus will try to get that article from the server -(@code{gnus-article-refer-article}). - -@item C-c C-m -@kindex C-c C-m (Article) -@findex gnus-article-mail -Send a reply to the address near point (@code{gnus-article-mail}). If -given a prefix, include the mail. - -@item s -@kindex s (Article) -@findex gnus-article-show-summary -Reconfigure the buffers so that the summary buffer becomes visible -(@code{gnus-article-show-summary}). - -@item ? -@kindex ? (Article) -@findex gnus-article-describe-briefly -Give a very brief description of the available keystrokes -(@code{gnus-article-describe-briefly}). - -@item TAB -@kindex TAB (Article) -@findex gnus-article-next-button -Go to the next button, if any (@code{gnus-article-next-button}). This -only makes sense if you have buttonizing turned on. - -@item M-TAB -@kindex M-TAB (Article) -@findex gnus-article-prev-button -Go to the previous button, if any (@code{gnus-article-prev-button}). - -@end table - - -@node Misc Article -@section Misc Article - -@table @code - -@item gnus-single-article-buffer -@vindex gnus-single-article-buffer -If non-@code{nil}, use the same article buffer for all the groups. -(This is the default.) If @code{nil}, each group will have its own -article buffer. - -@vindex gnus-article-decode-hook -@item gnus-article-decode-hook -@cindex MIME -Hook used to decode @sc{mime} articles. The default value is -@code{(article-decode-charset article-decode-encoded-words)} - -@vindex gnus-article-prepare-hook -@item gnus-article-prepare-hook -This hook is called right after the article has been inserted into the -article buffer. It is mainly intended for functions that do something -depending on the contents; it should probably not be used for changing -the contents of the article buffer. - -@item gnus-article-mode-hook -@vindex gnus-article-mode-hook -Hook called in article mode buffers. - -@item gnus-article-mode-syntax-table -@vindex gnus-article-mode-syntax-table -Syntax table used in article buffers. It is initialized from -@code{text-mode-syntax-table}. - -@vindex gnus-article-mode-line-format -@item gnus-article-mode-line-format -This variable is a format string along the same lines as -@code{gnus-summary-mode-line-format} (@pxref{Mode Line Formatting}). It -accepts the same format specifications as that variable, with two -extensions: - -@table @samp -@item w -The @dfn{wash status} of the article. This is a short string with one -character for each possible article wash operation that may have been -performed. -@item m -The number of @sc{mime} parts in the article. -@end table - -@vindex gnus-break-pages - -@item gnus-break-pages -Controls whether @dfn{page breaking} is to take place. If this variable -is non-@code{nil}, the articles will be divided into pages whenever a -page delimiter appears in the article. If this variable is @code{nil}, -paging will not be done. - -@item gnus-page-delimiter -@vindex gnus-page-delimiter -This is the delimiter mentioned above. By default, it is @samp{^L} -(formfeed). -@end table - - -@node Composing Messages -@chapter Composing Messages -@cindex composing messages -@cindex messages -@cindex mail -@cindex sending mail -@cindex reply -@cindex followup -@cindex post -@cindex using gpg - -@kindex C-c C-c (Post) -All commands for posting and mailing will put you in a message buffer -where you can edit the article all you like, before you send the -article by pressing @kbd{C-c C-c}. @xref{Top, , Top, message, The -Message Manual}. Where the message will be posted/mailed to depends -on your setup (@pxref{Posting Server}). - -@menu -* Mail:: Mailing and replying. -* 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? -* Using GPG:: How to use GPG and MML to sign and encrypt messages -@end menu - -Also see @pxref{Canceling and Superseding} for information on how to -remove articles you shouldn't have posted. - - -@node Mail -@section Mail - -Variables for customizing outgoing mail: - -@table @code -@item gnus-uu-digest-headers -@vindex gnus-uu-digest-headers -List of regexps to match headers included in digested messages. The -headers will be included in the sequence they are matched. - -@item gnus-add-to-list -@vindex gnus-add-to-list -If non-@code{nil}, add a @code{to-list} group parameter to mail groups -that have none when you do a @kbd{a}. - -@end table - - -@node Posting Server -@section Posting Server - -When you press those magical @kbd{C-c C-c} keys to ship off your latest -(extremely intelligent, of course) article, where does it go? - -Thank you for asking. I hate you. - -@vindex gnus-post-method - -It can be quite complicated. Normally, Gnus will post using the same -select method as you're reading from (which might be convenient if -you're reading lots of groups from different private servers). -However. If the server you're reading from doesn't allow posting, -just reading, you probably want to use some other server to post your -(extremely intelligent and fabulously interesting) articles. You can -then set the @code{gnus-post-method} to some other method: - -@lisp -(setq gnus-post-method '(nnspool "")) -@end lisp - -Now, if you've done this, and then this server rejects your article, or -this server is down, what do you do then? To override this variable you -can use a non-zero prefix to the @kbd{C-c C-c} command to force using -the ``current'' server, to get back the default behavior, for posting. - -If you give a zero prefix (i.e., @kbd{C-u 0 C-c C-c}) to that command, -gnus will prompt you for what method to use for posting. - -You can also set @code{gnus-post-method} to a list of select methods. -If that's the case, gnus will always prompt you for what method to use -for posting. - -Finally, if you want to always post using the native select method, -you can set this variable to @code{nil}. - - -@node Mail and Post -@section Mail and Post - -Here's a list of variables relevant to both mailing and -posting: - -@table @code -@item gnus-mailing-list-groups -@findex gnus-mailing-list-groups -@cindex mailing lists - -If your news server offers groups that are really mailing lists -gatewayed to the @sc{nntp} server, you can read those groups without -problems, but you can't post/followup to them without some difficulty. -One solution is to add a @code{to-address} to the group parameters -(@pxref{Group Parameters}). An easier thing to do is set the -@code{gnus-mailing-list-groups} to a regexp that matches the groups that -really are mailing lists. Then, at least, followups to the mailing -lists will work most of the time. Posting to these groups (@kbd{a}) is -still a pain, though. - -@end table - -You may want to do spell-checking on messages that you send out. Or, if -you don't want to spell-check by hand, you could add automatic -spell-checking via the @code{ispell} package: - -@cindex ispell -@findex ispell-message -@lisp -(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-group-real-name 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 -@cindex archived messages -@cindex sent messages - -Gnus provides a few different methods for storing the mail and news you -send. The default method is to use the @dfn{archive virtual server} to -store the messages. If you want to disable this completely, the -@code{gnus-message-archive-group} variable should be @code{nil}, which -is the default. - -@vindex gnus-message-archive-method -@code{gnus-message-archive-method} says what virtual server gnus is to -use to store sent messages. The default is: - -@lisp -(nnfolder "archive" - (nnfolder-directory "~/Mail/archive") - (nnfolder-active-file "~/Mail/archive/active") - (nnfolder-get-new-mail nil) - (nnfolder-inhibit-expiry t)) -@end lisp - -You can, however, use any mail select method (@code{nnml}, -@code{nnmbox}, etc.). @code{nnfolder} is a quite likable select method -for doing this sort of thing, though. If you don't like the default -directory chosen, you could say something like: - -@lisp -(setq gnus-message-archive-method - '(nnfolder "archive" - (nnfolder-inhibit-expiry t) - (nnfolder-active-file "~/News/sent-mail/active") - (nnfolder-directory "~/News/sent-mail/"))) -@end lisp - -@vindex gnus-message-archive-group -@cindex Gcc -Gnus will insert @code{Gcc} headers in all outgoing messages that point -to one or more group(s) on that server. Which group to use is -determined by the @code{gnus-message-archive-group} variable. - -This variable can be used to do the following: - -@itemize @bullet -@item a string -Messages will be saved in that group. - -Note that you can include a select method in the group name, then the -message will not be stored in the select method given by -@code{gnus-message-archive-method}, but in the select method specified -by the group name, instead. Suppose @code{gnus-message-archive-method} -has the default value shown above. Then setting -@code{gnus-message-archive-group} to @code{"foo"} means that outgoing -messages are stored in @samp{nnfolder+archive:foo}, but if you use the -value @code{"nnml:foo"}, then outgoing messages will be stored in -@samp{nnml:foo}. -@item a list of strings -Messages will be saved in all those groups. -@item an alist of regexps, functions and forms -When a key ``matches'', the result is used. -@item @code{nil} -No message archiving will take place. This is the default. -@end itemize - -Let's illustrate: - -Just saving to a single group called @samp{MisK}: -@lisp -(setq gnus-message-archive-group "MisK") -@end lisp - -Saving to two groups, @samp{MisK} and @samp{safe}: -@lisp -(setq gnus-message-archive-group '("MisK" "safe")) -@end lisp - -Save to different groups based on what group you are in: -@lisp -(setq gnus-message-archive-group - '(("^alt" "sent-to-alt") - ("mail" "sent-to-mail") - (".*" "sent-to-misc"))) -@end lisp - -More complex stuff: -@lisp -(setq gnus-message-archive-group - '((if (message-news-p) - "misc-news" - "misc-mail"))) -@end lisp - -How about storing all news messages in one file, but storing all mail -messages in one file per month: - -@lisp -(setq gnus-message-archive-group - '((if (message-news-p) - "misc-news" - (concat "mail." (format-time-string "%Y-%m"))))) -@end lisp - -(XEmacs 19.13 doesn't have @code{format-time-string}, so you'll have to -use a different value for @code{gnus-message-archive-group} there.) - -Now, when you send a message off, it will be stored in the appropriate -group. (If you want to disable storing for just one particular message, -you can just remove the @code{Gcc} header that has been inserted.) The -archive group will appear in the group buffer the next time you start -gnus, or the next time you press @kbd{F} in the group buffer. You can -enter it and read the articles in it just like you'd read any other -group. If the group gets really big and annoying, you can simply rename -if (using @kbd{G r} in the group buffer) to something -nice---@samp{misc-mail-september-1995}, or whatever. New messages will -continue to be stored in the old (now empty) group. - -That's the default method of archiving sent messages. Gnus offers a -different way for the people who don't like the default method. In that -case you should set @code{gnus-message-archive-group} to @code{nil}; -this will disable archiving. - -@table @code -@item gnus-outgoing-message-group -@vindex gnus-outgoing-message-group -All outgoing messages will be put in this group. If you want to store -all your outgoing mail and articles in the group @samp{nnml:archive}, -you set this variable to that value. This variable can also be a list of -group names. - -If you want to have greater control over what group to put each -message in, you can set this variable to a function that checks the -current newsgroup name and then returns a suitable group name (or list -of names). - -This variable can be used instead of @code{gnus-message-archive-group}, -but the latter is the preferred method. - -@item gnus-inews-mark-gcc-as-read -@vindex gnus-inews-mark-gcc-as-read -If non-@code{nil}, automatically mark @code{Gcc} articles as read. - -@end table - - -@node Posting Styles -@section Posting Styles -@cindex posting styles -@cindex styles - -All them variables, they make my head swim. - -So what if you want a different @code{Organization} and signature based -on what groups you post to? And you post both from your home machine -and your work machine, and you want different @code{From} lines, and so -on? - -@vindex gnus-posting-styles -One way to do stuff like that is to write clever hooks that change the -variables you need to have changed. That's a bit boring, so somebody -came up with the bright idea of letting the user specify these things in -a handy alist. Here's an example of a @code{gnus-posting-styles} -variable: - -@lisp -((".*" - (signature "Peace and happiness") - (organization "What me?")) - ("^comp" - (signature "Death to everybody")) - ("comp.emacs.i-love-it" - (organization "Emacs is it"))) -@end lisp - -As you might surmise from this example, this alist consists of several -@dfn{styles}. Each style will be applicable if the first element -``matches'', in some form or other. The entire alist will be iterated -over, from the beginning towards the end, and each match will be -applied, which means that attributes in later styles that match override -the same attributes in earlier matching styles. So -@samp{comp.programming.literate} will have the @samp{Death to everybody} -signature and the @samp{What me?} @code{Organization} header. - -The first element in each style is called the @code{match}. If it's a -string, then Gnus will try to regexp match it against the group name. -If it is the symbol @code{header}, then Gnus will look for header (the -next element in the match) in the original article , and compare that to -the last regexp in the match. If it's a function symbol, that function -will be called with no arguments. If it's a variable symbol, then the -variable will be referenced. If it's a list, then that list will be -@code{eval}ed. In any case, if this returns a non-@code{nil} value, -then the style is said to @dfn{match}. - -Each style may contain a arbitrary amount of @dfn{attributes}. Each -attribute consists of a @code{(@var{name} @var{value})} pair. The -attribute name can be one of @code{signature}, @code{signature-file}, -@code{organization}, @code{address}, @code{name} or @code{body}. The -attribute name can also be a string. In that case, this will be used as -a header name, and the value will be inserted in the headers of the -article; if the value is @code{nil}, the header name will be removed. -If the attribute name is @code{eval}, the form is evaluated, and the -result is thrown away. - -The attribute value can be a string (used verbatim), a function with -zero arguments (the return value will be used), a variable (its value -will be used) or a list (it will be @code{eval}ed and the return value -will be used). The functions and sexps are called/@code{eval}ed in the -message buffer that is being set up. The headers of the current article -are available through the @code{message-reply-headers} variable. - -If you wish to check whether the message you are about to compose is -meant to be a news article or a mail message, you can check the values -of the @code{message-news-p} and @code{message-mail-p} functions. - -@findex message-mail-p -@findex message-news-p - -So here's a new example: - -@lisp -(setq gnus-posting-styles - '((".*" - (signature-file "~/.signature") - (name "User Name") - ("X-Home-Page" (getenv "WWW_HOME")) - (organization "People's Front Against MWM")) - ("^rec.humor" - (signature my-funny-signature-randomizer)) - ((equal (system-name) "gnarly") - (signature my-quote-randomizer)) - ((message-news-p) - (signature my-news-signature)) - (header "to" "larsi.*org" - (Organization "Somewhere, Inc.")) - ((posting-from-work-p) - (signature-file "~/.work-signature") - (address "user@@bar.foo") - (body "You are fired.\n\nSincerely, your boss.") - (organization "Important Work, Inc")) - ("nnml:.*" - (From (save-excursion - (set-buffer gnus-article-buffer) - (message-fetch-field "to")))) - ("^nn.+:" - (signature-file "~/.mail-signature")))) -@end lisp - -The @samp{nnml:.*} rule means that you use the @code{To} address as the -@code{From} address in all your outgoing replies, which might be handy -if you fill many roles. - - -@node Drafts -@section Drafts -@cindex drafts - -If you are writing a message (mail or news) and suddenly remember that -you have a steak in the oven (or some pesto in the food processor, you -craaazy vegetarians), you'll probably wish there was a method to save -the message you are writing so that you can continue editing it some -other day, and send it when you feel its finished. - -Well, don't worry about it. Whenever you start composing a message of -some sort using the gnus mail and post commands, the buffer you get will -automatically associate to an article in a special @dfn{draft} group. -If you save the buffer the normal way (@kbd{C-x C-s}, for instance), the -article will be saved there. (Auto-save files also go to the draft -group.) - -@cindex nndraft -@vindex nndraft-directory -The draft group is a special group (which is implemented as an -@code{nndraft} group, if you absolutely have to know) called -@samp{nndraft:drafts}. The variable @code{nndraft-directory} says where -@code{nndraft} is to store its files. What makes this group special is -that you can't tick any articles in it or mark any articles as -read---all articles in the group are permanently unread. - -If the group doesn't exist, it will be created and you'll be subscribed -to it. The only way to make it disappear from the Group buffer is to -unsubscribe it. - -@c @findex gnus-dissociate-buffer-from-draft -@c @kindex C-c M-d (Mail) -@c @kindex C-c M-d (Post) -@c @findex gnus-associate-buffer-with-draft -@c @kindex C-c C-d (Mail) -@c @kindex C-c C-d (Post) -@c If you're writing some super-secret message that you later want to -@c encode with PGP before sending, you may wish to turn the auto-saving -@c (and association with the draft group) off. You never know who might be -@c interested in reading all your extremely valuable and terribly horrible -@c and interesting secrets. The @kbd{C-c M-d} -@c (@code{gnus-dissociate-buffer-from-draft}) command does that for you. -@c If you change your mind and want to turn the auto-saving back on again, -@c @kbd{C-c C-d} (@code{gnus-associate-buffer-with-draft} does that. -@c -@c @vindex gnus-use-draft -@c To leave association with the draft group off by default, set -@c @code{gnus-use-draft} to @code{nil}. It is @code{t} by default. - -@findex gnus-draft-edit-message -@kindex D e (Draft) -When you want to continue editing the article, you simply enter the -draft group and push @kbd{D e} (@code{gnus-draft-edit-message}) to do -that. You will be placed in a buffer where you left off. - -Rejected articles will also be put in this draft group (@pxref{Rejected -Articles}). - -@findex gnus-draft-send-all-messages -@findex gnus-draft-send-message -If you have lots of rejected messages you want to post (or mail) without -doing further editing, you can use the @kbd{D s} command -(@code{gnus-draft-send-message}). This command understands the -process/prefix convention (@pxref{Process/Prefix}). The @kbd{D S} -command (@code{gnus-draft-send-all-messages}) will ship off all messages -in the buffer. - -If you have some messages that you wish not to send, you can use the -@kbd{D t} (@code{gnus-draft-toggle-sending}) command to mark the message -as unsendable. This is a toggling command. - - -@node Rejected Articles -@section Rejected Articles -@cindex rejected articles - -Sometimes a news server will reject an article. Perhaps the server -doesn't like your face. Perhaps it just feels miserable. Perhaps -@emph{there be demons}. Perhaps you have included too much cited text. -Perhaps the disk is full. Perhaps the server is down. - -These situations are, of course, totally beyond the control of gnus. -(Gnus, of course, loves the way you look, always feels great, has angels -fluttering around inside of it, doesn't care about how much cited text -you include, never runs full and never goes down.) So gnus saves these -articles until some later time when the server feels better. - -The rejected articles will automatically be put in a special draft group -(@pxref{Drafts}). When the server comes back up again, you'd then -typically enter that group and send all the articles off. - -@node Using GPG -@section Using GPG -@cindex using gpg - -Gnus has an ALPHA support to GPG that's provided by @file{gpg.el}. See -@code{mm-verify-option} and @code{mm-decrypt-option} to enable Gnus to -verify or decrypt messages accordingly. - -To use this correctly with GPG, you'll need the following lisp code in your -@file{~/.emacs} or @file{~/.gnus}: - -@lisp -(require 'gpg) -(setq mml2015-use 'gpg) -(setq gpg-temp-directory (expand-file-name "~/.gnupg/tmp")) -@end lisp - -The @code{gpg-temp-directory} need to point to a directory with permissions set -to 700, for your own safety. - -If you want to benefit of PGP2.6 compatibility, you might create a script named -@file{gpg-2comp} with these instructions: - -@example -#!/bin/sh -exec gpg --rfc1991 "$@@" -@end example - -If you don't want to use such compatibility, you can add the following line to -your @file{~/.emacs} or @file{~/.gnus}: - -@lisp -(setq gpg-command-default-alist (quote ((gpg . "gpg") (gpg-2comp . "gpg")))) -@end lisp - -To sign or encrypt your message you may choose to use the MML Security -menu or @kbd{C-c C-m s p} to sign your message using PGP/MIME, @kbd{C-c -C-m s s} to sign your message using S/MIME. There's also @kbd{C-c C-m c -p} to encrypt your message with PGP/MIME and @kbd{C-c C-m c s} to -encrypt using S/MIME. - -Gnus will ask for your passphrase and then it will send your message, if -you've typed it correctly. - -@node Select Methods -@chapter Select Methods -@cindex foreign groups -@cindex select methods - -A @dfn{foreign group} is a group not read by the usual (or -default) means. It could be, for instance, a group from a different -@sc{nntp} server, it could be a virtual group, or it could be your own -personal mail group. - -A foreign group (or any group, really) is specified by a @dfn{name} and -a @dfn{select method}. To take the latter first, a select method is a -list where the first element says what backend to use (e.g. @code{nntp}, -@code{nnspool}, @code{nnml}) and the second element is the @dfn{server -name}. There may be additional elements in the select method, where the -value may have special meaning for the backend in question. - -One could say that a select method defines a @dfn{virtual server}---so -we do just that (@pxref{Server Buffer}). - -The @dfn{name} of the group is the name the backend will recognize the -group as. - -For instance, the group @samp{soc.motss} on the @sc{nntp} server -@samp{some.where.edu} will have the name @samp{soc.motss} and select -method @code{(nntp "some.where.edu")}. Gnus will call this group -@samp{nntp+some.where.edu:soc.motss}, even though the @code{nntp} -backend just knows this group as @samp{soc.motss}. - -The different methods all have their peculiarities, of course. - -@menu -* 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. -@end menu - - -@node Server Buffer -@section Server Buffer - -Traditionally, a @dfn{server} is a machine or a piece of software that -one connects to, and then requests information from. Gnus does not -connect directly to any real servers, but does all transactions through -one backend or other. But that's just putting one layer more between -the actual media and Gnus, so we might just as well say that each -backend represents a virtual server. - -For instance, the @code{nntp} backend may be used to connect to several -different actual @sc{nntp} servers, or, perhaps, to many different ports -on the same actual @sc{nntp} server. You tell Gnus which backend to -use, and what parameters to set by specifying a @dfn{select method}. - -These select method specifications can sometimes become quite -complicated---say, for instance, that you want to read from the -@sc{nntp} server @samp{news.funet.fi} on port number 13, which -hangs if queried for @sc{nov} headers and has a buggy select. Ahem. -Anyway, if you had to specify that for each group that used this -server, that would be too much work, so Gnus offers a way of naming -select methods, which is what you do in the server buffer. - -To enter the server buffer, use the @kbd{^} -(@code{gnus-group-enter-server-mode}) command in the group buffer. - -@menu -* 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. -@end menu - -@vindex gnus-server-mode-hook -@code{gnus-server-mode-hook} is run when creating the server buffer. - - -@node Server Buffer Format -@subsection Server Buffer Format -@cindex server buffer format - -@vindex gnus-server-line-format -You can change the look of the server buffer lines by changing the -@code{gnus-server-line-format} variable. This is a @code{format}-like -variable, with some simple extensions: - -@table @samp - -@item h -How the news is fetched---the backend name. - -@item n -The name of this server. - -@item w -Where the news is to be fetched from---the address. - -@item s -The opened/closed/denied status of the server. -@end table - -@vindex gnus-server-mode-line-format -The mode line can also be customized by using the -@code{gnus-server-mode-line-format} variable (@pxref{Mode Line -Formatting}). The following specs are understood: - -@table @samp -@item S -Server name. - -@item M -Server method. -@end table - -Also @pxref{Formatting Variables}. - - -@node Server Commands -@subsection Server Commands -@cindex server commands - -@table @kbd - -@item a -@kindex a (Server) -@findex gnus-server-add-server -Add a new server (@code{gnus-server-add-server}). - -@item e -@kindex e (Server) -@findex gnus-server-edit-server -Edit a server (@code{gnus-server-edit-server}). - -@item SPACE -@kindex SPACE (Server) -@findex gnus-server-read-server -Browse the current server (@code{gnus-server-read-server}). - -@item q -@kindex q (Server) -@findex gnus-server-exit -Return to the group buffer (@code{gnus-server-exit}). - -@item k -@kindex k (Server) -@findex gnus-server-kill-server -Kill the current server (@code{gnus-server-kill-server}). - -@item y -@kindex y (Server) -@findex gnus-server-yank-server -Yank the previously killed server (@code{gnus-server-yank-server}). - -@item c -@kindex c (Server) -@findex gnus-server-copy-server -Copy the current server (@code{gnus-server-copy-server}). - -@item l -@kindex l (Server) -@findex gnus-server-list-servers -List all servers (@code{gnus-server-list-servers}). - -@item s -@kindex s (Server) -@findex gnus-server-scan-server -Request that the server scan its sources for new articles -(@code{gnus-server-scan-server}). This is mainly sensible with mail -servers. - -@item g -@kindex g (Server) -@findex gnus-server-regenerate-server -Request that the server regenerate all its data structures -(@code{gnus-server-regenerate-server}). This can be useful if you have -a mail backend that has gotten out of sync. - -@end table - - -@node Example Methods -@subsection Example Methods - -Most select methods are pretty simple and self-explanatory: - -@lisp -(nntp "news.funet.fi") -@end lisp - -Reading directly from the spool is even simpler: - -@lisp -(nnspool "") -@end lisp - -As you can see, the first element in a select method is the name of the -backend, and the second is the @dfn{address}, or @dfn{name}, if you -will. - -After these two elements, there may be an arbitrary number of -@code{(@var{variable} @var{form})} pairs. - -To go back to the first example---imagine that you want to read from -port 15 on that machine. This is what the select method should -look like then: - -@lisp -(nntp "news.funet.fi" (nntp-port-number 15)) -@end lisp - -You should read the documentation to each backend to find out what -variables are relevant, but here's an @code{nnmh} example: - -@code{nnmh} is a mail backend that reads a spool-like structure. Say -you have two structures that you wish to access: One is your private -mail spool, and the other is a public one. Here's the possible spec for -your private mail: - -@lisp -(nnmh "private" (nnmh-directory "~/private/mail/")) -@end lisp - -(This server is then called @samp{private}, but you may have guessed -that.) - -Here's the method for a public spool: - -@lisp -(nnmh "public" - (nnmh-directory "/usr/information/spool/") - (nnmh-get-new-mail nil)) -@end lisp - -@cindex proxy -@cindex firewall - -If you are behind a firewall and only have access to the @sc{nntp} -server from the firewall machine, you can instruct Gnus to @code{rlogin} -on the firewall machine and telnet from there to the @sc{nntp} server. -Doing this can be rather fiddly, but your virtual server definition -should probably look something like this: - -@lisp -(nntp "firewall" - (nntp-open-connection-function nntp-open-via-rlogin-and-telnet) - (nntp-via-address "the.firewall.machine") - (nntp-address "the.real.nntp.host") - (nntp-end-of-line "\n")) -@end lisp - -If you want to use the wonderful @code{ssh} program to provide a -compressed connection over the modem line, you could add the following -configuration to the example above: - -@lisp - (nntp-via-rlogin-command "ssh") -@end lisp - -If you're behind a firewall, but have direct access to the outside world -through a wrapper command like "runsocks", you could open a socksified -telnet connection to the news server as follows: - -@lisp -(nntp "outside" - (nntp-pre-command "runsocks") - (nntp-open-connection-function nntp-open-via-telnet) - (nntp-address "the.news.server") - (nntp-end-of-line "\n")) -@end lisp - -This means that you have to have set up @code{ssh-agent} correctly to -provide automatic authorization, of course. And to get a compressed -connection, you have to have the @samp{Compression} option in the -@code{ssh} @file{config} file. - - -@node Creating a Virtual Server -@subsection Creating a Virtual Server - -If you're saving lots of articles in the cache by using persistent -articles, you may want to create a virtual server to read the cache. - -First you need to add a new server. The @kbd{a} command does that. It -would probably be best to use @code{nnspool} to read the cache. You -could also use @code{nnml} or @code{nnmh}, though. - -Type @kbd{a nnspool RET cache RET}. - -You should now have a brand new @code{nnspool} virtual server called -@samp{cache}. You now need to edit it to have the right definitions. -Type @kbd{e} to edit the server. You'll be entered into a buffer that -will contain the following: - -@lisp -(nnspool "cache") -@end lisp - -Change that to: - -@lisp -(nnspool "cache" - (nnspool-spool-directory "~/News/cache/") - (nnspool-nov-directory "~/News/cache/") - (nnspool-active-file "~/News/cache/active")) -@end lisp - -Type @kbd{C-c C-c} to return to the server buffer. If you now press -@kbd{RET} over this virtual server, you should be entered into a browse -buffer, and you should be able to enter any of the groups displayed. - - -@node Server Variables -@subsection Server Variables - -One sticky point when defining variables (both on backends and in Emacs -in general) is that some variables are typically initialized from other -variables when the definition of the variables is being loaded. If you -change the "base" variable after the variables have been loaded, you -won't change the "derived" variables. - -This typically affects directory and file variables. For instance, -@code{nnml-directory} is @file{~/Mail/} by default, and all @code{nnml} -directory variables are initialized from that variable, so -@code{nnml-active-file} will be @file{~/Mail/active}. If you define a -new virtual @code{nnml} server, it will @emph{not} suffice to set just -@code{nnml-directory}---you have to explicitly set all the file -variables to be what you want them to be. For a complete list of -variables for each backend, see each backend's section later in this -manual, but here's an example @code{nnml} definition: - -@lisp -(nnml "public" - (nnml-directory "~/my-mail/") - (nnml-active-file "~/my-mail/active") - (nnml-newsgroups-file "~/my-mail/newsgroups")) -@end lisp - - -@node Servers and Methods -@subsection Servers and Methods - -Wherever you would normally use a select method -(e.g. @code{gnus-secondary-select-method}, in the group select method, -when browsing a foreign server) you can use a virtual server name -instead. This could potentially save lots of typing. And it's nice all -over. - - -@node Unavailable Servers -@subsection Unavailable Servers - -If a server seems to be unreachable, Gnus will mark that server as -@code{denied}. That means that any subsequent attempt to make contact -with that server will just be ignored. ``It can't be opened,'' Gnus -will tell you, without making the least effort to see whether that is -actually the case or not. - -That might seem quite naughty, but it does make sense most of the time. -Let's say you have 10 groups subscribed to on server -@samp{nephelococcygia.com}. This server is located somewhere quite far -away from you and the machine is quite slow, so it takes 1 minute just -to find out that it refuses connection to you today. If Gnus were to -attempt to do that 10 times, you'd be quite annoyed, so Gnus won't -attempt to do that. Once it has gotten a single ``connection refused'', -it will regard that server as ``down''. - -So, what happens if the machine was only feeling unwell temporarily? -How do you test to see whether the machine has come up again? - -You jump to the server buffer (@pxref{Server Buffer}) and poke it -with the following commands: - -@table @kbd - -@item O -@kindex O (Server) -@findex gnus-server-open-server -Try to establish connection to the server on the current line -(@code{gnus-server-open-server}). - -@item C -@kindex C (Server) -@findex gnus-server-close-server -Close the connection (if any) to the server -(@code{gnus-server-close-server}). - -@item D -@kindex D (Server) -@findex gnus-server-deny-server -Mark the current server as unreachable -(@code{gnus-server-deny-server}). - -@item M-o -@kindex M-o (Server) -@findex gnus-server-open-all-servers -Open the connections to all servers in the buffer -(@code{gnus-server-open-all-servers}). - -@item M-c -@kindex M-c (Server) -@findex gnus-server-close-all-servers -Close the connections to all servers in the buffer -(@code{gnus-server-close-all-servers}). - -@item R -@kindex R (Server) -@findex gnus-server-remove-denials -Remove all marks to whether Gnus was denied connection from any servers -(@code{gnus-server-remove-denials}). - -@end table - - -@node Getting News -@section Getting News -@cindex reading news -@cindex news backends - -A newsreader is normally used for reading news. Gnus currently provides -only two methods of getting news---it can read from an @sc{nntp} server, -or it can read from a local spool. - -@menu -* NNTP:: Reading news from an @sc{nntp} server. -* News Spool:: Reading news from the local spool. -@end menu - - -@node NNTP -@subsection @sc{nntp} -@cindex nntp - -Subscribing to a foreign group from an @sc{nntp} server is rather easy. -You just specify @code{nntp} as method and the address of the @sc{nntp} -server as the, uhm, address. - -If the @sc{nntp} server is located at a non-standard port, setting the -third element of the select method to this port number should allow you -to connect to the right port. You'll have to edit the group info for -that (@pxref{Foreign Groups}). - -The name of the foreign group can be the same as a native group. In -fact, you can subscribe to the same group from as many different servers -you feel like. There will be no name collisions. - -The following variables can be used to create a virtual @code{nntp} -server: - -@table @code - -@item nntp-server-opened-hook -@vindex nntp-server-opened-hook -@cindex @sc{mode reader} -@cindex authinfo -@cindex authentification -@cindex nntp authentification -@findex nntp-send-authinfo -@findex nntp-send-mode-reader -is run after a connection has been made. It can be used to send -commands to the @sc{nntp} server after it has been contacted. By -default it sends the command @code{MODE READER} to the server with the -@code{nntp-send-mode-reader} function. This function should always be -present in this hook. - -@item nntp-authinfo-function -@vindex nntp-authinfo-function -@findex nntp-send-authinfo -@vindex nntp-authinfo-file -This function will be used to send @samp{AUTHINFO} to the @sc{nntp} -server. The default function is @code{nntp-send-authinfo}, which looks -through your @file{~/.authinfo} (or whatever you've set the -@code{nntp-authinfo-file} variable to) for applicable entries. If none -are found, it will prompt you for a login name and a password. The -format of the @file{~/.authinfo} file is (almost) the same as the -@code{ftp} @file{~/.netrc} file, which is defined in the @code{ftp} -manual page, but here are the salient facts: - -@enumerate -@item -The file contains one or more line, each of which define one server. - -@item -Each line may contain an arbitrary number of token/value pairs. - -The valid tokens include @samp{machine}, @samp{login}, @samp{password}, -@samp{default}. In addition Gnus introduces two new tokens, not present -in the original @file{.netrc}/@code{ftp} syntax, namely @samp{port} and -@samp{force}. (This is the only way the @file{.authinfo} file format -deviates from the @file{.netrc} file format.) @samp{port} is used to -indicate what port on the server the credentials apply to and -@samp{force} is explained below. - -@end enumerate - -Here's an example file: - -@example -machine news.uio.no login larsi password geheimnis -machine nntp.ifi.uio.no login larsi force yes -@end example - -The token/value pairs may appear in any order; @samp{machine} doesn't -have to be first, for instance. - -In this example, both login name and password have been supplied for the -former server, while the latter has only the login name listed, and the -user will be prompted for the password. The latter also has the -@samp{force} tag, which means that the authinfo will be sent to the -@var{nntp} server upon connection; the default (i.e., when there is not -@samp{force} tag) is to not send authinfo to the @var{nntp} server -until the @var{nntp} server asks for it. - -You can also add @samp{default} lines that will apply to all servers -that don't have matching @samp{machine} lines. - -@example -default force yes -@end example - -This will force sending @samp{AUTHINFO} commands to all servers not -previously mentioned. - -Remember to not leave the @file{~/.authinfo} file world-readable. - -@item nntp-server-action-alist -@vindex nntp-server-action-alist -This is a list of regexps to match on server types and actions to be -taken when matches are made. For instance, if you want Gnus to beep -every time you connect to innd, you could say something like: - -@lisp -(setq nntp-server-action-alist - '(("innd" (ding)))) -@end lisp - -You probably don't want to do that, though. - -The default value is - -@lisp -'(("nntpd 1\\.5\\.11t" - (remove-hook 'nntp-server-opened-hook - 'nntp-send-mode-reader))) -@end lisp - -This ensures that Gnus doesn't send the @code{MODE READER} command to -nntpd 1.5.11t, since that command chokes that server, I've been told. - -@item nntp-maximum-request -@vindex nntp-maximum-request -If the @sc{nntp} server doesn't support @sc{nov} headers, this backend -will collect headers by sending a series of @code{head} commands. To -speed things up, the backend sends lots of these commands without -waiting for reply, and then reads all the replies. This is controlled -by the @code{nntp-maximum-request} variable, and is 400 by default. If -your network is buggy, you should set this to 1. - -@item nntp-connection-timeout -@vindex nntp-connection-timeout -If you have lots of foreign @code{nntp} groups that you connect to -regularly, you're sure to have problems with @sc{nntp} servers not -responding properly, or being too loaded to reply within reasonable -time. This is can lead to awkward problems, which can be helped -somewhat by setting @code{nntp-connection-timeout}. This is an integer -that says how many seconds the @code{nntp} backend should wait for a -connection before giving up. If it is @code{nil}, which is the default, -no timeouts are done. - -@c @item nntp-command-timeout -@c @vindex nntp-command-timeout -@c @cindex PPP connections -@c @cindex dynamic IP addresses -@c If you're running Gnus on a machine that has a dynamically assigned -@c address, Gnus may become confused. If the address of your machine -@c changes after connecting to the @sc{nntp} server, Gnus will simply sit -@c waiting forever for replies from the server. To help with this -@c unfortunate problem, you can set this command to a number. Gnus will -@c then, if it sits waiting for a reply from the server longer than that -@c number of seconds, shut down the connection, start a new one, and resend -@c the command. This should hopefully be transparent to the user. A -@c likely number is 30 seconds. -@c -@c @item nntp-retry-on-break -@c @vindex nntp-retry-on-break -@c If this variable is non-@code{nil}, you can also @kbd{C-g} if Gnus -@c hangs. This will have much the same effect as the command timeout -@c described above. - -@item nntp-server-hook -@vindex nntp-server-hook -This hook is run as the last step when connecting to an @sc{nntp} -server. - -@item nntp-buggy-select -@vindex nntp-buggy-select -Set this to non-@code{nil} if your select routine is buggy. - -@item nntp-nov-is-evil -@vindex nntp-nov-is-evil -If the @sc{nntp} server does not support @sc{nov}, you could set this -variable to @code{t}, but @code{nntp} usually checks automatically whether @sc{nov} -can be used. - -@item nntp-xover-commands -@vindex nntp-xover-commands -@cindex nov -@cindex XOVER -List of strings used as commands to fetch @sc{nov} lines from a -server. The default value of this variable is @code{("XOVER" -"XOVERVIEW")}. - -@item nntp-nov-gap -@vindex nntp-nov-gap -@code{nntp} normally sends just one big request for @sc{nov} lines to -the server. The server responds with one huge list of lines. However, -if you have read articles 2-5000 in the group, and only want to read -article 1 and 5001, that means that @code{nntp} will fetch 4999 @sc{nov} -lines that you will not need. This variable says how -big a gap between two consecutive articles is allowed to be before the -@code{XOVER} request is split into several request. Note that if your -network is fast, setting this variable to a really small number means -that fetching will probably be slower. If this variable is @code{nil}, -@code{nntp} will never split requests. The default is 5. - -@item nntp-prepare-server-hook -@vindex nntp-prepare-server-hook -A hook run before attempting to connect to an @sc{nntp} server. - -@item nntp-warn-about-losing-connection -@vindex nntp-warn-about-losing-connection -If this variable is non-@code{nil}, some noise will be made when a -server closes connection. - -@item nntp-record-commands -@vindex nntp-record-commands -If non-@code{nil}, @code{nntp} will log all commands it sends to the -@sc{nntp} server (along with a timestamp) in the @samp{*nntp-log*} -buffer. This is useful if you are debugging a Gnus/@sc{nntp} connection -that doesn't seem to work. - -@item nntp-open-connection-function -@vindex nntp-open-connection-function -It is possible to customize how the connection to the nntp server will -be opened. If you specify an @code{nntp-open-connection-function} -parameter, Gnus will use that function to establish the connection. -Five pre-made functions are supplied. These functions can be grouped in -two categories: direct connection functions (three pre-made), and -indirect ones (two pre-made). - -@item nntp-list-options -@vindex nntp-list-options -List of newsgroup name used for a option of the LIST command to restrict -the listing output to only the specified newsgroups. Each newsgroup name -can be a shell-style wildcard, for instance, @dfn{fj.*}, @dfn{japan.*}, -etc. Fortunately, if the server can accept such a option, it will -probably make gnus run faster. You may use it as a server variable as -follows: - -@lisp -(setq gnus-select-method - '(nntp "news.somewhere.edu" - (nntp-list-options ("fj.*" "japan.*")))) -@end lisp - -@item nntp-options-subscribe -@vindex nntp-options-subscribe -Regexp matching the newsgroup names which will be subscribed -unconditionally. Use @dfn{ } instead of @dfn{$} for a regexp string. -It may be effective as well as @code{nntp-list-options} even though the -server could not accept a shell-style wildcard as a option of the LIST -command. You may use it as a server variable as follows: - -@lisp -(setq gnus-select-method - '(nntp "news.somewhere.edu" - (nntp-options-subscribe "^fj\\.\\|^japan\\."))) -@end lisp - -@item nntp-options-not-subscribe -@vindex nntp-options-not-subscribe -Regexp matching the newsgroup names which will not be subscribed -unconditionally. Use @dfn{ } instead of @dfn{$} for a regexp string. -It may be effective as well as @code{nntp-list-options} even though the -server could not accept a shell-style wildcard as a option of the LIST -command. You may use it as a server variable as follows: - -@lisp -(setq gnus-select-method - '(nntp "news.somewhere.edu" - (nntp-options-not-subscribe "\\.binaries\\."))) -@end lisp -@end table - -@menu -* Direct Functions:: Connecting directly to the server. -* Indirect Functions:: Connecting indirectly to the server. -* Common Variables:: Understood by several connection functions. -@end menu - - -@node Direct Functions -@subsubsection Direct Functions -@cindex direct connection functions - -These functions are called direct because they open a direct connection -between your machine and the @sc{nntp} server. The behavior of these -functions is also affected by commonly understood variables -(@pxref{Common Variables}). - -@table @code -@findex nntp-open-network-stream -@item nntp-open-network-stream -This is the default, and simply connects to some port or other on the -remote system. - -@findex nntp-open-ssl-stream -@item nntp-open-ssl-stream -Opens a connection to a server over a @dfn{secure} channel. To use this -you must have SSLay installed -(@uref{ftp://ftp.psy.uq.oz.au/pub/Crypto/SSL}, and you also need -@file{ssl.el} (from the W3 distribution, for instance). You then -define a server as follows: - -@lisp -;; Type `C-c C-c' after you've finished editing. -;; -;; "snews" is port 563 and is predefined in our /etc/services -;; -(nntp "snews.bar.com" - (nntp-open-connection-function nntp-open-ssl-stream) - (nntp-port-number "snews") - (nntp-address "snews.bar.com")) -@end lisp - -@findex nntp-open-telnet-stream -@item nntp-open-telnet-stream -Opens a connection to an @sc{nntp} server by simply @samp{telnet}'ing -it. You might wonder why this function exists, since we have the -default @code{nntp-open-network-stream} which would do the job. (One -of) the reason(s) is that if you are behind a firewall but have direct -connections to the outside world thanks to a command wrapper like -@code{runsocks}, you can use it like this: - -@lisp -(nntp "socksified" - (nntp-pre-command "runsocks") - (nntp-open-connection-function nntp-open-telnet-stream) - (nntp-address "the.news.server")) -@end lisp - -With the default method, you would need to wrap your whole Emacs -session, which is not a good idea. -@end table - - -@node Indirect Functions -@subsubsection Indirect Functions -@cindex indirect connection functions - -These functions are called indirect because they connect to an -intermediate host before actually connecting to the @sc{nntp} server. -All of these functions and related variables are also said to belong to -the "via" family of connection: they're all prefixed with "via" to make -things cleaner. The behavior of these functions is also affected by -commonly understood variables (@pxref{Common Variables}). - -@table @code -@item nntp-open-via-rlogin-and-telnet -@findex nntp-open-via-rlogin-and-telnet -Does an @samp{rlogin} on a remote system, and then does a @samp{telnet} -to the real @sc{nntp} server from there. This is useful for instance if -you need to connect to a firewall machine first. - -@code{nntp-open-via-rlogin-and-telnet}-specific variables: - -@table @code -@item nntp-via-rlogin-command -@vindex nntp-via-rlogin-command -Command used to log in on the intermediate host. The default is -@samp{rsh}, but @samp{ssh} is a popular alternative. -@end table - -@item nntp-open-via-telnet-and-telnet -@findex nntp-open-via-telnet-and-telnet -Does essentially the same, but uses @samp{telnet} instead of -@samp{rlogin} to connect to the intermediate host. - -@code{nntp-open-via-telnet-and-telnet}-specific variables: - -@table @code -@item nntp-via-telnet-command -@vindex nntp-via-telnet-command -Command used to @code{telnet} the intermediate host. The default is -@samp{telnet}. - -@item nntp-via-telnet-switches -@vindex nntp-via-telnet-switches -List of strings to be used as the switches to the -@code{nntp-via-telnet-command} command. The default is @samp{("-8")}. - -@item nntp-via-user-password -@vindex nntp-via-user-password -Password to use when logging in on the intermediate host. - -@item nntp-via-envuser -@vindex nntp-via-envuser -If non-@code{nil}, the intermediate @code{telnet} session (client and -server both) will support the @code{ENVIRON} option and not prompt for -login name. This works for Solaris @code{telnet}, for instance. - -@item nntp-via-shell-prompt -@vindex nntp-via-shell-prompt -Regexp matching the shell prompt on the intermediate host. The default -is @samp{bash\\|\$ *\r?$\\|> *\r?}. - -@end table - -@end table - - -Here are some additional variables that are understood by all the above -functions: - -@table @code - -@item nntp-via-user-name -@vindex nntp-via-user-name -User name to use when connecting to the intermediate host. - -@item nntp-via-address -@vindex nntp-via-address -Address of the intermediate host to connect to. - -@end table - - -@node Common Variables -@subsubsection Common Variables - -The following variables affect the behavior of all, or several of the -pre-made connection functions. When not specified, all functions are -affected. - -@table @code - -@item nntp-pre-command -@vindex nntp-pre-command -A command wrapper to use when connecting through a non native connection -function (all except @code{nntp-open-network-stream} and -@code{nntp-open-ssl-stream}. This is where you would put a @samp{SOCKS} -wrapper for instance. - -@item nntp-address -@vindex nntp-address -The address of the @sc{nntp} server. - -@item nntp-port-number -@vindex nntp-port-number -Port number to connect to the @sc{nntp} server. The default is @samp{nntp}. - -@item nntp-end-of-line -@vindex nntp-end-of-line -String to use as end-of-line marker when talking to the @sc{nntp} -server. This is @samp{\r\n} by default, but should be @samp{\n} when -using a non native connection function. - -@item nntp-telnet-command -@vindex nntp-telnet-command -Command to use when connecting to the @sc{nntp} server through -@samp{telnet}. This is NOT for an intermediate host. This is just for -the real @sc{nntp} server. The default is @samp{telnet}. - -@item nntp-telnet-switches -@vindex nntp-telnet-switches -A list of switches to pass to @code{nntp-telnet-command}. The default -is @samp{("-8")}. - -@end table - - -@node News Spool -@subsection News Spool -@cindex nnspool -@cindex news spool - -Subscribing to a foreign group from the local spool is extremely easy, -and might be useful, for instance, to speed up reading groups that -contain very big articles---@samp{alt.binaries.pictures.furniture}, for -instance. - -Anyway, you just specify @code{nnspool} as the method and @code{""} (or -anything else) as the address. - -If you have access to a local spool, you should probably use that as the -native select method (@pxref{Finding the News}). It is normally faster -than using an @code{nntp} select method, but might not be. It depends. -You just have to try to find out what's best at your site. - -@table @code - -@item nnspool-inews-program -@vindex nnspool-inews-program -Program used to post an article. - -@item nnspool-inews-switches -@vindex nnspool-inews-switches -Parameters given to the inews program when posting an article. - -@item nnspool-spool-directory -@vindex nnspool-spool-directory -Where @code{nnspool} looks for the articles. This is normally -@file{/usr/spool/news/}. - -@item nnspool-nov-directory -@vindex nnspool-nov-directory -Where @code{nnspool} will look for @sc{nov} files. This is normally -@file{/usr/spool/news/over.view/}. - -@item nnspool-lib-dir -@vindex nnspool-lib-dir -Where the news lib dir is (@file{/usr/lib/news/} by default). - -@item nnspool-active-file -@vindex nnspool-active-file -The path to the active file. - -@item nnspool-newsgroups-file -@vindex nnspool-newsgroups-file -The path to the group descriptions file. - -@item nnspool-history-file -@vindex nnspool-history-file -The path to the news history file. - -@item nnspool-active-times-file -@vindex nnspool-active-times-file -The path to the active date file. - -@item nnspool-nov-is-evil -@vindex nnspool-nov-is-evil -If non-@code{nil}, @code{nnspool} won't try to use any @sc{nov} files -that it finds. - -@item nnspool-sift-nov-with-sed -@vindex nnspool-sift-nov-with-sed -@cindex sed -If non-@code{nil}, which is the default, use @code{sed} to get the -relevant portion from the overview file. If nil, @code{nnspool} will -load the entire file into a buffer and process it there. - -@end table - - -@node Getting Mail -@section Getting Mail -@cindex reading mail -@cindex mail - -Reading mail with a newsreader---isn't that just plain WeIrD? But of -course. - -@menu -* 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. -* Archiving Mail:: How to backup your mail. -@end menu - - -@node Mail in a Newsreader -@subsection Mail in a Newsreader - -If you are used to traditional mail readers, but have decided to switch -to reading mail with Gnus, you may find yourself experiencing something -of a culture shock. - -Gnus does not behave like traditional mail readers. If you want to make -it behave that way, you can, but it's an uphill battle. - -Gnus, by default, handles all its groups using the same approach. This -approach is very newsreaderly---you enter a group, see the new/unread -messages, and when you read the messages, they get marked as read, and -you don't see them any more. (Unless you explicitly ask for them.) - -In particular, you do not do anything explicitly to delete messages. - -Does this mean that all the messages that have been marked as read are -deleted? How awful! - -But, no, it means that old messages are @dfn{expired} according to some -scheme or other. For news messages, the expire process is controlled by -the news administrator; for mail, the expire process is controlled by -you. The expire process for mail is covered in depth in @pxref{Expiring -Mail}. - -What many Gnus users find, after using it a while for both news and -mail, is that the transport mechanism has very little to do with how -they want to treat a message. - -Many people subscribe to several mailing lists. These are transported -via SMTP, and are therefore mail. But we might go for weeks without -answering, or even reading these messages very carefully. We may not -need to save them because if we should need to read one again, they are -archived somewhere else. - -Some people have local news groups which have only a handful of readers. -These are transported via @sc{nntp}, and are therefore news. But we may need -to read and answer a large fraction of the messages very carefully in -order to do our work. And there may not be an archive, so we may need -to save the interesting messages the same way we would personal mail. - -The important distinction turns out to be not the transport mechanism, -but other factors such as how interested we are in the subject matter, -or how easy it is to retrieve the message if we need to read it again. - -Gnus provides many options for sorting mail into ``groups'' which behave -like newsgroups, and for treating each group (whether mail or news) -differently. - -Some users never get comfortable using the Gnus (ahem) paradigm and wish -that Gnus should grow up and be a male, er, mail reader. It is possible -to whip Gnus into a more mailreaderly being, but, as said before, it's -not easy. People who prefer proper mail readers should try @sc{vm} -instead, which is an excellent, and proper, mail reader. - -I don't mean to scare anybody off, but I want to make it clear that you -may be required to learn a new way of thinking about messages. After -you've been subjected to The Gnus Way, you will come to love it. I can -guarantee it. (At least the guy who sold me the Emacs Subliminal -Brain-Washing Functions that I've put into Gnus did guarantee it. You -Will Be Assimilated. You Love Gnus. You Love The Gnus Mail Way. -You Do.) - - -@node Getting Started Reading Mail -@subsection Getting Started Reading Mail - -It's quite easy to use Gnus to read your new mail. You just plonk the -mail backend of your choice into @code{gnus-secondary-select-methods}, -and things will happen automatically. - -For instance, if you want to use @code{nnml} (which is a "one file per -mail" backend), you could put the following in your @file{.gnus} file: - -@lisp -(setq gnus-secondary-select-methods '((nnml ""))) -@end lisp - -Now, the next time you start Gnus, this backend will be queried for new -articles, and it will move all the messages in your spool file to its -directory, which is @code{~/Mail/} by default. The new group that will -be created (@samp{mail.misc}) will be subscribed, and you can read it -like any other group. - -You will probably want to split the mail into several groups, though: - -@lisp -(setq nnmail-split-methods - '(("junk" "^From:.*Lars Ingebrigtsen") - ("crazy" "^Subject:.*die\\|^Organization:.*flabby") - ("other" ""))) -@end lisp - -This will result in three new @code{nnml} mail groups being created: -@samp{nnml:junk}, @samp{nnml:crazy}, and @samp{nnml:other}. All the -mail that doesn't fit into the first two groups will be placed in the -last group. - -This should be sufficient for reading mail with Gnus. You might want to -give the other sections in this part of the manual a perusal, though. -Especially @pxref{Choosing a Mail Backend} and @pxref{Expiring Mail}. - - -@node Splitting Mail -@subsection Splitting Mail -@cindex splitting mail -@cindex mail splitting - -@vindex nnmail-split-methods -The @code{nnmail-split-methods} variable says how the incoming mail is -to be split into groups. - -@lisp -(setq nnmail-split-methods - '(("mail.junk" "^From:.*Lars Ingebrigtsen") - ("mail.crazy" "^Subject:.*die\\|^Organization:.*flabby") - ("mail.other" ""))) -@end lisp - -This variable is a list of lists, where the first element of each of -these lists is the name of the mail group (they do not have to be called -something beginning with @samp{mail}, by the way), and the second -element is a regular expression used on the header of each mail to -determine if it belongs in this mail group. The first string may -contain @samp{\\1} forms, like the ones used by @code{replace-match} to -insert sub-expressions from the matched text. For instance: - -@lisp -("list.\\1" "From:.* \\(.*\\)-list@@majordomo.com") -@end lisp - -The second element can also be a function. In that case, it will be -called narrowed to the headers with the first element of the rule as the -argument. It should return a non-@code{nil} value if it thinks that the -mail belongs in that group. - -The last of these groups should always be a general one, and the regular -expression should @emph{always} be @samp{} so that it matches any mails -that haven't been matched by any of the other regexps. (These rules are -processed from the beginning of the alist toward the end. The first -rule to make a match will "win", unless you have crossposting enabled. -In that case, all matching rules will "win".) - -If you like to tinker with this yourself, you can set this variable to a -function of your choice. This function will be called without any -arguments in a buffer narrowed to the headers of an incoming mail -message. The function should return a list of group names that it -thinks should carry this mail message. - -Note that the mail backends are free to maul the poor, innocent, -incoming headers all they want to. They all add @code{Lines} headers; -some add @code{X-Gnus-Group} headers; most rename the Unix mbox -@code{From} line to something else. - -@vindex nnmail-crosspost -The mail backends all support cross-posting. If several regexps match, -the mail will be ``cross-posted'' to all those groups. -@code{nnmail-crosspost} says whether to use this mechanism or not. Note -that no articles are crossposted to the general (@samp{}) group. - -@vindex nnmail-crosspost-link-function -@cindex crosspost -@cindex links -@code{nnmh} and @code{nnml} makes crossposts by creating hard links to -the crossposted articles. However, not all file systems support hard -links. If that's the case for you, set -@code{nnmail-crosspost-link-function} to @code{copy-file}. (This -variable is @code{add-name-to-file} by default.) - -@kindex M-x nnmail-split-history -@kindex nnmail-split-history -If you wish to see where the previous mail split put the messages, you -can use the @kbd{M-x nnmail-split-history} command. If you wish to see -where re-spooling messages would put the messages, you can use -@code{gnus-summary-respool-trace} and related commands (@pxref{Mail -Group Commands}). - -Gnus gives you all the opportunity you could possibly want for shooting -yourself in the foot. Let's say you create a group that will contain -all the mail you get from your boss. And then you accidentally -unsubscribe from the group. Gnus will still put all the mail from your -boss in the unsubscribed group, and so, when your boss mails you ``Have -that report ready by Monday or you're fired!'', you'll never see it and, -come Tuesday, you'll still believe that you're gainfully employed while -you really should be out collecting empty bottles to save up for next -month's rent money. - - -@node Mail Sources -@subsection Mail Sources - -Mail can be gotten from many different sources---the mail spool, from a -POP mail server, from a procmail directory, or from a maildir, for -instance. - -@menu -* 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. -@end menu - - -@node Mail Source Specifiers -@subsubsection Mail Source Specifiers -@cindex POP -@cindex mail server -@cindex procmail -@cindex mail spool -@cindex mail source - -You tell Gnus how to fetch mail by setting @code{mail-sources} -(@pxref{Fetching Mail}) to a @dfn{mail source specifier}. - -Here's an example: - -@lisp -(pop :server "pop3.mailserver.com" :user "myname") -@end lisp - -As can be observed, a mail source specifier is a list where the first -element is a @dfn{mail source type}, followed by an arbitrary number of -@dfn{keywords}. Keywords that are not explicitly specified are given -default values. - -The following mail source types are available: - -@table @code -@item file -Get mail from a single file; typically from the mail spool. - -Keywords: - -@table @code -@item :path -The path of the file. Defaults to the value of the @code{MAIL} -environment variable or @file{/usr/mail/spool/user-name}. -@end table - -An example file mail source: - -@lisp -(file :path "/usr/spool/mail/user-name") -@end lisp - -Or using the default path: - -@lisp -(file) -@end lisp - -If the mail spool file is not located on the local machine, it's best to -use POP or @sc{imap} or the like to fetch the mail. You can not use ange-ftp -file names here---it has no way to lock the mail spool while moving the -mail. - -If it's impossible to set up a proper server, you can use ssh instead. - -@lisp -(setq mail-sources - '((file :prescript "ssh host bin/getmail >%t"))) -@end lisp - -The @samp{getmail} script would look something like the following: - -@example -#!/bin/sh -# getmail - move mail from spool to stdout -# flu@@iki.fi - -MOVEMAIL=/usr/lib/emacs/20.3/i386-redhat-linux/movemail -TMP=$HOME/Mail/tmp -rm -f $TMP; $MOVEMAIL $MAIL $TMP >/dev/null && cat $TMP -@end example - -Alter this script to fit find the @samp{movemail} you want to use. - - -@item directory -Get mail from several files in a directory. This is typically used when -you have procmail split the incoming mail into several files. Setting -@code{nnmail-scan-directory-mail-source-once} to non-nil forces Gnus to -scan the mail source only once. This is particularly useful if you want -to scan mail groups at a specified level. - -Keywords: - -@table @code -@item :path -The path of the directory where the files are. There is no default -value. - -@item :suffix -Only files ending with this suffix are used. The default is -@samp{.spool}. - -@item :predicate -Only files that have this predicate return non-@code{nil} are returned. -The default is @code{identity}. This is used as an additional -filter---only files that have the right suffix @emph{and} satisfy this -predicate are considered. - -@item :prescript -@itemx :postscript -Script run before/after fetching mail. - -@end table - -An example directory mail source: - -@lisp -(directory :path "/home/user-name/procmail-dir/" - :suffix ".prcml") -@end lisp - -@item pop -Get mail from a POP server. - -Keywords: - -@table @code -@item :server -The name of the POP server. The default is taken from the -@code{MAILHOST} environment variable. - -@item :port -The port number of the POP server. This can be a number (eg, -@samp{:port 1234}) or a string (eg, @samp{:port "pop3"}). If it is a -string, it should be a service name as listed in @file{/etc/services} on -Unix systems. The default is @samp{"pop3"}. On some systems you might -need to specify it as @samp{"pop-3"} instead. - -@item :user -The user name to give to the POP server. The default is the login -name. - -@item :password -The password to give to the POP server. If not specified, the user is -prompted. - -@item :program -The program to use to fetch mail from the POP server. This should be -a @code{format}-like string. Here's an example: - -@example -fetchmail %u@@%s -P %p %t -@end example - -The valid format specifier characters are: - -@table @samp -@item t -The name of the file the mail is to be moved to. This must always be -included in this string. - -@item s -The name of the server. - -@item P -The port number of the server. - -@item u -The user name to use. - -@item p -The password to use. -@end table - -The values used for these specs are taken from the values you give the -corresponding keywords. - -@item :prescript -A script to be run before fetching the mail. The syntax is the same as -the @code{:program} keyword. This can also be a function to be run. - -@item :postscript -A script to be run after fetching the mail. The syntax is the same as -the @code{:program} keyword. This can also be a function to be run. - -@item :function -The function to use to fetch mail from the POP server. The function is -called with one parameter---the name of the file where the mail should -be moved to. - -@item :authentication -This can be either the symbol @code{password} or the symbol @code{apop} -and says what authentication scheme to use. The default is -@code{password}. - -@end table - -If the @code{:program} and @code{:function} keywords aren't specified, -@code{pop3-movemail} will be used. - -Here are some examples. Fetch from the default POP server, using the -default user name, and default fetcher: - -@lisp -(pop) -@end lisp - -Fetch from a named server with a named user and password: - -@lisp -(pop :server "my.pop.server" - :user "user-name" :password "secret") -@end lisp - -Use @samp{movemail} to move the mail: - -@lisp -(pop :program "movemail po:%u %t %p") -@end lisp - -@item maildir -Get mail from a maildir. This is a type of mailbox that is supported by -at least qmail and postfix, where each file in a special directory -contains exactly one mail. - -Keywords: - -@table @code -@item :path -The path of the directory where the mails are stored. The default is -taken from the @code{MAILDIR} environment variable or -@samp{~/Maildir/}. -@item :subdirs -The subdirectories of the Maildir. The default is -@samp{("new" "cur")}. - -@c If you sometimes look at your mail through a pop3 daemon before fetching -@c them with Gnus, you may also have to fetch your mails from the -@c @code{cur} directory inside the maildir, like in the first example -@c below. - -You can also get mails from remote hosts (because maildirs don't suffer -from locking problems). - -@end table - -Two example maildir mail sources: - -@lisp -(maildir :path "/home/user-name/Maildir/" - :subdirs ("cur" "new")) -@end lisp - -@lisp -(maildir :path "/user@@remotehost.org:~/Maildir/" - :subdirs ("new")) -@end lisp - -@item imap -Get mail from a @sc{imap} server. If you don't want to use @sc{imap} -as intended, as a network mail reading protocol (ie with nnimap), for -some reason or other, Gnus let you treat it similar to a POP server -and fetches articles from a given @sc{imap} mailbox. @xref{IMAP}, for -more information. - -Keywords: - -@table @code -@item :server -The name of the @sc{imap} server. The default is taken from the -@code{MAILHOST} environment variable. - -@item :port -The port number of the @sc{imap} server. The default is @samp{143}, or -@samp{993} for SSL connections. - -@item :user -The user name to give to the @sc{imap} server. The default is the login -name. - -@item :password -The password to give to the @sc{imap} server. If not specified, the user is -prompted. - -@item :stream -What stream to use for connecting to the server, this is one of the -symbols in @code{imap-stream-alist}. Right now, this means -@samp{kerberos4}, @samp{ssl} or the default @samp{network}. - -@item :authentication -Which authenticator to use for authenticating to the server, this is one -of the symbols in @code{imap-authenticator-alist}. Right now, this -means @samp{kerberos4}, @samp{cram-md5}, @samp{anonymous} or the default -@samp{login}. - -@item :program -When using the `shell' :stream, the contents of this variable is -mapped into the `imap-shell-program' variable. This should be a -@code{format}-like string (or list of strings). Here's an example: - -@example -ssh %s imapd -@end example - -The valid format specifier characters are: - -@table @samp -@item s -The name of the server. - -@item l -User name from `imap-default-user'. - -@item p -The port number of the server. -@end table - -The values used for these specs are taken from the values you give the -corresponding keywords. - -@item :mailbox -The name of the mailbox to get mail from. The default is @samp{INBOX} -which normally is the mailbox which receive incoming mail. - -@item :predicate -The predicate used to find articles to fetch. The default, @samp{UNSEEN -UNDELETED}, is probably the best choice for most people, but if you -sometimes peek in your mailbox with a @sc{imap} client and mark some -articles as read (or; SEEN) you might want to set this to @samp{nil}. -Then all articles in the mailbox is fetched, no matter what. For a -complete list of predicates, see RFC 2060 §6.4.4. - -@item :fetchflag -How to flag fetched articles on the server, the default @samp{\Deleted} -will mark them as deleted, an alternative would be @samp{\Seen} which -would simply mark them as read. These are the two most likely choices, -but more flags are defined in RFC 2060 §2.3.2. - -@item :dontexpunge -If non-nil, don't remove all articles marked as deleted in the mailbox -after finishing the fetch. - -@end table - -An example @sc{imap} mail source: - -@lisp -(imap :server "mail.mycorp.com" - :stream kerberos4 - :fetchflag "\\Seen") -@end lisp - -@item webmail -Get mail from a webmail server, such as www.hotmail.com, -webmail.netscape.com, www.netaddress.com, www.my-deja.com. - -NOTE: Now mail.yahoo.com provides POP3 service, so @sc{pop} mail source -is suggested. - -NOTE: Webmail largely depends cookies. A "one-line-cookie" patch is -required for url "4.0pre.46". - -WARNING: Mails may lost. NO WARRANTY. - -Keywords: - -@table @code -@item :subtype -The type of the webmail server. The default is @code{hotmail}. The -alternatives are @code{netscape}, @code{netaddress}, @code{my-deja}. - -@item :user -The user name to give to the webmail server. The default is the login -name. - -@item :password -The password to give to the webmail server. If not specified, the user is -prompted. - -@item :dontexpunge -If non-nil, only fetch unread articles and don't move them to trash -folder after finishing the fetch. - -@end table - -An example webmail source: - -@lisp -(webmail :subtype 'hotmail - :user "user-name" - :password "secret") -@end lisp -@end table - -@table @dfn -@item Common Keywords -Common keywords can be used in any type of mail source. - -Keywords: - -@table @code -@item :plugged -If non-nil, fetch the mail even when Gnus is unplugged. If you use -directory source to get mail, you can specify it as in this example: - -@lisp -(setq mail-sources - '((directory :path "/home/pavel/.Spool/" - :suffix "" - :plugged t))) -@end lisp - -Gnus will then fetch your mail even when you are unplugged. This is -useful when you use local mail and news. - -@end table -@end table - -@subsubsection Function Interface - -Some of the above keywords specify a Lisp function to be executed. -For each keyword @code{:foo}, the Lisp variable @code{foo} is bound to -the value of the keyword while the function is executing. For example, -consider the following mail-source setting: - -@lisp -(setq mail-sources '((pop :user "jrl" - :server "pophost" :function fetchfunc))) -@end lisp - -While the function @code{fetchfunc} is executing, the symbol @code{user} -is bound to @code{"jrl"}, and the symbol @code{server} is bound to -@code{"pophost"}. The symbols @code{port}, @code{password}, -@code{program}, @code{prescript}, @code{postscript}, @code{function}, -and @code{authentication} are also bound (to their default values). - -See above for a list of keywords for each type of mail source. - - -@node Mail Source Customization -@subsubsection Mail Source Customization - -The following is a list of variables that influence how the mail is -fetched. You would normally not need to set or change any of these -variables. - -@table @code -@item mail-source-crash-box -@vindex mail-source-crash-box -File where mail will be stored while processing it. The default is -@file{~/.emacs-mail-crash-box}. - -@item mail-source-delete-incoming -@vindex mail-source-delete-incoming -If non-@code{nil}, delete incoming files after handling them. - -@item mail-source-directory -@vindex mail-source-directory -Directory where files (if any) will be stored. The default is -@file{~/Mail/}. At present, the only thing this is used for is to say -where the incoming files will be stored if the previous variable is -@code{nil}. - -@item mail-source-incoming-file-prefix -@vindex mail-source-incoming-file-prefix -Prefix for file name for storing incoming mail. The default is -@file{Incoming}, in which case files will end up with names like -@file{Incoming30630D_} or @file{Incoming298602ZD}. This is really only -relevant if @code{mail-source-delete-incoming} is @code{nil}. - -@item mail-source-default-file-modes -@vindex mail-source-default-file-modes -All new mail files will get this file mode. The default is 384. - -@end table - - -@node Fetching Mail -@subsubsection Fetching Mail - -@vindex mail-sources -@vindex nnmail-spool-file -The way to actually tell Gnus where to get new mail from is to set -@code{mail-sources} to a list of mail source specifiers -(@pxref{Mail Source Specifiers}). - -If this variable (and the obsolescent @code{nnmail-spool-file}) is -@code{nil}, the mail backends will never attempt to fetch mail by -themselves. - -If you want to fetch mail both from your local spool as well as a POP -mail server, you'd say something like: - -@lisp -(setq mail-sources - '((file) - (pop :server "pop3.mail.server" - :password "secret"))) -@end lisp - -Or, if you don't want to use any of the keyword defaults: - -@lisp -(setq mail-sources - '((file :path "/var/spool/mail/user-name") - (pop :server "pop3.mail.server" - :user "user-name" - :port "pop3" - :password "secret"))) -@end lisp - - -When you use a mail backend, Gnus will slurp all your mail from your -inbox and plonk it down in your home directory. Gnus doesn't move any -mail if you're not using a mail backend---you have to do a lot of magic -invocations first. At the time when you have finished drawing the -pentagram, lightened the candles, and sacrificed the goat, you really -shouldn't be too surprised when Gnus moves your mail. - - - -@node Mail Backend Variables -@subsection Mail Backend Variables - -These variables are (for the most part) pertinent to all the various -mail backends. - -@table @code -@vindex nnmail-read-incoming-hook -@item nnmail-read-incoming-hook -The mail backends all call this hook after reading new mail. You can -use this hook to notify any mail watch programs, if you want to. - -@vindex nnmail-split-hook -@item nnmail-split-hook -@findex article-decode-encoded-words -@findex RFC 1522 decoding -@findex RFC 2047 decoding -Hook run in the buffer where the mail headers of each message is kept -just before the splitting based on these headers is done. The hook is -free to modify the buffer contents in any way it sees fit---the buffer -is discarded after the splitting has been done, and no changes performed -in the buffer will show up in any files. -@code{gnus-article-decode-encoded-words} is one likely function to add -to this hook. - -@vindex nnmail-pre-get-new-mail-hook -@vindex nnmail-post-get-new-mail-hook -@item nnmail-pre-get-new-mail-hook -@itemx nnmail-post-get-new-mail-hook -These are two useful hooks executed when treating new incoming -mail---@code{nnmail-pre-get-new-mail-hook} (is called just before -starting to handle the new mail) and -@code{nnmail-post-get-new-mail-hook} (is called when the mail handling -is done). Here's and example of using these two hooks to change the -default file modes the new mail files get: - -@lisp -(add-hook 'nnmail-pre-get-new-mail-hook - (lambda () (set-default-file-modes 511))) - -(add-hook 'nnmail-post-get-new-mail-hook - (lambda () (set-default-file-modes 551))) -@end lisp - -@item nnmail-use-long-file-names -@vindex nnmail-use-long-file-names -If non-@code{nil}, the mail backends will use long file and directory -names. Groups like @samp{mail.misc} will end up in directories -(assuming use of @code{nnml} backend) or files (assuming use of -@code{nnfolder} backend) like @file{mail.misc}. If it is @code{nil}, -the same group will end up in @file{mail/misc}. - -@item nnmail-delete-file-function -@vindex nnmail-delete-file-function -@findex delete-file -Function called to delete files. It is @code{delete-file} by default. - -@item nnmail-cache-accepted-message-ids -@vindex nnmail-cache-accepted-message-ids -If non-@code{nil}, put the @code{Message-ID}s of articles imported into -the backend (via @code{Gcc}, for instance) into the mail duplication -discovery cache. The default is @code{nil}. - -@end table - - -@node Fancy Mail Splitting -@subsection Fancy Mail Splitting -@cindex mail splitting -@cindex fancy mail splitting - -@vindex nnmail-split-fancy -@findex nnmail-split-fancy -If the rather simple, standard method for specifying how to split mail -doesn't allow you to do what you want, you can set -@code{nnmail-split-methods} to @code{nnmail-split-fancy}. Then you can -play with the @code{nnmail-split-fancy} variable. - -Let's look at an example value of this variable first: - -@lisp -;; Messages from the mailer daemon are not crossposted to any of -;; the ordinary groups. Warnings are put in a separate group -;; from real errors. -(| ("from" mail (| ("subject" "warn.*" "mail.warning") - "mail.misc")) - ;; Non-error messages are crossposted to all relevant - ;; groups, but we don't crosspost between the group for the - ;; (ding) list and the group for other (ding) related mail. - (& (| (any "ding@@ifi\\.uio\\.no" "ding.list") - ("subject" "ding" "ding.misc")) - ;; Other mailing lists... - (any "procmail@@informatik\\.rwth-aachen\\.de" "procmail.list") - (any "SmartList@@informatik\\.rwth-aachen\\.de" "SmartList.list") - ;; Both lists below have the same suffix, so prevent - ;; cross-posting to mkpkg.list of messages posted only to - ;; the bugs- list, but allow cross-posting when the - ;; message was really cross-posted. - (any "bugs-mypackage@@somewhere" "mypkg.bugs") - (any "mypackage@@somewhere\" - "bugs-mypackage" "mypkg.list") - ;; People... - (any "larsi@@ifi\\.uio\\.no" "people.Lars_Magne_Ingebrigtsen")) - ;; Unmatched mail goes to the catch all group. - "misc.misc") -@end lisp - -This variable has the format of a @dfn{split}. A split is a (possibly) -recursive structure where each split may contain other splits. Here are -the five possible split syntaxes: - -@enumerate - -@item -@samp{group}: If the split is a string, that will be taken as a group -name. Normal regexp match expansion will be done. See below for -examples. - -@item -@code{(@var{field} @var{value} @code{[-} @var{restrict} -@code{[@dots{}]}@code{]} @var{split})}: If the split is a list, the -first element of which is a string, then store the message as -specified by @var{split}, if header @var{field} (a regexp) contains -@var{value} (also a regexp). If @var{restrict} (yet another regexp) -matches some string after @var{field} and before the end of the -matched @var{value}, the @var{split} is ignored. If none of the -@var{restrict} clauses match, @var{split} is processed. - -@item -@code{(| @var{split}@dots{})}: If the split is a list, and the first -element is @code{|} (vertical bar), then process each @var{split} until -one of them matches. A @var{split} is said to match if it will cause -the mail message to be stored in one or more groups. - -@item -@code{(& @var{split}@dots{})}: If the split is a list, and the first -element is @code{&}, then process all @var{split}s in the list. - -@item -@code{junk}: If the split is the symbol @code{junk}, then don't save -this message. Use with extreme caution. - -@item -@code{(: @var{function} @var{arg1} @var{arg2} @dots{})}: If the split is -a list, and the first element is @code{:}, then the second element will -be called as a function with @var{args} given as arguments. The -function should return a @var{split}. - -@cindex body split -For instance, the following function could be used to split based on the -body of the messages: - -@lisp -(defun split-on-body () - (save-excursion - (set-buffer " *nnmail incoming*") - (goto-char (point-min)) - (when (re-search-forward "Some.*string" nil t) - "string.group"))) -@end lisp - -The @samp{" *nnmail incoming*"} is narrowed to the message in question -when the @code{:} function is run. - -@item -@code{(! @var{func} @var{split})}: If the split is a list, and the first -element is @code{!}, then SPLIT will be processed, and FUNC will be -called as a function with the result of SPLIT as argument. FUNC should -return a split. - -@item -@code{nil}: If the split is @code{nil}, it is ignored. - -@end enumerate - -In these splits, @var{field} must match a complete field name. -@var{value} must match a complete word according to the fundamental mode -syntax table. You can use @code{.*} in the regexps to match partial -field names or words. In other words, all @var{value}'s are wrapped in -@samp{\<} and @samp{\>} pairs. - -@vindex nnmail-split-abbrev-alist -@var{field} and @var{value} can also be lisp symbols, in that case they -are expanded as specified by the variable -@code{nnmail-split-abbrev-alist}. This is an alist of cons cells, where -the @code{car} of a cell contains the key, and the @code{cdr} contains the associated -value. - -@vindex nnmail-split-fancy-syntax-table -@code{nnmail-split-fancy-syntax-table} is the syntax table in effect -when all this splitting is performed. - -If you want to have Gnus create groups dynamically based on some -information in the headers (i.e., do @code{replace-match}-like -substitutions in the group names), you can say things like: - -@example -(any "debian-\\b\\(\\w+\\)@@lists.debian.org" "mail.debian.\\1") -@end example - -In this example, messages sent to @samp{debian-foo@@lists.debian.org} -will be filed in @samp{mail.debian.foo}. - -If the string contains the element @samp{\&}, then the previously -matched string will be substituted. Similarly, the elements @samp{\\1} -up to @samp{\\9} will be substituted with the text matched by the -groupings 1 through 9. - -@findex nnmail-split-fancy-with-parent -@code{nnmail-split-fancy-with-parent} is a function which allows you to -split followups into the same groups their parents are in. Sometimes -you can't make splitting rules for all your mail. For example, your -boss might send you personal mail regarding different projects you are -working on, and as you can't tell your boss to put a distinguishing -string into the subject line, you have to resort to manually moving the -messages into the right group. With this function, you only have to do -it once per thread. - -To use this feature, you have to set @code{nnmail-treat-duplicates} and -@code{nnmail-cache-accepted-message-ids} to a non-nil value. And then -you can include @code{nnmail-split-fancy-with-parent} using the colon -feature, like so: -@lisp -(setq nnmail-split-fancy - '(| (: nnmail-split-fancy-with-parent) - ;; other splits go here - )) -@end lisp - -This feature works as follows: when @code{nnmail-treat-duplicates} is -non-nil, Gnus records the message id of every message it sees in the -file specified by the variable @code{nnmail-message-id-cache-file}, -together with the group it is in (the group is omitted for non-mail -messages). When mail splitting is invoked, the function -@code{nnmail-split-fancy-with-parent} then looks at the References (and -In-Reply-To) header of each message to split and searches the file -specified by @code{nnmail-message-id-cache-file} for the message ids. -When it has found a parent, it returns the corresponding group name -unless the group name matches the regexp -@code{nnmail-split-fancy-with-parent-ignore-groups}. It is recommended -that you set @code{nnmail-message-id-cache-length} to a somewhat higher -number than the default so that the message ids are still in the cache. -(A value of 5000 appears to create a file some 300 kBytes in size.) -@vindex nnmail-cache-accepted-message-ids -When @code{nnmail-cache-accepted-message-ids} is non-@code{nil}, Gnus -also records the message ids of moved articles, so that the followup -messages goes into the new group. - - -@node Group Mail Splitting -@subsection Group Mail Splitting -@cindex mail splitting -@cindex group mail splitting - -@findex gnus-group-split -If you subscribe to dozens of mailing lists but you don't want to -maintain mail splitting rules manually, group mail splitting is for you. -You just have to set @var{to-list} and/or @var{to-address} in group -parameters or group customization and set @code{nnmail-split-methods} to -@code{gnus-group-split}. This splitting function will scan all groups -for those parameters and split mail accordingly, i.e., messages posted -from or to the addresses specified in the parameters @var{to-list} or -@var{to-address} of a mail group will be stored in that group. - -Sometimes, mailing lists have multiple addresses, and you may want mail -splitting to recognize them all: just set the @var{extra-aliases} group -parameter to the list of additional addresses and it's done. If you'd -rather use a regular expression, set @var{split-regexp}. - -All these parameters in a group will be used to create an -@code{nnmail-split-fancy} split, in which the @var{field} is @samp{any}, -the @var{value} is a single regular expression that matches -@var{to-list}, @var{to-address}, all of @var{extra-aliases} and all -matches of @var{split-regexp}, and the @var{split} is the name of the -group. @var{restrict}s are also supported: just set the -@var{split-exclude} parameter to a list of regular expressions. - -If you can't get the right split to be generated using all these -parameters, or you just need something fancier, you can set the -parameter @var{split-spec} to an @code{nnmail-split-fancy} split. In -this case, all other aforementioned parameters will be ignored by -@code{gnus-group-split}. In particular, @var{split-spec} may be set to -@code{nil}, in which case the group will be ignored by -@code{gnus-group-split}. - -@vindex gnus-group-split-default-catch-all-group -@code{gnus-group-split} will do cross-posting on all groups that match, -by defining a single @code{&} fancy split containing one split for each -group. If a message doesn't match any split, it will be stored in the -group named in @code{gnus-group-split-default-catch-all-group}, unless -some group has @var{split-spec} set to @code{catch-all}, in which case -that group is used as the catch-all group. Even though this variable is -often used just to name a group, it may also be set to an arbitrarily -complex fancy split (after all, a group name is a fancy split), and this -may be useful to split mail that doesn't go to any mailing list to -personal mail folders. Note that this fancy split is added as the last -element of a @code{|} split list that also contains a @code{&} split -with the rules extracted from group parameters. - -It's time for an example. Assume the following group parameters have -been defined: - -@example -nnml:mail.bar: -((to-address . "bar@@femail.com") - (split-regexp . ".*@@femail\\.com")) -nnml:mail.foo: -((to-list . "foo@@nowhere.gov") - (extra-aliases "foo@@localhost" "foo-redist@@home") - (split-exclude "bugs-foo" "rambling-foo") - (admin-address . "foo-request@@nowhere.gov")) -nnml:mail.others: -((split-spec . catch-all)) -@end example - -Setting @code{nnmail-split-methods} to @code{gnus-group-split} will -behave as if @code{nnmail-split-fancy} had been selected and variable -@code{nnmail-split-fancy} had been set as follows: - -@lisp -(| (& (any "\\(bar@@femail\\.com\\|.*@@femail\\.com\\)" "mail.bar") - (any "\\(foo@@nowhere\\.gov\\|foo@@localhost\\|foo-redist@@home\\)" - - "bugs-foo" - "rambling-foo" "mail.foo")) - "mail.others") -@end lisp - -@findex gnus-group-split-fancy -If you'd rather not use group splitting for all your mail groups, you -may use it for only some of them, by using @code{nnmail-split-fancy} -splits like this: - -@lisp -(: gnus-mlsplt-fancy GROUPS NO-CROSSPOST CATCH-ALL) -@end lisp - -@var{groups} may be a regular expression or a list of group names whose -parameters will be scanned to generate the output split. -@var{no-crosspost} can be used to disable cross-posting; in this case, a -single @code{|} split will be output. @var{catch-all} is the fallback -fancy split, used like @var{gnus-group-split-default-catch-all-group}. -If @var{catch-all} is @code{nil}, or if @var{split-regexp} matches the -empty string in any selected group, no catch-all split will be issued. -Otherwise, if some group has @var{split-spec} set to @code{catch-all}, -this group will override the value of the @var{catch-all} argument. - -@findex gnus-group-split-setup -Unfortunately, scanning all groups and their parameters can be quite -slow, especially considering that it has to be done for every message. -But don't despair! The function @code{gnus-group-split-setup} can be -used to enable @code{gnus-group-split} in a much more efficient way. It -sets @code{nnmail-split-methods} to @code{nnmail-split-fancy} and sets -@code{nnmail-split-fancy} to the split produced by -@code{gnus-group-split-fancy}. Thus, the group parameters are only -scanned once, no matter how many messages are split. - -@findex gnus-group-split-update -However, if you change group parameters, you'd have to update -@code{nnmail-split-fancy} manually. You can do it by running -@code{gnus-group-split-update}. If you'd rather have it updated -automatically, just tell @code{gnus-group-split-setup} to do it for -you. For example, add to your @file{.gnus}: - -@lisp -(gnus-group-split-setup AUTO-UPDATE CATCH-ALL) -@end lisp - -If @var{auto-update} is non-@code{nil}, @code{gnus-group-split-update} -will be added to @code{nnmail-pre-get-new-mail-hook}, so you won't ever -have to worry about updating @code{nnmail-split-fancy} again. If you -don't omit @var{catch-all} (it's optional, equivalent to @code{nil}), -@code{gnus-group-split-default-catch-all-group} will be set to its -value. - -@vindex gnus-group-split-updated-hook -Because you may want to change @code{nnmail-split-fancy} after it is set -by @code{gnus-group-split-update}, this function will run -@code{gnus-group-split-updated-hook} just before finishing. - -@node Incorporating Old Mail -@subsection Incorporating Old Mail -@cindex incorporating old mail -@cindex import old mail - -Most people have lots of old mail stored in various file formats. If -you have set up Gnus to read mail using one of the spiffy Gnus mail -backends, you'll probably wish to have that old mail incorporated into -your mail groups. - -Doing so can be quite easy. - -To take an example: You're reading mail using @code{nnml} -(@pxref{Mail Spool}), and have set @code{nnmail-split-methods} to a -satisfactory value (@pxref{Splitting Mail}). You have an old Unix mbox -file filled with important, but old, mail. You want to move it into -your @code{nnml} groups. - -Here's how: - -@enumerate -@item -Go to the group buffer. - -@item -Type `G f' and give the path to the mbox file when prompted to create an -@code{nndoc} group from the mbox file (@pxref{Foreign Groups}). - -@item -Type `SPACE' to enter the newly created group. - -@item -Type `M P b' to process-mark all articles in this group's buffer -(@pxref{Setting Process Marks}). - -@item -Type `B r' to respool all the process-marked articles, and answer -@samp{nnml} when prompted (@pxref{Mail Group Commands}). -@end enumerate - -All the mail messages in the mbox file will now also be spread out over -all your @code{nnml} groups. Try entering them and check whether things -have gone without a glitch. If things look ok, you may consider -deleting the mbox file, but I wouldn't do that unless I was absolutely -sure that all the mail has ended up where it should be. - -Respooling is also a handy thing to do if you're switching from one mail -backend to another. Just respool all the mail in the old mail groups -using the new mail backend. - - -@node Expiring Mail -@subsection Expiring Mail -@cindex article expiry - -Traditional mail readers have a tendency to remove mail articles when -you mark them as read, in some way. Gnus takes a fundamentally -different approach to mail reading. - -Gnus basically considers mail just to be news that has been received in -a rather peculiar manner. It does not think that it has the power to -actually change the mail, or delete any mail messages. If you enter a -mail group, and mark articles as ``read'', or kill them in some other -fashion, the mail articles will still exist on the system. I repeat: -Gnus will not delete your old, read mail. Unless you ask it to, of -course. - -To make Gnus get rid of your unwanted mail, you have to mark the -articles as @dfn{expirable}. This does not mean that the articles will -disappear right away, however. In general, a mail article will be -deleted from your system if, 1) it is marked as expirable, AND 2) it is -more than one week old. If you do not mark an article as expirable, it -will remain on your system until hell freezes over. This bears -repeating one more time, with some spurious capitalizations: IF you do -NOT mark articles as EXPIRABLE, Gnus will NEVER delete those ARTICLES. - -@vindex gnus-auto-expirable-newsgroups -You do not have to mark articles as expirable by hand. Groups that -match the regular expression @code{gnus-auto-expirable-newsgroups} will -have all articles that you read marked as expirable automatically. All -articles marked as expirable have an @samp{E} in the first -column in the summary buffer. - -By default, if you have auto expiry switched on, Gnus will mark all the -articles you read as expirable, no matter if they were read or unread -before. To avoid having articles marked as read marked as expirable -automatically, you can put something like the following in your -@file{.gnus} file: - -@vindex gnus-mark-article-hook -@lisp -(remove-hook 'gnus-mark-article-hook - 'gnus-summary-mark-read-and-unread-as-read) -(add-hook 'gnus-mark-article-hook 'gnus-summary-mark-unread-as-read) -@end lisp - -Note that making a group auto-expirable doesn't mean that all read -articles are expired---only the articles marked as expirable -will be expired. Also note that using the @kbd{d} command won't make -articles expirable---only semi-automatic marking of articles as read will -mark the articles as expirable in auto-expirable groups. - -Let's say you subscribe to a couple of mailing lists, and you want the -articles you have read to disappear after a while: - -@lisp -(setq gnus-auto-expirable-newsgroups - "mail.nonsense-list\\|mail.nice-list") -@end lisp - -Another way to have auto-expiry happen is to have the element -@code{auto-expire} in the group parameters of the group. - -If you use adaptive scoring (@pxref{Adaptive Scoring}) and -auto-expiring, you'll have problems. Auto-expiring and adaptive scoring -don't really mix very well. - -@vindex nnmail-expiry-wait -The @code{nnmail-expiry-wait} variable supplies the default time an -expirable article has to live. Gnus starts counting days from when the -message @emph{arrived}, not from when it was sent. The default is seven -days. - -Gnus also supplies a function that lets you fine-tune how long articles -are to live, based on what group they are in. Let's say you want to -have one month expiry period in the @samp{mail.private} group, a one day -expiry period in the @samp{mail.junk} group, and a six day expiry period -everywhere else: - -@vindex nnmail-expiry-wait-function -@lisp -(setq nnmail-expiry-wait-function - (lambda (group) - (cond ((string= group "mail.private") - 31) - ((string= group "mail.junk") - 1) - ((string= group "important") - 'never) - (t - 6)))) -@end lisp - -The group names this function is fed are ``unadorned'' group -names---no @samp{nnml:} prefixes and the like. - -The @code{nnmail-expiry-wait} variable and -@code{nnmail-expiry-wait-function} function can either be a number (not -necessarily an integer) or one of the symbols @code{immediate} or -@code{never}. - -You can also use the @code{expiry-wait} group parameter to selectively -change the expiry period (@pxref{Group Parameters}). - -@vindex nnmail-expiry-target -The normal action taken when expiring articles is to delete them. -However, in some circumstances it might make more sense to move them to -other groups instead of deleting them. The variable @code{nnmail-expiry-target} -(and the @code{expiry-target} group parameter) controls this. The -variable supplies a default value for all groups, which can be -overridden for specific groups by the group parameter. -default value is @code{delete}, but this can also be a string (which -should be the name of the group the message should be moved to), or a -function (which will be called in a buffer narrowed to the message in -question, and with the name of the group being moved from as its -parameter) which should return a target -- either a group name or -@code{delete}. - -Here's an example for specifying a group name: -@lisp -(setq nnmail-expiry-target "nnml:expired") -@end lisp - - -@vindex nnmail-keep-last-article -If @code{nnmail-keep-last-article} is non-@code{nil}, Gnus will never -expire the final article in a mail newsgroup. This is to make life -easier for procmail users. - -@vindex gnus-total-expirable-newsgroups -By the way: That line up there, about Gnus never expiring non-expirable -articles, is a lie. If you put @code{total-expire} in the group -parameters, articles will not be marked as expirable, but all read -articles will be put through the expiry process. Use with extreme -caution. Even more dangerous is the -@code{gnus-total-expirable-newsgroups} variable. All groups that match -this regexp will have all read articles put through the expiry process, -which means that @emph{all} old mail articles in the groups in question -will be deleted after a while. Use with extreme caution, and don't come -crying to me when you discover that the regexp you used matched the -wrong group and all your important mail has disappeared. Be a -@emph{man}! Or a @emph{woman}! Whatever you feel more comfortable -with! So there! - -Most people make most of their mail groups total-expirable, though. - -@vindex gnus-inhibit-user-auto-expire -If @code{gnus-inhibit-user-auto-expire} is non-@code{nil}, user marking -commands will not mark an article as expirable, even if the group has -auto-expire turned on. - - -@node Washing Mail -@subsection Washing Mail -@cindex mail washing -@cindex list server brain damage -@cindex incoming mail treatment - -Mailers and list servers are notorious for doing all sorts of really, -really stupid things with mail. ``Hey, RFC 822 doesn't explicitly -prohibit us from adding the string @code{wE aRe ElItE!!!!!1!!} to the -end of all lines passing through our server, so let's do that!!!!1!'' -Yes, but RFC 822 wasn't designed to be read by morons. Things that were -considered to be self-evident were not discussed. So. Here we are. - -Case in point: The German version of Microsoft Exchange adds @samp{AW: -} to the subjects of replies instead of @samp{Re: }. I could pretend to -be shocked and dismayed by this, but I haven't got the energy. It is to -laugh. - -Gnus provides a plethora of functions for washing articles while -displaying them, but it might be nicer to do the filtering before -storing the mail to disc. For that purpose, we have three hooks and -various functions that can be put in these hooks. - -@table @code -@item nnmail-prepare-incoming-hook -@vindex nnmail-prepare-incoming-hook -This hook is called before doing anything with the mail and is meant for -grand, sweeping gestures. It is called in a buffer that contains all -the new, incoming mail. Functions to be used include: - -@table @code -@item nnheader-ms-strip-cr -@findex nnheader-ms-strip-cr -Remove trailing carriage returns from each line. This is default on -Emacs running on MS machines. - -@end table - -@item nnmail-prepare-incoming-header-hook -@vindex nnmail-prepare-incoming-header-hook -This hook is called narrowed to each header. It can be used when -cleaning up the headers. Functions that can be used include: - -@table @code -@item nnmail-remove-leading-whitespace -@findex nnmail-remove-leading-whitespace -Clear leading white space that ``helpful'' listservs have added to the -headers to make them look nice. Aaah. - -@item nnmail-remove-list-identifiers -@findex nnmail-remove-list-identifiers -Some list servers add an identifier---for example, @samp{(idm)}---to the -beginning of all @code{Subject} headers. I'm sure that's nice for -people who use stone age mail readers. This function will remove -strings that match the @code{nnmail-list-identifiers} regexp, which can -also be a list of regexp. @code{nnmail-list-identifiers} may not contain -@code{\\(..\\)}. - -For instance, if you want to remove the @samp{(idm)} and the -@samp{nagnagnag} identifiers: - -@lisp -(setq nnmail-list-identifiers - '("(idm)" "nagnagnag")) -@end lisp - -This can also be done non-destructively with -@code{gnus-list-identifiers}, @xref{Article Hiding}. - -@item nnmail-remove-tabs -@findex nnmail-remove-tabs -Translate all @samp{TAB} characters into @samp{SPACE} characters. - -@item nnmail-fix-eudora-headers -@findex nnmail-fix-eudora-headers -@cindex Eudora -Eudora produces broken @code{References} headers, but OK -@code{In-Reply-To} headers. This function will get rid of the -@code{References} headers. - -@end table - -@item nnmail-prepare-incoming-message-hook -@vindex nnmail-prepare-incoming-message-hook -This hook is called narrowed to each message. Functions to be used -include: - -@table @code -@item article-de-quoted-unreadable -@findex article-de-quoted-unreadable -Decode Quoted Readable encoding. - -@end table -@end table - - -@node Duplicates -@subsection Duplicates - -@vindex nnmail-treat-duplicates -@vindex nnmail-message-id-cache-length -@vindex nnmail-message-id-cache-file -@cindex duplicate mails -If you are a member of a couple of mailing lists, you will sometimes -receive two copies of the same mail. This can be quite annoying, so -@code{nnmail} checks for and treats any duplicates it might find. To do -this, it keeps a cache of old @code{Message-ID}s--- -@code{nnmail-message-id-cache-file}, which is @file{~/.nnmail-cache} by -default. The approximate maximum number of @code{Message-ID}s stored -there is controlled by the @code{nnmail-message-id-cache-length} -variable, which is 1000 by default. (So 1000 @code{Message-ID}s will be -stored.) If all this sounds scary to you, you can set -@code{nnmail-treat-duplicates} to @code{warn} (which is what it is by -default), and @code{nnmail} won't delete duplicate mails. Instead it -will insert a warning into the head of the mail saying that it thinks -that this is a duplicate of a different message. - -This variable can also be a function. If that's the case, the function -will be called from a buffer narrowed to the message in question with -the @code{Message-ID} as a parameter. The function must return either -@code{nil}, @code{warn}, or @code{delete}. - -You can turn this feature off completely by setting the variable to -@code{nil}. - -If you want all the duplicate mails to be put into a special -@dfn{duplicates} group, you could do that using the normal mail split -methods: - -@lisp -(setq nnmail-split-fancy - '(| ;; Messages duplicates go to a separate group. - ("gnus-warning" "duplicat\\(e\\|ion\\) of message" "duplicate") - ;; Message from daemons, postmaster, and the like to another. - (any mail "mail.misc") - ;; Other rules. - [ ... ] )) -@end lisp - -Or something like: -@lisp -(setq nnmail-split-methods - '(("duplicates" "^Gnus-Warning:.*duplicate") - ;; Other rules. - [...])) -@end lisp - -Here's a neat feature: If you know that the recipient reads her mail -with Gnus, and that she has @code{nnmail-treat-duplicates} set to -@code{delete}, you can send her as many insults as you like, just by -using a @code{Message-ID} of a mail that you know that she's already -received. Think of all the fun! She'll never see any of it! Whee! - - -@node Not Reading Mail -@subsection Not Reading Mail - -If you start using any of the mail backends, they have the annoying -habit of assuming that you want to read mail with them. This might not -be unreasonable, but it might not be what you want. - -If you set @code{mail-sources} and @code{nnmail-spool-file} to -@code{nil}, none of the backends will ever attempt to read incoming -mail, which should help. - -@vindex nnbabyl-get-new-mail -@vindex nnmbox-get-new-mail -@vindex nnml-get-new-mail -@vindex nnmh-get-new-mail -@vindex nnfolder-get-new-mail -This might be too much, if, for instance, you are reading mail quite -happily with @code{nnml} and just want to peek at some old @sc{rmail} -file you have stashed away with @code{nnbabyl}. All backends have -variables called backend-@code{get-new-mail}. If you want to disable -the @code{nnbabyl} mail reading, you edit the virtual server for the -group to have a setting where @code{nnbabyl-get-new-mail} to @code{nil}. - -All the mail backends will call @code{nn}*@code{-prepare-save-mail-hook} -narrowed to the article to be saved before saving it when reading -incoming mail. - - -@node Choosing a Mail Backend -@subsection Choosing a Mail Backend - -Gnus will read the mail spool when you activate a mail group. The mail -file is first copied to your home directory. What happens after that -depends on what format you want to store your mail in. - -There are five different mail backends in the standard Gnus, and more -backends are available separately. The mail backend most people use -(because it is the fastest and most flexible) is @code{nnml} -(@pxref{Mail Spool}). - -@menu -* 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. -@end menu - - -@node Unix Mail Box -@subsubsection Unix Mail Box -@cindex nnmbox -@cindex unix mail box - -@vindex nnmbox-active-file -@vindex nnmbox-mbox-file -The @dfn{nnmbox} backend will use the standard Un*x mbox file to store -mail. @code{nnmbox} will add extra headers to each mail article to say -which group it belongs in. - -Virtual server settings: - -@table @code -@item nnmbox-mbox-file -@vindex nnmbox-mbox-file -The name of the mail box in the user's home directory. Default is -@file{~/mbox}. - -@item nnmbox-active-file -@vindex nnmbox-active-file -The name of the active file for the mail box. Default is -@file{~/.mbox-active}. - -@item nnmbox-get-new-mail -@vindex nnmbox-get-new-mail -If non-@code{nil}, @code{nnmbox} will read incoming mail and split it -into groups. Default is @code{t}. -@end table - - -@node Rmail Babyl -@subsubsection Rmail Babyl -@cindex nnbabyl -@cindex rmail mbox - -@vindex nnbabyl-active-file -@vindex nnbabyl-mbox-file -The @dfn{nnbabyl} backend will use a babyl mail box (aka. @dfn{rmail -mbox}) to store mail. @code{nnbabyl} will add extra headers to each -mail article to say which group it belongs in. - -Virtual server settings: - -@table @code -@item nnbabyl-mbox-file -@vindex nnbabyl-mbox-file -The name of the rmail mbox file. The default is @file{~/RMAIL} - -@item nnbabyl-active-file -@vindex nnbabyl-active-file -The name of the active file for the rmail box. The default is -@file{~/.rmail-active} - -@item nnbabyl-get-new-mail -@vindex nnbabyl-get-new-mail -If non-@code{nil}, @code{nnbabyl} will read incoming mail. Default is -@code{t} -@end table - - -@node Mail Spool -@subsubsection Mail Spool -@cindex nnml -@cindex mail @sc{nov} spool - -The @dfn{nnml} spool mail format isn't compatible with any other known -format. It should be used with some caution. - -@vindex nnml-directory -If you use this backend, Gnus will split all incoming mail into files, -one file for each mail, and put the articles into the corresponding -directories under the directory specified by the @code{nnml-directory} -variable. The default value is @file{~/Mail/}. - -You do not have to create any directories beforehand; Gnus will take -care of all that. - -If you have a strict limit as to how many files you are allowed to store -in your account, you should not use this backend. As each mail gets its -own file, you might very well occupy thousands of inodes within a few -weeks. If this is no problem for you, and it isn't a problem for you -having your friendly systems administrator walking around, madly, -shouting ``Who is eating all my inodes?! Who? Who!?!'', then you should -know that this is probably the fastest format to use. You do not have -to trudge through a big mbox file just to read your new mail. - -@code{nnml} is probably the slowest backend when it comes to article -splitting. It has to create lots of files, and it also generates -@sc{nov} databases for the incoming mails. This makes it the fastest -backend when it comes to reading mail. - -@cindex self contained nnml servers -When the marks file is used (which it is by default), @code{nnml} -servers have the property that you may backup them using @code{tar} or -similar, and later be able to restore them into Gnus (by adding the -proper @code{nnml} server) and have all your marks be preserved. Marks -for a group is usually stored in the @code{.marks} file (but see -@code{nnml-marks-file-name}) within each @code{nnml} group's directory. -Individual @code{nnml} groups are also possible to backup, use @kbd{G m} -to restore the group (after restoring the backup into the nnml -directory). - -Virtual server settings: - -@table @code -@item nnml-directory -@vindex nnml-directory -All @code{nnml} directories will be placed under this directory. -The default is the value of `message-directory' (whose default value is -@file{~/Mail}). - -@item nnml-active-file -@vindex nnml-active-file -The active file for the @code{nnml} server. The default is -@file{~/Mail/active"}. - -@item nnml-newsgroups-file -@vindex nnml-newsgroups-file -The @code{nnml} group descriptions file. @xref{Newsgroups File -Format}. The default is @file{~/Mail/newsgroups"}. - -@item nnml-get-new-mail -@vindex nnml-get-new-mail -If non-@code{nil}, @code{nnml} will read incoming mail. The default is -@code{t}. - -@item nnml-nov-is-evil -@vindex nnml-nov-is-evil -If non-@code{nil}, this backend will ignore any @sc{nov} files. The -default is @code{nil}. - -@item nnml-nov-file-name -@vindex nnml-nov-file-name -The name of the @sc{nov} files. The default is @file{.overview}. - -@item nnml-prepare-save-mail-hook -@vindex nnml-prepare-save-mail-hook -Hook run narrowed to an article before saving. - -@item nnml-marks-is-evil -@vindex nnml-marks-is-evil -If non-@code{nil}, this backend will ignore any @sc{marks} files. The -default is @code{nil}. - -@item nnml-marks-file-name -@vindex nnml-marks-file-name -The name of the @sc{marks} files. The default is @file{.marks}. - -@end table - -@findex nnml-generate-nov-databases -If your @code{nnml} groups and @sc{nov} files get totally out of whack, -you can do a complete update by typing @kbd{M-x -nnml-generate-nov-databases}. This command will trawl through the -entire @code{nnml} hierarchy, looking at each and every article, so it -might take a while to complete. A better interface to this -functionality can be found in the server buffer (@pxref{Server -Commands}). - - -@node MH Spool -@subsubsection MH Spool -@cindex nnmh -@cindex mh-e mail spool - -@code{nnmh} is just like @code{nnml}, except that is doesn't generate -@sc{nov} databases and it doesn't keep an active file or marks file. -This makes @code{nnmh} a @emph{much} slower backend than @code{nnml}, -but it also makes it easier to write procmail scripts for. - -Virtual server settings: - -@table @code -@item nnmh-directory -@vindex nnmh-directory -All @code{nnmh} directories will be located under this directory. The -default is the value of @code{message-directory} (whose default is -@file{~/Mail}) - -@item nnmh-get-new-mail -@vindex nnmh-get-new-mail -If non-@code{nil}, @code{nnmh} will read incoming mail. The default is -@code{t}. - -@item nnmh-be-safe -@vindex nnmh-be-safe -If non-@code{nil}, @code{nnmh} will go to ridiculous lengths to make -sure that the articles in the folder are actually what Gnus thinks they -are. It will check date stamps and stat everything in sight, so -setting this to @code{t} will mean a serious slow-down. If you never -use anything but Gnus to read the @code{nnmh} articles, you do not have -to set this variable to @code{t}. The default is @code{nil}. -@end table - - -@node Mail Folders -@subsubsection Mail Folders -@cindex nnfolder -@cindex mbox folders -@cindex mail folders - -@code{nnfolder} is a backend for storing each mail group in a separate -file. Each file is in the standard Un*x mbox format. @code{nnfolder} -will add extra headers to keep track of article numbers and arrival -dates. - -@cindex self contained nnfolder servers -When the marks file is used (which it is by default), @code{nnfolder} -servers have the property that you may backup them using @code{tar} or -similar, and later be able to restore them into Gnus (by adding the -proper @code{nnfolder} server) and have all your marks be preserved. -Marks for a group is usually stored in a file named as the mbox file -with @code{.mrk} concatenated to it (but see -@code{nnfolder-marks-file-suffix}) within the @code{nnfolder} directory. -Individual @code{nnfolder} groups are also possible to backup, use -@kbd{G m} to restore the group (after restoring the backup into the -@code{nnfolder} directory). - -Virtual server settings: - -@table @code -@item nnfolder-directory -@vindex nnfolder-directory -All the @code{nnfolder} mail boxes will be stored under this directory. -The default is the value of @code{message-directory} (whose default is -@file{~/Mail}) - -@item nnfolder-active-file -@vindex nnfolder-active-file -The name of the active file. The default is @file{~/Mail/active}. - -@item nnfolder-newsgroups-file -@vindex nnfolder-newsgroups-file -The name of the group descriptions file. @xref{Newsgroups File -Format}. The default is @file{~/Mail/newsgroups"} - -@item nnfolder-get-new-mail -@vindex nnfolder-get-new-mail -If non-@code{nil}, @code{nnfolder} will read incoming mail. The default -is @code{t} - -@item nnfolder-save-buffer-hook -@vindex nnfolder-save-buffer-hook -@cindex backup files -Hook run before saving the folders. Note that Emacs does the normal -backup renaming of files even with the @code{nnfolder} buffers. If you -wish to switch this off, you could say something like the following in -your @file{.emacs} file: - -@lisp -(defun turn-off-backup () - (set (make-local-variable 'backup-inhibited) t)) - -(add-hook 'nnfolder-save-buffer-hook 'turn-off-backup) -@end lisp - -@item nnfolder-delete-mail-hook -@vindex nnfolder-delete-mail-hook -Hook run in a buffer narrowed to the message that is to be deleted. -This function can be used to copy the message to somewhere else, or to -extract some information from it before removing it. - -@item nnfolder-nov-is-evil -@vindex nnfolder-nov-is-evil -If non-@code{nil}, this backend will ignore any @sc{nov} files. The -default is @code{nil}. - -@item nnfolder-nov-file-suffix -@vindex nnfolder-nov-file-suffix -The extension for @sc{nov} files. The default is @file{.nov}. - -@item nnfolder-marks-is-evil -@vindex nnfolder-marks-is-evil -If non-@code{nil}, this backend will ignore any @sc{marks} files. The -default is @code{nil}. - -@item nnfolder-marks-file-suffix -@vindex nnfolder-marks-file-suffix -The extension for @sc{marks} files. The default is @file{.mrk}. - -@end table - - -@findex nnfolder-generate-active-file -@kindex M-x nnfolder-generate-active-file -If you have lots of @code{nnfolder}-like files you'd like to read with -@code{nnfolder}, you can use the @kbd{M-x nnfolder-generate-active-file} -command to make @code{nnfolder} aware of all likely files in -@code{nnfolder-directory}. This only works if you use long file names, -though. - -@node Comparing Mail Backends -@subsubsection Comparing Mail Backends - -First, just for terminology, the @dfn{backend} is the common word for a -low-level access method---a transport, if you will, by which something -is acquired. The sense is that one's mail has to come from somewhere, -and so selection of a suitable backend is required in order to get that -mail within spitting distance of Gnus. - -The same concept exists for Usenet itself: Though access to articles is -typically done by @sc{nntp} these days, once upon a midnight dreary, everyone -in the world got at Usenet by running a reader on the machine where the -articles lay (the machine which today we call an @sc{nntp} server), and -access was by the reader stepping into the articles' directory spool -area directly. One can still select between either the @code{nntp} or -@code{nnspool} backends, to select between these methods, if one happens -actually to live on the server (or can see its spool directly, anyway, -via NFS). - -The goal in selecting a mail backend is to pick one which -simultaneously represents a suitable way of dealing with the original -format plus leaving mail in a form that is convenient to use in the -future. Here are some high and low points on each: - -@table @code -@item nnmbox - -UNIX systems have historically had a single, very common, and well- -defined format. All messages arrive in a single @dfn{spool file}, and -they are delineated by a line whose regular expression matches -@samp{^From_}. (My notational use of @samp{_} is to indicate a space, -to make it clear in this instance that this is not the RFC-specified -@samp{From:} header.) Because Emacs and therefore Gnus emanate -historically from the Unix environment, it is simplest if one does not -mess a great deal with the original mailbox format, so if one chooses -this backend, Gnus' primary activity in getting mail from the real spool -area to Gnus' preferred directory is simply to copy it, with no -(appreciable) format change in the process. It is the ``dumbest'' way -to move mail into availability in the Gnus environment. This makes it -fast to move into place, but slow to parse, when Gnus has to look at -what's where. - -@item nnbabyl - -Once upon a time, there was the DEC-10 and DEC-20, running operating -systems called TOPS and related things, and the usual (only?) mail -reading environment was a thing called Babyl. I don't know what format -was used for mail landing on the system, but Babyl had its own internal -format to which mail was converted, primarily involving creating a -spool-file-like entity with a scheme for inserting Babyl-specific -headers and status bits above the top of each message in the file. -RMAIL was Emacs' first mail reader, it was written by Richard Stallman, -and Stallman came out of that TOPS/Babyl environment, so he wrote RMAIL -to understand the mail files folks already had in existence. Gnus (and -VM, for that matter) continue to support this format because it's -perceived as having some good qualities in those mailer-specific -headers/status bits stuff. RMAIL itself still exists as well, of -course, and is still maintained by Stallman. - -Both of the above forms leave your mail in a single file on your -filesystem, and they must parse that entire file each time you take a -look at your mail. - -@item nnml - -@code{nnml} is the backend which smells the most as though you were -actually operating with an @code{nnspool}-accessed Usenet system. (In -fact, I believe @code{nnml} actually derived from @code{nnspool} code, -lo these years ago.) One's mail is taken from the original spool file, -and is then cut up into individual message files, 1:1. It maintains a -Usenet-style active file (analogous to what one finds in an INN- or -CNews-based news system in (for instance) @file{/var/lib/news/active}, -or what is returned via the @samp{NNTP LIST} verb) and also creates -@dfn{overview} files for efficient group entry, as has been defined for -@sc{nntp} servers for some years now. It is slower in mail-splitting, -due to the creation of lots of files, updates to the @code{nnml} active -file, and additions to overview files on a per-message basis, but it is -extremely fast on access because of what amounts to the indexing support -provided by the active file and overviews. - -@code{nnml} costs @dfn{inodes} in a big way; that is, it soaks up the -resource which defines available places in the filesystem to put new -files. Sysadmins take a dim view of heavy inode occupation within -tight, shared filesystems. But if you live on a personal machine where -the filesystem is your own and space is not at a premium, @code{nnml} -wins big. - -It is also problematic using this backend if you are living in a -FAT16-based Windows world, since much space will be wasted on all these -tiny files. - -@item nnmh - -The Rand MH mail-reading system has been around UNIX systems for a very -long time; it operates by splitting one's spool file of messages into -individual files, but with little or no indexing support -- @code{nnmh} -is considered to be semantically equivalent to ``@code{nnml} without -active file or overviews''. This is arguably the worst choice, because -one gets the slowness of individual file creation married to the -slowness of access parsing when learning what's new in one's groups. - -@item nnfolder - -Basically the effect of @code{nnfolder} is @code{nnmbox} (the first -method described above) on a per-group basis. That is, @code{nnmbox} -itself puts *all* one's mail in one file; @code{nnfolder} provides a -little bit of optimization to this so that each of one's mail groups has -a Unix mail box file. It's faster than @code{nnmbox} because each group -can be parsed separately, and still provides the simple Unix mail box -format requiring minimal effort in moving the mail around. In addition, -it maintains an ``active'' file making it much faster for Gnus to figure -out how many messages there are in each separate group. - -If you have groups that are expected to have a massive amount of -messages, @code{nnfolder} is not the best choice, but if you receive -only a moderate amount of mail, @code{nnfolder} is probably the most -friendly mail backend all over. - -@end table - - -@node Browsing the Web -@section Browsing the Web -@cindex web -@cindex browsing the web -@cindex www -@cindex http - -Web-based discussion forums are getting more and more popular. On many -subjects, the web-based forums have become the most important forums, -eclipsing the importance of mailing lists and news groups. The reason -is easy to understand---they are friendly to new users; you just point -and click, and there's the discussion. With mailing lists, you have to -go through a cumbersome subscription procedure, and most people don't -even know what a news group is. - -The problem with this scenario is that web browsers are not very good at -being newsreaders. They do not keep track of what articles you've read; -they do not allow you to score on subjects you're interested in; they do -not allow off-line browsing; they require you to click around and drive -you mad in the end. - -So---if web browsers suck at reading discussion forums, why not use Gnus -to do it instead? - -Gnus has been getting a bit of a collection of backends for providing -interfaces to these sources. - -@menu -* 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. -* RSS:: Reading RDF site summary. -* 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 -will fail. If you have reasonably new versions of these backends, -though, you should be ok. - -One thing all these Web methods have in common is that the Web sources -are often down, unavailable or just plain too slow to be fun. In those -cases, it makes a lot of sense to let the Gnus Agent (@pxref{Gnus -Unplugged}) handle downloading articles, and then you can read them at -leisure from your local disk. No more World Wide Wait for you. - -@node Archiving Mail -@subsection Archiving Mail -@cindex archiving mail -@cindex backup of mail - -Some of the backends, notably nnml and nnfolder, now actually store -the article marks with each group. For these servers, archiving and -restoring a group while preserving marks is fairly simple. - -(Preserving the group level and group parameters as well still -requires ritual dancing and sacrifices to the @code{.newsrc.eld} deity -though.) - -To archive an entire @code{nnml} or @code{nnfolder} server, take a -recursive copy of the server directory. There is no need to shut down -Gnus, so archiving may be invoked by @code{cron} or similar. You -restore the data by restoring the directory tree, and adding a server -definition pointing to that directory in Gnus. The @ref{Article -Backlog}, @ref{Asynchronous Fetching} and other things might interfer -with overwriting data, so you may want to shut down Gnus before you -restore the data. - -It is also possible to archive individual @code{nnml} or -@code{nnfolder} groups, while preserving marks. For @code{nnml}, you -copy all files in the group's directory. For @code{nnfolder} you need -to copy both the base folder file itself (@code{FOO}, say), and the -marks file (@code{FOO.mrk} in this example). Restoring the group is -done with @kbd{G m} from the Group buffer. The last step makes Gnus -notice the new directory. - -@node Web Searches -@subsection Web Searches -@cindex nnweb -@cindex DejaNews -@cindex Alta Vista -@cindex InReference -@cindex Usenet searches -@cindex searching the Usenet - -It's, like, too neat to search the Usenet for articles that match a -string, but it, like, totally @emph{sucks}, like, totally, to use one of -those, like, Web browsers, and you, like, have to, rilly, like, look at -the commercials, so, like, with Gnus you can do @emph{rad}, rilly, -searches without having to use a browser. - -The @code{nnweb} backend allows an easy interface to the mighty search -engine. You create an @code{nnweb} group, enter a search pattern, and -then enter the group and read the articles like you would any normal -group. The @kbd{G w} command in the group buffer (@pxref{Foreign -Groups}) will do this in an easy-to-use fashion. - -@code{nnweb} groups don't really lend themselves to being solid -groups---they have a very fleeting idea of article numbers. In fact, -each time you enter an @code{nnweb} group (not even changing the search -pattern), you are likely to get the articles ordered in a different -manner. Not even using duplicate suppression (@pxref{Duplicate -Suppression}) will help, since @code{nnweb} doesn't even know the -@code{Message-ID} of the articles before reading them using some search -engines (DejaNews, for instance). The only possible way to keep track -of which articles you've read is by scoring on the @code{Date} -header---mark all articles posted before the last date you read the -group as read. - -If the search engine changes its output substantially, @code{nnweb} -won't be able to parse it and will fail. One could hardly fault the Web -providers if they were to do this---their @emph{raison d'être} is to -make money off of advertisements, not to provide services to the -community. Since @code{nnweb} washes the ads off all the articles, one -might think that the providers might be somewhat miffed. We'll see. - -You must have the @code{url} and @code{w3} package installed to be able -to use @code{nnweb}. - -Virtual server variables: - -@table @code -@item nnweb-type -@vindex nnweb-type -What search engine type is being used. The currently supported types -are @code{dejanews}, @code{dejanewsold}, @code{altavista} and -@code{reference}. - -@item nnweb-search -@vindex nnweb-search -The search string to feed to the search engine. - -@item nnweb-max-hits -@vindex nnweb-max-hits -Advisory maximum number of hits per search to display. The default is -100. - -@item nnweb-type-definition -@vindex nnweb-type-definition -Type-to-definition alist. This alist says what @code{nnweb} should do -with the various search engine types. The following elements must be -present: - -@table @code -@item article -Function to decode the article and provide something that Gnus -understands. - -@item map -Function to create an article number to message header and URL alist. - -@item search -Function to send the search string to the search engine. - -@item address -The address the aforementioned function should send the search string -to. - -@item id -Format string URL to fetch an article by @code{Message-ID}. -@end table - -@end table - - -@node Slashdot -@subsection Slashdot -@cindex Slashdot -@cindex nnslashdot - -Slashdot (@uref{http://slashdot.org/}) is a popular news site, with -lively discussion following the news articles. @code{nnslashdot} will -let you read this forum in a convenient manner. - -The easiest way to read this source is to put something like the -following in your @file{.gnus.el} file: - -@lisp -(setq gnus-secondary-select-methods - '((nnslashdot ""))) -@end lisp - -This will make Gnus query the @code{nnslashdot} backend for new comments -and groups. The @kbd{F} command will subscribe each new news article as -a new Gnus group, and you can read the comments by entering these -groups. (Note that the default subscription method is to subscribe new -groups as zombies. Other methods are available (@pxref{Subscription -Methods}). - -If you want to remove an old @code{nnslashdot} group, the @kbd{G DEL} -command is the most handy tool (@pxref{Foreign Groups}). - -When following up to @code{nnslashdot} comments (or posting new -comments), some light @sc{html}izations will be performed. In -particular, text quoted with @samp{> } will be quoted with -@code{blockquote} instead, and signatures will have @code{br} added to -the end of each line. Other than that, you can just write @sc{html} -directly into the message buffer. Note that Slashdot filters out some -@sc{html} forms. - -The following variables can be altered to change its behavior: - -@table @code -@item nnslashdot-threaded -Whether @code{nnslashdot} should display threaded groups or not. The -default is @code{t}. To be able to display threads, @code{nnslashdot} -has to retrieve absolutely all comments in a group upon entry. If a -threaded display is not required, @code{nnslashdot} will only retrieve -the comments that are actually wanted by the user. Threading is nicer, -but much, much slower than untreaded. - -@item nnslashdot-login-name -@vindex nnslashdot-login-name -The login name to use when posting. - -@item nnslashdot-password -@vindex nnslashdot-password -The password to use when posting. - -@item nnslashdot-directory -@vindex nnslashdot-directory -Where @code{nnslashdot} will store its files. The default is -@samp{~/News/slashdot/}. - -@item nnslashdot-active-url -@vindex nnslashdot-active-url -The @sc{url} format string that will be used to fetch the information on -news articles and comments. The default is -@samp{http://slashdot.org/search.pl?section=&min=%d}. - -@item nnslashdot-comments-url -@vindex nnslashdot-comments-url -The @sc{url} format string that will be used to fetch comments. The -default is -@samp{http://slashdot.org/comments.pl?sid=%s&threshold=%d&commentsort=%d&mode=flat&startat=%d}. - -@item nnslashdot-article-url -@vindex nnslashdot-article-url -The @sc{url} format string that will be used to fetch the news article. The -default is -@samp{http://slashdot.org/article.pl?sid=%s&mode=nocomment}. - -@item nnslashdot-threshold -@vindex nnslashdot-threshold -The score threshold. The default is -1. - -@item nnslashdot-group-number -@vindex nnslashdot-group-number -The number of old groups, in addition to the ten latest, to keep -updated. The default is 0. - -@end table - - - -@node Ultimate -@subsection Ultimate -@cindex nnultimate -@cindex Ultimate Bulletin Board - -The Ultimate Bulletin Board (@uref{http://www.ultimatebb.com/}) is -probably the most popular Web bulletin board system used. It has a -quite regular and nice interface, and it's possible to get the -information Gnus needs to keep groups updated. - -The easiest way to get started with @code{nnultimate} is to say -something like the following in the group buffer: @kbd{B nnultimate RET -http://www.tcj.com/messboard/ubbcgi/ RET}. (Substitute the @sc{url} -(not including @samp{Ultimate.cgi} or the like at the end) for a forum -you're interested in; there's quite a list of them on the Ultimate web -site.) Then subscribe to the groups you're interested in from the -server buffer, and read them from the group buffer. - -The following @code{nnultimate} variables can be altered: - -@table @code -@item nnultimate-directory -@vindex nnultimate-directory -The directory where @code{nnultimate} stores its files. The default is -@samp{~/News/ultimate/}. -@end table - - -@node Web Archive -@subsection Web Archive -@cindex nnwarchive -@cindex Web Archive - -Some mailing lists only have archives on Web servers, such as -@uref{http://www.egroups.com/} and -@uref{http://www.mail-archive.com/}. It has a quite regular and nice -interface, and it's possible to get the information Gnus needs to keep -groups updated. - -The easiest way to get started with @code{nnwarchive} is to say -something like the following in the group buffer: @kbd{M-x -gnus-group-make-warchive-group RET an_egroup RET egroups RET -www.egroups.com RET your@@email.address RET}. (Substitute the -@sc{an_egroup} with the mailing list you subscribed, the -@sc{your@@email.address} with your email address.), or to browse the -backend by @kbd{B nnwarchive RET mail-archive RET}. - -The following @code{nnwarchive} variables can be altered: - -@table @code -@item nnwarchive-directory -@vindex nnwarchive-directory -The directory where @code{nnwarchive} stores its files. The default is -@samp{~/News/warchive/}. - -@item nnwarchive-login -@vindex nnwarchive-login -The account name on the web server. - -@item nnwarchive-passwd -@vindex nnwarchive-passwd -The password for your account on the web server. -@end table - -@node RSS -@subsection RSS -@cindex nnrss -@cindex RSS - -Some sites have RDF site summary (RSS) -@uref{http://purl.org/rss/1.0/spec}. It has a quite regular and nice -interface, and it's possible to get the information Gnus needs to keep -groups updated. - -The easiest way to get started with @code{nnrss} is to say something -like the following in the group buffer: @kbd{B nnrss RET RET}, then -subscribe groups. - -The following @code{nnrss} variables can be altered: - -@table @code -@item nnrss-directory -@vindex nnrss-directory -The directory where @code{nnrss} stores its files. The default is -@samp{~/News/rss/}. - -@end table - -The following code may be helpful, if you want to show the description in -the summary buffer. - -@lisp -(add-to-list 'nnmail-extra-headers nnrss-description-field) -(setq gnus-summary-line-format "%U%R%z%I%(%[%4L: %-15,15f%]%) %s%uX\n") - -(defun gnus-user-format-function-X (header) - (let ((descr - (assq nnrss-description-field (mail-header-extra header)))) - (if descr (concat "\n\t" (cdr descr)) ""))) -@end lisp - -The following code may be useful to open an nnrss url directly from the -summary buffer. -@lisp -(require 'browse-url) - -(defun browse-nnrss-url( arg ) - (interactive "p") - (let ((url (assq nnrss-url-field - (mail-header-extra - (gnus-data-header - (assq (gnus-summary-article-number) - gnus-newsgroup-data)))))) - (if url - (browse-url (cdr url)) - (gnus-summary-scroll-up arg)))) - -(eval-after-load "gnus" - #'(define-key gnus-summary-mode-map - (kbd "") 'browse-nnrss-url)) -(add-to-list 'nnmail-extra-headers nnrss-url-field) -@end lisp - -@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 - -Gnus can do more than just read news or mail. The methods described -below allow Gnus to view directories and files as if they were -newsgroups. - -@menu -* 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. -@end menu - - -@node Directory Groups -@subsection Directory Groups -@cindex nndir -@cindex directory groups - -If you have a directory that has lots of articles in separate files in -it, you might treat it as a newsgroup. The files have to have numerical -names, of course. - -This might be an opportune moment to mention @code{ange-ftp} (and its -successor @code{efs}), that most wonderful of all wonderful Emacs -packages. When I wrote @code{nndir}, I didn't think much about it---a -backend to read directories. Big deal. - -@code{ange-ftp} changes that picture dramatically. For instance, if you -enter the @code{ange-ftp} file name -@file{/ftp.hpc.uh.edu:/pub/emacs/ding-list/} as the directory name, -@code{ange-ftp} or @code{efs} will actually allow you to read this -directory over at @samp{sina} as a newsgroup. Distributed news ahoy! - -@code{nndir} will use @sc{nov} files if they are present. - -@code{nndir} is a ``read-only'' backend---you can't delete or expire -articles with this method. You can use @code{nnmh} or @code{nnml} for -whatever you use @code{nndir} for, so you could switch to any of those -methods if you feel the need to have a non-read-only @code{nndir}. - - -@node Anything Groups -@subsection Anything Groups -@cindex nneething - -From the @code{nndir} backend (which reads a single spool-like -directory), it's just a hop and a skip to @code{nneething}, which -pretends that any arbitrary directory is a newsgroup. Strange, but -true. - -When @code{nneething} is presented with a directory, it will scan this -directory and assign article numbers to each file. When you enter such -a group, @code{nneething} must create ``headers'' that Gnus can use. -After all, Gnus is a newsreader, in case you're forgetting. -@code{nneething} does this in a two-step process. First, it snoops each -file in question. If the file looks like an article (i.e., the first -few lines look like headers), it will use this as the head. If this is -just some arbitrary file without a head (e.g. a C source file), -@code{nneething} will cobble up a header out of thin air. It will use -file ownership, name and date and do whatever it can with these -elements. - -All this should happen automatically for you, and you will be presented -with something that looks very much like a newsgroup. Totally like a -newsgroup, to be precise. If you select an article, it will be displayed -in the article buffer, just as usual. - -If you select a line that represents a directory, Gnus will pop you into -a new summary buffer for this @code{nneething} group. And so on. You can -traverse the entire disk this way, if you feel like, but remember that -Gnus is not dired, really, and does not intend to be, either. - -There are two overall modes to this action---ephemeral or solid. When -doing the ephemeral thing (i.e., @kbd{G D} from the group buffer), Gnus -will not store information on what files you have read, and what files -are new, and so on. If you create a solid @code{nneething} group the -normal way with @kbd{G m}, Gnus will store a mapping table between -article numbers and file names, and you can treat this group like any -other groups. When you activate a solid @code{nneething} group, you will -be told how many unread articles it contains, etc., etc. - -Some variables: - -@table @code -@item nneething-map-file-directory -@vindex nneething-map-file-directory -All the mapping files for solid @code{nneething} groups will be stored -in this directory, which defaults to @file{~/.nneething/}. - -@item nneething-exclude-files -@vindex nneething-exclude-files -All files that match this regexp will be ignored. Nice to use to exclude -auto-save files and the like, which is what it does by default. - -@item nneething-include-files -@vindex nneething-include-files -Regexp saying what files to include in the group. If this variable is -non-@code{nil}, only files matching this regexp will be included. - -@item nneething-map-file -@vindex nneething-map-file -Name of the map files. -@end table - - -@node Document Groups -@subsection Document Groups -@cindex nndoc -@cindex documentation group -@cindex help group - -@code{nndoc} is a cute little thing that will let you read a single file -as a newsgroup. Several files types are supported: - -@table @code -@cindex babyl -@cindex rmail mbox - -@item babyl -The babyl (rmail) mail box. -@cindex mbox -@cindex Unix mbox - -@item mbox -The standard Unix mbox file. - -@cindex MMDF mail box -@item mmdf -The MMDF mail box format. - -@item news -Several news articles appended into a file. - -@item rnews -@cindex rnews batch files -The rnews batch transport format. -@cindex forwarded messages - -@item forward -Forwarded articles. - -@item nsmail -Netscape mail boxes. - -@item mime-parts -MIME multipart messages. - -@item standard-digest -The standard (RFC 1153) digest format. - -@item slack-digest -Non-standard digest format---matches most things, but does it badly. -@end table - -You can also use the special ``file type'' @code{guess}, which means -that @code{nndoc} will try to guess what file type it is looking at. -@code{digest} means that @code{nndoc} should guess what digest type the -file is. - -@code{nndoc} will not try to change the file or insert any extra headers into -it---it will simply, like, let you use the file as the basis for a -group. And that's it. - -If you have some old archived articles that you want to insert into your -new & spiffy Gnus mail backend, @code{nndoc} can probably help you with -that. Say you have an old @file{RMAIL} file with mail that you now want -to split into your new @code{nnml} groups. You look at that file using -@code{nndoc} (using the @kbd{G f} command in the group buffer -(@pxref{Foreign Groups})), set the process mark on all the articles in -the buffer (@kbd{M P b}, for instance), and then re-spool (@kbd{B r}) -using @code{nnml}. If all goes well, all the mail in the @file{RMAIL} -file is now also stored in lots of @code{nnml} directories, and you can -delete that pesky @file{RMAIL} file. If you have the guts! - -Virtual server variables: - -@table @code -@item nndoc-article-type -@vindex nndoc-article-type -This should be one of @code{mbox}, @code{babyl}, @code{digest}, -@code{news}, @code{rnews}, @code{mmdf}, @code{forward}, @code{rfc934}, -@code{rfc822-forward}, @code{mime-parts}, @code{standard-digest}, -@code{slack-digest}, @code{clari-briefs}, @code{nsmail} or @code{guess}. - -@item nndoc-post-type -@vindex nndoc-post-type -This variable says whether Gnus is to consider the group a news group or -a mail group. There are two valid values: @code{mail} (the default) -and @code{news}. -@end table - -@menu -* Document Server Internals:: How to add your own document types. -@end menu - - -@node Document Server Internals -@subsubsection Document Server Internals - -Adding new document types to be recognized by @code{nndoc} isn't -difficult. You just have to whip up a definition of what the document -looks like, write a predicate function to recognize that document type, -and then hook into @code{nndoc}. - -First, here's an example document type definition: - -@example -(mmdf - (article-begin . "^\^A\^A\^A\^A\n") - (body-end . "^\^A\^A\^A\^A\n")) -@end example - -The definition is simply a unique @dfn{name} followed by a series of -regexp pseudo-variable settings. Below are the possible -variables---don't be daunted by the number of variables; most document -types can be defined with very few settings: - -@table @code -@item first-article -If present, @code{nndoc} will skip past all text until it finds -something that match this regexp. All text before this will be -totally ignored. - -@item article-begin -This setting has to be present in all document type definitions. It -says what the beginning of each article looks like. - -@item head-begin-function -If present, this should be a function that moves point to the head of -the article. - -@item nndoc-head-begin -If present, this should be a regexp that matches the head of the -article. - -@item nndoc-head-end -This should match the end of the head of the article. It defaults to -@samp{^$}---the empty line. - -@item body-begin-function -If present, this function should move point to the beginning of the body -of the article. - -@item body-begin -This should match the beginning of the body of the article. It defaults -to @samp{^\n}. - -@item body-end-function -If present, this function should move point to the end of the body of -the article. - -@item body-end -If present, this should match the end of the body of the article. - -@item file-end -If present, this should match the end of the file. All text after this -regexp will be totally ignored. - -@end table - -So, using these variables @code{nndoc} is able to dissect a document -file into a series of articles, each with a head and a body. However, a -few more variables are needed since not all document types are all that -news-like---variables needed to transform the head or the body into -something that's palatable for Gnus: - -@table @code -@item prepare-body-function -If present, this function will be called when requesting an article. It -will be called with point at the start of the body, and is useful if the -document has encoded some parts of its contents. - -@item article-transform-function -If present, this function is called when requesting an article. It's -meant to be used for more wide-ranging transformation of both head and -body of the article. - -@item generate-head-function -If present, this function is called to generate a head that Gnus can -understand. It is called with the article number as a parameter, and is -expected to generate a nice head for the article in question. It is -called when requesting the headers of all articles. - -@end table - -Let's look at the most complicated example I can come up with---standard -digests: - -@example -(standard-digest - (first-article . ,(concat "^" (make-string 70 ?-) "\n\n+")) - (article-begin . ,(concat "\n\n" (make-string 30 ?-) "\n\n+")) - (prepare-body-function . nndoc-unquote-dashes) - (body-end-function . nndoc-digest-body-end) - (head-end . "^ ?$") - (body-begin . "^ ?\n") - (file-end . "^End of .*digest.*[0-9].*\n\\*\\*\\|^End of.*Digest *$") - (subtype digest guess)) -@end example - -We see that all text before a 70-width line of dashes is ignored; all -text after a line that starts with that @samp{^End of} is also ignored; -each article begins with a 30-width line of dashes; the line separating -the head from the body may contain a single space; and that the body is -run through @code{nndoc-unquote-dashes} before being delivered. - -To hook your own document definition into @code{nndoc}, use the -@code{nndoc-add-type} function. It takes two parameters---the first is -the definition itself and the second (optional) parameter says where in -the document type definition alist to put this definition. The alist is -traversed sequentially, and @code{nndoc-TYPE-type-p} is called for a given type @code{TYPE}. So @code{nndoc-mmdf-type-p} is called to see whether a document -is of @code{mmdf} type, and so on. These type predicates should return -@code{nil} if the document is not of the correct type; @code{t} if it is -of the correct type; and a number if the document might be of the -correct type. A high number means high probability; a low number means -low probability with @samp{0} being the lowest valid number. - - -@node SOUP -@subsection SOUP -@cindex SOUP -@cindex offline - -In the PC world people often talk about ``offline'' newsreaders. These -are thingies that are combined reader/news transport monstrosities. -With built-in modem programs. Yecchh! - -Of course, us Unix Weenie types of human beans use things like -@code{uucp} and, like, @code{nntpd} and set up proper news and mail -transport things like Ghod intended. And then we just use normal -newsreaders. - -However, it can sometimes be convenient to do something that's a bit -easier on the brain if you have a very slow modem, and you're not really -that interested in doing things properly. - -A file format called @sc{soup} has been developed for transporting news -and mail from servers to home machines and back again. It can be a bit -fiddly. - -First some terminology: - -@table @dfn - -@item server -This is the machine that is connected to the outside world and where you -get news and/or mail from. - -@item home machine -This is the machine that you want to do the actual reading and responding -on. It is typically not connected to the rest of the world in any way. - -@item packet -Something that contains messages and/or commands. There are two kinds -of packets: - -@table @dfn -@item message packets -These are packets made at the server, and typically contain lots of -messages for you to read. These are called @file{SoupoutX.tgz} by -default, where @var{x} is a number. - -@item response packets -These are packets made at the home machine, and typically contains -replies that you've written. These are called @file{SoupinX.tgz} by -default, where @var{x} is a number. - -@end table - -@end table - - -@enumerate - -@item -You log in on the server and create a @sc{soup} packet. You can either -use a dedicated @sc{soup} thingie (like the @code{awk} program), or you -can use Gnus to create the packet with its @sc{soup} commands (@kbd{O -s} and/or @kbd{G s b}; and then @kbd{G s p}) (@pxref{SOUP Commands}). - -@item -You transfer the packet home. Rail, boat, car or modem will do fine. - -@item -You put the packet in your home directory. - -@item -You fire up Gnus on your home machine using the @code{nnsoup} backend as -the native or secondary server. - -@item -You read articles and mail and answer and followup to the things you -want (@pxref{SOUP Replies}). - -@item -You do the @kbd{G s r} command to pack these replies into a @sc{soup} -packet. - -@item -You transfer this packet to the server. - -@item -You use Gnus to mail this packet out with the @kbd{G s s} command. - -@item -You then repeat until you die. - -@end enumerate - -So you basically have a bipartite system---you use @code{nnsoup} for -reading and Gnus for packing/sending these @sc{soup} packets. - -@menu -* 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. -@end menu - - -@node SOUP Commands -@subsubsection SOUP Commands - -These are commands for creating and manipulating @sc{soup} packets. - -@table @kbd -@item G s b -@kindex G s b (Group) -@findex gnus-group-brew-soup -Pack all unread articles in the current group -(@code{gnus-group-brew-soup}). This command understands the -process/prefix convention. - -@item G s w -@kindex G s w (Group) -@findex gnus-soup-save-areas -Save all @sc{soup} data files (@code{gnus-soup-save-areas}). - -@item G s s -@kindex G s s (Group) -@findex gnus-soup-send-replies -Send all replies from the replies packet -(@code{gnus-soup-send-replies}). - -@item G s p -@kindex G s p (Group) -@findex gnus-soup-pack-packet -Pack all files into a @sc{soup} packet (@code{gnus-soup-pack-packet}). - -@item G s r -@kindex G s r (Group) -@findex nnsoup-pack-replies -Pack all replies into a replies packet (@code{nnsoup-pack-replies}). - -@item O s -@kindex O s (Summary) -@findex gnus-soup-add-article -This summary-mode command adds the current article to a @sc{soup} packet -(@code{gnus-soup-add-article}). It understands the process/prefix -convention (@pxref{Process/Prefix}). - -@end table - - -There are a few variables to customize where Gnus will put all these -thingies: - -@table @code - -@item gnus-soup-directory -@vindex gnus-soup-directory -Directory where Gnus will save intermediate files while composing -@sc{soup} packets. The default is @file{~/SoupBrew/}. - -@item gnus-soup-replies-directory -@vindex gnus-soup-replies-directory -This is what Gnus will use as a temporary directory while sending our -reply packets. @file{~/SoupBrew/SoupReplies/} is the default. - -@item gnus-soup-prefix-file -@vindex gnus-soup-prefix-file -Name of the file where Gnus stores the last used prefix. The default is -@samp{gnus-prefix}. - -@item gnus-soup-packer -@vindex gnus-soup-packer -A format string command for packing a @sc{soup} packet. The default is -@samp{tar cf - %s | gzip > $HOME/Soupout%d.tgz}. - -@item gnus-soup-unpacker -@vindex gnus-soup-unpacker -Format string command for unpacking a @sc{soup} packet. The default is -@samp{gunzip -c %s | tar xvf -}. - -@item gnus-soup-packet-directory -@vindex gnus-soup-packet-directory -Where Gnus will look for reply packets. The default is @file{~/}. - -@item gnus-soup-packet-regexp -@vindex gnus-soup-packet-regexp -Regular expression matching @sc{soup} reply packets in -@code{gnus-soup-packet-directory}. - -@end table - - -@node SOUP Groups -@subsubsection @sc{soup} Groups -@cindex nnsoup - -@code{nnsoup} is the backend for reading @sc{soup} packets. It will -read incoming packets, unpack them, and put them in a directory where -you can read them at leisure. - -These are the variables you can use to customize its behavior: - -@table @code - -@item nnsoup-tmp-directory -@vindex nnsoup-tmp-directory -When @code{nnsoup} unpacks a @sc{soup} packet, it does it in this -directory. (@file{/tmp/} by default.) - -@item nnsoup-directory -@vindex nnsoup-directory -@code{nnsoup} then moves each message and index file to this directory. -The default is @file{~/SOUP/}. - -@item nnsoup-replies-directory -@vindex nnsoup-replies-directory -All replies will be stored in this directory before being packed into a -reply packet. The default is @file{~/SOUP/replies/"}. - -@item nnsoup-replies-format-type -@vindex nnsoup-replies-format-type -The @sc{soup} format of the replies packets. The default is @samp{?n} -(rnews), and I don't think you should touch that variable. I probably -shouldn't even have documented it. Drats! Too late! - -@item nnsoup-replies-index-type -@vindex nnsoup-replies-index-type -The index type of the replies packet. The default is @samp{?n}, which -means ``none''. Don't fiddle with this one either! - -@item nnsoup-active-file -@vindex nnsoup-active-file -Where @code{nnsoup} stores lots of information. This is not an ``active -file'' in the @code{nntp} sense; it's an Emacs Lisp file. If you lose -this file or mess it up in any way, you're dead. The default is -@file{~/SOUP/active}. - -@item nnsoup-packer -@vindex nnsoup-packer -Format string command for packing a reply @sc{soup} packet. The default -is @samp{tar cf - %s | gzip > $HOME/Soupin%d.tgz}. - -@item nnsoup-unpacker -@vindex nnsoup-unpacker -Format string command for unpacking incoming @sc{soup} packets. The -default is @samp{gunzip -c %s | tar xvf -}. - -@item nnsoup-packet-directory -@vindex nnsoup-packet-directory -Where @code{nnsoup} will look for incoming packets. The default is -@file{~/}. - -@item nnsoup-packet-regexp -@vindex nnsoup-packet-regexp -Regular expression matching incoming @sc{soup} packets. The default is -@samp{Soupout}. - -@item nnsoup-always-save -@vindex nnsoup-always-save -If non-@code{nil}, save the replies buffer after each posted message. - -@end table - - -@node SOUP Replies -@subsubsection SOUP Replies - -Just using @code{nnsoup} won't mean that your postings and mailings end -up in @sc{soup} reply packets automagically. You have to work a bit -more for that to happen. - -@findex nnsoup-set-variables -The @code{nnsoup-set-variables} command will set the appropriate -variables to ensure that all your followups and replies end up in the -@sc{soup} system. - -In specific, this is what it does: - -@lisp -(setq message-send-news-function 'nnsoup-request-post) -(setq message-send-mail-function 'nnsoup-request-mail) -@end lisp - -And that's it, really. If you only want news to go into the @sc{soup} -system you just use the first line. If you only want mail to be -@sc{soup}ed you use the second. - - -@node Mail-To-News Gateways -@subsection Mail-To-News Gateways -@cindex mail-to-news gateways -@cindex gateways - -If your local @code{nntp} server doesn't allow posting, for some reason -or other, you can post using one of the numerous mail-to-news gateways. -The @code{nngateway} backend provides the interface. - -Note that you can't read anything from this backend---it can only be -used to post with. - -Server variables: - -@table @code -@item nngateway-address -@vindex nngateway-address -This is the address of the mail-to-news gateway. - -@item nngateway-header-transformation -@vindex nngateway-header-transformation -News headers often have to be transformed in some odd way or other -for the mail-to-news gateway to accept it. This variable says what -transformation should be called, and defaults to -@code{nngateway-simple-header-transformation}. The function is called -narrowed to the headers to be transformed and with one parameter---the -gateway address. - -This default function just inserts a new @code{To} header based on the -@code{Newsgroups} header and the gateway address. -For instance, an article with this @code{Newsgroups} header: - -@example -Newsgroups: alt.religion.emacs -@end example - -will get this @code{From} header inserted: - -@example -To: alt-religion-emacs@@GATEWAY -@end example - -The following pre-defined functions exist: - -@findex nngateway-simple-header-transformation -@table @code - -@item nngateway-simple-header-transformation -Creates a @code{To} header that looks like -@var{newsgroup}@@@code{nngateway-address}. - -@findex nngateway-mail2news-header-transformation - -@item nngateway-mail2news-header-transformation -Creates a @code{To} header that looks like -@code{nngateway-address}. - -Here's an example: - -@lisp -(setq gnus-post-method - '(nngateway - "mail2news@@replay.com" - (nngateway-header-transformation - nngateway-mail2news-header-transformation))) -@end lisp - -@end table - - -@end table - -So, to use this, simply say something like: - -@lisp -(setq gnus-post-method '(nngateway "GATEWAY.ADDRESS")) -@end lisp - - - -@node IMAP -@subsection @sc{imap} -@cindex nnimap -@cindex @sc{imap} - -@sc{imap} is a network protocol for reading mail (or news, or ...), -think of it as a modernized @sc{nntp}. Connecting to a @sc{imap} -server is much similar to connecting to a news server, you just -specify the network address of the server. - -@sc{imap} has two properties. First, @sc{imap} can do everything that -POP can, it can hence be viewed as POP++. Secondly, @sc{imap} is a -mail storage protocol, similar to @sc{nntp} being a news storage -protocol. (@sc{imap} offers more features than @sc{nntp} because news -is more or less read-only whereas mail is read-write.) - -If you want to use @sc{imap} as POP++, use an imap entry in -mail-sources. With this, Gnus will fetch mails from the @sc{imap} -server and store them on the local disk. This is not the usage -described in this section. @xref{Mail Sources}. - -If you want to use @sc{imap} as a mail storage protocol, use an nnimap -entry in gnus-secondary-select-methods. With this, Gnus will -manipulate mails stored on the @sc{imap} server. This is the kind of -usage explained in this section. - -A server configuration in @code{~/.gnus} with a few @sc{imap} servers -might look something like this: - -@lisp -(setq gnus-secondary-select-methods - '((nnimap "simpleserver") ; no special configuration - ; perhaps a ssh port forwarded server: - (nnimap "dolk" - (nnimap-address "localhost") - (nnimap-server-port 1430)) - ; a UW server running on localhost - (nnimap "barbar" - (nnimap-server-port 143) - (nnimap-address "localhost") - (nnimap-list-pattern ("INBOX" "mail/*"))) - ; anonymous public cyrus server: - (nnimap "cyrus.andrew.cmu.edu" - (nnimap-authenticator anonymous) - (nnimap-list-pattern "archive.*") - (nnimap-stream network)) - ; a ssl server on a non-standard port: - (nnimap "vic20" - (nnimap-address "vic20.somewhere.com") - (nnimap-server-port 9930) - (nnimap-stream ssl)))) -@end lisp - -The following variables can be used to create a virtual @code{nnimap} -server: - -@table @code - -@item nnimap-address -@vindex nnimap-address - -The address of the remote @sc{imap} server. Defaults to the virtual -server name if not specified. - -@item nnimap-server-port -@vindex nnimap-server-port -Port on server to contact. Defaults to port 143, or 993 for SSL. - -Note that this should be a integer, example server specification: - -@lisp -(nnimap "mail.server.com" - (nnimap-server-port 4711)) -@end lisp - -@item nnimap-list-pattern -@vindex nnimap-list-pattern -String or list of strings of mailboxes to limit available groups to. -This is used when the server has very many mailboxes and you're only -interested in a few -- some servers export your home directory via -@sc{imap}, you'll probably want to limit the mailboxes to those in -@file{~/Mail/*} then. - -The string can also be a cons of REFERENCE and the string as above, what -REFERENCE is used for is server specific, but on the University of -Washington server it's a directory that will be concatenated with the -mailbox. - -Example server specification: - -@lisp -(nnimap "mail.server.com" - (nnimap-list-pattern ("INBOX" "Mail/*" "alt.sex.*" - ("~friend/Mail/" . "list/*")))) -@end lisp - -@item nnimap-stream -@vindex nnimap-stream -The type of stream used to connect to your server. By default, nnimap -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). - -Example server specification: - -@lisp -(nnimap "mail.server.com" - (nnimap-stream ssl)) -@end lisp - -Please note that the value of @code{nnimap-stream} is a symbol! - -@itemize @bullet -@item -@dfn{gssapi:} Connect with GSSAPI (usually kerberos 5). Requires the -@samp{imtest} program. -@item -@dfn{kerberos4:} Connect with kerberos 4. Requires the @samp{imtest} program. -@item -@dfn{starttls:} Connect via the STARTTLS extension (similar to -SSL). Requires the external library @samp{starttls.el} and program -@samp{starttls}. -@item -@dfn{ssl:} Connect through SSL. Requires OpenSSL (the -program @samp{openssl}) or SSLeay (@samp{s_client}). -@item -@dfn{shell:} Use a shell command to start @sc{imap} connection. -@item -@dfn{network:} Plain, TCP/IP network connection. -@end itemize - -@vindex imap-kerberos4-program -The @samp{imtest} program is shipped with Cyrus IMAPD. If you're -using @samp{imtest} from Cyrus IMAPD < 2.0.14 (which includes version -1.5.x and 1.6.x) you need to frob @code{imap-process-connection-type} -to make @code{imap.el} use a pty instead of a pipe when communicating -with @samp{imtest}. You will then suffer from a line length -restrictions on IMAP commands, which might make Gnus seem to hang -indefinitely if you have many articles in a mailbox. The variable -@code{imap-kerberos4-program} contain parameters to pass to the imtest -program. - -@vindex imap-ssl-program -For SSL connections, the OpenSSL program is available from -@uref{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. The variable @code{imap-ssl-program} contain parameters to pass -to OpenSSL/SSLeay. - -@vindex imap-shell-program -@vindex imap-shell-host -For @sc{imap} connections using the @code{shell} stream, the variable -@code{imap-shell-program} specify what program to call. - -@item nnimap-authenticator -@vindex nnimap-authenticator - -The authenticator used to connect to the server. By default, nnimap -will use the most secure authenticator your server is capable of. - -Example server specification: - -@lisp -(nnimap "mail.server.com" - (nnimap-authenticator anonymous)) -@end lisp - -Please note that the value of @code{nnimap-authenticator} is a symbol! - -@itemize @bullet -@item -@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 -@dfn{login:} Plain-text username/password via LOGIN. -@item -@dfn{anonymous:} Login as `anonymous', supplying your emailadress as password. -@end itemize - -@item nnimap-expunge-on-close -@cindex Expunging -@vindex nnimap-expunge-on-close -Unlike Parmenides the @sc{imap} designers has decided that things that -doesn't exist actually does exist. More specifically, @sc{imap} has -this concept of marking articles @code{Deleted} which doesn't actually -delete them, and this (marking them @code{Deleted}, that is) is what -nnimap does when you delete a article in Gnus (with @kbd{G DEL} or -similar). - -Since the articles aren't really removed when we mark them with the -@code{Deleted} flag we'll need a way to actually delete them. Feel like -running in circles yet? - -Traditionally, nnimap has removed all articles marked as @code{Deleted} -when closing a mailbox but this is now configurable by this server -variable. - -The possible options are: - -@table @code - -@item always -The default behavior, delete all articles marked as "Deleted" when -closing a mailbox. -@item never -Never actually delete articles. Currently there is no way of showing -the articles marked for deletion in nnimap, but other @sc{imap} clients -may allow you to do this. If you ever want to run the EXPUNGE command -manually, @xref{Expunging mailboxes}. -@item ask -When closing mailboxes, nnimap will ask if you wish to expunge deleted -articles or not. - -@end table - -@item nnimap-importantize-dormant -@vindex nnimap-importantize-dormant - -If non-nil, marks dormant articles as ticked (as well), for other IMAP -clients. Within Gnus, dormant articles will naturally still (only) be -marked as ticked. This is to make dormant articles stand out, just -like ticked articles, in other IMAP clients. (In other words, Gnus has -two ``Tick'' marks and IMAP has only one.) - -Probably the only reason for frobing this would be if you're trying -enable per-user persistant dormant flags, using something like: - -@lisp -(setcdr (assq 'dormant nnimap-mark-to-flag-alist) - (format "gnus-dormant-%s" (user-login-name))) -(setcdr (assq 'dormant nnimap-mark-to-predicate-alist) - (format "KEYWORD gnus-dormant-%s" (user-login-name))) -@end lisp - -In this case, you would not want the per-user dormant flag showing up -as ticked for other users. - -@item nnimap-expunge-search-string -@cindex Expunging -@vindex nnimap-expunge-search-string - -This variable contain the IMAP search command sent to server when -searching for articles eligible for expiring. The default is -@code{"UID %s NOT SINCE %s"}, where the first @code{%s} is replaced by -UID set and the second @code{%s} is replaced by a date. - -Probably the only useful value to change this to is -@code{"UID %s NOT SENTSINCE %s"}, which makes nnimap use the Date: in -messages instead of the internal article date. See section 6.4.4 of -RFC 2060 for more information on valid strings. - -@item nnimap-authinfo-file -@vindex nnimap-authinfo-file - -A file containing credentials used to log in on servers. The format is -(almost) the same as the @code{ftp} @file{~/.netrc} file. See the -variable @code{nntp-authinfo-file} for exact syntax; also see -@ref{NNTP}. - -@end table - -@menu -* 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. -@end menu - - - -@node Splitting in IMAP -@subsubsection Splitting in @sc{imap} -@cindex splitting imap mail - -Splitting is something Gnus users has loved and used for years, and now -the rest of the world is catching up. Yeah, dream on, not many -@sc{imap} server has server side splitting and those that have splitting -seem to use some non-standard protocol. This means that @sc{imap} -support for Gnus has to do it's own splitting. - -And it does. - -Here are the variables of interest: - -@table @code - -@item nnimap-split-crosspost -@cindex splitting, crosspost -@cindex crosspost -@vindex nnimap-split-crosspost - -If non-nil, do crossposting if several split methods match the mail. If -nil, the first match in @code{nnimap-split-rule} found will be used. - -Nnmail equivalent: @code{nnmail-crosspost}. - -@item nnimap-split-inbox -@cindex splitting, inbox -@cindex inbox -@vindex nnimap-split-inbox - -A string or a list of strings that gives the name(s) of @sc{imap} -mailboxes to split from. Defaults to nil, which means that splitting is -disabled! - -@lisp -(setq nnimap-split-inbox - '("INBOX" ("~/friend/Mail" . "lists/*") "lists.imap")) -@end lisp - -No nnmail equivalent. - -@item nnimap-split-rule -@cindex Splitting, rules -@vindex nnimap-split-rule - -New mail found in @code{nnimap-split-inbox} will be split according to -this variable. - -This variable contains a list of lists, where the first element in the -sublist gives the name of the @sc{imap} mailbox to move articles -matching the regexp in the second element in the sublist. Got that? -Neither did I, we need examples. - -@lisp -(setq nnimap-split-rule - '(("INBOX.nnimap" - "^Sender: owner-nnimap@@vic20.globalcom.se") - ("INBOX.junk" "^Subject:.*MAKE MONEY") - ("INBOX.private" ""))) -@end lisp - -This will put all articles from the nnimap mailing list into mailbox -INBOX.nnimap, all articles containing MAKE MONEY in the Subject: line -into INBOX.junk and everything else in INBOX.private. - -The first string may contain `\\1' forms, like the ones used by -replace-match to insert sub-expressions from the matched text. For -instance: - -@lisp -("INBOX.lists.\\1" "^Sender: owner-\\([a-z-]+\\)@@") -@end lisp - -The second element can also be a function. In that case, it will be -called with the first element of the rule as the argument, in a buffer -containing the headers of the article. It should return a non-nil value -if it thinks that the mail belongs in that group. - -Nnmail users might recollect that the last regexp had to be empty to -match all articles (like in the example above). This is not required in -nnimap. Articles not matching any of the regexps will not be moved out -of your inbox. (This might affect performance if you keep lots of -unread articles in your inbox, since the splitting code would go over -them every time you fetch new mail.) - -These rules are processed from the beginning of the alist toward the -end. The first rule to make a match will "win", unless you have -crossposting enabled. In that case, all matching rules will "win". - -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 split to. See @code{nnimap-split-fancy}. - -The splitting code tries to create mailboxes if it need too. - -To allow for different split rules on different virtual servers, and -even different split rules in different inboxes on the same server, -the syntax of this variable have been extended along the lines of: - -@lisp -(setq nnimap-split-rule - '(("my1server" (".*" (("ding" "ding@@gnus.org") - ("junk" "From:.*Simon"))) - ("my2server" ("INBOX" nnimap-split-fancy)) - ("my[34]server" (".*" (("private" "To:.*Simon") - ("junk" my-junk-func))))) -@end lisp - -The virtual server name is in fact a regexp, so that the same rules -may apply to several servers. In the example, the servers -@code{my3server} and @code{my4server} both use the same rules. -Similarly, the inbox string is also a regexp. The actual splitting -rules are as before, either a function, or a list with group/regexp or -group/function elements. - -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 -split, 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 -@vindex nnimap-split-fancy - -It's possible to set @code{nnimap-split-rule} to -@code{nnmail-split-fancy} if you want to use fancy -splitting. @xref{Fancy Mail Splitting}. - -However, to be able to have different fancy split rules for nnmail and -nnimap backends you can set @code{nnimap-split-rule} to -@code{nnimap-split-fancy} and define the nnimap specific fancy split -rule in @code{nnimap-split-fancy}. - -Example: - -@lisp -(setq nnimap-split-rule 'nnimap-split-fancy - nnimap-split-fancy ...) -@end lisp - -Nnmail equivalent: @code{nnmail-split-fancy}. - -@end table - -@node Editing IMAP ACLs -@subsubsection Editing @sc{imap} ACLs -@cindex editing imap acls -@cindex Access Control Lists -@cindex Editing @sc{imap} ACLs -@kindex G l -@findex gnus-group-nnimap-edit-acl - -ACL stands for Access Control List. ACLs are used in @sc{imap} for -limiting (or enabling) other users access to your mail boxes. Not all -@sc{imap} servers support this, this function will give an error if it -doesn't. - -To edit a ACL for a mailbox, type @kbd{G l} -(@code{gnus-group-edit-nnimap-acl}) and you'll be presented with a ACL -editing window with detailed instructions. - -Some possible uses: - -@itemize @bullet -@item -Giving "anyone" the "lrs" rights (lookup, read, keep seen/unseen flags) -on your mailing list mailboxes enables other users on the same server to -follow the list without subscribing to it. -@item -At least with the Cyrus server, you are required to give the user -"anyone" posting ("p") capabilities to have "plussing" work (that is, -mail sent to user+mailbox@@domain ending up in the @sc{imap} mailbox -INBOX.mailbox). -@end itemize - -@node Expunging mailboxes -@subsubsection Expunging mailboxes -@cindex expunging - -@cindex Expunge -@cindex Manual expunging -@kindex G x -@findex gnus-group-nnimap-expunge - -If you're using the @code{never} setting of @code{nnimap-expunge-on-close}, -you may want the option of expunging all deleted articles in a mailbox -manually. This is exactly what @kbd{G x} does. - -Currently there is no way of showing deleted articles, you can just -delete them. - - - -@node Combined Groups -@section Combined Groups - -Gnus allows combining a mixture of all the other group types into bigger -groups. - -@menu -* Virtual Groups:: Combining articles from many groups. -* Kibozed Groups:: Looking through parts of the newsfeed for articles. -@end menu - - -@node Virtual Groups -@subsection Virtual Groups -@cindex nnvirtual -@cindex virtual groups -@cindex merging groups - -An @dfn{nnvirtual group} is really nothing more than a collection of -other groups. - -For instance, if you are tired of reading many small groups, you can -put them all in one big group, and then grow tired of reading one -big, unwieldy group. The joys of computing! - -You specify @code{nnvirtual} as the method. The address should be a -regexp to match component groups. - -All marks in the virtual group will stick to the articles in the -component groups. So if you tick an article in a virtual group, the -article will also be ticked in the component group from whence it came. -(And vice versa---marks from the component groups will also be shown in -the virtual group.) - -Here's an example @code{nnvirtual} method that collects all Andrea Dworkin -newsgroups into one, big, happy newsgroup: - -@lisp -(nnvirtual "^alt\\.fan\\.andrea-dworkin$\\|^rec\\.dworkin.*") -@end lisp - -The component groups can be native or foreign; everything should work -smoothly, but if your computer explodes, it was probably my fault. - -Collecting the same group from several servers might actually be a good -idea if users have set the Distribution header to limit distribution. -If you would like to read @samp{soc.motss} both from a server in Japan -and a server in Norway, you could use the following as the group regexp: - -@example -"^nntp\\+server\\.jp:soc\\.motss$\\|^nntp\\+server\\.no:soc\\.motss$" -@end example - -(Remember, though, that if you're creating the group with @kbd{G m}, you -shouldn't double the backslashes, and you should leave off the quote -characters at the beginning and the end of the string.) - -This should work kinda smoothly---all articles from both groups should -end up in this one, and there should be no duplicates. Threading (and -the rest) will still work as usual, but there might be problems with the -sequence of articles. Sorting on date might be an option here -(@pxref{Selecting a Group}). - -One limitation, however---all groups included in a virtual -group have to be alive (i.e., subscribed or unsubscribed). Killed or -zombie groups can't be component groups for @code{nnvirtual} groups. - -@vindex nnvirtual-always-rescan -If the @code{nnvirtual-always-rescan} is non-@code{nil}, -@code{nnvirtual} will always scan groups for unread articles when -entering a virtual group. If this variable is @code{nil} (which is the -default) and you read articles in a component group after the virtual -group has been activated, the read articles from the component group -will show up when you enter the virtual group. You'll also see this -effect if you have two virtual groups that have a component group in -common. If that's the case, you should set this variable to @code{t}. -Or you can just tap @code{M-g} on the virtual group every time before -you enter it---it'll have much the same effect. - -@code{nnvirtual} can have both mail and news groups as component groups. -When responding to articles in @code{nnvirtual} groups, @code{nnvirtual} -has to ask the backend of the component group the article comes from -whether it is a news or mail backend. However, when you do a @kbd{^}, -there is typically no sure way for the component backend to know this, -and in that case @code{nnvirtual} tells Gnus that the article came from a -not-news backend. (Just to be on the safe side.) - -@kbd{C-c C-t} in the message buffer will insert the @code{Newsgroups} -line from the article you respond to in these cases. - - - -@node Kibozed Groups -@subsection Kibozed Groups -@cindex nnkiboze -@cindex kibozing - -@dfn{Kibozing} is defined by @sc{oed} as ``grepping through (parts of) -the news feed''. @code{nnkiboze} is a backend that will do this for -you. Oh joy! Now you can grind any @sc{nntp} server down to a halt -with useless requests! Oh happiness! - -@kindex G k (Group) -To create a kibozed group, use the @kbd{G k} command in the group -buffer. - -The address field of the @code{nnkiboze} method is, as with -@code{nnvirtual}, a regexp to match groups to be ``included'' in the -@code{nnkiboze} group. That's where most similarities between @code{nnkiboze} -and @code{nnvirtual} end. - -In addition to this regexp detailing component groups, an @code{nnkiboze} group -must have a score file to say what articles are to be included in -the group (@pxref{Scoring}). - -@kindex M-x nnkiboze-generate-groups -@findex nnkiboze-generate-groups -You must run @kbd{M-x nnkiboze-generate-groups} after creating the -@code{nnkiboze} groups you want to have. This command will take time. Lots of -time. Oodles and oodles of time. Gnus has to fetch the headers from -all the articles in all the component groups and run them through the -scoring process to determine if there are any articles in the groups -that are to be part of the @code{nnkiboze} groups. - -Please limit the number of component groups by using restrictive -regexps. Otherwise your sysadmin may become annoyed with you, and the -@sc{nntp} site may throw you off and never let you back in again. -Stranger things have happened. - -@code{nnkiboze} component groups do not have to be alive---they can be dead, -and they can be foreign. No restrictions. - -@vindex nnkiboze-directory -The generation of an @code{nnkiboze} group means writing two files in -@code{nnkiboze-directory}, which is @file{~/News/} by default. One -contains the @sc{nov} header lines for all the articles in the group, -and the other is an additional @file{.newsrc} file to store information -on what groups have been searched through to find component articles. - -Articles marked as read in the @code{nnkiboze} group will have -their @sc{nov} lines removed from the @sc{nov} file. - - -@node Gnus Unplugged -@section Gnus Unplugged -@cindex offline -@cindex unplugged -@cindex Agent -@cindex Gnus Agent -@cindex Gnus Unplugged - -In olden times (ca. February '88), people used to run their newsreaders -on big machines with permanent connections to the net. News transport -was dealt with by news servers, and all the newsreaders had to do was to -read news. Believe it or not. - -Nowadays most people read news and mail at home, and use some sort of -modem to connect to the net. To avoid running up huge phone bills, it -would be nice to have a way to slurp down all the news and mail, hang up -the phone, read for several hours, and then upload any responses you -have to make. And then you repeat the procedure. - -Of course, you can use news servers for doing this as well. I've used -@code{inn} together with @code{slurp}, @code{pop} and @code{sendmail} -for some years, but doing that's a bore. Moving the news server -functionality up to the newsreader makes sense if you're the only person -reading news on a machine. - -Using Gnus as an ``offline'' newsreader is quite simple. - -@itemize @bullet -@item -First, set up Gnus as you would do if you were running it on a machine -that has full connection to the net. Go ahead. I'll still be waiting -here. - -@item -Then, put the following magical incantation at the end of your -@file{.gnus.el} file: - -@lisp -(gnus-agentize) -@end lisp -@end itemize - -That's it. Gnus is now an ``offline'' newsreader. - -Of course, to use it as such, you have to learn a few new commands. - -@menu -* 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. -* Agent and IMAP:: How to use the Agent with IMAP. -* 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. -@end menu - - -@node Agent Basics -@subsection Agent Basics - -First, let's get some terminology out of the way. - -The Gnus Agent is said to be @dfn{unplugged} when you have severed the -connection to the net (and notified the Agent that this is the case). -When the connection to the net is up again (and Gnus knows this), the -Agent is @dfn{plugged}. - -The @dfn{local} machine is the one you're running on, and which isn't -connected to the net continuously. - -@dfn{Downloading} means fetching things from the net to your local -machine. @dfn{Uploading} is doing the opposite. - -Let's take a typical Gnus session using the Agent. - -@itemize @bullet - -@item -You start Gnus with @code{gnus-unplugged}. This brings up the Gnus -Agent in a disconnected state. You can read all the news that you have -already fetched while in this mode. - -@item -You then decide to see whether any new news has arrived. You connect -your machine to the net (using PPP or whatever), and then hit @kbd{J j} -to make Gnus become @dfn{plugged} and use @kbd{g} to check for new mail -as usual. To check for new mail in unplugged mode, see (@pxref{Mail -Source Specifiers}). - -@item -You can then read the new news immediately, or you can download the news -onto your local machine. If you want to do the latter, you press @kbd{g} -to check if there are any new news and then @kbd{J -s} to fetch all the eligible articles in all the groups. (To let Gnus -know which articles you want to download, @pxref{Agent Categories}.) - -@item -After fetching the articles, you press @kbd{J j} to make Gnus become -unplugged again, and you shut down the PPP thing (or whatever). And -then you read the news offline. - -@item -And then you go to step 2. -@end itemize - -Here are some things you should do the first time (or so) that you use -the Agent. - -@itemize @bullet - -@item -Decide which servers should be covered by the Agent. If you have a mail -backend, it would probably be nonsensical to have it covered by the -Agent. Go to the server buffer (@kbd{^} in the group buffer) and press -@kbd{J a} the server (or servers) that you wish to have covered by the -Agent (@pxref{Server Agent Commands}). This will typically be only the -primary select method, which is listed on the bottom in the buffer. - -@item -Decide on download policy. @xref{Agent Categories}. - -@item -Uhm... that's it. -@end itemize - - -@node Agent Categories -@subsection Agent Categories - -One of the main reasons to integrate the news transport layer into the -newsreader is to allow greater control over what articles to download. -There's not much point in downloading huge amounts of articles, just to -find out that you're not interested in reading any of them. It's better -to be somewhat more conservative in choosing what to download, and then -mark the articles for downloading manually if it should turn out that -you're interested in the articles anyway. - -The main way to control what is to be downloaded is to create a -@dfn{category} and then assign some (or all) groups to this category. -Groups that do not belong in any other category belong to the -@code{default} category. Gnus has its own buffer for creating and -managing categories. - -@menu -* Category Syntax:: What a category looks like. -* Category Buffer:: A buffer for maintaining categories. -* Category Variables:: Customize'r'Us. -@end menu - - -@node Category Syntax -@subsubsection Category Syntax - -A category consists of two things. - -@enumerate -@item -A predicate which (generally) gives a rough outline of which articles -are eligible for downloading; and - -@item -a score rule which (generally) gives you a finer granularity when -deciding what articles to download. (Note that this @dfn{download -score} is not necessarily related to normal scores.) -@end enumerate - -A predicate in its simplest form can be a single predicate such as -@code{true} or @code{false}. These two will download every available -article or nothing respectively. In the case of these two special -predicates an additional score rule is superfluous. - -Predicates of @code{high} or @code{low} download articles in respect of -their scores in relationship to @code{gnus-agent-high-score} and -@code{gnus-agent-low-score} as described below. - -To gain even finer control of what is to be regarded eligible for -download a predicate can consist of a number of predicates with logical -operators sprinkled in between. - -Perhaps some examples are in order. - -Here's a simple predicate. (It's the default predicate, in fact, used -for all groups that don't belong to any other category.) - -@lisp -short -@end lisp - -Quite simple, eh? This predicate is true if and only if the article is -short (for some value of ``short''). - -Here's a more complex predicate: - -@lisp -(or high - (and - (not low) - (not long))) -@end lisp - -This means that an article should be downloaded if it has a high score, -or if the score is not low and the article is not long. You get the -drift. - -The available logical operators are @code{or}, @code{and} and -@code{not}. (If you prefer, you can use the more ``C''-ish operators -@samp{|}, @code{&} and @code{!} instead.) - -The following predicates are pre-defined, but if none of these fit what -you want to do, you can write your own. - -@table @code -@item short -True iff the article is shorter than @code{gnus-agent-short-article} -lines; default 100. - -@item long -True iff the article is longer than @code{gnus-agent-long-article} -lines; default 200. - -@item low -True iff the article has a download score less than -@code{gnus-agent-low-score}; default 0. - -@item high -True iff the article has a download score greater than -@code{gnus-agent-high-score}; default 0. - -@item spam -True iff the Gnus Agent guesses that the article is spam. The -heuristics may change over time, but at present it just computes a -checksum and sees whether articles match. - -@item true -Always true. - -@item false -Always false. -@end table - -If you want to create your own predicate function, here's what you have -to know: The functions are called with no parameters, but the -@code{gnus-headers} and @code{gnus-score} dynamic variables are bound to -useful values. - -For example, you could decide that you don't want to download articles -that were posted more than a certain number of days ago (e.g. posted -more than @code{gnus-agent-expire-days} ago) you might write a function -something along the lines of the following: - -@lisp -(defun my-article-old-p () - "Say whether an article is old." - (< (time-to-days (date-to-time (mail-header-date gnus-headers))) - (- (time-to-days (current-time)) gnus-agent-expire-days))) -@end lisp - -with the predicate then defined as: - -@lisp -(not my-article-old-p) -@end lisp - -or you could append your predicate to the predefined -@code{gnus-category-predicate-alist} in your @file{~/.gnus.el} or -wherever. (Note: this would have to be at a point *after* -@code{gnus-agent} has been loaded via @code{(gnus-agentize)}) - -@lisp -(setq gnus-category-predicate-alist - (append gnus-category-predicate-alist - '((old . my-article-old-p)))) -@end lisp - -and simply specify your predicate as: - -@lisp -(not old) -@end lisp - -If/when using something like the above, be aware that there are many -misconfigured systems/mailers out there and so an article's date is not -always a reliable indication of when it was posted. Hell, some people -just don't give a damn. - -The above predicates apply to *all* the groups which belong to the -category. However, if you wish to have a specific predicate for an -individual group within a category, or you're just too lazy to set up a -new category, you can enter a group's individual predicate in it's group -parameters like so: - -@lisp -(agent-predicate . short) -@end lisp - -This is the group parameter equivalent of the agent category default. -Note that when specifying a single word predicate like this, the -@code{agent-predicate} specification must be in dotted pair notation. - -The equivalent of the longer example from above would be: - -@lisp -(agent-predicate or high (and (not low) (not long))) -@end lisp - -The outer parenthesis required in the category specification are not -entered here as, not being in dotted pair notation, the value of the -predicate is assumed to be a list. - - -Now, the syntax of the download score is the same as the syntax of -normal score files, except that all elements that require actually -seeing the article itself are verboten. This means that only the -following headers can be scored on: @code{Subject}, @code{From}, -@code{Date}, @code{Message-ID}, @code{References}, @code{Chars}, -@code{Lines}, and @code{Xref}. - -As with predicates, the specification of the @code{download score rule} -to use in respect of a group can be in either the category definition if -it's to be applicable to all groups in therein, or a group's parameters -if it's to be specific to that group. - -In both of these places the @code{download score rule} can take one of -three forms: - -@enumerate -@item -Score rule - -This has the same syntax as a normal gnus score file except only a -subset of scoring keywords are available as mentioned above. - -example: - -@itemize @bullet -@item -Category specification - -@lisp -(("from" - ("Lars Ingebrigtsen" 1000000 nil s)) -("lines" - (500 -100 nil <))) -@end lisp - -@item -Group Parameter specification - -@lisp -(agent-score ("from" - ("Lars Ingebrigtsen" 1000000 nil s)) - ("lines" - (500 -100 nil <))) -@end lisp - -Again, note the omission of the outermost parenthesis here. -@end itemize - -@item -Agent score file - -These score files must *only* contain the permitted scoring keywords -stated above. - -example: - -@itemize @bullet -@item -Category specification - -@lisp -("~/News/agent.SCORE") -@end lisp - -or perhaps - -@lisp -("~/News/agent.SCORE" "~/News/agent.group.SCORE") -@end lisp - -@item -Group Parameter specification - -@lisp -(agent-score "~/News/agent.SCORE") -@end lisp - -Additional score files can be specified as above. Need I say anything -about parenthesis? -@end itemize - -@item -Use @code{normal} score files - -If you don't want to maintain two sets of scoring rules for a group, and -your desired @code{downloading} criteria for a group are the same as your -@code{reading} criteria then you can tell the agent to refer to your -@code{normal} score files when deciding what to download. - -These directives in either the category definition or a group's -parameters will cause the agent to read in all the applicable score -files for a group, *filtering out* those sections that do not -relate to one of the permitted subset of scoring keywords. - -@itemize @bullet -@item -Category Specification - -@lisp -file -@end lisp - -@item -Group Parameter specification - -@lisp -(agent-score . file) -@end lisp -@end itemize -@end enumerate - -@node Category Buffer -@subsubsection Category Buffer - -You'd normally do all category maintenance from the category buffer. -When you enter it for the first time (with the @kbd{J c} command from -the group buffer), you'll only see the @code{default} category. - -The following commands are available in this buffer: - -@table @kbd -@item q -@kindex q (Category) -@findex gnus-category-exit -Return to the group buffer (@code{gnus-category-exit}). - -@item k -@kindex k (Category) -@findex gnus-category-kill -Kill the current category (@code{gnus-category-kill}). - -@item c -@kindex c (Category) -@findex gnus-category-copy -Copy the current category (@code{gnus-category-copy}). - -@item a -@kindex a (Category) -@findex gnus-category-add -Add a new category (@code{gnus-category-add}). - -@item p -@kindex p (Category) -@findex gnus-category-edit-predicate -Edit the predicate of the current category -(@code{gnus-category-edit-predicate}). - -@item g -@kindex g (Category) -@findex gnus-category-edit-groups -Edit the list of groups belonging to the current category -(@code{gnus-category-edit-groups}). - -@item s -@kindex s (Category) -@findex gnus-category-edit-score -Edit the download score rule of the current category -(@code{gnus-category-edit-score}). - -@item l -@kindex l (Category) -@findex gnus-category-list -List all the categories (@code{gnus-category-list}). -@end table - - -@node Category Variables -@subsubsection Category Variables - -@table @code -@item gnus-category-mode-hook -@vindex gnus-category-mode-hook -Hook run in category buffers. - -@item gnus-category-line-format -@vindex gnus-category-line-format -Format of the lines in the category buffer (@pxref{Formatting -Variables}). Valid elements are: - -@table @samp -@item c -The name of the category. - -@item g -The number of groups in the category. -@end table - -@item gnus-category-mode-line-format -@vindex gnus-category-mode-line-format -Format of the category mode line (@pxref{Mode Line Formatting}). - -@item gnus-agent-short-article -@vindex gnus-agent-short-article -Articles that have fewer lines than this are short. Default 100. - -@item gnus-agent-long-article -@vindex gnus-agent-long-article -Articles that have more lines than this are long. Default 200. - -@item gnus-agent-low-score -@vindex gnus-agent-low-score -Articles that have a score lower than this have a low score. Default -0. - -@item gnus-agent-high-score -@vindex gnus-agent-high-score -Articles that have a score higher than this have a high score. Default -0. - -@end table - - -@node Agent Commands -@subsection Agent Commands - -All the Gnus Agent commands are on the @kbd{J} submap. The @kbd{J j} -(@code{gnus-agent-toggle-plugged} command works in all modes, and -toggles the plugged/unplugged state of the Gnus Agent. - - -@menu -* Group Agent Commands:: -* Summary Agent Commands:: -* Server Agent Commands:: -@end menu - -You can run a complete batch fetch from the command line with the -following incantation: - -@cindex gnus-agent-batch-fetch -@example -$ emacs -batch -l ~/.gnus.el -f gnus-agent-batch-fetch -@end example - - - -@node Group Agent Commands -@subsubsection Group Agent Commands - -@table @kbd -@item J u -@kindex J u (Agent Group) -@findex gnus-agent-fetch-groups -Fetch all eligible articles in the current group -(@code{gnus-agent-fetch-groups}). - -@item J c -@kindex J c (Agent Group) -@findex gnus-enter-category-buffer -Enter the Agent category buffer (@code{gnus-enter-category-buffer}). - -@item J s -@kindex J s (Agent Group) -@findex gnus-agent-fetch-session -Fetch all eligible articles in all groups -(@code{gnus-agent-fetch-session}). - -@item J S -@kindex J S (Agent Group) -@findex gnus-group-send-drafts -Send all sendable messages in the draft group -(@code{gnus-group-send-drafts}). @xref{Drafts}. - -@item J a -@kindex J a (Agent Group) -@findex gnus-agent-add-group -Add the current group to an Agent category -(@code{gnus-agent-add-group}). This command understands the -process/prefix convention (@pxref{Process/Prefix}). - -@item J r -@kindex J r (Agent Group) -@findex gnus-agent-remove-group -Remove the current group from its category, if any -(@code{gnus-agent-remove-group}). This command understands the -process/prefix convention (@pxref{Process/Prefix}). - -@item J Y -@kindex J Y (Agent Group) -@findex gnus-agent-synchronize-flags -Synchronize flags changed while unplugged with remote server, if any. - - -@end table - - -@node Summary Agent Commands -@subsubsection Summary Agent Commands - -@table @kbd -@item J # -@kindex J # (Agent Summary) -@findex gnus-agent-mark-article -Mark the article for downloading (@code{gnus-agent-mark-article}). - -@item J M-# -@kindex J M-# (Agent Summary) -@findex gnus-agent-unmark-article -Remove the downloading mark from the article -(@code{gnus-agent-unmark-article}). - -@item @@ -@kindex @@ (Agent Summary) -@findex gnus-agent-toggle-mark -Toggle whether to download the article (@code{gnus-agent-toggle-mark}). - -@item J c -@kindex J c (Agent Summary) -@findex gnus-agent-catchup -Mark all undownloaded articles as read (@code{gnus-agent-catchup}). - -@item J u -@kindex J u (Agent Summary) -@findex gnus-agent-summary-fetch-group -Download all downloadable articles in the current group -(@code{gnus-agent-summary-fetch-group}). - -@end table - - -@node Server Agent Commands -@subsubsection Server Agent Commands - -@table @kbd -@item J a -@kindex J a (Agent Server) -@findex gnus-agent-add-server -Add the current server to the list of servers covered by the Gnus Agent -(@code{gnus-agent-add-server}). - -@item J r -@kindex J r (Agent Server) -@findex gnus-agent-remove-server -Remove the current server from the list of servers covered by the Gnus -Agent (@code{gnus-agent-remove-server}). - -@end table - - -@node Agent Expiry -@subsection Agent Expiry - -@vindex gnus-agent-expire-days -@findex gnus-agent-expire -@kindex M-x gnus-agent-expire -@cindex Agent expiry -@cindex Gnus Agent expiry -@cindex expiry - -@code{nnagent} doesn't handle expiry. Instead, there's a special -@code{gnus-agent-expire} command that will expire all read articles that -are older than @code{gnus-agent-expire-days} days. It can be run -whenever you feel that you're running out of space. It's not -particularly fast or efficient, and it's not a particularly good idea to -interrupt it (with @kbd{C-g} or anything else) once you've started it. - -@vindex gnus-agent-expire-all -if @code{gnus-agent-expire-all} is non-@code{nil}, this command will -expire all articles---unread, read, ticked and dormant. If @code{nil} -(which is the default), only read articles are eligible for expiry, and -unread, ticked and dormant articles will be kept indefinitely. - - -@node Agent and IMAP -@subsection Agent and IMAP - -The Agent work with any Gnus backend, including nnimap. However, -since there are some conceptual differences between @sc{nntp} and -@sc{imap}, this section (should) provide you with some information to -make Gnus Agent work smoother as a @sc{imap} Disconnected Mode client. - -The first thing to keep in mind is that all flags (read, ticked, etc) -are kept on the @sc{imap} server, rather than in @code{.newsrc} as is the -case for nntp. Thus Gnus need to remember flag changes when -disconnected, and synchronize these flags when you plug back in. - -Gnus keep track of flag changes when reading nnimap groups under the -Agent by default. When you plug back in, by default Gnus will check if -you have any changed any flags and ask if you wish to synchronize these -with the server. This behavior is customizable with -@code{gnus-agent-synchronize-flags}. - -@vindex gnus-agent-synchronize-flags -If @code{gnus-agent-synchronize-flags} is @code{nil}, the Agent will -never automatically synchronize flags. If it is @code{ask}, the -default, the Agent will check if you made any changes and if so ask if -you wish to synchronize these when you re-connect. If it has any other -value, all flags will be synchronized automatically. - -If you do not wish to automatically synchronize flags when you -re-connect, this can be done manually with the -@code{gnus-agent-synchronize-flags} command that is bound to @kbd{J Y} -in the group buffer by default. - -Some things are currently not implemented in the Agent that you'd might -expect from a disconnected @sc{imap} client, including: - -@itemize @bullet - -@item -Copying/moving articles into nnimap groups when unplugged. - -@item -Creating/deleting nnimap groups when unplugged. - -@end itemize - -Technical note: the synchronization algorithm does not work by "pushing" -all local flags to the server, but rather incrementally update the -server view of flags by changing only those flags that were changed by -the user. Thus, if you set one flag on a article, quit the group and -re-select the group and remove the flag; the flag will be set and -removed from the server when you "synchronize". The queued flag -operations can be found in the per-server @code{flags} file in the Agent -directory. It's emptied when you synchronize flags. - - -@node Outgoing Messages -@subsection Outgoing Messages - -When Gnus is unplugged, all outgoing messages (both mail and news) are -stored in the draft groups (@pxref{Drafts}). You can view them there -after posting, and edit them at will. - -When Gnus is plugged again, you can send the messages either from the -draft group with the special commands available there, or you can use -the @kbd{J S} command in the group buffer to send all the sendable -messages in the draft group. - - - -@node Agent Variables -@subsection Agent Variables - -@table @code -@item gnus-agent-directory -@vindex gnus-agent-directory -Where the Gnus Agent will store its files. The default is -@file{~/News/agent/}. - -@item gnus-agent-handle-level -@vindex gnus-agent-handle-level -Groups on levels (@pxref{Group Levels}) higher than this variable will -be ignored by the Agent. The default is @code{gnus-level-subscribed}, -which means that only subscribed group will be considered by the Agent -by default. - -@item gnus-agent-plugged-hook -@vindex gnus-agent-plugged-hook -Hook run when connecting to the network. - -@item gnus-agent-unplugged-hook -@vindex gnus-agent-unplugged-hook -Hook run when disconnecting from the network. - -@end table - - -@node Example Setup -@subsection Example Setup - -If you don't want to read this manual, and you have a fairly standard -setup, you may be able to use something like the following as your -@file{.gnus.el} file to get started. - -@lisp -;;; Define how Gnus is to fetch news. We do this over @sc{nntp} -;;; from your ISP's server. -(setq gnus-select-method '(nntp "news.your-isp.com")) - -;;; Define how Gnus is to read your mail. We read mail from -;;; your ISP's POP server. -(setq mail-sources '((pop :server "pop.your-isp.com"))) - -;;; Say how Gnus is to store the mail. We use nnml groups. -(setq gnus-secondary-select-methods '((nnml ""))) - -;;; Make Gnus into an offline newsreader. -(gnus-agentize) -@end lisp - -That should be it, basically. Put that in your @file{~/.gnus.el} file, -edit to suit your needs, start up PPP (or whatever), and type @kbd{M-x -gnus}. - -If this is the first time you've run Gnus, you will be subscribed -automatically to a few default newsgroups. You'll probably want to -subscribe to more groups, and to do that, you have to query the -@sc{nntp} server for a complete list of groups with the @kbd{A A} -command. This usually takes quite a while, but you only have to do it -once. - -After reading and parsing a while, you'll be presented with a list of -groups. Subscribe to the ones you want to read with the @kbd{u} -command. @kbd{l} to make all the killed groups disappear after you've -subscribe to all the groups you want to read. (@kbd{A k} will bring -back all the killed groups.) - -You can now read the groups at once, or you can download the articles -with the @kbd{J s} command. And then read the rest of this manual to -find out which of the other gazillion things you want to customize. - - -@node Batching Agents -@subsection Batching Agents - -Having the Gnus Agent fetch articles (and post whatever messages you've -written) is quite easy once you've gotten things set up properly. The -following shell script will do everything that is necessary: - -@example -#!/bin/sh -emacs -batch -l ~/.emacs -f gnus-agent-batch >/dev/null -@end example - - -@node Agent Caveats -@subsection Agent Caveats - -The Gnus Agent doesn't seem to work like most other offline -newsreaders. Here are some common questions that some imaginary people -may ask: - -@table @dfn -@item If I read an article while plugged, do they get entered into the -Agent? - -@strong{No.} - -@item If I read an article while plugged, and the article already exists -in the Agent, will it get downloaded once more? - -@strong{Yes.} - -@end table - -In short, when Gnus is unplugged, it only looks into the locally stored -articles; when it's plugged, it only talks to your ISP. - - -@node Scoring -@chapter Scoring -@cindex scoring - -Other people use @dfn{kill files}, but we here at Gnus Towers like -scoring better than killing, so we'd rather switch than fight. They do -something completely different as well, so sit up straight and pay -attention! - -@vindex gnus-summary-mark-below -All articles have a default score (@code{gnus-summary-default-score}), -which is 0 by default. This score may be raised or lowered either -interactively or by score files. Articles that have a score lower than -@code{gnus-summary-mark-below} are marked as read. - -Gnus will read any @dfn{score files} that apply to the current group -before generating the summary buffer. - -There are several commands in the summary buffer that insert score -entries based on the current article. You can, for instance, ask Gnus to -lower or increase the score of all articles with a certain subject. - -There are two sorts of scoring entries: Permanent and temporary. -Temporary score entries are self-expiring entries. Any entries that are -temporary and have not been used for, say, a week, will be removed -silently to help keep the sizes of the score files down. - -@menu -* 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 On Other Headers:: Scoring on non-standard headers. -* 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. -@end menu - - -@node Summary Score Commands -@section Summary Score Commands -@cindex score commands - -The score commands that alter score entries do not actually modify real -score files. That would be too inefficient. Gnus maintains a cache of -previously loaded score files, one of which is considered the -@dfn{current score file alist}. The score commands simply insert -entries into this list, and upon group exit, this list is saved. - -The current score file is by default the group's local score file, even -if no such score file actually exists. To insert score commands into -some other score file (e.g. @file{all.SCORE}), you must first make this -score file the current one. - -General score commands that don't actually change the score file: - -@table @kbd - -@item V s -@kindex V s (Summary) -@findex gnus-summary-set-score -Set the score of the current article (@code{gnus-summary-set-score}). - -@item V S -@kindex V S (Summary) -@findex gnus-summary-current-score -Display the score of the current article -(@code{gnus-summary-current-score}). - -@item V t -@kindex V t (Summary) -@findex gnus-score-find-trace -Display all score rules that have been used on the current article -(@code{gnus-score-find-trace}). - -@item V R -@kindex V R (Summary) -@findex gnus-summary-rescore -Run the current summary through the scoring process -(@code{gnus-summary-rescore}). This might be useful if you're playing -around with your score files behind Gnus' back and want to see the -effect you're having. - -@item V c -@kindex V c (Summary) -@findex gnus-score-change-score-file -Make a different score file the current -(@code{gnus-score-change-score-file}). - -@item V e -@kindex V e (Summary) -@findex gnus-score-edit-current-scores -Edit the current score file (@code{gnus-score-edit-current-scores}). -You will be popped into a @code{gnus-score-mode} buffer (@pxref{Score -File Editing}). - -@item V f -@kindex V f (Summary) -@findex gnus-score-edit-file -Edit a score file and make this score file the current one -(@code{gnus-score-edit-file}). - -@item V F -@kindex V F (Summary) -@findex gnus-score-flush-cache -Flush the score cache (@code{gnus-score-flush-cache}). This is useful -after editing score files. - -@item V C -@kindex V C (Summary) -@findex gnus-score-customize -Customize a score file in a visually pleasing manner -(@code{gnus-score-customize}). - -@end table - -The rest of these commands modify the local score file. - -@table @kbd - -@item V m -@kindex V m (Summary) -@findex gnus-score-set-mark-below -Prompt for a score, and mark all articles with a score below this as -read (@code{gnus-score-set-mark-below}). - -@item V x -@kindex V x (Summary) -@findex gnus-score-set-expunge-below -Prompt for a score, and add a score rule to the current score file to -expunge all articles below this score -(@code{gnus-score-set-expunge-below}). -@end table - -The keystrokes for actually making score entries follow a very regular -pattern, so there's no need to list all the commands. (Hundreds of -them.) - -@findex gnus-summary-increase-score -@findex gnus-summary-lower-score - -@enumerate -@item -The first key is either @kbd{I} (upper case i) for increasing the score -or @kbd{L} for lowering the score. -@item -The second key says what header you want to score on. The following -keys are available: -@table @kbd - -@item a -Score on the author name. - -@item s -Score on the subject line. - -@item x -Score on the @code{Xref} line---i.e., the cross-posting line. - -@item r -Score on the @code{References} line. - -@item d -Score on the date. - -@item l -Score on the number of lines. - -@item i -Score on the @code{Message-ID} header. - -@item f -Score on followups---this matches the author name, and adds scores to -the followups to this author. (Using this key leads to the creation of -@file{ADAPT} files.) - -@item b -Score on the body. - -@item h -Score on the head. - -@item t -Score on thread. (Using this key leads to the creation of @file{ADAPT} -files.) - -@end table - -@item -The third key is the match type. Which match types are valid depends on -what headers you are scoring on. - -@table @code - -@item strings - -@table @kbd - -@item e -Exact matching. - -@item s -Substring matching. - -@item f -Fuzzy matching (@pxref{Fuzzy Matching}). - -@item r -Regexp matching -@end table - -@item date -@table @kbd - -@item b -Before date. - -@item a -After date. - -@item n -This date. -@end table - -@item number -@table @kbd - -@item < -Less than number. - -@item = -Equal to number. - -@item > -Greater than number. -@end table -@end table - -@item -The fourth and final key says whether this is a temporary (i.e., expiring) -score entry, or a permanent (i.e., non-expiring) score entry, or whether -it is to be done immediately, without adding to the score file. -@table @kbd - -@item t -Temporary score entry. - -@item p -Permanent score entry. - -@item i -Immediately scoring. -@end table - -@end enumerate - -So, let's say you want to increase the score on the current author with -exact matching permanently: @kbd{I a e p}. If you want to lower the -score based on the subject line, using substring matching, and make a -temporary score entry: @kbd{L s s t}. Pretty easy. - -To make things a bit more complicated, there are shortcuts. If you use -a capital letter on either the second or third keys, Gnus will use -defaults for the remaining one or two keystrokes. The defaults are -``substring'' and ``temporary''. So @kbd{I A} is the same as @kbd{I a s -t}, and @kbd{I a R} is the same as @kbd{I a r t}. - -These functions take both the numerical prefix and the symbolic prefix -(@pxref{Symbolic Prefixes}). A numerical prefix says how much to lower -(or increase) the score of the article. A symbolic prefix of @code{a} -says to use the @file{all.SCORE} file for the command instead of the -current score file. - -@vindex gnus-score-mimic-keymap -The @code{gnus-score-mimic-keymap} says whether these commands will -pretend they are keymaps or not. - - -@node Group Score Commands -@section Group Score Commands -@cindex group score commands - -There aren't many of these as yet, I'm afraid. - -@table @kbd - -@item W f -@kindex W f (Group) -@findex gnus-score-flush-cache -Gnus maintains a cache of score alists to avoid having to reload them -all the time. This command will flush the cache -(@code{gnus-score-flush-cache}). - -@end table - -You can do scoring from the command line by saying something like: - -@findex gnus-batch-score -@cindex batch scoring -@example -$ emacs -batch -l ~/.emacs -l ~/.gnus.el -f gnus-batch-score -@end example - - -@node Score Variables -@section Score Variables -@cindex score variables - -@table @code - -@item gnus-use-scoring -@vindex gnus-use-scoring -If @code{nil}, Gnus will not check for score files, and will not, in -general, do any score-related work. This is @code{t} by default. - -@item gnus-kill-killed -@vindex gnus-kill-killed -If this variable is @code{nil}, Gnus will never apply score files to -articles that have already been through the kill process. While this -may save you lots of time, it also means that if you apply a kill file -to a group, and then change the kill file and want to run it over you -group again to kill more articles, it won't work. You have to set this -variable to @code{t} to do that. (It is @code{t} by default.) - -@item gnus-kill-files-directory -@vindex gnus-kill-files-directory -All kill and score files will be stored in this directory, which is -initialized from the @code{SAVEDIR} environment variable by default. -This is @file{~/News/} by default. - -@item gnus-score-file-suffix -@vindex gnus-score-file-suffix -Suffix to add to the group name to arrive at the score file name -(@samp{SCORE} by default.) - -@item gnus-score-uncacheable-files -@vindex gnus-score-uncacheable-files -@cindex score cache -All score files are normally cached to avoid excessive re-loading of -score files. However, if this might make your Emacs grow big and -bloated, so this regexp can be used to weed out score files unlikely to be needed again. It would be a bad idea to deny caching of -@file{all.SCORE}, while it might be a good idea to not cache -@file{comp.infosystems.www.authoring.misc.ADAPT}. In fact, this -variable is @samp{ADAPT$} by default, so no adaptive score files will -be cached. - -@item gnus-save-score -@vindex gnus-save-score -If you have really complicated score files, and do lots of batch -scoring, then you might set this variable to @code{t}. This will make -Gnus save the scores into the @file{.newsrc.eld} file. - -If you do not set this to @code{t}, then manual scores (like those set -with @kbd{V s} (@code{gnus-summary-set-score})) will not be preserved -across group visits. - -@item gnus-score-interactive-default-score -@vindex gnus-score-interactive-default-score -Score used by all the interactive raise/lower commands to raise/lower -score with. Default is 1000, which may seem excessive, but this is to -ensure that the adaptive scoring scheme gets enough room to play with. -We don't want the small changes from the adaptive scoring to overwrite -manually entered data. - -@item gnus-summary-default-score -@vindex gnus-summary-default-score -Default score of an article, which is 0 by default. - -@item gnus-summary-expunge-below -@vindex gnus-summary-expunge-below -Don't display the summary lines of articles that have scores lower than -this variable. This is @code{nil} by default, which means that no -articles will be hidden. This variable is local to the summary buffers, -and has to be set from @code{gnus-summary-mode-hook}. - -@item gnus-score-over-mark -@vindex gnus-score-over-mark -Mark (in the third column) used for articles with a score over the -default. Default is @samp{+}. - -@item gnus-score-below-mark -@vindex gnus-score-below-mark -Mark (in the third column) used for articles with a score below the -default. Default is @samp{-}. - -@item gnus-score-find-score-files-function -@vindex gnus-score-find-score-files-function -Function used to find score files for the current group. This function -is called with the name of the group as the argument. - -Predefined functions available are: -@table @code - -@item gnus-score-find-single -@findex gnus-score-find-single -Only apply the group's own score file. - -@item gnus-score-find-bnews -@findex gnus-score-find-bnews -Apply all score files that match, using bnews syntax. This is the -default. If the current group is @samp{gnu.emacs.gnus}, for instance, -@file{all.emacs.all.SCORE}, @file{not.alt.all.SCORE} and -@file{gnu.all.SCORE} would all apply. In short, the instances of -@samp{all} in the score file names are translated into @samp{.*}, and -then a regexp match is done. - -This means that if you have some score entries that you want to apply to -all groups, then you put those entries in the @file{all.SCORE} file. - -The score files are applied in a semi-random order, although Gnus will -try to apply the more general score files before the more specific score -files. It does this by looking at the number of elements in the score -file names---discarding the @samp{all} elements. - -@item gnus-score-find-hierarchical -@findex gnus-score-find-hierarchical -Apply all score files from all the parent groups. This means that you -can't have score files like @file{all.SCORE}, but you can have -@file{SCORE}, @file{comp.SCORE} and @file{comp.emacs.SCORE} for each -server. - -@end table -This variable can also be a list of functions. In that case, all -these functions will be called with the group name as argument, and -all the returned lists of score files will be applied. These -functions can also return lists of lists of score alists directly. In -that case, the functions that return these non-file score alists -should probably be placed before the ``real'' score file functions, to -ensure that the last score file returned is the local score file. -Phu. - -For example, to do hierarchical scoring but use a non-server-specific -overall score file, you could use the value -@example -(list (lambda (group) ("all.SCORE")) - 'gnus-score-find-hierarchical) -@end example - -@item gnus-score-expiry-days -@vindex gnus-score-expiry-days -This variable says how many days should pass before an unused score file -entry is expired. If this variable is @code{nil}, no score file entries -are expired. It's 7 by default. - -@item gnus-update-score-entry-dates -@vindex gnus-update-score-entry-dates -If this variable is non-@code{nil}, matching score entries will have -their dates updated. (This is how Gnus controls expiry---all -non-matching entries will become too old while matching entries will -stay fresh and young.) However, if you set this variable to @code{nil}, -even matching entries will grow old and will have to face that oh-so -grim reaper. - -@item gnus-score-after-write-file-function -@vindex gnus-score-after-write-file-function -Function called with the name of the score file just written. - -@item gnus-score-thread-simplify -@vindex gnus-score-thread-simplify -If this variable is non-@code{nil}, article subjects will be simplified -for subject scoring purposes in the same manner as with -threading---according to the current value of -gnus-simplify-subject-functions. If the scoring entry uses -@code{substring} or @code{exact} matching, the match will also be -simplified in this manner. - -@end table - - -@node Score File Format -@section Score File Format -@cindex score file format - -A score file is an @code{emacs-lisp} file that normally contains just a -single form. Casual users are not expected to edit these files; -everything can be changed from the summary buffer. - -Anyway, if you'd like to dig into it yourself, here's an example: - -@lisp -(("from" - ("Lars Ingebrigtsen" -10000) - ("Per Abrahamsen") - ("larsi\\|lmi" -50000 nil R)) - ("subject" - ("Ding is Badd" nil 728373)) - ("xref" - ("alt.politics" -1000 728372 s)) - ("lines" - (2 -100 nil <)) - (mark 0) - (expunge -1000) - (mark-and-expunge -10) - (read-only nil) - (orphan -10) - (adapt t) - (files "/hom/larsi/News/gnu.SCORE") - (exclude-files "all.SCORE") - (local (gnus-newsgroup-auto-expire t) - (gnus-summary-make-false-root empty)) - (eval (ding))) -@end lisp - -This example demonstrates most score file elements. For a different -approach, see @pxref{Advanced Scoring}. - -Even though this looks much like lisp code, nothing here is actually -@code{eval}ed. The lisp reader is used to read this form, though, so it -has to be valid syntactically, if not semantically. - -Six keys are supported by this alist: - -@table @code - -@item STRING -If the key is a string, it is the name of the header to perform the -match on. Scoring can only be performed on these eight headers: -@code{From}, @code{Subject}, @code{References}, @code{Message-ID}, -@code{Xref}, @code{Lines}, @code{Chars} and @code{Date}. In addition to -these headers, there are three strings to tell Gnus to fetch the entire -article and do the match on larger parts of the article: @code{Body} -will perform the match on the body of the article, @code{Head} will -perform the match on the head of the article, and @code{All} will -perform the match on the entire article. Note that using any of these -last three keys will slow down group entry @emph{considerably}. The -final ``header'' you can score on is @code{Followup}. These score -entries will result in new score entries being added for all follow-ups -to articles that matches these score entries. - -Following this key is a arbitrary number of score entries, where each -score entry has one to four elements. -@enumerate - -@item -The first element is the @dfn{match element}. On most headers this will -be a string, but on the Lines and Chars headers, this must be an -integer. - -@item -If the second element is present, it should be a number---the @dfn{score -element}. This number should be an integer in the neginf to posinf -interval. This number is added to the score of the article if the match -is successful. If this element is not present, the -@code{gnus-score-interactive-default-score} number will be used -instead. This is 1000 by default. - -@item -If the third element is present, it should be a number---the @dfn{date -element}. This date says when the last time this score entry matched, -which provides a mechanism for expiring the score entries. It this -element is not present, the score entry is permanent. The date is -represented by the number of days since December 31, 1 BCE. - -@item -If the fourth element is present, it should be a symbol---the @dfn{type -element}. This element specifies what function should be used to see -whether this score entry matches the article. What match types that can -be used depends on what header you wish to perform the match on. -@table @dfn - -@item From, Subject, References, Xref, Message-ID -For most header types, there are the @code{r} and @code{R} (regexp), as -well as @code{s} and @code{S} (substring) types, and @code{e} and -@code{E} (exact match), and @code{w} (word match) types. If this -element is not present, Gnus will assume that substring matching should -be used. @code{R}, @code{S}, and @code{E} differ from the others in -that the matches will be done in a case-sensitive manner. All these -one-letter types are really just abbreviations for the @code{regexp}, -@code{string}, @code{exact}, and @code{word} types, which you can use -instead, if you feel like. - -@item Lines, Chars -These two headers use different match types: @code{<}, @code{>}, -@code{=}, @code{>=} and @code{<=}. - -These predicates are true if - -@example -(PREDICATE HEADER MATCH) -@end example - -evaluates to non-@code{nil}. For instance, the advanced match -@code{("lines" 4 <)} (@pxref{Advanced Scoring}) will result in the -following form: - -@lisp -(< header-value 4) -@end lisp - -Or to put it another way: When using @code{<} on @code{Lines} with 4 as -the match, we get the score added if the article has less than 4 lines. -(It's easy to get confused and think it's the other way around. But -it's not. I think.) - -When matching on @code{Lines}, be careful because some backends (like -@code{nndir}) do not generate @code{Lines} header, so every article ends -up being marked as having 0 lines. This can lead to strange results if -you happen to lower score of the articles with few lines. - -@item Date -For the Date header we have three kinda silly match types: -@code{before}, @code{at} and @code{after}. I can't really imagine this -ever being useful, but, like, it would feel kinda silly not to provide -this function. Just in case. You never know. Better safe than sorry. -Once burnt, twice shy. Don't judge a book by its cover. Never not have -sex on a first date. (I have been told that at least one person, and I -quote, ``found this function indispensable'', however.) - -@cindex ISO8601 -@cindex date -A more useful match type is @code{regexp}. With it, you can match the -date string using a regular expression. The date is normalized to -ISO8601 compact format first---@var{YYYYMMDD}@code{T}@var{HHMMSS}. If -you want to match all articles that have been posted on April 1st in -every year, you could use @samp{....0401.........} as a match string, -for instance. (Note that the date is kept in its original time zone, so -this will match articles that were posted when it was April 1st where -the article was posted from. Time zones are such wholesome fun for the -whole family, eh?) - -@item Head, Body, All -These three match keys use the same match types as the @code{From} (etc) -header uses. - -@item Followup -This match key is somewhat special, in that it will match the -@code{From} header, and affect the score of not only the matching -articles, but also all followups to the matching articles. This allows -you e.g. increase the score of followups to your own articles, or -decrease the score of followups to the articles of some known -trouble-maker. Uses the same match types as the @code{From} header -uses. (Using this match key will lead to creation of @file{ADAPT} -files.) - -@item Thread -This match key works along the same lines as the @code{Followup} match -key. If you say that you want to score on a (sub-)thread started by an -article with a @code{Message-ID} @var{x}, then you add a @samp{thread} -match. This will add a new @samp{thread} match for each article that -has @var{x} in its @code{References} header. (These new @samp{thread} -matches will use the @code{Message-ID}s of these matching articles.) -This will ensure that you can raise/lower the score of an entire thread, -even though some articles in the thread may not have complete -@code{References} headers. Note that using this may lead to -undeterministic scores of the articles in the thread. (Using this match -key will lead to creation of @file{ADAPT} files.) -@end table -@end enumerate - -@cindex Score File Atoms -@item mark -The value of this entry should be a number. Any articles with a score -lower than this number will be marked as read. - -@item expunge -The value of this entry should be a number. Any articles with a score -lower than this number will be removed from the summary buffer. - -@item mark-and-expunge -The value of this entry should be a number. Any articles with a score -lower than this number will be marked as read and removed from the -summary buffer. - -@item thread-mark-and-expunge -The value of this entry should be a number. All articles that belong to -a thread that has a total score below this number will be marked as read -and removed from the summary buffer. @code{gnus-thread-score-function} -says how to compute the total score for a thread. - -@item files -The value of this entry should be any number of file names. These files -are assumed to be score files as well, and will be loaded the same way -this one was. - -@item exclude-files -The clue of this entry should be any number of files. These files will -not be loaded, even though they would normally be so, for some reason or -other. - -@item eval -The value of this entry will be @code{eval}el. This element will be -ignored when handling global score files. - -@item read-only -Read-only score files will not be updated or saved. Global score files -should feature this atom (@pxref{Global Score Files}). (Note: -@dfn{Global} here really means @dfn{global}; not your personal -apply-to-all-groups score files.) - -@item orphan -The value of this entry should be a number. Articles that do not have -parents will get this number added to their scores. Imagine you follow -some high-volume newsgroup, like @samp{comp.lang.c}. Most likely you -will only follow a few of the threads, also want to see any new threads. - -You can do this with the following two score file entries: - -@example - (orphan -500) - (mark-and-expunge -100) -@end example - -When you enter the group the first time, you will only see the new -threads. You then raise the score of the threads that you find -interesting (with @kbd{I T} or @kbd{I S}), and ignore (@kbd{C y}) the -rest. Next time you enter the group, you will see new articles in the -interesting threads, plus any new threads. - -I.e.---the orphan score atom is for high-volume groups where a few -interesting threads which can't be found automatically by ordinary -scoring rules exist. - -@item adapt -This entry controls the adaptive scoring. If it is @code{t}, the -default adaptive scoring rules will be used. If it is @code{ignore}, no -adaptive scoring will be performed on this group. If it is a list, this -list will be used as the adaptive scoring rules. If it isn't present, -or is something other than @code{t} or @code{ignore}, the default -adaptive scoring rules will be used. If you want to use adaptive -scoring on most groups, you'd set @code{gnus-use-adaptive-scoring} to -@code{t}, and insert an @code{(adapt ignore)} in the groups where you do -not want adaptive scoring. If you only want adaptive scoring in a few -groups, you'd set @code{gnus-use-adaptive-scoring} to @code{nil}, and -insert @code{(adapt t)} in the score files of the groups where you want -it. - -@item adapt-file -All adaptive score entries will go to the file named by this entry. It -will also be applied when entering the group. This atom might be handy -if you want to adapt on several groups at once, using the same adaptive -file for a number of groups. - -@item local -@cindex local variables -The value of this entry should be a list of @code{(VAR VALUE)} pairs. -Each @var{var} will be made buffer-local to the current summary buffer, -and set to the value specified. This is a convenient, if somewhat -strange, way of setting variables in some groups if you don't like hooks -much. Note that the @var{value} won't be evaluated. -@end table - - -@node Score File Editing -@section Score File Editing - -You normally enter all scoring commands from the summary buffer, but you -might feel the urge to edit them by hand as well, so we've supplied you -with a mode for that. - -It's simply a slightly customized @code{emacs-lisp} mode, with these -additional commands: - -@table @kbd - -@item C-c C-c -@kindex C-c C-c (Score) -@findex gnus-score-edit-done -Save the changes you have made and return to the summary buffer -(@code{gnus-score-edit-done}). - -@item C-c C-d -@kindex C-c C-d (Score) -@findex gnus-score-edit-insert-date -Insert the current date in numerical format -(@code{gnus-score-edit-insert-date}). This is really the day number, if -you were wondering. - -@item C-c C-p -@kindex C-c C-p (Score) -@findex gnus-score-pretty-print -The adaptive score files are saved in an unformatted fashion. If you -intend to read one of these files, you want to @dfn{pretty print} it -first. This command (@code{gnus-score-pretty-print}) does that for -you. - -@end table - -Type @kbd{M-x gnus-score-mode} to use this mode. - -@vindex gnus-score-mode-hook -@code{gnus-score-menu-hook} is run in score mode buffers. - -In the summary buffer you can use commands like @kbd{V f} and @kbd{V -e} to begin editing score files. - - -@node Adaptive Scoring -@section Adaptive Scoring -@cindex adaptive scoring - -If all this scoring is getting you down, Gnus has a way of making it all -happen automatically---as if by magic. Or rather, as if by artificial -stupidity, to be precise. - -@vindex gnus-use-adaptive-scoring -When you read an article, or mark an article as read, or kill an -article, you leave marks behind. On exit from the group, Gnus can sniff -these marks and add score elements depending on what marks it finds. -You turn on this ability by setting @code{gnus-use-adaptive-scoring} to -@code{t} or @code{(line)}. If you want score adaptively on separate -words appearing in the subjects, you should set this variable to -@code{(word)}. If you want to use both adaptive methods, set this -variable to @code{(word line)}. - -@vindex gnus-default-adaptive-score-alist -To give you complete control over the scoring process, you can customize -the @code{gnus-default-adaptive-score-alist} variable. For instance, it -might look something like this: - -@lisp -(setq gnus-default-adaptive-score-alist - '((gnus-unread-mark) - (gnus-ticked-mark (from 4)) - (gnus-dormant-mark (from 5)) - (gnus-del-mark (from -4) (subject -1)) - (gnus-read-mark (from 4) (subject 2)) - (gnus-expirable-mark (from -1) (subject -1)) - (gnus-killed-mark (from -1) (subject -3)) - (gnus-kill-file-mark) - (gnus-ancient-mark) - (gnus-low-score-mark) - (gnus-catchup-mark (from -1) (subject -1)))) -@end lisp - -As you see, each element in this alist has a mark as a key (either a -variable name or a ``real'' mark---a character). Following this key is -a arbitrary number of header/score pairs. If there are no header/score -pairs following the key, no adaptive scoring will be done on articles -that have that key as the article mark. For instance, articles with -@code{gnus-unread-mark} in the example above will not get adaptive score -entries. - -Each article can have only one mark, so just a single of these rules -will be applied to each article. - -To take @code{gnus-del-mark} as an example---this alist says that all -articles that have that mark (i.e., are marked with @samp{D}) will have a -score entry added to lower based on the @code{From} header by -4, and -lowered by @code{Subject} by -1. Change this to fit your prejudices. - -If you have marked 10 articles with the same subject with -@code{gnus-del-mark}, the rule for that mark will be applied ten times. -That means that that subject will get a score of ten times -1, which -should be, unless I'm much mistaken, -10. - -If you have auto-expirable (mail) groups (@pxref{Expiring Mail}), all -the read articles will be marked with the @samp{E} mark. This'll -probably make adaptive scoring slightly impossible, so auto-expiring and -adaptive scoring doesn't really mix very well. - -The headers you can score on are @code{from}, @code{subject}, -@code{message-id}, @code{references}, @code{xref}, @code{lines}, -@code{chars} and @code{date}. In addition, you can score on -@code{followup}, which will create an adaptive score entry that matches -on the @code{References} header using the @code{Message-ID} of the -current article, thereby matching the following thread. - -You can also score on @code{thread}, which will try to score all -articles that appear in a thread. @code{thread} matches uses a -@code{Message-ID} to match on the @code{References} header of the -article. If the match is made, the @code{Message-ID} of the article is -added to the @code{thread} rule. (Think about it. I'd recommend two -aspirins afterwards.) - -If you use this scheme, you should set the score file atom @code{mark} -to something small---like -300, perhaps, to avoid having small random -changes result in articles getting marked as read. - -After using adaptive scoring for a week or so, Gnus should start to -become properly trained and enhance the authors you like best, and kill -the authors you like least, without you having to say so explicitly. - -You can control what groups the adaptive scoring is to be performed on -by using the score files (@pxref{Score File Format}). This will also -let you use different rules in different groups. - -@vindex gnus-adaptive-file-suffix -The adaptive score entries will be put into a file where the name is the -group name with @code{gnus-adaptive-file-suffix} appended. The default -is @samp{ADAPT}. - -@vindex gnus-score-exact-adapt-limit -When doing adaptive scoring, substring or fuzzy matching would probably -give you the best results in most cases. However, if the header one -matches is short, the possibility for false positives is great, so if -the length of the match is less than -@code{gnus-score-exact-adapt-limit}, exact matching will be used. If -this variable is @code{nil}, exact matching will always be used to avoid -this problem. - -@vindex gnus-default-adaptive-word-score-alist -As mentioned above, you can adapt either on individual words or entire -headers. If you adapt on words, the -@code{gnus-default-adaptive-word-score-alist} variable says what score -each instance of a word should add given a mark. - -@lisp -(setq gnus-default-adaptive-word-score-alist - `((,gnus-read-mark . 30) - (,gnus-catchup-mark . -10) - (,gnus-killed-mark . -20) - (,gnus-del-mark . -15))) -@end lisp - -This is the default value. If you have adaption on words enabled, every -word that appears in subjects of articles marked with -@code{gnus-read-mark} will result in a score rule that increase the -score with 30 points. - -@vindex gnus-default-ignored-adaptive-words -@vindex gnus-ignored-adaptive-words -Words that appear in the @code{gnus-default-ignored-adaptive-words} list -will be ignored. If you wish to add more words to be ignored, use the -@code{gnus-ignored-adaptive-words} list instead. - -@vindex gnus-adaptive-word-length-limit -Some may feel that short words shouldn't count when doing adaptive -scoring. If so, you may set @code{gnus-adaptive-word-length-limit} to -an integer. Words shorter than this number will be ignored. This -variable defaults til @code{nil}. - -@vindex gnus-adaptive-word-syntax-table -When the scoring is done, @code{gnus-adaptive-word-syntax-table} is the -syntax table in effect. It is similar to the standard syntax table, but -it considers numbers to be non-word-constituent characters. - -@vindex gnus-adaptive-word-minimum -If @code{gnus-adaptive-word-minimum} is set to a number, the adaptive -word scoring process will never bring down the score of an article to -below this number. The default is @code{nil}. - -@vindex gnus-adaptive-word-no-group-words -If @code{gnus-adaptive-word-no-group-words} is set to @code{t}, gnus -won't adaptively word score any of the words in the group name. Useful -for groups like @samp{comp.editors.emacs}, where most of the subject -lines contain the word @samp{emacs}. - -After using this scheme for a while, it might be nice to write a -@code{gnus-psychoanalyze-user} command to go through the rules and see -what words you like and what words you don't like. Or perhaps not. - -Note that the adaptive word scoring thing is highly experimental and is -likely to change in the future. Initial impressions seem to indicate -that it's totally useless as it stands. Some more work (involving more -rigorous statistical methods) will have to be done to make this useful. - - -@node Home Score File -@section Home Score File - -The score file where new score file entries will go is called the -@dfn{home score file}. This is normally (and by default) the score file -for the group itself. For instance, the home score file for -@samp{gnu.emacs.gnus} is @file{gnu.emacs.gnus.SCORE}. - -However, this may not be what you want. It is often convenient to share -a common home score file among many groups---all @samp{emacs} groups -could perhaps use the same home score file. - -@vindex gnus-home-score-file -The variable that controls this is @code{gnus-home-score-file}. It can -be: - -@enumerate -@item -A string. Then this file will be used as the home score file for all -groups. - -@item -A function. The result of this function will be used as the home score -file. The function will be called with the name of the group as the -parameter. - -@item -A list. The elements in this list can be: - -@enumerate -@item -@code{(@var{regexp} @var{file-name})}. If the @var{regexp} matches the -group name, the @var{file-name} will be used as the home score file. - -@item -A function. If the function returns non-nil, the result will be used as -the home score file. - -@item -A string. Use the string as the home score file. -@end enumerate - -The list will be traversed from the beginning towards the end looking -for matches. - -@end enumerate - -So, if you want to use just a single score file, you could say: - -@lisp -(setq gnus-home-score-file - "my-total-score-file.SCORE") -@end lisp - -If you want to use @file{gnu.SCORE} for all @samp{gnu} groups and -@file{rec.SCORE} for all @samp{rec} groups (and so on), you can say: - -@findex gnus-hierarchial-home-score-file -@lisp -(setq gnus-home-score-file - 'gnus-hierarchial-home-score-file) -@end lisp - -This is a ready-made function provided for your convenience. -Other functions include - -@table @code -@item gnus-current-home-score-file -@findex gnus-current-home-score-file -Return the ``current'' regular score file. This will make scoring -commands add entry to the ``innermost'' matching score file. - -@end table - -If you want to have one score file for the @samp{emacs} groups and -another for the @samp{comp} groups, while letting all other groups use -their own home score files: - -@lisp -(setq gnus-home-score-file - ;; All groups that match the regexp "\\.emacs" - '(("\\.emacs" "emacs.SCORE") - ;; All the comp groups in one score file - ("^comp" "comp.SCORE"))) -@end lisp - -@vindex gnus-home-adapt-file -@code{gnus-home-adapt-file} works exactly the same way as -@code{gnus-home-score-file}, but says what the home adaptive score file -is instead. All new adaptive file entries will go into the file -specified by this variable, and the same syntax is allowed. - -In addition to using @code{gnus-home-score-file} and -@code{gnus-home-adapt-file}, you can also use group parameters -(@pxref{Group Parameters}) and topic parameters (@pxref{Topic -Parameters}) to achieve much the same. Group and topic parameters take -precedence over this variable. - - -@node Followups To Yourself -@section Followups To Yourself - -Gnus offers two commands for picking out the @code{Message-ID} header in -the current buffer. Gnus will then add a score rule that scores using -this @code{Message-ID} on the @code{References} header of other -articles. This will, in effect, increase the score of all articles that -respond to the article in the current buffer. Quite useful if you want -to easily note when people answer what you've said. - -@table @code - -@item gnus-score-followup-article -@findex gnus-score-followup-article -This will add a score to articles that directly follow up your own -article. - -@item gnus-score-followup-thread -@findex gnus-score-followup-thread -This will add a score to all articles that appear in a thread ``below'' -your own article. -@end table - -@vindex message-sent-hook -These two functions are both primarily meant to be used in hooks like -@code{message-sent-hook}, like this: -@lisp -(add-hook 'message-sent-hook 'gnus-score-followup-thread) -@end lisp - - -If you look closely at your own @code{Message-ID}, you'll notice that -the first two or three characters are always the same. Here's two of -mine: - -@example - - -@end example - -So ``my'' ident on this machine is @samp{x6}. This can be -exploited---the following rule will raise the score on all followups to -myself: - -@lisp -("references" - ("" - 1000 nil r)) -@end lisp - -Whether it's the first two or first three characters that are ``yours'' -is system-dependent. - - -@node Scoring On Other Headers -@section Scoring On Other Headers -@cindex scoring on other headers - -Gnus is quite fast when scoring the ``traditional'' -headers---@samp{From}, @samp{Subject} and so on. However, scoring -other headers requires writing a @code{head} scoring rule, which means -that Gnus has to request every single article from the backend to find -matches. This takes a long time in big groups. - -Now, there's not much you can do about this for news groups, but for -mail groups, you have greater control. In the @pxref{To From -Newsgroups} section of the manual, it's explained in greater detail what -this mechanism does, but here's a cookbook example for @code{nnml} on -how to allow scoring on the @samp{To} and @samp{Cc} headers. - -Put the following in your @file{.gnus.el} file. - -@lisp -(setq gnus-extra-headers '(To Cc Newsgroups Keywords) - nnmail-extra-headers gnus-extra-headers) -@end lisp - -Restart Gnus and rebuild your @code{nnml} overview files with the -@kbd{M-x nnml-generate-nov-databases} command. This will take a long -time if you have much mail. - -Now you can score on @samp{To} and @samp{Cc} as ``extra headers'' like -so: @kbd{I e s p To RET RET}. - -See? Simple. - - -@node Scoring Tips -@section Scoring Tips -@cindex scoring tips - -@table @dfn - -@item Crossposts -@cindex crossposts -@cindex scoring crossposts -If you want to lower the score of crossposts, the line to match on is -the @code{Xref} header. -@lisp -("xref" (" talk.politics.misc:" -1000)) -@end lisp - -@item Multiple crossposts -If you want to lower the score of articles that have been crossposted to -more than, say, 3 groups: -@lisp -("xref" - ("[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+" - -1000 nil r)) -@end lisp - -@item Matching on the body -This is generally not a very good idea---it takes a very long time. -Gnus actually has to fetch each individual article from the server. But -you might want to anyway, I guess. Even though there are three match -keys (@code{Head}, @code{Body} and @code{All}), you should choose one -and stick with it in each score file. If you use any two, each article -will be fetched @emph{twice}. If you want to match a bit on the -@code{Head} and a bit on the @code{Body}, just use @code{All} for all -the matches. - -@item Marking as read -You will probably want to mark articles that have scores below a certain -number as read. This is most easily achieved by putting the following -in your @file{all.SCORE} file: -@lisp -((mark -100)) -@end lisp -You may also consider doing something similar with @code{expunge}. - -@item Negated character classes -If you say stuff like @code{[^abcd]*}, you may get unexpected results. -That will match newlines, which might lead to, well, The Unknown. Say -@code{[^abcd\n]*} instead. -@end table - - -@node Reverse Scoring -@section Reverse Scoring -@cindex reverse scoring - -If you want to keep just articles that have @samp{Sex with Emacs} in the -subject header, and expunge all other articles, you could put something -like this in your score file: - -@lisp -(("subject" - ("Sex with Emacs" 2)) - (mark 1) - (expunge 1)) -@end lisp - -So, you raise all articles that match @samp{Sex with Emacs} and mark the -rest as read, and expunge them to boot. - - -@node Global Score Files -@section Global Score Files -@cindex global score files - -Sure, other newsreaders have ``global kill files''. These are usually -nothing more than a single kill file that applies to all groups, stored -in the user's home directory. Bah! Puny, weak newsreaders! - -What I'm talking about here are Global Score Files. Score files from -all over the world, from users everywhere, uniting all nations in one -big, happy score file union! Ange-score! New and untested! - -@vindex gnus-global-score-files -All you have to do to use other people's score files is to set the -@code{gnus-global-score-files} variable. One entry for each score file, -or each score file directory. Gnus will decide by itself what score -files are applicable to which group. - -To use the score file -@file{/ftp@@ftp.gnus.org:/pub/larsi/ding/score/soc.motss.SCORE} and -all score files in the @file{/ftp@@ftp.some-where:/pub/score} directory, -say this: - -@lisp -(setq gnus-global-score-files - '("/ftp@@ftp.gnus.org:/pub/larsi/ding/score/soc.motss.SCORE" - "/ftp@@ftp.some-where:/pub/score/")) -@end lisp - -@findex gnus-score-search-global-directories -@noindent -Simple, eh? Directory names must end with a @samp{/}. These -directories are typically scanned only once during each Gnus session. -If you feel the need to manually re-scan the remote directories, you can -use the @code{gnus-score-search-global-directories} command. - -Note that, at present, using this option will slow down group entry -somewhat. (That is---a lot.) - -If you want to start maintaining score files for other people to use, -just put your score file up for anonymous ftp and announce it to the -world. Become a retro-moderator! Participate in the retro-moderator -wars sure to ensue, where retro-moderators battle it out for the -sympathy of the people, luring them to use their score files on false -premises! Yay! The net is saved! - -Here are some tips for the would-be retro-moderator, off the top of my -head: - -@itemize @bullet - -@item -Articles heavily crossposted are probably junk. -@item -To lower a single inappropriate article, lower by @code{Message-ID}. -@item -Particularly brilliant authors can be raised on a permanent basis. -@item -Authors that repeatedly post off-charter for the group can safely be -lowered out of existence. -@item -Set the @code{mark} and @code{expunge} atoms to obliterate the nastiest -articles completely. - -@item -Use expiring score entries to keep the size of the file down. You -should probably have a long expiry period, though, as some sites keep -old articles for a long time. -@end itemize - -... I wonder whether other newsreaders will support global score files -in the future. @emph{Snicker}. Yup, any day now, newsreaders like Blue -Wave, xrn and 1stReader are bound to implement scoring. Should we start -holding our breath yet? - - -@node Kill Files -@section Kill Files -@cindex kill files - -Gnus still supports those pesky old kill files. In fact, the kill file -entries can now be expiring, which is something I wrote before Daniel -Quinlan thought of doing score files, so I've left the code in there. - -In short, kill processing is a lot slower (and I do mean @emph{a lot}) -than score processing, so it might be a good idea to rewrite your kill -files into score files. - -Anyway, a kill file is a normal @code{emacs-lisp} file. You can put any -forms into this file, which means that you can use kill files as some -sort of primitive hook function to be run on group entry, even though -that isn't a very good idea. - -Normal kill files look like this: - -@lisp -(gnus-kill "From" "Lars Ingebrigtsen") -(gnus-kill "Subject" "ding") -(gnus-expunge "X") -@end lisp - -This will mark every article written by me as read, and remove the -marked articles from the summary buffer. Very useful, you'll agree. - -Other programs use a totally different kill file syntax. If Gnus -encounters what looks like a @code{rn} kill file, it will take a stab at -interpreting it. - -Two summary functions for editing a GNUS kill file: - -@table @kbd - -@item M-k -@kindex M-k (Summary) -@findex gnus-summary-edit-local-kill -Edit this group's kill file (@code{gnus-summary-edit-local-kill}). - -@item M-K -@kindex M-K (Summary) -@findex gnus-summary-edit-global-kill -Edit the general kill file (@code{gnus-summary-edit-global-kill}). -@end table - -Two group mode functions for editing the kill files: - -@table @kbd - -@item M-k -@kindex M-k (Group) -@findex gnus-group-edit-local-kill -Edit this group's kill file (@code{gnus-group-edit-local-kill}). - -@item M-K -@kindex M-K (Group) -@findex gnus-group-edit-global-kill -Edit the general kill file (@code{gnus-group-edit-global-kill}). -@end table - -Kill file variables: - -@table @code -@item gnus-kill-file-name -@vindex gnus-kill-file-name -A kill file for the group @samp{soc.motss} is normally called -@file{soc.motss.KILL}. The suffix appended to the group name to get -this file name is detailed by the @code{gnus-kill-file-name} variable. -The ``global'' kill file (not in the score file sense of ``global'', of -course) is just called @file{KILL}. - -@vindex gnus-kill-save-kill-file -@item gnus-kill-save-kill-file -If this variable is non-@code{nil}, Gnus will save the -kill file after processing, which is necessary if you use expiring -kills. - -@item gnus-apply-kill-hook -@vindex gnus-apply-kill-hook -@findex gnus-apply-kill-file-unless-scored -@findex gnus-apply-kill-file -A hook called to apply kill files to a group. It is -@code{(gnus-apply-kill-file)} by default. If you want to ignore the -kill file if you have a score file for the same group, you can set this -hook to @code{(gnus-apply-kill-file-unless-scored)}. If you don't want -kill files to be processed, you should set this variable to @code{nil}. - -@item gnus-kill-file-mode-hook -@vindex gnus-kill-file-mode-hook -A hook called in kill-file mode buffers. - -@end table - - -@node Converting Kill Files -@section Converting Kill Files -@cindex kill files -@cindex converting kill files - -If you have loads of old kill files, you may want to convert them into -score files. If they are ``regular'', you can use -the @file{gnus-kill-to-score.el} package; if not, you'll have to do it -by hand. - -The kill to score conversion package isn't included in Gnus by default. -You can fetch it from -@uref{http://www.stud.ifi.uio.no/~larsi/ding-various/gnus-kill-to-score.el}. - -If your old kill files are very complex---if they contain more -non-@code{gnus-kill} forms than not, you'll have to convert them by -hand. Or just let them be as they are. Gnus will still use them as -before. - - -@node GroupLens -@section GroupLens -@cindex GroupLens - -GroupLens is a collaborative filtering system that helps you work -together with other people to find the quality news articles out of the -huge volume of news articles generated every day. - -To accomplish this the GroupLens system combines your opinions about -articles you have already read with the opinions of others who have done -likewise and gives you a personalized prediction for each unread news -article. Think of GroupLens as a matchmaker. GroupLens watches how you -rate articles, and finds other people that rate articles the same way. -Once it has found some people you agree with it tells you, in the form -of a prediction, what they thought of the article. You can use this -prediction to help you decide whether or not you want to read the -article. - -@menu -* 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. -@end menu - - -@node Using GroupLens -@subsection Using GroupLens - -To use GroupLens you must register a pseudonym with your local Better -Bit Bureau (BBB). -@uref{http://www.cs.umn.edu/Research/GroupLens/bbb.html} is the only -better bit in town at the moment. - -Once you have registered you'll need to set a couple of variables. - -@table @code - -@item gnus-use-grouplens -@vindex gnus-use-grouplens -Setting this variable to a non-@code{nil} value will make Gnus hook into -all the relevant GroupLens functions. - -@item grouplens-pseudonym -@vindex grouplens-pseudonym -This variable should be set to the pseudonym you got when registering -with the Better Bit Bureau. - -@item grouplens-newsgroups -@vindex grouplens-newsgroups -A list of groups that you want to get GroupLens predictions for. - -@end table - -That's the minimum of what you need to get up and running with GroupLens. -Once you've registered, GroupLens will start giving you scores for -articles based on the average of what other people think. But, to get -the real benefit of GroupLens you need to start rating articles -yourself. Then the scores GroupLens gives you will be personalized for -you, based on how the people you usually agree with have already rated. - - -@node Rating Articles -@subsection Rating Articles - -In GroupLens, an article is rated on a scale from 1 to 5, inclusive. -Where 1 means something like this article is a waste of bandwidth and 5 -means that the article was really good. The basic question to ask -yourself is, "on a scale from 1 to 5 would I like to see more articles -like this one?" - -There are four ways to enter a rating for an article in GroupLens. - -@table @kbd - -@item r -@kindex r (GroupLens) -@findex bbb-summary-rate-article -This function will prompt you for a rating on a scale of one to five. - -@item k -@kindex k (GroupLens) -@findex grouplens-score-thread -This function will prompt you for a rating, and rate all the articles in -the thread. This is really useful for some of those long running giant -threads in rec.humor. - -@end table - -The next two commands, @kbd{n} and @kbd{,} take a numerical prefix to be -the score of the article you're reading. - -@table @kbd - -@item 1-5 n -@kindex n (GroupLens) -@findex grouplens-next-unread-article -Rate the article and go to the next unread article. - -@item 1-5 , -@kindex , (GroupLens) -@findex grouplens-best-unread-article -Rate the article and go to the next unread article with the highest score. - -@end table - -If you want to give the current article a score of 4 and then go to the -next article, just type @kbd{4 n}. - - -@node Displaying Predictions -@subsection Displaying Predictions - -GroupLens makes a prediction for you about how much you will like a -news article. The predictions from GroupLens are on a scale from 1 to -5, where 1 is the worst and 5 is the best. You can use the predictions -from GroupLens in one of three ways controlled by the variable -@code{gnus-grouplens-override-scoring}. - -@vindex gnus-grouplens-override-scoring -There are three ways to display predictions in grouplens. You may -choose to have the GroupLens scores contribute to, or override the -regular gnus scoring mechanism. override is the default; however, some -people prefer to see the Gnus scores plus the grouplens scores. To get -the separate scoring behavior you need to set -@code{gnus-grouplens-override-scoring} to @code{'separate}. To have the -GroupLens predictions combined with the grouplens scores set it to -@code{'override} and to combine the scores set -@code{gnus-grouplens-override-scoring} to @code{'combine}. When you use -the combine option you will also want to set the values for -@code{grouplens-prediction-offset} and -@code{grouplens-score-scale-factor}. - -@vindex grouplens-prediction-display -In either case, GroupLens gives you a few choices for how you would like -to see your predictions displayed. The display of predictions is -controlled by the @code{grouplens-prediction-display} variable. - -The following are valid values for that variable. - -@table @code -@item prediction-spot -The higher the prediction, the further to the right an @samp{*} is -displayed. - -@item confidence-interval -A numeric confidence interval. - -@item prediction-bar -The higher the prediction, the longer the bar. - -@item confidence-bar -Numerical confidence. - -@item confidence-spot -The spot gets bigger with more confidence. - -@item prediction-num -Plain-old numeric value. - -@item confidence-plus-minus -Prediction +/- confidence. - -@end table - - -@node GroupLens Variables -@subsection GroupLens Variables - -@table @code - -@item gnus-summary-grouplens-line-format -The summary line format used in GroupLens-enhanced summary buffers. It -accepts the same specs as the normal summary line format (@pxref{Summary -Buffer Lines}). The default is @samp{%U%R%z%l%I%(%[%4L: %-23,23n%]%) -%s\n}. - -@item grouplens-bbb-host -Host running the bbbd server. @samp{grouplens.cs.umn.edu} is the -default. - -@item grouplens-bbb-port -Port of the host running the bbbd server. The default is 9000. - -@item grouplens-score-offset -Offset the prediction by this value. In other words, subtract the -prediction value by this number to arrive at the effective score. The -default is 0. - -@item grouplens-score-scale-factor -This variable allows the user to magnify the effect of GroupLens scores. -The scale factor is applied after the offset. The default is 1. - -@end table - - -@node Advanced Scoring -@section Advanced Scoring - -Scoring on Subjects and From headers is nice enough, but what if you're -really interested in what a person has to say only when she's talking -about a particular subject? Or what if you really don't want to -read what person A has to say when she's following up to person B, but -want to read what she says when she's following up to person C? - -By using advanced scoring rules you may create arbitrarily complex -scoring patterns. - -@menu -* Advanced Scoring Syntax:: A definition. -* Advanced Scoring Examples:: What they look like. -* Advanced Scoring Tips:: Getting the most out of it. -@end menu - - -@node Advanced Scoring Syntax -@subsection Advanced Scoring Syntax - -Ordinary scoring rules have a string as the first element in the rule. -Advanced scoring rules have a list as the first element. The second -element is the score to be applied if the first element evaluated to a -non-@code{nil} value. - -These lists may consist of three logical operators, one redirection -operator, and various match operators. - -Logical operators: - -@table @code -@item & -@itemx and -This logical operator will evaluate each of its arguments until it finds -one that evaluates to @code{false}, and then it'll stop. If all arguments -evaluate to @code{true} values, then this operator will return -@code{true}. - -@item | -@itemx or -This logical operator will evaluate each of its arguments until it finds -one that evaluates to @code{true}. If no arguments are @code{true}, -then this operator will return @code{false}. - -@item ! -@itemx not -@itemx ¬ -This logical operator only takes a single argument. It returns the -logical negation of the value of its argument. - -@end table - -There is an @dfn{indirection operator} that will make its arguments -apply to the ancestors of the current article being scored. For -instance, @code{1-} will make score rules apply to the parent of the -current article. @code{2-} will make score rules apply to the -grandparent of the current article. Alternatively, you can write -@code{^^}, where the number of @code{^}s (carets) says how far back into -the ancestry you want to go. - -Finally, we have the match operators. These are the ones that do the -real work. Match operators are header name strings followed by a match -and a match type. A typical match operator looks like @samp{("from" -"Lars Ingebrigtsen" s)}. The header names are the same as when using -simple scoring, and the match types are also the same. - - -@node Advanced Scoring Examples -@subsection Advanced Scoring Examples - -Let's say you want to increase the score of articles written by Lars -when he's talking about Gnus: - -@example -((& - ("from" "Lars Ingebrigtsen") - ("subject" "Gnus")) - 1000) -@end example - -Quite simple, huh? - -When he writes long articles, he sometimes has something nice to say: - -@example -((& - ("from" "Lars Ingebrigtsen") - (| - ("subject" "Gnus") - ("lines" 100 >))) - 1000) -@end example - -However, when he responds to things written by Reig Eigil Logge, you -really don't want to read what he's written: - -@example -((& - ("from" "Lars Ingebrigtsen") - (1- ("from" "Reig Eigir Logge"))) - -100000) -@end example - -Everybody that follows up Redmondo when he writes about disappearing -socks should have their scores raised, but only when they talk about -white socks. However, when Lars talks about socks, it's usually not -very interesting: - -@example -((& - (1- - (& - ("from" "redmondo@@.*no" r) - ("body" "disappearing.*socks" t))) - (! ("from" "Lars Ingebrigtsen")) - ("body" "white.*socks")) - 1000) -@end example - -The possibilities are endless. - - -@node Advanced Scoring Tips -@subsection Advanced Scoring Tips - -The @code{&} and @code{|} logical operators do short-circuit logic. -That is, they stop processing their arguments when it's clear what the -result of the operation will be. For instance, if one of the arguments -of an @code{&} evaluates to @code{false}, there's no point in evaluating -the rest of the arguments. This means that you should put slow matches -(@samp{body}, @samp{header}) last and quick matches (@samp{from}, -@samp{subject}) first. - -The indirection arguments (@code{1-} and so on) will make their -arguments work on previous generations of the thread. If you say -something like: - -@example -... -(1- - (1- - ("from" "lars"))) -... -@end example - -Then that means "score on the from header of the grandparent of the -current article". An indirection is quite fast, but it's better to say: - -@example -(1- - (& - ("from" "Lars") - ("subject" "Gnus"))) -@end example - -than it is to say: - -@example -(& - (1- ("from" "Lars")) - (1- ("subject" "Gnus"))) -@end example - - -@node Score Decays -@section Score Decays -@cindex score decays -@cindex decays - -You may find that your scores have a tendency to grow without -bounds, especially if you're using adaptive scoring. If scores get too -big, they lose all meaning---they simply max out and it's difficult to -use them in any sensible way. - -@vindex gnus-decay-scores -@findex gnus-decay-score -@vindex gnus-decay-score-function -Gnus provides a mechanism for decaying scores to help with this problem. -When score files are loaded and @code{gnus-decay-scores} is -non-@code{nil}, Gnus will run the score files through the decaying -mechanism thereby lowering the scores of all non-permanent score rules. -The decay itself if performed by the @code{gnus-decay-score-function} -function, which is @code{gnus-decay-score} by default. Here's the -definition of that function: - -@lisp -(defun gnus-decay-score (score) - "Decay SCORE. -This is done according to `gnus-score-decay-constant' -and `gnus-score-decay-scale'." - (floor - (- score - (* (if (< score 0) 1 -1) - (min (abs score) - (max gnus-score-decay-constant - (* (abs score) - gnus-score-decay-scale))))))) -@end lisp - -@vindex gnus-score-decay-scale -@vindex gnus-score-decay-constant -@code{gnus-score-decay-constant} is 3 by default and -@code{gnus-score-decay-scale} is 0.05. This should cause the following: - -@enumerate -@item -Scores between -3 and 3 will be set to 0 when this function is called. - -@item -Scores with magnitudes between 3 and 60 will be shrunk by 3. - -@item -Scores with magnitudes greater than 60 will be shrunk by 5% of the -score. -@end enumerate - -If you don't like this decay function, write your own. It is called -with the score to be decayed as its only parameter, and it should return -the new score, which should be an integer. - -Gnus will try to decay scores once a day. If you haven't run Gnus for -four days, Gnus will decay the scores four times, for instance. - - -@node Various -@chapter Various - -@menu -* 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. -* Window Layout:: 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 tendinitis 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. -@end menu - - -@node Process/Prefix -@section Process/Prefix -@cindex process/prefix convention - -Many functions, among them functions for moving, decoding and saving -articles, use what is known as the @dfn{Process/Prefix convention}. - -This is a method for figuring out what articles the user wants the -command to be performed on. - -It goes like this: - -If the numeric prefix is N, perform the operation on the next N -articles, starting with the current one. If the numeric prefix is -negative, perform the operation on the previous N articles, starting -with the current one. - -@vindex transient-mark-mode -If @code{transient-mark-mode} in non-@code{nil} and the region is -active, all articles in the region will be worked upon. - -If there is no numeric prefix, but some articles are marked with the -process mark, perform the operation on the articles marked with -the process mark. - -If there is neither a numeric prefix nor any articles marked with the -process mark, just perform the operation on the current article. - -Quite simple, really, but it needs to be made clear so that surprises -are avoided. - -Commands that react to the process mark will push the current list of -process marked articles onto a stack and will then clear all process -marked articles. You can restore the previous configuration with the -@kbd{M P y} command (@pxref{Setting Process Marks}). - -@vindex gnus-summary-goto-unread -One thing that seems to shock & horrify lots of people is that, for -instance, @kbd{3 d} does exactly the same as @kbd{d} @kbd{d} @kbd{d}. -Since each @kbd{d} (which marks the current article as read) by default -goes to the next unread article after marking, this means that @kbd{3 d} -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 -@cindex interaction - -@table @code - -@item gnus-novice-user -@vindex gnus-novice-user -If this variable is non-@code{nil}, you are either a newcomer to the -World of Usenet, or you are very cautious, which is a nice thing to be, -really. You will be given questions of the type ``Are you sure you want -to do this?'' before doing anything dangerous. This is @code{t} by -default. - -@item gnus-expert-user -@vindex gnus-expert-user -If this variable is non-@code{nil}, you will seldom be asked any -questions by Gnus. It will simply assume you know what you're doing, no -matter how strange. - -@item gnus-interactive-catchup -@vindex gnus-interactive-catchup -Require confirmation before catching up a group if non-@code{nil}. It -is @code{t} by default. - -@item gnus-interactive-exit -@vindex gnus-interactive-exit -Require confirmation before exiting Gnus. This variable is @code{t} by -default. -@end table - - -@node Symbolic Prefixes -@section Symbolic Prefixes -@cindex symbolic prefixes - -Quite a lot of Emacs commands react to the (numeric) prefix. For -instance, @kbd{C-u 4 C-f} moves point four characters forward, and -@kbd{C-u 9 0 0 I s s p} adds a permanent @code{Subject} substring score -rule of 900 to the current article. - -This is all nice and well, but what if you want to give a command some -additional information? Well, what most commands do is interpret the -``raw'' prefix in some special way. @kbd{C-u 0 C-x C-s} means that one -doesn't want a backup file to be created when saving the current buffer, -for instance. But what if you want to save without making a backup -file, and you want Emacs to flash lights and play a nice tune at the -same time? You can't, and you're probably perfectly happy that way. - -@kindex M-i (Summary) -@findex gnus-symbolic-argument -I'm not, so I've added a second prefix---the @dfn{symbolic prefix}. The -prefix key is @kbd{M-i} (@code{gnus-symbolic-argument}), and the next -character typed in is the value. You can stack as many @kbd{M-i} -prefixes as you want. @kbd{M-i a M-C-u} means ``feed the @kbd{M-C-u} -command the symbolic prefix @code{a}''. @kbd{M-i a M-i b M-C-u} means -``feed the @kbd{M-C-u} command the symbolic prefixes @code{a} and -@code{b}''. You get the drift. - -Typing in symbolic prefixes to commands that don't accept them doesn't -hurt, but it doesn't do any good either. Currently not many Gnus -functions make use of the symbolic prefix. - -If you're interested in how Gnus implements this, @pxref{Extended -Interactive}. - - -@node Formatting Variables -@section Formatting Variables -@cindex formatting variables - -Throughout this manual you've probably noticed lots of variables called -things like @code{gnus-group-line-format} and -@code{gnus-summary-mode-line-format}. These control how Gnus is to -output lines in the various buffers. There's quite a lot of them. -Fortunately, they all use the same syntax, so there's not that much to -be annoyed by. - -Here's an example format spec (from the group buffer): @samp{%M%S%5y: -%(%g%)\n}. We see that it is indeed extremely ugly, and that there are -lots of percentages everywhere. - -@menu -* 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. -* Positioning Point:: Moving point to a position after an operation. -* Tabulation:: Tabulating your output. -* Wide Characters:: Dealing with wide characters. -@end menu - -Currently Gnus uses the following formatting variables: -@code{gnus-group-line-format}, @code{gnus-summary-line-format}, -@code{gnus-server-line-format}, @code{gnus-topic-line-format}, -@code{gnus-group-mode-line-format}, -@code{gnus-summary-mode-line-format}, -@code{gnus-article-mode-line-format}, -@code{gnus-server-mode-line-format}, and -@code{gnus-summary-pick-line-format}. - -All these format variables can also be arbitrary elisp forms. In that -case, they will be @code{eval}ed to insert the required lines. - -@kindex M-x gnus-update-format -@findex gnus-update-format -Gnus includes a command to help you while creating your own format -specs. @kbd{M-x gnus-update-format} will @code{eval} the current form, -update the spec in question and pop you to a buffer where you can -examine the resulting lisp code to be run to generate the line. - - - -@node Formatting Basics -@subsection Formatting Basics - -Each @samp{%} element will be replaced by some string or other when the -buffer in question is generated. @samp{%5y} means ``insert the @samp{y} -spec, and pad with spaces to get a 5-character field''. - -As with normal C and Emacs Lisp formatting strings, the numerical -modifier between the @samp{%} and the formatting type character will -@dfn{pad} the output so that it is always at least that long. -@samp{%5y} will make the field always (at least) five characters wide by -padding with spaces to the left. If you say @samp{%-5y}, it will pad to -the right instead. - -You may also wish to limit the length of the field to protect against -particularly wide values. For that you can say @samp{%4,6y}, which -means that the field will never be more than 6 characters wide and never -less than 4 characters wide. - - -@node Mode Line Formatting -@subsection Mode Line Formatting - -Mode line formatting variables (e.g., -@code{gnus-summary-mode-line-format}) follow the same rules as other, -buffer line oriented formatting variables (@pxref{Formatting Basics}) -with the following two differences: - -@enumerate - -@item -There must be no newline (@samp{\n}) at the end. - -@item -The special @samp{%%b} spec can be used to display the buffer name. -Well, it's no spec at all, really---@samp{%%} is just a way to quote -@samp{%} to allow it to pass through the formatting machinery unmangled, -so that Emacs receives @samp{%b}, which is something the Emacs mode line -display interprets to mean ``show the buffer name''. For a full list of -mode line specs Emacs understands, see the documentation of the -@code{mode-line-format} variable. - -@end enumerate - - -@node Advanced Formatting -@subsection Advanced Formatting - -It is frequently useful to post-process the fields in some way. -Padding, limiting, cutting off parts and suppressing certain values can -be achieved by using @dfn{tilde modifiers}. A typical tilde spec might -look like @samp{%~(cut 3)~(ignore "0")y}. - -These are the valid modifiers: - -@table @code -@item pad -@itemx pad-left -Pad the field to the left with spaces until it reaches the required -length. - -@item pad-right -Pad the field to the right with spaces until it reaches the required -length. - -@item max -@itemx max-left -Cut off characters from the left until it reaches the specified length. - -@item max-right -Cut off characters from the right until it reaches the specified -length. - -@item cut -@itemx cut-left -Cut off the specified number of characters from the left. - -@item cut-right -Cut off the specified number of characters from the right. - -@item ignore -Return an empty string if the field is equal to the specified value. - -@item form -Use the specified form as the field value when the @samp{@@} spec is -used. -@end table - -Let's take an example. The @samp{%o} spec in the summary mode lines -will return a date in compact ISO8601 format---@samp{19960809T230410}. -This is quite a mouthful, so we want to shave off the century number and -the time, leaving us with a six-character date. That would be -@samp{%~(cut-left 2)~(max-right 6)~(pad 6)o}. (Cutting is done before -maxing, and we need the padding to ensure that the date is never less -than 6 characters to make it look nice in columns.) - -Ignoring is done first; then cutting; then maxing; and then as the very -last operation, padding. - -@vindex gnus-compile-user-specs -If @code{gnus-compile-user-specs} is set to @code{nil} (@code{t} by -default) with your strong personality, and use a lots of these advanced -thingies, you'll find that Gnus gets quite slow. This can be helped -enormously by running @kbd{M-x gnus-compile} when you are satisfied with -the look of your lines. -@xref{Compilation}. - - -@node User-Defined Specs -@subsection User-Defined Specs - -All the specs allow for inserting user defined specifiers---@samp{u}. -The next character in the format string should be a letter. Gnus -will call the function @code{gnus-user-format-function-}@samp{X}, where -@samp{X} is the letter following @samp{%u}. The function will be passed -a single parameter---what the parameter means depends on what buffer -it's being called from. The function should return a string, which will -be inserted into the buffer just like information from any other -specifier. This function may also be called with dummy values, so it -should protect against that. - -You can also use tilde modifiers (@pxref{Advanced Formatting} to achieve -much the same without defining new functions. Here's an example: -@samp{%~(form (count-lines (point-min) (point)))@@}. The form -given here will be evaluated to yield the current line number, and then -inserted. - - -@node Formatting Fonts -@subsection Formatting Fonts - -There are specs for highlighting, and these are shared by all the format -variables. Text inside the @samp{%(} and @samp{%)} specifiers will get -the special @code{mouse-face} property set, which means that it will be -highlighted (with @code{gnus-mouse-face}) when you put the mouse pointer -over it. - -Text inside the @samp{%@{} and @samp{%@}} specifiers will have their -normal faces set using @code{gnus-face-0}, which is @code{bold} by -default. If you say @samp{%1@{}, you'll get @code{gnus-face-1} instead, -and so on. Create as many faces as you wish. The same goes for the -@code{mouse-face} specs---you can say @samp{%3(hello%)} to have -@samp{hello} mouse-highlighted with @code{gnus-mouse-face-3}. - -Text inside the @samp{%<} and @samp{%>} specifiers will get the special -@code{balloon-help} property set to @code{gnus-balloon-face-0}. If you -say @samp{%1<}, you'll get @code{gnus-balloon-face-1} and so on. The -@code{gnus-balloon-face-*} variables should be either strings or symbols -naming functions that return a string. Under @code{balloon-help-mode}, -when the mouse passes over text with this property set, a balloon window -will appear and display the string. Please refer to the doc string of -@code{balloon-help-mode} for more information on this. - -Here's an alternative recipe for the group buffer: - -@lisp -;; Create three face types. -(setq gnus-face-1 'bold) -(setq gnus-face-3 'italic) - -;; We want the article count to be in -;; a bold and green face. So we create -;; a new face called `my-green-bold'. -(copy-face 'bold 'my-green-bold) -;; Set the color. -(set-face-foreground 'my-green-bold "ForestGreen") -(setq gnus-face-2 'my-green-bold) - -;; Set the new & fancy format. -(setq gnus-group-line-format - "%M%S%3@{%5y%@}%2[:%] %(%1@{%g%@}%)\n") -@end lisp - -I'm sure you'll be able to use this scheme to create totally unreadable -and extremely vulgar displays. Have fun! - -Note that the @samp{%(} specs (and friends) do not make any sense on the -mode-line variables. - -@node Positioning Point -@subsection Positioning Point - -Gnus usually moves point to a pre-defined place on each line in most -buffers. By default, point move to the first colon character on the -line. You can customize this behaviour in three different ways. - -You can move the colon character to somewhere else on the line. - -@findex gnus-goto-colon -You can redefine the function that moves the point to the colon. The -function is called @code{gnus-goto-colon}. - -But perhaps the most convenient way to deal with this, if you don't want -to have a colon in your line, is to use the @samp{%C} specifier. If you -put a @samp{%C} somewhere in your format line definition, Gnus will -place point there. - - -@node Tabulation -@subsection Tabulation - -You can usually line up your displays by padding and cutting your -strings. However, when combining various strings of different size, it -can often be more convenient to just output the strings, and then worry -about lining up the following text afterwards. - -To do that, Gnus supplies tabulator specs--@samp{%=}. There are two -different types---@dfn{hard tabulators} and @dfn{soft tabulators}. - -@samp{%50=} will insert space characters to pad the line up to column -50. If the text is already past column 50, nothing will be inserted. -This is the soft tabulator. - -@samp{%-50=} will insert space characters to pad the line up to column -50. If the text is already past column 50, the excess text past column -50 will be removed. This is the hard tabulator. - - -@node Wide Characters -@subsection Wide Characters - -Proportional fonts in most countries have characters of the same width. -Some countries, however, use Latin characters mixed with wider -characters---most notable East Asian countries. - -The problem is that when formatting, Gnus assumes that if a string is 10 -characters wide, it'll be 10 Latin characters wide on the screen. In -these coutries, that's not true. - -@vindex gnus-use-correct-string-widths -To help fix this, you can set @code{gnus-use-correct-string-widths} to -@code{t}. This makes buffer generation slower, but the results will be -prettieer. The default value is @code{nil}. - - - -@node Window Layout -@section Window Layout -@cindex window layout - -No, there's nothing here about X, so be quiet. - -@vindex gnus-use-full-window -If @code{gnus-use-full-window} non-@code{nil}, Gnus will delete all -other windows and occupy the entire Emacs screen by itself. It is -@code{t} by default. - -Setting this variable to @code{nil} kinda works, but there are -glitches. Use at your own peril. - -@vindex gnus-buffer-configuration -@code{gnus-buffer-configuration} describes how much space each Gnus -buffer should be given. Here's an excerpt of this variable: - -@lisp -((group (vertical 1.0 (group 1.0 point) - (if gnus-carpal (group-carpal 4)))) - (article (vertical 1.0 (summary 0.25 point) - (article 1.0)))) -@end lisp - -This is an alist. The @dfn{key} is a symbol that names some action or -other. For instance, when displaying the group buffer, the window -configuration function will use @code{group} as the key. A full list of -possible names is listed below. - -The @dfn{value} (i.e., the @dfn{split}) says how much space each buffer -should occupy. To take the @code{article} split as an example - - -@lisp -(article (vertical 1.0 (summary 0.25 point) - (article 1.0))) -@end lisp - -This @dfn{split} says that the summary buffer should occupy 25% of upper -half of the screen, and that it is placed over the article buffer. As -you may have noticed, 100% + 25% is actually 125% (yup, I saw y'all -reaching for that calculator there). However, the special number -@code{1.0} is used to signal that this buffer should soak up all the -rest of the space available after the rest of the buffers have taken -whatever they need. There should be only one buffer with the @code{1.0} -size spec per split. - -Point will be put in the buffer that has the optional third element -@code{point}. In a @code{frame} split, the last subsplit having a leaf -split where the tag @code{frame-focus} is a member (i.e. is the third or -fourth element in the list, depending on whether the @code{point} tag is -present) gets focus. - -Here's a more complicated example: - -@lisp -(article (vertical 1.0 (group 4) - (summary 0.25 point) - (if gnus-carpal (summary-carpal 4)) - (article 1.0))) -@end lisp - -If the size spec is an integer instead of a floating point number, -then that number will be used to say how many lines a buffer should -occupy, not a percentage. - -If the @dfn{split} looks like something that can be @code{eval}ed (to be -precise---if the @code{car} of the split is a function or a subr), this -split will be @code{eval}ed. If the result is non-@code{nil}, it will -be used as a split. This means that there will be three buffers if -@code{gnus-carpal} is @code{nil}, and four buffers if @code{gnus-carpal} -is non-@code{nil}. - -Not complicated enough for you? Well, try this on for size: - -@lisp -(article (horizontal 1.0 - (vertical 0.5 - (group 1.0) - (gnus-carpal 4)) - (vertical 1.0 - (summary 0.25 point) - (summary-carpal 4) - (article 1.0)))) -@end lisp - -Whoops. Two buffers with the mystery 100% tag. And what's that -@code{horizontal} thingie? - -If the first element in one of the split is @code{horizontal}, Gnus will -split the window horizontally, giving you two windows side-by-side. -Inside each of these strips you may carry on all you like in the normal -fashion. The number following @code{horizontal} says what percentage of -the screen is to be given to this strip. - -For each split, there @emph{must} be one element that has the 100% tag. -The splitting is never accurate, and this buffer will eat any leftover -lines from the splits. - -To be slightly more formal, here's a definition of what a valid split -may look like: - -@example -split = frame | horizontal | vertical | buffer | form -frame = "(frame " size *split ")" -horizontal = "(horizontal " size *split ")" -vertical = "(vertical " size *split ")" -buffer = "(" buf-name " " size *[ "point" ] *[ "frame-focus"] ")" -size = number | frame-params -buf-name = group | article | summary ... -@end example - -The limitations are that the @code{frame} split can only appear as the -top-level split. @var{form} should be an Emacs Lisp form that should -return a valid split. We see that each split is fully recursive, and -may contain any number of @code{vertical} and @code{horizontal} splits. - -@vindex gnus-window-min-width -@vindex gnus-window-min-height -@cindex window height -@cindex window width -Finding the right sizes can be a bit complicated. No window may be less -than @code{gnus-window-min-height} (default 1) characters high, and all -windows must be at least @code{gnus-window-min-width} (default 1) -characters wide. Gnus will try to enforce this before applying the -splits. If you want to use the normal Emacs window width/height limit, -you can just set these two variables to @code{nil}. - -If you're not familiar with Emacs terminology, @code{horizontal} and -@code{vertical} splits may work the opposite way of what you'd expect. -Windows inside a @code{horizontal} split are shown side-by-side, and -windows within a @code{vertical} split are shown above each other. - -@findex gnus-configure-frame -If you want to experiment with window placement, a good tip is to call -@code{gnus-configure-frame} directly with a split. This is the function -that does all the real work when splitting buffers. Below is a pretty -nonsensical configuration with 5 windows; two for the group buffer and -three for the article buffer. (I said it was nonsensical.) If you -@code{eval} the statement below, you can get an idea of how that would -look straight away, without going through the normal Gnus channels. -Play with it until you're satisfied, and then use -@code{gnus-add-configuration} to add your new creation to the buffer -configuration list. - -@lisp -(gnus-configure-frame - '(horizontal 1.0 - (vertical 10 - (group 1.0) - (article 0.3 point)) - (vertical 1.0 - (article 1.0) - (horizontal 4 - (group 1.0) - (article 10))))) -@end lisp - -You might want to have several frames as well. No prob---just use the -@code{frame} split: - -@lisp -(gnus-configure-frame - '(frame 1.0 - (vertical 1.0 - (summary 0.25 point frame-focus) - (article 1.0)) - (vertical ((height . 5) (width . 15) - (user-position . t) - (left . -1) (top . 1)) - (picon 1.0)))) - -@end lisp - -This split will result in the familiar summary/article window -configuration in the first (or ``main'') frame, while a small additional -frame will be created where picons will be shown. As you can see, -instead of the normal @code{1.0} top-level spec, each additional split -should have a frame parameter alist as the size spec. -@xref{Frame Parameters, , Frame Parameters, elisp, The GNU Emacs Lisp -Reference Manual}. Under XEmacs, a frame property list will be -accepted, too---for instance, @code{(height 5 width 15 left -1 top 1)} -is such a plist. -The list of all possible keys for @code{gnus-buffer-configuration} can -be found in its default value. - -Note that the @code{message} key is used for both -@code{gnus-group-mail} and @code{gnus-summary-mail-other-window}. If -it is desirable to distinguish between the two, something like this -might be used: - -@lisp -(message (horizontal 1.0 - (vertical 1.0 (message 1.0 point)) - (vertical 0.24 - (if (buffer-live-p gnus-summary-buffer) - '(summary 0.5)) - (group 1.0))))) -@end lisp - -One common desire for a multiple frame split is to have a separate frame -for composing mail and news while leaving the original frame intact. To -accomplish that, something like the following can be done: - -@lisp -(message - (frame 1.0 - (if (not (buffer-live-p gnus-summary-buffer)) - (car (cdr (assoc 'group gnus-buffer-configuration))) - (car (cdr (assoc 'summary gnus-buffer-configuration)))) - (vertical ((user-position . t) (top . 1) (left . 1) - (name . "Message")) - (message 1.0 point)))) -@end lisp - -@findex gnus-add-configuration -Since the @code{gnus-buffer-configuration} variable is so long and -complicated, there's a function you can use to ease changing the config -of a single setting: @code{gnus-add-configuration}. If, for instance, -you want to change the @code{article} setting, you could say: - -@lisp -(gnus-add-configuration - '(article (vertical 1.0 - (group 4) - (summary .25 point) - (article 1.0)))) -@end lisp - -You'd typically stick these @code{gnus-add-configuration} calls in your -@file{.gnus.el} file or in some startup hook---they should be run after -Gnus has been loaded. - -@vindex gnus-always-force-window-configuration -If all windows mentioned in the configuration are already visible, Gnus -won't change the window configuration. If you always want to force the -``right'' window configuration, you can set -@code{gnus-always-force-window-configuration} to non-@code{nil}. - -If you're using tree displays (@pxref{Tree Display}), and the tree -window is displayed vertically next to another window, you may also want -to fiddle with @code{gnus-tree-minimize-window} to avoid having the -windows resized. - -@subsection Example Window Configurations - -@itemize @bullet -@item -Narrow left hand side occupied by group buffer. Right hand side split -between summary buffer (top one-sixth) and article buffer (bottom). - -@ifinfo -@example -+---+---------+ -| G | Summary | -| r +---------+ -| o | | -| u | Article | -| p | | -+---+---------+ -@end example -@end ifinfo - -@lisp -(gnus-add-configuration - '(article - (horizontal 1.0 - (vertical 25 (group 1.0)) - (vertical 1.0 - (summary 0.16 point) - (article 1.0))))) - -(gnus-add-configuration - '(summary - (horizontal 1.0 - (vertical 25 (group 1.0)) - (vertical 1.0 (summary 1.0 point))))) -@end lisp - -@end itemize - - -@node Faces and Fonts -@section Faces and Fonts -@cindex faces -@cindex fonts -@cindex colors - -Fiddling with fonts and faces used to be very difficult, but these days -it is very simple. You simply say @kbd{M-x customize-face}, pick out -the face you want to alter, and alter it via the standard Customize -interface. - - -@node Compilation -@section Compilation -@cindex compilation -@cindex byte-compilation - -@findex gnus-compile - -Remember all those line format specification variables? -@code{gnus-summary-line-format}, @code{gnus-group-line-format}, and so -on. By default, T-gnus will use the byte-compiled codes of these -variables and we can keep a slow-down to a minimum. However, if you set -@code{gnus-compile-user-specs} to @code{nil} (@code{t} by default), -unfortunately, changing them will mean a quite significant slow-down. -(The default values of these variables have byte-compiled functions -associated with them, while the user-generated versions do not, of -course.) - -To help with this, you can run @kbd{M-x gnus-compile} after you've -fiddled around with the variables and feel that you're (kind of) -satisfied. This will result in the new specs being byte-compiled, and -you'll get top speed again. Note that T-gnus will not save these -compiled specs in the @file{.newsrc.eld} file. - -@table @code -@item gnus-compile-user-specs -@vindex gnus-compile-user-specs -If it is non-nil, the user-defined format specs will be byte-compiled -automatically. The default value of this variable is @code{t}. It has -an effect on the values of @code{gnus-*-line-format-spec}. -@end table - - -@node Mode Lines -@section Mode Lines -@cindex mode lines - -@vindex gnus-updated-mode-lines -@code{gnus-updated-mode-lines} says what buffers should keep their mode -lines updated. It is a list of symbols. Supported symbols include -@code{group}, @code{article}, @code{summary}, @code{server}, -@code{browse}, and @code{tree}. If the corresponding symbol is present, -Gnus will keep that mode line updated with information that may be -pertinent. If this variable is @code{nil}, screen refresh may be -quicker. - -@cindex display-time - -@vindex gnus-mode-non-string-length -By default, Gnus displays information on the current article in the mode -lines of the summary and article buffers. The information Gnus wishes -to display (e.g. the subject of the article) is often longer than the -mode lines, and therefore have to be cut off at some point. The -@code{gnus-mode-non-string-length} variable says how long the other -elements on the line is (i.e., the non-info part). If you put -additional elements on the mode line (e.g. a clock), you should modify -this variable: - -@c Hook written by Francesco Potorti` -@lisp -(add-hook 'display-time-hook - (lambda () (setq gnus-mode-non-string-length - (+ 21 - (if line-number-mode 5 0) - (if column-number-mode 4 0) - (length display-time-string))))) -@end lisp - -If this variable is @code{nil} (which is the default), the mode line -strings won't be chopped off, and they won't be padded either. Note -that the default is unlikely to be desirable, as even the percentage -complete in the buffer may be crowded off the mode line; the user should -configure this variable appropriately for her configuration. - - -@node Highlighting and Menus -@section Highlighting and Menus -@cindex visual -@cindex highlighting -@cindex menus - -@vindex gnus-visual -The @code{gnus-visual} variable controls most of the Gnus-prettifying -aspects. If @code{nil}, Gnus won't attempt to create menus or use fancy -colors or fonts. This will also inhibit loading the @file{gnus-vis.el} -file. - -This variable can be a list of visual properties that are enabled. The -following elements are valid, and are all included by default: - -@table @code -@item group-highlight -Do highlights in the group buffer. -@item summary-highlight -Do highlights in the summary buffer. -@item article-highlight -Do highlights in the article buffer. -@item highlight -Turn on highlighting in all buffers. -@item group-menu -Create menus in the group buffer. -@item summary-menu -Create menus in the summary buffers. -@item article-menu -Create menus in the article buffer. -@item browse-menu -Create menus in the browse buffer. -@item server-menu -Create menus in the server buffer. -@item score-menu -Create menus in the score buffers. -@item menu -Create menus in all buffers. -@end table - -So if you only want highlighting in the article buffer and menus in all -buffers, you could say something like: - -@lisp -(setq gnus-visual '(article-highlight menu)) -@end lisp - -If you want highlighting only and no menus whatsoever, you'd say: - -@lisp -(setq gnus-visual '(highlight)) -@end lisp - -If @code{gnus-visual} is @code{t}, highlighting and menus will be used -in all Gnus buffers. - -Other general variables that influence the look of all buffers include: - -@table @code -@item gnus-mouse-face -@vindex gnus-mouse-face -This is the face (i.e., font) used for mouse highlighting in Gnus. No -mouse highlights will be done if @code{gnus-visual} is @code{nil}. - -@end table - -There are hooks associated with the creation of all the different menus: - -@table @code - -@item gnus-article-menu-hook -@vindex gnus-article-menu-hook -Hook called after creating the article mode menu. - -@item gnus-group-menu-hook -@vindex gnus-group-menu-hook -Hook called after creating the group mode menu. - -@item gnus-summary-menu-hook -@vindex gnus-summary-menu-hook -Hook called after creating the summary mode menu. - -@item gnus-server-menu-hook -@vindex gnus-server-menu-hook -Hook called after creating the server mode menu. - -@item gnus-browse-menu-hook -@vindex gnus-browse-menu-hook -Hook called after creating the browse mode menu. - -@item gnus-score-menu-hook -@vindex gnus-score-menu-hook -Hook called after creating the score mode menu. - -@end table - - -@node Buttons -@section Buttons -@cindex buttons -@cindex mouse -@cindex click - -Those new-fangled @dfn{mouse} contraptions is very popular with the -young, hep kids who don't want to learn the proper way to do things -these days. Why, I remember way back in the summer of '89, when I was -using Emacs on a Tops 20 system. Three hundred users on one single -machine, and every user was running Simula compilers. Bah! - -Right. - -@vindex gnus-carpal -Well, you can make Gnus display bufferfuls of buttons you can click to -do anything by setting @code{gnus-carpal} to @code{t}. Pretty simple, -really. Tell the chiropractor I sent you. - - -@table @code - -@item gnus-carpal-mode-hook -@vindex gnus-carpal-mode-hook -Hook run in all carpal mode buffers. - -@item gnus-carpal-button-face -@vindex gnus-carpal-button-face -Face used on buttons. - -@item gnus-carpal-header-face -@vindex gnus-carpal-header-face -Face used on carpal buffer headers. - -@item gnus-carpal-group-buffer-buttons -@vindex gnus-carpal-group-buffer-buttons -Buttons in the group buffer. - -@item gnus-carpal-summary-buffer-buttons -@vindex gnus-carpal-summary-buffer-buttons -Buttons in the summary buffer. - -@item gnus-carpal-server-buffer-buttons -@vindex gnus-carpal-server-buffer-buttons -Buttons in the server buffer. - -@item gnus-carpal-browse-buffer-buttons -@vindex gnus-carpal-browse-buffer-buttons -Buttons in the browse buffer. -@end table - -All the @code{buttons} variables are lists. The elements in these list -are either cons cells where the @code{car} contains a text to be displayed and -the @code{cdr} contains a function symbol, or a simple string. - - -@node Daemons -@section Daemons -@cindex demons -@cindex daemons - -Gnus, being larger than any program ever written (allegedly), does lots -of strange stuff that you may wish to have done while you're not -present. For instance, you may want it to check for new mail once in a -while. Or you may want it to close down all connections to all servers -when you leave Emacs idle. And stuff like that. - -Gnus will let you do stuff like that by defining various -@dfn{handlers}. Each handler consists of three elements: A -@var{function}, a @var{time}, and an @var{idle} parameter. - -Here's an example of a handler that closes connections when Emacs has -been idle for thirty minutes: - -@lisp -(gnus-demon-close-connections nil 30) -@end lisp - -Here's a handler that scans for PGP headers every hour when Emacs is -idle: - -@lisp -(gnus-demon-scan-pgp 60 t) -@end lisp - -This @var{time} parameter and than @var{idle} parameter work together -in a strange, but wonderful fashion. Basically, if @var{idle} is -@code{nil}, then the function will be called every @var{time} minutes. - -If @var{idle} is @code{t}, then the function will be called after -@var{time} minutes only if Emacs is idle. So if Emacs is never idle, -the function will never be called. But once Emacs goes idle, the -function will be called every @var{time} minutes. - -If @var{idle} is a number and @var{time} is a number, the function will -be called every @var{time} minutes only when Emacs has been idle for -@var{idle} minutes. - -If @var{idle} is a number and @var{time} is @code{nil}, the function -will be called once every time Emacs has been idle for @var{idle} -minutes. - -And if @var{time} is a string, it should look like @samp{07:31}, and -the function will then be called once every day somewhere near that -time. Modified by the @var{idle} parameter, of course. - -@vindex gnus-demon-timestep -(When I say ``minute'' here, I really mean @code{gnus-demon-timestep} -seconds. This is 60 by default. If you change that variable, -all the timings in the handlers will be affected.) - -So, if you want to add a handler, you could put something like this in -your @file{.gnus} file: - -@findex gnus-demon-add-handler -@lisp -(gnus-demon-add-handler 'gnus-demon-close-connections 30 t) -@end lisp - -@findex gnus-demon-add-nocem -@findex gnus-demon-add-scanmail -@findex gnus-demon-add-rescan -@findex gnus-demon-add-scan-timestamps -@findex gnus-demon-add-disconnection -Some ready-made functions to do this have been created: -@code{gnus-demon-add-nocem}, @code{gnus-demon-add-disconnection}, -@code{gnus-demon-add-nntp-close-connection}, -@code{gnus-demon-add-scan-timestamps}, @code{gnus-demon-add-rescan}, and -@code{gnus-demon-add-scanmail}. Just put those functions in your -@file{.gnus} if you want those abilities. - -@findex gnus-demon-init -@findex gnus-demon-cancel -@vindex gnus-demon-handlers -If you add handlers to @code{gnus-demon-handlers} directly, you should -run @code{gnus-demon-init} to make the changes take hold. To cancel all -daemons, you can use the @code{gnus-demon-cancel} function. - -Note that adding daemons can be pretty naughty if you over do it. Adding -functions that scan all news and mail from all servers every two seconds -is a sure-fire way of getting booted off any respectable system. So -behave. - - -@node NoCeM -@section NoCeM -@cindex nocem -@cindex spam - -@dfn{Spamming} is posting the same article lots and lots of times. -Spamming is bad. Spamming is evil. - -Spamming is usually canceled within a day or so by various anti-spamming -agencies. These agencies usually also send out @dfn{NoCeM} messages. -NoCeM is pronounced ``no see-'em'', and means what the name -implies---these are messages that make the offending articles, like, go -away. - -What use are these NoCeM messages if the articles are canceled anyway? -Some sites do not honor cancel messages and some sites just honor cancels -from a select few people. Then you may wish to make use of the NoCeM -messages, which are distributed in the @samp{alt.nocem.misc} newsgroup. - -Gnus can read and parse the messages in this group automatically, and -this will make spam disappear. - -There are some variables to customize, of course: - -@table @code -@item gnus-use-nocem -@vindex gnus-use-nocem -Set this variable to @code{t} to set the ball rolling. It is @code{nil} -by default. - -@item gnus-nocem-groups -@vindex gnus-nocem-groups -Gnus will look for NoCeM messages in the groups in this list. The -default is @code{("news.lists.filters" "news.admin.net-abuse.bulletins" -"alt.nocem.misc" "news.admin.net-abuse.announce")}. - -@item gnus-nocem-issuers -@vindex gnus-nocem-issuers -There are many people issuing NoCeM messages. This list says what -people you want to listen to. The default is @code{("Automoose-1" -"clewis@@ferret.ocunix.on.ca" "cosmo.roadkill" "SpamHippo" -"hweede@@snafu.de")}; fine, upstanding citizens all of them. - -Known despammers that you can put in this list are listed at -@uref{http://www.xs4all.nl/~rosalind/nocemreg/nocemreg.html}. - -You do not have to heed NoCeM messages from all these people---just the -ones you want to listen to. You also don't have to accept all NoCeM -messages from the people you like. Each NoCeM message has a @dfn{type} -header that gives the message a (more or less, usually less) rigorous -definition. Common types are @samp{spam}, @samp{spew}, @samp{mmf}, -@samp{binary}, and @samp{troll}. To specify this, you have to use -@code{(@var{issuer} @var{conditions} @dots{})} elements in the list. -Each condition is either a string (which is a regexp that matches types -you want to use) or a list on the form @code{(not @var{string})}, where -@var{string} is a regexp that matches types you don't want to use. - -For instance, if you want all NoCeM messages from Chris Lewis except his -@samp{troll} messages, you'd say: - -@lisp -("clewis@@ferret.ocunix.on.ca" ".*" (not "troll")) -@end lisp - -On the other hand, if you just want nothing but his @samp{spam} and -@samp{spew} messages, you'd say: - -@lisp -("clewis@@ferret.ocunix.on.ca" (not ".*") "spew" "spam") -@end lisp - -The specs are applied left-to-right. - - -@item gnus-nocem-verifyer -@vindex gnus-nocem-verifyer -@findex mc-verify -This should be a function for verifying that the NoCeM issuer is who she -says she is. The default is @code{mc-verify}, which is a Mailcrypt -function. If this is too slow and you don't care for verification -(which may be dangerous), you can set this variable to @code{nil}. - -If you want signed NoCeM messages to be verified and unsigned messages -not to be verified (but used anyway), you could do something like: - -@lisp -(setq gnus-nocem-verifyer 'my-gnus-mc-verify) - -(defun my-gnus-mc-verify () - (not (eq 'forged - (ignore-errors - (if (mc-verify) - t - 'forged))))) -@end lisp - -This might be dangerous, though. - -@item gnus-nocem-directory -@vindex gnus-nocem-directory -This is where Gnus will store its NoCeM cache files. The default is -@file{~/News/NoCeM/}. - -@item gnus-nocem-expiry-wait -@vindex gnus-nocem-expiry-wait -The number of days before removing old NoCeM entries from the cache. -The default is 15. If you make it shorter Gnus will be faster, but you -might then see old spam. - -@item gnus-nocem-check-from -@vindex gnus-nocem-check-from -Non-@code{nil} means check for valid issuers in message bodies. -Otherwise don't bother fetching articles unless their author matches a -valid issuer; that is much faster if you are selective about the -issuers. - -@item gnus-nocem-check-article-limit -@vindex gnus-nocem-check-article-limit -If non-@code{nil}, the maximum number of articles to check in any NoCeM -group. NoCeM groups can be huge and very slow to process. - -@end table - -Using NoCeM could potentially be a memory hog. If you have many living -(i. e., subscribed or unsubscribed groups), your Emacs process will grow -big. If this is a problem, you should kill off all (or most) of your -unsubscribed groups (@pxref{Subscription Commands}). - - -@node Undo -@section Undo -@cindex undo - -It is very useful to be able to undo actions one has done. In normal -Emacs buffers, it's easy enough---you just push the @code{undo} button. -In Gnus buffers, however, it isn't that simple. - -The things Gnus displays in its buffer is of no value whatsoever to -Gnus---it's all just data designed to look nice to the user. -Killing a group in the group buffer with @kbd{C-k} makes the line -disappear, but that's just a side-effect of the real action---the -removal of the group in question from the internal Gnus structures. -Undoing something like that can't be done by the normal Emacs -@code{undo} function. - -Gnus tries to remedy this somewhat by keeping track of what the user -does and coming up with actions that would reverse the actions the user -takes. When the user then presses the @code{undo} key, Gnus will run -the code to reverse the previous action, or the previous actions. -However, not all actions are easily reversible, so Gnus currently offers -a few key functions to be undoable. These include killing groups, -yanking groups, and changing the list of read articles of groups. -That's it, really. More functions may be added in the future, but each -added function means an increase in data to be stored, so Gnus will -never be totally undoable. - -@findex gnus-undo-mode -@vindex gnus-use-undo -@findex gnus-undo -The undoability is provided by the @code{gnus-undo-mode} minor mode. It -is used if @code{gnus-use-undo} is non-@code{nil}, which is the -default. The @kbd{M-C-_} key performs the @code{gnus-undo} -command, which should feel kinda like the normal Emacs @code{undo} -command. - - -@node Moderation -@section Moderation -@cindex moderation - -If you are a moderator, you can use the @file{gnus-mdrtn.el} package. -It is not included in the standard Gnus package. Write a mail to -@samp{larsi@@gnus.org} and state what group you moderate, and you'll -get a copy. - -The moderation package is implemented as a minor mode for summary -buffers. Put - -@lisp -(add-hook 'gnus-summary-mode-hook 'gnus-moderate) -@end lisp - -in your @file{.gnus.el} file. - -If you are the moderator of @samp{rec.zoofle}, this is how it's -supposed to work: - -@enumerate -@item -You split your incoming mail by matching on -@samp{Newsgroups:.*rec.zoofle}, which will put all the to-be-posted -articles in some mail group---for instance, @samp{nnml:rec.zoofle}. - -@item -You enter that group once in a while and post articles using the @kbd{e} -(edit-and-post) or @kbd{s} (just send unedited) commands. - -@item -If, while reading the @samp{rec.zoofle} newsgroup, you happen upon some -articles that weren't approved by you, you can cancel them with the -@kbd{c} command. -@end enumerate - -To use moderation mode in these two groups, say: - -@lisp -(setq gnus-moderated-list - "^nnml:rec.zoofle$\\|^rec.zoofle$") -@end lisp - - -@node XEmacs Enhancements -@section XEmacs Enhancements -@cindex XEmacs - -XEmacs is able to display pictures and stuff, so Gnus has taken -advantage of that. - -@menu -* 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. -@end menu - - -@node Picons -@subsection Picons - -@iftex -@iflatex -\include{picons} -@end iflatex -@end iftex - -So@dots{} You want to slow down your news reader even more! This is a -good way to do so. Its also a great way to impress people staring -over your shoulder as you read news. - -@menu -* 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. -@end menu - - -@node Picon Basics -@subsubsection Picon Basics - -What are Picons? To quote directly from the Picons Web site: - -@iftex -@iflatex -\margindex{} -@end iflatex -@end iftex - -@quotation -@dfn{Picons} is short for ``personal icons''. They're small, -constrained images used to represent users and domains on the net, -organized into databases so that the appropriate image for a given -e-mail address can be found. Besides users and domains, there are picon -databases for Usenet newsgroups and weather forecasts. The picons are -in either monochrome @code{XBM} format or color @code{XPM} and -@code{GIF} formats. -@end quotation - -@vindex gnus-picons-piconsearch-url -If you have a permanent connection to the Internet you can use Steve -Kinzler's Picons Search engine by setting -@code{gnus-picons-piconsearch-url} to the string @* -@uref{http://www.cs.indiana.edu/picons/search.html}. - -@vindex gnus-picons-database -Otherwise you need a local copy of his database. For instructions on -obtaining and installing the picons databases, point your Web browser at @* -@uref{http://www.cs.indiana.edu/picons/ftp/index.html}. Gnus expects -picons to be installed into a location pointed to by -@code{gnus-picons-database}. - - -@node Picon Requirements -@subsubsection Picon Requirements - -To have Gnus display Picons for you, you must be running XEmacs -19.13 or greater since all other versions of Emacs aren't yet able to -display images. - -Additionally, you must have @code{x} support compiled into XEmacs. To -display color picons which are much nicer than the black & white one, -you also need one of @code{xpm} or @code{gif} compiled into XEmacs. - -@vindex gnus-picons-convert-x-face -If you want to display faces from @code{X-Face} headers, you should have -the @code{xface} support compiled into XEmacs. Otherwise you must have -the @code{netpbm} utilities installed, or munge the -@code{gnus-picons-convert-x-face} variable to use something else. - - -@node Easy Picons -@subsubsection Easy Picons - -To enable displaying picons, simply put the following line in your -@file{~/.gnus} file and start Gnus. - -@lisp -(setq gnus-use-picons t) -(setq gnus-treat-display-picons t) -@end lisp - -and make sure @code{gnus-picons-database} points to the directory -containing the Picons databases. - -Alternatively if you want to use the web piconsearch engine add this: - -@lisp -(setq gnus-picons-piconsearch-url - "http://www.cs.indiana.edu:800/piconsearch") -@end lisp - - -@node Hard Picons -@subsubsection Hard Picons - -@iftex -@iflatex -\margindex{} -@end iflatex -@end iftex - -Gnus can display picons for you as you enter and leave groups and -articles. It knows how to interact with three sections of the picons -database. Namely, it can display the picons newsgroup pictures, -author's face picture(s), and the authors domain. To enable this -feature, you need to select where to get the picons from, and where to -display them. - -@table @code - -@item gnus-picons-database -@vindex gnus-picons-database -The location of the picons database. Should point to a directory -containing the @file{news}, @file{domains}, @file{users} (and so on) -subdirectories. This is only useful if -@code{gnus-picons-piconsearch-url} is @code{nil}. Defaults to -@file{/usr/local/faces/}. - -@item gnus-picons-piconsearch-url -@vindex gnus-picons-piconsearch-url -The URL for the web picons search engine. The only currently known -engine is @uref{http://www.cs.indiana.edu:800/piconsearch}. To -workaround network delays, icons will be fetched in the background. If -this is @code{nil} 'the default), then picons are fetched from local -database indicated by @code{gnus-picons-database}. - -@item gnus-picons-display-where -@vindex gnus-picons-display-where -Where the picon images should be displayed. It is @code{picons} by -default (which by default maps to the buffer @samp{*Picons*}). Other -valid places could be @code{article}, @code{summary}, or -@samp{*scratch*} for all I care. Just make sure that you've made the -buffer visible using the standard Gnus window configuration -routines---@pxref{Window Layout}. - -@item gnus-picons-group-excluded-groups -@vindex gnus-picons-group-excluded-groups -Groups that are matched by this regexp won't have their group icons -displayed. - -@end table - -Note: If you set @code{gnus-use-picons} to @code{t}, it will set up your -window configuration for you to include the @code{picons} buffer. - -Now that you've made those decision, you need to add the following -functions to the appropriate hooks so these pictures will get displayed -at the right time. - -@vindex gnus-picons-display-where -@table @code -@item gnus-article-display-picons -@findex gnus-article-display-picons -Looks up and displays the picons for the author and the author's domain -in the @code{gnus-picons-display-where} buffer. - -@item gnus-picons-article-display-x-face -@findex gnus-article-display-picons -Decodes and displays the X-Face header if present. - -@end table - - - -@node Picon Useless Configuration -@subsubsection Picon Useless Configuration - -@iftex -@iflatex -\margindex{} -@end iflatex -@end iftex - -The following variables offer further control over how things are -done, where things are located, and other useless stuff you really -don't need to worry about. - -@table @code - -@item gnus-picons-news-directories -@vindex gnus-picons-news-directories -List of subdirectories to search in @code{gnus-picons-database} for -newsgroups faces. @code{("news")} is the default. - -@item gnus-picons-user-directories -@vindex gnus-picons-user-directories -List of subdirectories to search in @code{gnus-picons-database} for user -faces. @code{("local" "users" "usenix" "misc")} is the default. - -@item gnus-picons-domain-directories -@vindex gnus-picons-domain-directories -List of subdirectories to search in @code{gnus-picons-database} for -domain name faces. Defaults to @code{("domains")}. Some people may -want to add @samp{"unknown"} to this list. - -@item gnus-picons-convert-x-face -@vindex gnus-picons-convert-x-face -If you don't have @code{xface} support builtin XEmacs, this is the -command to use to convert the @code{X-Face} header to an X bitmap -(@code{xbm}). Defaults to @code{(format "@{ echo '/* Width=48, -Height=48 */'; uncompface; @} | icontopbm | pbmtoxbm > %s" -gnus-picons-x-face-file-name)} - -@item gnus-picons-x-face-file-name -@vindex gnus-picons-x-face-file-name -Names a temporary file to store the @code{X-Face} bitmap in. Defaults -to @code{(format "/tmp/picon-xface.%s.xbm" (user-login-name))}. - -@item gnus-picons-has-modeline-p -@vindex gnus-picons-has-modeline-p -If you have set @code{gnus-picons-display-where} to @code{picons}, your -XEmacs frame will become really cluttered. To alleviate this a bit you -can set @code{gnus-picons-has-modeline-p} to @code{nil}; this will -remove the mode line from the Picons buffer. This is only useful if -@code{gnus-picons-display-where} is @code{picons}. - -@item gnus-picons-refresh-before-display -@vindex gnus-picons-refresh-before-display -If non-nil, display the article buffer before computing the picons. -Defaults to @code{nil}. - -@item gnus-picons-display-as-address -@vindex gnus-picons-display-as-address -If @code{t} display textual email addresses along with pictures. -Defaults to @code{t}. - -@item gnus-picons-file-suffixes -@vindex gnus-picons-file-suffixes -Ordered list of suffixes on picon file names to try. Defaults to -@code{("xpm" "gif" "xbm")} minus those not builtin your XEmacs. - -@item gnus-picons-setup-hook -@vindex gnus-picons-setup-hook -Hook run in the picon buffer, if that is displayed. - -@item gnus-picons-display-article-move-p -@vindex gnus-picons-display-article-move-p -Whether to move point to first empty line when displaying picons. This -has only an effect if `gnus-picons-display-where' has value `article'. - -If @code{nil}, display the picons in the @code{From} and -@code{Newsgroups} lines. This is the default. - -@item gnus-picons-clear-cache-on-shutdown -@vindex gnus-picons-clear-cache-on-shutdown -Whether to clear the picons cache when exiting gnus. Gnus caches every -picons it finds while it is running. This saves some time in the search -process but eats some memory. If this variable is set to @code{nil}, -Gnus will never clear the cache itself; you will have to manually call -@code{gnus-picons-clear-cache} to clear it. Otherwise the cache will be -cleared every time you exit Gnus. Defaults to @code{t}. - -@iftex -@iflatex -\margindex{} -@end iflatex -@end iftex - -@end table - -@node Smileys -@subsection Smileys -@cindex smileys - -@iftex -@iflatex -\gnusfig{-3cm}{0.5cm}{\epsfig{figure=tmp/BigFace.ps,height=20cm}} -\input{smiley} -@end iflatex -@end iftex - -@dfn{Smiley} is a package separate from Gnus, but since Gnus is -currently the only package that uses Smiley, it is documented here. - -In short---to use Smiley in Gnus, put the following in your -@file{.gnus.el} file: - -@lisp -(setq gnus-treat-display-smileys t) -@end lisp - -Smiley maps text smiley faces---@samp{:-)}, @samp{:-=}, @samp{:-(} and -the like---to pictures and displays those instead of the text smiley -faces. The conversion is controlled by a list of regexps that matches -text and maps that to file names. - -@vindex smiley-nosey-regexp-alist -@vindex smiley-deformed-regexp-alist -Smiley supplies two example conversion alists by default: -@code{smiley-deformed-regexp-alist} (which matches @samp{:)}, @samp{:(} -and so on), and @code{smiley-nosey-regexp-alist} (which matches -@samp{:-)}, @samp{:-(} and so on). - -The alist used is specified by the @code{smiley-regexp-alist} variable, -which defaults to the value of @code{smiley-deformed-regexp-alist}. - -The first item in each element is the regexp to be matched; the second -element is the regexp match group that is to be replaced by the picture; -and the third element is the name of the file to be displayed. - -The following variables customize where Smiley will look for these -files, as well as the color to be used and stuff: - -@table @code - -@item smiley-data-directory -@vindex smiley-data-directory -Where Smiley will look for smiley faces files. - -@item smiley-flesh-color -@vindex smiley-flesh-color -Skin color. The default is @samp{yellow}, which is really racist. - -@item smiley-features-color -@vindex smiley-features-color -Color of the features of the face. The default is @samp{black}. - -@item smiley-tongue-color -@vindex smiley-tongue-color -Color of the tongue. The default is @samp{red}. - -@item smiley-circle-color -@vindex smiley-circle-color -Color of the circle around the face. The default is @samp{black}. - -@item smiley-mouse-face -@vindex smiley-mouse-face -Face used for mouse highlighting over the smiley face. - -@end table - - -@node Toolbar -@subsection Toolbar - -@table @code - -@iftex -@iflatex -\margindex{} -@end iflatex -@end iftex - -@item gnus-use-toolbar -@vindex gnus-use-toolbar -If @code{nil}, don't display toolbars. If non-@code{nil}, it should be -one of @code{default-toolbar}, @code{top-toolbar}, @code{bottom-toolbar}, -@code{right-toolbar}, or @code{left-toolbar}. - -@item gnus-group-toolbar -@vindex gnus-group-toolbar -The toolbar in the group buffer. - -@item gnus-summary-toolbar -@vindex gnus-summary-toolbar -The toolbar in the summary buffer. - -@item gnus-summary-mail-toolbar -@vindex gnus-summary-mail-toolbar -The toolbar in the summary buffer of mail groups. - -@end table - - -@node XVarious -@subsection Various XEmacs Variables - -@table @code -@item gnus-xmas-glyph-directory -@vindex gnus-xmas-glyph-directory -This is where Gnus will look for pictures. Gnus will normally -auto-detect this directory, but you may set it manually if you have an -unusual directory structure. - -@item gnus-xmas-logo-color-alist -@vindex gnus-xmas-logo-color-alist -This is an alist where the key is a type symbol and the values are the -foreground and background color of the splash page glyph. - -@item gnus-xmas-logo-color-style -@vindex gnus-xmas-logo-color-style -This is the key used to look up the color in the alist described above. -Valid values include @code{flame}, @code{pine}, @code{moss}, -@code{irish}, @code{sky}, @code{tin}, @code{velvet}, @code{grape}, -@code{labia}, @code{berry}, @code{neutral}, and @code{september}. - -@item gnus-xmas-modeline-glyph -@vindex gnus-xmas-modeline-glyph -A glyph displayed in all Gnus mode lines. It is a tiny gnu head by -default. - -@iftex -@iflatex -\margindex{} -@end iflatex -@end iftex - -@end table - - - - -@node Fuzzy Matching -@section Fuzzy Matching -@cindex fuzzy matching - -Gnus provides @dfn{fuzzy matching} of @code{Subject} lines when doing -things like scoring, thread gathering and thread comparison. - -As opposed to regular expression matching, fuzzy matching is very fuzzy. -It's so fuzzy that there's not even a definition of what @dfn{fuzziness} -means, and the implementation has changed over time. - -Basically, it tries to remove all noise from lines before comparing. -@samp{Re: }, parenthetical remarks, white space, and so on, are filtered -out of the strings before comparing the results. This often leads to -adequate results---even when faced with strings generated by text -manglers masquerading as newsreaders. - - -@node Thwarting Email Spam -@section Thwarting Email Spam -@cindex email spam -@cindex spam -@cindex UCE -@cindex unsolicited commercial email - -In these last days of the Usenet, commercial vultures are hanging about -and grepping through news like crazy to find email addresses they can -foist off their scams and products to. As a reaction to this, many -people have started putting nonsense addresses into their @code{From} -lines. I think this is counterproductive---it makes it difficult for -people to send you legitimate mail in response to things you write, as -well as making it difficult to see who wrote what. This rewriting may -perhaps be a bigger menace than the unsolicited commercial email itself -in the end. - -The biggest problem I have with email spam is that it comes in under -false pretenses. I press @kbd{g} and Gnus merrily informs me that I -have 10 new emails. I say ``Golly gee! Happy is me!'' and select the -mail group, only to find two pyramid schemes, seven advertisements -(``New! Miracle tonic for growing full, lustrous hair on your toes!'') -and one mail asking me to repent and find some god. - -This is annoying. - -The way to deal with this is having Gnus split out all spam into a -@samp{spam} mail group (@pxref{Splitting Mail}). - -First, pick one (1) valid mail address that you can be reached at, and -put it in your @code{From} header of all your news articles. (I've -chosen @samp{larsi@@trym.ifi.uio.no}, but for many addresses on the form -@samp{larsi+usenet@@ifi.uio.no} will be a better choice. Ask your -sysadmin whether your sendmail installation accepts keywords in the local -part of the mail address.) - -@lisp -(setq message-default-news-headers - "From: Lars Magne Ingebrigtsen \n") -@end lisp - -Then put the following split rule in @code{nnmail-split-fancy} -(@pxref{Fancy Mail Splitting}): - -@lisp -( - ... - (to "larsi@@trym.ifi.uio.no" - (| ("subject" "re:.*" "misc") - ("references" ".*@@.*" "misc") - "spam")) - ... -) -@end lisp - -This says that all mail to this address is suspect, but if it has a -@code{Subject} that starts with a @samp{Re:} or has a @code{References} -header, it's probably ok. All the rest goes to the @samp{spam} group. -(This idea probably comes from Tim Pierce.) - -In addition, many mail spammers talk directly to your @code{smtp} server -and do not include your email address explicitly in the @code{To} -header. Why they do this is unknown---perhaps it's to thwart this -thwarting scheme? In any case, this is trivial to deal with---you just -put anything not addressed to you in the @samp{spam} group by ending -your fancy split rule in this way: - -@lisp -( - ... - (to "larsi" "misc") - "spam") -@end lisp - -In my experience, this will sort virtually everything into the right -group. You still have to check the @samp{spam} group from time to time to -check for legitimate mail, though. If you feel like being a good net -citizen, you can even send off complaints to the proper authorities on -each unsolicited commercial email---at your leisure. - -If you are also a lazy net citizen, you will probably prefer complaining -automatically with the @file{gnus-junk.el} package, available FOR FREE -at @* @uref{http://stud2.tuwien.ac.at/~e9426626/gnus-junk.html}. -Since most e-mail spam is sent automatically, this may reconcile the -cosmic balance somewhat. - -This works for me. It allows people an easy way to contact me (they can -just press @kbd{r} in the usual way), and I'm not bothered at all with -spam. It's a win-win situation. Forging @code{From} headers to point -to non-existent domains is yucky, in my opinion. - - -@node Various Various -@section Various Various -@cindex mode lines -@cindex highlights - -@table @code - -@item gnus-home-directory -All Gnus path variables will be initialized from this variable, which -defaults to @file{~/}. - -@item gnus-directory -@vindex gnus-directory -Most Gnus storage path variables will be initialized from this variable, -which defaults to the @samp{SAVEDIR} environment variable, or -@file{~/News/} if that variable isn't set. - -Note that gnus is mostly loaded when the @file{.gnus.el} file is read. -This means that other directory variables that are initialized from this -variable won't be set properly if you set this variable in -@file{.gnus.el}. Set this variable in @file{.emacs} instead. - -@item gnus-default-directory -@vindex gnus-default-directory -Not related to the above variable at all---this variable says what the -default directory of all Gnus buffers should be. If you issue commands -like @kbd{C-x C-f}, the prompt you'll get starts in the current buffer's -default directory. If this variable is @code{nil} (which is the -default), the default directory will be the default directory of the -buffer you were in when you started Gnus. - -@item gnus-verbose -@vindex gnus-verbose -This variable is an integer between zero and ten. The higher the value, -the more messages will be displayed. If this variable is zero, Gnus -will never flash any messages, if it is seven (which is the default), -most important messages will be shown, and if it is ten, Gnus won't ever -shut up, but will flash so many messages it will make your head swim. - -@item gnus-verbose-backends -@vindex gnus-verbose-backends -This variable works the same way as @code{gnus-verbose}, but it applies -to the Gnus backends instead of Gnus proper. - -@item nnheader-max-head-length -@vindex nnheader-max-head-length -When the backends read straight heads of articles, they all try to read -as little as possible. This variable (default 4096) specifies -the absolute max length the backends will try to read before giving up -on finding a separator line between the head and the body. If this -variable is @code{nil}, there is no upper read bound. If it is -@code{t}, the backends won't try to read the articles piece by piece, -but read the entire articles. This makes sense with some versions of -@code{ange-ftp} or @code{efs}. - -@item nnheader-head-chop-length -@vindex nnheader-head-chop-length -This variable (default 2048) says how big a piece of each article to -read when doing the operation described above. - -@item nnheader-file-name-translation-alist -@vindex nnheader-file-name-translation-alist -@cindex file names -@cindex invalid characters in file names -@cindex characters in file names -This is an alist that says how to translate characters in file names. -For instance, if @samp{:} is invalid as a file character in file names -on your system (you OS/2 user you), you could say something like: - -@lisp -(setq nnheader-file-name-translation-alist - '((?: . ?_))) -@end lisp - -In fact, this is the default value for this variable on OS/2 and MS -Windows (phooey) systems. - -@item gnus-hidden-properties -@vindex gnus-hidden-properties -This is a list of properties to use to hide ``invisible'' text. It is -@code{(invisible t intangible t)} by default on most systems, which -makes invisible text invisible and intangible. - -@item gnus-parse-headers-hook -@vindex gnus-parse-headers-hook -A hook called before parsing headers. It can be used, for instance, to -gather statistics on the headers fetched, or perhaps you'd like to prune -some headers. I don't see why you'd want that, though. - -@item gnus-shell-command-separator -@vindex gnus-shell-command-separator -String used to separate two shell commands. The default is @samp{;}. - -@item gnus-invalid-group-regexp -@vindex gnus-invalid-group-regexp - -Regexp to match ``invalid'' group names when querying user for a group -name. The default value catches some @strong{really} invalid group -names who could possibly mess up Gnus internally (like allowing -@samp{:} in a group name, which is normally used to delimit method and -group). - -@sc{imap} users might want to allow @samp{/} in group names though. - - -@end table - - -@node The End -@chapter The End - -Well, that's the manual---you can get on with your life now. Keep in -touch. Say hello to your cats from me. - -My @strong{ghod}---I just can't stand goodbyes. Sniffle. - -Ol' Charles Reznikoff said it pretty well, so I leave the floor to him: - -@quotation -@strong{Te Deum} - -@sp 1 -Not because of victories @* -I sing,@* -having none,@* -but for the common sunshine,@* -the breeze,@* -the largess of the spring. - -@sp 1 -Not for victory@* -but for the day's work done@* -as well as I was able;@* -not for a seat upon the dais@* -but at the common table.@* -@end quotation - - -@node Appendices -@chapter Appendices - -@menu -* 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:: -@end menu - - -@node History -@section History - -@cindex history -@sc{gnus} was written by Masanobu @sc{Umeda}. When autumn crept up in -'94, Lars Magne Ingebrigtsen grew bored and decided to rewrite Gnus. - -If you want to investigate the person responsible for this outrage, -you can point your (feh!) web browser to -@uref{http://quimby.gnus.org/}. This is also the primary -distribution point for the new and spiffy versions of Gnus, and is -known as The Site That Destroys Newsrcs And Drives People Mad. - -During the first extended alpha period of development, the new Gnus was -called ``(ding) Gnus''. @dfn{(ding)} is, of course, short for -@dfn{ding is not Gnus}, which is a total and utter lie, but who cares? -(Besides, the ``Gnus'' in this abbreviation should probably be -pronounced ``news'' as @sc{Umeda} intended, which makes it a more -appropriate name, don't you think?) - -In any case, after spending all that energy on coming up with a new and -spunky name, we decided that the name was @emph{too} spunky, so we -renamed it back again to ``Gnus''. But in mixed case. ``Gnus'' vs. -``@sc{gnus}''. New vs. old. - -@menu -* 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. -@end menu - - -@node Gnus Versions -@subsection Gnus Versions -@cindex Pterodactyl Gnus -@cindex ding Gnus -@cindex September Gnus -@cindex Quassia Gnus - -The first ``proper'' release of Gnus 5 was done in November 1995 when it -was included in the Emacs 19.30 distribution (132 (ding) Gnus releases -plus 15 Gnus 5.0 releases). - -In May 1996 the next Gnus generation (aka. ``September Gnus'' (after 99 -releases)) was released under the name ``Gnus 5.2'' (40 releases). - -On July 28th 1996 work on Red Gnus was begun, and it was released on -January 25th 1997 (after 84 releases) as ``Gnus 5.4'' (67 releases). - -On September 13th 1997, Quassia Gnus was started and lasted 37 releases. -If was released as ``Gnus 5.6'' on March 8th 1998 (46 releases). - -Gnus 5.6 begat Pterodactyl Gnus on August 29th 1998 and was released as -``Gnus 5.8'' (after 99 releases and a CVS repository) on December 3rd -1999. - -On the 26th of October 2000, Oort Gnus was begun. - -If you happen upon a version of Gnus that has a prefixed name -- -``(ding) Gnus'', ``September Gnus'', ``Red Gnus'', ``Quassia Gnus'', -``Pterodactyl Gnus'', ``Oort Gnus'' -- don't panic. Don't let it know -that you're frightened. Back away. Slowly. Whatever you do, don't -run. Walk away, calmly, until you're out of its reach. Find a proper -released version of Gnus and snuggle up to that instead. - - -@node Other Gnus Versions -@subsection Other Gnus Versions -@cindex Semi-gnus - -In addition to the versions of Gnus which have had their releases -coordinated by Lars, one major development has been Semi-gnus from -Japan. It's based on a library called @sc{semi}, which provides -@sc{mime} capabilities. - -These Gnusae are based mainly on Gnus 5.6 and Pterodactyl Gnus. -Collectively, they are called ``Semi-gnus'', and different strains are -called T-gnus, ET-gnus, Nana-gnus and Chaos. These provide powerful -@sc{mime} and multilingualization things, especially important for -Japanese users. - - -@node Why? -@subsection Why? - -What's the point of Gnus? - -I want to provide a ``rad'', ``happening'', ``way cool'' and ``hep'' -newsreader, that lets you do anything you can think of. That was my -original motivation, but while working on Gnus, it has become clear to -me that this generation of newsreaders really belong in the stone age. -Newsreaders haven't developed much since the infancy of the net. If the -volume continues to rise with the current rate of increase, all current -newsreaders will be pretty much useless. How do you deal with -newsgroups that have thousands of new articles each day? How do you -keep track of millions of people who post? - -Gnus offers no real solutions to these questions, but I would very much -like to see Gnus being used as a testing ground for new methods of -reading and fetching news. Expanding on @sc{Umeda}-san's wise decision -to separate the newsreader from the backends, Gnus now offers a simple -interface for anybody who wants to write new backends for fetching mail -and news from different sources. I have added hooks for customizations -everywhere I could imagine it being useful. By doing so, I'm inviting -every one of you to explore and invent. - -May Gnus never be complete. @kbd{C-u 100 M-x all-hail-emacs} and -@kbd{C-u 100 M-x all-hail-xemacs}. - - -@node Compatibility -@subsection Compatibility - -@cindex compatibility -Gnus was designed to be fully compatible with @sc{gnus}. Almost all key -bindings have been kept. More key bindings have been added, of course, -but only in one or two obscure cases have old bindings been changed. - -Our motto is: -@quotation -@cartouche -@center In a cloud bones of steel. -@end cartouche -@end quotation - -All commands have kept their names. Some internal functions have changed -their names. - -The @code{gnus-uu} package has changed drastically. @xref{Decoding -Articles}. - -One major compatibility question is the presence of several summary -buffers. All variables relevant while reading a group are -buffer-local to the summary buffer they belong in. Although many -important variables have their values copied into their global -counterparts whenever a command is executed in the summary buffer, this -change might lead to incorrect values being used unless you are careful. - -All code that relies on knowledge of @sc{gnus} internals will probably -fail. To take two examples: Sorting @code{gnus-newsrc-alist} (or -changing it in any way, as a matter of fact) is strictly verboten. Gnus -maintains a hash table that points to the entries in this alist (which -speeds up many functions), and changing the alist directly will lead to -peculiar results. - -@cindex hilit19 -@cindex highlighting -Old hilit19 code does not work at all. In fact, you should probably -remove all hilit code from all Gnus hooks -(@code{gnus-group-prepare-hook} and @code{gnus-summary-prepare-hook}). -Gnus provides various integrated functions for highlighting. These are -faster and more accurate. To make life easier for everybody, Gnus will -by default remove all hilit calls from all hilit hooks. Uncleanliness! -Away! - -Packages like @code{expire-kill} will no longer work. As a matter of -fact, you should probably remove all old @sc{gnus} packages (and other -code) when you start using Gnus. More likely than not, Gnus already -does what you have written code to make @sc{gnus} do. (Snicker.) - -Even though old methods of doing things are still supported, only the -new methods are documented in this manual. If you detect a new method of -doing something while reading this manual, that does not mean you have -to stop doing it the old way. - -Gnus understands all @sc{gnus} startup files. - -@kindex M-x gnus-bug -@findex gnus-bug -@cindex reporting bugs -@cindex bugs -Overall, a casual user who hasn't written much code that depends on -@sc{gnus} internals should suffer no problems. If problems occur, -please let me know by issuing that magic command @kbd{M-x gnus-bug}. - -@vindex gnus-bug-create-help-buffer -If you are in the habit of sending bug reports @emph{very} often, you -may find the helpful help buffer annoying after a while. If so, set -@code{gnus-bug-create-help-buffer} to @code{nil} to avoid having it pop -up at you. - - -@node Conformity -@subsection Conformity - -No rebels without a clue here, ma'am. We conform to all standards known -to (wo)man. Except for those standards and/or conventions we disagree -with, of course. - -@table @strong - -@item RFC 822 -@cindex RFC 822 -There are no known breaches of this standard. - -@item RFC 1036 -@cindex RFC 1036 -There are no known breaches of this standard, either. - -@item Son-of-RFC 1036 -@cindex Son-of-RFC 1036 -We do have some breaches to this one. - -@table @emph - -@item X-Newsreader -@itemx User-Agent -These are considered to be ``vanity headers'', while I consider them -to be consumer information. After seeing so many badly formatted -articles coming from @code{tin} and @code{Netscape} I know not to use -either of those for posting articles. I would not have known that if -it wasn't for the @code{X-Newsreader} header. -@end table - -@item USEFOR -@cindex USEFOR -USEFOR is an IETF working group writing a successor to RFC 1036, based -on Son-of-RFC 1036. They have produced a number of drafts proposing -various changes to the format of news articles. The Gnus towers will -look into implementing the changes when the draft is accepted as an RFC. - -@end table - -If you ever notice Gnus acting non-compliant with regards to the texts -mentioned above, don't hesitate to drop a note to Gnus Towers and let us -know. - - -@node Emacsen -@subsection Emacsen -@cindex Emacsen -@cindex XEmacs -@cindex Mule -@cindex Emacs - -Gnus should work on : - -@itemize @bullet - -@item -Emacs 20.3 and up. - -@item -XEmacs 21.1.1 and up. - -@end itemize - -This Gnus version will absolutely not work on any Emacsen older than -that. Not reliably, at least. Older versions of Gnus may work on older -Emacs versions. However, T-gnus does support ``Mule 2.3 based on Emacs -19.34'' and possibly the versions of XEmacs prior to 21.1.1, e.g. 20.4. -See the file ``README'' in the T-gnus distribution for more details. - -There are some vague differences between Gnus on the various -platforms---XEmacs features more graphics (a logo and a toolbar)---but -other than that, things should look pretty much the same under all -Emacsen. - - -@node Gnus Development -@subsection Gnus Development - -Gnus is developed in a two-phased cycle. The first phase involves much -discussion on the @samp{ding@@gnus.org} mailing list, where people -propose changes and new features, post patches and new backends. This -phase is called the @dfn{alpha} phase, since the Gnusae released in this -phase are @dfn{alpha releases}, or (perhaps more commonly in other -circles) @dfn{snapshots}. During this phase, Gnus is assumed to be -unstable and should not be used by casual users. Gnus alpha releases -have names like ``Red Gnus'' and ``Quassia Gnus''. - -After futzing around for 50-100 alpha releases, Gnus is declared -@dfn{frozen}, and only bug fixes are applied. Gnus loses the prefix, -and is called things like ``Gnus 5.6.32'' instead. Normal people are -supposed to be able to use these, and these are mostly discussed on the -@samp{gnu.emacs.gnus} newsgroup. - -@cindex Incoming* -@vindex mail-source-delete-incoming -Some variable defaults differ between alpha Gnusae and released Gnusae. -In particular, @code{mail-source-delete-incoming} defaults to @code{nil} in -alpha Gnusae and @code{t} in released Gnusae. This is to prevent -lossage of mail if an alpha release hiccups while handling the mail. - -The division of discussion between the ding mailing list and the Gnus -newsgroup is not purely based on publicity concerns. It's true that -having people write about the horrible things that an alpha Gnus release -can do (sometimes) in a public forum may scare people off, but more -importantly, talking about new experimental features that have been -introduced may confuse casual users. New features are frequently -introduced, fiddled with, and judged to be found wanting, and then -either discarded or totally rewritten. People reading the mailing list -usually keep up with these rapid changes, while people on the newsgroup -can't be assumed to do so. - - - -@node Contributors -@subsection Contributors -@cindex contributors - -The new Gnus version couldn't have been done without the help of all the -people on the (ding) mailing list. Every day for over a year I have -gotten billions of nice bug reports from them, filling me with joy, -every single one of them. Smooches. The people on the list have been -tried beyond endurance, what with my ``oh, that's a neat idea , yup, I'll release it right away no wait, that doesn't -work at all , yup, I'll ship that one off right away no, wait, that absolutely does not work'' policy for releases. -Micro$oft---bah. Amateurs. I'm @emph{much} worse. (Or is that -``worser''? ``much worser''? ``worsest''?) - -I would like to take this opportunity to thank the Academy for... oops, -wrong show. - -@itemize @bullet - -@item -Masanobu @sc{Umeda}---the writer of the original @sc{gnus}. - -@item -Shenghuo Zhu---uudecode.el, mm-uu.el, rfc1843.el, webmail.el, -nnwarchive and many, many other things connected with @sc{mime} and -other types of en/decoding, as well as general bug fixing, new -functionality and stuff. - -@item -Per Abrahamsen---custom, scoring, highlighting and @sc{soup} code (as -well as numerous other things). - -@item -Luis Fernandes---design and graphics. - -@item -Joe Reiss---creator of the smiley faces. - -@item -Justin Sheehy--the FAQ maintainer. - -@item -Erik Naggum---help, ideas, support, code and stuff. - -@item -Wes Hardaker---@file{gnus-picon.el} and the manual section on -@dfn{picons} (@pxref{Picons}). - -@item -Kim-Minh Kaplan---further work on the picon code. - -@item -Brad Miller---@file{gnus-gl.el} and the GroupLens manual section -(@pxref{GroupLens}). - -@item -Sudish Joseph---innumerable bug fixes. - -@item -Ilja Weis---@file{gnus-topic.el}. - -@item -Steven L. Baur---lots and lots and lots of bugs detections and fixes. - -@item -Vladimir Alexiev---the refcard and reference booklets. - -@item -Felix Lee & Jamie Zawinski---I stole some pieces from the XGnus -distribution by Felix Lee and JWZ. - -@item -Scott Byer---@file{nnfolder.el} enhancements & rewrite. - -@item -Peter Mutsaers---orphan article scoring code. - -@item -Ken Raeburn---POP mail support. - -@item -Hallvard B Furuseth---various bits and pieces, especially dealing with -.newsrc files. - -@item -Brian Edmonds---@file{gnus-bbdb.el}. - -@item -David Moore---rewrite of @file{nnvirtual.el} and many other things. - -@item -Kevin Davidson---came up with the name @dfn{ding}, so blame him. - -@item -François Pinard---many, many interesting and thorough bug reports, as -well as autoconf support. - -@end itemize - -This manual was proof-read by Adrian Aichner, with Ricardo Nassif, Mark -Borges, and Jost Krieger proof-reading parts of the manual. - -The following people have contributed many patches and suggestions: - -Christopher Davis, -Andrew Eskilsson, -Kai Grossjohann, -David Kågedal, -Richard Pieri, -Fabrice Popineau, -Daniel Quinlan, -Jason L. Tibbitts, III, -and -Jack Vinson. - -Also thanks to the following for patches and stuff: - -Jari Aalto, -Adrian Aichner, -Vladimir Alexiev, -Russ Allbery, -Peter Arius, -Matt Armstrong, -Marc Auslander, -Miles Bader, -Alexei V. Barantsev, -Frank Bennett, -Robert Bihlmeyer, -Chris Bone, -Mark Borges, -Mark Boyns, -Lance A. Brown, -Rob Browning, -Kees de Bruin, -Martin Buchholz, -Joe Buehler, -Kevin Buhr, -Alastair Burt, -Joao Cachopo, -Zlatko Calusic, -Massimo Campostrini, -Castor, -David Charlap, -Dan Christensen, -Kevin Christian, -Jae-you Chung, @c ? -James H. Cloos, Jr., -Laura Conrad, -Michael R. Cook, -Glenn Coombs, -Andrew J. Cosgriff, -Neil Crellin, -Frank D. Cringle, -Geoffrey T. Dairiki, -Andre Deparade, -Ulrik Dickow, -Dave Disser, -Rui-Tao Dong, @c ? -Joev Dubach, -Michael Welsh Duggan, -Dave Edmondson, -Paul Eggert, -Mark W. Eichin, -Karl Eichwalder, -Enami Tsugutomo, @c Enami -Michael Ernst, -Luc Van Eycken, -Sam Falkner, -Nelson Jose dos Santos Ferreira, -Sigbjorn Finne, -Sven Fischer, -Paul Fisher, -Decklin Foster, -Gary D. Foster, -Paul Franklin, -Guy Geens, -Arne Georg Gleditsch, -David S. Goldberg, -Michelangelo Grigni, -Dale Hagglund, -D. Hall, -Magnus Hammerin, -Kenichi Handa, @c Handa -Raja R. Harinath, -Yoshiki Hayashi, @c ? -P. E. Jareth Hein, -Hisashige Kenji, @c Hisashige -Scott Hofmann, -Marc Horowitz, -Gunnar Horrigmo, -Richard Hoskins, -Brad Howes, -Miguel de Icaza, -François Felix Ingrand, -Tatsuya Ichikawa, @c ? -Ishikawa Ichiro, @c Ishikawa -Lee Iverson, -Iwamuro Motonori, @c Iwamuro -Rajappa Iyer, -Andreas Jaeger, -Adam P. Jenkins, -Randell Jesup, -Fred Johansen, -Gareth Jones, -Simon Josefsson, -Greg Klanderman, -Karl Kleinpaste, -Michael Klingbeil, -Peter Skov Knudsen, -Shuhei Kobayashi, @c Kobayashi -Petr Konecny, -Koseki Yoshinori, @c Koseki -Thor Kristoffersen, -Jens Lautenbacher, -Martin Larose, -Seokchan Lee, @c Lee -Joerg Lenneis, -Carsten Leonhardt, -James LewisMoss, -Christian Limpach, -Markus Linnala, -Dave Love, -Mike McEwan, -Tonny Madsen, -Shlomo Mahlab, -Nat Makarevitch, -Istvan Marko, -David Martin, -Jason R. Mastaler, -Gordon Matzigkeit, -Timo Metzemakers, -Richard Mlynarik, -Lantz Moore, -Morioka Tomohiko, @c Morioka -Erik Toubro Nielsen, -Hrvoje Niksic, -Andy Norman, -Fred Oberhauser, -C. R. Oldham, -Alexandre Oliva, -Ken Olstad, -Masaharu Onishi, @c Onishi -Hideki Ono, @c Ono -Ettore Perazzoli, -William Perry, -Stephen Peters, -Jens-Ulrik Holger Petersen, -Ulrich Pfeifer, -Matt Pharr, -Andy Piper, -John McClary Prevost, -Bill Pringlemeir, -Mike Pullen, -Jim Radford, -Colin Rafferty, -Lasse Rasinen, -Lars Balker Rasmussen, -Joe Reiss, -Renaud Rioboo, -Roland B. Roberts, -Bart Robinson, -Christian von Roques, -Markus Rost, -Jason Rumney, -Wolfgang Rupprecht, -Jay Sachs, -Dewey M. Sasser, -Conrad Sauerwald, -Loren Schall, -Dan Schmidt, -Ralph Schleicher, -Philippe Schnoebelen, -Andreas Schwab, -Randal L. Schwartz, -Danny Siu, -Matt Simmons, -Paul D. Smith, -Jeff Sparkes, -Toby Speight, -Michael Sperber, -Darren Stalder, -Richard Stallman, -Greg Stark, -Sam Steingold, -Paul Stevenson, -Jonas Steverud, -Paul Stodghill, -Kiyokazu Suto, @c Suto -Kurt Swanson, -Samuel Tardieu, -Teddy, -Chuck Thompson, -Tozawa Akihiko, @c Tozawa -Philippe Troin, -James Troup, -Trung Tran-Duc, -Jack Twilley, -Aaron M. Ucko, -Aki Vehtari, -Didier Verna, -Vladimir Volovich, -Jan Vroonhof, -Stefan Waldherr, -Pete Ware, -Barry A. Warsaw, -Christoph Wedler, -Joe Wells, -Lee Willis, -Katsumi Yamaoka @c Yamaoka -and -Lloyd Zusman. - - -For a full overview of what each person has done, the ChangeLogs -included in the Gnus alpha distributions should give ample reading -(550kB and counting). - -Apologies to everybody that I've forgotten, of which there are many, I'm -sure. - -Gee, that's quite a list of people. I guess that must mean that there -actually are people who are using Gnus. Who'd'a thunk it! - - -@node New Features -@subsection New Features -@cindex new features - -@menu -* ding Gnus:: New things in Gnus 5.0/5.1, the first new Gnus. -* September Gnus:: The Thing Formally Known As Gnus 5.2/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. -* Pterodactyl Gnus:: Pentad also starts with P, AKA Gnus 5.8/5.9. -@end menu - -These lists are, of course, just @emph{short} overviews of the -@emph{most} important new features. No, really. There are tons more. -Yes, we have feeping creaturism in full effect. - -@node ding Gnus -@subsubsection (ding) Gnus - -New features in Gnus 5.0/5.1: - -@itemize @bullet - -@item -The look of all buffers can be changed by setting format-like variables -(@pxref{Group Buffer Format} and @pxref{Summary Buffer Format}). - -@item -Local spool and several @sc{nntp} servers can be used at once -(@pxref{Select Methods}). - -@item -You can combine groups into virtual groups (@pxref{Virtual Groups}). - -@item -You can read a number of different mail formats (@pxref{Getting Mail}). -All the mail backends implement a convenient mail expiry scheme -(@pxref{Expiring Mail}). - -@item -Gnus can use various strategies for gathering threads that have lost -their roots (thereby gathering loose sub-threads into one thread) or it -can go back and retrieve enough headers to build a complete thread -(@pxref{Customizing Threading}). - -@item -Killed groups can be displayed in the group buffer, and you can read -them as well (@pxref{Listing Groups}). - -@item -Gnus can do partial group updates---you do not have to retrieve the -entire active file just to check for new articles in a few groups -(@pxref{The Active File}). - -@item -Gnus implements a sliding scale of subscribedness to groups -(@pxref{Group Levels}). - -@item -You can score articles according to any number of criteria -(@pxref{Scoring}). You can even get Gnus to find out how to score -articles for you (@pxref{Adaptive Scoring}). - -@item -Gnus maintains a dribble buffer that is auto-saved the normal Emacs -manner, so it should be difficult to lose much data on what you have -read if your machine should go down (@pxref{Auto Save}). - -@item -Gnus now has its own startup file (@file{.gnus}) to avoid cluttering up -the @file{.emacs} file. - -@item -You can set the process mark on both groups and articles and perform -operations on all the marked items (@pxref{Process/Prefix}). - -@item -You can grep through a subset of groups and create a group from the -results (@pxref{Kibozed Groups}). - -@item -You can list subsets of groups according to, well, anything -(@pxref{Listing Groups}). - -@item -You can browse foreign servers and subscribe to groups from those -servers (@pxref{Browse Foreign Server}). - -@item -Gnus can fetch articles, asynchronously, on a second connection to the -server (@pxref{Asynchronous Fetching}). - -@item -You can cache articles locally (@pxref{Article Caching}). - -@item -The uudecode functions have been expanded and generalized -(@pxref{Decoding Articles}). - -@item -You can still post uuencoded articles, which was a little-known feature -of @sc{gnus}' past (@pxref{Uuencoding and Posting}). - -@item -Fetching parents (and other articles) now actually works without -glitches (@pxref{Finding the Parent}). - -@item -Gnus can fetch FAQs and group descriptions (@pxref{Group Information}). - -@item -Digests (and other files) can be used as the basis for groups -(@pxref{Document Groups}). - -@item -Articles can be highlighted and customized (@pxref{Customizing -Articles}). - -@item -URLs and other external references can be buttonized (@pxref{Article -Buttons}). - -@item -You can do lots of strange stuff with the Gnus window & frame -configuration (@pxref{Window Layout}). - -@item -You can click on buttons instead of using the keyboard -(@pxref{Buttons}). - -@end itemize - - -@node September Gnus -@subsubsection September Gnus - -@iftex -@iflatex -\gnusfig{-28cm}{0cm}{\epsfig{figure=tmp/september.ps,height=20cm}} -@end iflatex -@end iftex - -New features in Gnus 5.2/5.3: - -@itemize @bullet - -@item -A new message composition mode is used. All old customization variables -for @code{mail-mode}, @code{rnews-reply-mode} and @code{gnus-msg} are -now obsolete. - -@item -Gnus is now able to generate @dfn{sparse} threads---threads where -missing articles are represented by empty nodes (@pxref{Customizing -Threading}). - -@lisp -(setq gnus-build-sparse-threads 'some) -@end lisp - -@item -Outgoing articles are stored on a special archive server -(@pxref{Archived Messages}). - -@item -Partial thread regeneration now happens when articles are -referred. - -@item -Gnus can make use of GroupLens predictions (@pxref{GroupLens}). - -@item -Picons (personal icons) can be displayed under XEmacs (@pxref{Picons}). - -@item -A @code{trn}-like tree buffer can be displayed (@pxref{Tree Display}). - -@lisp -(setq gnus-use-trees t) -@end lisp - -@item -An @code{nn}-like pick-and-read minor mode is available for the summary -buffers (@pxref{Pick and Read}). - -@lisp -(add-hook 'gnus-summary-mode-hook 'gnus-pick-mode) -@end lisp - -@item -In binary groups you can use a special binary minor mode (@pxref{Binary -Groups}). - -@item -Groups can be grouped in a folding topic hierarchy (@pxref{Group -Topics}). - -@lisp -(add-hook 'gnus-group-mode-hook 'gnus-topic-mode) -@end lisp - -@item -Gnus can re-send and bounce mail (@pxref{Summary Mail Commands}). - -@item -Groups can now have a score, and bubbling based on entry frequency -is possible (@pxref{Group Score}). - -@lisp -(add-hook 'gnus-summary-exit-hook 'gnus-summary-bubble-group) -@end lisp - -@item -Groups can be process-marked, and commands can be performed on -groups of groups (@pxref{Marking Groups}). - -@item -Caching is possible in virtual groups. - -@item -@code{nndoc} now understands all kinds of digests, mail boxes, rnews -news batches, ClariNet briefs collections, and just about everything -else (@pxref{Document Groups}). - -@item -Gnus has a new backend (@code{nnsoup}) to create/read SOUP packets -(@pxref{SOUP}). - -@item -The Gnus cache is much faster. - -@item -Groups can be sorted according to many criteria (@pxref{Sorting -Groups}). - -@item -New group parameters have been introduced to set list-addresses and -expiry times (@pxref{Group Parameters}). - -@item -All formatting specs allow specifying faces to be used -(@pxref{Formatting Fonts}). - -@item -There are several more commands for setting/removing/acting on process -marked articles on the @kbd{M P} submap (@pxref{Setting Process Marks}). - -@item -The summary buffer can be limited to show parts of the available -articles based on a wide range of criteria. These commands have been -bound to keys on the @kbd{/} submap (@pxref{Limiting}). - -@item -Articles can be made persistent with the @kbd{*} command -(@pxref{Persistent Articles}). - -@item -All functions for hiding article elements are now toggles. - -@item -Article headers can be buttonized (@pxref{Article Washing}). - -@item -All mail backends support fetching articles by @code{Message-ID}. - -@item -Duplicate mail can now be treated properly (@pxref{Duplicates}). - -@item -All summary mode commands are available directly from the article -buffer (@pxref{Article Keymap}). - -@item -Frames can be part of @code{gnus-buffer-configuration} (@pxref{Window -Layout}). - -@item -Mail can be re-scanned by a daemonic process (@pxref{Daemons}). -@iftex -@iflatex -\marginpar[\mbox{}\hfill\epsfig{figure=tmp/fseptember.ps,height=5cm}]{\epsfig{figure=tmp/fseptember.ps,height=5cm}} -@end iflatex -@end iftex - -@item -Gnus can make use of NoCeM files to weed out spam (@pxref{NoCeM}). - -@lisp -(setq gnus-use-nocem t) -@end lisp - -@item -Groups can be made permanently visible (@pxref{Listing Groups}). - -@lisp -(setq gnus-permanently-visible-groups "^nnml:") -@end lisp - -@item -Many new hooks have been introduced to make customizing easier. - -@item -Gnus respects the @code{Mail-Copies-To} header. - -@item -Threads can be gathered by looking at the @code{References} header -(@pxref{Customizing Threading}). - -@lisp -(setq gnus-summary-thread-gathering-function - 'gnus-gather-threads-by-references) -@end lisp - -@item -Read articles can be stored in a special backlog buffer to avoid -refetching (@pxref{Article Backlog}). - -@lisp -(setq gnus-keep-backlog 50) -@end lisp - -@item -A clean copy of the current article is always stored in a separate -buffer to allow easier treatment. - -@item -Gnus can suggest where to save articles (@pxref{Saving Articles}). - -@item -Gnus doesn't have to do as much prompting when saving (@pxref{Saving -Articles}). - -@lisp -(setq gnus-prompt-before-saving t) -@end lisp - -@item -@code{gnus-uu} can view decoded files asynchronously while fetching -articles (@pxref{Other Decode Variables}). - -@lisp -(setq gnus-uu-grabbed-file-functions 'gnus-uu-grab-view) -@end lisp - -@item -Filling in the article buffer now works properly on cited text -(@pxref{Article Washing}). - -@item -Hiding cited text adds buttons to toggle hiding, and how much -cited text to hide is now customizable (@pxref{Article Hiding}). - -@lisp -(setq gnus-cited-lines-visible 2) -@end lisp - -@item -Boring headers can be hidden (@pxref{Article Hiding}). - -@item -Default scoring values can now be set from the menu bar. - -@item -Further syntax checking of outgoing articles have been added. - -@end itemize - - -@node Red Gnus -@subsubsection Red Gnus - -New features in Gnus 5.4/5.5: - -@iftex -@iflatex -\gnusfig{-5.5cm}{-4cm}{\epsfig{figure=tmp/red.ps,height=20cm}} -@end iflatex -@end iftex - -@itemize @bullet - -@item -@file{nntp.el} has been totally rewritten in an asynchronous fashion. - -@item -Article prefetching functionality has been moved up into -Gnus (@pxref{Asynchronous Fetching}). - -@item -Scoring can now be performed with logical operators like @code{and}, -@code{or}, @code{not}, and parent redirection (@pxref{Advanced -Scoring}). - -@item -Article washing status can be displayed in the -article mode line (@pxref{Misc Article}). - -@item -@file{gnus.el} has been split into many smaller files. - -@item -Suppression of duplicate articles based on Message-ID can be done -(@pxref{Duplicate Suppression}). - -@lisp -(setq gnus-suppress-duplicates t) -@end lisp - -@item -New variables for specifying what score and adapt files are to be -considered home score and adapt files (@pxref{Home Score File}) have -been added. - -@item -@code{nndoc} was rewritten to be easily extendable (@pxref{Document -Server Internals}). - -@item -Groups can inherit group parameters from parent topics (@pxref{Topic -Parameters}). - -@item -Article editing has been revamped and is now actually usable. - -@item -Signatures can be recognized in more intelligent fashions -(@pxref{Article Signature}). - -@item -Summary pick mode has been made to look more @code{nn}-like. Line -numbers are displayed and the @kbd{.} command can be used to pick -articles (@code{Pick and Read}). - -@item -Commands for moving the @file{.newsrc.eld} from one server to -another have been added (@pxref{Changing Servers}). - -@item -There's a way now to specify that ``uninteresting'' fields be suppressed -when generating lines in buffers (@pxref{Advanced Formatting}). - -@item -Several commands in the group buffer can be undone with @kbd{M-C-_} -(@pxref{Undo}). - -@item -Scoring can be done on words using the new score type @code{w} -(@pxref{Score File Format}). - -@item -Adaptive scoring can be done on a Subject word-by-word basis -(@pxref{Adaptive Scoring}). - -@lisp -(setq gnus-use-adaptive-scoring '(word)) -@end lisp - -@item -Scores can be decayed (@pxref{Score Decays}). - -@lisp -(setq gnus-decay-scores t) -@end lisp - -@item -Scoring can be performed using a regexp on the Date header. The Date is -normalized to compact ISO 8601 format first (@pxref{Score File Format}). - -@item -A new command has been added to remove all data on articles from -the native server (@pxref{Changing Servers}). - -@item -A new command for reading collections of documents -(@code{nndoc} with @code{nnvirtual} on top) has been added---@kbd{M-C-d} -(@pxref{Really Various Summary Commands}). - -@item -Process mark sets can be pushed and popped (@pxref{Setting Process -Marks}). - -@item -A new mail-to-news backend makes it possible to post even when the @sc{nntp} -server doesn't allow posting (@pxref{Mail-To-News Gateways}). - -@item -A new backend for reading searches from Web search engines -(@dfn{DejaNews}, @dfn{Alta Vista}, @dfn{InReference}) has been added -(@pxref{Web Searches}). - -@item -Groups inside topics can now be sorted using the standard sorting -functions, and each topic can be sorted independently (@pxref{Topic -Sorting}). - -@item -Subsets of the groups can be sorted independently (@code{Sorting -Groups}). - -@item -Cached articles can be pulled into the groups (@pxref{Summary Generation -Commands}). -@iftex -@iflatex -\marginpar[\mbox{}\hfill\epsfig{figure=tmp/fred.ps,width=3cm}]{\epsfig{figure=tmp/fred.ps,width=3cm}} -@end iflatex -@end iftex - -@item -Score files are now applied in a more reliable order (@pxref{Score -Variables}). - -@item -Reports on where mail messages end up can be generated (@pxref{Splitting -Mail}). - -@item -More hooks and functions have been added to remove junk from incoming -mail before saving the mail (@pxref{Washing Mail}). - -@item -Emphasized text can be properly fontisized: - -@end itemize - - -@node Quassia Gnus -@subsubsection Quassia Gnus - -New features in Gnus 5.6: - -@itemize @bullet - -@item -New functionality for using Gnus as an offline newsreader has been -added. A plethora of new commands and modes have been added. See -@pxref{Gnus Unplugged} for the full story. - -@item - The @code{nndraft} backend has returned, but works differently than -before. All Message buffers are now also articles in the @code{nndraft} -group, which is created automatically. - -@item -@code{gnus-alter-header-function} can now be used to alter header -values. - -@item - @code{gnus-summary-goto-article} now accept Message-ID's. - -@item - A new Message command for deleting text in the body of a message -outside the region: @kbd{C-c C-v}. - -@item - You can now post to component group in @code{nnvirtual} groups with -@kbd{C-u C-c C-c}. - -@item - @code{nntp-rlogin-program}---new variable to ease customization. - -@item - @code{C-u C-c C-c} in @code{gnus-article-edit-mode} will now inhibit -re-highlighting of the article buffer. - -@item - New element in @code{gnus-boring-article-headers}---@code{long-to}. - -@item - @kbd{M-i} symbolic prefix command. See the section "Symbolic -Prefixes" in the Gnus manual for details. - -@item - @kbd{L} and @kbd{I} in the summary buffer now take the symbolic prefix -@kbd{a} to add the score rule to the "all.SCORE" file. - -@item - @code{gnus-simplify-subject-functions} variable to allow greater -control over simplification. - -@item - @kbd{A T}---new command for fetching the current thread. - -@item - @kbd{/ T}---new command for including the current thread in the -limit. - -@item - @kbd{M-RET} is a new Message command for breaking cited text. - -@item - @samp{\\1}-expressions are now valid in @code{nnmail-split-methods}. - -@item - The @code{custom-face-lookup} function has been removed. -If you used this function in your initialization files, you must -rewrite them to use @code{face-spec-set} instead. - -@item - Canceling now uses the current select method. Symbolic prefix -@kbd{a} forces normal posting method. - -@item - New command to translate M******** sm*rtq**t*s into proper -text---@kbd{W d}. - -@item - For easier debugging of @code{nntp}, you can set -@code{nntp-record-commands} to a non-@code{nil} value. - -@item - @code{nntp} now uses @file{~/.authinfo}, a @file{.netrc}-like file, for -controlling where and how to send @sc{authinfo} to @sc{nntp} servers. - -@item - A command for editing group parameters from the summary buffer -has been added. - -@item - A history of where mails have been split is available. - -@item - A new article date command has been added---@code{article-date-iso8601}. - -@item - Subjects can be simplified when threading by setting -@code{gnus-score-thread-simplify}. - -@item - A new function for citing in Message has been -added---@code{message-cite-original-without-signature}. - -@item - @code{article-strip-all-blank-lines}---new article command. - -@item - A new Message command to kill to the end of the article has -been added. - -@item - A minimum adaptive score can be specified by using the -@code{gnus-adaptive-word-minimum} variable. - -@item - The "lapsed date" article header can be kept continually -updated by the @code{gnus-start-date-timer} command. - -@item - Web listserv archives can be read with the @code{nnlistserv} backend. - -@item - Old dejanews archives can now be read by @code{nnweb}. - -@end itemize - -@node Pterodactyl Gnus -@subsubsection Pterodactyl Gnus - -New features in Gnus 5.8: - -@itemize @bullet - -@item 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 - -@lisp -(setq nnmail-use-procmail t) -(setq nnmail-spool-file 'procmail) -(setq nnmail-procmail-directory "~/mail/incoming/") -(setq nnmail-procmail-suffix "\\.in") -@end lisp - -this now has changed to - -@lisp -(setq mail-sources - '((directory :path "~/mail/incoming/" - :suffix ".in"))) -@end lisp - -More information is available in the info doc at Select Methods -> -Getting Mail -> Mail Sources - -@item 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. - -@item Gnus has also been multilingualized. This also affects too -many parts of Gnus to summarize here, and adds many new variables. - -@item @code{gnus-auto-select-first} can now be a function to be -called to position point. - -@item The user can now decide which extra headers should be included in -summary buffers and NOV files. - -@item @code{gnus-article-display-hook} has been removed. Instead, a number -of variables starting with @code{gnus-treat-} have been added. - -@item The Gnus posting styles have been redone again and now works in a -subtly different manner. - -@item New web-based backends have been added: @code{nnslashdot}, -@code{nnwarchive} and @code{nnultimate}. nnweb has been revamped, -again, to keep up with ever-changing layouts. - -@item Gnus can now read IMAP mail via @code{nnimap}. - -@end itemize - -@iftex - -@page -@node History -@section The Manual -@cindex colophon -@cindex manual - -This manual was generated from a TeXinfo file and then run through -either @code{texi2dvi} -@iflatex -or my own home-brewed TeXinfo to \LaTeX\ transformer, -and then run through @code{latex} and @code{dvips} -@end iflatex -to get what you hold in your hands now. - -The following conventions have been used: - -@enumerate - -@item -This is a @samp{string} - -@item -This is a @kbd{keystroke} - -@item -This is a @file{file} - -@item -This is a @code{symbol} - -@end enumerate - -So if I were to say ``set @code{flargnoze} to @samp{yes}'', that would -mean: - -@lisp -(setq flargnoze "yes") -@end lisp - -If I say ``set @code{flumphel} to @code{yes}'', that would mean: - -@lisp -(setq flumphel 'yes) -@end lisp - -@samp{yes} and @code{yes} are two @emph{very} different things---don't -ever get them confused. - -@iflatex -@c @head -Of course, everything in this manual is of vital interest, so you should -read it all. Several times. However, if you feel like skimming the -manual, look for that gnu head you should see in the margin over -there---it means that what's being discussed is of more importance than -the rest of the stuff. (On the other hand, if everything is infinitely -important, how can anything be more important than that? Just one more -of the mysteries of this world, I guess.) -@end iflatex - -@end iftex - - -@node On Writing Manuals -@section On Writing Manuals - -I guess most manuals are written after-the-fact; documenting a program -that's already there. This is not how this manual is written. When -implementing something, I write the manual entry for that something -straight away. I then see that it's difficult to explain the -functionality, so I write how it's supposed to be, and then I change the -implementation. Writing the documentation and writing the code goes -hand in hand. - -This, of course, means that this manual has no, or little, flow. It -documents absolutely everything in Gnus, but often not where you're -looking for it. It is a reference manual, and not a guide to how to get -started with Gnus. - -That would be a totally different book, that should be written using the -reference manual as source material. It would look quite differently. - - -@page -@node Terminology -@section Terminology - -@cindex terminology -@table @dfn - -@item news -@cindex news -This is what you are supposed to use this thing for---reading news. -News is generally fetched from a nearby @sc{nntp} server, and is -generally publicly available to everybody. If you post news, the entire -world is likely to read just what you have written, and they'll all -snigger mischievously. Behind your back. - -@item mail -@cindex mail -Everything that's delivered to you personally is mail. Some news/mail -readers (like Gnus) blur the distinction between mail and news, but -there is a difference. Mail is private. News is public. Mailing is -not posting, and replying is not following up. - -@item reply -@cindex reply -Send a mail to the person who has written what you are reading. - -@item follow up -@cindex follow up -Post an article to the current newsgroup responding to the article you -are reading. - -@item backend -@cindex backend -Gnus gets fed articles from a number of backends, both news and mail -backends. Gnus does not handle the underlying media, so to speak---this -is all done by the backends. - -@item native -@cindex native -Gnus will always use one method (and backend) as the @dfn{native}, or -default, way of getting news. - -@item foreign -@cindex foreign -You can also have any number of foreign groups active at the same time. -These are groups that use non-native non-secondary backends for getting -news. - -@item secondary -@cindex secondary -Secondary backends are somewhere half-way between being native and being -foreign, but they mostly act like they are native. - -@item article -@cindex article -A message that has been posted as news. - -@item mail message -@cindex mail message -A message that has been mailed. - -@item message -@cindex message -A mail message or news article - -@item head -@cindex head -The top part of a message, where administrative information (etc.) is -put. - -@item body -@cindex body -The rest of an article. Everything not in the head is in the -body. - -@item header -@cindex header -A line from the head of an article. - -@item headers -@cindex headers -A collection of such lines, or a collection of heads. Or even a -collection of @sc{nov} lines. - -@item @sc{nov} -@cindex nov -When Gnus enters a group, it asks the backend for the headers of all -unread articles in the group. Most servers support the News OverView -format, which is more compact and much faster to read and parse than the -normal @sc{head} format. - -@item level -@cindex levels -Each group is subscribed at some @dfn{level} or other (1-9). The ones -that have a lower level are ``more'' subscribed than the groups with a -higher level. In fact, groups on levels 1-5 are considered -@dfn{subscribed}; 6-7 are @dfn{unsubscribed}; 8 are @dfn{zombies}; and 9 -are @dfn{killed}. Commands for listing groups and scanning for new -articles will all use the numeric prefix as @dfn{working level}. - -@item killed groups -@cindex killed groups -No information on killed groups is stored or updated, which makes killed -groups much easier to handle than subscribed groups. - -@item zombie groups -@cindex zombie groups -Just like killed groups, only slightly less dead. - -@item active file -@cindex active file -The news server has to keep track of what articles it carries, and what -groups exist. All this information in stored in the active file, which -is rather large, as you might surmise. - -@item bogus groups -@cindex bogus groups -A group that exists in the @file{.newsrc} file, but isn't known to the -server (i.e., it isn't in the active file), is a @emph{bogus group}. -This means that the group probably doesn't exist (any more). - -@item activating -@cindex activating groups -The act of asking the server for info on a group and computing the -number of unread articles is called @dfn{activating the group}. -Un-activated groups are listed with @samp{*} in the group buffer. - -@item server -@cindex server -A machine one can connect to and get news (or mail) from. - -@item select method -@cindex select method -A structure that specifies the backend, the server and the virtual -server settings. - -@item virtual server -@cindex virtual server -A named select method. Since a select method defines all there is to -know about connecting to a (physical) server, taking the thing as a -whole is a virtual server. - -@item washing -@cindex washing -Taking a buffer and running it through a filter of some sort. The -result will (more often than not) be cleaner and more pleasing than the -original. - -@item ephemeral groups -@cindex ephemeral groups -Most groups store data on what articles you have read. @dfn{Ephemeral} -groups are groups that will have no data stored---when you exit the -group, it'll disappear into the aether. - -@item solid groups -@cindex solid groups -This is the opposite of ephemeral groups. All groups listed in the -group buffer are solid groups. - -@item sparse articles -@cindex sparse articles -These are article placeholders shown in the summary buffer when -@code{gnus-build-sparse-threads} has been switched on. - -@item threading -@cindex threading -To put responses to articles directly after the articles they respond -to---in a hierarchical fashion. - -@item root -@cindex root -@cindex thread root -The first article in a thread is the root. It is the ancestor of all -articles in the thread. - -@item parent -@cindex parent -An article that has responses. - -@item child -@cindex child -An article that responds to a different article---its parent. - -@item digest -@cindex digest -A collection of messages in one file. The most common digest format is -specified by RFC 1153. - -@end table - - -@page -@node Customization -@section Customization -@cindex general customization - -All variables are properly documented elsewhere in this manual. This -section is designed to give general pointers on how to customize Gnus -for some quite common situations. - -@menu -* 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. -@end menu - - -@node Slow/Expensive Connection -@subsection Slow/Expensive @sc{nntp} Connection - -If you run Emacs on a machine locally, and get your news from a machine -over some very thin strings, you want to cut down on the amount of data -Gnus has to get from the @sc{nntp} server. - -@table @code - -@item gnus-read-active-file -Set this to @code{nil}, which will inhibit Gnus from requesting the -entire active file from the server. This file is often v. large. You -also have to set @code{gnus-check-new-newsgroups} and -@code{gnus-check-bogus-newsgroups} to @code{nil} to make sure that Gnus -doesn't suddenly decide to fetch the active file anyway. - -@item gnus-nov-is-evil -This one has to be @code{nil}. If not, grabbing article headers from -the @sc{nntp} server will not be very fast. Not all @sc{nntp} servers -support @sc{xover}; Gnus will detect this by itself. -@end table - - -@node Slow Terminal Connection -@subsection Slow Terminal Connection - -Let's say you use your home computer for dialing up the system that runs -Emacs and Gnus. If your modem is slow, you want to reduce (as much as -possible) the amount of data sent over the wires. - -@table @code - -@item gnus-auto-center-summary -Set this to @code{nil} to inhibit Gnus from re-centering the summary -buffer all the time. If it is @code{vertical}, do only vertical -re-centering. If it is neither @code{nil} nor @code{vertical}, do both -horizontal and vertical recentering. - -@item gnus-visible-headers -Cut down on the headers included in the articles to the -minimum. You can, in fact, make do without them altogether---most of the -useful data is in the summary buffer, anyway. Set this variable to -@samp{^NEVVVVER} or @samp{From:}, or whatever you feel you need. - -Set this hook to all the available hiding commands: -@lisp -(setq gnus-treat-hide-headers 'head - gnus-treat-hide-signature t - gnus-treat-hide-citation t) -@end lisp - -@item gnus-use-full-window -By setting this to @code{nil}, you can make all the windows smaller. -While this doesn't really cut down much generally, it means that you -have to see smaller portions of articles before deciding that you didn't -want to read them anyway. - -@item gnus-thread-hide-subtree -If this is non-@code{nil}, all threads in the summary buffer will be -hidden initially. - -@item gnus-updated-mode-lines -If this is @code{nil}, Gnus will not put information in the buffer mode -lines, which might save some time. -@end table - - -@node Little Disk Space -@subsection Little Disk Space -@cindex disk space - -The startup files can get rather large, so you may want to cut their -sizes a bit if you are running out of space. - -@table @code - -@item gnus-save-newsrc-file -If this is @code{nil}, Gnus will never save @file{.newsrc}---it will -only save @file{.newsrc.eld}. This means that you will not be able to -use any other newsreaders than Gnus. This variable is @code{t} by -default. - -@item gnus-read-newsrc-file -If this is @code{nil}, Gnus will never read @file{.newsrc}---it will -only read @file{.newsrc.eld}. This means that you will not be able to -use any other newsreaders than Gnus. This variable is @code{t} by -default. - -@item gnus-save-killed-list -If this is @code{nil}, Gnus will not save the list of dead groups. You -should also set @code{gnus-check-new-newsgroups} to @code{ask-server} -and @code{gnus-check-bogus-newsgroups} to @code{nil} if you set this -variable to @code{nil}. This variable is @code{t} by default. - -@end table - - -@node Slow Machine -@subsection Slow Machine -@cindex slow machine - -If you have a slow machine, or are just really impatient, there are a -few things you can do to make Gnus run faster. - -Set @code{gnus-check-new-newsgroups} and -@code{gnus-check-bogus-newsgroups} to @code{nil} to make startup faster. - -Set @code{gnus-show-threads}, @code{gnus-use-cross-reference} and -@code{gnus-nov-is-evil} to @code{nil} to make entering and exiting the -summary buffer faster. - - -@page -@node Troubleshooting -@section Troubleshooting -@cindex troubleshooting - -Gnus works @emph{so} well straight out of the box---I can't imagine any -problems, really. - -Ahem. - -@enumerate - -@item -Make sure your computer is switched on. - -@item -Make sure that you really load the current Gnus version. If you have -been running @sc{gnus}, you need to exit Emacs and start it up again before -Gnus will work. - -@item -Try doing an @kbd{M-x gnus-version}. If you get something that looks -like @samp{T-gnus 6.15.* (based on Oort Gnus v0.*; for SEMI 1.1*, FLIM -1.1*)} you have the right files loaded. If, on the other hand, you get -something like @samp{NNTP 3.x} or @samp{nntp flee}, you have some old -@file{.el} files lying around. Delete these. - -@item -Read the help group (@kbd{G h} in the group buffer) for a FAQ and a -how-to. - -@item -@vindex max-lisp-eval-depth -Gnus works on many recursive structures, and in some extreme (and very -rare) cases Gnus may recurse down ``too deeply'' and Emacs will beep at -you. If this happens to you, set @code{max-lisp-eval-depth} to 500 or -something like that. -@end enumerate - -If all else fails, report the problem as a bug. - -@cindex bugs -@cindex reporting bugs - -@kindex M-x gnus-bug -@findex gnus-bug -If you find a bug in Gnus, you can report it with the @kbd{M-x gnus-bug} -command. @kbd{M-x set-variable RET debug-on-error RET t RET}, and send -me the backtrace. I will fix bugs, but I can only fix them if you send -me a precise description as to how to reproduce the bug. - -You really can never be too detailed in a bug report. Always use the -@kbd{M-x gnus-bug} command when you make bug reports, even if it creates -a 10Kb mail each time you use it, and even if you have sent me your -environment 500 times before. I don't care. I want the full info each -time. - -It is also important to remember that I have no memory whatsoever. If -you send a bug report, and I send you a reply, and then you just send -back ``No, it's not! Moron!'', I will have no idea what you are -insulting me about. Always over-explain everything. It's much easier -for all of us---if I don't have all the information I need, I will just -mail you and ask for more info, and everything takes more time. - -If the problem you're seeing is very visual, and you can't quite explain -it, copy the Emacs window to a file (with @code{xwd}, for instance), put -it somewhere it can be reached, and include the URL of the picture in -the bug report. - -@cindex patches -If you would like to contribute a patch to fix bugs or make -improvements, please produce the patch using @samp{diff -u}. - -If you just need help, you are better off asking on -@samp{gnu.emacs.gnus}. I'm not very helpful. - -@cindex gnu.emacs.gnus -@cindex ding mailing list -You can also ask on the ding mailing list---@samp{ding@@gnus.org}. -Write to @samp{ding-request@@gnus.org} to subscribe. - - -@page -@node Gnus Reference Guide -@section Gnus Reference Guide - -It is my hope that other people will figure out smart stuff that Gnus -can do, and that other people will write those smart things as well. To -facilitate that I thought it would be a good idea to describe the inner -workings of Gnus. And some of the not-so-inner workings, while I'm at -it. - -You can never expect the internals of a program not to change, but I -will be defining (in some details) the interface between Gnus and its -backends (this is written in stone), the format of the score files -(ditto), data structures (some are less likely to change than others) -and general methods of operation. - -@menu -* 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. -@end menu - - -@node Gnus Utility Functions -@subsection Gnus Utility Functions -@cindex Gnus utility functions -@cindex utility functions -@cindex functions -@cindex internal variables - -When writing small functions to be run from hooks (and stuff), it's -vital to have access to the Gnus internal functions and variables. -Below is a list of the most common ones. - -@table @code - -@item gnus-newsgroup-name -@vindex gnus-newsgroup-name -This variable holds the name of the current newsgroup. - -@item gnus-find-method-for-group -@findex gnus-find-method-for-group -A function that returns the select method for @var{group}. - -@item gnus-group-real-name -@findex gnus-group-real-name -Takes a full (prefixed) Gnus group name, and returns the unprefixed -name. - -@item gnus-group-prefixed-name -@findex gnus-group-prefixed-name -Takes an unprefixed group name and a select method, and returns the full -(prefixed) Gnus group name. - -@item gnus-get-info -@findex gnus-get-info -Returns the group info list for @var{group}. - -@item gnus-group-unread -@findex gnus-group-unread -The number of unread articles in @var{group}, or @code{t} if that is -unknown. - -@item gnus-active -@findex gnus-active -The active entry for @var{group}. - -@item gnus-set-active -@findex gnus-set-active -Set the active entry for @var{group}. - -@item gnus-add-current-to-buffer-list -@findex gnus-add-current-to-buffer-list -Adds the current buffer to the list of buffers to be killed on Gnus -exit. - -@item gnus-continuum-version -@findex gnus-continuum-version -Takes a Gnus version string as a parameter and returns a floating point -number. Earlier versions will always get a lower number than later -versions. - -@item gnus-group-read-only-p -@findex gnus-group-read-only-p -Says whether @var{group} is read-only or not. - -@item gnus-news-group-p -@findex gnus-news-group-p -Says whether @var{group} came from a news backend. - -@item gnus-ephemeral-group-p -@findex gnus-ephemeral-group-p -Says whether @var{group} is ephemeral or not. - -@item gnus-server-to-method -@findex gnus-server-to-method -Returns the select method corresponding to @var{server}. - -@item gnus-server-equal -@findex gnus-server-equal -Says whether two virtual servers are equal. - -@item gnus-group-native-p -@findex gnus-group-native-p -Says whether @var{group} is native or not. - -@item gnus-group-secondary-p -@findex gnus-group-secondary-p -Says whether @var{group} is secondary or not. - -@item gnus-group-foreign-p -@findex gnus-group-foreign-p -Says whether @var{group} is foreign or not. - -@item group-group-find-parameter -@findex group-group-find-parameter -Returns the parameter list of @var{group}. If given a second parameter, -returns the value of that parameter for @var{group}. - -@item gnus-group-set-parameter -@findex gnus-group-set-parameter -Takes three parameters; @var{group}, @var{parameter} and @var{value}. - -@item gnus-narrow-to-body -@findex gnus-narrow-to-body -Narrows the current buffer to the body of the article. - -@item gnus-check-backend-function -@findex gnus-check-backend-function -Takes two parameters, @var{function} and @var{group}. If the backend -@var{group} comes from supports @var{function}, return non-@code{nil}. - -@lisp -(gnus-check-backend-function "request-scan" "nnml:misc") -@result{} t -@end lisp - -@item gnus-read-method -@findex gnus-read-method -Prompts the user for a select method. - -@end table - - -@node Backend Interface -@subsection Backend Interface - -Gnus doesn't know anything about @sc{nntp}, spools, mail or virtual -groups. It only knows how to talk to @dfn{virtual servers}. A virtual -server is a @dfn{backend} and some @dfn{backend variables}. As examples -of the first, we have @code{nntp}, @code{nnspool} and @code{nnmbox}. As -examples of the latter we have @code{nntp-port-number} and -@code{nnmbox-directory}. - -When Gnus asks for information from a backend---say @code{nntp}---on -something, it will normally include a virtual server name in the -function parameters. (If not, the backend should use the ``current'' -virtual server.) For instance, @code{nntp-request-list} takes a virtual -server as its only (optional) parameter. If this virtual server hasn't -been opened, the function should fail. - -Note that a virtual server name has no relation to some physical server -name. Take this example: - -@lisp -(nntp "odd-one" - (nntp-address "ifi.uio.no") - (nntp-port-number 4324)) -@end lisp - -Here the virtual server name is @samp{odd-one} while the name of -the physical server is @samp{ifi.uio.no}. - -The backends should be able to switch between several virtual servers. -The standard backends implement this by keeping an alist of virtual -server environments that they pull down/push up when needed. - -There are two groups of interface functions: @dfn{required functions}, -which must be present, and @dfn{optional functions}, which Gnus will -always check for presence before attempting to call 'em. - -All these functions are expected to return data in the buffer -@code{nntp-server-buffer} (@samp{ *nntpd*}), which is somewhat -unfortunately named, but we'll have to live with it. When I talk about -@dfn{resulting data}, I always refer to the data in that buffer. When I -talk about @dfn{return value}, I talk about the function value returned by -the function call. Functions that fail should return @code{nil} as the -return value. - -Some backends could be said to be @dfn{server-forming} backends, and -some might be said not to be. The latter are backends that generally -only operate on one group at a time, and have no concept of ``server'' --- they have a group, and they deliver info on that group and nothing -more. - -Gnus identifies each message by way of group name and article number. A -few remarks about these article numbers might be useful. First of all, -the numbers are positive integers. Secondly, it is normally not -possible for later articles to `re-use' older article numbers without -confusing Gnus. That is, if a group has ever contained a message -numbered 42, then no other message may get that number, or Gnus will get -mightily confused.@footnote{See the function -@code{nnchoke-request-update-info}, @ref{Optional Backend Functions}.} -Third, article numbers must be assigned in order of arrival in the -group; this is not necessarily the same as the date of the message. - -The previous paragraph already mentions all the `hard' restrictions that -article numbers must fulfill. But it seems that it might be useful to -assign @emph{consecutive} article numbers, for Gnus gets quite confused -if there are holes in the article numbering sequence. However, due to -the `no-reuse' restriction, holes cannot be avoided altogether. It's -also useful for the article numbers to start at 1 to avoid running out -of numbers as long as possible. - -In the examples and definitions I will refer to the imaginary backend -@code{nnchoke}. - -@cindex @code{nnchoke} - -@menu -* 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. -@end menu - - -@node Required Backend Functions -@subsubsection Required Backend Functions - -@table @code - -@item (nnchoke-retrieve-headers ARTICLES &optional GROUP SERVER FETCH-OLD) - -@var{articles} is either a range of article numbers or a list of -@code{Message-ID}s. Current backends do not fully support either---only -sequences (lists) of article numbers, and most backends do not support -retrieval of @code{Message-ID}s. But they should try for both. - -The result data should either be HEADs or NOV lines, and the result -value should either be @code{headers} or @code{nov} to reflect this. -This might later be expanded to @code{various}, which will be a mixture -of HEADs and NOV lines, but this is currently not supported by Gnus. - -If @var{fetch-old} is non-@code{nil} it says to try fetching "extra -headers", in some meaning of the word. This is generally done by -fetching (at most) @var{fetch-old} extra headers less than the smallest -article number in @code{articles}, and filling the gaps as well. The -presence of this parameter can be ignored if the backend finds it -cumbersome to follow the request. If this is non-@code{nil} and not a -number, do maximum fetches. - -Here's an example HEAD: - -@example -221 1056 Article retrieved. -Path: ifi.uio.no!sturles -From: sturles@@ifi.uio.no (Sturle Sunde) -Newsgroups: ifi.discussion -Subject: Re: Something very droll -Date: 27 Oct 1994 14:02:57 +0100 -Organization: Dept. of Informatics, University of Oslo, Norway -Lines: 26 -Message-ID: <38o8e1$a0o@@holmenkollen.ifi.uio.no> -References: <38jdmq$4qu@@visbur.ifi.uio.no> -NNTP-Posting-Host: holmenkollen.ifi.uio.no -. -@end example - -So a @code{headers} return value would imply that there's a number of -these in the data buffer. - -Here's a BNF definition of such a buffer: - -@example -headers = *head -head = error / valid-head -error-message = [ "4" / "5" ] 2number " " eol -valid-head = valid-message *header "." eol -valid-message = "221 " " Article retrieved." eol -header = eol -@end example - -If the return value is @code{nov}, the data buffer should contain -@dfn{network overview database} lines. These are basically fields -separated by tabs. - -@example -nov-buffer = *nov-line -nov-line = 8*9 [ field ] eol -field = -@end example - -For a closer look at what should be in those fields, -@pxref{Headers}. - - -@item (nnchoke-open-server SERVER &optional DEFINITIONS) - -@var{server} is here the virtual server name. @var{definitions} is a -list of @code{(VARIABLE VALUE)} pairs that define this virtual server. - -If the server can't be opened, no error should be signaled. The backend -may then choose to refuse further attempts at connecting to this -server. In fact, it should do so. - -If the server is opened already, this function should return a -non-@code{nil} value. There should be no data returned. - - -@item (nnchoke-close-server &optional SERVER) - -Close connection to @var{server} and free all resources connected -to it. Return @code{nil} if the server couldn't be closed for some -reason. - -There should be no data returned. - - -@item (nnchoke-request-close) - -Close connection to all servers and free all resources that the backend -have reserved. All buffers that have been created by that backend -should be killed. (Not the @code{nntp-server-buffer}, though.) This -function is generally only called when Gnus is shutting down. - -There should be no data returned. - - -@item (nnchoke-server-opened &optional SERVER) - -If @var{server} is the current virtual server, and the connection to the -physical server is alive, then this function should return a -non-@code{nil} vlue. This function should under no circumstances -attempt to reconnect to a server we have lost connection to. - -There should be no data returned. - - -@item (nnchoke-status-message &optional SERVER) - -This function should return the last error message from @var{server}. - -There should be no data returned. - - -@item (nnchoke-request-article ARTICLE &optional GROUP SERVER TO-BUFFER) - -The result data from this function should be the article specified by -@var{article}. This might either be a @code{Message-ID} or a number. -It is optional whether to implement retrieval by @code{Message-ID}, but -it would be nice if that were possible. - -If @var{to-buffer} is non-@code{nil}, the result data should be returned -in this buffer instead of the normal data buffer. This is to make it -possible to avoid copying large amounts of data from one buffer to -another, while Gnus mainly requests articles to be inserted directly -into its article buffer. - -If it is at all possible, this function should return a cons cell where -the @code{car} is the group name the article was fetched from, and the @code{cdr} is -the article number. This will enable Gnus to find out what the real -group and article numbers are when fetching articles by -@code{Message-ID}. If this isn't possible, @code{t} should be returned -on successful article retrieval. - - -@item (nnchoke-request-group GROUP &optional SERVER FAST) - -Get data on @var{group}. This function also has the side effect of -making @var{group} the current group. - -If @var{fast}, don't bother to return useful data, just make @var{group} -the current group. - -Here's an example of some result data and a definition of the same: - -@example -211 56 1000 1059 ifi.discussion -@end example - -The first number is the status, which should be 211. Next is the -total number of articles in the group, the lowest article number, the -highest article number, and finally the group name. Note that the total -number of articles may be less than one might think while just -considering the highest and lowest article numbers, but some articles -may have been canceled. Gnus just discards the total-number, so -whether one should take the bother to generate it properly (if that is a -problem) is left as an exercise to the reader. - -@example -group-status = [ error / info ] eol -error = [ "4" / "5" ] 2 " " -info = "211 " 3* [ " " ] -@end example - - -@item (nnchoke-close-group GROUP &optional SERVER) - -Close @var{group} and free any resources connected to it. This will be -a no-op on most backends. - -There should be no data returned. - - -@item (nnchoke-request-list &optional SERVER) - -Return a list of all groups available on @var{server}. And that means -@emph{all}. - -Here's an example from a server that only carries two groups: - -@example -ifi.test 0000002200 0000002000 y -ifi.discussion 3324 3300 n -@end example - -On each line we have a group name, then the highest article number in -that group, the lowest article number, and finally a flag. - -@example -active-file = *active-line -active-line = name " " " " " " flags eol -name = -flags = "n" / "y" / "m" / "x" / "j" / "=" name -@end example - -The flag says whether the group is read-only (@samp{n}), is moderated -(@samp{m}), is dead (@samp{x}), is aliased to some other group -(@samp{=other-group}) or none of the above (@samp{y}). - - -@item (nnchoke-request-post &optional SERVER) - -This function should post the current buffer. It might return whether -the posting was successful or not, but that's not required. If, for -instance, the posting is done asynchronously, it has generally not been -completed by the time this function concludes. In that case, this -function should set up some kind of sentinel to beep the user loud and -clear if the posting could not be completed. - -There should be no result data from this function. - -@end table - - -@node Optional Backend Functions -@subsubsection Optional Backend Functions - -@table @code - -@item (nnchoke-retrieve-groups GROUPS &optional SERVER) - -@var{groups} is a list of groups, and this function should request data -on all those groups. How it does it is of no concern to Gnus, but it -should attempt to do this in a speedy fashion. - -The return value of this function can be either @code{active} or -@code{group}, which says what the format of the result data is. The -former is in the same format as the data from -@code{nnchoke-request-list}, while the latter is a buffer full of lines -in the same format as @code{nnchoke-request-group} gives. - -@example -group-buffer = *active-line / *group-status -@end example - - -@item (nnchoke-request-update-info GROUP INFO &optional SERVER) - -A Gnus group info (@pxref{Group Info}) is handed to the backend for -alterations. This comes in handy if the backend really carries all the -information (as is the case with virtual and imap groups). This -function should destructively alter the info to suit its needs, and -should return the (altered) group info. - -There should be no result data from this function. - - -@item (nnchoke-request-type GROUP &optional ARTICLE) - -When the user issues commands for ``sending news'' (@kbd{F} in the -summary buffer, for instance), Gnus has to know whether the article the -user is following up on is news or mail. This function should return -@code{news} if @var{article} in @var{group} is news, @code{mail} if it -is mail and @code{unknown} if the type can't be decided. (The -@var{article} parameter is necessary in @code{nnvirtual} groups which -might very well combine mail groups and news groups.) Both @var{group} -and @var{article} may be @code{nil}. - -There should be no result data from this function. - - -@item (nnchoke-request-set-mark GROUP ACTION &optional SERVER) - -Set/remove/add marks on articles. Normally Gnus handles the article -marks (such as read, ticked, expired etc) internally, and store them in -@code{~/.newsrc.eld}. Some backends (such as @sc{imap}) however carry -all information about the articles on the server, so Gnus need to -propagate the mark information to the server. - -ACTION is a list of mark setting requests, having this format: - -@example -(RANGE ACTION MARK) -@end example - -RANGE is a range of articles you wish to update marks on. ACTION is -@code{add} or @code{del}, used to add marks or remove marks -(preserving all marks not mentioned). MARK is a list of marks; where -each mark is a symbol. Currently used marks are @code{read}, -@code{tick}, @code{reply}, @code{expire}, @code{killed}, -@code{dormant}, @code{save}, @code{download}, @code{unsend}, -@code{forward} and @code{recent}, but your backend should, if -possible, not limit itself to these. - -Given contradictory actions, the last action in the list should be the -effective one. That is, if your action contains a request to add the -@code{tick} mark on article 1 and, later in the list, a request to -remove the mark on the same article, the mark should in fact be removed. - -An example action list: - -@example -(((5 12 30) 'del '(tick)) - ((10 . 90) 'add '(read expire)) - ((92 94) 'del '(read))) -@end example - -The function should return a range of articles it wasn't able to set the -mark on (currently not used for anything). - -There should be no result data from this function. - -@item (nnchoke-request-update-mark GROUP ARTICLE MARK) - -If the user tries to set a mark that the backend doesn't like, this -function may change the mark. Gnus will use whatever this function -returns as the mark for @var{article} instead of the original -@var{mark}. If the backend doesn't care, it must return the original -@var{mark}, and not @code{nil} or any other type of garbage. - -The only use for this I can see is what @code{nnvirtual} does with -it---if a component group is auto-expirable, marking an article as read -in the virtual group should result in the article being marked as -expirable. - -There should be no result data from this function. - - -@item (nnchoke-request-scan &optional GROUP SERVER) - -This function may be called at any time (by Gnus or anything else) to -request that the backend check for incoming articles, in one way or -another. A mail backend will typically read the spool file or query the -POP server when this function is invoked. The @var{group} doesn't have -to be heeded---if the backend decides that it is too much work just -scanning for a single group, it may do a total scan of all groups. It -would be nice, however, to keep things local if that's practical. - -There should be no result data from this function. - - -@item (nnchoke-request-group-description GROUP &optional SERVER) - -The result data from this function should be a description of -@var{group}. - -@example -description-line = name description eol -name = -description = -@end example - -@item (nnchoke-request-list-newsgroups &optional SERVER) - -The result data from this function should be the description of all -groups available on the server. - -@example -description-buffer = *description-line -@end example - - -@item (nnchoke-request-newgroups DATE &optional SERVER) - -The result data from this function should be all groups that were -created after @samp{date}, which is in normal human-readable date -format. The data should be in the active buffer format. - - -@item (nnchoke-request-create-group GROUP &optional SERVER) - -This function should create an empty group with name @var{group}. - -There should be no return data. - - -@item (nnchoke-request-expire-articles ARTICLES &optional GROUP SERVER FORCE) - -This function should run the expiry process on all articles in the -@var{articles} range (which is currently a simple list of article -numbers.) It is left up to the backend to decide how old articles -should be before they are removed by this function. If @var{force} is -non-@code{nil}, all @var{articles} should be deleted, no matter how new -they are. - -This function should return a list of articles that it did not/was not -able to delete. - -There should be no result data returned. - - -@item (nnchoke-request-move-article ARTICLE GROUP SERVER ACCEPT-FORM -&optional LAST) - -This function should move @var{article} (which is a number) from -@var{group} by calling @var{accept-form}. - -This function should ready the article in question for moving by -removing any header lines it has added to the article, and generally -should ``tidy up'' the article. Then it should @code{eval} -@var{accept-form} in the buffer where the ``tidy'' article is. This -will do the actual copying. If this @code{eval} returns a -non-@code{nil} value, the article should be removed. - -If @var{last} is @code{nil}, that means that there is a high likelihood -that there will be more requests issued shortly, so that allows some -optimizations. - -The function should return a cons where the @code{car} is the group name and -the @code{cdr} is the article number that the article was entered as. - -There should be no data returned. - - -@item (nnchoke-request-accept-article GROUP &optional SERVER LAST) - -This function takes the current buffer and inserts it into @var{group}. -If @var{last} in @code{nil}, that means that there will be more calls to -this function in short order. - -The function should return a cons where the @code{car} is the group name and -the @code{cdr} is the article number that the article was entered as. - -There should be no data returned. - - -@item (nnchoke-request-replace-article ARTICLE GROUP BUFFER) - -This function should remove @var{article} (which is a number) from -@var{group} and insert @var{buffer} there instead. - -There should be no data returned. - - -@item (nnchoke-request-delete-group GROUP FORCE &optional SERVER) - -This function should delete @var{group}. If @var{force}, it should -really delete all the articles in the group, and then delete the group -itself. (If there is such a thing as ``the group itself''.) - -There should be no data returned. - - -@item (nnchoke-request-rename-group GROUP NEW-NAME &optional SERVER) - -This function should rename @var{group} into @var{new-name}. All -articles in @var{group} should move to @var{new-name}. - -There should be no data returned. - -@end table - - -@node Error Messaging -@subsubsection Error Messaging - -@findex nnheader-report -@findex nnheader-get-report -The backends should use the function @code{nnheader-report} to report -error conditions---they should not raise errors when they aren't able to -perform a request. The first argument to this function is the backend -symbol, and the rest are interpreted as arguments to @code{format} if -there are multiple of them, or just a string if there is one of them. -This function must always returns @code{nil}. - -@lisp -(nnheader-report 'nnchoke "You did something totally bogus") - -(nnheader-report 'nnchoke "Could not request group %s" group) -@end lisp - -Gnus, in turn, will call @code{nnheader-get-report} when it gets a -@code{nil} back from a server, and this function returns the most -recently reported message for the backend in question. This function -takes one argument---the server symbol. - -Internally, these functions access @var{backend}@code{-status-string}, -so the @code{nnchoke} backend will have its error message stored in -@code{nnchoke-status-string}. - - -@node Writing New Backends -@subsubsection Writing New Backends - -Many backends are quite similar. @code{nnml} is just like -@code{nnspool}, but it allows you to edit the articles on the server. -@code{nnmh} is just like @code{nnml}, but it doesn't use an active file, -and it doesn't maintain overview databases. @code{nndir} is just like -@code{nnml}, but it has no concept of ``groups'', and it doesn't allow -editing articles. - -It would make sense if it were possible to ``inherit'' functions from -backends when writing new backends. And, indeed, you can do that if you -want to. (You don't have to if you don't want to, of course.) - -All the backends declare their public variables and functions by using a -package called @code{nnoo}. - -To inherit functions from other backends (and allow other backends to -inherit functions from the current backend), you should use the -following macros: - -@table @code - -@item nnoo-declare -This macro declares the first parameter to be a child of the subsequent -parameters. For instance: - -@lisp -(nnoo-declare nndir - nnml nnmh) -@end lisp - -@code{nndir} has declared here that it intends to inherit functions from -both @code{nnml} and @code{nnmh}. - -@item defvoo -This macro is equivalent to @code{defvar}, but registers the variable as -a public server variable. Most state-oriented variables should be -declared with @code{defvoo} instead of @code{defvar}. - -In addition to the normal @code{defvar} parameters, it takes a list of -variables in the parent backends to map the variable to when executing -a function in those backends. - -@lisp -(defvoo nndir-directory nil - "Where nndir will look for groups." - nnml-current-directory nnmh-current-directory) -@end lisp - -This means that @code{nnml-current-directory} will be set to -@code{nndir-directory} when an @code{nnml} function is called on behalf -of @code{nndir}. (The same with @code{nnmh}.) - -@item nnoo-define-basics -This macro defines some common functions that almost all backends should -have. - -@example -(nnoo-define-basics nndir) -@end example - -@item deffoo -This macro is just like @code{defun} and takes the same parameters. In -addition to doing the normal @code{defun} things, it registers the -function as being public so that other backends can inherit it. - -@item nnoo-map-functions -This macro allows mapping of functions from the current backend to -functions from the parent backends. - -@example -(nnoo-map-functions nndir - (nnml-retrieve-headers 0 nndir-current-group 0 0) - (nnmh-request-article 0 nndir-current-group 0 0)) -@end example - -This means that when @code{nndir-retrieve-headers} is called, the first, -third, and fourth parameters will be passed on to -@code{nnml-retrieve-headers}, while the second parameter is set to the -value of @code{nndir-current-group}. - -@item nnoo-import -This macro allows importing functions from backends. It should be the -last thing in the source file, since it will only define functions that -haven't already been defined. - -@example -(nnoo-import nndir - (nnmh - nnmh-request-list - nnmh-request-newgroups) - (nnml)) -@end example - -This means that calls to @code{nndir-request-list} should just be passed -on to @code{nnmh-request-list}, while all public functions from -@code{nnml} that haven't been defined in @code{nndir} yet should be -defined now. - -@end table - -Below is a slightly shortened version of the @code{nndir} backend. - -@lisp -;;; nndir.el --- single directory newsgroup access for Gnus -;; Copyright (C) 1995,96 Free Software Foundation, Inc. - -;;; Code: - -(require 'nnheader) -(require 'nnmh) -(require 'nnml) -(require 'nnoo) -(eval-when-compile (require 'cl)) - -(nnoo-declare nndir - nnml nnmh) - -(defvoo nndir-directory nil - "Where nndir will look for groups." - nnml-current-directory nnmh-current-directory) - -(defvoo nndir-nov-is-evil nil - "*Non-nil means that nndir will never retrieve NOV headers." - nnml-nov-is-evil) - -(defvoo nndir-current-group "" - nil - nnml-current-group nnmh-current-group) -(defvoo nndir-top-directory nil nil nnml-directory nnmh-directory) -(defvoo nndir-get-new-mail nil nil nnml-get-new-mail nnmh-get-new-mail) - -(defvoo nndir-status-string "" nil nnmh-status-string) -(defconst nndir-version "nndir 1.0") - -;;; Interface functions. - -(nnoo-define-basics nndir) - -(deffoo nndir-open-server (server &optional defs) - (setq nndir-directory - (or (cadr (assq 'nndir-directory defs)) - server)) - (unless (assq 'nndir-directory defs) - (push `(nndir-directory ,server) defs)) - (push `(nndir-current-group - ,(file-name-nondirectory - (directory-file-name nndir-directory))) - defs) - (push `(nndir-top-directory - ,(file-name-directory (directory-file-name nndir-directory))) - defs) - (nnoo-change-server 'nndir server defs)) - -(nnoo-map-functions nndir - (nnml-retrieve-headers 0 nndir-current-group 0 0) - (nnmh-request-article 0 nndir-current-group 0 0) - (nnmh-request-group nndir-current-group 0 0) - (nnmh-close-group nndir-current-group 0)) - -(nnoo-import nndir - (nnmh - nnmh-status-message - nnmh-request-list - nnmh-request-newgroups)) - -(provide 'nndir) -@end lisp - - -@node Hooking New Backends Into Gnus -@subsubsection Hooking New Backends Into Gnus - -@vindex gnus-valid-select-methods -@findex gnus-declare-backend -Having Gnus start using your new backend is rather easy---you just -declare it with the @code{gnus-declare-backend} functions. This will -enter the backend into the @code{gnus-valid-select-methods} variable. - -@code{gnus-declare-backend} takes two parameters---the backend name and -an arbitrary number of @dfn{abilities}. - -Here's an example: - -@lisp -(gnus-declare-backend "nnchoke" 'mail 'respool 'address) -@end lisp - -The above line would then go in the @file{nnchoke.el} file. - -The abilities can be: - -@table @code -@item mail -This is a mailish backend---followups should (probably) go via mail. -@item post -This is a newsish backend---followups should (probably) go via news. -@item post-mail -This backend supports both mail and news. -@item none -This is neither a post nor mail backend---it's something completely -different. -@item respool -It supports respooling---or rather, it is able to modify its source -articles and groups. -@item address -The name of the server should be in the virtual server name. This is -true for almost all backends. -@item prompt-address -The user should be prompted for an address when doing commands like -@kbd{B} in the group buffer. This is true for backends like -@code{nntp}, but not @code{nnmbox}, for instance. -@end table - - -@node Mail-like Backends -@subsubsection Mail-like Backends - -One of the things that separate the mail backends from the rest of the -backends is the heavy dependence by the mail backends on common -functions in @file{nnmail.el}. For instance, here's the definition of -@code{nnml-request-scan}: - -@lisp -(deffoo nnml-request-scan (&optional group server) - (setq nnml-article-file-alist nil) - (nnmail-get-new-mail 'nnml 'nnml-save-nov nnml-directory group)) -@end lisp - -It simply calls @code{nnmail-get-new-mail} with a few parameters, -and @code{nnmail} takes care of all the moving and splitting of the -mail. - -This function takes four parameters. - -@table @var -@item method -This should be a symbol to designate which backend is responsible for -the call. - -@item exit-function -This function should be called after the splitting has been performed. - -@item temp-directory -Where the temporary files should be stored. - -@item group -This optional argument should be a group name if the splitting is to be -performed for one group only. -@end table - -@code{nnmail-get-new-mail} will call @var{backend}@code{-save-mail} to -save each article. @var{backend}@code{-active-number} will be called to -find the article number assigned to this article. - -The function also uses the following variables: -@var{backend}@code{-get-new-mail} (to see whether to get new mail for -this backend); and @var{backend}@code{-group-alist} and -@var{backend}@code{-active-file} to generate the new active file. -@var{backend}@code{-group-alist} should be a group-active alist, like -this: - -@example -(("a-group" (1 . 10)) - ("some-group" (34 . 39))) -@end example - - -@node Score File Syntax -@subsection Score File Syntax - -Score files are meant to be easily parseable, but yet extremely -mallable. It was decided that something that had the same read syntax -as an Emacs Lisp list would fit that spec. - -Here's a typical score file: - -@lisp -(("summary" - ("win95" -10000 nil s) - ("Gnus")) - ("from" - ("Lars" -1000)) - (mark -100)) -@end lisp - -BNF definition of a score file: - -@example -score-file = "" / "(" *element ")" -element = rule / atom -rule = string-rule / number-rule / date-rule -string-rule = "(" quote string-header quote space *string-match ")" -number-rule = "(" quote number-header quote space *number-match ")" -date-rule = "(" quote date-header quote space *date-match ")" -quote = -string-header = "subject" / "from" / "references" / "message-id" / - "xref" / "body" / "head" / "all" / "followup" -number-header = "lines" / "chars" -date-header = "date" -string-match = "(" quote quote [ "" / [ space score [ "" / - space date [ "" / [ space string-match-t ] ] ] ] ] ")" -score = "nil" / -date = "nil" / -string-match-t = "nil" / "s" / "substring" / "S" / "Substring" / - "r" / "regex" / "R" / "Regex" / - "e" / "exact" / "E" / "Exact" / - "f" / "fuzzy" / "F" / "Fuzzy" -number-match = "(" [ "" / [ space score [ "" / - space date [ "" / [ space number-match-t ] ] ] ] ] ")" -number-match-t = "nil" / "=" / "<" / ">" / ">=" / "<=" -date-match = "(" quote quote [ "" / [ space score [ "" / - space date [ "" / [ space date-match-t ] ] ] ] ")" -date-match-t = "nil" / "at" / "before" / "after" -atom = "(" [ required-atom / optional-atom ] ")" -required-atom = mark / expunge / mark-and-expunge / files / - exclude-files / read-only / touched -optional-atom = adapt / local / eval -mark = "mark" space nil-or-number -nil-or-number = "nil" / -expunge = "expunge" space nil-or-number -mark-and-expunge = "mark-and-expunge" space nil-or-number -files = "files" *[ space ] -exclude-files = "exclude-files" *[ space ] -read-only = "read-only" [ space "nil" / space "t" ] -adapt = "adapt" [ space "ignore" / space "t" / space adapt-rule ] -adapt-rule = "(" *[ *[ "(" ")" ] ")" -local = "local" *[ space "(" space ")" ] -eval = "eval" space -space = *[ " " / / ] -@end example - -Any unrecognized elements in a score file should be ignored, but not -discarded. - -As you can see, white space is needed, but the type and amount of white -space is irrelevant. This means that formatting of the score file is -left up to the programmer---if it's simpler to just spew it all out on -one looong line, then that's ok. - -The meaning of the various atoms are explained elsewhere in this -manual (@pxref{Score File Format}). - - -@node Headers -@subsection Headers - -Internally Gnus uses a format for storing article headers that -corresponds to the @sc{nov} format in a mysterious fashion. One could -almost suspect that the author looked at the @sc{nov} specification and -just shamelessly @emph{stole} the entire thing, and one would be right. - -@dfn{Header} is a severely overloaded term. ``Header'' is used in -RFC 1036 to talk about lines in the head of an article (e.g., -@code{From}). It is used by many people as a synonym for -``head''---``the header and the body''. (That should be avoided, in my -opinion.) And Gnus uses a format internally that it calls ``header'', -which is what I'm talking about here. This is a 9-element vector, -basically, with each header (ouch) having one slot. - -These slots are, in order: @code{number}, @code{subject}, @code{from}, -@code{date}, @code{id}, @code{references}, @code{chars}, @code{lines}, -@code{xref}, and @code{extra}. There are macros for accessing and -setting these slots---they all have predictable names beginning with -@code{mail-header-} and @code{mail-header-set-}, respectively. - -All these slots contain strings, except the @code{extra} slot, which -contains an alist of header/value pairs (@pxref{To From Newsgroups}). - - -@node Ranges -@subsection Ranges - -@sc{gnus} introduced a concept that I found so useful that I've started -using it a lot and have elaborated on it greatly. - -The question is simple: If you have a large amount of objects that are -identified by numbers (say, articles, to take a @emph{wild} example) -that you want to qualify as being ``included'', a normal sequence isn't -very useful. (A 200,000 length sequence is a bit long-winded.) - -The solution is as simple as the question: You just collapse the -sequence. - -@example -(1 2 3 4 5 6 10 11 12) -@end example - -is transformed into - -@example -((1 . 6) (10 . 12)) -@end example - -To avoid having those nasty @samp{(13 . 13)} elements to denote a -lonesome object, a @samp{13} is a valid element: - -@example -((1 . 6) 7 (10 . 12)) -@end example - -This means that comparing two ranges to find out whether they are equal -is slightly tricky: - -@example -((1 . 5) 7 8 (10 . 12)) -@end example - -and - -@example -((1 . 5) (7 . 8) (10 . 12)) -@end example - -are equal. In fact, any non-descending list is a range: - -@example -(1 2 3 4 5) -@end example - -is a perfectly valid range, although a pretty long-winded one. This is -also valid: - -@example -(1 . 5) -@end example - -and is equal to the previous range. - -Here's a BNF definition of ranges. Of course, one must remember the -semantic requirement that the numbers are non-descending. (Any number -of repetition of the same number is allowed, but apt to disappear in -range handling.) - -@example -range = simple-range / normal-range -simple-range = "(" number " . " number ")" -normal-range = "(" start-contents ")" -contents = "" / simple-range *[ " " contents ] / - number *[ " " contents ] -@end example - -Gnus currently uses ranges to keep track of read articles and article -marks. I plan on implementing a number of range operators in C if The -Powers That Be are willing to let me. (I haven't asked yet, because I -need to do some more thinking on what operators I need to make life -totally range-based without ever having to convert back to normal -sequences.) - - -@node Group Info -@subsection Group Info - -Gnus stores all permanent info on groups in a @dfn{group info} list. -This list is from three to six elements (or more) long and exhaustively -describes the group. - -Here are two example group infos; one is a very simple group while the -second is a more complex one: - -@example -("no.group" 5 ((1 . 54324))) - -("nnml:my.mail" 3 ((1 . 5) 9 (20 . 55)) - ((tick (15 . 19)) (replied 3 6 (19 . 3))) - (nnml "") - ((auto-expire . t) (to-address . "ding@@gnus.org"))) -@end example - -The first element is the @dfn{group name}---as Gnus knows the group, -anyway. The second element is the @dfn{subscription level}, which -normally is a small integer. (It can also be the @dfn{rank}, which is a -cons cell where the @code{car} is the level and the @code{cdr} is the -score.) The third element is a list of ranges of read articles. The -fourth element is a list of lists of article marks of various kinds. -The fifth element is the select method (or virtual server, if you like). -The sixth element is a list of @dfn{group parameters}, which is what -this section is about. - -Any of the last three elements may be missing if they are not required. -In fact, the vast majority of groups will normally only have the first -three elements, which saves quite a lot of cons cells. - -Here's a BNF definition of the group info format: - -@example -info = "(" group space ralevel space read - [ "" / [ space marks-list [ "" / [ space method [ "" / - space parameters ] ] ] ] ] ")" -group = quote quote -ralevel = rank / level -level = -rank = "(" level "." score ")" -score = -read = range -marks-lists = nil / "(" *marks ")" -marks = "(" range ")" -method = "(" *elisp-forms ")" -parameters = "(" *elisp-forms ")" -@end example - -Actually that @samp{marks} rule is a fib. A @samp{marks} is a -@samp{} consed on to a @samp{range}, but that's a bitch to say -in pseudo-BNF. - -If you have a Gnus info and want to access the elements, Gnus offers a -series of macros for getting/setting these elements. - -@table @code -@item gnus-info-group -@itemx gnus-info-set-group -@findex gnus-info-group -@findex gnus-info-set-group -Get/set the group name. - -@item gnus-info-rank -@itemx gnus-info-set-rank -@findex gnus-info-rank -@findex gnus-info-set-rank -Get/set the group rank (@pxref{Group Score}). - -@item gnus-info-level -@itemx gnus-info-set-level -@findex gnus-info-level -@findex gnus-info-set-level -Get/set the group level. - -@item gnus-info-score -@itemx gnus-info-set-score -@findex gnus-info-score -@findex gnus-info-set-score -Get/set the group score (@pxref{Group Score}). - -@item gnus-info-read -@itemx gnus-info-set-read -@findex gnus-info-read -@findex gnus-info-set-read -Get/set the ranges of read articles. - -@item gnus-info-marks -@itemx gnus-info-set-marks -@findex gnus-info-marks -@findex gnus-info-set-marks -Get/set the lists of ranges of marked articles. - -@item gnus-info-method -@itemx gnus-info-set-method -@findex gnus-info-method -@findex gnus-info-set-method -Get/set the group select method. - -@item gnus-info-params -@itemx gnus-info-set-params -@findex gnus-info-params -@findex gnus-info-set-params -Get/set the group parameters. -@end table - -All the getter functions take one parameter---the info list. The setter -functions take two parameters---the info list and the new value. - -The last three elements in the group info aren't mandatory, so it may be -necessary to extend the group info before setting the element. If this -is necessary, you can just pass on a non-@code{nil} third parameter to -the three final setter functions to have this happen automatically. - - -@node Extended Interactive -@subsection Extended Interactive -@cindex interactive -@findex gnus-interactive - -Gnus extends the standard Emacs @code{interactive} specification -slightly to allow easy use of the symbolic prefix (@pxref{Symbolic -Prefixes}). Here's an example of how this is used: - -@lisp -(defun gnus-summary-increase-score (&optional score symp) - (interactive (gnus-interactive "P\ny")) - ... - ) -@end lisp - -The best thing to do would have been to implement -@code{gnus-interactive} as a macro which would have returned an -@code{interactive} form, but this isn't possible since Emacs checks -whether a function is interactive or not by simply doing an @code{assq} -on the lambda form. So, instead we have @code{gnus-interactive} -function that takes a string and returns values that are usable to -@code{interactive}. - -This function accepts (almost) all normal @code{interactive} specs, but -adds a few more. - -@table @samp -@item y -@vindex gnus-current-prefix-symbol -The current symbolic prefix---the @code{gnus-current-prefix-symbol} -variable. - -@item Y -@vindex gnus-current-prefix-symbols -A list of the current symbolic prefixes---the -@code{gnus-current-prefix-symbol} variable. - -@item A -The current article number---the @code{gnus-summary-article-number} -function. - -@item H -The current article header---the @code{gnus-summary-article-header} -function. - -@item g -The current group name---the @code{gnus-group-group-name} -function. - -@end table - - -@node Emacs/XEmacs Code -@subsection Emacs/XEmacs Code -@cindex XEmacs -@cindex Emacsen - -While Gnus runs under Emacs, XEmacs and Mule, I decided that one of the -platforms must be the primary one. I chose Emacs. Not because I don't -like XEmacs or Mule, but because it comes first alphabetically. - -This means that Gnus will byte-compile under Emacs with nary a warning, -while XEmacs will pump out gigabytes of warnings while byte-compiling. -As I use byte-compilation warnings to help me root out trivial errors in -Gnus, that's very useful. - -I've also consistently used Emacs function interfaces, but have used -Gnusey aliases for the functions. To take an example: Emacs defines a -@code{run-at-time} function while XEmacs defines a @code{start-itimer} -function. I then define a function called @code{gnus-run-at-time} that -takes the same parameters as the Emacs @code{run-at-time}. When running -Gnus under Emacs, the former function is just an alias for the latter. -However, when running under XEmacs, the former is an alias for the -following function: - -@lisp -(defun gnus-xmas-run-at-time (time repeat function &rest args) - (start-itimer - "gnus-run-at-time" - `(lambda () - (,function ,@@args)) - time repeat)) -@end lisp - -This sort of thing has been done for bunches of functions. Gnus does -not redefine any native Emacs functions while running under XEmacs---it -does this @code{defalias} thing with Gnus equivalents instead. Cleaner -all over. - -In the cases where the XEmacs function interface was obviously cleaner, -I used it instead. For example @code{gnus-region-active-p} is an alias -for @code{region-active-p} in XEmacs, whereas in Emacs it is a function. - -Of course, I could have chosen XEmacs as my native platform and done -mapping functions the other way around. But I didn't. The performance -hit these indirections impose on Gnus under XEmacs should be slight. - - -@node Various File Formats -@subsection Various File Formats - -@menu -* Active File Format:: Information on articles and groups available. -* Newsgroups File Format:: Group descriptions. -@end menu - - -@node Active File Format -@subsubsection Active File Format - -The active file lists all groups available on the server in -question. It also lists the highest and lowest current article numbers -in each group. - -Here's an excerpt from a typical active file: - -@example -soc.motss 296030 293865 y -alt.binaries.pictures.fractals 3922 3913 n -comp.sources.unix 1605 1593 m -comp.binaries.ibm.pc 5097 5089 y -no.general 1000 900 y -@end example - -Here's a pseudo-BNF definition of this file: - -@example -active = *group-line -group-line = group spc high-number spc low-number spc flag -group = -spc = " " -high-number = -low-number = -flag = "y" / "n" / "m" / "j" / "x" / "=" group -@end example - -For a full description of this file, see the manual pages for -@samp{innd}, in particular @samp{active(5)}. - - -@node Newsgroups File Format -@subsubsection Newsgroups File Format - -The newsgroups file lists groups along with their descriptions. Not all -groups on the server have to be listed, and not all groups in the file -have to exist on the server. The file is meant purely as information to -the user. - -The format is quite simple; a group name, a tab, and the description. -Here's the definition: - -@example -newsgroups = *line -line = group tab description -group = -tab = -description = -@end example - - -@page -@node Emacs for Heathens -@section Emacs for Heathens - -Believe it or not, but some people who use Gnus haven't really used -Emacs much before they embarked on their journey on the Gnus Love Boat. -If you are one of those unfortunates whom ``@kbd{M-C-a}'', ``kill the -region'', and ``set @code{gnus-flargblossen} to an alist where the key -is a regexp that is used for matching on the group name'' are magical -phrases with little or no meaning, then this appendix is for you. If -you are already familiar with Emacs, just ignore this and go fondle your -cat instead. - -@menu -* Keystrokes:: Entering text and executing commands. -* Emacs Lisp:: The built-in Emacs programming language. -@end menu - - -@node Keystrokes -@subsection Keystrokes - -@itemize @bullet -@item -Q: What is an experienced Emacs user? - -@item -A: A person who wishes that the terminal had pedals. -@end itemize - -Yes, when you use Emacs, you are apt to use the control key, the shift -key and the meta key a lot. This is very annoying to some people -(notably @code{vi}le users), and the rest of us just love the hell out -of it. Just give up and submit. Emacs really does stand for -``Escape-Meta-Alt-Control-Shift'', and not ``Editing Macros'', as you -may have heard from other disreputable sources (like the Emacs author). - -The shift keys are normally located near your pinky fingers, and are -normally used to get capital letters and stuff. You probably use it all -the time. The control key is normally marked ``CTRL'' or something like -that. The meta key is, funnily enough, never marked as such on any -keyboard. The one I'm currently at has a key that's marked ``Alt'', -which is the meta key on this keyboard. It's usually located somewhere -to the left hand side of the keyboard, usually on the bottom row. - -Now, us Emacs people don't say ``press the meta-control-m key'', -because that's just too inconvenient. We say ``press the @kbd{M-C-m} -key''. @kbd{M-} is the prefix that means ``meta'' and ``C-'' is the -prefix that means ``control''. So ``press @kbd{C-k}'' means ``press -down the control key, and hold it down while you press @kbd{k}''. -``Press @kbd{M-C-k}'' means ``press down and hold down the meta key and -the control key and then press @kbd{k}''. Simple, ay? - -This is somewhat complicated by the fact that not all keyboards have a -meta key. In that case you can use the ``escape'' key. Then @kbd{M-k} -means ``press escape, release escape, press @kbd{k}''. That's much more -work than if you have a meta key, so if that's the case, I respectfully -suggest you get a real keyboard with a meta key. You can't live without -it. - - - -@node Emacs Lisp -@subsection Emacs Lisp - -Emacs is the King of Editors because it's really a Lisp interpreter. -Each and every key you tap runs some Emacs Lisp code snippet, and since -Emacs Lisp is an interpreted language, that means that you can configure -any key to run any arbitrary code. You just, like, do it. - -Gnus is written in Emacs Lisp, and is run as a bunch of interpreted -functions. (These are byte-compiled for speed, but it's still -interpreted.) If you decide that you don't like the way Gnus does -certain things, it's trivial to have it do something a different way. -(Well, at least if you know how to write Lisp code.) However, that's -beyond the scope of this manual, so we are simply going to talk about -some common constructs that you normally use in your @file{.emacs} file -to customize Gnus. - -If you want to set the variable @code{gnus-florgbnize} to four (4), you -write the following: - -@lisp -(setq gnus-florgbnize 4) -@end lisp - -This function (really ``special form'') @code{setq} is the one that can -set a variable to some value. This is really all you need to know. Now -you can go and fill your @code{.emacs} file with lots of these to change -how Gnus works. - -If you have put that thing in your @code{.emacs} file, it will be read -and @code{eval}ed (which is lisp-ese for ``run'') the next time you -start Emacs. If you want to change the variable right away, simply say -@kbd{C-x C-e} after the closing parenthesis. That will @code{eval} the -previous ``form'', which is a simple @code{setq} statement here. - -Go ahead---just try it, if you're located at your Emacs. After you -@kbd{C-x C-e}, you will see @samp{4} appear in the echo area, which -is the return value of the form you @code{eval}ed. - -Some pitfalls: - -If the manual says ``set @code{gnus-read-active-file} to @code{some}'', -that means: - -@lisp -(setq gnus-read-active-file 'some) -@end lisp - -On the other hand, if the manual says ``set @code{gnus-nntp-server} to -@samp{nntp.ifi.uio.no}'', that means: - -@lisp -(setq gnus-nntp-server "nntp.ifi.uio.no") -@end lisp - -So be careful not to mix up strings (the latter) with symbols (the -former). The manual is unambiguous, but it can be confusing. - -@page -@include gnus-faq.texi - -@node Index -@chapter Index -@printindex cp - -@node Key Index -@chapter Key Index -@printindex ky - -@summarycontents -@contents -@bye - -@iftex -@iflatex -\end{document} -@end iflatex -@end iftex - -@c End: -% LocalWords: Backend BNF mucho Backends backends detailmenu cindex kindex kbd -% LocalWords: findex Gnusae vindex dfn dfn samp nntp setq nnspool nntpserver -% LocalWords: nnmbox backend newusers Blllrph NEWGROUPS dingnusdingnusdingnus -% LocalWords: pre fab rec comp nnslashdot regex ga ga sci nnml nnbabyl nnmh -% LocalWords: nnfolder emph looong eld newsreaders defun init elc pxref diff --git a/texi/gnuslogo.refcard b/texi/gnuslogo.refcard deleted file mode 100644 index aacf40e..0000000 --- a/texi/gnuslogo.refcard +++ /dev/null @@ -1,243 +0,0 @@ -%!PS-Adobe-2.0 EPSF-1.2 -%%Creator: Adobe Illustrator 88(TM) format generated by CorelTRACE Version 2.0C -%%Title: /home/menja/c/larsi/gnus.eps -%%BoundingBox: 0 0 924.5 907.2 -%%CreationDate: Tue Feb 20 01:51:37 1996 -%%DocumentFonts: -%%ColorUsage: B & W -%%TileBox: 0 0 924.5 907.2 -%%EndComments -%%BeginProcSet:Adobe_Illustrator_1.1 0 0 -% Copyright 1992 Corel Corporation. - -% All rights reserved. -.15 .15 scale - -/wPSMDict 150 dict def -wPSMDict begin -/bd {bind def} bind def -/ld {load def} bd -/xd {exch def} bd -/_ null def -/$c 0 def -/$m 0 def -/$y 0 def -/$k 0 def -/$t 1 def -/$n _ def -/$o 0 def -/$C 0 def -/$M 0 def -/$Y 0 def -/$K 0 def -/$T 1 def -/$N _ def -/$O 0 def -/$h false def -/$al 0 def -/$tr 0 def -/$le 0 def -/$lx 0 def -/$ly 0 def -/$ctm matrix currentmatrix def -/@cp /closepath ld -/@gs /gsave ld -/@gr /grestore ld -/@MN {2 copy le{pop}{exch pop}ifelse}bd -/setcmykcolor where {pop}{/setcmykcolor{4 1 roll -3 {3 index add 1 @MN 1 exch sub 3 1 roll} repeat -setrgbcolor -pop}bd}ifelse -/@tc{dup 1 ge{pop}{4 {dup -6 -1 roll -mul -exch}repeat -pop}ifelse}bd -/@scc{$c $m $y $k $t @tc setcmykcolor true}bd -/@SCC{$C $M $Y $K $T @tc setcmykcolor true}bd -/@sm{/$ctm $ctm currentmatrix def}bd -/x {/$t xd /$n xd -/$k xd /$y xd /$m xd /$c xd}bd -/X {/$T xd /$N xd -/$K xd /$Y xd /$M xd /$C xd}bd -/g {1 exch sub 0 0 0 -4 -1 roll -_ 1 x}bd -/G {1 exch sub 0 0 0 -4 -1 roll -_ 1 X}bd -/k {_ 1 x}bd -/K {_ 1 X}bd -/d /setdash ld -/i {dup 0 ne {setflat} {pop} ifelse}bd -/j /setlinejoin ld -/J /setlinecap ld -/M /setmiterlimit ld -/w /setlinewidth ld -/O {/$o xd}bd -/R {/$O xd}bd -/c /curveto ld -/C /c ld -/l /lineto ld -/L /l ld -/m /moveto ld -/n /newpath ld -/N /newpath ld -/F {@scc{eofill}if n} bd -/f {@cp F}bd -/S {@SCC{stroke}if n} bd -/s {@cp -S}bd -/B {@gs F @gr -S}bd -/b {@cp B }bd -/u {}bd -/U {}bd -%%EndProlog -%%BeginSetup -%%EndSetup -1 i -2 J -0 j -4 M -[]0 d - -%%Note: traced as Normal_Outline -0 g -259.2 78.2 m -327.3 178.5 L -327.8 179.0 328.3 180.0 329.7 180.4 C -373.4 241.9 L -388.8 263.5 L -389.2 264.0 390.7 264.4 391.6 265.4 C -413.7 298.0 453.6 351.8 468.0 404.6 C -467.5 405.6 467.5 407.0 467.5 407.0 C -442.0 367.6 411.3 319.2 379.2 279.3 C -372.0 267.3 366.7 265.9 361.9 254.8 C -333.1 216.0 L -323.5 207.3 311.0 185.2 302.8 175.6 C -298.0 165.6 293.2 164.1 288.9 154.0 C -282.2 147.8 282.2 139.6 276.4 132.4 C -258.2 77.7 L -258.2 77.7 259.2 78.2 259.2 78.2 C -f -0 g -470.8 211.6 m -470.8 211.6 472.3 212.1 472.3 212.1 C -518.8 305.2 L -531.3 317.2 L -537.6 314.8 539.0 300.9 548.6 301.9 C -555.8 301.9 554.8 302.8 561.6 306.2 C -595.2 357.1 L -595.6 358.0 597.6 358.5 598.5 360.0 C -615.8 398.4 650.8 450.7 657.6 483.8 C -658.0 486.2 658.0 488.1 658.0 489.6 C -654.2 489.1 656.1 485.2 650.4 479.5 C -634.5 446.8 611.5 402.2 592.8 377.2 C -588.0 370.0 581.7 365.7 577.4 358.5 C -570.2 355.6 568.3 351.3 560.1 356.6 C -554.8 360.0 553.9 364.8 550.0 370.0 C -548.1 371.5 550.0 370.5 547.2 371.0 C -541.4 365.2 L -511.2 319.6 484.3 276.0 471.8 220.3 C -470.8 215.5 471.3 215.5 469.4 212.1 C -469.4 212.1 470.8 211.6 470.8 211.6 C -f -0 g -731.0 292.8 m -756.0 351.3 751.6 407.0 771.3 468.0 C -783.3 520.8 809.7 582.2 822.2 635.0 C -829.4 684.4 855.8 732.0 825.1 789.1 C -811.6 797.7 799.6 805.4 784.8 802.0 C -757.9 792.0 732.9 743.0 726.2 712.8 C -727.6 708.4 727.2 707.0 730.0 704.6 C -731.0 704.1 732.9 704.1 734.4 704.6 C -737.2 709.9 L -754.0 747.3 L -758.8 755.0 771.8 754.0 781.9 751.2 C -788.1 748.3 791.5 745.9 797.7 744.0 C -831.8 680.1 800.6 611.0 784.3 542.8 C -765.6 478.5 748.3 431.5 739.2 370.5 C -733.9 347.5 729.1 318.7 730.0 292.8 C -730.0 292.8 731.0 292.8 731.0 292.8 C -f -0 g -434.4 462.7 m -460.3 496.8 462.2 532.8 458.4 575.5 C -456.4 588.0 451.2 599.0 445.4 609.1 C -435.3 620.1 435.3 622.5 421.9 630.7 C -411.8 619.6 398.4 604.8 391.6 586.0 C -393.6 581.7 396.4 584.1 401.7 577.9 C -403.2 577.4 404.6 576.9 404.6 576.9 C -407.0 574.5 406.0 573.6 410.4 571.2 C -414.2 564.0 418.5 558.2 424.3 545.7 C -437.2 526.5 428.1 489.6 433.9 462.2 C -433.9 462.2 434.4 462.7 434.4 462.7 C -f -0 g -226.0 482.4 m -281.7 485.7 311.0 531.3 357.1 565.9 C -362.8 572.1 364.8 574.0 368.6 580.3 C -368.6 581.7 369.1 582.7 369.6 584.6 C -370.0 585.6 371.5 587.0 372.9 588.0 C -381.6 606.2 L -377.2 605.2 374.8 602.8 371.0 597.6 C -346.0 576.4 316.8 552.0 289.9 536.1 C -288.9 535.2 288.0 534.2 288.0 534.2 C -273.6 528.0 263.5 527.5 247.6 530.8 C -242.4 535.2 239.0 536.1 238.0 544.3 C -239.5 572.1 266.8 600.0 281.2 624.9 C -293.7 637.9 300.4 650.4 311.5 668.1 C -312.0 669.1 313.9 669.6 314.8 671.0 C -319.6 679.6 L -319.6 680.1 319.6 681.6 319.2 682.0 C -285.6 649.4 258.7 601.4 229.9 555.8 C -216.4 529.9 205.4 511.2 210.2 491.0 C -212.6 483.8 218.8 484.8 226.0 482.4 C -f -0 g -624.9 600.4 m -645.1 606.2 L -676.3 622.5 694.5 658.0 710.8 698.4 C -710.4 704.1 711.3 704.6 712.3 709.4 C -696.9 685.9 693.6 667.6 662.4 653.7 C -654.7 651.3 649.4 650.4 639.3 650.8 C -633.1 654.2 625.4 659.0 621.6 670.5 C -597.6 620.6 L -600.9 612.4 604.3 607.2 613.4 603.8 C -617.2 603.3 621.1 601.4 624.9 600.4 C -f -0 g -528.4 619.2 m -548.6 617.2 564.9 629.2 578.8 645.6 C -584.1 651.8 586.5 662.8 591.8 671.0 C -593.2 681.6 603.8 690.2 601.9 704.1 C -598.5 705.1 599.0 698.8 594.7 694.0 C -581.7 679.6 L -569.7 668.6 545.7 663.8 532.8 673.9 C -487.2 697.9 467.5 754.5 413.2 772.8 C -393.1 778.0 387.3 771.8 367.2 760.3 C -360.9 755.5 357.6 744.9 351.3 740.6 C -347.0 740.6 349.9 743.5 344.6 747.3 C -344.1 748.8 343.6 750.2 343.6 750.2 C -322.5 770.8 L -312.9 775.2 300.9 784.3 287.0 779.0 C -283.6 777.1 281.7 776.1 279.3 775.2 C -250.0 750.7 229.4 705.6 181.4 697.4 C -165.6 705.1 160.3 715.2 150.7 733.9 C -130.5 685.4 L -142.5 663.3 L -147.3 661.9 147.3 660.4 151.2 655.6 C -160.8 650.4 169.9 649.4 182.8 655.2 C -212.1 676.8 L -213.1 677.7 214.0 678.7 216.0 679.2 C -238.5 695.5 250.5 727.6 279.3 735.3 C -296.1 727.2 312.4 715.6 326.8 695.5 C -330.2 688.3 331.6 684.9 335.5 681.1 C -345.1 694.5 352.8 717.6 372.9 721.9 C -423.3 726.7 453.6 670.5 498.2 631.6 C -510.7 624.4 517.4 621.1 528.4 619.2 C -f -%%Trailer -end -showpage diff --git a/texi/gnusref-ja.tex b/texi/gnusref-ja.tex deleted file mode 100644 index 23c0947..0000000 --- a/texi/gnusref-ja.tex +++ /dev/null @@ -1,924 +0,0 @@ -% -*- mode:LaTeX; eval:(set (make-local-variable 'LaTeX-version) "2"); truncate-lines:t; -*- -% include file for the Gnus refcard and booklet -\def\version{5.5} -\def\date{2 May 1998} -\def\author{Vladimir Alexiev $<$vladimir@cs.ualberta.ca$>$} -\raggedbottom\raggedright -\newlength{\logowidth}\setlength{\logowidth}{6.861in} -\newlength{\logoheight}\setlength{\logoheight}{7.013in} -\newlength{\keycolwidth} -\newenvironment{keys}[1]% #1 is the widest key - {\nopagebreak%\noindent% - \settowidth{\keycolwidth}{#1}% - \addtolength{\keycolwidth}{\tabcolsep}% - \addtolength{\keycolwidth}{-\columnwidth}% - \begin{tabular}{@{}l@{\hspace{\tabcolsep}}p{-\keycolwidth}@{}}}% - {\end{tabular}\\} -\catcode`\^=12 % allow ^ to be typed literally -\catcode`\~=12 % allow ~ to be typed literally -\newcommand{\B}[1]{{\bf#1})} % bold l)etter - -\def\Title{ -\begin{center} -{\bf\LARGE Gnus \version\ Reference \Guide\\} -%{\normalsize \Guide\ version \refver} -\end{center} -} - -\newcommand\Logo[1]{\centerline{ -\makebox[\logoscale\logowidth][l]{\vbox to \logoscale\logoheight -{\vfill\special{psfile=gnuslogo.#1}}\vspace{-\baselineskip}}}} - -\def\CopyRight{ -\begin{center} -Copyright \copyright\ 1995 Free Software Foundation, Inc.\\* -Copyright \copyright\ 1995-97 \author.\\* -Created from the Gnus manual Copyright \copyright\ 1994-97 Lars Magne -Ingebrigtsen.\\* -and the Emacs Help Bindings feature (C-h b).\\* -Gnus logo copyright \copyright\ 1995 Luis Fernandes.\\* -\end{center} - -Permission is granted to make and distribute copies of this reference -\guide{} provided the copyright notice and this permission are preserved on -all copies. Please send corrections, additions and suggestions to the -above email address. \Guide{} last edited on \date. -} - -\def\Notes{ -\subsec{Notes} -{\samepage -Gnus $B$O5pBg$G$9(B. $B8=:_$O(B 633 $B$b$NBPOCE*(B ($BMxMQl(B -$B=j$N@aLs$N$?$a$K(B, $B$3$N(B \guide $B$G$OA4$F$N4X?t$O(B ``$B$h$jO@M}E*(B'' $B$JB+G{$G(B -$B0lEY$@$1I=<($5$l$F$$$^$9(B. $BB>$NB+G{$O5-=R$N:G=i$K3g8L$NCf$GM?$($i$l$F$$(B -$B$^$9(B. $B$3$N(B \guide{} $B$O%-!/$/$H$b$r%^%K%e%"%k$r$6$C$HD/$a$k(B {\em $BI,MW(B -\/} $B$,$"$j$^$9(B. - -$BB?$/$N(B gnus $B$NL?Na$O?tCM0z?t$r;H$$$^$9(B. $BIaDL$O%a%?%-!<$r2!$7$F$$$k(B -$B4V$K@\F,0z?t$rF~NO$7$^$9$,(B, $B$?$$$F$$$N(B gnus $B$N%b!<%I$G$O(B, $B?t;z$,<+J,<+(B -$B?H$rA^F~$7$J$$$?$a(B, $B%a%?$r;H$&I,MW$O$"$j$^$;$s(B. $B@\F,0z?t$NIU$$$?$H$-$N(B -$B?6$kIq$$$O(B [$B3Q3g8L(B] $B$G=q$+$l$F$$$^$9(B. $B@\F,0z?t$O$7$P$7$P$3$l$i$r;XDj$9(B -$B$k$N$KMQ$$$i$l$^$9(B: - -\quad [$B5wN%(B] $B%]%$%s%H$,$I$N$/$i$$$N%*%V%8%'%/%H$rHt$P$9$+(B. - -\quad [$BHO0O(B] $B$I$N$/$i$$$N%*%V%8%'%/%H$,:nMQ$5$l$k$+(B ($B8=:_$NJ*$r4^$`(B). - -\quad [p/p] ``$B%W%m%;%9(B/$B@\F,0z?t$N=,47(B'': $B@\F,0z?t$,M?$($i$l$k$H(B, $B:nMQ(B -$B$9$kBP>]$N?t$r7hDj$7$^$9(B ($BIi$O5U8~$-$H$$$&0UL#$G$9(B). -transient-mark-mode $B$+(B zmacs-region $B$,@_Dj$5$l$F$$$F%j!<%8%g%s$,(Bactive -$B$G$"$k$H(B, $B$=$N%j!<%8%g%s$rA`:n$7$^$9(B. $B%W%m%;%90u(B \# $B$G0u$NIU$$$?BP>]$,(B -$B$"$l$P(B, $B$=$l$i$rA`:n$7$^$9(B. $B$=$&$G$J$1$l$P(B, $B8=:_$NBP>]$@$1$rA`:n$7$^$9(B. - -\quad [$B%l%Y%k(B] $B%0%k!<%W9VFIEY%l%Y%k$G$9(B. $BF1Ey$+$=$l$h$jDc$$%0%k!<%W$N(B -$B$_$,:nMQ$N1F6A$rDj$7$F$$$^$9(B. $BMxMQuBV(B \\ -\hline -1 & $B%a!<%k%0%k!<%W(B & \\ -2 & $B%a!<%k%0%k!<%W(B & \\ -3 & $B=i4|9VFI%l%Y%k(B & $B9VFI(B \\ -4 & & \\ -5 & $B=i4|0lMw%l%Y%k(B & \\ -\hline -6 & $B=i4|Hs9VFI%l%Y%k(B & $BHs9VFI(B \\ -7 & & \\ -\hline -8 & & $B%>%s%S(B \\ -\hline -9 & & $B:o=|(B \\ -\hline -\end{tabular} -}} - -\def\Marks{\subsec{$B0u;X<(J8;z(B}{\samepage -$BL?Na$,D>@\0u$rIU$1$k>l9g$O(B, $B3g8L$GI=<($5$l$F$$$^$9(B. \\* -\newlength{\markcolwidth} -\settowidth{\markcolwidth}{` '}% widest character -\addtolength{\markcolwidth}{4\tabcolsep} -\addtolength{\markcolwidth}{-\columnwidth} -\newlength{\markdblcolwidth} -\setlength{\markdblcolwidth}{\columnwidth} -\addtolength{\markdblcolwidth}{-2\tabcolsep} -\begin{tabular}{|c|p{-\markcolwidth}|} -\hline -\multicolumn{2}{|p{\markdblcolwidth}|} -{{\bf ``$B4{FI(B'' $B0u(B.} - $B$3$l$i$N0u$NA4$F$O35N,9T$N:G=i$N7e$K8=$l$^$9$N$G(B, $B6&B8$9$k$3$H$O$G$-(B - $B$^$;$s(B.}\\ -\hline -` ' & (M-u, M SPC, M c) $BL$FI(B.\\ -! & (!, M t) $B2D;k(B ($B6=L#?<$$(B).\\ %(M !) -? & (?, M ?) $BJ]N1(B ($B%U%)%m!<%"%C%W$N$_$K6=L#$,$"$k(B).\\ -E & (E, M e) {\bf $B;~8B>C5n2DG=(B}. $B%a!<%k%0%k!<%W$G$N$_0UL#$,$"$k(B.\\ %(M x) -\hline\hline -\multicolumn{2}{|p{\markdblcolwidth}|}{$B2<$N0u$O5-;v$,4{FI(B ($B@Z$i$l$?(B, - $B6=L#$N$J$$(B) $B$H$$$&$3$H$r0UL#$7(B, $BBgBNF1MM$J8z2L$r;}$A$^$9(B. $B$7$+$7L?Na(B - $B$K$O$=$l$i$GL@$i$+$J0c$$$,$"$k$b$N$b$"$j$^$9(B ($BNc(B.{} M M-C-r, $BE,1~%9%3(B - $B%"(B).}\\ -\hline -r & (d, M d, M r) $B>C5n(B ($B4{FI(B ({\bf read}) $B$H$7$F0uIU$1$i$l$?(B).\\ -C & (M C; M C-c; M H; c, Z c; Z n; Z C) {\bf catch-up} $B$G@Z$i$l$?(B.\\ -F & (O s; G s b) SOUP $B$5$l$F$$$k(B.\\ -G & (S C, C) $BC$7:Q$_(B ($B<+J,<+?H$N5-;v$N$_(B).\\ -O & $B8E$$(B ({\bf old}) ($BA02s$N%;%C%7%g%s$G4{FI$N0u$,IU$$$?(B).\\ -K & (k, M k; C-k, M K) $B@Z$i$l$?(B ({\bf Killed}).\\ -M & $B=EJ#>C5n$K$h$C$F0u$,IU$$$?(B.\\ -Q & $B$^$P$i%9%l%C%I$N:n@.Cf$KJ,$1$i$l$?(B.\\ -R & $B4{FI(B ({\bf read}) ($B$N0u(B}}\\ -\hline -\# & (\#, M \#, M P p) $B$NM}M3$G%-%c%C%7%e$5$l$F$$$k(B).\\ -A & $B1~Ez:Q$_(B ({\bf answered}) ($B%U%)%m!<%"%C%W$b$7$/$OJVEz$r$7$?(B).\\ -S & (O {\bf x}) $BJ]B8:Q$_(B {\bf Saved}.\\ -+ & $B=i4|%9%3%"$h$j>e(B.\\ -$-$ & $B=i4|%9%3%"$h$j2<(B.\\ -= & $B;R$r;}$D(B ($B$=$N2<$K%9%l%C%I$r(B). `\%e' `gnus-summary-line-format' -$B$r2C$($^$9(B.\\ -\hline -\end{tabular} -}} - - -\def\General{\sec{(H) $B0lHLE*$J%3%^%s%I$H%X%k%W%3%^%s%I(B}{\samepage -$B$3$l$i$NL?Na$O$I$3$G$bF0:n$7$^$9(B. -\begin{keys}{C-c C-i} -C-c C-i & Gnus $B$N%*%s%i%$%s(B {\bf info} $B$K0\F0$7$^$9(B.\\ -C-c C-b & Gnus $B$N(B {\bf bug} $BJs9p$rAw$j$^$9(B.\\ -\end{keys} - -$B$3$l$i$NL?Na$O35N,%b!<%I$GF0:n$7(B, $B$[$H$s$I$O%0%k!<%W%b!<%I$G$bF0:n$7$^(B -$B$9(B.\\* -\begin{keys}{H d} -H d & (C-c C-d) $B$3$N%0%k!<%W$N@bL@(B ({\bf Describe}) $B$r$7$^$9(B. [$B@\(B - $BF,<-(B: $B%5!<%P!<$+$i@bL@$r:FEYFI$_9~$_$^$9(B.]\\ -H f & ange-ftp $B$r;H$C$F(B, $B$3$N%0%k!<%W$N(B {\bf FAQ} $B$ro$KC;$$%X%k%W(B ({\bf help}) $B%a%C%;!<%8$rI=<($7$^$9(B.\\ - -H i & (C-c C-i) Gnus $B$N%*%s%i%$%s(B {\bf info} $B$K0\F0$7$^$9(B.\\ -H v & Gnus $B$N%P!<%8%g%s(B ({\bf version}) $BHV9f$rI=<($7$^$9(B.\\ -\end{keys}}} - -\def\GroupMode{\sec{$B%0%k!<%W%b!<%I(B} -\begin{keys}{C-c M-C-x} -RET & (=) $B$3$N%0%k!<%W$rA*Br$7$^$9(B [$B@\F,0z?t(B: $B$I$l$/$i$$$N(B ($B4{FI(B) - $B5-;v$re$HF1$8$G$9(B.]\\ -? & $BHs>o$KC;$$%X%k%W%a%C%;!<%8$rM?$($^$9(B.\\ -$<$ & $B%0%k!<%W%P%C%U%!$N:G=i$K0\F0$7$^$9(B.\\ -$>$ & $B%0%k!<%W%P%C%U%!$N:G8e$K0\F0$7$^$9(B.\\ -, & $B:GDc%l%Y%k$NL$FI5-;v$KHt$S$^$9(B.\\ -. & $B:G=i$NL$FI5-;v$N$"$k%0%k!<%W$KHt$S$^$9(B.\\ -^ & $B%5!<%P!<%P%C%U%!%b!<%I$KF~$j$^$9(B.\\ -a & $B5-;v(B ({\bf article}) $B$r%0%k!<%W$KEj9F$7$^$9(B.\\ -b & $B56(B ({\bf bogus}) $B%0%k!<%W$r8+$D$1$F>C5n$7$^$9(B.\\ -c & $BA4$F$NL$0u5-;v$K4{FI$N0u$rIU$1$^$9(B ({\bf catch-up}). [p/p]\\ -g & $B?7$7$$5-;v$,$"$k$+(B, $B%5!<%P!<$rD4$Y$^$9(B ({\bf get}). [$B%l%Y%k(B]\\ -j & $B;XDj$5$l$?%0%k!<%W$KHt$S$^$9(B ({\bf jump}) ($B$b$7$+$7$?$i@Z$i(B - $B$l$F$$$k$+$b$7$l$^$;$s(B).\\ -m & $BC/$+$K%a!<%k(B ({\bf mail}) $B$rAw$j$^$9(B.\\ -n & $BL$FI5-;v$N$"$kC5n$9$k$K$O(B - M-x gnus-unload $B$rA0$r;XDj$7(B - $B$^$9(B).\\ -C & $B$3$N%0%k!<%W$NA4$F$N5-;v$r4{FI$H$7$F0uIU$1$^$9(B ({\bf - Catch-up}). [p/p]\\ -F & $B?7$7$$%0%k!<%W$r8+$D$1(B ({\bf find}) $B$=$l$i$K:n6H$rC5n$7$^$9(B.\\ -C-c C-s & `gnus-group-sort-function'. $B$K=>$C$FJB$S49$((B({\bf Sort}) $B$^$9(B.\\ -C-c C-x & $B$3$N%0%k!<%W$NA4$F$N;~8B>C5n2DG=5-;v$r;~8B>C5n(B ({\bf -expiry}) $B$N2aDx$K$+$1$^$9(B.\\ -C-c M-C-x & $B$3$N%0%k!<%W$NA4$F$N5-;v$r;~8B>C5n(B ({\bf expiry}) $B$N2aDx$K(B -$B$+$1$^$9(B.\\ -C-c M-g & $B40A4$KA4$F$N%0%k!<%W$r3hF02=$7$^$9(B.\\ -C-x C-t & 2$B$D$N%0%k!<%W$N0LCV$rJQ99$7$^$9(B ({\bf transpose}).\\ -M-\& & $BC5n(B ({\bf clear}) $B$7$^$9(B ($B4{FI$dB>$N(B - $B0u(B). [p/p] $B%5!<%P!<$rJQ99$7$F(B, $B5-;vHV9f$,9gCW$7$J$$$H$-$O(B - M-x gnus-group-clear-data-on-native-groups $B$r;H$C$F$/$@$5$$(B. - $B$b$7$/$O(B, $B5-;v$K:FHV9fIU$1$r$9$k$?$a$K(B M-x gnus-chage-server - $B$r;H$C$F$/$@$5$$(B. $B$G$b(B, $B$3$l$OCY$$$G$9(B.\\ -\end{keys} -\begin{keys}{C-c M-C-x} -\newlength{\keywidth}\settowidth{\keywidth}{C-c M-C-x}% -\makebox[\keywidth][l]% -{M-d} & {\em $BA4$F(B\/} $B$N%0%k!<%W$N@bL@(B ({\bf describe}) $B$r$7$^$9(B. [$B@\F,0z?t(B: -$B%5!<%P!<$+$i@bL@$r:FFI$_9~$_$7$^$9(B]\\ -M-f & $B$3$N%0%k!<%W$N(B {\bf FAQ} $B$r(B (ange-ftp $B$r;H$C$F(B) $BA0$+@bL@(B ({\bf descriptions}) $B$,@55,I=8=$K9g$&A4$F$N%0%k!<(B -$B%W$r0lMwI=<($7$^$9(B.\\ -A k & $BA4$F$N:o=|$5$l$?(B ({\bf killed}) $B%0%k!<%W$r0lMwI=<($7$^$9(B. -[$B@\F,<-(B: [$BHs(B]$B9XFI$r=|$/A4$F$N%0%k!<%W(B]\\ -A l & $B;XDj$5$l$?%l%Y%k(B {\bf level} $B$NL$FI%0%k!<%W$r0lMwI=<($7$^$9(B. -[$B@\F,<-(B: $B4{FI%0%k!<%W$b(B]\\ -A m & $B@55,I=8=$K9g$$(B ({\bf match}), $BL$FI5-;v$r;}$D%0%k!<%W$r0lMwI=(B -$B<($7$^$9(B. [$B%l%Y%k(B]\\ -A s & (l) $BL$FI5-;v$N$"$k9VFI%0%k!<%W(B {\bf subscribed} $B$r0lMwI=<($7(B -$B$^$9(B. [$B%l%Y%k(B]\\ -A u & (L) $BA4$F$N%0%k!<%W(B ($BHs9VFI(B ({\bf unsubscribed}) $B$r4^$`(B) $B$r0l(B -$BMwI=<($7$^$9(B. [$B%l%Y%k(B, $B=i4|CM$O(B7]\\ -A z & $B%>%s%S(B ({\bf zombie}) $B%0%k!<%W$r0lMwI=<($7$^$9(B.\\ -A A & $BA4$F$N%5!<%P!<$NA4$F$N2DG=$J3hF0(B ({\bf active}) $B%0%k!<%W$r0l(B -$BMwI=<($7$^$9(B ($BCY$$$+$b$7$l$^$;$s(B).\\ -A M & $B@55,I=8=$K9g$&(B ({\bf match}) $BA4$F$N%0%k!<%W$r0lMwI=<($7$^$9(B.\\ -A T & $B%H%T%C%/(B ({\bf topic}) $B$GJT;<$5$l$F$$$kA4$F$N3hF0%0%k!<%W$r(B -$B0lMwI=<($7$^$9(B.\\ -\end{keys}}}} - -\def\CreateGroups{\subsec{(G) $B30It%0%k!<%W$N:n@.(B/$BJT=8(B}{\samepage -$BA*BrJ}K!$O3g8L$NCf$K<($5$l$F$$$^$9(B.\\* -\begin{keys}{G DEL} -G DEL & $B$3$N%0%k!<%W$r>C5n(B ({\bf Delete}) $B$7$^$9(B. [$B@\F,<-(B: $B5-;v$b(B - {\bf $BA4$F(B} $B>C5n$7$^$9(B]\\ -G a & Gnus $B%j%9%H(B {\bf archive} $B%0%k!<%W$r:n$j$^$9(B. (ange-ftp $B$rDL(B - $B$8$F$N(B nndir)\\ -G c & $B$3$N%0%k!<%W$N%Q%i%a!<%?$r(B {\bf customize} $B$7$^$9(B.\\ -G d & $B%G%#%l%/%H%j!<(B ({\bf directory}) $B%0%k!<%W(B $B$r:n$j$^$9(B ($BA4$F$N(B - $B%U%!%$%k$O?t;z$NL>A0$NEj9F$G$9(B). (nndir)\\ -G e & $B$3$N%0%k!<%W$NA*BrJ}K!$rJT=8(B ({\bf edit}) $B$7$^$9(B.\\ -G f & $B%U%!%$%k(B ({\bf file}) $B$K4p$E$$$?%0%k!<%W$r:n$j$^$9(B. - (nndoc: mbox, babyl, digest, mmdf, news, rnews, - clari-briefs, rfc934,rfc822, forward) [$B@\F,<-(B: $B$I$N7A<0$+$r(B - $B?dB,$7$^$;$s(B]\\ -G h & Gnus $B$N%X%k%W(B ({\bf help}) ($B@bL@(B/$B%A%e!<%H%j%"%k(B) $B%0%k!<%W$r(B - $B:n@.$7$^$9(B. (nndoc)\\ -G k & {\bf kiboze} $B%0%k!<%W$r:n@.$7$^$9(B. ($BL>A0(B, $B%0%k!<%W(B, $B@55,I=8=(B - $B$r;XDj$7$^$9(B). (nnkiboze)\\ -G m & $B?7$7$$%0%k!<%W$r:n@.(B ({\bf make}) $B$7$^$9(B ($BL>A0(B, $BJ}K!(B, $B%"%I%l(B - $B%9$r;XDj$7$^$9(B).\\ -G p & $B$3$N%0%k!<%W(B/$B%H%T%C%/$N%Q%i%a!<%?(B ({\bf parameters}) $B$rJT=8(B - $B$7$^$9(B.\\ -G r & $B$3$N%0%k!<%W$r2~L>(B ({\bf rename}) $B$7$^$9(B ($B%a!<%k%0%k!<%W$N$_(B).\\ -G v & $B$3$N%0%k!<%W$r2>A[(B ({\bf virtual}) $B%0%k!<%W$KDI2C$7$^$9(B. [p/p]\\ -G w & {\bf web} $B$K4p$$$?%0%k!<%W$r:n@.$7$^$9(B. (nnweb: dejanews, - altavista, reference) [$B@\F,<-(B: $B%0%k!<%W$r1JB3$K(B]\\ -G D & $B%G%#%l%/%H%j!<(B ({\bf directory}) $B$K(B ($B0l;~(B) $B%0%k!<%W$H$7$FF~(B -$B$j$^$9(B. ($B4{FI0u$r5-O?$7$J$$(B nneething.)\\ -G E & $B$3$N%0%k!<%W$N>pJs(B ($BA*BrJ}K!(B, $B5-;v$N4{FI(B, $B$J$I$J$I(B) $B$rJT=8(B -({\bf edit}) $B$7$^$9(B.\\ -G V & $B6u$N2>A[(B ({\bf virtual}) $B%0%k!<%W$r:n@.$7$^$9(B. -(nnvirtual)\\ -\end{keys} -$B%a!<%k%0%k!<%W$r:n@.$7$F%a!<%k$r(B nnmbox, nnbabyl, nnml, nnmh, nnfolder -$B$N(B1$B$D$NJ}K!$r;H$C$F(BGnus $B$GFI$`$3$H$b$G$-$^$9(B ($B%a!<%j%0%j%9%H$r9VFI$7$F(B -$B$$$k$HHs>o$KLr$KN)$A$^$9(B). $B%*%s%i%$%s(B info $B$GFI$s$G$/$@$5$$(B (C-c C-i g -Reading Mail RET). -}} - -\def\SortGroups{\subsubsec{(G S) $B%0%k!<%W$NJB$S49$((B}{\samepage -$BJ#?t$N4p=`$GJB$S49$($r$9$k$?$a$K$O(B, $B$^$:$"$^$j=EMW$G$J$$$b$N$rE,MQ$7(B, -$B:G8e$K0lHV=EMW$J$b$N$rE,MQ$7$^$9(B.\\* -\begin{keys}{G P \bf x} -G S a & $B%0%k!<%WL>$r%"%k%U%!%C%Y%H=g(B ({\bf Alphabetically}) $B$KJB$S(B -$B49$($^$9(B. [$B@\F,<-(B: $B5U$N=gHV(B]\\ -G S l & $B%l%Y%k$G(B ({\bf level}) $BJB$S49$($^$9(B. [$B@\F,<-(B: $B5U$N=gHV(B]\\ -G S m & $BJ}K!(B ({\bf method}) $BL>$GJB$S49$($^$9(B. [$B@\F,<-(B: $B5U$N=gHV(B]\\ -G S r & $B3,5i(B ($B%l%Y%k$H%9%3%"(B) $B$GJB$S49$($^$9(B. [$B@\F,<-(B: $B5U$N=gHV(B]\\ -G S u & $BL$FI(B ({\bf unread}) $B5-;v$N?t$GJB$S49$($^$9(B. [$B@\F,<-(B: $B5U$N(B -$B=gHV(B]\\ -G S v & $B%0%k!<%W%9%3%"(B ($BCM(B ({\bf value})) $B$GJB$S49$($^$9(B. [$B@\F,<-(B: -$B5U$N=gHV(B]\\ -\end{keys} -$B$3$3$G(B, {\bf x} $B$O(B a,l,m,r,u,v $B$N$I$l$+$G$9(B:\\* -\begin{keys}{G P \bf x} -G P \bf x & [p/p] $B$GA*Br$5$l$?%0%k!<%W$N$_$rJB$S49$($^$9(B.\\ -T S \bf x & $B8=:_$N%H%T%C%/$N$_$GJB$S49$($^$9(B.\\ -\end{keys} -}} - -\def\SOUP{\subsubsec{(G s) SOUP $B%3%^%s%I(B}{\samepage -SOUP $B$OB?$/$N5-;v(B/$BJVEz$r%Q%1%C%H$KF~$l$F(B, $B0lEY$KE>Aw$7(B, $B$=$l$i$r%*%U%i(B -$B%$%s$GFI$_9~$_(B/$B:n@.$9$k%W%m%H%3%k$G$9(B. $B%Q%1%C%H$NA`:n$K$O0J2<$NL?Na$r(B -$B;H$$(B, $BFI$`$?$a$K$O(B nnsoup $BJ}K!$r;HMQ$7$F$/$@$5$$(B.\\* -\begin{keys}{G s w} -G s b & $BA4$F$N5-;v$r:-Jq$7$^$9(B (soup $B$r:n$j$^$9(B ({\bf -brew})). [p/p]\\ -G s p & $BA4$F$N(B SOUP $B%G!<%?$r(B SOUP $B%Q%1%C%H$K:-Jq(B ({\bf pack}) $B$7$^$9(B.\\ -G s r & $BA4$F$NJVEz(B ({\bf replies}) $B$rJVEz%Q%1%C%H$K:-Jq$7$^$9(B.\\ -G s s & $BJVEz%Q%1%C%H$KF~$l$?A4$F$NJVEz$rAw?.(B ({\bf send}) $B$7$^$9(B.\\ -G s w & $BA4$F$N(B SOUP $B%G!<%?%U%!%$%k$r=q$-$^$9(B ({\bf Write}).\\ -\end{keys}}} - -\def\MarkGroups{\subsec{(M) $B%0%k!<%W$N0uIU$1(B}{\samepage -\begin{keys}{M m} -M b & $B%P%C%U%!(B ({\bf buffer}) $B$NA4$F$N%0%k!<%W$K%W%m%;%90u$rIU$1$^(B -$B$9(B.\\ -M r & $B@55,I=8=(B ({\bf regexp}) $B$K9gCW$9$kA4$F$N%0%k!<%W$K0u$rIU$1$^(B -$B$9(B.\\ -M m & (\#) $B$3$N%0%k!<%W$K0u(B {\bf mark} $B$rIU$1$^$9(B. [$BHO0O(B]\\ -M u & (M-\#) $B$3$N%0%k!<%W$+$i0u$r%s%S(B ({\bf zombie}) $B%0%k!<%W$r@Z$j$^$9(B.\\ -\end{keys}}} - -\def\GroupTopics{\subsec{(T) $B%0%k!<%W%H%T%C%/(B}{\samepage -$B%H%T%C%/$OFI$s$@$j4IM}$7$?$j$9$k$N$r4JC1$K$9$k$?$a$N%0%k!<%W$N3,AXE*$J(B -$BAH9g$;$G$9(B. -\begin{keys}{T TAB} -T TAB & $B$3$N%H%T%C%/$r0JA0$N$b$N$NI{%H%T%C%/$K$J$k$h$&$K;z2<$2$r$7$^(B - $B$9(B. [$B@\F,<-(B: $B;z2<$2$rLa$7$$$^$9(B]\\ -T DEL & $B6u$N%H%T%C%/$r>C5n(B ({\bf delete}) $B$7$^$9(B.\\ -T \# & $B$3$N%H%T%C%/$NA4$F$N%0%k!<%W$K$N%H%T%C%/$KJ#@=(B ({\bf copy}) $B$7$^$9(B. - [p/p]\\ -T h & $B6u$N%H%T%C%/$r1#$9(B ({\bf hiding}) $B$+$r@Z$j49$($^$9(B.\\ -T m & $B$3$N%0%k!<%W$rB>$N%H%T%C%/$K0\F0(B ({\bf move}) $B$7$^$9(B. - [p/p]\\ -T n & $B?7$7$$(B ({\bf new}) $B%H%T%C%/$r:n@.$7$^$9(B.\\ -T r & $B%H%T%C%/$r2~L>(B ({\bf rename}) $B$7$^$9(B.\\ -T C & $B@55,I=8=$K9gCW$9$kA4$F$N%0%k!<%W$r%H%T%C%/$KJ#@=(B ({\bf - copy}) $B$7$^$9(B.\\ -T D & $B$3$N%H%T%C%/$r$3$N%0%k!<%W$+$i>C5n(B ({\bf delete}) $B$7$^$9(B. [p/p]\\ -T M & $B@55,I=8=$K9gCW$9$kA4$F$N%0%k!<%W$r%H%T%C%/$K0\F0(B ({\bf - move}) $B$7$^$9(B.\\ -\end{keys}}} - -\def\SummaryMode{\sec{$B35N,%b!<%I(B}{\samepage -\begin{keys}{M-C-d} -SPC & $B5-;v$NA*Br(B, 1$B%Z!<%8%9%/%m!<%k(B, $B$ & (A $>$) $B$3$N5-;v$N:G8e$K%9%/%m!<%k$7$^$9(B.\\ %(A e) -\& & $B@55,I=8=$K9g$&A4$F$N5-;v$KL?Na$rC5n(B (\bf delete}) $B$7$^$9(B. [p/p]\\ -B c & $B$3$N5-;v$r$I$3$+$N%0%k!<%W$+$i%a!<%k%0%k!<%W$KJ#@=(B ({\bf -copy}) $B$7$^$9(B. [p/p]\\ -B e & $B$3$N%0%k!<%W$NA4$F$N;~8B>C5n2DG=5-;v$r;~8B>C5n(B ({\bf -expire}) $B$7$^$9(B. [p/p]\\ -B i & $BG$0U$N%U%!%$%k$r$3$N%a!<%k%0%k!<%W$NC5n2DG=5-;v$r:o=|(B ({\bf expunge}) -($B%G%#%9%/$+$i>C$7$^$9(B). [p/p]\\ -B C & $B$3$N5-;v$rJL$N%0%k!<%W$KAj8_Ej9F(B ({\bf crosspost}) $B$7$^$9(B.\\ -\end{keys}}} - -\def\GotoArticle{\subsec{(G) $B5-;v$X$N0\F0(B}{\samepage -$B$3$l$i$NL?Na$OBP>]5-;v$rA*Br$7$^$9(B. $B@\F,0z?t$OM}2r$7$^$;$s(B. \\* -\begin{keys}{G C-n} -G b & (,) $B:G9b(B ({\bf best}) $B$N5-;v$K0\F0$7$^$9(B ($B:G9b%9%3%"$N$b$N$G(B -$B$9(B). [GL rating]\\ -G f & (.) $B:G=i(B ({\bf first}) $B$NL$FI5-;v$K0\F0$7$^$9(B.\\ -G g & $B5-;vHV9f$r?V$$$F$+$i$=$N35N,9T$X0\F0(B ({\bf go to}) $B$7$^$9(B.\\ -G j & (j) $B5-;vHV9f$r?V$$$F$+$i$=$N5-;v$XHt$S$^$9(B ({\bf jump}).\\ -G l & (l) $B:G8e(B ({\bf last}) $B$N4{FI5-;v$K0\F0$7$^$9(B.\\ -G o & $B35N,$NMzNr$+$i5-;v$rC5n(B ({\bf -delete})) $B$N0u$rIU$1$F(B, $BC5n$7(B ({\bf Clear}), $BC5n$7(B, $BA0$N5-;v$K0\F0$7$^$9(B. [$BHO0O(B]\\ -M ? & (?) $B$3$N5-;v$KJ]N1$N0u$rIU$1$^$9(B ($B%U%)%m!<%"%C%W$K$@$16=L#$,(B -$B$"$k(B). [$BHO0O(B]\\ -* & $B%-%c%C%7%e$K5-;v$rF~$l$^$9(B ($B1JB3$K$7$^$9(B). [p/p]\\ -M-* & $B$3$N5-;v$r%-%c%C%7%e$+$iC5n2DG=(B ({\bf expirable}) $B$H$7$F0u$rIU$1(B -$B$^$9(B. [$BHO0O(B]\\ %(M x) -M k & (k) $BF1$8I=Bj$NA4$F$N5-;v$r@Z$j(B ({\bf kill}), $BC5n$7$^$9(B.\\ -M M-D & $BA4$F$NJ]N1(B ({\bf dormant}) $B5-;v$r1#$7$^$9(B.\\ -M M-C-r & $BM?$($i$l$?0u$NA4$F$N5-;v$r>C5n$7$^$9(B.\\ -\end{keys}}} - -\def\MarkScore{\subsubsec{(M V) $B%9%3%"(B ($BCM(B) $B$K4p$E$$$?0u(B}{\samepage -\begin{keys}{M s m} -M V c & $BA4$F$N9b%9%3%"$N5-;v$+$iA4$F$N0u$r>C5n(B ({\bf clear}) $B$7$^$9(B. -[score]\\ -M V k & $BA4$F$NDc%9%3%"$N5-;v$r@Z$j$^$9(B ({\bf kill}). [score]\\ -M V m & $BA4$F$N9b%9%3%"$N5-;v$KM?$($i$($l$?0u(B ({\bf mark}) $B$rIU$1$^$9(B. -[score]\\ -M V u & $BA4$F$N9b%9%3%"$N5-;v$r$*$b$7$m$$$H$7$F0u$rIU$1$^$9(B ($B2D;k0u$r(B -$BIU$1$^$9(B). [score]\\ -\end{keys}}} - -\def\ProcessMark{\subsubsec{(M P) $B%W%m%;%90u(B}{\samepage -$B$3$l$i$NL?Na$O%W%m%;%90u(B \# $B$rIU$1$?$j>C5n$7$?$j$7$^$9(B. $BA`:n$7$?$$5-;v(B -$B$,O"B3$7$F$$$J$$$H$-$@$1$=$l$r;H$&I,MW$,$"$k$G$7$g$&(B. $B$=$&$G$J$1$l$P?t(B -$BCM0z?t$r;H$$$^$9(B.\\* -\begin{keys}{M P R} -M P a & $BA4$F(B ({\bf all}) $B$N5-;v$K0u$rIU$1$^$9(B ($B=gHV$K(B).\\ -M P b & $B%P%C%U%!(B ({\bf buffer}) $B$K8=$l$?=g$KA4$F$N5-;v$K0u$rIU$1$^$9(B.\\ -M P i & $BA4$F$NC$7$^$9(B ({\bf unmark}).\\ %(M M-\#) -M P v & $BA4$F$N9b$$%9%3%"$N5-;v(B ($BCM(B ({\bf value})) $B$K0u$rIU$1$^$9(B. -[score]\\ -M P w & $BA4$F$N0u$r%9%?%C%/$K@Q$_$^$9(B.\\ -M P y & `M P y', `M P w' $B$d0u$r>C5n$9$kA`:n$N8e$G%9%?%C%/$+$i0u$rE=(B -$B$j(B ({\bf yank}), $BI|85$7$^$9(B.\\ -M P R & $B@55,I=8=(B ({\bf regexp}) $B$K9g$&A4$F$N5-;v$K0u$rIU$1$^$9(B.\\ -M P S & $B0uIU$-$N5-;v$r4^$`A4$F$NO"B3$7$?5-;v(B ({\bf series}) $B$K0u$rIU(B -$B$1$^$9(B.\\ -M P T & $B$3$N(B ($BI{(B)$B%9%l%C%I(B ({\bf thread}) $B$K$"$kA4$F$N5-;v$N0u$rC$7$^$9(B ({\bf unmark}).\\ -\end{keys}}} - -\def\OutputArticles{\subsec{(O) $B5-;v$N=PNO(B}{\samepage -\begin{keys}{O m} -O b & $B5-;v$NK\BN(B ({bf body} $B$r%W%l%$%s%U%!%$%k7A<0$GJ]B8$7$^$9(B. -[p/p]\\ -O f & $B$3$N5-;v$r%W%l%$%s%U%!%$%k(B ({\bf file}) $B7A<0$GJ]B8$7$^$9(B. -[p/p]\\ -O h & $B$3$N5-;v$r(B {\bf mh} $B%U%)%k%@!<$N7A<0$GJ]B8$7$^$9(B. [p/p]\\ -O m & $B$3$N5-;v$r%a!<%k(B ({\bf mail}) $B7A<0$GJ]B8$7$^$9(B. [p/p]\\ -O o & (o, C-o) $B$3$N5-;v$r(B gnus-default-article-saver $B$r;H$C$FJ]B8(B -$B$7$^$9(B. [p/p]\\ -O p & ($\mid$) $B$3$N5-;v$r%7%'%k%3%^%s%I$K%Q%$%W$GAw$j$^$9(B. [p/p]\\ -O r & $B$3$N5-;v$r(B {\bf RMAIL} $B7A<0$GJ]B8$7$^$9(B. [p/p]\\ -O s & $B$3$N5-;v$r(B {\bf SOUP} $B%Q%1%C%H$r5-;v$KDI2C$7$^$9(B. [p/p]\\ -O v & $B$3$N5-;v$r(B {\bf vm} $B$N7A<0$GJ]B8$7$^$9(B. [p/p]\\ -O F & $B$3$N5-;v$r(B, $BB8:_$9$k%U%!%$%k$r>e=q$-$7$F(B, $B%W%l%$%s%U%!%$%k(B -({\bf file}) $B$KJ]B8$7$^$9(B. [p/p]\\ -\end{keys}}} - -\def\Send{\subsec{(S) $BEj9F(B, $B%U%)%m!<%"%C%W(B, $BJVEz(B, $BE>Aw(B, $BC$7(B}{\samepage -$B$3$l$i$NL?Na$OJL$N(B Message $B%P%C%U%!$K9T$-$^$9(B. $B5-;v$rJT=8$7$?8e(B, -C-c C-c $B$r2!$7$FAw?.$7$^$9(B. $B30It%0%k!<%W$K$$$F(B, $B30It%5!<%P!<$r;H$C$F5-(B -$B;v$rEj9F$7$?$$$J$i(B, C-c C-c $B$K@\F,<-$rM?$($F$/$@$5$$(B. [$B0l;~E*(B] $B$K%5!<(B -$B%P!<$,Ej9F$G$-$J$$$J$/$F(B, $B%a!<%k$+$i%K%e!<%9$X$N%2!<%H%&%'%$$r;H$C$FEj(B -$B9F$7$?$$$H$-$K$O(B, `gnus-post-method' $B$r(B `nngateway' $B$K@_Dj$7$F$/$@$5$$(B. -\\* -\begin{keys}{S O m} -%S b & $B$3$N5-;v$X$N%U%)%m!<%"%C%W$NEj9F$H(B, $BJVEz$NAw?.$NN>J}(B ({\bf -%both}) $B$r$7$^$9(B.\\ -S c & (C) $B$3$N5-;v$rC$7$^$9(B ({\bf cancel}) ($B<+J,<+?H$N$b$N$K(B -$B$N$_F0:n$7$^$9(B).\\ -S f & (f) $B$3$N5-;v$X$N%U%)%m!<%"%C%W(B ({\bf followup}) $B$rEj9F$7$^$9(B. -[$B@\F,<-(B: $B855-;v$r4^$a$^$9(B]\\ -S m & (m) $BC/$+$K%a!<%k(B {\bf mail} $B$rAw$j$^$9(B.\\ -S n & $B%a!<%k$GAw(B -$B$7$^$9(B. [$B@\F,<-(B: $B40A4$J%X%C%@!<$r4^$a$^$9(B]\\ -S o p & $B$3$N5-;v$r%K%e!<%9%0%k!<%W$X$NEj9F(B ({\bf post}) $B$H$7$FE>Aw$7(B -$B$^$9(B.\\ -S p & (a) $B$3$N%0%k!<%W$K5-;v$rEj9F(B ({\bf post}) $B$7$^$9(B.\\ -S r & (r) $B$3$N5-;v$NCxJ}(B ({\bf -both}) $B$r$7$^$9(B. [p/p]\\ -S D b & $B<:GT$7$?(B ({\bf bounced}) $B%a!<%k$rAw$7$^$9(B. -[p/p]\\ -S O p & $B$3$l$i$NO"B3$r=8G[7A<0$K$7$F%K%e!<%9%0%k!<%W$KEj9F(B ({\bf -post}) $B$7$^$9(B. [p/p]\\ -S R & (R) $B855-;v$r0zMQ$7$F%a!<%k$GJVEz(B ({\bf reply}) $B$7$^$9(B. -[p/p]\\ -S W & $B855-;v$r0zMQ$7$F9-$$(B ({\bf wide}) $BJVEz$r%a!<%k$GAw$j$^$9(B. -[p/p]\\ -S W-c & $B2a>jAj8_Ej9F(B ({\bf crossposting}) $B$X$NJ86g(B ({\bf complaint}) -$B$rAw?.$7$^$9(B. [p/p]\\ -\end{keys} -$B$?$C$?:#Ej9F$7$?5-;v$rC$7$?$jBeBX$7$?$1$l$P(B ($B%5!<%P!<$K8=$l$kA0$K(B), -*sent \ldots* $B%P%C%U%!$K0\F0$7$F(B, `Message-ID' $B$r(B `Cancel' $B$+(B -`Supersedes' $B$K49$($F(B C-c C-c $B$G$b$&0lEYAw?.$7$F$/$@$5$$(B. -}} - -\def\Thread{\subsec{(T) $B%9%l%C%IL?Na(B}{\samepage -\begin{keys}{T M-\#} -T ^ & $B$3$N5-;v$rA0$N$b$N$+C5n$7$^$9(B.\\ -T d & $B$3$N%9%l%C%I$r2<$,$j$^$9(B ({\bf down}). [$B5wN%(B]\\ -T h & $B$3$N(B ($BI{(B)$B%9%l%C%I$r1#$7$^$9(B ({\bf hide}).\\ -T i & $B$3$N%9%l%C%I$N%9%3%"$r>e$2$^$9(B ({\bf increase}). [$B%9%3%"(B]\\ -T k & (M-C-k) $B8=:_$N(B ($BI{(B)$B%9%l%C%I$r@Z$j$^$9(B ({\bf kill}). [$B0z?t(B: -$BIi(B--$B2D;k0u(B, $B@5(B: $B0u$r>C$9(B.]\\ -T l & (M-C-l) $B$3$N%9%l%C%I$N%9%3%"$r2<$2$^$9(B ({\bf lower}). [$B%9%3(B -$B%"(B]\\ -T n & (M-C-f) $Be$,$j$^$9(B ({\bf up}). [$B5wN%(B]\\ -T H & $BA4$F$N%9%l%C%I$r1#$7$^$9(B ({\bf hide}).\\ -T S & $BA4$F$N1#$5$l$?%9%l%C%I$rI=<((B ({\bf show}) $B$7$^$9(B.\\ -T T & (M-C-t) $B%9%l%C%II=<($r@Z$jBX$($^$9(B ({\bf toggle}).\\ -\end{keys}}} - -\def\Score{\subsec{(V) $B%9%3%"(B ($BCM(B) $BL?Na(B}{\samepage -$B%*%s%i%$%s(B info $B$GE,1~%9%3%"$rFI$s$G$/$@$5$$(B.\\* -\begin{keys}{\bf A p m l} -V a & $BA4$F$NMWAG$r;XDj$7$F?7$7$$%9%3%"EPO?$r2C$((B ({\bf add}) $B$^$9(B.\\ -V c & $B?7$7$$%9%3%"%U%!%$%k$r8=:_$N$b$N(B ({\bf current}) $B$H$7$FA*Br(B -$B$7$^$9(B.\\ -V e & $B8=:_$N%9%3%"%U%!%$%k$rJT=8(B ({\bf edit}) $B$7$^$9(B.\\ -V f & $B%9%3%"%U%!%$%k(B ({\bf file}) $B$rJT=8$7$F8=:_$N$b$N$H$7$^$9(B.\\ -V m & $BM?$($i$l$?%9%3%"$h$j2<$N5-;v$K4{FI$K0u(B ({\bf mark}) $B$rIU$1$^(B -$B$9(B. [$B%9%3%"(B]\\ -V s & $B$3$N5-;v$N%9%3%"$r@_Dj(B ({\bf set}) $B$7$^$9(B.\\ -V t & $B$3$N5-;v$KE,MQ$5$l$?A4$F$N%9%3%"5,B'$rDI@W(B ({\bf trace}) $B$7(B -$B$^$9(B.\\ -V x & $BA4$F$NDc%9%3%"$N5-;v$r>C5n(B ({\bf expunge}) $B$7$^$9(B. [score]\\ -V C & $B8=:_$N%9%3%"%U%!%$%k$rMxMQ$;\\* -\quad \B{l}ifetime: t)emporary, p)ermanent, i)mmediate. - -2/3$BHVL\$NJ8;z$rBgJ8;z$GF~NO$9$k$H(B, $B;D$j$NJ8;z$O(B s)ubstring $B$H(B t)emporary -$B$G$"$k$H$_$J$5$l$^$9(B. 3$BHVL\$NJ8;z$rBgJ8;z$GF~NO$9$k$H(B, $B:G8e$N$b$N$O(B -t)emporary $B$G$"$k$H$_$J$5$l$^$9(B. - -\quad $B%9%3%"%U%!%$%k$N$r%^%&%9$G%/%j%C%/(B -$B2DG=$J%\%?%s$K(B ({\bf buttons}) $B$7$^$9(B.\\ -W c & $BM>J,$J(B {\bf CR} (^M) $B$r(B ({\bf rotate}) (rot13) $B$r9T$$$^$9(B.\\ -W t & (t) $BA4$F$N%X%C%@!iD9$J(B ({\bf verbose}) $BI=<($r@Z$jBX$($^$9(B.\\ -W w & $B5-;v$N8l$N@^$jJV$7(B ({\bf wrap}) $B$r9T$$$^$9(B.\\ -W T e & $B5-;v$N;~9o$rAw$i$l$?;~$+$i7P2a$7$?(B ({\bf elapsed}) $B;~4V$KJQ(B - $B49$7$^$9(B.\\ -W T l & $B5-;v$N;~9o$r%m!<%+%k(B ({\bf local}) $BI8=`;~9oBS$KJQ49$7$^$9(B.\\ -W T u & (W T z) $B5-;v$N;~9o$r(B {\bf UTC} ({\bf Zulu}, GMT) $B$KJQ49$7$^(B - $B$9(B.\\ -\end{keys}}} - -\def\Hide{\subsubsec{(W W) $B5-;v$NItJ,$r1#$9(B/$B%O%$%i%$%H$9$k(B}{\samepage -$B@\F,<-$,L5$$$H!"$3$l$i$NL?Na$O1#$9$+$I$&$+$r@Z$j49$($^$9!#@5$N0z?t$O1#(B -$B$7!"Ii$N0z?t$OI=<($7$^$9(B.\\* -\begin{keys}{W W C-c} -W W C-c & $BB0@-9T$r;}$D0zMQ$5$l$?(B ({\bf cited}) $B%F%-%9%H$r1#$7$^$9(B.\\ -W W a & $BA4$F$N(B ({\bf all}) $BK>$^$7$/$J$$ItJ,$r1#$7$^$9(B.\\ -W W b & $BB`6~$J(B ({\bf boring}) $B%X%C%@!<$r1#$7$^$9(B.\\ -W W c & $B0zMQ$5$l$?(B ({\bf cited}) $B%F%-%9%H$r1#$7$^$9(B.\\ -W W h & (t, W t) $BK>$^$7$/$J$$%X%C%@!<(B ({\bf headers}) $B$r1#$7$^$9(B.\\ -W W p & {\bf PGP} $B$N%X%C%@!<$H=pL>$r1#$7$^$9(B.\\ -W W s & $B=pL>(B ({\bf signature}) $B$r1#$7$^$9(B.\\ -W W P & {\bf PEM} $B%X%C%@!<$H=pL>$r1#$7$^$9(B. -\end{keys}}} - -\def\Highlight{\subsubsec{(W H) $B5-;v$N0lItJ,$r%O%$%i%$%H$9$k(B}{\samepage -\begin{keys}{W H A} -W H a & $BA4$F(B ({\bf all}) $B$NItJ,$r1#$7$^$9(B.\\ -W H c & $B0zMQ$5$l$?(B ({\bf cited}) $B%F%-%9%H$r%O%$%i%$%H$7$^$9(B.\\ -W H h & $B%X%C%@!<(B ({\bf headers}) $B$r%O%$%i%$%H$7$^$9(B.\\ -W H s & $B=pL>(B ({\bf signature}) $B$r%O%$%i%$%H$7$^$9(B.\\ -\end{keys}}} - -\def\Extract{\subsec{(X) $BO"B3$NE83+(B (Uudecode $B$J$I(B)}{\samepage -Gnus $B$O8=:_$N5-;v$,O"B3J*(B ($B$=$l$>$l$NItJ,$,I=Bj$K$*$$$F(B, $BNc$($P(B -{}1/10\dots10/10 $B$N$h$&$K(B, $B?t;z$GF1Dj$5$l$kJ#?t$NEj9F(B) $B$N0lIt$G$"$k$H(B, -$B$=$l$rG'<1$7$^$9(B. 1$B$D0J>e$NO"B3J*$K0u$rIU$1$F$l$K$O(B4$B$D$N0[7A$,$"$j$^$9(B:\\* -\begin{keys}{X v \bf Z} -X \bf z & $BO"B3J*$rI|9f2=$7$^$9(B. [p/p]\\ -X \bf Z & $BO"B3J*$rI|9f2=$7$FJ]B8$7$^$9(B. [p/p]\\ -X v \bf z & $BO"B3J*$rI|9f2=$7$F1\Mw$7$^$9(B. [p/p]\\ -X v \bf Z & $BO"B3J*$rI|9f2=$7(B, $BJ]B8$7(B, $B1\Mw$7$^$9(B. [p/p]\\ -\end{keys} -{\bf z} $B$d(B {\bf Z} $B$OI|9f2=$NJ}K!$r<($7$^$9(B (b, o, p, s, u). - -$B$3$l$i$NL?Na$G:G$bNI$/;H$o$l$kJL$NB+G{$O(B\\* -\begin{keys}{C-c C-v C-v} -C-c C-v C-v & (X v u) $BO"B3J*$r(B uudecode $B$71\Mw$7$^$9(B. [p/p]\\ -\end{keys} -$BI|9f2=$r<+F0E*$K9T$J$&$K$O(B, `M-x gnus-binary-mode' $B$r;H$C$F$/$@$5$$(B -($B$=$l$+$i5-;v$N85$N%F%-%9%H$r8+$k$?$a$K(B `g' $B$r;H$C$F$/$@$5$$(B). -}} - -\def\Exit{\subsec{(Z) $B8=:_$N%0%k!<%W$r=P$k(B}{\samepage -\begin{keys}{Z G} -Z c & (c) $BA4$F$N2D;k0uIU$-$G$J$$5-;v$K4{FI$N0u$rIU$1(B ({\bf -catch-up}, $B%-%c%C%A%"%C%W(B) $B=*N;$7$^$9(B.\\ -Z n & $BA4$F$N5-;v$K4{FI$N0u$rIU$1(B, $BpJs$r%I%j%V%k%U%!%$%k$KJ]B8(B {\bf save}) $B$7$^(B -$B$9(B. [$B@\F,<-(B: .newsrc $B$bJ]B8$7$^$9(B]\\ -Z C & $BA4$F$N5-;v$K4{FI$N0u$rIU$1(B ({\bf catch-up}, $B%-%c%C%A%"%C%W(B) -$B=*N;$7$^$9(B.\\ -Z E & (Q) $B%0%k!<%W>pJs$r99?7$;$:$K=*N;(B ({\bf Exit}) $B$7$^$9(B.\\ -Z G & (M-g) $B%0%k!<%W$N?7$7$$5-;v$rD4$Y$^$9(B ({\bf get}, $BC5n$7$^$9(B]\\ -/ v & $B%9%3%"$N9b$$5-;v$K@)8B$7$^$9(B($BCM(B ({\bf value})). [$B%9%3%"(B]\\ -/ w & $BA0$N@)8B$r%9%?%C%/$+$i(B, $B$J$I$r1#$7$?$j$7$^$9(B.\\ -TAB & $B%]%$%s%H$rH(B -({\bf refer}))\\ -C-c C-m & $B%]%$%s%H$N6a$/$N%"%I%l%9$K%a!<%k(B ({\bf mail}) $B$GJVEz$7$^$9(B -($B@\F,0z?t(B: $B5-;v$r0zMQ$7$^$9(B).\\ -\end{keys}}} - -\def\ServerMode{\sec{$B%5!<%P!<%b!<%I(B}{\samepage -$B$3$N%b!<%I$KF~$k$?$a$K$O(B, $B%0%k!<%W%b!<%I$G(B `^' $B$r2!$7$F$/$@$5$$(B.\\* -\begin{keys}{SPC} -SPC & (RET) $B$3$N%5!<%P!<$r354Q$7$^$9(B.\\ -a & $B?7$7$$%5!<%P!<$rDI2C(B {\bf add} $B$7$^$9(B.\\ -c & $B$3$N%5!<%P!<$rJ#$.\\* - Created from the Gnus manual Copyright \copyright\ 1994 Lars Magne - Ingebrigtsen.\\* - and the Emacs Help Bindings feature (C-h b).\\* - Gnus logo copyright \copyright\ 1995 Luis Fernandes.\\* - \end{center} - - Permission is granted to make and distribute copies of this reference - \guide{} provided the copyright notice and this permission are preserved on - all copies. Please send corrections, additions and suggestions to the - current maintainer's email address. \Guide{} last edited on \date. - } - -\newcommand{\Notes}{% - \subsection*{Notes} - {\esamepage - Gnus is complex. Currently it has some 346 interactive (user-callable) - functions. Of these 279 are in the two major modes (Group and - Summary/Article). Many of these functions have more than one binding, some - have 3 or even 4 bindings. The total number of keybindings is 389. So in - order to save 40\% space, every function is listed only once on this - \guide, under the ``more logical'' binding. Alternative bindings are given - in parentheses in the beginning of the description. - - Many Gnus commands are affected by the numeric prefix. Normally you enter a - prefix by holding the Meta key and typing a number, but in most Gnus modes - you don't need to use Meta since the digits are not self-inserting. The - prefixed behavior of commands is given in [brackets]. Often the prefix is - used to specify: - - \quad [distance] How many objects to move the point over. - - \quad [scope] How many objects to operate on (including the current one). - - \quad [p/p] The ``Process/Prefix Convention'': If a prefix is given then it - determines how many objects to operate on. Else if there are some objects - marked with the process mark \#, these are operated on. Else only the - current object is affected. - - \quad [level] A group subscribedness level. Only groups with a lower or - equal level will be affected by the operation. If no prefix is given, - `gnus-group-default-list-level' is used. If - `gnus-group-use-permanent-levels', then a prefix to the `g' and `l' - commands will also set the default level. - - \quad [score] An article score. If no prefix is given, - `gnus-summary-default-score' is used. \\*[\baselineskip] - % some keys - \begin{keys}{C-c C-i} - M-x gnus & start Gnus. \\ - M-x gnus-no-server & start Gnus without trying to connect to server - (i.e. to read mail). \\ - M-x gnus-unplugged & start Gnus in \texttt{unplugged}-mode - (first see the manual, C-c C-i g Gnus Unplugged RET).\\ - % - C-c C-i & Go to the Gnus online {\bf info}.\\ - C-c C-b & Send a Gnus {\bf bug} report.\\ - \end{keys} - }} - -\newcommand{\GroupLevels}{% - The table below assumes that you use the default Gnus levels. - Fill your user-specific levels in the blank cells.\\[1\baselineskip] - \begin{tabular}{|c|l|l|} - \hline - Level & Groups & Status \\ - \hline - 1 & draft/mail groups & \\ - 2 & mail groups & \\ - 3 & & subscribed \\ - 4 & & \\ - 5 & default list level & \\ - \hline - 6 & & unsubscribed \\ - 7 & & \\ - \hline - 8 & & zombies \\ - \hline - 9 & & killed \\ - \hline - \end{tabular}} - -\newcommand{\MarkCharacters}{% - {\esamepage If a command directly sets a mark, it is shown in parentheses.\\* - \newlength{\markcolwidth} - \settowidth{\markcolwidth}{` '}% widest character - \addtolength{\markcolwidth}{4\tabcolsep} - \addtolength{\markcolwidth}{-\columnwidth} - \newlength{\markdblcolwidth} - \setlength{\markdblcolwidth}{\columnwidth} - \addtolength{\markdblcolwidth}{-2\tabcolsep} - \begin{tabular}{|c|p{-\markcolwidth}|} - \hline - \multicolumn{2}{|p{\markdblcolwidth}|}{{\bf ``Read'' Marks.} - All these marks appear in the first column of the summary line, and so - are mutually exclusive.}\\ - \hline - ` ' & (M-u, M SPC, M c) Not read.\\ - ! & (!, M !, M t) Ticked (interesting).\\ - ? & (?, M ?) Dormant (only followups are interesting).\\ - E & (E, M e, M x) {\bf Expirable}. Only has effect in mail groups.\\ - G & (C, B DEL) Canceled article (or deleted in mailgroups).\\ - \hline\hline - \multicolumn{2}{|p{\markdblcolwidth}|} - {The marks below mean that the article - is read (killed, uninteresting), and have more or less the same effect. - Some commands however explicitly differentiate between them (e.g.\ M - M-C-r, adaptive scoring).}\\ - \hline - r & (d, M d, M r) Deleted (marked as {\bf read}).\\ - C & (M C; M C-c; M H; c, Z c; Z n; Z C) Killed by {\bf catch-up}.\\ - F & SOUPed article. See the manual.\\ - O & {\bf Old} (read in a previous session).\\ - K & (k, M k; C-k, M K) {\bf Killed}.\\ - M & Article marked as read by duplicate suppression.\\ - Q & Article is part of a sparse thread (see ``Threading'' - in the manual).\\ - R & {\bf Read} (viewed in actuality).\\ - X & Killed by a kill file.\\ - Y & Killed due to low score.\\ - \hline\multicolumn{2}{c}{\vspace{1ex}}\\\hline - \multicolumn{2}{|p{\markdblcolwidth}|} - {{\bf Marks not affecting visibility}}\\ - \hline - \# & (\#, M \#, M P p) Processable (will be affected by the next operation). - [2]\\ - A & {\bf Answered} (followed-up or replied). [2]\\ - * & Cached. [2]\\ - S & Saved. [2]\\ - + & Over default score. [3]\\ - $-$ & Under default score. [3]\\ - $=$ & Has children (thread underneath it). Add `\%e' to - `gnus-summary-line-format'. [3]\\ - \hline - \end{tabular} - }} - -\newcommand{\GroupModeGeneral}{% - \begin{keys}{C-c M-C-x} - RET & (=) Enter this group. [Prefix: how many (read) articles to fetch. - Positive: newest articles, negative: oldest ones; non-numerical: - view all articles, not just unread]\\ - M-RET & Enter group quickly.\\ - M-SPC & Same as RET but does not expunge and hide dormants.\\ - M-C-RET & Enter group without any processing, changes will not be permanent.\\ - SPC & Select this group and display the first (unread) article. [Same - prefix as above.]\\ - ? & Give a very short help message.\\ - $<$ & Go to the beginning of the Group buffer.\\ - $>$ & Go to the end of the Group buffer.\\ - , & Jump to the lowest-level group with unread articles.\\ - . & Jump to the first group with unread articles.\\ - xx & Enter the Server buffer mode.\\ - a & Post an {\bf article} to a group.\\ - b & Find {\bf bogus} groups and delete them.\\ - c & Mark all unticked articles in this group as read ({\bf catch-up}). - [p/p]\\ - g & Check the server for new articles ({\bf get}). [level]\\ - M-g & Check the server for new articles in this group ({\bf get}). [p/p]\\ - j & {\bf Jump} to a group.\\ - m & {\bf Mail} a message to someone.\\ - n & Go to the {\bf next} group with unread articles. [distance]\\ - M-n & Go to the {\bf next} group on the same or lower level. - [distance]\\ - p & (DEL) Go to the {\bf previous} group with unread articles. - [distance]\\ - M-p & Go to the {\bf previous} group on the same or lower level. [distance]\\ - q & {\bf Quit} Gnus.\\ - r & Re-read the init file ({\bf reset}).\\ - s & {\bf Save} the `.newsrc.eld' file (and `.newsrc' if - `gnus-save-newsrc-file').\\ - z & Suspend (kill all buffers of) Gnus.\\ - B & {\bf Browse} a foreign server.\\ - C & Mark all articles in this group as read ({\bf Catch-up}). [p/p]\\ - F & {\bf Find} new groups and process them.\\ - N & Go to the {\bf next} group. [distance]\\ - P & Go to the {\bf previous} group. [distance]\\ - Q & {\bf Quit} Gnus without saving any startup (.newsrc) files.\\ - R & {\bf Restart} Gnus.\\ - Z & Clear the dribble buffer.\\ - M-c & Clear data from group (marks and list of read articles). \\ - C-c C-s & {\bf Sort} the groups by name, number of unread articles, or level - (depending on `gnus-group-sort-function').\\ - C-c C-x & Run all expirable articles in this group through the {\bf expiry} - process.\\ - C-c M-C-x & Run all articles in all groups through the {\bf expiry} process.\\ - C-c M-g & Activate all {\bf groups}.\\ - C-c C-i & Gnus online-manual ({\bf info}).\\ - C-x C-t & {\bf Transpose} two groups.\\ - H f & Fetch this group's {\bf FAQ} (using ange-ftp).\\ - H v & (V) Display the Gnus {\bf version} number.\\ - H d & (C-c C-d) Show the {\bf description} of this group - [Prefix: re-read from server].\\ - M-d & {\bf Describe} all groups. [Prefix: re-read from server]\\ - \end{keys} - } - -\newcommand{\ListGroups}{% - {\esamepage - \begin{keys}{A M} - A d & List all groups whose names or {\bf descriptions} match a regexp.\\ - A k & (C-c C-l) List all {\bf killed} groups. - [Prefix: look at active-file from server]\\ - A l & List all groups on a specific level. - [Prefix: also list groups with no unread articles]\\ - A d & List all groups that have names or {\bf descriptions} matching - a regexp.\\ - A a & (C-c C-a) List all groups whose names match a regexp - ({\bf apropos}).\\ - A A & List the server's active-file.\\ - A M & List groups that {\bf match} a regexp.\\ - A m & List groups that {\bf match} a regexp and have unread articles. - [level]\\ - A s & (l) List all {\bf subscribed} groups with unread articles. - [level; 5 and lower is the default]\\ - A u & (L) List all groups (including read and {\bf unsubscribed}). - [level; 7 and lower is the default]\\ - A z & List all {\bf zombie} groups.\\ - \end{keys} - } - - \newcommand{\CreateEditGroups}{% - {\esamepage - The select methods are indicated in parentheses.\\* - \begin{keys}{G DEL} - G a & Make the Gnus list {\bf archive} group. (nndir over ange-ftp)\\ - G c & {\bf Customize} this group's parameters.\\ - G d & Make a {\bf directory} group (every file must be a posting and files - must have numeric names). (nndir)\\ - G D & Enter a {\bf directory} as a (temporary) group. - (nneething without recording articles read)\\ - G e & (M-e) {\bf Edit} this group's select method.\\ - G E & {\bf Edit} this group's info (select method, articles read, etc).\\ - G f & Make a group based on a {\bf file}. (nndoc)\\ - G h & Make the Gnus {\bf help} (documentation) group. (nndoc)\\ - G k & Make a {\bf kiboze} group. (nnkiboze)\\ - G m & {\bf Make} a new group.\\ - G p & Edit this group's {\bf parameters}.\\ - G r & Rename this group (does not work with read-only groups!).\\ - G u & Create one of the groups mentioned in gnus-{\bf useful}-groups.\\ - G v & Add this group to a {\bf virtual} group. [p/p]\\ - G V & Make a new empty {\bf virtual} group. (nnvirtual)\\ - G w & Create ephemeral group based on web-search. [Prefix: make solid group - instead]\\ - G DEL & {\bf Delete} group [Prefix: delete all articles as well].\\ - \end{keys} - You can also create mail-groups and read your mail with Gnus (very useful - if you are subscribed to mailing lists), using one of the methods - nnmbox, nnbabyl, nnml, nnmh, or nnfolder. Read about it in the online info - (C-c C-i g Reading Mail RET). - }} - - % TODO: - \newcommand{\SoupCommands}{% - \begin{keys}{G s w} - G s b & gnus-group-brew-soup: not documented.\\ - G s p & gnus-soup-pack-packet: not documented.\\ - G s r & nnsoup-pack-replies: not documented.\\ - G s s & gnus-soup-send-replies: not documented.\\ - G s w & gnus-soup-save-areas: not documented.\\ - \end{keys}} - - \newcommand{\MarkGroups}{% - \begin{keys}{M m} - M m & (\#) Set the process {\bf mark} on this group. [scope]\\ - M r & Mark all groups matching regular expression.\\ - M u & (M-\#) Remove the process mark from this group ({\bf unmark}). - [scope]\\ - M U & Remove the process mark from all groups (\textbf{umark all}).\\ - M w & Mark all groups in the current region.\\ - \end{keys}} - - \newcommand{\GroupTopicsGeneral}{% - {\esamepage - Topics are ``categories'' for groups. Press t in the group-buffer to - toggle gnus-topic-mode (C-c C-i g Group Topics RET). - \begin{keys}{C-c C-x} - T n & Prompt for topic {\bf name} and create it.\\ - T m & {\bf Move} the current group to some other topic [p/p].\\ - T j & {\bf Jump} to a topic.\\ - T c & {\bf Copy} the current group to some other topic [p/p].\\ - T D & Remove (not delete) the current group [p/p].\\ - T M & {\bf Move} all groups matching a regexp to a topic.\\ - T C & {\bf Copy} all groups matching a regexp to a topic.\\ - T H & Toggle {\bf hiding} of empty topics.\\ - T r & {\bf Rename} a topic.\\ - T DEL & Delete an empty topic.\\ - T \# & Mark all groups in the current topic with the process-mark.\\ - T M-\# & Remove the process-mark from all groups in the current topic.\\ - T TAB & (TAB) Indent current topic [Prefix: unindent].\\ - M-TAB & Unindent the current topic.\\ - RET & (SPC) Either unfold topic or enter group [level].\\ - C-c C-x & Expire all articles in current group or topic.\\ - C-k & {\bf Kill} a group or topic.\\ - C-y & {\bf Yank} a group or topic.\\ - A T & List active-file using {\bf topics}.\\ - G p & Edit topic-{\bf parameters}.\\ - \end{keys} - } - } - - \newcommand{\TopicSorting}{% - {\esamepage - \begin{keys}{T S m} - T S a & Sort {\bf alphabetically}.\\ - T S u & Sort by number of {\bf unread} articles.\\ - T S l & Sort by group {\bf level}.\\ - T S v & Sort by group score ({\bf value}).\\ - T S r & Sort by group {\bf rank}.\\ - T S m & Sort by {\bf method}.\\ - \end{keys} - } - } - - \newcommand{\SubscribeKillYankGroups}{% - {\esamepage - \begin{keys}{S C-k} - S k & (C-k) {\bf Kill} this group.\\ - S l & Set the {\bf level} of this group. [p/p]\\ - S s & (U) Prompt for a group and toggle its {\bf subscription}.\\ - S t & (u) {\bf Toggle} subscription to this group. [p/p]\\ - S w & (C-w) Kill all groups in the region.\\ - S y & (C-y) {\bf Yank} the last killed group.\\ - S z & Kill all {\bf zombie} groups.\\ - S C-k & Kill all groups on a certain level.\\ - \end{keys} - } - } - - \newcommand{\SummaryModeGeneral}{% - {\esamepage - \begin{keys}{M-RET} - SPC & (A SPC, A n) Select an article, scroll it one page, move to the - next one.\\ - DEL & (A DEL, A p, b) Scroll this article one page back. [distance]\\ - RET & Scroll this article one line forward. [distance]\\ - M-RET & Scroll this article one line backward. [distance]\\ - = & Expand the Summary window (fullsize). - [Prefix: shrink to display article window]\\ - % - \& & Execute a command on all articles whose header matches a regexp. - [Prefix: move backwards]\\ - M-\& & Execute a command on all articles having the process mark.\\ - % - M-n & (G M-n) Go to the {\bf next} summary line of an unread article. - [distance]\\ - M-p & (G M-p) Go to the {\bf previous} summary line of an unread article. - [distance]\\ - M-s & {\bf Search} through all subsequent articles for a regexp.\\ - M-r & Search through all previous articles for a regexp.\\ - % - A P & {\bf Postscript}-print current buffer.\\ - % - M-k & Edit this group's {\bf kill} file.\\ - M-K & Edit the general {\bf kill} file.\\ - % - C-t & Toggle {\bf truncation} of summary lines.\\ - Y g & Regenerate the summary-buffer.\\ - Y c & Insert all cached articles into the summary-buffer.\\ - % - M-C-e & {\bf Edit} the group-parameters.\\ - M-C-g & Customize the group-parameters.\\ - % - % article handling - % - A $<$ & ($<$, A b) Scroll to the beginning of this article.\\ - A $>$ & ($>$, A e) Scroll to the end of this article.\\ - A s & (s) Perform an i{\bf search} in the article buffer.\\ - % - A D & (C-d) Un{\bf digestify} this article into a separate group. - [Prefix: force digest]\\ - M-C-d & Like C-d, but open several documents in nndoc-groups, wrapped - in an nnvirtual group [p/p]\\ - % - A g & (g) (Re)fetch this article ({\bf get}). [Prefix: get raw version]\\ - A r & (\^{}, A \^{}) Fetch the parent(s) of this article. - [Prefix: if positive fetch \textit{n} ancestors; - negative: fetch only the \textit{n}th ancestor]\\ - A t & {\bf Translate} this article.\\ - A R & Fetch all articles mentioned in the {\bf References}-header.\\ - A T & Fetch full \textbf{thread} in which the current article appears.\\ - M-\^{} & Fetch the article with a given Message-ID.\\ - S y & {\bf Yank} the current article into an existing message-buffer. - [p/p]\\ - \end{keys} - } - } - - \newcommand{\MIMESummary}{% - {\esamepage - For the commands operating on one MIME part (a subset of gnus-article-*), a - prefix selects which part to operate on. If the point is placed over a - MIME button in the article buffer, use the corresponding bindings for the - article buffer instead. - \begin{keys}{W M w} - K v & (b) {\bf View} the MIME-part.\\ - K o & {\bf Save} the MIME part.\\ - K c & {\bf Copy} the MIME part.\\ - K e & View the MIME part {\bf externally}.\\ - K i & View the MIME part {\bf internally}.\\ - K $\mid$ & Pipe the MIME part to an external command.\\ - K b & Make all the MIME parts have buttons in front of them.\\ - K m & Try to repair {\bf multipart-headers}.\\ - X m & Save all parts matching a MIME type to a directory. [p/p]\\ - M-t & Toggle the buttonized display of the article buffer.\\ - W M w & Decode RFC2047-encoded words in the article headers.\\ - W M c & Decode encoded article bodies. [Prefix: prompt for charset]\\ - W M v & View all MIME parts in the current article.\\ - \end{keys} - } - } - - \newcommand{\SortSummary}{% - {\esamepage - \begin{keys}{C-c C-s C-a} - C-c C-s C-a & Sort the summary-buffer by {\bf author}.\\ - C-c C-s C-d & Sort the summary-buffer by {\bf date}.\\ - C-c C-s C-i & Sort the summary-buffer by article score.\\ - C-c C-s C-l & Sort the summary-buffer by amount of lines.\\ - C-c C-s C-c & Sort the summary-buffer by length.\\ - C-c C-s C-n & Sort the summary-buffer by article {\bf number}.\\ - C-c C-s C-s & Sort the summary-buffer by {\bf subject}.\\ - \end{keys} - } - } - - \newcommand{\MailGroups}{% formerly \Bsubmap - {\esamepage - These commands (except `B c') are only valid in a mail group.\\* - \begin{keys}{B M-C-e} - B DEL & (B backspace, B delete) {\bf Delete} the mail article from disk (!). - [p/p]\\ - B B & Crosspost this article to another group.\\ - B c & {\bf Copy} this article from any group to a mail group. [p/p]\\ - B e & {\bf Expire} all expirable articles in this group. [p/p]\\ - B i & {\bf Import} a random file into this group.\\ - B m & {\bf Move} the article from one mail group to another. [p/p]\\ - B p & Query whether the article was posted as well.\\ - B q & {\bf Query} where the article will end up after fancy splitting\\ - B r & {\bf Respool} this mail article. [p/p]\\ - B t & {\bf Trace} the fancy splitting patterns applied to this article.\\ - B w & (e) Edit this article.\\ - B M-C-e & {\bf Expunge} (delete from disk) all expirable articles in this group - (!). [p/p]\\ - \end{keys} - } - } - - \newcommand{\DraftGroup}{% formerly \Dsubmap - {\esamepage - The ``drafts''-group contains messages that have been saved but not sent - and rejected articles. \\* - \begin{keys}{B DEL} - D e & \textbf{edit} message.\\ - D s & \textbf{Send} message. [p/p]\\ - D S & \textbf{Send} all messages.\\ - D t & \textbf{Toggle} sending (mark as unsendable).\\ - B DEL & \textbf{Delete} message (like in mailgroup).\\ - \end{keys} - } - } - - \newcommand{\SelectArticles}{% formerly \Gsubmap - {\esamepage - These commands select the target article. They do not understand the prefix.\\* - \begin{keys}{G C-n} - h & Enter article-buffer.\\ - G b & (,) Go to the {\bf best} article (the one with highest score).\\ - G f & (.) Go to the {\bf first} unread article.\\ - G n & (n) Go to the {\bf next} unread article.\\ - G p & (p) Go to the {\bf previous} unread article.\\ - % - G N & (N) Go to {\bf the} next article.\\ - G P & (P) Go to the {\bf previous} article.\\ - % - G C-n & (M-C-n) Go to the {\bf next} article with the same subject.\\ - G C-p & (M-C-p) Go to the {\bf previous} article with the same subject.\\ - % - G l & (l) Go to the previously read article ({\bf last-read-article}).\\ - G o & Pop an article off the summary history and go to it.\\ - % - G g & Search an article via subject.\\ - G j & (j) Search an article via Message-Id or subject.\\ - \end{keys} - } - } - - \newcommand{\ArticleModeGeneral}{% - {\esamepage - The normal navigation keys work in Article mode. Some additional keys are:\\* - \begin{keys}{C-c RET} - C-c \^{} & Get the article with the Message-ID near point.\\ - C-c RET & Send reply to address near point.\\ - h & Go to the \textbf{header}-line of the article in the - summary-buffer.\\ - s & Go to \textbf{summary}-buffer.\\ - RET & (middle mouse button) Activate the button at point to follow - an URL or Message-ID.\\ - TAB & Move the point to the next button.\\ - M-TAB & Move point to previous button.\\ - \end{keys} - } - } - - \newcommand{\WashArticle}{% formerly \Wsubmap - {\esamepage - \begin{keys}{W W H} - W b & Make Message-IDs and URLs in the article mouse-clickable - {\bf buttons}.\\ - W l & (w) Remove page breaks ({\bf\^{}L}) from the article.\\ - W c & Translate CRLF-pairs to LF and then the remaining CR's to LF's.\\ - W d & Treat {\bf dumbquotes}.\\ - W f & Look for and display any X-{\bf Face} headers.\\ - W m & Toggle {\bf MIME} processing.\\ - W o & Treat {\bf overstrike} or underline (\^{}H\_) in the article.\\ - W q & Treat {\bf quoted}-printable in the article.\\ - W r & (C-c C-r) Do a Caesar {\bf rotate} (rot13) on the article.\\ - W t & (t) {\bf Toggle} display of all headers.\\ - W v & (v) Toggle permanent {\bf verbose} displaying of all headers.\\ - W w & Do word {\bf wrap} in the article.\\ - W B & Add clickable {\bf buttons} to the article headers.\\ - W C & {\bf Capitalize} first word in each sentence.\\ - W Q & Fill long lines.\\ - % - W W H & Strip certain {\bf headers} from body.\\ - % - W E l & Strip blank {\bf lines} from the beginning of the article.\\ - W E m & Replace blank lines with empty lines and remove {\bf multiple} - blank lines.\\ - W E t & Remove {\bf trailing} blank lines.\\ - W E a & Strip blank lines at the beginning and the end - (W E l, W E m and W E t).\\ - W E A & Strip {\bf all} blank lines.\\ - W E s & Strip leading blank lines from the article body.\\ - W E e & Strip trailing blank lines from the article body.\\ - % - W T u & (W T z) Display the article timestamp in GMT ({\bf UT, ZULU}).\\ - W T i & Display the article timestamp in {\bf ISO} 8601.\\ - W T l & Display the article timestamp in the {\bf local} timezone.\\ - W T s & Display according to `gnus-article-time-format'.\\ - W T e & Display the time {\bf elapsed} since it was sent.\\ - W T o & Display the {\bf original} timestamp.\\ - \end{keys} - } - } - - \newcommand{\HideHighlightArticle}{% - {\esamepage - \begin{keys}{W W C-c} - W W a & Hide {\bf all} unwanted parts. Calls W W h, W W s, W W C-c.\\ - W W h & Hide article {\bf headers}.\\ - W W b & Hide {\bf boring} headers.\\ - W W s & Hide {\bf signature}.\\ - W W l & Hide {\bf list} identifiers in subject-header.\\ - W W p & Hide {\bf PGP}-signatures.\\ - W W P & Hide {\bf PEM} (privacy enhanced messages).\\ - W W B & Hide banner specified by group parameter.\\ - W W c & Hide {\bf citation}.\\ - W W C-c & Hide {\bf citation} using a more intelligent algorithm.\\ - W W C & Hide cited text in articles that aren't roots.\\ - % - W e & {\bf Emphasize} article.\\ - % - W H a & Highlight {\bf all} parts. Calls W b, W H c, W H h, W H s.\\ - W H c & Highlight article {\bf citations}.\\ - W H h & Highlight article {\bf headers}.\\ - W H s & Highlight article {\bf signature}.\\ - \end{keys} - For all hiding-commands: A positive prefix always hides, and a negative - prefix will show what was previously hidden. - }} - - \newcommand{\MIMEArticleMode}{% - {\esamepage - \begin{keys}{M-RET} - RET & (BUTTON-2) Toggle display of the MIME object.\\ - v & (M-RET) Prompt for a method and then view object using this method.\\ - o & Prompt for a filename and save the MIME object.\\ - c & {\bf Copy} the MIME object to a new buffer and display this buffer.\\ - t & View the MIME object as a different {\bf type}.\\ - $\mid$ & Pipe the MIME object to a process.\\ - \end{keys} - } - } - - %% end of article mode for reading .......................................... - - \newcommand{\MarkArticlesGeneral}{% formerly \Msubmap - {\esamepage - \begin{keys}{M M-C-r} - d & (M d, M r) Mark this article as read and move to the next one. - [scope]\\ - D & Mark this article as read and move to the previous one. [scope]\\ - ! & (u, M !, M t) Tick this article (mark it as interesting) and move - to the next one. [scope]\\ - U & Tick this article and move to the previous one. [scope]\\ - M ? & (?) Mark this article as dormant (only followups are - interesting). [scope]\\ - M D & Show all {\bf dormant} articles (normally they are hidden unless they - have any followups).\\ - M M-D & Hide all {\bf dormant} articles.\\ - C-w & Mark all articles between point and mark as read.\\ - M-u & (M SPC, M c) Clear all marks from this article and move to the next - one. [scope]\\ - M-U & Clear all marks from this article and move to the previous one. - [scope]\\ - % - M e & (E, M x) Mark this article as {\bf expirable}. [scope]\\ - % - M k & (k) {\bf Kill} all articles with the same subject then select the - next unread one.\\ - M K & (C-k) {\bf Kill} all articles with the same subject as this one.\\ - % - M C & {\bf Catch-up} the articles that are not ticked and not dormant.\\ - M C-c & {\bf Catch-up} all articles in this group.\\ - M H & {\bf Catch-up} (mark read) this group to point (to-{\bf here}).\\ - % - M b & Set a {\bf bookmark} in this article.\\ - M B & Remove the {\bf bookmark} from this article.\\ - % - M M-r & (x) Expunge all {\bf read} articles from this group.\\ - M M-C-r & Expunge all articles having a given mark.\\ - M S & (C-c M-C-s) {\bf Show} all expunged articles.\\ - M M C-h & Displays some more keys doing ticking slightly differently.\\ - \end{keys} - The variable `gnus-summary-goto-unread' controls what happens after a mark - has been set (C-x C-i g Setting Marks RET) - }} - - \newcommand{\MarkByScore}{% - \begin{keys}{M V m} - M V c & {\bf Clear} all marks from all high-scored articles. [score]\\ - M V k & {\bf Kill} all low-scored articles. [score]\\ - M V m & Mark all high-scored articles with a given {\bf mark}. [score]\\ - M V u & Mark all high-scored articles as interesting (tick them). [score]\\ - \end{keys} - } - } - -\newcommand{\ProcessMark}{% - {\esamepage - These commands set and remove the process mark (\#). You only need to use - it if the set of articles you want to operate on is non-contiguous. Else - use a numeric prefix.\\* - \begin{keys}{M P R} - M P p & (\#, M \#) Mark this article.\\ - M P u & (M-\#, M M-\#) \textbf{unmark} this article.\\ - M P b & Mark all articles in {\bf buffer}.\\ - M P r & Mark all articles in the {\bf region}.\\ - M P R & Mark all articles matching a {\bf regexp}.\\ - M P t & Mark all articles in this (sub){\bf thread}.\\ - M P s & Mark all articles in the current {\bf series}.\\ - M P S & Mark all {\bf series} that already contain a marked article.\\ - M P a & Mark {\bf all} articles (in series order).\\ - M P U & \textbf{unmark} all articles.\\ - % - M P i & {\bf Invert} the list of process-marked articles.\\ - M P k & Push the current process-mark set onto stack and unmark - all articles.\\ - M P y & Pop process-mark set from stack and restore it.\\ - \end{keys} - } - } - -\newcommand{\Limiting}{% - {\esamepage - \begin{keys}{/M} - // & (/s) Limit the summary-buffer to articles matching {\bf subject}.\\ - /a & Limit the summary-buffer to articles matching {\bf author}.\\ - /x & Limit depending on ``extra'' headers.\\ - /u & (x) Limit to {\bf unread} articles. - [Prefix: also exclude ticked and dormant articles]\\ - /m & Limit to articles marked with specified {\bf mark}.\\ - /t & Ask for a number and exclude articles younger than that many days. - [Prefix: exclude older articles]\\ - /n & Limit to current article. [p/p]\\ - /w & Pop the previous limit off the stack and restore it. - [Prefix: pop all limits]\\ - /v & Limit to score. [score]\\ - /E & (M S) Include all expunged articles in the limit.\\ - /D & Include all dormant articles in the limit.\\ - /* & Include all cached articles in the limit.\\ - /d & Exclude all dormant articles from the limit.\\ - /M & Exclude all marked articles.\\ - /T & Include all articles from the current thread in the limit.\\ - /c & Exclude all dormant articles that have no children from the limit.\\ - /C & Mark all excluded unread articles as read. - [Prefix: also mark ticked and dormant articles]\\ - \end{keys} - } - } - -\newcommand{\OutputArticles}{% formerly \Osubmap - {\esamepage - \begin{keys}{O m} - O o & (o, C-o) Save this article using the default article saver. [p/p]\\ - O b & Save this article's {\bf body} in plain file format [p/p]\\ - O f & Save this article in plain {\bf file} format. [p/p]\\ - O F & like O f, but overwrite file's contents. [p/p]\\ - O h & Save this article in {\bf mh} folder format. [p/p]\\ - O m & Save this article in {\bf mail} format. [p/p]\\ - O r & Save this article in {\bf rmail} format. [p/p]\\ - O v & Save this article in {\bf vm} format. [p/p]\\ - O p & ($\mid$) Pipe this article to a shell command. [p/p]\\ - \end{keys} - } - } - -\newcommand{\PostReplyetc}{% formerly \Ssubmap - {\esamepage - These commands put you in a separate news or mail buffer. See the section - about composing messages for more information. - %After - %editing the article, send it by pressing C-c C-c. If you are in a - %foreign group and want to post the article using the foreign server, give - %a prefix to C-c C-c.\\* - \begin{keys}{S O m} - S p & (a) {\bf Post} an article to this group.\\ - S f & (f) Post a {\bf followup} to this article.\\ - S F & (F) Post a {\bf followup} and include the original. [p/p]\\ - S o p & Forward this article as a {\bf post} to a newsgroup. - [Prefix: include all headers]\\ - S M-c & Send a complaint about excessive crossposting to the author of this - article. [p/p]\\ - % - S m & (m) Send {\bf a} mail to some other person.\\ - S r & (r) Mail a {\bf reply} to the author of this article.\\ - S R & (R) Mail a {\bf reply} and include the original. [p/p]\\ - S w & Mail a {\bf wide} reply to this article.\\ - S W & Mail a {\bf wide} reply to this article.\\ - S o m & (C-c C-f) Forward this article by {\bf mail} to a person. - [Prefix: include all headers]\\ - S D b & Resend {\bf bounced} mail.\\ - S D r & {\bf Resend} mail to a different person.\\ - % - S n & Post a followup via {\bf news} even if you got the message - through mail.\\ - S N & Post a followup via {\bf news} and include the original mail. - [p/p]\\ - % - S c & (C) {\bf Cancel} this article (only works if it is your own).\\ - S s & {\bf Supersede} this article with a new one (only for own - articles).\\ - % - S O m & Digest these series and forward by {\bf mail}. [p/p]\\ - S O p & Digest these series and forward as a {\bf post} to a newsgroup. - [p/p]\\ - % - S u & {\bf Uuencode} a file and post it as a series.\\ - \end{keys} - If you want to cancel or supersede an article you just posted (before it - has appeared on the server), go to the *post-news* buffer, change - `Message-ID' to `Cancel' or `Supersedes' and send it again with C-c C-c. - }} - -\newcommand{\Threading}{% formerly \Tsubmap - {\esamepage - \begin{keys}{T M-\#} - T \# & Mark this thread with the process mark.\\ - T M-\# & Remove process-marks from this thread.\\ - % - T t & Re-{\bf thread} the current article's thread.\\ - % movement - T n & (M-C-f) Go to the {\bf next} thread. [distance]\\ - T p & (M-C-b) Go to the {\bf previous} thread. [distance]\\ - T d & {\bf Descend} this thread. [distance]\\ - T u & Ascend this thread ({\bf up}-thread). [distance]\\ - T o & Go to the top of this thread.\\ - % - T s & {\bf Show} the thread hidden under this article.\\ - T h & {\bf Hide} this (sub)thread.\\ - % - T i & {\bf Increase} the score of this thread.\\ - T l & (M-C-l) {\bf Lower} the score of this thread.\\ - % - T k & (M-C-k) {\bf Kill} the current (sub)thread. [Negative prefix: - tick it, positive prefix: unmark it.]\\ - % - T H & {\bf Hide} all threads.\\ - T S & {\bf Show} all hidden threads.\\ - T T & (M-C-t) {\bf Toggle} threading.\\ - \end{keys} - } - } - -\newcommand{\Scoring}{% formerly \Vsubmap - {\esamepage - Read about Adaptive Scoring in the online info.\\* - \begin{keys}{\bf A p m l} - V a & {\bf Add} a new score entry, specifying all elements.\\ - V c & Specify a new score file as {\bf current}.\\ - V e & {\bf Edit} the current score alist.\\ - V f & Edit a score {\bf file} and make it the current one.\\ - V m & {\bf Mark} all articles below a given score as read.\\ - V s & Set the {\bf score} of this article.\\ - V t & Display all score rules applied to this article ({\bf track}).\\ - V x & {\bf Expunge} all low-scored articles. [score]\\ - V C & {\bf Customize} the current score file through a user-friendly - interface.\\ - V S & Display the {\bf score} of this article.\\ - \bf A p m l& Make a scoring entry based on this article.\\ - \end{keys} - The four letters stand for:\\* - \quad \B{A}ction: I)ncrease, L)ower;\\* - \quad \B{p}art: a)utor (from), s)ubject, x)refs (cross-posting), d)ate, l)ines, - message-i)d, t)references (parent), f)ollowup, b)ody, h)ead (all headers);\\* - \quad \B{m}atch type:\\* - \qquad string: s)ubstring, e)xact, r)egexp, f)uzzy,\\* - \qquad date: b)efore, a)t, n)this,\\* - \qquad number: $<$, =, $>$;\\* - \quad \B{l}ifetime: t)emporary, p)ermanent, i)mmediate. - - If you type the second letter in uppercase, the remaining two are assumed - to be s)ubstring and t)emporary. - If you type the third letter in uppercase, the last one is assumed to be - t)emporary. - - \quad Extra keys for manual editing of a score file:\\* - \begin{keys}{C-c C-c} - C-c C-c & Finish editing the score file.\\ - C-c C-d & Insert the current {\bf date} as number of days.\\ - \end{keys} - } - } - -\newcommand{\ExtractSeries}{% formerly \Xsubmap - {\esamepage - Gnus recognizes if the current article is part of a series (multipart - posting whose parts are identified by numbers in their subjects, e.g.{} - 1/10\dots10/10) and processes the series accordingly. You can mark and - process more than one series at a time. If the posting contains any - archives, they are expanded and gathered in a new group.\\* - \begin{keys}{X p} - X b & Un-{\bf binhex} these series. [p/p]\\ - X o & Simply {\bf output} these series (no decoding). [p/p]\\ - X p & Unpack these {\bf postscript} series. [p/p]\\ - X s & Un-{\bf shar} these series. [p/p]\\ - X u & {\bf Uudecode} these series. [p/p]\\ - \end{keys} - - Each one of these commands has four variants:\\* - \begin{keys}{X v \bf Z} - X \bf z & Decode these series. [p/p]\\ - X \bf Z & Decode and save these series. [p/p]\\ - X v \bf z & Decode and view these series. [p/p]\\ - X v \bf Z & Decode, save and view these series. [p/p]\\ - \end{keys} - where {\bf z} or {\bf Z} identifies the decoding method (b, o, p, s, u). - - An alternative binding for the most-often used of these commands is\\* - \begin{keys}{C-c C-v C-v} - C-c C-v C-v & (X v u) Uudecode and view these series. [p/p]\\ - \end{keys} - }} - -\newcommand{\ExitSummary}{% formerly \Zsubmap - {\esamepage - \begin{keys}{Z G} - Z Z & (q, Z Q) Exit this group.\\ - Z E & (Q) {\bf Exit} without updating the group information.\\ - % - Z c & (c) Mark all unticked articles as read ({\bf catch-up}) and exit.\\ - Z C & Mark all articles as read ({\bf catch-up}) and exit.\\ - % - Z n & Mark all articles as read and go to the {\bf next} group.\\ - Z N & Exit and go to {\bf the} next group.\\ - Z P & Exit and go to the {\bf previous} group.\\ - % - Z G & (M-g) Check for new articles in this group ({\bf get}).\\ - Z R & Exit this group, and then enter it again ({\bf reenter}). - [Prefix: select all articles, read and unread.]\\ - Z s & Update and save the dribble buffer. [Prefix: save .newsrc* as well]\\ - \end{keys} - } - } - -\newcommand{\MsgCompositionGeneral}{% - Press C-c ? in the composition-buffer to get this information. - {\esamepage - \begin{keys}{C-c C-m} - % sending - C-c C-c & Send message and exit. [Prefix: send via foreign server]\\ - C-c C-s & Send message. [Prefix: send via foreign server]\\ - C-c C-d & Don't send message (save as \textbf{draft}).\\ - C-c C-k & \textbf{Kill} message-buffer.\\ - C-c C-m & {\bf Mail} reply to the address near point. - [Prefix: include the original]\\ - % modify headers/body - C-c C-t & Paste the recipient's address into \textbf{To:}-field.\\ - C-c C-n & Insert a \textbf{Newsgroups:}-header.\\ - C-c C-o & Sort headers.\\ - C-c C-e & \textbf{Elide} region.\\ - C-c C-v & Kill everything outside region.\\ - C-c C-r & Do a \textbf{Rot-13} on the body.\\ - C-c C-w & Insert signature (from `message-signature-file').\\ - C-c C-z & Kill everything up to signature.\\ - C-c C-y & \textbf{Yank} original message.\\ - C-c C-q & Fill the yanked message.\\ - \end{keys} - } - } - -\newcommand{\MsgCompositionMovementArticle}{% - The following functions create the header-field if necessary. - {\esamepage - \begin{keys}{C-c C-f C-u} - C-c TAB & Move to \textbf{signature}.\\ - C-c C-b & Move to \textbf{body}.\\ - C-c C-f C-t & Move to \textbf{To:}.\\ - C-c C-f C-c & Move to \textbf{Cc:}.\\ - C-c C-f C-b & Move to \textbf{Bcc:}.\\ - C-c C-f C-w & Move to \textbf{Fcc:}.\\ - C-c C-f C-s & Move to \textbf{Subject:}.\\ - C-c C-f C-r & Move to \textbf{Reply-To:}.\\ - C-c C-f C-f & Move to \textbf{Followup-To:}.\\ - C-c C-f C-n & Move to \textbf{Newsgroups:}.\\ - C-c C-f C-u & Move to \textbf{Summary:}.\\ - C-c C-f C-k & Move to \textbf{Keywords:}.\\ - C-c C-f C-d & Move to \textbf{Distribution:}.\\ - \end{keys} - } - } - -\newcommand{\MsgCompositionMML}{% - {\esamepage - \begin{keys}{M-m P} - M-m f & (C-c C-a) Attach \textbf{file}.\\ - M-m b & Attach contents of \textbf{buffer}.\\ - M-m e & Attach \textbf{external} file (ftp..).\\ - M-m P & Create MIME-\textbf{preview} (new buffer).\\ - M-m v & \textbf{Validate} article.\\ - M-m p & Insert \textbf{part}.\\ - M-m m & Insert \textbf{multi}-part.\\ - M-m q & \textbf{Quote} region.\\ - % TODO: narrow headers (M-m n) ? - \end{keys} - } - } - -%% TODO: -\newcommand{\ServerMode}{% - {\esamepage - To enter this mode, press `\^' while in Group mode.\\* - \begin{keys}{SPC} - SPC & (RET) Browse this server.\\ - a & {\bf Add} a new server.\\ - c & {\bf Copy} this server.\\ - e & {\bf Edit} a server.\\ - k & {\bf Kill} this server. [scope]\\ - l & {\bf List} all servers.\\ - q & Return to the group buffer ({\bf quit}).\\ - s & Request that the server scan its sources for new articles.\\ - g & Request that the server regenerate its data.\\ - y & {\bf Yank} the previously killed server.\\ - \end{keys} - } - } - -\newcommand{\BrowseServer}{% - {\esamepage - To enter this mode, press `B' while in Group mode.\\* - \begin{keys}{RET} - RET & Enter the current group.\\ - SPC & Enter the current group and display the first article.\\ - ? & Give a very short help message.\\ - n & Go to the {\bf next} group. [distance]\\ - p & Go to the {\bf previous} group. [distance]\\ - q & (l) {\bf Quit} browse mode.\\ - u & Subscribe to the current group. [scope]\\ - \end{keys} - } - } - -\newcommand{\GroupUnplugged}{% - {\esamepage - \begin{keys}{J S} - J j & Toggle plugged-state.\\ - J s & Fetch articles from current group.\\ - J s & Fetch articles from all groups for offline-reading.\\ - J S & \textbf{Send} all sendable messages in the drafts group.\\ - % - J c & Enter \textbf{category} buffer.\\ - J a & \textbf{Add} this group to an Agent category [p/p].\\ - J r & \textbf{Remove} this group from its Agent category [p/p].\\ - \end{keys} - } - } - -\newcommand{\SummaryUnplugged}{% - {\esamepage - \begin{keys}{J M-\#} - J \# & \textbf{Mark} the article for downloading.\\ - J M-\# & \textbf{Unmark} the article for downloading.\\ - @ & \textbf{Toggle} whether to download the article.\\ - J c & Mark all undownloaded articles as read (\textbf{catch-up}).\\ - \end{keys} - } - } - -\newcommand{\ServerUnplugged}{% - {\esamepage - \begin{keys}{J a} - J a & \textbf{Add} the current server to the list of servers covered - by the agent.\\ - J r & \textbf{Remove} the current server from the list of servers covered - by the agent.\\ - \end{keys} - } - } diff --git a/texi/infohack.el b/texi/infohack.el deleted file mode 100644 index f487f9e..0000000 --- a/texi/infohack.el +++ /dev/null @@ -1,146 +0,0 @@ -;;; infohack.el --- a hack to format info file. -;; Copyright (C) 2001 Free Software Foundation, Inc. - -;; Author: Shenghuo Zhu -;; Keywords: info - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(require 'texinfmt) - -(defun infohack-remove-unsupported () - (goto-char (point-min)) - (while (re-search-forward "@\\(end \\)?ifnottex" nil t) - (replace-match ""))) - -(defun infohack (file) - (let ((dest-directory default-directory) - (max-lisp-eval-depth (max max-lisp-eval-depth 600))) - (find-file file) - (infohack-remove-unsupported) - (texinfo-every-node-update) - (texinfo-format-buffer t) ;; Don't save any file. - (setq default-directory dest-directory) - (setq buffer-file-name - (expand-file-name (file-name-nondirectory buffer-file-name) - default-directory)) - (if (> (buffer-size) 100000) - (Info-split)) - (save-buffer))) - -(defun batch-makeinfo () - "Emacs makeinfo in batch mode." - (infohack-texi-format (car command-line-args-left) - (car (cdr command-line-args-left))) - (setq command-line-args-left nil)) - - -(let ((default-directory (expand-file-name "../lisp/")) - (features (cons 'w3-forms (copy-sequence features)))) - ;; Adjust `load-path' for APEL. - (load-file "dgnushack.el")) -(load-file (expand-file-name "ptexinfmt.el" "./")) - -(defun infohack-texi-format (file &optional addsuffix) - (let ((auto-save-default nil) - (find-file-run-dired nil) - coding-system-for-write - output-coding-system - (error 0)) - (condition-case err - (progn - (find-file file) - (buffer-disable-undo (current-buffer)) - (if (boundp 'MULE) - (setq output-coding-system file-coding-system) - (setq coding-system-for-write buffer-file-coding-system)) - ;; Remove ignored areas first. - (while (re-search-forward "^@ignore[\t\r ]*$" nil t) - (delete-region (match-beginning 0) - (if (re-search-forward - "^@end[\t ]+ignore[\t\r ]*$" nil t) - (1+ (match-end 0)) - (point-max)))) - (infohack-remove-unsupported) - (goto-char (point-min)) - ;; Add suffix if it is needed. - (when (and addsuffix - (re-search-forward "^@setfilename[\t ]+\\([^\t\n ]+\\)" - nil t) - (not (string-match "\\.info$" (match-string 1)))) - (insert ".info") - (goto-char (point-min))) - ;; process @include before updating node - ;; This might produce some problem if we use @lowersection or - ;; such. - (let ((input-directory default-directory) - (texinfo-command-end)) - (while (re-search-forward "^@include" nil t) - (setq texinfo-command-end (point)) - (let ((filename (concat input-directory - (texinfo-parse-line-arg)))) - (re-search-backward "^@include") - (delete-region (point) (save-excursion - (forward-line 1) - (point))) - (message "Reading included file: %s" filename) - (save-excursion - (save-restriction - (narrow-to-region - (point) (+ (point) - (car (cdr (insert-file-contents filename))))) - (goto-char (point-min)) - ;; Remove `@setfilename' line from included file, - ;; if any, so @setfilename command not duplicated. - (if (re-search-forward "^@setfilename" - (save-excursion - (forward-line 100) - (point)) - t) - (progn - (beginning-of-line) - (delete-region (point) (save-excursion - (forward-line 1) - (point)))))))))) - (texinfo-mode) - (texinfo-every-node-update) - (set-buffer-modified-p nil) - (message "texinfo formatting %s..." file) - (texinfo-format-buffer nil) - (if (buffer-modified-p) - (progn (message "Saving modified %s" (buffer-file-name)) - (save-buffer)))) - (error - (message ">> Error: %s" (prin1-to-string err)) - (message ">> point at") - (let ((s (buffer-substring (point) (min (+ (point) 100) (point-max)))) - (tem 0)) - (while (setq tem (string-match "\n+" s tem)) - (setq s (concat (substring s 0 (match-beginning 0)) - "\n>> " - (substring s (match-end 0))) - tem (1+ tem))) - (message ">> %s" s)) - (setq error 1))) - (kill-emacs error))) - -;;; infohack.el ends here diff --git a/texi/message-ja.texi b/texi/message-ja.texi deleted file mode 100644 index 470f62d..0000000 --- a/texi/message-ja.texi +++ /dev/null @@ -1,1582 +0,0 @@ -\input texinfo @c -*- mode: texinfo; coding: iso-2022-7bit; -*- - -@setfilename message-ja -@settitle T-gnus 6.15 Message Manual -@synindex fn cp -@synindex vr cp -@synindex pg cp -@dircategory Emacs -@direntry -* Message-ja: (message-ja). Mail and news composition mode that goes - with Gnus (Japanese). -@end direntry -@iftex -@finalout -@end iftex -@setchapternewpage odd - -@ifnottex - -This file documents Message, the Emacs message composition mode. - -$B$3$N%U%!%$%k$O(B Emacs $B$N%a%C%;!<%8:n@.%b!<%I$G$"$k(B Message $B$K4X$9$k@bL@J8(B -$B=q$G$9!#(B - -Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. - -Permission is granted to copy, distribute and/or modify this document -under the terms of the GNU Free Documentation License, Version 1.1 or -any later version published by the Free Software Foundation; with no -Invariant Sections, with the Front-Cover texts being ``A GNU -Manual'', and with the Back-Cover Texts as in (a) below. A copy of the -license is included in the section entitled ``GNU Free Documentation -License''. - -$B$3$NJ8=q$r!"%U%j!<%=%U%H%&%'%":bCDH/9T$N(B GNU $B%U%j!r7o$N2<$GJ#@=!"G[I[!"$"$k$$$OJQ99$9(B -$B$k$3$H$r5v2D$7$^$9!#JQ99IT2DItJ,$O;XDj$7$^$;$s!#!V(BA GNU Manual$B!W$OI=I=;f(B -$B%F%-%9%H!"0J2<$N(B (a) $B$ON"I=;f%F%-%9%H$G$9!#$3$NMxMQ5vBz7@Ls=q$NJ#O$K4^$^$l$F$$$^(B -$B$9!#(B - -(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify -this GNU Manual, like GNU software. Copies published by the Free -Software Foundation raise funds for GNU development.'' - -(a) FSF $B$NN"I=;f%F%-%9%H(B:$B!V$"$J$?$K$O$3$N(B GNU Manual $B$r(B GNU $B%=%U%H%&%'%"(B -$B$N$h$&$KJ#@=$7$?$jJQ99$9$k<+M3$,$"$j$^$9!#J#@=$O%U%j!<%=%U%H%&%'%":bCD$K(B -$B$h$C$F=PHG$5$l$^$7$?!#(B($B%U%j!<%=%U%H%&%'%":bCD$O(B) GNU $B$N3+H/$N$?$a$KI,MW(B -$B$J;q6b$r=8$a$F$$$^$9!#!W(B - -This document is part of a collection distributed under the GNU Free -Documentation License. If you want to distribute this document -separately from the collection, you can do so by adding a copy of the -license to the document, as described in section 6 of the license. - -$B$3$NJ8=q$O!V(BGNU $B%U%j!r7o$N2<$GJ#@=!"G[I[!"$"$k$$$OJQ99$9(B -$B$k$3$H$r5v2D$7$^$9!#JQ99IT2DItJ,$O;XDj$7$^$;$s!#!V(BA GNU Manual$B!W$OI=I=;f(B -$B%F%-%9%H!"0J2<$N(B (a) $B$ON"I=;f%F%-%9%H$G$9!#$3$NMxMQ5vBz7@Ls=q$NJ#O$K4^$^$l$F$$$^(B -$B$9!#(B - -(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify -this GNU Manual, like GNU software. Copies published by the Free -Software Foundation raise funds for GNU development.'' - -(a) FSF $B$NN"I=;f%F%-%9%H(B:$B!V$"$J$?$K$O$3$N(B GNU Manual $B$r(B GNU $B%=%U%H%&%'%"(B -$B$N$h$&$KJ#@=$7$?$jJQ99$9$k<+M3$,$"$j$^$9!#J#@=$O%U%j!<%=%U%H%&%'%":bCD$K(B -$B$h$C$F=PHG$5$l$^$7$?!#(B($B%U%j!<%=%U%H%&%'%":bCD$O(B) GNU $B$N3+H/$N$?$a$KI,MW(B -$B$J;q6b$r=8$a$F$$$^$9!#!W(B - -This document is part of a collection distributed under the GNU Free -Documentation License. If you want to distribute this document -separately from the collection, you can do so by adding a copy of the -license to the document, as described in section 6 of the license. - -$B$3$NJ8=q$O!V(BGNU $B%U%j!J}(B) $B$O%a%C%;!<%8%b!<(B -$B%I%P%C%U%!$G9T$o$l$^$9!#(B - -@menu -* Interface:: $B%a%C%;!<%8%P%C%U%!$r@_Dj$9$k(B -* Commands:: $B%a%C%;!<%8%b!<%I%P%C%U%!$GAw!"C$7(B -- $B$=$N%W%m%0%i%`(B ($B$b$7$/$O?M(B) $B$O%a%C%;!<%8$,$"$k%P%C(B -$B%U%!$K%]%$%s%H$rF~$l$FI,MW$JL?Na$r8F$S=P$9$@$1$GNI$$$Y$-$G$9!#$=$&$9$k(B -$B$H(B @code{Message} $B$O?7$7$$(B @code{message} $B%b!<%I%P%C%U%!$rE,@Z$J%X%C%@!<(B -$B$rF~$l$F:n$j=P$7!"MxMQC$9(B -* Superseding:: $B%a%C%;!<%8$NBeBX(B -* Forwarding:: $B%a%C%;!<%8$r%K%e!<%9$b$7$/$O%a!<%k$GE>Aw$9$k(B -* Resending:: $B%a!<%k%a%C%;!<%8$r:FAw$9$k(B -* Bouncing:: $B%a!<%k%a%C%;!<%8$N<:GT$r:FAw$9$k(B -@end menu - -@node New Mail Message -@section $B?7$7$$%a!<%k%a%C%;!<%8(B - -@findex message-mail -@code{message-mail} $BL?Na$O?7$7$$%P%C%U%!$r:n$jI=<($7$^$9!#(B - -2$B$D$NA*Br<+M3$J0z?t$,l9g$O!"$=$l$>$l$NMWAG(B -$B$O(B cons $B%;%k$G$"$k$Y$-$G!"$=$l$N(B car $B$O%X%C%@!<$NL>A0(B ($BNc(B @code{Cc}) $B$G!"(B -cdr $B$,%X%C%@!<$NCM(B ($BNc(B @samp{larsi@@ifi.uio.no}) $B$G$"$k$Y$-$G$9!#A4$F$N(B -$B$3$l$i$N%X%C%@!<$O=P$F9T$/%a!<%k$N%X%C%@!<$KA^F~$5$l$^$9!#(B - -@node Wide Reply -@section $B9-$/JVEz(B - -@findex message-wide-reply -@code{message-wide-reply} $B$O8=:_$N%P%C%U%!$N%a%C%;!<%8$X$N9-$$JVEz$N%a%C(B -$B%;!<%8%P%C%U%!$r:n$C$FI=<($7$^$9!#(B@dfn{$B9-$$JVEz(B} $B$O(B @code{To}$B!"(B -@code{From}$B!"(B($B$b$7$/$O(B @code{Reply-to}) $B$H(B @code{Cc} $B%X%C%@!<$K5s$2$i$l(B -$B$F$$$kA4$F$N?M!9$KFO$/JVEz$G$9!#(B - -@vindex message-wide-reply-to-function -Message $B$OJVEz$,2?=h$K9T$/$+$r7hDj$9$k$?$a$KIaDL$NJ}K!$r;H$$$^$9$,!"(B -@code{message-wide-reply} $B$rO.$k;v$G!"?6$kIq$$$r$"$J$?$NMW5a$K9g$&$h$&$K(B -$BJQ99$9$k;v$,$G$-$^$9!#$=$l$O(B @code{message-reply-to-function} $B$HF1$8$h$&(B -$B$K;H$o$l$^$9(B (@pxref{Reply})$B!#(B - -@findex message-dont-reply-to-names -$B@55,I=8=(B @code{rmail-dont-reply-to-names} $B$K9gCW$9$k%"%I%l%9$O(B @code{Cc} -$B%X%C%@!<$+$iC$9(B - -@findex message-cancel-news -$BL?Na(B @code{message-cancel-news} $B$O8=:_$N%P%C%U%!$N5-;v$rC$7$^$9!#(B - -@node Superseding -@section $BBeBX(B - -@findex message-supersede -$BL?Na(B @code{message-supersede} $B$O8=:_$N%P%C%U%!$N%a%C%;!<%8$rBeBX$9$k%a%C(B -$B%;!<%8%P%C%U%!$r:n$jI=<($7$^$9!#(B - -@vindex message-ignored-supersede-headers -@code{message-ignored-supersedes-headers} $B$K9gCW$9$k%X%C%@!<$O?7$7$$%a%C(B -$B%;!<%8%P%C%U%!$r:n$j>e$2$kA0$KAw(B - -@findex message-forward -$BL?Na(B @code{message-forward} $B$O8=:_$N%P%C%U%!$N%a%C%;!<%8$rE>Aw$9$k$?$a$N(B -$B%a%C%;!<%8%P%C%U%!$r:n$jI=<($7$^$9!#$b$7@\F,0z?t$rM?$($i$l$k$H!"E>Aw$O(B -$B%K%e!<%9$r;H$$$^$9!#(B - -@table @code -@item message-forward-ignored-headers -@vindex message-forward-ignored-headers -$B$3$N@55,I=8=$K9gCW$9$k$9$Y$F$N%X%C%@!<$,!"E>Aw$5$l$k%a%C%;!<%8$+$i:o=|$5(B -$B$l$^$9!#(B - -@end table - -@node Resending -@section $B:FAw(B - -@findex message-resend -$BL?Na(B @code{message-resend} $B$OMxMQpJs$re$2$kA0$K$r;H$&$+(B -* Spelling:: Emacs $B$K%9%Z%k%A%'%C%/$5$;$k(B -@end menu - -@node Buffer Entry -@section $B%P%C%U%!$KF~$k(B -@cindex undo -@kindex C-_ - -$B2?$+B>$N%a%C%;!<%8$KJVEz$9$k$H$-!"$"$J$?$O$?$$$F$$%a%C%;!<%8%P%C%U%!$G=q(B -$B$->e$2$^$9$h$M!#(BMessage $B$OB?$/$N0zMQJ8$r07$$!"=pL>$N:o=|$dJ8>O$N@07A$r$7(B -$B$?$j!"$"$k$$$O$"$?$J$,;H$C$F$$$k@_Dj$K0MB8$7$F$$$^$9!#(BMessage $B$OIaDL$O$&(B -$B$^$/F0:n$7$^$9$,!"$H$-$I$-4V0c$($b$7$^$9!#$=$l$i$N4V0c$$$r%f!<%6$,@5$9$3(B -$B$H$,$G$-$k$h$&$K!"(BMessage $B$O$=$l$>$lo(B @kbd{C-_}) $B$r2!$;$P!"L$(B -$BJT=8$N%a%C%;!<%8$KLa$9$3$H$,$G$-$^$9!#(B - -@node Header Commands -@section $B%X%C%@!$K0\F0$7$^$9(B (@code{message-goto-signature})$B!#(B - -@end table - -@node Insertion -@section $BA^F~(B - -@table @kbd - -@item C-c C-y -@kindex C-c C-y -@findex message-yank-original -$B%P%C%U%!(B @code{gnus-article-copy} $B$K$"$k%a%C%;!<%8$r%a%C%;!<%8%P%C%U%!$K(B -$BE=$jIU$1$^$9!#IaDL$O(B @code{gnus-article-copy} $B$O$"$J$?$,JVEz$7$h$&$H$7$F(B -$B$$$k%a%C%;!<%8$G$9(B (@code{messsage-yank-original})$B!#(B - -@item C-c M-C-y -@kindex C-c M-C-y -@findex message-yank-buffer -Prompt for a buffer name and yank the contents of that buffer into the -message buffer (@code{message-yank-buffer}). - -@item C-c C-q -@kindex C-c C-q -@findex message-fill-yanked-message -$BE=$jIU$1$i$l$?%a%C%;!<%8$r@^$jJV$7$^(B -$B$9(B (@code{message-fill-yanked-message})$B!#7Y9p(B: $B$b$7!"0zMQ$N=,47$,JQ$G$"(B -$B$k$J$i!"E=$jIU$1$i$l$?J8>O$r$R$I$/$0$A$c$0$A$c$K$7$F$7$^$&$+$b$7$l$^$;$s!#(B -$B$=$l$,0BA4$G$"$k$HCN$k$H!"$9$0$K?M?4CO$D$/$G$7$g$&$,!#$H$K$+$/!"(B -@kbd{C-x u} (@code{undo}) $B$,;HMQ2DG=$G!"Bg>fIW$G$"$k$H8@$&;v$r3P$($F$*$$(B -$B$F2<$5$$!#(B - -@item C-c C-w -@kindex C-c C-w -@findex message-insert-signature -$B%P%C%U%!$N:G8e$K=pL>$rA^F~$7$^$9(B (@code{message-insert-signature})$B!#(B - -@item C-c M-h -@kindex C-c M-h -@findex message-insert-headers -$B%a%C%;!<%8$N%X%C%@!<$rA^F~$7$^$9(B (@code{message-insert-headers})$B!#(B - -@end table - -@table @code -@item message-ignored-cited-headers -$B$3$N@55,I=8=$K9gCW$9$kA4$F$N%X%C%@!<$OE=$jIU$1$i$l$?%a%C%;!<%8$+$i writes: -@end example - -$B$3$N4X?t$,8F$P$l$?$H$-!"%]%$%s%H$O%a%C%;!<%8$NK\BN$N@hF,$K$"$k$G$7$g$&!#(B - -$B$J$*(B gnus $B$K$O!"(B`writes:' $B$N>e$G%/%j%C%/$9$k$H0zMQ$5$l$?%F%-%9%H$r1#$95!(B -$BG=$,$"$j$^$9!#$b$7$"$J$?$,EY$r1[$7$F0zMQ9T$rJQ99$7$F$7$^$&$H!"$=$l$rFI$`(B -$B?M$?$A$bH`$i$N(B gnus $B$rBP1~$5$;$J$1$l$P$J$i$J$/$J$k$G$7$g$&!#JQ(B -$B?t(B @code{gnus-cite-attribution-suffix} $B$r;2>H$7$F2<$5$$!#>\:Y(B -$B$O(B @xref{Article Highlighting, , $B5-;v$N%O%$%i%$%H(B, gnus-ja}, $B$K$"$j$^$9!#(B - -@item message-yank-prefix -@vindex message-yank-prefix -@cindex yanking -@cindex quoting -$B$"$J$?$,5-;v$KJVEz$+%U%)%m!<%"%C%W$r$7$F$$$k$H$-$O!"IaDL$O$"$J$?$,1~Ez$7(B -$B$F$$$k?M$N$b$N$K0zMQId$rIU$1$?$$$G$7$g$&!#0zMQJ8$NA^F~$O(B @dfn{$BE=$jIU$1(B} -$B$K$h$C$F$J$5$l(B ($B$9$G$K0zMQId$,IU$$$F$$$k$b$N$OBP>]30!"(B -@code{message-yank-cited-prefix} $B$r;2>H$N$3$H(B)$B!"$=$l$>$l$NE=$jIU$1$i$l$?(B -$B0zMQ9T$O$=$NA0$K(B @code{message-yank-prefix} $B$rIU$1$i$l$^$9!#=i4|CM(B -$B$O(B @samp{> } $B$G$9!#(B - -@item message-yank-cited-prefix -@vindex message-yank-cited-prefix -@cindex yanking -@cindex cited -@cindex quoting -$B$9$G$K0zMQ$5$l$?9T$K$O(B @code{message-yank-prefix} $B$NBe$o$j$K$3$NJQ?t$NFb(B -$BMF$,0zMQId$H$7$F;H$o$l$^$9!#=i4|CM$O(B @samp{>} $B$G$9!#(B - -@item message-yank-add-new-references -@vindex message-yank-add-new-references -@cindex yanking -$B%3%^%s%I(B @code{message-yank-original} $B$rBPOCE*$K;H$C$?$H$-$K!"$3$NCM(B -$B$,(B @code{nil} $B$G$J$+$C$?$i!"(BReferences $B%U%#!<%k%I$K(B ID $B$,DI2C$5$l$^$9!#(B -$B$b$7CM$,%7%s%\%k(B @code{message-id-only} $B$@$C$?$i(B Message-ID $B%U%#!<%k%I(B -$B$N(B ID $B$@$1$,;H$o$l$^$9$,!"$=$&$G$J$1$l$P(B References$B!"(BIn-Reply-To $B$*$h(B -$B$S(B Message-ID $B%U%#!<%k%I$+$iCj=P$5$l$?(B ID $B$,;H$o$l$^$9!#(B - -@item message-list-references-add-position -@vindex message-list-references-add-position -@cindex yanking -$B%3%^%s%I(B @code{message-yank-original} $B$rBPOCE*$K;H$C$?$H$-$K!"$3$NCM$,(B -$B@5$N@0?t$@$C$?$i!"$9$G$K$"$k(B References $B%U%#!<%k%I$N:G8e$+$i$=$N8D?t(B -$B$N(B ID $B$@$1N%$l$?>l=j$K?7$7$$(B ID $B$,A^F~$5$l$^$9!#$=$l0J30$N>l9g$O:G8e$KA^(B -$BF~$5$l$^$9!#(B - -@item message-indentation-spaces -@vindex message-indentation-spaces -$BE=$jIU$1$i$l$?%a%C%;!<%8$r;z2<$2$9$k$?$a$N6uGr$N?t$G$9!#(B - -@item message-cite-function -@vindex message-cite-function -@findex message-cite-original -@findex sc-cite-original -@findex message-cite-original-without-signature -@cindex Supercite -$BK\5-;v$r0zMQ$9$k$?$a$N4X?t$G$9!#=i4|CM$O(B @code{message-cite-original} $B$G!"(B -$B$3$l$OC1=c$K$b$H$N%a%C%;!<%8$rA^F~$7!"$=$l$>$l$N9T$NF,$K(B @samp{> } $B$r$/$C(B -$B$D$1$^$9!#(B@code{message-cite-original-without-signature} $B$OF1MM$N;v$r$7(B -$B$^$9$,!"=pL>$O>J$-$^$9!#(BSupercite $B$r;H$&$?$a$K!"$=$l(B -$B$r(B @code{sc-cite-original} $B$K@_Dj$9$k;v$b$G$-$^$9!#(B - -@item message-suspend-font-lock-when-citing -@vindex message-suspend-font-lock-when-citing -@code{nil} $B$G$J$1$l$P!"K\5-;v$r0zMQ$7$F$$$k4V(B font-lock $B$NF0:n$r;_$a$^$9!#(B -$B$$$/$D$+$N!"(BEmacs $B$,2K$J$H$-$KCY$l$FF0:n$9$k(B font-lock $B$N$?$a$N%D!<(B -$B%k(B ($B$^$?$O(B Emacs $B<+?H(B) $B$K$O%P%0$,$"$j!"$=$l$i$O$7$P$7$P(B font-lock $B$NF0:n(B -$B$r9T$J$&BP>]$H$J$k%P%C%U%!$rl$7$N$.$NBP:v(B -$B$G$O$"$k$N$G$9$,!"$3$N%*%W%7%g%s$rHs(B-@code{nil} $B$K$9$k$3$H$K$h$C$F!"$"$J(B -$B$?$OITL{2w$J%(%i!<$r2sHr$G$-$k$+$b$7$l$^$;$s!#(B - -@item message-indent-citation-function -@vindex message-indent-citation-function -$B$A$g$&$I%a!<%k%P%C%U%!$KA^F~$5$l$?0zMQJ8$r=$@5$9$k$?$a$N4X?t$G$9!#$3$l$O(B -$B4X?t$N%j%9%H$G$"$k;v$b$G$-$^$9!#$=$l$>$l$N4X?t(B -$B$O(B @code{(point)} $B$H(B @code{(mark t)} $B$N4V$G0zMQ$rH/8+$9$k;v$,$G$-$^$9!#(B -$B$=$7$F!"$=$l$>$l$N4X?t$O0zMQJ8$,=$@5$5$l$k$H!"$=$N<~$j$K%]%$%s%H$H%^!<%/(B -$B$r;D$5$J$1$l$P$J$j$^$;$s!#(B - -@item message-signature -@vindex message-signature -$B%a%C%;!<%8%P%C%U%!$N:G8e$KA^F~$5$l$kJ8;zNs$G$9!#$b$7(B @code{t} ($B$3$l$,=i(B -$B4|@_Dj$G$9(B) $B$G$"$l$P!"%U%!%$%k(B @code{message-signature-file} $B$,Be$o$j$K(B -$BA^F~$5$l$^$9!#$b$74X?t$G$"$l$P!"4X?t$N7k2L$,Be$o$j$K;H$o$l$^$9!#$b$7<0$G(B -$B$"$l$P!"<0$N7k2L$,JQ$o$j$K;H$o$l$^$9!#$3$NJQ?t$,(B @code{nil} $B$G$"$l$P!"=p(B -$BL>$OA4$/A^F~$5$l$^$;$s!#(B - -@item messsage-signature-file -@vindex message-signature-file -$B%P%C%U%!$N:G8e$KA^F~$5$l$k=pL>$NF~$C$F$$$k%U%!%$%k$G$9!#=i4|CM(B -$B$O(B @samp{~/.signature} $B$G$9!#(B - -@end table - -RFC1036bis $B$O!"=pL>$O$=$NA0$K(B @samp{-- } $B$N(B3$BJ8;z$@$1$N9T$,$"$k$Y$-$G$"$k(B -$B$H8@$C$F$$$k;v$KCm0U$7$F2<$5$$!#$3$l$O$rG'<1$7$F!"=h(B -$BM}$r$9$k;v$r4JC1$K$9$k$?$a$G$9!#$G$9$+$i!"$"$J$?$NH~$7$$%G%6%$%s$r$=$l$,!"(B -$B$"$N!"40A4$KGK2u$7$F$$$k$H46$8$F$b$=$l$i$NJ8;z$r$O(B4$B9T$h$jB?$/$J$k$Y$-$G$OL5$$$H8@$&;v$bCm0U$7$F2<$5$$!#(BASCII $B$N3($r(B -$BF~$l$k;v$O!"3'$K$"$J$?$,GO key+cert.pem -@end example - -The @code{key+cert.pem} file should be pointed to from the -@code{smime-keys} variable. You should now be able to send signed mail. - -@emph{Note!} Your private key is store unencrypted in the file, so take -care in handling it. - -@subsection Using PGP/MIME - -PGP/MIME requires an external OpenPGP implementation, such as GNU Privacy -Guard (@code{http://www.gnupg.org/}). It also requires an Emacs interface -to it, such as Mailcrypt (available from -@code{http://www.nb.net/~lbudney/linux/software/mailcrypt.html}) or -Florian Weimer's @code{gpg.el}. - -Creating your own OpenPGP key is described in detail in the -documentation of your OpenPGP implementation, so we refer to it. - -@end ignore -@node Various Commands -@section $B$$$m$$$m$JL?Na(B - -@table @kbd - -@item C-c C-r -@kindex C-c C-r -@findex message-caesar-buffer-body -$B8=:_$N%a%C%;!<%8$r%7!<%6!(B rot13) $B$7$^(B -$B$9(B (@code{message-caesar-buffer-body})$B!#$b$7HO0O8BDj$,$5(B -$B$;$k$+$r;XDj$7$^$9!#=i4|CM$O(B 13 $B$G$9!#(B - -@item C-c C-e -@kindex C-c C-e -@findex message-elide-region -$B%]%$%s%H$H%^!<%/$N4V$NJ8$r>J$-$^$9(B (@code{message-elide-region})$B!#J8>O$O(B -$B@Z$i$l$F(B (killed) $BJQ?t(B @code{message-elide-ellipsis} $B$NCM$GCV$-49$($i$l(B -$B$^$9!#%G%#%U%)%k%H$N>JN,Id9f$H$7$F;H$o$l$kCM$O(B (@samp{[...]}) $B$G$9!#(B - -@item C-c C-z -@kindex C-c C-x -@findex message-kill-to-signature -$B=pL>$^$G$+!"$=$l$,L5$1$l$P5-;v$N:G8e$^$G$NA4$F$NJ8$r@Z$j$^(B -$B$9(B (@code{message-kill-to-signature})$B!#(B - -@item C-c C-v -@kindex C-c C-v -@findex message-delete-not-region -$B%a%C%;!<%8$NK\BN$N%j!<%8%g%s$N30$NA4$F$NJ8$r>C5n$7$^(B -$B$9(B (@code{message-delete-not-region})$B!#(B - -@item M-RET -@kindex M-RET -@kindex message-newline-and-format -4$B$D$N?7$7$$9T$rA^F~$7!"$b$7%]%$%s%H$,0zMQJ8$N4V$K$"$k$J$i$P!":F@07A$7$^(B -$B$9!#(B - -$B$3$l$ONc$G$9(B: - -@example -> $B$3$l$O2?$+$N0zMQJ8$G$9!#(B $B$=$7$F!"$3$3$K$O$b$C$H0zMQJ8$,$"$j$^$9!#(B -@end example - -$B$b$7!"%]%$%s%H$,(B @samp{$B$=$7$F(B} $B$NA0$K$"$j!"(B@kbd{M-RET} $B$r2!$7$?$J$i!"0J(B -$B2<$N$h$&$J$b$N$rF@$^$9(B: - -@example -> $B$3$l$O2?$+$N0zMQJ8$G$9!#(B - -* - -> $B$=$7$F!"$3$3$K$O$b$C$H0zMQJ8$,$"$j$^$9!#(B -@end example - -@samp{*} $B$O%]%$%s%H$,CV$+$l$F$$$k>l=j$G$9!#(B - -@item C-c C-t -@kindex C-c C-t -@findex message-insert-to -$B%U%)%m!<%"%C%W$7$h$&$H$9$k%a%C%;!<%8$N(B @code{Reply-To} $B$b$7$/(B -$B$O(B @code{From} $B%X%C%@!<$r4^$`(B @code{To} $B%X%C%@!<$rA^F~$7$^(B -$B$9(B (@code{message-insert-to})$B!#(B - -@item C-c C-n -@kindex C-c C-n -@findex message-insert-newsgroups -$BJVEz$7$F$$$k5-;v$N(B @code{Followup-To} $B$b$7$/$O!"(B@code{Nesgroups} $B%X%C%@!<(B -$B$rH?1G$7$?(B @code{Newsgroups} $B%X%C%@!<$rA^F~$7$^(B -$B$9(B (@code{message-insert-newsgroups})$B!#(B - -@item C-c M-r -@kindex C-c M-r -@findex message-rename-buffer -$B%P%C%U%!$NL>A0$rJQ99$7$^$9(B (@code{message-rename-buffer})$B!#@\F,0z?t$rM?(B -$B$($i$l$l$P!"?7$7$$%P%C%U%!L>$NF~NO$rB%?J$7$^$9!#(B - -@end table - -@node Sending -@section $BAw?.(B - -@table @kbd -@item C-c C-c -@kindex C-c C-c -@findex message-send-and-exit -$B%a%C%;!<%8$rAw?.$7!"8=:_$N%P%C%U%!$rKd$a$^(B -$B$9(B (@code{message-send-and-exit})$B!#(B - -@item C-c C-s -@kindex C-c C-s -@findex message-send -$B%a%C%;!<%8$rAw?.$7$^$9(B (@code{message-send})$B!#(B - -@item C-c C-d -@kindex C-c C-d -@findex message-dong-send -$B%a%C%;!<%8%P%C%U%!$rKd$a$F=*N;$7$^$9(B (@code{message-dont-send})$B!#(B - -@item C-c C-k -@kindex C-c C-k -@findex message-kill-buffer -$B%a%C%;!<%8%P%C%U%!$r@Z$C$F=*N;$7$^$9(B (@code{message-kill-buffer})$B!#(B - -@end table - -@node Mail Aliases -@section $B%a!<%kJLL>(B -@cindex mail aliases -@cindex aliases - -@vindex message-mail-alias-type -$BJQ?t(B @code{message-mail-alias-type} $B$O$I$N$h$&$J7?$N%a!<%kJLL>(B (mail -alias) $B?-D%$r;H$&$+$r@)8f$7$^$9!#8=:_$G$O!"0l$D$NMM<0$@$1$,;HMQ2DG=$G$9(B--- -Message $B$O%a!<%kJLL>$r07$&$?$a$K(B @code{mailabbrev} $B$r;H$$$^$9!#$b$7$3$N(B -$BJQ?t$,(B @code{nil} $B$G$"$k$J$i!"%a!<%kJLL>?-D%$O" -alias ding "ding@@ifi.uio.no (ding mailing list)" -@end example - -$B$3$N$h$&$J9T$r$"$J$?$N(B @file{~/.mailrc} $B%U%!%$%k$KDI2C$7$?8e$G!"(B -@code{To} $B$d(B @code{Cc} ($BEy$J$I(B) $B$N%X%C%@!<$G(B @samp{lmi} $B$H=q$$$F!"(B -@kbd{SPC} $B$r2!$9$@$1$GJLL>$r?-D%$7$^$9!#(B - -$B%a%C%;!<%8$rAw$k$H$-$K$O?-D%$O9T$o$l$^$;$s(B---$BA4$F$N?-D%$OL@<(E*$K9T$o$l(B -$B$J$/$F$O$J$j$^$;$s!#(B - -@node Spelling -@section Emacs $B$K%9%Z%k%A%'%C%/$5$;$k(B -@cindex spelling -@findex ispell-message - -Emacs $B$G%9%Z%k%A%'%C%/$9$k$?$a$KIa5Z$7$F$$$kFs$D$NJ}K!!"(B -@code{ispell} $B$H(B @code{flyspell} $B$,$"$j$^$9!#(B@code{ispell} $B$NJ}$O@N$+$i(B -$B$"$C$F!"$?$V$s$h$j0lHLE*$J%Q%C%1!<%8$G$9!#$"$J$?$ONc$K$h$C$F:G=i$K%a%C%;!<(B -$B%8$r=q$$$F$+$iA4BN$r(B @code{ispell} $B$KDL$7!"$9$Y$F$N=q$-B;$8$r=$@5$7$^$9!#(B -$B%a%C%;!<%8$rAw?.$9$k$H$-$K$=$l$r<+F0E*$K9T$J$&$?$a$K$O!"(B.emacs $B%U%!%$%k(B -$B$K0J2<$N$h$&$J$b$N$rF~$l$F2<$5$$!#(B - -@lisp -(add-hook 'message-send-hook 'ispell-message) -@end lisp - -@vindex ispell-message-dictionary-alist -$B$b$7$"$J$?$,0c$&8@8l$G=q$/=,47$J$i$P!"$=$l$OJQ(B -$B?t(B @code{ispell-message-dictionary-alist} $B$G@)8f$G$-$^$9!#(B - -@lisp -(setq ispell-message-dictionary-alist - '(("^Newsgroups:.*\\bde\\." . "deutsch8") - (".*" . "default"))) -@end lisp - -@code{ispell} $B$O%$%s%9%H!<%k$5$l$?(B @samp{ispell} $B%3%^%s%I$K0MB8$7$F$$$^(B -$B$9!#(B - -$B$b$&0lJ}$NIa5Z$7$F$$$kJ}K!$O(B @code{flyspell} $B$r;H$&$3$H$G$9!#$3$N%Q%C%1!<(B -$B%8$O$"$J$?$,=q$$$F$$$k:GCf$K%9%Z%k%A%'%C%/$r9T$J$$!"$$$m$s$JJ}K!$G4V0c$C(B -$B$?%9%Z%k$N8l$r;XE&$7$F$/$l$^$9!#(B - -@code{flyspell} $B$r;H$&$K$O!"0J2<$N$h$&$J$b$N$r(B .emacs $B%U%!%$%k$KF~$l$F2<(B -$B$5$$!#(B - -@lisp -(defun my-message-setup-routine () - (flyspell-mode 1)) -(add-hook 'message-setup-hook 'my-message-setup-routine) -@end lisp - -@code{flyspell} $B$O%$%s%9%H!<%k$5$l$?(B @samp{ispell} $B%3%^%s%I$K0MB8$7$F$$$^(B -$B$9!#(B - -@node Variables -@chapter $BJQ?t(B - -@menu -* Message Headers:: $B0lHLE*$J%a%C%;!<%8%X%C%@!<$N$h$&$J$b$N(B -* Mail Headers:: $B%a!<%k%X%C%@!<$r%+%9%?%^%$%:$9$k(B -* Mail Variables:: $BB>$N%a!<%kJQ?t(B -* News Headers:: $B%K%e!<%9%X%C%@!<$r%+%9%?%^%$%:$9$k(B -* News Variables:: $BB>$N%K%e!<%9JQ?t(B -* Various Message Variables:: $BB>$N%a%C%;!<%8JQ?t(B -* Sending Variables:: $BAw?.$9$k$?$a$NJQ?t(B -* Message Buffers:: Message $B$,$=$N%P%C%U%!$NL>A0$rIU$1$kJ}K!(B -* Message Actions:: $B=*N;$9$k$H$-$Ko$K@Q6KE*$G$9!#$=$l$OC$5$l$?$j:n$jD>$5$l$?$j$7$^$9!#$3$l$K(B -$B$OJQ?t(B @code{message-deletable-headers} ($B8e=R(B) $B$,4X78$7$^$9!#(B - -@item message-from-style -@vindex message-from-style -@code{From} $B%X%C%@!<$,$I$N$h$&$K8+$($k$+$r;XDj$7$^$9!#0J2<$N#4$D$NCM$,;H(B -$B$($^$9(B: - -@table @code -@item nil -$B%"%I%l%9$@$1$G$9(B -- @samp{king@@grassland.com}. - -@item parens -@samp{king@@granssland.com (Elvis Parsley)}. - -@item angles -@samp{Elvis Parsley }. - -@item default -$B$=$l$,0zMQId9f$rMW5a$7$J$1$l$P(B @code{angles} $B$N$h$&$K8+$(!"$b$70zMQId9f(B -$B$,MW5a$5$l$k>l9g$O(B @code{parens} $B$N$h$&$K8+$($^$9!#(B@code{parens} $B$,0zMQ(B -$BId9f$rMW5a$7$?$H$7$F$b!"$H$K$+$/(B @code{angles} $B$r;H$$$^$9!#(B - -@end table - -@item message-deletable-headers -@vindex message-deletable-headers -$B$3$N%j%9%H$K$"$k!"0JA0$K(B Message $B$K$h$j:n@.$5$l$?%X%C%@!<$OEj9F$9$kA0$K(B -$B:o=|$5$l$^$9!#5-;v$rEj9F$9$k$H$7$^$7$g$&!#$=$l$+$i!"$o$s$Q$/K7$N%0%k!<%W$K:F$SEj9F$9$k;v$K7hDj$7$?$N$G!"(B -@code{*post-buf*} $B%P%C%U%!$KLa$j!"(B@code{Newsgroups} $B9T$rJT=8$7!":F$SAw$j(B -$B=P$7$?$H$7$^$9!#=i4|@_Dj$G$O!"$3$NJQ?t$OA0$K:n@.$5$l$?8E(B -$B$$(B @code{Message-ID} $B$,l9g$O$3$NJQ?t$r$3$l$i$N@\F,8l$K9g$&$h$&$J@55,I=8=$K@_Dj$9$k$G$7$g$&!#(B -$B;d<+?H$O!"$=$N$h$&$J5,3J$K=>$o$J$$%a!<%k$O$?$@H$7$F2<$5$$!#$=$l(B -$B$N=i4|CM$O(B @code{(From Date Subject (optional . In-Reply-To) Message-ID -Lines (optional . User-Agent))} $B$G$9!#(B - -@item message-ignored-mail-headers -@vindex message-ignored-mail-headers -$B%a!<%k$r=P$9A0$K(B -$B$K(B @code{message-send-mail-with-mh}, -@code{message-send-mail-with-qmail}, @code{message-send-mail-with-smtp}, -@code{smtpmail-send-it} $B$*$h$S(B @code{feedmail-send-it} $B$,;H$($^$9!#(B - -@item message-mh-deletable-headers -@vindex message-mh-deletable-headers -$B$[$H$s$I$NHG$N(B MH $B$O$3$NJQ?t$N%X%C%@!<$r4^$`%a%C%;!<%8$r?)$o$5$l$k$N$r7y(B -$B$$$^$9!#$3$NJQ?t$,(B @code{nil} $B$G$J$$$J$i(B ($B$3$l$,=i4|@_Dj$G$9$,(B)$B!"$3$l$i(B -$B$N%X%C%@!<$O(B MH $B$r;H$C$F%a%C%;!<%8$rAw$C$F$$$k$H$-$K$Ol9g$OF~NO$rB%?J$5$l$^$9!#(B - -@item Newsgroups -@cindex Newsgroups -$B$3$NI,MW$J%X%C%@!<$O$I$N%K%e!<%9%0%k!<%W$K5-;v$,Ej9F$5$l$k;v$K$J$k$+$r;X(B -$BDj$7$^$9!#$b$7$^$@B8:_$7$F$$$J$$$J$i!"F~NO$rB%?J$5$l$^$9!#(B - -@item Organization -@cindex organization -$B$3$NA*BrG$0U$J%X%C%@!<$OJQ?t(B @code{message-user-organization} $B$K0MB8$7$F(B -$B:n@.$5$l$^$9!#$b$7$3$NJQ?t$,(B @code{t} $B$G$"$l$P!"(B -@code{message-user-organization-file} $B$,;H$o$l$^$9!#$3$NJQ?t$OJ8;zNs$G$"(B -$B$k;v$b$G$-(B ($B$=$N>l9g$O$=$NJ8;zNs$,;H$o$l$^$9(B)$B!"4X?t$G$"$k;v$b$G$-$^(B -$B$9(B ($B$=$N4X?t$O0z?tL5$7$G8F$P$l!";H$o$l$kJ8;zNs$rJV$9I,MW$,$"$j$^$9(B)$B!#(B - -@item Lines -@cindex Lines -$B$3$NA*BrG$0U$J%X%C%@!<$O(B Message $B$K$h$j7W;;$5$l$^$9!#(B - -@item Message-ID -@cindex Message-ID -@vindex mail-host-address -@findex system-name -@cindex Sun -$B$3$NI,MW$J%X%C%@!<$O(B Message $B$K$h$j:n@.$5$l$^$9!#F|IU!";~4V!"MxMQ!"(B -$B%7%9%F%`L>$K4p$E$$$?B>$KL5$$(B ID $B$,:n@.$5$l$^$9!#(B -Message $B$O(B @code{system-name} $B$r%7%9%F%`L>$r7h$a$k$?$a$K;H$$$^$9!#$b$7$3(B -$B$l$,(B fully qualified domain name (FQDN) ($B40A4$K>r7o$rK~$?$7$?%I%a%$%s(B -$BL>(B) $B$G$J$$$J$i(B $B$P!"(BMessage $B$O(B @code{mail-host-address} $B$r(B FQDN $B$H$7$F;H(B -$B$$$^$9!#(B - -@item User-Agent -@cindex User-Agent -$B$3$NA*Br<+M3$J%X%C%@!<$O%m!<%+%kJQ?t(B @code{message-newsreader} $B$K$7$?$,$C(B -$B$F:n$i$l$^$9!#(B - -@item In-Reply-To -$B$3$NA*Br<+M3$J%X%C%@!<$OJVEz$7$F$$$k5-;v$N(B @code{Date} $B$H(B @code{From} $B%X%C(B -$B%@!<$r;H$C$F:n$i$l$^$9!#(B - -@item Expires -@cindex Expires -$B$3$NHs>o$KA*Br<+M3$J%X%C%@!<$OJQ?t(B @code{message-expires} $B$K$7$?$,$C$FA^(B -$BF~$5$l$^$9!#$3$l$O<+J,$,2?$r$7$F$$$k$+$rCN$i$J$$8B$j!";HMQ$OA4$/4+$a$i$l(B -$B$^$;$s!#(B - -@item Distribution -@cindex Distribution -$B$3$NA*Br<+M3$J%X%C%@!<$OJQ?t(B @code{message-distribution-function} $B$K$7$?(B -$B$,$C$F:n$i$l$^$9!#$=$l$OHs?d>)$G!"Hs>o$K8m2r$5$l$?%X%C%@!<$G$9!#(B - -@item Path -@cindex path -$B$3$NHs>o$KA*Br<+M3$J%X%C%@!<$O$*$=$i$/7h$7$F;H$o$l$F$O$J$i$J$$$G$7$g$&!#(B -$B$7$+$7$$$/$D$+$N(B @emph{$B$H$F$b(B} $B8E$$%5!<%P!<$O$3$N%X%C%@!<$,B8:_$9$k;v$r(B -$BMW5a$7$^$9!#(B@code{message-user-path} $B$,$3$N(B @code{Path} $B%X%C%@!<$,$I$N$h(B -$B$&$K8+$($k$+$r$5$i$K@)8f$7$^$9!#$b$7$=$l$,(B @code{nil} $B$G$"$l$P!"%5!<%P!<(B -$BL>$r(B leaf $B@a$H$7$F;H$$$^$9!#$b$7$=$l$,J8;zNs$G$"$l$P!"$=$NJ8;zNs$r;H$$$^(B -$B$9!#$b$7$=$l$,J8;zNs$G$b(B @code{nil} $B$G$b$J$1$l$P!"MxMQA0$@$1$r;H$$(B -$B$^$9!#$7$+$7!"2?$i$+$N7A$G$3$NJQ?t$rO.$i$J$1$l$P$J$i$J$$I,MW@-$OHs>o$K>/(B -$B$J$$$G$7$g$&!#(B -@end table - -@findex yow -@cindex Mime-Version -$B2C$($F!"$"$J$?$O(B cons $B$r%j%9%H$KF~$l$k;v$,$G$-$^$9!#(Bcons $B$N(B car $B$O%7%s%\(B -$B%k$G$"$k$Y$-$G$9!#$3$N%7%s%\%kL>$O%X%C%@!$G!"(Bcdr $B$O$3$N%X%C%@!<$NCM$H(B -$B$7$F$=$N$^$^F~$l$i$l$k$3$H$K$J$kJ8;zNs$+!"8F$P$l$k4X?t$N$I$A$i$+$G$"$k;v(B -$B$,$G$-$^$9!#Nc$($P!"$b$7(B @code{Mime-Version: 1.0} $B$rA^F~$7$?$$$J$i!"(B -@code{(Mime-Version . "1.0")} $B$r%j%9%H$KF~$l$k$Y$-$G$7$g$&!#$b$7$*$b$7$m(B -$B$$0zMQ$rA^F~$7$?$$$J$i!"(B@code{(X-Yow . yow)} $B$N$h$&$J$b$N$r%j%9%H$KF~$l(B -$B$k;v$,$G$-$k$G$7$g$&!#4X?t(B @code{yow} $B$O$=$N8e$G0z?tL5$7$G8F$P$l$^$9!#(B - -$B$b$7%j%9%H$,(B cons $B$N(B car $B$,(B @code{optional} $B$G$"$k(B cons $B$r4^$s$G$$$k$J$i!"(B -$B$3$N(B cons $B$N(B cdr $B$O(B @code{nil} $B$G$J$$$H$-$@$1A^F~$5$l$^$9!#(B - -$B=P$F9T$/%K%e!<%95-;v$r%+%9%?%^%$%:$9$k$?$a$NB>$NJQ?t(B: - -@table @code - -@item message-syntax-checks -@vindex message-syntax-checks -@code{nil} $B$G$J$1$l$P!"(BMessage $B$OEj9F$NA0$K!"%X%C%@!<$HB>$N$b$N$N9gK!@-(B -$B$rD4$Y$^$9!#$3$N%j%9%H$KMWAG$rIU$12C$($?$jfIW$+$I$&$+D4$Y$^$9!#(B -@item from -@code{From} $B%X%C%@!<$,$h$/8+$($k$+$I$&$+$rD4$Y$^$9!#(B -@item long-lines -$B$"$^$j$KD9$$9T$rD4$Y$^$9!#(B -@item control-chars -$B;H$C$F$O$$$1$J$$J8;z$rD4$Y$^$9!#(B -@item size -$B2a>j$JBg$-$5$rD4$Y$^$9!#(B -@item new-text -$B%a%C%;!<%8$K?7$7$$J8$,$"$k$+$I$&$+$rD4$Y$^$9!#(B -@item signature -$B=pL>$ND9$5$rD4$Y$^$9!#(B -@item approved -@cindex approved -$B5-;v$,(B @code{Approved} $B%X%C%@!<$r;}$C$F$$$k$+$I$&$+$rD4$Y$^$9!#$=$l$O;J(B -$B2q(B -$B$,L5$$$+$rD4$Y$^$9!#(B -@item shorten-followup-to -$BEj9F$9$k%0%k!<%W$N?t$r(B @code{Followup-to} $B%X%C%@!<$rIU$12C$($k;v$G>/$J$/(B -$B$9$k$+$rD4$Y$^$9!#(B -@end table - -$B$3$l$iA4$F$N>uBV$O=i4|@_Dj$G$OD4$Y$i$l$^$9!#(B - -@item message-ignored-news-headers -@vindex message-ignored-news-headers -$BEj9F$9$kA0$K\:Y$O(B gnus $B%^%K%e%"%k$r8+$F2<$5$$(B) $B$G$9!#(B - -@end table - -@node Various Message Variables -@section $B$$$m$$$m$J%a%C%;!<%8JQ?t(B - -@table @code -@c @item message-default-charset -@c @vindex message-default-charset -@c @cindex charset -@c Symbol naming a @sc{mime} charset. Non-ASCII characters in messages are -@c assumed to be encoded using this charset. The default is @code{nil}, -@c which means ask the user. (This variable is used only on non-@sc{mule} -@c Emacsen. -@c @xref{Charset Translation, , Charset Translation, emacs-mime, -@c Emacs MIME Manual}, for details on the @sc{mule}-to-@sc{mime} -@c translation process. -@c -@item message-signature-separator -@vindex message-signature-separator -$B=pL>J,N%$K9gCW$9$k@55,I=8=$G$9!#=i4|CM$O(B @samp{^-- *$} $B$G$9!#(B - -@item mail-header-separator -@vindex mail-header-separator -$B%X%C%@!<$rK\BN$+$iJ,$1$k$N$K;H$o$l$kJ8;zNs$G$9!#=i4|CM$O(B @samp{--text -follows this line--} $B$G$9!#(B - -@item message-directory -@vindex message-directory -$BB?$/$N%a!<%k$N$b$N$+$i;H$o$l$k%G%#%l%/%H%j!<$G$9!#=i4|CM(B -$B$O(B @file{~/Mail/} $B$G$9!#(B - -@item message-signature-setup-hook -@vindex message-signature-setup-hook -$B%a%C%;!<%8%P%C%U%!$r=i4|2=$9$k$H$-$K$,A^F~$5$l$kA0$KO$,A^(B -$BF~$5$l$kA0$Kl9g$O%X%C%@!<$r2C$($^$;$s!#(B - -@item message-send-mail-hook -@vindex message-send-mail-hook -$B%a!<%k%a%C%;!<%8$rAw$kA0$K$l$NMWAG$O$H6&$K8F$P$l$^$9!#=i4|@_Dj$N4X?t$O(B @code{message-output} -$B$G!"$=$l$O(B Unix mailbox $BMM<0$GJ]B8$7$^$9!#(B - -@item message-courtesy-message -@vindex messsage-courtesy-messsage -$BJ#9g%a%C%;!<%8$rAw$k$H$-$O!"$3$NJ8;zNs$O%a!<%k$GAw$i$l$?J#@=$NJ}$N:G=i$K(B -$BA^F~$5$l$^$9!#$b$7$=$NJ8;zNs$,=qK!;EMM;XDj(B @samp{%s} $B$r4^$s$G$$$l$P!"5-(B -$B;v$,Ej9F$5$l$?%K%e!<%9%0%k!<%W$,$=$3$KA^F~$5$l$^$9!#$b$7$3$NJQ?t(B -$B$,(B @code{nil} $B$G$"$l$P!"$=$N$h$&$J?F@Z%a%C%;!<%8$O2C$($i$l$^$;$s!#=i4|CM(B -$B$O(B @samp{"The following message is a courtesy copy of an article\nthat has -been posted to %s as well.\n\n"} $B$G$9!#(B - -@end table - -@node Message Buffers -@section $B%a%C%;!<%8%P%C%U%!(B - -Message $B$O$"$J$?$,%a%C%;!<%8%P%C%U%!$rMW5a$7$?$H$-$K!"B>$KL5$$M#0l$N%P%C(B -$B%U%!L>$G?7$7$$%P%C%U%!$r$D$/$j$^$9!#%a%C%;!<%8$rAw$C$?$H$-$K!"%P%C%U%!$O(B -$BIaDL$O:o=|$5$l$^$;$s!#$=$NL>A0$OJQ99$5$l$F!"FCDj$N?t$N8E$$%a%C%;!<%8%P%C(B -$B%U%!$O@8$-$?$^$^$K$J$j$^$9!#(B - -@table @code -@item message-generate-new-buffers -@vindex message-generate-new-buffers -@code{nil} $B$G$J$1$l$P!"?7$7$$%P%C%U%!$r:n@.$7$^$9!#=i4|CM$O(B @code{t} $B$G(B -$B$9!#$b$7$3$l$,4X?t$J$i!"$=$N4X?t$r(B3$B$D$N0z?t$H6&$K8F$S$^$9(B: $B7?!"Aw$j@h%"(B -$B%I%l%9!"%0%k!<%WL>(B $B$G$9!#(B ($B$3$l$i$N$I$l$G$b(B @code{nil} $B$G$"$k$+$b$7$l$^(B -$B$;$s!#(B) $B4X?t$O?7$7$$%P%C%U%!L>$rJV$9$Y$-$G$9!#(B - -@item message-use-multi-frames -@vindex message-use-multi-frames -@code{nil} $B$G$J$1$l$P!"?7$7$$%U%l!<%`$r:n@.$7$^$9!#=i4|CM$O(B @code{nil} -$B$G$9!#(B - -@item message-delete-frame-on-exit -@vindex messgae-delete-frame-on-exit -$BJQ?t(B @code{message-delete-frame-on-exit} $B$O%a%C%;!<%8$rAw?.$7$?$H$-$H!"(B -$B%P%C%U%!$r@Z$C$?$H$-$K%U%l!<%`$r>C5n$9$k$+$r7hDj$7$^$9!#(B@code{nil} $B$G$"(B -$B$l$P!"(B($B$3$l$,=i4|@_Dj$G$9$,(B) $B%U%l!<%`$r>C5n$7$^$;$s!#(B@code{ask} $B$G$"$l$P!"(B -$B>C5n$9$k$+$I$&$+$rMxMQo$K>C5n$7$^$9!#(B - -@item message-max-buffers -@vindex message-max-buffers -$B$3$NJQ?t$O$I$N$/$i$$8E$$%a%C%;!<%8%P%C%U%!$rJ]$C$F$*$/$+$r;XDj$7$^$9!#$3(B -$B$l$h$jB?$$%a%C%;!<%8%P%C%U%!$,$"$l$P!"0lHV8E$$%P%C%U%!$,:o=|$5$l$^$9!#=i(B -$B4|CM$O(B10$B$G$9!#$3$NJQ?t$,(B @code{nil} $B$G$"$k$H!"8E$$%a%C%;!<%8%P%C%U%!$O:o(B -$B=|$5$l$^$;$s!#(B - -@item message-send-rename-function -@vindex message-send-rename-function -$B%a%C%;!<%8$rAw$C$?8e$G!"%P%C%U%!$NL>A0$O!"Nc$($P!"(B@samp{*reply to Lars*} -$B$+$i(B @samp{*sent reply to Lars*} $B$KJQ99$5$l$^$9!#$b$7$3$l$r9%$^$J$$$J$i!"(B -$B$3$NJQ?t$r$"$J$?$N9%$-$JJ}K!$G%P%C%U%!$NL>A0$rJQ99$9$k4X?t$K@_Dj$7$F2<$5(B -$B$$!#$=$b$=$b%P%C%U%!L>$rJQ99$9$k;v$r9%$^$J$$$N$G$"$l$P!"$N2D(B -$BG=@-$K$O(B @kbd{C-c C-s} $B$,$"$j!"$3$l$O%a%C%;!<%8$rAw$k$@$1$G$"$j!"(B -@kbd{C-c C-d} $B$O%a%C%;!<%8$NJT=8$r@h$K1d$P$7$F%a%C%;!<%8%P%C%U%!$rKd$a!"(B -@kbd{C-c C-k} $B$O%a%C%;!<%8%P%C%U%!$r:o=|$7$^$9!#$3$l$i$NF0:n$O$=$l$>$l$=(B -$B$l$H4XO"IU$1$i$l$?%j%9%H$r;}$C$F$$$F!"$=$l$O2A(B} $B$5$l$k<0$G$9!#(B - -@node Compatibility -@chapter $B8_49@-(B -@cindex compatibility - -Message $B$O;ve!"$=$l<+?H$NJQ?t$7$+;H$$$^$;$s(B---$B8E$$(B @code{mail-} $B$NJQ(B -$B?t$O9MN8$5$l$^$;$s!#(BMessage $B$K$3$l$i$NJQ?t$r7W;;$KF~$l$5$;$?$$$N$G$"$l$P!"(B -$B0J2<$N$b$N$r$"$J$?$N(B @code{.emacs} $B%U%!%$%k$KF~$l$k;v$,$G$-$^$9(B: - -@lisp -(require 'messcompat) -@end lisp - -$B$3$l$OB?$/$N(B Message $BJQ?t$rBP1~$9$k%a!<%kJQ?t$+$i=i4|2=$7$^$9!#(B - -@node Appendices -@chapter $BIU5-(B - -@menu -* Responses:: $B1~Ez$,2?=h$K9T$/$+$r7hDj$9$kI8=`$NK!B'!#(B -@end menu - -@node Responses -@section $B1~Ez(B - -$B%a%C%;!<%8$,2?=h$K9T$/$+$r7hDj$9$k$?$a$K!"=i4|@_Dj$G$O0J2<$N%"%k%4%j%:%`(B -$B$,;H$o$l$^$9!#(B - -@table @dfn -@item reply -@dfn{$BJVEz(B} (reply) $B$O%a%C%;!<%8$rAw$C$??M(B @emph{$B$@$1(B} $B$K%a!<%k$G1~Ez$7$?(B -$B$$$H$-$N$b$N$G$9!#l9g$O$=$l$,Be$o$j(B -$B$K;H$o$l$^$9(B)$B!#(B - -@item Cc - -@item To -@end table - -@code{Mail-Copies-To} $B%X%C%@!<$,B8:_$7$F$$$k$H!"$=$l$b%a!<%k%\%C%/%9$N%j(B -$B%9%H$K2C$($i$l$k$G$7$g$&!#$3$N%X%C%@!<$,(B @samp{never} $B$G$"$l$P!"$=$l(B -$B$O(B @code{From} ($B$b$7$/$O(B @code{Reply-To}) $B%a!<%k%\%C%/%9$,M^@)$5$l$k$H8@(B -$B$&;v$G$9!#(B - -@item followup -@dfn{$B%U%)%m!<%"%C%W(B} (followup) $B$O%K%e!<%9$K$h$k1~Ez$G$9!#0J2<$N%X%C(B -$B%@!<(B ($BM%@h=g0L$N9b$$$b$N$+$i5s$2$i$l$F$$$^$9(B) $B$,2?=h$K1~Ez$,Aw$i$l$k$+$r(B -$B7hDj$7$^$9(B: - -@table @code - -@item Followup-To - -@item Newsgroups - -@end table - -$B$b$7(B @code{Mail-Copies-To} $B%X%C%@!<$,B8:_$9$k$H!"$=$l$,(B @samp{never} $B$G(B -$B$J$1$l$P!"?7$7$$(B @code{Cc} $B%X%C%@!<$N4p$H$7$F;H$o$l!"$^$9!#(B - -@end table - -@node Index -@chapter Index -@printindex cp - -@node Key Index -@chapter Key Index -@printindex ky - -@summarycontents -@contents -@bye - -@c End: diff --git a/texi/message.texi b/texi/message.texi deleted file mode 100644 index 3529ef1..0000000 --- a/texi/message.texi +++ /dev/null @@ -1,1630 +0,0 @@ -\input texinfo @c -*-texinfo-*- - -@setfilename message -@settitle T-gnus 6.15 Message Manual -@synindex fn cp -@synindex vr cp -@synindex pg cp -@dircategory Emacs -@direntry -* Message: (message). Mail and news composition mode that goes with Gnus. -@end direntry -@iftex -@finalout -@end iftex -@setchapternewpage odd - -@ifnottex - -This file documents Message, the Emacs message composition mode. - -Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. - -Permission is granted to copy, distribute and/or modify this document -under the terms of the GNU Free Documentation License, Version 1.1 or -any later version published by the Free Software Foundation; with no -Invariant Sections, with the Front-Cover texts being ``A GNU -Manual'', and with the Back-Cover Texts as in (a) below. A copy of the -license is included in the section entitled ``GNU Free Documentation -License'' in the Emacs manual. - -(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify -this GNU Manual, like GNU software. Copies published by the Free -Software Foundation raise funds for GNU development.'' - -This document is part of a collection distributed under the GNU Free -Documentation License. If you want to distribute this document -separately from the collection, you can do so by adding a copy of the -license to the document, as described in section 6 of the license. -@end ifnottex - -@tex - -@titlepage -@title T-gnus 6.15 Message Manual - -@author by Lars Magne Ingebrigtsen -@page - -@vskip 0pt plus 1filll -Copyright @copyright{} 1996, 1997, 1998, 1999, 2000 - Free Software Foundation, Inc. - -Permission is granted to copy, distribute and/or modify this document -under the terms of the GNU Free Documentation License, Version 1.1 or -any later version published by the Free Software Foundation; with the -Invariant Sections being none, with the Front-Cover texts being ``A GNU -Manual'', and with the Back-Cover Texts as in (a) below. A copy of the -license is included in the section entitled ``GNU Free Documentation -License'' in the Emacs manual. - -(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify -this GNU Manual, like GNU software. Copies published by the Free -Software Foundation raise funds for GNU development.'' - -This document is part of a collection distributed under the GNU Free -Documentation License. If you want to distribute this document -separately from the collection, you can do so by adding a copy of the -license to the document, as described in section 6 of the license. -@end titlepage -@page - -@end tex - -@node Top -@top Message - -All message composition from Gnus (both mail and news) takes place in -Message mode buffers. - -@menu -* Interface:: Setting up message buffers. -* Commands:: Commands you can execute in message mode buffers. -* Variables:: Customizing the message buffers. -* Compatibility:: Making Message backwards compatible. -* Appendices:: More technical things. -* Index:: Variable, function and concept index. -* Key Index:: List of Message mode keys. -@end menu - -This manual corresponds to T-gnus 6.15 Message. Message is distributed -with the Gnus distribution bearing the same version number as this -manual. - - -@node Interface -@chapter Interface - -When a program (or a person) wants to respond to a message -- reply, -follow up, forward, cancel -- the program (or person) should just put -point in the buffer where the message is and call the required command. -@code{Message} will then pop up a new @code{message} mode buffer with -appropriate headers filled out, and the user can edit the message before -sending it. - -@menu -* New Mail Message:: Editing a brand new mail message. -* New News Message:: Editing a brand new news message. -* Reply:: Replying via mail. -* Wide Reply:: Responding to all people via mail. -* Followup:: Following up via news. -* Canceling News:: Canceling a news article. -* Superseding:: Superseding a message. -* Forwarding:: Forwarding a message via news or mail. -* Resending:: Resending a mail message. -* Bouncing:: Bouncing a mail message. -@end menu - - -@node New Mail Message -@section New Mail Message - -@findex message-mail -The @code{message-mail} command pops up a new message buffer. - -Two optional parameters are accepted: The first will be used as the -@code{To} header and the second as the @code{Subject} header. If these -are @code{nil}, those two headers will be empty. - - -@node New News Message -@section New News Message - -@findex message-news -The @code{message-news} command pops up a new message buffer. - -This function accepts two optional parameters. The first will be used -as the @code{Newsgroups} header and the second as the @code{Subject} -header. If these are @code{nil}, those two headers will be empty. - - -@node Reply -@section Reply - -@findex message-reply -The @code{message-reply} function pops up a message buffer that's a -reply to the message in the current buffer. - -@vindex message-reply-to-function -Message uses the normal methods to determine where replies are to go -(@pxref{Responses}), but you can change the behavior to suit your needs -by fiddling with the @code{message-reply-to-function} variable. - -If you want the replies to go to the @code{Sender} instead of the -@code{From}, you could do something like this: - -@lisp -(setq message-reply-to-function - (lambda () - (cond ((equal (mail-fetch-field "from") "somebody") - (list (cons 'To (mail-fetch-field "sender")))) - (t - nil)))) -@end lisp - -This function will be called narrowed to the head of the article that is -being replied to. - -As you can see, this function should return a string if it has an -opinion as to what the To header should be. If it does not, it should -just return @code{nil}, and the normal methods for determining the To -header will be used. - -This function can also return a list. In that case, each list element -should be a cons, where the car should be the name of an header -(eg. @code{Cc}) and the cdr should be the header value -(eg. @samp{larsi@@ifi.uio.no}). All these headers will be inserted into -the head of the outgoing mail. - - -@node Wide Reply -@section Wide Reply - -@findex message-wide-reply -The @code{message-wide-reply} pops up a message buffer that's a wide -reply to the message in the current buffer. A @dfn{wide reply} is a -reply that goes out to all people listed in the @code{To}, @code{From} -(or @code{Reply-to}) and @code{Cc} headers. - -@vindex message-wide-reply-to-function -Message uses the normal methods to determine where wide replies are to go, -but you can change the behavior to suit your needs by fiddling with the -@code{message-wide-reply-to-function}. It is used in the same way as -@code{message-reply-to-function} (@pxref{Reply}). - -@findex message-dont-reply-to-names -Addresses that match the @code{message-dont-reply-to-names} regular -expression will be removed from the @code{Cc} header. - - -@node Followup -@section Followup - -@findex message-followup -The @code{message-followup} command pops up a message buffer that's a -followup to the message in the current buffer. - -@vindex message-followup-to-function -Message uses the normal methods to determine where followups are to go, -but you can change the behavior to suit your needs by fiddling with the -@code{message-followup-to-function}. It is used in the same way as -@code{message-reply-to-function} (@pxref{Reply}). - -@vindex message-use-followup-to -The @code{message-use-followup-to} variable says what to do about -@code{Followup-To} headers. If it is @code{use}, always use the value. -If it is @code{ask} (which is the default), ask whether to use the -value. If it is @code{t}, use the value unless it is @samp{poster}. If -it is @code{nil}, don't use the value. - - -@node Canceling News -@section Canceling News - -@findex message-cancel-news -The @code{message-cancel-news} command cancels the article in the -current buffer. - - -@node Superseding -@section Superseding - -@findex message-supersede -The @code{message-supersede} command pops up a message buffer that will -supersede the message in the current buffer. - -@vindex message-ignored-supersedes-headers -Headers matching the @code{message-ignored-supersedes-headers} are -removed before popping up the new message buffer. The default is@* -@samp{^Path:\\|^Date\\|^NNTP-Posting-Host:\\|^Xref:\\|^Lines:\\|@* -^Received:\\|^X-From-Line:\\|Return-Path:\\|^Supersedes:}. - - - -@node Forwarding -@section Forwarding - -@findex message-forward -The @code{message-forward} command pops up a message buffer to forward -the message in the current buffer. If given a prefix, forward using -news. - -@table @code -@item message-forward-ignored-headers -@vindex message-forward-ignored-headers -All headers that match this regexp will be deleted when forwarding a message. - -@item message-make-forward-subject-function -@vindex message-make-forward-subject-function -A list of functions that are called to generate a subject header for -forwarded messages. The subject generated by the previous function is -passed into each successive function. - -The provided functions are: - -@table @code -@item message-forward-subject-author-subject -@findex message-forward-subject-author-subject -Source of article (author or newsgroup), in brackets followed by the -subject. - -@item message-forward-subject-fwd -Subject of article with @samp{Fwd:} prepended to it. -@end table - -@item message-wash-forwarded-subjects -@vindex message-wash-forwarded-subjects -If this variable is @code{t}, the subjects of forwarded messages have -the evidence of previous forwards (such as @samp{Fwd:}, @samp{Re:}, -@samp{(fwd)}) removed before the new subject is -constructed. The default value is @code{nil}. - -@item message-forward-as-mime -@vindex message-forward-as-mime -If this variable is @code{t} (the default), forwarded messages are -included as inline MIME RFC822 parts. If it's @code{nil}, forwarded -messages will just be copied inline to the new message, like previous, -non MIME-savvy versions of gnus would do. -@end table - - -@node Resending -@section Resending - -@findex message-resend -The @code{message-resend} command will prompt the user for an address -and resend the message in the current buffer to that address. - -@vindex message-ignored-resent-headers -Headers that match the @code{message-ignored-resent-headers} regexp will -be removed before sending the message. The default is -@samp{^Return-receipt}. - - -@node Bouncing -@section Bouncing - -@findex message-bounce -The @code{message-bounce} command will, if the current buffer contains a -bounced mail message, pop up a message buffer stripped of the bounce -information. A @dfn{bounced message} is typically a mail you've sent -out that has been returned by some @code{mailer-daemon} as -undeliverable. - -@vindex message-ignored-bounced-headers -Headers that match the @code{message-ignored-bounced-headers} regexp -will be removed before popping up the buffer. The default is -@samp{^\\(Received\\|Return-Path\\):}. - - -@node Commands -@chapter Commands - -@menu -* Buffer Entry:: Commands after entering a Message buffer. -* Header Commands:: Commands for moving to headers. -* Movement:: Moving around in message buffers. -* Insertion:: Inserting things into message buffers. -* MIME:: @sc{mime} considerations. -* Security:: Signing and encrypting messages. -* Various Commands:: Various things. -* Sending:: Actually sending the message. -* Mail Aliases:: How to use mail aliases. -* Spelling:: Having Emacs check your spelling. -@end menu - - -@node Buffer Entry -@section Buffer Entry -@cindex undo -@kindex C-_ - -You most often end up in a Message buffer when responding to some other -message of some sort. Message does lots of handling of quoted text, and -may remove signatures, reformat the text, or the like---depending on -which used settings you're using. Message usually gets things right, -but sometimes it stumbles. To help the user unwind these stumblings, -Message sets the undo boundary before each major automatic action it -takes. If you press the undo key (usually located at @kbd{C-_}) a few -times, you will get back the un-edited message you're responding to. - - -@node Header Commands -@section Header Commands - -All these commands move to the header in question. If it doesn't exist, -it will be inserted. - -@table @kbd - -@item C-c ? -@kindex C-c ? -@findex message-goto-to -Describe the message mode. - -@item C-c C-f C-t -@kindex C-c C-f C-t -@findex message-goto-to -Go to the @code{To} header (@code{message-goto-to}). - -@item C-c C-f C-b -@kindex C-c C-f C-b -@findex message-goto-bcc -Go to the @code{Bcc} header (@code{message-goto-bcc}). - -@item C-c C-f C-f -@kindex C-c C-f C-f -@findex message-goto-fcc -Go to the @code{Fcc} header (@code{message-goto-fcc}). - -@item C-c C-f C-c -@kindex C-c C-f C-c -@findex message-goto-cc -Go to the @code{Cc} header (@code{message-goto-cc}). - -@item C-c C-f C-s -@kindex C-c C-f C-s -@findex message-goto-subject -Go to the @code{Subject} header (@code{message-goto-subject}). - -@item C-c C-f C-r -@kindex C-c C-f C-r -@findex message-goto-reply-to -Go to the @code{Reply-To} header (@code{message-goto-reply-to}). - -@item C-c C-f C-n -@kindex C-c C-f C-n -@findex message-goto-newsgroups -Go to the @code{Newsgroups} header (@code{message-goto-newsgroups}). - -@item C-c C-f C-d -@kindex C-c C-f C-d -@findex message-goto-distribution -Go to the @code{Distribution} header (@code{message-goto-distribution}). - -@item C-c C-f C-o -@kindex C-c C-f C-o -@findex message-goto-followup-to -Go to the @code{Followup-To} header (@code{message-goto-followup-to}). - -@item C-c C-f C-k -@kindex C-c C-f C-k -@findex message-goto-keywords -Go to the @code{Keywords} header (@code{message-goto-keywords}). - -@item C-c C-f C-u -@kindex C-c C-f C-u -@findex message-goto-summary -Go to the @code{Summary} header (@code{message-goto-summary}). - -@end table - - -@node Movement -@section Movement - -@table @kbd -@item C-c C-b -@kindex C-c C-b -@findex message-goto-body -Move to the beginning of the body of the message -(@code{message-goto-body}). - -@item C-c C-i -@kindex C-c C-i -@findex message-goto-signature -Move to the signature of the message (@code{message-goto-signature}). - -@end table - - -@node Insertion -@section Insertion - -@table @kbd - -@item C-c C-y -@kindex C-c C-y -@findex message-yank-original -Yank the message in the buffer @code{gnus-article-copy} into the message -buffer. Normally @code{gnus-article-copy} is what you are replying to -(@code{message-yank-original}). - -@item C-c M-C-y -@kindex C-c M-C-y -@findex message-yank-buffer -Prompt for a buffer name and yank the contents of that buffer into the -message buffer (@code{message-yank-buffer}). - -@item C-c C-q -@kindex C-c C-q -@findex message-fill-yanked-message -Fill the yanked message (@code{message-fill-yanked-message}). Warning: -Can severely mess up the yanked text if its quoting conventions are -strange. You'll quickly get a feel for when it's safe, though. Anyway, -just remember that @kbd{C-x u} (@code{undo}) is available and you'll be -all right. - -@item C-c C-w -@kindex C-c C-w -@findex message-insert-signature -Insert a signature at the end of the buffer -(@code{message-insert-signature}). - -@item C-c M-h -@kindex C-c M-h -@findex message-insert-headers -Insert the message headers (@code{message-insert-headers}). - -@end table - -@table @code -@item message-ignored-cited-headers -@vindex message-ignored-cited-headers -All headers that match this regexp will be removed from yanked -messages. The default is @samp{.}, which means that all headers will be -removed. - -@item message-cite-prefix-regexp -@vindex message-cite-prefix-regexp -Regexp matching the longest possible citation prefix on a line. - -@item message-citation-line-function -@vindex message-citation-line-function -@cindex attribution line -Function called to insert the citation line. The default is -@code{message-insert-citation-line}, which will lead to citation lines -that look like: - -@example -Hallvard B Furuseth writes: -@end example - -Point will be at the beginning of the body of the message when this -function is called. - -Note that Gnus provides a feature where clicking on `writes:' hides the -cited text. If you change the citation line too much, readers of your -messages will have to adjust their Gnus, too. See the variable -@code{gnus-cite-attribution-suffix}. @xref{Article Highlighting, , -Article Highlighting, gnus}, for details. - -@item message-yank-prefix -@vindex message-yank-prefix -@cindex yanking -@cindex quoting -When you are replying to or following up an article, you normally want -to quote the person you are answering. Inserting quoted text is done -by @dfn{yanking}, and each quoted line you yank (except earlier -quotes, see @code{message-yank-cited-prefix}) will have -@code{message-yank-prefix} prepended to it. The default is @samp{> }. - -@item message-yank-cited-prefix -@vindex message-yank-cited-prefix -@cindex yanking -@cindex cited -@cindex quoting -The @code{message-yank-prefix} prefix is not used on already cited -lines, instead the contents of this variable is used as yank prefix. -The default is @samp{>}. - -@item message-yank-add-new-references -@vindex message-yank-add-new-references -@cindex yanking -Non-@code{nil} means new IDs will be added to References field when an -article is yanked by the command @code{message-yank-original} -interactively. If it is a symbol @code{message-id-only}, only an ID -from Message-ID field is used, otherwise IDs extracted from References, -In-Reply-To and Message-ID fields are used. - -@item message-list-references-add-position -@vindex message-list-references-add-position -@cindex yanking -Integer value means position for adding to References field when an -article is yanked by the command @code{message-yank-original} -interactively. - -@item message-indentation-spaces -@vindex message-indentation-spaces -Number of spaces to indent yanked messages. - -@item message-cite-function -@vindex message-cite-function -@findex message-cite-original -@findex sc-cite-original -@findex message-cite-original-without-signature -@cindex Supercite -Function for citing an original message. The default is -@code{message-cite-original}, which simply inserts the original message -and prepends @samp{> } to each line. -@code{message-cite-original-without-signature} does the same, but elides -the signature. You can also set it to @code{sc-cite-original} to use -Supercite. - -@item message-suspend-font-lock-when-citing -@vindex message-suspend-font-lock-when-citing -If non-@code{nil}, suspend font-lock'ing while citing an original -message. Some lazy demand-driven fontification tools (or Emacs itself) -have a bug that they often miss a buffer to be fontified. It will -mostly occur when Emacs prompts user for any inputs in the minibuffer. -Setting this option to non-@code{nil} may help you to avoid unpleasant -errors even if it is an add-hoc expedient. - -@item message-indent-citation-function -@vindex message-indent-citation-function -Function for modifying a citation just inserted in the mail buffer. -This can also be a list of functions. Each function can find the -citation between @code{(point)} and @code{(mark t)}. And each function -should leave point and mark around the citation text as modified. - -@item message-signature -@vindex message-signature -String to be inserted at the end of the message buffer. If @code{t} -(which is the default), the @code{message-signature-file} file will be -inserted instead. If a function, the result from the function will be -used instead. If a form, the result from the form will be used instead. -If this variable is @code{nil}, no signature will be inserted at all. - -@item message-signature-file -@vindex message-signature-file -File containing the signature to be inserted at the end of the buffer. -The default is @samp{~/.signature}. - -@end table - -Note that RFC1036bis says that a signature should be preceded by the three -characters @samp{-- } on a line by themselves. This is to make it -easier for the recipient to automatically recognize and process the -signature. So don't remove those characters, even though you might feel -that they ruin your beautiful design, like, totally. - -Also note that no signature should be more than four lines long. -Including ASCII graphics is an efficient way to get everybody to believe -that you are silly and have nothing important to say. - - -@node MIME -@section MIME -@cindex MML -@cindex MIME -@cindex multipart -@cindex attachment - -Message is a @sc{mime}-compliant posting agent. The user generally -doesn't have to do anything to make the @sc{mime} happen---Message will -automatically add the @code{Content-Type} and -@code{Content-Transfer-Encoding} headers. - -The most typical thing users want to use the multipart things in -@sc{mime} for is to add ``attachments'' to mail they send out. This can -be done with the @code{C-c C-a} command, which will prompt for a file -name and a @sc{mime} type. - -You can also create arbitrarily complex multiparts using the MML -language (@pxref{Composing, , Composing, emacs-mime, The Emacs MIME -Manual}). - -@node Security -@section Security -@cindex Security -@cindex S/MIME -@cindex PGP/MIME -@cindex sign -@cindex encrypt - -Using the MML language, Message is able to create digitally signed and -digitally encrypted messages. Message (or rather MML) currently support -PGP/MIME and S/MIME. Instructing MML to perform security operations on -a MIME part is done using the @code{C-c C-m s} key map for signing and the -@code{C-c C-m c} key map for encryption, as follows. - -@table @kbd - -@item C-c C-m s s -@kindex C-c C-m s s -@findex mml-secure-sign-smime - -Digitally sign current MIME part using S/MIME. - -@item C-c C-m s p -@kindex C-c C-m s p -@findex mml-secure-sign-pgp - -Digitally sign current MIME part using PGP/MIME. - -@item C-c C-m c s -@kindex C-c C-m c s -@findex mml-secure-encrypt-smime - -Digitally encrypt current MIME part using S/MIME. - -@item C-c C-m c p -@kindex C-c C-m c p -@findex mml-secure-encrypt-pgpmime - -Digitally encrypt current MIME part using PGP/MIME. - -@end table - -These commands do not immediately sign or encrypt the message, they -merely insert proper MML tags to instruct the MML engine to perform that -operation when the message is actually sent. They may perform other -operations too, such as locating and retrieving a S/MIME certificate of -the person you wish to send encrypted mail to. - -Since signing and especially encryption often is used when sensitive -information is sent, you may want to have some way to ensure that your -mail is actually signed or encrypted. After invoking the above -sign/encrypt commands, it is possible to preview the raw article by -using @code{C-u C-m P} (@code{mml-preview}). Then you can verify that -your long rant about what your ex-significant other or whomever actually -did with that funny looking person at that strange party the other -night, actually will be sent encrypted. - -@emph{Note!} Neither PGP/MIME nor S/MIME encrypt/signs RFC822 headers. -They only operate on the MIME object. Keep this in mind before sending -mail with a sensitive Subject line. - -Actually using the security commands above is not very difficult. At -least not compared with making sure all involved programs talk with each -other properly. Thus, we now describe what external libraries or -programs are required to make things work, and some small general hints. - -@subsection Using S/MIME - -@emph{Note!} This section assume you have a basic familiarity with -modern cryptography, S/MIME, various PKCS standards, OpenSSL and so on. - -The S/MIME support in Message (and MML) require OpenSSL. OpenSSL -perform the actual S/MIME sign/encrypt operations. OpenSSL can be found -at @code{http://www.openssl.org/}. OpenSSL 0.9.6 and later should work. -Version 0.9.5a cannot extract mail addresses from certificates, and it -insert a spurious CR character into MIME separators so you may wish to -avoid it if you would like to avoid being regarded as someone who send -strange mail. (Although by sending S/MIME messages you've probably -already lost that contest.) - -To be able to send encrypted mail, a personal certificate is not -required. Message (MML) need a certificate for the person to whom you -wish to communicate with though. You're asked for this when you type -@code{C-c C-m c s}. Currently there are two ways to retrieve this -certificate, from a local file or from DNS. If you chose a local file, -it need to contain a X.509 certificate in PEM format. If you chose DNS, -you're asked for the domain name where the certificate is stored, the -default is a good guess. To my belief, Message (MML) is the first mail -agent in the world to support retrieving S/MIME certificates from DNS, -so you're not likely to find very many certificates out there. At least -there should be one, stored at the domain @code{simon.josefsson.org}. -LDAP is a more popular method of distributing certificates, support for -it is planned. (Meanwhile, you can use @code{ldapsearch} from the -command line to retrieve a certificate into a file and use it.) - -As for signing messages, OpenSSL can't perform signing operations -without some kind of configuration. Especially, you need to tell it -where your private key and your certificate is stored. MML uses an -Emacs interface to OpenSSL, aptly named @code{smime.el}, and it contain -a @code{custom} group used for this configuration. So, try @code{M-x -customize-group RET smime RET} and look around. - -Currently there is no support for talking to a CA (or RA) to create your -own certificate. None is planned either. You need to do this manually -with OpenSSL or using some other program. I used Netscape and got a -free S/MIME certificate from one of the big CA's on the net. Netscape -is able to export your private key and certificate in PKCS #12 format. -Use OpenSSL to convert this into a plain X.509 certificate in PEM format -as follows. - -@example -$ openssl pkcs12 -in ns.p12 -clcerts -nodes > key+cert.pem -@end example - -The @code{key+cert.pem} file should be pointed to from the -@code{smime-keys} variable. You should now be able to send signed mail. - -@emph{Note!} Your private key is store unencrypted in the file, so take -care in handling it. - -@subsection Using PGP/MIME - -PGP/MIME requires an external OpenPGP implementation, such as GNU -Privacy Guard (@code{http://www.gnupg.org/}). It also requires an Emacs -interface to it, such as Mailcrypt (available from -@code{http://www.nb.net/~lbudney/linux/software/mailcrypt.html}) or -Florian Weimer's @code{gpg.el}. - -Creating your own OpenPGP key is described in detail in the -documentation of your OpenPGP implementation, so we refer to it. - -@node Various Commands -@section Various Commands - -@table @kbd - -@item C-c C-r -@kindex C-c C-r -@findex message-caesar-buffer-body -Caesar rotate (aka. rot13) the current message -(@code{message-caesar-buffer-body}). If narrowing is in effect, just -rotate the visible portion of the buffer. A numerical prefix says how -many places to rotate the text. The default is 13. - -@item C-c C-e -@kindex C-c C-e -@findex message-elide-region -Elide the text between point and mark (@code{message-elide-region}). -The text is killed and replaced with the contents of the variable -@code{message-elide-ellipsis}. The default value is to use an ellipsis -(@samp{[...]}). - -@item C-c C-z -@kindex C-c C-x -@findex message-kill-to-signature -Kill all the text up to the signature, or if that's missing, up to the -end of the message (@code{message-kill-to-signature}). - -@item C-c C-v -@kindex C-c C-v -@findex message-delete-not-region -Delete all text in the body of the message that is outside the region -(@code{message-delete-not-region}). - -@item M-RET -@kindex M-RET -@kindex message-newline-and-reformat -Insert four newlines, and then reformat if inside quoted text. - -Here's an example: - -@example -> This is some quoted text. And here's more quoted text. -@end example - -If point is before @samp{And} and you press @kbd{M-RET}, you'll get: - -@example -> This is some quoted text. - -* - -> And here's more quoted text. -@end example - -@samp{*} says where point will be placed. - -@item C-c C-t -@kindex C-c C-t -@findex message-insert-to -Insert a @code{To} header that contains the @code{Reply-To} or -@code{From} header of the message you're following up -(@code{message-insert-to}). - -@item C-c C-n -@kindex C-c C-n -@findex message-insert-newsgroups -Insert a @code{Newsgroups} header that reflects the @code{Followup-To} -or @code{Newsgroups} header of the article you're replying to -(@code{message-insert-newsgroups}). - -@item C-c M-r -@kindex C-c M-r -@findex message-rename-buffer -Rename the buffer (@code{message-rename-buffer}). If given a prefix, -prompt for a new buffer name. - -@end table - - -@node Sending -@section Sending - -@table @kbd -@item C-c C-c -@kindex C-c C-c -@findex message-send-and-exit -Send the message and bury the current buffer -(@code{message-send-and-exit}). - -@item C-c C-s -@kindex C-c C-s -@findex message-send -Send the message (@code{message-send}). - -@item C-c C-d -@kindex C-c C-d -@findex message-dont-send -Bury the message buffer and exit (@code{message-dont-send}). - -@item C-c C-k -@kindex C-c C-k -@findex message-kill-buffer -Kill the message buffer and exit (@code{message-kill-buffer}). - -@end table - - - -@node Mail Aliases -@section Mail Aliases -@cindex mail aliases -@cindex aliases - -@vindex message-mail-alias-type -The @code{message-mail-alias-type} variable controls what type of mail -alias expansion to use. Currently only one form is supported---Message -uses @code{mailabbrev} to handle mail aliases. If this variable is -@code{nil}, no mail alias expansion will be performed. - -@code{mailabbrev} works by parsing the @file{/etc/mailrc} and -@file{~/.mailrc} files. These files look like: - -@example -alias lmi "Lars Magne Ingebrigtsen " -alias ding "ding@@ifi.uio.no (ding mailing list)" -@end example - -After adding lines like this to your @file{~/.mailrc} file, you should -be able to just write @samp{lmi} in the @code{To} or @code{Cc} (and so -on) headers and press @kbd{SPC} to expand the alias. - -No expansion will be performed upon sending of the message---all -expansions have to be done explicitly. - - -@node Spelling -@section Spelling -@cindex spelling -@findex ispell-message - -There are two popular ways to have Emacs spell-check your messages: -@code{ispell} and @code{flyspell}. @code{ispell} is the older and -probably more popular package. You typically first write the message, -and then run the entire thing through @code{ispell} and fix all the -typos. To have this happen automatically when you send a message, put -something like the following in your @file{.emacs} file: - -@lisp -(add-hook 'message-send-hook 'ispell-message) -@end lisp - -@vindex ispell-message-dictionary-alist -If you're in the habit of writing in different languages, this can be -controlled by the @code{ispell-message-dictionary-alist} variable: - -@lisp -(setq ispell-message-dictionary-alist - '(("^Newsgroups:.*\\bde\\." . "deutsch8") - (".*" . "default"))) -@end lisp - -@code{ispell} depends on having the external @samp{ispell} command -installed. - -The other popular method is using @code{flyspell}. This package checks -your spelling while you're writing, and marks any mis-spelled words in -various ways. - -To use @code{flyspell}, put something like the following in your -@file{.emacs} file: - -@lisp -(defun my-message-setup-routine () - (flyspell-mode 1)) -(add-hook 'message-setup-hook 'my-message-setup-routine) -@end lisp - -@code{flyspell} depends on having the external @samp{ispell} command -installed. - - -@node Variables -@chapter Variables - -@menu -* Message Headers:: General message header stuff. -* Mail Headers:: Customizing mail headers. -* Mail Variables:: Other mail variables. -* News Headers:: Customizing news headers. -* News Variables:: Other news variables. -* Various Message Variables:: Other message variables. -* Sending Variables:: Variables for sending. -* Message Buffers:: How Message names its buffers. -* Message Actions:: Actions to be performed when exiting. -@end menu - - -@node Message Headers -@section Message Headers - -Message is quite aggressive on the message generation front. It has to -be -- it's a combined news and mail agent. To be able to send combined -messages, it has to generate all headers itself (instead of letting the -mail/news system do it) to ensure that mail and news copies of messages -look sufficiently similar. - -@table @code - -@item message-generate-headers-first -@vindex message-generate-headers-first -If non-@code{nil}, generate all required headers before starting to -compose the message. - -The variables @code{message-required-mail-headers} and -@code{message-required-news-headers} specify which headers are required. - -Note that some headers will be removed and re-generated before posting, -because of the variable @code{message-deletable-headers} (see below). - -@item message-from-style -@vindex message-from-style -Specifies how @code{From} headers should look. There are four valid -values: - -@table @code -@item nil -Just the address -- @samp{king@@grassland.com}. - -@item parens -@samp{king@@grassland.com (Elvis Parsley)}. - -@item angles -@samp{Elvis Parsley }. - -@item default -Look like @code{angles} if that doesn't require quoting, and -@code{parens} if it does. If even @code{parens} requires quoting, use -@code{angles} anyway. - -@end table - -@item message-deletable-headers -@vindex message-deletable-headers -Headers in this list that were previously generated by Message will be -deleted before posting. Let's say you post an article. Then you decide -to post it again to some other group, you naughty boy, so you jump back -to the @code{*post-buf*} buffer, edit the @code{Newsgroups} line, and -ship it off again. By default, this variable makes sure that the old -generated @code{Message-ID} is deleted, and a new one generated. If -this isn't done, the entire empire would probably crumble, anarchy would -prevail, and cats would start walking on two legs and rule the world. -Allegedly. - -@item message-default-headers -@vindex message-default-headers -This string is inserted at the end of the headers in all message -buffers. - -@item message-subject-re-regexp -@vindex message-subject-re-regexp -Responses to messages have subjects that start with @samp{Re: }. This -is @emph{not} an abbreviation of the English word ``response'', but is -Latin, and means ``in response to''. Some illiterate nincompoops have -failed to grasp this fact, and have ``internationalized'' their software -to use abonimations like @samp{Aw: } (``antwort'') or @samp{Sv: } -(``svar'') instead, which is meaningless and evil. However, you may -have to deal with users that use these evil tools, in which case you may -set this variable to a regexp that matches these prefixes. Myself, I -just throw away non-compliant mail. - -@item message-alternative-emails -@vindex message-alternative-emails -A regexp to match the alternative email addresses. The first matched -address (not primary one) is used in the @code{From} field. - -@end table - - -@node Mail Headers -@section Mail Headers - -@table @code -@item message-required-mail-headers -@vindex message-required-mail-headers -@xref{News Headers}, for the syntax of this variable. It is -@code{(From Date Subject (optional . In-Reply-To) Message-ID Lines -(optional . User-Agent))} by default. - -@item message-ignored-mail-headers -@vindex message-ignored-mail-headers -Regexp of headers to be removed before mailing. The default is -@samp{^[GF]cc:\\|^Resent-Fcc:\\|^Xref:\\|^X-Draft-From:}. - -@item message-default-mail-headers -@vindex message-default-mail-headers -This string is inserted at the end of the headers in all message -buffers that are initialized as mail. - -@end table - - -@node Mail Variables -@section Mail Variables - -@table @code -@item message-send-mail-function -@vindex message-send-mail-function -@findex message-send-mail-with-sendmail -@findex message-send-mail-with-mh -@findex message-send-mail-with-qmail -@findex smtpmail-send-it -@findex feedmail-send-it -Function used to send the current buffer as mail. The default is -@code{message-send-mail-with-sendmail}. Other valid values include -@code{message-send-mail-with-mh}, @code{message-send-mail-with-qmail}, -@code{smtpmail-send-it} and @code{feedmail-send-it}. - -@item message-mh-deletable-headers -@vindex message-mh-deletable-headers -Most versions of MH doesn't like being fed messages that contain the -headers in this variable. If this variable is non-@code{nil} (which is -the default), these headers will be removed before mailing when sending -messages via MH. Set it to @code{nil} if your MH can handle these -headers. - -@item message-send-mail-partially-limit -@vindex message-send-mail-partially-limit -The limitation of messages sent as message/partial. -The lower bound of message size in characters, beyond which the message -should be sent in several parts. If it is nil, the size is unlimited. - -@end table - - -@node News Headers -@section News Headers - -@vindex message-required-news-headers -@code{message-required-news-headers} a list of header symbols. These -headers will either be automatically generated, or, if that's -impossible, they will be prompted for. The following symbols are valid: - -@table @code - -@item From -@cindex From -@findex user-full-name -@findex user-mail-address -This required header will be filled out with the result of the -@code{message-make-from} function, which depends on the -@code{message-from-style}, @code{user-full-name}, -@code{user-mail-address} variables. - -@item Subject -@cindex Subject -This required header will be prompted for if not present already. - -@item Newsgroups -@cindex Newsgroups -This required header says which newsgroups the article is to be posted -to. If it isn't present already, it will be prompted for. - -@item Organization -@cindex organization -This optional header will be filled out depending on the -@code{message-user-organization} variable. -@code{message-user-organization-file} will be used if this variable is -@code{t}. This variable can also be a string (in which case this string -will be used), or it can be a function (which will be called with no -parameters and should return a string to be used). - -@item Lines -@cindex Lines -This optional header will be computed by Message. - -@item Message-ID -@cindex Message-ID -@vindex mail-host-address -@findex system-name -@cindex Sun -This required header will be generated by Message. A unique ID will be -created based on the date, time, user name and system name. Message -will use @code{system-name} to determine the name of the system. If -this isn't a fully qualified domain name (FQDN), Message will use -@code{mail-host-address} as the FQDN of the machine. - -@item User-Agent -@cindex User-Agent -This optional header will be filled out according to the -@code{message-newsreader} local variable. - -@item In-Reply-To -This optional header is filled out using the @code{Date} and @code{From} -header of the article being replied to. - -@item Expires -@cindex Expires -This extremely optional header will be inserted according to the -@code{message-expires} variable. It is highly deprecated and shouldn't -be used unless you know what you're doing. - -@item Distribution -@cindex Distribution -This optional header is filled out according to the -@code{message-distribution-function} variable. It is a deprecated and -much misunderstood header. - -@item Path -@cindex path -This extremely optional header should probably never be used. -However, some @emph{very} old servers require that this header is -present. @code{message-user-path} further controls how this -@code{Path} header is to look. If it is @code{nil}, use the server name -as the leaf node. If it is a string, use the string. If it is neither -a string nor @code{nil}, use the user name only. However, it is highly -unlikely that you should need to fiddle with this variable at all. -@end table - -@findex yow -@cindex Mime-Version -In addition, you can enter conses into this list. The car of this cons -should be a symbol. This symbol's name is the name of the header, and -the cdr can either be a string to be entered verbatim as the value of -this header, or it can be a function to be called. This function should -return a string to be inserted. For instance, if you want to insert -@code{Mime-Version: 1.0}, you should enter @code{(Mime-Version . "1.0")} -into the list. If you want to insert a funny quote, you could enter -something like @code{(X-Yow . yow)} into the list. The function -@code{yow} will then be called without any arguments. - -If the list contains a cons where the car of the cons is -@code{optional}, the cdr of this cons will only be inserted if it is -non-@code{nil}. - -Other variables for customizing outgoing news articles: - -@table @code - -@item message-syntax-checks -@vindex message-syntax-checks -Controls what syntax checks should not be performed on outgoing posts. -To disable checking of long signatures, for instance, add - -@lisp -(signature . disabled) -@end lisp - -to this list. - -Valid checks are: - -@table @code -@item subject-cmsg -Check the subject for commands. -@item sender -@cindex Sender -Insert a new @code{Sender} header if the @code{From} header looks odd. -@item multiple-headers -Check for the existence of multiple equal headers. -@item sendsys -@cindex sendsys -Check for the existence of version and sendsys commands. -@item message-id -Check whether the @code{Message-ID} looks ok. -@item from -Check whether the @code{From} header seems nice. -@item long-lines -@cindex long lines -Check for too long lines. -@item control-chars -Check for invalid characters. -@item size -Check for excessive size. -@item new-text -Check whether there is any new text in the messages. -@item signature -Check the length of the signature. -@item approved -@cindex approved -Check whether the article has an @code{Approved} header, which is -something only moderators should include. -@item empty -Check whether the article is empty. -@item invisible-text -Check whether there is any invisible text in the buffer. -@item empty-headers -Check whether any of the headers are empty. -@item existing-newsgroups -Check whether the newsgroups mentioned in the @code{Newsgroups} and -@code{Followup-To} headers exist. -@item valid-newsgroups -Check whether the @code{Newsgroups} and @code{Followup-to} headers -are valid syntactically. -@item repeated-newsgroups -Check whether the @code{Newsgroups} and @code{Followup-to} headers -contains repeated group names. -@item shorten-followup-to -Check whether to add a @code{Followup-to} header to shorten the number -of groups to post to. -@end table - -All these conditions are checked by default. - -@item message-ignored-news-headers -@vindex message-ignored-news-headers -Regexp of headers to be removed before posting. The default is@* -@samp{^NNTP-Posting-Host:\\|^Xref:\\|^[BGF]cc:\\|^Resent-Fcc:\\|^X-Draft-From:}. - -@item message-default-news-headers -@vindex message-default-news-headers -This string is inserted at the end of the headers in all message -buffers that are initialized as news. - -@end table - - -@node News Variables -@section News Variables - -@table @code -@item message-send-news-function -@vindex message-send-news-function -Function used to send the current buffer as news. The default is -@code{message-send-news}. - -@item message-post-method -@vindex message-post-method -Gnusish @dfn{select method} (see the Gnus manual for details) used for -posting a prepared news message. - -@end table - - -@node Various Message Variables -@section Various Message Variables - -@table @code -@item message-default-charset -@vindex message-default-charset -@cindex charset -Symbol naming a @sc{mime} charset. Non-ASCII characters in messages are -assumed to be encoded using this charset. The default is @code{nil}, -which means ask the user. (This variable is used only on non-@sc{mule} -Emacsen. -@xref{Charset Translation, , Charset Translation, emacs-mime, - Emacs MIME Manual}, for details on the @sc{mule}-to-@sc{mime} -translation process. - -@item message-signature-separator -@vindex message-signature-separator -Regexp matching the signature separator. It is @samp{^-- *$} by -default. - -@item mail-header-separator -@vindex mail-header-separator -String used to separate the headers from the body. It is @samp{--text -follows this line--} by default. - -@item message-directory -@vindex message-directory -Directory used by many mailey things. The default is @file{~/Mail/}. - -@item message-signature-setup-hook -@vindex message-signature-setup-hook -Hook run when initializing the message buffer. It is run after the -headers have been inserted but before the signature has been inserted. - -@item message-setup-hook -@vindex message-setup-hook -Hook run as the last thing when the message buffer has been initialized, -but before yanked text is inserted. - -@item message-header-setup-hook -@vindex message-header-setup-hook -Hook called narrowed to the headers after initializing the headers. - -For instance, if you're running Gnus and wish to insert a -@samp{Mail-Copies-To} header in all your news articles and all messages -you send to mailing lists, you could do something like the following: - -@lisp -(defun my-message-header-setup-hook () - (let ((group (or gnus-newsgroup-name ""))) - (when (or (message-fetch-field "newsgroups") - (gnus-group-find-parameter group 'to-address) - (gnus-group-find-parameter group 'to-list)) - (insert "Mail-Copies-To: never\n")))) - -(add-hook 'message-header-setup-hook - 'my-message-header-setup-hook) -@end lisp - -@item message-send-hook -@vindex message-send-hook -Hook run before sending messages. - -If you want to add certain headers before sending, you can use the -@code{message-add-header} function in this hook. For instance: -@findex message-add-header - -@lisp -(add-hook 'message-send-hook 'my-message-add-content) -(defun my-message-add-content () - (message-add-header "X-In-No-Sense: Nonsense") - (message-add-header "X-Whatever: no")) -@end lisp - -This function won't add the header if the header is already present. - -@item message-send-mail-hook -@vindex message-send-mail-hook -Hook run before sending mail messages. - -@item message-send-news-hook -@vindex message-send-news-hook -Hook run before sending news messages. - -@item message-sent-hook -@vindex message-sent-hook -Hook run after sending messages. - -@item message-mode-syntax-table -@vindex message-mode-syntax-table -Syntax table used in message mode buffers. - -@item message-send-method-alist -@vindex message-send-method-alist - -Alist of ways to send outgoing messages. Each element has the form - -@lisp -(TYPE PREDICATE FUNCTION) -@end lisp - -@table @var -@item type -A symbol that names the method. - -@item predicate -A function called without any parameters to determine whether the -message is a message of type @var{type}. - -@item function -A function to be called if @var{predicate} returns non-@code{nil}. -@var{function} is called with one parameter -- the prefix. -@end table - -@lisp -((news message-news-p message-send-via-news) - (mail message-mail-p message-send-via-mail)) -@end lisp - - - -@end table - - - -@node Sending Variables -@section Sending Variables - -@table @code - -@item message-fcc-handler-function -@vindex message-fcc-handler-function -A function called to save outgoing articles. This function will be -called with the name of the file to store the article in. The default -function is @code{message-output} which saves in Unix mailbox format. - -@item message-courtesy-message -@vindex message-courtesy-message -When sending combined messages, this string is inserted at the start of -the mailed copy. If the string contains the format spec @samp{%s}, the -newsgroups the article has been posted to will be inserted there. If -this variable is @code{nil}, no such courtesy message will be added. -The default value is @samp{"The following message is a courtesy copy of -an article\nthat has been posted to %s as well.\n\n"}. - -@end table - - -@node Message Buffers -@section Message Buffers - -Message will generate new buffers with unique buffer names when you -request a message buffer. When you send the message, the buffer isn't -normally killed off. Its name is changed and a certain number of old -message buffers are kept alive. - -@table @code -@item message-generate-new-buffers -@vindex message-generate-new-buffers -If non-@code{nil}, generate new buffers. The default is @code{t}. If -this is a function, call that function with three parameters: The type, -the to address and the group name. (Any of these may be @code{nil}.) -The function should return the new buffer name. - -@item message-use-multi-frames -@vindex message-use-multi-frames -If non-@code{nil}, generate new frames. The default is @code{nil}. - -@item message-delete-frame-on-exit -@vindex message-delete-frame-on-exit -The @code{message-delete-frame-on-exit} variable says whether to delete -the frame after sending the message or killing the message buffer. If it -is @code{nil} (which is the default), don't delete the frame. If it is -@code{ask}, ask wheter to delete the frame. If it is @code{t}, always -delete the frame. - -@item message-max-buffers -@vindex message-max-buffers -This variable says how many old message buffers to keep. If there are -more message buffers than this, the oldest buffer will be killed. The -default is 10. If this variable is @code{nil}, no old message buffers -will ever be killed. - -@item message-send-rename-function -@vindex message-send-rename-function -After sending a message, the buffer is renamed from, for instance, -@samp{*reply to Lars*} to @samp{*sent reply to Lars*}. If you don't -like this, set this variable to a function that renames the buffer in a -manner you like. If you don't want to rename the buffer at all, you can -say: - -@lisp -(setq message-send-rename-function 'ignore) -@end lisp - -@item message-kill-buffer-on-exit -@findex message-kill-buffer-on-exit -If non-@code{nil}, kill the buffer immediately on exit. - -@end table - - -@node Message Actions -@section Message Actions - -When Message is being used from a news/mail reader, the reader is likely -to want to perform some task after the message has been sent. Perhaps -return to the previous window configuration or mark an article as -replied. - -@vindex message-kill-actions -@vindex message-postpone-actions -@vindex message-exit-actions -@vindex message-send-actions -The user may exit from the message buffer in various ways. The most -common is @kbd{C-c C-c}, which sends the message and exits. Other -possibilities are @kbd{C-c C-s} which just sends the message, @kbd{C-c -C-d} which postpones the message editing and buries the message buffer, -and @kbd{C-c C-k} which kills the message buffer. Each of these actions -have lists associated with them that contains actions to be executed: -@code{message-send-actions}, @code{message-exit-actions}, -@code{message-postpone-actions}, and @code{message-kill-actions}. - -Message provides a function to interface with these lists: -@code{message-add-action}. The first parameter is the action to be -added, and the rest of the arguments are which lists to add this action -to. Here's an example from Gnus: - -@lisp - (message-add-action - `(set-window-configuration ,(current-window-configuration)) - 'exit 'postpone 'kill) -@end lisp - -This restores the Gnus window configuration when the message buffer is -killed, postponed or exited. - -An @dfn{action} can be either: a normal function, or a list where the -@code{car} is a function and the @code{cdr} is the list of arguments, or -a form to be @code{eval}ed. - - -@node Compatibility -@chapter Compatibility -@cindex compatibility - -Message uses virtually only its own variables---older @code{mail-} -variables aren't consulted. To force Message to take those variables -into account, you can put the following in your @code{.emacs} file: - -@lisp -(require 'messcompat) -@end lisp - -This will initialize many Message variables from the values in the -corresponding mail variables. - - -@node Appendices -@chapter Appendices - -@menu -* Responses:: Standard rules for determining where responses go. -@end menu - - -@node Responses -@section Responses - -To determine where a message is to go, the following algorithm is used -by default. - -@table @dfn -@item reply -A @dfn{reply} is when you want to respond @emph{just} to the person who -sent the message via mail. There will only be one recipient. To -determine who the recipient will be, the following headers are -consulted, in turn: - -@table @code -@item Reply-To - -@item From -@end table - - -@item wide reply -A @dfn{wide reply} is a mail response that includes @emph{all} entities -mentioned in the message you are responded to. All mailboxes from the -following headers will be concatenated to form the outgoing -@code{To}/@code{Cc} headers: - -@table @code -@item From -(unless there's a @code{Reply-To}, in which case that is used instead). - -@item Cc - -@item To -@end table - -If a @code{Mail-Copies-To} header is present, it will also be included -in the list of mailboxes. If this header is @samp{never}, that means -that the @code{From} (or @code{Reply-To}) mailbox will be suppressed. - - -@item followup -A @dfn{followup} is a response sent via news. The following headers -(listed in order of precedence) determine where the response is to be -sent: - -@table @code - -@item Followup-To - -@item Newsgroups - -@end table - -If a @code{Mail-Copies-To} header is present, it will be used as the -basis of the new @code{Cc} header, except if this header is -@samp{never}. - -@end table - - - -@node Index -@chapter Index -@printindex cp - -@node Key Index -@chapter Key Index -@printindex ky - -@summarycontents -@contents -@bye - -@c End: diff --git a/texi/pagestyle.sty b/texi/pagestyle.sty deleted file mode 100644 index ffd4529..0000000 --- a/texi/pagestyle.sty +++ /dev/null @@ -1,85 +0,0 @@ -\def\verbatim@font{\fontencoding{OT1}\fontfamily{pcr}\fontsize{10pt}{10}\selectfont} - -\catcode `\÷ = \active -\def ÷{\penalty10000\hskip0.001pt-\penalty\hyphenpenalty\hskip0.001pt\relax} - -\def \newpagestyle#1#2#3{\@namedef{ps@#1}{\def\@oddhead{#2}\def\@oddfoot{#3}% - \let\@evenhead\@oddhead \let\@evenfoot\@oddfoot}} -\def \newdoublepagestyle#1#2#3#4#5{\@namedef{ps@#1}{\def\@evenhead{#2}% - \def\@oddhead{#3}% - \def\@evenfoot{#4}% - \def\@oddfoot{#5}}} - -\newlength{\headtextwidth} -\setlength{\headtextwidth}{\textwidth} -\addtolength{\headtextwidth}{2cm} -\newlength{\headetextwidth} -\setlength{\headetextwidth}{\headtextwidth} -\addtolength{\headetextwidth}{-0.5cm} -\newlength{\headotextwidth} -\setlength{\headotextwidth}{\headtextwidth} -\addtolength{\headotextwidth}{-0.35cm} - -\def\outputpage{% - \let \protect \noexpand - \shipout \vbox{% - \set@typeset@protect - \aftergroup\set@typeset@protect - \@shipoutsetup - \@begindvi - \vskip \topmargin - \moveright\@themargin \vbox {% - \setbox\@tempboxa \vbox to\headheight{% - \vfil - \color@hbox - \normalcolor - \hb@xt@ \headtextwidth {% - \let \label \@gobble - \let \index \@gobble - \let \glossary \@gobble %% 21 Jun 91 - \@thehead - }% - \color@endbox - }% %% 22 Feb 87 - \ifodd\c@page - \dp\@tempboxa \z@ - \box\@tempboxa \mbox{} \\ - \ifx \@oddhead\@empty\else - % \rule{\headotextwidth}{0.5pt} - \fi - \else - \hskip -2.2cm - \dp\@tempboxa \z@ - \box\@tempboxa \mbox{} - \\\mbox{} - \vskip 2pt - \hskip -2.0cm - \ifx \@oddhead\@empty\else - % \rule{\headetextwidth}{0.5pt} - \fi - \fi - \vskip \headsep - \box\@outputbox - \baselineskip \footskip - \color@hbox - \normalcolor - \hb@xt@\textwidth{% - \let \label \@gobble - \let \index \@gobble %% 22 Feb 87 - \let \glossary \@gobble %% 21 Jun 91 - \@thefoot - }% - \color@endbox - }% - }% - \global \@colht \textheight - \stepcounter{page}% - \let\firstmark\botmark -} - -\def\@makechapterhead#1{\gnuspagechapter{#1}} - -\setcounter{tocdepth}{3} -\setcounter{secnumdepth}{3} - -\def\verbatim@font{\fontfamily{bcr}\fontsize{10pt}{10}\selectfont} diff --git a/texi/postamble.tex b/texi/postamble.tex deleted file mode 100644 index a7d0a5c..0000000 --- a/texi/postamble.tex +++ /dev/null @@ -1,46 +0,0 @@ -\gnuscleardoublepage - -\pagestyle{gnusindex} - -\renewcommand\indexname{Key Index} -\renewcommand{\gnuschaptername}{Key Index} -\input{gnus.kind} -\gnuscleardoublepage - -\renewcommand\indexname{Function and Variable Index} -\renewcommand{\gnuschaptername}{Function and Variable Index} -\input{gnus.gind} -\gnuscleardoublepage -\thispagestyle{empty} - -\renewcommand\indexname{Concept Index} -\renewcommand{\gnuschaptername}{Concept Index} -\input{gnus.cind} - -\mbox{} -%\thispagestyle{empty}\mbox{}\clearpage\thispagestyle{empty}\mbox{}\clearpage -\ifodd\count0\else\thispagestyle{empty}\clearpage\fi -\mbox{} -\thispagestyle{empty} -\vfill - -This manual was written by Lars Magne Ingebrigtsen (1968 --- ) who -resides in Oslo, Norway and poses as a student, but doesn't get much -studying done, for some strange reason or other. When not worshipping -at the altar of Emacs, he can often be found slouching on his couch -reading while bopping his head gently to some obscure music. He does -not have a cat. - -\marginpar[\vspace*{-2.5cm}\epsfig{figure=tmp/larsi.ps,height=2cm}]{\vspace*{-2.2cm}\epsfig{figure=tmp/larsi.ps,height=2.5cm}} - -Graphics by Luis Fernandes. Set in Adobe Bembo, Adobe Futura and -Bitstream Courier. - -\clearpage -\mbox{} -\thispagestyle{empty} -\begin{picture}(500,500)(0,0) -\put(-35,325){\makebox(480,350)[tr]{\epsfig{figure=tmp/new-herd-section.ps}}} -\end{picture} - -\end{document} diff --git a/texi/ps/gnus-big-logo.eps b/texi/ps/gnus-big-logo.eps deleted file mode 100644 index 88ea3b8..0000000 --- a/texi/ps/gnus-big-logo.eps +++ /dev/null @@ -1,213 +0,0 @@ -%!PS-Adobe-2.0 EPSF-1.2 -%%Creator: Adobe Illustrator 88(TM) format generated by CorelTRACE Version 2.0C -%%Title: /home/menja/c/larsi/rgnus/texi/ps/eegnu.eps -%%BoundingBox: 0 0 890.3 909.7 -%%CreationDate: Fri Oct 11 14:59:05 1996 -%%DocumentFonts: -%%ColorUsage: B & W -%%TileBox: 0 0 890.3 909.7 -%%EndComments -%%BeginProcSet:Adobe_Illustrator_1.1 0 0 -% Copyright 1992 Corel Corporation. - -% All rights reserved. -/wPSMDict 150 dict def -wPSMDict begin -/bd {bind def} bind def -/ld {load def} bd -/xd {exch def} bd -/_ null def -/$c 0 def -/$m 0 def -/$y 0 def -/$k 0 def -/$t 1 def -/$n _ def -/$o 0 def -/$C 0 def -/$M 0 def -/$Y 0 def -/$K 0 def -/$T 1 def -/$N _ def -/$O 0 def -/$h false def -/$al 0 def -/$tr 0 def -/$le 0 def -/$lx 0 def -/$ly 0 def -/$ctm matrix currentmatrix def -/@cp /closepath ld -/@gs /gsave ld -/@gr /grestore ld -/@MN {2 copy le{pop}{exch pop}ifelse}bd -/setcmykcolor where {pop}{/setcmykcolor{4 1 roll -3 {3 index add 1 @MN 1 exch sub 3 1 roll} repeat -setrgbcolor -pop}bd}ifelse -/@tc{dup 1 ge{pop}{4 {dup -6 -1 roll -mul -exch}repeat -pop}ifelse}bd -/@scc{$c $m $y $k $t @tc setcmykcolor true}bd -/@SCC{$C $M $Y $K $T @tc setcmykcolor true}bd -/@sm{/$ctm $ctm currentmatrix def}bd -/x {/$t xd /$n xd -/$k xd /$y xd /$m xd /$c xd}bd -/X {/$T xd /$N xd -/$K xd /$Y xd /$M xd /$C xd}bd -/g {1 exch sub 0 0 0 -4 -1 roll -_ 1 x}bd -/G {1 exch sub 0 0 0 -4 -1 roll -_ 1 X}bd -/k {_ 1 x}bd -/K {_ 1 X}bd -/d /setdash ld -/i {dup 0 ne {setflat} {pop} ifelse}bd -/j /setlinejoin ld -/J /setlinecap ld -/M /setmiterlimit ld -/w /setlinewidth ld -/O {/$o xd}bd -/R {/$O xd}bd -/c /curveto ld -/C /c ld -/l /lineto ld -/L /l ld -/m /moveto ld -/n /newpath ld -/N /newpath ld -/F {@scc{eofill}if n} bd -/f {@cp F}bd -/S {@SCC{stroke}if n} bd -/s {@cp -S}bd -/B {@gs F @gr -S}bd -/b {@cp B }bd -/u {}bd -/U {}bd -%%EndProlog -%%BeginSetup -%%EndSetup -1 i -2 J -0 j -4 M -[]0 d - -%%Note: traced as Normal_Outline -0 g -163.4 2.9 m -197.1 51.5 223.7 94.3 251.6 130.7 C -283.4 176.1 312.0 216.3 342.8 256.8 C -373.2 303.2 401.1 342.1 420.0 396.9 C -421.2 403.1 425.1 408.9 424.5 413.5 C -395.6 371.6 368.4 326.2 337.2 285.0 C -306.1 247.4 276.3 199.4 244.5 161.5 C -212.1 116.7 182.9 79.1 168.6 20.4 C -166.3 13.9 164.7 8.1 162.4 2.2 C -162.4 2.2 163.4 2.9 163.4 2.9 C -f -0 g -428.1 170.2 m -428.1 170.2 429.7 170.2 430.0 170.5 C -454.7 211.4 474.8 275.6 504.0 301.9 C -512.1 300.6 515.0 280.8 527.3 283.1 C -534.8 284.4 536.4 284.1 542.9 288.9 C -571.4 331.1 600.3 374.5 623.6 423.2 C -640.2 454.7 661.6 492.9 663.5 517.6 C -660.3 515.6 L -633.7 468.6 613.2 419.6 582.4 378.4 C -572.1 367.1 566.5 352.8 550.7 348.3 C -543.2 348.3 536.1 354.4 530.5 363.8 C -528.9 367.1 528.9 368.1 525.4 369.7 C -495.5 333.7 466.7 282.8 446.5 233.5 C -436.2 206.2 433.2 190.0 427.4 170.5 C -427.4 170.5 428.1 170.2 428.1 170.2 C -f -0 g -754.7 271.7 m -783.8 345.7 780.3 386.2 794.2 447.5 C -806.2 497.1 819.2 543.8 843.5 614.9 C -869.5 690.4 875.0 731.0 888.0 787.1 C -892.5 826.7 892.8 865.9 869.5 898.7 C -853.9 908.7 841.9 912.3 822.1 909.4 C -785.5 890.2 764.1 846.4 749.8 799.7 C -750.4 793.6 750.8 791.3 755.0 788.1 C -755.6 788.1 756.9 788.1 757.9 788.1 C -772.8 803.3 773.8 842.9 796.8 849.0 C -817.6 849.0 826.3 847.7 840.3 834.8 C -855.8 799.7 856.2 789.4 858.1 755.0 C -855.2 687.5 836.7 643.7 819.8 576.9 C -801.7 513.7 781.9 454.3 772.8 406.7 C -766.3 361.6 755.0 332.4 754.0 271.7 C -754.0 271.7 754.7 271.7 754.7 271.7 C -f -0 g -383.0 484.8 m -421.2 539.0 420.6 593.1 405.4 650.9 C -395.0 674.5 382.7 683.6 367.7 695.0 C -354.8 681.0 339.2 664.2 330.1 640.2 C -330.1 640.2 330.1 638.5 330.4 638.2 C -351.5 628.8 372.3 592.2 378.1 567.2 C -381.0 544.5 378.8 505.2 382.3 484.8 C -382.3 484.8 383.0 484.8 383.0 484.8 C -f -0 g -120.6 509.8 m -171.2 511.7 215.0 550.7 255.8 589.6 C -283.4 609.7 302.2 627.8 315.8 663.5 C -280.8 636.9 238.3 595.7 192.6 571.7 C -179.6 566.2 162.4 565.6 147.8 570.4 C -139.4 578.2 136.2 580.5 136.5 588.6 C -144.6 635.3 192.3 684.3 217.6 724.8 C -223.4 738.1 235.7 745.9 238.3 758.9 C -204.3 726.8 174.1 677.1 147.5 634.3 C -127.1 600.3 95.3 560.1 102.1 520.5 C -107.0 510.8 111.8 513.7 120.6 509.8 C -f -0 g -621.7 657.7 m -669.0 661.2 703.4 716.1 724.8 769.6 C -730.7 779.0 728.7 785.5 731.3 792.9 C -711.8 758.5 695.0 728.4 656.7 720.9 C -638.2 720.3 635.0 721.9 624.9 732.6 C -621.7 736.5 620.4 739.4 618.1 744.3 C -588.6 683.0 L -593.1 671.6 598.3 665.5 608.1 661.9 C -612.0 661.6 617.8 659.0 621.7 657.7 C -f -0 g -502.0 681.0 m -526.7 680.4 547.7 694.7 565.2 716.1 C -576.0 734.9 583.1 755.0 592.2 775.4 C -592.2 779.6 591.5 783.2 592.8 786.8 C -582.4 775.7 571.4 752.7 549.7 746.5 C -520.8 736.2 500.7 751.4 481.6 766.7 C -440.4 802.3 416.7 847.7 366.8 868.5 C -346.3 878.2 335.0 875.6 319.1 869.5 C -300.3 862.7 292.8 850.7 279.2 833.8 C -285.0 838.3 271.7 828.6 277.2 833.5 C -268.5 845.8 244.2 875.3 220.8 881.1 C -168.6 888.3 147.5 809.8 96.3 789.4 C -83.3 784.8 72.0 776.7 61.2 781.6 C -41.5 794.2 38.2 804.6 27.5 824.1 C -2.2 764.7 L -9.0 751.1 16.8 730.3 32.1 725.1 C -45.0 720.3 55.1 721.6 68.1 727.1 C -91.1 745.2 116.4 758.9 132.0 779.3 C -140.1 789.4 146.5 797.5 157.6 808.5 C -166.3 816.6 176.1 823.1 187.7 827.0 C -219.2 813.0 240.6 789.7 259.1 759.5 C -275.3 782.5 284.7 815.0 321.4 810.1 C -373.9 801.4 405.0 751.7 443.6 715.1 C -462.8 694.7 478.3 687.2 502.0 681.0 C -f -%%Trailer -end -showpage diff --git a/texi/ps/gnus-head.eps b/texi/ps/gnus-head.eps deleted file mode 100644 index 82206f8..0000000 --- a/texi/ps/gnus-head.eps +++ /dev/null @@ -1,150 +0,0 @@ -%!PS-Adobe-2.0 EPSF-1.2 -%%Creator: Adobe Illustrator 88(TM) format generated by CorelTRACE Version 2.0C -%%Title: /home/menja/c/larsi/gnus-head.eps -%%BoundingBox: 0 0 430.6 312.5 -%%CreationDate: Sat Feb 3 13:06:12 1996 -%%DocumentFonts: -%%ColorUsage: B & W -%%TileBox: 0 0 430.6 312.5 -%%EndComments -%%BeginProcSet:Adobe_Illustrator_1.1 0 0 -% Copyright 1992 Corel Corporation. - -% All rights reserved. -/wPSMDict 150 dict def -wPSMDict begin -/bd {bind def} bind def -/ld {load def} bd -/xd {exch def} bd -/_ null def -/$c 0 def -/$m 0 def -/$y 0 def -/$k 0 def -/$t 1 def -/$n _ def -/$o 0 def -/$C 0 def -/$M 0 def -/$Y 0 def -/$K 0 def -/$T 1 def -/$N _ def -/$O 0 def -/$h false def -/$al 0 def -/$tr 0 def -/$le 0 def -/$lx 0 def -/$ly 0 def -/$ctm matrix currentmatrix def -/@cp /closepath ld -/@gs /gsave ld -/@gr /grestore ld -/@MN {2 copy le{pop}{exch pop}ifelse}bd -/setcmykcolor where {pop}{/setcmykcolor{4 1 roll -3 {3 index add 1 @MN 1 exch sub 3 1 roll} repeat -setrgbcolor -pop}bd}ifelse -/@tc{dup 1 ge{pop}{4 {dup -6 -1 roll -mul -exch}repeat -pop}ifelse}bd -/@scc{$c $m $y $k $t @tc setcmykcolor true}bd -/@SCC{$C $M $Y $K $T @tc setcmykcolor true}bd -/@sm{/$ctm $ctm currentmatrix def}bd -/x {/$t xd /$n xd -/$k xd /$y xd /$m xd /$c xd}bd -/X {/$T xd /$N xd -/$K xd /$Y xd /$M xd /$C xd}bd -/g {1 exch sub 0 0 0 -4 -1 roll -_ 1 x}bd -/G {1 exch sub 0 0 0 -4 -1 roll -_ 1 X}bd -/k {_ 1 x}bd -/K {_ 1 X}bd -/d /setdash ld -/i {dup 0 ne {setflat} {pop} ifelse}bd -/j /setlinejoin ld -/J /setlinecap ld -/M /setmiterlimit ld -/w /setlinewidth ld -/O {/$o xd}bd -/R {/$O xd}bd -/c /curveto ld -/C /c ld -/l /lineto ld -/L /l ld -/m /moveto ld -/n /newpath ld -/N /newpath ld -/F {@scc{eofill}if n} bd -/f {@cp F}bd -/S {@SCC{stroke}if n} bd -/s {@cp -S}bd -/B {@gs F @gr -S}bd -/b {@cp B }bd -/u {}bd -/U {}bd -%%EndProlog -%%BeginSetup -%%EndSetup -1 i -2 J -0 j -4 M -[]0 d - -%%Note: traced as Normal_Outline -0 g -267.8 10.0 m -291.8 50.8 294.2 95.0 278.8 136.8 C -270.2 147.3 264.9 154.5 252.4 156.9 C -227.0 119.5 L -256.3 98.8 267.3 63.3 264.0 12.4 C -264.4 10.5 265.9 9.1 265.9 9.1 C -265.9 9.1 267.8 10.0 267.8 10.0 C -f -0 g -79.2 40.3 m -116.6 43.6 150.2 75.3 180.9 103.6 C -197.2 121.4 204.0 133.4 217.9 150.7 C -216.4 151.2 215.0 152.1 213.1 152.1 C -178.0 128.6 147.3 81.1 102.2 86.8 C -98.4 88.8 95.0 89.2 92.6 92.1 C -87.3 120.4 126.2 159.8 141.1 182.8 C -148.8 193.4 159.3 203.0 159.8 217.4 C -131.0 190.0 98.8 140.6 71.5 90.7 C -65.2 76.3 58.0 67.6 63.3 53.7 C -68.6 45.1 70.5 43.2 79.2 40.3 C -f -0 g -355.6 161.2 m -376.3 159.3 388.3 171.8 404.6 184.3 C -412.3 201.1 422.4 223.2 423.3 237.6 C -416.6 234.2 410.8 229.4 405.1 217.4 C -399.8 211.6 386.8 206.8 378.7 207.8 C -334.0 206.4 308.1 288.4 252.4 297.1 C -236.1 299.5 229.9 291.8 214.5 285.6 C -203.0 270.2 L -193.4 281.7 175.2 306.7 147.8 303.3 C -115.2 279.8 101.2 238.5 57.6 230.8 C -42.7 235.2 26.8 240.9 21.1 253.4 C -19.6 257.7 19.6 260.1 16.8 262.5 C -14.4 259.2 12.9 257.7 11.5 253.4 C -20.1 231.8 12.4 207.8 31.6 190.5 C -45.6 184.8 60.4 188.1 74.8 201.6 C -103.6 220.3 113.2 256.3 142.5 259.2 C -164.1 248.1 178.5 237.1 189.1 214.0 C -208.8 241.9 L -225.6 253.4 243.8 250.0 262.0 241.4 C -294.2 215.0 325.9 167.5 355.6 161.2 C -f -%%Trailer -end -showpage diff --git a/texi/ptexinfmt.el b/texi/ptexinfmt.el deleted file mode 100644 index e98956e..0000000 --- a/texi/ptexinfmt.el +++ /dev/null @@ -1,762 +0,0 @@ -;;; ptexinfmt.el -- portable Texinfo formatter. - -;; Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, -;; 1994, 1995, 1996, 1997 Free Software Foundation, Inc. -;; Copyright (C) 1999 Yoshiki Hayashi -;; Copyright (C) 2000, 2001 TAKAHASHI Kaoru - -;; Author: TAKAHASHI Kaoru -;; Yoshiki Hayashi -;; Maintainer: TAKAHASHI Kaoru -;; Created: 7 Jul 2000 -;; Keywords: maint, tex, docs, emulation, compatibility - -;; 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, 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; Original code: Yoshiki Hayashi -;; makeinfo.el (gnujdoc project) - -;; Support texinfmt.el 2.32 or later. - -;;; Code: -(require 'texinfmt) -(require 'poe) -(require 'broken) - -;;; Broken -(defvar ptexinfmt-disable-broken-notice-flag t - "If non-nil disable notice, when call `broken-facility'. -This is NO-NOTICE argument in `broken-facility'.") - -;; sort -fd -(broken-facility texinfo-format-printindex - "Can't sort on Mule for Windows." - (if (and (memq system-type '(windows-nt ms-dos)) -;;; I don't know version threshold. -;;; (string< texinfmt-version "2.37 of 24 May 1997") - (boundp 'MULE) (not (featurep 'meadow))) ; Mule for Windows - nil - t) - ptexinfmt-disable-broken-notice-flag) - -;; @var -(broken-facility texinfo-format-var - "Don't perse @var argument." - (condition-case nil - (with-temp-buffer - (let (texinfo-enclosure-list texinfo-alias-list) - (texinfo-mode) - (insert "@var{@asis{foo}}\n") - (texinfo-format-expand-region (point-min) (point-max)) - t)) - (error nil)) - ptexinfmt-disable-broken-notice-flag) - -;; @xref -(broken-facility texinfo-format-xref - "Can't format @xref, 1st argument is empty." - (condition-case nil - (with-temp-buffer - (let (texinfo-enclosure-list texinfo-alias-list) - (texinfo-mode) - (insert "@xref{, xref, , file}\n") - (texinfo-format-expand-region (point-min) (point-max)) - t)) - (error nil)) - ptexinfmt-disable-broken-notice-flag) - -;; @uref -(broken-facility texinfo-format-uref - "Parse twice @uref argument." - (condition-case nil - (with-temp-buffer - (let (texinfo-enclosure-list texinfo-alias-list) - (texinfo-mode) - (insert "@uref{mailto:foo@@bar.com}\n") - (texinfo-format-expand-region (point-min) (point-max)) - t)) - (error nil)) - ptexinfmt-disable-broken-notice-flag) - -;; @multitable -(broken-facility texinfo-multitable-widths - "`texinfo-multitable-widths' unsupport wide-char." - (if (fboundp 'texinfo-multitable-widths) - (with-temp-buffer - (let ((str "$BI}9-J8;z(B")) - (texinfo-mode) - (insert (format " {%s}\n" str)) - (goto-char (point-min)) - (if (= (car (texinfo-multitable-widths)) (length str)) - nil - t))) - ;; function definition is void - t) - ptexinfmt-disable-broken-notice-flag) - -(broken-facility texinfo-multitable-item - "`texinfo-multitable-item' unsupport wide-char." - (if-broken texinfo-multitable-widths nil t) - ptexinfmt-disable-broken-notice-flag) - - -;;; Obsolete -;; Removed Texinfo 3.8 -(put 'overfullrule 'texinfo-format 'texinfo-discard-line) -(put 'smallbreak 'texinfo-format 'texinfo-discard-line) -(put 'medbreak 'texinfo-format 'texinfo-discard-line) -(put 'bigbreak 'texinfo-format 'texinfo-discard-line) -;; Removed Texinfo 3.9 -(put 'setchapterstyle 'texinfo-format 'texinfo-discard-line-with-args) - -;;; Hardcopy and HTML (discard) -;; I18N -(put 'documentlanguage 'texinfo-format 'texinfo-discard-line-with-args) -(put 'documentencoding 'texinfo-format 'texinfo-discard-line-with-args) - -;; size -(put 'smallbook 'texinfo-format 'texinfo-discard-line) -(put 'letterpaper 'texinfo-format 'texinfo-discard-line) -(put 'afourpaper 'texinfo-format 'texinfo-discard-line) -(put 'afourlatex 'texinfo-format 'texinfo-discard-line) -(put 'afourwide 'texinfo-format 'texinfo-discard-line) -(put 'afivepaper 'texinfo-format 'texinfo-discard-line) -(put 'pagesizes 'texinfo-format 'texinfo-discard-line-with-args) - -;; style -(put 'setchapternewpage 'texinfo-format 'texinfo-discard-line-with-args) -(put 'kbdinputstyle 'texinfo-format 'texinfo-discard-line-with-args) - -;; flags -(put 'setcontentsaftertitlepage 'texinfo-format 'texinfo-discard-line) -(put 'setshortcontentsaftertitlepage 'texinfo-format 'texinfo-discard-line) -(put 'novalidate 'texinfo-format 'texinfo-discard-line-with-args) - -;; head & foot -(put 'headings 'texinfo-format 'texinfo-discard-line-with-args) -(put 'evenfooting 'texinfo-format 'texinfo-discard-line-with-args) -(put 'evenheading 'texinfo-format 'texinfo-discard-line-with-args) -(put 'oddfooting 'texinfo-format 'texinfo-discard-line-with-args) -(put 'oddheading 'texinfo-format 'texinfo-discard-line-with-args) -(put 'everyfooting 'texinfo-format 'texinfo-discard-line-with-args) -(put 'everyheading 'texinfo-format 'texinfo-discard-line-with-args) - -;; misc -(put 'page 'texinfo-format 'texinfo-discard-line) -(put 'hyphenation 'texinfo-format 'texinfo-discard-command-and-arg) - - - -;;; Directory File -;; @direcategory -(put 'dircategory 'texinfo-format 'texinfo-format-dircategory) -(defun-maybe texinfo-format-dircategory () - (let ((str (texinfo-parse-arg-discard))) - (delete-region (point) - (progn - (skip-chars-forward " ") - (point))) - (insert "INFO-DIR-SECTION " str "\n"))) - -;; @direntry -(put 'direntry 'texinfo-format 'texinfo-format-direntry) -(defun-maybe texinfo-format-direntry () - (texinfo-push-stack 'direntry nil) - (texinfo-discard-line) - (insert "START-INFO-DIR-ENTRY\n")) - -(put 'direntry 'texinfo-end 'texinfo-end-direntry) -(defun-maybe texinfo-end-direntry () - (texinfo-discard-command) - (insert "END-INFO-DIR-ENTRY\n\n") - (texinfo-pop-stack 'direntry)) - - -;;; Block Enclosing and Conditional -;; @detailmenu ... @end detailmenu -(put 'detailmenu 'texinfo-format 'texinfo-discard-line) -(put 'detailmenu 'texinfo-end 'texinfo-discard-command) - -;; @smalldisplay ... @end smalldisplay -(put 'smalldisplay 'texinfo-format 'texinfo-format-example) -(put 'smalldisplay 'texinfo-end 'texinfo-end-example) - -;; @smallformat ... @end smallformat -(put 'smallformat 'texinfo-format 'texinfo-format-flushleft) -(put 'smallformat 'texinfo-end 'texinfo-end-flushleft) - -;; @ifnottex ... @end ifnottex -(put 'ifnottex 'texinfo-format 'texinfo-discard-line) -(put 'ifnottex 'texinfo-end 'texinfo-discard-command) - -;; @ifnothtml ... @end ifnothtml -(put 'ifnothtml 'texinfo-format 'texinfo-discard-line) -(put 'ifnothtml 'texinfo-end 'texinfo-discard-command) - -;; @ifnotinfo ... @end ifnotinfo -(put 'ifnotinfo 'texinfo-format 'texinfo-format-ifnotinfo) -(put 'endifnotinfo 'texinfo-format 'texinfo-discard-line) -(defun-maybe texinfo-format-ifnotinfo () - (delete-region texinfo-command-start - (progn (re-search-forward "@end ifnotinfo[ \t]*\n") - (point)))) - -;; @html ... @end html -(put 'html 'texinfo-format 'texinfo-format-html) -(put 'endhtml 'texinfo-format 'texinfo-discard-line) -(defun-maybe texinfo-format-html () - (delete-region texinfo-command-start - (progn (re-search-forward "@end html[ \t]*\n") - (point)))) - - - -;;; Marking -;; @url, @env, @command -(put 'url 'texinfo-format 'texinfo-format-code) -(put 'env 'texinfo-format 'texinfo-format-code) -(put 'command 'texinfo-format 'texinfo-format-code) - -;; @acronym -(put 'acronym 'texinfo-format 'texinfo-format-var) - -(when-broken texinfo-format-var - (fmakunbound 'texinfo-format-var)) -(defun-maybe texinfo-format-var () - (let ((arg (texinfo-parse-expanded-arg))) - (texinfo-discard-command) - (insert (upcase arg)))) - -;; @key -(put 'key 'texinfo-format 'texinfo-format-key) -(defun-maybe texinfo-format-key () - (insert (texinfo-parse-arg-discard)) - (goto-char texinfo-command-start)) - -;; @email{EMAIL-ADDRESS[, DISPLAYED-TEXT]} -(put 'email 'texinfo-format 'texinfo-format-email) -(defun-maybe texinfo-format-email () - "Format EMAIL-ADDRESS and optional DISPLAYED-TXT. -Insert < ... > around EMAIL-ADDRESS." - (let ((args (texinfo-format-parse-args))) - (texinfo-discard-command) - ;; if displayed-text - (if (nth 1 args) - (insert (nth 1 args) " <" (nth 0 args) ">") - (insert "<" (nth 0 args) ">")))) - -;; @option -(put 'option 'texinfo-format 'texinfo-format-option) -(defun texinfo-format-option () - "Insert ` ... ' around arg unless inside a table; in that case, no quotes." - ;; `looking-at-backward' not available in v. 18.57, 20.2 - ;; searched-for character is a control-H - (if (not (search-backward "\010" - (save-excursion (beginning-of-line) (point)) - t)) - (insert "`" (texinfo-parse-arg-discard) "'") - (insert (texinfo-parse-arg-discard))) - (goto-char texinfo-command-start)) - - - -;;; Accents and Special characters -;; @pounds{} ==> # Pounds Sterling -(put 'pounds 'texinfo-format 'texinfo-format-pounds) -(defun-maybe texinfo-format-pounds () - (texinfo-parse-arg-discard) - (insert "#")) - -;; @OE{} ==> OE French-OE-ligature -(put 'OE 'texinfo-format 'texinfo-format-French-OE-ligature) -(defun-maybe texinfo-format-French-OE-ligature () - (insert "OE" (texinfo-parse-arg-discard)) - (goto-char texinfo-command-start)) - -;; @oe{} ==> oe -(put 'oe 'texinfo-format 'texinfo-format-French-oe-ligature) -(defun-maybe texinfo-format-French-oe-ligature () ; lower case - (insert "oe" (texinfo-parse-arg-discard)) - (goto-char texinfo-command-start)) - -;; @AA{} ==> AA Scandinavian-A-with-circle -(put 'AA 'texinfo-format 'texinfo-format-Scandinavian-A-with-circle) -(defun-maybe texinfo-format-Scandinavian-A-with-circle () - (insert "AA" (texinfo-parse-arg-discard)) - (goto-char texinfo-command-start)) - -;; @aa{} ==> aa -(put 'aa 'texinfo-format 'texinfo-format-Scandinavian-a-with-circle) -(defun-maybe texinfo-format-Scandinavian-a-with-circle () ; lower case - (insert "aa" (texinfo-parse-arg-discard)) - (goto-char texinfo-command-start)) - -;; @AE{} ==> AE Latin-Scandinavian-AE -(put 'AE 'texinfo-format 'texinfo-format-Latin-Scandinavian-AE) -(defun-maybe texinfo-format-Latin-Scandinavian-AE () - (insert "AE" (texinfo-parse-arg-discard)) - (goto-char texinfo-command-start)) - -;; @ae{} ==> ae -(put 'ae 'texinfo-format 'texinfo-format-Latin-Scandinavian-ae) -(defun-maybe texinfo-format-Latin-Scandinavian-ae () ; lower case - (insert "ae" (texinfo-parse-arg-discard)) - (goto-char texinfo-command-start)) - -;; @ss{} ==> ss German-sharp-S -(put 'ss 'texinfo-format 'texinfo-format-German-sharp-S) -(defun-maybe texinfo-format-German-sharp-S () - (insert "ss" (texinfo-parse-arg-discard)) - (goto-char texinfo-command-start)) - -;; @questiondown{} ==> ? upside-down-question-mark -(put 'questiondown 'texinfo-format 'texinfo-format-upside-down-question-mark) -(defun-maybe texinfo-format-upside-down-question-mark () - (insert "?" (texinfo-parse-arg-discard)) - (goto-char texinfo-command-start)) - -;; @exclamdown{} ==> ! upside-down-exclamation-mark -(put 'exclamdown 'texinfo-format 'texinfo-format-upside-down-exclamation-mark) -(defun-maybe texinfo-format-upside-down-exclamation-mark () - (insert "!" (texinfo-parse-arg-discard)) - (goto-char texinfo-command-start)) - -;; @L{} ==> L/ Polish suppressed-L (Lslash) -(put 'L 'texinfo-format 'texinfo-format-Polish-suppressed-L) -(defun-maybe texinfo-format-Polish-suppressed-L () - (insert (texinfo-parse-arg-discard) "/L") - (goto-char texinfo-command-start)) - -;; @l{} ==> l/ Polish suppressed-L (Lslash) (lower case) -(put 'l 'texinfo-format 'texinfo-format-Polish-suppressed-l-lower-case) -(defun-maybe texinfo-format-Polish-suppressed-l-lower-case () - (insert (texinfo-parse-arg-discard) "/l") - (goto-char texinfo-command-start)) - -;; @O{} ==> O/ Scandinavian O-with-slash -(put 'O 'texinfo-format 'texinfo-format-Scandinavian-O-with-slash) -(defun-maybe texinfo-format-Scandinavian-O-with-slash () - (insert (texinfo-parse-arg-discard) "O/") - (goto-char texinfo-command-start)) - -;; @o{} ==> o/ Scandinavian O-with-slash (lower case) -(put 'o 'texinfo-format 'texinfo-format-Scandinavian-o-with-slash-lower-case) -(defun-maybe texinfo-format-Scandinavian-o-with-slash-lower-case () - (insert (texinfo-parse-arg-discard) "o/") - (goto-char texinfo-command-start)) - -;; @,{c} ==> c, cedilla accent -(put ', 'texinfo-format 'texinfo-format-cedilla-accent) -(defun-maybe texinfo-format-cedilla-accent () - (insert (texinfo-parse-arg-discard) ",") - (goto-char texinfo-command-start)) - - -;; @dotaccent{o} ==> .o overdot-accent -(put 'dotaccent 'texinfo-format 'texinfo-format-overdot-accent) -(defun-maybe texinfo-format-overdot-accent () - (insert "." (texinfo-parse-arg-discard)) - (goto-char texinfo-command-start)) - -;; @ubaraccent{o} ==> _o underbar-accent -(put 'ubaraccent 'texinfo-format 'texinfo-format-underbar-accent) -(defun-maybe texinfo-format-underbar-accent () - (insert "_" (texinfo-parse-arg-discard)) - (goto-char texinfo-command-start)) - -;; @udotaccent{o} ==> o-. underdot-accent -(put 'udotaccent 'texinfo-format 'texinfo-format-underdot-accent) -(defun-maybe texinfo-format-underdot-accent () - (insert (texinfo-parse-arg-discard) "-.") - (goto-char texinfo-command-start)) - -;; @H{o} ==> ""o long Hungarian umlaut -(put 'H 'texinfo-format 'texinfo-format-long-Hungarian-umlaut) -(defun-maybe texinfo-format-long-Hungarian-umlaut () - (insert "\"\"" (texinfo-parse-arg-discard)) - (goto-char texinfo-command-start)) - -;; @ringaccent{o} ==> *o ring accent -(put 'ringaccent 'texinfo-format 'texinfo-format-ring-accent) -(defun-maybe texinfo-format-ring-accent () - (insert "*" (texinfo-parse-arg-discard)) - (goto-char texinfo-command-start)) - -;; @tieaccent{oo} ==> [oo tie after accent -(put 'tieaccent 'texinfo-format 'texinfo-format-tie-after-accent) -(defun-maybe texinfo-format-tie-after-accent () - (insert "[" (texinfo-parse-arg-discard)) - (goto-char texinfo-command-start)) - -;; @u{o} ==> (o breve accent -(put 'u 'texinfo-format 'texinfo-format-breve-accent) -(defun-maybe texinfo-format-breve-accent () - (insert "(" (texinfo-parse-arg-discard)) - (goto-char texinfo-command-start)) - -;; @v{o} ==> i dotless i and dotless j -(put 'dotless 'texinfo-format 'texinfo-format-dotless) -(defun-maybe texinfo-format-dotless () - (insert (texinfo-parse-arg-discard)) - (goto-char texinfo-command-start)) - - - -;;; Cross References -;; @ref, @xref -(put 'ref 'texinfo-format 'texinfo-format-xref) - -(when-broken texinfo-format-xref - (fmakunbound 'texinfo-format-xref)) -(defun-maybe texinfo-format-xref () - (let ((args (texinfo-format-parse-args))) - (texinfo-discard-command) - (insert "*Note ") - (let ((fname (or (nth 1 args) (nth 2 args)))) - (if (null (or fname (nth 3 args))) - (insert (nth 0 args) "::") - (insert (or fname (nth 0 args)) ": ") - (if (nth 3 args) - (insert "(" (nth 3 args) ")")) - (unless (null (nth 0 args)) - (insert (nth 0 args))))))) - -;; @uref -(put 'uref 'texinfo-format 'texinfo-format-uref) -(when-broken texinfo-format-uref - (fmakunbound 'texinfo-format-uref)) -(defun-maybe texinfo-format-uref () - "Format URL and optional URL-TITLE. -Insert ` ... ' around URL if no URL-TITLE argument; -otherwise, insert URL-TITLE followed by URL in parentheses." - (let ((args (texinfo-format-parse-args))) - (texinfo-discard-command) - ;; if url-title - (if (nth 1 args) - (insert (nth 1 args) " (" (nth 0 args) ")") - (insert "`" (nth 0 args) "'")))) - - - -;;; New command definition -;; @alias NEW=EXISTING -(put 'alias 'texinfo-format 'texinfo-alias) -(defun-maybe texinfo-alias () - (let ((start (1- (point))) - args) - (skip-chars-forward " ") - (save-excursion (end-of-line) (setq texinfo-command-end (point))) - (if (not (looking-at "\\([^=]+\\)=\\(.*\\)")) - (error "Invalid alias command") - (setq texinfo-alias-list - (cons - (cons - (buffer-substring (match-beginning 1) (match-end 1)) - (buffer-substring (match-beginning 2) (match-end 2))) - texinfo-alias-list)) - (texinfo-discard-command)))) - -;; @definfoenclose NEWCMD, BEFORE, AFTER - - - -;;; Special -;; @image{FILENAME, [WIDTH], [HEIGHT]} -(put 'image 'texinfo-format 'texinfo-format-image) -(defun-maybe texinfo-format-image () - ;; I don't know makeinfo parse FILENAME. - (let ((args (texinfo-format-parse-args)) - filename) - (when (null (nth 0 args)) - (error "Invalid image command")) - (texinfo-discard-command) - ;; makeinfo uses FILENAME.txt - (setq filename (format "%s.txt" (nth 0 args))) - (message "Reading included file: %s" filename) - ;; verbatim for Info output - (goto-char (+ (point) (cadr (insert-file-contents filename)))) - (message "Reading included file: %s...done" filename))) - - -;; @exampleindent - - - -;;; @multitable ... @end multitable -(defvar-maybe texinfo-extra-inter-column-width 0 - "*Number of extra spaces between entries (columns) in @multitable.") - -(defvar-maybe texinfo-multitable-buffer-name "*multitable-temporary-buffer*") -(defvar-maybe texinfo-multitable-rectangle-name "texinfo-multitable-temp-") - -;; These commands are defined in texinfo.tex for printed output. -(put 'multitableparskip 'texinfo-format 'texinfo-discard-line-with-args) -(put 'multitableparindent 'texinfo-format 'texinfo-discard-line-with-args) -(put 'multitablecolmargin 'texinfo-format 'texinfo-discard-line-with-args) -(put 'multitablelinespace 'texinfo-format 'texinfo-discard-line-with-args) - -(put 'multitable 'texinfo-format 'texinfo-multitable) - -(defun-maybe texinfo-multitable () - "Produce multi-column tables." - -;; This function pushes information onto the `texinfo-stack'. -;; A stack element consists of: -;; - type-of-command, i.e., multitable -;; - the information about column widths, and -;; - the position of texinfo-command-start. -;; e.g., ('multitable (1 2 3 4) 123) -;; The command line is then deleted. - (texinfo-push-stack - 'multitable - ;; push width information on stack - (texinfo-multitable-widths)) - (texinfo-discard-line-with-args)) - -(put 'multitable 'texinfo-end 'texinfo-end-multitable) -(defun-maybe texinfo-end-multitable () - "Discard the @end multitable line and pop the stack of multitable." - (texinfo-discard-command) - (texinfo-pop-stack 'multitable)) - -(when-broken texinfo-multitable-widths - (fmakunbound 'texinfo-multitable-widths)) - -(defun-maybe texinfo-multitable-widths () - "Return list of widths of each column in a multi-column table." - (let (texinfo-multitable-width-list) - ;; Fractions format: - ;; @multitable @columnfractions .25 .3 .45 - ;; - ;; Template format: - ;; @multitable {Column 1 template} {Column 2} {Column 3 example} - ;; Place point before first argument - (skip-chars-forward " \t") - (cond - ;; Check for common misspelling - ((looking-at "@columnfraction ") - (error "In @multitable, @columnfractions misspelled")) - ;; Case 1: @columnfractions .25 .3 .45 - ((looking-at "@columnfractions") - (forward-word 1) - (while (not (eolp)) - (setq texinfo-multitable-width-list - (cons - (truncate - (1- - (* fill-column (read (get-buffer (current-buffer)))))) - texinfo-multitable-width-list)))) - ;; - ;; Case 2: {Column 1 template} {Column 2} {Column 3 example} - ((looking-at "{") - (let ((start-of-templates (point))) - (while (not (eolp)) - (skip-chars-forward " \t") - (let* ((start-of-template (1+ (point))) - (end-of-template - ;; forward-sexp works with braces in Texinfo mode - (progn (forward-sexp 1) (1- (point))))) - (setq texinfo-multitable-width-list - (cons (- (progn (goto-char end-of-template) (current-column)) - (progn (goto-char start-of-template) (current-column))) - texinfo-multitable-width-list)) - ;; Remove carriage return from within a template, if any. - ;; This helps those those who want to use more than - ;; one line's worth of words in @multitable line. - (narrow-to-region start-of-template end-of-template) - (goto-char (point-min)) - (while (search-forward " -" nil t) - (delete-char -1)) - (goto-char (point-max)) - (widen) - (forward-char 1))))) - ;; - ;; Case 3: Trouble - (t - (error - "You probably need to specify column widths for @multitable correctly"))) - ;; Check whether columns fit on page. - (let ((desired-columns - (+ - ;; between column spaces - (length texinfo-multitable-width-list) - ;; additional between column spaces, if any - texinfo-extra-inter-column-width - ;; sum of spaces for each entry - (apply '+ texinfo-multitable-width-list)))) - (if (> desired-columns fill-column) - (error - (format - "Multi-column table width, %d chars, is greater than page width, %d chars." - desired-columns fill-column)))) - texinfo-multitable-width-list)) - -;; @item A1 @tab A2 @tab A3 -(defun-maybe texinfo-multitable-extract-row () - "Return multitable row, as a string. -End of row is beginning of next @item or beginning of @end. -Cells within rows are separated by @tab." - (skip-chars-forward " \t") - (let* ((start (point)) - (end (progn - (re-search-forward "@item\\|@end") - (match-beginning 0))) - (row (progn (goto-char end) - (skip-chars-backward " ") - ;; remove whitespace at end of argument - (delete-region (point) end) - (buffer-substring start (point))))) - (delete-region texinfo-command-start end) - row)) - -(when-broken texinfo-multitable-item - (fmakunbound 'texinfo-multitable-item)) - -(put 'multitable 'texinfo-item 'texinfo-multitable-item) -(defun-maybe texinfo-multitable-item () - "Format a row within a multicolumn table. -Cells in row are separated by @tab. -Widths of cells are specified by the arguments in the @multitable line. -All cells are made to be the same height. -This command is executed when texinfmt sees @item inside @multitable." - (let ((original-buffer (current-buffer)) - (table-widths (reverse (car (cdr (car texinfo-stack))))) - (existing-fill-column fill-column) - start - end - (table-column 0) - (table-entry-height 0) - ;; unformatted row looks like: A1 @tab A2 @tab A3 - ;; extract-row command deletes the source line in the table. - (unformated-row (texinfo-multitable-extract-row))) - ;; Use a temporary buffer - (set-buffer (get-buffer-create texinfo-multitable-buffer-name)) - (delete-region (point-min) (point-max)) - (insert unformated-row) - (goto-char (point-min)) -;; 1. Check for correct number of @tab in line. - (let ((tab-number 1)) ; one @tab between two columns - (while (search-forward "@tab" nil t) - (setq tab-number (1+ tab-number))) - (if (/= tab-number (length table-widths)) - (error "Wrong number of @tab's in a @multitable row"))) - (goto-char (point-min)) -;; 2. Format each cell, and copy to a rectangle - ;; buffer looks like this: A1 @tab A2 @tab A3 - ;; Cell #1: format up to @tab - ;; Cell #2: format up to @tab - ;; Cell #3: format up to eob - (while (not (eobp)) - (setq start (point)) - (setq end (save-excursion - (if (search-forward "@tab" nil 'move) - ;; Delete the @tab command, including the @-sign - (delete-region - (point) - (progn (forward-word -1) (1- (point))))) - (point))) - ;; Set fill-column *wider* than needed to produce inter-column space - (setq fill-column (+ 1 - texinfo-extra-inter-column-width - (nth table-column table-widths))) - (narrow-to-region start end) - ;; Remove whitespace before and after entry. - (skip-chars-forward " ") - (delete-region (point) (save-excursion (beginning-of-line) (point))) - (goto-char (point-max)) - (skip-chars-backward " ") - (delete-region (point) (save-excursion (end-of-line) (point))) - ;; Temorarily set texinfo-stack to nil so texinfo-format-scan - ;; does not see an unterminated @multitable. - (let (texinfo-stack) ; nil - (texinfo-format-scan)) - (let (fill-prefix) ; no fill prefix - (fill-region (point-min) (point-max))) - (setq table-entry-height - (max table-entry-height (count-lines (point-min) (point-max)))) -;; 3. Move point to end of bottom line, and pad that line to fill column. - (goto-char (point-min)) - (forward-line (1- table-entry-height)) - (let* ((beg (point)) ; beginning of line - ;; add one more space for inter-column spacing - (needed-whitespace - (1+ - (- fill-column - (progn (end-of-line) (current-column)))))) ; end of existing line - (insert (make-string - (if (> needed-whitespace 0) needed-whitespace 1) - ? ))) - ;; now, put formatted cell into a rectangle - (set (intern (concat texinfo-multitable-rectangle-name - (int-to-string table-column))) - (extract-rectangle (point-min) (point))) - (delete-region (point-min) (point)) - (goto-char (point-max)) - (setq table-column (1+ table-column)) - (widen)) -;; 4. Add extra lines to rectangles so all are of same height - (let ((total-number-of-columns table-column) - (column-number 0) - here) - (while (> table-column 0) - (let ((this-rectangle (int-to-string table-column))) - (while (< (length this-rectangle) table-entry-height) - (setq this-rectangle (append this-rectangle '(""))))) - (setq table-column (1- table-column))) -;; 5. Insert formatted rectangles in original buffer - (switch-to-buffer original-buffer) - (open-line table-entry-height) - (while (< column-number total-number-of-columns) - (setq here (point)) - (insert-rectangle - (eval (intern - (concat texinfo-multitable-rectangle-name - (int-to-string column-number))))) - (goto-char here) - (end-of-line) - (setq column-number (1+ column-number)))) - (kill-buffer texinfo-multitable-buffer-name) - (setq fill-column existing-fill-column))) - - -(when-broken texinfo-format-printindex - (fmakunbound 'texinfo-format-printindex)) - -(defun-maybe texinfo-format-printindex () - (let ((indexelts (symbol-value - (cdr (assoc (texinfo-parse-arg-discard) - texinfo-indexvar-alist)))) - opoint) - (insert "\n* Menu:\n\n") - (setq opoint (point)) - (texinfo-print-index nil indexelts) - - (if (memq system-type '(vax-vms windows-nt ms-dos)) - (texinfo-sort-region opoint (point)) - (shell-command-on-region opoint (point) "sort -fd" 1)))) - -(provide 'ptexinfmt) - -;;; ptexinfmt.el ends here diff --git a/texi/refcard-ja.tex b/texi/refcard-ja.tex deleted file mode 100644 index fdd8d6e..0000000 --- a/texi/refcard-ja.tex +++ /dev/null @@ -1,83 +0,0 @@ -% Reference Card for (ding) Gnus, 3 twocolumn pages. -% To be processed with latex 2.09 -\def\Guide{Card}\def\guide{card} -\def\logoscale{0.25} -\def\sec{\section*} -\def\subsec{\subsection*} -\def\subsubsec{\subsubsection*} -\documentstyle{article} -\textwidth 7.26in \textheight 10.3in \topmargin -1.2in -% the same settings work for A4, although there is a bit of space at the -% top and bottom of the page. -\oddsidemargin -0.5in \evensidemargin -0.5in -\begin{document} -\twocolumn\footnotesize\pagestyle{empty} -\input{gnusref-ja} - -\vspace*{\fill} -\Title -\vspace*{2ex} -\Logo{refcard} -\vspace*{\fill} -\Marks -\GroupLevels -\pagebreak - -\Notes -\General -\ArticleMode -\vspace*{\fill} -\CopyRight -\pagebreak - -\GroupMode -\SOUP -\pagebreak - -\ListGroups -\CreateGroups -\SortGroups -\MarkGroups -\pagebreak - -\Unsubscribe -\GroupTopics -\vspace*{\fill} -\SummaryMode -\SortSummary -\Article -\pagebreak - -\MailGroup -\GotoArticle -\Score -\pagebreak - -\MarkArticles -%\vspace*{-0.5ex} -\MarkScore -%\vspace*{-0.5ex} -\ProcessMark -%\vspace*{-0.5ex} -\OutputArticles -\pagebreak - -\Send -%\vspace*{-1.1ex} -\Thread -%\vspace*{-1.1ex} -\Exit -\pagebreak - -\Wash -\Hide -\Highlight -\Extract -\pagebreak - -\Limit -\PickAndRead -\ServerMode -\BrowseServer - -\end{document} diff --git a/texi/refcard.tex b/texi/refcard.tex deleted file mode 100644 index 5e5731f..0000000 --- a/texi/refcard.tex +++ /dev/null @@ -1,188 +0,0 @@ -% -*- latex -*- -% Reference Card for (ding) Gnus 5.8.x: to be processed with LaTeX2e -\documentclass{article} -\def\Guide{Card}\def\guide{card} -\def\logoscale{0.25} -\textwidth 7.26in \textheight 10in \topmargin -1.0in -% the same settings work for A4, although there is a bit of space at the -% top and bottom of the page. -\oddsidemargin -0.5in \evensidemargin -0.5in - -% README: -% *** purpose -% this was originally thought of as a reference card, but as it is now 5+ -% pages long, I doubt that it is more useful than the online-help. It helped -% to get an overview for the Gnus-functionality. -% -% *** files -% refcard.tex (this file), gnusref.tex ("include"-file) and gnuslogo.refcard -% (Gnus logo). -% -% *** printing (about 5 pages now: write me if you can make it shorter..) -% if you are using latex-mode, you do C-c C-f (process with latex), -% C-c C-v (view using xdvi/dvi2tty) and C-c C-p (print) -% the original author has set up the page dimensions cleverly so that this -% should print on both letter and a4 (see note above) -% $latex refcard.tex -% this creates a file refcard.dvi which you can preview using -% $xdvi refcard.dvi [C-c C-v] -% and print using something like -% $dvips refcard.dvi -% which creates refcard.ps (print using 'lpr refcard.ps') -% -% *** customization: -% the part following \begin{document} in this file consists of a macro for -% each section and section-headers (\section*{..}). It should be easy to -% reorder things and/or remove sections (put '%' at the beginning of the line). -% (i.e. you might want to omit \notes in the printed version ?) -% If you think that the order is not logical and you have ideas for -% improvements, please send mail to the current maintainer. -% -% *** ChangeLog: -% 2000-03-26 Felix Natter : -% refcard updated for Gnus 5.8.x: please send corrections or suggestions -% to the above email-address -% changes since 2000-03-26: -% o Create/Edit Foreign Groups: remove S b and S B (not available in 5.8.3) -% o Send/Reply etc.: remove w and W (the only bindings are S w and S W) -% Mon Apr 3 18:41:09 2000: -% o added C-c C-n and C-c C-t (Article) -% o C-c C-a as alias for M-m f (Article) + some other M-m *-bindings -% o added section for ``jumping'' in article-mode -% o now there's a difference between ``reading'' and ``composition'' -% (article-modes) -% Apr 24th, 2000: -% o added D s, D S and D t for nndraft -% o group-mode: i.e. C-u RET does not actually fetch fewer articles; also ,=>; -% Fri Jul 14 23:15:43 2000: -% o added README-section -% Thu Jul 27 20:51:01 2000: -% o added Unplugged-commands -% -% *** TODO: -% o (LaTeX) how can you get 'tabular' to wrap around pages ? -% o some things might not be updated: scoring and server modes, maybe more -% o Gnus Unplugged category-buffer commands need to be written - -\begin{document} -\newlength{\logowidth} \setlength{\logowidth}{6.861in} -\newlength{\logoheight} \setlength{\logoheight}{7.013in} - -\def\progver{5.8}\def\refver{5.8-4} % program and refcard versions -\def\date{July 27th, 2000} -\def\author{Vladimir Alexiev $<$vladimir@cs.ualberta.ca$>$} -\raggedbottom\raggedright - -\twocolumn -%\tiny -\scriptsize -\pagestyle{plain} - -% this contains a set of commands containing the actual sections -% (and some explanations). -\input{gnusref} - -\Title -\par -\Logo{refcard} -\Notes -% -% -\section*{Group-Mode} -\GroupModeGeneral - \subsection*{Group Subscribedness-Levels} - \GroupLevels - \subsection*{List Groups} - \ListGroups - \subsection*{Create/Edit Foreign Groups} - \CreateEditGroups - \subsection*{Unsubscribe, Kill and Yank Groups} - \SubscribeKillYankGroups - \subsection*{Mark Groups} - \MarkGroups - \subsection*{Group-Unplugged} - \GroupUnplugged -% topics in group-mode - \subsection*{Group Topics} - \GroupTopicsGeneral - \subsubsection*{Topic Sorting} - \TopicSorting -% -% summary-mode -\section*{Summary-Mode} -\SummaryModeGeneral - \subsection*{Select Articles} - \SelectArticles -% - \subsection*{Threading} - \Threading -% - \subsection*{Limiting} - \Limiting - \subsection*{Sort the Summary-Buffer} - \SortSummary - \subsection*{Score (Value) Commands} - \Scoring -% - \subsection*{MIME operations from the Summary-Buffer} - \MIMESummary - \subsection*{Extract Series (Uudecode etc)} - \ExtractSeries - \subsection*{Output Articles} - \OutputArticles -% - \subsection*{Post, Followup, Reply, Forward, Cancel} - \PostReplyetc - \subsection*{Message-Composition} - \MsgCompositionGeneral - \subsubsection*{Jumping in message-buffer} - \MsgCompositionMovementArticle - \subsubsection*{Attachments/MML} - \MsgCompositionMML -% marking articles - \subsection*{Mark Articles} - \MarkArticlesGeneral - \subsubsection*{Mark Based on Score} - \MarkByScore - \subsubsection*{The Process Mark} - \ProcessMark - \subsubsection*{Mark Indication-Characters} - \MarkCharacters -% - \subsection*{Summary-Unplugged} - \SummaryUnplugged - \subsection*{Mail-Group Commands} - \MailGroups - \subsection*{Draft-Group Commands} - \DraftGroup -% exiting - \subsection*{Exit the Summary-Buffer} - \ExitSummary -% -% -\section*{Article Mode (reading)} -\ArticleModeGeneral - \subsection*{Wash the Article-Buffer} - \WashArticle - \subsection*{Hide/Highlight Parts of the Article} - \HideHighlightArticle - \subsection*{MIME operations from the Article-Buffer (reading)} - \MIMEArticleMode -% -% -\section*{Server Mode} -\ServerMode - \subsection*{Unplugged-Server} - \ServerUnplugged -% -% -\section*{Browse Server Mode} -\BrowseServer - -%\pagebreak -\vspace*{\fill} -\Copyright - -\end{document} - - diff --git a/texi/splitindex b/texi/splitindex deleted file mode 100755 index cfd568c..0000000 --- a/texi/splitindex +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh -match='M-x |(Group)|(Summary)|(Article)|(Server)|(Browse)|(Post)|(Mail)|(Score)|(Binary)|(Topic)|(Pick)' -fun='\{gnus-|\{nn.*-|\{grouplens-' -egrep "$match" gnus.idx > gnus.kidx -egrep "$fun" gnus.idx > gnus.gidx -egrep -v "$match|$fun" gnus.idx > gnus.cidx diff --git a/texi/texi2latex.el b/texi/texi2latex.el deleted file mode 100644 index 5ff6804..0000000 --- a/texi/texi2latex.el +++ /dev/null @@ -1,345 +0,0 @@ -;;; texi2latex.el --- convert a texi file into a LaTeX file. -;; Copyright (C) 1996 Lars Magne Ingebrigtsen - -(require 'cl) - -(defun latexi-discard-until (string) - (let ((beg (match-beginning 0))) - (unless (re-search-forward (concat "^@end +" string "[ \t]*\n") nil t) - (error "No end: %s" string)) - (delete-region beg (match-end 0)))) - -(defun latexi-strip-line () - (delete-region (progn (beginning-of-line) (point)) - (progn (forward-line 1) (point)))) - -(defun latexi-switch-line (command arg) - (latexi-strip-line) - (insert (format "\\%s{%s}\n" command arg))) - -(defun latexi-index-command (command arg) - (latexi-strip-line) - (insert (format "\\gnus%sindex{%s}\n" - (if (equal command "kindex") "k" "") - arg))) - -(defun latexi-begin-command (command) - (latexi-strip-line) - (insert (format "\\begin{%s}\n" command))) - -(defun latexi-exchange-command (command arg) - (delete-region (match-beginning 0) (match-end 0)) - (insert (format "\\%s{%s}" command arg))) - -(defun latexi-translate () - "Translate." - (interactive) - (latexi-translate-file "gnus") - (latexi-translate-file "gnus-faq")) - -(defun latexi-translate-file (file) - "Translate file a LaTeX file." - (let ((item-string "") - (item-stack nil) - (list-stack nil) - (latexi-buffer (get-buffer-create "*LaTeXi*")) - verbatim - (regexp - (concat - "@\\([^{} \t\n]+\\)" - "\\(\\( +\\(.*$\\)\\|[ \t]*$\\)\\|{\\([^}]*\\)}\\)")) - (cur (find-file-noselect (concat (or (getenv "srcdir") ".") - "/" file ".texi"))) - (times 3) - (chapter 0) - command arg) - (pop-to-buffer latexi-buffer) - (buffer-disable-undo) - (erase-buffer) - (insert-buffer-substring cur) - (goto-char (point-min)) - (latexi-strip-line) - (latexi-translate-string "%@{" "\\gnuspercent{}\\gnusbraceleft{}") - (latexi-translate-string "%@}" "\\gnuspercent{}\\gnusbraceright{}") - (latexi-translate-string "%1@{" "\\gnuspercent{}1\\gnusbraceright{}") - (latexi-translate-string "@*" "\\newline{}") - (latexi-translate-string "S@{" "S\\gnusbraceleft{}") - (latexi-translate-string "@code{\\222}" "@code{\\gnusbackslash{}222}") - (latexi-translate-string "@code{\\264}" "@code{\\gnusbackslash{}264}") - (latexi-translate-string "@samp{\\Deleted}" "@samp{\\gnusbackslash{}Deleted}") - (latexi-translate-string "@samp{\\Seen}" "@samp{\\gnusbackslash{}Seen}") -; (while (re-search-forward "{\"[^\"]*\\(\\\\\\)[^\"]*\"}\\\\" nil t) -; (replace-match "\\verb+\\\\+ " t t)) - (while (not (zerop (decf times))) - (goto-char (point-min)) - (while (re-search-forward regexp nil t) - (setq command (match-string 1)) - (if (match-beginning 3) - (progn - (setq arg (or (match-string 4) "")) - (save-match-data - (when (string-match "[ \t]+$" arg) - (setq arg (substring arg 0 (match-beginning 0))))) - (cond - ((member command '("c" "comment")) - (if (string-match "@icon" (or arg "")) - (progn - (beginning-of-line) - (delete-region (point) (+ (point) 4)) - (insert "\\gnus")) - (delete-region (match-beginning 0) - (progn (end-of-line) (point)))) - (if (equal arg "@head") - (insert "\\gnusinteresting"))) - ((member command '("setfilename" - "synindex" "setchapternewpage" - "summarycontents" "bye" - "top" "iftex" "cartouche" - "iflatex" "finalout" "vskip" - "dircategory")) - (latexi-strip-line)) - ((member command '("menu" "tex" "ifinfo" "ignore" - "ifnottex" "direntry")) - (latexi-discard-until command)) - ((member command '("subsection" "subsubsection")) - (latexi-switch-line command arg)) - ((member command '("chapter")) - (latexi-switch-line - (format - "gnus%s{\\epsfig{figure=tmp/new-herd-%d.ps,scale=.5}}" - command (incf chapter)) - arg)) - ((member command '("section")) - (latexi-switch-line (format "gnus%s" command) arg)) - ((member command '("cindex" "findex" "kindex" "vindex")) - (latexi-index-command command arg)) - ((member command '("*")) - (delete-char -2) - (insert "\\\\")) - ((equal command "sp") - (replace-match "" t t)) - ((equal command "node") - (latexi-strip-line) - (insert (format "\\label{%s}\n" arg))) - ((equal command "contents") - (latexi-strip-line) - ;;(insert (format "\\tableofcontents\n" arg)) - ) - ((member command '("titlepage")) - (latexi-begin-command command)) - ((member command '("lisp" "example")) - (latexi-strip-line) - (insert (format "\\begin{verbatim}\n")) - (setq verbatim (point))) - ((member command '("center")) - (latexi-strip-line) - (insert (format "\\begin{%s}%s\\end{%s}\n" - command arg command))) - ((member command '("end")) - (cond - ((member arg '("titlepage")) - (latexi-strip-line) - (insert (format "\\end{%s}\n" arg))) - ((equal arg "quotation") - (latexi-strip-line) - (insert (format "\\end{verse}\n"))) - ((member arg '("lisp" "example")) - (latexi-strip-line) - (save-excursion - (save-restriction - (narrow-to-region verbatim (point)) - (goto-char (point-min)) - (while (search-forward "@{" nil t) - (replace-match "{" t t)) - (goto-char (point-min)) - (while (search-forward "@}" nil t) - (replace-match "}" t t)))) - (setq verbatim nil) - (insert "\\end{verbatim}\n")) - ((member arg '("table")) - (setq item-string (pop item-stack)) - (latexi-strip-line) - (insert (format "\\end{%slist}\n" (pop list-stack)))) - ((member arg '("itemize" "enumerate")) - (setq item-string (pop item-stack)) - (latexi-strip-line) - (insert (format "\\end{%s}\n" arg))) - ((member arg '("iflatex" "iftex" "cartouche")) - (latexi-strip-line)) - (t - (error "Unknown end arg: %s" arg)))) - ((member command '("table")) - (push item-string item-stack) - (push (substring arg 1) list-stack) - (setq item-string - (format "[@%s{%%s}]" (car list-stack))) - (latexi-strip-line) - (insert (format "\\begin{%slist}\n" (car list-stack)))) - ((member command '("itemize" "enumerate")) - (push item-string item-stack) - (cond - ((member arg '("@bullet")) - (setq item-string "[\\gnusbullet]")) - (t - (setq item-string ""))) - (latexi-strip-line) - (insert (format "\\begin{%s}\n" command))) - ((member command '("item")) - (latexi-strip-line) - (insert (format "\\%s%s\n" command (format item-string arg)))) - ((equal command "itemx") - (latexi-strip-line) - (insert (format "\\gnusitemx{%s}\n" (format item-string arg)))) - ((eq (aref command 0) ?@) - (goto-char (match-beginning 0)) - (delete-char 2) - (insert "duppat{}")) - ((equal command "settitle") - (latexi-strip-line) - (insert (format "\\newcommand{\\gnustitlename}{%s}\n" arg))) - ((equal command "title") - (latexi-strip-line) - (insert (format "\\gnustitlename{%s}\n" arg))) - ((equal command "author") - (latexi-strip-line) - (insert (format "\\gnusauthor{%s}\n" arg))) - ((equal command "quotation") - (latexi-begin-command "verse")) - ((equal command "page") - (latexi-strip-line) - (insert (format "\\newpage\n" arg))) - ((equal command "'s") - (goto-char (match-beginning 0)) - (delete-char 1)) - ((equal command "include") - (latexi-strip-line) - (insert "\\input{gnus-faq.latexi}\n")) - ((equal command "noindent") - (latexi-strip-line) - (insert "\\noindent\n")) - ((equal command "printindex") - (latexi-strip-line) - ;;(insert - ;; (format - ;; "\\begin{theindex}\\input{gnus.%s}\\end{theindex}\n" arg)) - ) - (t - (error "Unknown command (line %d): %s" - (save-excursion - (widen) - (1+ (count-lines (point-min) (progn - (beginning-of-line) - (point))))) - command)))) - ;; These are commands with {}. - (setq arg (match-string 5)) - (cond - ((member command '("anchor")) - (latexi-strip-line)) - ((member command '("ref" "xref" "pxref")) - (latexi-exchange-command (concat "gnus" command) arg)) - ((member command '("sc" "file" "dfn" "emph" "kbd" "uref" - "code" "samp" "var" "strong" "i" - "result")) - (goto-char (match-beginning 0)) - (delete-char 1) - (insert "\\gnus")) - ((member command '("copyright" "footnote")) - (goto-char (match-beginning 0)) - (delete-char 1) - (insert "\\")) - ((member command '("dots")) - (goto-char (match-beginning 0)) - (delete-region (match-beginning 0) (match-end 0)) - (insert "...")) - ((eq (aref command 0) ?@) - (goto-char (match-beginning 0)) - (delete-char 2) - (insert "duppat{}")) - (t - (error "Unknown command (line %d): %s" - (save-excursion - (widen) - (1+ (count-lines (point-min) (progn - (beginning-of-line) - (point))))) - command)))))) - (latexi-translate-string "$" "\\gnusdollar{}") - (latexi-translate-string "&" "\\gnusampersand{}") - (latexi-translate-string "%" "\\gnuspercent{}") - (latexi-translate-string "#" "\\gnushash{}") - (latexi-translate-string "^" "\\gnushat{}") - (latexi-translate-string "~" "\\gnustilde{}") - (latexi-translate-string "_" "\\gnusunderline{}") - (latexi-translate-string "¬" "\\gnusnot{}") - (goto-char (point-min)) - (while (search-forward "duppat{}" nil t) - (replace-match "@" t t)) - (latexi-translate-string "@@" "@") - (latexi-translate-string "<" "\\gnusless{}") - (latexi-translate-string ">" "\\gnusgreater{}") - (goto-char (point-min)) - (search-forward "label{Top}" nil t) - (while (re-search-forward "\\\\[ntr]\\b" nil t) - (when (save-match-data - (or (not (save-excursion - (search-backward "begin{verbatim}" nil t))) - (> (save-excursion - (search-backward "end{verbatim")) - (save-excursion - (search-backward "begin{verbatim}"))))) - (goto-char (match-beginning 0)) - (delete-char 1) - (insert "\\gnusbackslash{}"))) - (latexi-translate-string "\\\\" "\\gnusbackslash{}") - (goto-char (point-min)) - (while (re-search-forward "\\\\[][{}]" nil t) - (goto-char (match-beginning 0)) - (delete-char 1)) - (latexi-contributors) - (let ((coding-system-for-write 'iso-8859-1)) - (write-region (point-min) (point-max) (concat file ".latexi"))))) - -(defun latexi-translate-string (in out) - (let (yes) - (goto-char (point-min)) - (search-forward "label{Top}" nil t) - (while (search-forward in nil t) - (when (save-match-data - (or (not (save-excursion - (search-backward "begin{verbatim}" nil t))) - (> (save-excursion - (re-search-backward "end{verbatim}\\|end{verse}")) - (save-excursion - (re-search-backward - "begin{verbatim}\\|begin{verse}"))))) - (replace-match out t t))))) - -(defun latexi-contributors () - (goto-char (point-min)) - (when (re-search-forward "^Also thanks to the following" nil t) - (forward-line 2) - (narrow-to-region - (point) - (1- (search-forward "\n\n"))) - (when (re-search-backward "^and" nil t) - (latexi-strip-line)) - (goto-char (point-min)) - (while (re-search-forward "[.,] *$" nil t) - (replace-match "" t t)) - (goto-char (point-min)) - (let (names) - (while (not (eobp)) - (push (buffer-substring (point) (progn (end-of-line) (point))) - names) - (forward-line 1)) - (delete-region (point-min) (point-max)) - (insert "\\begin{tabular}{lll}\n") - (setq names (nreverse (delete "" names))) - (while names - (insert (pop names) " & " (or (pop names) "\\mbox{}") - " & " (or (pop names) "\\mbox{}") - "\\\\\n")) - (insert "\\end{tabular}\n") - (widen)))) - diff --git a/todo b/todo deleted file mode 100644 index daa6f67..0000000 --- a/todo +++ /dev/null @@ -1,1486 +0,0 @@ -;; Also know as the "wish list". Some are done. For the others, no -;; promise when to be implemented. - -* Multiple charsets for topic names. - -* Allow specification of server in Newsgroups header - - [Kai wrote] - - WIBNI I could put `Newsgroups: nntp+quimby:bla' into a message and - Gnus would know to post this message on my server `nntp:quimby' into - the group bla? I think this would be way cool. - - But Gnus would have to rewrite the Newsgroups header before actually - sending the posting. - - Thanks for Micha Wiedenmann for this suggestion. - -* Understand mail-user-agent. Maybe gnus-mail-user-agent. - - [Done] - -* Emphasis delimiters show when `W W c'. - - [Fixed] - -* Parsing of the common list confirmation requests so that Gnus can - prepare the response with a single command. Including LISTSERV - periodic ping messages and the like. - -* Parsing of the various List-* headers to enable automatic commands - like "send help message," "send unsubscribe message," and the like. - - [done, see gnus-ml.el] - -* Parsing of the subscription notice to stash away details like what - address you're subscribed to the list under (and automatically send - mail to the list using that address, when you send mail inside the list - group), what address to mail to unsubscribe, and the list info message - if available. Hitting the "get FAQ" command inside a mailing list - group should display that stashed copy of the info message. - -* Some help in coming up with good split rules for mailing lists, as - automated as possible. Splitting on To and Cc is almost always not - what I want, since it can misfile messages and since if I'm cc'd on - list mail I want to get both copies, one in my personal mailbox and one - in the list mailbox. I know other people handle it other ways, but I - prefer it that way. Accordingly, some way to semi-automatically - generate split rules based on Sender, Mailing-List, Return-Path, - X-Loop, and all of the other random headers that often work would be - very cool. - -* Support for zipped folders for all backends this makes sense for. - Most likely using jka-compr. (It has been suggested that this do - work but I think it should be verified for all backends.) - -* Support for RFC2015, PGP-MIME. Probably has to involve the people in - the Mailcrypt project. - - [done] - -* Agent (Can someone write some subtopics here? I don't use it myself - so I don't know what is lacking.) - -* Support for encrypted folders. Even if the mail arrives unencrypted - Gnus should be able to encrypt the *folder* for added safety. This - should go for both Gnus' own folders and the folders Gnus reads from - (e.g. /var/spool/mail/${USER}). All backends this makes sense for. - - [John Wiegley's article <200011030445.VAA08277@localhost.dynodns.net>, - posted on gnu.emacs.gnus does this. - Also, gnus-article-encrypt `K E' encrypts the article body.] - -* The stuff on "Newest Features" in the manual should be implemented - and the node updated (it maybe is?). - -* Splitting .newsrc.eld so the history is in one file and the - configuration is in another. To help those that reads at two - locations (e.g. work and home) and want to have the same - configuration. - -* gnus-uu-decode should complain if one or more parts of a series post - (ie, "part N of X") is missing, and optionally tick what parts are - there for decoding in a later session. - -* Additional article marking, and an ability to affect marks placed - during e.g. mail acquisition. I want to be able to notice the - subject "fast money" or "web traffic", automatically mark it with a - `$', and score it into oblivion. (But I fear that wanting to change - marks with mail-source-* and nnmail-* functions will represent a - philosophical conflict with the rest of Gnus' management of article - marks. mail-source-* and nnmail-* currently hack around with files - under ~/Mail and leave traces in ~/Mail/active, but don't affect - things stored in .newsrc.eld.) - -* A much better interface to nnmail-split-methods. I don't know how - I'd like this done, but I know that the current method of manually - hacking regexps is pretty untenable for new users. My boss, who is - tenured faculty at CMU and CEO & CTO at JPRC, and whose research - work has involved Lisp for the last 25 years, is trying to implant - himself in a Gnus mail environment, and this is a big sticking point - even for him. - -* PGP-supported encryption of entire nnml & nnmh groups. There are - people with whom I exchange mail routinely who don't send w/PGP, but - I'd really rather that the content not be left lying around - unencrypted. Hook into article acquisition the way jka-compr - supposedly does, to auto-decrypt every message read. - - [See Support for encrypted folders.] - -* Baby's First Mail In Gnus. Some set of functions that the - new-to-mail-in-Gnus user can invoke which will query the user - appropriately for the basic information required to establish mail - handling, leaving the appropriate traces in .gnus. Perhaps a - customize buffer would be appropriate. - - Where does your mail come from? - - If some server, what is your POP/IMAP protocol identity? - - What is your identity when sending mail, as opposed to posting to - Usenet? - - Here are some basic concepts of mail groups (list a few: - personal mail, company-wide mail, mailing lists, garbage dumps, - receptacles for outbound copies of what one sends; which ones do - you want to instantiate, and what mail should land in each? - [/viz./ problem of nnmail-split-methods interface.] - -* Full integration of nnir into Gnus. Generic hooks for adding new - external nnir sources. I use a couple experimental, in-house tools - (JPRC is a research lab, occupied with document analysis and machine - learning) and adding new search engines to nnir by hacking the main - nnir.el module is rather clunky. - -* Manual ordering of articles in an nnml folder. - - That is, keystrokes to move articles (or whole threads) up or down - in the *Summary* buffer relative to the other articles. The order - would be persistent (e.g., across gnus sessions). - - With this ability, an nnml folder would make for a good to-do list. - -* Since many uses Gnus to store to do lists I think it is time for an - nntodo. (I know Kai already written one, maybe use that for a start?) - -* nnsql backend, which would allow messages or folders to be imported - in a local (My|Postgre|?)SQL RDBMS. - -* "posting profiles" ideally accessible from a popup menu; allowing - choice between predefined profiles of - from,name,organization,etc. Example: I'm at home, but need to reply - to a work mail; i can hit 'R', then use this command to switch to my - 'work' profile for purposes of this one reply. (This might already - be possible with current Gnus, but I don't think so.) - -* Better handling of the mail retrieving / splitting feature: - - the variables -get-new-mail should not exist anymore. Mail - retrieving should be a separate matter. - - we should be able to split mails to groups AND backends at the same time. - - meanwhile, we should still be able to associate certain mail sources with - certain backends. - -* A better interface to the agent download scoring rules, like the one - for the other scoring rules. - -* Editing of messages in the agents cache. - -* More article marks (like '!' or '?'). - Maybe user defined marks that can be displayed as any choosen charakter, - so one could do things like limiting on, to do whatever one likes with - these articles. - -* A possibility to add notes to messages. If thouse could include links - to other (stored) messages this would be very practical. - -* A nnfolder like backend with .overview files. - This would not only speed up things, but also allow nnir to work on it. - - [done] - -* Allow article editing in groups which do not support it, but - emulating it via deleting the old article and entering the new one - into the group. This would be very useful to support `T ^' (say) in - nnimap groups. - -* Allow user to specify which kinds of groups should be displayed. - For example, I want to display all the groups that are displayed - now, plus those which have cached messages in them. (Gnus does - display those with ticked messages but not those with - cached-but-unticked ones.) This would become even more important - when we allow labels. - -* Go through the todo list and remove items already done. - -* Create new data type `article identifier' and use that instead of - article numbers. A first implementation could offer something like - (num . 4711) but this could be extended. This would be useful for - using servers with *really* large numbers -- there we could have a - bignum type. It might also be useful for the nnweb and nnultimate - thingies where article identifiers are not really numbers. - -* Allow use of digests to keep related articles. Normally, you use - groups to group together articles which are thematically related. - But sometimes, you have so many themes that this becomes - impractical. WIBNI I could have digests in a group, and there was a - way to add a new article to one of the digests in that group? - - Or maybe what I really want is a way to tell Gnus that a specific - thread should always be hidden (as in `T h') by default, while most - other threads are not hidden by default. Hm. - -* New backend between nnfolder and nnml: have more than one article - per file, but more than one file per group. With .overview files. - - [done. nnfolder has .overview. Backward- and forward-compatible - between 1.0 and 2.0. (setq nnfolder-nov-is-evil t) disables the - feature] - -* .overview files for nnfolder? - - [done] - -* New backend nnbabylfolder. There is also nnbabyl which is like - nnmbox but uses babyl format, but there is no babyl format - equivalent of nnfolder. - -* Make movement commands in summary buffer independent of `move after - mark' behavior when marking articles. Currently, if you don't want - `E' to move to the next unread article, you have to set - gnus-summary-goto-unread to nil, and then there is no way to move to - the next or previous unread article. - - This one has two sub-tasks. Providing the commands is one thing, - finding out useful key bindings for them is another. I think we - could provide the commands first while not changing the behavior of - the key bindings; then different people can experiment with - different key binding schemes until we find something which suits - many people. - -* `Move to next/previous/first article' is a misnomer, since ticked - articles are also unread but not moved to by these commands. Should - the terminology be fixed or the documentation, or what? - -* Allow sorting of threads by newest article rather than by root of - thread. Consider the following thread structure: - - root1 Jan 1 - leaf1 Jan 4 - root2 Jan 2 - leaf2 Jan 3 - - These two threads are sorted this way because root1 is older than - root2. I want an option to sort them the other way round because - leaf1 is newer than leaf2. - -* Improve editing of MIME messages. I would like to use html-mode to - edit the body of a text/html message, and enriched-mode for - text/enriched messages, and so on. This should go for multipart - messages as well. This is probably a hard one since Emacs currently - does not allow several major modes per buffer. But maybe it would - be nice to hack Emacs to provide this infrastructure so that Gnus - can make use of it? This would also make it possible to provide - nifty commands for editing the headers, for example, rather than - relying on commands which do the same thing everywhere. - message-x.el is really just a half-assed attempt at doing it, and - while it is useful, that's not the way it should be done. - - I think Francisco Potort,Al(B already did something like this? - -* Provide commands for editing MML tags. For example, there could be - a command mml-add-tag-attribute which prompts me for an attribute - name (with completion, from the set filename, type, ...), and then - for a value. (This is like `C-c +' in psgml.) Or there could be a - command which showed me all the attributes in an MML tag and allows - me to use TAB to move between them, and then to edit each attribute - value. (This is like `C-c C-a' in psgml.) - -* Have Gnus automagically set group parameters for mailing list - groups. For example, if I have a splitting rule that automatically - sorts ding@gnus.org into mail.ding, then Gnus should clue in, set - the to-list parameter to 'ding@gnus.org', and set total-expire. - (This is probably Hard (TM). And of course the user should be able - to configure what parameters exactly get set.) - -* Along the same lines, automagically detect broken reply-to's. (But - don't auto-detect users legitimately setting a reply-to header that - points back to the list.) - -* Make it easier to change parameters on a set of groups, - e.g. set/clear gcc-self on process-marked groups. - -* Make it easier/possible to migrate between primary select-methods, - if that concept is going to be kept. Right now I have only one - group on my primary server, and I'd kind of like to change from nntp - to nnml, but apparently this doesn't work well. - -* Make it possible to refer to uniquely-named groups without - select-method prefix (e.g. mail.misc instead of nnml:mail.misc). - -* Allow a user-defined picons directory for personal groups. - -* Annotations as discussed last autumn. Be able to make comments to - articles for all bakends. The comments amybe should go into a - seperate "backend", like nndraft. - -* Catchup on a topic and all its subtopics. I.e. do "c y" when on a - topic line in *Group*. - -* Better/more advanced subject washing in *Summary*, see my - js-gnus-simplify-subject-function I posted earlier this winter. - -;; From Newest Features node. Some are not done. - -* I would like the zombie-page to contain an URL to the source of the -latest version of gnus or some explanation on where to find it. - -* A way to continue editing the latest Message composition. - -* http://www.sonicnet.com/feature/ari3/ - - [N/A] - -* facep is not declared. - -* Include a section in the manual on why the number of articles isn't -the same in the group buffer and on the SPC prompt. - -* Interacting with rmail fcc isn't easy. - -* Hypermail: - [N/A] - [N/A] - [N/A] - [N/A] - http://www.uwsg.indiana.edu/hypermail/linux/kernel/9610/index.html - [N/A] - [N/A]http://www.miranova.com/gnus-list/ - - [w3 or nnwarchive?] - -* `^-- ' is made into - in LaTeX. - -* gnus-kill is much slower than it was in GNUS 4.1.3. - -* when expunging articles on low score, the sparse nodes keep - hanging on? - -* starting the first time seems to hang Gnus on some systems. Does - NEWGROUPS answer too fast? - -* nndir doesn't read gzipped files. - -* FAQ doesn't have an up node? - -* when moving mail from a procmail spool to the crash-box, the - crash-box is only appropriate to one specific group. - -* `t' `t' makes X-Faces disappear. - -* nnmh-be-safe means that crossposted articles will be marked as - unread. - -* Orphan score entries don't show on "V t" score trace - -* when clearing out data, the cache data should also be reset. - -* rewrite gnus-summary-limit-children to be non-recursive to avoid -exceeding lisp nesting on huge groups. - -* expunged articles are counted when computing scores. - -* implement gnus-batch-brew-soup - -* ticked articles aren't easy to read in pick mode - `n' and stuff - just skips past them. Read articles are the same. - -* topics that contain just groups with ticked articles aren't - displayed. - -* nndoc should always allocate unique Message-IDs. - -* If there are mail groups the first time you use Gnus, Gnus'll - make the mail groups killed. - -* no "no news is good news" when using topics. - -* when doing crosspost marking, the cache has to be consulted and - articles have to be removed. - -* nnweb should fetch complete articles when they are split into - several parts. - -* scoring on head immediate doesn't work. - -* finding short score file names takes forever. - -* canceling articles in foreign groups. - -* nntp-open-rlogin no longer works. - -* C-u C-x C-s (Summary) switches to the group buffer. - -* move nnmail-split-history out to the backends. - -* nnweb doesn't work properly. - -* using a virtual server name as `gnus-select-method' doesn't work? - -* when killing/yanking a group from one topic to another in a - slave, the master will yank it first to one topic and then add it - to another. Perhaps. - -* warn user about `=' redirection of a group in the active file? - -* take over the XEmacs menubar and offer a toggle between the XEmacs - bar and the Gnus bar. - -* push active file and NOV file parsing down into C code. - `(canonize-message-id id)' - `(mail-parent-message-id references n)' - `(parse-news-nov-line &optional dependency-hashtb)' - `(parse-news-nov-region beg end &optional dependency-hashtb fullp)' - `(parse-news-active-region beg end hashtb)' - -* nnml .overview directory with splits. - -* asynchronous cache - -* postponed commands. - -* the selected article show have its Subject displayed in its - summary line. - -* when entering groups, get the real number of unread articles from - the server? - -* sort after gathering threads - make false roots have the headers - of the oldest orphan with a 0 article number? - -* nndoc groups should inherit the score files of their parents? - Also inherit copy prompts and save files. - -* command to start up Gnus (if not running) and enter a mail mode - buffer. - -* allow editing the group description from the group buffer for - backends that support that. - -* gnus-hide,show-all-topics - -* groups and sub-topics should be allowed to mingle inside each - topic, and not just list all subtopics at the end. - -* a command to remove all read articles that are not needed to - connect threads - `gnus-summary-limit-to-sparse-unread'? - -* a variable to turn off limiting/cutting of threads in the tree - buffer. - -* a variable to limit how many files are uudecoded. - -* add zombie groups to a special "New Groups" topic. - -* server mode command: close/open all connections - -* put a file date in gnus-score-alist and check whether the file - has been changed before using it. - -* on exit from a digest group, go to the next article in the parent - group. - -* hide (sub)threads with low score. - -* when expiring, remove all marks from expired articles. - -* gnus-summary-limit-to-body - -* a regexp alist that says what level groups are to be subscribed - on. Eg. - `(("nnml:" . 1))'. - -* easier interface to nnkiboze to create ephemeral groups that - contain groups that match a regexp. - -* allow newlines in urls, but remove them before using the - URL. - -* If there is no From line, the mail backends should fudge one from - the "From " line. - -* fuzzy simplifying should strip all non-alpha-numerical info from - subject lines. - -* gnus-soup-brew-soup-with-high-scores. - -* nntp-ping-before-connect - -* command to check whether NOV is evil. "list overview.fmt". - -* when entering a group, Gnus should look through the score files - very early for `local' atoms and set those local variables. - -* message annotations. - -* topics are always yanked before groups, and that's not good. - -* (set-extent-property extent 'help-echo "String to display in - minibuf") to display help in the minibuffer on buttons under - XEmacs. - -* allow group line format spec to say how many articles there are - in the cache. - -* AUTHINFO GENERIC - -* `run-with-idle-timer' in gnus-demon. - -* stop using invisible text properties and start using overlays - instead - -* C-c C-f C-e to add an Expires header. - -* go from one group to the next; everything is expunged; go to the - next group instead of going to the group buffer. - -* gnus-renumber-cache - to renumber the cache using "low" numbers. - -* record topic changes in the dribble buffer. - -* `nnfolder-generate-active-file' should look at the folders it - finds and generate proper active ranges. - -* nneething-look-in-files-for-article-heads variable to control - whether nneething should sniff all files in the directories. - -* gnus-fetch-article - start Gnus, enter group, display article - -* gnus-dont-move-articles-to-same-group variable when respooling. - -* when messages are crossposted between several auto-expirable - groups, articles aren't properly marked as expirable. - -* nneething should allow deletion/moving. - -* TAB on the last button should go to the first button. - -* if the car of an element in `mail-split-methods' is a function, - and the function returns non-nil, use that as the name of the - group(s) to save mail in. - -* command for listing all score files that have been applied. - -* a command in the article buffer to return to `summary' config. - -* `gnus-always-post-using-current-server' - variable to override - `C-c C-c' when posting. - -* nnmail-group-spool-alist - says where each group should use as a - spool file. - -* when an article is crossposted to an auto-expirable group, the - article should be marker as expirable. - -* article mode command/menu for "send region as URL to browser". - -* on errors, jump to info nodes that explain the error. For - instance, on invalid From headers, or on error messages from the - nntp server. - -* when gathering threads, make the article that has no "Re: " the - parent. Also consult Date headers. - -* a token in splits to call shrink-window-if-larger-than-buffer - -* `1 0 A M' to do matches on the active hashtb. - -* duplicates - command to remove Gnus-Warning header, use the read - Message-ID, delete the "original". - -* when replying to several messages at once, put the "other" - message-ids into a See-Also header. - -* support setext: URL:http://www.bsdi.com/setext/ - -* support ProleText: - - -* when browsing a foreign server, the groups that are already - subscribed should be listed as such and not as "K". - - [done] - -* generate font names dynamically. - -* score file mode auto-alist. - -* allow nndoc to change/add/delete things from documents. Implement - methods for each format for adding an article to the document. - -* `gnus-fetch-old-headers' `all' value to incorporate absolutely - all headers there is. - -* function like `|', but concatenate all marked articles and pipe - them to the process. - -* cache the list of killed (or active) groups in a separate file. - Update the file whenever we read the active file or the list of - killed groups in the .eld file reaches a certain length. - -* function for starting to edit a file to put into the current mail - group. - -* score-find-trace should display the total score of the article. - -* "ghettozie" - score on Xref header and nix it out after using it - to avoid marking as read in other groups it has been crossposted - to. - -* look at procmail splitting. The backends should create the - groups automatically if a spool file exists for that group. - -* function for backends to register themselves with Gnus. - -* when replying to several process-marked articles, have all the - From end up in Cc headers? Variable to toggle. - -* command to delete a crossposted mail article from all groups it - has been mailed to. - -* `B c' and `B m' should be crosspost aware. - -* hide-pgp should also hide PGP public key blocks. - -* Command in the group buffer to respool process-marked groups. - -* `gnus-summary-find-matching' should accept pseudo-"headers" like - "body", "head" and "all" - -* When buttifying things, all white space (including - newlines) should be ignored. - -* Process-marking all groups in a topic should process-mark groups - in subtopics as well. - -* Add non-native groups to the list of killed groups when killing - them. - -* nntp-suggest-kewl-config to probe the nntp server and suggest - variable settings. - -* add edit and forward secondary marks. - -* nnml shouldn't visit its .overview files. - -* allow customizing sorting within gathered threads. - -* `B q' shouldn't select the current article. - -* nnmbox should support a newsgroups file for descriptions. - -* allow fetching mail from several pop servers. - - [done] - -* Be able to specify whether the saving commands save the original - or the formatted article. - -* a command to reparent with the child process-marked (cf. `T ^'.). - -* I think the possibility to send a password with nntp-open-rlogin - should be a feature in Red Gnus. - -* The `Z n' command should be possible to execute from a mouse - click. - -* more limiting functions - date, etc. - -* be able to limit on a random header; on body; using reverse - matches. - -* a group parameter (`absofucking-total-expiry') that will make - Gnus expire even unread articles. - -* a command to print the article buffer as postscript. - -* variable to disable password fetching when opening by - nntp-open-telnet. - -* manual: more example servers - nntp with rlogin, telnet - -* checking for bogus groups should clean topic alists as well. - -* canceling articles in foreign groups. - -* article number in folded topics isn't properly updated by Xref - handling. - -* Movement in the group buffer to the next unread group should go - to the next closed topic with unread messages if no group can be - found. - -* Extensive info pages generated on the fly with help everywhere - - in the "*Gnus edit*" buffers, for instance. - -* Topic movement commands - like thread movement. Up, down, - forward, next. - -* a way to tick/mark as read Gcc'd articles. - - [done, (setq gnus-inews-mark-gcc-as-read t)] - -* a way to say that all groups within a specific topic comes from a - particular server? Hm. - -* `gnus-article-fill-if-long-lines' - a function to fill the - article buffer if there are any looong lines there. - -* `T h' should jump to the parent topic and fold it. - -* a command to create an ephemeral nndoc group out of a file, and - then splitting it/moving it to some other group/backend. - -* a group parameter for nnkiboze groups that says that all kibozed - articles should be entered into the cache. - -* It should also probably be possible to delimit what - `gnus-jog-cache' does - for instance, work on just some groups, or - on some levels, and entering just articles that have a score - higher than a certain number. - -* nnfolder should append to the folder instead of re-writing the - entire folder to disk when accepting new messages. - -* allow all backends to do the proper thing with .gz files. - -* a backend for reading collections of babyl files nnbabylfolder? - -* a command for making the native groups into foreign groups. - -* server mode command for clearing read marks from all groups from - a server. - -* when following up multiple articles, include all To, Cc, etc - headers from all articles. - -* a command for deciding what the total score of the current thread - is. Also a way to highlight based on this. - -* command to show and edit group scores - -* a gnus-tree-minimize-horizontal to minimize tree buffers - horizontally. - -* command to generate nnml overview file for one group. - -* `C-u C-u a' - prompt for many crossposted groups. - -* keep track of which mail groups have received new articles (in - this session). Be able to generate a report and perhaps do some - marking in the group buffer. - -* gnus-build-sparse-threads to a number - build only sparse threads - that are of that length. - -* have nnmh respect mh's unseen sequence in .mh_profile. - -* cache the newsgroups descriptions locally. - -* asynchronous posting under nntp. - -* be able to control word adaptive scoring from the score files. - -* a variable to make `C-c C-c' post using the "current" select - method. - -* `limit-exclude-low-scored-articles'. - -* if `gnus-summary-show-thread' is a number, hide threads that have - a score lower than this number. - -* split newsgroup subscription variable up into "order" and - "method". - -* buttonize ange-ftp file names. - -* a command to make a duplicate copy of the current article so that - each copy can be edited separately. - -* nnweb should allow fetching from the local nntp server. - -* record the sorting done in the summary buffer so that it can be - repeated when limiting/regenerating the buffer. - -* nnml-generate-nov-databses should generate for all nnml servers. - -* when the user does commands in the group buffer, check the - modification time of the .newsrc.eld file and use - ask-user-about-supersession-threat. Also warn when trying to save - .newsrc.eld and it has changed. - -* M-g on a topic will display all groups with 0 articles in the - topic. - -* command to remove all topic stuff. - -* allow exploding incoming digests when reading incoming mail and - splitting the resulting digests. - -* nnsoup shouldn't set the `message-' variables. - -* command to nix out all nnoo state information. - -* nnmail-process-alist that calls functions if group names matches - an alist - before saving. - -* use buffer-invisibility-spec everywhere for hiding text. - -* variable to activate each group before entering them to get the - (new) number of articles. `gnus-activate-before-entering'. - -* command to fetch a Message-ID from any buffer, even starting Gnus - first if necessary. - -* when posting and checking whether a group exists or not, just ask - the nntp server instead of relying on the active hashtb. - -* buttonize the output of `C-c C-a' in an apropos-like way. - -* `G p' should understand process/prefix, and allow editing of - several groups at once. - -* command to create an ephemeral nnvirtual group that matches some - regexp(s). - -* nndoc should understand "Content-Type: message/rfc822" forwarded - messages. - - [done] - -* it should be possible to score "thread" on the From header. - -* hitting RET on a "gnus-uu-archive" pseudo article should unpack - it. - -* `B i' should display the article at once in the summary buffer. - -* remove the "*" mark at once when unticking an article. - -* `M-s' should highlight the matching text. - -* when checking for duplicated mails, use Resent-Message-ID if - present. - -* killing and yanking groups in topics should be better. If - killing one copy of a group that exists in multiple topics, only - that copy should be removed. Yanking should insert the copy, and - yanking topics should be possible to be interspersed with the - other yankings. - -* command for enter a group just to read the cached articles. A - way to say "ignore the nntp connection; just read from the cache." - -* `X u' should decode base64 articles. - - [`X m' does so.] - -* a way to hide all "inner" cited text, leaving just the most - recently cited text. - -* nnvirtual should be asynchronous. - -* after editing an article, gnus-original-article-buffer should be - invalidated. - -* there should probably be a way to make Gnus not connect to the - server and just read the articles in the server - -* allow a `set-default' (or something) to change the default value - of nnoo variables. - -* a command to import group infos from a .newsrc.eld file. - -* groups from secondary servers have the entire select method - listed in each group info. - -* a command for just switching from the summary buffer to the group - buffer. - -* a way to specify that some incoming mail washing functions should - only be applied to some groups. - -* Message `C-f C-t' should ask the user whether to heed - mail-copies-to: never. - -* new group parameter - `post-to-server' that says to post using - the current server. Also a variable to do the same. - -* the slave dribble files should auto-save to the slave file names. - -* a group parameter that says what articles to display on group - entry, based on article marks. - -* a way to visually distinguish slave Gnusae from masters. (Whip - instead of normal logo?) - -* Use DJ Bernstein "From " quoting/dequoting, where applicable. - -* Why is hide-citation-maybe and hide-citation different? Also - clear up info. - -* group user-defined meta-parameters. - - From: John Griffith - -* I like the option for trying to retrieve the FAQ for a group and - I was thinking it would be great if for those newsgroups that had - archives you could also try to read the archive for that group. - Part of the problem is that archives are spread all over the net, - unlike FAQs. What would be best I suppose is to find the one - closest to your site. - - In any case, there is a list of general news group archives at - ftp://ftp.neosoft.com/pub/users/claird/news.lists/newsgroup_archives.html - -* From: Jason L Tibbitts III - (add-hook 'gnus-select-group-hook - (lambda () - (gnus-group-add-parameter group - (cons 'gnus-group-date-last-entered (list (current-time-string)))))) - - (defun gnus-user-format-function-d (headers) - "Return the date the group was last read." - (cond ((car (gnus-group-get-parameter gnus-tmp-group 'gnus-group-date-last-entered))) - (t ""))) - -* tanken var at n,Ae(Br du bruker `gnus-startup-file' som prefix (FOO) - til ,Ae(B lete opp en fil FOO-SERVER, FOO-SERVER.el, FOO-SERVER.eld, - kan du la den v,Af(Bre en liste hvor du bruker hvert element i listen - som FOO, istedet. da kunne man hatt forskjellige serveres - startup-filer forskjellige steder. - -* LMI> Well, nnbabyl could alter the group info to heed labels like - LMI> answered and read, I guess. - - It could also keep them updated (the same for the Status: header of - unix mbox files). - - They could be used like this: - - `M l RET' add label to current message. - `M u RET' remove label from current message. - `/ l RET' limit summary buffer according to . - - would be a boolean expression on the labels, e.g. - - `/ l bug & !fixed RET' - - would show all the messages which are labeled `bug' but not labeled - `fixed'. - - One could also imagine the labels being used for highlighting, or - affect the summary line format. - -* Sender: abraham@dina.kvl.dk - - I'd like a gnus-find-file which work like find file, except that it - would recognize things that looks like messages or folders: - - - If it is a directory containing numbered files, create an nndir - summary buffer. - - - For other directories, create a nneething summary buffer. - - - For files matching "\\`From ", create a nndoc/mbox summary. - - - For files matching "\\`BABYL OPTIONS:", create a nndoc/baby - summary. - - - For files matching "\\`[^ \t\n]+:", create an *Article* buffer. - - - For other files, just find them normally. - - I'd like `nneething' to use this function, so it would work on a - directory potentially containing mboxes or babyl files. - -* Please send a mail to bwarsaw@cnri.reston.va.us (Barry A. Warsaw) - and tell him what you are doing. - -* Currently, I get prompted: - - decend into sci? - type y decend into sci.something ? - type n - decend into ucd? - - The problem above is that since there is really only one - subsection of science, shouldn't it prompt you for only descending - sci.something? If there was a sci.somethingelse group or section, - then it should prompt for sci? first the sci.something? then - sci.somethingelse?... - -* Ja, det burde v,Af(Bre en m,Ae(Bte ,Ae(B si slikt. Kanskje en ny variabel? - `gnus-use-few-score-files'? S,Ae(B kunne score-regler legges til den - "mest" lokale score-fila. F. eks. ville no-gruppene betjenes av - "no.all.SCORE", osv. - -* What i want is for Gnus to treat any sequence or combination of - the following as a single spoiler warning and hide it all, - replacing it with a "Next Page" button: - - ^L's - - more than n blank lines - - more than m identical lines (which should be replaced with button - to show them) - - any whitespace surrounding any of the above - -* Well, we could allow a new value to `gnus-thread-ignore-subject' - - `spaces', or something. (We could even default to that.) And then - subjects that differ in white space only could be considered the - "same" subject for threading purposes. - -* Modes to preprocess the contents (e.g. jka-compr) use the second - form "(REGEXP FUNCTION NON-NIL)" while ordinary modes (e.g. tex) - use the first form "(REGEXP . FUNCTION)", so you could use it to - distinguish between those two types of modes. (auto-modes-alist, - insert-file-contents-literally.) - -* Under XEmacs - do funny article marks: tick - thumb tack killed - - skull soup - bowl of soup score below - dim light bulb score over - - bright light bulb - -* Yes. I think the algorithm is as follows: - - Group-mode - - show-list-of-articles-in-group - if (key-pressed == SPACE) - if (no-more-articles-in-group-to-select) - if (articles-selected) - start-reading-selected-articles; - junk-unread-articles; - next-group; - else - show-next-page; - - else if (key-pressed = '.') - if (consolidated-menus) # same as hide-thread in Gnus - select-thread-under-cursor; - else - select-article-under-cursor; - - - Article-mode - if (key-pressed == SPACE) - if (more-pages-in-article) - next-page; - else if (more-selected-articles-to-read) - next-article; - else - next-group; - -* My precise need here would have been to limit files to Incoming*. - One could think of some `nneething-only-files' variable, but I - guess it would have been unacceptable if one was using many - unrelated such nneething groups. - - A more useful approach would be to, in response to the `G D' - prompt, be allowed to say something like: `~/.mail/Incoming*', - somewhat limiting the top-level directory only (in case - directories would be matched by the wildcard expression). - -* It would be nice if it also handled - - - - which should correspond to `B nntp RET sunsite.auc.dk' in *Group*. - - [done] - -* Take a look at w3-menu.el in the Emacs-W3 distribution - this - works out really well. Each menu is 'named' by a symbol that - would be on a gnus-*-menus (where * would be whatever, but at - least group, summary, and article versions) variable. - - So for gnus-summary-menus, I would set to '(sort mark dispose ...) - - A value of '1' would just put _all_ the menus in a single 'GNUS' - menu in the main menubar. This approach works really well for - Emacs-W3 and VM. - -* nndoc should take care to create unique Message-IDs for all its - articles. - -* gnus-score-followup-article only works when you have a summary - buffer active. Make it work when posting from the group buffer as - well. (message-sent-hook). - -* rewrite gnus-demon to use run-with-idle-timers. - -* * Enhancements to Gnus: - - Add two commands: - - * gnus-servers (gnus-start-server-buffer?)-enters Gnus and goes - straight to the server buffer, without opening any connections to - servers first. - - * gnus-server-read-server-newsrc-produces a buffer very similar to - the group buffer, but with only groups from that server listed; - quitting this buffer returns to the server buffer. - -* add a command to check the integrity of an nnfolder folder - go - through the article numbers and see that there are no duplicates, - and stuff. - -* `unsmileyfy-buffer' to undo smileification. - -* a command to give all relevant info on an article, including all - secondary marks. - -* when doing `-request-accept-article', the backends should do the - nnmail duplicate checking. - -* allow `message-signature-file' to be a function to return the - value of the signature file. - -* In addition, I would love it if I could configure message-tab so - that it could call `bbdb-complete-name' in other headers. So, - some sort of interface like - - (setq message-tab-alist '((message-header-regexp - message-expand-group) ("^\\(To\\|[cC]c\\|[bB]cc\\)" - bbdb-complete-name))) - - then you could run the relevant function to complete the - information in the header - -* cache the newsgroups file locally to avoid reloading it all the - time. - -* a command to import a buffer into a group. - -* nnweb should allow fetching by Message-ID from servers. - -* point in the article buffer doesn't always go to the beginning of - the buffer when selecting new articles. - -* a command to process mark all unread articles. - -* `gnus-gather-threads-by-references-and-subject' - first do - gathering by references, and then go through the dummy roots and - do more gathering by subject. - -* gnus-uu-mark-in-numerical-order - process mark articles in - article numerical order. - -* (gnus-thread-total-score (gnus-id-to-thread (mail-header-id - (gnus-summary-article-header)))) bind to a key. - -* sorting by score is wrong when using sparse threads. - -* a command to fetch an arbitrary article - without having to be in - the summary buffer. - -* a new nncvs backend. Each group would show an article, using - version branches as threading, checkin date as the date, etc. - -* http://www.dejanews.com/forms/dnsetfilter_exp.html ? This filter - allows one to construct advance queries on the Dejanews database - such as specifying start and end dates, subject, author, and/or - newsgroup name. - -* new Date header scoring type - older, newer - -* use the summary toolbar in the article buffer. - -* a command to fetch all articles that are less than X days old. - -* in pick mode, `q' should save the list of selected articles in the - group info. The next time the group is selected, these articles - will automatically get the process mark. - -* Isn't it possible to (also?) allow M-^ to automatically try the - default server if it fails on the current server? (controlled by a - user variable, (nil, t, 'ask)). - -* make it possible to cancel articles using the select method for - the current group. - -* `gnus-summary-select-article-on-entry' or something. It'll - default to t and will select whatever article decided by - `gnus-auto-select-first'. - -* a new variable to control which selection commands should be - unselecting. `first', `best', `next', `prev', `next-unread', - `prev-unread' are candidates. - -* be able to select groups that have no articles in them to be able - to post in them (using the current select method). - -* be able to post via DejaNews. - -* `x' should retain any sortings that have been performed. - -* allow the user to specify the precedence of the secondary marks. - Also allow them to be displayed separately. - -* gnus-summary-save-in-pipe should concatenate the results from the - processes when doing a process marked pipe. - -* a new match type, like Followup, but which adds Thread matches on - all articles that match a certain From header. - -* a function that can be read from kill-emacs-query-functions to - offer saving living summary buffers. - -* a function for selecting a particular group which will contain - the articles listed in a list of article numbers/id's. - -* a battery of character translation functions to translate common - Mac, MS (etc) characters into ISO 8859-1. - - (defun article-fix-m$word () - "Fix M$Word smartquotes in an article." - (interactive) - (save-excursion - (let ((buffer-read-only nil)) - (goto-char (point-min)) - (while (search-forward "\221" nil t) - (replace-match "`" t t)) - (goto-char (point-min)) - (while (search-forward "\222" nil t) - (replace-match "'" t t)) - (goto-char (point-min)) - (while (search-forward "\223" nil t) - (replace-match "\"" t t)) - (goto-char (point-min)) - (while (search-forward "\224" nil t) - (replace-match "\"" t t))))) - - [done] - -* (add-hook 'gnus-exit-query-functions - '(lambda () - (if (and (file-exists-p nnmail-spool-file) - (> (nnheader-file-size nnmail-spool-file) 0)) - (yes-or-no-p "New mail has arrived. Quit Gnus anyways? ") - (y-or-n-p "Are you sure you want to quit Gnus? ")))) - -* allow message-default-headers to be a function. - -* new Date score match types - < > = (etc) that take floating point - numbers and match on the age of the article. - -* > > > If so, I've got one gripe: It seems that when I fire up gnus 5.2.25 - > > > under xemacs-19.14, it's creating a new frame, but is erasing the - > > > buffer in the frame that it was called from =:-O - > - > > Hm. How do you start up Gnus? From the toolbar or with - > > `M-x gnus-other-frame'? - > - > I normally start it up from the toolbar; at - > least that's the way I've caught it doing the - > deed before. - -* all commands that react to the process mark should push the - current process mark set onto the stack. - -* gnus-article-hide-pgp Selv ville jeg nok ha valgt ,Ae(B slette den - dersom teksten matcher - "\\(This\s+\\)?[^ ]+ has been automatically signed by" - og det er maks hundre tegn mellom match-end og ---linja. Men -det- - er min type heuristikk og langt fra alles. - -* `gnus-subscribe-sorted' - insert new groups where they would have - been sorted to if `gnus-group-sort-function' were run. - -* gnus-(group,summary)-highlight should respect any `face' text - props set on the lines. - -* use run-with-idle-timer for gnus-demon instead of the home-brewed - stuff for better reliability. - -* add a way to select which NoCeM type to apply - spam, troll, etc. - -* nndraft-request-group should tally auto-save files. - -* implement nntp-retry-on-break and nntp-command-timeout. - -* gnus-article-highlight-limit that says when not to highlight - (long) articles. - -* (nnoo-set SERVER VARIABLE VALUE) - - [done] - -* nn*-spool-methods - -* interrupitng agent fetching of articles should save articles. - -* command to open a digest group, and copy all the articles there - to the current group. - -* a variable to disable article body highlights if there's more than - X characters in the body. - -* handle 480/381 authinfo requests separately. - -* include the texi/dir file in the distribution. - -* format spec to "tab" to a position. - -* Move all prompting to the new `M-n' default style. - -* command to display all dormant articles. - -* gnus-auto-select-next makeover - list of things it should do. - -* a score match type that adds scores matching on From if From has - replied to something someone else has said. - -* Read Netscape discussion groups: - snews://secnews.netscape.com/netscape.communicator.unix - -* One command to edit the original version if an article, and one to - edit the displayed version. - -* `T v' - make all process-marked articles the children of the - current article. - -* Switch from initial text to the new default text mechanism. - -* How about making it possible to expire local articles? Will it be - possible to make various constraints on when an article can be - expired, e.g. (read), (age > 14 days), or the more interesting - (read & age > 14 days)? - -* New limit command--limit to articles that have a certain string in - the head or body. - -* Allow breaking lengthy NNTP commands. - -* gnus-article-highlight-limit, to disable highlighting in big - articles. - -* Editing an article should put the article to be edited in a - special, unique buffer. - -* A command to send a mail to the admin-address group param. - -* A Date scoring type that will match if the article is less than a - certain number of days old. - -* New spec: %~(tab 56) to put point on column 56 - -* Allow Gnus Agent scoring to use normal score files. - -* Rething the Agent active file thing. `M-g' doesn't update the - active file, for instance. - -* With dummy roots, `^' and then selecing the first article in any - other dummy thread will make Gnus highlight the dummy root instead - of the first article. - -* Propagate all group properties (marks, article numbers, etc) up to - the topics for displaying. - -* `n' in the group buffer with topics should go to the next group - with unread articles, even if that group is hidden in a topic. - -* gnus-posting-styles doesn't work in drafts. - -* gnus-summary-limit-include-cached is slow when there are many - articles in the cache, since it regenerates big parts of the - summary buffer for each article. - -* Implement gnus-batch-brew-soup. - -* Group parameters and summary commands for un/subscribing to mailing - lists. - -* Introduce nnmail-home-directory. - -* gnus-fetch-group and friends should exit Gnus when the user exits - the group. - -* The jingle is only played on the second invocation of Gnus. - -* Bouncing articles should do MIME. - - [done] - -* Crossposted articles should "inherit" the % or mark from the other - groups it has been crossposted to, or something. (Agent.) - -* If point is on a group that appears multiple times in topics, and - you press `l', point will move to the first instance of the group. - -* A spec for the group line format to display the number of - agent-downloaded articles in the group. - -* Some nntp servers never respond when posting, so there should be a - timeout for all commands. - -* When stading on a topic line and `t'-ing, point goes to the last - line. It should go somewhere else. - -* I'm having trouble accessing a newsgroup with a "+" in its name - with Gnus. There is a new newsgroup on msnews.microsoft.com named - "microsoft.public.multimedia.directx.html+time" that I'm trying to - access as - "nntp+msnews.microsoft.com:microsoft.public.multimedia.directx.html+time" - but it gives an error that it cant access the group. - - Is the "+" character illegal in newsgroup names? Is there any way - in Gnus to work around this? (gnus 5.6.45 - XEmacs 20.4) - - [It works in 5.8.8.] - -* When `#F', do: - - Subject: Answer to your mails 01.01.1999-01.05.1999 - --text follows this line-- - Sorry I killfiled you... - - Under the subject "foo", you wrote on 01.01.1999: - > bar - Under the subject "foo1", you wrote on 01.01.1999: - > bar 1 - -* Allow "orphan" scores in the Agent scoring. - - [done?] - -* - Edit article's summary line. - - End edit - - Sort lines in buffer by subject - - --> the old subject line appears in Summary buffer, not the one that was - just changed to. - -* Remove list identifiers from the subject in the summary when doing - `^' and the like. - -* Have the Agent write out articles, one by one, as it retrieves - them, to avoid having to re-fetch them all if Emacs should crash - while fetching. - -* Be able to forward groups of messages as MIME digests. - - [done] - -* nnweb should include the "get whole article" article when getting - articles. - -* When I type W W c (gnus-article-hide-citation) in the summary - buffer, the citations are revealed, but the [+] buttons don't turn - into [-] buttons. (If I click on one of the [+] buttons, it does - turn into a [-] button.) - - [fixed] - -* Perhaps there should be a command to "attach" a buffer of comments - to a message? That is, `B WHATEVER', you're popped into a buffer, - write something, end with `C-c C-c', and then the thing you've - written gets to be the child of the message you're commenting. - -* Handle external-body parts. - - [done for some access types] - -* When renaming a group name, nnmail-split-history does not get the - group name renamed. - -* Allow mail splitting on bodies when using advanced mail splitting. - - (body "whatever.text") - -* Be able to run `J u' from summary buffers. - -* Solve the halting problem. - - -;; Local Variables: -;; mode: outline -;; coding: iso-2022-7bit -;; paragraph-separate: "[ ]*$" -;; End: